@midscene/android-playground 1.0.1-beta-20251021060907.0 → 1.0.1-beta-20251022061922.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +5 -5
- package/static/index.html +1 -1
- package/static/static/js/142.64c1e0d5.js +697 -0
- package/static/static/js/{825.c5ade4c6.js.map → 142.64c1e0d5.js.map} +1 -1
- package/static/static/js/async/150.d439b38c.js +158 -0
- package/static/static/js/async/{212.850ade70.js.map → 150.d439b38c.js.map} +1 -1
- package/static/static/js/async/{624.8a1fe2e8.js → 195.aa1e3152.js} +3 -3
- package/static/static/js/async/{624.8a1fe2e8.js.map → 195.aa1e3152.js.map} +1 -1
- package/static/static/js/async/260.d838b3b7.js +2 -0
- package/static/static/js/async/{544.18ac9afb.js.map → 260.d838b3b7.js.map} +1 -1
- package/static/static/js/async/271.71b3326b.js +3 -0
- package/static/static/js/async/{173.f2381e64.js.map → 271.71b3326b.js.map} +1 -1
- package/static/static/js/async/355.76c31308.js +1 -0
- package/static/static/js/async/{644.910ce3d0.js → 441.675c15a8.js} +1 -1
- package/static/static/js/async/45.ce50b37f.js +21 -0
- package/static/static/js/async/45.ce50b37f.js.map +1 -0
- package/static/static/js/async/586.ffc417d5.js +26 -0
- package/static/static/js/async/{329.261bc4a1.js.map → 586.ffc417d5.js.map} +1 -1
- package/static/static/js/async/631.9799e85f.js +30 -0
- package/static/static/js/async/{364.d88c3cff.js.map → 631.9799e85f.js.map} +1 -1
- package/static/static/js/async/{702.1f38a17e.js → 779.e7bfc2ed.js} +15 -15
- package/static/static/js/async/{702.1f38a17e.js.map → 779.e7bfc2ed.js.map} +1 -1
- package/static/static/js/async/782.f77f2205.js +2 -0
- package/static/static/js/async/782.f77f2205.js.map +1 -0
- package/static/static/js/index.52b7b369.js +30 -0
- package/static/static/js/index.52b7b369.js.map +1 -0
- package/static/static/js/lib-react.d7dec362.js +3 -0
- package/static/static/js/{lib-react.c74a0742.js.map → lib-react.d7dec362.js.map} +1 -1
- package/static/static/js/825.c5ade4c6.js +0 -697
- package/static/static/js/async/166.834644b5.js +0 -2
- package/static/static/js/async/166.834644b5.js.map +0 -1
- package/static/static/js/async/173.f2381e64.js +0 -3
- package/static/static/js/async/212.850ade70.js +0 -158
- package/static/static/js/async/329.261bc4a1.js +0 -26
- package/static/static/js/async/364.d88c3cff.js +0 -30
- package/static/static/js/async/544.18ac9afb.js +0 -2
- package/static/static/js/async/582.8f4b5264.js +0 -21
- package/static/static/js/async/582.8f4b5264.js.map +0 -1
- package/static/static/js/async/983.b98b40af.js +0 -1
- package/static/static/js/index.eb785992.js +0 -30
- package/static/static/js/index.eb785992.js.map +0 -1
- package/static/static/js/lib-react.c74a0742.js +0 -3
- /package/static/static/js/{825.c5ade4c6.js.LICENSE.txt → 142.64c1e0d5.js.LICENSE.txt} +0 -0
- /package/static/static/js/{index.eb785992.js.LICENSE.txt → index.52b7b369.js.LICENSE.txt} +0 -0
- /package/static/static/js/{lib-react.c74a0742.js.LICENSE.txt → lib-react.d7dec362.js.LICENSE.txt} +0 -0
- /package/static/static/wasm/{9e906fbf55e08f98.module.wasm → 9e906fbf.module.wasm} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"static/js/index.eb785992.js","sources":["webpack://android-playground/../../packages/shared/dist/es/env/types.mjs","webpack://android-playground/../../packages/shared/dist/es/utils.mjs","webpack://android-playground/../../packages/core/dist/es/ai-model/conversation-history.mjs","webpack://android-playground/../../packages/visualizer/dist/es/store/store.mjs","webpack://android-playground/../../packages/shared/dist/es/env/basic.mjs","webpack://android-playground/../../packages/shared/dist/es/common.mjs","webpack://android-playground/../../packages/shared/dist/es/logger.mjs","webpack://android-playground/../../packages/shared/dist/es/env/init-debug.mjs","webpack://android-playground/../../packages/shared/dist/es/env/global-config-manager.mjs","webpack://android-playground/../../packages/shared/dist/es/env/constants.mjs","webpack://android-playground/../../packages/shared/dist/es/env/helper.mjs","webpack://android-playground/../../packages/shared/dist/es/env/parse.mjs","webpack://android-playground/../../packages/shared/dist/es/env/decide-model-config.mjs","webpack://android-playground/../../packages/shared/dist/es/env/model-config-manager.mjs","webpack://android-playground/../../packages/shared/dist/es/env/utils.mjs","webpack://android-playground/../../packages/visualizer/dist/es/utils/color.mjs","webpack://android-playground/../../packages/core/dist/es/ai-model/common.mjs","webpack://android-playground/../../packages/shared/dist/es/extractor/tree.mjs","webpack://android-playground/../../packages/core/dist/es/ai-model/prompt/llm-locator.mjs","webpack://android-playground/../../packages/shared/dist/es/img/transform.mjs","webpack://android-playground/../../packages/core/dist/es/ai-model/prompt/llm-section-locator.mjs","webpack://android-playground/../../packages/core/dist/es/ai-model/inspect.mjs","webpack://android-playground/../../packages/core/dist/es/ai-model/llm-planning.mjs","webpack://android-playground/../../packages/shared/dist/es/us-keyboard-layout.mjs","webpack://android-playground/../../packages/core/dist/es/ai-model/ui-tars-planning.mjs","webpack://android-playground/../../packages/core/dist/es/yaml/utils.mjs","webpack://android-playground/../../packages/core/dist/es/yaml/player.mjs","webpack://android-playground/../../packages/playground/dist/es/common.mjs","webpack://android-playground/../../packages/playground/dist/es/adapters/base.mjs","webpack://android-playground/../../packages/playground/dist/es/adapters/local-execution.mjs","webpack://android-playground/../../packages/playground/dist/es/adapters/remote-execution.mjs","webpack://android-playground/../../packages/playground/dist/es/sdk/index.mjs","webpack://android-playground/../../packages/visualizer/dist/es/hooks/useServerValid.mjs","webpack://android-playground/./src/components/adb-device/index.tsx","webpack://android-playground/../../packages/visualizer/dist/es/component/logo/index.mjs","webpack://android-playground/../../packages/visualizer/dist/es/component/env-config/index.mjs","webpack://android-playground/../../packages/visualizer/dist/es/component/nav-actions/index.mjs","webpack://android-playground/../../packages/visualizer/dist/es/utils/constants.mjs","webpack://android-playground/../../packages/visualizer/dist/es/utils/index.mjs","webpack://android-playground/../../packages/core/dist/es/agent/ui-utils.mjs","webpack://android-playground/../../packages/core/dist/es/insight/index.mjs","webpack://android-playground/../../packages/core/dist/es/agent/utils.mjs","webpack://android-playground/../../packages/core/dist/es/agent/task-cache.mjs","webpack://android-playground/../../packages/core/dist/es/agent/task-builder.mjs","webpack://android-playground/../../packages/core/dist/es/agent/tasks.mjs","webpack://android-playground/../../packages/core/dist/es/agent/agent.mjs","webpack://android-playground/../../packages/visualizer/dist/es/utils/replay-scripts.mjs","webpack://android-playground/../../packages/shared/dist/es/baseDB.mjs","webpack://android-playground/../../packages/visualizer/dist/es/component/universal-playground/providers/indexeddb-storage-provider.mjs","webpack://android-playground/../../packages/visualizer/dist/es/component/universal-playground/providers/storage-provider.mjs","webpack://android-playground/../../packages/visualizer/dist/es/component/blackboard/index.mjs","webpack://android-playground/../../packages/visualizer/dist/es/component/shiny-text/index.mjs","webpack://android-playground/../../packages/visualizer/dist/es/component/misc/index.mjs","webpack://android-playground/../../packages/visualizer/dist/es/component/context-preview/index.mjs","webpack://android-playground/../../packages/visualizer/dist/es/component/env-config-reminder/index.mjs","webpack://android-playground/../../packages/visualizer/dist/es/icons/global-perspective.mjs","webpack://android-playground/../../packages/visualizer/dist/es/icons/player-setting.mjs","webpack://android-playground/../../packages/visualizer/dist/es/icons/show-marker.mjs","webpack://android-playground/../../packages/visualizer/dist/es/utils/pixi-loader.mjs","webpack://android-playground/../../packages/visualizer/dist/es/component/player/index.mjs","webpack://android-playground/../../packages/visualizer/dist/es/component/playground-result/index.mjs","webpack://android-playground/../../packages/visualizer/dist/es/icons/avatar.mjs","webpack://android-playground/../../packages/visualizer/dist/es/store/history.mjs","webpack://android-playground/../../packages/visualizer/dist/es/types.mjs","webpack://android-playground/../../packages/core/dist/es/device/index.mjs","webpack://android-playground/../../packages/visualizer/dist/es/utils/playground-utils.mjs","webpack://android-playground/../../packages/visualizer/dist/es/icons/setting.mjs","webpack://android-playground/../../packages/visualizer/dist/es/component/config-selector/index.mjs","webpack://android-playground/../../packages/visualizer/dist/es/component/form-field/index.mjs","webpack://android-playground/../../packages/visualizer/dist/es/icons/close.mjs","webpack://android-playground/../../packages/visualizer/dist/es/icons/history.mjs","webpack://android-playground/../../packages/visualizer/dist/es/icons/magnifying-glass.mjs","webpack://android-playground/../../packages/visualizer/dist/es/component/history-selector/index.mjs","webpack://android-playground/../../packages/visualizer/dist/es/component/prompt-input/index.mjs","webpack://android-playground/../../packages/visualizer/dist/es/component/universal-playground/index.mjs","webpack://android-playground/../../packages/visualizer/dist/es/hooks/usePlaygroundState.mjs","webpack://android-playground/../../packages/visualizer/dist/es/hooks/usePlaygroundExecution.mjs","webpack://android-playground/./src/components/playground-panel/index.tsx","webpack://android-playground/./src/icons/linked.svg","webpack://android-playground/./src/icons/screenshot.svg","webpack://android-playground/./src/icons/unlink.svg","webpack://android-playground/./src/components/scrcpy-player/index.tsx","webpack://android-playground/./src/App.tsx","webpack://android-playground/./src/index.tsx","webpack://android-playground/../../packages/visualizer/dist/es/hooks/useSafeOverrideAIConfig.mjs","webpack://android-playground/webpack/runtime/compat_get_default_export","webpack://android-playground/webpack/runtime/create_fake_namespace_object","webpack://android-playground/webpack/runtime/define_property_getters","webpack://android-playground/webpack/runtime/ensure_chunk","webpack://android-playground/webpack/runtime/get javascript chunk filename","webpack://android-playground/webpack/runtime/get mini-css chunk filename","webpack://android-playground/webpack/runtime/get_full_hash","webpack://android-playground/webpack/runtime/global","webpack://android-playground/webpack/runtime/has_own_property","webpack://android-playground/webpack/runtime/load_script","webpack://android-playground/webpack/runtime/make_namespace_object","webpack://android-playground/webpack/runtime/node_module_decorator","webpack://android-playground/webpack/runtime/on_chunk_loaded","webpack://android-playground/webpack/runtime/public_path","webpack://android-playground/webpack/runtime/rspack_version","webpack://android-playground/webpack/runtime/jsonp_chunk_loading","webpack://android-playground/webpack/runtime/rspack_unique_id"],"sourcesContent":["const MIDSCENE_OPENAI_INIT_CONFIG_JSON = 'MIDSCENE_OPENAI_INIT_CONFIG_JSON';\nconst MIDSCENE_MODEL_NAME = 'MIDSCENE_MODEL_NAME';\nconst MIDSCENE_LANGSMITH_DEBUG = 'MIDSCENE_LANGSMITH_DEBUG';\nconst MIDSCENE_DEBUG_AI_PROFILE = 'MIDSCENE_DEBUG_AI_PROFILE';\nconst MIDSCENE_DEBUG_AI_RESPONSE = 'MIDSCENE_DEBUG_AI_RESPONSE';\nconst MIDSCENE_DANGEROUSLY_PRINT_ALL_CONFIG = 'MIDSCENE_DANGEROUSLY_PRINT_ALL_CONFIG';\nconst MIDSCENE_DEBUG_MODE = 'MIDSCENE_DEBUG_MODE';\nconst MIDSCENE_MCP_USE_PUPPETEER_MODE = 'MIDSCENE_MCP_USE_PUPPETEER_MODE';\nconst MIDSCENE_MCP_CHROME_PATH = 'MIDSCENE_MCP_CHROME_PATH';\nconst MIDSCENE_MCP_ANDROID_MODE = 'MIDSCENE_MCP_ANDROID_MODE';\nconst DOCKER_CONTAINER = 'DOCKER_CONTAINER';\nconst MIDSCENE_FORCE_DEEP_THINK = 'MIDSCENE_FORCE_DEEP_THINK';\nconst MIDSCENE_OPENAI_SOCKS_PROXY = 'MIDSCENE_OPENAI_SOCKS_PROXY';\nconst MIDSCENE_OPENAI_HTTP_PROXY = 'MIDSCENE_OPENAI_HTTP_PROXY';\nconst OPENAI_API_KEY = 'OPENAI_API_KEY';\nconst OPENAI_BASE_URL = 'OPENAI_BASE_URL';\nconst OPENAI_MAX_TOKENS = 'OPENAI_MAX_TOKENS';\nconst MIDSCENE_ADB_PATH = 'MIDSCENE_ADB_PATH';\nconst MIDSCENE_ADB_REMOTE_HOST = 'MIDSCENE_ADB_REMOTE_HOST';\nconst MIDSCENE_ADB_REMOTE_PORT = 'MIDSCENE_ADB_REMOTE_PORT';\nconst MIDSCENE_ANDROID_IME_STRATEGY = 'MIDSCENE_ANDROID_IME_STRATEGY';\nconst MIDSCENE_IOS_DEVICE_UDID = 'MIDSCENE_IOS_DEVICE_UDID';\nconst MIDSCENE_IOS_SIMULATOR_UDID = 'MIDSCENE_IOS_SIMULATOR_UDID';\nconst MIDSCENE_CACHE = 'MIDSCENE_CACHE';\nconst MIDSCENE_USE_VLM_UI_TARS = 'MIDSCENE_USE_VLM_UI_TARS';\nconst MIDSCENE_USE_QWEN_VL = 'MIDSCENE_USE_QWEN_VL';\nconst MIDSCENE_USE_QWEN3_VL = 'MIDSCENE_USE_QWEN3_VL';\nconst MIDSCENE_USE_DOUBAO_VISION = 'MIDSCENE_USE_DOUBAO_VISION';\nconst MIDSCENE_USE_GEMINI = 'MIDSCENE_USE_GEMINI';\nconst MIDSCENE_USE_VL_MODEL = 'MIDSCENE_USE_VL_MODEL';\nconst MATCH_BY_POSITION = 'MATCH_BY_POSITION';\nconst MIDSCENE_REPORT_TAG_NAME = 'MIDSCENE_REPORT_TAG_NAME';\nconst MIDSCENE_REPLANNING_CYCLE_LIMIT = 'MIDSCENE_REPLANNING_CYCLE_LIMIT';\nconst MIDSCENE_PREFERRED_LANGUAGE = 'MIDSCENE_PREFERRED_LANGUAGE';\nconst MIDSCENE_CACHE_MAX_FILENAME_LENGTH = 'MIDSCENE_CACHE_MAX_FILENAME_LENGTH';\nconst MIDSCENE_RUN_DIR = 'MIDSCENE_RUN_DIR';\nconst MIDSCENE_OPENAI_BASE_URL = 'MIDSCENE_OPENAI_BASE_URL';\nconst MIDSCENE_OPENAI_API_KEY = 'MIDSCENE_OPENAI_API_KEY';\nconst MIDSCENE_VL_MODE = 'MIDSCENE_VL_MODE';\nconst MIDSCENE_VQA_MODEL_NAME = 'MIDSCENE_VQA_MODEL_NAME';\nconst MIDSCENE_VQA_OPENAI_SOCKS_PROXY = 'MIDSCENE_VQA_OPENAI_SOCKS_PROXY';\nconst MIDSCENE_VQA_OPENAI_HTTP_PROXY = 'MIDSCENE_VQA_OPENAI_HTTP_PROXY';\nconst MIDSCENE_VQA_OPENAI_BASE_URL = 'MIDSCENE_VQA_OPENAI_BASE_URL';\nconst MIDSCENE_VQA_OPENAI_API_KEY = 'MIDSCENE_VQA_OPENAI_API_KEY';\nconst MIDSCENE_VQA_OPENAI_INIT_CONFIG_JSON = 'MIDSCENE_VQA_OPENAI_INIT_CONFIG_JSON';\nconst MIDSCENE_VQA_VL_MODE = 'MIDSCENE_VQA_VL_MODE';\nconst MIDSCENE_PLANNING_MODEL_NAME = 'MIDSCENE_PLANNING_MODEL_NAME';\nconst MIDSCENE_PLANNING_OPENAI_SOCKS_PROXY = 'MIDSCENE_PLANNING_OPENAI_SOCKS_PROXY';\nconst MIDSCENE_PLANNING_OPENAI_HTTP_PROXY = 'MIDSCENE_PLANNING_OPENAI_HTTP_PROXY';\nconst MIDSCENE_PLANNING_OPENAI_BASE_URL = 'MIDSCENE_PLANNING_OPENAI_BASE_URL';\nconst MIDSCENE_PLANNING_OPENAI_API_KEY = 'MIDSCENE_PLANNING_OPENAI_API_KEY';\nconst MIDSCENE_PLANNING_OPENAI_INIT_CONFIG_JSON = 'MIDSCENE_PLANNING_OPENAI_INIT_CONFIG_JSON';\nconst MIDSCENE_PLANNING_VL_MODE = 'MIDSCENE_PLANNING_VL_MODE';\nconst MIDSCENE_GROUNDING_MODEL_NAME = 'MIDSCENE_GROUNDING_MODEL_NAME';\nconst MIDSCENE_GROUNDING_OPENAI_SOCKS_PROXY = 'MIDSCENE_GROUNDING_OPENAI_SOCKS_PROXY';\nconst MIDSCENE_GROUNDING_OPENAI_HTTP_PROXY = 'MIDSCENE_GROUNDING_OPENAI_HTTP_PROXY';\nconst MIDSCENE_GROUNDING_OPENAI_BASE_URL = 'MIDSCENE_GROUNDING_OPENAI_BASE_URL';\nconst MIDSCENE_GROUNDING_OPENAI_API_KEY = 'MIDSCENE_GROUNDING_OPENAI_API_KEY';\nconst MIDSCENE_GROUNDING_OPENAI_INIT_CONFIG_JSON = 'MIDSCENE_GROUNDING_OPENAI_INIT_CONFIG_JSON';\nconst MIDSCENE_GROUNDING_VL_MODE = 'MIDSCENE_GROUNDING_VL_MODE';\nconst UNUSED_ENV_KEYS = [\n MIDSCENE_DANGEROUSLY_PRINT_ALL_CONFIG\n];\nconst BASIC_ENV_KEYS = [\n MIDSCENE_DEBUG_MODE,\n MIDSCENE_DEBUG_AI_PROFILE,\n MIDSCENE_DEBUG_AI_RESPONSE,\n MIDSCENE_RUN_DIR\n];\nconst BOOLEAN_ENV_KEYS = [\n MIDSCENE_CACHE,\n MIDSCENE_LANGSMITH_DEBUG,\n MIDSCENE_FORCE_DEEP_THINK,\n MIDSCENE_MCP_USE_PUPPETEER_MODE,\n MIDSCENE_MCP_ANDROID_MODE\n];\nconst NUMBER_ENV_KEYS = [\n MIDSCENE_CACHE_MAX_FILENAME_LENGTH,\n MIDSCENE_REPLANNING_CYCLE_LIMIT\n];\nconst STRING_ENV_KEYS = [\n OPENAI_MAX_TOKENS,\n MIDSCENE_ADB_PATH,\n MIDSCENE_ADB_REMOTE_HOST,\n MIDSCENE_ADB_REMOTE_PORT,\n MIDSCENE_ANDROID_IME_STRATEGY,\n MIDSCENE_IOS_DEVICE_UDID,\n MIDSCENE_IOS_SIMULATOR_UDID,\n MIDSCENE_REPORT_TAG_NAME,\n MIDSCENE_PREFERRED_LANGUAGE,\n MATCH_BY_POSITION,\n MIDSCENE_MCP_CHROME_PATH,\n DOCKER_CONTAINER\n];\nconst GLOBAL_ENV_KEYS = [\n ...BOOLEAN_ENV_KEYS,\n ...NUMBER_ENV_KEYS,\n ...STRING_ENV_KEYS\n];\nconst MODEL_ENV_KEYS = [\n MIDSCENE_MODEL_NAME,\n MIDSCENE_OPENAI_INIT_CONFIG_JSON,\n MIDSCENE_OPENAI_API_KEY,\n MIDSCENE_OPENAI_BASE_URL,\n MIDSCENE_OPENAI_SOCKS_PROXY,\n MIDSCENE_OPENAI_HTTP_PROXY,\n MIDSCENE_USE_VLM_UI_TARS,\n MIDSCENE_USE_QWEN_VL,\n MIDSCENE_USE_QWEN3_VL,\n MIDSCENE_USE_DOUBAO_VISION,\n MIDSCENE_USE_GEMINI,\n MIDSCENE_USE_VL_MODEL,\n MIDSCENE_VL_MODE,\n OPENAI_API_KEY,\n OPENAI_BASE_URL,\n MIDSCENE_VQA_MODEL_NAME,\n MIDSCENE_VQA_OPENAI_SOCKS_PROXY,\n MIDSCENE_VQA_OPENAI_HTTP_PROXY,\n MIDSCENE_VQA_OPENAI_BASE_URL,\n MIDSCENE_VQA_OPENAI_API_KEY,\n MIDSCENE_VQA_OPENAI_INIT_CONFIG_JSON,\n MIDSCENE_VQA_VL_MODE,\n MIDSCENE_PLANNING_MODEL_NAME,\n MIDSCENE_PLANNING_OPENAI_SOCKS_PROXY,\n MIDSCENE_PLANNING_OPENAI_HTTP_PROXY,\n MIDSCENE_PLANNING_OPENAI_BASE_URL,\n MIDSCENE_PLANNING_OPENAI_API_KEY,\n MIDSCENE_PLANNING_OPENAI_INIT_CONFIG_JSON,\n MIDSCENE_PLANNING_VL_MODE,\n MIDSCENE_GROUNDING_MODEL_NAME,\n MIDSCENE_GROUNDING_OPENAI_SOCKS_PROXY,\n MIDSCENE_GROUNDING_OPENAI_HTTP_PROXY,\n MIDSCENE_GROUNDING_OPENAI_BASE_URL,\n MIDSCENE_GROUNDING_OPENAI_API_KEY,\n MIDSCENE_GROUNDING_OPENAI_INIT_CONFIG_JSON,\n MIDSCENE_GROUNDING_VL_MODE\n];\nconst ALL_ENV_KEYS = [\n ...UNUSED_ENV_KEYS,\n ...BASIC_ENV_KEYS,\n ...GLOBAL_ENV_KEYS,\n ...MODEL_ENV_KEYS\n];\nvar types_UITarsModelVersion = /*#__PURE__*/ function(UITarsModelVersion) {\n UITarsModelVersion[\"V1_0\"] = \"1.0\";\n UITarsModelVersion[\"V1_5\"] = \"1.5\";\n UITarsModelVersion[\"DOUBAO_1_5_15B\"] = \"doubao-1.5-15B\";\n UITarsModelVersion[\"DOUBAO_1_5_20B\"] = \"doubao-1.5-20B\";\n return UITarsModelVersion;\n}({});\nconst VL_MODE_RAW_VALID_VALUES = [\n 'doubao-vision',\n 'gemini',\n 'qwen-vl',\n 'qwen3-vl',\n 'vlm-ui-tars',\n 'vlm-ui-tars-doubao',\n 'vlm-ui-tars-doubao-1.5'\n];\nexport { ALL_ENV_KEYS, BASIC_ENV_KEYS, BOOLEAN_ENV_KEYS, DOCKER_CONTAINER, GLOBAL_ENV_KEYS, MATCH_BY_POSITION, MIDSCENE_ADB_PATH, MIDSCENE_ADB_REMOTE_HOST, MIDSCENE_ADB_REMOTE_PORT, MIDSCENE_ANDROID_IME_STRATEGY, MIDSCENE_CACHE, MIDSCENE_CACHE_MAX_FILENAME_LENGTH, MIDSCENE_DANGEROUSLY_PRINT_ALL_CONFIG, MIDSCENE_DEBUG_AI_PROFILE, MIDSCENE_DEBUG_AI_RESPONSE, MIDSCENE_DEBUG_MODE, MIDSCENE_FORCE_DEEP_THINK, MIDSCENE_GROUNDING_MODEL_NAME, MIDSCENE_GROUNDING_OPENAI_API_KEY, MIDSCENE_GROUNDING_OPENAI_BASE_URL, MIDSCENE_GROUNDING_OPENAI_HTTP_PROXY, MIDSCENE_GROUNDING_OPENAI_INIT_CONFIG_JSON, MIDSCENE_GROUNDING_OPENAI_SOCKS_PROXY, MIDSCENE_GROUNDING_VL_MODE, MIDSCENE_IOS_DEVICE_UDID, MIDSCENE_IOS_SIMULATOR_UDID, MIDSCENE_LANGSMITH_DEBUG, MIDSCENE_MCP_ANDROID_MODE, MIDSCENE_MCP_CHROME_PATH, MIDSCENE_MCP_USE_PUPPETEER_MODE, MIDSCENE_MODEL_NAME, MIDSCENE_OPENAI_API_KEY, MIDSCENE_OPENAI_BASE_URL, MIDSCENE_OPENAI_HTTP_PROXY, MIDSCENE_OPENAI_INIT_CONFIG_JSON, MIDSCENE_OPENAI_SOCKS_PROXY, MIDSCENE_PLANNING_MODEL_NAME, MIDSCENE_PLANNING_OPENAI_API_KEY, MIDSCENE_PLANNING_OPENAI_BASE_URL, MIDSCENE_PLANNING_OPENAI_HTTP_PROXY, MIDSCENE_PLANNING_OPENAI_INIT_CONFIG_JSON, MIDSCENE_PLANNING_OPENAI_SOCKS_PROXY, MIDSCENE_PLANNING_VL_MODE, MIDSCENE_PREFERRED_LANGUAGE, MIDSCENE_REPLANNING_CYCLE_LIMIT, MIDSCENE_REPORT_TAG_NAME, MIDSCENE_RUN_DIR, MIDSCENE_USE_DOUBAO_VISION, MIDSCENE_USE_GEMINI, MIDSCENE_USE_QWEN3_VL, MIDSCENE_USE_QWEN_VL, MIDSCENE_USE_VLM_UI_TARS, MIDSCENE_USE_VL_MODEL, MIDSCENE_VL_MODE, MIDSCENE_VQA_MODEL_NAME, MIDSCENE_VQA_OPENAI_API_KEY, MIDSCENE_VQA_OPENAI_BASE_URL, MIDSCENE_VQA_OPENAI_HTTP_PROXY, MIDSCENE_VQA_OPENAI_INIT_CONFIG_JSON, MIDSCENE_VQA_OPENAI_SOCKS_PROXY, MIDSCENE_VQA_VL_MODE, MODEL_ENV_KEYS, NUMBER_ENV_KEYS, OPENAI_API_KEY, OPENAI_BASE_URL, OPENAI_MAX_TOKENS, STRING_ENV_KEYS, types_UITarsModelVersion as UITarsModelVersion, UNUSED_ENV_KEYS, VL_MODE_RAW_VALID_VALUES };\n","import { sha256 } from \"js-sha256\";\nimport { v4 } from \"uuid\";\nvar _process_versions;\nconst ifInBrowser = 'undefined' != typeof window;\nconst ifInWorker = 'undefined' != typeof WorkerGlobalScope;\nconst ifInNode = 'undefined' != typeof process && (null == (_process_versions = process.versions) ? void 0 : _process_versions.node);\nfunction uuid() {\n return v4();\n}\nconst hashMap = {};\nfunction generateHashId(rect, content = '') {\n const combined = JSON.stringify({\n content,\n rect\n });\n let sliceLength = 5;\n let slicedHash = '';\n const hashHex = sha256.create().update(combined).hex();\n const toLetters = (hex)=>hex.split('').map((char)=>{\n const code = Number.parseInt(char, 16);\n return String.fromCharCode(97 + code % 26);\n }).join('');\n const hashLetters = toLetters(hashHex);\n while(sliceLength < hashLetters.length - 1){\n slicedHash = hashLetters.slice(0, sliceLength);\n if (hashMap[slicedHash] && hashMap[slicedHash] !== combined) {\n sliceLength++;\n continue;\n }\n hashMap[slicedHash] = combined;\n break;\n }\n return slicedHash;\n}\nfunction assert(condition, message) {\n if (!condition) throw new Error(message || 'Assertion failed');\n}\nfunction getGlobalScope() {\n if ('undefined' != typeof window) return window;\n if ('undefined' != typeof globalThis) return globalThis;\n if ('undefined' != typeof self) return self;\n}\nlet isMcp = false;\nfunction setIsMcp(value) {\n isMcp = value;\n}\nfunction logMsg(...message) {\n if (!isMcp) console.log(...message);\n}\nasync function repeat(times, fn) {\n for(let i = 0; i < times; i++)await fn(i);\n}\nconst utils_REGEXP_LT = /</g;\nconst utils_REGEXP_GT = />/g;\nconst REGEXP_LT_ESCAPE = '__midscene_lt__';\nconst REGEXP_GT_ESCAPE = '__midscene_gt__';\nconst escapeScriptTag = (html)=>html.replace(utils_REGEXP_LT, REGEXP_LT_ESCAPE).replace(utils_REGEXP_GT, REGEXP_GT_ESCAPE);\nconst antiEscapeScriptTag = (html)=>{\n const REGEXP_LT = new RegExp(REGEXP_LT_ESCAPE, 'g');\n const REGEXP_GT = new RegExp(REGEXP_GT_ESCAPE, 'g');\n return html.replace(REGEXP_LT, '<').replace(REGEXP_GT, '>');\n};\nfunction replaceIllegalPathCharsAndSpace(str) {\n return str.replace(/[:*?\"<>| ]/g, '-');\n}\nexport { antiEscapeScriptTag, assert, escapeScriptTag, generateHashId, getGlobalScope, ifInBrowser, ifInNode, ifInWorker, logMsg, repeat, replaceIllegalPathCharsAndSpace, setIsMcp, uuid };\n","function _define_property(obj, key, value) {\n if (key in obj) Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n else obj[key] = value;\n return obj;\n}\nvar _computedKey;\n_computedKey = Symbol.iterator;\nlet _computedKey1 = _computedKey;\nclass ConversationHistory {\n append(message) {\n if ('user' === message.role) this.pruneOldestUserMessageIfNecessary();\n this.messages.push(message);\n }\n seed(messages) {\n this.reset();\n messages.forEach((message)=>{\n this.append(message);\n });\n }\n reset() {\n this.messages.length = 0;\n }\n snapshot() {\n return [\n ...this.messages\n ];\n }\n get length() {\n return this.messages.length;\n }\n [_computedKey1]() {\n return this.messages[Symbol.iterator]();\n }\n toJSON() {\n return this.snapshot();\n }\n pruneOldestUserMessageIfNecessary() {\n const userMessages = this.messages.filter((item)=>'user' === item.role);\n if (userMessages.length < this.maxUserImageMessages) return;\n const firstUserMessageIndex = this.messages.findIndex((item)=>'user' === item.role);\n if (firstUserMessageIndex >= 0) this.messages.splice(firstUserMessageIndex, 1);\n }\n constructor(options){\n var _options_initialMessages;\n _define_property(this, \"maxUserImageMessages\", void 0);\n _define_property(this, \"messages\", []);\n this.maxUserImageMessages = (null == options ? void 0 : options.maxUserImageMessages) ?? 4;\n if (null == options ? void 0 : null == (_options_initialMessages = options.initialMessages) ? void 0 : _options_initialMessages.length) this.seed(options.initialMessages);\n }\n}\nexport { ConversationHistory };\n\n//# sourceMappingURL=conversation-history.mjs.map","import { create } from \"zustand\";\nvar __webpack_require__ = {};\n(()=>{\n __webpack_require__.d = (exports, definition)=>{\n for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) Object.defineProperty(exports, key, {\n enumerable: true,\n get: definition[key]\n });\n };\n})();\n(()=>{\n __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);\n})();\n(()=>{\n __webpack_require__.r = (exports)=>{\n if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports, Symbol.toStringTag, {\n value: 'Module'\n });\n Object.defineProperty(exports, '__esModule', {\n value: true\n });\n };\n})();\nvar external_zustand_namespaceObject = {};\n__webpack_require__.r(external_zustand_namespaceObject);\n__webpack_require__.d(external_zustand_namespaceObject, {\n create: ()=>create\n});\nconst { create: store_create } = external_zustand_namespaceObject;\nconst AUTO_ZOOM_KEY = 'midscene-auto-zoom';\nconst BACKGROUND_VISIBLE_KEY = 'midscene-background-visible';\nconst ELEMENTS_VISIBLE_KEY = 'midscene-elements-visible';\nconst parseBooleanParam = (value)=>{\n if (null === value) return;\n const normalized = value.trim().toLowerCase();\n if ([\n '1',\n 'true',\n 'yes',\n 'on'\n ].includes(normalized)) return true;\n if ([\n '0',\n 'false',\n 'no',\n 'off'\n ].includes(normalized)) return false;\n};\nconst getQueryPreference = (paramName)=>{\n if ('undefined' == typeof window) return;\n const searchParams = new URLSearchParams(window.location.search);\n return parseBooleanParam(searchParams.get(paramName));\n};\nconst useBlackboardPreference = store_create((set)=>{\n const savedAutoZoom = 'false' !== localStorage.getItem(AUTO_ZOOM_KEY);\n const savedBackgroundVisible = 'false' !== localStorage.getItem(BACKGROUND_VISIBLE_KEY);\n const savedElementsVisible = 'false' !== localStorage.getItem(ELEMENTS_VISIBLE_KEY);\n const autoZoomFromQuery = getQueryPreference('focusOnCursor');\n const elementsVisibleFromQuery = getQueryPreference('showElementMarkers');\n return {\n backgroundVisible: savedBackgroundVisible,\n elementsVisible: void 0 === elementsVisibleFromQuery ? savedElementsVisible : elementsVisibleFromQuery,\n autoZoom: void 0 === autoZoomFromQuery ? savedAutoZoom : autoZoomFromQuery,\n setBackgroundVisible: (visible)=>{\n set({\n backgroundVisible: visible\n });\n localStorage.setItem(BACKGROUND_VISIBLE_KEY, visible.toString());\n },\n setElementsVisible: (visible)=>{\n set({\n elementsVisible: visible\n });\n localStorage.setItem(ELEMENTS_VISIBLE_KEY, visible.toString());\n },\n setAutoZoom: (enabled)=>{\n set({\n autoZoom: enabled\n });\n localStorage.setItem(AUTO_ZOOM_KEY, enabled.toString());\n }\n };\n});\nconst CONFIG_KEY = 'midscene-env-config';\nconst SERVICE_MODE_KEY = 'midscene-service-mode';\nconst TRACKING_ACTIVE_TAB_KEY = 'midscene-tracking-active-tab';\nconst DEEP_THINK_KEY = 'midscene-deep-think';\nconst SCREENSHOT_INCLUDED_KEY = 'midscene-screenshot-included';\nconst DOM_INCLUDED_KEY = 'midscene-dom-included';\nconst getConfigStringFromLocalStorage = ()=>{\n const configString = localStorage.getItem(CONFIG_KEY);\n return configString || '';\n};\nconst parseConfig = (configString)=>{\n const lines = configString.split('\\n');\n const config = {};\n lines.forEach((line)=>{\n const trimmed = line.trim();\n if (trimmed.startsWith('#')) return;\n const cleanLine = trimmed.replace(/^export\\s+/i, '').replace(/;$/, '').trim();\n const match = cleanLine.match(/^(\\w+)=(.*)$/);\n if (match) {\n const [, key, value] = match;\n let parsedValue = value.trim();\n if (parsedValue.startsWith(\"'\") && parsedValue.endsWith(\"'\") || parsedValue.startsWith('\"') && parsedValue.endsWith('\"')) parsedValue = parsedValue.slice(1, -1);\n config[key] = parsedValue;\n }\n });\n return config;\n};\nconst useEnvConfig = store_create((set, get)=>{\n const configString = getConfigStringFromLocalStorage();\n const config = parseConfig(configString);\n const ifInExtension = window.location.href.startsWith('chrome-extension');\n const savedServiceMode = localStorage.getItem(SERVICE_MODE_KEY);\n const savedForceSameTabNavigation = 'false' !== localStorage.getItem(TRACKING_ACTIVE_TAB_KEY);\n const savedDeepThink = 'true' === localStorage.getItem(DEEP_THINK_KEY);\n const savedScreenshotIncluded = 'false' !== localStorage.getItem(SCREENSHOT_INCLUDED_KEY);\n const savedDomIncluded = localStorage.getItem(DOM_INCLUDED_KEY) || 'false';\n return {\n serviceMode: ifInExtension ? 'In-Browser-Extension' : savedServiceMode || 'Server',\n setServiceMode: (serviceMode)=>{\n if (ifInExtension) throw new Error('serviceMode cannot be set in extension');\n set({\n serviceMode\n });\n localStorage.setItem(SERVICE_MODE_KEY, serviceMode);\n },\n config,\n configString,\n setConfig: (config)=>set({\n config\n }),\n loadConfig: (configString)=>{\n const config = parseConfig(configString);\n set({\n config,\n configString\n });\n localStorage.setItem(CONFIG_KEY, configString);\n },\n syncFromStorage: ()=>{\n const latestConfigString = getConfigStringFromLocalStorage();\n const latestConfig = parseConfig(latestConfigString);\n set({\n config: latestConfig,\n configString: latestConfigString\n });\n },\n forceSameTabNavigation: savedForceSameTabNavigation,\n setForceSameTabNavigation: (forceSameTabNavigation)=>{\n set({\n forceSameTabNavigation\n });\n localStorage.setItem(TRACKING_ACTIVE_TAB_KEY, forceSameTabNavigation.toString());\n },\n deepThink: savedDeepThink,\n setDeepThink: (deepThink)=>{\n set({\n deepThink\n });\n localStorage.setItem(DEEP_THINK_KEY, deepThink.toString());\n },\n screenshotIncluded: savedScreenshotIncluded,\n setScreenshotIncluded: (screenshotIncluded)=>{\n set({\n screenshotIncluded\n });\n localStorage.setItem(SCREENSHOT_INCLUDED_KEY, screenshotIncluded.toString());\n },\n domIncluded: 'visible-only' === savedDomIncluded ? 'visible-only' : 'true' === savedDomIncluded,\n setDomIncluded: (domIncluded)=>{\n set({\n domIncluded\n });\n localStorage.setItem(DOM_INCLUDED_KEY, domIncluded.toString());\n },\n popupTab: 'playground',\n setPopupTab: (tab)=>{\n set({\n popupTab: tab\n });\n }\n };\n});\nexport { useBlackboardPreference, useEnvConfig };\n","import { BASIC_ENV_KEYS } from \"./types.mjs\";\nconst getBasicEnvValue = (key)=>{\n if (!BASIC_ENV_KEYS.includes(key)) throw new Error(`getBasicEnvValue with key ${key} is not supported.`);\n return process.env[key];\n};\nexport { getBasicEnvValue };\n","import { existsSync, mkdirSync } from \"node:fs\";\nimport { tmpdir } from \"node:os\";\nimport node_path from \"node:path\";\nimport { getBasicEnvValue } from \"./env/basic.mjs\";\nimport { MIDSCENE_RUN_DIR } from \"./env/types.mjs\";\nimport { ifInNode } from \"./utils.mjs\";\nconst defaultRunDirName = 'midscene_run';\nconst getMidsceneRunDir = ()=>{\n if (!ifInNode) return '';\n return getBasicEnvValue(MIDSCENE_RUN_DIR) || defaultRunDirName;\n};\nconst getMidsceneRunBaseDir = ()=>{\n if (!ifInNode) return '';\n let basePath = node_path.resolve(process.cwd(), getMidsceneRunDir());\n if (!existsSync(basePath)) try {\n mkdirSync(basePath, {\n recursive: true\n });\n } catch (error) {\n basePath = node_path.join(tmpdir(), defaultRunDirName);\n mkdirSync(basePath, {\n recursive: true\n });\n }\n return basePath;\n};\nconst getMidsceneRunSubDir = (subdir)=>{\n if (!ifInNode) return '';\n const basePath = getMidsceneRunBaseDir();\n const logPath = node_path.join(basePath, subdir);\n if (!existsSync(logPath)) mkdirSync(logPath, {\n recursive: true\n });\n return logPath;\n};\nconst ERROR_CODE_NOT_IMPLEMENTED_AS_DESIGNED = 'NOT_IMPLEMENTED_AS_DESIGNED';\nexport { ERROR_CODE_NOT_IMPLEMENTED_AS_DESIGNED, defaultRunDirName, getMidsceneRunBaseDir, getMidsceneRunDir, getMidsceneRunSubDir };\n","import node_fs from \"node:fs\";\nimport node_path from \"node:path\";\nimport node_util from \"node:util\";\nimport debug from \"debug\";\nimport { getMidsceneRunSubDir } from \"./common.mjs\";\nimport { ifInNode } from \"./utils.mjs\";\nconst topicPrefix = 'midscene';\nconst logStreams = new Map();\nconst debugInstances = new Map();\nfunction getLogStream(topic) {\n const topicFileName = topic.replace(/:/g, '-');\n if (!logStreams.has(topicFileName)) {\n const logFile = node_path.join(getMidsceneRunSubDir('log'), `${topicFileName}.log`);\n const stream = node_fs.createWriteStream(logFile, {\n flags: 'a'\n });\n logStreams.set(topicFileName, stream);\n }\n return logStreams.get(topicFileName);\n}\nfunction writeLogToFile(topic, message) {\n if (!ifInNode) return;\n const stream = getLogStream(topic);\n const now = new Date();\n const isoDate = now.toLocaleDateString('sv-SE');\n const isoTime = now.toLocaleTimeString('sv-SE');\n const milliseconds = now.getMilliseconds().toString().padStart(3, '0');\n const timezoneOffsetMinutes = now.getTimezoneOffset();\n const sign = timezoneOffsetMinutes <= 0 ? '+' : '-';\n const hours = Math.floor(Math.abs(timezoneOffsetMinutes) / 60).toString().padStart(2, '0');\n const minutes = (Math.abs(timezoneOffsetMinutes) % 60).toString().padStart(2, '0');\n const timezoneString = `${sign}${hours}:${minutes}`;\n const localISOTime = `${isoDate}T${isoTime}.${milliseconds}${timezoneString}`;\n stream.write(`[${localISOTime}] ${message}\\n`);\n}\nfunction getDebug(topic) {\n const fullTopic = `${topicPrefix}:${topic}`;\n if (!debugInstances.has(fullTopic)) {\n const debugFn = debug(fullTopic);\n const wrapper = (...args)=>{\n if (ifInNode) {\n const message = node_util.format(...args);\n writeLogToFile(topic, message);\n }\n debugFn(...args);\n };\n debugInstances.set(fullTopic, wrapper);\n }\n return debugInstances.get(fullTopic);\n}\nfunction enableDebug(topic) {\n if (ifInNode) return;\n debug.enable(`${topicPrefix}:${topic}`);\n}\nfunction cleanupLogStreams() {\n if (!ifInNode) return;\n for (const stream of logStreams.values())stream.end();\n logStreams.clear();\n debugInstances.clear();\n}\nexport { cleanupLogStreams, enableDebug, getDebug };\n","import { enableDebug } from \"../logger.mjs\";\nimport { getBasicEnvValue } from \"./basic.mjs\";\nimport { MIDSCENE_DEBUG_AI_PROFILE, MIDSCENE_DEBUG_AI_RESPONSE } from \"./types.mjs\";\nconst initDebugConfig = ()=>{\n const shouldPrintTiming = getBasicEnvValue(MIDSCENE_DEBUG_AI_PROFILE);\n let debugConfig = '';\n if (shouldPrintTiming) {\n console.warn('MIDSCENE_DEBUG_AI_PROFILE is deprecated, use DEBUG=midscene:ai:profile instead');\n debugConfig = 'ai:profile';\n }\n const shouldPrintAIResponse = getBasicEnvValue(MIDSCENE_DEBUG_AI_RESPONSE);\n if (shouldPrintAIResponse) {\n console.warn('MIDSCENE_DEBUG_AI_RESPONSE is deprecated, use DEBUG=midscene:ai:response instead');\n debugConfig = debugConfig ? 'ai:*' : 'ai:call';\n }\n if (debugConfig) enableDebug(debugConfig);\n};\nexport { initDebugConfig };\n","import { initDebugConfig } from \"./init-debug.mjs\";\nimport { ALL_ENV_KEYS, BOOLEAN_ENV_KEYS, GLOBAL_ENV_KEYS, MATCH_BY_POSITION, MODEL_ENV_KEYS, NUMBER_ENV_KEYS, STRING_ENV_KEYS } from \"./types.mjs\";\nfunction _define_property(obj, key, value) {\n if (key in obj) Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n else obj[key] = value;\n return obj;\n}\nclass GlobalConfigManager {\n getAllEnvConfig() {\n const envConfig = ALL_ENV_KEYS.reduce((p, name)=>{\n p[name] = process.env[name];\n return p;\n }, Object.create(null));\n if (!this.override) return envConfig;\n {\n const { newConfig, extendMode } = this.override;\n if (extendMode) return {\n ...envConfig,\n ...newConfig\n };\n return {\n ...newConfig\n };\n }\n }\n getEnvConfigValue(key) {\n const allConfig = this.getAllEnvConfig();\n if (!STRING_ENV_KEYS.includes(key)) throw new Error(`getEnvConfigValue with key ${key} is not supported.`);\n if (key === MATCH_BY_POSITION) throw new Error('MATCH_BY_POSITION is deprecated, use MIDSCENE_USE_VL_MODEL instead');\n const value = allConfig[key];\n this.keysHaveBeenRead[key] = true;\n if ('string' == typeof value) return value.trim();\n return value;\n }\n getEnvConfigInNumber(key) {\n const allConfig = this.getAllEnvConfig();\n if (!NUMBER_ENV_KEYS.includes(key)) throw new Error(`getEnvConfigInNumber with key ${key} is not supported`);\n const value = allConfig[key];\n this.keysHaveBeenRead[key] = true;\n return Number(value || '');\n }\n getEnvConfigInBoolean(key) {\n const allConfig = this.getAllEnvConfig();\n if (!BOOLEAN_ENV_KEYS.includes(key)) throw new Error(`getEnvConfigInBoolean with key ${key} is not supported`);\n const value = allConfig[key];\n this.keysHaveBeenRead[key] = true;\n if (!value) return false;\n if (/^(true|1)$/i.test(value)) return true;\n if (/^(false|0)$/i.test(value)) return false;\n return !!value.trim();\n }\n registerModelConfigManager(globalModelConfigManager) {\n this.globalModelConfigManager = globalModelConfigManager;\n }\n overrideAIConfig(newConfig, extendMode = false) {\n var _this_override;\n for(const key in newConfig){\n if (![\n ...GLOBAL_ENV_KEYS,\n ...MODEL_ENV_KEYS\n ].includes(key)) throw new Error(`Failed to override AI config, invalid key: ${key}`);\n const value = newConfig[key];\n if ('string' != typeof value) throw new Error(`Failed to override AI config, value for key ${key} must be a string, but got with type ${typeof value}`);\n if (this.keysHaveBeenRead[key]) console.warn(`Warning: try to override AI config with key ${key} ,but it has been read.`);\n }\n const savedNewConfig = extendMode ? {\n ...null == (_this_override = this.override) ? void 0 : _this_override.newConfig,\n ...newConfig\n } : newConfig;\n this.override = {\n newConfig: {\n ...savedNewConfig\n },\n extendMode\n };\n if (!this.globalModelConfigManager) throw new Error('globalModelConfigManager is not registered, which should not happen');\n this.globalModelConfigManager.clearModelConfigMap();\n }\n constructor(){\n _define_property(this, \"override\", void 0);\n _define_property(this, \"keysHaveBeenRead\", {});\n _define_property(this, \"globalModelConfigManager\", void 0);\n initDebugConfig();\n }\n}\nexport { GlobalConfigManager };\n","import { MIDSCENE_GROUNDING_MODEL_NAME, MIDSCENE_GROUNDING_OPENAI_API_KEY, MIDSCENE_GROUNDING_OPENAI_BASE_URL, MIDSCENE_GROUNDING_OPENAI_HTTP_PROXY, MIDSCENE_GROUNDING_OPENAI_INIT_CONFIG_JSON, MIDSCENE_GROUNDING_OPENAI_SOCKS_PROXY, MIDSCENE_GROUNDING_VL_MODE, MIDSCENE_MODEL_NAME, MIDSCENE_OPENAI_API_KEY, MIDSCENE_OPENAI_BASE_URL, MIDSCENE_OPENAI_HTTP_PROXY, MIDSCENE_OPENAI_INIT_CONFIG_JSON, MIDSCENE_OPENAI_SOCKS_PROXY, MIDSCENE_PLANNING_MODEL_NAME, MIDSCENE_PLANNING_OPENAI_API_KEY, MIDSCENE_PLANNING_OPENAI_BASE_URL, MIDSCENE_PLANNING_OPENAI_HTTP_PROXY, MIDSCENE_PLANNING_OPENAI_INIT_CONFIG_JSON, MIDSCENE_PLANNING_OPENAI_SOCKS_PROXY, MIDSCENE_PLANNING_VL_MODE, MIDSCENE_VL_MODE, MIDSCENE_VQA_MODEL_NAME, MIDSCENE_VQA_OPENAI_API_KEY, MIDSCENE_VQA_OPENAI_BASE_URL, MIDSCENE_VQA_OPENAI_HTTP_PROXY, MIDSCENE_VQA_OPENAI_INIT_CONFIG_JSON, MIDSCENE_VQA_OPENAI_SOCKS_PROXY, MIDSCENE_VQA_VL_MODE, OPENAI_API_KEY, OPENAI_BASE_URL } from \"./types.mjs\";\nconst VQA_MODEL_CONFIG_KEYS = {\n modelName: MIDSCENE_VQA_MODEL_NAME,\n socksProxy: MIDSCENE_VQA_OPENAI_SOCKS_PROXY,\n httpProxy: MIDSCENE_VQA_OPENAI_HTTP_PROXY,\n openaiBaseURL: MIDSCENE_VQA_OPENAI_BASE_URL,\n openaiApiKey: MIDSCENE_VQA_OPENAI_API_KEY,\n openaiExtraConfig: MIDSCENE_VQA_OPENAI_INIT_CONFIG_JSON,\n vlMode: MIDSCENE_VQA_VL_MODE\n};\nconst GROUNDING_MODEL_CONFIG_KEYS = {\n modelName: MIDSCENE_GROUNDING_MODEL_NAME,\n socksProxy: MIDSCENE_GROUNDING_OPENAI_SOCKS_PROXY,\n httpProxy: MIDSCENE_GROUNDING_OPENAI_HTTP_PROXY,\n openaiBaseURL: MIDSCENE_GROUNDING_OPENAI_BASE_URL,\n openaiApiKey: MIDSCENE_GROUNDING_OPENAI_API_KEY,\n openaiExtraConfig: MIDSCENE_GROUNDING_OPENAI_INIT_CONFIG_JSON,\n vlMode: MIDSCENE_GROUNDING_VL_MODE\n};\nconst PLANNING_MODEL_CONFIG_KEYS = {\n modelName: MIDSCENE_PLANNING_MODEL_NAME,\n socksProxy: MIDSCENE_PLANNING_OPENAI_SOCKS_PROXY,\n httpProxy: MIDSCENE_PLANNING_OPENAI_HTTP_PROXY,\n openaiBaseURL: MIDSCENE_PLANNING_OPENAI_BASE_URL,\n openaiApiKey: MIDSCENE_PLANNING_OPENAI_API_KEY,\n openaiExtraConfig: MIDSCENE_PLANNING_OPENAI_INIT_CONFIG_JSON,\n vlMode: MIDSCENE_PLANNING_VL_MODE\n};\nconst DEFAULT_MODEL_CONFIG_KEYS = {\n modelName: MIDSCENE_MODEL_NAME,\n socksProxy: MIDSCENE_OPENAI_SOCKS_PROXY,\n httpProxy: MIDSCENE_OPENAI_HTTP_PROXY,\n openaiBaseURL: MIDSCENE_OPENAI_BASE_URL,\n openaiApiKey: MIDSCENE_OPENAI_API_KEY,\n openaiExtraConfig: MIDSCENE_OPENAI_INIT_CONFIG_JSON,\n vlMode: MIDSCENE_VL_MODE\n};\nconst DEFAULT_MODEL_CONFIG_KEYS_LEGACY = {\n modelName: MIDSCENE_MODEL_NAME,\n socksProxy: MIDSCENE_OPENAI_SOCKS_PROXY,\n httpProxy: MIDSCENE_OPENAI_HTTP_PROXY,\n openaiBaseURL: OPENAI_BASE_URL,\n openaiApiKey: OPENAI_API_KEY,\n openaiExtraConfig: MIDSCENE_OPENAI_INIT_CONFIG_JSON,\n vlMode: 'DEFAULT_MODEL_CONFIG_KEYS has no vlMode key'\n};\nexport { DEFAULT_MODEL_CONFIG_KEYS, DEFAULT_MODEL_CONFIG_KEYS_LEGACY, GROUNDING_MODEL_CONFIG_KEYS, PLANNING_MODEL_CONFIG_KEYS, VQA_MODEL_CONFIG_KEYS };\n","import { assert } from \"../utils.mjs\";\nconst maskKey = (key, maskChar = '*')=>{\n if ('string' != typeof key || 0 === key.length) return key;\n const prefixLen = 3;\n const suffixLen = 3;\n const keepLength = prefixLen + suffixLen;\n if (key.length <= keepLength) return key;\n const prefix = key.substring(0, prefixLen);\n const suffix = key.substring(key.length - suffixLen);\n const maskLength = key.length - keepLength;\n const mask = maskChar.repeat(maskLength);\n return `${prefix}${mask}${suffix}`;\n};\nconst maskConfig = (config)=>Object.fromEntries(Object.entries(config).map(([key, value])=>{\n if ([\n 'openaiApiKey'\n ].includes(key)) return [\n key,\n maskKey(value)\n ];\n if ([\n 'openaiExtraConfig'\n ].includes(key)) return [\n key,\n maskKey(JSON.stringify(value))\n ];\n return [\n key,\n value\n ];\n }));\nconst parseJson = (key, value)=>{\n if (value) try {\n return JSON.parse(value);\n } catch (e) {\n throw new Error(`Failed to parse ${key} as a JSON. ${e.message}`, {\n cause: e\n });\n }\n};\nconst createAssert = (modelNameKey, provider, modelName)=>(value, key, modelVendorFlag)=>{\n if (modelName) modelVendorFlag ? assert(value, `The ${key} must be a non-empty string because of the ${modelNameKey} is declared as ${modelName} and ${modelVendorFlag} has also been specified in ${provider}, but got: ${value}. Please check your config.`) : assert(value, `The ${key} must be a non-empty string because of the ${modelNameKey} is declared as ${modelName} in ${provider}, but got: ${value}. Please check your config.`);\n else assert(value, `The ${key} must be a non-empty string, but got: ${value}. Please check your config.`);\n };\nexport { createAssert, maskConfig, parseJson };\n","import { MIDSCENE_USE_DOUBAO_VISION, MIDSCENE_USE_GEMINI, MIDSCENE_USE_QWEN3_VL, MIDSCENE_USE_QWEN_VL, MIDSCENE_USE_VLM_UI_TARS, UITarsModelVersion, VL_MODE_RAW_VALID_VALUES } from \"./types.mjs\";\nconst parseVlModeAndUiTarsModelVersionFromRawValue = (vlModeRaw)=>{\n if (!vlModeRaw) return {\n vlMode: void 0,\n uiTarsVersion: void 0\n };\n if (!VL_MODE_RAW_VALID_VALUES.includes(vlModeRaw)) throw new Error(`the value ${vlModeRaw} is not a valid VL_MODE value, must be one of ${VL_MODE_RAW_VALID_VALUES}`);\n const raw = vlModeRaw;\n if ('vlm-ui-tars' === raw) return {\n vlMode: 'vlm-ui-tars',\n uiTarsVersion: UITarsModelVersion.V1_0\n };\n if ('vlm-ui-tars-doubao' === raw || 'vlm-ui-tars-doubao-1.5' === raw) return {\n vlMode: 'vlm-ui-tars',\n uiTarsVersion: UITarsModelVersion.DOUBAO_1_5_20B\n };\n return {\n vlMode: raw,\n uiTarsVersion: void 0\n };\n};\nconst parseVlModeAndUiTarsFromGlobalConfig = (provider)=>{\n const isDoubao = provider[MIDSCENE_USE_DOUBAO_VISION];\n const isQwen = provider[MIDSCENE_USE_QWEN_VL];\n const isQwen3 = provider[MIDSCENE_USE_QWEN3_VL];\n const isUiTars = provider[MIDSCENE_USE_VLM_UI_TARS];\n const isGemini = provider[MIDSCENE_USE_GEMINI];\n const enabledModes = [\n isDoubao && MIDSCENE_USE_DOUBAO_VISION,\n isQwen && MIDSCENE_USE_QWEN_VL,\n isQwen3 && MIDSCENE_USE_QWEN3_VL,\n isUiTars && MIDSCENE_USE_VLM_UI_TARS,\n isGemini && MIDSCENE_USE_GEMINI\n ].filter(Boolean);\n if (enabledModes.length > 1) throw new Error(`Only one vision mode can be enabled at a time. Currently enabled modes: ${enabledModes.join(', ')}. Please disable all but one mode.`);\n if (isQwen3) return {\n vlMode: 'qwen3-vl',\n uiTarsVersion: void 0\n };\n if (isQwen) return {\n vlMode: 'qwen-vl',\n uiTarsVersion: void 0\n };\n if (isDoubao) return {\n vlMode: 'doubao-vision',\n uiTarsVersion: void 0\n };\n if (isGemini) return {\n vlMode: 'gemini',\n uiTarsVersion: void 0\n };\n if (isUiTars) if ('1' === isUiTars) return {\n vlMode: 'vlm-ui-tars',\n uiTarsVersion: UITarsModelVersion.V1_0\n };\n else if ('DOUBAO' === isUiTars || 'DOUBAO-1.5' === isUiTars) return {\n vlMode: 'vlm-ui-tars',\n uiTarsVersion: UITarsModelVersion.DOUBAO_1_5_20B\n };\n else return {\n vlMode: 'vlm-ui-tars',\n uiTarsVersion: `${isUiTars}`\n };\n return {\n vlMode: void 0,\n uiTarsVersion: void 0\n };\n};\nexport { parseVlModeAndUiTarsFromGlobalConfig, parseVlModeAndUiTarsModelVersionFromRawValue };\n","import { DEFAULT_MODEL_CONFIG_KEYS, DEFAULT_MODEL_CONFIG_KEYS_LEGACY, GROUNDING_MODEL_CONFIG_KEYS, PLANNING_MODEL_CONFIG_KEYS, VQA_MODEL_CONFIG_KEYS } from \"./constants.mjs\";\nimport { getDebug } from \"../logger.mjs\";\nimport { assert } from \"../utils.mjs\";\nimport { createAssert, maskConfig, parseJson } from \"./helper.mjs\";\nimport { initDebugConfig } from \"./init-debug.mjs\";\nimport { parseVlModeAndUiTarsFromGlobalConfig, parseVlModeAndUiTarsModelVersionFromRawValue } from \"./parse.mjs\";\nconst KEYS_MAP = {\n VQA: VQA_MODEL_CONFIG_KEYS,\n grounding: GROUNDING_MODEL_CONFIG_KEYS,\n planning: PLANNING_MODEL_CONFIG_KEYS,\n default: DEFAULT_MODEL_CONFIG_KEYS\n};\nconst decideOpenaiSdkConfig = ({ keys, provider, valueAssert })=>{\n initDebugConfig();\n const debugLog = getDebug('ai:config');\n const socksProxy = provider[keys.socksProxy];\n const httpProxy = provider[keys.httpProxy];\n const vlMode = provider[keys.vlMode];\n debugLog('enter decideOpenaiSdkConfig with keys:', keys);\n const openaiBaseURL = provider[keys.openaiBaseURL];\n const openaiApiKey = provider[keys.openaiApiKey];\n const openaiExtraConfig = parseJson(keys.openaiExtraConfig, provider[keys.openaiExtraConfig]);\n valueAssert(openaiApiKey, keys.openaiApiKey);\n return {\n socksProxy,\n httpProxy,\n vlModeRaw: vlMode,\n openaiBaseURL,\n openaiApiKey,\n openaiExtraConfig\n };\n};\nconst getModelDescription = (vlMode, uiTarsVersion)=>{\n if (vlMode) if (uiTarsVersion) return `UI-TARS=${uiTarsVersion}`;\n else return `${vlMode} mode`;\n return '';\n};\nconst decideModelConfigFromIntentConfig = (intent, intentConfig)=>{\n const debugLog = getDebug('ai:config');\n debugLog('decideModelConfig base on agent.modelConfig()');\n const keysForFn = KEYS_MAP[intent];\n const candidateModelNameFromConfig = intentConfig[keysForFn.modelName];\n debugLog('Got modelName from modelConfigFn', candidateModelNameFromConfig);\n const chosenKeys = (()=>{\n if (candidateModelNameFromConfig) {\n debugLog('query modelConfig from fn by intent got corresponding modelName, will get other corresponding keys');\n return keysForFn;\n }\n debugLog('query modelConfig from fn by intent got no corresponding modelName, will get other keys by default');\n assert(intentConfig[DEFAULT_MODEL_CONFIG_KEYS.modelName], `The return value of agent.modelConfig do not have a valid value with key ${DEFAULT_MODEL_CONFIG_KEYS.modelName}.`);\n return DEFAULT_MODEL_CONFIG_KEYS;\n })();\n const result = decideOpenaiSdkConfig({\n keys: chosenKeys,\n provider: intentConfig,\n valueAssert: createAssert(chosenKeys.modelName, 'modelConfig', candidateModelNameFromConfig)\n });\n const { vlMode, uiTarsVersion } = parseVlModeAndUiTarsModelVersionFromRawValue(result.vlModeRaw);\n const modelDescription = getModelDescription(vlMode, uiTarsVersion);\n const finalResult = {\n ...result,\n modelName: intentConfig[chosenKeys.modelName],\n vlMode,\n uiTarsModelVersion: uiTarsVersion,\n modelDescription,\n from: 'modelConfig',\n intent\n };\n debugLog(`decideModelConfig result by agent.modelConfig() with intent ${intent}:`, maskConfig(finalResult));\n return finalResult;\n};\nconst decideModelConfigFromEnv = (intent, allEnvConfig)=>{\n initDebugConfig();\n const debugLog = getDebug('ai:config');\n const keysForEnv = 'default' === intent ? DEFAULT_MODEL_CONFIG_KEYS_LEGACY : KEYS_MAP[intent];\n if ('default' !== intent && allEnvConfig[keysForEnv.modelName]) {\n const modelName = allEnvConfig[keysForEnv.modelName];\n debugLog(`Got intent ${intent} corresponding modelName ${modelName} by key ${keysForEnv.modelName} from globalConfig, will get other config by intent.`);\n const result = decideOpenaiSdkConfig({\n keys: keysForEnv,\n provider: allEnvConfig,\n valueAssert: createAssert(keysForEnv.modelName, 'process.env', modelName)\n });\n const { vlMode, uiTarsVersion } = parseVlModeAndUiTarsModelVersionFromRawValue(result.vlModeRaw);\n const modelDescription = getModelDescription(vlMode, uiTarsVersion);\n const finalResult = {\n ...result,\n modelName,\n vlMode,\n uiTarsModelVersion: uiTarsVersion,\n modelDescription,\n from: 'env',\n intent\n };\n debugLog(`decideModelConfig result by process.env with intent ${intent}:`, maskConfig(finalResult));\n return finalResult;\n }\n debugLog(`decideModelConfig as legacy logic with intent ${intent}.`);\n const result = decideOpenaiSdkConfig({\n keys: DEFAULT_MODEL_CONFIG_KEYS_LEGACY,\n provider: allEnvConfig,\n valueAssert: createAssert(DEFAULT_MODEL_CONFIG_KEYS_LEGACY.modelName, 'process.env')\n });\n const { vlMode, uiTarsVersion } = parseVlModeAndUiTarsFromGlobalConfig(allEnvConfig);\n const modelDescription = getModelDescription(vlMode, uiTarsVersion);\n const finalResult = {\n ...result,\n modelName: allEnvConfig[DEFAULT_MODEL_CONFIG_KEYS_LEGACY.modelName] || 'gpt-4o',\n vlMode,\n uiTarsModelVersion: uiTarsVersion,\n modelDescription,\n from: 'legacy-env',\n intent\n };\n debugLog(`decideModelConfig result by legacy logic with intent ${intent}:`, maskConfig(finalResult));\n return finalResult;\n};\nexport { decideModelConfigFromEnv, decideModelConfigFromIntentConfig, decideOpenaiSdkConfig };\n","import { decideModelConfigFromEnv, decideModelConfigFromIntentConfig } from \"./decide-model-config.mjs\";\nimport { VL_MODE_RAW_VALID_VALUES } from \"./types.mjs\";\nfunction _define_property(obj, key, value) {\n if (key in obj) Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n else obj[key] = value;\n return obj;\n}\nconst ALL_INTENTS = [\n 'VQA',\n 'default',\n 'grounding',\n 'planning'\n];\nclass ModelConfigManager {\n calcIntentConfigMap(modelConfigFn) {\n const intentConfigMap = {\n VQA: void 0,\n default: void 0,\n grounding: void 0,\n planning: void 0\n };\n for (const i of ALL_INTENTS){\n const result = modelConfigFn({\n intent: i\n });\n if (!result) throw new Error(`The agent has an option named modelConfig is a function, but it return ${result} when call with intent ${i}, which should be a object.`);\n intentConfigMap[i] = result;\n }\n return intentConfigMap;\n }\n calcModelConfigMapBaseOnIntent(intentConfigMap) {\n const modelConfigMap = {\n VQA: void 0,\n default: void 0,\n grounding: void 0,\n planning: void 0\n };\n for (const i of ALL_INTENTS){\n const result = decideModelConfigFromIntentConfig(i, intentConfigMap[i]);\n modelConfigMap[i] = {\n ...result,\n createOpenAIClient: this.createOpenAIClientFn\n };\n }\n return modelConfigMap;\n }\n calcModelConfigMapBaseOnEnv(allEnvConfig) {\n const modelConfigMap = {\n VQA: void 0,\n default: void 0,\n grounding: void 0,\n planning: void 0\n };\n for (const i of ALL_INTENTS){\n const result = decideModelConfigFromEnv(i, allEnvConfig);\n modelConfigMap[i] = {\n ...result,\n createOpenAIClient: this.createOpenAIClientFn\n };\n }\n return modelConfigMap;\n }\n clearModelConfigMap() {\n if (this.isolatedMode) throw new Error('ModelConfigManager work in isolated mode, so clearModelConfigMap should not be called');\n this.modelConfigMap = void 0;\n }\n getModelConfig(intent) {\n let config;\n if (this.isolatedMode) {\n if (!this.modelConfigMap) throw new Error('modelConfigMap is not initialized in isolated mode, which should not happen');\n config = this.modelConfigMap[intent];\n } else {\n if (!this.modelConfigMap) {\n if (!this.globalConfigManager) throw new Error('globalConfigManager is not registered, which should not happen');\n this.modelConfigMap = this.calcModelConfigMapBaseOnEnv(this.globalConfigManager.getAllEnvConfig());\n }\n config = this.modelConfigMap[intent];\n }\n if ('planning' === intent && !config.vlMode) throw new Error(`Planning requires a vision language model (VL model). DOM-based planning is not supported.\n\nPlease configure one of the following VL modes:\n ${VL_MODE_RAW_VALID_VALUES.map((mode)=>`- ${mode}`).join('\\n ')}\n\nConfiguration examples:\n - Environment variable: MIDSCENE_PLANNING_VL_MODE=qwen-vl\n - Or use modelConfig function with planning intent\n\nLearn more: https://midscenejs.com/choose-a-model`);\n return config;\n }\n getUploadTestServerUrl() {\n const { openaiExtraConfig } = this.getModelConfig('default');\n const serverUrl = null == openaiExtraConfig ? void 0 : openaiExtraConfig.REPORT_SERVER_URL;\n return serverUrl;\n }\n registerGlobalConfigManager(globalConfigManager) {\n this.globalConfigManager = globalConfigManager;\n }\n throwErrorIfNonVLModel(intent = 'grounding') {\n const modelConfig = this.getModelConfig(intent);\n if (!modelConfig.vlMode) throw new Error('No visual language model (VL model) detected for the current scenario. Element localization may be inaccurate. Please verify your model configuration. Learn more: https://midscenejs.com/choose-a-model');\n }\n constructor(modelConfigFn, createOpenAIClientFn){\n _define_property(this, \"modelConfigMap\", void 0);\n _define_property(this, \"isolatedMode\", false);\n _define_property(this, \"globalConfigManager\", void 0);\n _define_property(this, \"createOpenAIClientFn\", void 0);\n this.createOpenAIClientFn = createOpenAIClientFn;\n if (modelConfigFn) {\n this.isolatedMode = true;\n const intentConfigMap = this.calcIntentConfigMap(modelConfigFn);\n this.modelConfigMap = this.calcModelConfigMapBaseOnIntent(intentConfigMap);\n }\n }\n}\nexport { ModelConfigManager };\n","import { GlobalConfigManager } from \"./global-config-manager.mjs\";\nimport { ModelConfigManager } from \"./model-config-manager.mjs\";\nimport { MIDSCENE_PREFERRED_LANGUAGE } from \"./types.mjs\";\nconst globalModelConfigManager = new ModelConfigManager();\nconst globalConfigManager = new GlobalConfigManager();\nglobalConfigManager.registerModelConfigManager(globalModelConfigManager);\nglobalModelConfigManager.registerGlobalConfigManager(globalConfigManager);\nconst getPreferredLanguage = ()=>{\n const prefer = globalConfigManager.getEnvConfigValue(MIDSCENE_PREFERRED_LANGUAGE);\n if (prefer) return prefer;\n const timeZone = Intl.DateTimeFormat().resolvedOptions().timeZone;\n const isChina = 'Asia/Shanghai' === timeZone;\n return isChina ? 'Chinese' : 'English';\n};\nconst overrideAIConfig = (newConfig, extendMode = false)=>{\n globalConfigManager.overrideAIConfig(newConfig, extendMode);\n};\nexport { getPreferredLanguage, globalConfigManager, globalModelConfigManager, overrideAIConfig };\n","const elementColor = [\n '#01204E'\n];\nconst highlightColorForSearchArea = '#028391';\nconst highlightColorForElement = '#fd5907';\nfunction djb2Hash(str) {\n if (!str) str = 'unnamed';\n let hash = 5381;\n for(let i = 0; i < str.length; i++)hash = (hash << 5) + hash + str.charCodeAt(i);\n return hash >>> 0;\n}\nfunction colorForName(name) {\n const hashNumber = djb2Hash(name);\n return elementColor[hashNumber % elementColor.length];\n}\nfunction highlightColorForType(type) {\n if ('searchArea' === type) return highlightColorForSearchArea;\n return highlightColorForElement;\n}\nfunction globalThemeConfig() {\n return {\n token: {\n colorPrimary: '#2B83FF'\n },\n components: {\n Layout: {\n headerHeight: 60,\n headerPadding: '0 30px',\n headerBg: '#FFF',\n bodyBg: '#FFF'\n }\n }\n };\n}\nexport { colorForName, globalThemeConfig, highlightColorForType };\n","import { assert } from \"@midscene/shared/utils\";\nimport { NodeType } from \"@midscene/shared/constants\";\nimport { treeToList } from \"@midscene/shared/extractor\";\nimport { compositeElementInfoImg } from \"@midscene/shared/img\";\nimport { getDebug } from \"@midscene/shared/logger\";\nimport { z } from \"zod\";\nvar common_AIActionType = /*#__PURE__*/ function(AIActionType) {\n AIActionType[AIActionType[\"ASSERT\"] = 0] = \"ASSERT\";\n AIActionType[AIActionType[\"INSPECT_ELEMENT\"] = 1] = \"INSPECT_ELEMENT\";\n AIActionType[AIActionType[\"EXTRACT_DATA\"] = 2] = \"EXTRACT_DATA\";\n AIActionType[AIActionType[\"PLAN\"] = 3] = \"PLAN\";\n AIActionType[AIActionType[\"DESCRIBE_ELEMENT\"] = 4] = \"DESCRIBE_ELEMENT\";\n AIActionType[AIActionType[\"TEXT\"] = 5] = \"TEXT\";\n return AIActionType;\n}({});\nconst defaultBboxSize = 20;\nconst debugInspectUtils = getDebug('ai:common');\nfunction fillBboxParam(locate, width, height, rightLimit, bottomLimit, vlMode) {\n if (locate.bbox_2d && !(null == locate ? void 0 : locate.bbox)) {\n locate.bbox = locate.bbox_2d;\n delete locate.bbox_2d;\n }\n if (null == locate ? void 0 : locate.bbox) locate.bbox = adaptBbox(locate.bbox, width, height, rightLimit, bottomLimit, vlMode);\n return locate;\n}\nfunction adaptQwenBbox(bbox) {\n if (bbox.length < 2) {\n const msg = `invalid bbox data for qwen-vl mode: ${JSON.stringify(bbox)} `;\n throw new Error(msg);\n }\n const result = [\n Math.round(bbox[0]),\n Math.round(bbox[1]),\n 'number' == typeof bbox[2] ? Math.round(bbox[2]) : Math.round(bbox[0] + defaultBboxSize),\n 'number' == typeof bbox[3] ? Math.round(bbox[3]) : Math.round(bbox[1] + defaultBboxSize)\n ];\n return result;\n}\nfunction adaptDoubaoBbox(bbox, width, height) {\n assert(width > 0 && height > 0, 'width and height must be greater than 0 in doubao mode');\n if ('string' == typeof bbox) {\n assert(/^(\\d+)\\s(\\d+)\\s(\\d+)\\s(\\d+)$/.test(bbox.trim()), `invalid bbox data string for doubao-vision mode: ${bbox}`);\n const splitted = bbox.split(' ');\n if (4 === splitted.length) return [\n Math.round(Number(splitted[0]) * width / 1000),\n Math.round(Number(splitted[1]) * height / 1000),\n Math.round(Number(splitted[2]) * width / 1000),\n Math.round(Number(splitted[3]) * height / 1000)\n ];\n throw new Error(`invalid bbox data string for doubao-vision mode: ${bbox}`);\n }\n if (Array.isArray(bbox) && Array.isArray(bbox[0])) bbox = bbox[0];\n let bboxList = [];\n if (Array.isArray(bbox) && 'string' == typeof bbox[0]) bbox.forEach((item)=>{\n if ('string' == typeof item && item.includes(',')) {\n const [x, y] = item.split(',');\n bboxList.push(Number(x.trim()), Number(y.trim()));\n } else if ('string' == typeof item && item.includes(' ')) {\n const [x, y] = item.split(' ');\n bboxList.push(Number(x.trim()), Number(y.trim()));\n } else bboxList.push(Number(item));\n });\n else bboxList = bbox;\n if (4 === bboxList.length || 5 === bboxList.length) return [\n Math.round(bboxList[0] * width / 1000),\n Math.round(bboxList[1] * height / 1000),\n Math.round(bboxList[2] * width / 1000),\n Math.round(bboxList[3] * height / 1000)\n ];\n if (6 === bboxList.length || 2 === bboxList.length || 3 === bboxList.length || 7 === bboxList.length) return [\n Math.max(0, Math.round(bboxList[0] * width / 1000) - defaultBboxSize / 2),\n Math.max(0, Math.round(bboxList[1] * height / 1000) - defaultBboxSize / 2),\n Math.min(width, Math.round(bboxList[0] * width / 1000) + defaultBboxSize / 2),\n Math.min(height, Math.round(bboxList[1] * height / 1000) + defaultBboxSize / 2)\n ];\n if (8 === bbox.length) return [\n Math.round(bboxList[0] * width / 1000),\n Math.round(bboxList[1] * height / 1000),\n Math.round(bboxList[4] * width / 1000),\n Math.round(bboxList[5] * height / 1000)\n ];\n const msg = `invalid bbox data for doubao-vision mode: ${JSON.stringify(bbox)} `;\n throw new Error(msg);\n}\nfunction adaptBbox(bbox, width, height, rightLimit, bottomLimit, vlMode) {\n let result = [\n 0,\n 0,\n 0,\n 0\n ];\n result = 'doubao-vision' === vlMode || 'vlm-ui-tars' === vlMode ? adaptDoubaoBbox(bbox, width, height) : 'gemini' === vlMode ? adaptGeminiBbox(bbox, width, height) : 'qwen3-vl' === vlMode ? normalized01000(bbox, width, height) : adaptQwenBbox(bbox);\n result[2] = Math.min(result[2], rightLimit);\n result[3] = Math.min(result[3], bottomLimit);\n return result;\n}\nfunction normalized01000(bbox, width, height) {\n return [\n Math.round(bbox[0] * width / 1000),\n Math.round(bbox[1] * height / 1000),\n Math.round(bbox[2] * width / 1000),\n Math.round(bbox[3] * height / 1000)\n ];\n}\nfunction adaptGeminiBbox(bbox, width, height) {\n const left = Math.round(bbox[1] * width / 1000);\n const top = Math.round(bbox[0] * height / 1000);\n const right = Math.round(bbox[3] * width / 1000);\n const bottom = Math.round(bbox[2] * height / 1000);\n return [\n left,\n top,\n right,\n bottom\n ];\n}\nfunction adaptBboxToRect(bbox, width, height, offsetX = 0, offsetY = 0, rightLimit = width, bottomLimit = height, vlMode) {\n debugInspectUtils('adaptBboxToRect', bbox, width, height, 'offset', offsetX, offsetY, 'limit', rightLimit, bottomLimit, 'vlMode', vlMode);\n const [left, top, right, bottom] = adaptBbox(bbox, width, height, rightLimit, bottomLimit, vlMode);\n const rectLeft = left;\n const rectTop = top;\n let rectWidth = right - left;\n let rectHeight = bottom - top;\n if (rectLeft + rectWidth > width) rectWidth = width - rectLeft;\n if (rectTop + rectHeight > height) rectHeight = height - rectTop;\n rectWidth = Math.max(1, rectWidth);\n rectHeight = Math.max(1, rectHeight);\n const rect = {\n left: rectLeft + offsetX,\n top: rectTop + offsetY,\n width: rectWidth,\n height: rectHeight\n };\n debugInspectUtils('adaptBboxToRect, result=', rect);\n return rect;\n}\nfunction mergeRects(rects) {\n const minLeft = Math.min(...rects.map((r)=>r.left));\n const minTop = Math.min(...rects.map((r)=>r.top));\n const maxRight = Math.max(...rects.map((r)=>r.left + r.width));\n const maxBottom = Math.max(...rects.map((r)=>r.top + r.height));\n return {\n left: minLeft,\n top: minTop,\n width: maxRight - minLeft,\n height: maxBottom - minTop\n };\n}\nfunction expandSearchArea(rect, screenSize, vlMode) {\n const minEdgeSize = 'doubao-vision' === vlMode ? 500 : 300;\n const defaultPadding = 160;\n const paddingSizeHorizontal = rect.width < minEdgeSize ? Math.ceil((minEdgeSize - rect.width) / 2) : defaultPadding;\n const paddingSizeVertical = rect.height < minEdgeSize ? Math.ceil((minEdgeSize - rect.height) / 2) : defaultPadding;\n let newWidth = Math.max(minEdgeSize, rect.width + 2 * paddingSizeHorizontal);\n let newHeight = Math.max(minEdgeSize, rect.height + 2 * paddingSizeVertical);\n let newLeft = rect.left - paddingSizeHorizontal;\n let newTop = rect.top - paddingSizeVertical;\n if (newLeft + newWidth > screenSize.width) newLeft = screenSize.width - newWidth;\n if (newTop + newHeight > screenSize.height) newTop = screenSize.height - newHeight;\n newLeft = Math.max(0, newLeft);\n newTop = Math.max(0, newTop);\n if (newLeft + newWidth > screenSize.width) newWidth = screenSize.width - newLeft;\n if (newTop + newHeight > screenSize.height) newHeight = screenSize.height - newTop;\n rect.left = newLeft;\n rect.top = newTop;\n rect.width = newWidth;\n rect.height = newHeight;\n return rect;\n}\nasync function markupImageForLLM(screenshotBase64, tree, size) {\n const elementsInfo = treeToList(tree);\n const elementsPositionInfoWithoutText = elementsInfo.filter((elementInfo)=>{\n if (elementInfo.attributes.nodeType === NodeType.TEXT) return false;\n return true;\n });\n const imagePayload = await compositeElementInfoImg({\n inputImgBase64: screenshotBase64,\n elementsPositionInfo: elementsPositionInfoWithoutText,\n size\n });\n return imagePayload;\n}\nfunction buildYamlFlowFromPlans(plans, actionSpace, sleep) {\n const flow = [];\n for (const plan of plans){\n const verb = plan.type;\n const action = actionSpace.find((action)=>action.name === verb);\n if (!action) {\n console.warn(`Cannot convert action ${verb} to yaml flow. Will ignore it.`);\n continue;\n }\n const flowKey = action.interfaceAlias || verb;\n const flowParam = action.paramSchema ? dumpActionParam(plan.param || {}, action.paramSchema) : {};\n const flowItem = {\n [flowKey]: '',\n ...flowParam\n };\n flow.push(flowItem);\n }\n if (sleep) flow.push({\n sleep\n });\n return flow;\n}\nconst PointSchema = z.object({\n left: z.number(),\n top: z.number()\n});\nconst SizeSchema = z.object({\n width: z.number(),\n height: z.number(),\n dpr: z.number().optional()\n});\nconst RectSchema = PointSchema.and(SizeSchema).and(z.object({\n zoom: z.number().optional()\n}));\nconst TMultimodalPromptSchema = z.object({\n images: z.array(z.object({\n name: z.string(),\n url: z.string()\n })).optional(),\n convertHttpImage2Base64: z.boolean().optional()\n});\nconst TUserPromptSchema = z.union([\n z.string(),\n z.object({\n prompt: z.string()\n }).and(TMultimodalPromptSchema.partial())\n]);\nconst locateFieldFlagName = 'midscene_location_field_flag';\nconst MidsceneLocationInput = z.object({\n prompt: TUserPromptSchema,\n deepThink: z.boolean().optional(),\n cacheable: z.boolean().optional(),\n xpath: z.union([\n z.string(),\n z.boolean()\n ]).optional()\n}).passthrough();\nz.object({\n [locateFieldFlagName]: z.literal(true),\n prompt: TUserPromptSchema,\n deepThink: z.boolean().optional(),\n cacheable: z.boolean().optional(),\n xpath: z.boolean().optional(),\n center: z.tuple([\n z.number(),\n z.number()\n ]),\n rect: RectSchema\n}).passthrough();\nconst getMidsceneLocationSchema = ()=>MidsceneLocationInput;\nconst ifMidsceneLocatorField = (field)=>{\n var _actualField__def, _actualField__def1;\n let actualField = field;\n if ((null == (_actualField__def = actualField._def) ? void 0 : _actualField__def.typeName) === 'ZodOptional') actualField = actualField._def.innerType;\n if ((null == (_actualField__def1 = actualField._def) ? void 0 : _actualField__def1.typeName) === 'ZodObject') {\n const shape = actualField._def.shape();\n if (locateFieldFlagName in shape) return true;\n if ('prompt' in shape && shape.prompt) return true;\n }\n return false;\n};\nconst dumpMidsceneLocatorField = (field)=>{\n assert(ifMidsceneLocatorField(field), 'field is not a midscene locator field');\n if ('string' == typeof field) return field;\n if (field && 'object' == typeof field && field.prompt) {\n if ('string' == typeof field.prompt) return field.prompt;\n if ('object' == typeof field.prompt && field.prompt.prompt) return field.prompt.prompt;\n }\n return String(field);\n};\nconst findAllMidsceneLocatorField = (zodType, requiredOnly)=>{\n var _zodObject__def;\n if (!zodType) return [];\n const zodObject = zodType;\n if ((null == (_zodObject__def = zodObject._def) ? void 0 : _zodObject__def.typeName) === 'ZodObject' && zodObject.shape) {\n const keys = Object.keys(zodObject.shape);\n return keys.filter((key)=>{\n const field = zodObject.shape[key];\n if (!ifMidsceneLocatorField(field)) return false;\n if (requiredOnly) {\n var _field__def;\n return (null == (_field__def = field._def) ? void 0 : _field__def.typeName) !== 'ZodOptional';\n }\n return true;\n });\n }\n return [];\n};\nconst dumpActionParam = (jsonObject, zodSchema)=>{\n const locatorFields = findAllMidsceneLocatorField(zodSchema);\n const result = {\n ...jsonObject\n };\n for (const fieldName of locatorFields){\n const fieldValue = result[fieldName];\n if (fieldValue) {\n if ('string' == typeof fieldValue) result[fieldName] = fieldValue;\n else if ('object' == typeof fieldValue) {\n if (fieldValue.prompt) {\n if ('string' == typeof fieldValue.prompt) result[fieldName] = fieldValue.prompt;\n else if ('object' == typeof fieldValue.prompt && fieldValue.prompt.prompt) result[fieldName] = fieldValue.prompt.prompt;\n }\n }\n }\n }\n return result;\n};\nconst loadActionParam = (jsonObject, zodSchema)=>{\n const locatorFields = findAllMidsceneLocatorField(zodSchema);\n const result = {\n ...jsonObject\n };\n for (const fieldName of locatorFields){\n const fieldValue = result[fieldName];\n if (fieldValue && 'string' == typeof fieldValue) result[fieldName] = {\n [locateFieldFlagName]: true,\n prompt: fieldValue\n };\n }\n return result;\n};\nconst parseActionParam = (rawParam, zodSchema)=>{\n const param = rawParam ?? {};\n const locateFields = findAllMidsceneLocatorField(zodSchema);\n if (0 === locateFields.length) return zodSchema.parse(param);\n const locateFieldValues = {};\n for (const fieldName of locateFields)if (fieldName in param) locateFieldValues[fieldName] = param[fieldName];\n const paramsForValidation = {};\n for(const key in param)if (locateFields.includes(key)) paramsForValidation[key] = {\n prompt: '_dummy_'\n };\n else paramsForValidation[key] = param[key];\n const validated = zodSchema.parse(paramsForValidation);\n for(const fieldName in locateFieldValues)validated[fieldName] = locateFieldValues[fieldName];\n return validated;\n};\nexport { common_AIActionType as AIActionType, PointSchema, RectSchema, SizeSchema, TMultimodalPromptSchema, TUserPromptSchema, adaptBbox, adaptBboxToRect, adaptDoubaoBbox, adaptGeminiBbox, adaptQwenBbox, buildYamlFlowFromPlans, dumpActionParam, dumpMidsceneLocatorField, expandSearchArea, fillBboxParam, findAllMidsceneLocatorField, getMidsceneLocationSchema, ifMidsceneLocatorField, loadActionParam, markupImageForLLM, mergeRects, normalized01000, parseActionParam };\n\n//# sourceMappingURL=common.mjs.map","function truncateText(text, maxLength = 150) {\n if (void 0 === text) return '';\n if ('object' == typeof text) text = JSON.stringify(text);\n if ('number' == typeof text) return text.toString();\n if ('string' == typeof text && text.length > maxLength) return `${text.slice(0, maxLength)}...`;\n if ('string' == typeof text) return text.trim();\n return '';\n}\nfunction trimAttributes(attributes, truncateTextLength) {\n const tailorAttributes = Object.keys(attributes).reduce((res, currentKey)=>{\n const attributeVal = attributes[currentKey];\n if ('style' === currentKey || 'htmlTagName' === currentKey || 'nodeType' === currentKey) return res;\n res[currentKey] = truncateText(attributeVal, truncateTextLength);\n return res;\n }, {});\n return tailorAttributes;\n}\nconst nodeSizeThreshold = 4;\nfunction descriptionOfTree(tree, truncateTextLength, filterNonTextContent = false, visibleOnly = true) {\n const attributesString = (kv)=>Object.entries(kv).map(([key, value])=>`${key}=\"${truncateText(value, truncateTextLength)}\"`).join(' ');\n function buildContentTree(node, indent = 0, visibleOnly = true) {\n let before = '';\n let contentWithIndent = '';\n let after = '';\n let emptyNode = true;\n const indentStr = ' '.repeat(indent);\n let children = '';\n for(let i = 0; i < (node.children || []).length; i++){\n const childContent = buildContentTree(node.children[i], indent + 1, visibleOnly);\n if (childContent) children += `\\n${childContent}`;\n }\n if (node.node && node.node.rect.width > nodeSizeThreshold && node.node.rect.height > nodeSizeThreshold && (!filterNonTextContent || filterNonTextContent && node.node.content) && (!visibleOnly || visibleOnly && node.node.isVisible)) {\n var _node_node_attributes;\n emptyNode = false;\n let nodeTypeString;\n nodeTypeString = (null == (_node_node_attributes = node.node.attributes) ? void 0 : _node_node_attributes.htmlTagName) ? node.node.attributes.htmlTagName.replace(/[<>]/g, '') : node.node.attributes.nodeType.replace(/\\sNode$/, '').toLowerCase();\n const markerId = node.node.indexId;\n const markerIdString = markerId ? `markerId=\"${markerId}\"` : '';\n const rectAttribute = node.node.rect ? {\n left: node.node.rect.left,\n top: node.node.rect.top,\n width: node.node.rect.width,\n height: node.node.rect.height\n } : {};\n before = `<${nodeTypeString} id=\"${node.node.id}\" ${markerIdString} ${attributesString(trimAttributes(node.node.attributes || {}, truncateTextLength))} ${attributesString(rectAttribute)}>`;\n const content = truncateText(node.node.content, truncateTextLength);\n contentWithIndent = content ? `\\n${indentStr} ${content}` : '';\n after = `</${nodeTypeString}>`;\n } else if (!filterNonTextContent) {\n if (!children.trim().startsWith('<>')) {\n before = '<>';\n contentWithIndent = '';\n after = '</>';\n }\n }\n if (emptyNode && !children.trim()) return '';\n const result = `${indentStr}${before}${contentWithIndent}${children}\\n${indentStr}${after}`;\n if (result.trim()) return result;\n return '';\n }\n const result = buildContentTree(tree, 0, visibleOnly);\n return result.replace(/^\\s*\\n/gm, '');\n}\nfunction treeToList(tree) {\n const result = [];\n function dfs(node) {\n if (node.node) result.push(node.node);\n for (const child of node.children)dfs(child);\n }\n dfs(tree);\n return result;\n}\nfunction traverseTree(tree, onNode) {\n function dfs(node) {\n if (node.node) node.node = onNode(node.node);\n for (const child of node.children)dfs(child);\n }\n dfs(tree);\n return tree;\n}\nexport { descriptionOfTree, traverseTree, treeToList, trimAttributes, truncateText };\n","import { PromptTemplate } from \"@langchain/core/prompts\";\nimport { bboxDescription } from \"./common.mjs\";\nfunction systemPromptToLocateElement(vlMode) {\n const bboxComment = bboxDescription(vlMode);\n return `\n## Role:\nYou are an expert in software testing.\n\n## Objective:\n- Identify elements in screenshots and text that match the user's description.\n- Give the coordinates of the element that matches the user's description best in the screenshot.\n- Determine whether the user's description is order-sensitive (e.g., contains phrases like 'the third item in the list', 'the last button', etc.).\n\n## Output Format:\n\\`\\`\\`json\n{\n \"bbox\": [number, number, number, number], // ${bboxComment}\n \"errors\"?: string[],\n \"isOrderSensitive\": boolean // Whether the targetElementDescription is order-sensitive (true/false)\n}\n\\`\\`\\`\n\nFields:\n* \\`bbox\\` is the bounding box of the element that matches the user's description best in the screenshot\n* \\`isOrderSensitive\\` is a boolean indicating whether the user's description is order-sensitive (true/false)\n* \\`errors\\` is an optional array of error messages (if any)\n\nOrder-sensitive means the description contains phrases like:\n- \"the third item in the list\"\n- \"the last button\"\n- \"the first input box\"\n- \"the second row\"\n\nNot order-sensitive means the description is like:\n- \"confirm button\"\n- \"search box\"\n- \"password input\"\n\nFor example, when an element is found and the description is order-sensitive:\n\\`\\`\\`json\n{\n \"bbox\": [100, 100, 200, 200],\n \"isOrderSensitive\": true,\n \"errors\": []\n}\n\\`\\`\\`\n\nWhen no element is found and the description is not order-sensitive:\n\\`\\`\\`json\n{\n \"bbox\": [],\n \"isOrderSensitive\": false,\n \"errors\": [\"I can see ..., but {some element} is not found\"]\n}\n\\`\\`\\`\n`;\n}\nconst findElementPrompt = new PromptTemplate({\n template: `\nHere is the item user want to find:\n=====================================\n{targetElementDescription}\n=====================================\n\n{pageDescription}\n `,\n inputVariables: [\n \"pageDescription\",\n \"targetElementDescription\"\n ]\n});\nexport { findElementPrompt, systemPromptToLocateElement };\n\n//# sourceMappingURL=llm-locator.mjs.map","import node_assert from \"node:assert\";\nimport { Buffer } from \"node:buffer\";\nimport { readFileSync } from \"node:fs\";\nimport node_path from \"node:path\";\nimport { getDebug } from \"../logger.mjs\";\nimport { ifInNode } from \"../utils.mjs\";\nimport get_jimp from \"./get-jimp.mjs\";\nimport get_photon from \"./get-photon.mjs\";\nimport get_sharp from \"./get-sharp.mjs\";\nconst imgDebug = getDebug('img');\nasync function saveBase64Image(options) {\n const { base64Data, outputPath } = options;\n const { body } = parseBase64(base64Data);\n const imageBuffer = Buffer.from(body, 'base64');\n const Jimp = await get_jimp();\n const image = await Jimp.read(imageBuffer);\n await image.writeAsync(outputPath);\n}\nasync function resizeAndConvertImgBuffer(inputFormat, inputData, newSize) {\n if ('string' == typeof inputData) throw Error('inputData is base64, use resizeImgBase64 instead');\n node_assert(newSize && newSize.width > 0 && newSize.height > 0, 'newSize must be positive');\n const resizeStartTime = Date.now();\n imgDebug(`resizeImg start, target size: ${newSize.width}x${newSize.height}`);\n if (ifInNode) try {\n const Sharp = await get_sharp();\n const metadata = await Sharp(inputData).metadata();\n const { width: originalWidth, height: originalHeight } = metadata;\n if (!originalWidth || !originalHeight) throw Error('Undefined width or height from the input image.');\n if (newSize.width === originalWidth && newSize.height === originalHeight) return {\n buffer: inputData,\n format: inputFormat\n };\n const resizedBuffer = await Sharp(inputData).resize(newSize.width, newSize.height).jpeg({\n quality: 90\n }).toBuffer();\n const resizeEndTime = Date.now();\n imgDebug(`resizeImg done (Sharp), target size: ${newSize.width}x${newSize.height}, cost: ${resizeEndTime - resizeStartTime}ms`);\n return {\n buffer: resizedBuffer,\n format: 'jpeg'\n };\n } catch (error) {\n imgDebug('Sharp failed, falling back to Photon:', error);\n }\n const { PhotonImage, SamplingFilter, resize } = await get_photon();\n const inputBytes = new Uint8Array(inputData);\n const inputImage = PhotonImage.new_from_byteslice(inputBytes);\n const originalWidth = inputImage.get_width();\n const originalHeight = inputImage.get_height();\n if (!originalWidth || !originalHeight) {\n inputImage.free();\n throw Error('Undefined width or height from the input image.');\n }\n if (newSize.width === originalWidth && newSize.height === originalHeight) {\n inputImage.free();\n return {\n buffer: inputData,\n format: inputFormat\n };\n }\n const outputImage = resize(inputImage, newSize.width, newSize.height, SamplingFilter.CatmullRom);\n const outputBytes = outputImage.get_bytes_jpeg(90);\n const resizedBuffer = Buffer.from(outputBytes);\n inputImage.free();\n outputImage.free();\n const resizeEndTime = Date.now();\n imgDebug(`resizeImg done (Photon), target size: ${newSize.width}x${newSize.height}, cost: ${resizeEndTime - resizeStartTime}ms`);\n return {\n buffer: resizedBuffer,\n format: 'jpeg'\n };\n}\nconst createImgBase64ByFormat = (format, body)=>`data:image/${format};base64,${body}`;\nasync function resizeImgBase64(inputBase64, newSize) {\n const { body, mimeType } = parseBase64(inputBase64);\n const imageBuffer = Buffer.from(body, 'base64');\n const { buffer, format } = await resizeAndConvertImgBuffer(mimeType.split('/')[1], imageBuffer, newSize);\n return createImgBase64ByFormat(format, buffer.toString('base64'));\n}\nfunction zoomForGPT4o(originalWidth, originalHeight) {\n const maxWidth = 2048;\n const maxHeight = 768;\n let newWidth = originalWidth;\n let newHeight = originalHeight;\n const aspectRatio = originalWidth / originalHeight;\n if (originalWidth > maxWidth) {\n newWidth = maxWidth;\n newHeight = newWidth / aspectRatio;\n }\n if (newHeight > maxHeight) {\n newHeight = maxHeight;\n newWidth = newHeight * aspectRatio;\n }\n return {\n width: Math.round(newWidth),\n height: Math.round(newHeight)\n };\n}\nasync function jimpFromBase64(base64) {\n const Jimp = await get_jimp();\n const { body } = parseBase64(base64);\n const imageBuffer = Buffer.from(body, 'base64');\n return Jimp.read(imageBuffer);\n}\nasync function paddingToMatchBlock(image, blockSize = 28) {\n const { width, height } = image.bitmap;\n const targetWidth = Math.ceil(width / blockSize) * blockSize;\n const targetHeight = Math.ceil(height / blockSize) * blockSize;\n if (targetWidth === width && targetHeight === height) return {\n width,\n height,\n image\n };\n const Jimp = await get_jimp();\n const paddedImage = new Jimp(targetWidth, targetHeight, 0xffffffff);\n paddedImage.composite(image, 0, 0);\n return {\n width: targetWidth,\n height: targetHeight,\n image: paddedImage\n };\n}\nasync function paddingToMatchBlockByBase64(imageBase64, blockSize = 28) {\n const jimpImage = await jimpFromBase64(imageBase64);\n const paddedResult = await paddingToMatchBlock(jimpImage, blockSize);\n return {\n width: paddedResult.width,\n height: paddedResult.height,\n imageBase64: await jimpToBase64(paddedResult.image)\n };\n}\nasync function cropByRect(imageBase64, rect, paddingImage) {\n const jimpImage = await jimpFromBase64(imageBase64);\n const { left, top, width, height } = rect;\n jimpImage.crop(left, top, width, height);\n if (paddingImage) {\n const paddedResult = await paddingToMatchBlock(jimpImage);\n return {\n width: paddedResult.width,\n height: paddedResult.height,\n imageBase64: await jimpToBase64(paddedResult.image)\n };\n }\n return {\n width: jimpImage.bitmap.width,\n height: jimpImage.bitmap.height,\n imageBase64: await jimpToBase64(jimpImage)\n };\n}\nasync function jimpToBase64(image) {\n const Jimp = await get_jimp();\n return image.getBase64Async(Jimp.MIME_JPEG);\n}\nconst httpImg2Base64 = async (url)=>{\n const response = await fetch(url);\n if (!response.ok) throw new Error(`Failed to fetch image: ${url}`);\n const contentType = response.headers.get('content-type');\n if (!contentType) throw new Error(`Failed to fetch image: ${url}`);\n node_assert(contentType.startsWith('image/'), `The url ${url} is not a image, because of content-type in header is ${contentType}.`);\n const buffer = Buffer.from(await response.arrayBuffer());\n return `data:${contentType};base64,${buffer.toString('base64')}`;\n};\nconst localImg2Base64 = (imgPath, withoutHeader = false)=>{\n const body = readFileSync(imgPath).toString('base64');\n if (withoutHeader) return body;\n const type = node_path.extname(imgPath).slice(1);\n const finalType = 'svg' === type ? 'svg+xml' : type || 'jpg';\n return `data:image/${finalType};base64,${body}`;\n};\nconst preProcessImageUrl = async (url, convertHttpImage2Base64)=>{\n if ('string' != typeof url) throw new Error(`url must be a string, but got ${url} with type ${typeof url}`);\n if (url.startsWith('data:')) return url;\n if (!(url.startsWith('http://') || url.startsWith('https://'))) return await localImg2Base64(url);\n if (!convertHttpImage2Base64) return url;\n return await httpImg2Base64(url);\n};\nconst parseBase64 = (fullBase64String)=>{\n try {\n const separator = ';base64,';\n const index = fullBase64String.indexOf(separator);\n if (-1 === index) throw new Error('Invalid base64 string');\n return {\n mimeType: fullBase64String.slice(5, index),\n body: fullBase64String.slice(index + separator.length)\n };\n } catch (e) {\n throw new Error(`parseBase64 fail because intput is not a valid base64 string: ${fullBase64String}`, {\n cause: e\n });\n }\n};\nexport { createImgBase64ByFormat, cropByRect, httpImg2Base64, jimpFromBase64, jimpToBase64, localImg2Base64, paddingToMatchBlock, paddingToMatchBlockByBase64, parseBase64, preProcessImageUrl, resizeAndConvertImgBuffer, resizeImgBase64, saveBase64Image, zoomForGPT4o };\n","import { PromptTemplate } from \"@langchain/core/prompts\";\nimport { bboxDescription } from \"./common.mjs\";\nfunction systemPromptToLocateSection(vlMode) {\n return `\nYou goal is to find out one section containing the target element in the screenshot, put it in the \\`bbox\\` field. If the user describe the target element with some reference elements, you should also find the section containing the reference elements, put it in the \\`references_bbox\\` field.\n\nUsually, it should be approximately an area not more than 300x300px. Changes of the size are allowed if there are many elements to cover.\n\nreturn in this JSON format:\n\\`\\`\\`json\n{\n \"bbox\": [number, number, number, number],\n \"references_bbox\"?: [\n [number, number, number, number],\n [number, number, number, number],\n ...\n ],\n \"error\"?: string\n}\n\\`\\`\\`\n\nIn which, all the numbers in the \\`bbox\\` and \\`references_bbox\\` represent ${bboxDescription(vlMode)}.\n\nFor example, if the user describe the target element as \"the delete button on the second row with title 'Peter'\", you should put the bounding box of the delete button in the \\`bbox\\` field, and the bounding box of the second row in the \\`references_bbox\\` field.\n\nthe return value should be like this:\n\\`\\`\\`json\n{\n \"bbox\": [100, 100, 200, 200],\n \"references_bbox\": [[100, 100, 200, 200]]\n}\n\\`\\`\\`\n`;\n}\nconst sectionLocatorInstruction = new PromptTemplate({\n template: `Here is the target element user interested in:\n<targetDescription>\n{sectionDescription}\n</targetDescription>\n `,\n inputVariables: [\n \"sectionDescription\"\n ]\n});\nexport { sectionLocatorInstruction, systemPromptToLocateSection };\n\n//# sourceMappingURL=llm-section-locator.mjs.map","import { cropByRect, paddingToMatchBlockByBase64, preProcessImageUrl } from \"@midscene/shared/img\";\nimport { getDebug } from \"@midscene/shared/logger\";\nimport { assert } from \"@midscene/shared/utils\";\nimport { AIActionType, adaptBboxToRect, expandSearchArea, mergeRects } from \"./common.mjs\";\nimport { extractDataQueryPrompt, systemPromptToExtract } from \"./prompt/extraction.mjs\";\nimport { findElementPrompt, systemPromptToLocateElement } from \"./prompt/llm-locator.mjs\";\nimport { sectionLocatorInstruction, systemPromptToLocateSection } from \"./prompt/llm-section-locator.mjs\";\nimport { describeUserPage, distance, distanceThreshold, elementByPositionWithElementInfo } from \"./prompt/util.mjs\";\nimport { callAIWithObjectResponse } from \"./service-caller/index.mjs\";\nconst debugInspect = getDebug('ai:inspect');\nconst debugSection = getDebug('ai:section');\nconst extraTextFromUserPrompt = (prompt)=>{\n if ('string' == typeof prompt) return prompt;\n return prompt.prompt;\n};\nconst promptsToChatParam = async (multimodalPrompt)=>{\n var _multimodalPrompt_images;\n const msgs = [];\n if (null == multimodalPrompt ? void 0 : null == (_multimodalPrompt_images = multimodalPrompt.images) ? void 0 : _multimodalPrompt_images.length) {\n msgs.push({\n role: 'user',\n content: [\n {\n type: 'text',\n text: 'Next, I will provide all the reference images.'\n }\n ]\n });\n for (const item of multimodalPrompt.images){\n const base64 = await preProcessImageUrl(item.url, !!multimodalPrompt.convertHttpImage2Base64);\n msgs.push({\n role: 'user',\n content: [\n {\n type: 'text',\n text: `reference image ${item.name}:`\n }\n ]\n });\n msgs.push({\n role: 'user',\n content: [\n {\n type: 'image_url',\n image_url: {\n url: base64,\n detail: 'high'\n }\n }\n ]\n });\n }\n }\n return msgs;\n};\nasync function AiLocateElement(options) {\n const { context, targetElementDescription, callAIFn, modelConfig } = options;\n const { vlMode } = modelConfig;\n const { screenshotBase64 } = context;\n const { description, elementById, insertElementByPosition } = await describeUserPage(context, {\n vlMode\n });\n assert(targetElementDescription, \"cannot find the target element description\");\n const userInstructionPrompt = await findElementPrompt.format({\n pageDescription: description,\n targetElementDescription: extraTextFromUserPrompt(targetElementDescription)\n });\n const systemPrompt = systemPromptToLocateElement(vlMode);\n let imagePayload = screenshotBase64;\n let imageWidth = context.size.width;\n let imageHeight = context.size.height;\n let originalImageWidth = imageWidth;\n let originalImageHeight = imageHeight;\n if (options.searchConfig) {\n var _options_searchConfig_rect, _options_searchConfig_rect1;\n assert(options.searchConfig.rect, 'searchArea is provided but its rect cannot be found. Failed to locate element');\n assert(options.searchConfig.imageBase64, 'searchArea is provided but its imageBase64 cannot be found. Failed to locate element');\n imagePayload = options.searchConfig.imageBase64;\n imageWidth = null == (_options_searchConfig_rect = options.searchConfig.rect) ? void 0 : _options_searchConfig_rect.width;\n imageHeight = null == (_options_searchConfig_rect1 = options.searchConfig.rect) ? void 0 : _options_searchConfig_rect1.height;\n originalImageWidth = imageWidth;\n originalImageHeight = imageHeight;\n } else if ('qwen-vl' === vlMode) {\n const paddedResult = await paddingToMatchBlockByBase64(imagePayload);\n imageWidth = paddedResult.width;\n imageHeight = paddedResult.height;\n imagePayload = paddedResult.imageBase64;\n }\n const msgs = [\n {\n role: 'system',\n content: systemPrompt\n },\n {\n role: 'user',\n content: [\n {\n type: 'image_url',\n image_url: {\n url: imagePayload,\n detail: 'high'\n }\n },\n {\n type: 'text',\n text: userInstructionPrompt\n }\n ]\n }\n ];\n if ('string' != typeof targetElementDescription) {\n const addOns = await promptsToChatParam({\n images: targetElementDescription.images,\n convertHttpImage2Base64: targetElementDescription.convertHttpImage2Base64\n });\n msgs.push(...addOns);\n }\n const res = await callAIFn(msgs, AIActionType.INSPECT_ELEMENT, modelConfig);\n const rawResponse = JSON.stringify(res.content);\n let resRect;\n let matchedElements = 'elements' in res.content ? res.content.elements : [];\n let errors = 'errors' in res.content ? res.content.errors : [];\n try {\n if ('bbox' in res.content && Array.isArray(res.content.bbox)) {\n var _options_searchConfig_rect2, _options_searchConfig, _options_searchConfig_rect3, _options_searchConfig1;\n resRect = adaptBboxToRect(res.content.bbox, imageWidth, imageHeight, null == (_options_searchConfig = options.searchConfig) ? void 0 : null == (_options_searchConfig_rect2 = _options_searchConfig.rect) ? void 0 : _options_searchConfig_rect2.left, null == (_options_searchConfig1 = options.searchConfig) ? void 0 : null == (_options_searchConfig_rect3 = _options_searchConfig1.rect) ? void 0 : _options_searchConfig_rect3.top, originalImageWidth, originalImageHeight, vlMode);\n debugInspect('resRect', resRect);\n const rectCenter = {\n x: resRect.left + resRect.width / 2,\n y: resRect.top + resRect.height / 2\n };\n let element = elementByPositionWithElementInfo(context.tree, rectCenter);\n const distanceToCenter = element ? distance({\n x: element.center[0],\n y: element.center[1]\n }, rectCenter) : 0;\n if (!element || distanceToCenter > distanceThreshold) element = insertElementByPosition(rectCenter);\n if (element) {\n matchedElements = [\n element\n ];\n errors = [];\n }\n }\n } catch (e) {\n const msg = e instanceof Error ? `Failed to parse bbox: ${e.message}` : 'unknown error in locate';\n if (errors && (null == errors ? void 0 : errors.length) !== 0) errors.push(`(${msg})`);\n else errors = [\n msg\n ];\n }\n return {\n rect: resRect,\n parseResult: {\n elements: matchedElements,\n errors\n },\n rawResponse,\n elementById,\n usage: res.usage,\n isOrderSensitive: 'object' == typeof res.content && null !== res.content && 'isOrderSensitive' in res.content ? res.content.isOrderSensitive : void 0\n };\n}\nasync function AiLocateSection(options) {\n const { context, sectionDescription, modelConfig } = options;\n const { vlMode } = modelConfig;\n const { screenshotBase64 } = context;\n const systemPrompt = systemPromptToLocateSection(vlMode);\n const sectionLocatorInstructionText = await sectionLocatorInstruction.format({\n sectionDescription: extraTextFromUserPrompt(sectionDescription)\n });\n const msgs = [\n {\n role: 'system',\n content: systemPrompt\n },\n {\n role: 'user',\n content: [\n {\n type: 'image_url',\n image_url: {\n url: screenshotBase64,\n detail: 'high'\n }\n },\n {\n type: 'text',\n text: sectionLocatorInstructionText\n }\n ]\n }\n ];\n if ('string' != typeof sectionDescription) {\n const addOns = await promptsToChatParam({\n images: sectionDescription.images,\n convertHttpImage2Base64: sectionDescription.convertHttpImage2Base64\n });\n msgs.push(...addOns);\n }\n const result = await callAIWithObjectResponse(msgs, AIActionType.EXTRACT_DATA, modelConfig);\n let sectionRect;\n const sectionBbox = result.content.bbox;\n if (sectionBbox) {\n const targetRect = adaptBboxToRect(sectionBbox, context.size.width, context.size.height, 0, 0, context.size.width, context.size.height, vlMode);\n debugSection('original targetRect %j', targetRect);\n const referenceBboxList = result.content.references_bbox || [];\n debugSection('referenceBboxList %j', referenceBboxList);\n const referenceRects = referenceBboxList.filter((bbox)=>Array.isArray(bbox)).map((bbox)=>adaptBboxToRect(bbox, context.size.width, context.size.height, 0, 0, context.size.width, context.size.height, vlMode));\n debugSection('referenceRects %j', referenceRects);\n const mergedRect = mergeRects([\n targetRect,\n ...referenceRects\n ]);\n debugSection('mergedRect %j', mergedRect);\n sectionRect = expandSearchArea(mergedRect, context.size, vlMode);\n debugSection('expanded sectionRect %j', sectionRect);\n }\n let imageBase64 = screenshotBase64;\n if (sectionRect) {\n const croppedResult = await cropByRect(screenshotBase64, sectionRect, 'qwen-vl' === vlMode);\n imageBase64 = croppedResult.imageBase64;\n sectionRect.width = croppedResult.width;\n sectionRect.height = croppedResult.height;\n }\n return {\n rect: sectionRect,\n imageBase64,\n error: result.content.error,\n rawResponse: JSON.stringify(result.content),\n usage: result.usage\n };\n}\nasync function AiExtractElementInfo(options) {\n const { dataQuery, context, extractOption, multimodalPrompt, modelConfig } = options;\n const { vlMode } = modelConfig;\n const systemPrompt = systemPromptToExtract();\n const { screenshotBase64 } = context;\n const { description, elementById } = await describeUserPage(context, {\n truncateTextLength: 200,\n filterNonTextContent: false,\n visibleOnly: false,\n domIncluded: null == extractOption ? void 0 : extractOption.domIncluded,\n vlMode\n });\n const extractDataPromptText = await extractDataQueryPrompt(description, dataQuery);\n const userContent = [];\n if ((null == extractOption ? void 0 : extractOption.screenshotIncluded) !== false) userContent.push({\n type: 'image_url',\n image_url: {\n url: screenshotBase64,\n detail: 'high'\n }\n });\n userContent.push({\n type: 'text',\n text: extractDataPromptText\n });\n const msgs = [\n {\n role: 'system',\n content: systemPrompt\n },\n {\n role: 'user',\n content: userContent\n }\n ];\n if (multimodalPrompt) {\n const addOns = await promptsToChatParam({\n images: multimodalPrompt.images,\n convertHttpImage2Base64: multimodalPrompt.convertHttpImage2Base64\n });\n msgs.push(...addOns);\n }\n const result = await callAIWithObjectResponse(msgs, AIActionType.EXTRACT_DATA, modelConfig);\n return {\n parseResult: result.content,\n elementById,\n usage: result.usage\n };\n}\nexport { AiExtractElementInfo, AiLocateElement, AiLocateSection };\n\n//# sourceMappingURL=inspect.mjs.map","import { paddingToMatchBlockByBase64 } from \"@midscene/shared/img\";\nimport { getDebug } from \"@midscene/shared/logger\";\nimport { assert } from \"@midscene/shared/utils\";\nimport { AIActionType, buildYamlFlowFromPlans, fillBboxParam, findAllMidsceneLocatorField } from \"./common.mjs\";\nimport { systemPromptToTaskPlanning } from \"./prompt/llm-planning.mjs\";\nimport { callAIWithObjectResponse } from \"./service-caller/index.mjs\";\nconst debug = getDebug('planning');\nasync function plan(userInstruction, opts) {\n var _opts_conversationHistory, _planFromAI_action;\n const { context, modelConfig, conversationHistory } = opts;\n const { screenshotBase64, size } = context;\n const { vlMode } = modelConfig;\n assert(vlMode, 'Planning requires vlMode to be configured.');\n const systemPrompt = await systemPromptToTaskPlanning({\n actionSpace: opts.actionSpace,\n vlMode: vlMode\n });\n let imagePayload = screenshotBase64;\n let imageWidth = size.width;\n let imageHeight = size.height;\n const rightLimit = imageWidth;\n const bottomLimit = imageHeight;\n if ('qwen-vl' === vlMode) {\n const paddedResult = await paddingToMatchBlockByBase64(imagePayload);\n imageWidth = paddedResult.width;\n imageHeight = paddedResult.height;\n imagePayload = paddedResult.imageBase64;\n }\n const historyLog = (null == (_opts_conversationHistory = opts.conversationHistory) ? void 0 : _opts_conversationHistory.snapshot()) || [];\n const knowledgeContext = opts.actionContext ? [\n {\n role: 'user',\n content: [\n {\n type: 'text',\n text: `<high_priority_knowledge>${opts.actionContext}</high_priority_knowledge>`\n }\n ]\n }\n ] : [];\n const instruction = [\n {\n role: 'user',\n content: [\n {\n type: 'text',\n text: `<user_instruction>${userInstruction}</user_instruction>`\n }\n ]\n }\n ];\n const msgs = [\n {\n role: 'system',\n content: systemPrompt\n },\n ...knowledgeContext,\n ...instruction,\n ...historyLog,\n {\n role: 'user',\n content: [\n {\n type: 'image_url',\n image_url: {\n url: imagePayload,\n detail: 'high'\n }\n }\n ]\n }\n ];\n const { content, usage } = await callAIWithObjectResponse(msgs, AIActionType.PLAN, modelConfig);\n const rawResponse = JSON.stringify(content, void 0, 2);\n const planFromAI = content;\n const actions = ((null == (_planFromAI_action = planFromAI.action) ? void 0 : _planFromAI_action.type) ? [\n planFromAI.action\n ] : planFromAI.actions) || [];\n const returnValue = {\n ...planFromAI,\n actions,\n rawResponse,\n usage,\n yamlFlow: buildYamlFlowFromPlans(actions, opts.actionSpace, planFromAI.sleep)\n };\n assert(planFromAI, \"can't get plans from AI\");\n actions.forEach((action)=>{\n const type = action.type;\n const actionInActionSpace = opts.actionSpace.find((action)=>action.name === type);\n debug('actionInActionSpace matched', actionInActionSpace);\n const locateFields = actionInActionSpace ? findAllMidsceneLocatorField(actionInActionSpace.paramSchema) : [];\n debug('locateFields', locateFields);\n locateFields.forEach((field)=>{\n const locateResult = action.param[field];\n if (locateResult) action.param[field] = fillBboxParam(locateResult, imageWidth, imageHeight, rightLimit, bottomLimit, vlMode);\n });\n });\n assert(!planFromAI.error, `Failed to plan actions: ${planFromAI.error}`);\n if (0 === actions.length && returnValue.more_actions_needed_by_instruction && !returnValue.sleep) console.warn('No actions planned for the prompt, but model said more actions are needed:', userInstruction);\n null == conversationHistory || conversationHistory.append({\n role: 'assistant',\n content: [\n {\n type: 'text',\n text: rawResponse\n }\n ]\n });\n null == conversationHistory || conversationHistory.append({\n role: 'user',\n content: [\n {\n type: 'text',\n text: 'I have finished the action previously planned'\n }\n ]\n });\n return returnValue;\n}\nexport { plan };\n\n//# sourceMappingURL=llm-planning.mjs.map","/*! For license information please see us-keyboard-layout.mjs.LICENSE.txt */\n/**\n * @license\n * Copyright 2017 Google Inc.\n * SPDX-License-Identifier: Apache-2.0\n */ const _keyDefinitions = {\n 0: {\n keyCode: 48,\n key: '0',\n code: 'Digit0'\n },\n 1: {\n keyCode: 49,\n key: '1',\n code: 'Digit1'\n },\n 2: {\n keyCode: 50,\n key: '2',\n code: 'Digit2'\n },\n 3: {\n keyCode: 51,\n key: '3',\n code: 'Digit3'\n },\n 4: {\n keyCode: 52,\n key: '4',\n code: 'Digit4'\n },\n 5: {\n keyCode: 53,\n key: '5',\n code: 'Digit5'\n },\n 6: {\n keyCode: 54,\n key: '6',\n code: 'Digit6'\n },\n 7: {\n keyCode: 55,\n key: '7',\n code: 'Digit7'\n },\n 8: {\n keyCode: 56,\n key: '8',\n code: 'Digit8'\n },\n 9: {\n keyCode: 57,\n key: '9',\n code: 'Digit9'\n },\n Power: {\n key: 'Power',\n code: 'Power'\n },\n Eject: {\n key: 'Eject',\n code: 'Eject'\n },\n Abort: {\n keyCode: 3,\n code: 'Abort',\n key: 'Cancel'\n },\n Help: {\n keyCode: 6,\n code: 'Help',\n key: 'Help'\n },\n Backspace: {\n keyCode: 8,\n code: 'Backspace',\n key: 'Backspace'\n },\n Tab: {\n keyCode: 9,\n code: 'Tab',\n key: 'Tab'\n },\n Numpad5: {\n keyCode: 12,\n shiftKeyCode: 101,\n key: 'Clear',\n code: 'Numpad5',\n shiftKey: '5',\n location: 3\n },\n NumpadEnter: {\n keyCode: 13,\n code: 'NumpadEnter',\n key: 'Enter',\n text: '\\r',\n location: 3\n },\n Enter: {\n keyCode: 13,\n code: 'Enter',\n key: 'Enter',\n text: '\\r'\n },\n '\\r': {\n keyCode: 13,\n code: 'Enter',\n key: 'Enter',\n text: '\\r'\n },\n '\\n': {\n keyCode: 13,\n code: 'Enter',\n key: 'Enter',\n text: '\\r'\n },\n ShiftLeft: {\n keyCode: 16,\n code: 'ShiftLeft',\n key: 'Shift',\n location: 1\n },\n ShiftRight: {\n keyCode: 16,\n code: 'ShiftRight',\n key: 'Shift',\n location: 2\n },\n ControlLeft: {\n keyCode: 17,\n code: 'ControlLeft',\n key: 'Control',\n location: 1\n },\n ControlRight: {\n keyCode: 17,\n code: 'ControlRight',\n key: 'Control',\n location: 2\n },\n AltLeft: {\n keyCode: 18,\n code: 'AltLeft',\n key: 'Alt',\n location: 1\n },\n AltRight: {\n keyCode: 18,\n code: 'AltRight',\n key: 'Alt',\n location: 2\n },\n Pause: {\n keyCode: 19,\n code: 'Pause',\n key: 'Pause'\n },\n CapsLock: {\n keyCode: 20,\n code: 'CapsLock',\n key: 'CapsLock'\n },\n Escape: {\n keyCode: 27,\n code: 'Escape',\n key: 'Escape'\n },\n Convert: {\n keyCode: 28,\n code: 'Convert',\n key: 'Convert'\n },\n NonConvert: {\n keyCode: 29,\n code: 'NonConvert',\n key: 'NonConvert'\n },\n Space: {\n keyCode: 32,\n code: 'Space',\n key: ' '\n },\n Numpad9: {\n keyCode: 33,\n shiftKeyCode: 105,\n key: 'PageUp',\n code: 'Numpad9',\n shiftKey: '9',\n location: 3\n },\n PageUp: {\n keyCode: 33,\n code: 'PageUp',\n key: 'PageUp'\n },\n Numpad3: {\n keyCode: 34,\n shiftKeyCode: 99,\n key: 'PageDown',\n code: 'Numpad3',\n shiftKey: '3',\n location: 3\n },\n PageDown: {\n keyCode: 34,\n code: 'PageDown',\n key: 'PageDown'\n },\n End: {\n keyCode: 35,\n code: 'End',\n key: 'End'\n },\n Numpad1: {\n keyCode: 35,\n shiftKeyCode: 97,\n key: 'End',\n code: 'Numpad1',\n shiftKey: '1',\n location: 3\n },\n Home: {\n keyCode: 36,\n code: 'Home',\n key: 'Home'\n },\n Numpad7: {\n keyCode: 36,\n shiftKeyCode: 103,\n key: 'Home',\n code: 'Numpad7',\n shiftKey: '7',\n location: 3\n },\n ArrowLeft: {\n keyCode: 37,\n code: 'ArrowLeft',\n key: 'ArrowLeft'\n },\n Numpad4: {\n keyCode: 37,\n shiftKeyCode: 100,\n key: 'ArrowLeft',\n code: 'Numpad4',\n shiftKey: '4',\n location: 3\n },\n Numpad8: {\n keyCode: 38,\n shiftKeyCode: 104,\n key: 'ArrowUp',\n code: 'Numpad8',\n shiftKey: '8',\n location: 3\n },\n ArrowUp: {\n keyCode: 38,\n code: 'ArrowUp',\n key: 'ArrowUp'\n },\n ArrowRight: {\n keyCode: 39,\n code: 'ArrowRight',\n key: 'ArrowRight'\n },\n Numpad6: {\n keyCode: 39,\n shiftKeyCode: 102,\n key: 'ArrowRight',\n code: 'Numpad6',\n shiftKey: '6',\n location: 3\n },\n Numpad2: {\n keyCode: 40,\n shiftKeyCode: 98,\n key: 'ArrowDown',\n code: 'Numpad2',\n shiftKey: '2',\n location: 3\n },\n ArrowDown: {\n keyCode: 40,\n code: 'ArrowDown',\n key: 'ArrowDown'\n },\n Select: {\n keyCode: 41,\n code: 'Select',\n key: 'Select'\n },\n Open: {\n keyCode: 43,\n code: 'Open',\n key: 'Execute'\n },\n PrintScreen: {\n keyCode: 44,\n code: 'PrintScreen',\n key: 'PrintScreen'\n },\n Insert: {\n keyCode: 45,\n code: 'Insert',\n key: 'Insert'\n },\n Numpad0: {\n keyCode: 45,\n shiftKeyCode: 96,\n key: 'Insert',\n code: 'Numpad0',\n shiftKey: '0',\n location: 3\n },\n Delete: {\n keyCode: 46,\n code: 'Delete',\n key: 'Delete'\n },\n NumpadDecimal: {\n keyCode: 46,\n shiftKeyCode: 110,\n code: 'NumpadDecimal',\n key: '\\u0000',\n shiftKey: '.',\n location: 3\n },\n Digit0: {\n keyCode: 48,\n code: 'Digit0',\n shiftKey: ')',\n key: '0'\n },\n Digit1: {\n keyCode: 49,\n code: 'Digit1',\n shiftKey: '!',\n key: '1'\n },\n Digit2: {\n keyCode: 50,\n code: 'Digit2',\n shiftKey: '@',\n key: '2'\n },\n Digit3: {\n keyCode: 51,\n code: 'Digit3',\n shiftKey: '#',\n key: '3'\n },\n Digit4: {\n keyCode: 52,\n code: 'Digit4',\n shiftKey: '$',\n key: '4'\n },\n Digit5: {\n keyCode: 53,\n code: 'Digit5',\n shiftKey: '%',\n key: '5'\n },\n Digit6: {\n keyCode: 54,\n code: 'Digit6',\n shiftKey: '^',\n key: '6'\n },\n Digit7: {\n keyCode: 55,\n code: 'Digit7',\n shiftKey: '&',\n key: '7'\n },\n Digit8: {\n keyCode: 56,\n code: 'Digit8',\n shiftKey: '*',\n key: '8'\n },\n Digit9: {\n keyCode: 57,\n code: 'Digit9',\n shiftKey: '(',\n key: '9'\n },\n KeyA: {\n keyCode: 65,\n code: 'KeyA',\n shiftKey: 'A',\n key: 'a'\n },\n KeyB: {\n keyCode: 66,\n code: 'KeyB',\n shiftKey: 'B',\n key: 'b'\n },\n KeyC: {\n keyCode: 67,\n code: 'KeyC',\n shiftKey: 'C',\n key: 'c'\n },\n KeyD: {\n keyCode: 68,\n code: 'KeyD',\n shiftKey: 'D',\n key: 'd'\n },\n KeyE: {\n keyCode: 69,\n code: 'KeyE',\n shiftKey: 'E',\n key: 'e'\n },\n KeyF: {\n keyCode: 70,\n code: 'KeyF',\n shiftKey: 'F',\n key: 'f'\n },\n KeyG: {\n keyCode: 71,\n code: 'KeyG',\n shiftKey: 'G',\n key: 'g'\n },\n KeyH: {\n keyCode: 72,\n code: 'KeyH',\n shiftKey: 'H',\n key: 'h'\n },\n KeyI: {\n keyCode: 73,\n code: 'KeyI',\n shiftKey: 'I',\n key: 'i'\n },\n KeyJ: {\n keyCode: 74,\n code: 'KeyJ',\n shiftKey: 'J',\n key: 'j'\n },\n KeyK: {\n keyCode: 75,\n code: 'KeyK',\n shiftKey: 'K',\n key: 'k'\n },\n KeyL: {\n keyCode: 76,\n code: 'KeyL',\n shiftKey: 'L',\n key: 'l'\n },\n KeyM: {\n keyCode: 77,\n code: 'KeyM',\n shiftKey: 'M',\n key: 'm'\n },\n KeyN: {\n keyCode: 78,\n code: 'KeyN',\n shiftKey: 'N',\n key: 'n'\n },\n KeyO: {\n keyCode: 79,\n code: 'KeyO',\n shiftKey: 'O',\n key: 'o'\n },\n KeyP: {\n keyCode: 80,\n code: 'KeyP',\n shiftKey: 'P',\n key: 'p'\n },\n KeyQ: {\n keyCode: 81,\n code: 'KeyQ',\n shiftKey: 'Q',\n key: 'q'\n },\n KeyR: {\n keyCode: 82,\n code: 'KeyR',\n shiftKey: 'R',\n key: 'r'\n },\n KeyS: {\n keyCode: 83,\n code: 'KeyS',\n shiftKey: 'S',\n key: 's'\n },\n KeyT: {\n keyCode: 84,\n code: 'KeyT',\n shiftKey: 'T',\n key: 't'\n },\n KeyU: {\n keyCode: 85,\n code: 'KeyU',\n shiftKey: 'U',\n key: 'u'\n },\n KeyV: {\n keyCode: 86,\n code: 'KeyV',\n shiftKey: 'V',\n key: 'v'\n },\n KeyW: {\n keyCode: 87,\n code: 'KeyW',\n shiftKey: 'W',\n key: 'w'\n },\n KeyX: {\n keyCode: 88,\n code: 'KeyX',\n shiftKey: 'X',\n key: 'x'\n },\n KeyY: {\n keyCode: 89,\n code: 'KeyY',\n shiftKey: 'Y',\n key: 'y'\n },\n KeyZ: {\n keyCode: 90,\n code: 'KeyZ',\n shiftKey: 'Z',\n key: 'z'\n },\n MetaLeft: {\n keyCode: 91,\n code: 'MetaLeft',\n key: 'Meta',\n location: 1\n },\n MetaRight: {\n keyCode: 92,\n code: 'MetaRight',\n key: 'Meta',\n location: 2\n },\n ContextMenu: {\n keyCode: 93,\n code: 'ContextMenu',\n key: 'ContextMenu'\n },\n NumpadMultiply: {\n keyCode: 106,\n code: 'NumpadMultiply',\n key: '*',\n location: 3\n },\n NumpadAdd: {\n keyCode: 107,\n code: 'NumpadAdd',\n key: '+',\n location: 3\n },\n NumpadSubtract: {\n keyCode: 109,\n code: 'NumpadSubtract',\n key: '-',\n location: 3\n },\n NumpadDivide: {\n keyCode: 111,\n code: 'NumpadDivide',\n key: '/',\n location: 3\n },\n F1: {\n keyCode: 112,\n code: 'F1',\n key: 'F1'\n },\n F2: {\n keyCode: 113,\n code: 'F2',\n key: 'F2'\n },\n F3: {\n keyCode: 114,\n code: 'F3',\n key: 'F3'\n },\n F4: {\n keyCode: 115,\n code: 'F4',\n key: 'F4'\n },\n F5: {\n keyCode: 116,\n code: 'F5',\n key: 'F5'\n },\n F6: {\n keyCode: 117,\n code: 'F6',\n key: 'F6'\n },\n F7: {\n keyCode: 118,\n code: 'F7',\n key: 'F7'\n },\n F8: {\n keyCode: 119,\n code: 'F8',\n key: 'F8'\n },\n F9: {\n keyCode: 120,\n code: 'F9',\n key: 'F9'\n },\n F10: {\n keyCode: 121,\n code: 'F10',\n key: 'F10'\n },\n F11: {\n keyCode: 122,\n code: 'F11',\n key: 'F11'\n },\n F12: {\n keyCode: 123,\n code: 'F12',\n key: 'F12'\n },\n F13: {\n keyCode: 124,\n code: 'F13',\n key: 'F13'\n },\n F14: {\n keyCode: 125,\n code: 'F14',\n key: 'F14'\n },\n F15: {\n keyCode: 126,\n code: 'F15',\n key: 'F15'\n },\n F16: {\n keyCode: 127,\n code: 'F16',\n key: 'F16'\n },\n F17: {\n keyCode: 128,\n code: 'F17',\n key: 'F17'\n },\n F18: {\n keyCode: 129,\n code: 'F18',\n key: 'F18'\n },\n F19: {\n keyCode: 130,\n code: 'F19',\n key: 'F19'\n },\n F20: {\n keyCode: 131,\n code: 'F20',\n key: 'F20'\n },\n F21: {\n keyCode: 132,\n code: 'F21',\n key: 'F21'\n },\n F22: {\n keyCode: 133,\n code: 'F22',\n key: 'F22'\n },\n F23: {\n keyCode: 134,\n code: 'F23',\n key: 'F23'\n },\n F24: {\n keyCode: 135,\n code: 'F24',\n key: 'F24'\n },\n NumLock: {\n keyCode: 144,\n code: 'NumLock',\n key: 'NumLock'\n },\n ScrollLock: {\n keyCode: 145,\n code: 'ScrollLock',\n key: 'ScrollLock'\n },\n AudioVolumeMute: {\n keyCode: 173,\n code: 'AudioVolumeMute',\n key: 'AudioVolumeMute'\n },\n AudioVolumeDown: {\n keyCode: 174,\n code: 'AudioVolumeDown',\n key: 'AudioVolumeDown'\n },\n AudioVolumeUp: {\n keyCode: 175,\n code: 'AudioVolumeUp',\n key: 'AudioVolumeUp'\n },\n MediaTrackNext: {\n keyCode: 176,\n code: 'MediaTrackNext',\n key: 'MediaTrackNext'\n },\n MediaTrackPrevious: {\n keyCode: 177,\n code: 'MediaTrackPrevious',\n key: 'MediaTrackPrevious'\n },\n MediaStop: {\n keyCode: 178,\n code: 'MediaStop',\n key: 'MediaStop'\n },\n MediaPlayPause: {\n keyCode: 179,\n code: 'MediaPlayPause',\n key: 'MediaPlayPause'\n },\n Semicolon: {\n keyCode: 186,\n code: 'Semicolon',\n shiftKey: ':',\n key: ';'\n },\n Equal: {\n keyCode: 187,\n code: 'Equal',\n shiftKey: '+',\n key: '='\n },\n NumpadEqual: {\n keyCode: 187,\n code: 'NumpadEqual',\n key: '=',\n location: 3\n },\n Comma: {\n keyCode: 188,\n code: 'Comma',\n shiftKey: '<',\n key: ','\n },\n Minus: {\n keyCode: 189,\n code: 'Minus',\n shiftKey: '_',\n key: '-'\n },\n Period: {\n keyCode: 190,\n code: 'Period',\n shiftKey: '>',\n key: '.'\n },\n Slash: {\n keyCode: 191,\n code: 'Slash',\n shiftKey: '?',\n key: '/'\n },\n Backquote: {\n keyCode: 192,\n code: 'Backquote',\n shiftKey: '~',\n key: '`'\n },\n BracketLeft: {\n keyCode: 219,\n code: 'BracketLeft',\n shiftKey: '{',\n key: '['\n },\n Backslash: {\n keyCode: 220,\n code: 'Backslash',\n shiftKey: '|',\n key: '\\\\'\n },\n BracketRight: {\n keyCode: 221,\n code: 'BracketRight',\n shiftKey: '}',\n key: ']'\n },\n Quote: {\n keyCode: 222,\n code: 'Quote',\n shiftKey: '\"',\n key: \"'\"\n },\n AltGraph: {\n keyCode: 225,\n code: 'AltGraph',\n key: 'AltGraph'\n },\n Props: {\n keyCode: 247,\n code: 'Props',\n key: 'CrSel'\n },\n Cancel: {\n keyCode: 3,\n key: 'Cancel',\n code: 'Abort'\n },\n Clear: {\n keyCode: 12,\n key: 'Clear',\n code: 'Numpad5',\n location: 3\n },\n Shift: {\n keyCode: 16,\n key: 'Shift',\n code: 'ShiftLeft',\n location: 1\n },\n Control: {\n keyCode: 17,\n key: 'Control',\n code: 'ControlLeft',\n location: 1\n },\n Alt: {\n keyCode: 18,\n key: 'Alt',\n code: 'AltLeft',\n location: 1\n },\n Accept: {\n keyCode: 30,\n key: 'Accept'\n },\n ModeChange: {\n keyCode: 31,\n key: 'ModeChange'\n },\n ' ': {\n keyCode: 32,\n key: ' ',\n code: 'Space'\n },\n Print: {\n keyCode: 42,\n key: 'Print'\n },\n Execute: {\n keyCode: 43,\n key: 'Execute',\n code: 'Open'\n },\n '\\u0000': {\n keyCode: 46,\n key: '\\u0000',\n code: 'NumpadDecimal',\n location: 3\n },\n a: {\n keyCode: 65,\n key: 'a',\n code: 'KeyA'\n },\n b: {\n keyCode: 66,\n key: 'b',\n code: 'KeyB'\n },\n c: {\n keyCode: 67,\n key: 'c',\n code: 'KeyC'\n },\n d: {\n keyCode: 68,\n key: 'd',\n code: 'KeyD'\n },\n e: {\n keyCode: 69,\n key: 'e',\n code: 'KeyE'\n },\n f: {\n keyCode: 70,\n key: 'f',\n code: 'KeyF'\n },\n g: {\n keyCode: 71,\n key: 'g',\n code: 'KeyG'\n },\n h: {\n keyCode: 72,\n key: 'h',\n code: 'KeyH'\n },\n i: {\n keyCode: 73,\n key: 'i',\n code: 'KeyI'\n },\n j: {\n keyCode: 74,\n key: 'j',\n code: 'KeyJ'\n },\n k: {\n keyCode: 75,\n key: 'k',\n code: 'KeyK'\n },\n l: {\n keyCode: 76,\n key: 'l',\n code: 'KeyL'\n },\n m: {\n keyCode: 77,\n key: 'm',\n code: 'KeyM'\n },\n n: {\n keyCode: 78,\n key: 'n',\n code: 'KeyN'\n },\n o: {\n keyCode: 79,\n key: 'o',\n code: 'KeyO'\n },\n p: {\n keyCode: 80,\n key: 'p',\n code: 'KeyP'\n },\n q: {\n keyCode: 81,\n key: 'q',\n code: 'KeyQ'\n },\n r: {\n keyCode: 82,\n key: 'r',\n code: 'KeyR'\n },\n s: {\n keyCode: 83,\n key: 's',\n code: 'KeyS'\n },\n t: {\n keyCode: 84,\n key: 't',\n code: 'KeyT'\n },\n u: {\n keyCode: 85,\n key: 'u',\n code: 'KeyU'\n },\n v: {\n keyCode: 86,\n key: 'v',\n code: 'KeyV'\n },\n w: {\n keyCode: 87,\n key: 'w',\n code: 'KeyW'\n },\n x: {\n keyCode: 88,\n key: 'x',\n code: 'KeyX'\n },\n y: {\n keyCode: 89,\n key: 'y',\n code: 'KeyY'\n },\n z: {\n keyCode: 90,\n key: 'z',\n code: 'KeyZ'\n },\n Meta: {\n keyCode: 91,\n key: 'Meta',\n code: 'MetaLeft',\n location: 1\n },\n '*': {\n keyCode: 106,\n key: '*',\n code: 'NumpadMultiply',\n location: 3\n },\n '+': {\n keyCode: 107,\n key: '+',\n code: 'NumpadAdd',\n location: 3\n },\n '-': {\n keyCode: 109,\n key: '-',\n code: 'NumpadSubtract',\n location: 3\n },\n '/': {\n keyCode: 111,\n key: '/',\n code: 'NumpadDivide',\n location: 3\n },\n ';': {\n keyCode: 186,\n key: ';',\n code: 'Semicolon'\n },\n '=': {\n keyCode: 187,\n key: '=',\n code: 'Equal'\n },\n ',': {\n keyCode: 188,\n key: ',',\n code: 'Comma'\n },\n '.': {\n keyCode: 190,\n key: '.',\n code: 'Period'\n },\n '`': {\n keyCode: 192,\n key: '`',\n code: 'Backquote'\n },\n '[': {\n keyCode: 219,\n key: '[',\n code: 'BracketLeft'\n },\n '\\\\': {\n keyCode: 220,\n key: '\\\\',\n code: 'Backslash'\n },\n ']': {\n keyCode: 221,\n key: ']',\n code: 'BracketRight'\n },\n \"'\": {\n keyCode: 222,\n key: \"'\",\n code: 'Quote'\n },\n Attn: {\n keyCode: 246,\n key: 'Attn'\n },\n CrSel: {\n keyCode: 247,\n key: 'CrSel',\n code: 'Props'\n },\n ExSel: {\n keyCode: 248,\n key: 'ExSel'\n },\n EraseEof: {\n keyCode: 249,\n key: 'EraseEof'\n },\n Play: {\n keyCode: 250,\n key: 'Play'\n },\n ZoomOut: {\n keyCode: 251,\n key: 'ZoomOut'\n },\n ')': {\n keyCode: 48,\n key: ')',\n code: 'Digit0'\n },\n '!': {\n keyCode: 49,\n key: '!',\n code: 'Digit1'\n },\n '@': {\n keyCode: 50,\n key: '@',\n code: 'Digit2'\n },\n '#': {\n keyCode: 51,\n key: '#',\n code: 'Digit3'\n },\n $: {\n keyCode: 52,\n key: '$',\n code: 'Digit4'\n },\n '%': {\n keyCode: 53,\n key: '%',\n code: 'Digit5'\n },\n '^': {\n keyCode: 54,\n key: '^',\n code: 'Digit6'\n },\n '&': {\n keyCode: 55,\n key: '&',\n code: 'Digit7'\n },\n '(': {\n keyCode: 57,\n key: '(',\n code: 'Digit9'\n },\n A: {\n keyCode: 65,\n key: 'A',\n code: 'KeyA'\n },\n B: {\n keyCode: 66,\n key: 'B',\n code: 'KeyB'\n },\n C: {\n keyCode: 67,\n key: 'C',\n code: 'KeyC'\n },\n D: {\n keyCode: 68,\n key: 'D',\n code: 'KeyD'\n },\n E: {\n keyCode: 69,\n key: 'E',\n code: 'KeyE'\n },\n F: {\n keyCode: 70,\n key: 'F',\n code: 'KeyF'\n },\n G: {\n keyCode: 71,\n key: 'G',\n code: 'KeyG'\n },\n H: {\n keyCode: 72,\n key: 'H',\n code: 'KeyH'\n },\n I: {\n keyCode: 73,\n key: 'I',\n code: 'KeyI'\n },\n J: {\n keyCode: 74,\n key: 'J',\n code: 'KeyJ'\n },\n K: {\n keyCode: 75,\n key: 'K',\n code: 'KeyK'\n },\n L: {\n keyCode: 76,\n key: 'L',\n code: 'KeyL'\n },\n M: {\n keyCode: 77,\n key: 'M',\n code: 'KeyM'\n },\n N: {\n keyCode: 78,\n key: 'N',\n code: 'KeyN'\n },\n O: {\n keyCode: 79,\n key: 'O',\n code: 'KeyO'\n },\n P: {\n keyCode: 80,\n key: 'P',\n code: 'KeyP'\n },\n Q: {\n keyCode: 81,\n key: 'Q',\n code: 'KeyQ'\n },\n R: {\n keyCode: 82,\n key: 'R',\n code: 'KeyR'\n },\n S: {\n keyCode: 83,\n key: 'S',\n code: 'KeyS'\n },\n T: {\n keyCode: 84,\n key: 'T',\n code: 'KeyT'\n },\n U: {\n keyCode: 85,\n key: 'U',\n code: 'KeyU'\n },\n V: {\n keyCode: 86,\n key: 'V',\n code: 'KeyV'\n },\n W: {\n keyCode: 87,\n key: 'W',\n code: 'KeyW'\n },\n X: {\n keyCode: 88,\n key: 'X',\n code: 'KeyX'\n },\n Y: {\n keyCode: 89,\n key: 'Y',\n code: 'KeyY'\n },\n Z: {\n keyCode: 90,\n key: 'Z',\n code: 'KeyZ'\n },\n ':': {\n keyCode: 186,\n key: ':',\n code: 'Semicolon'\n },\n '<': {\n keyCode: 188,\n key: '<',\n code: 'Comma'\n },\n _: {\n keyCode: 189,\n key: '_',\n code: 'Minus'\n },\n '>': {\n keyCode: 190,\n key: '>',\n code: 'Period'\n },\n '?': {\n keyCode: 191,\n key: '?',\n code: 'Slash'\n },\n '~': {\n keyCode: 192,\n key: '~',\n code: 'Backquote'\n },\n '{': {\n keyCode: 219,\n key: '{',\n code: 'BracketLeft'\n },\n '|': {\n keyCode: 220,\n key: '|',\n code: 'Backslash'\n },\n '}': {\n keyCode: 221,\n key: '}',\n code: 'BracketRight'\n },\n '\"': {\n keyCode: 222,\n key: '\"',\n code: 'Quote'\n },\n SoftLeft: {\n key: 'SoftLeft',\n code: 'SoftLeft',\n location: 4\n },\n SoftRight: {\n key: 'SoftRight',\n code: 'SoftRight',\n location: 4\n },\n Camera: {\n keyCode: 44,\n key: 'Camera',\n code: 'Camera',\n location: 4\n },\n Call: {\n key: 'Call',\n code: 'Call',\n location: 4\n },\n EndCall: {\n keyCode: 95,\n key: 'EndCall',\n code: 'EndCall',\n location: 4\n },\n VolumeDown: {\n keyCode: 182,\n key: 'VolumeDown',\n code: 'VolumeDown',\n location: 4\n },\n VolumeUp: {\n keyCode: 183,\n key: 'VolumeUp',\n code: 'VolumeUp',\n location: 4\n }\n};\nconst lowerCaseKeyDefinitions = Object.entries(_keyDefinitions).reduce((acc, [key, definition])=>{\n const lowerKey = key.toLowerCase();\n if (lowerKey !== key) acc[lowerKey] = definition;\n return acc;\n}, {});\nconst getKeyDefinition = (key)=>{\n const lowerKey = key.toLowerCase();\n if (lowerCaseKeyDefinitions[lowerKey]) return lowerCaseKeyDefinitions[lowerKey].key;\n return key;\n};\nconst isMac = 'undefined' != typeof window ? /Mac|iPod|iPhone|iPad/.test(window.navigator.platform) : 'darwin' === process.platform;\nconst keyMap = {\n return: _keyDefinitions.Enter.key,\n enter: _keyDefinitions.Enter.key,\n ctrl: isMac ? _keyDefinitions.Meta.key : _keyDefinitions.Control.key,\n shift: _keyDefinitions.Shift.key,\n alt: _keyDefinitions.Alt.key,\n space: _keyDefinitions.Space.key,\n 'page down': _keyDefinitions.PageDown.key,\n pagedown: _keyDefinitions.PageDown.key,\n 'page up': _keyDefinitions.PageUp.key,\n pageup: _keyDefinitions.PageUp.key\n};\nfunction transformHotkeyInput(keyInput) {\n if (keyMap[keyInput.toLowerCase()]) return [\n getKeyDefinition(keyMap[keyInput.toLowerCase()])\n ];\n return keyInput.split(' ').map((key)=>getKeyDefinition(keyMap[key.toLowerCase()] || key));\n}\nexport { _keyDefinitions, getKeyDefinition, isMac, transformHotkeyInput };\n","import { UITarsModelVersion } from \"@midscene/shared/env\";\nimport { resizeImgBase64 } from \"@midscene/shared/img\";\nimport { getDebug } from \"@midscene/shared/logger\";\nimport { transformHotkeyInput } from \"@midscene/shared/us-keyboard-layout\";\nimport { assert } from \"@midscene/shared/utils\";\nimport { actionParser } from \"@ui-tars/action-parser\";\nimport { AIActionType } from \"./common.mjs\";\nimport { getSummary, getUiTarsPlanningPrompt } from \"./prompt/ui-tars-planning.mjs\";\nimport { callAIWithStringResponse } from \"./service-caller/index.mjs\";\nconst debug = getDebug('ui-tars-planning');\nconst bboxSize = 10;\nconst pointToBbox = (point, width, height)=>[\n Math.round(Math.max(point.x - bboxSize / 2, 0)),\n Math.round(Math.max(point.y - bboxSize / 2, 0)),\n Math.round(Math.min(point.x + bboxSize / 2, width)),\n Math.round(Math.min(point.y + bboxSize / 2, height))\n ];\nasync function uiTarsPlanning(userInstruction, options) {\n const { conversationHistory, context, modelConfig } = options;\n const { uiTarsModelVersion } = modelConfig;\n const systemPrompt = getUiTarsPlanningPrompt() + userInstruction;\n const imagePayload = await resizeImageForUiTars(context.screenshotBase64, context.size, uiTarsModelVersion);\n conversationHistory.append({\n role: 'user',\n content: [\n {\n type: 'image_url',\n image_url: {\n url: imagePayload\n }\n }\n ]\n });\n const res = await callAIWithStringResponse([\n {\n role: 'user',\n content: systemPrompt\n },\n ...conversationHistory.snapshot()\n ], AIActionType.INSPECT_ELEMENT, modelConfig);\n const convertedText = convertBboxToCoordinates(res.content);\n const { size } = context;\n const { parsed } = actionParser({\n prediction: convertedText,\n factor: [\n 1000,\n 1000\n ],\n screenContext: {\n width: size.width,\n height: size.height\n },\n modelVer: uiTarsModelVersion\n });\n debug('ui-tars modelVer', uiTarsModelVersion, ', parsed', JSON.stringify(parsed));\n const transformActions = [];\n let shouldContinue = true;\n parsed.forEach((action)=>{\n const actionType = (action.action_type || '').toLowerCase();\n if ('click' === actionType) {\n assert(action.action_inputs.start_box, 'start_box is required');\n const point = getPoint(action.action_inputs.start_box, size);\n transformActions.push({\n type: 'Tap',\n param: {\n locate: {\n prompt: action.thought || '',\n bbox: pointToBbox({\n x: point[0],\n y: point[1]\n }, size.width, size.height)\n }\n }\n });\n } else if ('drag' === actionType) {\n assert(action.action_inputs.start_box, 'start_box is required');\n assert(action.action_inputs.end_box, 'end_box is required');\n const startPoint = getPoint(action.action_inputs.start_box, size);\n const endPoint = getPoint(action.action_inputs.end_box, size);\n transformActions.push({\n type: 'DragAndDrop',\n param: {\n from: {\n prompt: action.thought || '',\n bbox: pointToBbox({\n x: startPoint[0],\n y: startPoint[1]\n }, size.width, size.height)\n },\n to: {\n prompt: action.thought || '',\n bbox: pointToBbox({\n x: endPoint[0],\n y: endPoint[1]\n }, size.width, size.height)\n }\n },\n thought: action.thought || ''\n });\n } else if ('type' === actionType) transformActions.push({\n type: 'Input',\n param: {\n value: action.action_inputs.content\n },\n thought: action.thought || ''\n });\n else if ('scroll' === actionType) transformActions.push({\n type: 'Scroll',\n param: {\n direction: action.action_inputs.direction\n },\n thought: action.thought || ''\n });\n else if ('finished' === actionType) {\n shouldContinue = false;\n transformActions.push({\n type: 'Finished',\n param: {},\n thought: action.thought || ''\n });\n } else if ('hotkey' === actionType) if (action.action_inputs.key) {\n const keys = transformHotkeyInput(action.action_inputs.key);\n transformActions.push({\n type: 'KeyboardPress',\n param: {\n keyName: keys\n },\n thought: action.thought || ''\n });\n } else console.warn('No key found in action: hotkey. Will not perform action.');\n else if ('wait' === actionType) transformActions.push({\n type: 'Sleep',\n param: {\n timeMs: 1000\n },\n thought: action.thought || ''\n });\n });\n if (0 === transformActions.length) throw new Error(`No actions found, response: ${res.content}`, {\n cause: {\n prediction: res.content,\n parsed\n }\n });\n debug('transformActions', JSON.stringify(transformActions, null, 2));\n const log = getSummary(res.content);\n conversationHistory.append({\n role: 'assistant',\n content: log\n });\n return {\n actions: transformActions,\n log,\n usage: res.usage,\n rawResponse: JSON.stringify(res.content, void 0, 2),\n more_actions_needed_by_instruction: shouldContinue\n };\n}\nfunction convertBboxToCoordinates(text) {\n const pattern = /<bbox>(\\d+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)<\\/bbox>/g;\n function replaceMatch(match, x1, y1, x2, y2) {\n const x1Num = Number.parseInt(x1, 10);\n const y1Num = Number.parseInt(y1, 10);\n const x2Num = Number.parseInt(x2, 10);\n const y2Num = Number.parseInt(y2, 10);\n const x = Math.floor((x1Num + x2Num) / 2);\n const y = Math.floor((y1Num + y2Num) / 2);\n return `(${x},${y})`;\n }\n const cleanedText = text.replace(/\\[EOS\\]/g, '');\n return cleanedText.replace(pattern, replaceMatch).trim();\n}\nfunction getPoint(startBox, size) {\n const [x, y] = JSON.parse(startBox);\n return [\n x * size.width,\n y * size.height\n ];\n}\nasync function resizeImageForUiTars(imageBase64, size, uiTarsVersion) {\n if (uiTarsVersion === UITarsModelVersion.V1_5) {\n debug('ui-tars-v1.5, will check image size', size);\n const currentPixels = size.width * size.height;\n const maxPixels = 12845056;\n if (currentPixels > maxPixels) {\n const resizeFactor = Math.sqrt(maxPixels / currentPixels);\n const newWidth = Math.floor(size.width * resizeFactor);\n const newHeight = Math.floor(size.height * resizeFactor);\n debug('resize image for ui-tars, new width: %s, new height: %s', newWidth, newHeight);\n const resizedImage = await resizeImgBase64(imageBase64, {\n width: newWidth,\n height: newHeight\n });\n return resizedImage;\n }\n }\n return imageBase64;\n}\nexport { resizeImageForUiTars, uiTarsPlanning };\n\n//# sourceMappingURL=ui-tars-planning.mjs.map","import { getDebug } from \"@midscene/shared/logger\";\nimport { assert } from \"@midscene/shared/utils\";\nimport js_yaml from \"js-yaml\";\nconst debugUtils = getDebug('yaml:utils');\nfunction interpolateEnvVars(content) {\n return content.replace(/\\$\\{([^}]+)\\}/g, (_, envVar)=>{\n const value = process.env[envVar.trim()];\n if (void 0 === value) throw new Error(`Environment variable \"${envVar.trim()}\" is not defined`);\n return value;\n });\n}\nfunction parseYamlScript(content, filePath) {\n let processedContent = content;\n if (-1 !== content.indexOf('android') && content.match(/deviceId:\\s*(\\d+)/)) {\n let matchedDeviceId;\n processedContent = content.replace(/deviceId:\\s*(\\d+)/g, (match, deviceId)=>{\n matchedDeviceId = deviceId;\n return `deviceId: '${deviceId}'`;\n });\n console.warn(`please use string-style deviceId in yaml script, for example: deviceId: \"${matchedDeviceId}\"`);\n }\n const interpolatedContent = interpolateEnvVars(processedContent);\n const obj = js_yaml.load(interpolatedContent, {\n schema: js_yaml.JSON_SCHEMA\n });\n const pathTip = filePath ? `, failed to load ${filePath}` : '';\n assert(obj.tasks, `property \"tasks\" is required in yaml script ${pathTip}`);\n assert(Array.isArray(obj.tasks), `property \"tasks\" must be an array in yaml script, but got ${obj.tasks}`);\n return obj;\n}\nfunction buildDetailedLocateParam(locatePrompt, opt) {\n debugUtils('will call buildDetailedLocateParam', locatePrompt, opt);\n let prompt = locatePrompt || (null == opt ? void 0 : opt.prompt) || (null == opt ? void 0 : opt.locate);\n let deepThink = false;\n let cacheable = true;\n let xpath;\n if ('object' == typeof opt && null !== opt) {\n deepThink = opt.deepThink ?? false;\n cacheable = opt.cacheable ?? true;\n xpath = opt.xpath;\n if (locatePrompt && opt.prompt && locatePrompt !== opt.prompt) console.warn('conflict prompt for item', locatePrompt, opt, 'maybe you put the prompt in the wrong place');\n prompt = prompt || opt.prompt;\n }\n if (!prompt) return void debugUtils('no prompt, will return undefined in buildDetailedLocateParam', opt);\n return {\n prompt,\n deepThink,\n cacheable,\n xpath\n };\n}\nfunction buildDetailedLocateParamAndRestParams(locatePrompt, opt, excludeKeys = []) {\n const locateParam = buildDetailedLocateParam(locatePrompt, opt);\n const restParams = {};\n if ('object' == typeof opt && null !== opt) {\n const allKeys = Object.keys(opt);\n const locateParamKeys = Object.keys(locateParam || {});\n for (const key of allKeys)if (!locateParamKeys.includes(key) && !excludeKeys.includes(key) && 'locate' !== key) restParams[key] = opt[key];\n }\n return {\n locateParam,\n restParams\n };\n}\nexport { buildDetailedLocateParam, buildDetailedLocateParamAndRestParams, interpolateEnvVars, parseYamlScript };\n\n//# sourceMappingURL=utils.mjs.map","import { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { basename, dirname, join, resolve as external_node_path_resolve } from \"node:path\";\nimport { assert, ifInBrowser, ifInWorker } from \"@midscene/shared/utils\";\nimport { getMidsceneRunSubDir } from \"@midscene/shared/common\";\nimport { getDebug } from \"@midscene/shared/logger\";\nimport { buildDetailedLocateParam, buildDetailedLocateParamAndRestParams } from \"./utils.mjs\";\nfunction _define_property(obj, key, value) {\n if (key in obj) Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n else obj[key] = value;\n return obj;\n}\nconst debug = getDebug('yaml-player');\nclass ScriptPlayer {\n setResult(key, value) {\n const keyToUse = key || this.unnamedResultIndex++;\n if (this.result[keyToUse]) console.warn(`result key ${keyToUse} already exists, will overwrite`);\n this.result[keyToUse] = value;\n return this.flushResult();\n }\n setPlayerStatus(status, error) {\n this.status = status;\n this.errorInSetup = error;\n }\n notifyCurrentTaskStatusChange(taskIndex) {\n const taskIndexToNotify = 'number' == typeof taskIndex ? taskIndex : this.currentTaskIndex;\n if ('number' != typeof taskIndexToNotify) return;\n const taskStatus = this.taskStatusList[taskIndexToNotify];\n if (this.onTaskStatusChange) this.onTaskStatusChange(taskStatus);\n }\n async setTaskStatus(index, statusValue, error) {\n this.taskStatusList[index].status = statusValue;\n if (error) this.taskStatusList[index].error = error;\n this.notifyCurrentTaskStatusChange(index);\n }\n setTaskIndex(taskIndex) {\n this.currentTaskIndex = taskIndex;\n }\n flushResult() {\n if (this.output) {\n const output = external_node_path_resolve(process.cwd(), this.output);\n const outputDir = dirname(output);\n if (!existsSync(outputDir)) mkdirSync(outputDir, {\n recursive: true\n });\n writeFileSync(output, JSON.stringify(this.result || {}, void 0, 2));\n }\n }\n flushUnstableLogContent() {\n if (this.unstableLogContent) {\n var _this_interfaceAgent;\n const content = null == (_this_interfaceAgent = this.interfaceAgent) ? void 0 : _this_interfaceAgent._unstableLogContent();\n const filePath = external_node_path_resolve(process.cwd(), this.unstableLogContent);\n const outputDir = dirname(filePath);\n if (!existsSync(outputDir)) mkdirSync(outputDir, {\n recursive: true\n });\n writeFileSync(filePath, JSON.stringify(content, null, 2));\n }\n }\n async playTask(taskStatus, agent) {\n const { flow } = taskStatus;\n assert(flow, 'missing flow in task');\n for(const flowItemIndex in flow){\n const currentStep = Number.parseInt(flowItemIndex, 10);\n taskStatus.currentStep = currentStep;\n const flowItem = flow[flowItemIndex];\n debug(`playing step ${flowItemIndex}, flowItem=${JSON.stringify(flowItem)}`);\n if ('aiAct' in flowItem || 'aiAction' in flowItem || 'ai' in flowItem) {\n const actionTask = flowItem;\n const prompt = actionTask.aiAct || actionTask.aiAction || actionTask.ai;\n assert(prompt, 'missing prompt for ai (aiAct)');\n await agent.aiAct(prompt, {\n cacheable: actionTask.cacheable\n });\n } else if ('aiAssert' in flowItem) {\n const assertTask = flowItem;\n const prompt = assertTask.aiAssert;\n const msg = assertTask.errorMessage;\n assert(prompt, 'missing prompt for aiAssert');\n const { pass, thought, message } = await agent.aiAssert(prompt, msg, {\n keepRawResponse: true\n }) || {};\n this.setResult(assertTask.name, {\n pass,\n thought,\n message\n });\n if (!pass) throw new Error(message);\n } else if ('aiQuery' in flowItem) {\n const queryTask = flowItem;\n const prompt = queryTask.aiQuery;\n const options = {\n domIncluded: queryTask.domIncluded,\n screenshotIncluded: queryTask.screenshotIncluded\n };\n assert(prompt, 'missing prompt for aiQuery');\n const queryResult = await agent.aiQuery(prompt, options);\n this.setResult(queryTask.name, queryResult);\n } else if ('aiNumber' in flowItem) {\n const numberTask = flowItem;\n const prompt = numberTask.aiNumber;\n const options = {\n domIncluded: numberTask.domIncluded,\n screenshotIncluded: numberTask.screenshotIncluded\n };\n assert(prompt, 'missing prompt for aiNumber');\n const numberResult = await agent.aiNumber(prompt, options);\n this.setResult(numberTask.name, numberResult);\n } else if ('aiString' in flowItem) {\n const stringTask = flowItem;\n const prompt = stringTask.aiString;\n const options = {\n domIncluded: stringTask.domIncluded,\n screenshotIncluded: stringTask.screenshotIncluded\n };\n assert(prompt, 'missing prompt for aiString');\n const stringResult = await agent.aiString(prompt, options);\n this.setResult(stringTask.name, stringResult);\n } else if ('aiBoolean' in flowItem) {\n const booleanTask = flowItem;\n const prompt = booleanTask.aiBoolean;\n const options = {\n domIncluded: booleanTask.domIncluded,\n screenshotIncluded: booleanTask.screenshotIncluded\n };\n assert(prompt, 'missing prompt for aiBoolean');\n const booleanResult = await agent.aiBoolean(prompt, options);\n this.setResult(booleanTask.name, booleanResult);\n } else if ('aiAsk' in flowItem) {\n const askTask = flowItem;\n const prompt = askTask.aiAsk;\n assert(prompt, 'missing prompt for aiAsk');\n const askResult = await agent.aiAsk(prompt);\n this.setResult(askTask.name, askResult);\n } else if ('aiLocate' in flowItem) {\n const locateTask = flowItem;\n const prompt = locateTask.aiLocate;\n assert(prompt, 'missing prompt for aiLocate');\n const locateResult = await agent.aiLocate(prompt, locateTask);\n this.setResult(locateTask.name, locateResult);\n } else if ('aiWaitFor' in flowItem) {\n const waitForTask = flowItem;\n const prompt = waitForTask.aiWaitFor;\n assert(prompt, 'missing prompt for aiWaitFor');\n const timeout = waitForTask.timeout;\n await agent.aiWaitFor(prompt, {\n timeoutMs: timeout\n });\n } else if ('sleep' in flowItem) {\n const sleepTask = flowItem;\n const ms = sleepTask.sleep;\n let msNumber = ms;\n if ('string' == typeof ms) msNumber = Number.parseInt(ms, 10);\n assert(msNumber && msNumber > 0, `ms for sleep must be greater than 0, but got ${ms}`);\n await new Promise((resolve)=>setTimeout(resolve, msNumber));\n } else if (\"javascript\" in flowItem) {\n const evaluateJavaScriptTask = flowItem;\n const result = await agent.evaluateJavaScript(evaluateJavaScriptTask.javascript);\n this.setResult(evaluateJavaScriptTask.name, result);\n } else if ('logScreenshot' in flowItem || 'recordToReport' in flowItem) {\n const recordTask = flowItem;\n const title = recordTask.recordToReport ?? recordTask.logScreenshot ?? 'untitled';\n const content = recordTask.content || '';\n await agent.recordToReport(title, {\n content\n });\n } else if ('aiInput' in flowItem) {\n const { aiInput, value: rawValue, ...inputTask } = flowItem;\n let locatePrompt;\n let value;\n if (inputTask.locate) {\n value = aiInput || rawValue;\n locatePrompt = inputTask.locate;\n } else {\n locatePrompt = aiInput || '';\n value = rawValue;\n }\n await agent.callActionInActionSpace('Input', {\n ...inputTask,\n ...void 0 !== value ? {\n value: String(value)\n } : {},\n ...locatePrompt ? {\n locate: buildDetailedLocateParam(locatePrompt, inputTask)\n } : {}\n });\n } else if ('aiKeyboardPress' in flowItem) {\n const { aiKeyboardPress, ...keyboardPressTask } = flowItem;\n let locatePrompt;\n let keyName;\n if (keyboardPressTask.locate) {\n keyName = aiKeyboardPress;\n locatePrompt = keyboardPressTask.locate;\n } else if (keyboardPressTask.keyName) {\n keyName = keyboardPressTask.keyName;\n locatePrompt = aiKeyboardPress;\n } else keyName = aiKeyboardPress;\n await agent.callActionInActionSpace('KeyboardPress', {\n ...keyboardPressTask,\n ...keyName ? {\n keyName\n } : {},\n ...locatePrompt ? {\n locate: buildDetailedLocateParam(locatePrompt, keyboardPressTask)\n } : {}\n });\n } else if ('aiScroll' in flowItem) {\n const { aiScroll, ...scrollTask } = flowItem;\n let locatePrompt;\n locatePrompt = scrollTask.locate ? scrollTask.locate : aiScroll;\n await agent.callActionInActionSpace('Scroll', {\n ...scrollTask,\n ...locatePrompt ? {\n locate: buildDetailedLocateParam(locatePrompt, scrollTask)\n } : {}\n });\n } else {\n const actionSpace = this.actionSpace;\n let locatePromptShortcut;\n const matchedAction = actionSpace.find((action)=>{\n const actionInterfaceAlias = action.interfaceAlias;\n if (actionInterfaceAlias && Object.prototype.hasOwnProperty.call(flowItem, actionInterfaceAlias)) {\n locatePromptShortcut = flowItem[actionInterfaceAlias];\n return true;\n }\n const keyOfActionInActionSpace = action.name;\n if (Object.prototype.hasOwnProperty.call(flowItem, keyOfActionInActionSpace)) {\n locatePromptShortcut = flowItem[keyOfActionInActionSpace];\n return true;\n }\n return false;\n });\n assert(matchedAction, `unknown flowItem in yaml: ${JSON.stringify(flowItem)}`);\n const flowItemForProcessing = locatePromptShortcut ? {\n ...flowItem,\n prompt: locatePromptShortcut\n } : flowItem;\n const { locateParam, restParams } = buildDetailedLocateParamAndRestParams(locatePromptShortcut || '', flowItemForProcessing, [\n matchedAction.name,\n matchedAction.interfaceAlias || '_never_mind_'\n ]);\n const flowParams = {\n ...restParams,\n locate: locateParam\n };\n debug(`matchedAction: ${matchedAction.name}`, `flowParams: ${JSON.stringify(flowParams, null, 2)}`);\n await agent.callActionInActionSpace(matchedAction.name, flowParams);\n }\n }\n this.reportFile = agent.reportFile;\n await this.flushUnstableLogContent();\n }\n async run() {\n const { target, web, android, ios, tasks } = this.script;\n const webEnv = web || target;\n const androidEnv = android;\n const iosEnv = ios;\n const platform = webEnv || androidEnv || iosEnv;\n this.setPlayerStatus('running');\n let agent = null;\n let freeFn = [];\n try {\n const { agent: newAgent, freeFn: newFreeFn } = await this.setupAgent(platform);\n this.actionSpace = await newAgent.getActionSpace();\n agent = newAgent;\n const originalOnTaskStartTip = agent.onTaskStartTip;\n agent.onTaskStartTip = (tip)=>{\n if ('running' === this.status) this.agentStatusTip = tip;\n null == originalOnTaskStartTip || originalOnTaskStartTip(tip);\n };\n freeFn = [\n ...newFreeFn || [],\n {\n name: 'restore-agent-onTaskStartTip',\n fn: ()=>{\n if (agent) agent.onTaskStartTip = originalOnTaskStartTip;\n }\n }\n ];\n } catch (e) {\n this.setPlayerStatus('error', e);\n return;\n }\n this.interfaceAgent = agent;\n let taskIndex = 0;\n this.setPlayerStatus('running');\n let errorFlag = false;\n while(taskIndex < tasks.length){\n const taskStatus = this.taskStatusList[taskIndex];\n this.setTaskStatus(taskIndex, 'running');\n this.setTaskIndex(taskIndex);\n try {\n await this.playTask(taskStatus, this.interfaceAgent);\n this.setTaskStatus(taskIndex, 'done');\n } catch (e) {\n this.setTaskStatus(taskIndex, 'error', e);\n if (taskStatus.continueOnError) ;\n else {\n this.reportFile = agent.reportFile;\n errorFlag = true;\n break;\n }\n }\n this.reportFile = null == agent ? void 0 : agent.reportFile;\n taskIndex++;\n }\n if (errorFlag) this.setPlayerStatus('error');\n else this.setPlayerStatus('done');\n this.agentStatusTip = '';\n for (const fn of freeFn)try {\n await fn.fn();\n } catch (e) {}\n }\n constructor(script, setupAgent, onTaskStatusChange, scriptPath){\n var _this_target, _this_target1, _this_target2;\n _define_property(this, \"script\", void 0);\n _define_property(this, \"setupAgent\", void 0);\n _define_property(this, \"onTaskStatusChange\", void 0);\n _define_property(this, \"currentTaskIndex\", void 0);\n _define_property(this, \"taskStatusList\", void 0);\n _define_property(this, \"status\", void 0);\n _define_property(this, \"reportFile\", void 0);\n _define_property(this, \"result\", void 0);\n _define_property(this, \"unnamedResultIndex\", void 0);\n _define_property(this, \"output\", void 0);\n _define_property(this, \"unstableLogContent\", void 0);\n _define_property(this, \"errorInSetup\", void 0);\n _define_property(this, \"interfaceAgent\", void 0);\n _define_property(this, \"agentStatusTip\", void 0);\n _define_property(this, \"target\", void 0);\n _define_property(this, \"actionSpace\", void 0);\n _define_property(this, \"scriptPath\", void 0);\n this.script = script;\n this.setupAgent = setupAgent;\n this.onTaskStatusChange = onTaskStatusChange;\n this.taskStatusList = [];\n this.status = 'init';\n this.unnamedResultIndex = 0;\n this.interfaceAgent = null;\n this.actionSpace = [];\n this.scriptPath = scriptPath;\n this.result = {};\n this.target = script.target || script.web || script.android || script.ios || script.config;\n if (ifInBrowser || ifInWorker) {\n this.output = void 0;\n debug('output is undefined in browser or worker');\n } else if (null == (_this_target = this.target) ? void 0 : _this_target.output) {\n this.output = external_node_path_resolve(process.cwd(), this.target.output);\n debug('setting output by config.output', this.output);\n } else {\n const scriptName = this.scriptPath ? basename(this.scriptPath, '.yaml').replace(/\\.(ya?ml)$/i, '') : \"script\";\n this.output = join(getMidsceneRunSubDir('output'), `${scriptName}-${Date.now()}.json`);\n debug(\"setting output by script path\", this.output);\n }\n if (ifInBrowser || ifInWorker) this.unstableLogContent = void 0;\n else if ('string' == typeof (null == (_this_target1 = this.target) ? void 0 : _this_target1.unstableLogContent)) this.unstableLogContent = external_node_path_resolve(process.cwd(), this.target.unstableLogContent);\n else if ((null == (_this_target2 = this.target) ? void 0 : _this_target2.unstableLogContent) === true) this.unstableLogContent = join(getMidsceneRunSubDir('output'), 'unstableLogContent.json');\n this.taskStatusList = (script.tasks || []).map((task, taskIndex)=>{\n var _task_flow;\n return {\n ...task,\n index: taskIndex,\n status: 'init',\n totalSteps: (null == (_task_flow = task.flow) ? void 0 : _task_flow.length) || 0\n };\n });\n }\n}\nexport { ScriptPlayer };\n\n//# sourceMappingURL=player.mjs.map","import { findAllMidsceneLocatorField } from \"@midscene/core/ai-model\";\nimport { buildDetailedLocateParam } from \"@midscene/core/yaml\";\nconst dataExtractionAPIs = [\n 'aiQuery',\n 'aiBoolean',\n 'aiNumber',\n 'aiString',\n 'aiAsk'\n];\nconst validationAPIs = [\n 'aiAssert',\n 'aiWaitFor'\n];\nconst noReplayAPIs = [\n ...dataExtractionAPIs,\n ...validationAPIs\n];\nconst formatErrorMessage = (e)=>{\n const errorMessage = (null == e ? void 0 : e.message) || '';\n if (errorMessage.includes('of different extension')) return 'Conflicting extension detected. Please disable the suspicious plugins and refresh the page. Guide: https://midscenejs.com/quick-experience.html#faq';\n if (errorMessage.includes('NOT_IMPLEMENTED_AS_DESIGNED')) return 'Further actions cannot be performed in the current environment';\n return errorMessage || 'Unknown error';\n};\nasync function parseStructuredParams(action, params, options = {}) {\n if (!(null == action ? void 0 : action.paramSchema) || !('shape' in action.paramSchema)) return [\n params.prompt || '',\n options\n ];\n const schema = action.paramSchema;\n const keys = schema && 'shape' in schema ? Object.keys(schema.shape) : [];\n const paramObj = {\n ...options\n };\n keys.forEach((key)=>{\n if (void 0 !== params[key] && null !== params[key] && '' !== params[key]) paramObj[key] = params[key];\n });\n if (schema) {\n const locatorFieldKeys = findAllMidsceneLocatorField(schema);\n locatorFieldKeys.forEach((locateKey)=>{\n const locatePrompt = params[locateKey];\n if (locatePrompt && 'string' == typeof locatePrompt) {\n const detailedLocateParam = buildDetailedLocateParam(locatePrompt, {\n deepThink: options.deepThink,\n cacheable: true\n });\n if (detailedLocateParam) paramObj[locateKey] = detailedLocateParam;\n }\n });\n }\n return [\n paramObj\n ];\n}\nfunction validateStructuredParams(value, action) {\n if (!value.params) return {\n valid: false,\n errorMessage: 'Parameters are required'\n };\n if (!(null == action ? void 0 : action.paramSchema)) return {\n valid: true\n };\n try {\n var _action_paramSchema;\n const paramsForValidation = {\n ...value.params\n };\n const schema = action.paramSchema;\n if (schema) {\n const locatorFieldKeys = findAllMidsceneLocatorField(schema);\n locatorFieldKeys.forEach((key)=>{\n if ('string' == typeof paramsForValidation[key]) paramsForValidation[key] = {\n midscene_location_field_flag: true,\n prompt: paramsForValidation[key],\n center: [\n 0,\n 0\n ],\n rect: {\n left: 0,\n top: 0,\n width: 0,\n height: 0\n }\n };\n });\n }\n null == (_action_paramSchema = action.paramSchema) || _action_paramSchema.parse(paramsForValidation);\n } catch (error) {\n const zodError = error;\n if (zodError.errors && zodError.errors.length > 0) {\n const errorMessages = zodError.errors.filter((err)=>{\n const path = err.path.join('.');\n return !path.includes('center') && !path.includes('rect') && !path.includes('midscene_location_field_flag');\n }).map((err)=>{\n const field = err.path.join('.');\n return `${field}: ${err.message}`;\n });\n if (errorMessages.length > 0) return {\n valid: false,\n errorMessage: `Validation error: ${errorMessages.join(', ')}`\n };\n } else {\n const errorMsg = error instanceof Error ? error.message : 'Unknown validation error';\n return {\n valid: false,\n errorMessage: `Parameter validation failed: ${errorMsg}`\n };\n }\n }\n return {\n valid: true\n };\n}\nasync function executeAction(activeAgent, actionType, actionSpace, value, options) {\n const action = null == actionSpace ? void 0 : actionSpace.find((a)=>a.interfaceAlias === actionType || a.name === actionType);\n if (action && 'function' == typeof activeAgent.callActionInActionSpace) if (value.params) {\n const parsedParams = await parseStructuredParams(action, value.params, options);\n return await activeAgent.callActionInActionSpace(action.name, parsedParams[0]);\n } else {\n const detailedLocateParam = value.prompt ? buildDetailedLocateParam(value.prompt, {\n deepThink: options.deepThink,\n cacheable: true\n }) : void 0;\n return await activeAgent.callActionInActionSpace(action.name, {\n locate: detailedLocateParam,\n ...options\n });\n }\n {\n const prompt = value.prompt;\n if ('aiAssert' === actionType) {\n var _activeAgent_aiAssert;\n const { pass, thought } = await (null == activeAgent ? void 0 : null == (_activeAgent_aiAssert = activeAgent.aiAssert) ? void 0 : _activeAgent_aiAssert.call(activeAgent, prompt || '', void 0, {\n keepRawResponse: true,\n ...options\n })) || {};\n return {\n pass: pass || false,\n thought: thought || ''\n };\n }\n if (activeAgent && 'function' == typeof activeAgent[actionType]) return await activeAgent[actionType](prompt, options);\n throw new Error(`Unknown action type: ${actionType}`);\n }\n}\nexport { dataExtractionAPIs, executeAction, formatErrorMessage, noReplayAPIs, parseStructuredParams, validateStructuredParams, validationAPIs };\n\n//# sourceMappingURL=common.mjs.map","import { findAllMidsceneLocatorField } from \"@midscene/core/ai-model\";\nclass BasePlaygroundAdapter {\n async getActionSpace(_context) {\n return [];\n }\n validateParams(value, action) {\n if (!(null == action ? void 0 : action.paramSchema)) return {\n valid: true\n };\n const needsStructuredParams = this.actionNeedsStructuredParams(action);\n if (!needsStructuredParams) return {\n valid: true\n };\n if (!value.params) return {\n valid: false,\n errorMessage: 'Parameters are required'\n };\n try {\n const paramsForValidation = this.prepareParamsForValidation(value.params, action);\n action.paramSchema.parse(paramsForValidation);\n return {\n valid: true\n };\n } catch (error) {\n return this.handleValidationError(error);\n }\n }\n createDisplayContent(value, needsStructuredParams, action) {\n if (!needsStructuredParams || !value.params || !(null == action ? void 0 : action.paramSchema)) return value.prompt || '';\n const paramsList = this.buildParamsDisplayList(value.params, action);\n return paramsList.join('\\n') || value.prompt || '';\n }\n formatBasicErrorMessage(error) {\n return (null == error ? void 0 : error.message) || 'Unknown error';\n }\n getSchemaKeys(action) {\n if (!(null == action ? void 0 : action.paramSchema) || !('shape' in action.paramSchema)) return [];\n const schema = action.paramSchema;\n return schema && 'shape' in schema ? Object.keys(schema.shape) : [];\n }\n filterValidParams(params, excludeKeys = []) {\n const filtered = {};\n Object.keys(params).forEach((key)=>{\n if (!excludeKeys.includes(key) && void 0 !== params[key] && null !== params[key] && '' !== params[key]) filtered[key] = params[key];\n });\n return filtered;\n }\n actionNeedsStructuredParams(action) {\n if ('object' == typeof action.paramSchema && 'shape' in action.paramSchema) {\n const shape = action.paramSchema.shape || {};\n return Object.keys(shape).length > 0;\n }\n return true;\n }\n prepareParamsForValidation(params, action) {\n const paramsForValidation = {\n ...params\n };\n if (action.paramSchema) {\n const locatorFieldKeys = findAllMidsceneLocatorField(action.paramSchema);\n locatorFieldKeys.forEach((key)=>{\n if ('string' == typeof paramsForValidation[key]) paramsForValidation[key] = {\n midscene_location_field_flag: true,\n prompt: paramsForValidation[key],\n center: [\n 0,\n 0\n ],\n rect: {\n left: 0,\n top: 0,\n width: 0,\n height: 0\n }\n };\n });\n }\n return paramsForValidation;\n }\n handleValidationError(error) {\n const zodError = error;\n if (zodError.errors && zodError.errors.length > 0) {\n const errorMessages = zodError.errors.filter((err)=>{\n const path = err.path.join('.');\n return !path.includes('center') && !path.includes('rect') && !path.includes('midscene_location_field_flag');\n }).map((err)=>{\n const field = err.path.join('.');\n return `${field}: ${err.message}`;\n });\n if (errorMessages.length > 0) return {\n valid: false,\n errorMessage: `Validation error: ${errorMessages.join(', ')}`\n };\n }\n const errorMsg = error instanceof Error ? error.message : 'Unknown validation error';\n return {\n valid: false,\n errorMessage: `Parameter validation failed: ${errorMsg}`\n };\n }\n buildParamsDisplayList(params, action) {\n const paramsList = [];\n const schema = action.paramSchema;\n if (!(schema && 'shape' in schema)) return paramsList;\n const locatorFieldKeys = findAllMidsceneLocatorField(schema);\n const shapeKeys = Object.keys(schema.shape);\n shapeKeys.forEach((key)=>{\n const paramValue = params[key];\n if (this.isValidParamValue(paramValue)) {\n const displayKey = this.capitalizeFirstLetter(key);\n const formattedValue = this.formatParamValue(key, paramValue, locatorFieldKeys.includes(key));\n paramsList.push(`${displayKey}: ${formattedValue}`);\n }\n });\n return paramsList;\n }\n isValidParamValue(value) {\n return null != value && '' !== value;\n }\n capitalizeFirstLetter(str) {\n return str.charAt(0).toUpperCase() + str.slice(1);\n }\n formatParamValue(key, value, isLocateField) {\n if (isLocateField || 'string' == typeof value) return `\"${value}\"`;\n if ('number' == typeof value) return 'distance' === key ? `${value}px` : `${value}`;\n return `${value}`;\n }\n}\nexport { BasePlaygroundAdapter };\n\n//# sourceMappingURL=base.mjs.map","import { overrideAIConfig } from \"@midscene/shared/env\";\nimport { uuid } from \"@midscene/shared/utils\";\nimport { executeAction, parseStructuredParams } from \"../common.mjs\";\nimport { BasePlaygroundAdapter } from \"./base.mjs\";\nfunction _define_property(obj, key, value) {\n if (key in obj) Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n else obj[key] = value;\n return obj;\n}\nclass LocalExecutionAdapter extends BasePlaygroundAdapter {\n get id() {\n return this._id;\n }\n setProgressCallback(callback) {\n this.progressCallback = void 0;\n this.progressCallback = callback;\n }\n cleanup(requestId) {\n delete this.taskProgressTips[requestId];\n }\n async parseStructuredParams(action, params, options) {\n return await parseStructuredParams(action, params, options);\n }\n formatErrorMessage(error) {\n const errorMessage = (null == error ? void 0 : error.message) || '';\n if (errorMessage.includes('of different extension')) return 'Conflicting extension detected. Please disable the suspicious plugins and refresh the page. Guide: https://midscenejs.com/quick-experience.html#faq';\n return this.formatBasicErrorMessage(error);\n }\n async getActionSpace(context) {\n var _this_agent;\n if (null == (_this_agent = this.agent) ? void 0 : _this_agent.getActionSpace) return await this.agent.getActionSpace();\n if (this.agent && 'interface' in this.agent && 'object' == typeof this.agent.interface) {\n const page = this.agent.interface;\n if (null == page ? void 0 : page.actionSpace) return await page.actionSpace();\n }\n if (context && 'object' == typeof context && 'actionSpace' in context) {\n const contextPage = context;\n return await contextPage.actionSpace();\n }\n return [];\n }\n async checkStatus() {\n return true;\n }\n async overrideConfig(aiConfig) {\n overrideAIConfig(aiConfig);\n }\n async executeAction(actionType, value, options) {\n const actionSpace = await this.getActionSpace();\n let originalOnTaskStartTip;\n if (options.requestId && this.agent) {\n this.currentRequestId = options.requestId;\n originalOnTaskStartTip = this.agent.onTaskStartTip;\n this.agent.onTaskStartTip = (tip)=>{\n if (this.currentRequestId !== options.requestId) return;\n this.taskProgressTips[options.requestId] = tip;\n if (this.progressCallback) this.progressCallback(tip);\n if ('function' == typeof originalOnTaskStartTip) originalOnTaskStartTip(tip);\n };\n }\n try {\n const result = await executeAction(this.agent, actionType, actionSpace, value, options);\n const response = {\n result,\n dump: null,\n reportHTML: null,\n error: null\n };\n try {\n if (this.agent.dumpDataString) {\n const dumpString = this.agent.dumpDataString();\n if (dumpString) response.dump = JSON.parse(dumpString);\n }\n if (this.agent.reportHTMLString) response.reportHTML = this.agent.reportHTMLString() || null;\n if (this.agent.writeOutActionDumps) this.agent.writeOutActionDumps();\n } catch (error) {\n console.error('Failed to get dump/reportHTML from agent:', error);\n }\n this.agent.resetDump();\n return response;\n } finally{\n if (options.requestId) {\n this.cleanup(options.requestId);\n if (this.agent) this.agent.onTaskStartTip = originalOnTaskStartTip;\n }\n }\n }\n async getTaskProgress(requestId) {\n return {\n tip: this.taskProgressTips[requestId] || void 0\n };\n }\n async cancelTask(_requestId) {\n if (!this.agent) return {\n error: 'No active agent found for this requestId'\n };\n try {\n var _this_agent_destroy, _this_agent;\n await (null == (_this_agent_destroy = (_this_agent = this.agent).destroy) ? void 0 : _this_agent_destroy.call(_this_agent));\n return {\n success: true\n };\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n console.error(`Failed to cancel agent: ${errorMessage}`);\n return {\n error: `Failed to cancel: ${errorMessage}`\n };\n }\n }\n async getInterfaceInfo() {\n var _this_agent;\n if (!(null == (_this_agent = this.agent) ? void 0 : _this_agent.interface)) return null;\n try {\n var _this_agent_interface_describe, _this_agent_interface;\n const type = this.agent.interface.interfaceType || 'Unknown';\n const description = (null == (_this_agent_interface_describe = (_this_agent_interface = this.agent.interface).describe) ? void 0 : _this_agent_interface_describe.call(_this_agent_interface)) || void 0;\n return {\n type,\n description\n };\n } catch (error) {\n console.error('Failed to get interface info:', error);\n return null;\n }\n }\n constructor(agent){\n super(), _define_property(this, \"agent\", void 0), _define_property(this, \"taskProgressTips\", {}), _define_property(this, \"progressCallback\", void 0), _define_property(this, \"_id\", void 0), _define_property(this, \"currentRequestId\", void 0);\n this.agent = agent;\n this._id = uuid();\n }\n}\nexport { LocalExecutionAdapter };\n\n//# sourceMappingURL=local-execution.mjs.map","import { parseStructuredParams } from \"../common.mjs\";\nimport { BasePlaygroundAdapter } from \"./base.mjs\";\nfunction _define_property(obj, key, value) {\n if (key in obj) Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n else obj[key] = value;\n return obj;\n}\nclass RemoteExecutionAdapter extends BasePlaygroundAdapter {\n get id() {\n return this._id;\n }\n validateParams(value, action) {\n if (!(null == action ? void 0 : action.paramSchema)) return {\n valid: true\n };\n const needsStructuredParams = this.actionNeedsStructuredParams(action);\n if (!needsStructuredParams) return {\n valid: true\n };\n if (!value.params) return {\n valid: false,\n errorMessage: 'Parameters are required'\n };\n if (action.paramSchema && 'object' == typeof action.paramSchema) {\n const schema = action.paramSchema;\n if (schema.shape || 'ZodObject' === schema.type) {\n const shape = schema.shape || {};\n const missingFields = Object.keys(shape).filter((key)=>{\n var _fieldDef__def, _fieldDef__def1;\n const fieldDef = shape[key];\n const isOptional = (null == fieldDef ? void 0 : fieldDef.isOptional) || (null == fieldDef ? void 0 : null == (_fieldDef__def = fieldDef._def) ? void 0 : _fieldDef__def.innerType) || (null == fieldDef ? void 0 : null == (_fieldDef__def1 = fieldDef._def) ? void 0 : _fieldDef__def1.typeName) === 'ZodOptional';\n return !isOptional && (void 0 === value.params[key] || '' === value.params[key]);\n });\n if (missingFields.length > 0) return {\n valid: false,\n errorMessage: `Missing required parameters: ${missingFields.join(', ')}`\n };\n }\n }\n return {\n valid: true\n };\n }\n async parseStructuredParams(action, params, options) {\n return await parseStructuredParams(action, params, options);\n }\n formatErrorMessage(error) {\n const message = (null == error ? void 0 : error.message) || '';\n const androidErrors = [\n {\n keyword: 'adb',\n message: 'ADB connection error. Please ensure device is connected and USB debugging is enabled.'\n },\n {\n keyword: 'UIAutomator',\n message: 'UIAutomator error. Please ensure the UIAutomator server is running on the device.'\n }\n ];\n const androidError = androidErrors.find(({ keyword })=>message.includes(keyword));\n if (androidError) return androidError.message;\n return this.formatBasicErrorMessage(error);\n }\n async executeAction(actionType, value, options) {\n if (this.serverUrl && 'undefined' != typeof window) return this.executeViaServer(actionType, value, options);\n throw new Error('Remote execution adapter requires server URL for execution');\n }\n async executeViaServer(actionType, value, options) {\n const payload = {\n type: actionType,\n prompt: value.prompt,\n ...this.buildOptionalPayloadParams(options, value)\n };\n if (options.context) payload.context = options.context;\n if (options.requestId && this.progressCallback) this.startProgressPolling(options.requestId, this.progressCallback);\n try {\n const response = await fetch(`${this.serverUrl}/execute`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify(payload)\n });\n if (!response.ok) {\n const errorText = await response.text().catch(()=>'Unknown error');\n throw new Error(`Server request failed (${response.status}): ${errorText}`);\n }\n const result = await response.json();\n if (options.requestId) this.stopProgressPolling(options.requestId);\n return result;\n } catch (error) {\n if (options.requestId) this.stopProgressPolling(options.requestId);\n console.error('Execute via server failed:', error);\n throw error;\n }\n }\n buildOptionalPayloadParams(options, value) {\n const optionalParams = {};\n const optionalFields = [\n {\n key: 'requestId',\n value: options.requestId\n },\n {\n key: 'deepThink',\n value: options.deepThink\n },\n {\n key: 'screenshotIncluded',\n value: options.screenshotIncluded\n },\n {\n key: 'domIncluded',\n value: options.domIncluded\n },\n {\n key: 'params',\n value: value.params\n }\n ];\n optionalFields.forEach(({ key, value })=>{\n if (null != value && '' !== value) optionalParams[key] = value;\n });\n return optionalParams;\n }\n async getActionSpace(context) {\n if (this.serverUrl && 'undefined' != typeof window) try {\n const response = await fetch(`${this.serverUrl}/action-space`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n context\n })\n });\n if (!response.ok) throw new Error(`Failed to get action space: ${response.statusText}`);\n const result = await response.json();\n return Array.isArray(result) ? result : [];\n } catch (error) {\n console.error('Failed to get action space from server:', error);\n }\n if (context && 'object' == typeof context && 'actionSpace' in context) try {\n const actionSpaceMethod = context.actionSpace;\n const result = await actionSpaceMethod();\n return Array.isArray(result) ? result : [];\n } catch (error) {\n console.error('Failed to get action space from context:', error);\n }\n return [];\n }\n async checkStatus() {\n if (!this.serverUrl) return false;\n try {\n const res = await fetch(`${this.serverUrl}/status`);\n if (200 === res.status) {\n try {\n const data = await res.json();\n if (data.id && 'string' == typeof data.id) this._id = data.id;\n } catch (jsonError) {\n console.debug('Failed to parse status response:', jsonError);\n }\n return true;\n }\n return false;\n } catch (error) {\n console.warn('Server status check failed:', error);\n return false;\n }\n }\n async overrideConfig(aiConfig) {\n if (!this.serverUrl) throw new Error('Server URL not configured');\n try {\n const response = await fetch(`${this.serverUrl}/config`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: JSON.stringify({\n aiConfig\n })\n });\n if (!response.ok) throw new Error(`Failed to override server config: ${response.statusText}`);\n } catch (error) {\n console.error('Failed to override server config:', error);\n throw error;\n }\n }\n async getTaskProgress(requestId) {\n if (!this.serverUrl) return {\n tip: void 0\n };\n if (!(null == requestId ? void 0 : requestId.trim())) {\n console.warn('Invalid requestId provided for task progress');\n return {\n tip: void 0\n };\n }\n try {\n const response = await fetch(`${this.serverUrl}/task-progress/${encodeURIComponent(requestId)}`);\n if (!response.ok) {\n console.warn(`Task progress request failed: ${response.statusText}`);\n return {\n tip: void 0\n };\n }\n return await response.json();\n } catch (error) {\n console.error('Failed to poll task progress:', error);\n return {\n tip: void 0\n };\n }\n }\n async cancelTask(requestId) {\n this.stopProgressPolling(requestId);\n if (!this.serverUrl) return {\n error: 'No server URL configured'\n };\n if (!(null == requestId ? void 0 : requestId.trim())) return {\n error: 'Invalid request ID'\n };\n try {\n const res = await fetch(`${this.serverUrl}/cancel/${encodeURIComponent(requestId)}`, {\n method: 'POST'\n });\n if (!res.ok) return {\n error: `Cancel request failed: ${res.statusText}`\n };\n const result = await res.json();\n return {\n success: true,\n ...result\n };\n } catch (error) {\n console.error('Failed to cancel task:', error);\n return {\n error: 'Failed to cancel task'\n };\n }\n }\n setProgressCallback(callback) {\n this.progressCallback = callback;\n }\n startProgressPolling(requestId, callback) {\n if (this.progressPolling.has(requestId)) return;\n let lastTip = '';\n const interval = setInterval(async ()=>{\n try {\n var _progress_tip_trim, _progress_tip;\n const progress = await this.getTaskProgress(requestId);\n if ((null == progress ? void 0 : null == (_progress_tip = progress.tip) ? void 0 : null == (_progress_tip_trim = _progress_tip.trim) ? void 0 : _progress_tip_trim.call(_progress_tip)) && progress.tip !== lastTip) {\n lastTip = progress.tip;\n callback(progress.tip);\n }\n } catch (error) {\n console.debug('Progress polling error:', error);\n }\n }, 500);\n this.progressPolling.set(requestId, interval);\n }\n stopProgressPolling(requestId) {\n const interval = this.progressPolling.get(requestId);\n if (interval) {\n clearInterval(interval);\n this.progressPolling.delete(requestId);\n }\n }\n async getScreenshot() {\n if (!this.serverUrl) return null;\n try {\n const response = await fetch(`${this.serverUrl}/screenshot`);\n if (!response.ok) {\n console.warn(`Screenshot request failed: ${response.statusText}`);\n return null;\n }\n return await response.json();\n } catch (error) {\n console.error('Failed to get screenshot:', error);\n return null;\n }\n }\n async getInterfaceInfo() {\n if (!this.serverUrl) return null;\n try {\n const response = await fetch(`${this.serverUrl}/interface-info`);\n if (!response.ok) {\n console.warn(`Interface info request failed: ${response.statusText}`);\n return null;\n }\n return await response.json();\n } catch (error) {\n console.error('Failed to get interface info:', error);\n return null;\n }\n }\n constructor(serverUrl){\n super(), _define_property(this, \"serverUrl\", void 0), _define_property(this, \"progressPolling\", new Map()), _define_property(this, \"progressCallback\", void 0), _define_property(this, \"_id\", void 0);\n this.serverUrl = serverUrl;\n }\n}\nexport { RemoteExecutionAdapter };\n\n//# sourceMappingURL=remote-execution.mjs.map","import { PLAYGROUND_SERVER_PORT } from \"@midscene/shared/constants\";\nimport { LocalExecutionAdapter } from \"../adapters/local-execution.mjs\";\nimport { RemoteExecutionAdapter } from \"../adapters/remote-execution.mjs\";\nfunction _define_property(obj, key, value) {\n if (key in obj) Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n else obj[key] = value;\n return obj;\n}\nclass PlaygroundSDK {\n createAdapter(type, serverUrl, agent) {\n switch(type){\n case 'local-execution':\n if (!agent) throw new Error('Agent is required for local execution');\n return new LocalExecutionAdapter(agent);\n case 'remote-execution':\n {\n const finalServerUrl = serverUrl || ('undefined' != typeof window && window.location.protocol.includes('http') ? window.location.origin : `http://localhost:${PLAYGROUND_SERVER_PORT}`);\n return new RemoteExecutionAdapter(finalServerUrl);\n }\n default:\n throw new Error(`Unsupported execution type: ${type}`);\n }\n }\n async executeAction(actionType, value, options) {\n const result = await this.adapter.executeAction(actionType, value, options);\n if (options.requestId) this.stopProgressPolling(options.requestId);\n return result;\n }\n async getActionSpace(context) {\n return this.adapter.getActionSpace(context);\n }\n validateStructuredParams(value, action) {\n return this.adapter.validateParams(value, action);\n }\n formatErrorMessage(error) {\n return this.adapter.formatErrorMessage(error);\n }\n createDisplayContent(value, needsStructuredParams, action) {\n return this.adapter.createDisplayContent(value, needsStructuredParams, action);\n }\n get id() {\n if (this.adapter instanceof RemoteExecutionAdapter) return this.adapter.id;\n if (this.adapter instanceof LocalExecutionAdapter) return this.adapter.id;\n }\n async checkStatus() {\n if (this.adapter instanceof RemoteExecutionAdapter) return this.adapter.checkStatus();\n return true;\n }\n async overrideConfig(aiConfig) {\n if (this.adapter instanceof RemoteExecutionAdapter) return this.adapter.overrideConfig(aiConfig);\n }\n async getTaskProgress(requestId) {\n if (this.adapter instanceof RemoteExecutionAdapter) return this.adapter.getTaskProgress(requestId);\n if (this.adapter instanceof LocalExecutionAdapter) return this.adapter.getTaskProgress(requestId);\n return {\n tip: void 0\n };\n }\n async cancelTask(requestId) {\n this.stopProgressPolling(requestId);\n if (this.adapter instanceof RemoteExecutionAdapter) return this.adapter.cancelTask(requestId);\n return {\n error: 'Cancel task not supported in local execution mode'\n };\n }\n onProgressUpdate(callback) {\n if (this.adapter instanceof RemoteExecutionAdapter) this.adapter.setProgressCallback(callback);\n else if (this.adapter instanceof LocalExecutionAdapter) this.adapter.setProgressCallback(callback);\n }\n startProgressPolling(requestId) {\n console.warn('startProgressPolling is deprecated - polling is now automatic');\n }\n stopProgressPolling(requestId) {\n console.warn('stopProgressPolling is deprecated - polling cleanup is now automatic');\n }\n async cancelExecution(requestId) {\n this.stopProgressPolling(requestId);\n if (this.adapter instanceof RemoteExecutionAdapter) await this.adapter.cancelTask(requestId);\n else if (this.adapter instanceof LocalExecutionAdapter) console.warn('Local execution cancellation not fully implemented');\n }\n async getScreenshot() {\n if (this.adapter instanceof RemoteExecutionAdapter) return this.adapter.getScreenshot();\n return null;\n }\n async getInterfaceInfo() {\n if (this.adapter instanceof LocalExecutionAdapter) return this.adapter.getInterfaceInfo();\n if (this.adapter instanceof RemoteExecutionAdapter) return this.adapter.getInterfaceInfo();\n return null;\n }\n constructor(config){\n _define_property(this, \"adapter\", void 0);\n this.adapter = this.createAdapter(config.type, config.serverUrl, config.agent);\n }\n}\nexport { PlaygroundSDK };\n\n//# sourceMappingURL=index.mjs.map","import { PlaygroundSDK } from \"@midscene/playground\";\nimport { useEffect, useState } from \"react\";\nimport { useEnvConfig } from \"../store/store.mjs\";\nconst useServerValid = function() {\n let shouldRun = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : true;\n const [serverValid, setServerValid] = useState(true);\n const { serviceMode } = useEnvConfig();\n useEffect(()=>{\n let interruptFlag = false;\n if (!shouldRun) return;\n Promise.resolve((async ()=>{\n while(!interruptFlag){\n const playgroundSDK = new PlaygroundSDK({\n type: 'remote-execution'\n });\n const status = await playgroundSDK.checkStatus();\n status ? setServerValid(true) : setServerValid(false);\n await new Promise((resolve)=>setTimeout(resolve, 1000));\n }\n })());\n return ()=>{\n interruptFlag = true;\n };\n }, [\n serviceMode,\n shouldRun\n ]);\n return serverValid;\n};\nexport { useServerValid };\n","import './index.less';\nimport { MobileOutlined } from '@ant-design/icons';\nimport { useServerValid } from '@midscene/visualizer';\nimport { message } from 'antd';\nimport { useCallback } from 'react';\nimport type { RefObject } from 'react';\nimport type { ScrcpyRefMethods } from '../scrcpy-player';\n\n// status dot indicator\nconst onlineStatus = (color: string) => (\n <span\n className=\"status-dot\"\n style={{\n color: color,\n }}\n >\n ●\n </span>\n);\n\nexport interface Device {\n id: string;\n name: string;\n status: string;\n}\n\nexport interface AdbDeviceProps {\n selectedDeviceId: string | null;\n scrcpyPlayerRef: RefObject<ScrcpyRefMethods>;\n}\n\nconst AdbDevice: React.FC<AdbDeviceProps> = ({\n selectedDeviceId,\n scrcpyPlayerRef,\n}) => {\n const [messageApi, contextHolder] = message.useMessage();\n const serverValid = useServerValid(true);\n\n // disconnect device\n const disconnectDevice = useCallback(() => {\n // call ScrcpyPlayer's disconnectDevice method\n if (scrcpyPlayerRef.current) {\n scrcpyPlayerRef.current.disconnectDevice();\n messageApi.info('Device disconnected');\n }\n }, [scrcpyPlayerRef, messageApi]);\n\n return (\n <div className=\"device-header\">\n {contextHolder}\n <div className=\"device-title-container\">\n <h2 className=\"device-title\">Device</h2>\n <div className=\"device-info-display\">\n <div className=\"device-icon-container\">\n <MobileOutlined className=\"device-icon\" />\n {selectedDeviceId && serverValid && (\n <div className=\"status-indicator\">{onlineStatus('#52c41a')}</div>\n )}\n </div>\n {selectedDeviceId ? (\n <span className=\"device-name\">{selectedDeviceId}</span>\n ) : (\n <span className=\"device-name no-device\">No device selected</span>\n )}\n </div>\n </div>\n </div>\n );\n};\n\nexport default AdbDevice;\n","import { jsx } from \"react/jsx-runtime\";\nimport \"./index.css\";\nconst LogoUrl = 'https://lf3-static.bytednsdoc.com/obj/eden-cn/vhaeh7vhabf/Midscene.png';\nconst Logo = (param)=>{\n let { hideLogo = false } = param;\n if (hideLogo) return null;\n return /*#__PURE__*/ jsx(\"div\", {\n className: \"logo\",\n children: /*#__PURE__*/ jsx(\"a\", {\n href: \"https://midscenejs.com/\",\n target: \"_blank\",\n rel: \"noreferrer\",\n children: /*#__PURE__*/ jsx(\"img\", {\n alt: \"Midscene_logo\",\n src: \"https://lf3-static.bytednsdoc.com/obj/eden-cn/vhaeh7vhabf/Midscene.png\"\n })\n })\n });\n};\nexport { Logo, LogoUrl };\n","import { jsx, jsxs } from \"react/jsx-runtime\";\nimport { SettingOutlined } from \"@ant-design/icons\";\nimport { Input, Modal, Tooltip } from \"antd\";\nimport { useEffect, useRef, useState } from \"react\";\nimport { useEnvConfig } from \"../../store/store.mjs\";\nfunction EnvConfig(param) {\n let { showTooltipWhenEmpty = true, showModelName = true, tooltipPlacement = 'bottom', mode = 'icon' } = param;\n const { config, configString, loadConfig, syncFromStorage } = useEnvConfig();\n const [isModalOpen, setIsModalOpen] = useState(false);\n const [tempConfigString, setTempConfigString] = useState(configString);\n const midsceneModelName = config.MIDSCENE_MODEL_NAME;\n const componentRef = useRef(null);\n const showModal = (e)=>{\n syncFromStorage();\n setIsModalOpen(true);\n e.preventDefault();\n e.stopPropagation();\n };\n const handleOk = ()=>{\n setIsModalOpen(false);\n loadConfig(tempConfigString);\n };\n const handleCancel = ()=>{\n setIsModalOpen(false);\n };\n useEffect(()=>{\n if (isModalOpen) setTempConfigString(configString);\n }, [\n isModalOpen,\n configString\n ]);\n return /*#__PURE__*/ jsxs(\"div\", {\n style: {\n display: 'flex',\n justifyContent: 'flex-end',\n gap: '10px',\n alignItems: 'center',\n height: '100%',\n minHeight: '32px'\n },\n ref: componentRef,\n children: [\n showModelName ? midsceneModelName : null,\n /*#__PURE__*/ jsx(Tooltip, {\n title: \"Please set up your environment variables before using.\",\n placement: tooltipPlacement,\n align: {\n offset: [\n -10,\n 5\n ]\n },\n getPopupContainer: ()=>componentRef.current,\n open: isModalOpen ? false : showTooltipWhenEmpty ? 0 === Object.keys(config).length : void 0,\n children: 'icon' === mode ? /*#__PURE__*/ jsx(SettingOutlined, {\n onClick: showModal\n }) : /*#__PURE__*/ jsx(\"span\", {\n onClick: showModal,\n style: {\n color: '#006AFF',\n cursor: 'pointer'\n },\n children: \"set up\"\n })\n }),\n /*#__PURE__*/ jsxs(Modal, {\n title: \"Model Env Config\",\n open: isModalOpen,\n onOk: handleOk,\n onCancel: handleCancel,\n okText: \"Save\",\n style: {\n width: '800px',\n height: '100%',\n marginTop: '10%'\n },\n destroyOnClose: true,\n maskClosable: true,\n centered: true,\n children: [\n /*#__PURE__*/ jsx(Input.TextArea, {\n rows: 7,\n placeholder: 'OPENAI_API_KEY=sk-...\\nMIDSCENE_MODEL_NAME=gpt-4o-2024-08-06\\n...',\n value: tempConfigString,\n onChange: (e)=>setTempConfigString(e.target.value),\n style: {\n whiteSpace: 'nowrap',\n wordWrap: 'break-word'\n }\n }),\n /*#__PURE__*/ jsxs(\"div\", {\n children: [\n /*#__PURE__*/ jsx(\"p\", {\n children: \"The format is KEY=VALUE and separated by new lines.\"\n }),\n /*#__PURE__*/ jsxs(\"p\", {\n children: [\n \"These data will be saved \",\n /*#__PURE__*/ jsx(\"strong\", {\n children: \"locally in your browser\"\n }),\n \".\"\n ]\n })\n ]\n })\n ]\n })\n ]\n });\n}\nexport { EnvConfig };\n","import { jsx, jsxs } from \"react/jsx-runtime\";\nimport { GithubOutlined, QuestionCircleOutlined } from \"@ant-design/icons\";\nimport { Typography } from \"antd\";\nimport { EnvConfig } from \"../env-config/index.mjs\";\nimport \"./style.css\";\nfunction NavActions(param) {\n let { showEnvConfig = true, showTooltipWhenEmpty = false, showModelName = false, githubUrl = 'https://github.com/web-infra-dev/midscene', helpUrl = 'https://midscenejs.com/quick-experience.html', className = '' } = param;\n return /*#__PURE__*/ jsxs(\"div\", {\n className: `nav-actions ${className}`,\n children: [\n /*#__PURE__*/ jsx(Typography.Link, {\n href: githubUrl,\n target: \"_blank\",\n children: /*#__PURE__*/ jsx(GithubOutlined, {\n className: \"nav-icon\"\n })\n }),\n /*#__PURE__*/ jsx(Typography.Link, {\n href: helpUrl,\n target: \"_blank\",\n children: /*#__PURE__*/ jsx(QuestionCircleOutlined, {\n className: \"nav-icon\"\n })\n }),\n showEnvConfig && /*#__PURE__*/ jsx(EnvConfig, {\n showTooltipWhenEmpty: showTooltipWhenEmpty,\n showModelName: showModelName\n })\n ]\n });\n}\nexport { NavActions };\n","const trackingTip = 'limit popup to current tab';\nconst deepThinkTip = 'deep think';\nconst screenshotIncludedTip = 'include screenshot in request';\nconst domIncludedTip = 'include DOM info in request';\nconst apiMetadata = {\n aiAct: {\n group: 'interaction',\n title: 'Auto Planning: plan the steps and execute'\n },\n aiTap: {\n group: 'interaction',\n title: 'Click an element'\n },\n aiDoubleClick: {\n group: 'interaction',\n title: 'Double-click an element'\n },\n aiHover: {\n group: 'interaction',\n title: 'Hover over an element'\n },\n aiInput: {\n group: 'interaction',\n title: 'Input text into an element'\n },\n aiRightClick: {\n group: 'interaction',\n title: 'Right-click an element'\n },\n aiKeyboardPress: {\n group: 'interaction',\n title: 'Press keyboard keys'\n },\n aiScroll: {\n group: 'interaction',\n title: 'Scroll the page or element'\n },\n aiLocate: {\n group: 'interaction',\n title: 'Locate an element on the page'\n },\n aiQuery: {\n group: 'extraction',\n title: 'Extract data directly from the UI'\n },\n aiBoolean: {\n group: 'extraction',\n title: 'Get true/false answer'\n },\n aiNumber: {\n group: 'extraction',\n title: 'Extract numeric value'\n },\n aiString: {\n group: 'extraction',\n title: 'Extract text value'\n },\n aiAsk: {\n group: 'extraction',\n title: 'Ask a question about the UI'\n },\n aiAssert: {\n group: 'validation',\n title: 'Assert a condition is true'\n },\n aiWaitFor: {\n group: 'validation',\n title: 'Wait for a condition to be met'\n }\n};\nconst defaultMainButtons = [\n 'aiAct',\n 'aiTap',\n 'aiQuery',\n 'aiAssert'\n];\nconst WELCOME_MESSAGE_TEMPLATE = {\n type: 'system',\n content: `\n Welcome to Midscene.js Playground!\n \n This is a panel for experimenting and testing Midscene.js features. You can use natural language instructions to operate the web page, such as clicking buttons, filling in forms, querying information, etc.\n \n Please enter your instructions in the input box below to start experiencing.\n `,\n loading: false,\n result: void 0,\n replayScriptsInfo: null,\n replayCounter: 0,\n loadingProgressText: '',\n verticalMode: false\n};\nconst BLANK_RESULT = {\n result: void 0,\n dump: null,\n reportHTML: null,\n error: null\n};\nexport { BLANK_RESULT, WELCOME_MESSAGE_TEMPLATE, apiMetadata, deepThinkTip, defaultMainButtons, domIncludedTip, screenshotIncludedTip, trackingTip };\n","import dayjs from \"dayjs\";\nfunction timeStr(timestamp) {\n return timestamp ? dayjs(timestamp).format('YYYY-MM-DD HH:mm:ss') : '-';\n}\nfunction filterBase64Value(input) {\n return input.replace(/data:image\\/[^\"]+\"/g, 'data:image...\"');\n}\nconst mousePointer = 'data:image/png;base64,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';\nconst mouseLoading = 'data:image/png;base64,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';\nexport { filterBase64Value, mouseLoading, mousePointer, timeStr };\n","function typeStr(task) {\n return task.subType && 'Plan' !== task.subType ? `${task.type} / ${task.subType || ''}` : task.type;\n}\nfunction locateParamStr(locate) {\n if (!locate) return '';\n if ('string' == typeof locate) return locate;\n if ('object' == typeof locate) {\n if ('string' == typeof locate.prompt) return locate.prompt;\n if ('object' == typeof locate.prompt && locate.prompt.prompt) {\n const prompt = locate.prompt.prompt;\n const images = locate.prompt.images || [];\n if (0 === images.length) return prompt;\n const imagesStr = images.map((image)=>{\n let url = image.url;\n if (url.startsWith('data:image/') || url.startsWith('data:') && url.includes('base64')) url = `${url.substring(0, 15)}...`;\n return `[${image.name}](${url})`;\n }).join(', ');\n return `${prompt}, ${imagesStr}`;\n }\n }\n return '';\n}\nfunction scrollParamStr(scrollParam) {\n if (!scrollParam) return '';\n return `${scrollParam.direction || 'down'}, ${scrollParam.scrollType || 'once'}, ${scrollParam.distance || 'distance-not-set'}`;\n}\nfunction pullParamStr(pullParam) {\n if (!pullParam) return '';\n const parts = [];\n parts.push(`direction: ${pullParam.direction || 'down'}`);\n if (pullParam.distance) parts.push(`distance: ${pullParam.distance}`);\n if (pullParam.duration) parts.push(`duration: ${pullParam.duration}ms`);\n return parts.join(', ');\n}\nfunction taskTitleStr(type, prompt) {\n if (prompt) return `${type} - ${prompt}`;\n return type;\n}\nfunction paramStr(task) {\n let value;\n if ('Planning' === task.type) {\n var _task_param;\n value = null == task ? void 0 : null == (_task_param = task.param) ? void 0 : _task_param.userInstruction;\n }\n if ('Insight' === task.type) {\n var _task_param1, _task_param2, _task_param3;\n value = locateParamStr(null == task ? void 0 : task.param) || (null == task ? void 0 : null == (_task_param1 = task.param) ? void 0 : _task_param1.id) || (null == task ? void 0 : null == (_task_param2 = task.param) ? void 0 : _task_param2.dataDemand) || (null == task ? void 0 : null == (_task_param3 = task.param) ? void 0 : _task_param3.assertion);\n }\n if ('Action' === task.type) {\n var _task_param4, _task_param5, _task_param6, _task_param7;\n const locate = null == task ? void 0 : task.locate;\n const locateStr = locate ? locateParamStr(locate) : '';\n value = task.thought || '';\n if ('number' == typeof (null == task ? void 0 : null == (_task_param4 = task.param) ? void 0 : _task_param4.timeMs)) {\n var _task_param8;\n value = `${null == task ? void 0 : null == (_task_param8 = task.param) ? void 0 : _task_param8.timeMs}ms`;\n } else if ('string' == typeof (null == task ? void 0 : null == (_task_param5 = task.param) ? void 0 : _task_param5.scrollType)) value = scrollParamStr(null == task ? void 0 : task.param);\n else if ('string' == typeof (null == task ? void 0 : null == (_task_param6 = task.param) ? void 0 : _task_param6.direction) && (null == task ? void 0 : task.subType) === 'AndroidPull') value = pullParamStr(null == task ? void 0 : task.param);\n else if (void 0 !== (null == task ? void 0 : null == (_task_param7 = task.param) ? void 0 : _task_param7.value)) {\n var _task_param9;\n value = null == task ? void 0 : null == (_task_param9 = task.param) ? void 0 : _task_param9.value;\n }\n if (locateStr) value = value ? `${locateStr} - ${value}` : locateStr;\n }\n if (void 0 === value) return '';\n if ('string' == typeof value) return value;\n if ('object' == typeof value && locateParamStr(value)) return locateParamStr(value);\n return JSON.stringify(value, void 0, 2);\n}\nexport { locateParamStr, paramStr, pullParamStr, scrollParamStr, taskTitleStr, typeStr };\n\n//# sourceMappingURL=ui-utils.mjs.map","import { AIActionType, expandSearchArea } from \"../ai-model/common.mjs\";\nimport { AiExtractElementInfo, AiLocateElement, callAIWithObjectResponse } from \"../ai-model/index.mjs\";\nimport { AiLocateSection } from \"../ai-model/inspect.mjs\";\nimport { elementDescriberInstruction } from \"../ai-model/prompt/describe.mjs\";\nimport { InsightError } from \"../types.mjs\";\nimport { MIDSCENE_FORCE_DEEP_THINK, globalConfigManager } from \"@midscene/shared/env\";\nimport { compositeElementInfoImg, cropByRect } from \"@midscene/shared/img\";\nimport { getDebug } from \"@midscene/shared/logger\";\nimport { assert } from \"@midscene/shared/utils\";\nimport { createInsightDump } from \"./utils.mjs\";\nfunction _define_property(obj, key, value) {\n if (key in obj) Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n else obj[key] = value;\n return obj;\n}\nconst debug = getDebug('ai:insight');\nclass Insight {\n async locate(query, opt, modelConfig) {\n var _parseResult_errors;\n const queryPrompt = 'string' == typeof query ? query : query.prompt;\n assert(queryPrompt, 'query is required for locate');\n assert('object' == typeof query, 'query should be an object for locate');\n const globalDeepThinkSwitch = globalConfigManager.getEnvConfigInBoolean(MIDSCENE_FORCE_DEEP_THINK);\n if (globalDeepThinkSwitch) debug('globalDeepThinkSwitch', globalDeepThinkSwitch);\n let searchAreaPrompt;\n if (query.deepThink || globalDeepThinkSwitch) searchAreaPrompt = query.prompt;\n const { vlMode } = modelConfig;\n if (searchAreaPrompt && !vlMode) {\n console.warn('The \"deepThink\" feature is not supported with multimodal LLM. Please config VL model for Midscene. https://midscenejs.com/choose-a-model');\n searchAreaPrompt = void 0;\n }\n const context = (null == opt ? void 0 : opt.context) || await this.contextRetrieverFn();\n let searchArea;\n let searchAreaRawResponse;\n let searchAreaUsage;\n let searchAreaResponse;\n if (searchAreaPrompt) {\n searchAreaResponse = await AiLocateSection({\n context,\n sectionDescription: searchAreaPrompt,\n modelConfig\n });\n assert(searchAreaResponse.rect, `cannot find search area for \"${searchAreaPrompt}\"${searchAreaResponse.error ? `: ${searchAreaResponse.error}` : ''}`);\n searchAreaRawResponse = searchAreaResponse.rawResponse;\n searchAreaUsage = searchAreaResponse.usage;\n searchArea = searchAreaResponse.rect;\n }\n const startTime = Date.now();\n const { parseResult, rect, elementById, rawResponse, usage, isOrderSensitive } = await AiLocateElement({\n callAIFn: this.aiVendorFn,\n context,\n targetElementDescription: queryPrompt,\n searchConfig: searchAreaResponse,\n modelConfig\n });\n const timeCost = Date.now() - startTime;\n const taskInfo = {\n ...this.taskInfo ? this.taskInfo : {},\n durationMs: timeCost,\n rawResponse: JSON.stringify(rawResponse),\n formatResponse: JSON.stringify(parseResult),\n usage,\n searchArea,\n searchAreaRawResponse,\n searchAreaUsage\n };\n let errorLog;\n if (null == (_parseResult_errors = parseResult.errors) ? void 0 : _parseResult_errors.length) errorLog = `AI model failed to locate: \\n${parseResult.errors.join('\\n')}`;\n const dumpData = {\n type: 'locate',\n userQuery: {\n element: queryPrompt\n },\n matchedElement: [],\n matchedRect: rect,\n data: null,\n taskInfo,\n deepThink: !!searchArea,\n error: errorLog\n };\n const elements = [];\n (parseResult.elements || []).forEach((item)=>{\n if ('id' in item) {\n const element = elementById(null == item ? void 0 : item.id);\n if (!element) return void console.warn(`locate: cannot find element id=${item.id}. Maybe an unstable response from AI model`);\n elements.push(element);\n }\n });\n const dump = createInsightDump({\n ...dumpData,\n matchedElement: elements\n });\n if (errorLog) throw new InsightError(errorLog, dump);\n if (elements.length > 1) throw new InsightError(`locate: multiple elements found, length = ${elements.length}`, dump);\n if (1 === elements.length) return {\n element: {\n id: elements[0].id,\n indexId: elements[0].indexId,\n center: elements[0].center,\n rect: elements[0].rect,\n xpaths: elements[0].xpaths || [],\n attributes: elements[0].attributes,\n isOrderSensitive\n },\n rect,\n dump\n };\n return {\n element: null,\n rect,\n dump\n };\n }\n async extract(dataDemand, modelConfig, opt, multimodalPrompt) {\n var _parseResult_errors;\n assert('object' == typeof dataDemand || 'string' == typeof dataDemand, `dataDemand should be object or string, but get ${typeof dataDemand}`);\n const context = await this.contextRetrieverFn();\n const startTime = Date.now();\n const { parseResult, usage } = await AiExtractElementInfo({\n context,\n dataQuery: dataDemand,\n multimodalPrompt,\n extractOption: opt,\n modelConfig\n });\n const timeCost = Date.now() - startTime;\n const taskInfo = {\n ...this.taskInfo ? this.taskInfo : {},\n durationMs: timeCost,\n rawResponse: JSON.stringify(parseResult)\n };\n let errorLog;\n if (null == (_parseResult_errors = parseResult.errors) ? void 0 : _parseResult_errors.length) errorLog = `AI response error: \\n${parseResult.errors.join('\\n')}`;\n const dumpData = {\n type: 'extract',\n userQuery: {\n dataDemand\n },\n matchedElement: [],\n data: null,\n taskInfo,\n error: errorLog\n };\n const { data, thought } = parseResult || {};\n const dump = createInsightDump({\n ...dumpData,\n data\n });\n if (errorLog && !data && !(null == opt ? void 0 : opt.doNotThrowError)) throw new InsightError(errorLog, dump);\n return {\n data,\n thought,\n usage,\n dump\n };\n }\n async describe(target, modelConfig, opt) {\n assert(target, 'target is required for insight.describe');\n const context = await this.contextRetrieverFn();\n const { screenshotBase64, size } = context;\n assert(screenshotBase64, 'screenshot is required for insight.describe');\n const { vlMode } = modelConfig;\n const systemPrompt = elementDescriberInstruction();\n const defaultRectSize = 30;\n const targetRect = Array.isArray(target) ? {\n left: Math.floor(target[0] - defaultRectSize / 2),\n top: Math.floor(target[1] - defaultRectSize / 2),\n width: defaultRectSize,\n height: defaultRectSize\n } : target;\n let imagePayload = await compositeElementInfoImg({\n inputImgBase64: screenshotBase64,\n size,\n elementsPositionInfo: [\n {\n rect: targetRect\n }\n ],\n borderThickness: 3\n });\n if (null == opt ? void 0 : opt.deepThink) {\n const searchArea = expandSearchArea(targetRect, context.size, vlMode);\n debug('describe: set searchArea', searchArea);\n const croppedResult = await cropByRect(imagePayload, searchArea, 'qwen-vl' === vlMode);\n imagePayload = croppedResult.imageBase64;\n }\n const msgs = [\n {\n role: 'system',\n content: systemPrompt\n },\n {\n role: 'user',\n content: [\n {\n type: 'image_url',\n image_url: {\n url: imagePayload,\n detail: 'high'\n }\n }\n ]\n }\n ];\n const callAIFn = this.aiVendorFn;\n const res = await callAIFn(msgs, AIActionType.DESCRIBE_ELEMENT, modelConfig);\n const { content } = res;\n assert(!content.error, `describe failed: ${content.error}`);\n assert(content.description, 'failed to describe the element');\n return content;\n }\n constructor(context, opt){\n _define_property(this, \"contextRetrieverFn\", void 0);\n _define_property(this, \"aiVendorFn\", callAIWithObjectResponse);\n _define_property(this, \"taskInfo\", void 0);\n assert(context, 'context is required for Insight');\n if ('function' == typeof context) this.contextRetrieverFn = context;\n else this.contextRetrieverFn = ()=>Promise.resolve(context);\n if (void 0 !== (null == opt ? void 0 : opt.aiVendorFn)) this.aiVendorFn = opt.aiVendorFn;\n if (void 0 !== (null == opt ? void 0 : opt.taskInfo)) this.taskInfo = opt.taskInfo;\n }\n}\nexport { Insight as default };\n\n//# sourceMappingURL=index.mjs.map","import { elementByPositionWithElementInfo } from \"../ai-model/index.mjs\";\nimport { uploadTestInfoToServer } from \"../utils.mjs\";\nimport { NodeType } from \"@midscene/shared/constants\";\nimport { MIDSCENE_REPORT_TAG_NAME, globalConfigManager } from \"@midscene/shared/env\";\nimport { generateElementByPosition, getNodeFromCacheList } from \"@midscene/shared/extractor\";\nimport { getDebug } from \"@midscene/shared/logger\";\nimport { assert, logMsg, uuid } from \"@midscene/shared/utils\";\nimport dayjs from \"dayjs\";\nimport { debug } from \"./task-cache.mjs\";\nconst debugProfile = getDebug('web:tool:profile');\nasync function commonContextParser(interfaceInstance, _opt) {\n var _interfaceInstance_describe;\n assert(interfaceInstance, 'interfaceInstance is required');\n debugProfile(\"Getting interface description\");\n const description = (null == (_interfaceInstance_describe = interfaceInstance.describe) ? void 0 : _interfaceInstance_describe.call(interfaceInstance)) || '';\n debugProfile(\"Interface description end\");\n debugProfile('Uploading test info to server');\n uploadTestInfoToServer({\n testUrl: description,\n serverUrl: _opt.uploadServerUrl\n });\n debugProfile('UploadTestInfoToServer end');\n const screenshotBase64 = await interfaceInstance.screenshotBase64();\n assert(screenshotBase64, 'screenshotBase64 is required');\n const size = await interfaceInstance.size();\n debugProfile(`size: ${size.width}x${size.height} dpr: ${size.dpr}`);\n return {\n tree: {\n node: null,\n children: []\n },\n size,\n screenshotBase64: screenshotBase64\n };\n}\nfunction getReportFileName(tag = 'web') {\n const reportTagName = globalConfigManager.getEnvConfigValue(MIDSCENE_REPORT_TAG_NAME);\n const dateTimeInFileName = dayjs().format('YYYY-MM-DD_HH-mm-ss');\n const uniqueId = uuid().substring(0, 8);\n return `${reportTagName || tag}-${dateTimeInFileName}-${uniqueId}`;\n}\nfunction printReportMsg(filepath) {\n logMsg(`Midscene - report file updated: ${filepath}`);\n}\nfunction getCurrentExecutionFile(trace) {\n const error = new Error();\n const stackTrace = trace || error.stack;\n const pkgDir = process.cwd() || '';\n if (stackTrace) {\n const stackLines = stackTrace.split('\\n');\n for (const line of stackLines)if (line.includes('.spec.') || line.includes('.test.') || line.includes('.ts') || line.includes('.js')) {\n const match = line.match(/(?:at\\s+)?(.*?\\.(?:spec|test)\\.[jt]s)/);\n if (null == match ? void 0 : match[1]) {\n const targetFileName = match[1].replace(pkgDir, '').trim().replace('at ', '');\n return targetFileName;\n }\n }\n }\n return false;\n}\nconst testFileIndex = new Map();\nfunction generateCacheId(fileName) {\n let taskFile = fileName || getCurrentExecutionFile();\n if (!taskFile) {\n taskFile = uuid();\n console.warn('Midscene - using random UUID for cache id. Cache may be invalid.');\n }\n if (testFileIndex.has(taskFile)) {\n const currentIndex = testFileIndex.get(taskFile);\n if (void 0 !== currentIndex) testFileIndex.set(taskFile, currentIndex + 1);\n } else testFileIndex.set(taskFile, 1);\n return `${taskFile}-${testFileIndex.get(taskFile)}`;\n}\nfunction matchElementFromPlan(planLocateParam, tree) {\n if (!planLocateParam) return;\n if (planLocateParam.id) return getNodeFromCacheList(planLocateParam.id);\n if (planLocateParam.bbox) {\n const centerPosition = {\n x: Math.floor((planLocateParam.bbox[0] + planLocateParam.bbox[2]) / 2),\n y: Math.floor((planLocateParam.bbox[1] + planLocateParam.bbox[3]) / 2)\n };\n let element = elementByPositionWithElementInfo(tree, centerPosition);\n if (!element) element = generateElementByPosition(centerPosition);\n return element;\n }\n}\nasync function matchElementFromCache(context, cacheEntry, cachePrompt, cacheable) {\n var _context_taskCache;\n if (!cacheEntry) return;\n if (false === cacheable) return void debug('cache disabled for prompt: %s', cachePrompt);\n if (!(null == (_context_taskCache = context.taskCache) ? void 0 : _context_taskCache.isCacheResultUsed)) return;\n if (!context.interfaceInstance.rectMatchesCacheFeature) return void debug('interface does not implement rectMatchesCacheFeature, skip cache');\n try {\n const rect = await context.interfaceInstance.rectMatchesCacheFeature(cacheEntry);\n const element = {\n id: uuid(),\n center: [\n Math.round(rect.left + rect.width / 2),\n Math.round(rect.top + rect.height / 2)\n ],\n rect,\n xpaths: [],\n attributes: {\n nodeType: NodeType.POSITION\n }\n };\n debug('cache hit, prompt: %s', cachePrompt);\n return element;\n } catch (error) {\n debug('rectMatchesCacheFeature error: %s', error);\n return;\n }\n}\nfunction trimContextByViewport(execution) {\n function filterVisibleTree(node) {\n if (!node) return null;\n const filteredChildren = Array.isArray(node.children) ? node.children.map(filterVisibleTree).filter((child)=>null !== child) : [];\n if (node.node && true === node.node.isVisible) return {\n ...node,\n children: filteredChildren\n };\n if (filteredChildren.length > 0) return {\n node: null,\n children: filteredChildren\n };\n return null;\n }\n return {\n ...execution,\n tasks: Array.isArray(execution.tasks) ? execution.tasks.map((task)=>{\n var _task_uiContext;\n const newTask = {\n ...task\n };\n if (null == (_task_uiContext = task.uiContext) ? void 0 : _task_uiContext.tree) newTask.uiContext = {\n ...task.uiContext,\n tree: filterVisibleTree(task.uiContext.tree) || {\n node: null,\n children: []\n }\n };\n return newTask;\n }) : execution.tasks\n };\n}\nconst getMidsceneVersion = ()=>\"1.0.1-beta-20251021060907.0\";\nconst parsePrompt = (prompt)=>{\n if ('string' == typeof prompt) return {\n textPrompt: prompt,\n multimodalPrompt: void 0\n };\n return {\n textPrompt: prompt.prompt,\n multimodalPrompt: prompt.images ? {\n images: prompt.images,\n convertHttpImage2Base64: !!prompt.convertHttpImage2Base64\n } : void 0\n };\n};\nexport { commonContextParser, generateCacheId, getCurrentExecutionFile, getMidsceneVersion, getReportFileName, matchElementFromCache, matchElementFromPlan, parsePrompt, printReportMsg, trimContextByViewport };\n\n//# sourceMappingURL=utils.mjs.map","import node_assert from \"node:assert\";\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport { isDeepStrictEqual } from \"node:util\";\nimport { getMidsceneRunSubDir } from \"@midscene/shared/common\";\nimport { MIDSCENE_CACHE_MAX_FILENAME_LENGTH, globalConfigManager } from \"@midscene/shared/env\";\nimport { getDebug } from \"@midscene/shared/logger\";\nimport { generateHashId, ifInBrowser, ifInWorker, replaceIllegalPathCharsAndSpace } from \"@midscene/shared/utils\";\nimport js_yaml from \"js-yaml\";\nimport semver from \"semver\";\nimport { getMidsceneVersion } from \"./utils.mjs\";\nfunction _define_property(obj, key, value) {\n if (key in obj) Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n else obj[key] = value;\n return obj;\n}\nconst DEFAULT_CACHE_MAX_FILENAME_LENGTH = 200;\nconst debug = getDebug('cache');\nconst lowestSupportedMidsceneVersion = '0.16.10';\nconst cacheFileExt = '.cache.yaml';\nclass TaskCache {\n matchCache(prompt, type) {\n if (!this.isCacheResultUsed) return;\n for(let i = 0; i < this.cacheOriginalLength; i++){\n const item = this.cache.caches[i];\n const promptStr = 'string' == typeof prompt ? prompt : JSON.stringify(prompt);\n const key = `${type}:${promptStr}:${i}`;\n if (item.type === type && isDeepStrictEqual(item.prompt, prompt) && !this.matchedCacheIndices.has(key)) {\n if ('locate' === item.type) {\n const locateItem = item;\n if (!locateItem.cache && Array.isArray(locateItem.xpaths)) locateItem.cache = {\n xpaths: locateItem.xpaths\n };\n if ('xpaths' in locateItem) locateItem.xpaths = void 0;\n }\n this.matchedCacheIndices.add(key);\n debug('cache found and marked as used, type: %s, prompt: %s, index: %d', type, prompt, i);\n return {\n cacheContent: item,\n updateFn: (cb)=>{\n debug('will call updateFn to update cache, type: %s, prompt: %s, index: %d', type, prompt, i);\n cb(item);\n if (this.readOnlyMode) return void debug('read-only mode, cache updated in memory but not flushed to file');\n debug('cache updated, will flush to file, type: %s, prompt: %s, index: %d', type, prompt, i);\n this.flushCacheToFile();\n }\n };\n }\n }\n debug('no unused cache found, type: %s, prompt: %s', type, prompt);\n }\n matchPlanCache(prompt) {\n return this.matchCache(prompt, 'plan');\n }\n matchLocateCache(prompt) {\n return this.matchCache(prompt, 'locate');\n }\n appendCache(cache) {\n debug('will append cache', cache);\n this.cache.caches.push(cache);\n if (this.readOnlyMode) return void debug('read-only mode, cache appended to memory but not flushed to file');\n this.flushCacheToFile();\n }\n loadCacheFromFile() {\n const cacheFile = this.cacheFilePath;\n node_assert(cacheFile, 'cache file path is required');\n if (!existsSync(cacheFile)) return void debug('no cache file found, path: %s', cacheFile);\n const jsonTypeCacheFile = cacheFile.replace(cacheFileExt, '.json');\n if (existsSync(jsonTypeCacheFile) && this.isCacheResultUsed) return void console.warn(`An outdated cache file from an earlier version of Midscene has been detected. Since version 0.17, we have implemented an improved caching strategy. Please delete the old file located at: ${jsonTypeCacheFile}.`);\n try {\n const data = readFileSync(cacheFile, 'utf8');\n const jsonData = js_yaml.load(data);\n const version = getMidsceneVersion();\n if (!version) return void debug('no midscene version info, will not read cache from file');\n if (semver.lt(jsonData.midsceneVersion, lowestSupportedMidsceneVersion) && !jsonData.midsceneVersion.includes('beta')) return void console.warn(`You are using an old version of Midscene cache file, and we cannot match any info from it. Starting from Midscene v0.17, we changed our strategy to use xpath for cache info, providing better performance.\\nPlease delete the existing cache and rebuild it. Sorry for the inconvenience.\\ncache file: ${cacheFile}`);\n debug('cache loaded from file, path: %s, cache version: %s, record length: %s', cacheFile, jsonData.midsceneVersion, jsonData.caches.length);\n jsonData.midsceneVersion = getMidsceneVersion();\n return jsonData;\n } catch (err) {\n debug('cache file exists but load failed, path: %s, error: %s', cacheFile, err);\n return;\n }\n }\n flushCacheToFile(options) {\n const version = getMidsceneVersion();\n if (!version) return void debug('no midscene version info, will not write cache to file');\n if (!this.cacheFilePath) return void debug('no cache file path, will not write cache to file');\n if (null == options ? void 0 : options.cleanUnused) if (this.isCacheResultUsed) {\n const originalLength = this.cache.caches.length;\n const usedIndices = new Set();\n for (const key of this.matchedCacheIndices){\n const parts = key.split(':');\n const index = Number.parseInt(parts[parts.length - 1], 10);\n if (!Number.isNaN(index)) usedIndices.add(index);\n }\n this.cache.caches = this.cache.caches.filter((_, index)=>{\n const isUsed = usedIndices.has(index);\n const isNew = index >= this.cacheOriginalLength;\n return isUsed || isNew;\n });\n const removedCount = originalLength - this.cache.caches.length;\n removedCount > 0 ? debug('cleaned %d unused cache record(s)', removedCount) : debug('no unused cache to clean');\n } else debug('skip cleaning: cache is not used for reading');\n try {\n const dir = dirname(this.cacheFilePath);\n if (!existsSync(dir)) {\n mkdirSync(dir, {\n recursive: true\n });\n debug('created cache directory: %s', dir);\n }\n const sortedCaches = [\n ...this.cache.caches\n ].sort((a, b)=>{\n if ('plan' === a.type && 'locate' === b.type) return -1;\n if ('locate' === a.type && 'plan' === b.type) return 1;\n return 0;\n });\n const cacheToWrite = {\n ...this.cache,\n caches: sortedCaches\n };\n const yamlData = js_yaml.dump(cacheToWrite);\n writeFileSync(this.cacheFilePath, yamlData);\n debug('cache flushed to file: %s', this.cacheFilePath);\n } catch (err) {\n debug('write cache to file failed, path: %s, error: %s', this.cacheFilePath, err);\n }\n }\n updateOrAppendCacheRecord(newRecord, cachedRecord) {\n if (cachedRecord) if ('plan' === newRecord.type) cachedRecord.updateFn((cache)=>{\n cache.yamlWorkflow = newRecord.yamlWorkflow;\n });\n else cachedRecord.updateFn((cache)=>{\n const locateCache = cache;\n locateCache.cache = newRecord.cache;\n if ('xpaths' in locateCache) locateCache.xpaths = void 0;\n });\n else this.appendCache(newRecord);\n }\n constructor(cacheId, isCacheResultUsed, cacheFilePath, options = {}){\n _define_property(this, \"cacheId\", void 0);\n _define_property(this, \"cacheFilePath\", void 0);\n _define_property(this, \"cache\", void 0);\n _define_property(this, \"isCacheResultUsed\", void 0);\n _define_property(this, \"cacheOriginalLength\", void 0);\n _define_property(this, \"readOnlyMode\", void 0);\n _define_property(this, \"writeOnlyMode\", void 0);\n _define_property(this, \"matchedCacheIndices\", new Set());\n node_assert(cacheId, 'cacheId is required');\n let safeCacheId = replaceIllegalPathCharsAndSpace(cacheId);\n const cacheMaxFilenameLength = globalConfigManager.getEnvConfigInNumber(MIDSCENE_CACHE_MAX_FILENAME_LENGTH) || DEFAULT_CACHE_MAX_FILENAME_LENGTH;\n if (Buffer.byteLength(safeCacheId, 'utf8') > cacheMaxFilenameLength) {\n const prefix = safeCacheId.slice(0, 32);\n const hash = generateHashId(void 0, safeCacheId);\n safeCacheId = `${prefix}-${hash}`;\n }\n this.cacheId = safeCacheId;\n this.cacheFilePath = ifInBrowser || ifInWorker ? void 0 : cacheFilePath || join(getMidsceneRunSubDir('cache'), `${this.cacheId}${cacheFileExt}`);\n const readOnlyMode = Boolean(null == options ? void 0 : options.readOnly);\n const writeOnlyMode = Boolean(null == options ? void 0 : options.writeOnly);\n if (readOnlyMode && writeOnlyMode) throw new Error('TaskCache cannot be both read-only and write-only');\n this.isCacheResultUsed = writeOnlyMode ? false : isCacheResultUsed;\n this.readOnlyMode = readOnlyMode;\n this.writeOnlyMode = writeOnlyMode;\n let cacheContent;\n if (this.cacheFilePath && !this.writeOnlyMode) cacheContent = this.loadCacheFromFile();\n if (!cacheContent) cacheContent = {\n midsceneVersion: getMidsceneVersion(),\n cacheId: this.cacheId,\n caches: []\n };\n this.cache = cacheContent;\n this.cacheOriginalLength = this.isCacheResultUsed ? this.cache.caches.length : 0;\n }\n}\nexport { TaskCache, cacheFileExt, debug };\n\n//# sourceMappingURL=task-cache.mjs.map","import { InsightError } from \"../types.mjs\";\nimport { sleep } from \"../utils.mjs\";\nimport { getDebug } from \"@midscene/shared/logger\";\nimport { assert } from \"@midscene/shared/utils\";\nimport { findAllMidsceneLocatorField, parseActionParam } from \"../ai-model/index.mjs\";\nimport { matchElementFromCache, matchElementFromPlan } from \"./utils.mjs\";\nfunction _define_property(obj, key, value) {\n if (key in obj) Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n else obj[key] = value;\n return obj;\n}\nconst debug = getDebug('agent:task-builder');\nfunction locatePlanForLocate(param) {\n const locate = 'string' == typeof param ? {\n prompt: param\n } : param;\n const locatePlan = {\n type: 'Locate',\n locate,\n param: locate,\n thought: ''\n };\n return locatePlan;\n}\nclass TaskBuilder {\n async build(plans, modelConfig, options) {\n const tasks = [];\n const cacheable = null == options ? void 0 : options.cacheable;\n const taskForLocatePlan = (plan, detailedLocateParam, onResult)=>{\n if ('string' == typeof detailedLocateParam) detailedLocateParam = {\n prompt: detailedLocateParam\n };\n if (void 0 !== cacheable) detailedLocateParam = {\n ...detailedLocateParam,\n cacheable\n };\n const taskFind = {\n type: 'Insight',\n subType: 'Locate',\n param: detailedLocateParam,\n thought: plan.thought,\n executor: async (param, taskContext)=>{\n var _this_taskCache, _locateCacheRecord_cacheContent;\n const { task } = taskContext;\n let { uiContext } = taskContext;\n assert((null == param ? void 0 : param.prompt) || (null == param ? void 0 : param.id) || (null == param ? void 0 : param.bbox), `No prompt or id or position or bbox to locate, param=${JSON.stringify(param)}`);\n if (!uiContext) uiContext = await this.insight.contextRetrieverFn();\n assert(uiContext, 'uiContext is required for Insight task');\n let locateDump;\n let locateResult;\n const applyDump = (dump)=>{\n var _dump_taskInfo, _dump_taskInfo1;\n if (!dump) return;\n locateDump = dump;\n task.log = {\n dump\n };\n task.usage = null == (_dump_taskInfo = dump.taskInfo) ? void 0 : _dump_taskInfo.usage;\n if (null == (_dump_taskInfo1 = dump.taskInfo) ? void 0 : _dump_taskInfo1.searchAreaUsage) task.searchAreaUsage = dump.taskInfo.searchAreaUsage;\n };\n const elementFromXpath = param.xpath && this.interface.getElementInfoByXpath ? await this.interface.getElementInfoByXpath(param.xpath) : void 0;\n const userExpectedPathHitFlag = !!elementFromXpath;\n const cachePrompt = param.prompt;\n const locateCacheRecord = null == (_this_taskCache = this.taskCache) ? void 0 : _this_taskCache.matchLocateCache(cachePrompt);\n const cacheEntry = null == locateCacheRecord ? void 0 : null == (_locateCacheRecord_cacheContent = locateCacheRecord.cacheContent) ? void 0 : _locateCacheRecord_cacheContent.cache;\n const elementFromCache = userExpectedPathHitFlag ? null : await matchElementFromCache({\n taskCache: this.taskCache,\n interfaceInstance: this.interface\n }, cacheEntry, cachePrompt, param.cacheable);\n const cacheHitFlag = !!elementFromCache;\n const elementFromPlan = userExpectedPathHitFlag || cacheHitFlag ? void 0 : matchElementFromPlan(param, uiContext.tree);\n const planHitFlag = !!elementFromPlan;\n let elementFromAiLocate;\n if (!userExpectedPathHitFlag && !cacheHitFlag && !planHitFlag) try {\n locateResult = await this.insight.locate(param, {\n context: uiContext\n }, modelConfig);\n applyDump(locateResult.dump);\n elementFromAiLocate = locateResult.element;\n } catch (error) {\n if (error instanceof InsightError) applyDump(error.dump);\n throw error;\n }\n const aiLocateHitFlag = !!elementFromAiLocate;\n const element = elementFromXpath || elementFromCache || elementFromPlan || elementFromAiLocate;\n let currentCacheEntry;\n if (element && this.taskCache && !cacheHitFlag && (null == param ? void 0 : param.cacheable) !== false) if (this.interface.cacheFeatureForRect) try {\n const feature = await this.interface.cacheFeatureForRect(element.rect, void 0 !== element.isOrderSensitive ? {\n _orderSensitive: element.isOrderSensitive\n } : void 0);\n if (feature && Object.keys(feature).length > 0) {\n debug('update cache, prompt: %s, cache: %o', cachePrompt, feature);\n currentCacheEntry = feature;\n this.taskCache.updateOrAppendCacheRecord({\n type: 'locate',\n prompt: cachePrompt,\n cache: feature\n }, locateCacheRecord);\n } else debug('no cache data returned, skip cache update, prompt: %s', cachePrompt);\n } catch (error) {\n debug('cacheFeatureForRect failed: %s', error);\n }\n else debug('cacheFeatureForRect is not supported, skip cache update');\n if (!element) {\n if (locateDump) throw new InsightError(`Element not found: ${param.prompt}`, locateDump);\n throw new Error(`Element not found: ${param.prompt}`);\n }\n let hitBy;\n if (userExpectedPathHitFlag) hitBy = {\n from: 'User expected path',\n context: {\n xpath: param.xpath\n }\n };\n else if (cacheHitFlag) hitBy = {\n from: 'Cache',\n context: {\n cacheEntry,\n cacheToSave: currentCacheEntry\n }\n };\n else if (planHitFlag) hitBy = {\n from: 'Planning',\n context: {\n id: null == elementFromPlan ? void 0 : elementFromPlan.id,\n bbox: null == elementFromPlan ? void 0 : elementFromPlan.bbox\n }\n };\n else if (aiLocateHitFlag) hitBy = {\n from: 'AI model',\n context: {\n prompt: param.prompt\n }\n };\n null == onResult || onResult(element);\n return {\n output: {\n element\n },\n uiContext,\n hitBy\n };\n }\n };\n return taskFind;\n };\n for (const plan of plans){\n if ('Locate' === plan.type) {\n if (!plan.locate || null === plan.locate) {\n debug('Locate action with id is null, will be ignored', plan);\n continue;\n }\n const taskLocate = taskForLocatePlan(plan, plan.locate);\n tasks.push(taskLocate);\n continue;\n }\n if ('Error' === plan.type) {\n var _plan_param;\n const taskActionError = {\n type: 'Action',\n subType: 'Error',\n param: plan.param,\n thought: plan.thought || (null == (_plan_param = plan.param) ? void 0 : _plan_param.thought),\n locate: plan.locate,\n executor: async ()=>{\n var _plan_param;\n throw new Error((null == plan ? void 0 : plan.thought) || (null == (_plan_param = plan.param) ? void 0 : _plan_param.thought) || 'error without thought');\n }\n };\n tasks.push(taskActionError);\n continue;\n }\n if ('Finished' === plan.type) {\n const taskActionFinished = {\n type: 'Action',\n subType: 'Finished',\n param: null,\n thought: plan.thought,\n locate: plan.locate,\n executor: async ()=>{}\n };\n tasks.push(taskActionFinished);\n continue;\n }\n if ('Sleep' === plan.type) {\n const taskActionSleep = {\n type: 'Action',\n subType: 'Sleep',\n param: plan.param,\n thought: plan.thought,\n locate: plan.locate,\n executor: async (taskParam)=>{\n await sleep((null == taskParam ? void 0 : taskParam.timeMs) || 3000);\n }\n };\n tasks.push(taskActionSleep);\n continue;\n }\n const planType = plan.type;\n const actionSpace = await this.interface.actionSpace();\n const action = actionSpace.find((item)=>item.name === planType);\n const param = plan.param;\n if (!action) throw new Error(`Action type '${planType}' not found`);\n const locateFields = action ? findAllMidsceneLocatorField(action.paramSchema) : [];\n const requiredLocateFields = action ? findAllMidsceneLocatorField(action.paramSchema, true) : [];\n locateFields.forEach((field)=>{\n if (param[field]) {\n const locatePlan = locatePlanForLocate(param[field]);\n debug('will prepend locate param for field', `action.type=${planType}`, `param=${JSON.stringify(param[field])}`, `locatePlan=${JSON.stringify(locatePlan)}`);\n const locateTask = taskForLocatePlan(locatePlan, param[field], (result)=>{\n param[field] = result;\n });\n tasks.push(locateTask);\n } else {\n assert(!requiredLocateFields.includes(field), `Required locate field '${field}' is not provided for action ${planType}`);\n debug(`field '${field}' is not provided for action ${planType}`);\n }\n });\n const task = {\n type: 'Action',\n subType: planType,\n thought: plan.thought,\n param: plan.param,\n executor: async (param, taskContext)=>{\n var _taskContext_element;\n debug('executing action', planType, param, `taskContext.element.center: ${null == (_taskContext_element = taskContext.element) ? void 0 : _taskContext_element.center}`);\n const uiContext = taskContext.uiContext;\n assert(uiContext, 'uiContext is required for Action task');\n requiredLocateFields.forEach((field)=>{\n assert(param[field], `field '${field}' is required for action ${planType} but not provided. Cannot execute action ${planType}.`);\n });\n try {\n await Promise.all([\n (async ()=>{\n if (this.interface.beforeInvokeAction) {\n debug('will call \"beforeInvokeAction\" for interface');\n await this.interface.beforeInvokeAction(action.name, param);\n debug('called \"beforeInvokeAction\" for interface');\n }\n })(),\n sleep(200)\n ]);\n } catch (originalError) {\n const originalMessage = (null == originalError ? void 0 : originalError.message) || String(originalError);\n throw new Error(`error in running beforeInvokeAction for ${action.name}: ${originalMessage}`, {\n cause: originalError\n });\n }\n if (action.paramSchema) try {\n param = parseActionParam(param, action.paramSchema);\n } catch (error) {\n throw new Error(`Invalid parameters for action ${action.name}: ${error.message}\\nParameters: ${JSON.stringify(param)}`, {\n cause: error\n });\n }\n debug('calling action', action.name);\n const actionFn = action.call.bind(this.interface);\n await actionFn(param, taskContext);\n debug('called action', action.name);\n try {\n if (this.interface.afterInvokeAction) {\n debug('will call \"afterInvokeAction\" for interface');\n await this.interface.afterInvokeAction(action.name, param);\n debug('called \"afterInvokeAction\" for interface');\n }\n } catch (originalError) {\n const originalMessage = (null == originalError ? void 0 : originalError.message) || String(originalError);\n throw new Error(`error in running afterInvokeAction for ${action.name}: ${originalMessage}`, {\n cause: originalError\n });\n }\n return {\n output: {\n success: true,\n action: planType,\n param: param\n }\n };\n }\n };\n tasks.push(task);\n }\n return {\n tasks\n };\n }\n constructor({ interfaceInstance, insight, taskCache }){\n _define_property(this, \"interface\", void 0);\n _define_property(this, \"insight\", void 0);\n _define_property(this, \"taskCache\", void 0);\n this.interface = interfaceInstance;\n this.insight = insight;\n this.taskCache = taskCache;\n }\n}\nexport { TaskBuilder, locatePlanForLocate };\n\n//# sourceMappingURL=task-builder.mjs.map","import { ConversationHistory, plan, uiTarsPlanning } from \"../ai-model/index.mjs\";\nimport { InsightError } from \"../types.mjs\";\nimport { MIDSCENE_REPLANNING_CYCLE_LIMIT, globalConfigManager } from \"@midscene/shared/env\";\nimport { getDebug } from \"@midscene/shared/logger\";\nimport { assert } from \"@midscene/shared/utils\";\nimport { ExecutionSession } from \"./execution-session.mjs\";\nimport { TaskBuilder, locatePlanForLocate } from \"./task-builder.mjs\";\nimport { taskTitleStr } from \"./ui-utils.mjs\";\nimport { parsePrompt } from \"./utils.mjs\";\nfunction _define_property(obj, key, value) {\n if (key in obj) Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n else obj[key] = value;\n return obj;\n}\nconst debug = getDebug('device-task-executor');\nconst defaultReplanningCycleLimit = 10;\nconst defaultVlmUiTarsReplanningCycleLimit = 40;\nclass TaskExecutor {\n get page() {\n return this.interface;\n }\n createExecutionSession(title, options) {\n return new ExecutionSession(title, ()=>Promise.resolve(this.insight.contextRetrieverFn()), {\n onTaskStart: this.onTaskStartCallback,\n tasks: null == options ? void 0 : options.tasks\n });\n }\n async convertPlanToExecutable(plans, modelConfig, cacheable) {\n return this.taskBuilder.build(plans, modelConfig, {\n cacheable\n });\n }\n async loadYamlFlowAsPlanning(userInstruction, yamlString) {\n const session = this.createExecutionSession(taskTitleStr('Action', userInstruction));\n const task = {\n type: 'Planning',\n subType: 'LoadYaml',\n locate: null,\n param: {\n userInstruction\n },\n executor: async (param, executorContext)=>{\n const { uiContext } = executorContext;\n assert(uiContext, 'uiContext is required for Planning task');\n return {\n output: {\n actions: [],\n more_actions_needed_by_instruction: false,\n log: '',\n yamlString\n },\n cache: {\n hit: true\n },\n hitBy: {\n from: 'Cache',\n context: {\n yamlString\n }\n }\n };\n }\n };\n await session.appendAndRun(task);\n return {\n runner: session.getRunner()\n };\n }\n createPlanningTask(userInstruction, actionContext, modelConfig) {\n const task = {\n type: 'Planning',\n subType: 'Plan',\n locate: null,\n param: {\n userInstruction\n },\n executor: async (param, executorContext)=>{\n const startTime = Date.now();\n const { uiContext } = executorContext;\n assert(uiContext, 'uiContext is required for Planning task');\n const { vlMode } = modelConfig;\n const uiTarsModelVersion = 'vlm-ui-tars' === vlMode ? modelConfig.uiTarsModelVersion : void 0;\n assert(this.interface.actionSpace, 'actionSpace for device is not implemented');\n const actionSpace = await this.interface.actionSpace();\n debug('actionSpace for this interface is:', actionSpace.map((action)=>action.name).join(', '));\n assert(Array.isArray(actionSpace), 'actionSpace must be an array');\n if (0 === actionSpace.length) console.warn(`ActionSpace for ${this.interface.interfaceType} is empty. This may lead to unexpected behavior.`);\n const planResult = await (uiTarsModelVersion ? uiTarsPlanning : plan)(param.userInstruction, {\n context: uiContext,\n actionContext,\n interfaceType: this.interface.interfaceType,\n actionSpace,\n modelConfig,\n conversationHistory: this.conversationHistory\n });\n debug('planResult', JSON.stringify(planResult, null, 2));\n const { actions, log, more_actions_needed_by_instruction, error, usage, rawResponse, sleep } = planResult;\n executorContext.task.log = {\n ...executorContext.task.log || {},\n rawResponse\n };\n executorContext.task.usage = usage;\n const finalActions = actions || [];\n if (sleep) {\n const timeNow = Date.now();\n const timeRemaining = sleep - (timeNow - startTime);\n if (timeRemaining > 0) finalActions.push({\n type: 'Sleep',\n param: {\n timeMs: timeRemaining\n },\n locate: null\n });\n }\n if (0 === finalActions.length) assert(!more_actions_needed_by_instruction || sleep, error ? `Failed to plan: ${error}` : 'No plan found');\n return {\n output: {\n actions: finalActions,\n more_actions_needed_by_instruction,\n log,\n yamlFlow: planResult.yamlFlow\n },\n cache: {\n hit: false\n },\n uiContext\n };\n }\n };\n return task;\n }\n async runPlans(title, plans, modelConfig) {\n const session = this.createExecutionSession(title);\n const { tasks } = await this.convertPlanToExecutable(plans, modelConfig);\n const result = await session.appendAndRun(tasks);\n const { output } = result;\n return {\n output,\n runner: session.getRunner()\n };\n }\n getReplanningCycleLimit(isVlmUiTars) {\n return this.replanningCycleLimit || globalConfigManager.getEnvConfigInNumber(MIDSCENE_REPLANNING_CYCLE_LIMIT) || (isVlmUiTars ? defaultVlmUiTarsReplanningCycleLimit : defaultReplanningCycleLimit);\n }\n async action(userPrompt, modelConfig, actionContext, cacheable) {\n this.conversationHistory.reset();\n const session = this.createExecutionSession(taskTitleStr('Action', userPrompt));\n const runner = session.getRunner();\n let replanCount = 0;\n const yamlFlow = [];\n const replanningCycleLimit = this.getReplanningCycleLimit('vlm-ui-tars' === modelConfig.vlMode);\n while(true){\n if (replanCount > replanningCycleLimit) {\n const errorMsg = `Replanning ${replanningCycleLimit} times, which is more than the limit, please split the task into multiple steps`;\n return session.appendErrorPlan(errorMsg);\n }\n const planningTask = this.createPlanningTask(userPrompt, actionContext, modelConfig);\n const result = await session.appendAndRun(planningTask);\n const planResult = null == result ? void 0 : result.output;\n if (session.isInErrorState()) return {\n output: planResult,\n runner\n };\n const plans = planResult.actions || [];\n yamlFlow.push(...planResult.yamlFlow || []);\n let executables;\n try {\n executables = await this.convertPlanToExecutable(plans, modelConfig, cacheable);\n await session.appendAndRun(executables.tasks);\n } catch (error) {\n return session.appendErrorPlan(`Error converting plans to executable tasks: ${error}, plans: ${JSON.stringify(plans)}`);\n }\n if (session.isInErrorState()) return {\n output: void 0,\n runner\n };\n if (!planResult.more_actions_needed_by_instruction) break;\n replanCount++;\n }\n return {\n output: {\n yamlFlow\n },\n runner\n };\n }\n createTypeQueryTask(type, demand, modelConfig, opt, multimodalPrompt) {\n const queryTask = {\n type: 'Insight',\n subType: type,\n locate: null,\n param: {\n dataDemand: multimodalPrompt ? {\n demand,\n multimodalPrompt\n } : demand\n },\n executor: async (param, taskContext)=>{\n const { task } = taskContext;\n let queryDump;\n const applyDump = (dump)=>{\n queryDump = dump;\n task.log = {\n dump\n };\n };\n const uiContext = taskContext.uiContext;\n assert(uiContext, 'uiContext is required for Query task');\n const ifTypeRestricted = 'Query' !== type;\n let demandInput = demand;\n let keyOfResult = 'result';\n if (ifTypeRestricted && ('Assert' === type || 'WaitFor' === type)) {\n keyOfResult = 'StatementIsTruthy';\n const booleanPrompt = 'Assert' === type ? `Boolean, whether the following statement is true: ${demand}` : `Boolean, the user wants to do some 'wait for' operation, please check whether the following statement is true: ${demand}`;\n demandInput = {\n [keyOfResult]: booleanPrompt\n };\n } else if (ifTypeRestricted) demandInput = {\n [keyOfResult]: `${type}, ${demand}`\n };\n let extractResult;\n try {\n extractResult = await this.insight.extract(demandInput, modelConfig, opt, multimodalPrompt);\n } catch (error) {\n if (error instanceof InsightError) applyDump(error.dump);\n throw error;\n }\n const { data, usage, thought, dump } = extractResult;\n applyDump(dump);\n let outputResult = data;\n if (ifTypeRestricted) if ('string' == typeof data) outputResult = data;\n else {\n assert('WaitFor' !== type ? (null == data ? void 0 : data[keyOfResult]) !== void 0 : true, 'No result in query data');\n outputResult = data[keyOfResult];\n }\n return {\n output: outputResult,\n log: queryDump,\n usage,\n thought\n };\n }\n };\n return queryTask;\n }\n async createTypeQueryExecution(type, demand, modelConfig, opt, multimodalPrompt) {\n const session = this.createExecutionSession(taskTitleStr(type, 'string' == typeof demand ? demand : JSON.stringify(demand)));\n const queryTask = await this.createTypeQueryTask(type, demand, modelConfig, opt, multimodalPrompt);\n const result = await session.appendAndRun(queryTask);\n if (!result) throw new Error('result of taskExecutor.flush() is undefined in function createTypeQueryTask');\n const { output, thought } = result;\n return {\n output,\n thought,\n runner: session.getRunner()\n };\n }\n async taskForSleep(timeMs, modelConfig) {\n const sleepPlan = {\n type: 'Sleep',\n param: {\n timeMs\n },\n locate: null\n };\n const { tasks: sleepTasks } = await this.convertPlanToExecutable([\n sleepPlan\n ], modelConfig);\n return sleepTasks[0];\n }\n async waitFor(assertion, opt, modelConfig) {\n const { textPrompt, multimodalPrompt } = parsePrompt(assertion);\n const description = `waitFor: ${textPrompt}`;\n const session = this.createExecutionSession(taskTitleStr('WaitFor', description));\n const runner = session.getRunner();\n const { timeoutMs, checkIntervalMs } = opt;\n assert(assertion, 'No assertion for waitFor');\n assert(timeoutMs, 'No timeoutMs for waitFor');\n assert(checkIntervalMs, 'No checkIntervalMs for waitFor');\n assert(checkIntervalMs <= timeoutMs, `wrong config for waitFor: checkIntervalMs must be less than timeoutMs, config: {checkIntervalMs: ${checkIntervalMs}, timeoutMs: ${timeoutMs}}`);\n const overallStartTime = Date.now();\n let startTime = Date.now();\n let errorThought = '';\n while(Date.now() - overallStartTime < timeoutMs){\n startTime = Date.now();\n const queryTask = await this.createTypeQueryTask('WaitFor', textPrompt, modelConfig, {\n doNotThrowError: true\n }, multimodalPrompt);\n const result = await session.appendAndRun(queryTask);\n if (null == result ? void 0 : result.output) return {\n output: void 0,\n runner\n };\n errorThought = (null == result ? void 0 : result.thought) || !result && `No result from assertion: ${textPrompt}` || `unknown error when waiting for assertion: ${textPrompt}`;\n const now = Date.now();\n if (now - startTime < checkIntervalMs) {\n const timeRemaining = checkIntervalMs - (now - startTime);\n const sleepTask = await this.taskForSleep(timeRemaining, modelConfig);\n await session.append(sleepTask);\n }\n }\n return session.appendErrorPlan(`waitFor timeout: ${errorThought}`);\n }\n constructor(interfaceInstance, insight, opts){\n _define_property(this, \"interface\", void 0);\n _define_property(this, \"insight\", void 0);\n _define_property(this, \"taskCache\", void 0);\n _define_property(this, \"taskBuilder\", void 0);\n _define_property(this, \"conversationHistory\", void 0);\n _define_property(this, \"onTaskStartCallback\", void 0);\n _define_property(this, \"replanningCycleLimit\", void 0);\n this.interface = interfaceInstance;\n this.insight = insight;\n this.taskCache = opts.taskCache;\n this.onTaskStartCallback = null == opts ? void 0 : opts.onTaskStart;\n this.replanningCycleLimit = opts.replanningCycleLimit;\n this.conversationHistory = new ConversationHistory();\n this.taskBuilder = new TaskBuilder({\n interfaceInstance,\n insight,\n taskCache: opts.taskCache\n });\n }\n}\nexport { TaskExecutor, locatePlanForLocate };\n\n//# sourceMappingURL=tasks.mjs.map","import { Insight } from \"../index.mjs\";\nimport js_yaml from \"js-yaml\";\nimport { getVersion, groupedActionDumpFileExt, processCacheConfig, reportHTMLContent, stringifyDumpData, writeLogFile } from \"../utils.mjs\";\nimport { ScriptPlayer, buildDetailedLocateParam, parseYamlScript } from \"../yaml/index.mjs\";\nimport { ModelConfigManager, globalModelConfigManager } from \"@midscene/shared/env\";\nimport { imageInfoOfBase64, resizeImgBase64 } from \"@midscene/shared/img\";\nimport { getDebug } from \"@midscene/shared/logger\";\nimport { assert } from \"@midscene/shared/utils\";\nimport { TaskCache } from \"./task-cache.mjs\";\nimport { TaskExecutor, locatePlanForLocate } from \"./tasks.mjs\";\nimport { locateParamStr, paramStr, taskTitleStr, typeStr } from \"./ui-utils.mjs\";\nimport { commonContextParser, getReportFileName, parsePrompt, printReportMsg, trimContextByViewport } from \"./utils.mjs\";\nfunction _define_property(obj, key, value) {\n if (key in obj) Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n else obj[key] = value;\n return obj;\n}\nconst debug = getDebug('agent');\nconst distanceOfTwoPoints = (p1, p2)=>{\n const [x1, y1] = p1;\n const [x2, y2] = p2;\n return Math.round(Math.sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2));\n};\nconst includedInRect = (point, rect)=>{\n const [x, y] = point;\n const { left, top, width, height } = rect;\n return x >= left && x <= left + width && y >= top && y <= top + height;\n};\nconst defaultInsightExtractOption = {\n domIncluded: false,\n screenshotIncluded: true\n};\nconst CACHE_STRATEGIES = [\n 'read-only',\n 'read-write',\n 'write-only'\n];\nconst isValidCacheStrategy = (strategy)=>CACHE_STRATEGIES.some((value)=>value === strategy);\nconst CACHE_STRATEGY_VALUES = CACHE_STRATEGIES.map((value)=>`\"${value}\"`).join(', ');\nclass Agent {\n get page() {\n return this.interface;\n }\n ensureVLModelWarning() {\n if (!this.hasWarnedNonVLModel && 'puppeteer' !== this.interface.interfaceType && 'playwright' !== this.interface.interfaceType && 'static' !== this.interface.interfaceType && 'chrome-extension-proxy' !== this.interface.interfaceType && 'page-over-chrome-extension-bridge' !== this.interface.interfaceType) {\n this.modelConfigManager.throwErrorIfNonVLModel();\n this.hasWarnedNonVLModel = true;\n }\n }\n async getScreenshotScale(context) {\n if (void 0 !== this.screenshotScale) return this.screenshotScale;\n if (!this.screenshotScalePromise) this.screenshotScalePromise = (async ()=>{\n var _context_size;\n const pageWidth = null == (_context_size = context.size) ? void 0 : _context_size.width;\n assert(pageWidth && pageWidth > 0, `Invalid page width when computing screenshot scale: ${pageWidth}`);\n const { width: screenshotWidth } = await imageInfoOfBase64(context.screenshotBase64);\n assert(Number.isFinite(screenshotWidth) && screenshotWidth > 0, `Invalid screenshot width when computing screenshot scale: ${screenshotWidth}`);\n const computedScale = screenshotWidth / pageWidth;\n assert(Number.isFinite(computedScale) && computedScale > 0, `Invalid computed screenshot scale: ${computedScale}`);\n debug(`Computed screenshot scale ${computedScale} from screenshot width ${screenshotWidth} and page width ${pageWidth}`);\n return computedScale;\n })();\n try {\n this.screenshotScale = await this.screenshotScalePromise;\n return this.screenshotScale;\n } finally{\n this.screenshotScalePromise = void 0;\n }\n }\n async getActionSpace() {\n return this.interface.actionSpace();\n }\n async getUIContext(action) {\n this.ensureVLModelWarning();\n if (this.frozenUIContext) {\n debug('Using frozen page context for action:', action);\n return this.frozenUIContext;\n }\n let context;\n if (this.interface.getContext) {\n debug('Using page.getContext for action:', action);\n context = await this.interface.getContext();\n } else {\n debug('Using commonContextParser for action:', action);\n context = await commonContextParser(this.interface, {\n uploadServerUrl: this.modelConfigManager.getUploadTestServerUrl()\n });\n }\n const computedScreenshotScale = await this.getScreenshotScale(context);\n if (1 !== computedScreenshotScale) {\n const scaleForLog = Number.parseFloat(computedScreenshotScale.toFixed(4));\n debug(`Applying computed screenshot scale: ${scaleForLog} (resize to logical size)`);\n const targetWidth = Math.round(context.size.width);\n const targetHeight = Math.round(context.size.height);\n debug(`Resizing screenshot to ${targetWidth}x${targetHeight}`);\n context.screenshotBase64 = await resizeImgBase64(context.screenshotBase64, {\n width: targetWidth,\n height: targetHeight\n });\n } else debug(`screenshot scale=${computedScreenshotScale}`);\n return context;\n }\n async _snapshotContext() {\n return await this.getUIContext('locate');\n }\n async setAIActionContext(prompt) {\n if (this.opts.aiActionContext) console.warn('aiActionContext is already set, and it is called again, will override the previous setting');\n this.opts.aiActionContext = prompt;\n }\n resetDump() {\n this.dump = {\n sdkVersion: getVersion(),\n groupName: this.opts.groupName,\n groupDescription: this.opts.groupDescription,\n executions: [],\n modelBriefs: []\n };\n return this.dump;\n }\n appendExecutionDump(execution) {\n const trimmedExecution = trimContextByViewport(execution);\n const currentDump = this.dump;\n currentDump.executions.push(trimmedExecution);\n }\n dumpDataString() {\n this.dump.groupName = this.opts.groupName;\n this.dump.groupDescription = this.opts.groupDescription;\n return stringifyDumpData(this.dump);\n }\n reportHTMLString() {\n return reportHTMLContent(this.dumpDataString());\n }\n writeOutActionDumps() {\n if (this.destroyed) throw new Error('PageAgent has been destroyed. Cannot update report file.');\n const { generateReport, autoPrintReportMsg } = this.opts;\n this.reportFile = writeLogFile({\n fileName: this.reportFileName,\n fileExt: groupedActionDumpFileExt,\n fileContent: this.dumpDataString(),\n type: 'dump',\n generateReport\n });\n debug('writeOutActionDumps', this.reportFile);\n if (generateReport && autoPrintReportMsg && this.reportFile) printReportMsg(this.reportFile);\n }\n async callbackOnTaskStartTip(task) {\n const param = paramStr(task);\n const tip = param ? `${typeStr(task)} - ${param}` : typeStr(task);\n if (this.onTaskStartTip) await this.onTaskStartTip(tip);\n }\n async afterTaskRunning(runner, doNotThrowError = false) {\n const executionDump = runner.dump();\n if (this.opts.aiActionContext) executionDump.aiActionContext = this.opts.aiActionContext;\n this.appendExecutionDump(executionDump);\n try {\n if (this.onDumpUpdate) this.onDumpUpdate(this.dumpDataString());\n } catch (error) {\n console.error('Error in onDumpUpdate', error);\n }\n this.writeOutActionDumps();\n if (runner.isInErrorState() && !doNotThrowError) {\n const errorTask = runner.latestErrorTask();\n throw new Error(`${null == errorTask ? void 0 : errorTask.errorMessage}\\n${null == errorTask ? void 0 : errorTask.errorStack}`, {\n cause: null == errorTask ? void 0 : errorTask.error\n });\n }\n }\n async callActionInActionSpace(type, opt) {\n debug('callActionInActionSpace', type, ',', opt);\n const actionPlan = {\n type: type,\n param: opt || {},\n thought: ''\n };\n debug('actionPlan', actionPlan);\n const plans = [\n actionPlan\n ].filter(Boolean);\n const title = taskTitleStr(type, locateParamStr((null == opt ? void 0 : opt.locate) || {}));\n const modelConfig = this.modelConfigManager.getModelConfig('grounding');\n const { output, runner } = await this.taskExecutor.runPlans(title, plans, modelConfig);\n await this.afterTaskRunning(runner);\n return output;\n }\n async aiTap(locatePrompt, opt) {\n assert(locatePrompt, 'missing locate prompt for tap');\n const detailedLocateParam = buildDetailedLocateParam(locatePrompt, opt);\n return this.callActionInActionSpace('Tap', {\n locate: detailedLocateParam\n });\n }\n async aiRightClick(locatePrompt, opt) {\n assert(locatePrompt, 'missing locate prompt for right click');\n const detailedLocateParam = buildDetailedLocateParam(locatePrompt, opt);\n return this.callActionInActionSpace('RightClick', {\n locate: detailedLocateParam\n });\n }\n async aiDoubleClick(locatePrompt, opt) {\n assert(locatePrompt, 'missing locate prompt for double click');\n const detailedLocateParam = buildDetailedLocateParam(locatePrompt, opt);\n return this.callActionInActionSpace('DoubleClick', {\n locate: detailedLocateParam\n });\n }\n async aiHover(locatePrompt, opt) {\n assert(locatePrompt, 'missing locate prompt for hover');\n const detailedLocateParam = buildDetailedLocateParam(locatePrompt, opt);\n return this.callActionInActionSpace('Hover', {\n locate: detailedLocateParam\n });\n }\n async aiInput(locatePromptOrValue, locatePromptOrOpt, optOrUndefined) {\n let value;\n let locatePrompt;\n let opt;\n if ('object' == typeof locatePromptOrOpt && null !== locatePromptOrOpt && 'value' in locatePromptOrOpt) {\n locatePrompt = locatePromptOrValue;\n const optWithValue = locatePromptOrOpt;\n value = optWithValue.value;\n opt = optWithValue;\n } else {\n value = locatePromptOrValue;\n locatePrompt = locatePromptOrOpt;\n opt = {\n ...optOrUndefined,\n value\n };\n }\n assert('string' == typeof value || 'number' == typeof value, 'input value must be a string or number, use empty string if you want to clear the input');\n assert(locatePrompt, 'missing locate prompt for input');\n const detailedLocateParam = buildDetailedLocateParam(locatePrompt, opt);\n const stringValue = 'number' == typeof value ? String(value) : value;\n return this.callActionInActionSpace('Input', {\n ...opt || {},\n value: stringValue,\n locate: detailedLocateParam\n });\n }\n async aiKeyboardPress(locatePromptOrKeyName, locatePromptOrOpt, optOrUndefined) {\n let keyName;\n let locatePrompt;\n let opt;\n if ('object' == typeof locatePromptOrOpt && null !== locatePromptOrOpt && 'keyName' in locatePromptOrOpt) {\n locatePrompt = locatePromptOrKeyName;\n opt = locatePromptOrOpt;\n } else {\n keyName = locatePromptOrKeyName;\n locatePrompt = locatePromptOrOpt;\n opt = {\n ...optOrUndefined || {},\n keyName\n };\n }\n assert(null == opt ? void 0 : opt.keyName, 'missing keyName for keyboard press');\n const detailedLocateParam = locatePrompt ? buildDetailedLocateParam(locatePrompt, opt) : void 0;\n return this.callActionInActionSpace('KeyboardPress', {\n ...opt || {},\n locate: detailedLocateParam\n });\n }\n async aiScroll(locatePromptOrScrollParam, locatePromptOrOpt, optOrUndefined) {\n let scrollParam;\n let locatePrompt;\n let opt;\n if ('object' == typeof locatePromptOrOpt && ('direction' in locatePromptOrOpt || 'scrollType' in locatePromptOrOpt || 'distance' in locatePromptOrOpt)) {\n locatePrompt = locatePromptOrScrollParam;\n opt = locatePromptOrOpt;\n } else {\n scrollParam = locatePromptOrScrollParam;\n locatePrompt = locatePromptOrOpt;\n opt = {\n ...optOrUndefined || {},\n ...scrollParam || {}\n };\n }\n const detailedLocateParam = buildDetailedLocateParam(locatePrompt || '', opt);\n return this.callActionInActionSpace('Scroll', {\n ...opt || {},\n locate: detailedLocateParam\n });\n }\n async aiAct(taskPrompt, opt) {\n var _this_taskCache, _this_taskCache1;\n const modelConfig = this.modelConfigManager.getModelConfig('planning');\n const cacheable = null == opt ? void 0 : opt.cacheable;\n const isVlmUiTars = 'vlm-ui-tars' === modelConfig.vlMode;\n const matchedCache = isVlmUiTars || false === cacheable ? void 0 : null == (_this_taskCache = this.taskCache) ? void 0 : _this_taskCache.matchPlanCache(taskPrompt);\n if (matchedCache && (null == (_this_taskCache1 = this.taskCache) ? void 0 : _this_taskCache1.isCacheResultUsed)) {\n var _matchedCache_cacheContent, _matchedCache_cacheContent1;\n const { runner } = await this.taskExecutor.loadYamlFlowAsPlanning(taskPrompt, null == (_matchedCache_cacheContent = matchedCache.cacheContent) ? void 0 : _matchedCache_cacheContent.yamlWorkflow);\n await this.afterTaskRunning(runner);\n debug('matched cache, will call .runYaml to run the action');\n const yaml = null == (_matchedCache_cacheContent1 = matchedCache.cacheContent) ? void 0 : _matchedCache_cacheContent1.yamlWorkflow;\n return this.runYaml(yaml);\n }\n const { output, runner } = await this.taskExecutor.action(taskPrompt, modelConfig, this.opts.aiActionContext, cacheable);\n if (this.taskCache && (null == output ? void 0 : output.yamlFlow) && false !== cacheable) {\n const yamlContent = {\n tasks: [\n {\n name: taskPrompt,\n flow: output.yamlFlow\n }\n ]\n };\n const yamlFlowStr = js_yaml.dump(yamlContent);\n this.taskCache.updateOrAppendCacheRecord({\n type: 'plan',\n prompt: taskPrompt,\n yamlWorkflow: yamlFlowStr\n }, matchedCache);\n }\n await this.afterTaskRunning(runner);\n return output;\n }\n async aiAction(taskPrompt, opt) {\n return this.aiAct(taskPrompt, opt);\n }\n async aiQuery(demand, opt = defaultInsightExtractOption) {\n const modelConfig = this.modelConfigManager.getModelConfig('VQA');\n const { output, runner } = await this.taskExecutor.createTypeQueryExecution('Query', demand, modelConfig, opt);\n await this.afterTaskRunning(runner);\n return output;\n }\n async aiBoolean(prompt, opt = defaultInsightExtractOption) {\n const modelConfig = this.modelConfigManager.getModelConfig('VQA');\n const { textPrompt, multimodalPrompt } = parsePrompt(prompt);\n const { output, runner } = await this.taskExecutor.createTypeQueryExecution('Boolean', textPrompt, modelConfig, opt, multimodalPrompt);\n await this.afterTaskRunning(runner);\n return output;\n }\n async aiNumber(prompt, opt = defaultInsightExtractOption) {\n const modelConfig = this.modelConfigManager.getModelConfig('VQA');\n const { textPrompt, multimodalPrompt } = parsePrompt(prompt);\n const { output, runner } = await this.taskExecutor.createTypeQueryExecution('Number', textPrompt, modelConfig, opt, multimodalPrompt);\n await this.afterTaskRunning(runner);\n return output;\n }\n async aiString(prompt, opt = defaultInsightExtractOption) {\n const modelConfig = this.modelConfigManager.getModelConfig('VQA');\n const { textPrompt, multimodalPrompt } = parsePrompt(prompt);\n const { output, runner } = await this.taskExecutor.createTypeQueryExecution('String', textPrompt, modelConfig, opt, multimodalPrompt);\n await this.afterTaskRunning(runner);\n return output;\n }\n async aiAsk(prompt, opt = defaultInsightExtractOption) {\n return this.aiString(prompt, opt);\n }\n async describeElementAtPoint(center, opt) {\n const { verifyPrompt = true, retryLimit = 3 } = opt || {};\n let success = false;\n let retryCount = 0;\n let resultPrompt = '';\n let deepThink = (null == opt ? void 0 : opt.deepThink) || false;\n let verifyResult;\n while(!success && retryCount < retryLimit){\n if (retryCount >= 2) deepThink = true;\n debug('aiDescribe', center, 'verifyPrompt', verifyPrompt, 'retryCount', retryCount, 'deepThink', deepThink);\n const modelConfig = this.modelConfigManager.getModelConfig('grounding');\n const text = await this.insight.describe(center, modelConfig, {\n deepThink\n });\n debug('aiDescribe text', text);\n assert(text.description, `failed to describe element at [${center}]`);\n resultPrompt = text.description;\n verifyResult = await this.verifyLocator(resultPrompt, deepThink ? {\n deepThink: true\n } : void 0, center, opt);\n if (verifyResult.pass) success = true;\n else retryCount++;\n }\n return {\n prompt: resultPrompt,\n deepThink,\n verifyResult\n };\n }\n async verifyLocator(prompt, locateOpt, expectCenter, verifyLocateOption) {\n debug('verifyLocator', prompt, locateOpt, expectCenter, verifyLocateOption);\n const { center: verifyCenter, rect: verifyRect } = await this.aiLocate(prompt, locateOpt);\n const distance = distanceOfTwoPoints(expectCenter, verifyCenter);\n const included = includedInRect(expectCenter, verifyRect);\n const pass = distance <= ((null == verifyLocateOption ? void 0 : verifyLocateOption.centerDistanceThreshold) || 20) || included;\n const verifyResult = {\n pass,\n rect: verifyRect,\n center: verifyCenter,\n centerDistance: distance\n };\n debug('aiDescribe verifyResult', verifyResult);\n return verifyResult;\n }\n async aiLocate(prompt, opt) {\n const locateParam = buildDetailedLocateParam(prompt, opt);\n assert(locateParam, 'cannot get locate param for aiLocate');\n const locatePlan = locatePlanForLocate(locateParam);\n const plans = [\n locatePlan\n ];\n const modelConfig = this.modelConfigManager.getModelConfig('grounding');\n const { runner, output } = await this.taskExecutor.runPlans(taskTitleStr('Locate', locateParamStr(locateParam)), plans, modelConfig);\n await this.afterTaskRunning(runner);\n const { element } = output;\n const dprValue = await this.interface.size().dpr;\n const dprEntry = dprValue ? {\n dpr: dprValue\n } : {};\n return {\n rect: null == element ? void 0 : element.rect,\n center: null == element ? void 0 : element.center,\n ...dprEntry\n };\n }\n async aiAssert(assertion, msg, opt) {\n var _runner_latestErrorTask;\n const modelConfig = this.modelConfigManager.getModelConfig('VQA');\n const insightOpt = {\n domIncluded: (null == opt ? void 0 : opt.domIncluded) ?? defaultInsightExtractOption.domIncluded,\n screenshotIncluded: (null == opt ? void 0 : opt.screenshotIncluded) ?? defaultInsightExtractOption.screenshotIncluded,\n doNotThrowError: null == opt ? void 0 : opt.doNotThrowError\n };\n const { textPrompt, multimodalPrompt } = parsePrompt(assertion);\n const { output, runner, thought } = await this.taskExecutor.createTypeQueryExecution('Assert', textPrompt, modelConfig, insightOpt, multimodalPrompt);\n await this.afterTaskRunning(runner, true);\n const message = output ? void 0 : `Assertion failed: ${msg || ('string' == typeof assertion ? assertion : assertion.prompt)}\\nReason: ${thought || (null == (_runner_latestErrorTask = runner.latestErrorTask()) ? void 0 : _runner_latestErrorTask.error) || '(no_reason)'}`;\n if (null == opt ? void 0 : opt.keepRawResponse) return {\n pass: output,\n thought,\n message\n };\n if (!output) throw new Error(message);\n }\n async aiWaitFor(assertion, opt) {\n const modelConfig = this.modelConfigManager.getModelConfig('VQA');\n const { runner } = await this.taskExecutor.waitFor(assertion, {\n timeoutMs: (null == opt ? void 0 : opt.timeoutMs) || 15000,\n checkIntervalMs: (null == opt ? void 0 : opt.checkIntervalMs) || 3000\n }, modelConfig);\n await this.afterTaskRunning(runner, true);\n if (runner.isInErrorState()) {\n const errorTask = runner.latestErrorTask();\n throw new Error(`${null == errorTask ? void 0 : errorTask.error}\\n${null == errorTask ? void 0 : errorTask.errorStack}`);\n }\n }\n async ai(taskPrompt, type = 'action') {\n if ('action' === type) return this.aiAct(taskPrompt);\n if ('query' === type) return this.aiQuery(taskPrompt);\n if ('assert' === type) return this.aiAssert(taskPrompt);\n if ('tap' === type) return this.aiTap(taskPrompt);\n if ('rightClick' === type) return this.aiRightClick(taskPrompt);\n if ('doubleClick' === type) return this.aiDoubleClick(taskPrompt);\n throw new Error(`Unknown type: ${type}, only support 'action', 'query', 'assert', 'tap', 'rightClick', 'doubleClick'`);\n }\n async runYaml(yamlScriptContent) {\n const script = parseYamlScript(yamlScriptContent, 'yaml');\n const player = new ScriptPlayer(script, async ()=>({\n agent: this,\n freeFn: []\n }));\n await player.run();\n if ('error' === player.status) {\n const errors = player.taskStatusList.filter((task)=>'error' === task.status).map((task)=>{\n var _task_error;\n return `task - ${task.name}: ${null == (_task_error = task.error) ? void 0 : _task_error.message}`;\n }).join('\\n');\n throw new Error(`Error(s) occurred in running yaml script:\\n${errors}`);\n }\n return {\n result: player.result\n };\n }\n async evaluateJavaScript(script) {\n assert(this.interface.evaluateJavaScript, 'evaluateJavaScript is not supported in current agent');\n return this.interface.evaluateJavaScript(script);\n }\n async destroy() {\n var _this_interface_destroy, _this_interface;\n if (this.destroyed) return;\n await (null == (_this_interface_destroy = (_this_interface = this.interface).destroy) ? void 0 : _this_interface_destroy.call(_this_interface));\n this.resetDump();\n this.destroyed = true;\n }\n async recordToReport(title, opt) {\n const base64 = await this.interface.screenshotBase64();\n const now = Date.now();\n const recorder = [\n {\n type: 'screenshot',\n ts: now,\n screenshot: base64\n }\n ];\n const task = {\n type: 'Log',\n subType: 'Screenshot',\n status: 'finished',\n recorder,\n timing: {\n start: now,\n end: now,\n cost: 0\n },\n param: {\n content: (null == opt ? void 0 : opt.content) || ''\n },\n executor: async ()=>{}\n };\n const executionDump = {\n logTime: now,\n name: `Log - ${title || 'untitled'}`,\n description: (null == opt ? void 0 : opt.content) || '',\n tasks: [\n task\n ]\n };\n if (this.opts.aiActionContext) executionDump.aiActionContext = this.opts.aiActionContext;\n this.appendExecutionDump(executionDump);\n try {\n var _this_onDumpUpdate, _this;\n null == (_this_onDumpUpdate = (_this = this).onDumpUpdate) || _this_onDumpUpdate.call(_this, this.dumpDataString());\n } catch (error) {\n console.error('Failed to update dump', error);\n }\n this.writeOutActionDumps();\n }\n async logScreenshot(title, opt) {\n await this.recordToReport(title, opt);\n }\n _unstableLogContent() {\n const { groupName, groupDescription, executions } = this.dump;\n const newExecutions = Array.isArray(executions) ? executions.map((execution)=>{\n const { tasks, ...restExecution } = execution;\n let newTasks = tasks;\n if (Array.isArray(tasks)) newTasks = tasks.map((task)=>{\n const { uiContext, log, ...restTask } = task;\n return restTask;\n });\n return {\n ...restExecution,\n ...newTasks ? {\n tasks: newTasks\n } : {}\n };\n }) : [];\n return {\n groupName,\n groupDescription,\n executions: newExecutions\n };\n }\n async freezePageContext() {\n debug('Freezing page context');\n const context = await this._snapshotContext();\n context._isFrozen = true;\n this.frozenUIContext = context;\n debug('Page context frozen successfully');\n }\n async unfreezePageContext() {\n debug('Unfreezing page context');\n this.frozenUIContext = void 0;\n debug('Page context unfrozen successfully');\n }\n processCacheConfig(opts) {\n if (true === opts.cache) throw new Error('cache: true requires an explicit cache ID. Please provide:\\nExample: cache: { id: \"my-cache-id\" }');\n if (opts.cache && 'object' == typeof opts.cache && null !== opts.cache && !opts.cache.id) throw new Error('cache configuration requires an explicit id.\\nExample: cache: { id: \"my-cache-id\" }');\n const cacheConfig = processCacheConfig(opts.cache, opts.cacheId || opts.testId || 'default');\n if (!cacheConfig) return null;\n if ('object' == typeof cacheConfig && null !== cacheConfig) {\n const id = cacheConfig.id;\n const rawStrategy = cacheConfig.strategy;\n let strategyValue;\n if (void 0 === rawStrategy) strategyValue = 'read-write';\n else if ('string' == typeof rawStrategy) strategyValue = rawStrategy;\n else throw new Error(`cache.strategy must be a string when provided, but received type ${typeof rawStrategy}`);\n if (!isValidCacheStrategy(strategyValue)) throw new Error(`cache.strategy must be one of ${CACHE_STRATEGY_VALUES}, but received \"${strategyValue}\"`);\n const isReadOnly = 'read-only' === strategyValue;\n const isWriteOnly = 'write-only' === strategyValue;\n return {\n id,\n enabled: !isWriteOnly,\n readOnly: isReadOnly,\n writeOnly: isWriteOnly\n };\n }\n return null;\n }\n async flushCache(options) {\n if (!this.taskCache) throw new Error('Cache is not configured');\n this.taskCache.flushCacheToFile(options);\n }\n constructor(interfaceInstance, opts){\n _define_property(this, \"interface\", void 0);\n _define_property(this, \"insight\", void 0);\n _define_property(this, \"dump\", void 0);\n _define_property(this, \"reportFile\", void 0);\n _define_property(this, \"reportFileName\", void 0);\n _define_property(this, \"taskExecutor\", void 0);\n _define_property(this, \"opts\", void 0);\n _define_property(this, \"dryMode\", false);\n _define_property(this, \"onTaskStartTip\", void 0);\n _define_property(this, \"taskCache\", void 0);\n _define_property(this, \"onDumpUpdate\", void 0);\n _define_property(this, \"destroyed\", false);\n _define_property(this, \"modelConfigManager\", void 0);\n _define_property(this, \"frozenUIContext\", void 0);\n _define_property(this, \"hasWarnedNonVLModel\", false);\n _define_property(this, \"screenshotScale\", void 0);\n _define_property(this, \"screenshotScalePromise\", void 0);\n this.interface = interfaceInstance;\n this.opts = Object.assign({\n generateReport: true,\n autoPrintReportMsg: true,\n groupName: 'Midscene Report',\n groupDescription: ''\n }, opts || {});\n if ((null == opts ? void 0 : opts.modelConfig) && 'function' != typeof (null == opts ? void 0 : opts.modelConfig)) throw new Error(`opts.modelConfig must be one of function or undefined, but got ${typeof (null == opts ? void 0 : opts.modelConfig)}`);\n this.modelConfigManager = (null == opts ? void 0 : opts.modelConfig) ? new ModelConfigManager(opts.modelConfig, null == opts ? void 0 : opts.createOpenAIClient) : globalModelConfigManager;\n this.onTaskStartTip = this.opts.onTaskStartTip;\n this.insight = new Insight(async ()=>this.getUIContext());\n const cacheConfigObj = this.processCacheConfig(opts || {});\n if (cacheConfigObj) this.taskCache = new TaskCache(cacheConfigObj.id, cacheConfigObj.enabled, void 0, {\n readOnly: cacheConfigObj.readOnly,\n writeOnly: cacheConfigObj.writeOnly\n });\n this.taskExecutor = new TaskExecutor(this.interface, this.insight, {\n taskCache: this.taskCache,\n onTaskStart: this.callbackOnTaskStartTip.bind(this),\n replanningCycleLimit: this.opts.replanningCycleLimit\n });\n this.dump = this.resetDump();\n this.reportFileName = (null == opts ? void 0 : opts.reportFileName) || getReportFileName((null == opts ? void 0 : opts.testId) || this.interface.interfaceType || 'web');\n }\n}\nconst createAgent = (interfaceInstance, opts)=>new Agent(interfaceInstance, opts);\nexport { Agent, createAgent };\n\n//# sourceMappingURL=agent.mjs.map","'use client';\nimport { mousePointer } from \"./index.mjs\";\nimport { paramStr, typeStr } from \"@midscene/core/agent\";\nimport { treeToList } from \"@midscene/shared/extractor\";\nconst stillDuration = 900;\nconst actionSpinningPointerDuration = 300;\nconst stillAfterInsightDuration = 300;\nconst locateDuration = 800;\nconst actionDuration = 1000;\nconst clearInsightDuration = 200;\nconst cameraStateForRect = (rect, imageWidth, imageHeight)=>{\n const canvasRatio = imageWidth / imageHeight;\n const rectRatio = rect.width / rect.height;\n let rectWidthOnPage;\n rectWidthOnPage = rectRatio >= canvasRatio ? rect.width : rect.height / imageHeight * imageWidth;\n const cameraPaddingRatio = rectWidthOnPage > 400 ? 0.1 : rectWidthOnPage > 50 ? 0.2 : 0.3;\n const cameraWidth = Math.min(imageWidth, rectWidthOnPage + imageWidth * cameraPaddingRatio * 2);\n const cameraHeight = imageHeight / imageWidth * cameraWidth;\n let left = Math.min(rect.left - imageWidth * cameraPaddingRatio, imageWidth - cameraWidth);\n left = Math.max(left, 0);\n let top = Math.min(rect.top - imageHeight * cameraPaddingRatio, imageHeight - cameraHeight);\n top = Math.max(top, 0);\n return {\n left: Math.round(left),\n top: Math.round(top),\n width: Math.round(cameraWidth)\n };\n};\nconst mergeTwoCameraState = (cameraState1, cameraState2)=>{\n const newLeft = Math.min(cameraState1.left, cameraState2.left);\n const newTop = Math.min(cameraState1.top, cameraState2.top);\n const newRight = Math.max(cameraState1.left + cameraState1.width, cameraState2.left + cameraState2.width);\n const newWidth = newRight - newLeft;\n return {\n left: newLeft,\n top: newTop,\n width: newWidth\n };\n};\nconst capitalizeFirstLetter = (str)=>{\n if ('string' != typeof str || 0 === str.length) return str;\n return str.charAt(0).toUpperCase() + str.slice(1);\n};\nconst allScriptsFromDump = (dump)=>{\n const dimensionsSet = new Set();\n let firstWidth;\n let firstHeight;\n const sdkVersion = dump.sdkVersion;\n const modelBriefsSet = new Set();\n dump.executions.forEach((execution)=>{\n execution.tasks.forEach((task)=>{\n var _task_uiContext_size, _task_uiContext;\n if (null == (_task_uiContext = task.uiContext) ? void 0 : null == (_task_uiContext_size = _task_uiContext.size) ? void 0 : _task_uiContext_size.width) {\n const w = task.uiContext.size.width;\n const h = task.uiContext.size.height;\n if (!firstWidth) {\n firstWidth = w;\n firstHeight = h;\n }\n dimensionsSet.add(`${w}x${h}`);\n }\n });\n });\n if (!firstWidth || !firstHeight) {\n console.warn('width or height is missing in dump file');\n return {\n scripts: [],\n sdkVersion,\n modelBriefs: []\n };\n }\n const allScripts = [];\n dump.executions.forEach((execution)=>{\n const scripts = generateAnimationScripts(execution, -1, firstWidth, firstHeight);\n if (scripts) allScripts.push(...scripts);\n execution.tasks.forEach((task)=>{\n if (task.usage) {\n const { model_name, model_description, intent } = task.usage;\n if (intent && model_name) modelBriefsSet.add(model_description ? `${capitalizeFirstLetter(intent)}/${model_name}(${model_description})` : model_name);\n }\n });\n });\n const allScriptsWithoutIntermediateDoneFrame = allScripts.filter((script, index)=>{\n if (index !== allScripts.length - 1 && 'Done' === script.title) return false;\n return true;\n });\n const modelBriefs = (()=>{\n var _list_;\n const list = [\n ...modelBriefsSet\n ];\n if (!list.length) return list;\n const firstOneInfo = null == (_list_ = list[0]) ? void 0 : _list_.split('/', 2)[1];\n if (firstOneInfo && list.slice(1).every((item)=>(null == item ? void 0 : item.split('/', 2)[1]) === firstOneInfo)) return [\n firstOneInfo\n ];\n return list;\n })();\n return {\n scripts: allScriptsWithoutIntermediateDoneFrame,\n width: firstWidth,\n height: firstHeight,\n sdkVersion,\n modelBriefs\n };\n};\nconst generateAnimationScripts = (execution, task, imageWidth, imageHeight)=>{\n if (!execution || !execution.tasks.length) return null;\n if (0 === imageWidth || 0 === imageHeight) return null;\n let tasksIncluded = [];\n if (-1 === task) tasksIncluded = execution.tasks;\n else {\n const startIndex = execution.tasks.findIndex((t)=>t === task);\n if (-1 === startIndex) {\n console.error(\"task not found, cannot generate animation scripts\");\n return null;\n }\n if (startIndex === execution.tasks.length - 1) return null;\n for(let i = startIndex; i < execution.tasks.length; i++){\n if (i > startIndex && 'Planning' === execution.tasks[i].type) break;\n tasksIncluded.push(execution.tasks[i]);\n }\n }\n if (0 === tasksIncluded.length) return null;\n const fullPageCameraState = cameraStateForRect({\n left: 0,\n top: 0,\n width: imageWidth,\n height: imageHeight\n }, imageWidth, imageHeight);\n const pointerScript = (img, title, subTitle)=>({\n type: 'pointer',\n img,\n duration: 0,\n title,\n subTitle\n });\n const scripts = [];\n let insightCameraState;\n let currentCameraState = fullPageCameraState;\n let insightOnTop = false;\n const taskCount = tasksIncluded.length;\n let initSubTitle = '';\n let errorStateFlag = false;\n tasksIncluded.forEach((task, index)=>{\n if (errorStateFlag) return;\n if (0 === index) initSubTitle = paramStr(task);\n if ('Planning' === task.type) {\n const planningTask = task;\n if (planningTask.recorder && planningTask.recorder.length > 0) {\n var _planningTask_recorder_, _planningTask_recorder, _task_uiContext_size, _task_uiContext, _task_uiContext_size1, _task_uiContext1;\n scripts.push({\n type: 'img',\n img: null == (_planningTask_recorder = planningTask.recorder) ? void 0 : null == (_planningTask_recorder_ = _planningTask_recorder[0]) ? void 0 : _planningTask_recorder_.screenshot,\n camera: 0 === index ? fullPageCameraState : void 0,\n duration: stillDuration,\n title: typeStr(task),\n subTitle: paramStr(task),\n imageWidth: (null == (_task_uiContext = task.uiContext) ? void 0 : null == (_task_uiContext_size = _task_uiContext.size) ? void 0 : _task_uiContext_size.width) || imageWidth,\n imageHeight: (null == (_task_uiContext1 = task.uiContext) ? void 0 : null == (_task_uiContext_size1 = _task_uiContext1.size) ? void 0 : _task_uiContext_size1.height) || imageHeight\n });\n }\n } else if ('Insight' === task.type && 'Locate' === task.subType) {\n var _insightTask_output;\n const insightTask = task;\n const resultElement = null == (_insightTask_output = insightTask.output) ? void 0 : _insightTask_output.element;\n const title = typeStr(task);\n const subTitle = paramStr(task);\n if (null == resultElement ? void 0 : resultElement.rect) insightCameraState = {\n ...cameraStateForRect(resultElement.rect, imageWidth, imageHeight),\n pointerLeft: resultElement.center[0],\n pointerTop: resultElement.center[1]\n };\n const context = insightTask.uiContext;\n if (null == context ? void 0 : context.screenshotBase64) {\n var _insightTask_output1, _insightDump_taskInfo, _context_size, _context_size1;\n const insightDump = insightTask.log;\n const insightContentLength = context.tree ? treeToList(context.tree).length : 0;\n if (context.screenshotBase64) {\n var _context_size2, _context_size3;\n scripts.push({\n type: 'img',\n img: context.screenshotBase64,\n duration: stillAfterInsightDuration,\n title,\n subTitle,\n imageWidth: (null == (_context_size2 = context.size) ? void 0 : _context_size2.width) || imageWidth,\n imageHeight: (null == (_context_size3 = context.size) ? void 0 : _context_size3.height) || imageHeight\n });\n }\n let cameraState;\n cameraState = currentCameraState === fullPageCameraState ? void 0 : insightCameraState ? mergeTwoCameraState(currentCameraState, insightCameraState) : void 0;\n scripts.push({\n type: 'insight',\n img: context.screenshotBase64,\n context: context,\n camera: cameraState,\n highlightElement: (null == (_insightTask_output1 = insightTask.output) ? void 0 : _insightTask_output1.element) || void 0,\n searchArea: null == insightDump ? void 0 : null == (_insightDump_taskInfo = insightDump.taskInfo) ? void 0 : _insightDump_taskInfo.searchArea,\n duration: insightContentLength > 20 ? locateDuration : 0.5 * locateDuration,\n insightCameraDuration: locateDuration,\n title,\n subTitle,\n imageWidth: (null == (_context_size = context.size) ? void 0 : _context_size.width) || imageWidth,\n imageHeight: (null == (_context_size1 = context.size) ? void 0 : _context_size1.height) || imageHeight\n });\n scripts.push({\n type: 'sleep',\n duration: stillAfterInsightDuration,\n title,\n subTitle\n });\n insightOnTop = true;\n }\n } else if ('Action' === task.type && 'FalsyConditionStatement' !== task.subType) {\n var _task_recorder_, _task_recorder, _task_uiContext_size2, _task_uiContext2, _task_uiContext_size3, _task_uiContext3, _task_recorder_1, _task_recorder1;\n const title = typeStr(task);\n const subTitle = paramStr(task);\n scripts.push(pointerScript(mousePointer, title, subTitle));\n currentCameraState = null != insightCameraState ? insightCameraState : fullPageCameraState;\n scripts.push({\n type: 'img',\n img: null == (_task_recorder = task.recorder) ? void 0 : null == (_task_recorder_ = _task_recorder[0]) ? void 0 : _task_recorder_.screenshot,\n duration: actionDuration,\n camera: 'Sleep' === task.subType ? fullPageCameraState : insightCameraState,\n title,\n subTitle,\n imageWidth: (null == (_task_uiContext2 = task.uiContext) ? void 0 : null == (_task_uiContext_size2 = _task_uiContext2.size) ? void 0 : _task_uiContext_size2.width) || imageWidth,\n imageHeight: (null == (_task_uiContext3 = task.uiContext) ? void 0 : null == (_task_uiContext_size3 = _task_uiContext3.size) ? void 0 : _task_uiContext_size3.height) || imageHeight\n });\n if (insightOnTop) {\n scripts.push({\n type: 'clear-insight',\n duration: clearInsightDuration,\n title,\n subTitle\n });\n insightOnTop = false;\n }\n const imgStillDuration = index < taskCount - 1 ? stillDuration : 0;\n if (null == (_task_recorder1 = task.recorder) ? void 0 : null == (_task_recorder_1 = _task_recorder1[1]) ? void 0 : _task_recorder_1.screenshot) {\n var _task_recorder_2, _task_recorder2, _task_uiContext_size4, _task_uiContext4, _task_uiContext_size5, _task_uiContext5;\n scripts.push({\n type: 'spinning-pointer',\n duration: actionSpinningPointerDuration,\n title,\n subTitle\n });\n scripts.push(pointerScript(mousePointer, title, subTitle));\n scripts.push({\n type: 'img',\n img: null == (_task_recorder2 = task.recorder) ? void 0 : null == (_task_recorder_2 = _task_recorder2[1]) ? void 0 : _task_recorder_2.screenshot,\n duration: imgStillDuration,\n title,\n subTitle,\n imageWidth: (null == (_task_uiContext4 = task.uiContext) ? void 0 : null == (_task_uiContext_size4 = _task_uiContext4.size) ? void 0 : _task_uiContext_size4.width) || imageWidth,\n imageHeight: (null == (_task_uiContext5 = task.uiContext) ? void 0 : null == (_task_uiContext_size5 = _task_uiContext5.size) ? void 0 : _task_uiContext_size5.height) || imageHeight\n });\n } else scripts.push({\n type: 'sleep',\n duration: imgStillDuration,\n title,\n subTitle\n });\n } else {\n var _task_recorder_3, _task_recorder3;\n const title = typeStr(task);\n const subTitle = paramStr(task);\n const screenshot = null == (_task_recorder3 = task.recorder) ? void 0 : null == (_task_recorder_3 = _task_recorder3[task.recorder.length - 1]) ? void 0 : _task_recorder_3.screenshot;\n if (screenshot) {\n var _task_uiContext_size6, _task_uiContext6, _task_uiContext_size7, _task_uiContext7;\n scripts.push({\n type: 'img',\n img: screenshot,\n duration: stillDuration,\n camera: fullPageCameraState,\n title,\n subTitle,\n imageWidth: (null == (_task_uiContext6 = task.uiContext) ? void 0 : null == (_task_uiContext_size6 = _task_uiContext6.size) ? void 0 : _task_uiContext_size6.width) || imageWidth,\n imageHeight: (null == (_task_uiContext7 = task.uiContext) ? void 0 : null == (_task_uiContext_size7 = _task_uiContext7.size) ? void 0 : _task_uiContext_size7.height) || imageHeight\n });\n }\n }\n if ('finished' !== task.status) {\n var _task_uiContext_size8, _task_uiContext8, _task_uiContext_size9, _task_uiContext9;\n errorStateFlag = true;\n const errorTitle = typeStr(task);\n const errorMsg = task.errorMessage || 'unknown error';\n const errorSubTitle = errorMsg.indexOf('NOT_IMPLEMENTED_AS_DESIGNED') > 0 ? 'Further actions cannot be performed in the current environment' : errorMsg;\n scripts.push({\n type: 'img',\n img: task.recorder && task.recorder.length > 0 ? task.recorder[task.recorder.length - 1].screenshot : '',\n camera: fullPageCameraState,\n duration: stillDuration,\n title: errorTitle,\n subTitle: errorSubTitle,\n imageWidth: (null == (_task_uiContext8 = task.uiContext) ? void 0 : null == (_task_uiContext_size8 = _task_uiContext8.size) ? void 0 : _task_uiContext_size8.width) || imageWidth,\n imageHeight: (null == (_task_uiContext9 = task.uiContext) ? void 0 : null == (_task_uiContext_size9 = _task_uiContext9.size) ? void 0 : _task_uiContext_size9.height) || imageHeight\n });\n return;\n }\n });\n if (!errorStateFlag) scripts.push({\n title: 'Done',\n subTitle: initSubTitle,\n type: 'img',\n duration: stillDuration,\n camera: fullPageCameraState\n });\n return scripts;\n};\nexport { allScriptsFromDump, cameraStateForRect, generateAnimationScripts, mergeTwoCameraState };\n","function _define_property(obj, key, value) {\n if (key in obj) Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n else obj[key] = value;\n return obj;\n}\nclass IndexedDBManager {\n initDB() {\n return new Promise((resolve, reject)=>{\n const request = indexedDB.open(this.dbName, this.version);\n request.onerror = ()=>reject(request.error);\n request.onsuccess = ()=>resolve(request.result);\n request.onupgradeneeded = (event)=>{\n const db = event.target.result;\n this.storeConfigs.forEach(({ name, keyPath })=>{\n if (!db.objectStoreNames.contains(name)) {\n const store = db.createObjectStore(name, {\n keyPath\n });\n store.createIndex('timestamp', 'timestamp', {\n unique: false\n });\n }\n });\n };\n });\n }\n async withTransaction(storeNames, mode, operation) {\n const db = await this.dbPromise;\n const transaction = db.transaction(storeNames, mode);\n const stores = Array.isArray(storeNames) ? storeNames.map((name)=>transaction.objectStore(name)) : transaction.objectStore(storeNames);\n return operation(stores);\n }\n promisifyRequest(request) {\n return new Promise((resolve, reject)=>{\n request.onsuccess = ()=>resolve(request.result);\n request.onerror = ()=>reject(request.error);\n });\n }\n async put(storeName, data) {\n await this.withTransaction(storeName, 'readwrite', async (store)=>{\n await this.promisifyRequest(store.put(data));\n });\n }\n async get(storeName, key) {\n return this.withTransaction(storeName, 'readonly', async (store)=>this.promisifyRequest(store.get(key)));\n }\n async getAll(storeName, sortByTimestamp = true) {\n return this.withTransaction(storeName, 'readonly', async (store)=>{\n const objectStore = store;\n const results = sortByTimestamp ? await this.promisifyRequest(objectStore.index('timestamp').getAll()) : await this.promisifyRequest(objectStore.getAll());\n return sortByTimestamp ? results.sort((a, b)=>a.timestamp - b.timestamp) : results;\n });\n }\n async clear(storeName) {\n await this.withTransaction(storeName, 'readwrite', async (store)=>{\n await this.promisifyRequest(store.clear());\n });\n }\n async delete(storeName, key) {\n await this.withTransaction(storeName, 'readwrite', async (store)=>{\n await this.promisifyRequest(store.delete(key));\n });\n }\n async count(storeName) {\n return this.withTransaction(storeName, 'readonly', async (store)=>this.promisifyRequest(store.count()));\n }\n getDBPromise() {\n return this.dbPromise;\n }\n constructor(dbName, version, storeConfigs){\n _define_property(this, \"dbPromise\", void 0);\n _define_property(this, \"dbName\", void 0);\n _define_property(this, \"version\", void 0);\n _define_property(this, \"storeConfigs\", void 0);\n this.dbName = dbName;\n this.version = version;\n this.storeConfigs = storeConfigs;\n this.dbPromise = this.initDB();\n }\n}\nconst withErrorHandling = async (operation, errorMessage, defaultValue, onQuotaExceeded)=>{\n try {\n return await operation();\n } catch (e) {\n console.error(errorMessage, e);\n if (e instanceof Error && 'QuotaExceededError' === e.name && onQuotaExceeded) {\n console.log('Storage quota exceeded, running cleanup...');\n await onQuotaExceeded();\n }\n return defaultValue;\n }\n};\nconst createCleanupFunction = (dbManager, storeName, maxItems)=>async ()=>{\n try {\n const results = await dbManager.getAll(storeName);\n if (results.length > maxItems) {\n const toDelete = results.sort((a, b)=>a.timestamp - b.timestamp).slice(0, results.length - maxItems);\n await Promise.all(toDelete.map((item)=>dbManager.delete(storeName, item.id)));\n }\n } catch (e) {\n console.error(`Failed to cleanup ${storeName}:`, e);\n }\n };\nexport { IndexedDBManager, createCleanupFunction, withErrorHandling };\n","import { IndexedDBManager, createCleanupFunction, withErrorHandling } from \"@midscene/shared/baseDB\";\nfunction _define_property(obj, key, value) {\n if (key in obj) Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n else obj[key] = value;\n return obj;\n}\nconst DB_NAME = 'midscene_playground';\nconst DB_VERSION = 1;\nconst MESSAGES_STORE = 'playground_messages';\nconst RESULTS_STORE = 'playground_results';\nconst MAX_STORED_MESSAGES = 100;\nconst MAX_STORED_RESULTS = 50;\nclass IndexedDBStorageProvider {\n async saveMessages(messages) {\n await withErrorHandling(async ()=>{\n await this.dbManager.clear(MESSAGES_STORE);\n const messagesToSave = messages.slice(-MAX_STORED_MESSAGES);\n await Promise.all(messagesToSave.map((msg, index)=>{\n const lightMessage = {\n ...msg,\n result: void 0\n };\n const data = {\n id: msg.id || `msg-${index}`,\n data: lightMessage,\n timestamp: msg.timestamp ? msg.timestamp.getTime() : Date.now() + index\n };\n return this.dbManager.put(MESSAGES_STORE, data);\n }));\n }, 'Failed to save messages to IndexedDB', void 0, this.messagesCleanup);\n }\n async loadMessages() {\n const result = await withErrorHandling(async ()=>{\n const messages = await this.dbManager.getAll(MESSAGES_STORE, true);\n if (0 === messages.length) return [];\n return Promise.all(messages.map(async (msg)=>{\n const item = msg.data;\n const restoredItem = {\n ...item,\n timestamp: new Date(item.timestamp)\n };\n if ('result' === item.type && item.id) {\n const fullResult = await this.loadResult(item.id);\n if (fullResult) {\n restoredItem.result = fullResult.result;\n restoredItem.replayScriptsInfo = fullResult.replayScriptsInfo;\n restoredItem.replayCounter = fullResult.replayCounter;\n restoredItem.verticalMode = fullResult.verticalMode;\n }\n }\n return restoredItem;\n }));\n }, 'Failed to load messages from IndexedDB', [], this.messagesCleanup);\n return result || [];\n }\n async clearMessages() {\n await withErrorHandling(async ()=>{\n await Promise.all([\n this.dbManager.clear(MESSAGES_STORE),\n this.dbManager.clear(RESULTS_STORE)\n ]);\n }, 'Failed to clear messages from IndexedDB');\n }\n async saveResult(id, result) {\n await withErrorHandling(async ()=>{\n const compressedResult = this.compressResultForStorage(result);\n const data = {\n id,\n data: compressedResult,\n timestamp: Date.now(),\n size: JSON.stringify(compressedResult).length\n };\n await this.dbManager.put(RESULTS_STORE, data);\n }, 'Failed to save result to IndexedDB', void 0, this.resultsCleanup);\n }\n async loadResult(id) {\n const result = await withErrorHandling(async ()=>{\n const data = await this.dbManager.get(RESULTS_STORE, id);\n return (null == data ? void 0 : data.data) || null;\n }, 'Failed to load result from IndexedDB', null);\n return result || null;\n }\n compressResultForStorage(result) {\n var _result_result_dump, _result_result;\n if (!(null == (_result_result = result.result) ? void 0 : null == (_result_result_dump = _result_result.dump) ? void 0 : _result_result_dump.executions)) return result;\n const compressedExecutions = result.result.dump.executions.map((execution)=>{\n var _execution_tasks;\n return {\n ...execution,\n tasks: (null == (_execution_tasks = execution.tasks) ? void 0 : _execution_tasks.map((task)=>{\n var _task_recorder;\n var _this_compressScreenshotIfNeeded;\n return {\n ...task,\n uiContext: task.uiContext ? {\n ...task.uiContext,\n screenshotBase64: null != (_this_compressScreenshotIfNeeded = this.compressScreenshotIfNeeded(task.uiContext.screenshotBase64)) ? _this_compressScreenshotIfNeeded : task.uiContext.screenshotBase64\n } : task.uiContext,\n recorder: null == (_task_recorder = task.recorder) ? void 0 : _task_recorder.map((record)=>({\n ...record,\n screenshot: this.compressScreenshotIfNeeded(record.screenshot)\n }))\n };\n })) || []\n };\n });\n return {\n ...result,\n result: {\n ...result.result,\n dump: {\n ...result.result.dump,\n executions: compressedExecutions\n }\n }\n };\n }\n compressScreenshotIfNeeded(screenshot) {\n if (!screenshot) return screenshot;\n if (screenshot.length > 1048576) {\n const sizeKB = Math.round(screenshot.length / 1024);\n return `[COMPRESSED: ${sizeKB}KB screenshot removed for storage]`;\n }\n return screenshot;\n }\n async getStorageStats() {\n const result = await withErrorHandling(async ()=>{\n const [messageCount, resultCount] = await Promise.all([\n this.dbManager.count(MESSAGES_STORE),\n this.dbManager.count(RESULTS_STORE)\n ]);\n return {\n messageCount,\n resultCount\n };\n }, 'Failed to get storage statistics', {\n messageCount: 0,\n resultCount: 0\n });\n return result || {\n messageCount: 0,\n resultCount: 0\n };\n }\n async cleanup() {\n await Promise.all([\n this.messagesCleanup(),\n this.resultsCleanup()\n ]);\n }\n constructor(namespace = 'playground'){\n _define_property(this, \"dbManager\", void 0);\n _define_property(this, \"namespace\", void 0);\n _define_property(this, \"messagesCleanup\", void 0);\n _define_property(this, \"resultsCleanup\", void 0);\n this.namespace = namespace;\n this.dbManager = new IndexedDBManager(`${DB_NAME}_${namespace}`, DB_VERSION, [\n {\n name: MESSAGES_STORE,\n keyPath: 'id'\n },\n {\n name: RESULTS_STORE,\n keyPath: 'id'\n }\n ]);\n this.messagesCleanup = createCleanupFunction(this.dbManager, MESSAGES_STORE, MAX_STORED_MESSAGES);\n this.resultsCleanup = createCleanupFunction(this.dbManager, RESULTS_STORE, MAX_STORED_RESULTS);\n }\n}\nclass MemoryStorageProvider {\n async saveMessages(messages) {\n this.messages = [\n ...messages\n ];\n }\n async loadMessages() {\n return [\n ...this.messages\n ];\n }\n async clearMessages() {\n this.messages = [];\n this.results.clear();\n }\n async saveResult(id, result) {\n this.results.set(id, result);\n }\n constructor(){\n _define_property(this, \"messages\", []);\n _define_property(this, \"results\", new Map());\n }\n}\nclass NoOpStorageProvider {\n async saveMessages(_messages) {}\n async loadMessages() {\n return [];\n }\n async clearMessages() {}\n async saveResult(_id, _result) {}\n}\nexport { IndexedDBStorageProvider, MemoryStorageProvider, NoOpStorageProvider };\n","import { IndexedDBStorageProvider, MemoryStorageProvider, NoOpStorageProvider } from \"./indexeddb-storage-provider.mjs\";\nfunction _define_property(obj, key, value) {\n if (key in obj) Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n else obj[key] = value;\n return obj;\n}\nclass LocalStorageProvider {\n checkStorageSpace() {\n try {\n const testKey = 'storage-test';\n const testData = 'x'.repeat(102400);\n localStorage.setItem(testKey, testData);\n localStorage.removeItem(testKey);\n return true;\n } catch (e) {\n return false;\n }\n }\n async saveMessages(messages) {\n try {\n if (!this.checkStorageSpace()) {\n console.warn('Low storage space detected, clearing old data...');\n await this.handleQuotaExceeded();\n }\n const messagesToSave = messages.slice(-this.maxStorageItems);\n const lightMessages = messagesToSave.map((msg)=>({\n ...msg,\n result: void 0\n }));\n const messageData = JSON.stringify(lightMessages);\n localStorage.setItem(this.messagesKey, messageData);\n } catch (error) {\n if (error instanceof DOMException && 'QuotaExceededError' === error.name) {\n console.warn('LocalStorage quota exceeded, attempting to clear old data and retry...');\n await this.handleQuotaExceeded();\n try {\n const recentMessages = messages.slice(-10);\n const lightRecentMessages = recentMessages.map((msg)=>({\n ...msg,\n result: void 0\n }));\n const messageData = JSON.stringify(lightRecentMessages);\n localStorage.setItem(this.messagesKey, messageData);\n console.info('Successfully saved recent messages after clearing storage');\n } catch (retryError) {\n console.error('Failed to save even after clearing storage:', retryError);\n await this.clearMessages();\n }\n } else console.error('Failed to save messages to localStorage:', error);\n }\n }\n async loadMessages() {\n try {\n const stored = localStorage.getItem(this.messagesKey);\n if (!stored) return [];\n const messages = JSON.parse(stored);\n const restoredMessages = await Promise.all(messages.map(async (msg)=>{\n if ('result' === msg.type && msg.id) {\n const resultKey = `${this.resultsKey}-${msg.id}`;\n const storedResult = localStorage.getItem(resultKey);\n if (storedResult) try {\n const resultItem = JSON.parse(storedResult);\n return {\n ...msg,\n ...resultItem\n };\n } catch (e) {\n console.warn('Failed to parse stored result:', e);\n }\n }\n return msg;\n }));\n return restoredMessages;\n } catch (error) {\n console.error('Failed to load messages from localStorage:', error);\n return [];\n }\n }\n async clearMessages() {\n try {\n localStorage.removeItem(this.messagesKey);\n const keys = Object.keys(localStorage);\n keys.forEach((key)=>{\n if (key.startsWith(this.resultsKey)) localStorage.removeItem(key);\n });\n } catch (error) {\n console.error('Failed to clear messages from localStorage:', error);\n }\n }\n async saveResult(id, result) {\n try {\n const resultKey = `${this.resultsKey}-${id}`;\n localStorage.setItem(resultKey, JSON.stringify(result));\n } catch (error) {\n if (error instanceof DOMException && 'QuotaExceededError' === error.name) {\n console.warn('LocalStorage quota exceeded when saving result, clearing old results...');\n await this.handleQuotaExceeded();\n try {\n const resultKey = `${this.resultsKey}-${id}`;\n localStorage.setItem(resultKey, JSON.stringify(result));\n } catch (retryError) {\n console.error('Failed to save result even after clearing storage:', retryError);\n }\n } else console.error('Failed to save result to localStorage:', error);\n }\n }\n async handleQuotaExceeded() {\n try {\n const keys = Object.keys(localStorage);\n const resultKeys = keys.filter((key)=>key.startsWith(this.resultsKey));\n const keysToRemove = resultKeys.slice(0, Math.max(1, Math.floor(resultKeys.length / 2)));\n keysToRemove.forEach((key)=>{\n localStorage.removeItem(key);\n });\n console.info(`Cleared ${keysToRemove.length} old result entries to free up storage space`);\n const playgroundKeys = keys.filter((key)=>key.includes('playground') || key.includes('agent') || key.startsWith('midscene'));\n if (playgroundKeys.length > 10) {\n const additionalKeysToRemove = playgroundKeys.slice(0, Math.floor(playgroundKeys.length / 3));\n additionalKeysToRemove.forEach((key)=>{\n if (key !== this.messagesKey) localStorage.removeItem(key);\n });\n console.info(`Cleared ${additionalKeysToRemove.length} additional playground-related entries`);\n }\n } catch (error) {\n console.error('Failed to handle quota exceeded:', error);\n }\n }\n constructor(namespace = 'playground'){\n _define_property(this, \"messagesKey\", void 0);\n _define_property(this, \"resultsKey\", void 0);\n _define_property(this, \"maxStorageItems\", 50);\n this.messagesKey = `${namespace}-messages`;\n this.resultsKey = `${namespace}-results`;\n }\n}\nclass storage_provider_MemoryStorageProvider {\n async saveMessages(messages) {\n this.messages = [\n ...messages\n ];\n }\n async loadMessages() {\n return [\n ...this.messages\n ];\n }\n async clearMessages() {\n this.messages = [];\n this.results.clear();\n }\n async saveResult(id, result) {\n this.results.set(id, result);\n }\n constructor(){\n _define_property(this, \"messages\", []);\n _define_property(this, \"results\", new Map());\n }\n}\nclass storage_provider_NoOpStorageProvider {\n async saveMessages(_messages) {}\n async loadMessages() {\n return [];\n }\n async clearMessages() {}\n async saveResult(_id, _result) {}\n}\nvar storage_provider_StorageType = /*#__PURE__*/ function(StorageType) {\n StorageType[\"INDEXEDDB\"] = \"indexeddb\";\n StorageType[\"LOCALSTORAGE\"] = \"localStorage\";\n StorageType[\"MEMORY\"] = \"memory\";\n StorageType[\"NONE\"] = \"none\";\n return StorageType;\n}({});\nfunction createStorageProvider() {\n let type = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : \"indexeddb\", namespace = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : 'playground';\n switch(type){\n case \"indexeddb\":\n if ('undefined' != typeof indexedDB) return new IndexedDBStorageProvider(namespace);\n console.warn('IndexedDB not available, falling back to localStorage');\n return createStorageProvider(\"localStorage\", namespace);\n case \"localStorage\":\n if ('undefined' != typeof localStorage) return new LocalStorageProvider(namespace);\n console.warn('localStorage not available, falling back to memory storage');\n return createStorageProvider(\"memory\", namespace);\n case \"memory\":\n return new storage_provider_MemoryStorageProvider();\n case \"none\":\n return new storage_provider_NoOpStorageProvider();\n default:\n throw new Error(`Unknown storage type: ${type}`);\n }\n}\nfunction detectBestStorageType() {\n if ('undefined' != typeof indexedDB) try {\n indexedDB.open('test', 1).onerror = ()=>{};\n return \"indexeddb\";\n } catch (e) {}\n if ('undefined' != typeof localStorage) try {\n localStorage.setItem('test', 'test');\n localStorage.removeItem('test');\n return \"localStorage\";\n } catch (e) {}\n return \"memory\";\n}\nexport { MemoryStorageProvider as IndexedDBMemoryStorageProvider, NoOpStorageProvider as IndexedDBNoOpStorageProvider, IndexedDBStorageProvider, LocalStorageProvider, storage_provider_MemoryStorageProvider as MemoryStorageProvider, storage_provider_NoOpStorageProvider as NoOpStorageProvider, storage_provider_StorageType as StorageType, createStorageProvider, detectBestStorageType };\n","'use client';\nimport { jsx, jsxs } from \"react/jsx-runtime\";\nimport \"pixi.js/unsafe-eval\";\nimport { Checkbox } from \"antd\";\nimport { Application, Container, Graphics, Rectangle, Sprite, Text, Texture } from \"pixi.js\";\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport { colorForName, highlightColorForType } from \"../../utils/color.mjs\";\nimport \"./index.css\";\nimport { treeToList } from \"@midscene/shared/extractor\";\nimport { DropShadowFilter } from \"pixi-filters\";\nimport { useBlackboardPreference } from \"../../store/store.mjs\";\nconst itemFillAlpha = 0.4;\nconst highlightAlpha = 0.4;\nconst pointRadius = 10;\nconst pointMarkForItem = (point, type)=>{\n const [x, y] = point;\n const themeColor = highlightColorForType('element');\n const graphics = new Graphics();\n graphics.beginFill(themeColor, itemFillAlpha);\n graphics.drawCircle(x, y, pointRadius);\n graphics.endFill();\n return graphics;\n};\nconst rectMarkForItem = (rect, name, type)=>{\n const { left, top, width, height } = rect;\n let themeColor;\n themeColor = 'element' === type ? colorForName(name) : 'searchArea' === type ? highlightColorForType('searchArea') : highlightColorForType('element');\n const alpha = 'highlight' === type ? highlightAlpha : itemFillAlpha;\n const graphics = new Graphics();\n graphics.beginFill(themeColor, alpha);\n graphics.lineStyle(1, themeColor, 1);\n graphics.drawRect(left, top, width, height);\n graphics.endFill();\n const dropShadowFilter = new DropShadowFilter({\n blur: 2,\n quality: 3,\n alpha: 0.4,\n offset: {\n x: 4,\n y: 4\n },\n color: 0x333333\n });\n graphics.filters = [\n dropShadowFilter\n ];\n const nameFontSize = 18;\n if (!name) return [\n graphics\n ];\n const texts = new Text(name, {\n fontSize: nameFontSize,\n fill: 0x0\n });\n texts.x = left;\n texts.y = Math.max(top - (nameFontSize + 4), 0);\n return [\n graphics,\n texts\n ];\n};\nconst Blackboard = (props)=>{\n const highlightElements = props.highlightElements || [];\n const highlightIds = highlightElements.map((e)=>e.id);\n const highlightRect = props.highlightRect;\n const highlightPoints = props.highlightPoints;\n const context = props.uiContext;\n const { size, screenshotBase64 } = context;\n const screenWidth = size.width;\n const screenHeight = size.height;\n const domRef = useRef(null);\n const app = useMemo(()=>new Application(), []);\n const [appInitialed, setAppInitialed] = useState(false);\n const highlightContainer = useMemo(()=>new Container(), []);\n const elementMarkContainer = useMemo(()=>new Container(), []);\n const [hoverElement, setHoverElement] = useState(null);\n const pixiBgRef = useRef(void 0);\n const { backgroundVisible, setBackgroundVisible, elementsVisible, setElementsVisible } = useBlackboardPreference();\n useEffect(()=>{\n Promise.resolve((async ()=>{\n if (!domRef.current || !screenWidth) return;\n await app.init({\n width: screenWidth,\n height: screenHeight,\n background: 0xffffff\n });\n const canvasEl = domRef.current;\n domRef.current.appendChild(app.canvas);\n const { clientWidth } = domRef.current.parentElement;\n const targetHeight = 0.6 * window.innerHeight;\n const viewportRatio = clientWidth / targetHeight;\n if (screenWidth / screenHeight <= viewportRatio) {\n const ratio = targetHeight / screenHeight;\n canvasEl.style.width = `${Math.floor(screenWidth * ratio)}px`;\n canvasEl.style.height = `${Math.floor(screenHeight * ratio)}px`;\n }\n app.stage.addChild(highlightContainer);\n app.stage.addChild(elementMarkContainer);\n setAppInitialed(true);\n })());\n return ()=>{\n console.log('will destroy');\n try {\n app.destroy(true, {\n children: true,\n texture: true\n });\n } catch (e) {\n console.warn('destroy failed', e);\n }\n };\n }, [\n app,\n screenWidth,\n screenHeight\n ]);\n useEffect(()=>{\n if (!appInitialed) return;\n app.stage.eventMode = 'static';\n app.stage.hitArea = new Rectangle(0, 0, screenWidth, screenHeight);\n const clickHandler = (event)=>{\n var _props_onCanvasClick;\n console.log('pixi click', event);\n const { x, y } = event.data.global;\n null == (_props_onCanvasClick = props.onCanvasClick) || _props_onCanvasClick.call(props, [\n Math.round(x),\n Math.round(y)\n ]);\n };\n app.stage.on('click', clickHandler);\n return ()=>{\n var _app_stage;\n null == app || null == (_app_stage = app.stage) || _app_stage.off('click');\n };\n }, [\n appInitialed,\n props.onCanvasClick,\n screenWidth,\n screenHeight\n ]);\n useEffect(()=>{\n if (!appInitialed) return;\n const img = new Image();\n img.onload = ()=>{\n if (!app.stage) return;\n const screenshotTexture = Texture.from(img);\n const backgroundSprite = new Sprite(screenshotTexture);\n backgroundSprite.x = 0;\n backgroundSprite.y = 0;\n backgroundSprite.width = screenWidth;\n backgroundSprite.height = screenHeight;\n backgroundSprite.eventMode = 'passive';\n app.stage.addChildAt(backgroundSprite, 0);\n pixiBgRef.current = backgroundSprite;\n backgroundSprite.visible = backgroundVisible;\n };\n img.onerror = (e)=>{\n console.error('load screenshot failed', e);\n };\n img.src = screenshotBase64;\n }, [\n app.stage,\n appInitialed,\n screenWidth,\n screenHeight\n ]);\n const { highlightElementRects } = useMemo(()=>{\n const highlightElementRects = [];\n highlightContainer.removeChildren();\n elementMarkContainer.removeChildren();\n highlightContainer.eventMode = 'passive';\n elementMarkContainer.eventMode = 'passive';\n if (highlightRect) {\n const [graphics] = rectMarkForItem(highlightRect, 'Search Area', 'searchArea');\n highlightContainer.addChild(graphics);\n }\n if (highlightElements.length) highlightElements.forEach((element)=>{\n const { rect, content, id } = element;\n const [graphics] = rectMarkForItem(rect, content, 'highlight');\n highlightContainer.addChild(graphics);\n });\n if (null == highlightPoints ? void 0 : highlightPoints.length) highlightPoints.forEach((point)=>{\n const graphics = pointMarkForItem(point, 'highlightPoint');\n highlightContainer.addChild(graphics);\n });\n const elements = treeToList(context.tree);\n elements.forEach((element)=>{\n const { rect, content, id } = element;\n const ifHighlight = highlightIds.includes(id) || (null == hoverElement ? void 0 : hoverElement.id) === id;\n if (ifHighlight) return;\n const [graphics] = rectMarkForItem(rect, content, 'element');\n elementMarkContainer.addChild(graphics);\n });\n elementMarkContainer.visible = elementsVisible;\n return {\n highlightElementRects\n };\n }, [\n app,\n appInitialed,\n highlightElements,\n context.tree,\n hoverElement,\n highlightRect,\n highlightPoints\n ]);\n const onSetBackgroundVisible = (e)=>{\n setBackgroundVisible(e.target.checked);\n if (pixiBgRef.current) pixiBgRef.current.visible = e.target.checked;\n };\n const onSetElementsVisible = (e)=>{\n setElementsVisible(e.target.checked);\n elementMarkContainer.visible = e.target.checked;\n };\n let bottomTipA = null;\n if (1 === highlightElementRects.length) bottomTipA = /*#__PURE__*/ jsx(\"div\", {\n className: \"bottom-tip\",\n children: /*#__PURE__*/ jsxs(\"div\", {\n className: \"bottom-tip-item\",\n children: [\n \"Element: \",\n JSON.stringify(highlightElementRects[0])\n ]\n })\n });\n else if (highlightElementRects.length > 1) bottomTipA = /*#__PURE__*/ jsx(\"div\", {\n className: \"bottom-tip\",\n children: /*#__PURE__*/ jsxs(\"div\", {\n className: \"bottom-tip-item\",\n children: [\n \"Element: \",\n JSON.stringify(highlightElementRects)\n ]\n })\n });\n return /*#__PURE__*/ jsxs(\"div\", {\n className: \"blackboard\",\n children: [\n /*#__PURE__*/ jsx(\"div\", {\n className: \"blackboard-main-content\",\n style: {\n width: '100%'\n },\n ref: domRef\n }),\n /*#__PURE__*/ jsx(\"div\", {\n className: \"blackboard-filter\",\n style: {\n display: props.hideController ? 'none' : 'block'\n },\n children: /*#__PURE__*/ jsxs(\"div\", {\n className: \"overlay-control\",\n children: [\n /*#__PURE__*/ jsx(Checkbox, {\n checked: backgroundVisible,\n onChange: onSetBackgroundVisible,\n children: \"Background\"\n }),\n /*#__PURE__*/ jsx(Checkbox, {\n checked: elementsVisible,\n onChange: onSetElementsVisible,\n children: \"Elements\"\n })\n ]\n })\n }),\n /*#__PURE__*/ jsx(\"div\", {\n className: \"bottom-tip\",\n style: {\n display: props.hideController ? 'none' : 'block'\n },\n children: bottomTipA\n })\n ]\n });\n};\nconst blackboard = Blackboard;\nexport { Blackboard, blackboard as default, pointMarkForItem, rectMarkForItem };\n","import { jsx } from \"react/jsx-runtime\";\nimport \"./index.css\";\nconst ShinyText = (param)=>{\n let { text, disabled = false, speed = 5, className = '' } = param;\n const style = {\n '--animation-duration': `${speed}s`\n };\n return /*#__PURE__*/ jsx(\"div\", {\n className: `shiny-text ${disabled ? 'disabled' : ''} ${className}`,\n style: style,\n children: text\n });\n};\nconst shiny_text = ShinyText;\nexport { shiny_text as default };\n","import { jsx, jsxs } from \"react/jsx-runtime\";\nimport { ArrowRightOutlined, CheckOutlined, ClockCircleOutlined, CloseOutlined, LogoutOutlined, MinusOutlined, WarningOutlined } from \"@ant-design/icons\";\nimport { Alert } from \"antd\";\nimport shiny_text from \"../shiny-text/index.mjs\";\nfunction timeCostStrElement(timeCost) {\n let str;\n str = 'number' != typeof timeCost ? '-' : `${(timeCost / 1000).toFixed(2)}s`;\n return /*#__PURE__*/ jsx(\"span\", {\n style: {\n fontVariantNumeric: 'tabular-nums',\n fontFeatureSettings: 'tnum'\n },\n children: str\n });\n}\nconst iconForStatus = (status)=>{\n switch(status){\n case 'finished':\n case 'passed':\n case 'success':\n case 'connected':\n return /*#__PURE__*/ jsx(\"span\", {\n style: {\n color: '#00AD4B'\n },\n children: /*#__PURE__*/ jsx(CheckOutlined, {})\n });\n case 'finishedWithWarning':\n return /*#__PURE__*/ jsx(\"span\", {\n style: {\n color: '#f7bb05'\n },\n children: /*#__PURE__*/ jsx(WarningOutlined, {})\n });\n case 'failed':\n case 'closed':\n case 'timedOut':\n case 'interrupted':\n return /*#__PURE__*/ jsx(\"span\", {\n style: {\n color: '#FF0A0A'\n },\n children: /*#__PURE__*/ jsx(CloseOutlined, {})\n });\n case 'pending':\n return /*#__PURE__*/ jsx(ClockCircleOutlined, {});\n case 'cancelled':\n case 'skipped':\n return /*#__PURE__*/ jsx(LogoutOutlined, {});\n case 'running':\n return /*#__PURE__*/ jsx(ArrowRightOutlined, {});\n default:\n return /*#__PURE__*/ jsx(MinusOutlined, {});\n }\n};\nconst errorMessageServerNotReady = /*#__PURE__*/ jsxs(\"span\", {\n children: [\n \"Don't worry, just one more step to launch the playground server.\",\n /*#__PURE__*/ jsx(\"br\", {}),\n \"Please run one of the commands under the midscene project directory:\",\n /*#__PURE__*/ jsx(\"br\", {}),\n \"a. \",\n /*#__PURE__*/ jsx(\"strong\", {\n children: \"npx midscene-playground\"\n }),\n /*#__PURE__*/ jsx(\"br\", {}),\n \"b. \",\n /*#__PURE__*/ jsx(\"strong\", {\n children: \"npx --yes @midscene/web\"\n })\n ]\n});\nconst serverLaunchTip = function() {\n let notReadyMessage = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : errorMessageServerNotReady;\n return /*#__PURE__*/ jsx(\"div\", {\n className: \"server-tip\",\n children: /*#__PURE__*/ jsx(Alert, {\n message: \"Playground Server Not Ready\",\n description: notReadyMessage,\n type: \"warning\"\n })\n });\n};\nconst emptyResultTip = /*#__PURE__*/ jsx(\"div\", {\n className: \"result-empty-tip\",\n style: {\n textAlign: 'center'\n },\n children: /*#__PURE__*/ jsx(shiny_text, {\n disabled: true,\n text: \"The result will be shown here\"\n })\n});\nexport { emptyResultTip, errorMessageServerNotReady, iconForStatus, serverLaunchTip, timeCostStrElement };\n","import { jsx, jsxs } from \"react/jsx-runtime\";\nimport { Button } from \"antd\";\nimport blackboard from \"../blackboard/index.mjs\";\nimport { iconForStatus } from \"../misc/index.mjs\";\nimport playground_demo_ui_context from \"../playground/playground-demo-ui-context.json\";\nconst ContextPreview = (param)=>{\n let { uiContextPreview, setUiContextPreview, showContextPreview } = param;\n if (!showContextPreview) return null;\n return /*#__PURE__*/ jsxs(\"div\", {\n className: \"form-part context-panel\",\n children: [\n /*#__PURE__*/ jsx(\"h3\", {\n children: \"UI Context\"\n }),\n uiContextPreview ? /*#__PURE__*/ jsx(blackboard, {\n uiContext: uiContextPreview,\n hideController: true\n }) : /*#__PURE__*/ jsxs(\"div\", {\n children: [\n iconForStatus('failed'),\n \" No UI context\",\n /*#__PURE__*/ jsx(Button, {\n type: \"link\",\n onClick: (e)=>{\n e.preventDefault();\n setUiContextPreview(playground_demo_ui_context);\n },\n children: \"Load Demo\"\n }),\n /*#__PURE__*/ jsx(\"div\", {\n children: \"To load the UI context, you can either use the demo data above, or click the 'Send to Playground' in the report page.\"\n })\n ]\n })\n ]\n });\n};\nexport { ContextPreview };\n","import { jsx, jsxs } from \"react/jsx-runtime\";\nimport { ExclamationCircleFilled } from \"@ant-design/icons\";\nimport { useEnvConfig } from \"../../store/store.mjs\";\nimport { EnvConfig } from \"../env-config/index.mjs\";\nimport \"./index.css\";\nconst EnvConfigReminder = (param)=>{\n let { className = '' } = param;\n const { config } = useEnvConfig();\n const configAlreadySet = Object.keys(config || {}).length >= 1;\n if (configAlreadySet) return null;\n return /*#__PURE__*/ jsxs(\"div\", {\n className: `env-config-reminder ${className}`,\n children: [\n /*#__PURE__*/ jsx(ExclamationCircleFilled, {\n className: \"reminder-icon\"\n }),\n /*#__PURE__*/ jsx(\"span\", {\n className: \"reminder-text\",\n children: \"Please set up your environment variables before using.\"\n }),\n /*#__PURE__*/ jsx(EnvConfig, {\n mode: \"text\",\n showTooltipWhenEmpty: false\n })\n ]\n });\n};\nexport { EnvConfigReminder };\n","import { jsx } from \"react/jsx-runtime\";\nimport \"react\";\nconst SvgGlobalPerspective = (props)=>/*#__PURE__*/ jsx(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 16,\n height: 16,\n fill: \"none\",\n viewBox: \"0 0 16 16\",\n ...props,\n children: /*#__PURE__*/ jsx(\"path\", {\n fill: \"#333\",\n d: \"M1.333 13v-2.5a.667.667 0 0 1 1.334 0V13c0 .184.149.333.333.333h2.5a.667.667 0 0 1 0 1.334H3c-.92 0-1.667-.746-1.667-1.667m12 0v-2.5a.667.667 0 0 1 1.334 0V13c0 .92-.746 1.667-1.667 1.667h-2.5a.667.667 0 0 1 0-1.334H13a.333.333 0 0 0 .333-.333m-12-7.5V3c0-.92.747-1.667 1.667-1.667h2.5a.667.667 0 0 1 0 1.334H3A.333.333 0 0 0 2.667 3v2.5a.667.667 0 0 1-1.334 0m12 0V3A.333.333 0 0 0 13 2.667h-2.5a.667.667 0 0 1 0-1.334H13c.92 0 1.667.747 1.667 1.667v2.5a.667.667 0 0 1-1.334 0M5.667 10.333h4.666V5.667H5.667zm6 .167c0 .644-.523 1.167-1.167 1.167h-5A1.167 1.167 0 0 1 4.333 10.5v-5c0-.644.523-1.167 1.167-1.167h5c.644 0 1.167.523 1.167 1.167z\"\n })\n });\nconst global_perspective = SvgGlobalPerspective;\nexport { global_perspective as default };\n","import { jsx, jsxs } from \"react/jsx-runtime\";\nimport \"react\";\nconst SvgPlayerSetting = (props)=>/*#__PURE__*/ jsxs(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 16,\n height: 16,\n fill: \"none\",\n viewBox: \"0 0 16 16\",\n ...props,\n children: [\n /*#__PURE__*/ jsx(\"path\", {\n stroke: \"#333\",\n strokeLinejoin: \"round\",\n strokeWidth: 1.333,\n d: \"M11.333 13.667 14.667 8l-3.334-5.667H4.667L1.333 8l3.334 5.667z\"\n }),\n /*#__PURE__*/ jsx(\"path\", {\n stroke: \"#333\",\n strokeLinejoin: \"round\",\n strokeWidth: 1.333,\n d: \"M8 9.667a1.667 1.667 0 1 0 0-3.334 1.667 1.667 0 0 0 0 3.334Z\"\n })\n ]\n });\nconst player_setting = SvgPlayerSetting;\nexport { player_setting as default };\n","import { jsx } from \"react/jsx-runtime\";\nimport \"react\";\nconst SvgShowMarker = (props)=>/*#__PURE__*/ jsx(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 16,\n height: 16,\n fill: \"none\",\n viewBox: \"0 0 16 16\",\n ...props,\n children: /*#__PURE__*/ jsx(\"path\", {\n fill: \"#333\",\n d: \"M13 1.835a2.165 2.165 0 0 1 .665 4.225v3.88a2.166 2.166 0 1 1-2.725 2.725H5.06a2.165 2.165 0 1 1-2.725-2.726V6.06A2.165 2.165 0 1 1 5.06 3.336h5.88c.281-.87 1.097-1.5 2.06-1.5m-10 9.33a.835.835 0 1 0 0 1.67.835.835 0 0 0 0-1.67m10 0a.835.835 0 1 0 0 1.67.835.835 0 0 0 0-1.67m-7.94-6.5A2.17 2.17 0 0 1 3.665 6.06v3.88c.66.213 1.181.734 1.395 1.395h5.88a2.17 2.17 0 0 1 1.395-1.396V6.06a2.17 2.17 0 0 1-1.395-1.394zM3 3.165a.835.835 0 1 0 0 1.67.835.835 0 0 0 0-1.67m10 0a.835.835 0 1 0 0 1.67.835.835 0 0 0 0-1.67\"\n })\n });\nconst show_marker = SvgShowMarker;\nexport { show_marker as default };\n","import \"pixi.js/unsafe-eval\";\nimport { Assets } from \"pixi.js\";\nconst globalTextureMap = new Map();\nconst loadTexture = async (img)=>{\n if (globalTextureMap.has(img)) return;\n return Assets.load(img).then((texture)=>{\n globalTextureMap.set(img, texture);\n });\n};\nconst getTextureFromCache = (name)=>globalTextureMap.get(name);\nconst getTexture = async (name)=>{\n if (globalTextureMap.has(name)) return globalTextureMap.get(name);\n await loadTexture(name);\n return globalTextureMap.get(name);\n};\nexport { getTexture, getTextureFromCache, loadTexture };\n","'use client';\nimport { jsx, jsxs } from \"react/jsx-runtime\";\nimport \"pixi.js/unsafe-eval\";\nimport { Application, Container, Sprite } from \"pixi.js\";\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport \"./index.css\";\nimport { mouseLoading, mousePointer } from \"../../utils/index.mjs\";\nimport { CaretRightOutlined, DownloadOutlined, ExportOutlined, LoadingOutlined } from \"@ant-design/icons\";\nimport { treeToList } from \"@midscene/shared/extractor\";\nimport { Dropdown, Spin, Switch, Tooltip } from \"antd\";\nimport global_perspective from \"../../icons/global-perspective.mjs\";\nimport player_setting from \"../../icons/player-setting.mjs\";\nimport show_marker from \"../../icons/show-marker.mjs\";\nimport { useBlackboardPreference } from \"../../store/store.mjs\";\nimport { getTextureFromCache, loadTexture } from \"../../utils/pixi-loader.mjs\";\nimport { rectMarkForItem } from \"../blackboard/index.mjs\";\nfunction _define_property(obj, key, value) {\n if (key in obj) Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n else obj[key] = value;\n return obj;\n}\nconst canvasPaddingLeft = 0;\nconst canvasPaddingTop = 0;\nconst cubicBezier = (t, p0, p1, p2, p3)=>{\n const t2 = 1 - t;\n return p0 * t2 * t2 * t2 + 3 * p1 * t * t2 * t2 + 3 * p2 * t * t * t2 + p3 * t * t * t;\n};\nconst cubicImage = (t)=>linear(t);\nconst cubicInsightElement = (t)=>cubicBezier(t, 0, 0.5, 0.5, 1);\nconst cubicMouse = (t)=>linear(t);\nconst linear = (t)=>t;\nconst sleep = (ms)=>new Promise((resolve)=>setTimeout(resolve, ms));\nconst ERROR_FRAME_CANCEL = 'frame cancel (this is an error on purpose)';\nconst frameKit = ()=>{\n let cancelFlag = false;\n return {\n frame: (callback)=>{\n if (cancelFlag) throw new Error(ERROR_FRAME_CANCEL);\n requestAnimationFrame(()=>{\n if (cancelFlag) throw new Error(ERROR_FRAME_CANCEL);\n callback(performance.now());\n });\n },\n timeout: (callback, ms)=>{\n if (cancelFlag) throw new Error(ERROR_FRAME_CANCEL);\n setTimeout(()=>{\n if (cancelFlag) throw new Error(ERROR_FRAME_CANCEL);\n callback();\n }, ms);\n },\n cancel: ()=>{\n cancelFlag = true;\n }\n };\n};\nconst singleElementFadeInDuration = 80;\nconst LAYER_ORDER_IMG = 0;\nconst LAYER_ORDER_INSIGHT = 1;\nconst LAYER_ORDER_POINTER = 2;\nconst LAYER_ORDER_SPINNING_POINTER = 3;\nconst downloadReport = (content)=>{\n const blob = new Blob([\n content\n ], {\n type: 'text/html'\n });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = 'midscene_report.html';\n a.click();\n};\nclass RecordingSession {\n start() {\n const stream = this.canvas.captureStream(60);\n const mediaRecorder = new MediaRecorder(stream, {\n mimeType: 'video/webm'\n });\n mediaRecorder.ondataavailable = (event)=>{\n if (event.data.size > 0) this.chunks.push(event.data);\n };\n this.mediaRecorder = mediaRecorder;\n this.recording = true;\n return this.mediaRecorder.start();\n }\n stop() {\n var _this_mediaRecorder;\n if (!this.recording || !this.mediaRecorder) return void console.warn('not recording');\n this.mediaRecorder.onstop = ()=>{\n const blob = new Blob(this.chunks, {\n type: 'video/webm'\n });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = 'midscene_replay.webm';\n a.click();\n URL.revokeObjectURL(url);\n };\n null == (_this_mediaRecorder = this.mediaRecorder) || _this_mediaRecorder.stop();\n this.recording = false;\n this.mediaRecorder = null;\n }\n constructor(canvas){\n _define_property(this, \"canvas\", void 0);\n _define_property(this, \"mediaRecorder\", null);\n _define_property(this, \"chunks\", void 0);\n _define_property(this, \"recording\", false);\n this.canvas = canvas;\n this.chunks = [];\n }\n}\nfunction Player(props) {\n var _scripts_;\n const [titleText, setTitleText] = useState('');\n const [subTitleText, setSubTitleText] = useState('');\n const { autoZoom, setAutoZoom, elementsVisible, setElementsVisible } = useBlackboardPreference();\n useEffect(()=>{\n if ((null == props ? void 0 : props.autoZoom) !== void 0) setAutoZoom(props.autoZoom);\n }, [\n null == props ? void 0 : props.autoZoom,\n setAutoZoom\n ]);\n useEffect(()=>{\n if ((null == props ? void 0 : props.elementsVisible) !== void 0) setElementsVisible(props.elementsVisible);\n }, [\n null == props ? void 0 : props.elementsVisible,\n setElementsVisible\n ]);\n const scripts = null == props ? void 0 : props.replayScripts;\n const imageWidth = (null == props ? void 0 : props.imageWidth) || 1920;\n const imageHeight = (null == props ? void 0 : props.imageHeight) || 1080;\n const fitMode = (null == props ? void 0 : props.fitMode) || 'height';\n const currentImg = useRef((null == scripts ? void 0 : null == (_scripts_ = scripts[0]) ? void 0 : _scripts_.img) || null);\n const divContainerRef = useRef(null);\n const app = useMemo(()=>new Application(), []);\n const pointerSprite = useRef(null);\n const spinningPointerSprite = useRef(null);\n const [replayMark, setReplayMark] = useState(0);\n const triggerReplay = ()=>{\n setReplayMark(Date.now());\n };\n const windowContentContainer = useMemo(()=>{\n const container = new Container();\n return container;\n }, []);\n const insightMarkContainer = useMemo(()=>{\n const container = new Container();\n container.zIndex = LAYER_ORDER_INSIGHT;\n return container;\n }, []);\n useEffect(()=>{\n insightMarkContainer.visible = elementsVisible;\n }, [\n elementsVisible,\n insightMarkContainer\n ]);\n const basicCameraState = {\n left: 0,\n top: 0,\n width: imageWidth,\n pointerLeft: Math.round(imageWidth / 2),\n pointerTop: Math.round(imageHeight / 2)\n };\n const [animationProgress, setAnimationProgress] = useState(-1);\n const cancelFlag = useRef(false);\n useEffect(()=>{\n cancelFlag.current = false;\n return ()=>{\n cancelFlag.current = true;\n };\n }, []);\n const cameraState = useRef({\n ...basicCameraState\n });\n const resizeCanvasIfNeeded = async (newWidth, newHeight)=>{\n if (app.screen.width !== newWidth || app.screen.height !== newHeight) {\n app.renderer.resize(newWidth, newHeight);\n if (divContainerRef.current) {\n const aspectRatio = newWidth / newHeight;\n divContainerRef.current.style.setProperty('--canvas-aspect-ratio', aspectRatio.toString());\n }\n const newBasicCameraState = {\n left: 0,\n top: 0,\n width: newWidth,\n pointerLeft: Math.round(newWidth / 2),\n pointerTop: Math.round(newHeight / 2)\n };\n cameraState.current = newBasicCameraState;\n }\n };\n const repaintImage = async (scriptWidth, scriptHeight)=>{\n const imgToUpdate = currentImg.current;\n if (!imgToUpdate) return void console.warn('no image to update');\n const targetWidth = scriptWidth || imageWidth;\n const targetHeight = scriptHeight || imageHeight;\n await resizeCanvasIfNeeded(targetWidth, targetHeight);\n if (!getTextureFromCache(imgToUpdate)) {\n console.warn('image not loaded', imgToUpdate);\n await loadTexture(imgToUpdate);\n }\n const texture = getTextureFromCache(imgToUpdate);\n if (!texture) throw new Error('texture not found');\n const sprite = Sprite.from(texture);\n if (!sprite) throw new Error('sprite not found');\n const mainImgLabel = 'main-img';\n const child = windowContentContainer.getChildByLabel(mainImgLabel);\n if (child) windowContentContainer.removeChild(child);\n sprite.label = mainImgLabel;\n sprite.zIndex = LAYER_ORDER_IMG;\n sprite.width = targetWidth;\n sprite.height = targetHeight;\n windowContentContainer.addChild(sprite);\n };\n const spinningPointer = (frame)=>{\n var _pointerSprite_current, _pointerSprite_current1;\n if (!spinningPointerSprite.current) {\n spinningPointerSprite.current = Sprite.from(mouseLoading);\n spinningPointerSprite.current.zIndex = LAYER_ORDER_SPINNING_POINTER;\n spinningPointerSprite.current.anchor.set(0.5, 0.5);\n spinningPointerSprite.current.scale.set(0.5);\n spinningPointerSprite.current.label = 'spinning-pointer';\n }\n spinningPointerSprite.current.x = (null == (_pointerSprite_current = pointerSprite.current) ? void 0 : _pointerSprite_current.x) || 0;\n spinningPointerSprite.current.y = (null == (_pointerSprite_current1 = pointerSprite.current) ? void 0 : _pointerSprite_current1.y) || 0;\n windowContentContainer.addChild(spinningPointerSprite.current);\n let startTime;\n let isCancelled = false;\n const animate = (currentTime)=>{\n if (isCancelled) return;\n if (!startTime) startTime = currentTime;\n const elapsedTime = currentTime - startTime;\n const progress = (Math.sin(elapsedTime / 500 - Math.PI / 2) + 1) / 2;\n const rotation = progress * Math.PI * 2;\n if (spinningPointerSprite.current) spinningPointerSprite.current.rotation = rotation;\n frame(animate);\n };\n frame(animate);\n const stopFn = ()=>{\n if (spinningPointerSprite.current) windowContentContainer.removeChild(spinningPointerSprite.current);\n isCancelled = true;\n };\n return stopFn;\n };\n const updatePointer = async (img, x, y)=>{\n var _pointerSprite_current, _pointerSprite_current1;\n if (!getTextureFromCache(img)) {\n console.warn('image not loaded', img);\n await loadTexture(img);\n }\n const texture = getTextureFromCache(img);\n if (!texture) throw new Error('texture not found');\n const sprite = Sprite.from(texture);\n let targetX = null == (_pointerSprite_current = pointerSprite.current) ? void 0 : _pointerSprite_current.x;\n let targetY = null == (_pointerSprite_current1 = pointerSprite.current) ? void 0 : _pointerSprite_current1.y;\n if ('number' == typeof x) targetX = x;\n if ('number' == typeof y) targetY = y;\n if (void 0 === targetX || void 0 === targetY) return void console.warn('invalid pointer position', x, y);\n if (pointerSprite.current) {\n const pointer = windowContentContainer.getChildByLabel('pointer');\n if (pointer) windowContentContainer.removeChild(pointer);\n }\n pointerSprite.current = sprite;\n pointerSprite.current.x = targetX;\n pointerSprite.current.y = targetY;\n pointerSprite.current.label = 'pointer';\n pointerSprite.current.zIndex = LAYER_ORDER_POINTER;\n windowContentContainer.addChild(pointerSprite.current);\n };\n const updateCamera = (state, currentWidth)=>{\n cameraState.current = state;\n const effectiveWidth = currentWidth || app.screen.width || imageWidth;\n const newScale = autoZoom ? Math.max(1, effectiveWidth / state.width) : 1;\n windowContentContainer.scale.set(newScale);\n windowContentContainer.x = autoZoom ? Math.round(canvasPaddingLeft - state.left * newScale) : canvasPaddingLeft;\n windowContentContainer.y = autoZoom ? Math.round(canvasPaddingTop - state.top * newScale) : canvasPaddingTop;\n const pointer = windowContentContainer.getChildByLabel('pointer');\n if (pointer) {\n pointer.scale.set(1 / newScale);\n if ('number' == typeof state.pointerLeft && 'number' == typeof state.pointerTop) {\n pointer.x = state.pointerLeft;\n pointer.y = state.pointerTop;\n }\n }\n };\n const cameraAnimation = async (targetState, duration, frame)=>{\n const currentCanvasWidth = app.screen.width || imageWidth;\n const currentCanvasHeight = app.screen.height || imageHeight;\n if (!autoZoom) {\n const currentState = {\n ...cameraState.current\n };\n const startPointerLeft = currentState.pointerLeft;\n const startPointerTop = currentState.pointerTop;\n const startTime = performance.now();\n const shouldMovePointer = 'number' == typeof targetState.pointerLeft && 'number' == typeof targetState.pointerTop && (targetState.pointerLeft !== startPointerLeft || targetState.pointerTop !== startPointerTop);\n if (!shouldMovePointer) return;\n await new Promise((resolve)=>{\n const animate = (currentTime)=>{\n const elapsedTime = currentTime - startTime;\n const rawProgress = Math.min(elapsedTime / duration, 1);\n const progress = cubicMouse(rawProgress);\n const nextState = {\n ...currentState,\n pointerLeft: startPointerLeft + (targetState.pointerLeft - startPointerLeft) * progress,\n pointerTop: startPointerTop + (targetState.pointerTop - startPointerTop) * progress\n };\n updateCamera(nextState, currentCanvasWidth);\n if (elapsedTime < duration) frame(animate);\n else resolve();\n };\n frame(animate);\n });\n return;\n }\n const currentState = {\n ...cameraState.current\n };\n const startLeft = currentState.left;\n const startTop = currentState.top;\n const startPointerLeft = currentState.pointerLeft;\n const startPointerTop = currentState.pointerTop;\n const startScale = currentState.width / currentCanvasWidth;\n const startTime = performance.now();\n const shouldMovePointer = 'number' == typeof targetState.pointerLeft && 'number' == typeof targetState.pointerTop && (targetState.pointerLeft !== startPointerLeft || targetState.pointerTop !== startPointerTop);\n const pointerMoveDuration = shouldMovePointer ? 0.375 * duration : 0;\n const cameraMoveStart = pointerMoveDuration;\n const cameraMoveDuration = duration - pointerMoveDuration;\n await new Promise((resolve)=>{\n const animate = (currentTime)=>{\n const nextState = {\n ...cameraState.current\n };\n const elapsedTime = currentTime - startTime;\n if (shouldMovePointer) if (elapsedTime <= pointerMoveDuration) {\n const rawMouseProgress = Math.min(elapsedTime / pointerMoveDuration, 1);\n const mouseProgress = cubicMouse(rawMouseProgress);\n nextState.pointerLeft = startPointerLeft + (targetState.pointerLeft - startPointerLeft) * mouseProgress;\n nextState.pointerTop = startPointerTop + (targetState.pointerTop - startPointerTop) * mouseProgress;\n } else {\n nextState.pointerLeft = targetState.pointerLeft;\n nextState.pointerTop = targetState.pointerTop;\n }\n if (elapsedTime > cameraMoveStart) {\n const cameraElapsedTime = elapsedTime - cameraMoveStart;\n const rawCameraProgress = Math.min(cameraElapsedTime / cameraMoveDuration, 1);\n const cameraProgress = cubicImage(rawCameraProgress);\n const targetScale = targetState.width / currentCanvasWidth;\n const progressScale = startScale + (targetScale - startScale) * cameraProgress;\n const progressWidth = currentCanvasWidth * progressScale;\n const progressHeight = currentCanvasHeight * progressScale;\n nextState.width = progressWidth;\n const progressLeft = startLeft + (targetState.left - startLeft) * cameraProgress;\n const progressTop = startTop + (targetState.top - startTop) * cameraProgress;\n const horizontalExceed = progressLeft + progressWidth - currentCanvasWidth;\n const verticalExceed = progressTop + progressHeight - currentCanvasHeight;\n nextState.left = horizontalExceed > 0 ? progressLeft + horizontalExceed : progressLeft;\n nextState.top = verticalExceed > 0 ? progressTop + verticalExceed : progressTop;\n }\n updateCamera(nextState, currentCanvasWidth);\n if (elapsedTime < duration) frame(animate);\n else resolve();\n };\n frame(animate);\n });\n };\n const fadeInGraphics = function(graphics, duration, frame) {\n let targetAlpha = arguments.length > 3 && void 0 !== arguments[3] ? arguments[3] : 1;\n return new Promise((resolve)=>{\n const startTime = performance.now();\n const animate = (currentTime)=>{\n const elapsedTime = currentTime - startTime;\n const progress = Math.min(elapsedTime / duration, 1);\n graphics.alpha = 0 === targetAlpha ? 1 - linear(progress) : linear(progress);\n if (elapsedTime < duration) frame(animate);\n else resolve();\n };\n frame(animate);\n });\n };\n const fadeOutItem = async (graphics, duration, frame)=>fadeInGraphics(graphics, duration, frame, 0);\n const insightElementsAnimation = async (elements, highlightElements, searchArea, duration, frame)=>{\n insightMarkContainer.removeChildren();\n const elementsToAdd = [\n ...elements\n ];\n const totalLength = elementsToAdd.length;\n let childrenCount = 0;\n await new Promise((resolve)=>{\n const startTime = performance.now();\n const animate = (currentTime)=>{\n const elapsedTime = currentTime - startTime;\n const progress = cubicInsightElement(Math.min(elapsedTime / duration, 1));\n const elementsToAddNow = Math.floor(progress * totalLength);\n while(childrenCount < elementsToAddNow){\n const randomIndex = Math.floor(Math.random() * elementsToAdd.length);\n const element = elementsToAdd.splice(randomIndex, 1)[0];\n if (element) {\n const [insightMarkGraphic] = rectMarkForItem(element.rect, element.content, 'element');\n insightMarkGraphic.alpha = 0;\n insightMarkContainer.addChild(insightMarkGraphic);\n childrenCount++;\n fadeInGraphics(insightMarkGraphic, singleElementFadeInDuration, frame);\n }\n }\n if (elapsedTime < duration) frame(animate);\n else {\n while(elementsToAdd.length > 0){\n const randomIndex = Math.floor(Math.random() * elementsToAdd.length);\n const element = elementsToAdd.splice(randomIndex, 1)[0];\n const [insightMarkGraphic] = rectMarkForItem(element.rect, element.content, 'element');\n insightMarkGraphic.alpha = 1;\n insightMarkContainer.addChild(insightMarkGraphic);\n }\n if (searchArea) {\n const [searchAreaGraphic] = rectMarkForItem(searchArea, 'Search Area', 'searchArea');\n searchAreaGraphic.alpha = 1;\n insightMarkContainer.addChild(searchAreaGraphic);\n }\n highlightElements.map((element)=>{\n const [insightMarkGraphic] = rectMarkForItem(element.rect, element.content || '', 'highlight');\n insightMarkGraphic.alpha = 1;\n insightMarkContainer.addChild(insightMarkGraphic);\n });\n resolve();\n }\n };\n frame(animate);\n });\n };\n const init = async ()=>{\n if (!divContainerRef.current || !scripts) return;\n await app.init({\n width: imageWidth,\n height: imageHeight,\n background: 0xf4f4f4,\n autoDensity: true,\n antialias: true\n });\n if (!divContainerRef.current) return;\n divContainerRef.current.appendChild(app.canvas);\n windowContentContainer.x = 0;\n windowContentContainer.y = 0;\n app.stage.addChild(windowContentContainer);\n insightMarkContainer.x = 0;\n insightMarkContainer.y = 0;\n windowContentContainer.addChild(insightMarkContainer);\n };\n const [isRecording, setIsRecording] = useState(false);\n const recorderSessionRef = useRef(null);\n const handleExport = ()=>{\n if (recorderSessionRef.current) return void console.warn('recorderSession exists');\n if (!app.canvas) return void console.warn('canvas is not initialized');\n recorderSessionRef.current = new RecordingSession(app.canvas);\n setIsRecording(true);\n triggerReplay();\n };\n const play = ()=>{\n let cancelFn;\n Promise.resolve((async ()=>{\n if (!app) throw new Error('app is not initialized');\n if (!scripts) throw new Error(\"scripts is required\");\n const { frame, cancel, timeout } = frameKit();\n cancelFn = cancel;\n const allImages = scripts.filter((item)=>!!item.img).map((item)=>item.img);\n await Promise.all([\n ...allImages,\n mouseLoading,\n mousePointer\n ].map(loadTexture));\n insightMarkContainer.removeChildren();\n await updatePointer(mousePointer, imageWidth / 2, imageHeight / 2);\n await repaintImage();\n await updateCamera({\n ...basicCameraState\n });\n const totalDuration = scripts.reduce((acc, item)=>acc + item.duration + (item.camera && item.insightCameraDuration ? item.insightCameraDuration : 0), 0);\n const progressUpdateInterval = 200;\n const startTime = performance.now();\n setAnimationProgress(0);\n const updateProgress = ()=>{\n const progress = Math.min((performance.now() - startTime) / totalDuration, 1);\n setAnimationProgress(progress);\n if (progress < 1) return timeout(updateProgress, progressUpdateInterval);\n };\n frame(updateProgress);\n if (recorderSessionRef.current) recorderSessionRef.current.start();\n for(const index in scripts){\n const item = scripts[index];\n setTitleText(item.title || '');\n setSubTitleText(item.subTitle || '');\n if ('sleep' === item.type) await sleep(item.duration);\n else if ('insight' === item.type) {\n var _item_context;\n if (!item.img) throw new Error('img is required');\n currentImg.current = item.img;\n await repaintImage(item.imageWidth, item.imageHeight);\n const elements = (null == (_item_context = item.context) ? void 0 : _item_context.tree) ? treeToList(item.context.tree) : [];\n const highlightElements = item.highlightElement ? [\n item.highlightElement\n ] : [];\n await insightElementsAnimation(elements, highlightElements, item.searchArea, item.duration, frame);\n if (item.camera) {\n if (!item.insightCameraDuration) throw new Error('insightCameraDuration is required');\n await cameraAnimation(item.camera, item.insightCameraDuration, frame);\n }\n } else if ('clear-insight' === item.type) {\n await fadeOutItem(insightMarkContainer, item.duration, frame);\n insightMarkContainer.removeChildren();\n insightMarkContainer.alpha = 1;\n } else if ('img' === item.type) {\n if (item.img && item.img !== currentImg.current) {\n currentImg.current = item.img;\n await repaintImage(item.imageWidth, item.imageHeight);\n }\n if (item.camera) await cameraAnimation(item.camera, item.duration, frame);\n else await sleep(item.duration);\n } else if ('pointer' === item.type) {\n if (!item.img) throw new Error('pointer img is required');\n await updatePointer(item.img);\n } else if ('spinning-pointer' === item.type) {\n const stop = spinningPointer(frame);\n await sleep(item.duration);\n stop();\n }\n }\n if (recorderSessionRef.current) {\n await sleep(1200);\n recorderSessionRef.current.stop();\n recorderSessionRef.current = null;\n setIsRecording(false);\n }\n })().catch((e)=>{\n console.error('player error', e);\n }));\n return ()=>{\n null == cancelFn || cancelFn();\n };\n };\n useEffect(()=>{\n Promise.resolve((async ()=>{\n await init();\n if (divContainerRef.current && imageWidth && imageHeight) {\n const aspectRatio = imageWidth / imageHeight;\n divContainerRef.current.style.setProperty('--canvas-aspect-ratio', aspectRatio.toString());\n divContainerRef.current.setAttribute('data-fit-mode', fitMode);\n const playerContainer = divContainerRef.current.closest('.player-container');\n if (playerContainer) playerContainer.setAttribute('data-fit-mode', fitMode);\n }\n triggerReplay();\n })());\n return ()=>{\n try {\n app.destroy(true, {\n children: true,\n texture: true\n });\n } catch (e) {\n console.warn('destroy failed', e);\n }\n };\n }, [\n imageWidth,\n imageHeight,\n fitMode\n ]);\n useEffect(()=>{\n if (replayMark) return play();\n }, [\n replayMark\n ]);\n const [mouseOverStatusIcon, setMouseOverStatusIcon] = useState(false);\n const [mouseOverSettingsIcon, setMouseOverSettingsIcon] = useState(false);\n const progressString = Math.round(100 * animationProgress);\n const transitionStyle = 0 === animationProgress ? 'none' : '0.3s';\n const canReplayNow = 1 === animationProgress;\n useEffect(()=>{\n if (canReplayNow) {\n const listener = (event)=>{\n if (' ' === event.key) triggerReplay();\n };\n window.addEventListener('keydown', listener);\n return ()=>{\n window.removeEventListener('keydown', listener);\n };\n }\n }, [\n canReplayNow\n ]);\n let statusIconElement;\n let statusOnClick = ()=>{};\n if (animationProgress < 1) statusIconElement = /*#__PURE__*/ jsx(Spin, {\n indicator: /*#__PURE__*/ jsx(LoadingOutlined, {\n spin: true,\n color: \"#333\"\n }),\n size: \"default\"\n });\n else if (mouseOverStatusIcon) {\n statusIconElement = /*#__PURE__*/ jsx(Spin, {\n indicator: /*#__PURE__*/ jsx(CaretRightOutlined, {\n color: \"#333\"\n }),\n size: \"default\"\n });\n statusOnClick = ()=>triggerReplay();\n } else statusIconElement = /*#__PURE__*/ jsx(Spin, {\n indicator: /*#__PURE__*/ jsx(CaretRightOutlined, {\n color: \"#333\"\n }),\n size: \"default\"\n });\n return /*#__PURE__*/ jsxs(\"div\", {\n className: \"player-container\",\n children: [\n /*#__PURE__*/ jsx(\"div\", {\n className: \"canvas-container\",\n ref: divContainerRef\n }),\n /*#__PURE__*/ jsx(\"div\", {\n className: \"player-timeline-wrapper\",\n children: /*#__PURE__*/ jsx(\"div\", {\n className: \"player-timeline\",\n children: /*#__PURE__*/ jsx(\"div\", {\n className: \"player-timeline-progress\",\n style: {\n width: `${progressString}%`,\n transition: transitionStyle\n }\n })\n })\n }),\n /*#__PURE__*/ jsx(\"div\", {\n className: \"player-tools-wrapper\",\n children: /*#__PURE__*/ jsx(\"div\", {\n className: \"player-tools\",\n children: /*#__PURE__*/ jsxs(\"div\", {\n className: \"player-control\",\n children: [\n /*#__PURE__*/ jsxs(\"div\", {\n className: \"status-text\",\n children: [\n /*#__PURE__*/ jsx(\"div\", {\n className: \"title\",\n children: titleText\n }),\n /*#__PURE__*/ jsx(Tooltip, {\n title: subTitleText,\n children: /*#__PURE__*/ jsx(\"div\", {\n className: \"subtitle\",\n children: subTitleText\n })\n })\n ]\n }),\n isRecording ? null : /*#__PURE__*/ jsx(\"div\", {\n className: \"status-icon\",\n onMouseEnter: ()=>setMouseOverStatusIcon(true),\n onMouseLeave: ()=>setMouseOverStatusIcon(false),\n onClick: statusOnClick,\n children: statusIconElement\n }),\n (null == props ? void 0 : props.reportFileContent) ? /*#__PURE__*/ jsx(Tooltip, {\n title: \"Download Report\",\n children: /*#__PURE__*/ jsx(\"div\", {\n className: \"status-icon\",\n onMouseEnter: ()=>setMouseOverStatusIcon(true),\n onMouseLeave: ()=>setMouseOverStatusIcon(false),\n onClick: ()=>downloadReport(props.reportFileContent),\n children: /*#__PURE__*/ jsx(DownloadOutlined, {\n color: \"#333\"\n })\n })\n }) : null,\n /*#__PURE__*/ jsx(Tooltip, {\n title: isRecording ? 'Generating...' : 'Export Video',\n children: /*#__PURE__*/ jsx(\"div\", {\n className: \"status-icon\",\n onClick: isRecording ? void 0 : handleExport,\n style: {\n opacity: isRecording ? 0.5 : 1,\n cursor: isRecording ? 'not-allowed' : 'pointer'\n },\n children: isRecording ? /*#__PURE__*/ jsx(Spin, {\n size: \"default\",\n percent: progressString\n }) : /*#__PURE__*/ jsx(ExportOutlined, {})\n })\n }),\n /*#__PURE__*/ jsx(Dropdown, {\n trigger: [\n 'hover',\n 'click'\n ],\n placement: \"bottomRight\",\n overlayStyle: {\n minWidth: '148px'\n },\n dropdownRender: (menu)=>/*#__PURE__*/ jsx(\"div\", {\n style: {\n borderRadius: '8px',\n border: '1px solid rgba(0, 0, 0, 0.08)',\n backgroundColor: '#fff',\n boxShadow: '0 2px 8px rgba(0, 0, 0, 0.08)',\n overflow: 'hidden'\n },\n children: menu\n }),\n menu: {\n style: {\n borderRadius: '8px',\n padding: 0\n },\n items: [\n {\n key: 'autoZoom',\n style: {\n height: '39px',\n margin: 0,\n padding: '0 12px'\n },\n label: /*#__PURE__*/ jsxs(\"div\", {\n style: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n width: '100%',\n height: '39px'\n },\n children: [\n /*#__PURE__*/ jsxs(\"div\", {\n style: {\n display: 'flex',\n alignItems: 'center',\n gap: '4px'\n },\n children: [\n /*#__PURE__*/ jsx(global_perspective, {\n style: {\n width: '16px',\n height: '16px'\n }\n }),\n /*#__PURE__*/ jsx(\"span\", {\n style: {\n fontSize: '12px',\n marginRight: '16px'\n },\n children: \"Focus on cursor\"\n })\n ]\n }),\n /*#__PURE__*/ jsx(Switch, {\n size: \"small\",\n checked: autoZoom,\n onChange: (checked)=>{\n setAutoZoom(checked);\n triggerReplay();\n },\n onClick: (_, e)=>{\n var _e_stopPropagation;\n return null == e ? void 0 : null == (_e_stopPropagation = e.stopPropagation) ? void 0 : _e_stopPropagation.call(e);\n }\n })\n ]\n })\n },\n {\n key: 'elementsVisible',\n style: {\n height: '39px',\n margin: 0,\n padding: '0 12px'\n },\n label: /*#__PURE__*/ jsxs(\"div\", {\n style: {\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n width: '100%',\n height: '39px'\n },\n children: [\n /*#__PURE__*/ jsxs(\"div\", {\n style: {\n display: 'flex',\n alignItems: 'center',\n gap: '4px'\n },\n children: [\n /*#__PURE__*/ jsx(show_marker, {\n style: {\n width: '16px',\n height: '16px'\n }\n }),\n /*#__PURE__*/ jsx(\"span\", {\n style: {\n fontSize: '12px',\n marginRight: '16px'\n },\n children: \"Show element markers\"\n })\n ]\n }),\n /*#__PURE__*/ jsx(Switch, {\n size: \"small\",\n checked: elementsVisible,\n onChange: (checked)=>{\n setElementsVisible(checked);\n triggerReplay();\n },\n onClick: (_, e)=>{\n var _e_stopPropagation;\n return null == e ? void 0 : null == (_e_stopPropagation = e.stopPropagation) ? void 0 : _e_stopPropagation.call(e);\n }\n })\n ]\n })\n }\n ]\n },\n children: /*#__PURE__*/ jsx(\"div\", {\n className: \"status-icon\",\n onMouseEnter: ()=>setMouseOverSettingsIcon(true),\n onMouseLeave: ()=>setMouseOverSettingsIcon(false),\n style: {\n cursor: 'pointer',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n opacity: mouseOverSettingsIcon ? 1 : 0.7,\n transition: 'opacity 0.2s'\n },\n children: /*#__PURE__*/ jsx(player_setting, {\n style: {\n width: '16px',\n height: '16px'\n }\n })\n })\n })\n ]\n })\n })\n })\n ]\n });\n}\nexport { Player };\n","import { jsx, jsxs } from \"react/jsx-runtime\";\nimport { LoadingOutlined } from \"@ant-design/icons\";\nimport { Spin } from \"antd\";\nimport { emptyResultTip, serverLaunchTip } from \"../misc/index.mjs\";\nimport { Player } from \"../player/index.mjs\";\nimport shiny_text from \"../shiny-text/index.mjs\";\nimport \"./index.css\";\nconst PlaygroundResultView = (param)=>{\n let { result, loading, serverValid, serviceMode, replayScriptsInfo, replayCounter, loadingProgressText, verticalMode = false, notReadyMessage, fitMode, autoZoom } = param;\n let resultWrapperClassName = 'result-wrapper';\n if (verticalMode) resultWrapperClassName += ' vertical-mode-result';\n if (replayScriptsInfo && verticalMode) resultWrapperClassName += ' result-wrapper-compact';\n let resultDataToShow = emptyResultTip;\n if (serverValid || 'Server' !== serviceMode) {\n if (loading) resultDataToShow = /*#__PURE__*/ jsxs(\"div\", {\n className: \"loading-container\",\n children: [\n /*#__PURE__*/ jsx(Spin, {\n spinning: loading,\n indicator: /*#__PURE__*/ jsx(LoadingOutlined, {\n spin: true\n })\n }),\n /*#__PURE__*/ jsx(\"div\", {\n className: \"loading-progress-text loading-progress-text-progress\",\n children: /*#__PURE__*/ jsx(shiny_text, {\n text: loadingProgressText,\n speed: 3\n })\n })\n ]\n });\n else if (replayScriptsInfo) resultDataToShow = /*#__PURE__*/ jsx(Player, {\n replayScripts: replayScriptsInfo.scripts,\n imageWidth: replayScriptsInfo.width,\n imageHeight: replayScriptsInfo.height,\n reportFileContent: ('In-Browser-Extension' === serviceMode || 'Server' === serviceMode) && (null == result ? void 0 : result.reportHTML) ? null == result ? void 0 : result.reportHTML : null,\n fitMode: fitMode,\n autoZoom: autoZoom\n }, replayCounter);\n else if (null == result ? void 0 : result.error) resultDataToShow = /*#__PURE__*/ jsx(\"pre\", {\n children: null == result ? void 0 : result.error\n });\n else if ((null == result ? void 0 : result.result) !== void 0) resultDataToShow = 'string' == typeof (null == result ? void 0 : result.result) ? /*#__PURE__*/ jsx(\"pre\", {\n children: null == result ? void 0 : result.result\n }) : /*#__PURE__*/ jsx(\"pre\", {\n children: JSON.stringify(null == result ? void 0 : result.result, null, 2)\n });\n } else resultDataToShow = serverLaunchTip(notReadyMessage);\n return /*#__PURE__*/ jsx(\"div\", {\n className: resultWrapperClassName,\n style: {\n height: '100%',\n display: 'flex',\n flexDirection: 'column',\n flex: '1 1 auto',\n justifyContent: 'center'\n },\n children: resultDataToShow\n });\n};\nexport { PlaygroundResultView };\n","import { jsx, jsxs } from \"react/jsx-runtime\";\nimport \"react\";\nconst SvgAvatar = (props)=>/*#__PURE__*/ jsxs(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 20,\n height: 20,\n fill: \"none\",\n \"aria-label\": \"Playground\",\n viewBox: \"0 0 20 20\",\n ...props,\n children: [\n /*#__PURE__*/ jsx(\"rect\", {\n width: 20,\n height: 20,\n fill: \"#2B83FF\",\n rx: 10\n }),\n /*#__PURE__*/ jsx(\"path\", {\n fill: \"#2B83FF\",\n stroke: \"#fff\",\n strokeLinejoin: \"round\",\n strokeWidth: 1.125,\n d: \"M6.866 5.882a.56.56 0 0 1 .667-.078l3.248 1.875 3.247 1.875a.563.563 0 0 1 0 .974l-3.247 1.875-3.248 1.875a.563.563 0 0 1-.784-.74l1.749-3.497-1.75-3.498a.56.56 0 0 1 .118-.661Z\"\n })\n ]\n });\nconst avatar = SvgAvatar;\nexport { avatar as default };\n","import { create } from \"zustand\";\nvar __webpack_require__ = {};\n(()=>{\n __webpack_require__.d = (exports, definition)=>{\n for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) Object.defineProperty(exports, key, {\n enumerable: true,\n get: definition[key]\n });\n };\n})();\n(()=>{\n __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);\n})();\n(()=>{\n __webpack_require__.r = (exports)=>{\n if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports, Symbol.toStringTag, {\n value: 'Module'\n });\n Object.defineProperty(exports, '__esModule', {\n value: true\n });\n };\n})();\nvar external_zustand_namespaceObject = {};\n__webpack_require__.r(external_zustand_namespaceObject);\n__webpack_require__.d(external_zustand_namespaceObject, {\n create: ()=>create\n});\nconst { create: history_create } = external_zustand_namespaceObject;\nconst HISTORY_KEY = 'midscene-prompt-history-v2';\nconst LAST_SELECTED_TYPE_KEY = 'midscene-last-selected-type';\nconst getHistoryFromLocalStorage = ()=>{\n const historyString = localStorage.getItem(HISTORY_KEY);\n return historyString ? JSON.parse(historyString) : {};\n};\nconst getLastSelectedType = ()=>localStorage.getItem(LAST_SELECTED_TYPE_KEY) || 'aiAct';\nconst setLastSelectedType = (type)=>{\n localStorage.setItem(LAST_SELECTED_TYPE_KEY, type);\n};\nconst useHistoryStore = history_create((set, get)=>({\n history: getHistoryFromLocalStorage(),\n lastSelectedType: getLastSelectedType(),\n clearHistory: (type)=>{\n const newHistory = {\n ...get().history\n };\n delete newHistory[type];\n set({\n history: newHistory\n });\n localStorage.setItem(HISTORY_KEY, JSON.stringify(newHistory));\n },\n addHistory: (historyItem)=>{\n const { type } = historyItem;\n const currentHistory = get().history;\n const typeHistory = currentHistory[type] || [];\n const stringifiedNewItem = JSON.stringify({\n prompt: historyItem.prompt,\n params: historyItem.params\n });\n const newTypeHistory = [\n historyItem,\n ...typeHistory.filter((h)=>{\n const stringifiedOldItem = JSON.stringify({\n prompt: h.prompt,\n params: h.params\n });\n return stringifiedOldItem !== stringifiedNewItem;\n })\n ];\n if (newTypeHistory.length > 10) newTypeHistory.length = 10;\n const newHistory = {\n ...currentHistory,\n [type]: newTypeHistory\n };\n set({\n history: newHistory\n });\n localStorage.setItem(HISTORY_KEY, JSON.stringify(newHistory));\n },\n getHistoryForType: (type)=>get().history[type] || [],\n setLastSelectedType: (type)=>{\n set({\n lastSelectedType: type\n });\n setLastSelectedType(type);\n }\n }));\nexport { useHistoryStore };\n","const VALIDATION_CONSTANTS = {\n ZOD_TYPES: {\n OPTIONAL: 'ZodOptional',\n DEFAULT: 'ZodDefault',\n NULLABLE: 'ZodNullable',\n OBJECT: 'ZodObject',\n ENUM: 'ZodEnum',\n NUMBER: 'ZodNumber',\n STRING: 'ZodString',\n BOOLEAN: 'ZodBoolean'\n },\n FIELD_FLAGS: {\n LOCATION: 'midscene_location_field_flag'\n },\n DEFAULT_VALUES: {\n ACTION_TYPE: 'aiAct',\n TIMEOUT_MS: 15000,\n CHECK_INTERVAL_MS: 3000\n }\n};\nconst isZodObjectSchema = (schema)=>'object' == typeof schema && null !== schema && ('shape' in schema || 'ZodObject' === schema.type);\nconst isLocateField = (field)=>{\n var _field__def;\n const fieldWithRuntime = field;\n if ((null == (_field__def = field._def) ? void 0 : _field__def.typeName) === VALIDATION_CONSTANTS.ZOD_TYPES.OBJECT) {\n var _field__def1;\n let shape;\n if (field._def.shape) shape = 'function' == typeof field._def.shape ? field._def.shape() : field._def.shape;\n if (!shape && fieldWithRuntime.shape) shape = fieldWithRuntime.shape;\n if (shape && VALIDATION_CONSTANTS.FIELD_FLAGS.LOCATION in shape) return true;\n const description = (null == (_field__def1 = field._def) ? void 0 : _field__def1.description) || fieldWithRuntime.description || '';\n if ('string' == typeof description && description.toLowerCase().includes('input field')) return true;\n }\n if ('object' == typeof field && null !== field) {\n var _fieldWithRuntime__def;\n const description = fieldWithRuntime.description || (null == (_fieldWithRuntime__def = fieldWithRuntime._def) ? void 0 : _fieldWithRuntime__def.description) || '';\n if ('string' == typeof description) {\n const desc = description.toLowerCase();\n if (desc.includes('input field') || desc.includes('element') || desc.includes('locate')) return true;\n }\n if ('ZodObject' === fieldWithRuntime.typeName || 'ZodObject' === fieldWithRuntime.type) return 'string' == typeof description && description.toLowerCase().includes('input field');\n }\n return false;\n};\nconst unwrapZodType = (field)=>{\n var _actualField__def, _actualField__def1, _actualField__def2;\n let actualField = field;\n let isOptional = false;\n let hasDefault = false;\n while((null == (_actualField__def = actualField._def) ? void 0 : _actualField__def.typeName) === VALIDATION_CONSTANTS.ZOD_TYPES.OPTIONAL || (null == (_actualField__def1 = actualField._def) ? void 0 : _actualField__def1.typeName) === VALIDATION_CONSTANTS.ZOD_TYPES.DEFAULT || (null == (_actualField__def2 = actualField._def) ? void 0 : _actualField__def2.typeName) === VALIDATION_CONSTANTS.ZOD_TYPES.NULLABLE){\n var _actualField__def3, _actualField__def4;\n if ((null == (_actualField__def3 = actualField._def) ? void 0 : _actualField__def3.typeName) === VALIDATION_CONSTANTS.ZOD_TYPES.OPTIONAL) isOptional = true;\n if ((null == (_actualField__def4 = actualField._def) ? void 0 : _actualField__def4.typeName) === VALIDATION_CONSTANTS.ZOD_TYPES.DEFAULT) hasDefault = true;\n actualField = actualField._def.innerType || actualField;\n }\n return {\n actualField,\n isOptional,\n hasDefault\n };\n};\nconst extractDefaultValue = (field)=>{\n var _currentField__def;\n let currentField = field;\n while(null == (_currentField__def = currentField._def) ? void 0 : _currentField__def.innerType){\n if (currentField._def.typeName === VALIDATION_CONSTANTS.ZOD_TYPES.DEFAULT && currentField._def.defaultValue) return currentField._def.defaultValue();\n currentField = currentField._def.innerType;\n }\n};\nexport { VALIDATION_CONSTANTS, extractDefaultValue, isLocateField, isZodObjectSchema, unwrapZodType };\n","import { getMidsceneLocationSchema } from \"../ai-model/index.mjs\";\nimport { z } from \"zod\";\nclass AbstractInterface {\n}\nconst defineAction = (config)=>config;\nconst actionTapParamSchema = z.object({\n locate: getMidsceneLocationSchema().describe('The element to be tapped')\n});\nconst defineActionTap = (call)=>defineAction({\n name: 'Tap',\n description: 'Tap the element',\n interfaceAlias: 'aiTap',\n paramSchema: actionTapParamSchema,\n call\n });\nconst actionRightClickParamSchema = z.object({\n locate: getMidsceneLocationSchema().describe('The element to be right clicked')\n});\nconst defineActionRightClick = (call)=>defineAction({\n name: 'RightClick',\n description: 'Right click the element',\n interfaceAlias: 'aiRightClick',\n paramSchema: actionRightClickParamSchema,\n call\n });\nconst actionDoubleClickParamSchema = z.object({\n locate: getMidsceneLocationSchema().describe('The element to be double clicked')\n});\nconst defineActionDoubleClick = (call)=>defineAction({\n name: 'DoubleClick',\n description: 'Double click the element',\n interfaceAlias: 'aiDoubleClick',\n paramSchema: actionDoubleClickParamSchema,\n call\n });\nconst actionHoverParamSchema = z.object({\n locate: getMidsceneLocationSchema().describe('The element to be hovered')\n});\nconst defineActionHover = (call)=>defineAction({\n name: 'Hover',\n description: 'Move the mouse to the element',\n interfaceAlias: 'aiHover',\n paramSchema: actionHoverParamSchema,\n call\n });\nconst actionInputParamSchema = z.object({\n value: z.union([\n z.string(),\n z.number()\n ]).transform((val)=>String(val)).describe('The text to input. Provide the final content for replace/append modes, or an empty string when using clear mode to remove existing text.'),\n locate: getMidsceneLocationSchema().describe('The element to be input').optional(),\n mode: z[\"enum\"]([\n 'replace',\n 'clear',\n 'append'\n ]).default('replace').optional().describe('Input mode: \"replace\" (default) - clear the field and input the value; \"append\" - append the value to existing content; \"clear\" - clear the field without inputting new text.')\n});\nconst defineActionInput = (call)=>defineAction({\n name: 'Input',\n description: 'Input the value into the element',\n interfaceAlias: 'aiInput',\n paramSchema: actionInputParamSchema,\n call\n });\nconst actionKeyboardPressParamSchema = z.object({\n locate: getMidsceneLocationSchema().describe('The element to be clicked before pressing the key').optional(),\n keyName: z.string().describe('The key to be pressed')\n});\nconst defineActionKeyboardPress = (call)=>defineAction({\n name: 'KeyboardPress',\n description: 'Press a function key, like \"Enter\", \"Tab\", \"Escape\". Do not use this to type text.',\n interfaceAlias: 'aiKeyboardPress',\n paramSchema: actionKeyboardPressParamSchema,\n call\n });\nconst actionScrollParamSchema = z.object({\n direction: z[\"enum\"]([\n 'down',\n 'up',\n 'right',\n 'left'\n ]).default('down').describe('The direction to scroll'),\n scrollType: z[\"enum\"]([\n 'once',\n 'untilBottom',\n 'untilTop',\n 'untilRight',\n 'untilLeft'\n ]).default('once').describe('The scroll type'),\n distance: z.number().nullable().optional().describe('The distance in pixels to scroll'),\n locate: getMidsceneLocationSchema().optional().describe('The element to be scrolled')\n});\nconst defineActionScroll = (call)=>defineAction({\n name: 'Scroll',\n description: 'Scroll the page or an element. The direction to scroll, the scroll type, and the distance to scroll. The distance is the number of pixels to scroll. If not specified, use `down` direction, `once` scroll type, and `null` distance.',\n interfaceAlias: 'aiScroll',\n paramSchema: actionScrollParamSchema,\n call\n });\nconst actionDragAndDropParamSchema = z.object({\n from: getMidsceneLocationSchema().describe('The position to be dragged'),\n to: getMidsceneLocationSchema().describe('The position to be dropped')\n});\nconst defineActionDragAndDrop = (call)=>defineAction({\n name: 'DragAndDrop',\n description: 'Drag and drop the element',\n interfaceAlias: 'aiDragAndDrop',\n paramSchema: actionDragAndDropParamSchema,\n call\n });\nconst ActionLongPressParamSchema = z.object({\n locate: getMidsceneLocationSchema().describe('The element to be long pressed'),\n duration: z.number().default(500).optional().describe('Long press duration in milliseconds')\n});\nconst defineActionLongPress = (call)=>defineAction({\n name: 'LongPress',\n description: 'Long press the element',\n paramSchema: ActionLongPressParamSchema,\n call\n });\nconst ActionSwipeParamSchema = z.object({\n start: getMidsceneLocationSchema().optional().describe('Starting point of the swipe gesture, if not specified, the center of the page will be used'),\n direction: z[\"enum\"]([\n 'up',\n 'down',\n 'left',\n 'right'\n ]).optional().describe('The direction to swipe (required when using distance). The direction means the direction of the finger swipe.'),\n distance: z.number().optional().describe('The distance in pixels to swipe (mutually exclusive with end)'),\n end: getMidsceneLocationSchema().optional().describe('Ending point of the swipe gesture (mutually exclusive with distance)'),\n duration: z.number().default(300).describe('Duration of the swipe gesture in milliseconds'),\n repeat: z.number().optional().describe('The number of times to repeat the swipe gesture. 1 for default, 0 for infinite (e.g. endless swipe until the end of the page)')\n});\nconst defineActionSwipe = (call)=>defineAction({\n name: 'Swipe',\n description: 'Perform a swipe gesture. You must specify either \"end\" (target location) or \"distance\" + \"direction\" - they are mutually exclusive. Use \"end\" for precise location-based swipes, or \"distance\" + \"direction\" for relative movement.',\n paramSchema: ActionSwipeParamSchema,\n call\n });\nconst actionClearInputParamSchema = z.object({\n locate: getMidsceneLocationSchema().describe('The input field to be cleared')\n});\nconst defineActionClearInput = (call)=>defineAction({\n name: 'ClearInput',\n description: 'Clear the text content of an input field',\n interfaceAlias: 'aiClearInput',\n paramSchema: actionClearInputParamSchema,\n call\n });\nexport { AbstractInterface, ActionLongPressParamSchema, ActionSwipeParamSchema, actionClearInputParamSchema, actionDoubleClickParamSchema, actionDragAndDropParamSchema, actionHoverParamSchema, actionInputParamSchema, actionKeyboardPressParamSchema, actionRightClickParamSchema, actionScrollParamSchema, actionTapParamSchema, defineAction, defineActionClearInput, defineActionDoubleClick, defineActionDragAndDrop, defineActionHover, defineActionInput, defineActionKeyboardPress, defineActionLongPress, defineActionRightClick, defineActionScroll, defineActionSwipe, defineActionTap };\n\n//# sourceMappingURL=index.mjs.map","import { StaticPage, StaticPageAgent } from \"@midscene/web/static\";\nimport { isZodObjectSchema, unwrapZodType } from \"../types.mjs\";\nconst actionNameForType = (type)=>{\n const typeWithoutAi = type.startsWith('ai') ? type.slice(2) : type;\n if (typeWithoutAi.startsWith('IOS')) return typeWithoutAi.substring(3).replace(/([A-Z])/g, ' $1').replace(/^/, 'IOS').trim();\n const fullName = typeWithoutAi.replace(/([A-Z])/g, ' $1').trim();\n const words = fullName.split(' ');\n if (words.length > 3) return words.slice(-3).join(' ');\n return fullName;\n};\nconst staticAgentFromContext = (context)=>{\n const page = new StaticPage(context);\n return new StaticPageAgent(page);\n};\nconst getPlaceholderForType = (type)=>{\n if ('aiQuery' === type) return 'What do you want to query?';\n if ('aiAssert' === type) return 'What do you want to assert?';\n if ('aiTap' === type) return 'What element do you want to tap?';\n if ('aiDoubleClick' === type) return 'What element do you want to double-click?';\n if ('aiHover' === type) return 'What element do you want to hover over?';\n if ('aiInput' === type) return 'Format: <value> | <element>\\nExample: hello world | search box';\n if ('aiRightClick' === type) return 'What element do you want to right-click?';\n if ('aiKeyboardPress' === type) return 'Format: <key> | <element (optional)>\\nExample: Enter | text field';\n if ('aiScroll' === type) return 'Format: <direction> <amount> | <element (optional)>\\nExample: down 500 | main content';\n if ('aiLocate' === type) return 'What element do you want to locate?';\n if ('aiBoolean' === type) return 'What do you want to check (returns true/false)?';\n if ('aiNumber' === type) return 'What number do you want to extract?';\n if ('aiString' === type) return 'What text do you want to extract?';\n if ('aiAsk' === type) return 'What do you want to ask?';\n if ('aiWaitFor' === type) return 'What condition do you want to wait for?';\n return 'What do you want to do?';\n};\nconst isRunButtonEnabled = (runButtonEnabled, needsStructuredParams, params, actionSpace, selectedType, promptValue)=>{\n if (!runButtonEnabled) return false;\n const needsAnyInput = (()=>{\n if (actionSpace) {\n const action = actionSpace.find((a)=>a.interfaceAlias === selectedType || a.name === selectedType);\n if (action) {\n if (!action.paramSchema) return false;\n if ('object' == typeof action.paramSchema && 'shape' in action.paramSchema) {\n const shape = action.paramSchema.shape || {};\n const shapeKeys = Object.keys(shape);\n return shapeKeys.length > 0;\n }\n }\n }\n return true;\n })();\n if (!needsAnyInput) return true;\n if (needsStructuredParams) {\n const currentParams = params || {};\n const action = null == actionSpace ? void 0 : actionSpace.find((a)=>a.interfaceAlias === selectedType || a.name === selectedType);\n if ((null == action ? void 0 : action.paramSchema) && isZodObjectSchema(action.paramSchema)) {\n const schema = action.paramSchema;\n const shape = schema.shape || {};\n return Object.keys(shape).every((key)=>{\n const field = shape[key];\n const { isOptional } = unwrapZodType(field);\n const value = currentParams[key];\n return isOptional || void 0 !== value && '' !== value && null !== value;\n });\n }\n return true;\n }\n return promptValue.trim().length > 0;\n};\nexport { actionNameForType, getPlaceholderForType, isRunButtonEnabled, staticAgentFromContext };\n","import { jsx } from \"react/jsx-runtime\";\nimport \"react\";\nconst SvgSetting = (props)=>/*#__PURE__*/ jsx(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 27,\n height: 27,\n fill: \"none\",\n viewBox: \"0 0 27 27\",\n ...props,\n children: /*#__PURE__*/ jsx(\"path\", {\n stroke: \"#000\",\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n strokeOpacity: 0.85,\n strokeWidth: 1.333,\n d: \"M19.527 8.855h-2M14.86 7.522v2.667M14.86 8.855H7.527M10.194 13.522H7.527M12.86 12.189v2.666M20.193 13.522H12.86M19.527 18.189h-2M14.86 16.855v2.667M14.86 18.189H7.527\"\n })\n });\nconst setting = SvgSetting;\nexport { setting as default };\n","import { jsx, jsxs } from \"react/jsx-runtime\";\nimport { Checkbox, Dropdown, Radio } from \"antd\";\nimport setting from \"../../icons/setting.mjs\";\nimport { useEnvConfig } from \"../../store/store.mjs\";\nimport { deepThinkTip, domIncludedTip, screenshotIncludedTip, trackingTip } from \"../../utils/constants.mjs\";\nconst ConfigSelector = (param)=>{\n let { showDeepThinkOption = false, enableTracking = false, showDataExtractionOptions = false, hideDomAndScreenshotOptions = false } = param;\n const forceSameTabNavigation = useEnvConfig((state)=>state.forceSameTabNavigation);\n const setForceSameTabNavigation = useEnvConfig((state)=>state.setForceSameTabNavigation);\n const deepThink = useEnvConfig((state)=>state.deepThink);\n const setDeepThink = useEnvConfig((state)=>state.setDeepThink);\n const screenshotIncluded = useEnvConfig((state)=>state.screenshotIncluded);\n const setScreenshotIncluded = useEnvConfig((state)=>state.setScreenshotIncluded);\n const domIncluded = useEnvConfig((state)=>state.domIncluded);\n const setDomIncluded = useEnvConfig((state)=>state.setDomIncluded);\n if (!enableTracking && !showDeepThinkOption && !showDataExtractionOptions) return null;\n const configItems = buildConfigItems();\n return /*#__PURE__*/ jsx(\"div\", {\n className: \"selector-trigger\",\n children: /*#__PURE__*/ jsx(Dropdown, {\n menu: {\n items: configItems\n },\n trigger: [\n 'click'\n ],\n children: /*#__PURE__*/ jsx(setting, {\n width: 24,\n height: 24\n })\n })\n });\n function buildConfigItems() {\n const items = [];\n if (enableTracking) items.push({\n label: /*#__PURE__*/ jsx(Checkbox, {\n onChange: (e)=>setForceSameTabNavigation(e.target.checked),\n checked: forceSameTabNavigation,\n children: trackingTip\n }),\n key: 'track-config'\n });\n if (showDeepThinkOption) items.push({\n label: /*#__PURE__*/ jsx(Checkbox, {\n onChange: (e)=>{\n setDeepThink(e.target.checked);\n },\n checked: deepThink,\n children: deepThinkTip\n }),\n key: 'deep-think-config'\n });\n if (showDataExtractionOptions && !hideDomAndScreenshotOptions) {\n items.push({\n label: /*#__PURE__*/ jsx(Checkbox, {\n onChange: (e)=>{\n setScreenshotIncluded(e.target.checked);\n },\n checked: screenshotIncluded,\n children: screenshotIncludedTip\n }),\n key: 'screenshot-included-config'\n });\n items.push({\n label: /*#__PURE__*/ jsxs(\"div\", {\n style: {\n padding: '4px 0'\n },\n children: [\n /*#__PURE__*/ jsx(\"div\", {\n style: {\n marginBottom: '4px',\n fontSize: '14px'\n },\n children: domIncludedTip\n }),\n /*#__PURE__*/ jsxs(Radio.Group, {\n size: \"small\",\n value: domIncluded,\n onChange: (e)=>setDomIncluded(e.target.value),\n children: [\n /*#__PURE__*/ jsx(Radio, {\n value: false,\n children: \"Off\"\n }),\n /*#__PURE__*/ jsx(Radio, {\n value: true,\n children: \"All\"\n }),\n /*#__PURE__*/ jsx(Radio, {\n value: 'visible-only',\n children: \"Visible only\"\n })\n ]\n })\n ]\n }),\n key: 'dom-included-config'\n });\n }\n return items;\n }\n};\nexport { ConfigSelector };\n","import { jsx } from \"react/jsx-runtime\";\nimport { Form, Input, InputNumber, Select } from \"antd\";\nconst { TextArea } = Input;\nconst renderLabel = (label, isOptional)=>`${label}${isOptional ? ' (Optional)' : ''}`;\nconst TextField = (param)=>{\n let { name, label, isRequired, marginBottom, placeholder: customPlaceholder } = param;\n const placeholder = customPlaceholder || `Enter ${name}`;\n return /*#__PURE__*/ jsx(Form.Item, {\n name: [\n 'params',\n name\n ],\n label: renderLabel(label, !isRequired),\n rules: isRequired ? [\n {\n required: true,\n message: `Please input ${name}`\n }\n ] : [],\n style: {\n marginBottom\n },\n colon: false,\n children: /*#__PURE__*/ jsx(Input, {\n placeholder: placeholder\n })\n }, name);\n};\nconst LocateField = (param)=>{\n let { name, label, isRequired, marginBottom, placeholder: customPlaceholder } = param;\n const placeholder = customPlaceholder || `Describe the ${name}, use natural language`;\n return /*#__PURE__*/ jsx(Form.Item, {\n name: [\n 'params',\n name\n ],\n label: renderLabel(label, !isRequired),\n rules: isRequired ? [\n {\n required: true,\n message: `The ${name} is required`\n }\n ] : [],\n style: {\n marginBottom\n },\n colon: false,\n children: /*#__PURE__*/ jsx(TextArea, {\n rows: 2,\n placeholder: placeholder\n })\n }, name);\n};\nconst EnumField = (param)=>{\n let { name, label, fieldSchema, isRequired, marginBottom, placeholder: customPlaceholder } = param;\n var _fieldSchema__def;\n const enumValues = (null == (_fieldSchema__def = fieldSchema._def) ? void 0 : _fieldSchema__def.values) || [];\n const selectOptions = enumValues.map((value)=>({\n value,\n label: value.charAt(0).toUpperCase() + value.slice(1)\n }));\n return /*#__PURE__*/ jsx(Form.Item, {\n name: [\n 'params',\n name\n ],\n label: label,\n rules: isRequired ? [\n {\n required: true,\n message: `Please select ${name}`\n }\n ] : [],\n style: {\n marginBottom\n },\n colon: false,\n children: /*#__PURE__*/ jsx(Select, {\n placeholder: customPlaceholder || `Select ${name}`,\n options: selectOptions\n })\n }, name);\n};\nconst NumberField = (param)=>{\n let { name, label, isRequired, marginBottom, placeholder: customPlaceholder } = param;\n const defaultPlaceholder = 'distance' === name ? 500 : 0;\n const placeholderValue = customPlaceholder ? Number(customPlaceholder) || defaultPlaceholder : defaultPlaceholder;\n const min = 0;\n const max = 'distance' === name ? 10000 : void 0;\n return /*#__PURE__*/ jsx(Form.Item, {\n name: [\n 'params',\n name\n ],\n label: `${label}${'distance' === name ? ' (px)' : ''}`,\n rules: isRequired ? [\n {\n required: true,\n message: `Please input ${name}`\n },\n {\n type: 'number',\n min,\n message: `${label} must be at least ${min}`\n }\n ] : [\n {\n type: 'number',\n min,\n message: `${label} must be at least ${min}`\n }\n ],\n style: {\n flex: 'distance' === name ? 1 : void 0,\n marginBottom\n },\n colon: false,\n children: /*#__PURE__*/ jsx(InputNumber, {\n placeholder: placeholderValue.toString(),\n min: min,\n max: max,\n step: 'distance' === name ? 10 : 1,\n style: {\n width: '100%'\n }\n })\n }, name);\n};\nconst BooleanField = (param)=>{\n let { name, label, isRequired, marginBottom, placeholder: customPlaceholder } = param;\n const selectOptions = [\n {\n value: true,\n label: 'True'\n },\n {\n value: false,\n label: 'False'\n }\n ];\n return /*#__PURE__*/ jsx(Form.Item, {\n name: [\n 'params',\n name\n ],\n label: renderLabel(label, !isRequired),\n rules: isRequired ? [\n {\n required: true,\n message: `Please select ${name}`\n }\n ] : [],\n style: {\n marginBottom\n },\n colon: false,\n children: /*#__PURE__*/ jsx(Select, {\n placeholder: customPlaceholder || `Select ${name}`,\n options: selectOptions\n })\n }, name);\n};\nexport { BooleanField, EnumField, LocateField, NumberField, TextField };\n","import { jsx } from \"react/jsx-runtime\";\nimport \"react\";\nconst SvgClose = (props)=>/*#__PURE__*/ jsx(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 18,\n height: 16,\n fill: \"none\",\n viewBox: \"0 0 18 16\",\n ...props,\n children: /*#__PURE__*/ jsx(\"path\", {\n stroke: \"#333\",\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n strokeWidth: 1.333,\n d: \"m3.124 2.667 11.162 10.666M3.124 13.333 14.286 2.667\"\n })\n });\nconst icons_close = SvgClose;\nexport { icons_close as default };\n","import { jsx, jsxs } from \"react/jsx-runtime\";\nimport \"react\";\nconst SvgHistory = (props)=>/*#__PURE__*/ jsxs(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 25,\n height: 25,\n fill: \"none\",\n viewBox: \"0 0 25 25\",\n ...props,\n children: [\n /*#__PURE__*/ jsx(\"path\", {\n stroke: \"#000\",\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n strokeOpacity: 0.85,\n strokeWidth: 1.33,\n d: \"M6.63 9.021c-2.862 6.126 2.197 10.501 6.063 10.501a7 7 0 1 0-6.063-10.5\"\n }),\n /*#__PURE__*/ jsx(\"path\", {\n stroke: \"#000\",\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n strokeOpacity: 0.85,\n strokeWidth: 1.33,\n d: \"M12.695 8.322v4.203l2.967 2.968\"\n })\n ]\n });\nconst icons_history = SvgHistory;\nexport { icons_history as default };\n","import { jsx, jsxs } from \"react/jsx-runtime\";\nimport \"react\";\nconst SvgMagnifyingGlass = (props)=>/*#__PURE__*/ jsxs(\"svg\", {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 19,\n height: 19,\n fill: \"none\",\n viewBox: \"0 0 19 19\",\n ...props,\n children: [\n /*#__PURE__*/ jsxs(\"g\", {\n stroke: \"#000\",\n strokeLinejoin: \"round\",\n strokeOpacity: 0.65,\n strokeWidth: 1.5,\n clipPath: \"url(#magnifying-glass_svg__a)\",\n children: [\n /*#__PURE__*/ jsx(\"path\", {\n d: \"M8.397 14.29a6.375 6.375 0 1 0 0-12.75 6.375 6.375 0 0 0 0 12.75Z\"\n }),\n /*#__PURE__*/ jsx(\"path\", {\n strokeLinecap: \"round\",\n d: \"M10.519 5.42a3 3 0 0 0-2.122-.88 3 3 0 0 0-2.121.88M12.98 12.499l3.182 3.182\"\n })\n ]\n }),\n /*#__PURE__*/ jsx(\"defs\", {\n children: /*#__PURE__*/ jsx(\"clipPath\", {\n id: \"magnifying-glass_svg__a\",\n children: /*#__PURE__*/ jsx(\"path\", {\n fill: \"#fff\",\n d: \"M.522.04h18v18h-18z\"\n })\n })\n })\n ]\n });\nconst magnifying_glass = SvgMagnifyingGlass;\nexport { magnifying_glass as default };\n","import { Fragment, jsx, jsxs } from \"react/jsx-runtime\";\nimport { Button, Input, Typography } from \"antd\";\nimport { useEffect, useMemo, useRef, useState } from \"react\";\nimport icons_close from \"../../icons/close.mjs\";\nimport icons_history from \"../../icons/history.mjs\";\nimport magnifying_glass from \"../../icons/magnifying-glass.mjs\";\nimport { useHistoryStore } from \"../../store/history.mjs\";\nimport \"./index.css\";\nconst { Text } = Typography;\nconst HistorySelector = (param)=>{\n let { onSelect, history, currentType } = param;\n const [isModalOpen, setIsModalOpen] = useState(false);\n const [searchText, setSearchText] = useState('');\n const clearHistory = useHistoryStore((state)=>state.clearHistory);\n const modalRef = useRef(null);\n const groupedHistory = useMemo(()=>{\n const now = Date.now();\n const sevenDaysAgo = now - 604800000;\n const oneYearAgo = now - 31536000000;\n const filteredHistory = history.filter((item)=>item.prompt.toLowerCase().includes(searchText.toLowerCase()));\n const groups = {\n recent7Days: filteredHistory.filter((item)=>item.timestamp >= sevenDaysAgo),\n recent1Year: filteredHistory.filter((item)=>item.timestamp < sevenDaysAgo && item.timestamp >= oneYearAgo),\n older: filteredHistory.filter((item)=>item.timestamp < oneYearAgo)\n };\n return groups;\n }, [\n history,\n searchText\n ]);\n const handleHistoryClick = (item)=>{\n onSelect(item);\n setIsModalOpen(false);\n };\n const handleClearHistory = ()=>{\n clearHistory(currentType);\n setSearchText('');\n setIsModalOpen(false);\n };\n useEffect(()=>{\n if (!isModalOpen) return;\n const handleClickOutside = (event)=>{\n if (modalRef.current && !modalRef.current.contains(event.target)) setIsModalOpen(false);\n };\n const timer = setTimeout(()=>{\n document.addEventListener('click', handleClickOutside);\n }, 100);\n return ()=>{\n clearTimeout(timer);\n document.removeEventListener('click', handleClickOutside);\n };\n }, [\n isModalOpen\n ]);\n const renderHistoryGroup = (title, items)=>{\n if (0 === items.length) return null;\n return /*#__PURE__*/ jsxs(\"div\", {\n className: \"history-group\",\n children: [\n /*#__PURE__*/ jsx(\"div\", {\n className: \"history-group-title\",\n children: title\n }),\n items.map((item, index)=>/*#__PURE__*/ jsx(\"div\", {\n className: \"history-item\",\n onClick: ()=>handleHistoryClick(item),\n children: item.prompt\n }, `${item.timestamp}-${index}`))\n ]\n }, title);\n };\n return /*#__PURE__*/ jsxs(\"div\", {\n className: \"history-selector-wrapper\",\n children: [\n /*#__PURE__*/ jsx(\"div\", {\n className: \"selector-trigger\",\n onClick: ()=>setIsModalOpen(true),\n children: /*#__PURE__*/ jsx(icons_history, {\n width: 24,\n height: 24\n })\n }),\n isModalOpen && /*#__PURE__*/ jsx(\"div\", {\n className: \"history-modal-overlay\",\n ref: modalRef,\n children: /*#__PURE__*/ jsxs(\"div\", {\n className: \"history-modal-container\",\n children: [\n /*#__PURE__*/ jsxs(\"div\", {\n className: \"history-modal-header\",\n children: [\n /*#__PURE__*/ jsxs(Text, {\n strong: true,\n style: {\n fontSize: '16px'\n },\n children: [\n \"History (\",\n history.length,\n \")\"\n ]\n }),\n /*#__PURE__*/ jsx(Button, {\n size: \"small\",\n type: \"text\",\n icon: /*#__PURE__*/ jsx(icons_close, {\n width: 16,\n height: 16\n }),\n onClick: ()=>setIsModalOpen(false),\n className: \"close-button\"\n })\n ]\n }),\n /*#__PURE__*/ jsx(\"div\", {\n className: \"history-search-section\",\n children: /*#__PURE__*/ jsxs(\"div\", {\n className: \"search-input-wrapper\",\n children: [\n /*#__PURE__*/ jsx(Input, {\n placeholder: \"Search\",\n value: searchText,\n onChange: (e)=>setSearchText(e.target.value),\n prefix: /*#__PURE__*/ jsx(magnifying_glass, {\n width: 18,\n height: 18\n }),\n className: \"search-input\",\n allowClear: true\n }),\n /*#__PURE__*/ jsx(Button, {\n type: \"link\",\n onClick: handleClearHistory,\n className: \"clear-button\",\n disabled: 0 === history.length,\n children: \"Clear\"\n })\n ]\n })\n }),\n /*#__PURE__*/ jsx(\"div\", {\n className: \"history-content\",\n children: 0 === history.length ? /*#__PURE__*/ jsx(\"div\", {\n className: \"no-results\",\n children: /*#__PURE__*/ jsx(Text, {\n type: \"secondary\",\n children: \"No history record\"\n })\n }) : /*#__PURE__*/ jsxs(Fragment, {\n children: [\n renderHistoryGroup('Last 7 days', groupedHistory.recent7Days),\n renderHistoryGroup('Last 1 year', groupedHistory.recent1Year),\n renderHistoryGroup('Earlier', groupedHistory.older),\n searchText && 0 === groupedHistory.recent7Days.length && 0 === groupedHistory.recent1Year.length && 0 === groupedHistory.older.length && /*#__PURE__*/ jsx(\"div\", {\n className: \"no-results\",\n children: /*#__PURE__*/ jsx(Text, {\n type: \"secondary\",\n children: \"No matching history record\"\n })\n })\n ]\n })\n })\n ]\n })\n })\n ]\n });\n};\nexport { HistorySelector };\n","import { jsx, jsxs } from \"react/jsx-runtime\";\nimport { BorderOutlined, DownOutlined, SendOutlined } from \"@ant-design/icons\";\nimport \"./index.css\";\nimport { Button, Dropdown, Form, Input, Radio, Tooltip } from \"antd\";\nimport react, { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useHistoryStore } from \"../../store/history.mjs\";\nimport { extractDefaultValue, isLocateField, isZodObjectSchema, unwrapZodType } from \"../../types.mjs\";\nimport { apiMetadata, defaultMainButtons } from \"../../utils/constants.mjs\";\nimport { actionNameForType, getPlaceholderForType, isRunButtonEnabled as playground_utils_mjs_isRunButtonEnabled } from \"../../utils/playground-utils.mjs\";\nimport { ConfigSelector } from \"../config-selector/index.mjs\";\nimport { BooleanField, EnumField, LocateField, NumberField, TextField } from \"../form-field/index.mjs\";\nimport { HistorySelector } from \"../history-selector/index.mjs\";\nconst { TextArea } = Input;\nconst PromptInput = (param)=>{\n let { runButtonEnabled, form, serviceMode, selectedType, dryMode, stoppable, loading, onRun, onStop, clearPromptAfterRun = true, actionSpace, hideDomAndScreenshotOptions = false } = param;\n const [hoveringSettings, setHoveringSettings] = useState(false);\n const [promptValue, setPromptValue] = useState('');\n const placeholder = getPlaceholderForType(selectedType);\n const textAreaRef = useRef(null);\n const modeRadioGroupRef = useRef(null);\n const params = Form.useWatch('params', form);\n const lastHistoryRef = useRef(null);\n const history = useHistoryStore((state)=>state.history);\n const lastSelectedType = useHistoryStore((state)=>state.lastSelectedType);\n const addHistory = useHistoryStore((state)=>state.addHistory);\n const setLastSelectedType = useHistoryStore((state)=>state.setLastSelectedType);\n const historyForSelectedType = useMemo(()=>history[selectedType] || [], [\n history,\n selectedType\n ]);\n const needsStructuredParams = useMemo(()=>{\n if (actionSpace) {\n const action = actionSpace.find((a)=>a.interfaceAlias === selectedType || a.name === selectedType);\n if (!(null == action ? void 0 : action.paramSchema)) return false;\n if (isZodObjectSchema(action.paramSchema)) {\n const schema = action.paramSchema;\n const shape = schema.shape || {};\n const shapeKeys = Object.keys(shape);\n return shapeKeys.length > 0;\n }\n return true;\n }\n return false;\n }, [\n selectedType,\n actionSpace\n ]);\n const needsAnyInput = useMemo(()=>{\n if (actionSpace && actionSpace.length > 0) {\n const action = actionSpace.find((a)=>a.interfaceAlias === selectedType || a.name === selectedType);\n if (action) {\n if (action.paramSchema && isZodObjectSchema(action.paramSchema)) {\n const schema = action.paramSchema;\n const shape = schema.shape || {};\n const hasRequiredFields = Object.keys(shape).some((key)=>{\n const field = shape[key];\n const { isOptional } = unwrapZodType(field);\n return !isOptional;\n });\n return hasRequiredFields;\n }\n return !!action.paramSchema;\n }\n }\n return true;\n }, [\n selectedType,\n actionSpace\n ]);\n const showDataExtractionOptions = useMemo(()=>{\n const dataExtractionMethods = [\n 'aiQuery',\n 'aiBoolean',\n 'aiNumber',\n 'aiString',\n 'aiAsk',\n 'aiAssert'\n ];\n return dataExtractionMethods.includes(selectedType);\n }, [\n selectedType\n ]);\n const showDeepThinkOption = useMemo(()=>{\n if ('aiLocate' === selectedType) return true;\n if (actionSpace) {\n const action = actionSpace.find((a)=>a.interfaceAlias === selectedType || a.name === selectedType);\n if ((null == action ? void 0 : action.paramSchema) && isZodObjectSchema(action.paramSchema)) {\n const schema = action.paramSchema;\n const shape = schema.shape || {};\n const hasLocateField = Object.keys(shape).some((key)=>{\n const field = shape[key];\n const { actualField } = unwrapZodType(field);\n return isLocateField(actualField);\n });\n return hasLocateField;\n }\n }\n return false;\n }, [\n selectedType,\n actionSpace\n ]);\n const hasConfigOptions = useMemo(()=>{\n const hasTracking = 'In-Browser-Extension' === serviceMode;\n const hasDeepThink = showDeepThinkOption;\n const hasDataExtraction = showDataExtractionOptions && !hideDomAndScreenshotOptions;\n return hasTracking || hasDeepThink || hasDataExtraction;\n }, [\n serviceMode,\n showDeepThinkOption,\n showDataExtractionOptions,\n hideDomAndScreenshotOptions\n ]);\n const availableDropdownMethods = useMemo(()=>{\n const metadataMethods = Object.keys(apiMetadata);\n if (!actionSpace || 0 === actionSpace.length) return metadataMethods;\n const availableMethods = actionSpace.map((action)=>action.interfaceAlias || action.name);\n const finalMethods = new Set();\n metadataMethods.forEach((method)=>{\n const methodInfo = apiMetadata[method];\n if ((null == methodInfo ? void 0 : methodInfo.group) === 'extraction' || (null == methodInfo ? void 0 : methodInfo.group) === 'validation') finalMethods.add(method);\n else if (availableMethods.includes(method)) finalMethods.add(method);\n });\n availableMethods.forEach((method)=>{\n finalMethods.add(method);\n });\n return Array.from(finalMethods);\n }, [\n actionSpace\n ]);\n const getDefaultParams = useCallback(()=>{\n if (!needsStructuredParams || !actionSpace) return {};\n const action = actionSpace.find((a)=>a.interfaceAlias === selectedType || a.name === selectedType);\n if ((null == action ? void 0 : action.paramSchema) && isZodObjectSchema(action.paramSchema)) {\n const defaultParams = {};\n const schema = action.paramSchema;\n const shape = schema.shape || {};\n Object.keys(shape).forEach((key)=>{\n const field = shape[key];\n const defaultValue = extractDefaultValue(field);\n if (void 0 !== defaultValue) defaultParams[key] = defaultValue;\n });\n return defaultParams;\n }\n return {};\n }, [\n selectedType,\n needsStructuredParams,\n actionSpace\n ]);\n useEffect(()=>{\n if (!form.getFieldValue('type') && lastSelectedType) form.setFieldValue('type', lastSelectedType);\n }, [\n form,\n lastSelectedType\n ]);\n useEffect(()=>{\n if (selectedType && selectedType !== lastSelectedType) setLastSelectedType(selectedType);\n }, [\n selectedType,\n lastSelectedType,\n setLastSelectedType\n ]);\n const scrollToSelectedItem = useCallback(()=>{\n const container = modeRadioGroupRef.current;\n if (!container) return;\n let targetElement = null;\n const selectedRadioButton = container.querySelector('.ant-radio-button-wrapper-checked');\n const dropdownButton = container.querySelector('.more-apis-button.selected-from-dropdown');\n if (selectedRadioButton) targetElement = selectedRadioButton;\n else if (dropdownButton) targetElement = dropdownButton;\n if (targetElement) {\n const containerRect = container.getBoundingClientRect();\n const targetRect = targetElement.getBoundingClientRect();\n const targetLeft = targetRect.left - containerRect.left + container.scrollLeft;\n const targetWidth = targetRect.width;\n const containerWidth = containerRect.width;\n const optimalScrollLeft = targetLeft - (containerWidth - targetWidth) / 2;\n container.scrollTo({\n left: Math.max(0, optimalScrollLeft),\n behavior: 'smooth'\n });\n }\n }, []);\n useEffect(()=>{\n const lastHistory = historyForSelectedType[0];\n if (lastHistory && lastHistoryRef.current && lastHistory.timestamp === lastHistoryRef.current.timestamp) return;\n if (lastHistory) {\n form.setFieldsValue({\n type: lastHistory.type,\n prompt: lastHistory.prompt || '',\n params: lastHistory.params\n });\n setPromptValue(lastHistory.prompt || '');\n lastHistoryRef.current = lastHistory;\n } else {\n const defaultParams = getDefaultParams();\n form.setFieldsValue({\n prompt: '',\n params: defaultParams\n });\n setPromptValue('');\n lastHistoryRef.current = null;\n }\n }, [\n selectedType,\n historyForSelectedType,\n form,\n getDefaultParams\n ]);\n useEffect(()=>{\n const timeoutId = setTimeout(()=>{\n scrollToSelectedItem();\n }, 100);\n return ()=>clearTimeout(timeoutId);\n }, [\n selectedType,\n scrollToSelectedItem\n ]);\n const formPromptValue = Form.useWatch('prompt', form);\n useEffect(()=>{\n if (formPromptValue !== promptValue) setPromptValue(formPromptValue || '');\n }, [\n formPromptValue,\n promptValue\n ]);\n const handleSelectHistory = useCallback((historyItem)=>{\n form.setFieldsValue({\n prompt: historyItem.prompt,\n type: historyItem.type,\n params: historyItem.params\n });\n setPromptValue(historyItem.prompt);\n }, [\n form\n ]);\n const handlePromptChange = useCallback((e)=>{\n const value = e.target.value;\n setPromptValue(value);\n }, []);\n const hasSingleStructuredParam = useMemo(()=>{\n if (!needsStructuredParams || !actionSpace) return false;\n const action = actionSpace.find((a)=>a.interfaceAlias === selectedType || a.name === selectedType);\n if ((null == action ? void 0 : action.paramSchema) && isZodObjectSchema(action.paramSchema)) {\n const schema = action.paramSchema;\n const shape = schema.shape || {};\n return 1 === Object.keys(shape).length;\n }\n return false;\n }, [\n selectedType,\n needsStructuredParams,\n actionSpace\n ]);\n const isRunButtonEnabled = useMemo(()=>playground_utils_mjs_isRunButtonEnabled(runButtonEnabled, !!needsStructuredParams, params, actionSpace, selectedType, promptValue), [\n runButtonEnabled,\n needsStructuredParams,\n selectedType,\n actionSpace,\n promptValue,\n params\n ]);\n const handleRunWithHistory = useCallback(()=>{\n const values = form.getFieldsValue();\n let historyPrompt = '';\n if (needsStructuredParams && values.params && actionSpace) {\n const action = actionSpace.find((a)=>a.interfaceAlias === selectedType || a.name === selectedType);\n if ((null == action ? void 0 : action.paramSchema) && isZodObjectSchema(action.paramSchema)) {\n let locateValue = '';\n const otherValues = [];\n const schema = action.paramSchema;\n const shape = schema.shape || {};\n Object.keys(shape).forEach((key)=>{\n var _values_params;\n const paramValue = null == (_values_params = values.params) ? void 0 : _values_params[key];\n if (null != paramValue && '' !== paramValue) {\n const field = shape[key];\n const { actualField } = unwrapZodType(field);\n if (isLocateField(actualField)) locateValue = String(paramValue);\n else if ('distance' === key) otherValues.push(`${paramValue}`);\n else otherValues.push(String(paramValue));\n }\n });\n const mainPart = otherValues.join(' ');\n historyPrompt = locateValue ? `${locateValue} - ${mainPart}` : mainPart;\n } else historyPrompt = values.prompt || '';\n } else historyPrompt = values.prompt || '';\n const newHistoryItem = {\n type: values.type,\n prompt: historyPrompt,\n params: values.params,\n timestamp: Date.now()\n };\n addHistory(newHistoryItem);\n onRun();\n if (clearPromptAfterRun) {\n lastHistoryRef.current = newHistoryItem;\n setPromptValue('');\n if (needsStructuredParams) {\n const defaultParams = getDefaultParams();\n form.setFieldValue('params', defaultParams);\n } else form.setFieldValue('prompt', '');\n }\n }, [\n form,\n addHistory,\n onRun,\n needsStructuredParams,\n selectedType,\n clearPromptAfterRun,\n actionSpace,\n getDefaultParams\n ]);\n const handleKeyDown = useCallback((e)=>{\n if ('Enter' === e.key && e.metaKey && isRunButtonEnabled) {\n handleRunWithHistory();\n e.preventDefault();\n e.stopPropagation();\n } else if ('Enter' === e.key) setTimeout(()=>{\n if (textAreaRef.current) {\n var _textAreaRef_current_resizableTextArea;\n const textarea = null == (_textAreaRef_current_resizableTextArea = textAreaRef.current.resizableTextArea) ? void 0 : _textAreaRef_current_resizableTextArea.textArea;\n if (textarea) {\n const selectionStart = textarea.selectionStart;\n const value = textarea.value;\n const lastNewlineIndex = value.lastIndexOf('\\n');\n const isAtLastLine = -1 === lastNewlineIndex || selectionStart > lastNewlineIndex;\n if (isAtLastLine) textarea.scrollTop = textarea.scrollHeight;\n }\n }\n }, 0);\n }, [\n handleRunWithHistory,\n isRunButtonEnabled\n ]);\n const handleStructuredKeyDown = useCallback((e)=>{\n if ('Enter' === e.key && e.metaKey && isRunButtonEnabled) {\n handleRunWithHistory();\n e.preventDefault();\n e.stopPropagation();\n }\n }, [\n handleRunWithHistory,\n isRunButtonEnabled\n ]);\n const renderStructuredParams = useCallback(()=>{\n if (!needsStructuredParams) return null;\n if (actionSpace) {\n const action = actionSpace.find((a)=>a.interfaceAlias === selectedType || a.name === selectedType);\n if ((null == action ? void 0 : action.paramSchema) && isZodObjectSchema(action.paramSchema)) {\n const schema = action.paramSchema;\n const shape = schema.shape || {};\n const schemaKeys = Object.keys(shape);\n if (1 === schemaKeys.length) {\n const key = schemaKeys[0];\n const field = shape[key];\n const { actualField } = unwrapZodType(field);\n const isLocateFieldFlag = isLocateField(actualField);\n const placeholderText = (()=>{\n var _fieldWithRuntime__def;\n const fieldWithRuntime = actualField;\n if (null == (_fieldWithRuntime__def = fieldWithRuntime._def) ? void 0 : _fieldWithRuntime__def.description) return fieldWithRuntime._def.description;\n if (fieldWithRuntime.description) return fieldWithRuntime.description;\n if (actionSpace) {\n const action = actionSpace.find((a)=>a.interfaceAlias === selectedType || a.name === selectedType);\n if ((null == action ? void 0 : action.paramSchema) && 'object' == typeof action.paramSchema && 'shape' in action.paramSchema) {\n var _fieldDef__def;\n const shape = action.paramSchema.shape || {};\n const fieldDef = shape[key];\n if (null == fieldDef ? void 0 : null == (_fieldDef__def = fieldDef._def) ? void 0 : _fieldDef__def.description) return fieldDef._def.description;\n if (null == fieldDef ? void 0 : fieldDef.description) return fieldDef.description;\n }\n }\n if (isLocateFieldFlag) return 'Describe the element you want to interact with';\n if ('keyName' === key) return 'Enter key name or text to type';\n if ('value' === key) return 'Enter text to input';\n return `Enter ${key}`;\n })();\n return /*#__PURE__*/ jsx(Form.Item, {\n name: [\n 'params',\n key\n ],\n style: {\n margin: 0\n },\n children: /*#__PURE__*/ jsx(Input.TextArea, {\n className: \"main-side-console-input-textarea\",\n rows: 4,\n placeholder: placeholderText,\n autoFocus: true,\n onKeyDown: handleStructuredKeyDown\n })\n });\n }\n const fields = [];\n const sortedKeys = schemaKeys.sort((keyA, keyB)=>{\n const fieldSchemaA = shape[keyA];\n const fieldSchemaB = shape[keyB];\n const { isOptional: isOptionalA } = unwrapZodType(fieldSchemaA);\n const { isOptional: isOptionalB } = unwrapZodType(fieldSchemaB);\n if (!isOptionalA && isOptionalB) return -1;\n if (isOptionalA && !isOptionalB) return 1;\n return 0;\n });\n sortedKeys.forEach((key, index)=>{\n var _actualField__def, _actualField__def1, _actualField__def2;\n const fieldSchema = shape[key];\n const { actualField, isOptional } = unwrapZodType(fieldSchema);\n const isLocateFieldFlag = isLocateField(actualField);\n const label = key.charAt(0).toUpperCase() + key.slice(1);\n const isRequired = !isOptional;\n const marginBottom = index === sortedKeys.length - 1 ? 0 : 12;\n const placeholder = (()=>{\n var _fieldWithRuntime__def;\n const fieldWithRuntime = actualField;\n if (null == (_fieldWithRuntime__def = fieldWithRuntime._def) ? void 0 : _fieldWithRuntime__def.description) return fieldWithRuntime._def.description;\n if (fieldWithRuntime.description) return fieldWithRuntime.description;\n if (actionSpace) {\n const action = actionSpace.find((a)=>a.interfaceAlias === selectedType || a.name === selectedType);\n if ((null == action ? void 0 : action.paramSchema) && 'object' == typeof action.paramSchema && 'shape' in action.paramSchema) {\n var _fieldDef__def;\n const shape = action.paramSchema.shape || {};\n const fieldDef = shape[key];\n if (null == fieldDef ? void 0 : null == (_fieldDef__def = fieldDef._def) ? void 0 : _fieldDef__def.description) return fieldDef._def.description;\n if (null == fieldDef ? void 0 : fieldDef.description) return fieldDef.description;\n }\n }\n if (isLocateFieldFlag) return 'Describe the element you want to interact with';\n })();\n const fieldProps = {\n name: key,\n label,\n fieldSchema: actualField,\n isRequired,\n marginBottom,\n placeholder\n };\n if (isLocateFieldFlag) fields.push(/*#__PURE__*/ jsx(LocateField, {\n ...fieldProps\n }, key));\n else if ((null == (_actualField__def = actualField._def) ? void 0 : _actualField__def.typeName) === 'ZodEnum') fields.push(/*#__PURE__*/ jsx(EnumField, {\n ...fieldProps\n }, key));\n else if ((null == (_actualField__def1 = actualField._def) ? void 0 : _actualField__def1.typeName) === 'ZodNumber') fields.push(/*#__PURE__*/ jsx(NumberField, {\n ...fieldProps\n }, key));\n else if ((null == (_actualField__def2 = actualField._def) ? void 0 : _actualField__def2.typeName) === 'ZodBoolean') fields.push(/*#__PURE__*/ jsx(BooleanField, {\n ...fieldProps\n }, key));\n else fields.push(/*#__PURE__*/ jsx(TextField, {\n ...fieldProps\n }, key));\n });\n if ('aiScroll' === selectedType) {\n const directionField = fields.find((field)=>/*#__PURE__*/ react.isValidElement(field) && 'direction' === field.props.name);\n const distanceField = fields.find((field)=>/*#__PURE__*/ react.isValidElement(field) && 'distance' === field.props.name);\n const otherFields = fields.filter((field)=>/*#__PURE__*/ react.isValidElement(field) && 'direction' !== field.props.name && 'distance' !== field.props.name);\n if (directionField && distanceField) return /*#__PURE__*/ jsxs(\"div\", {\n className: \"structured-params\",\n children: [\n /*#__PURE__*/ jsxs(\"div\", {\n style: {\n display: 'flex',\n gap: 12,\n marginBottom: 12\n },\n children: [\n directionField,\n distanceField\n ]\n }),\n otherFields\n ]\n });\n }\n return /*#__PURE__*/ jsx(\"div\", {\n className: \"structured-params\",\n children: fields\n });\n }\n }\n return null;\n }, [\n selectedType,\n needsStructuredParams,\n actionSpace,\n handleStructuredKeyDown\n ]);\n const handleMouseEnter = useCallback(()=>{\n setHoveringSettings(true);\n }, []);\n const handleMouseLeave = useCallback(()=>{\n setHoveringSettings(false);\n }, []);\n const renderActionButton = useCallback(()=>{\n const runButton = (text)=>/*#__PURE__*/ jsx(Button, {\n type: \"primary\",\n icon: /*#__PURE__*/ jsx(SendOutlined, {}),\n style: {\n borderRadius: 20,\n zIndex: 999\n },\n onClick: handleRunWithHistory,\n disabled: !isRunButtonEnabled,\n loading: loading,\n children: text\n });\n if (dryMode) return 'aiAct' === selectedType ? /*#__PURE__*/ jsx(Tooltip, {\n title: \"Start executing until some interaction actions need to be performed. You can see the process of planning and locating.\",\n children: runButton('Dry Run')\n }) : runButton('Run');\n if (stoppable) return /*#__PURE__*/ jsx(Button, {\n icon: /*#__PURE__*/ jsx(BorderOutlined, {}),\n onClick: onStop,\n style: {\n borderRadius: 20,\n zIndex: 999\n },\n children: \"Stop\"\n });\n return runButton('Run');\n }, [\n dryMode,\n loading,\n handleRunWithHistory,\n onStop,\n isRunButtonEnabled,\n selectedType,\n stoppable\n ]);\n return /*#__PURE__*/ jsxs(\"div\", {\n className: \"prompt-input-wrapper\",\n children: [\n /*#__PURE__*/ jsxs(\"div\", {\n className: \"mode-radio-group-wrapper\",\n children: [\n /*#__PURE__*/ jsxs(\"div\", {\n className: \"mode-radio-group\",\n ref: modeRadioGroupRef,\n children: [\n /*#__PURE__*/ jsx(Form.Item, {\n name: \"type\",\n style: {\n margin: 0\n },\n children: /*#__PURE__*/ jsx(Radio.Group, {\n buttonStyle: \"solid\",\n disabled: !runButtonEnabled,\n children: defaultMainButtons.map((apiType)=>{\n var _apiMetadata_apiType;\n return /*#__PURE__*/ jsx(Tooltip, {\n title: (null == (_apiMetadata_apiType = apiMetadata[apiType]) ? void 0 : _apiMetadata_apiType.title) || '',\n children: /*#__PURE__*/ jsx(Radio.Button, {\n value: apiType,\n children: actionNameForType(apiType)\n })\n }, apiType);\n })\n })\n }),\n /*#__PURE__*/ jsx(Dropdown, {\n menu: (()=>{\n const hiddenAPIs = availableDropdownMethods.filter((api)=>!defaultMainButtons.includes(api));\n const groupedItems = [];\n const interactionAPIs = hiddenAPIs.filter((api)=>{\n var _apiMetadata_api;\n return (null == (_apiMetadata_api = apiMetadata[api]) ? void 0 : _apiMetadata_api.group) === 'interaction';\n });\n if (interactionAPIs.length > 0) groupedItems.push({\n key: 'interaction-group',\n type: 'group',\n label: 'Interaction APIs',\n children: interactionAPIs.map((api)=>{\n var _apiMetadata_api;\n return {\n key: api,\n label: actionNameForType(api),\n title: (null == (_apiMetadata_api = apiMetadata[api]) ? void 0 : _apiMetadata_api.title) || '',\n onClick: ()=>{\n form.setFieldValue('type', api);\n }\n };\n })\n });\n const extractionAPIs = hiddenAPIs.filter((api)=>{\n var _apiMetadata_api;\n return (null == (_apiMetadata_api = apiMetadata[api]) ? void 0 : _apiMetadata_api.group) === 'extraction';\n });\n if (extractionAPIs.length > 0) groupedItems.push({\n key: 'extraction-group',\n type: 'group',\n label: 'Data Extraction APIs',\n children: extractionAPIs.map((api)=>{\n var _apiMetadata_api;\n return {\n key: api,\n label: actionNameForType(api),\n title: (null == (_apiMetadata_api = apiMetadata[api]) ? void 0 : _apiMetadata_api.title) || '',\n onClick: ()=>{\n form.setFieldValue('type', api);\n }\n };\n })\n });\n const validationAPIs = hiddenAPIs.filter((api)=>{\n var _apiMetadata_api;\n return (null == (_apiMetadata_api = apiMetadata[api]) ? void 0 : _apiMetadata_api.group) === 'validation';\n });\n if (validationAPIs.length > 0) groupedItems.push({\n key: 'validation-group',\n type: 'group',\n label: 'Validation APIs',\n children: validationAPIs.map((api)=>{\n var _apiMetadata_api;\n return {\n key: api,\n label: actionNameForType(api),\n title: (null == (_apiMetadata_api = apiMetadata[api]) ? void 0 : _apiMetadata_api.title) || '',\n onClick: ()=>{\n form.setFieldValue('type', api);\n }\n };\n })\n });\n const deviceSpecificAPIs = hiddenAPIs.filter((api)=>!apiMetadata[api]);\n if (deviceSpecificAPIs.length > 0) groupedItems.push({\n key: 'device-specific-group',\n type: 'group',\n label: 'Device-Specific APIs',\n children: deviceSpecificAPIs.map((api)=>({\n key: api,\n label: actionNameForType(api),\n title: '',\n onClick: ()=>{\n form.setFieldValue('type', api);\n }\n }))\n });\n return {\n items: groupedItems\n };\n })(),\n placement: \"bottomLeft\",\n trigger: [\n 'click'\n ],\n disabled: !runButtonEnabled,\n children: /*#__PURE__*/ jsxs(Button, {\n className: `more-apis-button ${!defaultMainButtons.includes(selectedType) ? 'selected-from-dropdown' : ''}`,\n children: [\n selectedType && !defaultMainButtons.includes(selectedType) ? actionNameForType(selectedType) : 'more',\n /*#__PURE__*/ jsx(DownOutlined, {\n style: {\n fontSize: '10px',\n marginLeft: '2px'\n }\n })\n ]\n })\n })\n ]\n }),\n /*#__PURE__*/ jsxs(\"div\", {\n className: \"action-icons\",\n children: [\n hasConfigOptions && /*#__PURE__*/ jsx(\"div\", {\n className: hoveringSettings ? 'settings-wrapper settings-wrapper-hover' : 'settings-wrapper',\n onMouseEnter: handleMouseEnter,\n onMouseLeave: handleMouseLeave,\n children: /*#__PURE__*/ jsx(ConfigSelector, {\n enableTracking: 'In-Browser-Extension' === serviceMode,\n showDeepThinkOption: showDeepThinkOption,\n showDataExtractionOptions: showDataExtractionOptions,\n hideDomAndScreenshotOptions: hideDomAndScreenshotOptions\n })\n }),\n /*#__PURE__*/ jsx(HistorySelector, {\n onSelect: handleSelectHistory,\n history: historyForSelectedType,\n currentType: selectedType\n })\n ]\n })\n ]\n }),\n /*#__PURE__*/ jsxs(\"div\", {\n className: `main-side-console-input ${!runButtonEnabled ? 'disabled' : ''} ${loading ? 'loading' : ''}`,\n children: [\n needsAnyInput ? needsStructuredParams ? hasSingleStructuredParam ? renderStructuredParams() : /*#__PURE__*/ jsx(\"div\", {\n className: \"structured-params-container\",\n children: renderStructuredParams()\n }) : /*#__PURE__*/ jsx(Form.Item, {\n name: \"prompt\",\n style: {\n margin: 0\n },\n children: /*#__PURE__*/ jsx(TextArea, {\n className: \"main-side-console-input-textarea\",\n disabled: !runButtonEnabled,\n rows: 4,\n placeholder: placeholder,\n autoFocus: true,\n onKeyDown: handleKeyDown,\n onChange: handlePromptChange,\n ref: textAreaRef\n })\n }) : /*#__PURE__*/ jsxs(\"div\", {\n className: \"no-input-method\",\n style: {\n padding: '20px',\n textAlign: 'center',\n color: '#666',\n fontSize: '14px'\n },\n children: [\n 'Click \"Run\" to execute ',\n actionNameForType(selectedType)\n ]\n }),\n /*#__PURE__*/ jsx(\"div\", {\n className: \"form-controller-wrapper\",\n children: renderActionButton()\n })\n ]\n })\n ]\n });\n};\nexport { PromptInput };\n","import { Fragment, jsx, jsxs } from \"react/jsx-runtime\";\nimport icons, { ArrowDownOutlined, ClearOutlined, LoadingOutlined } from \"@ant-design/icons\";\nimport { Button, Form, List, Tooltip, Typography, message } from \"antd\";\nimport { useCallback, useEffect, useMemo, useState } from \"react\";\nimport { usePlaygroundExecution } from \"../../hooks/usePlaygroundExecution.mjs\";\nimport { usePlaygroundState } from \"../../hooks/usePlaygroundState.mjs\";\nimport { useEnvConfig } from \"../../store/store.mjs\";\nimport { ContextPreview } from \"../context-preview/index.mjs\";\nimport { EnvConfigReminder } from \"../env-config-reminder/index.mjs\";\nimport { PlaygroundResultView } from \"../playground-result/index.mjs\";\nimport \"./index.css\";\nimport avatar from \"../../icons/avatar.mjs\";\nimport { PromptInput } from \"../prompt-input/index.mjs\";\nimport { createStorageProvider, detectBestStorageType } from \"./providers/storage-provider.mjs\";\nconst { Text } = Typography;\nfunction getSDKId(sdk) {\n if (sdk.id && 'string' == typeof sdk.id) return `agent-${sdk.id}`;\n return 'playground-default';\n}\nfunction ErrorMessage(param) {\n let { error } = param;\n if (!error) return null;\n return /*#__PURE__*/ jsxs(Tooltip, {\n title: /*#__PURE__*/ jsx(\"span\", {\n style: {\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-all'\n },\n children: error\n }),\n overlayStyle: {\n maxWidth: '100vw'\n },\n children: [\n \"Error: \",\n error.split('\\n')[0]\n ]\n });\n}\nfunction UniversalPlayground(param) {\n let { playgroundSDK, storage, contextProvider, config: componentConfig = {}, branding = {}, className = '', dryMode = false, showContextPreview = true } = param;\n const [form] = Form.useForm();\n const { config } = useEnvConfig();\n const [sdkReady, setSdkReady] = useState(false);\n useEffect(()=>{\n const initializeSDK = async ()=>{\n if (playgroundSDK && 'function' == typeof playgroundSDK.checkStatus) try {\n await playgroundSDK.checkStatus();\n setSdkReady(true);\n } catch (error) {\n console.warn('Failed to initialize SDK, using default namespace:', error);\n setSdkReady(true);\n }\n else setSdkReady(true);\n };\n initializeSDK();\n }, [\n playgroundSDK\n ]);\n const effectiveStorage = useMemo(()=>{\n if (storage) return storage;\n if (!sdkReady) return null;\n const namespace = componentConfig.storageNamespace || getSDKId(playgroundSDK);\n const bestStorageType = detectBestStorageType();\n console.log(`Using ${bestStorageType} storage for namespace: ${namespace}`);\n return createStorageProvider(bestStorageType, namespace);\n }, [\n storage,\n sdkReady,\n componentConfig.storageNamespace,\n playgroundSDK\n ]);\n const { loading, setLoading, infoList, setInfoList, actionSpace, actionSpaceLoading, uiContextPreview, setUiContextPreview, showScrollToBottomButton, verticalMode, replayCounter, setReplayCounter, infoListRef, currentRunningIdRef, interruptedFlagRef, clearInfoList, handleScrollToBottom } = usePlaygroundState(playgroundSDK, effectiveStorage, contextProvider);\n const { handleRun: executeAction, handleStop, canStop } = usePlaygroundExecution(playgroundSDK, effectiveStorage, actionSpace, loading, setLoading, infoList, setInfoList, replayCounter, setReplayCounter, verticalMode, currentRunningIdRef, interruptedFlagRef);\n useEffect(()=>{\n if ((null == playgroundSDK ? void 0 : playgroundSDK.overrideConfig) && config) playgroundSDK.overrideConfig(config).catch((error)=>{\n console.error('Failed to override SDK config:', error);\n });\n }, [\n playgroundSDK,\n config\n ]);\n const handleFormRun = useCallback(async ()=>{\n try {\n const value = form.getFieldsValue();\n await executeAction(value);\n } catch (error) {\n message.error((null == error ? void 0 : error.message) || 'Execution failed');\n }\n }, [\n form,\n executeAction\n ]);\n const configAlreadySet = Object.keys(config || {}).length >= 1;\n const runButtonEnabled = componentConfig.serverMode || !dryMode && !actionSpaceLoading && configAlreadySet;\n const selectedType = Form.useWatch('type', form);\n const finalShowContextPreview = showContextPreview && false !== componentConfig.showContextPreview;\n const layout = componentConfig.layout || 'vertical';\n const showVersionInfo = false !== componentConfig.showVersionInfo;\n return /*#__PURE__*/ jsx(\"div\", {\n className: `playground-container ${layout}-mode ${className}`.trim(),\n children: /*#__PURE__*/ jsxs(Form, {\n form: form,\n onFinish: handleFormRun,\n className: \"command-form\",\n children: [\n finalShowContextPreview && /*#__PURE__*/ jsx(\"div\", {\n className: \"context-preview-section\",\n children: /*#__PURE__*/ jsx(ContextPreview, {\n uiContextPreview: uiContextPreview,\n setUiContextPreview: setUiContextPreview,\n showContextPreview: finalShowContextPreview\n })\n }),\n /*#__PURE__*/ jsxs(\"div\", {\n className: \"middle-dialog-area\",\n children: [\n infoList.length > 1 && /*#__PURE__*/ jsx(\"div\", {\n className: \"clear-button-container\",\n children: /*#__PURE__*/ jsx(Button, {\n size: \"small\",\n icon: /*#__PURE__*/ jsx(ClearOutlined, {}),\n onClick: clearInfoList,\n type: \"text\",\n className: \"clear-button\"\n })\n }),\n /*#__PURE__*/ jsx(\"div\", {\n ref: infoListRef,\n className: \"info-list-container\",\n children: /*#__PURE__*/ jsx(List, {\n itemLayout: \"vertical\",\n dataSource: infoList,\n renderItem: (item)=>{\n var _item_result;\n return /*#__PURE__*/ jsx(List.Item, {\n className: \"list-item\",\n children: 'user' === item.type ? /*#__PURE__*/ jsx(\"div\", {\n className: \"user-message-container\",\n children: /*#__PURE__*/ jsx(\"div\", {\n className: \"user-message-bubble\",\n children: item.content\n })\n }) : 'progress' === item.type ? /*#__PURE__*/ jsx(\"div\", {\n children: (()=>{\n var _parts_, _item_result, _item_result1, _item_result2;\n const parts = item.content.split(' - ');\n const action = null == (_parts_ = parts[0]) ? void 0 : _parts_.trim();\n const description = parts.slice(1).join(' - ').trim();\n const currentIndex = infoList.findIndex((listItem)=>listItem.id === item.id);\n const laterProgressExists = infoList.slice(currentIndex + 1).some((listItem)=>'progress' === listItem.type);\n const isLatestProgress = !laterProgressExists;\n const shouldShowLoading = loading && isLatestProgress;\n return /*#__PURE__*/ jsxs(Fragment, {\n children: [\n action && /*#__PURE__*/ jsxs(\"span\", {\n className: \"progress-action-item\",\n children: [\n action,\n /*#__PURE__*/ jsx(\"span\", {\n className: `progress-status-icon ${shouldShowLoading ? 'loading' : (null == (_item_result = item.result) ? void 0 : _item_result.error) ? 'error' : 'completed'}`,\n children: shouldShowLoading ? /*#__PURE__*/ jsx(LoadingOutlined, {\n spin: true\n }) : (null == (_item_result1 = item.result) ? void 0 : _item_result1.error) ? \"\\u2717\" : \"\\u2713\"\n })\n ]\n }),\n description && /*#__PURE__*/ jsx(\"div\", {\n children: /*#__PURE__*/ jsx(\"span\", {\n className: \"progress-description\",\n children: description\n })\n }),\n (null == (_item_result2 = item.result) ? void 0 : _item_result2.error) && /*#__PURE__*/ jsx(ErrorMessage, {\n error: item.result.error\n })\n ]\n });\n })()\n }) : 'separator' === item.type ? /*#__PURE__*/ jsxs(\"div\", {\n className: \"new-conversation-separator\",\n children: [\n /*#__PURE__*/ jsx(\"div\", {\n className: \"separator-line\"\n }),\n /*#__PURE__*/ jsx(\"div\", {\n className: \"separator-text-container\",\n children: /*#__PURE__*/ jsx(Text, {\n type: \"secondary\",\n className: \"separator-text\",\n children: item.content\n })\n })\n ]\n }) : /*#__PURE__*/ jsxs(\"div\", {\n className: \"system-message-container\",\n children: [\n /*#__PURE__*/ jsxs(\"div\", {\n className: \"system-message-header\",\n children: [\n /*#__PURE__*/ jsx(icons, {\n component: branding.icon || avatar,\n style: {\n fontSize: 20\n }\n }),\n /*#__PURE__*/ jsx(\"span\", {\n className: \"system-message-title\",\n children: branding.title || 'Playground'\n })\n ]\n }),\n (item.content || item.result) && /*#__PURE__*/ jsxs(\"div\", {\n className: \"system-message-content\",\n children: [\n 'result' === item.type && (null == (_item_result = item.result) ? void 0 : _item_result.error) && /*#__PURE__*/ jsxs(\"div\", {\n className: \"error-message\",\n children: [\n /*#__PURE__*/ jsx(\"div\", {\n className: \"divider\"\n }),\n /*#__PURE__*/ jsx(ErrorMessage, {\n error: item.result.error\n })\n ]\n }),\n 'result' === item.type ? /*#__PURE__*/ jsx(PlaygroundResultView, {\n result: item.result || null,\n loading: item.loading || false,\n serverValid: true,\n serviceMode: 'Server',\n replayScriptsInfo: item.replayScriptsInfo || null,\n replayCounter: item.replayCounter || 0,\n loadingProgressText: item.loadingProgressText || '',\n verticalMode: item.verticalMode || false,\n fitMode: \"width\"\n }) : /*#__PURE__*/ jsxs(Fragment, {\n children: [\n /*#__PURE__*/ jsx(\"div\", {\n className: \"system-message-text\",\n children: item.content\n }),\n item.loading && item.loadingProgressText && /*#__PURE__*/ jsx(\"div\", {\n className: \"loading-progress-text\",\n children: /*#__PURE__*/ jsx(\"span\", {\n children: item.loadingProgressText\n })\n })\n ]\n })\n ]\n })\n ]\n })\n }, item.id);\n }\n })\n }),\n showScrollToBottomButton && false !== componentConfig.enableScrollToBottom && /*#__PURE__*/ jsx(Button, {\n className: \"scroll-to-bottom-button\",\n type: \"primary\",\n shape: \"circle\",\n icon: /*#__PURE__*/ jsx(ArrowDownOutlined, {}),\n onClick: handleScrollToBottom,\n size: \"large\"\n })\n ]\n }),\n /*#__PURE__*/ jsxs(\"div\", {\n className: \"bottom-input-section\",\n children: [\n componentConfig.showEnvConfigReminder ? /*#__PURE__*/ jsx(EnvConfigReminder, {}) : null,\n /*#__PURE__*/ jsx(PromptInput, {\n runButtonEnabled: runButtonEnabled,\n form: form,\n serviceMode: 'Server',\n selectedType: selectedType,\n dryMode: dryMode,\n stoppable: canStop,\n loading: loading,\n onRun: handleFormRun,\n onStop: handleStop,\n actionSpace: actionSpace\n })\n ]\n }),\n showVersionInfo && branding.version && /*#__PURE__*/ jsx(\"div\", {\n className: \"version-info-section\",\n children: /*#__PURE__*/ jsxs(\"span\", {\n className: \"version-text\",\n children: [\n \"Midscene.js version: \",\n branding.version\n ]\n })\n })\n ]\n })\n });\n}\nconst universal_playground = UniversalPlayground;\nexport { UniversalPlayground, universal_playground as default };\n","import { useCallback, useEffect, useRef, useState } from \"react\";\nimport { createStorageProvider, detectBestStorageType } from \"../component/universal-playground/providers/storage-provider.mjs\";\nimport { WELCOME_MESSAGE_TEMPLATE } from \"../utils/constants.mjs\";\nfunction usePlaygroundState(playgroundSDK, storage, contextProvider) {\n const [loading, setLoading] = useState(false);\n const [infoList, setInfoList] = useState([]);\n const [actionSpace, setActionSpace] = useState([]);\n const [actionSpaceLoading, setActionSpaceLoading] = useState(true);\n const [uiContextPreview, setUiContextPreview] = useState();\n const [showScrollToBottomButton, setShowScrollToBottomButton] = useState(false);\n const [verticalMode, setVerticalMode] = useState(false);\n const [replayCounter, setReplayCounter] = useState(0);\n const infoListRef = useRef(null);\n const currentRunningIdRef = useRef(null);\n const interruptedFlagRef = useRef({});\n const initializedRef = useRef(false);\n useEffect(()=>{\n const migrateFromOldNamespace = async ()=>{\n const oldStorage = createStorageProvider(detectBestStorageType(), 'playground-default');\n try {\n if (null == oldStorage ? void 0 : oldStorage.loadMessages) {\n const oldMessages = await oldStorage.loadMessages();\n if (oldMessages.length > 1) {\n console.log('Found data in old namespace, migrating...');\n if (null == storage ? void 0 : storage.saveMessages) await storage.saveMessages(oldMessages);\n if (oldStorage.clearMessages) await oldStorage.clearMessages();\n return oldMessages;\n }\n }\n } catch (error) {\n console.debug('No data found in old namespace:', error);\n }\n return [];\n };\n const initializeMessages = async ()=>{\n const welcomeMessage = {\n ...WELCOME_MESSAGE_TEMPLATE,\n id: 'welcome',\n timestamp: new Date()\n };\n if (null == storage ? void 0 : storage.loadMessages) try {\n let storedMessages = await storage.loadMessages();\n if (0 === storedMessages.length) storedMessages = await migrateFromOldNamespace();\n const hasWelcomeMessage = storedMessages.some((msg)=>'welcome' === msg.id);\n hasWelcomeMessage ? setInfoList(storedMessages) : setInfoList([\n welcomeMessage,\n ...storedMessages\n ]);\n } catch (error) {\n console.error('Failed to load messages:', error);\n setInfoList([\n welcomeMessage\n ]);\n }\n else setInfoList([\n welcomeMessage\n ]);\n };\n if (storage && !initializedRef.current) {\n initializedRef.current = true;\n initializeMessages();\n } else if (!storage && 0 === infoList.length) initializeMessages();\n }, [\n storage\n ]);\n useEffect(()=>{\n if ((null == storage ? void 0 : storage.saveMessages) && infoList.length > 1) storage.saveMessages(infoList).catch((error)=>{\n if (error instanceof DOMException && 'QuotaExceededError' === error.name) console.warn('Storage quota exceeded - some messages may not be saved persistently');\n else console.error('Failed to save messages:', error);\n });\n }, [\n infoList,\n storage\n ]);\n useEffect(()=>{\n if (!(null == contextProvider ? void 0 : contextProvider.getUIContext) || uiContextPreview) return;\n contextProvider.getUIContext().then((context)=>setUiContextPreview(context)).catch((error)=>{\n console.error('Failed to get UI context:', error);\n });\n }, [\n contextProvider,\n uiContextPreview\n ]);\n useEffect(()=>{\n const loadActionSpace = async ()=>{\n setActionSpaceLoading(true);\n try {\n var _contextProvider_getUIContext;\n if (!playgroundSDK) return void setActionSpace([]);\n const context = uiContextPreview || await (null == contextProvider ? void 0 : null == (_contextProvider_getUIContext = contextProvider.getUIContext) ? void 0 : _contextProvider_getUIContext.call(contextProvider));\n const space = await playgroundSDK.getActionSpace(context);\n setActionSpace(space || []);\n } catch (error) {\n console.error('Failed to load action space:', error);\n setActionSpace([]);\n } finally{\n setActionSpaceLoading(false);\n }\n };\n loadActionSpace();\n }, [\n playgroundSDK,\n uiContextPreview,\n contextProvider\n ]);\n useEffect(()=>{\n const sizeThreshold = 750;\n setVerticalMode(window.innerWidth < sizeThreshold);\n const handleResize = ()=>{\n setVerticalMode(window.innerWidth < sizeThreshold);\n };\n window.addEventListener('resize', handleResize);\n return ()=>window.removeEventListener('resize', handleResize);\n }, []);\n const scrollToBottom = useCallback(()=>{\n setTimeout(()=>{\n if (infoListRef.current) infoListRef.current.scrollTop = infoListRef.current.scrollHeight;\n }, 100);\n }, []);\n const checkIfScrolledToBottom = useCallback(()=>{\n if (infoListRef.current) {\n const { scrollTop, scrollHeight, clientHeight } = infoListRef.current;\n const isAtBottom = scrollTop + clientHeight >= scrollHeight - 10;\n setShowScrollToBottomButton(!isAtBottom);\n }\n }, []);\n const handleScrollToBottom = useCallback(()=>{\n if (infoListRef.current) {\n infoListRef.current.scrollTo({\n top: infoListRef.current.scrollHeight,\n behavior: 'smooth'\n });\n setShowScrollToBottomButton(false);\n }\n }, []);\n useEffect(()=>{\n if (infoList.length > 0) scrollToBottom();\n }, [\n infoList,\n scrollToBottom\n ]);\n useEffect(()=>{\n const container = infoListRef.current;\n if (container) {\n container.addEventListener('scroll', checkIfScrolledToBottom);\n checkIfScrolledToBottom();\n return ()=>{\n container.removeEventListener('scroll', checkIfScrolledToBottom);\n };\n }\n }, [\n checkIfScrolledToBottom\n ]);\n const clearInfoList = useCallback(async ()=>{\n const welcomeMessage = {\n ...WELCOME_MESSAGE_TEMPLATE,\n id: 'welcome',\n timestamp: new Date()\n };\n setInfoList([\n welcomeMessage\n ]);\n if (null == storage ? void 0 : storage.clearMessages) try {\n await storage.clearMessages();\n } catch (error) {\n console.error('Failed to clear stored messages:', error);\n }\n }, [\n storage\n ]);\n const refreshContext = useCallback(async ()=>{\n if (null == contextProvider ? void 0 : contextProvider.refreshContext) try {\n const newContext = await contextProvider.refreshContext();\n setUiContextPreview(newContext);\n } catch (error) {\n console.error('Failed to refresh context:', error);\n }\n }, [\n contextProvider\n ]);\n return {\n loading,\n setLoading,\n infoList,\n setInfoList,\n actionSpace,\n actionSpaceLoading,\n uiContextPreview,\n setUiContextPreview,\n showScrollToBottomButton,\n verticalMode,\n replayCounter,\n setReplayCounter,\n infoListRef,\n currentRunningIdRef,\n interruptedFlagRef,\n clearInfoList,\n refreshContext,\n handleScrollToBottom,\n scrollToBottom\n };\n}\nexport { usePlaygroundState };\n","import { useCallback } from \"react\";\nimport { useEnvConfig } from \"../store/store.mjs\";\nimport { noReplayAPIs } from \"@midscene/playground\";\nimport { BLANK_RESULT } from \"../utils/constants.mjs\";\nimport { allScriptsFromDump } from \"../utils/replay-scripts.mjs\";\nfunction usePlaygroundExecution(playgroundSDK, storage, actionSpace, loading, setLoading, infoList, setInfoList, replayCounter, setReplayCounter, verticalMode, currentRunningIdRef, interruptedFlagRef) {\n const { deepThink, screenshotIncluded, domIncluded } = useEnvConfig();\n const handleRun = useCallback(async (value)=>{\n if (!playgroundSDK) return void console.warn('PlaygroundSDK is not available');\n const thisRunningId = Date.now();\n const actionType = value.type;\n const displayContent = `${value.type}: ${value.prompt || JSON.stringify(value.params)}`;\n const userItem = {\n id: `user-${Date.now()}`,\n type: 'user',\n content: displayContent,\n timestamp: new Date()\n };\n setInfoList((prev)=>[\n ...prev,\n userItem\n ]);\n setLoading(true);\n const result = {\n ...BLANK_RESULT\n };\n const systemItem = {\n id: `system-${thisRunningId}`,\n type: 'system',\n content: '',\n timestamp: new Date(),\n loading: true,\n loadingProgressText: ''\n };\n setInfoList((prev)=>[\n ...prev,\n systemItem\n ]);\n try {\n currentRunningIdRef.current = thisRunningId;\n interruptedFlagRef.current[thisRunningId] = false;\n if (playgroundSDK.onProgressUpdate) playgroundSDK.onProgressUpdate(()=>{});\n if (playgroundSDK.onProgressUpdate) playgroundSDK.onProgressUpdate((tip)=>{\n if (interruptedFlagRef.current[thisRunningId]) return;\n setInfoList((prev)=>{\n const lastItem = prev[prev.length - 1];\n if (lastItem && 'progress' === lastItem.type && lastItem.content === tip) return prev;\n const progressItem = {\n id: `progress-${thisRunningId}-${Date.now()}`,\n type: 'progress',\n content: tip,\n timestamp: new Date()\n };\n return [\n ...prev,\n progressItem\n ];\n });\n });\n result.result = await playgroundSDK.executeAction(actionType, value, {\n requestId: thisRunningId.toString(),\n deepThink,\n screenshotIncluded,\n domIncluded\n });\n if ('object' == typeof result.result && null !== result.result) {\n const resultObj = result.result;\n if (resultObj.dump) result.dump = resultObj.dump;\n if (resultObj.reportHTML) result.reportHTML = resultObj.reportHTML;\n if (resultObj.error) result.error = resultObj.error;\n if (void 0 !== resultObj.result) result.result = resultObj.result;\n }\n } catch (e) {\n result.error = (null == e ? void 0 : e.message) || String(e);\n console.error('Playground execution error:', e);\n }\n if (interruptedFlagRef.current[thisRunningId]) return;\n setLoading(false);\n currentRunningIdRef.current = null;\n let replayInfo = null;\n let counter = replayCounter;\n if ((null == result ? void 0 : result.dump) && !noReplayAPIs.includes(actionType)) {\n const info = allScriptsFromDump(result.dump);\n setReplayCounter((c)=>c + 1);\n replayInfo = info;\n counter = replayCounter + 1;\n }\n setInfoList((prev)=>prev.map((item)=>item.id === `system-${thisRunningId}` ? {\n ...item,\n content: '',\n loading: false,\n loadingProgressText: ''\n } : item));\n const resultItem = {\n id: `result-${thisRunningId}`,\n type: 'result',\n content: 'Execution result',\n timestamp: new Date(),\n result: result,\n loading: false,\n replayScriptsInfo: replayInfo,\n replayCounter: counter,\n loadingProgressText: '',\n verticalMode: verticalMode\n };\n setInfoList((prev)=>[\n ...prev,\n resultItem\n ]);\n if (null == storage ? void 0 : storage.saveResult) try {\n await storage.saveResult(resultItem.id, resultItem);\n } catch (error) {\n console.error('Failed to save result:', error);\n }\n const separatorItem = {\n id: `separator-${thisRunningId}`,\n type: 'separator',\n content: 'New Session',\n timestamp: new Date()\n };\n setInfoList((prev)=>[\n ...prev,\n separatorItem\n ]);\n }, [\n playgroundSDK,\n storage,\n actionSpace,\n setLoading,\n setInfoList,\n replayCounter,\n setReplayCounter,\n verticalMode,\n currentRunningIdRef,\n interruptedFlagRef,\n deepThink,\n screenshotIncluded,\n domIncluded\n ]);\n const handleStop = useCallback(async ()=>{\n const thisRunningId = currentRunningIdRef.current;\n if (thisRunningId && playgroundSDK && playgroundSDK.cancelExecution) try {\n await playgroundSDK.cancelExecution(thisRunningId.toString());\n interruptedFlagRef.current[thisRunningId] = true;\n setLoading(false);\n if (playgroundSDK.onProgressUpdate) playgroundSDK.onProgressUpdate(()=>{});\n setInfoList((prev)=>prev.map((item)=>item.id === `system-${thisRunningId}` && item.loading ? {\n ...item,\n content: 'Operation stopped',\n loading: false,\n loadingProgressText: ''\n } : item));\n const separatorItem = {\n id: `separator-${thisRunningId}`,\n type: 'separator',\n content: 'New Session',\n timestamp: new Date()\n };\n setInfoList((prev)=>[\n ...prev,\n separatorItem\n ]);\n } catch (error) {\n console.error('Failed to stop execution:', error);\n }\n }, [\n playgroundSDK,\n currentRunningIdRef,\n interruptedFlagRef,\n setLoading,\n setInfoList\n ]);\n const canStop = loading && !!currentRunningIdRef.current && !!playgroundSDK && !!playgroundSDK.cancelExecution;\n return {\n handleRun,\n handleStop,\n canStop\n };\n}\nexport { usePlaygroundExecution };\n","import { PlaygroundSDK } from '@midscene/playground';\nimport {\n Logo,\n NavActions,\n UniversalPlayground,\n useEnvConfig,\n} from '@midscene/visualizer';\nimport { useEffect, useMemo } from 'react';\nimport './index.less';\n\ndeclare const __APP_VERSION__: string;\n\n/**\n * Playground panel component for Android Playground using Universal Playground\n * Replaces the left panel with form and results\n */\nexport default function PlaygroundPanel() {\n // Get config from the global state\n const { config } = useEnvConfig();\n\n // Initialize PlaygroundSDK for remote execution\n const playgroundSDK = useMemo(() => {\n return new PlaygroundSDK({\n type: 'remote-execution',\n });\n }, []);\n\n // Check server status on mount to initialize SDK ID\n useEffect(() => {\n const checkServer = async () => {\n try {\n const online = await playgroundSDK.checkStatus();\n console.log(\n '[DEBUG] Android playground server status:',\n online,\n 'ID:',\n playgroundSDK.id,\n );\n } catch (error) {\n console.error(\n 'Failed to check android playground server status:',\n error,\n );\n }\n };\n\n checkServer();\n }, [playgroundSDK]);\n\n // Override SDK config when configuration changes\n useEffect(() => {\n if (playgroundSDK.overrideConfig && config) {\n playgroundSDK.overrideConfig(config).catch((error) => {\n console.error('Failed to override SDK config:', error);\n });\n }\n }, [playgroundSDK, config]);\n\n return (\n <div className=\"playground-panel\">\n {/* Header with Logo and Config */}\n <div className=\"playground-panel-header\">\n <div className=\"header-row\">\n <Logo />\n <NavActions showTooltipWhenEmpty={false} showModelName={false} />\n </div>\n </div>\n\n {/* Main playground area */}\n <div className=\"playground-panel-playground\">\n <UniversalPlayground\n playgroundSDK={playgroundSDK}\n config={{\n showContextPreview: false,\n layout: 'vertical',\n showVersionInfo: true,\n enableScrollToBottom: true,\n serverMode: true,\n showEnvConfigReminder: true,\n }}\n branding={{\n title: 'Android Playground',\n version: __APP_VERSION__,\n }}\n className=\"playground-container\"\n />\n </div>\n </div>\n );\n}\n","import * as React from \"react\";\nconst SvgLinked = props => <svg xmlns=\"http://www.w3.org/2000/svg\" width={16} height={16} fill=\"none\" viewBox=\"0 0 16 16\" {...props}><path fill=\"#000\" fillOpacity={0.25} fillRule=\"evenodd\" d=\"M9.68 2c1.2-1.2 3.2-1.28 4.4-.08s1.12 3.2-.08 4.4l-2.16 2.16c-.24.24-.56.24-.8 0s-.24-.56 0-.8l2.16-2.16c.8-.8.8-2.08.08-2.8s-2-.72-2.8.08L8.32 4.96c-.24.24-.56.24-.8 0s-.24-.56 0-.8zM5.6 13.2l2.16-2.16c.24-.24.56-.24.8 0s.24.56 0 .8L6.4 14c-1.2 1.2-3.12 1.36-4.4.08-1.36-1.28-1.2-3.2.08-4.4l2.16-2.16c.24-.24.56-.24.8 0s.24.56 0 .8l-2.16 2.16c-.8.8-.88 2-.08 2.8s2 .72 2.8-.08m4.64-8.24c.24-.24.64-.24.96 0 .24.24.24.64 0 .96L5.92 11.2c-.24.24-.64.24-.96 0-.24-.24-.24-.64 0-.96z\" clipRule=\"evenodd\" /></svg>;\nexport default SvgLinked;","import * as React from \"react\";\nconst SvgScreenshot = props => <svg xmlns=\"http://www.w3.org/2000/svg\" width={16} height={16} fill=\"none\" viewBox=\"0 0 16 16\" {...props}><g fill=\"#606266\" clipPath=\"url(#screenshot_svg__a)\"><path d=\"m4.883 2.663-.858 2.001h-2.69v8.673h13.341V4.664H11.32l-.859-2zm-1.738.667.858-2.001h7.338l.858 2.001h2.477a1.334 1.334 0 0 1 1.334 1.334v8.673a1.335 1.335 0 0 1-1.334 1.334H1.334A1.334 1.334 0 0 1 0 13.337V4.664A1.334 1.334 0 0 1 1.334 3.33z\" /><path d=\"M8.005 10.001a1.334 1.334 0 1 0 0-2.668 1.334 1.334 0 0 0 0 2.668m0 1.335a2.668 2.668 0 1 1 0-5.337 2.668 2.668 0 0 1 0 5.337m3.336-6.004h.667q.667 0 .667.667 0 .666-.667.667h-.667q-.667 0-.667-.667t.667-.667\" /></g><defs><clipPath id=\"screenshot_svg__a\"><path fill=\"#fff\" d=\"M0 0h16v16H0z\" /></clipPath></defs></svg>;\nexport default SvgScreenshot;","import * as React from \"react\";\nconst SvgUnlink = props => <svg xmlns=\"http://www.w3.org/2000/svg\" width={16} height={16} fill=\"none\" viewBox=\"0 0 16 16\" {...props}><path fill=\"#FF4550\" d=\"M14.08 1.92C12.88.72 10.88.8 9.68 2L7.52 4.16c-.24.24-.24.56 0 .8s.56.24.8 0l2.16-2.16c.8-.8 2.08-.8 2.8-.08s.72 2-.08 2.8l-2.16 2.16c-.24.24-.24.56 0 .8s.56.24.8 0L14 6.32c1.2-1.2 1.28-3.2.08-4.4m-6.32 9.12L5.6 13.2c-.8.8-2 .88-2.8.08s-.72-2 .08-2.8l2.16-2.16c.24-.24.24-.56 0-.8s-.56-.24-.8 0L2.08 9.68C.8 10.88.64 12.8 2 14.08c1.28 1.28 3.2 1.12 4.4-.08l2.16-2.16c.24-.24.24-.56 0-.8s-.56-.24-.8 0M5.92 4.96c-.24-.24-.64-.24-.96 0-.24.24-.24.64 0 .96l5.28 5.28c.24.24.64.24.96 0 .24-.24.24-.64 0-.96z\" /></svg>;\nexport default SvgUnlink;","import { InfoCircleOutlined } from '@ant-design/icons';\nimport { useServerValid } from '@midscene/visualizer';\nimport { ScrcpyVideoCodecId } from '@yume-chan/scrcpy';\nimport { WebCodecsVideoDecoder } from '@yume-chan/scrcpy-decoder-webcodecs';\nimport {\n BitmapVideoFrameRenderer,\n WebGLVideoFrameRenderer,\n} from '@yume-chan/scrcpy-decoder-webcodecs';\nimport {\n Button,\n Card,\n Col,\n Divider,\n Row,\n Spin,\n Tooltip,\n Typography,\n message,\n} from 'antd';\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n} from 'react';\nimport type { Socket } from 'socket.io-client';\nimport { io } from 'socket.io-client';\nimport LinkedIcon from '../../icons/linked.svg?react';\nimport ScreenshotIcon from '../../icons/screenshot.svg?react';\nimport UnlinkIcon from '../../icons/unlink.svg?react';\nimport './index.less';\n\nconst { Text } = Typography;\n\ninterface ScrcpyProps {\n serverUrl?: string;\n maxSize?: number;\n autoConnect?: boolean;\n autoReconnect?: boolean;\n reconnectInterval?: number;\n}\n\ninterface VideoMetadata {\n codec?: string;\n width?: number;\n height?: number;\n [key: string]: any;\n}\n\nexport interface ScrcpyRefMethods {\n disconnectDevice: () => void;\n}\n\nexport const ScrcpyPlayer = forwardRef<ScrcpyRefMethods, ScrcpyProps>(\n (\n {\n serverUrl,\n maxSize = 1024,\n autoConnect = true,\n autoReconnect = true,\n reconnectInterval = 5000,\n },\n ref,\n ) => {\n const [connecting, setConnecting] = useState(false);\n const [connected, setConnected] = useState(false);\n const [screenInfo, setScreenInfo] = useState<{\n width: number;\n height: number;\n } | null>(null);\n const [deviceId, setDeviceId] = useState<string>('');\n\n const socketRef = useRef<Socket | null>(null);\n const videoContainerRef = useRef<HTMLDivElement>(null);\n const videoElementRef = useRef<HTMLCanvasElement | null>(null);\n const decoderRef = useRef<any>(null);\n const reconnectTimerRef = useRef<NodeJS.Timeout | null>(null);\n const metadataTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n const serverValid = useServerValid(true);\n // create a safe remove child nodes tool function\n const safeRemoveChildNodes = useCallback((parent: Element | null) => {\n if (!parent) return;\n\n try {\n // use a safer way to clear child nodes\n while (parent.firstChild) {\n try {\n parent.removeChild(parent.firstChild);\n } catch (e) {\n console.warn('Failed to remove child, skipping:', e);\n // if remove failed, set it to null to avoid trying to remove again\n if (parent.firstChild) {\n parent.innerHTML = '';\n break;\n }\n }\n }\n } catch (e) {\n console.error('Error clearing container:', e);\n // last resort - directly reset HTML\n try {\n parent.innerHTML = '';\n } catch (innerErr) {\n console.error('Failed to reset innerHTML:', innerErr);\n }\n }\n }, []);\n\n // update canvas size to fit container\n const updateCanvasSize = useCallback(() => {\n if (!videoElementRef.current || !videoContainerRef.current || !screenInfo)\n return;\n\n const container = videoContainerRef.current;\n const canvas = videoElementRef.current;\n const containerWidth = container.clientWidth;\n const containerHeight = container.clientHeight;\n const { width: originalWidth, height: originalHeight } = screenInfo;\n\n // leave 20px padding on top and bottom\n const paddingVertical = 40; // padding on top and bottom, each 20px\n const availableHeight = containerHeight - paddingVertical;\n\n // calculate the size fit to container, keep the aspect ratio\n const aspectRatio = originalWidth / originalHeight;\n let targetWidth = containerWidth;\n let targetHeight = containerWidth / aspectRatio;\n\n if (targetHeight > availableHeight) {\n targetHeight = availableHeight;\n targetWidth = availableHeight * aspectRatio;\n }\n\n // update canvas properties and styles\n canvas.width = originalWidth;\n canvas.height = originalHeight;\n canvas.style.width = `${targetWidth}px`;\n canvas.style.height = `${targetHeight}px`;\n canvas.style.marginTop = '20px';\n canvas.style.marginBottom = '20px';\n }, [screenInfo]);\n\n // listen window size change\n useEffect(() => {\n const handleResize = () => {\n updateCanvasSize();\n };\n\n window.addEventListener('resize', handleResize);\n return () => window.removeEventListener('resize', handleResize);\n }, [updateCanvasSize]);\n\n // when screenInfo updates, adjust the size\n useEffect(() => {\n updateCanvasSize();\n }, [screenInfo, updateCanvasSize]);\n\n // create and initialize renderer\n const createVideoFrameRenderer = async () => {\n // use WebGL renderer first, if not supported, fallback to Bitmap renderer\n if (WebGLVideoFrameRenderer.isSupported) {\n const renderer = new WebGLVideoFrameRenderer();\n return {\n renderer,\n element: renderer.canvas as HTMLCanvasElement,\n };\n }\n\n const renderer = new BitmapVideoFrameRenderer();\n return {\n renderer,\n element: renderer.canvas as HTMLCanvasElement,\n };\n };\n\n // create and initialize decoder\n const createDecoder = async (codecId: ScrcpyVideoCodecId) => {\n // check if WebCodecs API is supported\n if (!WebCodecsVideoDecoder.isSupported) {\n throw new Error(\n 'Current browser does not support WebCodecs API, please use the latest version of Chrome/Edge browser',\n );\n }\n\n // create renderer\n const { renderer, element } = await createVideoFrameRenderer();\n videoElementRef.current = element;\n\n // add video element to page\n if (videoContainerRef.current) {\n const canvasWrapper =\n videoContainerRef.current.querySelector('.canvas-wrapper');\n if (canvasWrapper) {\n // safely clear container\n safeRemoveChildNodes(canvasWrapper);\n canvasWrapper.appendChild(videoElementRef.current);\n }\n }\n\n // create decoder\n return new WebCodecsVideoDecoder({\n codec: codecId,\n renderer: renderer,\n });\n };\n\n // setup video stream processing\n const setupVideoStream = (_metadata: VideoMetadata) => {\n // for tracking if the configuration frame has been received\n let configurationPacketSent = false;\n let pendingDataPackets: any[] = [];\n\n // create transform stream to convert data to Uint8Array\n const transformStream = new TransformStream({\n transform(chunk: any, controller: any) {\n // convert array to Uint8Array\n const packet = {\n type: chunk.type,\n data: new Uint8Array(chunk.data),\n timestamp: chunk.timestamp,\n };\n\n // for configuration frame, we should handle it first\n if (packet.type === 'configuration') {\n controller.enqueue(packet);\n configurationPacketSent = true;\n\n // after sending the configuration frame, send all pending data frames\n if (pendingDataPackets.length > 0) {\n pendingDataPackets.forEach((p) => controller.enqueue(p));\n pendingDataPackets = [];\n }\n } else if (packet.type === 'data') {\n // if the configuration frame has not been received, cache the data frame\n if (!configurationPacketSent) {\n pendingDataPackets.push(packet);\n } else {\n controller.enqueue(packet);\n }\n } else {\n // other types of frames are passed directly\n controller.enqueue(packet);\n }\n },\n });\n\n // create a readable stream to receive video data from the server\n const videoStream = new ReadableStream({\n start(controller) {\n // for tracking if the stream has been closed\n let streamClosed = false;\n\n // receive video data\n const videoDataHandler = (data: any) => {\n // check if the stream has been closed\n if (streamClosed) return;\n\n try {\n controller.enqueue(data);\n } catch (error) {\n console.error(\n 'error occurred while enqueuing video data:',\n error,\n );\n // if an error occurs, mark the stream as closed and clean up\n streamClosed = true;\n cleanupHandlers();\n }\n };\n\n // handle error\n const errorHandler = (error: any) => {\n console.error('stream error:', error);\n if (!streamClosed) {\n controller.error(new Error(error.message));\n streamClosed = true;\n cleanupHandlers();\n }\n };\n\n // handle disconnection\n const disconnectHandler = () => {\n if (!streamClosed) {\n controller.close();\n streamClosed = true;\n cleanupHandlers();\n }\n };\n\n // clean up all event handlers\n const cleanupHandlers = () => {\n if (socketRef.current) {\n socketRef.current.off('video-data', videoDataHandler);\n socketRef.current.off('error', errorHandler);\n socketRef.current.off('disconnect', disconnectHandler);\n }\n };\n\n // register event handlers\n if (socketRef.current) {\n socketRef.current.on('video-data', videoDataHandler);\n socketRef.current.on('error', errorHandler);\n socketRef.current.on('disconnect', disconnectHandler);\n }\n\n // clean up when the stream is cancelled\n return () => {\n streamClosed = true;\n cleanupHandlers();\n };\n },\n });\n\n // handle video stream\n return videoStream.pipeThrough(transformStream);\n };\n\n // screenshot feature\n const takeScreenshot = async () => {\n if (!decoderRef.current) return;\n\n try {\n const blob = await decoderRef.current.snapshot();\n if (blob) {\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = `screenshot_${new Date().toISOString().replace(/:/g, '-')}.png`;\n a.click();\n URL.revokeObjectURL(url);\n }\n } catch (error) {\n console.error('screenshot failed:', error);\n alert('screenshot failed');\n }\n };\n\n // disconnect device\n const disconnectDevice = useCallback(() => {\n // dispose decoder resources\n if (decoderRef.current) {\n try {\n decoderRef.current.dispose();\n decoderRef.current = null;\n } catch (error) {\n console.error('Error disposing decoder:', error);\n }\n }\n\n // clear video container\n if (videoContainerRef.current) {\n const canvasWrapper =\n videoContainerRef.current.querySelector('.canvas-wrapper');\n safeRemoveChildNodes(canvasWrapper);\n }\n\n // disconnect socket\n if (socketRef.current) {\n socketRef.current.disconnect();\n socketRef.current = null;\n }\n\n // clean up timers\n if (reconnectTimerRef.current) {\n clearTimeout(reconnectTimerRef.current);\n reconnectTimerRef.current = null;\n }\n\n if (metadataTimeoutRef.current) {\n clearTimeout(metadataTimeoutRef.current);\n metadataTimeoutRef.current = null;\n }\n\n // reset status\n setConnected(false);\n setConnecting(false);\n setScreenInfo(null);\n }, [safeRemoveChildNodes]);\n\n // Expose methods to parent component\n useImperativeHandle(\n ref,\n () => ({\n disconnectDevice,\n }),\n [disconnectDevice],\n );\n\n // connect device\n const connectDevice = useCallback(async () => {\n try {\n // always clean up previous resources, ensure clean state\n disconnectDevice();\n\n // ensure status reset\n setConnected(false);\n setConnecting(true);\n setScreenInfo(null);\n\n // short delay to ensure resources are cleaned\n await new Promise((resolve) => setTimeout(resolve, 150));\n\n // ensure the component is still mounted and has a valid server URL\n if (!serverUrl) {\n console.error('Cannot connect: missing server URL');\n setConnecting(false);\n return;\n }\n\n // setup metadata timeout check\n const setupMetadataTimeout = () => {\n // clear previous timeout\n if (metadataTimeoutRef.current) {\n clearTimeout(metadataTimeoutRef.current);\n metadataTimeoutRef.current = null;\n }\n\n // setup new timeout check\n metadataTimeoutRef.current = setTimeout(() => {\n if (socketRef.current?.connected) {\n try {\n socketRef.current.emit('connect-device', {\n maxSize,\n });\n\n // setup metadata timeout check again\n setupMetadataTimeout();\n } catch (err) {\n console.error('Failed to request connection:', err);\n message.error(\n 'connection request failed, please refresh the page',\n );\n }\n } else {\n try {\n if (socketRef.current) {\n setTimeout(() => {\n // reconnect after a short delay\n if (socketRef.current) {\n socketRef.current.connect();\n }\n }, 500);\n }\n } catch (err) {\n console.error('Failed to reconnect:', err);\n message.error('reconnection failed, please refresh the page');\n }\n }\n }, 5000);\n };\n\n // connect to server\n if (!socketRef.current) {\n try {\n socketRef.current = io(serverUrl, {\n withCredentials: true,\n reconnection: true,\n reconnectionAttempts: 5,\n reconnectionDelay: 1000,\n timeout: 10000,\n });\n\n // notify parent component after connection is successful\n socketRef.current.on('connect', () => {\n // get device id from socket\n if (socketRef.current?.id) {\n setDeviceId(socketRef.current.id);\n }\n\n if (reconnectTimerRef.current) {\n clearTimeout(reconnectTimerRef.current);\n reconnectTimerRef.current = null;\n }\n\n socketRef.current?.emit('connect-device', {\n maxSize,\n });\n\n // setup metadata timeout check\n setupMetadataTimeout();\n });\n\n // handle video metadata\n socketRef.current.on(\n 'video-metadata',\n async (metadata: VideoMetadata) => {\n try {\n // clear metadata timeout\n if (metadataTimeoutRef.current) {\n clearTimeout(metadataTimeoutRef.current);\n metadataTimeoutRef.current = null;\n }\n\n // if there is already a decoder, clean it first\n if (decoderRef.current) {\n try {\n decoderRef.current.dispose();\n decoderRef.current = null;\n } catch (error) {\n console.error('Error disposing old decoder:', error);\n }\n }\n\n // clean video container\n if (videoContainerRef.current) {\n const canvasWrapper =\n videoContainerRef.current.querySelector(\n '.canvas-wrapper',\n );\n safeRemoveChildNodes(canvasWrapper);\n }\n\n // ensure the metadata object exists, and set the default codec\n // convert string to ScrcpyVideoCodecId enum\n const codecId = metadata?.codec\n ? (metadata.codec as unknown as ScrcpyVideoCodecId)\n : ScrcpyVideoCodecId.H264;\n\n // create decoder\n decoderRef.current = await createDecoder(codecId);\n\n // ensure the decoder is created successfully\n if (!decoderRef.current) {\n throw new Error('Failed to create decoder');\n }\n\n // listen to size change event\n decoderRef.current.sizeChanged(\n ({ width, height }: { width: number; height: number }) => {\n setScreenInfo({ width, height });\n },\n );\n\n // setup video stream processing\n const videoStream = setupVideoStream(metadata);\n\n // pass the video stream to the decoder\n videoStream\n .pipeTo(decoderRef.current.writable)\n .catch((error: Error) => {\n console.error('video stream processing error:', error);\n });\n\n // update UI status\n setConnected(true);\n setConnecting(false);\n // video metadata received successfully, device connected\n } catch (error: any) {\n console.error('Failed to initialize decoder:', error);\n setConnecting(false);\n }\n },\n );\n\n // handle error\n socketRef.current.on('error', (error: Error) => {\n console.error('server error:', error);\n message.error('server error');\n setConnecting(false);\n\n // clear metadata timeout\n if (metadataTimeoutRef.current) {\n clearTimeout(metadataTimeoutRef.current);\n metadataTimeoutRef.current = null;\n }\n });\n\n // handle disconnection event\n socketRef.current.on('disconnect', () => {\n setConnected(false);\n\n // clear metadata timeout\n if (metadataTimeoutRef.current) {\n clearTimeout(metadataTimeoutRef.current);\n metadataTimeoutRef.current = null;\n }\n\n // clean up video container\n if (decoderRef.current) {\n decoderRef.current.dispose();\n decoderRef.current = null;\n }\n\n if (videoContainerRef.current) {\n // safely clear container\n safeRemoveChildNodes(\n videoContainerRef.current.querySelector('.canvas-wrapper'),\n );\n }\n\n if (autoReconnect && !reconnectTimerRef.current) {\n reconnectTimerRef.current = setTimeout(() => {\n reconnectTimerRef.current = null;\n connectDevice();\n }, reconnectInterval);\n }\n });\n } catch (error: any) {\n console.error('Failed to create socket connection:', error);\n setConnecting(false);\n\n if (autoReconnect && !reconnectTimerRef.current) {\n reconnectTimerRef.current = setTimeout(() => {\n reconnectTimerRef.current = null;\n connectDevice();\n }, reconnectInterval);\n }\n }\n } else {\n if (!socketRef.current.connected) {\n socketRef.current.connect();\n } else {\n socketRef.current.emit('connect-device', {\n maxSize,\n });\n\n // setup metadata timeout check\n setupMetadataTimeout();\n }\n }\n } catch (error: any) {\n setConnecting(false);\n console.error(`Failed to connect: ${error.message}`);\n message.error('connection failed');\n\n if (autoReconnect && !reconnectTimerRef.current) {\n reconnectTimerRef.current = setTimeout(() => {\n reconnectTimerRef.current = null;\n connectDevice();\n }, reconnectInterval);\n }\n }\n }, [\n serverUrl,\n maxSize,\n autoReconnect,\n reconnectInterval,\n disconnectDevice,\n ]);\n\n // detect autoConnect change, connect device when autoConnect is true\n useEffect(() => {\n if (autoConnect && !connected && !connecting) {\n // only trigger connection when not connected and not connecting\n const timer = setTimeout(() => {\n connectDevice();\n }, 300);\n\n return () => clearTimeout(timer);\n }\n }, [autoConnect, connected, connecting, connectDevice]);\n\n // resource cleanup useEffect\n useEffect(() => {\n // return cleanup function, called when component unmounts\n return () => {\n // dispose decoder\n if (decoderRef.current) {\n try {\n decoderRef.current.dispose();\n decoderRef.current = null;\n } catch (error) {\n console.error('Error disposing decoder during unmount:', error);\n }\n }\n\n // clean video container\n if (videoContainerRef.current) {\n try {\n const canvasWrapper =\n videoContainerRef.current.querySelector('.canvas-wrapper');\n if (canvasWrapper) {\n // safely clear content instead of removing node\n canvasWrapper.innerHTML = '';\n }\n } catch (error) {\n console.error(\n 'Error clearing canvas wrapper during unmount:',\n error,\n );\n }\n }\n\n // disconnect socket connection\n if (socketRef.current) {\n socketRef.current.disconnect();\n socketRef.current = null;\n }\n\n // clean up all timers\n if (reconnectTimerRef.current) {\n clearTimeout(reconnectTimerRef.current);\n reconnectTimerRef.current = null;\n }\n\n if (metadataTimeoutRef.current) {\n clearTimeout(metadataTimeoutRef.current);\n metadataTimeoutRef.current = null;\n }\n };\n }, []);\n\n return (\n <div className=\"scrcpy-container\">\n <Card>\n {connected && (\n <div className=\"header-bar\">\n <div className=\"header-left\">\n <Text style={{ fontWeight: 600, fontSize: 12 }}>\n Screen Projection\n </Text>\n <Tooltip\n placement=\"bottom\"\n title={`Device ID: ${deviceId || 'Unknown'}`}\n >\n <InfoCircleOutlined />\n </Tooltip>\n </div>\n <div className=\"screen-info\">\n <Text type=\"secondary\">\n size : {screenInfo?.width}×{screenInfo?.height}\n </Text>\n </div>\n <div className=\"header-right\">\n <Tooltip placement=\"bottom\" title=\"Screenshot\">\n <Button icon={<ScreenshotIcon />} onClick={takeScreenshot} />\n </Tooltip>\n <Divider\n type=\"vertical\"\n style={{\n margin: '0 16px',\n }}\n />\n <Tooltip placement=\"bottom\" title=\"Connect Device\">\n <Button\n disabled={connected}\n style={{\n backgroundColor: '#fff',\n }}\n icon={<LinkedIcon />}\n onClick={connectDevice}\n />\n </Tooltip>\n {connected && (\n <>\n <Divider\n type=\"vertical\"\n style={{\n margin: '0 16px',\n }}\n />\n <Tooltip title=\"Disconnect Device\">\n <Button\n icon={<UnlinkIcon />}\n onClick={disconnectDevice}\n />\n </Tooltip>\n </>\n )}\n </div>\n </div>\n )}\n <Row gutter={[16, 16]}>\n <Col span={24}>\n <div className=\"video-section\">\n <div ref={videoContainerRef} className=\"video-container\">\n <div className=\"canvas-wrapper\" />\n {!connected && serverValid && (\n <div className=\"empty-state\">\n <div className=\"empty-state-icon\">📱</div>\n <div className=\"empty-state-text\">\n {connecting\n ? 'Connecting to device...'\n : 'No device connected'}\n </div>\n {!connecting && (\n <Button\n type=\"primary\"\n onClick={() => {\n connectDevice();\n }}\n >\n Connect now\n </Button>\n )}\n {connecting && (\n <div className=\"loading-spinner\">\n <Spin size=\"large\" />\n </div>\n )}\n </div>\n )}\n {!serverValid && (\n <span>Please launch playground server!</span>\n )}\n </div>\n </div>\n </Col>\n </Row>\n </Card>\n </div>\n );\n },\n);\n\nexport default ScrcpyPlayer;\n","import './App.less';\nimport { SCRCPY_SERVER_PORT } from '@midscene/shared/constants';\nimport {\n globalThemeConfig,\n safeOverrideAIConfig,\n useEnvConfig,\n} from '@midscene/visualizer';\nimport { ConfigProvider, Layout, message } from 'antd';\nimport { useEffect, useRef, useState } from 'react';\nimport { Panel, PanelGroup, PanelResizeHandle } from 'react-resizable-panels';\nimport { type Socket, io } from 'socket.io-client';\nimport AdbDevice from './components/adb-device';\nimport PlaygroundPanel from './components/playground-panel';\nimport ScrcpyPlayer, {\n type ScrcpyRefMethods,\n} from './components/scrcpy-player';\n\nconst { Content } = Layout;\n\nexport default function App() {\n // Device and connection state - now simplified since device is pre-selected\n const [selectedDeviceId, setSelectedDeviceId] = useState<string | null>(null);\n const [connectToDevice, setConnectToDevice] = useState(false);\n const [messageApi, contextHolder] = message.useMessage();\n const [serverUrl, setServerUrl] = useState(\n `http://localhost:${SCRCPY_SERVER_PORT}`,\n );\n const [isNarrowScreen, setIsNarrowScreen] = useState(false);\n\n // Configuration state\n const { config } = useEnvConfig();\n\n // Override AI configuration when config changes\n useEffect(() => {\n safeOverrideAIConfig(config);\n }, [config]);\n\n // Get scrcpy port from injected window variable\n useEffect(() => {\n const scrcpyPort = (window as any).SCRCPY_PORT;\n if (scrcpyPort) {\n setServerUrl(`http://localhost:${scrcpyPort}`);\n }\n }, []);\n\n // Socket connection and device management\n const socketRef = useRef<Socket | null>(null);\n const scrcpyPlayerRef = useRef<ScrcpyRefMethods>(null);\n\n // connect to device server - simplified since device is pre-selected\n useEffect(() => {\n if (!serverUrl) return;\n\n const socket = io(serverUrl, {\n withCredentials: true,\n reconnectionAttempts: 5,\n reconnectionDelay: 1000,\n timeout: 5000,\n });\n\n socket.on('connect', () => {\n socket.emit('get-devices');\n });\n\n socket.on(\n 'devices-list',\n (data: {\n devices: { id: string; name: string; status: string }[];\n currentDeviceId: string | null;\n }) => {\n if (data.currentDeviceId) {\n setSelectedDeviceId(data.currentDeviceId);\n // Auto-connect since device is already selected\n setConnectToDevice(true);\n }\n },\n );\n\n socket.on('connect_error', (error: Error) => {\n console.error('Socket.IO connection error:', error);\n messageApi.error(\n 'Waiting for device server connection, please try again later',\n );\n });\n\n socket.on('error', (error: Error) => {\n console.error('Socket.IO error:', error);\n messageApi.error(\n `Error occurred while communicating with the server: ${error.message || 'Unknown error'}`,\n );\n });\n\n socketRef.current = socket;\n\n return () => {\n socket.disconnect();\n };\n }, [messageApi, serverUrl]);\n\n // reset the connection flag\n useEffect(() => {\n if (connectToDevice) {\n // reset the connection flag after a delay\n const timer = setTimeout(() => {\n setConnectToDevice(false);\n }, 800);\n\n return () => clearTimeout(timer);\n }\n }, [connectToDevice]);\n\n // Handle window resize to detect narrow screens\n useEffect(() => {\n const handleResize = () => {\n setIsNarrowScreen(window.innerWidth <= 1024);\n };\n\n // Set initial value\n handleResize();\n\n // Add event listener\n window.addEventListener('resize', handleResize);\n\n // Cleanup\n return () => window.removeEventListener('resize', handleResize);\n }, []);\n\n return (\n <ConfigProvider theme={globalThemeConfig()}>\n {contextHolder}\n <Layout className=\"app-container playground-container vertical-mode\">\n <Content className=\"app-content\">\n <PanelGroup\n autoSaveId=\"android-playground-layout\"\n direction={isNarrowScreen ? 'vertical' : 'horizontal'}\n >\n {/* left panel: PlaygroundPanel with Universal Playground */}\n <Panel\n defaultSize={isNarrowScreen ? 67 : 32}\n maxSize={isNarrowScreen ? 85 : 60}\n minSize={isNarrowScreen ? 67 : 25}\n className=\"app-panel left-panel\"\n >\n <div className=\"panel-content left-panel-content\">\n <PlaygroundPanel />\n </div>\n </Panel>\n\n <PanelResizeHandle\n className={`panel-resize-handle ${isNarrowScreen ? 'vertical' : 'horizontal'}`}\n />\n\n {/* right panel: ScrcpyPlayer */}\n <Panel className=\"app-panel right-panel\">\n <div className=\"panel-content right-panel-content\">\n <AdbDevice\n selectedDeviceId={selectedDeviceId}\n scrcpyPlayerRef={scrcpyPlayerRef}\n />\n <ScrcpyPlayer\n ref={scrcpyPlayerRef}\n serverUrl={serverUrl}\n autoConnect={connectToDevice}\n />\n </div>\n </Panel>\n </PanelGroup>\n </Content>\n </Layout>\n </ConfigProvider>\n );\n}\n","import ReactDOM from 'react-dom/client';\nimport App from './App';\n\nconst rootEl = document.getElementById('root');\nif (rootEl) {\n const root = ReactDOM.createRoot(rootEl);\n root.render(<App />);\n}\n","import { overrideAIConfig } from \"@midscene/shared/env\";\nimport { message } from \"antd\";\nfunction safeOverrideAIConfig(newConfig) {\n let extendMode = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : false, showErrorMessage = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : true;\n try {\n overrideAIConfig(newConfig, extendMode);\n return true;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n console.error('Failed to override AI config:', err);\n if (showErrorMessage) message.error(`Failed to apply AI configuration: ${err.message}`);\n return false;\n }\n}\nfunction useSafeOverrideAIConfig() {\n const applyConfig = function(newConfig) {\n let extendMode = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : false, showErrorMessage = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : true;\n return safeOverrideAIConfig(newConfig, extendMode, showErrorMessage);\n };\n return {\n applyConfig\n };\n}\nexport { safeOverrideAIConfig, useSafeOverrideAIConfig };\n","// getDefaultExport function for compatibility with non-ESM modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};\n","var getProto = Object.getPrototypeOf ? (obj) => (Object.getPrototypeOf(obj)) : (obj) => (obj.__proto__);\nvar leafPrototypes;\n// create a fake namespace object\n// mode & 1: value is a module id, require it\n// mode & 2: merge all properties of value into the ns\n// mode & 4: return value when already ns object\n// mode & 16: return value when it's Promise-like\n// mode & 8|1: behave like require\n__webpack_require__.t = function(value, mode) {\n\tif(mode & 1) value = this(value);\n\tif(mode & 8) return value;\n\tif(typeof value === 'object' && value) {\n\t\tif((mode & 4) && value.__esModule) return value;\n\t\tif((mode & 16) && typeof value.then === 'function') return value;\n\t}\n\tvar ns = Object.create(null);\n __webpack_require__.r(ns);\n\tvar def = {};\n\tleafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];\n\tfor(var current = mode & 2 && value; typeof current == 'object' && !~leafPrototypes.indexOf(current); current = getProto(current)) {\n\t\tObject.getOwnPropertyNames(current).forEach((key) => { def[key] = () => (value[key]) });\n\t}\n\tdef['default'] = () => (value);\n\t__webpack_require__.d(ns, def);\n\treturn ns;\n};","__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(\n\t\tObject.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t\t__webpack_require__.f[key](chunkId, promises);\n\t\t\treturn promises;\n\t\t}, [])\n\t);\n};","// This function allow to reference chunks\n__webpack_require__.u = (chunkId) => {\n // return url for filenames not based on template\n \n // return url for filenames based on template\n return \"static/js/async/\" + chunkId + \".\" + {\"166\": \"834644b5\",\"173\": \"f2381e64\",\"212\": \"850ade70\",\"329\": \"261bc4a1\",\"364\": \"d88c3cff\",\"544\": \"18ac9afb\",\"582\": \"8f4b5264\",\"624\": \"8a1fe2e8\",\"644\": \"910ce3d0\",\"702\": \"1f38a17e\",\"983\": \"b98b40af\",}[chunkId] + \".js\"\n}","// This function allow to reference chunks\n__webpack_require__.miniCssF = (chunkId) => {\n // return url for filenames not based on template\n \n // return url for filenames based on template\n return \"\" + chunkId + \".css\"\n}","__webpack_require__.h = () => (\"16ca3fc721284aa7\")","__webpack_require__.g = (() => {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","var inProgress = {};\n\nvar dataWebpackPrefix = \"android-playground:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = function (url, done, key, chunkId) {\n\tif (inProgress[url]) {\n\t\tinProgress[url].push(done);\n\t\treturn;\n\t}\n\tvar script, needAttach;\n\tif (key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor (var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif (s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) {\n\t\t\t\tscript = s;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tif (!script) {\n\t\tneedAttach = true;\n\t\t\n script = document.createElement('script');\n \n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\t\t\n\t\tscript.src = url;\n\t\t\n \n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = function (prev, event) {\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns &&\n\t\t\tdoneFns.forEach(function (fn) {\n\t\t\t\treturn fn(event);\n\t\t\t});\n\t\tif (prev) return prev(event);\n\t};\n\tvar timeout = setTimeout(\n\t\tonScriptComplete.bind(null, undefined, {\n\t\t\ttype: 'timeout',\n\t\t\ttarget: script\n\t\t}),\n\t\t120000\n\t);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};\n","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.nmd = (module) => {\n module.paths = [];\n if (!module.children) module.children = [];\n return module;\n};","var deferred = [];\n__webpack_require__.O = (result, chunkIds, fn, priority) => {\n\tif (chunkIds) {\n\t\tpriority = priority || 0;\n\t\tfor (var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--)\n\t\t\tdeferred[i] = deferred[i - 1];\n\t\tdeferred[i] = [chunkIds, fn, priority];\n\t\treturn;\n\t}\n\tvar notFulfilled = Infinity;\n\tfor (var i = 0; i < deferred.length; i++) {\n\t\tvar [chunkIds, fn, priority] = deferred[i];\n\t\tvar fulfilled = true;\n\t\tfor (var j = 0; j < chunkIds.length; j++) {\n\t\t\tif (\n\t\t\t\t(priority & (1 === 0) || notFulfilled >= priority) &&\n\t\t\t\tObject.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))\n\t\t\t) {\n\t\t\t\tchunkIds.splice(j--, 1);\n\t\t\t} else {\n\t\t\t\tfulfilled = false;\n\t\t\t\tif (priority < notFulfilled) notFulfilled = priority;\n\t\t\t}\n\t\t}\n\t\tif (fulfilled) {\n\t\t\tdeferred.splice(i--, 1);\n\t\t\tvar r = fn();\n\t\t\tif (r !== undefined) result = r;\n\t\t}\n\t}\n\treturn result;\n};\n","__webpack_require__.p = \"/\";","__webpack_require__.rv = () => (\"1.3.12\")","__webpack_require__.b = document.baseURI || self.location.href;\n\n // object to store loaded and loading chunks\n // undefined = chunk not loaded, null = chunk preloaded/prefetched\n // [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\n var installedChunks = {\"980\": 0,};\n \n __webpack_require__.f.j = function (chunkId, promises) {\n // JSONP chunk loading for javascript\nvar installedChunkData = __webpack_require__.o(installedChunks, chunkId)\n\t? installedChunks[chunkId]\n\t: undefined;\nif (installedChunkData !== 0) {\n\t// 0 means \"already installed\".\n\n\t// a Promise means \"currently loading\".\n\tif (installedChunkData) {\n\t\tpromises.push(installedChunkData[2]);\n\t} else {\n\t\tif (true) {\n\t\t\t// setup Promise in chunk cache\n\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\tpromises.push((installedChunkData[2] = promise));\n\n\t\t\t// start chunk loading\n\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\tvar error = new Error();\n\t\t\tvar loadingEnded = function (event) {\n\t\t\t\tif (__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\tif (installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\tif (installedChunkData) {\n\t\t\t\t\t\tvar errorType =\n\t\t\t\t\t\t\tevent && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\terror.message =\n\t\t\t\t\t\t\t'Loading chunk ' +\n\t\t\t\t\t\t\tchunkId +\n\t\t\t\t\t\t\t' failed.\\n(' +\n\t\t\t\t\t\t\terrorType +\n\t\t\t\t\t\t\t': ' +\n\t\t\t\t\t\t\trealSrc +\n\t\t\t\t\t\t\t')';\n\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t} \n\t}\n}\n\n }\n __webpack_require__.O.j = (chunkId) => (installedChunks[chunkId] === 0);\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar [chunkIds, moreModules, runtime] = data;\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif (chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor (moduleId in moreModules) {\n\t\t\tif (__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif (runtime) var result = runtime(__webpack_require__);\n\t}\n\tif (parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor (; i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif (\n\t\t\t__webpack_require__.o(installedChunks, chunkId) &&\n\t\t\tinstalledChunks[chunkId]\n\t\t) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\treturn __webpack_require__.O(result);\n};\n\nvar chunkLoadingGlobal = self[\"webpackChunkandroid_playground\"] = self[\"webpackChunkandroid_playground\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));\n","__webpack_require__.ruid = \"bundler=rspack@1.3.12\";\n"],"names":["Object","Symbol","window","URLSearchParams","localStorage","e","s","Error","M","Map","Date","Math","console","JSON","Boolean","r","Number","o","fetch","Array","encodeURIComponent","setInterval","clearInterval","arguments","Promise","setTimeout","onlineStatus","color","selectedDeviceId","scrcpyPlayerRef","messageApi","contextHolder","message","serverValid","useServerValid","useCallback","MobileOutlined","Set","a","indexedDB","DOMException","t","d","Image","b","requestAnimationFrame","performance","Blob","URL","document","MediaRecorder","c","String","clearTimeout","i","m","PlaygroundPanel","config","useEnvConfig","playgroundSDK","useMemo","PlaygroundSDK","useEffect","checkServer","online","error","Logo","NavActions","UniversalPlayground","__APP_VERSION__","props","Text","Typography","ScrcpyPlayer","forwardRef","ref","serverUrl","maxSize","autoConnect","autoReconnect","reconnectInterval","connecting","setConnecting","useState","connected","setConnected","screenInfo","setScreenInfo","deviceId","setDeviceId","socketRef","useRef","videoContainerRef","videoElementRef","decoderRef","reconnectTimerRef","metadataTimeoutRef","safeRemoveChildNodes","parent","innerErr","updateCanvasSize","container","canvas","containerWidth","containerHeight","originalWidth","originalHeight","availableHeight","aspectRatio","targetWidth","targetHeight","handleResize","createVideoFrameRenderer","WebGLVideoFrameRenderer","renderer","BitmapVideoFrameRenderer","createDecoder","codecId","WebCodecsVideoDecoder","element","canvasWrapper","setupVideoStream","_metadata","configurationPacketSent","pendingDataPackets","transformStream","TransformStream","chunk","controller","packet","Uint8Array","p","videoStream","ReadableStream","streamClosed","videoDataHandler","data","cleanupHandlers","errorHandler","disconnectHandler","takeScreenshot","blob","url","alert","disconnectDevice","useImperativeHandle","connectDevice","resolve","setupMetadataTimeout","_socketRef_current","err","io","_socketRef_current1","metadata","ScrcpyVideoCodecId","width","height","timer","Card","Tooltip","InfoCircleOutlined","Button","ScreenshotIcon","Divider","LinkedIcon","UnlinkIcon","Row","Col","Spin","Content","Layout","rootEl","root","ReactDOM","setSelectedDeviceId","connectToDevice","setConnectToDevice","setServerUrl","isNarrowScreen","setIsNarrowScreen","safeOverrideAIConfig","scrcpyPort","socket","ConfigProvider","PanelGroup","Panel","PanelResizeHandle","AdbDevice","App","n","globalThis","Function","self"],"mappings":"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,CACZ,qBACH,AACL,GClCqB,GAAS,cACT,GAAS,cCJhB,GAAS,4BCDnB,IAAM,GAAkB,CACxB,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,QACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,QACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,QACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,QACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,QACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,QACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,QACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,QACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,QACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,QACV,EACA,MAAO,CACH,IAAK,QACL,KAAM,OACV,EACA,MAAO,CACH,IAAK,QACL,KAAM,OACV,EACA,MAAO,CACH,QAAS,EACT,KAAM,QACN,IAAK,QACT,EACA,KAAM,CACF,QAAS,EACT,KAAM,OACN,IAAK,MACT,EACA,UAAW,CACP,QAAS,EACT,KAAM,YACN,IAAK,WACT,EACA,IAAK,CACD,QAAS,EACT,KAAM,MACN,IAAK,KACT,EACA,QAAS,CACL,QAAS,GACT,aAAc,IACd,IAAK,QACL,KAAM,UACN,SAAU,IACV,SAAU,CACd,EACA,YAAa,CACT,QAAS,GACT,KAAM,cACN,IAAK,QACL,KAAM,KACN,SAAU,CACd,EACA,MAAO,CACH,QAAS,GACT,KAAM,QACN,IAAK,QACL,KAAM,IACV,EACA,KAAM,CACF,QAAS,GACT,KAAM,QACN,IAAK,QACL,KAAM,IACV,EACA,KAAM,CACF,QAAS,GACT,KAAM,QACN,IAAK,QACL,KAAM,IACV,EACA,UAAW,CACP,QAAS,GACT,KAAM,YACN,IAAK,QACL,SAAU,CACd,EACA,WAAY,CACR,QAAS,GACT,KAAM,aACN,IAAK,QACL,SAAU,CACd,EACA,YAAa,CACT,QAAS,GACT,KAAM,cACN,IAAK,UACL,SAAU,CACd,EACA,aAAc,CACV,QAAS,GACT,KAAM,eACN,IAAK,UACL,SAAU,CACd,EACA,QAAS,CACL,QAAS,GACT,KAAM,UACN,IAAK,MACL,SAAU,CACd,EACA,SAAU,CACN,QAAS,GACT,KAAM,WACN,IAAK,MACL,SAAU,CACd,EACA,MAAO,CACH,QAAS,GACT,KAAM,QACN,IAAK,OACT,EACA,SAAU,CACN,QAAS,GACT,KAAM,WACN,IAAK,UACT,EACA,OAAQ,CACJ,QAAS,GACT,KAAM,SACN,IAAK,QACT,EACA,QAAS,CACL,QAAS,GACT,KAAM,UACN,IAAK,SACT,EACA,WAAY,CACR,QAAS,GACT,KAAM,aACN,IAAK,YACT,EACA,MAAO,CACH,QAAS,GACT,KAAM,QACN,IAAK,GACT,EACA,QAAS,CACL,QAAS,GACT,aAAc,IACd,IAAK,SACL,KAAM,UACN,SAAU,IACV,SAAU,CACd,EACA,OAAQ,CACJ,QAAS,GACT,KAAM,SACN,IAAK,QACT,EACA,QAAS,CACL,QAAS,GACT,aAAc,GACd,IAAK,WACL,KAAM,UACN,SAAU,IACV,SAAU,CACd,EACA,SAAU,CACN,QAAS,GACT,KAAM,WACN,IAAK,UACT,EACA,IAAK,CACD,QAAS,GACT,KAAM,MACN,IAAK,KACT,EACA,QAAS,CACL,QAAS,GACT,aAAc,GACd,IAAK,MACL,KAAM,UACN,SAAU,IACV,SAAU,CACd,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,IAAK,MACT,EACA,QAAS,CACL,QAAS,GACT,aAAc,IACd,IAAK,OACL,KAAM,UACN,SAAU,IACV,SAAU,CACd,EACA,UAAW,CACP,QAAS,GACT,KAAM,YACN,IAAK,WACT,EACA,QAAS,CACL,QAAS,GACT,aAAc,IACd,IAAK,YACL,KAAM,UACN,SAAU,IACV,SAAU,CACd,EACA,QAAS,CACL,QAAS,GACT,aAAc,IACd,IAAK,UACL,KAAM,UACN,SAAU,IACV,SAAU,CACd,EACA,QAAS,CACL,QAAS,GACT,KAAM,UACN,IAAK,SACT,EACA,WAAY,CACR,QAAS,GACT,KAAM,aACN,IAAK,YACT,EACA,QAAS,CACL,QAAS,GACT,aAAc,IACd,IAAK,aACL,KAAM,UACN,SAAU,IACV,SAAU,CACd,EACA,QAAS,CACL,QAAS,GACT,aAAc,GACd,IAAK,YACL,KAAM,UACN,SAAU,IACV,SAAU,CACd,EACA,UAAW,CACP,QAAS,GACT,KAAM,YACN,IAAK,WACT,EACA,OAAQ,CACJ,QAAS,GACT,KAAM,SACN,IAAK,QACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,IAAK,SACT,EACA,YAAa,CACT,QAAS,GACT,KAAM,cACN,IAAK,aACT,EACA,OAAQ,CACJ,QAAS,GACT,KAAM,SACN,IAAK,QACT,EACA,QAAS,CACL,QAAS,GACT,aAAc,GACd,IAAK,SACL,KAAM,UACN,SAAU,IACV,SAAU,CACd,EACA,OAAQ,CACJ,QAAS,GACT,KAAM,SACN,IAAK,QACT,EACA,cAAe,CACX,QAAS,GACT,aAAc,IACd,KAAM,gBACN,IAAK,KACL,SAAU,IACV,SAAU,CACd,EACA,OAAQ,CACJ,QAAS,GACT,KAAM,SACN,SAAU,IACV,IAAK,GACT,EACA,OAAQ,CACJ,QAAS,GACT,KAAM,SACN,SAAU,IACV,IAAK,GACT,EACA,OAAQ,CACJ,QAAS,GACT,KAAM,SACN,SAAU,IACV,IAAK,GACT,EACA,OAAQ,CACJ,QAAS,GACT,KAAM,SACN,SAAU,IACV,IAAK,GACT,EACA,OAAQ,CACJ,QAAS,GACT,KAAM,SACN,SAAU,IACV,IAAK,GACT,EACA,OAAQ,CACJ,QAAS,GACT,KAAM,SACN,SAAU,IACV,IAAK,GACT,EACA,OAAQ,CACJ,QAAS,GACT,KAAM,SACN,SAAU,IACV,IAAK,GACT,EACA,OAAQ,CACJ,QAAS,GACT,KAAM,SACN,SAAU,IACV,IAAK,GACT,EACA,OAAQ,CACJ,QAAS,GACT,KAAM,SACN,SAAU,IACV,IAAK,GACT,EACA,OAAQ,CACJ,QAAS,GACT,KAAM,SACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,KAAM,CACF,QAAS,GACT,KAAM,OACN,SAAU,IACV,IAAK,GACT,EACA,SAAU,CACN,QAAS,GACT,KAAM,WACN,IAAK,OACL,SAAU,CACd,EACA,UAAW,CACP,QAAS,GACT,KAAM,YACN,IAAK,OACL,SAAU,CACd,EACA,YAAa,CACT,QAAS,GACT,KAAM,cACN,IAAK,aACT,EACA,eAAgB,CACZ,QAAS,IACT,KAAM,iBACN,IAAK,IACL,SAAU,CACd,EACA,UAAW,CACP,QAAS,IACT,KAAM,YACN,IAAK,IACL,SAAU,CACd,EACA,eAAgB,CACZ,QAAS,IACT,KAAM,iBACN,IAAK,IACL,SAAU,CACd,EACA,aAAc,CACV,QAAS,IACT,KAAM,eACN,IAAK,IACL,SAAU,CACd,EACA,GAAI,CACA,QAAS,IACT,KAAM,KACN,IAAK,IACT,EACA,GAAI,CACA,QAAS,IACT,KAAM,KACN,IAAK,IACT,EACA,GAAI,CACA,QAAS,IACT,KAAM,KACN,IAAK,IACT,EACA,GAAI,CACA,QAAS,IACT,KAAM,KACN,IAAK,IACT,EACA,GAAI,CACA,QAAS,IACT,KAAM,KACN,IAAK,IACT,EACA,GAAI,CACA,QAAS,IACT,KAAM,KACN,IAAK,IACT,EACA,GAAI,CACA,QAAS,IACT,KAAM,KACN,IAAK,IACT,EACA,GAAI,CACA,QAAS,IACT,KAAM,KACN,IAAK,IACT,EACA,GAAI,CACA,QAAS,IACT,KAAM,KACN,IAAK,IACT,EACA,IAAK,CACD,QAAS,IACT,KAAM,MACN,IAAK,KACT,EACA,IAAK,CACD,QAAS,IACT,KAAM,MACN,IAAK,KACT,EACA,IAAK,CACD,QAAS,IACT,KAAM,MACN,IAAK,KACT,EACA,IAAK,CACD,QAAS,IACT,KAAM,MACN,IAAK,KACT,EACA,IAAK,CACD,QAAS,IACT,KAAM,MACN,IAAK,KACT,EACA,IAAK,CACD,QAAS,IACT,KAAM,MACN,IAAK,KACT,EACA,IAAK,CACD,QAAS,IACT,KAAM,MACN,IAAK,KACT,EACA,IAAK,CACD,QAAS,IACT,KAAM,MACN,IAAK,KACT,EACA,IAAK,CACD,QAAS,IACT,KAAM,MACN,IAAK,KACT,EACA,IAAK,CACD,QAAS,IACT,KAAM,MACN,IAAK,KACT,EACA,IAAK,CACD,QAAS,IACT,KAAM,MACN,IAAK,KACT,EACA,IAAK,CACD,QAAS,IACT,KAAM,MACN,IAAK,KACT,EACA,IAAK,CACD,QAAS,IACT,KAAM,MACN,IAAK,KACT,EACA,IAAK,CACD,QAAS,IACT,KAAM,MACN,IAAK,KACT,EACA,IAAK,CACD,QAAS,IACT,KAAM,MACN,IAAK,KACT,EACA,QAAS,CACL,QAAS,IACT,KAAM,UACN,IAAK,SACT,EACA,WAAY,CACR,QAAS,IACT,KAAM,aACN,IAAK,YACT,EACA,gBAAiB,CACb,QAAS,IACT,KAAM,kBACN,IAAK,iBACT,EACA,gBAAiB,CACb,QAAS,IACT,KAAM,kBACN,IAAK,iBACT,EACA,cAAe,CACX,QAAS,IACT,KAAM,gBACN,IAAK,eACT,EACA,eAAgB,CACZ,QAAS,IACT,KAAM,iBACN,IAAK,gBACT,EACA,mBAAoB,CAChB,QAAS,IACT,KAAM,qBACN,IAAK,oBACT,EACA,UAAW,CACP,QAAS,IACT,KAAM,YACN,IAAK,WACT,EACA,eAAgB,CACZ,QAAS,IACT,KAAM,iBACN,IAAK,gBACT,EACA,UAAW,CACP,QAAS,IACT,KAAM,YACN,SAAU,IACV,IAAK,GACT,EACA,MAAO,CACH,QAAS,IACT,KAAM,QACN,SAAU,IACV,IAAK,GACT,EACA,YAAa,CACT,QAAS,IACT,KAAM,cACN,IAAK,IACL,SAAU,CACd,EACA,MAAO,CACH,QAAS,IACT,KAAM,QACN,SAAU,IACV,IAAK,GACT,EACA,MAAO,CACH,QAAS,IACT,KAAM,QACN,SAAU,IACV,IAAK,GACT,EACA,OAAQ,CACJ,QAAS,IACT,KAAM,SACN,SAAU,IACV,IAAK,GACT,EACA,MAAO,CACH,QAAS,IACT,KAAM,QACN,SAAU,IACV,IAAK,GACT,EACA,UAAW,CACP,QAAS,IACT,KAAM,YACN,SAAU,IACV,IAAK,GACT,EACA,YAAa,CACT,QAAS,IACT,KAAM,cACN,SAAU,IACV,IAAK,GACT,EACA,UAAW,CACP,QAAS,IACT,KAAM,YACN,SAAU,IACV,IAAK,IACT,EACA,aAAc,CACV,QAAS,IACT,KAAM,eACN,SAAU,IACV,IAAK,GACT,EACA,MAAO,CACH,QAAS,IACT,KAAM,QACN,SAAU,IACV,IAAK,GACT,EACA,SAAU,CACN,QAAS,IACT,KAAM,WACN,IAAK,UACT,EACA,MAAO,CACH,QAAS,IACT,KAAM,QACN,IAAK,OACT,EACA,OAAQ,CACJ,QAAS,EACT,IAAK,SACL,KAAM,OACV,EACA,MAAO,CACH,QAAS,GACT,IAAK,QACL,KAAM,UACN,SAAU,CACd,EACA,MAAO,CACH,QAAS,GACT,IAAK,QACL,KAAM,YACN,SAAU,CACd,EACA,QAAS,CACL,QAAS,GACT,IAAK,UACL,KAAM,cACN,SAAU,CACd,EACA,IAAK,CACD,QAAS,GACT,IAAK,MACL,KAAM,UACN,SAAU,CACd,EACA,OAAQ,CACJ,QAAS,GACT,IAAK,QACT,EACA,WAAY,CACR,QAAS,GACT,IAAK,YACT,EACA,IAAK,CACD,QAAS,GACT,IAAK,IACL,KAAM,OACV,EACA,MAAO,CACH,QAAS,GACT,IAAK,OACT,EACA,QAAS,CACL,QAAS,GACT,IAAK,UACL,KAAM,MACV,EACA,KAAU,CACN,QAAS,GACT,IAAK,KACL,KAAM,gBACN,SAAU,CACd,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,KAAM,CACF,QAAS,GACT,IAAK,OACL,KAAM,WACN,SAAU,CACd,EACA,IAAK,CACD,QAAS,IACT,IAAK,IACL,KAAM,iBACN,SAAU,CACd,EACA,IAAK,CACD,QAAS,IACT,IAAK,IACL,KAAM,YACN,SAAU,CACd,EACA,IAAK,CACD,QAAS,IACT,IAAK,IACL,KAAM,iBACN,SAAU,CACd,EACA,IAAK,CACD,QAAS,IACT,IAAK,IACL,KAAM,eACN,SAAU,CACd,EACA,IAAK,CACD,QAAS,IACT,IAAK,IACL,KAAM,WACV,EACA,IAAK,CACD,QAAS,IACT,IAAK,IACL,KAAM,OACV,EACA,IAAK,CACD,QAAS,IACT,IAAK,IACL,KAAM,OACV,EACA,IAAK,CACD,QAAS,IACT,IAAK,IACL,KAAM,QACV,EACA,IAAK,CACD,QAAS,IACT,IAAK,IACL,KAAM,WACV,EACA,IAAK,CACD,QAAS,IACT,IAAK,IACL,KAAM,aACV,EACA,KAAM,CACF,QAAS,IACT,IAAK,KACL,KAAM,WACV,EACA,IAAK,CACD,QAAS,IACT,IAAK,IACL,KAAM,cACV,EACA,IAAK,CACD,QAAS,IACT,IAAK,IACL,KAAM,OACV,EACA,KAAM,CACF,QAAS,IACT,IAAK,MACT,EACA,MAAO,CACH,QAAS,IACT,IAAK,QACL,KAAM,OACV,EACA,MAAO,CACH,QAAS,IACT,IAAK,OACT,EACA,SAAU,CACN,QAAS,IACT,IAAK,UACT,EACA,KAAM,CACF,QAAS,IACT,IAAK,MACT,EACA,QAAS,CACL,QAAS,IACT,IAAK,SACT,EACA,IAAK,CACD,QAAS,GACT,IAAK,IACL,KAAM,QACV,EACA,IAAK,CACD,QAAS,GACT,IAAK,IACL,KAAM,QACV,EACA,IAAK,CACD,QAAS,GACT,IAAK,IACL,KAAM,QACV,EACA,IAAK,CACD,QAAS,GACT,IAAK,IACL,KAAM,QACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,QACV,EACA,IAAK,CACD,QAAS,GACT,IAAK,IACL,KAAM,QACV,EACA,IAAK,CACD,QAAS,GACT,IAAK,IACL,KAAM,QACV,EACA,IAAK,CACD,QAAS,GACT,IAAK,IACL,KAAM,QACV,EACA,IAAK,CACD,QAAS,GACT,IAAK,IACL,KAAM,QACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,EAAG,CACC,QAAS,GACT,IAAK,IACL,KAAM,MACV,EACA,IAAK,CACD,QAAS,IACT,IAAK,IACL,KAAM,WACV,EACA,IAAK,CACD,QAAS,IACT,IAAK,IACL,KAAM,OACV,EACA,EAAG,CACC,QAAS,IACT,IAAK,IACL,KAAM,OACV,EACA,IAAK,CACD,QAAS,IACT,IAAK,IACL,KAAM,QACV,EACA,IAAK,CACD,QAAS,IACT,IAAK,IACL,KAAM,OACV,EACA,IAAK,CACD,QAAS,IACT,IAAK,IACL,KAAM,WACV,EACA,IAAK,CACD,QAAS,IACT,IAAK,IACL,KAAM,aACV,EACA,IAAK,CACD,QAAS,IACT,IAAK,IACL,KAAM,WACV,EACA,IAAK,CACD,QAAS,IACT,IAAK,IACL,KAAM,cACV,EACA,IAAK,CACD,QAAS,IACT,IAAK,IACL,KAAM,OACV,EACA,SAAU,CACN,IAAK,WACL,KAAM,WACN,SAAU,CACd,EACA,UAAW,CACP,IAAK,YACL,KAAM,YACN,SAAU,CACd,EACA,OAAQ,CACJ,QAAS,GACT,IAAK,SACL,KAAM,SACN,SAAU,CACd,EACA,KAAM,CACF,IAAK,OACL,KAAM,OACN,SAAU,CACd,EACA,QAAS,CACL,QAAS,GACT,IAAK,UACL,KAAM,UACN,SAAU,CACd,EACA,WAAY,CACR,QAAS,IACT,IAAK,aACL,KAAM,aACN,SAAU,CACd,EACA,SAAU,CACN,QAAS,IACT,IAAK,WACL,KAAM,WACN,SAAU,CACd,CACJ,EACgCA,OAAO,OAAO,CAAC,IAAiB,MAAM,CAAC,CAAC,EAAK,CAAC,EAAK,EAAW,IAC1F,IAAM,EAAW,EAAI,WAAW,GAEhC,OADI,IAAa,GAAK,EAAG,CAAC,EAAS,CAAG,CAAS,EACxC,CACX,EAAG,CAAC,GAMJ,IAAM,GAAQ,aAAe,OAAOE,OAAS,uBAAuB,IAAI,CAACA,OAAO,SAAS,CAAC,QAAQ,EAAI,WAAa,GAAQ,QAAQ,AAEvH,IAAgB,KAAK,CAAC,GAAG,CAC1B,GAAgB,KAAK,CAAC,GAAG,CAC1B,GAAQ,GAAgB,IAAI,CAAC,GAAG,CAAG,GAAgB,OAAO,CAAC,GAAG,CAC7D,GAAgB,KAAK,CAAC,GAAG,CAC3B,GAAgB,GAAG,CAAC,GAAG,CACrB,GAAgB,KAAK,CAAC,GAAG,CACnB,GAAgB,QAAQ,CAAC,GAAG,CAC/B,GAAgB,QAAQ,CAAC,GAAG,CAC3B,GAAgB,MAAM,CAAC,GAAG,CAC7B,GAAgB,MAAM,CAAC,GAAG,UCp3CxB,GAAS,+CCNvB,IAAM,GAAa,GAAS,cA2B5B,SAAS,GAAyB,CAAY,CAAE,CAAG,MAK3C,EAJJ,GAAW,qCAAsC,EAAc,GAC/D,IAAI,EAAS,GAAiB,OAAQ,EAAM,KAAK,EAAI,EAAI,MAAM,AAAD,GAAO,OAAQ,EAAM,KAAK,EAAI,EAAI,MAAM,AAAD,EACjG,EAAY,GACZ,EAAY,SAShB,CAPI,UAAY,OAAO,GAAO,OAAS,IACnC,EAAY,EAAI,SAAS,EAAI,GAC7B,EAAY,EAAI,SAAS,EAAI,GAC7B,EAAQ,EAAI,KAAK,CACb,GAAgB,EAAI,MAAM,EAAI,IAAiB,EAAI,MAAM,EAAEU,QAAQ,IAAI,CAAC,2BAA4B,EAAc,EAAK,+CAC3H,EAAS,GAAU,EAAI,MAAM,EAE5B,GACE,CACH,SACA,YACA,YACA,OACJ,EANoB,KAAK,GAAW,+DAAgE,EAOxG,UClCc,GAAS,eCHvB,IAAM,GAAe,CAVjB,UACA,YACA,WACA,WACA,QAGA,WACA,YAKH,CAOD,eAAe,GAAsB,CAAM,CAAE,CAAM,CAAE,EAAU,CAAC,CAAC,EAC7D,GAAI,CAAE,OAAQ,EAAS,KAAK,EAAI,EAAO,WAAW,AAAD,GAAM,CAAE,WAAW,EAAO,WAAW,AAAD,EAAI,MAAO,CAC5F,EAAO,MAAM,EAAI,GACjB,EACH,CACD,IAAM,EAAS,EAAO,WAAW,CAC3B,EAAO,GAAU,UAAW,EAASZ,OAAO,IAAI,CAAC,EAAO,KAAK,EAAI,EAAE,CACnE,EAAW,CACb,GAAG,CAAO,AACd,EAiBA,OAhBA,EAAK,OAAO,CAAC,AAAC,IACN,KAAK,IAAM,CAAM,CAAC,EAAI,EAAI,OAAS,CAAM,CAAC,EAAI,EAAI,KAAO,CAAM,CAAC,EAAI,EAAE,EAAQ,CAAC,EAAI,CAAG,CAAM,CAAC,EAAI,AAAD,CACxG,GACI,GAEA,AADyB,GAA4B,GACpC,OAAO,CAAC,AAAC,IACtB,IAAM,EAAe,CAAM,CAAC,EAAU,CACtC,GAAI,GAAgB,UAAY,OAAO,EAAc,CACjD,IAAM,EAAsB,GAAyB,EAAc,CAC/D,UAAW,EAAQ,SAAS,CAC5B,UAAW,EACf,EACI,IAAqB,EAAQ,CAAC,EAAU,CAAG,CAAkB,CACrE,CACJ,GAEG,CACH,EACH,AACL,CA6DA,eAAe,GAAc,CAAW,CAAE,CAAU,CAAE,CAAW,CAAE,CAAK,CAAEiB,CAAO,EAC7E,IAAM,EAAS,MAAQ,EAAc,KAAK,EAAI,EAAY,IAAI,CAAC,AAAC,GAAI,EAAE,cAAc,GAAK,GAAc,EAAE,IAAI,GAAK,GAClH,GAAI,GAAU,YAAc,OAAO,EAAY,uBAAuB,CAAE,GAAI,EAAM,MAAM,CAAE,CACtF,IAAM,EAAe,MAAM,GAAsB,EAAQ,EAAM,MAAM,CAAEA,GACvE,OAAO,MAAM,EAAY,uBAAuB,CAAC,EAAO,IAAI,CAAE,CAAY,CAAC,EAAE,CACjF,KAAO,CACH,IAAM,EAAsB,EAAM,MAAM,CAAG,GAAyB,EAAM,MAAM,CAAE,CAC9E,UAAWA,EAAQ,SAAS,CAC5B,UAAW,EACf,GAAK,KAAK,EACV,OAAO,MAAM,EAAY,uBAAuB,CAAC,EAAO,IAAI,CAAE,CAC1D,OAAQ,EACR,GAAGA,CAAO,AACd,EACJ,CACA,CACI,IAAM,EAAS,EAAM,MAAM,CAC3B,GAAI,aAAe,EAAY,CAC3B,IAAI,EACJ,GAAM,CAAE,MAAI,CAAE,SAAO,CAAE,CAAG,OAAO,MAAQ,GAAuB,MAAS,GAAwB,EAAY,QAAQ,AAAD,EAAK,KAAK,EAAI,EAAsB,IAAI,CAAC,EAAa,GAAU,GAAI,KAAK,EAAG,CAC5L,gBAAiB,GACjB,GAAGA,CAAO,AACd,KAAO,CAAC,EACR,MAAO,CACH,KAAM,GAAQ,GACd,QAAS,GAAW,EACxB,CACJ,CACA,GAAI,GAAe,YAAc,OAAO,CAAW,CAAC,EAAW,CAAE,OAAO,MAAM,CAAW,CAAC,EAAW,CAAC,EAAQA,EAC9G,OAAM,AAAIV,MAAM,CAAC,qBAAqB,EAAE,EAAW,CAAC,CACxD,CACJ,CC/IA,MAAM,GACF,MAAM,eAAe,CAAQ,CAAE,CAC3B,MAAO,EAAE,AACb,CACA,eAAe,CAAK,CAAE,CAAM,CAAE,CAC1B,GAAI,CAAE,OAAQ,EAAS,KAAK,EAAI,EAAO,WAAW,AAAD,GAI7C,CAD0B,IAAI,CAAC,2BAA2B,CAAC,GAHV,MAAO,CACxD,MAAO,EACX,EAKA,GAAI,CAAC,EAAM,MAAM,CAAE,MAAO,CACtB,MAAO,GACP,aAAc,yBAClB,EACA,GAAI,CACA,IAAM,EAAsB,IAAI,CAAC,0BAA0B,CAAC,EAAM,MAAM,CAAE,GAE1E,OADA,EAAO,WAAW,CAAC,KAAK,CAAC,GAClB,CACH,MAAO,EACX,CACJ,CAAE,MAAO,EAAO,CACZ,OAAO,IAAI,CAAC,qBAAqB,CAAC,EACtC,CACJ,CACA,qBAAqB,CAAK,CAAE,CAAqB,CAAE,CAAM,CAAE,QACvD,AAAI,AAAC,GAA0B,EAAM,MAAM,EAAM,OAAQ,EAAS,KAAK,EAAI,EAAO,WAAW,AAAD,EAErF,AADY,IAAI,CAAC,sBAAsB,CAAC,EAAM,MAAM,CAAE,GAC3C,IAAI,CAAC,OAAS,EAAM,MAAM,EAAI,GAFuD,EAAM,MAAM,EAAI,EAG3H,CACA,wBAAwB,CAAK,CAAE,CAC3B,MAAO,AAAC,OAAQ,EAAQ,KAAK,EAAI,EAAM,OAAO,AAAD,GAAM,eACvD,CACA,cAAc,CAAM,CAAE,CAClB,GAAI,CAAE,OAAQ,EAAS,KAAK,EAAI,EAAO,WAAW,AAAD,GAAM,CAAE,WAAW,EAAO,WAAW,AAAD,EAAI,MAAO,EAAE,CAClG,IAAM,EAAS,EAAO,WAAW,CACjC,OAAO,GAAU,UAAW,EAASP,OAAO,IAAI,CAAC,EAAO,KAAK,EAAI,EAAE,AACvE,CACA,kBAAkB,CAAM,CAAEK,EAAc,EAAE,CAAE,CACxC,IAAM,EAAW,CAAC,EAIlB,OAHAL,OAAO,IAAI,CAAC,GAAQ,OAAO,CAAC,AAAC,IACrB,AAACK,EAAY,QAAQ,CAAC,IAAQ,KAAK,IAAM,CAAM,CAAC,EAAI,EAAI,OAAS,CAAM,CAAC,EAAI,EAAI,KAAO,CAAM,CAAC,EAAI,EAAE,EAAQ,CAAC,EAAI,CAAG,CAAM,CAAC,EAAI,AAAD,CACtI,GACO,CACX,CACA,4BAA4B,CAAM,CAAE,OAChC,AAAI,UAAY,OAAO,EAAO,WAAW,GAAI,WAAW,EAAO,WAAW,AAAD,GAE9DL,OAAO,IAAI,CADJ,EAAO,WAAW,CAAC,KAAK,EAAI,CAAC,GACjB,MAAM,CAAG,CAG3C,CACA,2BAA2B,CAAM,CAAE,CAAM,CAAE,CACvC,IAAM,EAAsB,CACxB,GAAG,CAAM,AACb,EAoBA,OAnBI,EAAO,WAAW,EAElB,AADyB,GAA4B,EAAO,WAAW,EACtD,OAAO,CAAC,AAAC,IAClB,UAAY,OAAO,CAAmB,CAAC,EAAI,EAAE,EAAmB,CAAC,EAAI,CAAG,CACxE,6BAA8B,GAC9B,OAAQ,CAAmB,CAAC,EAAI,CAChC,OAAQ,CACJ,EACA,EACH,CACD,KAAM,CACF,KAAM,EACN,IAAK,EACL,MAAO,EACP,OAAQ,CACZ,CACJ,EACJ,GAEG,CACX,CACA,sBAAsB,CAAK,CAAE,CAEzB,GAAI,AADa,EACJ,MAAM,EAAI,AADN,EACe,MAAM,CAAC,MAAM,CAAG,EAAG,CAC/C,IAAMK,EAAgB,AAFT,EAEkB,MAAM,CAAC,MAAM,CAAC,AAAC,IAC1C,IAAM,EAAO,EAAI,IAAI,CAAC,IAAI,CAAC,KAC3B,MAAO,CAAC,EAAK,QAAQ,CAAC,WAAa,CAAC,EAAK,QAAQ,CAAC,SAAW,CAAC,EAAK,QAAQ,CAAC,+BAChF,GAAG,GAAG,CAAC,AAAC,IACJ,IAAM,EAAQ,EAAI,IAAI,CAAC,IAAI,CAAC,KAC5B,MAAO,CAAC,EAAE,EAAM,EAAE,EAAE,EAAI,OAAO,CAAC,CAAC,AACrC,GACA,GAAIA,EAAc,MAAM,CAAG,EAAG,MAAO,CACjC,MAAO,GACP,aAAc,CAAC,kBAAkB,EAAEA,EAAc,IAAI,CAAC,MAAM,CAAC,AACjE,CACJ,CACA,IAAMA,EAAW,aAAiBE,MAAQ,EAAM,OAAO,CAAG,2BAC1D,MAAO,CACH,MAAO,GACP,aAAc,CAAC,6BAA6B,EAAEF,EAAS,CAAC,AAC5D,CACJ,CACA,uBAAuB,CAAM,CAAE,CAAM,CAAE,CACnC,IAAM,EAAa,EAAE,CACf,EAAS,EAAO,WAAW,CACjC,GAAI,CAAE,IAAU,UAAW,CAAK,EAAI,OAAO,EAC3C,IAAM,EAAmB,GAA4B,GAUrD,OARA,AADkBL,OAAO,IAAI,CAAC,EAAO,KAAK,EAChC,OAAO,CAAC,AAAC,IACf,IAAM,EAAa,CAAM,CAAC,EAAI,CAC9B,GAAI,IAAI,CAAC,iBAAiB,CAAC,GAAa,CACpC,IAAM,EAAa,IAAI,CAAC,qBAAqB,CAAC,GACxC,EAAiB,IAAI,CAAC,gBAAgB,CAAC,EAAK,EAAY,EAAiB,QAAQ,CAAC,IACxF,EAAW,IAAI,CAAC,CAAC,EAAE,EAAW,EAAE,EAAE,EAAe,CAAC,CACtD,CACJ,GACO,CACX,CACA,kBAAkB,CAAK,CAAE,CACrB,OAAO,MAAQ,GAAS,KAAO,CACnC,CACA,sBAAsB,CAAG,CAAE,CACvB,OAAO,EAAI,MAAM,CAAC,GAAG,WAAW,GAAK,EAAI,KAAK,CAAC,EACnD,CACA,iBAAiB,CAAG,CAAE,CAAK,CAAE,CAAa,CAAE,QACxC,AAAI,GAAiB,UAAY,OAAO,EAAc,CAAC,CAAC,EAAE,EAAM,CAAC,CAAC,CAC9D,UAAY,OAAO,GAAc,aAAe,EAAM,CAAC,EAAE,EAAM,EAAE,CAAC,CAAG,CAAC,EAAE,EAAM,CAAC,AAEvF,CACJ,CC3HA,SAAS,GAAiB,CAAG,CAAE,CAAG,CAAE,CAAK,EAQrC,OAPI,KAAO,EAAKA,OAAO,cAAc,CAAC,EAAK,EAAK,CAC5C,MAAO,EACP,WAAY,GACZ,aAAc,GACd,SAAU,EACd,GACK,CAAG,CAAC,EAAI,CAAG,EACT,CACX,CACA,MAAM,WAA8B,GAChC,IAAI,IAAK,CACL,OAAO,IAAI,CAAC,GAAG,AACnB,CACA,oBAAoB,CAAQ,CAAE,CAC1B,IAAI,CAAC,gBAAgB,CAAG,KAAK,EAC7B,IAAI,CAAC,gBAAgB,CAAG,CAC5B,CACA,QAAQ,CAAS,CAAE,CACf,OAAO,IAAI,CAAC,gBAAgB,CAAC,EAAU,AAC3C,CACA,MAAM,sBAAsB,CAAM,CAAE,CAAM,CAAE,CAAO,CAAE,CACjD,OAAO,MAAM,GAAsB,EAAQ,EAAQ,EACvD,CACA,mBAAmB,CAAK,CAAE,OAEtB,AAAI,AADiB,CAAC,OAAQ,EAAQ,KAAK,EAAI,EAAM,OAAO,AAAD,GAAM,EAAC,EACjD,QAAQ,CAAC,0BAAkC,sJACrD,IAAI,CAAC,uBAAuB,CAAC,EACxC,CACA,MAAM,eAAe,CAAO,CAAE,CAC1B,IAAI,EACJ,GAAI,MAAS,GAAc,IAAI,CAAC,KAAK,AAAD,EAAK,KAAK,EAAI,EAAY,cAAc,CAAE,OAAO,MAAM,IAAI,CAAC,KAAK,CAAC,cAAc,GACpH,GAAI,IAAI,CAAC,KAAK,EAAI,cAAe,IAAI,CAAC,KAAK,EAAI,UAAY,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAE,CACpF,IAAM,EAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CACjC,GAAI,MAAQ,EAAO,KAAK,EAAI,EAAK,WAAW,CAAE,OAAO,MAAM,EAAK,WAAW,EAC/E,QACA,AAAI,GAAW,UAAY,OAAO,GAAW,gBAAiB,EAEnD,MAAM,AADO,EACK,WAAW,GAEjC,EAAE,AACb,CACA,MAAM,aAAc,CAChB,MAAO,EACX,CACA,MAAM,eAAe,CAAQ,CAAE,CAC3B,GAAiB,EACrB,CACA,MAAM,cAAc,CAAU,CAAE,CAAK,CAAE,CAAO,CAAE,CAC5C,IACI,EADE,EAAc,MAAM,IAAI,CAAC,cAAc,EAEzC,GAAQ,SAAS,EAAI,IAAI,CAAC,KAAK,GAC/B,IAAI,CAAC,gBAAgB,CAAG,EAAQ,SAAS,CACzC,EAAyB,IAAI,CAAC,KAAK,CAAC,cAAc,CAClD,IAAI,CAAC,KAAK,CAAC,cAAc,CAAG,AAAC,IACrB,IAAI,CAAC,gBAAgB,GAAK,EAAQ,SAAS,GAC/C,IAAI,CAAC,gBAAgB,CAAC,EAAQ,SAAS,CAAC,CAAG,EACvC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,CAAC,GAC7C,YAAc,OAAO,GAAwB,EAAuB,GAC5E,GAEJ,GAAI,CAEA,IAAMe,EAAW,CACb,OAFW,MAAM,GAAc,IAAI,CAAC,KAAK,CAAE,EAAY,EAAa,EAAO,GAG3E,KAAM,KACN,WAAY,KACZ,MAAO,IACX,EACA,GAAI,CACA,GAAI,IAAI,CAAC,KAAK,CAAC,cAAc,CAAE,CAC3B,IAAM,EAAa,IAAI,CAAC,KAAK,CAAC,cAAc,EACxC,IAAYA,CAAAA,EAAS,IAAI,CAAGF,KAAK,KAAK,CAAC,EAAU,CACzD,CACI,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAEE,CAAAA,EAAS,UAAU,CAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,IAAM,IAAG,EACvF,IAAI,CAAC,KAAK,CAAC,mBAAmB,EAAE,IAAI,CAAC,KAAK,CAAC,mBAAmB,EACtE,CAAE,MAAO,EAAO,CACZH,QAAQ,KAAK,CAAC,4CAA6C,EAC/D,CAEA,OADA,IAAI,CAAC,KAAK,CAAC,SAAS,GACbG,CACX,QAAS,CACD,EAAQ,SAAS,GACjB,IAAI,CAAC,OAAO,CAAC,EAAQ,SAAS,EAC1B,IAAI,CAAC,KAAK,EAAE,KAAI,CAAC,KAAK,CAAC,cAAc,CAAG,CAAqB,EAEzE,CACJ,CACA,MAAM,gBAAgB,CAAS,CAAE,CAC7B,MAAO,CACH,IAAK,IAAI,CAAC,gBAAgB,CAAC,EAAU,EAAI,KAAK,CAClD,CACJ,CACA,MAAM,WAAW,CAAU,CAAE,CACzB,GAAI,CAAC,IAAI,CAAC,KAAK,CAAE,MAAO,CACpB,MAAO,0CACX,EACA,GAAI,CACA,IAAI,EAAqB,EAEzB,OADA,MAAO,OAAS,GAAsB,AAAC,GAAc,IAAI,CAAC,KAAK,AAAD,EAAG,OAAO,AAAD,EAAK,KAAK,EAAI,EAAoB,IAAI,CAAC,EAAW,EAClH,CACH,QAAS,EACb,CACJ,CAAE,MAAOV,EAAO,CACZ,IAAM,EAAeA,aAAiBE,MAAQF,EAAM,OAAO,CAAG,gBAE9D,OADAO,QAAQ,KAAK,CAAC,CAAC,wBAAwB,EAAE,EAAa,CAAC,EAChD,CACH,MAAO,CAAC,kBAAkB,EAAE,EAAa,CAAC,AAC9C,CACJ,CACJ,CACA,MAAM,kBAAmB,KACjB,EAGI,EAAgC,EAFxC,GAAI,CAAE,OAAS,GAAc,IAAI,CAAC,KAAK,AAAD,EAAK,KAAK,EAAI,EAAY,SAAS,AAAD,EAAI,OAAO,KACnF,GAAI,CAEA,IAAM,EAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,aAAa,EAAI,UAC7C,EAAc,AAAC,OAAS,GAAiC,AAAC,GAAwB,IAAI,CAAC,KAAK,CAAC,SAAS,AAAD,EAAG,QAAQ,AAAD,EAAK,KAAK,EAAI,EAA+B,IAAI,CAAC,EAAqB,GAAM,KAAK,EACvM,MAAO,CACH,OACA,aACJ,CACJ,CAAE,MAAO,EAAO,CAEZ,OADAA,QAAQ,KAAK,CAAC,gCAAiC,GACxC,IACX,CACJ,CACA,YAAY,CAAK,CAAC,CACd,KAAK,GAAI,GAAiB,IAAI,CAAE,QAAS,KAAK,GAAI,GAAiB,IAAI,CAAE,mBAAoB,CAAC,GAAI,GAAiB,IAAI,CAAE,mBAAoB,KAAK,GAAI,GAAiB,IAAI,CAAE,MAAO,KAAK,GAAI,GAAiB,IAAI,CAAE,mBAAoB,KAAK,GAC7O,IAAI,CAAC,KAAK,CAAG,EACb,IAAI,CAAC,GAAG,C5B/HL,U4BgIP,CACJ,CCtIA,SAAS,GAAiB,CAAG,CAAE,CAAG,CAAE,CAAK,EAQrC,OAPI,KAAO,EAAKZ,OAAO,cAAc,CAAC,EAAK,EAAK,CAC5C,MAAO,EACP,WAAY,GACZ,aAAc,GACd,SAAU,EACd,GACK,CAAG,CAAC,EAAI,CAAG,EACT,CACX,CACA,MAAM,WAA+B,GACjC,IAAI,IAAK,CACL,OAAO,IAAI,CAAC,GAAG,AACnB,CACA,eAAe,CAAK,CAAE,CAAM,CAAE,CAC1B,GAAI,CAAE,OAAQ,EAAS,KAAK,EAAI,EAAO,WAAW,AAAD,GAI7C,CAD0B,IAAI,CAAC,2BAA2B,CAAC,GAHV,MAAO,CACxD,MAAO,EACX,EAKA,GAAI,CAAC,EAAM,MAAM,CAAE,MAAO,CACtB,MAAO,GACP,aAAc,yBAClB,EACA,GAAI,EAAO,WAAW,EAAI,UAAY,OAAO,EAAO,WAAW,CAAE,CAC7D,IAAM,EAAS,EAAO,WAAW,CACjC,GAAI,EAAO,KAAK,EAAI,cAAgB,EAAO,IAAI,CAAE,CAC7C,IAAM,EAAQ,EAAO,KAAK,EAAI,CAAC,EACzB,EAAgBA,OAAO,IAAI,CAAC,GAAO,MAAM,CAAC,AAAC,IAC7C,IAAI,EAAgB,EACpB,IAAM,EAAW,CAAK,CAAC,EAAI,CAE3B,MAAO,CADY,CAAC,OAAQ,EAAW,KAAK,EAAI,EAAS,UAAU,AAAD,IAAO,MAAQ,GAAoB,MAAS,GAAiB,EAAS,IAAI,AAAD,EAAK,KAAK,EAAI,EAAe,SAAS,GAAK,CAAC,MAAQ,GAAoB,MAAS,GAAkB,EAAS,IAAI,AAAD,EAAK,KAAK,EAAI,EAAgB,QAAQ,IAAM,aAAY,GAC3R,MAAK,IAAM,EAAM,MAAM,CAAC,EAAI,EAAI,KAAO,EAAM,MAAM,CAAC,EAAI,AAAD,CAClF,GACA,GAAI,EAAc,MAAM,CAAG,EAAG,MAAO,CACjC,MAAO,GACP,aAAc,CAAC,6BAA6B,EAAE,EAAc,IAAI,CAAC,MAAM,CAAC,AAC5E,CACJ,CACJ,CACA,MAAO,CACH,MAAO,EACX,CACJ,CACA,MAAM,sBAAsB,CAAM,CAAE,CAAM,CAAE,CAAO,CAAE,CACjD,OAAO,MAAM,GAAsB,EAAQ,EAAQ,EACvD,CACA,mBAAmB,CAAK,CAAE,CACtB,IAAM,EAAU,AAAC,OAAQ,EAAQ,KAAK,EAAI,EAAM,OAAO,AAAD,GAAM,GAWtD,EAAe,AAVC,CAClB,CACI,QAAS,MACT,QAAS,uFACb,EACA,CACI,QAAS,cACT,QAAS,mFACb,EACH,CACkC,IAAI,CAAC,CAAC,CAAE,SAAO,CAAE,GAAG,EAAQ,QAAQ,CAAC,WACxE,AAAI,EAAqB,EAAa,OAAO,CACtC,IAAI,CAAC,uBAAuB,CAAC,EACxC,CACA,MAAM,cAAc,CAAU,CAAE,CAAK,CAAE,CAAO,CAAE,CAC5C,GAAI,IAAI,CAAC,SAAS,EAAI,aAAe,OAAOE,OAAQ,OAAO,IAAI,CAAC,gBAAgB,CAAC,EAAY,EAAO,EACpG,OAAM,AAAIK,MAAM,6DACpB,CACA,MAAM,iBAAiB,CAAU,CAAE,CAAK,CAAE,CAAO,CAAE,CAC/C,IAAM,EAAU,CACZ,KAAM,EACN,OAAQ,EAAM,MAAM,CACpB,GAAG,IAAI,CAAC,0BAA0B,CAAC,EAAS,EAAM,AACtD,CACI,GAAQ,OAAO,EAAE,GAAQ,OAAO,CAAG,EAAQ,OAAO,AAAD,EACjD,EAAQ,SAAS,EAAI,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,oBAAoB,CAAC,EAAQ,SAAS,CAAE,IAAI,CAAC,gBAAgB,EAClH,GAAI,CACA,IAAM,EAAW,MAAMW,MAAM,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAE,CACtD,OAAQ,OACR,QAAS,CACL,eAAgB,kBACpB,EACA,KAAML,KAAK,SAAS,CAAC,EACzB,GACA,GAAI,CAAC,EAAS,EAAE,CAAE,CACd,IAAMR,EAAY,MAAM,EAAS,IAAI,GAAG,KAAK,CAAC,IAAI,gBAClD,OAAM,AAAIE,MAAM,CAAC,uBAAuB,EAAE,EAAS,MAAM,CAAC,GAAG,EAAEF,EAAU,CAAC,CAC9E,CACA,IAAM,EAAS,MAAM,EAAS,IAAI,GAElC,OADI,EAAQ,SAAS,EAAE,IAAI,CAAC,mBAAmB,CAAC,EAAQ,SAAS,EAC1D,CACX,CAAE,MAAO,EAAO,CAGZ,MAFI,EAAQ,SAAS,EAAE,IAAI,CAAC,mBAAmB,CAAC,EAAQ,SAAS,EACjEO,QAAQ,KAAK,CAAC,6BAA8B,GACtC,CACV,CACJ,CACA,2BAA2B,CAAO,CAAE,CAAK,CAAE,CACvC,IAAM,EAAiB,CAAC,EA0BxB,MAHA,AAtBuB,CACnB,CACI,IAAK,YACL,MAAO,EAAQ,SAAS,AAC5B,EACA,CACI,IAAK,YACL,MAAO,EAAQ,SAAS,AAC5B,EACA,CACI,IAAK,qBACL,MAAO,EAAQ,kBAAkB,AACrC,EACA,CACI,IAAK,cACL,MAAO,EAAQ,WAAW,AAC9B,EACA,CACI,IAAK,SACL,MAAO,EAAM,MAAM,AACvB,EACH,CACc,OAAO,CAAC,CAAC,CAAE,KAAG,CAAE,OAAK,CAAE,IAC9B,MAAQ,GAAS,KAAO,GAAO,EAAc,CAAC,EAAI,CAAG,CAAI,CACjE,GACO,CACX,CACA,MAAM,eAAe,CAAO,CAAE,CAC1B,GAAI,IAAI,CAAC,SAAS,EAAI,aAAe,OAAOV,OAAQ,GAAI,CACpD,IAAM,EAAW,MAAMgB,MAAM,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,CAAE,CAC3D,OAAQ,OACR,QAAS,CACL,eAAgB,kBACpB,EACA,KAAML,KAAK,SAAS,CAAC,CACjB,SACJ,EACJ,GACA,GAAI,CAAC,EAAS,EAAE,CAAE,MAAM,AAAIN,MAAM,CAAC,4BAA4B,EAAE,EAAS,UAAU,CAAC,CAAC,EACtF,IAAM,EAAS,MAAM,EAAS,IAAI,GAClC,OAAOY,MAAM,OAAO,CAAC,GAAU,EAAS,EAAE,AAC9C,CAAE,MAAO,EAAO,CACZP,QAAQ,KAAK,CAAC,0CAA2C,EAC7D,CACA,GAAI,GAAW,UAAY,OAAO,GAAW,gBAAiB,EAAS,GAAI,CACvE,IAAM,EAAoB,EAAQ,WAAW,CACvC,EAAS,MAAM,IACrB,OAAOO,MAAM,OAAO,CAAC,GAAU,EAAS,EAAE,AAC9C,CAAE,MAAO,EAAO,CACZP,QAAQ,KAAK,CAAC,2CAA4C,EAC9D,CACA,MAAO,EAAE,AACb,CACA,MAAM,aAAc,CAChB,GAAI,CAAC,IAAI,CAAC,SAAS,CAAE,MAAO,GAC5B,GAAI,CACA,IAAM,EAAM,MAAMM,MAAM,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAClD,GAAI,MAAQ,EAAI,MAAM,CAAE,CACpB,GAAI,CACA,IAAM,EAAO,MAAM,EAAI,IAAI,EACvB,GAAK,EAAE,EAAI,UAAY,OAAO,EAAK,EAAE,EAAE,KAAI,CAAC,GAAG,CAAG,EAAK,EAAE,AAAD,CAChE,CAAE,MAAO,EAAW,CAChBN,QAAQ,KAAK,CAAC,mCAAoC,EACtD,CACA,MAAO,EACX,CACA,MAAO,EACX,CAAE,MAAO,EAAO,CAEZ,OADAA,QAAQ,IAAI,CAAC,8BAA+B,GACrC,EACX,CACJ,CACA,MAAM,eAAe,CAAQ,CAAE,CAC3B,GAAI,CAAC,IAAI,CAAC,SAAS,CAAE,MAAM,AAAIL,MAAM,6BACrC,GAAI,CACA,IAAM,EAAW,MAAMW,MAAM,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAE,CACrD,OAAQ,OACR,QAAS,CACL,eAAgB,kBACpB,EACA,KAAML,KAAK,SAAS,CAAC,CACjB,UACJ,EACJ,GACA,GAAI,CAAC,EAAS,EAAE,CAAE,MAAM,AAAIN,MAAM,CAAC,kCAAkC,EAAE,EAAS,UAAU,CAAC,CAAC,CAChG,CAAE,MAAO,EAAO,CAEZ,MADAK,QAAQ,KAAK,CAAC,oCAAqC,GAC7C,CACV,CACJ,CACA,MAAM,gBAAgB,CAAS,CAAE,CAC7B,GAAI,CAAC,IAAI,CAAC,SAAS,CAAE,MAAO,CACxB,IAAK,KAAK,CACd,EACA,GAAI,CAAE,OAAQ,EAAY,KAAK,EAAI,EAAU,IAAI,EAAC,EAE9C,OADAA,QAAQ,IAAI,CAAC,gDACN,CACH,IAAK,KAAK,CACd,EAEJ,GAAI,CACA,IAAM,EAAW,MAAMM,MAAM,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,eAAe,EAAEE,mBAAmB,GAAW,CAAC,EAC/F,GAAI,CAAC,EAAS,EAAE,CAEZ,OADAR,QAAQ,IAAI,CAAC,CAAC,8BAA8B,EAAE,EAAS,UAAU,CAAC,CAAC,EAC5D,CACH,IAAK,KAAK,CACd,EAEJ,OAAO,MAAM,EAAS,IAAI,EAC9B,CAAE,MAAO,EAAO,CAEZ,OADAA,QAAQ,KAAK,CAAC,gCAAiC,GACxC,CACH,IAAK,KAAK,CACd,CACJ,CACJ,CACA,MAAM,WAAW,CAAS,CAAE,CAExB,GADA,IAAI,CAAC,mBAAmB,CAAC,GACrB,CAAC,IAAI,CAAC,SAAS,CAAE,MAAO,CACxB,MAAO,0BACX,EACA,GAAI,CAAE,OAAQ,EAAY,KAAK,EAAI,EAAU,IAAI,EAAC,EAAI,MAAO,CACzD,MAAO,oBACX,EACA,GAAI,CACA,IAAM,EAAM,MAAMM,MAAM,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAEE,mBAAmB,GAAW,CAAC,CAAE,CACjF,OAAQ,MACZ,GACA,GAAI,CAAC,EAAI,EAAE,CAAE,MAAO,CAChB,MAAO,CAAC,uBAAuB,EAAE,EAAI,UAAU,CAAC,CAAC,AACrD,EACA,IAAM,EAAS,MAAM,EAAI,IAAI,GAC7B,MAAO,CACH,QAAS,GACT,GAAG,CAAM,AACb,CACJ,CAAE,MAAO,EAAO,CAEZ,OADAR,QAAQ,KAAK,CAAC,yBAA0B,GACjC,CACH,MAAO,uBACX,CACJ,CACJ,CACA,oBAAoB,CAAQ,CAAE,CAC1B,IAAI,CAAC,gBAAgB,CAAG,CAC5B,CACA,qBAAqB,CAAS,CAAE,CAAQ,CAAE,CACtC,GAAI,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GAAY,OACzC,IAAI,EAAU,GACR,EAAWS,YAAY,UACzB,GAAI,CACA,IAAI,EAAoB,EACxB,IAAM,EAAW,MAAM,IAAI,CAAC,eAAe,CAAC,IACvC,MAAQ,GAAoB,MAAS,GAAgB,EAAS,GAAG,AAAD,GAAc,MAAS,GAAqB,EAAc,IAAI,AAAD,EAAK,KAAK,EAAI,EAAmB,IAAI,CAAC,KAAmB,EAAS,GAAG,GAAK,IACxM,EAAU,EAAS,GAAG,CACtB,EAAS,EAAS,GAAG,EAE7B,CAAE,MAAO,EAAO,CACZT,QAAQ,KAAK,CAAC,0BAA2B,EAC7C,CACJ,EAAG,KACH,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAW,EACxC,CACA,oBAAoB,CAAS,CAAE,CAC3B,IAAM,EAAW,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,GACtC,IACAU,cAAc,GACd,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,GAEpC,CACA,MAAM,eAAgB,CAClB,GAAI,CAAC,IAAI,CAAC,SAAS,CAAE,OAAO,KAC5B,GAAI,CACA,IAAM,EAAW,MAAMJ,MAAM,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,EAC3D,GAAI,CAAC,EAAS,EAAE,CAEZ,OADAN,QAAQ,IAAI,CAAC,CAAC,2BAA2B,EAAE,EAAS,UAAU,CAAC,CAAC,EACzD,KAEX,OAAO,MAAM,EAAS,IAAI,EAC9B,CAAE,MAAO,EAAO,CAEZ,OADAA,QAAQ,KAAK,CAAC,4BAA6B,GACpC,IACX,CACJ,CACA,MAAM,kBAAmB,CACrB,GAAI,CAAC,IAAI,CAAC,SAAS,CAAE,OAAO,KAC5B,GAAI,CACA,IAAM,EAAW,MAAMM,MAAM,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC,EAC/D,GAAI,CAAC,EAAS,EAAE,CAEZ,OADAN,QAAQ,IAAI,CAAC,CAAC,+BAA+B,EAAE,EAAS,UAAU,CAAC,CAAC,EAC7D,KAEX,OAAO,MAAM,EAAS,IAAI,EAC9B,CAAE,MAAO,EAAO,CAEZ,OADAA,QAAQ,KAAK,CAAC,gCAAiC,GACxC,IACX,CACJ,CACA,YAAY,CAAS,CAAC,CAClB,KAAK,GAAI,GAAiB,IAAI,CAAE,YAAa,KAAK,GAAI,GAAiB,IAAI,CAAE,kBAAmB,IAAIH,KAAQ,GAAiB,IAAI,CAAE,mBAAoB,KAAK,GAAI,GAAiB,IAAI,CAAE,MAAO,KAAK,GACnM,IAAI,CAAC,SAAS,CAAG,CACrB,CACJ,CCnSA,MAAM,GACF,cAAc,CAAI,CAAE,CAAS,CAAE,CAAK,CAAE,CAClC,OAAO,GACH,IAAK,kBACD,GAAI,CAAC,EAAO,MAAM,AAAIF,MAAM,yCAC5B,OAAO,IAAI,GAAsB,EACrC,KAAK,mBAGG,OAAO,IAAI,GADY,GAAc,cAAe,OAAOL,QAAUA,OAAO,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAUA,OAAO,QAAQ,CAAC,MAAM,CAAG,uBAA2C,EAG7L,SACI,MAAM,AAAIK,MAAM,CAAC,4BAA4B,EAAE,EAAK,CAAC,CAC7D,CACJ,CACA,MAAM,cAAc,CAAU,CAAE,CAAK,CAAE,CAAO,CAAE,CAC5C,IAAMQ,EAAS,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,EAAY,EAAO,GAEnE,OADI,EAAQ,SAAS,EAAE,IAAI,CAAC,mBAAmB,CAAC,EAAQ,SAAS,EAC1DA,CACX,CACA,MAAM,eAAe,CAAO,CAAE,CAC1B,OAAO,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,EACvC,CACA,yBAAyB,CAAK,CAAE,CAAM,CAAE,CACpC,OAAO,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,EAAO,EAC9C,CACA,mBAAmB,CAAK,CAAE,CACtB,OAAO,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAC3C,CACA,qBAAqB,CAAK,CAAE,CAAqB,CAAE,CAAM,CAAE,CACvD,OAAO,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,EAAO,EAAuB,EAC3E,CACA,IAAI,IAAK,CACL,GAAI,IAAI,CAAC,OAAO,YAAY,IACxB,IAAI,CAAC,OAAO,YAAY,GADwB,OAAO,IAAI,CAAC,OAAO,CAAC,EAAE,AAE9E,CACA,MAAM,aAAc,OAChB,CAAI,KAAI,CAAC,OAAO,YAAY,EAAqB,GAAU,IAAI,CAAC,OAAO,CAAC,WAAW,EAEvF,CACA,MAAM,eAAe,CAAQ,CAAE,CAC3B,GAAI,IAAI,CAAC,OAAO,YAAY,GAAwB,OAAO,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,EAC3F,CACA,MAAM,gBAAgB,CAAS,CAAE,QAC7B,AAAI,IAAI,CAAC,OAAO,YAAY,IACxB,IAAI,CAAC,OAAO,YAAY,GAD+B,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,GAEjF,CACH,IAAK,KAAK,CACd,CACJ,CACA,MAAM,WAAW,CAAS,CAAE,OAExB,CADA,IAAI,CAAC,mBAAmB,CAAC,GACrB,IAAI,CAAC,OAAO,YAAY,IAA+B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAC5E,CACH,MAAO,mDACX,CACJ,CACA,iBAAiB,CAAQ,CAAE,CACnB,IAAI,CAAC,OAAO,YAAY,GAAwB,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,GAC5E,IAAI,CAAC,OAAO,YAAY,IAAuB,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,EAC7F,CACA,qBAAqB,CAAS,CAAE,CAC5BH,QAAQ,IAAI,CAAC,gEACjB,CACA,oBAAoB,CAAS,CAAE,CAC3BA,QAAQ,IAAI,CAAC,uEACjB,CACA,MAAM,gBAAgB,CAAS,CAAE,CAC7B,IAAI,CAAC,mBAAmB,CAAC,GACrB,IAAI,CAAC,OAAO,YAAY,GAAwB,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GACzE,IAAI,CAAC,OAAO,YAAY,IAAuBA,QAAQ,IAAI,CAAC,qDACzE,CACA,MAAM,eAAgB,QAClB,AAAI,IAAI,CAAC,OAAO,YAAY,GAA+B,IAAI,CAAC,OAAO,CAAC,aAAa,GAC9E,IACX,CACA,MAAM,kBAAmB,QACrB,AAAI,IAAI,CAAC,OAAO,YAAY,IACxB,IAAI,CAAC,OAAO,YAAY,GAD8B,IAAI,CAAC,OAAO,CAAC,gBAAgB,GAEhF,IACX,CACA,YAAY,CAAM,CAAC,KA3FQ,EAAK,IA4FM,KAAK,EA3FvC,CADuB,EA4FA,aAAN,IAAI,CA3FTZ,OAAO,cAAc,CA2FhB,IAAI,CA3FkB,EAAK,CAC5C,MAAO,EACP,WAAY,GACZ,aAAc,GACd,SAAU,EACd,GACK,AAqFgB,IAAI,AArFjB,CAAC,EAAI,CAAG,EAsFZ,IAAI,CAAC,OAAO,CAAG,IAAI,CAAC,aAAa,CAAC,EAAO,IAAI,CAAE,EAAO,SAAS,CAAE,EAAO,KAAK,CACjF,CACJ,CC/FA,IAAM,GAAiB,WACnB,IAAI,EAAYuB,CAAAA,CAAAA,UAAU,MAAM,CAAG,IAAK,KAAK,IAAMA,SAAS,CAAC,EAAE,EAAGA,SAAS,CAAC,EAAE,CACxE,CAAC,EAAa,EAAe,CAAG,gBAAS,IACzC,CAAE,aAAW,CAAE,CAAG,IAqBxB,MApBA,iBAAU,KACN,IAAI,EAAgB,GACpB,GAAK,EAWL,OAVAC,QAAQ,OAAO,CAAC,AAAC,WACb,KAAM,CAAC,GAAc,CACjB,IAAM,EAAgB,IAAI,GAAc,CACpC,KAAM,kBACV,EAEA,AADe,OAAM,EAAc,WAAW,GACrC,EAAe,IAAQ,EAAe,IAC/C,MAAM,IAAIA,QAAQ,AAAC,GAAUC,WAAW,EAAS,KACrD,CACJ,MACO,KACH,EAAgB,EACpB,CACJ,EAAG,CACC,EACA,EACH,EACM,CACX,ECnBMC,GAAe,AAACC,GACpB,UAAC,QACC,UAAU,aACV,MAAO,CACL,MAAOA,CACT,WACD,MAuDH,GAvC4C,AAAC,QAC3CC,iBAAAA,CAAgB,CAChBC,gBAAAA,CAAe,CAChB,GACO,CAACC,EAAYC,EAAc,CAAGC,GAAAA,EAAAA,CAAAA,UAAkB,GAChDC,EAAcC,GAAe,IAWnC,MARyBC,AAAAA,GAAAA,GAAAA,WAAAA,AAAAA,EAAY,KAE/BN,EAAgB,OAAO,GACzBA,EAAgB,OAAO,CAAC,gBAAgB,GACxCC,EAAW,IAAI,CAAC,uBAEpB,EAAG,CAACD,EAAiBC,EAAW,EAG9B,WAAC,OAAI,UAAU,0BACZC,EACD,WAAC,OAAI,UAAU,mCACb,UAAC,MAAG,UAAU,wBAAe,WAC7B,WAAC,OAAI,UAAU,gCACb,WAAC,OAAI,UAAU,kCACb,UAACK,GAAAA,CAAcA,CAAAA,CAAC,UAAU,gBACzBR,GAAoBK,GACnB,UAAC,OAAI,UAAU,4BAAoBP,GAAa,gBAGnDE,EACC,UAAC,QAAK,UAAU,uBAAeA,IAE/B,UAAC,QAAK,UAAU,iCAAwB,+BAMpD,ECjEM,GAAO,AAAC,IACV,GAAI,CAAE,WAAW,EAAK,CAAE,CAAG,SAC3B,AAAI,EAAiB,KACA,UAAI,MAAO,CAC5B,UAAW,OACX,SAAwB,UAAI,IAAK,CAC7B,KAAM,0BACN,OAAQ,SACR,IAAK,aACL,SAAwB,UAAI,MAAO,CAC/B,IAAK,gBACL,IAAK,wEACT,EACJ,EACJ,EACJ,0FCbA,SAAS,GAAU,CAAK,EACpB,GAAI,CAAE,uBAAuB,EAAI,CAAE,gBAAgB,EAAI,CAAE,mBAAmB,QAAQ,CAAE,OAAO,MAAM,CAAE,CAAG,EAClG,CAAE,QAAM,CAAE,cAAY,CAAE,YAAU,CAAE,iBAAe,CAAE,CAAG,IACxD,CAAC,EAAa,EAAe,CAAG,gBAAS,IACzC,CAAC,EAAkB,EAAoB,CAAG,gBAAS,GACnD,EAAoB,EAAO,mBAAmB,CAC9C,EAAe,cAAO,MACtB,EAAY,AAAC,IACf,IACA,EAAe,IACf,EAAE,cAAc,GAChB,EAAE,eAAe,EACrB,EAcA,MANA,iBAAU,KACF,GAAa,EAAoB,EACzC,EAAG,CACC,EACA,EACH,EACoB,WAAK,MAAO,CAC7B,MAAO,CACH,QAAS,OACT,eAAgB,WAChB,IAAK,OACL,WAAY,SACZ,OAAQ,OACR,UAAW,MACf,EACA,IAAK,EACL,SAAU,CACN,EAAgB,EAAoB,KACtB,UAAI,IAAO,CAAE,CACvB,MAAO,yDACP,UAAW,EACX,MAAO,CACH,OAAQ,CACJ,IACA,EACH,AACL,EACA,kBAAmB,IAAI,EAAa,OAAO,CAC3C,KAAM,IAAsB,GAAuB,IAAM5B,OAAO,IAAI,CAAC,GAAQ,MAAM,CAAG,KAAK,GAC3F,SAAU,SAAW,EAAqB,UAAI,IAAe,CAAE,CAC3D,QAAS,CACb,GAAmB,UAAI,OAAQ,CAC3B,QAAS,EACT,MAAO,CACH,MAAO,UACP,OAAQ,SACZ,EACA,SAAU,QACd,EACJ,GACc,WAAK,IAAK,CAAE,CACtB,MAAO,mBACP,KAAM,EACN,KAlDK,KACb,EAAe,IACf,EAAW,EACf,EAgDY,SA/CS,KACjB,EAAe,GACnB,EA8CY,OAAQ,OACR,MAAO,CACH,MAAO,QACP,OAAQ,OACR,UAAW,KACf,EACA,eAAgB,GAChB,aAAc,GACd,SAAU,GACV,SAAU,CACQ,UAAI,aAAc,CAAE,CAC9B,KAAM,EACN,YAAa,oEACb,MAAO,EACP,SAAU,AAAC,GAAI,EAAoB,EAAE,MAAM,CAAC,KAAK,EACjD,MAAO,CACH,WAAY,SACZ,SAAU,YACd,CACJ,GACc,WAAK,MAAO,CACtB,SAAU,CACQ,UAAI,IAAK,CACnB,SAAU,qDACd,GACc,WAAK,IAAK,CACpB,SAAU,CACN,4BACc,UAAI,SAAU,CACxB,SAAU,yBACd,GACA,IACH,AACL,GACH,AACL,GACH,AACL,GACH,AACL,EACJ,CCzGA,SAAS,GAAW,CAAK,EACrB,GAAI,CAAE,gBAAgB,EAAI,CAAE,uBAAuB,EAAK,CAAE,gBAAgB,EAAK,CAAE,YAAY,2CAA2C,CAAE,UAAU,8CAA8C,CAAE,YAAY,EAAE,CAAE,CAAG,EACvN,MAAqB,WAAK,MAAO,CAC7B,UAAW,CAAC,YAAY,EAAE,EAAU,CAAC,CACrC,SAAU,CACQ,UAAI,SAAe,CAAE,CAC/B,KAAM,EACN,OAAQ,SACR,SAAwB,UAAI,IAAc,CAAE,CACxC,UAAW,UACf,EACJ,GACc,UAAI,SAAe,CAAE,CAC/B,KAAM,EACN,OAAQ,SACR,SAAwB,UAAI,IAAsB,CAAE,CAChD,UAAW,UACf,EACJ,GACA,GAA+B,UAAI,GAAW,CAC1C,qBAAsB,EACtB,cAAe,CACnB,GACH,AACL,EACJ,yFC1BA,IAAM,GAAc,CAChB,MAAO,CACH,MAAO,cACP,MAAO,2CACX,EACA,MAAO,CACH,MAAO,cACP,MAAO,kBACX,EACA,cAAe,CACX,MAAO,cACP,MAAO,yBACX,EACA,QAAS,CACL,MAAO,cACP,MAAO,uBACX,EACA,QAAS,CACL,MAAO,cACP,MAAO,4BACX,EACA,aAAc,CACV,MAAO,cACP,MAAO,wBACX,EACA,gBAAiB,CACb,MAAO,cACP,MAAO,qBACX,EACA,SAAU,CACN,MAAO,cACP,MAAO,4BACX,EACA,SAAU,CACN,MAAO,cACP,MAAO,+BACX,EACA,QAAS,CACL,MAAO,aACP,MAAO,mCACX,EACA,UAAW,CACP,MAAO,aACP,MAAO,uBACX,EACA,SAAU,CACN,MAAO,aACP,MAAO,uBACX,EACA,SAAU,CACN,MAAO,aACP,MAAO,oBACX,EACA,MAAO,CACH,MAAO,aACP,MAAO,6BACX,EACA,SAAU,CACN,MAAO,aACP,MAAO,4BACX,EACA,UAAW,CACP,MAAO,aACP,MAAO,gCACX,CACJ,EACM,GAAqB,CACvB,QACA,QACA,UACA,WACH,CACK,GAA2B,CAC7B,KAAM,SACN,QAAS;AACb;AACA;AACA;AACA;AACA;AACA,IAAI,CAAC,CACD,QAAS,GACT,OAAQ,KAAK,EACb,kBAAmB,KACnB,cAAe,EACf,oBAAqB,GACrB,aAAc,EAClB,EACM,GAAe,CACjB,OAAQ,KAAK,EACb,KAAM,KACN,WAAY,KACZ,MAAO,IACX,WC1FA,IAAM,GAAe,i/RACf,GAAe,y2SCRrB,SAAS,GAAQ,CAAI,EACjB,OAAO,EAAK,OAAO,EAAI,SAAW,EAAK,OAAO,CAAG,CAAC,EAAE,EAAK,IAAI,CAAC,GAAG,EAAE,EAAK,OAAO,EAAI,GAAG,CAAC,CAAG,EAAK,IAAI,AACvG,CACA,SAAS,GAAe,CAAM,EAC1B,GAAI,CAAC,EAAQ,MAAO,GACpB,GAAI,UAAY,OAAO,EAAQ,OAAO,EACtC,GAAI,UAAY,OAAO,EAAQ,CAC3B,GAAI,UAAY,OAAO,EAAO,MAAM,CAAE,OAAO,EAAO,MAAM,CAC1D,GAAI,UAAY,OAAO,EAAO,MAAM,EAAI,EAAO,MAAM,CAAC,MAAM,CAAE,CAC1D,IAAM,EAAS,EAAO,MAAM,CAAC,MAAM,CAC7B,EAAS,EAAO,MAAM,CAAC,MAAM,EAAI,EAAE,CACzC,GAAI,IAAM,EAAO,MAAM,CAAE,OAAO,EAChC,IAAM,EAAY,EAAO,GAAG,CAAC,AAAC,IAC1B,IAAI,EAAM,EAAM,GAAG,CAEnB,MADI,GAAI,UAAU,CAAC,gBAAkB,EAAI,UAAU,CAAC,UAAY,EAAI,QAAQ,CAAC,SAAQ,GAAG,GAAM,CAAC,EAAE,EAAI,SAAS,CAAC,EAAG,IAAI,GAAG,CAAC,AAAD,EAClH,CAAC,CAAC,EAAE,EAAM,IAAI,CAAC,EAAE,EAAE,EAAI,CAAC,CAAC,AACpC,GAAG,IAAI,CAAC,MACR,MAAO,CAAC,EAAE,EAAO,EAAE,EAAE,EAAU,CAAC,AACpC,CACJ,CACA,MAAO,EACX,CAiBA,SAAS,GAAS,CAAI,MAGV,EAIA,EAAc,EAAc,EAI5B,EAAc,EAAc,EAAc,EAKtC,EAKA,EArCQ,MAiBhB,EASJ,GARI,aAAe,EAAK,IAAI,EAExB,GAAQ,MAAQ,GAAgB,MAAS,GAAc,EAAK,KAAK,AAAD,EAAK,KAAK,EAAI,EAAY,eAAe,AAAD,EAExG,YAAc,EAAK,IAAI,EAEvB,GAAQ,GAAe,MAAQ,EAAO,KAAK,EAAI,EAAK,KAAK,IAAM,MAAQ,GAAgB,MAAS,GAAe,EAAK,KAAK,AAAD,EAAK,KAAK,EAAI,EAAa,EAAE,IAAM,MAAQ,GAAgB,MAAS,GAAe,EAAK,KAAK,AAAD,EAAK,KAAK,EAAI,EAAa,UAAU,IAAM,MAAQ,GAAgB,MAAS,GAAe,EAAK,KAAK,AAAD,EAAK,KAAK,EAAI,EAAa,SAAS,GAE5V,WAAa,EAAK,IAAI,CAAE,CAExB,IAAM,EAAS,MAAQ,EAAO,KAAK,EAAI,EAAK,MAAM,CAC5C,EAAY,EAAS,GAAe,GAAU,IACpD,EAAQ,EAAK,OAAO,EAAI,GACpB,UAAY,OAAQ,MAAQ,GAAgB,MAAS,GAAe,EAAK,KAAK,AAAD,EAAK,KAAK,EAAI,EAAa,MAAM,GAE9G,EAAQ,CAAC,EAAE,MAAQ,GAAgB,MAAS,GAAe,EAAK,KAAK,AAAD,EAAK,KAAK,EAAI,EAAa,MAAM,CAAC,EAAE,CAAC,CAClG,UAAY,OAAQ,MAAQ,GAAgB,MAAS,GAAe,EAAK,KAAK,AAAD,EAAK,KAAK,EAAI,EAAa,UAAU,EAAG,EAjCpI,CADoB,EAkCuI,MAAQ,EAAO,KAAK,EAAI,EAAK,KAAK,EAhCtL,CAAC,EAAE,EAAY,SAAS,EAAI,OAAO,EAAE,EAAE,EAAY,UAAU,EAAI,OAAO,EAAE,EAAE,EAAY,QAAQ,EAAI,mBAAmB,CAAC,CADtG,GAkCZ,UAAY,OAAQ,MAAQ,GAAgB,MAAS,GAAe,EAAK,KAAK,AAAD,EAAK,KAAK,EAAI,EAAa,SAAS,GAAK,AAAC,OAAQ,EAAO,KAAK,EAAI,EAAK,OAAO,AAAD,IAAO,cAAe,EAAQ,AA/BzM,SAAsB,CAAS,EAC3B,GAAI,CAAC,EAAW,MAAO,GACvB,IAAM,EAAQ,EAAE,CAIhB,OAHA,EAAM,IAAI,CAAC,CAAC,WAAW,EAAE,EAAU,SAAS,EAAI,OAAO,CAAC,EACpD,EAAU,QAAQ,EAAE,EAAM,IAAI,CAAC,CAAC,UAAU,EAAE,EAAU,QAAQ,CAAC,CAAC,EAChE,EAAU,QAAQ,EAAE,EAAM,IAAI,CAAC,CAAC,UAAU,EAAE,EAAU,QAAQ,CAAC,EAAE,CAAC,EAC/D,EAAM,IAAI,CAAC,KACtB,EAwBsN,MAAQ,EAAO,KAAK,EAAI,EAAK,KAAK,EACvO,KAAK,KAAO,MAAQ,GAAgB,MAAS,GAAe,EAAK,KAAK,AAAD,EAAK,KAAK,EAAI,EAAa,KAAK,GAE1G,GAAQ,MAAQ,GAAgB,MAAS,GAAe,EAAK,KAAK,AAAD,EAAK,KAAK,EAAI,EAAa,KAAK,AAAD,EAEhG,GAAW,GAAQ,EAAQ,CAAC,EAAE,EAAU,GAAG,EAAE,EAAM,CAAC,CAAG,CAAQ,CACvE,QACA,AAAI,KAAK,IAAM,EAAc,GACzB,UAAY,OAAO,EAAc,EACjC,UAAY,OAAO,GAAS,GAAe,GAAe,GAAe,GACtEa,KAAK,SAAS,CAAC,EAAO,KAAK,EAAG,EACzC,CChDc,GAAS,mFCXF,GAAS,oCCahB,GAAS,SCNT,GAAS,sBCGT,GAAS,wBCGT,GAAS,SAqBO,AANL,CACrB,YACA,aACA,aACH,CAE8C,GAAG,CAAC,AAAC,GAAQ,CAAC,CAAC,EAAE,EAAM,CAAC,CAAC,EAAE,IAAI,CAAC,MCjC/E,IAAM,GAAqB,CAAC,EAAM,EAAY,KAK1C,IAFIE,EAEE,EAAqB,AAD3BA,CAAAA,EAAkB,AAFA,EAAK,KAAK,CAAG,EAAK,MAAM,EADtB,EAAa,EAGY,EAAK,KAAK,CAAG,EAAK,MAAM,CAAG,EAAc,CAAS,EAClD,IAAM,GAAMA,EAAkB,GAAK,GAAM,GAChF,EAAcJ,KAAK,GAAG,CAAC,EAAYI,EAAkB,EAAa,EAAqB,GAEzF,EAAOJ,KAAK,GAAG,CAAC,EAAK,IAAI,CAAG,EAAa,EAAoB,EAAa,GAC9E,EAAOA,KAAK,GAAG,CAAC,EAAM,GACtB,IAAI,EAAMA,KAAK,GAAG,CAAC,EAAK,GAAG,CAAG,EAAc,EAAoB,EAH3C,EAAc,EAAa,GAKhD,MAAO,CACH,KAAMA,KAAK,KAAK,CAAC,GACjB,IAAKA,KAAK,KAAK,CAHnB,EAAMA,KAAK,GAAG,CAAC,EAAK,IAIhB,MAAOA,KAAK,KAAK,CAAC,EACtB,CACJ,EACM,GAAsB,CAAC,EAAc,KACvC,IAAM,EAAUA,KAAK,GAAG,CAAC,EAAa,IAAI,CAAE,EAAa,IAAI,EACvD,EAASA,KAAK,GAAG,CAAC,EAAa,GAAG,CAAE,EAAa,GAAG,EAG1D,MAAO,CACH,KAAM,EACN,IAAK,EACL,MAJa,AADAA,KAAK,GAAG,CAAC,EAAa,IAAI,CAAG,EAAa,KAAK,CAAE,EAAa,IAAI,CAAG,EAAa,KAAK,EAC5E,CAK5B,CACJ,EACM,GAAwB,AAAC,GAC3B,AAAI,UAAY,OAAO,GAAO,IAAM,EAAI,MAAM,CAAS,EAChD,EAAI,MAAM,CAAC,GAAG,WAAW,GAAK,EAAI,KAAK,CAAC,GAE7C,GAAqB,AAAC,IACxB,IACI,EACA,EAFE,EAAgB,IAAI0B,IAGpB,EAAa,EAAK,UAAU,CAC5B,EAAiB,IAAIA,IAe3B,GAdA,EAAK,UAAU,CAAC,OAAO,CAAC,AAAC,IACrB,EAAU,KAAK,CAAC,OAAO,CAAC,AAAC,IACrB,IAAI,EAAsB,EAC1B,GAAI,MAAS,GAAkB,EAAK,SAAS,AAAD,GAAc,MAAS,GAAuB,EAAgB,IAAI,AAAD,EAAK,KAAK,EAAI,EAAqB,KAAK,CAAE,CACnJ,IAAM,EAAI,EAAK,SAAS,CAAC,IAAI,CAAC,KAAK,CAC7B,EAAI,EAAK,SAAS,CAAC,IAAI,CAAC,MAAM,CAC/B,IACD,EAAa,EACb,EAAc,GAElB,EAAc,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CACjC,CACJ,EACJ,GACI,CAAC,GAAc,CAAC,EAEhB,OADAzB,QAAQ,IAAI,CAAC,2CACN,CACH,QAAS,EAAE,CACX,aACA,YAAa,EAAE,AACnB,EAEJ,IAAM,EAAa,EAAE,CACrB,EAAK,UAAU,CAAC,OAAO,CAAC,AAAC,IACrB,IAAM,EAAU,GAAyB,EAAW,GAAI,EAAY,EAChE,IAAS,EAAW,IAAI,IAAI,GAChC,EAAU,KAAK,CAAC,OAAO,CAAC,AAAC,IACrB,GAAI,EAAK,KAAK,CAAE,CACZ,GAAM,CAAE,YAAU,CAAE,mBAAiB,CAAE,QAAM,CAAE,CAAG,EAAK,KAAK,AACxD,IAAU,GAAY,EAAe,GAAG,CAAC,EAAoB,CAAC,EAAE,GAAsB,GAAQ,CAAC,EAAE,EAAW,CAAC,EAAE,EAAkB,CAAC,CAAC,CAAG,EAC9I,CACJ,EACJ,GACA,IAAM0B,EAAyC,EAAW,MAAM,CAAC,CAAC,EAAQ,IAClE,IAAU,EAAW,MAAM,CAAG,GAAK,SAAW,EAAO,KAAK,EAG5D,EAAc,AAAC,MACjB,IAAI,EACJ,IAAM,EAAO,IACN,EACN,CACD,GAAI,CAAC,EAAK,MAAM,CAAE,OAAO,EACzB,IAAM,EAAe,MAAS,GAAS,CAAI,CAAC,EAAE,AAAD,EAAK,KAAK,EAAI,EAAO,KAAK,CAAC,IAAK,EAAE,CAAC,EAAE,QAClF,AAAI,GAAgB,EAAK,KAAK,CAAC,GAAG,KAAK,CAAC,AAAC,GAAO,AAAC,OAAQ,EAAO,KAAK,EAAI,EAAK,KAAK,CAAC,IAAK,EAAE,CAAC,EAAE,AAAD,IAAO,GAAsB,CACtH,EACH,CACM,CACX,KACA,MAAO,CACH,QAASA,EACT,MAAO,EACP,OAAQ,EACR,aACA,aACJ,CACJ,EACM,GAA2B,CAAC,EAAW,EAAM,EAAY,SAgCvD,EA/BJ,GAAI,CAAC,GAAa,CAAC,EAAU,KAAK,CAAC,MAAM,EACrC,IAAM,GAAc,IAAM,EADa,OAAO,KAElD,IAAI,EAAgB,EAAE,CACtB,GAAI,KAAO,EAAM,EAAgB,EAAU,KAAK,KAC3C,CACD,IAAM,EAAa,EAAU,KAAK,CAAC,SAAS,CAAC,AAAC,GAAI,IAAM,GACxD,GAAI,KAAO,EAEP,OADA1B,QAAQ,KAAK,CAAC,qDACP,KAEX,GAAI,IAAe,EAAU,KAAK,CAAC,MAAM,CAAG,EAAG,OAAO,KACtD,IAAI,IAAI,EAAI,EACR,AADoB,EAAI,EAAU,KAAK,CAAC,MAAM,EAC1C,KAAI,CAAS,GAAK,aAAe,EAAU,KAAK,CAAC,EAAE,CAAC,IAAI,AAAD,EADX,IAEhD,EAAc,IAAI,CAAC,EAAU,KAAK,CAAC,EAAE,CAE7C,CACA,GAAI,IAAM,EAAc,MAAM,CAAE,OAAO,KACvC,IAAM,EAAsB,GAAmB,CAC3C,KAAM,EACN,IAAK,EACL,MAAO,EACP,OAAQ,CACZ,EAAG,EAAY,GACT,EAAgB,CAAC,EAAK,EAAO,IAAY,EACvC,KAAM,UACN,MACA,SAAU,EACV,QACA,UACJ,GACEN,EAAU,EAAE,CAEd,EAAqB,EACrB,EAAe,GACb,EAAY,EAAc,MAAM,CAClC,EAAe,GACf,EAAiB,GAsKrB,OArKA,EAAc,OAAO,CAAC,CAAC,EAAM,SAMb,EAAyB,EAAwB,EAAsB,EAAiB,EAAuB,EAanH,EAYI,EAAsB,EAAuB,EAAe,EAIxD,EAAgB,EAoCxB,EAAiB,EAAgB,EAAuB,EAAkB,EAAuB,EAAkB,EAAkB,EA0BjI,EAAkB,EAAiB,EAAuB,EAAkB,EAAuB,EAwBvG,EAAkB,EAKd,EAAuB,EAAkB,EAAuB,EAcpE,EAAuB,EAAkB,EAAuB,EA3IxE,IAAI,GAEJ,GADI,IAAM,GAAO,GAAe,GAAS,EAAI,EACzC,aAAe,EAAK,IAAI,CAEpB,AADiB,EACJ,QAAQ,EAAI,AADR,EACqB,QAAQ,CAAC,MAAM,CAAG,GAExDA,EAAQ,IAAI,CAAC,CACT,KAAM,MACN,GAAG,CAAE,MAAS,GAAyB,AAL1B,EAKuC,QAAQ,AAAD,GAAc,MAAS,GAA0B,CAAsB,CAAC,EAAE,AAAD,EAAK,KAAK,EAAI,EAAwB,UAAU,CACpL,OAAQ,IAAM,EAAQ,EAAsB,KAAK,EACjD,SAvJE,IAwJF,MAAO,GAAQ,GACf,SAAU,GAAS,GACnB,WAAY,CAAC,MAAS,GAAkB,EAAK,SAAS,AAAD,GAAc,MAAS,GAAuB,EAAgB,IAAI,AAAD,EAAK,KAAK,EAAI,EAAqB,KAAK,GAAK,EACnK,YAAa,CAAC,MAAS,GAAmB,EAAK,SAAS,AAAD,GAAc,MAAS,GAAwB,EAAiB,IAAI,AAAD,EAAK,KAAK,EAAI,EAAsB,MAAM,GAAK,CAC7K,QAED,GAAI,YAAc,EAAK,IAAI,EAAI,WAAa,EAAK,OAAO,CAAE,CAG7D,IAAM,EAAgB,MAAS,GAAsB,AADjC,EAC6C,MAAM,AAAD,EAAK,KAAK,EAAI,EAAoB,OAAO,CACzG,EAAQ,GAAQ,GAChB,EAAW,GAAS,EACtB,QAAQ,EAAgB,KAAK,EAAI,EAAc,IAAI,AAAD,GAAG,GAAqB,CAC1E,GAAG,GAAmB,EAAc,IAAI,CAAE,EAAY,EAAY,CAClE,YAAa,EAAc,MAAM,CAAC,EAAE,CACpC,WAAY,EAAc,MAAM,CAAC,EAAE,AACvC,GACA,IAAM,EAAU,AATI,EASQ,SAAS,CACrC,GAAI,MAAQ,EAAU,KAAK,EAAI,EAAQ,gBAAgB,CAAE,CAErD,IAcI,EAdE,EAAc,AAZJ,EAYgB,GAAG,CAC7B,EAAuB,EAAQ,IAAI,CAAG,GAAW,EAAQ,IAAI,EAAE,MAAM,CAAG,CAC1E,GAAQ,gBAAgB,EAExBA,EAAQ,IAAI,CAAC,CACT,KAAM,MACN,IAAK,EAAQ,gBAAgB,CAC7B,SAjLU,IAkLV,QACA,WACA,WAAY,AAAC,OAAS,GAAiB,EAAQ,IAAI,AAAD,EAAK,KAAK,EAAI,EAAe,KAAK,AAAD,GAAM,EACzF,YAAa,AAAC,OAAS,GAAiB,EAAQ,IAAI,AAAD,EAAK,KAAK,EAAI,EAAe,MAAM,AAAD,GAAM,CAC/F,GAGJ,EAAc,IAAuB,EAAsB,KAAK,EAAI,EAAqB,GAAoB,EAAoB,GAAsB,KAAK,EAC5JA,EAAQ,IAAI,CAAC,CACT,KAAM,UACN,IAAK,EAAQ,gBAAgB,CAC7B,QAAS,EACT,OAAQ,EACR,iBAAkB,AAAC,OAAS,GAAuB,AAjCvC,EAiCmD,MAAM,AAAD,EAAK,KAAK,EAAI,EAAqB,OAAO,AAAD,GAAM,KAAK,EACxH,UAAU,CAAE,MAAQ,GAAuB,MAAS,GAAwB,EAAY,QAAQ,AAAD,EAAK,KAAK,EAAI,EAAsB,UAAU,CAC7I,SAAU,EAAuB,GAhM9B,IAgMoD,IACvD,sBAjMG,IAkMH,QACA,WACA,WAAY,AAAC,OAAS,GAAgB,EAAQ,IAAI,AAAD,EAAK,KAAK,EAAI,EAAc,KAAK,AAAD,GAAM,EACvF,YAAa,AAAC,OAAS,GAAiB,EAAQ,IAAI,AAAD,EAAK,KAAK,EAAI,EAAe,MAAM,AAAD,GAAM,CAC/F,GACAA,EAAQ,IAAI,CAAC,CACT,KAAM,QACN,SA1Mc,IA2Md,QACA,UACJ,GACA,EAAe,EACnB,CACJ,MAAO,GAAI,WAAa,EAAK,IAAI,EAAI,4BAA8B,EAAK,OAAO,CAAE,CAE7E,IAAM,EAAQ,GAAQ,GAChB,EAAW,GAAS,GAC1BA,EAAQ,IAAI,CAAC,EAAc,GAAc,EAAO,IAChD,EAAqB,MAAQ,EAAqB,EAAqB,EACvEA,EAAQ,IAAI,CAAC,CACT,KAAM,MACN,GAAG,CAAE,MAAS,GAAiB,EAAK,QAAQ,AAAD,GAAc,MAAS,GAAkB,CAAc,CAAC,EAAE,AAAD,EAAK,KAAK,EAAI,EAAgB,UAAU,CAC5I,SAvNO,IAwNP,OAAQ,UAAY,EAAK,OAAO,CAAG,EAAsB,EACzD,QACA,WACA,WAAY,CAAC,MAAS,GAAmB,EAAK,SAAS,AAAD,GAAc,MAAS,GAAwB,EAAiB,IAAI,AAAD,EAAK,KAAK,EAAI,EAAsB,KAAK,GAAK,EACvK,YAAa,CAAC,MAAS,GAAmB,EAAK,SAAS,AAAD,GAAc,MAAS,GAAwB,EAAiB,IAAI,AAAD,EAAK,KAAK,EAAI,EAAsB,MAAM,GAAK,CAC7K,GACI,IACAA,EAAQ,IAAI,CAAC,CACT,KAAM,gBACN,SAhOS,IAiOT,QACA,UACJ,GACA,EAAe,IAEnB,IAAM,EAAmB,AA3Of,IA2Oe,GAAQ,EAAY,IACzC,MAAS,GAAkB,EAAK,QAAQ,AAAD,GAAc,MAAS,GAAmB,CAAe,CAAC,EAAE,AAAD,EAAK,KAAK,EAAI,EAAiB,UAAU,GAE3IA,EAAQ,IAAI,CAAC,CACT,KAAM,mBACN,SA/OkB,IAgPlB,QACA,UACJ,GACAA,EAAQ,IAAI,CAAC,EAAc,GAAc,EAAO,IAChDA,EAAQ,IAAI,CAAC,CACT,KAAM,MACN,GAAG,CAAE,MAAS,GAAkB,EAAK,QAAQ,AAAD,GAAc,MAAS,GAAmB,CAAe,CAAC,EAAE,AAAD,EAAK,KAAK,EAAI,EAAiB,UAAU,CAChJ,SAAU,EACV,QACA,WACA,WAAY,CAAC,MAAS,GAAmB,EAAK,SAAS,AAAD,GAAc,MAAS,GAAwB,EAAiB,IAAI,AAAD,EAAK,KAAK,EAAI,EAAsB,KAAK,GAAK,EACvK,YAAa,CAAC,MAAS,GAAmB,EAAK,SAAS,AAAD,GAAc,MAAS,GAAwB,EAAiB,IAAI,AAAD,EAAK,KAAK,EAAI,EAAsB,MAAM,GAAK,CAC7K,IACGA,EAAQ,IAAI,CAAC,CAChB,KAAM,QACN,SAAU,EACV,QACA,UACJ,EACJ,KAAO,CAEH,IAAM,EAAQ,GAAQ,GAChB,EAAW,GAAS,GACpB,EAAa,MAAS,GAAkB,EAAK,QAAQ,AAAD,GAAc,MAAS,GAAmB,CAAe,CAAC,EAAK,QAAQ,CAAC,MAAM,CAAG,EAAE,AAAD,EAAK,KAAK,EAAI,EAAiB,UAAU,CACjL,GAEAA,EAAQ,IAAI,CAAC,CACT,KAAM,MACN,IAAK,EACL,SA9QE,IA+QF,OAAQ,EACR,QACA,WACA,WAAY,CAAC,MAAS,GAAmB,EAAK,SAAS,AAAD,GAAc,MAAS,GAAwB,EAAiB,IAAI,AAAD,EAAK,KAAK,EAAI,EAAsB,KAAK,GAAK,EACvK,YAAa,CAAC,MAAS,GAAmB,EAAK,SAAS,AAAD,GAAc,MAAS,GAAwB,EAAiB,IAAI,AAAD,EAAK,KAAK,EAAI,EAAsB,MAAM,GAAK,CAC7K,EAER,CACA,GAAI,aAAe,EAAK,MAAM,CAAE,CAE5B,EAAiB,GACjB,IAAMD,EAAa,GAAQ,GACrB,EAAW,EAAK,YAAY,EAAI,gBAChC,EAAgB,EAAS,OAAO,CAAC,+BAAiC,EAAI,iEAAmE,EAC/IC,EAAQ,IAAI,CAAC,CACT,KAAM,MACN,IAAK,EAAK,QAAQ,EAAI,EAAK,QAAQ,CAAC,MAAM,CAAG,EAAI,EAAK,QAAQ,CAAC,EAAK,QAAQ,CAAC,MAAM,CAAG,EAAE,CAAC,UAAU,CAAG,GACtG,OAAQ,EACR,SAjSM,IAkSN,MAAOD,EACP,SAAU,EACV,WAAY,CAAC,MAAS,GAAmB,EAAK,SAAS,AAAD,GAAc,MAAS,GAAwB,EAAiB,IAAI,AAAD,EAAK,KAAK,EAAI,EAAsB,KAAK,GAAK,EACvK,YAAa,CAAC,MAAS,GAAmB,EAAK,SAAS,AAAD,GAAc,MAAS,GAAwB,EAAiB,IAAI,AAAD,EAAK,KAAK,EAAI,EAAsB,MAAM,GAAK,CAC7K,GACA,MACJ,EACJ,GACI,AAAC,GAAgBC,EAAQ,IAAI,CAAC,CAC9B,MAAO,OACP,SAAU,EACV,KAAM,MACN,SA9Sc,IA+Sd,OAAQ,CACZ,GACOA,CACX,ECtTA,SAAS,GAAiB,CAAG,CAAE,CAAG,CAAE,CAAK,EAQrC,OAPI,KAAO,EAAKN,OAAO,cAAc,CAAC,EAAK,EAAK,CAC5C,MAAO,EACP,WAAY,GACZ,aAAc,GACd,SAAU,EACd,GACK,CAAG,CAAC,EAAI,CAAG,EACT,CACX,CACA,MAAM,GACF,QAAS,CACL,OAAO,IAAIwB,QAAQ,CAAC,EAAS,KACzB,IAAM,EAAUe,UAAU,IAAI,CAAC,IAAI,CAAC,MAAM,CAAE,IAAI,CAAC,OAAO,CACxD,GAAQ,OAAO,CAAG,IAAI,EAAO,EAAQ,KAAK,EAC1C,EAAQ,SAAS,CAAG,IAAI,EAAQ,EAAQ,MAAM,EAC9C,EAAQ,eAAe,CAAG,AAAC,IACvB,IAAM,EAAK,EAAM,MAAM,CAAC,MAAM,CAC9B,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAE,MAAI,CAAE,SAAO,CAAE,IACnC,EAAG,gBAAgB,CAAC,QAAQ,CAAC,IAI9B,AAHc,EAAG,iBAAiB,CAAC,EAAM,CACrC,SACJ,GACM,WAAW,CAAC,YAAa,YAAa,CACxC,OAAQ,EACZ,EAER,EACJ,CACJ,EACJ,CACA,MAAM,gBAAgB,CAAU,CAAE,CAAI,CAAE,CAAS,CAAE,CAE/C,IAAM,EAAc,AADT,OAAM,IAAI,CAAC,SAAS,AAAD,EACP,WAAW,CAAC,EAAY,GAE/C,OAAO,EADQpB,MAAM,OAAO,CAAC,GAAc,EAAW,GAAG,CAAC,AAAC,GAAO,EAAY,WAAW,CAAC,IAAS,EAAY,WAAW,CAAC,GAE/H,CACA,iBAAiB,CAAO,CAAE,CACtB,OAAO,IAAIK,QAAQ,CAAC,EAAS,KACzB,EAAQ,SAAS,CAAG,IAAI,EAAQ,EAAQ,MAAM,EAC9C,EAAQ,OAAO,CAAG,IAAI,EAAO,EAAQ,KAAK,CAC9C,EACJ,CACA,MAAM,IAAI,CAAS,CAAE,CAAI,CAAE,CACvB,MAAM,IAAI,CAAC,eAAe,CAAC,EAAW,YAAa,MAAO,IACtD,MAAM,IAAI,CAAC,gBAAgB,CAAC,EAAM,GAAG,CAAC,GAC1C,EACJ,CACA,MAAM,IAAI,CAAS,CAAE,CAAG,CAAE,CACtB,OAAO,IAAI,CAAC,eAAe,CAAC,EAAW,WAAY,MAAO,GAAQ,IAAI,CAAC,gBAAgB,CAAC,EAAM,GAAG,CAAC,IACtG,CACA,MAAM,OAAO,CAAS,CAAE,EAAkB,EAAI,CAAE,CAC5C,OAAO,IAAI,CAAC,eAAe,CAAC,EAAW,WAAY,MAAO,IAEtD,IAAM,EAAU,EAAkB,MAAM,IAAI,CAAC,gBAAgB,CAAC,AAD1C,EACsD,KAAK,CAAC,aAAa,MAAM,IAAM,MAAM,IAAI,CAAC,gBAAgB,CAAC,AADjH,EAC6H,MAAM,IACvJ,OAAO,EAAkB,EAAQ,IAAI,CAAC,CAAC,EAAG,IAAI,EAAE,SAAS,CAAG,EAAE,SAAS,EAAI,CAC/E,EACJ,CACA,MAAM,MAAM,CAAS,CAAE,CACnB,MAAM,IAAI,CAAC,eAAe,CAAC,EAAW,YAAa,MAAO,IACtD,MAAM,IAAI,CAAC,gBAAgB,CAAC,EAAM,KAAK,GAC3C,EACJ,CACA,MAAM,OAAO,CAAS,CAAE,CAAG,CAAE,CACzB,MAAM,IAAI,CAAC,eAAe,CAAC,EAAW,YAAa,MAAO,IACtD,MAAM,IAAI,CAAC,gBAAgB,CAAC,EAAM,MAAM,CAAC,GAC7C,EACJ,CACA,MAAM,MAAM,CAAS,CAAE,CACnB,OAAO,IAAI,CAAC,eAAe,CAAC,EAAW,WAAY,MAAO,GAAQ,IAAI,CAAC,gBAAgB,CAAC,EAAM,KAAK,IACvG,CACA,cAAe,CACX,OAAO,IAAI,CAAC,SAAS,AACzB,CACA,YAAY,CAAM,CAAE,CAAO,CAAE,CAAY,CAAC,CACtC,GAAiB,IAAI,CAAE,YAAa,KAAK,GACzC,GAAiB,IAAI,CAAE,SAAU,KAAK,GACtC,GAAiB,IAAI,CAAE,UAAW,KAAK,GACvC,GAAiB,IAAI,CAAE,eAAgB,KAAK,GAC5C,IAAI,CAAC,MAAM,CAAG,EACd,IAAI,CAAC,OAAO,CAAG,EACf,IAAI,CAAC,YAAY,CAAG,EACpB,IAAI,CAAC,SAAS,CAAG,IAAI,CAAC,MAAM,EAChC,CACJ,CACA,IAAM,GAAoB,MAAO,EAAWnB,EAAc,EAAc,KACpE,GAAI,CACA,OAAO,MAAM,GACjB,CAAE,MAAO,EAAG,CAMR,OALAO,QAAQ,KAAK,CAACP,EAAc,GACxB,aAAaE,OAAS,uBAAyB,EAAE,IAAI,EAAI,IACzDK,QAAQ,GAAG,CAAC,8CACZ,MAAM,KAEH,CACX,CACJ,EACM,GAAwB,CAAC,EAAW,EAAW,IAAW,UACxD,GAAI,CACA,IAAMG,EAAU,MAAM,EAAU,MAAM,CAAC,GACvC,GAAIA,EAAQ,MAAM,CAAG,EAAU,CAC3B,IAAM,EAAWA,EAAQ,IAAI,CAAC,CAAC,EAAG,IAAI,EAAE,SAAS,CAAG,EAAE,SAAS,EAAE,KAAK,CAAC,EAAGA,EAAQ,MAAM,CAAG,EAC3F,OAAMS,QAAQ,GAAG,CAAC,EAAS,GAAG,CAAC,AAAC,GAAO,EAAU,MAAM,CAAC,EAAW,EAAK,EAAE,GAC9E,CACJ,CAAE,MAAO,EAAG,CACRZ,QAAQ,KAAK,CAAC,CAAC,kBAAkB,EAAE,EAAU,CAAC,CAAC,CAAE,EACrD,CACJ,EC1GJ,SAAS,GAAiB,CAAG,CAAE,CAAG,CAAE,CAAK,EAQrC,OAPI,KAAO,EAAKZ,OAAO,cAAc,CAAC,EAAK,EAAK,CAC5C,MAAO,EACP,WAAY,GACZ,aAAc,GACd,SAAU,EACd,GACK,CAAG,CAAC,EAAI,CAAG,EACT,CACX,CAGA,IAAM,GAAiB,sBACjB,GAAgB,oBAGtB,OAAM,GACF,MAAM,aAAa,CAAQ,CAAE,CACzB,MAAM,GAAkB,UACpB,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAC3B,IAAM,EAAiB,EAAS,KAAK,CAAC,KACtC,OAAMwB,QAAQ,GAAG,CAAC,EAAe,GAAG,CAAC,CAAC,EAAK,KACvC,IAAM,EAAe,CACjB,GAAG,CAAG,CACN,OAAQ,KAAK,CACjB,EACM,EAAO,CACT,GAAI,EAAI,EAAE,EAAI,CAAC,IAAI,EAAE,EAAM,CAAC,CAC5B,KAAM,EACN,UAAW,EAAI,SAAS,CAAG,EAAI,SAAS,CAAC,OAAO,GAAKd,KAAK,GAAG,GAAK,CACtE,EACA,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAgB,EAC9C,GACJ,EAAG,uCAAwC,KAAK,EAAG,IAAI,CAAC,eAAe,CAC3E,CACA,MAAM,cAAe,CAsBjB,OAAO,AArBQ,MAAM,GAAkB,UACnC,IAAM,EAAW,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAgB,WAC7D,AAAI,IAAM,EAAS,MAAM,CAAS,EAAE,CAC7Bc,QAAQ,GAAG,CAAC,EAAS,GAAG,CAAC,MAAO,IACnC,IAAM,EAAO,EAAI,IAAI,CACf,EAAe,CACjB,GAAG,CAAI,CACP,UAAW,IAAId,KAAK,EAAK,SAAS,CACtC,EACA,GAAI,WAAa,EAAK,IAAI,EAAI,EAAK,EAAE,CAAE,CACnC,IAAM,EAAa,MAAM,IAAI,CAAC,UAAU,CAAC,EAAK,EAAE,EAC5C,IACA,EAAa,MAAM,CAAG,EAAW,MAAM,CACvC,EAAa,iBAAiB,CAAG,EAAW,iBAAiB,CAC7D,EAAa,aAAa,CAAG,EAAW,aAAa,CACrD,EAAa,YAAY,CAAG,EAAW,YAAY,CAE3D,CACA,OAAO,CACX,GACJ,EAAG,yCAA0C,EAAE,CAAE,IAAI,CAAC,eAAe,GACpD,EAAE,AACvB,CACA,MAAM,eAAgB,CAClB,MAAM,GAAkB,UACpB,MAAMc,QAAQ,GAAG,CAAC,CACd,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IACrB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IACxB,CACL,EAAG,0CACP,CACA,MAAM,WAAW,CAAE,CAAE,CAAM,CAAE,CACzB,MAAM,GAAkB,UACpB,IAAM,EAAmB,IAAI,CAAC,wBAAwB,CAAC,GACjD,EAAO,CACT,KACA,KAAM,EACN,UAAWd,KAAK,GAAG,GACnB,KAAMG,KAAK,SAAS,CAAC,GAAkB,MAAM,AACjD,CACA,OAAM,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAe,EAC5C,EAAG,qCAAsC,KAAK,EAAG,IAAI,CAAC,cAAc,CACxE,CACA,MAAM,WAAW,CAAE,CAAE,CAKjB,OAAO,AAJQ,MAAM,GAAkB,UACnC,IAAM,EAAO,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAe,GACrD,MAAO,AAAC,OAAQ,EAAO,KAAK,EAAI,EAAK,IAAI,AAAD,GAAM,IAClD,EAAG,uCAAwC,OAC1B,IACrB,CACA,yBAAyB,CAAM,CAAE,CAC7B,IAAI,EAAqB,EACzB,GAAI,EAAE,MAAS,GAAiB,EAAO,MAAM,AAAD,GAAc,MAAS,GAAsB,EAAe,IAAI,AAAD,EAAK,KAAK,EAAI,EAAoB,UAAU,EAAG,OAAO,EACjK,IAAM,EAAuB,EAAO,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,AAAC,IAC5D,IAAI,EACJ,MAAO,CACH,GAAG,CAAS,CACZ,MAAO,AAAC,OAAS,GAAmB,EAAU,KAAK,AAAD,EAAK,KAAK,EAAI,EAAiB,GAAG,CAAC,AAAC,QAC9E,EACA,EACJ,MAAO,CACH,GAAG,CAAI,CACP,UAAW,EAAK,SAAS,CAAG,CACxB,GAAG,EAAK,SAAS,CACjB,iBAAkB,MAAS,GAAmC,IAAI,CAAC,0BAA0B,CAAC,EAAK,SAAS,CAAC,gBAAgB,GAAK,EAAmC,EAAK,SAAS,CAAC,gBAAgB,AACxM,EAAI,EAAK,SAAS,CAClB,SAAU,MAAS,GAAiB,EAAK,QAAQ,AAAD,EAAK,KAAK,EAAI,EAAe,GAAG,CAAC,AAAC,GAAU,EACpF,GAAG,CAAM,CACT,WAAY,IAAI,CAAC,0BAA0B,CAAC,EAAO,UAAU,CACjE,GACR,CACJ,EAAC,GAAM,EAAE,AACb,CACJ,GACA,MAAO,CACH,GAAG,CAAM,CACT,OAAQ,CACJ,GAAG,EAAO,MAAM,CAChB,KAAM,CACF,GAAG,EAAO,MAAM,CAAC,IAAI,CACrB,WAAY,CAChB,CACJ,CACJ,CACJ,CACA,2BAA2B,CAAU,CAAE,CACnC,GAAI,CAAC,EAAY,OAAO,EACxB,GAAI,EAAW,MAAM,CAAG,QAAS,CAC7B,IAAM,EAASF,KAAK,KAAK,CAAC,EAAW,MAAM,CAAG,MAC9C,MAAO,CAAC,aAAa,EAAE,EAAO,kCAAkC,CAAC,AACrE,CACA,OAAO,CACX,CACA,MAAM,iBAAkB,CAcpB,OAAO,AAbQ,MAAM,GAAkB,UACnC,GAAM,CAAC,EAAc,EAAY,CAAG,MAAMa,QAAQ,GAAG,CAAC,CAClD,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IACrB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IACxB,EACD,MAAO,CACH,eACA,aACJ,CACJ,EAAG,mCAAoC,CACnC,aAAc,EACd,YAAa,CACjB,IACiB,CACb,aAAc,EACd,YAAa,CACjB,CACJ,CACA,MAAM,SAAU,CACZ,MAAMA,QAAQ,GAAG,CAAC,CACd,IAAI,CAAC,eAAe,GACpB,IAAI,CAAC,cAAc,GACtB,CACL,CACA,YAAY,EAAY,YAAY,CAAC,CACjC,GAAiB,IAAI,CAAE,YAAa,KAAK,GACzC,GAAiB,IAAI,CAAE,YAAa,KAAK,GACzC,GAAiB,IAAI,CAAE,kBAAmB,KAAK,GAC/C,GAAiB,IAAI,CAAE,iBAAkB,KAAK,GAC9C,IAAI,CAAC,SAAS,CAAG,EACjB,IAAI,CAAC,SAAS,CAAG,IAAI,GAAiB,uBAAc,GAAW,CArJpD,EAqJkE,CACzE,CACI,KAAM,GACN,QAAS,IACb,EACA,CACI,KAAM,GACN,QAAS,IACb,EACH,EACD,IAAI,CAAC,eAAe,CAAG,GAAsB,IAAI,CAAC,SAAS,CAAE,GA5JzC,KA6JpB,IAAI,CAAC,cAAc,CAAG,GAAsB,IAAI,CAAC,SAAS,CAAE,GA5JzC,GA6JvB,CACJ,CC7KA,SAAS,GAAiB,CAAG,CAAE,CAAG,CAAE,CAAK,EAQrC,OAPI,KAAO,EAAKxB,OAAO,cAAc,CAAC,EAAK,EAAK,CAC5C,MAAO,EACP,WAAY,GACZ,aAAc,GACd,SAAU,EACd,GACK,CAAG,CAAC,EAAI,CAAG,EACT,CACX,CACA,MAAM,GACF,mBAAoB,CAChB,GAAI,CACA,IAAM,EAAU,eACV,EAAW,IAAI,MAAM,CAAC,QAG5B,OAFAI,aAAa,OAAO,CAAC,EAAS,GAC9BA,aAAa,UAAU,CAAC,GACjB,EACX,CAAE,MAAO,EAAG,CACR,MAAO,EACX,CACJ,CACA,MAAM,aAAa,CAAQ,CAAE,CACzB,GAAI,CACK,IAAI,CAAC,iBAAiB,KACvBQ,QAAQ,IAAI,CAAC,oDACb,MAAM,IAAI,CAAC,mBAAmB,IAGlC,IAAM,EAAgB,AADC,EAAS,KAAK,CAAC,CAAC,IAAI,CAAC,eAAe,EACtB,GAAG,CAAC,AAAC,GAAO,EACzC,GAAG,CAAG,CACN,OAAQ,KAAK,CACjB,IACE,EAAcC,KAAK,SAAS,CAAC,GACnCT,aAAa,OAAO,CAAC,IAAI,CAAC,WAAW,CAAE,EAC3C,CAAE,MAAOC,EAAO,CACZ,GAAIA,aAAiBmC,cAAgB,uBAAyBnC,EAAM,IAAI,CAAE,CACtEO,QAAQ,IAAI,CAAC,0EACb,MAAM,IAAI,CAAC,mBAAmB,GAC9B,GAAI,CAEA,IAAM,EAAsB,AADL,EAAS,KAAK,CAAC,KACK,GAAG,CAAC,AAAC,GAAO,EAC/C,GAAG,CAAG,CACN,OAAQ,KAAK,CACjB,IACE,EAAcC,KAAK,SAAS,CAAC,GACnCT,aAAa,OAAO,CAAC,IAAI,CAAC,WAAW,CAAE,GACvCQ,QAAQ,IAAI,CAAC,4DACjB,CAAE,MAAO,EAAY,CACjBA,QAAQ,KAAK,CAAC,8CAA+C,GAC7D,MAAM,IAAI,CAAC,aAAa,EAC5B,CACJ,MAAOA,QAAQ,KAAK,CAAC,2CAA4CP,EACrE,CACJ,CACA,MAAM,cAAe,CACjB,GAAI,CACA,IAAM,EAASD,aAAa,OAAO,CAAC,IAAI,CAAC,WAAW,EACpD,GAAI,CAAC,EAAQ,MAAO,EAAE,CACtB,IAAM,EAAWS,KAAK,KAAK,CAAC,GAiB5B,OAhByB,MAAMW,QAAQ,GAAG,CAAC,EAAS,GAAG,CAAC,MAAO,IAC3D,GAAI,WAAa,EAAI,IAAI,EAAI,EAAI,EAAE,CAAE,CACjC,IAAM,EAAY,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,EAAI,EAAE,CAAC,CAAC,CAC1C,EAAepB,aAAa,OAAO,CAAC,GAC1C,GAAI,EAAc,GAAI,CAClB,IAAM,EAAaS,KAAK,KAAK,CAAC,GAC9B,MAAO,CACH,GAAG,CAAG,CACN,GAAG,CAAU,AACjB,CACJ,CAAE,MAAO,EAAG,CACRD,QAAQ,IAAI,CAAC,iCAAkC,EACnD,CACJ,CACA,OAAO,CACX,GAEJ,CAAE,MAAO,EAAO,CAEZ,OADAA,QAAQ,KAAK,CAAC,6CAA8C,GACrD,EAAE,AACb,CACJ,CACA,MAAM,eAAgB,CAClB,GAAI,CACAR,aAAa,UAAU,CAAC,IAAI,CAAC,WAAW,EAExC,AADaJ,OAAO,IAAI,CAACI,cACpB,OAAO,CAAC,AAAC,IACN,EAAI,UAAU,CAAC,IAAI,CAAC,UAAU,GAAGA,aAAa,UAAU,CAAC,EACjE,EACJ,CAAE,MAAO,EAAO,CACZQ,QAAQ,KAAK,CAAC,8CAA+C,EACjE,CACJ,CACA,MAAM,WAAW,CAAE,CAAE,CAAM,CAAE,CACzB,GAAI,CACA,IAAM,EAAY,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,EAAG,CAAC,CAC5CR,aAAa,OAAO,CAAC,EAAWS,KAAK,SAAS,CAAC,GACnD,CAAE,MAAO,EAAO,CACZ,GAAI,aAAiB2B,cAAgB,uBAAyB,EAAM,IAAI,CAAE,CACtE5B,QAAQ,IAAI,CAAC,2EACb,MAAM,IAAI,CAAC,mBAAmB,GAC9B,GAAI,CACA,IAAM,EAAY,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,EAAG,CAAC,CAC5CR,aAAa,OAAO,CAAC,EAAWS,KAAK,SAAS,CAAC,GACnD,CAAE,MAAO,EAAY,CACjBD,QAAQ,KAAK,CAAC,qDAAsD,EACxE,CACJ,MAAOA,QAAQ,KAAK,CAAC,yCAA0C,EACnE,CACJ,CACA,MAAM,qBAAsB,CACxB,GAAI,CACA,IAAM,EAAOZ,OAAO,IAAI,CAACI,cACnB,EAAa,EAAK,MAAM,CAAC,AAAC,GAAM,EAAI,UAAU,CAAC,IAAI,CAAC,UAAU,GAC9D,EAAe,EAAW,KAAK,CAAC,EAAGO,KAAK,GAAG,CAAC,EAAGA,KAAK,KAAK,CAAC,EAAW,MAAM,CAAG,KACpF,EAAa,OAAO,CAAC,AAAC,IAClBP,aAAa,UAAU,CAAC,EAC5B,GACAQ,QAAQ,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAa,MAAM,CAAC,4CAA4C,CAAC,EACzF,IAAM,EAAiB,EAAK,MAAM,CAAC,AAAC,GAAM,EAAI,QAAQ,CAAC,eAAiB,EAAI,QAAQ,CAAC,UAAY,EAAI,UAAU,CAAC,aAChH,GAAI,EAAe,MAAM,CAAG,GAAI,CAC5B,IAAM,EAAyB,EAAe,KAAK,CAAC,EAAGD,KAAK,KAAK,CAAC,EAAe,MAAM,CAAG,IAC1F,EAAuB,OAAO,CAAC,AAAC,IACxB,IAAQ,IAAI,CAAC,WAAW,EAAEP,aAAa,UAAU,CAAC,EAC1D,GACAQ,QAAQ,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAuB,MAAM,CAAC,sCAAsC,CAAC,CACjG,CACJ,CAAE,MAAO,EAAO,CACZA,QAAQ,KAAK,CAAC,mCAAoC,EACtD,CACJ,CACA,YAAY,EAAY,YAAY,CAAC,CACjC,GAAiB,IAAI,CAAE,cAAe,KAAK,GAC3C,GAAiB,IAAI,CAAE,aAAc,KAAK,GAC1C,GAAiB,IAAI,CAAE,kBAAmB,IAC1C,IAAI,CAAC,WAAW,CAAG,CAAC,EAAE,EAAU,SAAS,CAAC,CAC1C,IAAI,CAAC,UAAU,CAAG,CAAC,EAAE,EAAU,QAAQ,CAAC,AAC5C,CACJ,CACA,MAAM,GACF,MAAM,aAAa,CAAQ,CAAE,CACzB,IAAI,CAAC,QAAQ,CAAG,IACT,EACN,AACL,CACA,MAAM,cAAe,CACjB,MAAO,IACA,IAAI,CAAC,QAAQ,CACnB,AACL,CACA,MAAM,eAAgB,CAClB,IAAI,CAAC,QAAQ,CAAG,EAAE,CAClB,IAAI,CAAC,OAAO,CAAC,KAAK,EACtB,CACA,MAAM,WAAW,CAAE,CAAE,CAAM,CAAE,CACzB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAI,EACzB,CACA,aAAa,CACT,GAAiB,IAAI,CAAE,WAAY,EAAE,EACrC,GAAiB,IAAI,CAAE,UAAW,IAAIH,IAC1C,CACJ,CACA,MAAM,GACF,MAAM,aAAa,CAAS,CAAE,CAAC,CAC/B,MAAM,cAAe,CACjB,MAAO,EAAE,AACb,CACA,MAAM,eAAgB,CAAC,CACvB,MAAM,WAAW,CAAG,CAAE,CAAO,CAAE,CAAC,CACpC,CAQA,SAAS,KACL,IAAI,EAAOc,UAAU,MAAM,CAAG,GAAK,KAAK,IAAMA,SAAS,CAAC,EAAE,CAAGA,SAAS,CAAC,EAAE,CAAG,YAAa,EAAYA,UAAU,MAAM,CAAG,GAAK,KAAK,IAAMA,SAAS,CAAC,EAAE,CAAGA,SAAS,CAAC,EAAE,CAAG,aACtK,OAAO,GACH,IAAK,YACD,GAAI,aAAe,OAAOgB,UAAW,OAAO,IAAI,GAAyB,GAEzE,OADA3B,QAAQ,IAAI,CAAC,yDACN,GAAsB,eAAgB,EACjD,KAAK,eACD,GAAI,aAAe,OAAOR,aAAc,OAAO,IAAI,GAAqB,GAExE,OADAQ,QAAQ,IAAI,CAAC,8DACN,GAAsB,SAAU,EAC3C,KAAK,SACD,OAAO,IAAI,EACf,KAAK,OACD,OAAO,IAAI,EACf,SACI,MAAM,AAAIL,MAAM,CAAC,sBAAsB,EAAE,EAAK,CAAC,CACvD,CACJ,CACA,SAAS,KACL,GAAI,aAAe,OAAOgC,UAAW,GAAI,CAErC,OADAA,UAAU,IAAI,CAAC,OAAQ,GAAG,OAAO,CAAG,KAAK,EAClC,WACX,CAAE,MAAO,EAAG,CAAC,CACb,GAAI,aAAe,OAAOnC,aAAc,GAAI,CAGxC,OAFAA,aAAa,OAAO,CAAC,OAAQ,QAC7BA,aAAa,UAAU,CAAC,QACjB,cACX,CAAE,MAAO,EAAG,CAAC,CACb,MAAO,QACX,iDClMA,IAAM,GAAmB,CAAC,EAAO,KAC7B,GAAM,CAAC,EAAG,EAAE,CAAG,EACT,EAAa,GAAsB,WACnC,EAAW,IAAI,MAAQ,CAI7B,OAHA,EAAS,SAAS,CAAC,EAPD,IAQlB,EAAS,UAAU,CAAC,EAAG,EANP,IAOhB,EAAS,OAAO,GACT,CACX,EACM,GAAkB,CAAC,EAAM,EAAMqC,KACjC,IACI,EADE,CAAE,MAAI,CAAE,KAAG,CAAE,OAAK,CAAE,QAAM,CAAE,CAAG,EAErC,EAAa,YAAcA,EnCbpB,EAAY,CAAC,AADD,AAPvB,SAAkB,CAAG,EACb,AAAC,GAAK,GAAM,SAAQ,EACxB,IAAI,EAAO,KACX,IAAI,IAAI,EAAI,EAAG,EAAI,EAAI,MAAM,CAAE,IAAI,EAAO,AAAC,IAAQ,GAAK,EAAO,EAAI,UAAU,CAAC,GAC9E,OAAO,IAAS,CACpB,EmCgBmD,GnCbd,GAAa,MAAM,CAAC,CmCaE,eAAiBA,EAAO,GAAsB,cAAgB,GAAsB,WAE3I,IAAM,EAAW,IAAI,MAAQ,CAmB7B,GAlBA,EAAS,SAAS,CAAC,EAjBA,IAkBnB,EAAS,SAAS,CAAC,EAAG,EAAY,GAClC,EAAS,QAAQ,CAAC,EAAM,EAAK,EAAO,GACpC,EAAS,OAAO,GAWhB,EAAS,OAAO,CAAG,CAVM,IAAI,KAAgB,CAAC,CAC1C,KAAM,EACN,QAAS,EACT,MAAO,GACP,OAAQ,CACJ,EAAG,EACH,EAAG,CACP,EACA,MAAO,OACX,GAGC,CAEG,CAAC,EAAM,MAAO,CACd,EACH,CACD,IAAM,EAAQ,IAAI,MAAI,CAAC,EAAM,CACzB,SALiB,GAMjB,KAAM,CACV,GAGA,OAFA,EAAM,CAAC,CAAG,EACV,EAAM,CAAC,CAAG9B,KAAK,GAAG,CAAC,EAAO,GAAmB,GACtC,CACH,EACA,EACH,AACL,EAwNM,GAvNa,AAAC,IAChB,IAAM,EAAoB,EAAM,iBAAiB,EAAI,EAAE,CACjD,EAAe,EAAkB,GAAG,CAAC,AAAC,GAAI,EAAE,EAAE,EAC9C,EAAgB,EAAM,aAAa,CACnC,EAAkB,EAAM,eAAe,CACvC,EAAU,EAAM,SAAS,CACzB,CAAE,MAAI,CAAEL,iBAAAA,CAAgB,CAAE,CAAG,EAC7B,EAAc,EAAK,KAAK,CACxB,EAAe,EAAK,MAAM,CAC1BoC,EAAS,cAAO,MAChB,EAAM,eAAQ,IAAI,IAAI,MAAW,CAAI,EAAE,EACvC,CAAC,EAAc,EAAgB,CAAG,gBAAS,IAC3C,EAAqB,eAAQ,IAAI,IAAI,MAAS,CAAI,EAAE,EACpD,EAAuB,eAAQ,IAAI,IAAI,MAAS,CAAI,EAAE,EACtD,CAAC,EAAc,EAAgB,CAAG,gBAAS,MAC3C,EAAY,cAAO,KAAK,GACxB,CAAE,mBAAiB,CAAE,sBAAoB,CAAE,iBAAe,CAAE,oBAAkB,CAAE,CAAG,IACzF,iBAAU,KACNlB,QAAQ,OAAO,CAAC,AAAC,WACb,GAAI,CAACkB,EAAO,OAAO,EAAI,CAAC,EAAa,MACrC,OAAM,EAAI,IAAI,CAAC,CACX,MAAO,EACP,OAAQ,EACR,WAAY,QAChB,GACA,IAAM,EAAWA,EAAO,OAAO,CAC/BA,EAAO,OAAO,CAAC,WAAW,CAAC,EAAI,MAAM,EACrC,GAAM,CAAE,aAAW,CAAE,CAAGA,EAAO,OAAO,CAAC,aAAa,CAC9CD,EAAe,GAAMvC,OAAO,WAAW,CAE7C,GAAI,EAAc,GADI,EAAcuC,EACa,CAC7C,IAAM,EAAQA,EAAe,CAC7B,GAAS,KAAK,CAAC,KAAK,CAAG,CAAC,EAAE9B,KAAK,KAAK,CAAC,EAAc,GAAO,EAAE,CAAC,CAC7D,EAAS,KAAK,CAAC,MAAM,CAAG,CAAC,EAAEA,KAAK,KAAK,CAAC,EAAe,GAAO,EAAE,CAAC,AACnE,CACA,EAAI,KAAK,CAAC,QAAQ,CAAC,GACnB,EAAI,KAAK,CAAC,QAAQ,CAAC,GACnB,EAAgB,GACpB,MACO,KACHC,QAAQ,GAAG,CAAC,gBACZ,GAAI,CACA,EAAI,OAAO,CAAC,GAAM,CACd,SAAU,GACV,QAAS,EACb,EACJ,CAAE,MAAO,EAAG,CACRA,QAAQ,IAAI,CAAC,iBAAkB,EACnC,CACJ,GACD,CACC,EACA,EACA,EACH,EACD,iBAAU,IACN,AAAK,GACL,EAAI,KAAK,CAAC,SAAS,CAAG,SACtB,EAAI,KAAK,CAAC,OAAO,CAAG,IAAI,MAAS,CAAC,EAAG,EAAG,EAAa,GAUrD,EAAI,KAAK,CAAC,EAAE,CAAC,QATQ,AAACP,IAClB,IAAI,EACJO,QAAQ,GAAG,CAAC,aAAcP,GAC1B,GAAM,CAAE,GAAC,CAAE,GAAC,CAAE,CAAGA,EAAM,IAAI,CAAC,MAAM,AAClC,OAAS,GAAuB,EAAM,aAAa,AAAD,GAAM,EAAqB,IAAI,CAAC,EAAO,CACrFM,KAAK,KAAK,CAAC,GACXA,KAAK,KAAK,CAAC,GACd,CACL,GAEO,KACH,IAAI,CACJ,OAAQ,GAAO,MAAS,GAAa,EAAI,KAAK,AAAD,GAAM,EAAW,GAAG,CAAC,QACtE,GAhBmB,OAiBpB,CACC,EACA,EAAM,aAAa,CACnB,EACA,EACH,EACD,iBAAU,KACN,GAAI,CAAC,EAAc,OACnB,IAAM,EAAM,IAAIgC,KAChB,GAAI,MAAM,CAAG,KACT,GAAI,CAAC,EAAI,KAAK,CAAE,OAChB,IAAM,EAAoB,WAAY,CAAC,GACjC,EAAmB,IAAI,MAAM,CAAC,EACpC,GAAiB,CAAC,CAAG,EACrB,EAAiB,CAAC,CAAG,EACrB,EAAiB,KAAK,CAAG,EACzB,EAAiB,MAAM,CAAG,EAC1B,EAAiB,SAAS,CAAG,UAC7B,EAAI,KAAK,CAAC,UAAU,CAAC,EAAkB,GACvC,EAAU,OAAO,CAAG,EACpB,EAAiB,OAAO,CAAG,CAC/B,EACA,EAAI,OAAO,CAAG,AAAC,IACX/B,QAAQ,KAAK,CAAC,yBAA0B,EAC5C,EACA,EAAI,GAAG,CAAGN,CACd,EAAG,CACC,EAAI,KAAK,CACT,EACA,EACA,EACH,EACD,GAAM,CAAE,uBAAqB,CAAE,CAAG,eAAQ,KAMtC,GAJA,EAAmB,cAAc,GACjC,EAAqB,cAAc,GACnC,EAAmB,SAAS,CAAG,UAC/B,EAAqB,SAAS,CAAG,UAC7B,EAAe,CACf,GAAM,CAAC,EAAS,CAAG,GAAgB,EAAe,cAAe,cACjE,EAAmB,QAAQ,CAAC,EAChC,CAmBA,OAlBI,EAAkB,MAAM,EAAE,EAAkB,OAAO,CAAC,AAAC,IACrD,GAAM,CAAE,MAAI,CAAE,SAAO,CAAE,IAAE,CAAE,CAAG,EACxB,CAAC,EAAS,CAAG,GAAgB,EAAM,EAAS,aAClD,EAAmB,QAAQ,CAAC,EAChC,GACI,OAAQ,EAAkB,KAAK,EAAI,EAAgB,MAAM,AAAD,GAAG,EAAgB,OAAO,CAAC,AAAC,IACpF,IAAM,EAAW,GAAiB,EAAO,kBACzC,EAAmB,QAAQ,CAAC,EAChC,GAEA,AADiB,GAAW,EAAQ,IAAI,EAC/B,OAAO,CAAC,AAAC,IACd,GAAM,CAAE,MAAI,CAAE,SAAO,CAAE,IAAE,CAAE,CAAG,EAE9B,GADoB,EAAa,QAAQ,CAAC,IAAO,AAAC,OAAQ,EAAe,KAAK,EAAI,EAAa,EAAE,AAAD,IAAO,EACtF,OACjB,GAAM,CAAC,EAAS,CAAG,GAAgB,EAAM,EAAS,WAClD,EAAqB,QAAQ,CAAC,EAClC,GACA,EAAqB,OAAO,CAAG,EACxB,CACH,sBA5B0B,EAAE,AA6BhC,CACJ,EAAG,CACC,EACA,EACA,EACA,EAAQ,IAAI,CACZ,EACA,EACA,EACH,EASGsC,EAAa,KAqBjB,OApBI,IAAM,EAAsB,MAAM,CAAEA,EAA2B,UAAI,MAAO,CAC1E,UAAW,aACX,SAAwB,WAAK,MAAO,CAChC,UAAW,kBACX,SAAU,CACN,YACA/B,KAAK,SAAS,CAAC,CAAqB,CAAC,EAAE,EAC1C,AACL,EACJ,GACS,EAAsB,MAAM,CAAG,GAAG+B,CAAAA,EAA2B,UAAI,MAAO,CAC7E,UAAW,aACX,SAAwB,WAAK,MAAO,CAChC,UAAW,kBACX,SAAU,CACN,YACA/B,KAAK,SAAS,CAAC,GAClB,AACL,EACJ,EAAC,EACoB,WAAK,MAAO,CAC7B,UAAW,aACX,SAAU,CACQ,UAAI,MAAO,CACrB,UAAW,0BACX,MAAO,CACH,MAAO,MACX,EACA,IAAK6B,CACT,GACc,UAAI,MAAO,CACrB,UAAW,oBACX,MAAO,CACH,QAAS,EAAM,cAAc,CAAG,OAAS,OAC7C,EACA,SAAwB,WAAK,MAAO,CAChC,UAAW,kBACX,SAAU,CACQ,UAAI,IAAQ,CAAE,CACxB,QAAS,EACT,SAjDO,AAAC,IAC5B,EAAqB,EAAE,MAAM,CAAC,OAAO,EACjC,EAAU,OAAO,EAAE,GAAU,OAAO,CAAC,OAAO,CAAG,EAAE,MAAM,CAAC,OAAO,AAAD,CACtE,EA+CwB,SAAU,YACd,GACc,UAAI,IAAQ,CAAE,CACxB,QAAS,EACT,SAlDK,AAAC,IAC1B,EAAmB,EAAE,MAAM,CAAC,OAAO,EACnC,EAAqB,OAAO,CAAG,EAAE,MAAM,CAAC,OAAO,AACnD,EAgDwB,SAAU,UACd,GACH,AACL,EACJ,GACc,UAAI,MAAO,CACrB,UAAW,aACX,MAAO,CACH,QAAS,EAAM,cAAc,CAAG,OAAS,OAC7C,EACA,SAAUE,CACd,GACH,AACL,EACJ,kGCtQA,IAAM,GAXY,AAAC,IACf,GAAI,CAAE,MAAI,CAAE,WAAW,EAAK,CAAE,QAAQ,CAAC,CAAE,YAAY,EAAE,CAAE,CAAG,EACtD,EAAQ,CACV,uBAAwB,CAAC,EAAE,EAAM,CAAC,CAAC,AACvC,EACA,MAAqB,UAAI,MAAO,CAC5B,UAAW,CAAC,WAAW,EAAE,EAAW,WAAa,GAAG,CAAC,EAAE,EAAU,CAAC,CAClE,MAAO,EACP,SAAU,CACd,EACJ,ECGM,GAAgB,AAAC,IACnB,OAAO,GACH,IAAK,WACL,IAAK,SACL,IAAK,UACL,IAAK,YACD,MAAqB,UAAI,OAAQ,CAC7B,MAAO,CACH,MAAO,SACX,EACA,SAAwB,UAAI,IAAa,CAAE,CAAC,EAChD,EACJ,KAAK,sBACD,MAAqB,UAAI,OAAQ,CAC7B,MAAO,CACH,MAAO,SACX,EACA,SAAwB,UAAI,IAAe,CAAE,CAAC,EAClD,EACJ,KAAK,SACL,IAAK,SACL,IAAK,WACL,IAAK,cACD,MAAqB,UAAI,OAAQ,CAC7B,MAAO,CACH,MAAO,SACX,EACA,SAAwB,UAAI,IAAa,CAAE,CAAC,EAChD,EACJ,KAAK,UACD,MAAqB,UAAI,IAAmB,CAAE,CAAC,EACnD,KAAK,YACL,IAAK,UACD,MAAqB,UAAI,IAAc,CAAE,CAAC,EAC9C,KAAK,UACD,MAAqB,UAAI,IAAkB,CAAE,CAAC,EAClD,SACI,MAAqB,UAAI,IAAa,CAAE,CAAC,EACjD,CACJ,EACM,GAA2C,WAAK,OAAQ,CAC1D,SAAU,CACN,mEACc,UAAI,KAAM,CAAC,GACzB,uEACc,UAAI,KAAM,CAAC,GACzB,MACc,UAAI,SAAU,CACxB,SAAU,yBACd,GACc,UAAI,KAAM,CAAC,GACzB,MACc,UAAI,SAAU,CACxB,SAAU,yBACd,GACH,AACL,GACM,GAAkB,WACpB,IAAI,EAAkBrB,UAAU,MAAM,CAAG,GAAK,KAAK,IAAMA,SAAS,CAAC,EAAE,CAAGA,SAAS,CAAC,EAAE,CAAG,GACvF,MAAqB,UAAI,MAAO,CAC5B,UAAW,aACX,SAAwB,UAAI,IAAK,CAAE,CAC/B,QAAS,8BACT,YAAa,EACb,KAAM,SACV,EACJ,EACJ,EACM,GAA+B,UAAI,MAAO,CAC5C,UAAW,mBACX,MAAO,CACH,UAAW,QACf,EACA,SAAwB,UAAI,GAAY,CACpC,SAAU,GACV,KAAM,+BACV,EACJ,gj8GCvFA,IAAM,GAAiB,AAAC,IACpB,GAAI,CAAE,kBAAgB,CAAE,qBAAmB,CAAE,oBAAkB,CAAE,CAAG,SACpE,AAAK,EACgB,WAAK,MAAO,CAC7B,UAAW,0BACX,SAAU,CACQ,UAAI,KAAM,CACpB,SAAU,YACd,GACA,EAAiC,UAAI,GAAY,CAC7C,UAAW,EACX,eAAgB,EACpB,GAAmB,WAAK,MAAO,CAC3B,SAAU,CACN,GAAc,UACd,iBACc,UAAI,KAAM,CAAE,CACtB,KAAM,OACN,QAAS,AAAC,IACN,EAAE,cAAc,GAChB,EAAoB,GACxB,EACA,SAAU,WACd,GACc,UAAI,MAAO,CACrB,SAAU,uHACd,GACH,AACL,GACH,AACL,GA5BgC,IA6BpC,kBC/BA,IAAM,GAAoB,AAAC,IACvB,GAAI,CAAE,YAAY,EAAE,CAAE,CAAG,EACnB,CAAE,QAAM,CAAE,CAAG,WAEnB,AADyBvB,OAAO,IAAI,CAAC,GAAU,CAAC,GAAG,MAAM,EAAI,EAChC,KACR,WAAK,MAAO,CAC7B,UAAW,CAAC,oBAAoB,EAAE,EAAU,CAAC,CAC7C,SAAU,CACQ,UAAI,IAAuB,CAAE,CACvC,UAAW,eACf,GACc,UAAI,OAAQ,CACtB,UAAW,gBACX,SAAU,wDACd,GACc,UAAI,GAAW,CACzB,KAAM,OACN,qBAAsB,EAC1B,GACH,AACL,EACJ,8ECZA,IAAM,GAZuB,AAAC,GAAsB,UAAI,MAAO,CACvD,MAAO,6BACP,MAAO,GACP,OAAQ,GACR,KAAM,OACN,QAAS,YACT,GAAG,CAAK,CACR,SAAwB,UAAI,OAAQ,CAChC,KAAM,OACN,EAAG,ooBACP,EACJ,GCWE,GAtBmB,AAAC,GAAsB,WAAK,MAAO,CACpD,MAAO,6BACP,MAAO,GACP,OAAQ,GACR,KAAM,OACN,QAAS,YACT,GAAG,CAAK,CACR,SAAU,CACQ,UAAI,OAAQ,CACtB,OAAQ,OACR,eAAgB,QAChB,YAAa,MACb,EAAG,iEACP,GACc,UAAI,OAAQ,CACtB,OAAQ,OACR,eAAgB,QAChB,YAAa,MACb,EAAG,+DACP,GACH,AACL,GCTE,GAZgB,AAAC,GAAsB,UAAI,MAAO,CAChD,MAAO,6BACP,MAAO,GACP,OAAQ,GACR,KAAM,OACN,QAAS,YACT,GAAG,CAAK,CACR,SAAwB,UAAI,OAAQ,CAChC,KAAM,OACN,EAAG,mgBACP,EACJ,GCXE,GAAmB,IAAIS,IACvB,GAAc,MAAO,IACvB,IAAI,GAAiB,GAAG,CAAC,GACzB,OAAO,WAAW,CAAC,GAAK,IAAI,CAAC,AAAC,IAC1B,GAAiB,GAAG,CAAC,EAAK,EAC9B,EACJ,EACM,GAAsB,AAAC,GAAO,GAAiB,GAAG,CAAC,GCOzD,SAAS,GAAiB,CAAG,CAAE,CAAG,CAAE,CAAK,EAQrC,OAPI,KAAO,EAAKT,OAAO,cAAc,CAAC,EAAK,EAAK,CAC5C,MAAO,EACP,WAAY,GACZ,aAAc,GACd,SAAU,EACd,GACK,CAAG,CAAC,EAAI,CAAG,EACT,CACX,CAGA,IAAM,GAAc,CAAC,EAAG,EAAI,EAAI,EAAI,KAChC,IAAM,EAAK,EAAI,EACf,OAAO,EAAK,EAAK,EAAK,EAAK,EAAI,EAAK,EAAI,EAAK,EAAK,EAAI,EAAK,EAAI,EAAI,EAAK,EAAK,EAAI,EAAI,CACzF,EACM,GAAa,AAAC,GAAI,GAAO,GACzB,GAAsB,AAAC,GAAI,GAAY,EAAG,EAAG,GAAK,GAAK,GACvD,GAAa,AAAC,GAAI,GAAO,GACzB,GAAS,AAAC,GAAI,EACd,GAAQ,AAAC,GAAK,IAAIwB,QAAQ,AAAC,GAAUC,WAAW,EAAS,IACzD,GAAqB,6CACrB,GAAW,KACb,IAAI,EAAa,GACjB,MAAO,CACH,MAAO,AAAC,IACJ,GAAI,EAAY,MAAM,AAAIlB,MAAM,IAChCsC,sBAAsB,KAClB,GAAI,EAAY,MAAM,AAAItC,MAAM,IAChC,EAASuC,YAAY,GAAG,GAC5B,EACJ,EACA,QAAS,CAAC,EAAU,KAChB,GAAI,EAAY,MAAM,AAAIvC,MAAM,IAChCkB,WAAW,KACP,GAAI,EAAY,MAAM,AAAIlB,MAAM,IAChC,GACJ,EAAG,EACP,EACA,OAAQ,KACJ,EAAa,EACjB,CACJ,CACJ,EAMM,GAAiB,AAAC,IACpB,IAAM,EAAO,IAAIwC,KAAK,CAClB,EACH,CAAE,CACC,KAAM,WACV,GACM,EAAMC,IAAI,eAAe,CAAC,GAC1B,EAAIC,SAAS,aAAa,CAAC,IACjC,GAAE,IAAI,CAAG,EACT,EAAE,QAAQ,CAAG,uBACb,EAAE,KAAK,EACX,CACA,OAAM,GACF,OAAQ,CAEJ,IAAM,EAAgB,IAAIC,cADX,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,IACO,CAC5C,SAAU,YACd,GAMA,OALA,EAAc,eAAe,CAAG,AAAC,IACzB,EAAM,IAAI,CAAC,IAAI,CAAG,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAM,IAAI,CACxD,EACA,IAAI,CAAC,aAAa,CAAG,EACrB,IAAI,CAAC,SAAS,CAAG,GACV,IAAI,CAAC,aAAa,CAAC,KAAK,EACnC,CACA,MAAO,CACH,IAAI,EACJ,GAAI,CAAC,IAAI,CAAC,SAAS,EAAI,CAAC,IAAI,CAAC,aAAa,CAAE,OAAO,KAAKtC,QAAQ,IAAI,CAAC,gBACrE,KAAI,CAAC,aAAa,CAAC,MAAM,CAAG,KACxB,IAAM,EAAO,IAAImC,KAAK,IAAI,CAAC,MAAM,CAAE,CAC/B,KAAM,YACV,GACM,EAAMC,IAAI,eAAe,CAAC,GAC1B,EAAIC,SAAS,aAAa,CAAC,IACjC,GAAE,IAAI,CAAG,EACT,EAAE,QAAQ,CAAG,uBACb,EAAE,KAAK,GACPD,IAAI,eAAe,CAAC,EACxB,EACA,MAAS,GAAsB,IAAI,CAAC,aAAa,AAAD,GAAM,EAAoB,IAAI,GAC9E,IAAI,CAAC,SAAS,CAAG,GACjB,IAAI,CAAC,aAAa,CAAG,IACzB,CACA,YAAY,CAAM,CAAC,CACf,GAAiB,IAAI,CAAE,SAAU,KAAK,GACtC,GAAiB,IAAI,CAAE,gBAAiB,MACxC,GAAiB,IAAI,CAAE,SAAU,KAAK,GACtC,GAAiB,IAAI,CAAE,YAAa,IACpC,IAAI,CAAC,MAAM,CAAG,EACd,IAAI,CAAC,MAAM,CAAG,EAAE,AACpB,CACJ,CACA,SAAS,GAAO,CAAK,MACb,MA6dA,EA5dE,CAAC,EAAW,EAAa,CAAG,gBAAS,IACrC,CAAC,EAAc,EAAgB,CAAG,gBAAS,IAC3C,CAAE,UAAQ,CAAE,aAAW,CAAE,iBAAe,CAAE,oBAAkB,CAAE,CAAG,IACvE,iBAAU,KACF,AAAC,OAAQ,EAAQ,KAAK,EAAI,EAAM,QAAQ,AAAD,IAAO,KAAK,GAAG,EAAY,EAAM,QAAQ,CACxF,EAAG,CACC,MAAQ,EAAQ,KAAK,EAAI,EAAM,QAAQ,CACvC,EACH,EACD,iBAAU,KACF,AAAC,OAAQ,EAAQ,KAAK,EAAI,EAAM,eAAe,AAAD,IAAO,KAAK,GAAG,EAAmB,EAAM,eAAe,CAC7G,EAAG,CACC,MAAQ,EAAQ,KAAK,EAAI,EAAM,eAAe,CAC9C,EACH,EACD,IAAM,EAAU,MAAQ,EAAQ,KAAK,EAAI,EAAM,aAAa,CACtD,EAAa,AAAC,OAAQ,EAAQ,KAAK,EAAI,EAAM,UAAU,AAAD,GAAM,KAC5D,EAAc,AAAC,OAAQ,EAAQ,KAAK,EAAI,EAAM,WAAW,AAAD,GAAM,KAC9D,EAAU,AAAC,OAAQ,EAAQ,KAAK,EAAI,EAAM,OAAO,AAAD,GAAM,SACtD,EAAa,cAAO,CAAC,MAAQ,GAAmB,MAAS,GAAY,CAAO,CAAC,EAAE,AAAD,EAAK,KAAK,EAAI,EAAU,GAAG,GAAK,MAC9G,EAAkB,cAAO,MACzB,EAAM,eAAQ,IAAI,IAAI,MAAW,CAAI,EAAE,EACvC,EAAgB,cAAO,MACvB,EAAwB,cAAO,MAC/B,CAAC,EAAY,EAAc,CAAG,gBAAS,GACvC,EAAgB,KAClB,EAActC,KAAK,GAAG,GAC1B,EACM,EAAyB,eAAQ,IACjB,IAAI,MAAS,CAEhC,EAAE,EACC,EAAuB,eAAQ,KACjC,IAAM,EAAY,IAAI,MAAS,CAE/B,OADA,EAAU,MAAM,CA3FI,EA4Fb,CACX,EAAG,EAAE,EACL,iBAAU,KACN,EAAqB,OAAO,CAAG,CACnC,EAAG,CACC,EACA,EACH,EACD,IAAM,EAAmB,CACrB,KAAM,EACN,IAAK,EACL,MAAO,EACP,YAAaC,KAAK,KAAK,CAAC,EAAa,GACrC,WAAYA,KAAK,KAAK,CAAC,EAAc,EACzC,EACM,CAAC,EAAmB,EAAqB,CAAG,gBAAS,IACrD,EAAa,cAAO,IAC1B,iBAAU,KACN,EAAW,OAAO,CAAG,GACd,KACH,EAAW,OAAO,CAAG,EACzB,GACD,EAAE,EACL,IAAM,EAAc,cAAO,CACvB,GAAG,CAAgB,AACvB,GACM,EAAuB,MAAO,EAAU,KAC1C,GAAI,EAAI,MAAM,CAAC,KAAK,GAAK,GAAY,EAAI,MAAM,CAAC,MAAM,GAAK,EAAW,CAElE,GADA,EAAI,QAAQ,CAAC,MAAM,CAAC,EAAU,GAC1B,EAAgB,OAAO,CAAE,CACzB,IAAM,EAAc,EAAW,EAC/B,EAAgB,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,wBAAyB,EAAY,QAAQ,GAC3F,CAQA,EAAY,OAAO,CAPS,CACxB,KAAM,EACN,IAAK,EACL,MAAO,EACP,YAAaA,KAAK,KAAK,CAAC,EAAW,GACnC,WAAYA,KAAK,KAAK,CAAC,EAAY,EACvC,CAEJ,CACJ,EACM,EAAe,MAAO,EAAa,KACrC,IAAM,EAAc,EAAW,OAAO,CACtC,GAAI,CAAC,EAAa,OAAO,KAAKC,QAAQ,IAAI,CAAC,sBAC3C,IAAM,EAAc,GAAe,EAC7B,EAAe,GAAgB,CACrC,OAAM,EAAqB,EAAa,GACnC,GAAoB,KACrBA,QAAQ,IAAI,CAAC,mBAAoB,GACjC,MAAM,GAAY,IAEtB,IAAM,EAAU,GAAoB,GACpC,GAAI,CAAC,EAAS,MAAM,AAAIL,MAAM,qBAC9B,IAAM,EAAS,WAAW,CAAC,GAC3B,GAAI,CAAC,EAAQ,MAAM,AAAIA,MAAM,oBAC7B,IAAM,EAAe,WACf,EAAQ,EAAuB,eAAe,CAAC,EACjD,IAAO,EAAuB,WAAW,CAAC,GAC9C,EAAO,KAAK,CAAG,EACf,EAAO,MAAM,CA1JG,EA2JhB,EAAO,KAAK,CAAG,EACf,EAAO,MAAM,CAAG,EAChB,EAAuB,QAAQ,CAAC,EACpC,EACM,EAAkB,AAAC,QACjB,EAAwB,MAWxB,CAVC,GAAsB,OAAO,GAC9B,EAAsB,OAAO,CAAG,WAAW,CAAC,IAC5C,EAAsB,OAAO,CAAC,MAAM,CAhKX,EAiKzB,EAAsB,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,GAAK,IAC9C,EAAsB,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,IACxC,EAAsB,OAAO,CAAC,KAAK,CAAG,oBAE1C,EAAsB,OAAO,CAAC,CAAC,CAAG,AAAC,OAAS,GAAyB,EAAc,OAAO,AAAD,EAAK,KAAK,EAAI,EAAuB,CAAC,AAAD,GAAM,EACpI,EAAsB,OAAO,CAAC,CAAC,CAAG,AAAC,OAAS,GAA0B,EAAc,OAAO,AAAD,EAAK,KAAK,EAAI,EAAwB,CAAC,AAAD,GAAM,EACtI,EAAuB,QAAQ,CAAC,EAAsB,OAAO,EAE7D,IAAI,EAAc,GACZ,EAAU,AAAC,IACb,GAAI,EAAa,MACb,CAAC,GAAW,GAAY,CAAU,EAGtC,IAAM,EAAW,AADCI,CAAAA,KAAK,GAAG,CAAC,AADP,GAAc,CAAQ,EACD,IAAMA,KAAK,EAAE,CAAG,GAAK,GAAK,EACvCA,KAAK,EAAE,CAAG,CAClC,GAAsB,OAAO,EAAE,GAAsB,OAAO,CAAC,QAAQ,CAAG,CAAO,EACnF,EAAM,EACV,SACA,EAAM,GACS,KACP,EAAsB,OAAO,EAAE,EAAuB,WAAW,CAAC,EAAsB,OAAO,EACnG,EAAc,EAClB,CAEJ,EACM,EAAgB,MAAO,EAAK,EAAG,KACjC,IAAI,EAAwB,EACvB,GAAoB,KACrBC,QAAQ,IAAI,CAAC,mBAAoB,GACjC,MAAM,GAAY,IAEtB,IAAM,EAAU,GAAoB,GACpC,GAAI,CAAC,EAAS,MAAM,AAAIL,MAAM,qBAC9B,IAAM,EAAS,WAAW,CAAC,GACvB,EAAU,MAAS,GAAyB,EAAc,OAAO,AAAD,EAAK,KAAK,EAAI,EAAuB,CAAC,CACtG,EAAU,MAAS,GAA0B,EAAc,OAAO,AAAD,EAAK,KAAK,EAAI,EAAwB,CAAC,CAG5G,GAFI,UAAY,OAAO,GAAG,GAAU,GAChC,UAAY,OAAO,GAAG,GAAU,GAChC,KAAK,IAAM,GAAW,KAAK,IAAM,EAAS,OAAO,KAAKK,QAAQ,IAAI,CAAC,2BAA4B,EAAG,GACtG,GAAI,EAAc,OAAO,CAAE,CACvB,IAAM,EAAU,EAAuB,eAAe,CAAC,UACnD,IAAS,EAAuB,WAAW,CAAC,EACpD,CACA,EAAc,OAAO,CAAG,EACxB,EAAc,OAAO,CAAC,CAAC,CAAG,EAC1B,EAAc,OAAO,CAAC,CAAC,CAAG,EAC1B,EAAc,OAAO,CAAC,KAAK,CAAG,UAC9B,EAAc,OAAO,CAAC,MAAM,CAjNR,EAkNpB,EAAuB,QAAQ,CAAC,EAAc,OAAO,CACzD,EACM,EAAe,CAAC,EAAO,KACzB,EAAY,OAAO,CAAG,EACtB,IAAM,EAAiB,GAAgB,EAAI,MAAM,CAAC,KAAK,EAAI,EACrD,EAAW,EAAWD,KAAK,GAAG,CAAC,EAAG,EAAiB,EAAM,KAAK,EAAI,EACxE,EAAuB,KAAK,CAAC,GAAG,CAAC,GACjC,EAAuB,CAAC,CAAG,EAAWA,KAAK,KAAK,CAAC,AA9P/B,EA8PmD,EAAM,IAAI,CAAG,GA9PhE,EA+PlB,EAAuB,CAAC,CAAG,EAAWA,KAAK,KAAK,CAAC,AA9PhC,EA8PmD,EAAM,GAAG,CAAG,GA9P/D,EA+PjB,IAAM,EAAU,EAAuB,eAAe,CAAC,WACnD,IACA,EAAQ,KAAK,CAAC,GAAG,CAAC,EAAI,GAClB,UAAY,OAAO,EAAM,WAAW,EAAI,UAAY,OAAO,EAAM,UAAU,GAC3E,EAAQ,CAAC,CAAG,EAAM,WAAW,CAC7B,EAAQ,CAAC,CAAG,EAAM,UAAU,EAGxC,EACM,EAAkB,MAAO,EAAa,EAAU,KAClD,IAAM,EAAqB,EAAI,MAAM,CAAC,KAAK,EAAI,EACzC,EAAsB,EAAI,MAAM,CAAC,MAAM,EAAI,EACjD,GAAI,CAAC,EAAU,CACX,IAAM,EAAe,CACjB,GAAG,EAAY,OAAO,AAC1B,EACM,EAAmB,EAAa,WAAW,CAC3C,EAAkB,EAAa,UAAU,CACzC,EAAYmC,YAAY,GAAG,GAEjC,GAD0B,UAAY,OAAO,EAAY,WAAW,EAAI,UAAY,OAAO,EAAY,UAAU,EAAK,EAAY,WAAW,GAAK,GAAoB,EAAY,UAAU,GAAK,EACzK,MACxB,OAAM,IAAItB,QAAQ,AAAC,IACf,IAAM,EAAU,AAAC2B,IACb,IAAM,EAAcA,EAAc,EAE5B,EAAW,GADGxC,KAAK,GAAG,CAAC,EAAc,EAAU,IAOrD,EALkB,CACd,GAAG,CAAY,CACf,YAAa,EAAmB,AAAC,GAAY,WAAW,CAAG,CAAe,EAAK,EAC/E,WAAY,EAAkB,AAAC,GAAY,UAAU,CAAG,CAAc,EAAK,CAC/E,EACwB,GACpB,EAAc,EAAU,EAAM,GAC7B,GACT,EACA,EAAM,EACV,GACA,MACJ,CACA,IAAM,EAAe,CACjB,GAAG,EAAY,OAAO,AAC1B,EACM,EAAY,EAAa,IAAI,CAC7B,EAAW,EAAa,GAAG,CAC3B,EAAmB,EAAa,WAAW,CAC3C,EAAkB,EAAa,UAAU,CACzC,EAAa,EAAa,KAAK,CAAG,EAClC,EAAYmC,YAAY,GAAG,GAC3B,EAAoB,UAAY,OAAO,EAAY,WAAW,EAAI,UAAY,OAAO,EAAY,UAAU,EAAK,GAAY,WAAW,GAAK,GAAoB,EAAY,UAAU,GAAK,CAAc,EACzM,EAAsB,EAAoB,KAAQ,EAAW,EAE7D,EAAqB,EAAW,CACtC,OAAM,IAAItB,QAAQ,AAAC,IACf,IAAM,EAAU,AAAC,IACb,IAAM,EAAY,CACd,GAAG,EAAY,OAAO,AAC1B,EACM,EAAc,EAAc,EAClC,GAAI,EAAmB,GAAI,GAAe,EAAqB,CAE3D,IAAM,EAAgB,GADGb,KAAK,GAAG,CAAC,EAAc,EAAqB,GAErE,GAAU,WAAW,CAAG,EAAmB,AAAC,GAAY,WAAW,CAAG,CAAe,EAAK,EAC1F,EAAU,UAAU,CAAG,EAAkB,AAAC,GAAY,UAAU,CAAG,CAAc,EAAK,CAC1F,MACI,EAAU,WAAW,CAAG,EAAY,WAAW,CAC/C,EAAU,UAAU,CAAG,EAAY,UAAU,CAEjD,GAAI,EAjBY,EAiBmB,CAG/B,IAAM,EAAiB,GADGA,KAAK,GAAG,CAAC,AADT,GAlBd,CAkB0C,EACC,EAAoB,IAGrE,EAAgB,EAAa,AAAC,CADhB,EAAY,KAAK,CAAG,EACU,CAAS,EAAK,EAC1D,EAAgB,EAAqB,CAE3C,GAAU,KAAK,CAAG,EAClB,IAAM,EAAe,EAAY,AAAC,GAAY,IAAI,CAAG,CAAQ,EAAK,EAC5D,EAAc,EAAW,AAAC,GAAY,GAAG,CAAG,CAAO,EAAK,EACxD,EAAmB,EAAe,EAAgB,EAClD,EAAiB,EALA,EAAsB,EAKS,CACtD,GAAU,IAAI,CAAG,EAAmB,EAAI,EAAe,EAAmB,EAC1E,EAAU,GAAG,CAAG,EAAiB,EAAI,EAAc,EAAiB,CACxE,CACA,EAAa,EAAW,GACpB,EAAc,EAAU,EAAM,GAC7B,GACT,EACA,EAAM,EACV,EACJ,EACM,EAAiB,SAAS,CAAQ,CAAE,CAAQ,CAAE,CAAK,EACrD,IAAI,EAAcY,UAAU,MAAM,CAAG,GAAK,KAAK,IAAMA,SAAS,CAAC,EAAE,CAAGA,SAAS,CAAC,EAAE,CAAG,EACnF,OAAO,IAAIC,QAAQ,AAAC,IAChB,IAAM,EAAYsB,YAAY,GAAG,GAC3B,EAAU,AAAC,IACb,IAAM,EAAc,EAAc,EAC5B,EAAWnC,KAAK,GAAG,CAAC,EAAc,EAAU,EAClD,GAAS,KAAK,CAAG,IAAM,EAAc,EAAI,GAAO,GAAY,GAAO,GAC/D,EAAc,EAAU,EAAM,GAC7B,GACT,EACA,EAAM,EACV,EACJ,EACM,EAAc,MAAO,EAAU,EAAU,IAAQ,EAAe,EAAU,EAAU,EAAO,GAC3F,EAA2B,MAAO,EAAU,EAAmB,EAAY,EAAU,KACvF,EAAqB,cAAc,GACnC,IAAM,EAAgB,IACf,EACN,CACK,EAAc,EAAc,MAAM,CACpC,EAAgB,CACpB,OAAM,IAAIa,QAAQ,AAAC,IACf,IAAMlB,EAAYwC,YAAY,GAAG,GAC3B,EAAU,AAACK,IACb,IAAM,EAAcA,EAAc7C,EAE5B,EAAmBK,KAAK,KAAK,CAAC,AADnB,GAAoBA,KAAK,GAAG,CAAC,EAAc,EAAU,IACvB,GAC/C,KAAM,EAAgB,GAAiB,CACnC,IAAM,EAAcA,KAAK,KAAK,CAACA,KAAK,MAAM,GAAK,EAAc,MAAM,EAC7DN,EAAU,EAAc,MAAM,CAAC,EAAa,EAAE,CAAC,EAAE,CACvD,GAAIA,EAAS,CACT,GAAM,CAAC,EAAmB,CAAG,GAAgBA,EAAQ,IAAI,CAAEA,EAAQ,OAAO,CAAE,UAC5E,GAAmB,KAAK,CAAG,EAC3B,EAAqB,QAAQ,CAAC,GAC9B,IACA,EAAe,EA5VH,GA4VoD,EACpE,CACJ,CACA,GAAI,EAAc,EAAU,EAAM,OAC7B,CACD,KAAM,EAAc,MAAM,CAAG,GAAE,CAC3B,IAAM,EAAcM,KAAK,KAAK,CAACA,KAAK,MAAM,GAAK,EAAc,MAAM,EAC7DN,EAAU,EAAc,MAAM,CAAC,EAAa,EAAE,CAAC,EAAE,CACjD,CAAC,EAAmB,CAAG,GAAgBA,EAAQ,IAAI,CAAEA,EAAQ,OAAO,CAAE,UAC5E,GAAmB,KAAK,CAAG,EAC3B,EAAqB,QAAQ,CAAC,EAClC,CACA,GAAI,EAAY,CACZ,GAAM,CAAC,EAAkB,CAAG,GAAgB,EAAY,cAAe,aACvE,GAAkB,KAAK,CAAG,EAC1B,EAAqB,QAAQ,CAAC,EAClC,CACA,EAAkB,GAAG,CAAC,AAAC,IACnB,GAAM,CAAC,EAAmB,CAAG,GAAgB,EAAQ,IAAI,CAAE,EAAQ,OAAO,EAAI,GAAI,YAClF,GAAmB,KAAK,CAAG,EAC3B,EAAqB,QAAQ,CAAC,EAClC,GACA,GACJ,CACJ,EACA,EAAM,EACV,EACJ,EACM,EAAO,UACJ,EAAgB,OAAO,EAAK,IACjC,MAAM,EAAI,IAAI,CAAC,CACX,MAAO,EACP,OAAQ,EACR,WAAY,SACZ,YAAa,GACb,UAAW,EACf,GACK,EAAgB,OAAO,GAC5B,EAAgB,OAAO,CAAC,WAAW,CAAC,EAAI,MAAM,EAC9C,EAAuB,CAAC,CAAG,EAC3B,EAAuB,CAAC,CAAG,EAC3B,EAAI,KAAK,CAAC,QAAQ,CAAC,GACnB,EAAqB,CAAC,CAAG,EACzB,EAAqB,CAAC,CAAG,EACzB,EAAuB,QAAQ,CAAC,IACpC,EACM,CAAC,EAAa,EAAe,CAAG,gBAAS,IACzC,EAAqB,cAAO,MAQ5B,EAAO,KACT,IAAI,EA6EJ,OA5EAmB,QAAQ,OAAO,CAAC,AAAC,WACb,GAAI,CAAC,EAAK,MAAM,AAAIjB,MAAM,0BAC1B,GAAI,CAAC,EAAS,MAAM,AAAIA,MAAM,uBAC9B,GAAM,CAAE,OAAK,CAAE,QAAM,CAAE,SAAO,CAAE,CAAG,KACnC,EAAW,EACX,IAAM,EAAY,EAAQ,MAAM,CAAC,AAAC,GAAO,CAAC,CAAC,EAAK,GAAG,EAAE,GAAG,CAAC,AAAC,GAAO,EAAK,GAAG,CACzE,OAAMiB,QAAQ,GAAG,CAAC,IACX,EACH,GACA,GACH,CAAC,GAAG,CAAC,KACN,EAAqB,cAAc,GACnC,MAAM,EAAc,GAAc,EAAa,EAAG,EAAc,GAChE,MAAM,IACN,MAAM,EAAa,CACf,GAAG,CAAgB,AACvB,GACA,IAAM,EAAgB,EAAQ,MAAM,CAAC,CAAC,EAAK,IAAO,EAAM,EAAK,QAAQ,CAAI,GAAK,MAAM,EAAI,EAAK,qBAAqB,CAAG,EAAK,qBAAqB,CAAG,GAAI,GAEhJlB,EAAYwC,YAAY,GAAG,GACjC,EAAqB,GACrB,IAAM,EAAiB,KACnB,IAAM,EAAWnC,KAAK,GAAG,CAAC,AAACmC,CAAAA,YAAY,GAAG,GAAKxC,CAAQ,EAAK,EAAe,GAE3E,GADA,EAAqB,GACjB,EAAW,EAAG,OAAO,EAAQ,EANN,IAO/B,EAGA,IAAI,IAAM,KAFV,EAAM,GACF,EAAmB,OAAO,EAAE,EAAmB,OAAO,CAAC,KAAK,GAC7C,EAAQ,CACvB,IAAM,EAAO,CAAO,CAAC,EAAM,CAG3B,GAFA,EAAa,EAAK,KAAK,EAAI,IAC3B,EAAgB,EAAK,QAAQ,EAAI,IAC7B,UAAY,EAAK,IAAI,CAAE,MAAM,GAAM,EAAK,QAAQ,OAC/C,GAAI,YAAc,EAAK,IAAI,CAAE,CAC9B,IAAI,EACJ,GAAI,CAAC,EAAK,GAAG,CAAE,MAAM,AAAIC,MAAM,kBAC/B,GAAW,OAAO,CAAG,EAAK,GAAG,CAC7B,MAAM,EAAa,EAAK,UAAU,CAAE,EAAK,WAAW,EACpD,IAAM,EAAW,AAAC,OAAS,GAAgB,EAAK,OAAO,AAAD,EAAK,KAAK,EAAI,EAAc,IAAI,AAAD,EAAK,GAAW,EAAK,OAAO,CAAC,IAAI,EAAI,EAAE,CACtH,EAAoB,EAAK,gBAAgB,CAAG,CAC9C,EAAK,gBAAgB,CACxB,CAAG,EAAE,CAEN,GADA,MAAM,EAAyB,EAAU,EAAmB,EAAK,UAAU,CAAE,EAAK,QAAQ,CAAE,GACxF,EAAK,MAAM,CAAE,CACb,GAAI,CAAC,EAAK,qBAAqB,CAAE,MAAM,AAAIA,MAAM,oCACjD,OAAM,EAAgB,EAAK,MAAM,CAAE,EAAK,qBAAqB,CAAE,EACnE,CACJ,MAAO,GAAI,kBAAoB,EAAK,IAAI,CACpC,MAAM,EAAY,EAAsB,EAAK,QAAQ,CAAE,GACvD,EAAqB,cAAc,GACnC,EAAqB,KAAK,CAAG,OAC1B,GAAI,QAAU,EAAK,IAAI,CACtB,EAAK,GAAG,EAAI,EAAK,GAAG,GAAK,EAAW,OAAO,GAC3C,EAAW,OAAO,CAAG,EAAK,GAAG,CAC7B,MAAM,EAAa,EAAK,UAAU,CAAE,EAAK,WAAW,GAEpD,EAAK,MAAM,CAAE,MAAM,EAAgB,EAAK,MAAM,CAAE,EAAK,QAAQ,CAAE,GAC9D,MAAM,GAAM,EAAK,QAAQ,OAC3B,GAAI,YAAc,EAAK,IAAI,CAAE,CAChC,GAAI,CAAC,EAAK,GAAG,CAAE,MAAM,AAAIA,MAAM,0BAC/B,OAAM,EAAc,EAAK,GAAG,CAChC,MAAO,GAAI,qBAAuB,EAAK,IAAI,CAAE,CACzC,IAAM,EAAO,EAAgB,EAC7B,OAAM,GAAM,EAAK,QAAQ,EACzB,GACJ,CACJ,CACI,EAAmB,OAAO,GAC1B,MAAM,GAAM,MACZ,EAAmB,OAAO,CAAC,IAAI,GAC/B,EAAmB,OAAO,CAAG,KAC7B,EAAe,IAEvB,KAAK,KAAK,CAAC,AAAC,IACRK,QAAQ,KAAK,CAAC,eAAgB,EAClC,IACO,KACH,MAAQ,GAAY,GACxB,CACJ,EACA,iBAAU,KACNY,QAAQ,OAAO,CAAC,AAAC,WAEb,GADA,MAAM,IACF,EAAgB,OAAO,EAAI,GAAc,EAAa,CACtD,IAAM,EAAc,EAAa,EACjC,EAAgB,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,wBAAyB,EAAY,QAAQ,IACvF,EAAgB,OAAO,CAAC,YAAY,CAAC,gBAAiB,GACtD,IAAM,EAAkB,EAAgB,OAAO,CAAC,OAAO,CAAC,oBACpD,IAAiB,EAAgB,YAAY,CAAC,gBAAiB,EACvE,CACA,GACJ,MACO,KACH,GAAI,CACA,EAAI,OAAO,CAAC,GAAM,CACd,SAAU,GACV,QAAS,EACb,EACJ,CAAE,MAAO,EAAG,CACRZ,QAAQ,IAAI,CAAC,iBAAkB,EACnC,CACJ,GACD,CACC,EACA,EACA,EACH,EACD,iBAAU,KACN,GAAI,EAAY,OAAO,GAC3B,EAAG,CACC,EACH,EACD,GAAM,CAAC,EAAqB,EAAuB,CAAG,gBAAS,IACzD,CAAC,EAAuB,EAAyB,CAAG,gBAAS,IAC7D,EAAiBD,KAAK,KAAK,CAAC,IAAM,GAElC,EAAe,IAAM,EAC3B,iBAAU,KACN,GAAI,EAAc,CACd,IAAM,EAAW,AAAC,IACV,MAAQ,EAAM,GAAG,EAAE,GAC3B,EAEA,OADAT,OAAO,gBAAgB,CAAC,UAAW,GAC5B,KACHA,OAAO,mBAAmB,CAAC,UAAW,EAC1C,CACJ,CACJ,EAAG,CACC,EACH,EAED,IAAI,EAAgB,KAAK,EAsBzB,OArBI,EAAoB,EAAG,EAAkC,UAAI,IAAI,CAAE,CACnE,UAAyB,UAAI,IAAe,CAAE,CAC1C,KAAM,GACN,MAAO,MACX,GACA,KAAM,SACV,GACS,GACL,EAAkC,UAAI,IAAI,CAAE,CACxC,UAAyB,UAAI,IAAkB,CAAE,CAC7C,MAAO,MACX,GACA,KAAM,SACV,GACA,EAAgB,IAAI,KACjB,EAAkC,UAAI,IAAI,CAAE,CAC/C,UAAyB,UAAI,IAAkB,CAAE,CAC7C,MAAO,MACX,GACA,KAAM,SACV,GACqB,WAAK,MAAO,CAC7B,UAAW,mBACX,SAAU,CACQ,UAAI,MAAO,CACrB,UAAW,mBACX,IAAK,CACT,GACc,UAAI,MAAO,CACrB,UAAW,0BACX,SAAwB,UAAI,MAAO,CAC/B,UAAW,kBACX,SAAwB,UAAI,MAAO,CAC/B,UAAW,2BACX,MAAO,CACH,MAAO,CAAC,EAAE,EAAe,CAAC,CAAC,CAC3B,WArDA,IAAM,EAAoB,OAAS,MAsDvC,CACJ,EACJ,EACJ,GACc,UAAI,MAAO,CACrB,UAAW,uBACX,SAAwB,UAAI,MAAO,CAC/B,UAAW,eACX,SAAwB,WAAK,MAAO,CAChC,UAAW,iBACX,SAAU,CACQ,WAAK,MAAO,CACtB,UAAW,cACX,SAAU,CACQ,UAAI,MAAO,CACrB,UAAW,QACX,SAAU,CACd,GACc,UAAI,IAAO,CAAE,CACvB,MAAO,EACP,SAAwB,UAAI,MAAO,CAC/B,UAAW,WACX,SAAU,CACd,EACJ,GACH,AACL,GACA,EAAc,KAAqB,UAAI,MAAO,CAC1C,UAAW,cACX,aAAc,IAAI,EAAuB,IACzC,aAAc,IAAI,EAAuB,IACzC,QAAS,EACT,SAAU,CACd,GACA,AAAC,OAAQ,EAAQ,KAAK,EAAI,EAAM,iBAAiB,AAAD,EAAmB,UAAI,IAAO,CAAE,CAC5E,MAAO,kBACP,SAAwB,UAAI,MAAO,CAC/B,UAAW,cACX,aAAc,IAAI,EAAuB,IACzC,aAAc,IAAI,EAAuB,IACzC,QAAS,IAAI,GAAe,EAAM,iBAAiB,EACnD,SAAwB,UAAI,IAAgB,CAAE,CAC1C,MAAO,MACX,EACJ,EACJ,GAAK,KACS,UAAI,IAAO,CAAE,CACvB,MAAO,EAAc,gBAAkB,eACvC,SAAwB,UAAI,MAAO,CAC/B,UAAW,cACX,QAAS,EAAc,KAAK,EApOvC,IACjB,AAAI,EAAmB,OAAO,CAAS,KAAKU,QAAQ,IAAI,CAAC,0BACpD,EAAI,MAAM,MACf,EAAmB,OAAO,CAAG,IAAI,GAAiB,EAAI,MAAM,EAC5D,EAAe,IACf,KAHwB,KAAKA,QAAQ,IAAI,CAAC,6BAmOd,MAAO,CACH,QAAS,EAAc,GAAM,EAC7B,OAAQ,EAAc,cAAgB,SAC1C,EACA,SAAU,EAA4B,UAAI,IAAI,CAAE,CAC5C,KAAM,UACN,QAAS,CACb,GAAmB,UAAI,IAAc,CAAE,CAAC,EAC5C,EACJ,GACc,UAAI,IAAQ,CAAE,CACxB,QAAS,CACL,QACA,QACH,CACD,UAAW,cACX,aAAc,CACV,SAAU,OACd,EACA,eAAgB,AAAC,GAAqB,UAAI,MAAO,CACzC,MAAO,CACH,aAAc,MACd,OAAQ,gCACR,gBAAiB,OACjB,UAAW,gCACX,SAAU,QACd,EACA,SAAU,CACd,GACJ,KAAM,CACF,MAAO,CACH,aAAc,MACd,QAAS,CACb,EACA,MAAO,CACH,CACI,IAAK,WACL,MAAO,CACH,OAAQ,OACR,OAAQ,EACR,QAAS,QACb,EACA,MAAqB,WAAK,MAAO,CAC7B,MAAO,CACH,QAAS,OACT,WAAY,SACZ,eAAgB,gBAChB,MAAO,OACP,OAAQ,MACZ,EACA,SAAU,CACQ,WAAK,MAAO,CACtB,MAAO,CACH,QAAS,OACT,WAAY,SACZ,IAAK,KACT,EACA,SAAU,CACQ,UAAI,GAAoB,CAClC,MAAO,CACH,MAAO,OACP,OAAQ,MACZ,CACJ,GACc,UAAI,OAAQ,CACtB,MAAO,CACH,SAAU,OACV,YAAa,MACjB,EACA,SAAU,iBACd,GACH,AACL,GACc,UAAI,IAAM,CAAE,CACtB,KAAM,QACN,QAAS,EACT,SAAU,AAAC,IACP,EAAY,GACZ,GACJ,EACA,QAAS,CAAC,EAAGP,KACT,IAAI,EACJ,OAAO,MAAQA,GAAa,MAAS,GAAqBA,EAAE,eAAe,AAAD,EAAK,KAAK,EAAI,EAAmB,IAAI,CAACA,EACpH,CACJ,GACH,AACL,EACJ,EACA,CACI,IAAK,kBACL,MAAO,CACH,OAAQ,OACR,OAAQ,EACR,QAAS,QACb,EACA,MAAqB,WAAK,MAAO,CAC7B,MAAO,CACH,QAAS,OACT,WAAY,SACZ,eAAgB,gBAChB,MAAO,OACP,OAAQ,MACZ,EACA,SAAU,CACQ,WAAK,MAAO,CACtB,MAAO,CACH,QAAS,OACT,WAAY,SACZ,IAAK,KACT,EACA,SAAU,CACQ,UAAI,GAAa,CAC3B,MAAO,CACH,MAAO,OACP,OAAQ,MACZ,CACJ,GACc,UAAI,OAAQ,CACtB,MAAO,CACH,SAAU,OACV,YAAa,MACjB,EACA,SAAU,sBACd,GACH,AACL,GACc,UAAI,IAAM,CAAE,CACtB,KAAM,QACN,QAAS,EACT,SAAU,AAAC,IACP,EAAmB,GACnB,GACJ,EACA,QAAS,CAAC,EAAGA,KACT,IAAI,EACJ,OAAO,MAAQA,GAAa,MAAS,GAAqBA,EAAE,eAAe,AAAD,EAAK,KAAK,EAAI,EAAmB,IAAI,CAACA,EACpH,CACJ,GACH,AACL,EACJ,EACH,AACL,EACA,SAAwB,UAAI,MAAO,CAC/B,UAAW,cACX,aAAc,IAAI,EAAyB,IAC3C,aAAc,IAAI,EAAyB,IAC3C,MAAO,CACH,OAAQ,UACR,QAAS,OACT,WAAY,SACZ,eAAgB,SAChB,QAAS,EAAwB,EAAI,GACrC,WAAY,cAChB,EACA,SAAwB,UAAI,GAAgB,CACxC,MAAO,CACH,MAAO,OACP,OAAQ,MACZ,CACJ,EACJ,EACJ,GACH,AACL,EACJ,EACJ,GACH,AACL,EACJ,CC/0BA,IAAM,GAAuB,AAAC,IAC1B,GAAI,CAAE,QAAM,CAAE,SAAO,CAAE,aAAW,CAAE,aAAW,CAAE,mBAAiB,CAAE,eAAa,CAAE,qBAAmB,CAAE,eAAe,EAAK,CAAE,iBAAe,CAAE,SAAO,CAAE,UAAQ,CAAE,CAAG,EACjK,EAAyB,gBACzB,IAAc,IAA0B,uBAAsB,EAC9D,GAAqB,GAAc,IAA0B,yBAAwB,EACzF,IAAI,EAAmB,GAqCvB,OApCI,GAAe,WAAa,EACxB,EAAS,EAAiC,WAAK,MAAO,CACtD,UAAW,oBACX,SAAU,CACQ,UAAI,IAAI,CAAE,CACpB,SAAU,EACV,UAAyB,UAAI,IAAe,CAAE,CAC1C,KAAM,EACV,EACJ,GACc,UAAI,MAAO,CACrB,UAAW,uDACX,SAAwB,UAAI,GAAY,CACpC,KAAM,EACN,MAAO,CACX,EACJ,GACH,AACL,GACS,EAAmB,EAAiC,UAAI,GAAQ,CACrE,cAAe,EAAkB,OAAO,CACxC,WAAY,EAAkB,KAAK,CACnC,YAAa,EAAkB,MAAM,CACrC,kBAAmB,AAAC,0BAA2B,GAAe,WAAa,CAAU,GAAO,OAAQ,EAAS,KAAK,EAAI,EAAO,UAAU,AAAD,EAAK,MAAQ,EAAS,KAAK,EAAI,EAAO,UAAU,CAAG,KACzL,QAAS,EACT,SAAU,CACd,EAAG,GACM,OAAQ,EAAS,KAAK,EAAI,EAAO,KAAK,AAAD,EAAG,EAAiC,UAAI,MAAO,CACzF,SAAU,MAAQ,EAAS,KAAK,EAAI,EAAO,KAAK,AACpD,GACS,AAAC,OAAQ,EAAS,KAAK,EAAI,EAAO,MAAM,AAAD,IAAO,KAAK,GAAG,GAAmB,UAAY,MAAQ,OAAQ,EAAS,KAAK,EAAI,EAAO,MAAM,AAAD,EAAmB,UAAI,MAAO,CACtK,SAAU,MAAQ,EAAS,KAAK,EAAI,EAAO,MAAM,AACrD,GAAmB,UAAI,MAAO,CAC1B,SAAUQ,KAAK,SAAS,CAAC,MAAQ,EAAS,KAAK,EAAI,EAAO,MAAM,CAAE,KAAM,EAC5E,EAAC,EACE,EAAmB,GAAgB,GACrB,UAAI,MAAO,CAC5B,UAAW,EACX,MAAO,CACH,OAAQ,OACR,QAAS,OACT,cAAe,SACf,KAAM,WACN,eAAgB,QACpB,EACA,SAAU,CACd,EACJ,EClCM,GAxBY,AAAC,GAAsB,WAAK,MAAO,CAC7C,MAAO,6BACP,MAAO,GACP,OAAQ,GACR,KAAM,OACN,aAAc,aACd,QAAS,YACT,GAAG,CAAK,CACR,SAAU,CACQ,UAAI,OAAQ,CACtB,MAAO,GACP,OAAQ,GACR,KAAM,UACN,GAAI,EACR,GACc,UAAI,OAAQ,CACtB,KAAM,UACN,OAAQ,OACR,eAAgB,QAChB,YAAa,MACb,EAAG,mLACP,GACH,AACL,sDCxBA,GAAsB,CAAC,CAEvB,IAAoB,CAAC,CAAG,CAAC,EAAS,KAC9B,IAAI,IAAI,KAAO,EAAe,GAAoB,CAAC,CAAC,EAAY,IAAQ,CAAC,GAAoB,CAAC,CAAC,EAAS,IAAMb,OAAO,cAAc,CAAC,EAAS,EAAK,CAC9I,WAAY,GACZ,IAAK,CAAU,CAAC,EAAI,AACxB,EACJ,EAGA,GAAoB,CAAC,CAAG,CAAC,EAAK,IAAOA,OAAO,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,EAAK,GAG/E,GAAoB,CAAC,CAAG,AAAC,IACjB,aAAe,OAAOC,QAAUA,OAAO,WAAW,EAAED,OAAO,cAAc,CAAC,EAASC,OAAO,WAAW,CAAE,CACvG,MAAO,QACX,GACAD,OAAO,cAAc,CAAC,EAAS,aAAc,CACzC,MAAO,EACX,EACJ,EAEJ,IAAI,GAAmC,CAAC,EACxC,GAAoB,CAAC,CAAC,IACtB,GAAoB,CAAC,CAAC,GAAkC,CACpD,OAAQ,IAAI,IAAM,AACtB,GACA,GAAM,CAAE,OAAQ,EAAc,CAAE,CAAG,GAC7B,GAAc,6BACd,GAAyB,8BACzB,GAA6B,KAC/B,IAAM,EAAgBI,aAAa,OAAO,CAAC,IAC3C,OAAO,EAAgBS,KAAK,KAAK,CAAC,GAAiB,CAAC,CACxD,EACM,GAAsB,IAAIT,aAAa,OAAO,CAAC,KAA2B,QAC1E,GAAsB,AAAC,IACzBA,aAAa,OAAO,CAAC,GAAwB,EACjD,EACM,GAAkB,GAAe,CAAC,EAAK,IAAO,EAC5C,QAAS,KACT,iBAAkB,KAClB,aAAc,AAACqC,IACX,IAAM,EAAa,CACf,GAAG,IAAM,OAAO,AACpB,CACA,QAAO,CAAU,CAACA,EAAK,CACvB,EAAI,CACA,QAAS,CACb,GACArC,aAAa,OAAO,CAAC,GAAaS,KAAK,SAAS,CAAC,GACrD,EACA,WAAY,AAAC,IACT,GAAM,CAAE,MAAI,CAAE,CAAG,EACX,EAAiB,IAAM,OAAO,CAC9B,EAAc,CAAc,CAAC,EAAK,EAAI,EAAE,CACxC,EAAqBA,KAAK,SAAS,CAAC,CACtC,OAAQ,EAAY,MAAM,CAC1B,OAAQ,EAAY,MAAM,AAC9B,GACM,EAAiB,CACnB,KACG,EAAY,MAAM,CAAC,AAAC,GAKZ,AAJoBA,KAAK,SAAS,CAAC,CACtC,OAAQ,EAAE,MAAM,CAChB,OAAQ,EAAE,MAAM,AACpB,KAC8B,GAErC,AACG,GAAe,MAAM,CAAG,IAAI,GAAe,MAAM,CAAG,EAAC,EACzD,IAAM,EAAa,CACf,GAAG,CAAc,CACjB,CAAC,EAAK,CAAE,CACZ,EACA,EAAI,CACA,QAAS,CACb,GACAT,aAAa,OAAO,CAAC,GAAaS,KAAK,SAAS,CAAC,GACrD,EACA,kBAAmB,AAAC,GAAO,IAAM,OAAO,CAAC,EAAK,EAAI,EAAE,CACpD,oBAAqB,AAAC,IAClB,EAAI,CACA,iBAAkB,CACtB,GACA,GAAoB,EACxB,CACJ,ICvFE,GAAuB,CACzB,UAAW,CACP,SAAU,cACV,QAAS,aACT,SAAU,cACV,OAAQ,YACR,KAAM,UACN,OAAQ,YACR,OAAQ,YACR,QAAS,YACb,EACA,YAAa,CACT,SAAU,8BACd,CAMJ,EACM,GAAoB,AAAC,GAAS,UAAY,OAAO,GAAU,OAAS,GAAW,WAAW,GAAU,cAAgB,EAAO,IAAI,AAAD,EAC9H,GAAgB,AAAC,QACf,EAGI,EASA,EAVR,GAAI,AAAC,OAAS,GAAc,EAAM,IAAI,AAAD,EAAK,KAAK,EAAI,EAAY,QAAQ,AAAD,IAAO,GAAqB,SAAS,CAAC,MAAM,CAAE,KAE5G,EAGJ,GAFI,EAAM,IAAI,CAAC,KAAK,EAAE,GAAQ,YAAc,OAAO,EAAM,IAAI,CAAC,KAAK,CAAG,EAAM,IAAI,CAAC,KAAK,GAAK,EAAM,IAAI,CAAC,KAAK,AAAD,EACtG,CAAC,GAAS,AALO,EAKU,KAAK,EAAE,GAAQ,AALzB,EAK0C,KAAK,AAAD,EAC/D,GAAS,GAAqB,WAAW,CAAC,QAAQ,IAAI,EAAO,MAAO,GACxE,IAAM,EAAc,AAAC,OAAS,GAAe,EAAM,IAAI,AAAD,EAAK,KAAK,EAAI,EAAa,WAAW,AAAD,GAAM,AAP5E,EAO6F,WAAW,EAAI,GACjI,GAAI,UAAY,OAAO,GAAe,EAAY,WAAW,GAAG,QAAQ,CAAC,eAAgB,MAAO,EACpG,CACA,GAAI,UAAY,OAAO,GAAS,OAAS,EAAO,CAE5C,IAAM,EAAc,AAZC,EAYgB,WAAW,EAAK,OAAS,GAAyB,AAZlE,EAYmF,IAAI,AAAD,EAAK,KAAK,EAAI,EAAuB,WAAW,AAAD,GAAM,GAChK,GAAI,UAAY,OAAO,EAAa,CAChC,IAAM,EAAO,EAAY,WAAW,GACpC,GAAI,EAAK,QAAQ,CAAC,gBAAkB,EAAK,QAAQ,CAAC,YAAc,EAAK,QAAQ,CAAC,UAAW,MAAO,EACpG,CACA,GAAI,cAAgB,AAjBC,EAiBgB,QAAQ,EAAI,cAAgB,AAjB5C,EAiB6D,IAAI,CAAE,MAAO,UAAY,OAAO,GAAe,EAAY,WAAW,GAAG,QAAQ,CAAC,cACxK,CACA,MAAO,EACX,EACM,GAAgB,AAAC,QACf,EAAmB,EAAoB,EAKnC,EAAoB,EAJ5B,IAAI,EAAc,EACd,EAAa,GACb,EAAa,GACjB,KAAM,AAAC,OAAS,GAAoB,EAAY,IAAI,AAAD,EAAK,KAAK,EAAI,EAAkB,QAAQ,AAAD,IAAO,GAAqB,SAAS,CAAC,QAAQ,EAAI,AAAC,OAAS,GAAqB,EAAY,IAAI,AAAD,EAAK,KAAK,EAAI,EAAmB,QAAQ,AAAD,IAAO,GAAqB,SAAS,CAAC,OAAO,EAAI,AAAC,OAAS,GAAqB,EAAY,IAAI,AAAD,EAAK,KAAK,EAAI,EAAmB,QAAQ,AAAD,IAAO,GAAqB,SAAS,CAAC,QAAQ,EAE/Y,AAAC,OAAS,GAAqB,EAAY,IAAI,AAAD,EAAK,KAAK,EAAI,EAAmB,QAAQ,AAAD,IAAO,GAAqB,SAAS,CAAC,QAAQ,EAAE,GAAa,EAAG,EACtJ,AAAC,OAAS,GAAqB,EAAY,IAAI,AAAD,EAAK,KAAK,EAAI,EAAmB,QAAQ,AAAD,IAAO,GAAqB,SAAS,CAAC,OAAO,EAAE,GAAa,EAAG,EACzJ,EAAc,EAAY,IAAI,CAAC,SAAS,EAAI,EAEhD,MAAO,CACH,cACA,aACA,YACJ,CACJ,EACM,GAAsB,AAAC,IACzB,IAAI,EACJ,IAAI,EAAe,EACnB,KAAM,MAAS,GAAqB,EAAa,IAAI,AAAD,EAAK,KAAK,EAAI,EAAmB,SAAS,EAAC,CAC3F,GAAI,EAAa,IAAI,CAAC,QAAQ,GAAK,GAAqB,SAAS,CAAC,OAAO,EAAI,EAAa,IAAI,CAAC,YAAY,CAAE,OAAO,EAAa,IAAI,CAAC,YAAY,GAClJ,EAAe,EAAa,IAAI,CAAC,SAAS,AAC9C,CACJ,EC/D6B,WAAQ,CAAC,CAClC,OAAQ,AhDqP0B,GgDrPE,QAAQ,CAAC,2BACjD,GAQoC,WAAQ,CAAC,CACzC,OAAQ,AhD2O0B,GgD3OE,QAAQ,CAAC,kCACjD,GAQqC,WAAQ,CAAC,CAC1C,OAAQ,AhDiO0B,GgDjOE,QAAQ,CAAC,mCACjD,GAQ+B,WAAQ,CAAC,CACpC,OAAQ,AhDuN0B,GgDvNE,QAAQ,CAAC,4BACjD,GAQ+B,WAAQ,CAAC,CACpC,MAAO,UAAO,CAAC,CACX,WAAQ,GACR,WAAQ,GACX,EAAE,SAAS,CAAC,AAAC,GAAMuC,OAAO,IAAM,QAAQ,CAAC,4IAC1C,OAAQ,AhDyM0B,GgDzME,QAAQ,CAAC,2BAA2B,QAAQ,GAChF,KAAM,SAAS,CAAC,CACZ,UACA,QACA,SACH,EAAE,OAAO,CAAC,WAAW,QAAQ,GAAG,QAAQ,CAAC,gLAC9C,GAQuC,WAAQ,CAAC,CAC5C,OAAQ,AhD0L0B,GgD1LE,QAAQ,CAAC,qDAAqD,QAAQ,GAC1G,QAAS,WAAQ,GAAG,QAAQ,CAAC,wBACjC,GAQgC,WAAQ,CAAC,CACrC,UAAW,SAAS,CAAC,CACjB,OACA,KACA,QACA,OACH,EAAE,OAAO,CAAC,QAAQ,QAAQ,CAAC,2BAC5B,WAAY,SAAS,CAAC,CAClB,OACA,cACA,WACA,aACA,YACH,EAAE,OAAO,CAAC,QAAQ,QAAQ,CAAC,mBAC5B,SAAU,WAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC,oCACpD,OAAQ,AhDiK0B,GgDjKE,QAAQ,GAAG,QAAQ,CAAC,6BAC5D,GAQqC,WAAQ,CAAC,CAC1C,KAAM,AhDuJ4B,GgDvJA,QAAQ,CAAC,8BAC3C,GAAI,AhDsJ8B,GgDtJF,QAAQ,CAAC,6BAC7C,GAQmC,WAAQ,CAAC,CACxC,OAAQ,AhD4I0B,GgD5IE,QAAQ,CAAC,kCAC7C,SAAU,WAAQ,GAAG,OAAO,CAAC,KAAK,QAAQ,GAAG,QAAQ,CAAC,sCAC1D,GAO+B,WAAQ,CAAC,CACpC,MAAO,AhDkI2B,GgDlIC,QAAQ,GAAG,QAAQ,CAAC,8FACvD,UAAW,SAAS,CAAC,CACjB,KACA,OACA,OACA,QACH,EAAE,QAAQ,GAAG,QAAQ,CAAC,iHACvB,SAAU,WAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC,iEACzC,IAAK,AhD0H6B,GgD1HD,QAAQ,GAAG,QAAQ,CAAC,wEACrD,SAAU,WAAQ,GAAG,OAAO,CAAC,KAAK,QAAQ,CAAC,iDAC3C,OAAQ,WAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC,gIAC3C,GAOoC,WAAQ,CAAC,CACzC,OAAQ,AhD+G0B,GgD/GE,QAAQ,CAAC,gCACjD,GC3IA,IAAM,GAAoB,AAAC,IACvB,IAAM,EAAgB,EAAK,UAAU,CAAC,MAAQ,EAAK,KAAK,CAAC,GAAK,EAC9D,GAAI,EAAc,UAAU,CAAC,OAAQ,OAAO,EAAc,SAAS,CAAC,GAAG,OAAO,CAAC,WAAY,OAAO,OAAO,CAAC,IAAK,OAAO,IAAI,GAC1H,IAAM,EAAW,EAAc,OAAO,CAAC,WAAY,OAAO,IAAI,GACxD,EAAQ,EAAS,KAAK,CAAC,YAC7B,AAAI,EAAM,MAAM,CAAG,EAAU,EAAM,KAAK,CAAC,IAAI,IAAI,CAAC,KAC3C,CACX,EAKM,GAAwB,AAAC,GAC3B,AAAI,YAAc,EAAa,6BAC3B,aAAe,EAAa,8BAC5B,UAAY,EAAa,mCACzB,kBAAoB,EAAa,4CACjC,YAAc,EAAa,0CAC3B,YAAc,EAAa,iEAC3B,iBAAmB,EAAa,2CAChC,oBAAsB,EAAa,oEACnC,aAAe,EAAa,wFAC5B,aAAe,EAAa,sCAC5B,cAAgB,EAAa,kDAC7B,aAAe,EAAa,sCAC5B,aAAe,EAAa,oCAC5B,UAAY,EAAa,2BACzB,cAAgB,EAAa,0CAC1B,0BAEL,GAAqB,CAAC,EAAkB,EAAuB,EAAQ,EAAa,EAAc,KACpG,GAAI,CAAC,EAAkB,MAAO,GAe9B,GAAI,CAdkB,AAAC,MACnB,GAAI,EAAa,CACb,IAAM,EAAS,EAAY,IAAI,CAAC,AAAC,GAAI,EAAE,cAAc,GAAK,GAAgB,EAAE,IAAI,GAAK,GACrF,GAAI,EAAQ,CACR,GAAI,CAAC,EAAO,WAAW,CAAE,MAAO,GAChC,GAAI,UAAY,OAAO,EAAO,WAAW,EAAI,UAAW,EAAO,WAAW,CAGtE,OAAO,AADWpD,OAAO,IAAI,CADf,EAAO,WAAW,CAAC,KAAK,EAAI,CAAC,GAE1B,MAAM,CAAG,CAElC,CACJ,CACA,MAAO,EACX,KACoB,MAAO,GAC3B,GAAI,EAAuB,CACvB,IAAM,EAAgB,GAAU,CAAC,EAC3B,EAAS,MAAQ,EAAc,KAAK,EAAI,EAAY,IAAI,CAAC,AAAC,GAAI,EAAE,cAAc,GAAK,GAAgB,EAAE,IAAI,GAAK,GACpH,GAAI,AAAC,OAAQ,EAAS,KAAK,EAAI,EAAO,WAAW,AAAD,GAAM,GAAkB,EAAO,WAAW,EAAG,CAEzF,IAAM,EAAQ,AADC,EAAO,WAAW,CACZ,KAAK,EAAI,CAAC,EAC/B,OAAOA,OAAO,IAAI,CAAC,GAAO,KAAK,CAAC,AAAC,IAE7B,GAAM,CAAE,YAAU,CAAE,CAAG,GADT,CAAK,CAAC,EAAI,EAElB,EAAQ,CAAa,CAAC,EAAI,CAChC,OAAO,GAAc,KAAK,IAAM,GAAS,KAAO,GAAS,OAAS,CACtE,EACJ,CACA,MAAO,EACX,CACA,OAAO,EAAY,IAAI,GAAG,MAAM,CAAG,CACvC,EC/CM,GAhBa,AAAC,GAAsB,UAAI,MAAO,CAC7C,MAAO,6BACP,MAAO,GACP,OAAQ,GACR,KAAM,OACN,QAAS,YACT,GAAG,CAAK,CACR,SAAwB,UAAI,OAAQ,CAChC,OAAQ,OACR,cAAe,QACf,eAAgB,QAChB,cAAe,IACf,YAAa,MACb,EAAG,wKACP,EACJ,GCZE,GAAiB,AAAC,IACpB,GAAI,CAAE,sBAAsB,EAAK,CAAE,iBAAiB,EAAK,CAAE,4BAA4B,EAAK,CAAE,8BAA8B,EAAK,CAAE,CAAG,EAChI,EAAyB,EAAa,AAAC,GAAQ,EAAM,sBAAsB,EAC3E,EAA4B,EAAa,AAAC,GAAQ,EAAM,yBAAyB,EACjF,EAAY,EAAa,AAAC,GAAQ,EAAM,SAAS,EACjD,EAAe,EAAa,AAAC,GAAQ,EAAM,YAAY,EACvD,EAAqB,EAAa,AAAC,GAAQ,EAAM,kBAAkB,EACnE,EAAwB,EAAa,AAAC,GAAQ,EAAM,qBAAqB,EACzE,EAAc,EAAa,AAAC,GAAQ,EAAM,WAAW,EACrD,EAAiB,EAAa,AAAC,GAAQ,EAAM,cAAc,EACjE,GAAI,CAAC,GAAkB,CAAC,GAAuB,CAAC,EAA2B,OAAO,KAClF,IAAM,EAAc,AAgBpB,WACI,IAAM,EAAQ,EAAE,CAmEhB,OAlEI,GAAgB,EAAM,IAAI,CAAC,CAC3B,MAAqB,UAAI,IAAQ,CAAE,CAC/B,SAAU,AAAC,GAAI,EAA0B,EAAE,MAAM,CAAC,OAAO,EACzD,QAAS,EACT,S9BtCI,4B8BuCR,GACA,IAAK,cACT,GACI,GAAqB,EAAM,IAAI,CAAC,CAChC,MAAqB,UAAI,IAAQ,CAAE,CAC/B,SAAU,AAAC,IACP,EAAa,EAAE,MAAM,CAAC,OAAO,CACjC,EACA,QAAS,EACT,S9B/CK,Y8BgDT,GACA,IAAK,mBACT,GACI,GAA6B,CAAC,IAC9B,EAAM,IAAI,CAAC,CACP,MAAqB,UAAI,IAAQ,CAAE,CAC/B,SAAU,AAAC,IACP,EAAsB,EAAE,MAAM,CAAC,OAAO,CAC1C,EACA,QAAS,EACT,S9BzDU,+B8B0Dd,GACA,IAAK,4BACT,GACA,EAAM,IAAI,CAAC,CACP,MAAqB,WAAK,MAAO,CAC7B,MAAO,CACH,QAAS,OACb,EACA,SAAU,CACQ,UAAI,MAAO,CACrB,MAAO,CACH,aAAc,MACd,SAAU,MACd,EACA,S9BvEL,6B8BwEC,GACc,WAAK,WAAW,CAAE,CAC5B,KAAM,QACN,MAAO,EACP,SAAU,AAAC,GAAI,EAAe,EAAE,MAAM,CAAC,KAAK,EAC5C,SAAU,CACQ,UAAI,KAAK,CAAE,CACrB,MAAO,GACP,SAAU,KACd,GACc,UAAI,KAAK,CAAE,CACrB,MAAO,GACP,SAAU,KACd,GACc,UAAI,KAAK,CAAE,CACrB,MAAO,eACP,SAAU,cACd,GACH,AACL,GACH,AACL,GACA,IAAK,qBACT,IAEG,CACX,IApFA,MAAqB,UAAI,MAAO,CAC5B,UAAW,mBACX,SAAwB,UAAI,IAAQ,CAAE,CAClC,KAAM,CACF,MAAO,CACX,EACA,QAAS,CACL,QACH,CACD,SAAwB,UAAI,GAAS,CACjC,MAAO,GACP,OAAQ,EACZ,EACJ,EACJ,EAuEJ,8BCpGA,GAAM,CAAE,WAAQ,CAAE,CAAG,IAAK,CACpB,GAAc,CAAC,EAAO,IAAa,CAAC,EAAE,EAAM,EAAE,EAAa,cAAgB,GAAG,CAAC,CAC/E,GAAY,AAAC,IACf,GAAI,CAAE,MAAI,CAAE,OAAK,CAAE,YAAU,CAAE,cAAY,CAAE,YAAa,CAAiB,CAAE,CAAG,EAC1E,EAAc,GAAqB,CAAC,MAAM,EAAE,EAAK,CAAC,CACxD,MAAqB,UAAI,SAAS,CAAE,CAChC,KAAM,CACF,SACA,EACH,CACD,MAAO,GAAY,EAAO,CAAC,GAC3B,MAAO,EAAa,CAChB,CACI,SAAU,GACV,QAAS,CAAC,aAAa,EAAE,EAAK,CAAC,AACnC,EACH,CAAG,EAAE,CACN,MAAO,CACH,cACJ,EACA,MAAO,GACP,SAAwB,UAAI,IAAK,CAAE,CAC/B,YAAa,CACjB,EACJ,EAAG,EACP,EACM,GAAc,AAAC,IACjB,GAAI,CAAE,MAAI,CAAE,OAAK,CAAE,YAAU,CAAE,cAAY,CAAE,YAAa,CAAiB,CAAE,CAAG,EAC1E,EAAc,GAAqB,CAAC,aAAa,EAAE,EAAK,sBAAsB,CAAC,CACrF,MAAqB,UAAI,SAAS,CAAE,CAChC,KAAM,CACF,SACA,EACH,CACD,MAAO,GAAY,EAAO,CAAC,GAC3B,MAAO,EAAa,CAChB,CACI,SAAU,GACV,QAAS,CAAC,IAAI,EAAE,EAAK,YAAY,CAAC,AACtC,EACH,CAAG,EAAE,CACN,MAAO,CACH,cACJ,EACA,MAAO,GACP,SAAwB,UAAI,GAAU,CAClC,KAAM,EACN,YAAa,CACjB,EACJ,EAAG,EACP,EACM,GAAY,AAAC,QAEX,EADJ,GAAI,CAAE,MAAI,CAAE,OAAK,CAAE,aAAW,CAAE,YAAU,CAAE,cAAY,CAAE,YAAa,CAAiB,CAAE,CAAG,EAGvF,EAAgB,AADH,CAAC,OAAS,GAAoB,EAAY,IAAI,AAAD,EAAK,KAAK,EAAI,EAAkB,MAAM,AAAD,GAAM,EAAE,AAAD,EAC3E,GAAG,CAAC,AAAC,GAAS,EACvC,QACA,MAAO,EAAM,MAAM,CAAC,GAAG,WAAW,GAAK,EAAM,KAAK,CAAC,EACvD,IACJ,MAAqB,UAAI,SAAS,CAAE,CAChC,KAAM,CACF,SACA,EACH,CACD,MAAO,EACP,MAAO,EAAa,CAChB,CACI,SAAU,GACV,QAAS,CAAC,cAAc,EAAE,EAAK,CAAC,AACpC,EACH,CAAG,EAAE,CACN,MAAO,CACH,cACJ,EACA,MAAO,GACP,SAAwB,UAAI,IAAM,CAAE,CAChC,YAAa,GAAqB,CAAC,OAAO,EAAE,EAAK,CAAC,CAClD,QAAS,CACb,EACJ,EAAG,EACP,EACM,GAAc,AAAC,IACjB,GAAI,CAAE,MAAI,CAAE,OAAK,CAAE,YAAU,CAAE,cAAY,CAAE,YAAa,CAAiB,CAAE,CAAG,EAC1E,EAAqB,AAAsB,IAAtB,cAAe,CAAG,EACvC,EAAmB,GAAoBgB,OAAO,IAAsB,EAEpE,EAAM,aAAe,EAAO,IAAQ,KAAK,EAC/C,MAAqB,UAAI,SAAS,CAAE,CAChC,KAAM,CACF,SACA,EACH,CACD,MAAO,CAAC,EAAE,EAAM,EAAE,aAAe,EAAO,QAAU,GAAG,CAAC,CACtD,MAAO,EAAa,CAChB,CACI,SAAU,GACV,QAAS,CAAC,aAAa,EAAE,EAAK,CAAC,AACnC,EACA,CACI,KAAM,SACN,IAfA,EAgBA,QAAS,GAAG,sBAA+B,AAC/C,EACH,CAAG,CACA,CACI,KAAM,SACN,IArBA,EAsBA,QAAS,GAAG,sBAA+B,AAC/C,EACH,CACD,MAAO,CACH,KAAM,aAAe,EAAO,EAAI,KAAK,EACrC,cACJ,EACA,MAAO,GACP,SAAwB,UAAI,IAAW,CAAE,CACrC,YAAa,EAAiB,QAAQ,GACtC,IAhCI,EAiCJ,IAAK,EACL,KAAM,aAAe,EAAO,GAAK,EACjC,MAAO,CACH,MAAO,MACX,CACJ,EACJ,EAAG,EACP,EACM,GAAe,AAAC,IAClB,GAAI,CAAE,MAAI,CAAE,OAAK,CAAE,YAAU,CAAE,cAAY,CAAE,YAAa,CAAiB,CAAE,CAAG,EAWhF,MAAqB,UAAI,SAAS,CAAE,CAChC,KAAM,CACF,SACA,EACH,CACD,MAAO,GAAY,EAAO,CAAC,GAC3B,MAAO,EAAa,CAChB,CACI,SAAU,GACV,QAAS,CAAC,cAAc,EAAE,EAAK,CAAC,AACpC,EACH,CAAG,EAAE,CACN,MAAO,CACH,cACJ,EACA,MAAO,GACP,SAAwB,UAAI,IAAM,CAAE,CAChC,YAAa,GAAqB,CAAC,OAAO,EAAE,EAAK,CAAC,CAClD,QA5Bc,CAClB,CACI,MAAO,GACP,MAAO,MACX,EACA,CACI,MAAO,GACP,MAAO,OACX,EACH,AAoBG,EACJ,EAAG,EACP,EChJM,GAfW,AAAC,GAAsB,UAAI,MAAO,CAC3C,MAAO,6BACP,MAAO,GACP,OAAQ,GACR,KAAM,OACN,QAAS,YACT,GAAG,CAAK,CACR,SAAwB,UAAI,OAAQ,CAChC,OAAQ,OACR,cAAe,QACf,eAAgB,QAChB,YAAa,MACb,EAAG,sDACP,EACJ,GCYE,GA1Ba,AAAC,GAAsB,WAAK,MAAO,CAC9C,MAAO,6BACP,MAAO,GACP,OAAQ,GACR,KAAM,OACN,QAAS,YACT,GAAG,CAAK,CACR,SAAU,CACQ,UAAI,OAAQ,CACtB,OAAQ,OACR,cAAe,QACf,eAAgB,QAChB,cAAe,IACf,YAAa,KACb,EAAG,yEACP,GACc,UAAI,OAAQ,CACtB,OAAQ,OACR,cAAe,QACf,eAAgB,QAChB,cAAe,IACf,YAAa,KACb,EAAG,iCACP,GACH,AACL,GCUE,GAnCqB,AAAC,GAAsB,WAAK,MAAO,CACtD,MAAO,6BACP,MAAO,GACP,OAAQ,GACR,KAAM,OACN,QAAS,YACT,GAAG,CAAK,CACR,SAAU,CACQ,WAAK,IAAK,CACpB,OAAQ,OACR,eAAgB,QAChB,cAAe,IACf,YAAa,IACb,SAAU,gCACV,SAAU,CACQ,UAAI,OAAQ,CACtB,EAAG,mEACP,GACc,UAAI,OAAQ,CACtB,cAAe,QACf,EAAG,8EACP,GACH,AACL,GACc,UAAI,OAAQ,CACtB,SAAwB,UAAI,WAAY,CACpC,GAAI,0BACJ,SAAwB,UAAI,OAAQ,CAChC,KAAM,OACN,EAAG,qBACP,EACJ,EACJ,GACH,AACL,GC5BE,CAAE,KAAI,IAAK,IAAU,CACrB,GAAkB,AAAC,IACrB,GAAI,CAAE,UAAQ,CAAE,SAAO,CAAE,aAAW,CAAE,CAAG,EACnC,CAAC,EAAa,EAAe,CAAG,gBAAS,IACzC,CAAC,EAAYV,EAAc,CAAG,gBAAS,IACvC,EAAe,GAAgB,AAAC,GAAQ,EAAM,YAAY,EAC1D,EAAW,cAAO,MAClB,EAAiB,eAAQ,KAC3B,IAAM,EAAMI,KAAK,GAAG,GACd,EAAe,EAAM,OACrB,EAAa,EAAM,QACnB,EAAkB,EAAQ,MAAM,CAAC,AAAC,GAAO,EAAK,MAAM,CAAC,WAAW,GAAG,QAAQ,CAAC,EAAW,WAAW,KAMxG,MALe,CACX,YAAa,EAAgB,MAAM,CAAC,AAAC,GAAO,EAAK,SAAS,EAAI,GAC9D,YAAa,EAAgB,MAAM,CAAC,AAAC,GAAO,EAAK,SAAS,CAAG,GAAgB,EAAK,SAAS,EAAI,GAC/F,MAAO,EAAgB,MAAM,CAAC,AAAC,GAAO,EAAK,SAAS,CAAG,EAC3D,CAEJ,EAAG,CACC,EACA,EACH,EACK,EAAqB,AAAC,IACxB,EAAS,GACT,EAAe,GACnB,EAMA,iBAAU,KACN,GAAI,CAAC,EAAa,OAClB,IAAM,EAAqB,AAAC,IACpB,EAAS,OAAO,EAAI,CAAC,EAAS,OAAO,CAAC,QAAQ,CAAC,EAAM,MAAM,GAAG,EAAe,GACrF,EACM,EAAQe,WAAW,KACrBwB,SAAS,gBAAgB,CAAC,QAAS,EACvC,EAAG,KACH,MAAO,KACHI,aAAa,GACbJ,SAAS,mBAAmB,CAAC,QAAS,EAC1C,CACJ,EAAG,CACC,EACH,EACD,IAAM,EAAqB,CAAC,EAAO,IAC/B,AAAI,IAAM,EAAM,MAAM,CAAS,KACV,WAAK,MAAO,CAC7B,UAAW,gBACX,SAAU,CACQ,UAAI,MAAO,CACrB,UAAW,sBACX,SAAU,CACd,GACA,EAAM,GAAG,CAAC,CAAC,EAAM,IAAsB,UAAI,MAAO,CAC1C,UAAW,eACX,QAAS,IAAI,EAAmB,GAChC,SAAU,EAAK,MAAM,AACzB,EAAG,CAAC,EAAE,EAAK,SAAS,CAAC,CAAC,EAAE,EAAM,CAAC,GACtC,AACL,EAAG,GAEP,MAAqB,WAAK,MAAO,CAC7B,UAAW,2BACX,SAAU,CACQ,UAAI,MAAO,CACrB,UAAW,mBACX,QAAS,IAAI,EAAe,IAC5B,SAAwB,UAAI,GAAe,CACvC,MAAO,GACP,OAAQ,EACZ,EACJ,GACA,GAA6B,UAAI,MAAO,CACpC,UAAW,wBACX,IAAK,EACL,SAAwB,WAAK,MAAO,CAChC,UAAW,0BACX,SAAU,CACQ,WAAK,MAAO,CACtB,UAAW,uBACX,SAAU,CACQ,WAAK,GAAM,CACrB,OAAQ,GACR,MAAO,CACH,SAAU,MACd,EACA,SAAU,CACN,YACA,EAAQ,MAAM,CACd,IACH,AACL,GACc,UAAI,KAAM,CAAE,CACtB,KAAM,QACN,KAAM,OACN,KAAoB,UAAI,GAAa,CACjC,MAAO,GACP,OAAQ,EACZ,GACA,QAAS,IAAI,EAAe,IAC5B,UAAW,cACf,GACH,AACL,GACc,UAAI,MAAO,CACrB,UAAW,yBACX,SAAwB,WAAK,MAAO,CAChC,UAAW,uBACX,SAAU,CACQ,UAAI,IAAK,CAAE,CACrB,YAAa,SACb,MAAO,EACP,SAAU,AAAC,GAAI3C,EAAc,EAAE,MAAM,CAAC,KAAK,EAC3C,OAAsB,UAAI,GAAkB,CACxC,MAAO,GACP,OAAQ,EACZ,GACA,UAAW,eACX,WAAY,EAChB,GACc,UAAI,KAAM,CAAE,CACtB,KAAM,OACN,QAlGT,KACvB,EAAa,GACbA,EAAc,IACd,EAAe,GACnB,EA+FoC,UAAW,eACX,SAAU,IAAM,EAAQ,MAAM,CAC9B,SAAU,OACd,GACH,AACL,EACJ,GACc,UAAI,MAAO,CACrB,UAAW,kBACX,SAAU,IAAM,EAAQ,MAAM,CAAiB,UAAI,MAAO,CACtD,UAAW,aACX,SAAwB,UAAI,GAAM,CAC9B,KAAM,YACN,SAAU,mBACd,EACJ,GAAmB,WAAK,UAAQ,CAAE,CAC9B,SAAU,CACN,EAAmB,cAAe,EAAe,WAAW,EAC5D,EAAmB,cAAe,EAAe,WAAW,EAC5D,EAAmB,UAAW,EAAe,KAAK,EAClD,GAAc,IAAM,EAAe,WAAW,CAAC,MAAM,EAAI,IAAM,EAAe,WAAW,CAAC,MAAM,EAAI,IAAM,EAAe,KAAK,CAAC,MAAM,EAAkB,UAAI,MAAO,CAC9J,UAAW,aACX,SAAwB,UAAI,GAAM,CAC9B,KAAM,YACN,SAAU,4BACd,EACJ,GACH,AACL,EACJ,GACH,AACL,EACJ,GACH,AACL,EACJ,EC5JM,CAAE,SAAQ,IAAK,IAAK,CACpB,GAAc,AAAC,IACjB,GAAI,CAAE,kBAAgB,CAAE,MAAI,CAAE,aAAW,CAAE,cAAY,CAAE,SAAO,CAAE,WAAS,CAAE,SAAO,CAAE,OAAK,CAAE,QAAM,CAAE,sBAAsB,EAAI,CAAE,aAAW,CAAE,8BAA8B,EAAK,CAAE,CAAG,EAChL,CAAC,EAAkB,EAAoB,CAAG,gBAAS,IACnD,CAAC,EAAa,EAAe,CAAG,gBAAS,IACzC,EAAc,GAAsB,GACpC,EAAc,cAAO,MACrB,EAAoB,cAAO,MAC3B,EAAS,aAAa,CAAC,SAAU,GACjC,EAAiB,cAAO,MACxB,EAAU,GAAgB,AAAC,GAAQ,EAAM,OAAO,EAChD,EAAmB,GAAgB,AAAC,GAAQ,EAAM,gBAAgB,EAClE,EAAa,GAAgB,AAAC,GAAQ,EAAM,UAAU,EACtD,EAAsB,GAAgB,AAAC,GAAQ,EAAM,mBAAmB,EACxE,EAAyB,eAAQ,IAAI,CAAO,CAAC,EAAa,EAAI,EAAE,CAAE,CACpE,EACA,EACH,EACK,EAAwB,eAAQ,KAClC,GAAI,EAAa,CACb,IAAM,EAAS,EAAY,IAAI,CAAC,AAAC,GAAI,EAAE,cAAc,GAAK,GAAgB,EAAE,IAAI,GAAK,SACrF,CAAI,CAAE,OAAQ,EAAS,KAAK,EAAI,EAAO,WAAW,AAAD,KAC7C,GAAkB,EAAO,WAAW,GAI7B,AADWN,OAAO,IAAI,CADf,AADC,EAAO,WAAW,CACZ,KAAK,EAAI,CAAC,GAEd,MAAM,CAAG,EAGlC,CACA,MAAO,EACX,EAAG,CACC,EACA,EACH,EACK,EAAgB,eAAQ,KAC1B,GAAI,GAAe,EAAY,MAAM,CAAG,EAAG,CACvC,IAAM,EAAS,EAAY,IAAI,CAAC,AAAC,GAAI,EAAE,cAAc,GAAK,GAAgB,EAAE,IAAI,GAAK,GACrF,GAAI,EAAQ,CACR,GAAI,EAAO,WAAW,EAAI,GAAkB,EAAO,WAAW,EAAG,CAE7D,IAAM,EAAQ,AADC,EAAO,WAAW,CACZ,KAAK,EAAI,CAAC,EAM/B,OAL0BA,OAAO,IAAI,CAAC,GAAO,IAAI,CAAC,AAAC,IAE/C,GAAM,CAAE,YAAU,CAAE,CAAG,GADT,CAAK,CAAC,EAAI,EAExB,MAAO,CAAC,CACZ,EAEJ,CACA,MAAO,CAAC,CAAC,EAAO,WAAW,AAC/B,CACJ,CACA,MAAO,EACX,EAAG,CACC,EACA,EACH,EACK,EAA4B,eAAQ,IAS/B,AARuB,CAC1B,UACA,YACA,WACA,WACA,QACA,WACH,CAC4B,QAAQ,CAAC,GACvC,CACC,EACH,EACK,EAAsB,eAAQ,KAChC,GAAI,aAAe,EAAc,MAAO,GACxC,GAAI,EAAa,CACb,IAAM,EAAS,EAAY,IAAI,CAAC,AAAC,GAAI,EAAE,cAAc,GAAK,GAAgB,EAAE,IAAI,GAAK,GACrF,GAAI,AAAC,OAAQ,EAAS,KAAK,EAAI,EAAO,WAAW,AAAD,GAAM,GAAkB,EAAO,WAAW,EAAG,CAEzF,IAAM,EAAQ,AADC,EAAO,WAAW,CACZ,KAAK,EAAI,CAAC,EAM/B,OALuBA,OAAO,IAAI,CAAC,GAAO,IAAI,CAAC,AAAC,IAE5C,GAAM,CAAE,aAAW,CAAE,CAAG,GADV,CAAK,CAAC,EAAI,EAExB,OAAO,GAAc,EACzB,EAEJ,CACJ,CACA,MAAO,EACX,EAAG,CACC,EACA,EACH,EACK,EAAmB,eAAQ,KAC7B,IAEM,EAAoB,GAA6B,CAAC,EACxD,MAAO,AAHa,yBAA2B,GAC1B,GAEiB,CAC1C,EAAG,CACC,EACA,EACA,EACA,EACH,EACK,EAA2B,eAAQ,KACrC,IAAM,EAAkBA,OAAO,IAAI,CAAC,IACpC,GAAI,CAAC,GAAe,IAAM,EAAY,MAAM,CAAE,OAAO,EACrD,IAAM,EAAmB,EAAY,GAAG,CAAC,AAAC,GAAS,EAAO,cAAc,EAAI,EAAO,IAAI,EACjF,EAAe,IAAIqC,IASzB,OARA,EAAgB,OAAO,CAAC,AAAC,IACrB,IAAM,EAAa,EAAW,CAAC,EAAO,AAClC,CAAC,OAAQ,EAAa,KAAK,EAAI,EAAW,KAAK,AAAD,IAAO,cAAgB,AAAC,OAAQ,EAAa,KAAK,EAAI,EAAW,KAAK,AAAD,IAAO,aAAc,EAAa,GAAG,CAAC,GACpJ,EAAiB,QAAQ,CAAC,IAAS,EAAa,GAAG,CAAC,EACjE,GACA,EAAiB,OAAO,CAAC,AAAC,IACtB,EAAa,GAAG,CAAC,EACrB,GACOlB,MAAM,IAAI,CAAC,EACtB,EAAG,CACC,EACH,EACK,EAAmB,mBAAY,KACjC,GAAI,CAAC,GAAyB,CAAC,EAAa,MAAO,CAAC,EACpD,IAAM,EAAS,EAAY,IAAI,CAAC,AAAC,GAAI,EAAE,cAAc,GAAK,GAAgB,EAAE,IAAI,GAAK,GACrF,GAAI,AAAC,OAAQ,EAAS,KAAK,EAAI,EAAO,WAAW,AAAD,GAAM,GAAkB,EAAO,WAAW,EAAG,CACzF,IAAM,EAAgB,CAAC,EAEjB,EAAQ,AADC,EAAO,WAAW,CACZ,KAAK,EAAI,CAAC,EAM/B,OALAnB,OAAO,IAAI,CAAC,GAAO,OAAO,CAAC,AAAC,IAExB,IAAM,EAAe,GADP,CAAK,CAAC,EAAI,CAEpB,MAAK,IAAM,GAAc,EAAa,CAAC,EAAI,CAAG,CAAW,CACjE,GACO,CACX,CACA,MAAO,CAAC,CACZ,EAAG,CACC,EACA,EACA,EACH,EACD,iBAAU,KACF,CAAC,EAAK,aAAa,CAAC,SAAW,GAAkB,EAAK,aAAa,CAAC,OAAQ,EACpF,EAAG,CACC,EACA,EACH,EACD,iBAAU,KACF,GAAgB,IAAiB,GAAkB,EAAoB,EAC/E,EAAG,CACC,EACA,EACA,EACH,EACD,IAAM,EAAuB,mBAAY,KACrC,IAAM,EAAY,EAAkB,OAAO,CAC3C,GAAI,CAAC,EAAW,OAChB,IAAI,EAAgB,KACd,EAAsB,EAAU,aAAa,CAAC,qCAC9C,EAAiB,EAAU,aAAa,CAAC,4CAG/C,GAFI,EAAqB,EAAgB,EAChC,GAAgB,GAAgB,CAAa,EAClD,EAAe,CACf,IAAM,EAAgB,EAAU,qBAAqB,GAC/C,EAAa,EAAc,qBAAqB,GAChD,EAAa,EAAW,IAAI,CAAG,EAAc,IAAI,CAAG,EAAU,UAAU,CACxE,EAAc,EAAW,KAAK,CAC9B,EAAiB,EAAc,KAAK,CAE1C,EAAU,QAAQ,CAAC,CACf,KAAMW,KAAK,GAAG,CAAC,EAFO,EAAa,AAAC,GAAiB,CAAU,EAAK,GAGpE,SAAU,QACd,EACJ,CACJ,EAAG,EAAE,EACL,iBAAU,KACN,IAAM,EAAc,CAAsB,CAAC,EAAE,CAC7C,GAAI,KAAe,EAAe,OAAO,EAAI,EAAY,SAAS,GAAK,EAAe,OAAO,CAAC,SAAS,CACvG,GAAI,EACA,EAAK,cAAc,CAAC,CAChB,KAAM,EAAY,IAAI,CACtB,OAAQ,EAAY,MAAM,EAAI,GAC9B,OAAQ,EAAY,MAAM,AAC9B,GACA,EAAe,EAAY,MAAM,EAAI,IACrC,EAAe,OAAO,CAAG,MACtB,CACH,IAAM,EAAgB,IACtB,EAAK,cAAc,CAAC,CAChB,OAAQ,GACR,OAAQ,CACZ,GACA,EAAe,IACf,EAAe,OAAO,CAAG,IAC7B,CACJ,EAAG,CACC,EACA,EACA,EACA,EACH,EACD,iBAAU,KACN,IAAM,EAAYc,WAAW,KACzB,GACJ,EAAG,KACH,MAAO,IAAI4B,aAAa,EAC5B,EAAG,CACC,EACA,EACH,EACD,IAAM,EAAkB,aAAa,CAAC,SAAU,GAChD,iBAAU,KACF,IAAoB,GAAa,EAAe,GAAmB,GAC3E,EAAG,CACC,EACA,EACH,EACD,IAAM,EAAsB,mBAAY,AAAC,IACrC,EAAK,cAAc,CAAC,CAChB,OAAQ,EAAY,MAAM,CAC1B,KAAM,EAAY,IAAI,CACtB,OAAQ,EAAY,MAAM,AAC9B,GACA,EAAe,EAAY,MAAM,CACrC,EAAG,CACC,EACH,EACK,EAAqB,mBAAY,AAAC,IAEpC,EADc,EAAE,MAAM,CAAC,KAAK,CAEhC,EAAG,EAAE,EACC,EAA2B,eAAQ,KACrC,GAAI,CAAC,GAAyB,CAAC,EAAa,MAAO,GACnD,IAAM,EAAS,EAAY,IAAI,CAAC,AAAC,GAAI,EAAE,cAAc,GAAK,GAAgB,EAAE,IAAI,GAAK,SACrF,EAAI,CAAC,OAAQ,EAAS,KAAK,EAAI,EAAO,WAAW,AAAD,GAAM,GAAkB,EAAO,WAAW,IAG/E,IAAMrD,OAAO,IAAI,CADV,AADC,EAAO,WAAW,CACZ,KAAK,EAAI,CAAC,GACC,MAAM,AAG9C,EAAG,CACC,EACA,EACA,EACH,EACK,EAAqB,eAAQ,IAAI,GAAwC,EAAkB,CAAC,CAAC,EAAuB,EAAQ,EAAa,EAAc,GAAc,CACvK,EACA,EACA,EACA,EACA,EACA,EACH,EACK,EAAuB,mBAAY,KACrC,IAAM,EAAS,EAAK,cAAc,GAC9B,EAAgB,GACpB,GAAI,GAAyB,EAAO,MAAM,EAAI,EAAa,CACvD,IAAM,EAAS,EAAY,IAAI,CAAC,AAAC,GAAI,EAAE,cAAc,GAAK,GAAgB,EAAE,IAAI,GAAK,GACrF,GAAI,AAAC,OAAQ,EAAS,KAAK,EAAI,EAAO,WAAW,AAAD,GAAM,GAAkB,EAAO,WAAW,EAAG,CACzF,IAAI,EAAc,GACZiB,EAAc,EAAE,CAEhB,EAAQ,AADC,EAAO,WAAW,CACZ,KAAK,EAAI,CAAC,EAC/BjB,OAAO,IAAI,CAAC,GAAO,OAAO,CAAC,AAAC,IACxB,IAAI,EACJ,IAAM,EAAa,MAAS,GAAiB,EAAO,MAAM,AAAD,EAAK,KAAK,EAAI,CAAc,CAAC,EAAI,CAC1F,GAAI,MAAQ,GAAc,KAAO,EAAY,CAEzC,GAAM,CAAE,aAAW,CAAE,CAAG,GADV,CAAK,CAAC,EAAI,EAEpB,GAAc,GAAc,EAAcoD,OAAO,GAC5C,aAAe,EAAKnC,EAAY,IAAI,CAAC,CAAC,EAAE,EAAW,CAAC,EACxDA,EAAY,IAAI,CAACmC,OAAO,GACjC,CACJ,GACA,IAAM,EAAWnC,EAAY,IAAI,CAAC,KAClC,EAAgB,EAAc,CAAC,EAAE,EAAY,GAAG,EAAE,EAAS,CAAC,CAAG,CACnE,MAAO,EAAgB,EAAO,MAAM,EAAI,EAC5C,MAAO,EAAgB,EAAO,MAAM,EAAI,GACxC,IAAM,EAAiB,CACnB,KAAM,EAAO,IAAI,CACjB,OAAQ,EACR,OAAQ,EAAO,MAAM,CACrB,UAAWP,KAAK,GAAG,EACvB,EAGA,GAFA,EAAW,GACX,IACI,EAGA,GAFA,EAAe,OAAO,CAAG,EACzB,EAAe,IACX,EAAuB,CACvB,IAAM,EAAgB,IACtB,EAAK,aAAa,CAAC,SAAU,EACjC,MAAO,EAAK,aAAa,CAAC,SAAU,GAE5C,EAAG,CACC,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACH,EACK,EAAgB,mBAAY,AAAC,IAC3B,UAAY,EAAE,GAAG,EAAI,EAAE,OAAO,EAAI,GAClC,IACA,EAAE,cAAc,GAChB,EAAE,eAAe,IACV,UAAY,EAAE,GAAG,EAAEe,WAAW,KACrC,GAAI,EAAY,OAAO,CAAE,CACrB,IAAI,EACJ,IAAM,EAAW,MAAS,GAAyC,EAAY,OAAO,CAAC,iBAAiB,AAAD,EAAK,KAAK,EAAI,EAAuC,QAAQ,CACpK,GAAI,EAAU,CACV,IAAM,EAAiB,EAAS,cAAc,CAExC,EAAmB,AADX,EAAS,KAAK,CACG,WAAW,CAAC,KAEvC,CADiB,MAAO,GAAoB,EAAiB,CAAe,GAC9D,GAAS,SAAS,CAAG,EAAS,YAAY,AAAD,CAC/D,CACJ,CACJ,EAAG,EACP,EAAG,CACC,EACA,EACH,EACK,EAA0B,mBAAY,AAAC,IACrC,UAAY,EAAE,GAAG,EAAI,EAAE,OAAO,EAAI,IAClC,IACA,EAAE,cAAc,GAChB,EAAE,eAAe,GAEzB,EAAG,CACC,EACA,EACH,EACK,EAAyB,mBAAY,KACvC,GAAI,CAAC,EAAuB,OAAO,KACnC,GAAI,EAAa,CACb,IAAM,EAAS,EAAY,IAAI,CAAC,AAAC,GAAI,EAAE,cAAc,GAAK,GAAgB,EAAE,IAAI,GAAK,GACrF,GAAI,AAAC,OAAQ,EAAS,KAAK,EAAI,EAAO,WAAW,AAAD,GAAM,GAAkB,EAAO,WAAW,EAAG,CAEzF,IAAM,EAAQ,AADC,EAAO,WAAW,CACZ,KAAK,EAAI,CAAC,EACzB,EAAazB,OAAO,IAAI,CAAC,GAC/B,GAAI,IAAM,EAAW,MAAM,CAAE,CACzB,IAAM,EAAM,CAAU,CAAC,EAAE,CAEnB,CAAE,aAAW,CAAE,CAAG,GADV,CAAK,CAAC,EAAI,EAElB,EAAoB,GAAc,GAClC,EAAkB,AAAC,UACjB,EAOQ,EALZ,GAAI,MAAS,GAAyB,AADb,EAC8B,IAAI,AAAD,EAAK,KAAK,EAAI,EAAuB,WAAW,CAAE,OAAO,AAD1F,EAC2G,IAAI,CAAC,WAAW,CACpJ,GAAI,AAFqB,EAEJ,WAAW,CAAE,OAAO,AAFhB,EAEiC,WAAW,CACrE,GAAI,EAAa,CACb,IAAM,EAAS,EAAY,IAAI,CAAC,AAAC,GAAI,EAAE,cAAc,GAAK,GAAgB,EAAE,IAAI,GAAK,GACrF,GAAI,AAAC,OAAQ,EAAS,KAAK,EAAI,EAAO,WAAW,AAAD,GAAM,UAAY,OAAO,EAAO,WAAW,EAAI,UAAW,EAAO,WAAW,CAAE,CAG1H,IAAM,EAAW,AADH,GAAO,WAAW,CAAC,KAAK,EAAI,CAAC,EACrB,CAAC,EAAI,CAC3B,GAAI,MAAQ,GAAoB,MAAS,GAAiB,EAAS,IAAI,AAAD,EAAK,KAAK,EAAI,EAAe,WAAW,CAAE,OAAO,EAAS,IAAI,CAAC,WAAW,CAChJ,GAAI,MAAQ,EAAW,KAAK,EAAI,EAAS,WAAW,CAAE,OAAO,EAAS,WAAW,AACrF,CACJ,QACA,AAAI,EAA0B,iDAC1B,YAAc,EAAY,iCAC1B,UAAY,EAAY,sBACrB,CAAC,MAAM,EAAE,EAAI,CAAC,AACzB,KACA,MAAqB,UAAI,SAAS,CAAE,CAChC,KAAM,CACF,SACA,EACH,CACD,MAAO,CACH,OAAQ,CACZ,EACA,SAAwB,UAAI,aAAc,CAAE,CACxC,UAAW,mCACX,KAAM,EACN,YAAa,EACb,UAAW,GACX,UAAW,CACf,EACJ,EACJ,CACA,IAAM,EAAS,EAAE,CACX,EAAa,EAAW,IAAI,CAAC,CAAC,EAAM,KACtC,IAAM,EAAe,CAAK,CAAC,EAAK,CAC1B,EAAe,CAAK,CAAC,EAAK,CAC1B,CAAE,WAAY,CAAW,CAAE,CAAG,GAAc,GAC5C,CAAE,WAAYsD,CAAW,CAAE,CAAG,GAAc,SAClD,AAAI,CAAC,GAAeA,EAAoB,GACpC,GAAe,CAACA,EAAoB,EACjC,CACX,GAkDA,GAjDA,EAAW,OAAO,CAAC,CAAC,EAAK,KACrB,IAAI,EAAmB,EAAoB,EAE3C,GAAM,CAAE,aAAW,CAAE,YAAU,CAAE,CAAG,GADhB,CAAK,CAAC,EAAI,EAExB,EAAoB,GAAc,GAClC,EAAQ,EAAI,MAAM,CAAC,GAAG,WAAW,GAAK,EAAI,KAAK,CAAC,GAEhDC,EAAe,AAAsC,GAAtC,KAAU,EAAW,MAAM,CAAG,GAC7C,EAAc,AAAC,UACb,EAOQ,EALZ,GAAI,MAAS,GAAyB,AADb,EAC8B,IAAI,AAAD,EAAK,KAAK,EAAI,EAAuB,WAAW,CAAE,OAAO,AAD1F,EAC2G,IAAI,CAAC,WAAW,CACpJ,GAAI,AAFqB,EAEJ,WAAW,CAAE,OAAO,AAFhB,EAEiC,WAAW,CACrE,GAAI,EAAa,CACb,IAAM,EAAS,EAAY,IAAI,CAAC,AAAC,GAAI,EAAE,cAAc,GAAK,GAAgB,EAAE,IAAI,GAAK,GACrF,GAAI,AAAC,OAAQ,EAAS,KAAK,EAAI,EAAO,WAAW,AAAD,GAAM,UAAY,OAAO,EAAO,WAAW,EAAI,UAAW,EAAO,WAAW,CAAE,CAG1H,IAAM,EAAW,AADH,GAAO,WAAW,CAAC,KAAK,EAAI,CAAC,EACrB,CAAC,EAAI,CAC3B,GAAI,MAAQ,GAAoB,MAAS,GAAiB,EAAS,IAAI,AAAD,EAAK,KAAK,EAAI,EAAe,WAAW,CAAE,OAAO,EAAS,IAAI,CAAC,WAAW,CAChJ,GAAI,MAAQ,EAAW,KAAK,EAAI,EAAS,WAAW,CAAE,OAAO,EAAS,WAAW,AACrF,CACJ,CACA,GAAI,EAAmB,MAAO,gDAClC,KACM,EAAa,CACf,KAAM,EACN,QACA,YAAa,EACb,WAvBe,CAAC,EAwBhBA,aAAAA,EACA,aACJ,EACI,EAAmB,EAAO,IAAI,CAAe,UAAI,GAAa,CAC9D,GAAG,CAAU,AACjB,EAAG,IACM,AAAC,OAAS,GAAoB,EAAY,IAAI,AAAD,EAAK,KAAK,EAAI,EAAkB,QAAQ,AAAD,IAAO,UAAW,EAAO,IAAI,CAAe,UAAI,GAAW,CACpJ,GAAG,CAAU,AACjB,EAAG,IACM,AAAC,OAAS,GAAqB,EAAY,IAAI,AAAD,EAAK,KAAK,EAAI,EAAmB,QAAQ,AAAD,IAAO,YAAa,EAAO,IAAI,CAAe,UAAI,GAAa,CAC1J,GAAG,CAAU,AACjB,EAAG,IACM,AAAC,OAAS,GAAqB,EAAY,IAAI,AAAD,EAAK,KAAK,EAAI,EAAmB,QAAQ,AAAD,IAAO,aAAc,EAAO,IAAI,CAAe,UAAI,GAAc,CAC5J,GAAG,CAAU,AACjB,EAAG,IACE,EAAO,IAAI,CAAe,UAAI,GAAW,CAC1C,GAAG,CAAU,AACjB,EAAG,GACP,GACI,aAAe,EAAc,CAC7B,IAAM,EAAiB,EAAO,IAAI,CAAC,AAAC,GAAsB,GAAM,cAAc,CAAC,IAAU,cAAgB,EAAM,KAAK,CAAC,IAAI,EACnH,EAAgB,EAAO,IAAI,CAAC,AAAC,GAAsB,GAAM,cAAc,CAAC,IAAU,aAAe,EAAM,KAAK,CAAC,IAAI,EACjH,EAAc,EAAO,MAAM,CAAC,AAAC,GAAsB,GAAM,cAAc,CAAC,IAAU,cAAgB,EAAM,KAAK,CAAC,IAAI,EAAI,aAAe,EAAM,KAAK,CAAC,IAAI,EAC3J,GAAI,GAAkB,EAAe,MAAqB,WAAK,MAAO,CAClE,UAAW,oBACX,SAAU,CACQ,WAAK,MAAO,CACtB,MAAO,CACH,QAAS,OACT,IAAK,GACL,aAAc,EAClB,EACA,SAAU,CACN,EACA,EACH,AACL,GACA,EACH,AACL,EACJ,CACA,MAAqB,UAAI,MAAO,CAC5B,UAAW,oBACX,SAAU,CACd,EACJ,CACJ,CACA,OAAO,IACX,EAAG,CACC,EACA,EACA,EACA,EACH,EACK,EAAmB,mBAAY,KACjC,EAAoB,GACxB,EAAG,EAAE,EACC,EAAmB,mBAAY,KACjC,EAAoB,GACxB,EAAG,EAAE,EACC,EAAqB,mBAAY,KACnC,IAAM,EAAY,AAAC,GAAqB,UAAI,KAAM,CAAE,CAC5C,KAAM,UACN,KAAoB,UAAI,IAAY,CAAE,CAAC,GACvC,MAAO,CACH,aAAc,GACd,OAAQ,GACZ,EACA,QAAS,EACT,SAAU,CAAC,EACX,QAAS,EACT,SAAU,CACd,UACJ,AAAI,EAAgB,UAAY,EAA6B,UAAI,IAAO,CAAE,CACtE,MAAO,yHACP,SAAU,EAAU,UACxB,GAAK,EAAU,OACX,EAAgC,UAAI,KAAM,CAAE,CAC5C,KAAoB,UAAI,IAAc,CAAE,CAAC,GACzC,QAAS,EACT,MAAO,CACH,aAAc,GACd,OAAQ,GACZ,EACA,SAAU,MACd,GACO,EAAU,MACrB,EAAG,CACC,EACA,EACA,EACA,EACA,EACA,EACA,EACH,EACD,MAAqB,WAAK,MAAO,CAC7B,UAAW,uBACX,SAAU,CACQ,WAAK,MAAO,CACtB,UAAW,2BACX,SAAU,CACQ,WAAK,MAAO,CACtB,UAAW,mBACX,IAAK,EACL,SAAU,CACQ,UAAI,SAAS,CAAE,CACzB,KAAM,OACN,MAAO,CACH,OAAQ,CACZ,EACA,SAAwB,UAAI,WAAW,CAAE,CACrC,YAAa,QACb,SAAU,CAAC,EACX,SAAU,GAAmB,GAAG,CAAC,AAAC,IAC9B,IAAI,EACJ,MAAqB,UAAI,IAAO,CAAE,CAC9B,MAAO,AAAC,OAAS,GAAuB,EAAW,CAAC,EAAQ,AAAD,EAAK,KAAK,EAAI,EAAqB,KAAK,AAAD,GAAM,GACxG,SAAwB,UAAI,YAAY,CAAE,CACtC,MAAO,EACP,SAAU,GAAkB,EAChC,EACJ,EAAG,EACP,EACJ,EACJ,GACc,UAAI,IAAQ,CAAE,CACxB,KAAM,AAAC,MACH,IAAM,EAAa,EAAyB,MAAM,CAAC,AAAC,GAAM,CAAC,GAAmB,QAAQ,CAAC,IACjF,EAAe,EAAE,CACjB,EAAkB,EAAW,MAAM,CAAC,AAAC,IACvC,IAAI,EACJ,MAAO,AAAC,OAAS,GAAmB,EAAW,CAAC,EAAI,AAAD,EAAK,KAAK,EAAI,EAAiB,KAAK,AAAD,IAAO,aACjG,EACI,GAAgB,MAAM,CAAG,GAAG,EAAa,IAAI,CAAC,CAC9C,IAAK,oBACL,KAAM,QACN,MAAO,mBACP,SAAU,EAAgB,GAAG,CAAC,AAAC,IAC3B,IAAI,EACJ,MAAO,CACH,IAAK,EACL,MAAO,GAAkB,GACzB,MAAO,AAAC,OAAS,GAAmB,EAAW,CAAC,EAAI,AAAD,EAAK,KAAK,EAAI,EAAiB,KAAK,AAAD,GAAM,GAC5F,QAAS,KACL,EAAK,aAAa,CAAC,OAAQ,EAC/B,CACJ,CACJ,EACJ,GACA,IAAM,EAAiB,EAAW,MAAM,CAAC,AAAC,IACtC,IAAI,EACJ,MAAO,AAAC,OAAS,GAAmB,EAAW,CAAC,EAAI,AAAD,EAAK,KAAK,EAAI,EAAiB,KAAK,AAAD,IAAO,YACjG,EACI,GAAe,MAAM,CAAG,GAAG,EAAa,IAAI,CAAC,CAC7C,IAAK,mBACL,KAAM,QACN,MAAO,uBACP,SAAU,EAAe,GAAG,CAAC,AAAC,IAC1B,IAAI,EACJ,MAAO,CACH,IAAK,EACL,MAAO,GAAkB,GACzB,MAAO,AAAC,OAAS,GAAmB,EAAW,CAAC,EAAI,AAAD,EAAK,KAAK,EAAI,EAAiB,KAAK,AAAD,GAAM,GAC5F,QAAS,KACL,EAAK,aAAa,CAAC,OAAQ,EAC/B,CACJ,CACJ,EACJ,GACA,IAAM,EAAiB,EAAW,MAAM,CAAC,AAAC,IACtC,IAAI,EACJ,MAAO,AAAC,OAAS,GAAmB,EAAW,CAAC,EAAI,AAAD,EAAK,KAAK,EAAI,EAAiB,KAAK,AAAD,IAAO,YACjG,EACI,GAAe,MAAM,CAAG,GAAG,EAAa,IAAI,CAAC,CAC7C,IAAK,mBACL,KAAM,QACN,MAAO,kBACP,SAAU,EAAe,GAAG,CAAC,AAAC,IAC1B,IAAI,EACJ,MAAO,CACH,IAAK,EACL,MAAO,GAAkB,GACzB,MAAO,AAAC,OAAS,GAAmB,EAAW,CAAC,EAAI,AAAD,EAAK,KAAK,EAAI,EAAiB,KAAK,AAAD,GAAM,GAC5F,QAAS,KACL,EAAK,aAAa,CAAC,OAAQ,EAC/B,CACJ,CACJ,EACJ,GACA,IAAM,EAAqB,EAAW,MAAM,CAAC,AAAC,GAAM,CAAC,EAAW,CAAC,EAAI,EAcrE,OAbI,EAAmB,MAAM,CAAG,GAAG,EAAa,IAAI,CAAC,CACjD,IAAK,wBACL,KAAM,QACN,MAAO,uBACP,SAAU,EAAmB,GAAG,CAAC,AAAC,GAAO,EACjC,IAAK,EACL,MAAO,GAAkB,GACzB,MAAO,GACP,QAAS,KACL,EAAK,aAAa,CAAC,OAAQ,EAC/B,CACJ,GACR,GACO,CACH,MAAO,CACX,CACJ,KACA,UAAW,aACX,QAAS,CACL,QACH,CACD,SAAU,CAAC,EACX,SAAwB,WAAK,KAAM,CAAE,CACjC,UAAW,CAAC,iBAAiB,EAAE,CAAC,GAAmB,QAAQ,CAAC,GAAgB,yBAA2B,GAAG,CAAC,CAC3G,SAAU,CACN,GAAgB,CAAC,GAAmB,QAAQ,CAAC,GAAgB,GAAkB,GAAgB,OACjF,UAAI,IAAY,CAAE,CAC5B,MAAO,CACH,SAAU,OACV,WAAY,KAChB,CACJ,GACH,AACL,EACJ,GACH,AACL,GACc,WAAK,MAAO,CACtB,UAAW,eACX,SAAU,CACN,GAAkC,UAAI,MAAO,CACzC,UAAW,EAAmB,0CAA4C,mBAC1E,aAAc,EACd,aAAc,EACd,SAAwB,UAAI,GAAgB,CACxC,eAAgB,yBAA2B,EAC3C,oBAAqB,EACrB,0BAA2B,EAC3B,4BAA6B,CACjC,EACJ,GACc,UAAI,GAAiB,CAC/B,SAAU,EACV,QAAS,EACT,YAAa,CACjB,GACH,AACL,GACH,AACL,GACc,WAAK,MAAO,CACtB,UAAW,CAAC,wBAAwB,EAAE,CAAC,EAAmB,WAAa,GAAG,CAAC,EAAE,EAAU,UAAY,GAAG,CAAC,CACvG,SAAU,CACN,EAAgB,EAAwB,EAA2B,IAAyC,UAAI,MAAO,CACnH,UAAW,8BACX,SAAU,GACd,GAAmB,UAAI,SAAS,CAAE,CAC9B,KAAM,SACN,MAAO,CACH,OAAQ,CACZ,EACA,SAAwB,UAAI,GAAU,CAClC,UAAW,mCACX,SAAU,CAAC,EACX,KAAM,EACN,YAAa,EACb,UAAW,GACX,UAAW,EACX,SAAU,EACV,IAAK,CACT,EACJ,GAAmB,WAAK,MAAO,CAC3B,UAAW,kBACX,MAAO,CACH,QAAS,OACT,UAAW,SACX,MAAO,OACP,SAAU,MACd,EACA,SAAU,CACN,0BACA,GAAkB,GACrB,AACL,GACc,UAAI,MAAO,CACrB,UAAW,0BACX,SAAU,GACd,GACH,AACL,GACH,AACL,EACJ,EC1sBM,CAAE,KAAI,IAAK,IAAU,CAK3B,SAAS,GAAa,CAAK,EACvB,GAAI,CAAElD,MAAAA,CAAK,CAAE,CAAG,SAChB,AAAKA,EACgB,WAAK,IAAO,CAAE,CAC/B,MAAqB,UAAI,OAAQ,CAC7B,MAAO,CACH,WAAY,WACZ,UAAW,WACf,EACA,SAAUA,CACd,GACA,aAAc,CACV,SAAU,OACd,EACA,SAAU,CACN,UACAA,EAAM,KAAK,CAAC,KAAK,CAAC,EAAE,CACvB,AACL,GAhBmB,IAiBvB,CACA,SAAS,GAAoB,CAAK,EAC9B,GAAI,CAAE,eAAa,CAAE,SAAO,CAAE,iBAAe,CAAE,OAAQ,EAAkB,CAAC,CAAC,CAAE,WAAW,CAAC,CAAC,CAAE,YAAY,EAAE,CAAE,UAAU,EAAK,CAAE,qBAAqB,EAAI,CAAE,CAAG,EACrJ,CAAC,EAAK,CAAG,YAAY,GACrB,CAAE,QAAM,CAAE,CAAG,IACb,CAAC,EAAU,EAAY,CAAG,gBAAS,IACzC,iBAAU,KAWN,AAVsB,WAClB,GAAI,GAAiB,YAAc,OAAO,EAAc,WAAW,CAAE,GAAI,CACrE,MAAM,EAAc,WAAW,GAC/B,EAAY,GAChB,CAAE,MAAO,EAAO,CACZO,QAAQ,IAAI,CAAC,qDAAsD,GACnE,EAAY,GAChB,MACK,EAAY,GACrB,IAEJ,EAAG,CACC,EACH,EACD,IAAM,EAAmB,eAAQ,KAC7B,GAAI,EAAS,OAAO,EACpB,GAAI,CAAC,EAAU,OAAO,KACtB,IAAM,EAAY,EAAgB,gBAAgB,EA9CtD,CAAI,AA8C+D,EA9C3D,EAAE,EAAI,UAAY,OAAO,AA8CkC,EA9C9B,EAAE,CAAS,CAAC,MAAM,EAAE,AA8CU,EA9CN,EAAE,CAAC,CAAC,CAC1D,oBAD0D,EA+CvD,EAAkB,KAExB,OADAA,QAAQ,GAAG,CAAC,CAAC,MAAM,EAAE,EAAgB,wBAAwB,EAAE,EAAU,CAAC,EACnE,GAAsB,EAAiB,EAClD,EAAG,CACC,EACA,EACA,EAAgB,gBAAgB,CAChC,EACH,EACK,CAAE,SAAO,CAAE,YAAU,CAAE,UAAQ,CAAE,aAAW,CAAE,aAAW,CAAE,oBAAkB,CAAE,kBAAgB,CAAE,qBAAmB,CAAE,0BAAwB,CAAE,cAAY,CAAE,eAAa,CAAE,kBAAgB,CAAE,aAAW,CAAE,qBAAmB,CAAE,oBAAkB,CAAE,eAAa,CAAE,sBAAoB,CAAE,CAAG,ACrEvS,SAA4B,CAAa,CAAE,CAAO,CAAE,CAAe,EAC/D,GAAM,CAAC,EAAS,EAAW,CAAG,gBAAS,IACjC,CAAC,EAAU,EAAY,CAAG,gBAAS,EAAE,EACrC,CAAC0B,EAAahC,EAAe,CAAG,gBAAS,EAAE,EAC3C,CAAC,EAAoB,EAAsB,CAAG,gBAAS,IACvD,CAAC,EAAkB,EAAoB,CAAG,kBAC1C,CAAC,EAA0B,EAA4B,CAAG,gBAAS,IACnE,CAAC,EAAc,EAAgB,CAAG,gBAAS,IAC3C,CAAC,EAAe,EAAiB,CAAG,gBAAS,GAC7C,EAAc,cAAO,MACrB,EAAsB,cAAO,MAC7B,EAAqB,cAAO,CAAC,GAC7B,EAAiB,cAAO,IAC9B,iBAAU,KACN,IAAM,EAA0B,UAC5B,IAAM,EAAa,GAAsB,KAAyB,sBAClE,GAAI,CACA,GAAI,MAAQ,EAAa,KAAK,EAAI,EAAW,YAAY,CAAE,CACvD,IAAM,EAAc,MAAM,EAAW,YAAY,GACjD,GAAI,EAAY,MAAM,CAAG,EAIrB,OAHAM,QAAQ,GAAG,CAAC,6CACR,OAAQ,EAAU,KAAK,EAAI,EAAQ,YAAY,AAAD,GAAG,MAAM,EAAQ,YAAY,CAAC,GAC5E,EAAW,aAAa,EAAE,MAAM,EAAW,aAAa,GACrD,CAEf,CACJ,CAAE,MAAO,EAAO,CACZA,QAAQ,KAAK,CAAC,kCAAmC,EACrD,CACA,MAAO,EAAE,AACb,EACM,EAAqB,UACvB,IAAM,EAAiB,CACnB,GAAG,EAAwB,CAC3B,GAAI,UACJ,UAAW,IAAIF,IACnB,EACA,GAAI,MAAQ,EAAU,KAAK,EAAI,EAAQ,YAAY,CAAE,GAAI,CACrD,IAAI,EAAiB,MAAM,EAAQ,YAAY,EAC3C,KAAM,EAAe,MAAM,EAAE,GAAiB,MAAM,GAAwB,EAEhF,AAD0B,EAAe,IAAI,CAAC,AAAC,GAAM,YAAc,EAAI,EAAE,EACrD,EAAY,GAAkB,EAAY,CAC1D,KACG,EACN,CACL,CAAE,MAAO,EAAO,CACZE,QAAQ,KAAK,CAAC,2BAA4B,GAC1C,EAAY,CACR,EACH,CACL,MACK,EAAY,CACb,EACH,CACL,CACI,IAAW,CAAC,EAAe,OAAO,EAClC,EAAe,OAAO,CAAG,GACzB,KACO,AAAC,GAAW,IAAM,EAAS,MAAM,EAAE,GAClD,EAAG,CACC,EACH,EACD,iBAAU,KACF,AAAC,OAAQ,EAAU,KAAK,EAAI,EAAQ,YAAY,AAAD,GAAM,EAAS,MAAM,CAAG,GAAG,EAAQ,YAAY,CAAC,GAAU,KAAK,CAAC,AAAC,IAC5G,aAAiB4B,cAAgB,uBAAyB,EAAM,IAAI,CAAE5B,QAAQ,IAAI,CAAC,wEAClFA,QAAQ,KAAK,CAAC,2BAA4B,EACnD,EACJ,EAAG,CACC,EACA,EACH,EACD,iBAAU,KACA,OAAQ,EAAkB,KAAK,EAAI,EAAgB,YAAY,AAAD,IAAM,GAC1E,EAAgB,YAAY,GAAG,IAAI,CAAC,AAAC,GAAU,EAAoB,IAAU,KAAK,CAAC,AAAC,IAChFA,QAAQ,KAAK,CAAC,4BAA6B,EAC/C,EACJ,EAAG,CACC,EACA,EACH,EACD,iBAAU,KAgBN,AAfwB,WACpB,EAAsB,IACtB,GAAI,CACA,IAAI,EACJ,GAAI,CAAC,EAAe,OAAO,KAAKN,EAAe,EAAE,EACjD,IAAM,EAAU,GAAoB,OAAO,MAAQ,GAA2B,MAAS,GAAgC,EAAgB,YAAY,AAAD,EAAK,KAAK,EAAI,EAA8B,IAAI,CAAC,IAC7L,EAAQ,MAAM,EAAc,cAAc,CAAC,GACjDA,EAAe,GAAS,EAAE,CAC9B,CAAE,MAAO,EAAO,CACZM,QAAQ,KAAK,CAAC,+BAAgC,GAC9CN,EAAe,EAAE,CACrB,QAAS,CACL,EAAsB,GAC1B,CACJ,IAEJ,EAAG,CACC,EACA,EACA,EACH,EACD,iBAAU,KAEN,EAAgBJ,OAAO,UAAU,CADX,KAEtB,IAAM,EAAe,KACjB,EAAgBA,OAAO,UAAU,CAHf,IAItB,EAEA,OADAA,OAAO,gBAAgB,CAAC,SAAU,GAC3B,IAAIA,OAAO,mBAAmB,CAAC,SAAU,EACpD,EAAG,EAAE,EACL,IAAM,EAAiB,mBAAY,KAC/BuB,WAAW,KACH,EAAY,OAAO,EAAE,GAAY,OAAO,CAAC,SAAS,CAAG,EAAY,OAAO,CAAC,YAAY,AAAD,CAC5F,EAAG,IACP,EAAG,EAAE,EACC,EAA0B,mBAAY,KACxC,GAAI,EAAY,OAAO,CAAE,CACrB,GAAM,CAAE,WAAS,CAAE,cAAY,CAAE,cAAY,CAAE,CAAG,EAAY,OAAO,CAErE,EAA4B,CADT,GAAY,GAAgB,EAAe,EAAC,EAEnE,CACJ,EAAG,EAAE,EACC,EAAuB,mBAAY,KACjC,EAAY,OAAO,GACnB,EAAY,OAAO,CAAC,QAAQ,CAAC,CACzB,IAAK,EAAY,OAAO,CAAC,YAAY,CACrC,SAAU,QACd,GACA,EAA4B,IAEpC,EAAG,EAAE,EACL,iBAAU,KACF,EAAS,MAAM,CAAG,GAAG,GAC7B,EAAG,CACC,EACA,EACH,EACD,iBAAU,KACN,IAAM,EAAY,EAAY,OAAO,CACrC,GAAI,EAGA,OAFA,EAAU,gBAAgB,CAAC,SAAU,GACrC,IACO,KACH,EAAU,mBAAmB,CAAC,SAAU,EAC5C,CAER,EAAG,CACC,EACH,EACD,IAAM,EAAgB,mBAAY,UAS9B,GAHA,EAAY,CALW,CACnB,GAAG,EAAwB,CAC3B,GAAI,UACJ,UAAW,IAAIf,IACnB,EAGC,EACG,MAAQ,EAAU,KAAK,EAAI,EAAQ,aAAa,CAAE,GAAI,CACtD,MAAM,EAAQ,aAAa,EAC/B,CAAE,MAAO,EAAO,CACZE,QAAQ,KAAK,CAAC,mCAAoC,EACtD,CACJ,EAAG,CACC,EACH,EACK,EAAiB,mBAAY,UAC/B,GAAI,MAAQ,EAAkB,KAAK,EAAI,EAAgB,cAAc,CAAE,GAAI,CACvE,IAAM,EAAa,MAAM,EAAgB,cAAc,GACvD,EAAoB,EACxB,CAAE,MAAO,EAAO,CACZA,QAAQ,KAAK,CAAC,6BAA8B,EAChD,CACJ,EAAG,CACC,EACH,EACD,MAAO,CACH,UACA,aACA,WACA,cACA0B,YAAAA,EACA,qBACA,mBACA,sBACA,2BACA,eACA,gBACA,mBACA,cACA,sBACA,qBACA,gBACA,iBACA,uBACA,gBACJ,CACJ,EDjI0T,EAAe,EAAkB,GACjV,CAAE,UAAW,CAAa,CAAE,YAAU,CAAE,SAAO,CAAE,CAAG,AEpE9D,SAAgC,CAAa,CAAE,CAAO,CAAE,CAAW,CAAE,CAAO,CAAE,CAAU,CAAE,CAAQ,CAAE,CAAW,CAAE,CAAa,CAAEhC,CAAgB,CAAE,CAAY,CAAE6C,CAAmB,CAAE,CAAkB,EACnM,GAAM,CAAE,WAAS,CAAE,oBAAkB,CAAE,aAAW,CAAE,CAAG,IACjD,EAAY,mBAAY,MAAO,IACjC,GAAI,CAAC,EAAe,OAAO,KAAKvC,QAAQ,IAAI,CAAC,kCAC7C,IAAM,EAAgBF,KAAK,GAAG,GACxB,EAAa,EAAM,IAAI,CACvB,EAAiB,CAAC,EAAE,EAAM,IAAI,CAAC,EAAE,EAAE,EAAM,MAAM,EAAIG,KAAK,SAAS,CAAC,EAAM,MAAM,EAAE,CAAC,CACjF,EAAW,CACb,GAAI,CAAC,KAAK,EAAEH,KAAK,GAAG,GAAG,CAAC,CACxB,KAAM,OACN,QAAS,EACT,UAAW,IAAIA,IACnB,EACA,EAAY,AAAC,GAAO,IACT,EACH,EACH,EACL,EAAW,IACX,IAAM,EAAS,CACX,GAAG,EAAY,AACnB,EACM,EAAa,CACf,GAAI,CAAC,OAAO,EAAE,EAAc,CAAC,CAC7B,KAAM,SACN,QAAS,GACT,UAAW,IAAIA,KACf,QAAS,GACT,oBAAqB,EACzB,EACA,EAAY,AAAC,GAAO,IACT,EACH,EACH,EACL,GAAI,CA2BA,GA1BAyC,EAAoB,OAAO,CAAG,EAC9B,EAAmB,OAAO,CAAC,EAAc,CAAG,GACxC,EAAc,gBAAgB,EAAE,EAAc,gBAAgB,CAAC,KAAK,GACpE,EAAc,gBAAgB,EAAE,EAAc,gBAAgB,CAAC,AAAC,IAC5D,EAAmB,OAAO,CAAC,EAAc,EAC7C,EAAY,AAAC,IACT,IAAM,EAAW,CAAI,CAAC,EAAK,MAAM,CAAG,EAAE,CACtC,GAAI,GAAY,aAAe,EAAS,IAAI,EAAI,EAAS,OAAO,GAAK,EAAK,OAAO,EACjF,IAAM,EAAe,CACjB,GAAI,CAAC,SAAS,EAAE,EAAc,CAAC,EAAEzC,KAAK,GAAG,GAAG,CAAC,CAC7C,KAAM,WACN,QAAS,EACT,UAAW,IAAIA,IACnB,EACA,MAAO,IACA,EACH,EACH,AACL,EACJ,GACA,EAAO,MAAM,CAAG,MAAM,EAAc,aAAa,CAAC,EAAY,EAAO,CACjE,UAAW,EAAc,QAAQ,GACjC,YACA,qBACA,aACJ,GACI,UAAY,OAAO,EAAO,MAAM,EAAI,OAAS,EAAO,MAAM,CAAE,CAC5D,IAAM,EAAY,EAAO,MAAM,AAC3B,GAAU,IAAI,EAAE,GAAO,IAAI,CAAG,EAAU,IAAI,AAAD,EAC3C,EAAU,UAAU,EAAE,GAAO,UAAU,CAAG,EAAU,UAAU,AAAD,EAC7D,EAAU,KAAK,EAAE,GAAO,KAAK,CAAG,EAAU,KAAK,AAAD,EAC9C,KAAK,IAAM,EAAU,MAAM,EAAE,GAAO,MAAM,CAAG,EAAU,MAAM,AAAD,CACpE,CACJ,CAAE,MAAO,EAAG,CACR,EAAO,KAAK,CAAG,AAAC,OAAQ,EAAI,KAAK,EAAI,EAAE,OAAO,AAAD,GAAM0C,OAAO,GAC1DxC,QAAQ,KAAK,CAAC,8BAA+B,EACjD,CACA,GAAI,EAAmB,OAAO,CAAC,EAAc,CAAE,OAC/C,EAAW,IACXuC,EAAoB,OAAO,CAAG,KAC9B,IAAI,EAAa,KACb,EAAU,EACd,GAAI,AAAC,OAAQ,EAAS,KAAK,EAAI,EAAO,IAAI,AAAD,GAAM,CAAC,GAAa,QAAQ,CAAC,GAAa,CAC/E,IAAM,EAAO,GAAmB,EAAO,IAAI,EAC3C7C,EAAiB,AAAC,GAAI,EAAI,GAC1B,EAAa,EACb,EAAU,EAAgB,CAC9B,CACA,EAAY,AAAC,GAAO,EAAK,GAAG,CAAC,AAAC,GAAO,EAAK,EAAE,GAAK,CAAC,OAAO,EAAE,EAAc,CAAC,CAAG,CACjE,GAAG,CAAI,CACP,QAAS,GACT,QAAS,GACT,oBAAqB,EACzB,EAAI,IACZ,IAAM,EAAa,CACf,GAAI,CAAC,OAAO,EAAE,EAAc,CAAC,CAC7B,KAAM,SACN,QAAS,mBACT,UAAW,IAAII,KACf,OAAQ,EACR,QAAS,GACT,kBAAmB,EACnB,cAAe,EACf,oBAAqB,GACrB,aAAc,CAClB,EAKA,GAJA,EAAY,AAAC,GAAO,IACT,EACH,EACH,EACD,MAAQ,EAAU,KAAK,EAAI,EAAQ,UAAU,CAAE,GAAI,CACnD,MAAM,EAAQ,UAAU,CAAC,EAAW,EAAE,CAAE,EAC5C,CAAE,MAAO,EAAO,CACZE,QAAQ,KAAK,CAAC,yBAA0B,EAC5C,CACA,IAAM,EAAgB,CAClB,GAAI,CAAC,UAAU,EAAE,EAAc,CAAC,CAChC,KAAM,YACN,QAAS,cACT,UAAW,IAAIF,IACnB,EACA,EAAY,AAAC,GAAO,IACT,EACH,EACH,CACT,EAAG,CACC,EACA,EACA,EACA,EACA,EACA,EACAJ,EACA,EACA6C,EACA,EACA,EACA,EACA,EACH,EAmCD,MAAO,CACH,YACA,WApCe,mBAAY,UAC3B,IAAM,EAAgBA,EAAoB,OAAO,CACjD,GAAI,GAAiB,GAAiB,EAAc,eAAe,CAAE,GAAI,CACrE,MAAM,EAAc,eAAe,CAAC,EAAc,QAAQ,IAC1D,EAAmB,OAAO,CAAC,EAAc,CAAG,GAC5C,EAAW,IACP,EAAc,gBAAgB,EAAE,EAAc,gBAAgB,CAAC,KAAK,GACxE,EAAY,AAAC,GAAO,EAAK,GAAG,CAAC,AAAC,GAAO,EAAK,EAAE,GAAK,CAAC,OAAO,EAAE,EAAc,CAAC,EAAI,EAAK,OAAO,CAAG,CACjF,GAAG,CAAI,CACP,QAAS,oBACT,QAAS,GACT,oBAAqB,EACzB,EAAI,IACZ,IAAM,EAAgB,CAClB,GAAI,CAAC,UAAU,EAAE,EAAc,CAAC,CAChC,KAAM,YACN,QAAS,cACT,UAAW,IAAIzC,IACnB,EACA,EAAY,AAAC,GAAO,IACT,EACH,EACH,CACT,CAAE,MAAO,EAAO,CACZE,QAAQ,KAAK,CAAC,4BAA6B,EAC/C,CACJ,EAAG,CACC,EACAuC,EACA,EACA,EACA,EACH,EAKG,QAJY,GAAW,CAAC,CAACA,EAAoB,OAAO,EAAI,CAAC,CAAC,GAAiB,CAAC,CAAC,EAAc,eAAe,AAK9G,CACJ,EFzGqF,EAAe,EAAkB,EAAa,EAAS,EAAY,EAAU,EAAa,EAAe,EAAkB,EAAc,EAAqB,GAC/O,iBAAU,KACF,AAAC,OAAQ,EAAgB,KAAK,EAAI,EAAc,cAAc,AAAD,GAAM,GAAQ,EAAc,cAAc,CAAC,GAAQ,KAAK,CAAC,AAAC,IACvHvC,QAAQ,KAAK,CAAC,iCAAkC,EACpD,EACJ,EAAG,CACC,EACA,EACH,EACD,IAAM,EAAgB,mBAAY,UAC9B,GAAI,CACA,IAAM,EAAQ,EAAK,cAAc,EACjC,OAAM,EAAc,EACxB,CAAE,MAAO,EAAO,CACZ,WAAa,CAAC,AAAC,OAAQ,EAAQ,KAAK,EAAI,EAAM,OAAO,AAAD,GAAM,mBAC9D,CACJ,EAAG,CACC,EACA,EACH,EACK,EAAmBZ,OAAO,IAAI,CAAC,GAAU,CAAC,GAAG,MAAM,EAAI,EACvD,EAAmB,EAAgB,UAAU,EAAI,CAAC,GAAW,CAAC,GAAsB,EACpF,EAAe,aAAa,CAAC,OAAQ,GACrC,EAA0B,GAAsB,KAAU,EAAgB,kBAAkB,CAC5F,EAAS,EAAgB,MAAM,EAAI,WACnC,EAAkB,KAAU,EAAgB,eAAe,CACjE,MAAqB,UAAI,MAAO,CAC5B,UAAW,CAAC,qBAAqB,EAAE,EAAO,MAAM,EAAE,EAAU,CAAC,CAAC,IAAI,GAClE,SAAwB,WAAK,IAAI,CAAE,CAC/B,KAAM,EACN,SAAU,EACV,UAAW,eACX,SAAU,CACN,GAAyC,UAAI,MAAO,CAChD,UAAW,0BACX,SAAwB,UAAI,GAAgB,CACxC,iBAAkB,EAClB,oBAAqB,EACrB,mBAAoB,CACxB,EACJ,GACc,WAAK,MAAO,CACtB,UAAW,qBACX,SAAU,CACN,EAAS,MAAM,CAAG,GAAmB,UAAI,MAAO,CAC5C,UAAW,yBACX,SAAwB,UAAI,KAAM,CAAE,CAChC,KAAM,QACN,KAAoB,UAAI,IAAa,CAAE,CAAC,GACxC,QAAS,EACT,KAAM,OACN,UAAW,cACf,EACJ,GACc,UAAI,MAAO,CACrB,IAAK,EACL,UAAW,sBACX,SAAwB,UAAI,IAAI,CAAE,CAC9B,WAAY,WACZ,WAAY,EACZ,WAAY,AAAC,IACT,IAAI,EACJ,MAAqB,UAAI,SAAS,CAAE,CAChC,UAAW,YACX,SAAU,SAAW,EAAK,IAAI,CAAiB,UAAI,MAAO,CACtD,UAAW,yBACX,SAAwB,UAAI,MAAO,CAC/B,UAAW,sBACX,SAAU,EAAK,OAAO,AAC1B,EACJ,GAAK,aAAe,EAAK,IAAI,CAAiB,UAAI,MAAO,CACrD,SAAU,AAAC,MACP,IAAI,EAAS,EAAc,EAAe,EAC1C,IAAM,EAAQ,EAAK,OAAO,CAAC,KAAK,CAAC,OAC3BsC,EAAS,MAAS,GAAU,CAAK,CAAC,EAAE,AAAD,EAAK,KAAK,EAAI,EAAQ,IAAI,GAC7D,EAAc,EAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,IAAI,GAC7C,EAAe,EAAS,SAAS,CAAC,AAAC,GAAW,EAAS,EAAE,GAAK,EAAK,EAAE,EACrE,EAAsB,EAAS,KAAK,CAAC,EAAe,GAAG,IAAI,CAAC,AAAC,GAAW,aAAe,EAAS,IAAI,EAEpG,EAAoB,GADD,CAAC,EAE1B,MAAqB,WAAK,UAAQ,CAAE,CAChC,SAAU,CACNA,GAAwB,WAAK,OAAQ,CACjC,UAAW,uBACX,SAAU,CACNA,EACc,UAAI,OAAQ,CACtB,UAAW,CAAC,qBAAqB,EAAE,EAAoB,UAAY,AAAC,OAAS,GAAe,EAAK,MAAM,AAAD,EAAK,KAAK,EAAI,EAAa,KAAK,AAAD,EAAK,QAAU,YAAY,CAAC,CACjK,SAAU,EAAkC,UAAI,IAAe,CAAE,CAC7D,KAAM,EACV,GAAK,AAAC,OAAS,GAAgB,EAAK,MAAM,AAAD,EAAK,KAAK,EAAI,EAAc,KAAK,AAAD,EAAK,IAAW,GAC7F,GACH,AACL,GACA,GAA6B,UAAI,MAAO,CACpC,SAAwB,UAAI,OAAQ,CAChC,UAAW,uBACX,SAAU,CACd,EACJ,GACA,AAAC,OAAS,GAAgB,EAAK,MAAM,AAAD,EAAK,KAAK,EAAI,EAAc,KAAK,AAAD,GAAoB,UAAI,GAAc,CACtG,MAAO,EAAK,MAAM,CAAC,KAAK,AAC5B,GACH,AACL,EACJ,IACJ,GAAK,cAAgB,EAAK,IAAI,CAAiB,WAAK,MAAO,CACvD,UAAW,6BACX,SAAU,CACQ,UAAI,MAAO,CACrB,UAAW,gBACf,GACc,UAAI,MAAO,CACrB,UAAW,2BACX,SAAwB,UAAI,GAAM,CAC9B,KAAM,YACN,UAAW,iBACX,SAAU,EAAK,OAAO,AAC1B,EACJ,GACH,AACL,GAAmB,WAAK,MAAO,CAC3B,UAAW,2BACX,SAAU,CACQ,WAAK,MAAO,CACtB,UAAW,wBACX,SAAU,CACQ,UAAI,IAAK,CAAE,CACrB,UAAW,EAAS,IAAI,EAAI,GAC5B,MAAO,CACH,SAAU,EACd,CACJ,GACc,UAAI,OAAQ,CACtB,UAAW,uBACX,SAAU,EAAS,KAAK,EAAI,YAChC,GACH,AACL,GACA,AAAC,GAAK,OAAO,EAAI,EAAK,MAAM,AAAD,GAAoB,WAAK,MAAO,CACvD,UAAW,yBACX,SAAU,CACN,WAAa,EAAK,IAAI,EAAK,OAAS,GAAe,EAAK,MAAM,AAAD,EAAK,KAAK,EAAI,EAAa,KAAK,AAAD,GAAoB,WAAK,MAAO,CACxH,UAAW,gBACX,SAAU,CACQ,UAAI,MAAO,CACrB,UAAW,SACf,GACc,UAAI,GAAc,CAC5B,MAAO,EAAK,MAAM,CAAC,KAAK,AAC5B,GACH,AACL,GACA,WAAa,EAAK,IAAI,CAAiB,UAAI,GAAsB,CAC7D,OAAQ,EAAK,MAAM,EAAI,KACvB,QAAS,EAAK,OAAO,EAAI,GACzB,YAAa,GACb,YAAa,SACb,kBAAmB,EAAK,iBAAiB,EAAI,KAC7C,cAAe,EAAK,aAAa,EAAI,EACrC,oBAAqB,EAAK,mBAAmB,EAAI,GACjD,aAAc,EAAK,YAAY,EAAI,GACnC,QAAS,OACb,GAAmB,WAAK,UAAQ,CAAE,CAC9B,SAAU,CACQ,UAAI,MAAO,CACrB,UAAW,sBACX,SAAU,EAAK,OAAO,AAC1B,GACA,EAAK,OAAO,EAAI,EAAK,mBAAmB,EAAkB,UAAI,MAAO,CACjE,UAAW,wBACX,SAAwB,UAAI,OAAQ,CAChC,SAAU,EAAK,mBAAmB,AACtC,EACJ,GACH,AACL,GACH,AACL,GACH,AACL,EACJ,EAAG,EAAK,EAAE,CACd,CACJ,EACJ,GACA,GAA4B,KAAU,EAAgB,oBAAoB,EAAkB,UAAI,KAAM,CAAE,CACpG,UAAW,0BACX,KAAM,UACN,MAAO,SACP,KAAoB,UAAI,IAAiB,CAAE,CAAC,GAC5C,QAAS,EACT,KAAM,OACV,GACH,AACL,GACc,WAAK,MAAO,CACtB,UAAW,uBACX,SAAU,CACN,EAAgB,qBAAqB,CAAiB,UAAI,GAAmB,CAAC,GAAK,KACrE,UAAI,GAAa,CAC3B,iBAAkB,EAClB,KAAM,EACN,YAAa,SACb,aAAc,EACd,QAAS,EACT,UAAW,EACX,QAAS,EACT,MAAO,EACP,OAAQ,EACR,YAAa,CACjB,GACH,AACL,GACA,GAAmB,EAAS,OAAO,EAAkB,UAAI,MAAO,CAC5D,UAAW,uBACX,SAAwB,WAAK,OAAQ,CACjC,UAAW,eACX,SAAU,CACN,wBACA,EAAS,OAAO,CACnB,AACL,EACJ,GACH,AACL,EACJ,EACJ,CG3Re,SAASkB,KAEtB,GAAM,CAAEC,OAAAA,CAAM,CAAE,CAAGC,IAGbC,EAAgBC,AAAAA,GAAAA,GAAAA,OAAAA,AAAAA,EAAQ,IACrB,IAAIC,GAAc,CACvB,KAAM,kBACR,GACC,EAAE,EAiCL,MA9BAC,AAAAA,GAAAA,GAAAA,SAAAA,AAAAA,EAAU,KAkBRC,AAjBoB,WAClB,GAAI,CACF,IAAMC,EAAS,MAAML,EAAc,WAAW,GAC9C/C,QAAQ,GAAG,CACT,4CACAoD,EACA,MACAL,EAAc,EAAE,CAEpB,CAAE,MAAOM,EAAO,CACdrD,QAAQ,KAAK,CACX,oDACAqD,EAEJ,CACF,IAGF,EAAG,CAACN,EAAc,EAGlBG,AAAAA,GAAAA,GAAAA,SAAAA,AAAAA,EAAU,KACJH,EAAc,cAAc,EAAIF,GAClCE,EAAc,cAAc,CAACF,GAAQ,KAAK,CAAC,AAACQ,IAC1CrD,QAAQ,KAAK,CAAC,iCAAkCqD,EAClD,EAEJ,EAAG,CAACN,EAAeF,EAAO,EAGxB,WAAC,OAAI,UAAU,6BAEb,UAAC,OAAI,UAAU,mCACb,WAAC,OAAI,UAAU,uBACb,UAACS,GAAIA,CAAAA,GACL,UAACC,GAAUA,CAAC,qBAAsB,GAAO,cAAe,UAK5D,UAAC,OAAI,UAAU,uCACb,UAACC,GAAmBA,CAClB,cAAeT,EACf,OAAQ,CACN,mBAAoB,GACpB,OAAQ,WACR,gBAAiB,GACjB,qBAAsB,GACtB,WAAY,GACZ,sBAAuB,EACzB,EACA,SAAU,CACR,MAAO,qBACP,QAASU,6BACX,EACA,UAAU,6BAKpB,gHCvFA,OADkBC,AAAAA,GAAS,UAAC,OAAI,MAAM,6BAA6B,MAAO,GAAI,OAAQ,GAAI,KAAK,OAAO,QAAQ,YAAa,GAAGA,CAAK,UAAE,UAAC,QAAK,KAAK,OAAO,YAAa,IAAM,SAAS,UAAU,EAAE,meAAme,SAAS,cCC3qB,GADsBA,AAAAA,GAAS,WAAC,OAAI,MAAM,6BAA6B,MAAO,GAAI,OAAQ,GAAI,KAAK,OAAO,QAAQ,YAAa,GAAGA,CAAK,WAAE,WAAC,KAAE,KAAK,UAAU,SAAS,oCAA0B,UAAC,QAAK,EAAE,uPAAuP,UAAC,QAAK,EAAE,wNAAyN,UAAC,iBAAK,UAAC,YAAS,GAAG,6BAAoB,UAAC,QAAK,KAAK,OAAO,EAAE,yBCCztB,GADkBA,AAAAA,GAAS,UAAC,OAAI,MAAM,6BAA6B,MAAO,GAAI,OAAQ,GAAI,KAAK,OAAO,QAAQ,YAAa,GAAGA,CAAK,UAAE,UAAC,QAAK,KAAK,UAAU,EAAE,8fCiCtJ,CAAEC,KAAI,GAAE,CAAGC,GAAAA,CAAUA,CAqBdC,GAAeC,AAAAA,GAAAA,GAAAA,UAAAA,AAAAA,EAC1B,CAAC,EAQCC,QAPA,CACEC,UAAAA,CAAS,CACTC,QAAAA,EAAU,IAAI,CACdC,YAAAA,EAAc,EAAI,CAClBC,cAAAA,EAAgB,EAAI,CACpBC,kBAAAA,EAAoB,GAAI,CACzB,GAGK,CAACC,EAAYC,EAAc,CAAGC,AAAAA,GAAAA,GAAAA,QAAAA,AAAAA,EAAS,IACvC,CAACC,EAAWC,EAAa,CAAGF,AAAAA,GAAAA,GAAAA,QAAAA,AAAAA,EAAS,IACrC,CAACG,EAAYC,EAAc,CAAGJ,AAAAA,GAAAA,GAAAA,QAAAA,AAAAA,EAG1B,MACJ,CAACK,EAAUC,EAAY,CAAGN,AAAAA,GAAAA,GAAAA,QAAAA,AAAAA,EAAiB,IAE3CO,EAAYC,AAAAA,GAAAA,GAAAA,MAAAA,AAAAA,EAAsB,MAClCC,EAAoBD,AAAAA,GAAAA,GAAAA,MAAAA,AAAAA,EAAuB,MAC3CE,EAAkBF,AAAAA,GAAAA,GAAAA,MAAAA,AAAAA,EAAiC,MACnDG,EAAaH,AAAAA,GAAAA,GAAAA,MAAAA,AAAAA,EAAY,MACzBI,EAAoBJ,AAAAA,GAAAA,GAAAA,MAAAA,AAAAA,EAA8B,MAClDK,EAAqBL,AAAAA,GAAAA,GAAAA,MAAAA,AAAAA,EAA8B,MACnD1D,EAAcC,GAAe,IAE7B+D,EAAuB9D,AAAAA,GAAAA,GAAAA,WAAAA,AAAAA,EAAY,AAAC+D,IACxC,GAAKA,EAEL,GAAI,CAEF,KAAOA,EAAO,UAAU,EACtB,GAAI,CACFA,EAAO,WAAW,CAACA,EAAO,UAAU,CACtC,CAAE,MAAO7F,EAAG,CAGV,GAFAO,QAAQ,IAAI,CAAC,oCAAqCP,GAE9C6F,EAAO,UAAU,CAAE,CACrBA,EAAO,SAAS,CAAG,GACnB,KACF,CACF,CAEJ,CAAE,MAAO7F,EAAG,CACVO,QAAQ,KAAK,CAAC,4BAA6BP,GAE3C,GAAI,CACF6F,EAAO,SAAS,CAAG,EACrB,CAAE,MAAOC,EAAU,CACjBvF,QAAQ,KAAK,CAAC,6BAA8BuF,EAC9C,CACF,CACF,EAAG,EAAE,EAGCC,EAAmBjE,AAAAA,GAAAA,GAAAA,WAAAA,AAAAA,EAAY,KACnC,GAAI,CAAC0D,EAAgB,OAAO,EAAI,CAACD,EAAkB,OAAO,EAAI,CAACN,EAC7D,OAEF,IAAMe,EAAYT,EAAkB,OAAO,CACrCU,EAAST,EAAgB,OAAO,CAChCU,EAAiBF,EAAU,WAAW,CACtCG,EAAkBH,EAAU,YAAY,CACxC,CAAE,MAAOI,CAAa,CAAE,OAAQC,CAAc,CAAE,CAAGpB,EAInDqB,EAAkBH,EADA,GAIlBI,EAAcH,EAAgBC,EAChCG,EAAcN,EACdO,EAAeP,EAAiBK,EAEhCE,EAAeH,IACjBG,EAAeH,EACfE,EAAcF,EAAkBC,GAIlCN,EAAO,KAAK,CAAGG,EACfH,EAAO,MAAM,CAAGI,EAChBJ,EAAO,KAAK,CAAC,KAAK,CAAG,CAAC,EAAEO,EAAY,EAAE,CAAC,CACvCP,EAAO,KAAK,CAAC,MAAM,CAAG,CAAC,EAAEQ,EAAa,EAAE,CAAC,CACzCR,EAAO,KAAK,CAAC,SAAS,CAAG,OACzBA,EAAO,KAAK,CAAC,YAAY,CAAG,MAC9B,EAAG,CAAChB,EAAW,EAGfxB,AAAAA,GAAAA,GAAAA,SAAAA,AAAAA,EAAU,KACR,IAAMiD,EAAe,KACnBX,GACF,EAGA,OADAlG,OAAO,gBAAgB,CAAC,SAAU6G,GAC3B,IAAM7G,OAAO,mBAAmB,CAAC,SAAU6G,EACpD,EAAG,CAACX,EAAiB,EAGrBtC,AAAAA,GAAAA,GAAAA,SAAAA,AAAAA,EAAU,KACRsC,GACF,EAAG,CAACd,EAAYc,EAAiB,EAGjC,IAAMY,EAA2B,UAE/B,GAAIC,GAAAA,CAAAA,CAAAA,WAAmC,CAAE,CACvC,IAAMC,EAAW,IAAID,GAAAA,CAAuBA,CAC5C,MAAO,CACLC,SAAAA,EACA,QAASA,EAAS,MAAM,AAC1B,CACF,CAEA,IAAMA,EAAW,IAAIC,GAAAA,CAAwBA,CAC7C,MAAO,CACLD,SAAAA,EACA,QAASA,EAAS,MAAM,AAC1B,CACF,EAGME,EAAgB,MAAOC,IAE3B,GAAI,CAACC,GAAAA,CAAAA,CAAAA,WAAiC,CACpC,MAAM,AAAI/G,MACR,wGAKJ,GAAM,CAAE2G,SAAAA,CAAQ,CAAEK,QAAAA,CAAO,CAAE,CAAG,MAAMP,IAIpC,GAHAnB,EAAgB,OAAO,CAAG0B,EAGtB3B,EAAkB,OAAO,CAAE,CAC7B,IAAM4B,EACJ5B,EAAkB,OAAO,CAAC,aAAa,CAAC,mBACtC4B,IAEFvB,EAAqBuB,GACrBA,EAAc,WAAW,CAAC3B,EAAgB,OAAO,EAErD,CAGA,OAAO,IAAIyB,GAAAA,CAAqBA,CAAC,CAC/B,MAAOD,EACP,SAAUH,CACZ,EACF,EAGMO,EAAmB,AAACC,IAExB,IAAIC,EAA0B,GAC1BC,EAA4B,EAAE,CAG5BC,EAAkB,IAAIC,gBAAgB,CAC1C,UAAUC,CAAU,CAAEC,CAAe,EAEnC,IAAMC,EAAS,CACb,KAAMF,EAAM,IAAI,CAChB,KAAM,IAAIG,WAAWH,EAAM,IAAI,EAC/B,UAAWA,EAAM,SAAS,AAC5B,CAGIE,AAAgB,mBAAhBA,EAAO,IAAI,EACbD,EAAW,OAAO,CAACC,GACnBN,EAA0B,GAGtBC,EAAmB,MAAM,CAAG,IAC9BA,EAAmB,OAAO,CAAC,AAACO,GAAMH,EAAW,OAAO,CAACG,IACrDP,EAAqB,EAAE,GAEhBK,AAAgB,SAAhBA,EAAO,IAAI,CAEfN,EAGHK,EAAW,OAAO,CAACC,GAFnBL,EAAmB,IAAI,CAACK,GAM1BD,EAAW,OAAO,CAACC,EAEvB,CACF,GAsEA,OAAOG,AAnEa,IAAIC,eAAe,CACrC,MAAML,CAAU,EAEd,IAAIM,EAAe,GAGbC,EAAmB,AAACC,IAExB,IAAIF,EAEJ,GAAI,CACFN,EAAW,OAAO,CAACQ,EACrB,CAAE,MAAOvE,EAAO,CACdrD,QAAQ,KAAK,CACX,6CACAqD,GAGFqE,EAAe,GACfG,GACF,CACF,EAGMC,EAAe,AAACzE,IACpBrD,QAAQ,KAAK,CAAC,gBAAiBqD,GAC1BqE,IACHN,EAAW,KAAK,CAAC,AAAIzH,MAAM0D,EAAM,OAAO,GACxCqE,EAAe,GACfG,IAEJ,EAGME,EAAoB,KACnBL,IACHN,EAAW,KAAK,GAChBM,EAAe,GACfG,IAEJ,EAGMA,EAAkB,KAClB/C,EAAU,OAAO,GACnBA,EAAU,OAAO,CAAC,GAAG,CAAC,aAAc6C,GACpC7C,EAAU,OAAO,CAAC,GAAG,CAAC,QAASgD,GAC/BhD,EAAU,OAAO,CAAC,GAAG,CAAC,aAAciD,GAExC,EAUA,OAPIjD,EAAU,OAAO,GACnBA,EAAU,OAAO,CAAC,EAAE,CAAC,aAAc6C,GACnC7C,EAAU,OAAO,CAAC,EAAE,CAAC,QAASgD,GAC9BhD,EAAU,OAAO,CAAC,EAAE,CAAC,aAAciD,IAI9B,KACLL,EAAe,GACfG,GACF,CACF,CACF,GAGmB,WAAW,CAACZ,EACjC,EAGMe,EAAiB,UACrB,GAAK9C,EAAW,OAAO,CAEvB,GAAI,CACF,IAAM+C,EAAO,MAAM/C,EAAW,OAAO,CAAC,QAAQ,GAC9C,GAAI+C,EAAM,CACR,IAAMC,EAAM9F,IAAI,eAAe,CAAC6F,GAC1BvG,EAAIW,SAAS,aAAa,CAAC,IACjCX,CAAAA,EAAE,IAAI,CAAGwG,EACTxG,EAAE,QAAQ,CAAG,CAAC,WAAW,EAAE,IAAI5B,OAAO,WAAW,GAAG,OAAO,CAAC,KAAM,KAAK,IAAI,CAAC,CAC5E4B,EAAE,KAAK,GACPU,IAAI,eAAe,CAAC8F,EACtB,CACF,CAAE,MAAO7E,EAAO,CACdrD,QAAQ,KAAK,CAAC,qBAAsBqD,GACpC8E,MAAM,oBACR,CACF,EAGMC,EAAmB7G,AAAAA,GAAAA,GAAAA,WAAAA,AAAAA,EAAY,KAEnC,GAAI2D,EAAW,OAAO,CACpB,GAAI,CACFA,EAAW,OAAO,CAAC,OAAO,GAC1BA,EAAW,OAAO,CAAG,IACvB,CAAE,MAAO7B,EAAO,CACdrD,QAAQ,KAAK,CAAC,2BAA4BqD,EAC5C,CAIE2B,EAAkB,OAAO,EAG3BK,EADEL,EAAkB,OAAO,CAAC,aAAa,CAAC,oBAKxCF,EAAU,OAAO,GACnBA,EAAU,OAAO,CAAC,UAAU,GAC5BA,EAAU,OAAO,CAAG,MAIlBK,EAAkB,OAAO,GAC3B1C,aAAa0C,EAAkB,OAAO,EACtCA,EAAkB,OAAO,CAAG,MAG1BC,EAAmB,OAAO,GAC5B3C,aAAa2C,EAAmB,OAAO,EACvCA,EAAmB,OAAO,CAAG,MAI/BX,EAAa,IACbH,EAAc,IACdK,EAAc,KAChB,EAAG,CAACU,EAAqB,EAGzBgD,AAAAA,GAAAA,GAAAA,mBAAAA,AAAAA,EACEtE,EACA,IAAO,EACLqE,iBAAAA,CACF,GACA,CAACA,EAAiB,EAIpB,IAAME,EAAgB/G,AAAAA,GAAAA,GAAAA,WAAAA,AAAAA,EAAY,UAChC,GAAI,CAaF,GAXA6G,IAGA3D,EAAa,IACbH,EAAc,IACdK,EAAc,MAGd,MAAM,IAAI/D,QAAQ,AAAC2H,GAAY1H,WAAW0H,EAAS,MAG/C,CAACvE,EAAW,CACdhE,QAAQ,KAAK,CAAC,sCACdsE,EAAc,IACd,MACF,CAGA,IAAMkE,EAAuB,KAEvBpD,EAAmB,OAAO,GAC5B3C,aAAa2C,EAAmB,OAAO,EACvCA,EAAmB,OAAO,CAAG,MAI/BA,EAAmB,OAAO,CAAGvE,WAAW,SAClC4H,EAAJ,GAAI,MAAAA,CAAAA,EAAAA,EAAU,OAAO,AAAD,EAAhBA,KAAAA,EAAAA,EAAmB,SAAS,CAC9B,GAAI,CACF3D,EAAU,OAAO,CAAC,IAAI,CAAC,iBAAkB,CACvCb,QAAAA,CACF,GAGAuE,GACF,CAAE,MAAOE,EAAK,CACZ1I,QAAQ,KAAK,CAAC,gCAAiC0I,GAC/CtH,GAAAA,EAAAA,CAAAA,KAAa,CACX,qDAEJ,MAEA,GAAI,CACE0D,EAAU,OAAO,EACnBjE,WAAW,KAELiE,EAAU,OAAO,EACnBA,EAAU,OAAO,CAAC,OAAO,EAE7B,EAAG,IAEP,CAAE,MAAO4D,EAAK,CACZ1I,QAAQ,KAAK,CAAC,uBAAwB0I,GACtCtH,GAAAA,EAAAA,CAAAA,KAAa,CAAC,+CAChB,CAEJ,EAAG,IACL,EAGA,GAAK0D,EAAU,OAAO,CA6JfA,EAAU,OAAO,CAAC,SAAS,EAG9BA,EAAU,OAAO,CAAC,IAAI,CAAC,iBAAkB,CACvCb,QAAAA,CACF,GAGAuE,KAPA1D,EAAU,OAAO,CAAC,OAAO,QA7J3B,GAAI,CACFA,EAAU,OAAO,CAAG6D,AAAAA,GAAAA,GAAAA,EAAAA,AAAAA,EAAG3E,EAAW,CAChC,gBAAiB,GACjB,aAAc,GACd,qBAAsB,EACtB,kBAAmB,IACnB,QAAS,GACX,GAGAc,EAAU,OAAO,CAAC,EAAE,CAAC,UAAW,SAE1B2D,EASJG,CATI,QAAAH,CAAAA,EAAAA,EAAU,OAAO,AAAD,EAAhBA,KAAAA,EAAAA,EAAmB,EAAE,AAAD,GACtB5D,EAAYC,EAAU,OAAO,CAAC,EAAE,EAG9BK,EAAkB,OAAO,GAC3B1C,aAAa0C,EAAkB,OAAO,EACtCA,EAAkB,OAAO,CAAG,YAG9ByD,CAAAA,EAAAA,EAAU,OAAO,AAAD,GAAhBA,EAAmB,IAAI,CAAC,iBAAkB,CACxC3E,QAAAA,CACF,GAGAuE,GACF,GAGA1D,EAAU,OAAO,CAAC,EAAE,CAClB,iBACA,MAAO+D,IACL,GAAI,CAQF,GANIzD,EAAmB,OAAO,GAC5B3C,aAAa2C,EAAmB,OAAO,EACvCA,EAAmB,OAAO,CAAG,MAI3BF,EAAW,OAAO,CACpB,GAAI,CACFA,EAAW,OAAO,CAAC,OAAO,GAC1BA,EAAW,OAAO,CAAG,IACvB,CAAE,MAAO7B,EAAO,CACdrD,QAAQ,KAAK,CAAC,+BAAgCqD,EAChD,CAIF,GAAI2B,EAAkB,OAAO,CAAE,CAC7B,IAAM4B,EACJ5B,EAAkB,OAAO,CAAC,aAAa,CACrC,mBAEJK,EAAqBuB,EACvB,CAIA,IAAMH,EAAUoC,AAAAA,CAAAA,MAAAA,EAAAA,KAAAA,EAAAA,EAAU,KAAK,AAAD,EACzBA,EAAS,KAAK,CACfC,GAAAA,CAAAA,CAAAA,IAAuB,CAM3B,GAHA5D,EAAW,OAAO,CAAG,MAAMsB,EAAcC,GAGrC,CAACvB,EAAW,OAAO,CACrB,MAAM,AAAIvF,MAAM,4BAIlBuF,EAAW,OAAO,CAAC,WAAW,CAC5B,AAAC,QAAE6D,MAAAA,CAAK,CAAEC,OAAAA,CAAM,CAAqC,GACnDrE,EAAc,CAAEoE,MAAAA,EAAOC,OAAAA,CAAO,EAChC,GAOFxB,AAHoBX,EAAiBgC,GAIlC,MAAM,CAAC3D,EAAW,OAAO,CAAC,QAAQ,EAClC,KAAK,CAAC,AAAC7B,IACNrD,QAAQ,KAAK,CAAC,iCAAkCqD,EAClD,GAGFoB,EAAa,IACbH,EAAc,GAEhB,CAAE,MAAOjB,EAAY,CACnBrD,QAAQ,KAAK,CAAC,gCAAiCqD,GAC/CiB,EAAc,GAChB,CACF,GAIFQ,EAAU,OAAO,CAAC,EAAE,CAAC,QAAS,AAACzB,IAC7BrD,QAAQ,KAAK,CAAC,gBAAiBqD,GAC/BjC,GAAAA,EAAAA,CAAAA,KAAa,CAAC,gBACdkD,EAAc,IAGVc,EAAmB,OAAO,GAC5B3C,aAAa2C,EAAmB,OAAO,EACvCA,EAAmB,OAAO,CAAG,KAEjC,GAGAN,EAAU,OAAO,CAAC,EAAE,CAAC,aAAc,KACjCL,EAAa,IAGTW,EAAmB,OAAO,GAC5B3C,aAAa2C,EAAmB,OAAO,EACvCA,EAAmB,OAAO,CAAG,MAI3BF,EAAW,OAAO,GACpBA,EAAW,OAAO,CAAC,OAAO,GAC1BA,EAAW,OAAO,CAAG,MAGnBF,EAAkB,OAAO,EAE3BK,EACEL,EAAkB,OAAO,CAAC,aAAa,CAAC,oBAIxCb,GAAiB,CAACgB,EAAkB,OAAO,EAC7CA,CAAAA,EAAkB,OAAO,CAAGtE,WAAW,KACrCsE,EAAkB,OAAO,CAAG,KAC5BmD,GACF,EAAGlE,EAAiB,CAExB,EACF,CAAE,MAAOf,EAAY,CACnBrD,QAAQ,KAAK,CAAC,sCAAuCqD,GACrDiB,EAAc,IAEVH,GAAiB,CAACgB,EAAkB,OAAO,EAC7CA,CAAAA,EAAkB,OAAO,CAAGtE,WAAW,KACrCsE,EAAkB,OAAO,CAAG,KAC5BmD,GACF,EAAGlE,EAAiB,CAExB,CAaJ,CAAE,MAAOf,EAAY,CACnBiB,EAAc,IACdtE,QAAQ,KAAK,CAAC,CAAC,mBAAmB,EAAEqD,EAAM,OAAO,CAAC,CAAC,EACnDjC,GAAAA,EAAAA,CAAAA,KAAa,CAAC,qBAEV+C,GAAiB,CAACgB,EAAkB,OAAO,EAC7CA,CAAAA,EAAkB,OAAO,CAAGtE,WAAW,KACrCsE,EAAkB,OAAO,CAAG,KAC5BmD,GACF,EAAGlE,EAAiB,CAExB,CACF,EAAG,CACDJ,EACAC,EACAE,EACAC,EACAgE,EACD,EAgED,MA7DAlF,AAAAA,GAAAA,GAAAA,SAAAA,AAAAA,EAAU,KACR,GAAIgB,GAAe,CAACM,GAAa,CAACH,EAAY,CAE5C,IAAM4E,EAAQpI,WAAW,KACvByH,GACF,EAAG,KAEH,MAAO,IAAM7F,aAAawG,EAC5B,CACF,EAAG,CAAC/E,EAAaM,EAAWH,EAAYiE,EAAc,EAGtDpF,AAAAA,GAAAA,GAAAA,SAAAA,AAAAA,EAAU,IAED,KAEL,GAAIgC,EAAW,OAAO,CACpB,GAAI,CACFA,EAAW,OAAO,CAAC,OAAO,GAC1BA,EAAW,OAAO,CAAG,IACvB,CAAE,MAAO7B,EAAO,CACdrD,QAAQ,KAAK,CAAC,0CAA2CqD,EAC3D,CAIF,GAAI2B,EAAkB,OAAO,CAC3B,GAAI,CACF,IAAM4B,EACJ5B,EAAkB,OAAO,CAAC,aAAa,CAAC,kBACtC4B,CAAAA,GAEFA,CAAAA,EAAc,SAAS,CAAG,EAAC,CAE/B,CAAE,MAAOvD,EAAO,CACdrD,QAAQ,KAAK,CACX,gDACAqD,EAEJ,CAIEyB,EAAU,OAAO,GACnBA,EAAU,OAAO,CAAC,UAAU,GAC5BA,EAAU,OAAO,CAAG,MAIlBK,EAAkB,OAAO,GAC3B1C,aAAa0C,EAAkB,OAAO,EACtCA,EAAkB,OAAO,CAAG,MAG1BC,EAAmB,OAAO,GAC5B3C,aAAa2C,EAAmB,OAAO,EACvCA,EAAmB,OAAO,CAAG,KAEjC,EACC,EAAE,EAGH,UAAC,OAAI,UAAU,4BACb,WAAC8D,GAAAA,CAAIA,CAAAA,WACF1E,GACC,WAAC,OAAI,UAAU,uBACb,WAAC,OAAI,UAAU,wBACb,UAACb,GAAIA,CAAC,MAAO,CAAE,WAAY,IAAK,SAAU,EAAG,WAAG,sBAGhD,UAACwF,GAAAA,CAAOA,CAAAA,CACN,UAAU,SACV,MAAO,CAAC,WAAW,EAAEvE,GAAY,UAAU,CAAC,UAE5C,UAACwE,GAAAA,CAAkBA,CAAAA,CAAAA,QAGvB,UAAC,OAAI,UAAU,uBACb,WAACzF,GAAIA,CAAC,KAAK,sBAAY,UACbe,MAAAA,EAAAA,KAAAA,EAAAA,EAAY,KAAK,CAAC,OAAEA,MAAAA,EAAAA,KAAAA,EAAAA,EAAY,MAAM,MAGlD,WAAC,OAAI,UAAU,yBACb,UAACyE,GAAAA,CAAOA,CAAAA,CAAC,UAAU,SAAS,MAAM,sBAChC,UAACE,GAAAA,EAAMA,CAAAA,CAAC,KAAM,UAACC,GAAcA,CAAAA,GAAK,QAAStB,MAE7C,UAACuB,GAAAA,CAAOA,CAAAA,CACN,KAAK,WACL,MAAO,CACL,OAAQ,QACV,IAEF,UAACJ,GAAAA,CAAOA,CAAAA,CAAC,UAAU,SAAS,MAAM,0BAChC,UAACE,GAAAA,EAAMA,CAAAA,CACL,SAAU7E,EACV,MAAO,CACL,gBAAiB,MACnB,EACA,KAAM,UAACgF,GAAUA,CAAAA,GACjB,QAASlB,MAGZ9D,GACC,iCACE,UAAC+E,GAAAA,CAAOA,CAAAA,CACN,KAAK,WACL,MAAO,CACL,OAAQ,QACV,IAEF,UAACJ,GAAAA,CAAOA,CAAAA,CAAC,MAAM,6BACb,UAACE,GAAAA,EAAMA,CAAAA,CACL,KAAM,UAACI,GAAUA,CAAAA,GACjB,QAASrB,eAQvB,UAACsB,GAAAA,CAAGA,CAAAA,CAAC,OAAQ,CAAC,GAAI,GAAG,UACnB,UAACC,GAAAA,CAAGA,CAAAA,CAAC,KAAM,YACT,UAAC,OAAI,UAAU,yBACb,WAAC,OAAI,IAAK3E,EAAmB,UAAU,4BACrC,UAAC,OAAI,UAAU,mBACd,CAACR,GAAanD,GACb,WAAC,OAAI,UAAU,wBACb,UAAC,OAAI,UAAU,4BAAmB,iBAClC,UAAC,OAAI,UAAU,4BACZgD,EACG,0BACA,wBAEL,CAACA,GACA,UAACgF,GAAAA,EAAMA,CAAAA,CACL,KAAK,UACL,QAAS,KACPf,GACF,WACD,gBAIFjE,GACC,UAAC,OAAI,UAAU,2BACb,UAACuF,GAAAA,CAAIA,CAAAA,CAAC,KAAK,eAKlB,CAACvI,GACA,UAAC,iBAAK,kDASxB,GCnxBI,CAAEwI,QAAAA,EAAO,CAAE,CAAGC,GAAAA,CAAMA,CCdpBC,GAAS1H,SAAS,cAAc,CAAC,QACnC0H,IAEFC,AADaC,EAAAA,UAAmB,CAACF,IAC5B,MAAM,CAAC,UDaC,WAEb,GAAM,CAAC/I,EAAkBkJ,EAAoB,CAAG3F,AAAAA,GAAAA,GAAAA,QAAAA,AAAAA,EAAwB,MAClE,CAAC4F,EAAiBC,EAAmB,CAAG7F,AAAAA,GAAAA,GAAAA,QAAAA,AAAAA,EAAS,IACjD,CAACrD,EAAYC,EAAc,CAAGC,GAAAA,EAAAA,CAAAA,UAAkB,GAChD,CAAC4C,EAAWqG,EAAa,CAAG9F,AAAAA,GAAAA,GAAAA,QAAAA,AAAAA,EAChC,yBAEI,CAAC+F,EAAgBC,EAAkB,CAAGhG,AAAAA,GAAAA,GAAAA,QAAAA,AAAAA,EAAS,IAG/C,CAAE1B,OAAAA,CAAM,CAAE,CAAGC,IAGnBI,AAAAA,GAAAA,GAAAA,SAAAA,AAAAA,EAAU,MACRsH,AEhCJ,SAA8B,CAAS,EACnC,IAAI/K,EAAakB,UAAU,MAAM,CAAG,GAAK,KAAK,IAAMA,SAAS,CAAC,EAAE,EAAGA,SAAS,CAAC,EAAE,CAAU,EAAmBA,CAAAA,CAAAA,UAAU,MAAM,CAAG,IAAK,KAAK,IAAMA,SAAS,CAAC,EAAE,EAAGA,SAAS,CAAC,EAAE,CAC1K,GAAI,CACA,GAAiB,EAAWlB,EAEhC,CAAE,MAAOA,EAAO,CACZ,IAAM,EAAMA,aAAiBE,MAAQF,EAAQ,AAAIE,MAAM6C,OAAO/C,IAG9D,OAFAO,QAAQ,KAAK,CAAC,gCAAiC,GAC3C,GAAkB,WAAa,CAAC,CAAC,kCAAkC,EAAE,EAAI,OAAO,CAAC,CAAC,EAC/E,EACX,CACJ,EFqByB6C,EACvB,EAAG,CAACA,EAAO,EAGXK,AAAAA,GAAAA,GAAAA,SAAAA,AAAAA,EAAU,KACR,IAAMuH,EAAcnL,OAAe,WAAW,AAC1CmL,CAAAA,GACFJ,EAAa,CAAC,iBAAiB,EAAEI,EAAW,CAAC,CAEjD,EAAG,EAAE,EAGL,IAAM3F,EAAYC,AAAAA,GAAAA,GAAAA,MAAAA,AAAAA,EAAsB,MAClC9D,EAAkB8D,AAAAA,GAAAA,GAAAA,MAAAA,AAAAA,EAAyB,MAgFjD,MA7EA7B,AAAAA,GAAAA,GAAAA,SAAAA,AAAAA,EAAU,KACR,GAAI,CAACc,EAAW,OAEhB,IAAM0G,EAAS/B,AAAAA,GAAAA,GAAAA,EAAAA,AAAAA,EAAG3E,EAAW,CAC3B,gBAAiB,GACjB,qBAAsB,EACtB,kBAAmB,IACnB,QAAS,GACX,GAoCA,OAlCA0G,EAAO,EAAE,CAAC,UAAW,KACnBA,EAAO,IAAI,CAAC,cACd,GAEAA,EAAO,EAAE,CACP,eACA,AAAC9C,IAIKA,EAAK,eAAe,GACtBsC,EAAoBtC,EAAK,eAAe,EAExCwC,EAAmB,IAEvB,GAGFM,EAAO,EAAE,CAAC,gBAAiB,AAACrH,IAC1BrD,QAAQ,KAAK,CAAC,8BAA+BqD,GAC7CnC,EAAW,KAAK,CACd,+DAEJ,GAEAwJ,EAAO,EAAE,CAAC,QAAS,AAACrH,IAClBrD,QAAQ,KAAK,CAAC,mBAAoBqD,GAClCnC,EAAW,KAAK,CACd,CAAC,oDAAoD,EAAEmC,EAAM,OAAO,EAAI,gBAAgB,CAAC,CAE7F,GAEAyB,EAAU,OAAO,CAAG4F,EAEb,KACLA,EAAO,UAAU,EACnB,CACF,EAAG,CAACxJ,EAAY8C,EAAU,EAG1Bd,AAAAA,GAAAA,GAAAA,SAAAA,AAAAA,EAAU,KACR,GAAIiH,EAAiB,CAEnB,IAAMlB,EAAQpI,WAAW,KACvBuJ,EAAmB,GACrB,EAAG,KAEH,MAAO,IAAM3H,aAAawG,EAC5B,CACF,EAAG,CAACkB,EAAgB,EAGpBjH,AAAAA,GAAAA,GAAAA,SAAAA,AAAAA,EAAU,KACR,IAAMiD,EAAe,KACnBoE,EAAkBjL,OAAO,UAAU,EAAI,KACzC,EASA,OANA6G,IAGA7G,OAAO,gBAAgB,CAAC,SAAU6G,GAG3B,IAAM7G,OAAO,mBAAmB,CAAC,SAAU6G,EACpD,EAAG,EAAE,EAGH,WAACwE,GAAAA,EAAcA,CAAAA,CAAC,MnE5GT,CACH,MAAO,CACH,aAAc,SAClB,EACA,WAAY,CACR,OAAQ,CACJ,aAAc,GACd,cAAe,SACf,SAAU,OACV,OAAQ,MACZ,CACJ,CACJ,YmEiGGxJ,EACD,UAAC2I,GAAAA,CAAMA,CAAAA,CAAC,UAAU,4DAChB,UAACD,GAAAA,CAAQ,UAAU,uBACjB,WAACe,GAAAA,EAAUA,CAAAA,CACT,WAAW,4BACX,UAAWN,EAAiB,WAAa,uBAGzC,UAACO,GAAAA,EAAKA,CAAAA,CACJ,YAAaP,EAAiB,GAAK,GACnC,QAASA,EAAiB,GAAK,GAC/B,QAASA,EAAiB,GAAK,GAC/B,UAAU,gCAEV,UAAC,OAAI,UAAU,4CACb,UAAC1H,GAAeA,CAAAA,OAIpB,UAACkI,GAAAA,EAAiBA,CAAAA,CAChB,UAAW,CAAC,oBAAoB,EAAER,EAAiB,WAAa,aAAa,CAAC,GAIhF,UAACO,GAAAA,EAAKA,CAAAA,CAAC,UAAU,iCACf,WAAC,OAAI,UAAU,8CACb,UAACE,GAASA,CACR,iBAAkB/J,EAClB,gBAAiBC,IAEnB,UDwoBD4C,GCxoBcA,CACX,IAAK5C,EACL,UAAW+C,EACX,YAAamG,kBAS/B,ECrKkBa,CAAAA,+oBELlB,EAAoB,CAAC,CAAG,AAAC,IACxB,IAAI,EAAS,GAAU,EAAO,UAAU,CACvC,IAAO,EAAO,OAAU,CACxB,IAAO,EAER,OADA,EAAoB,CAAC,CAAC,EAAQ,CAAE,EAAG,CAAO,GACnC,CACR,QCPA,IACI,EADA,EAAW5L,OAAO,cAAc,CAAG,AAAC,GAASA,OAAO,cAAc,CAAC,GAAQ,AAAC,GAAS,EAAI,SAAS,AAQtG,GAAoB,CAAC,CAAG,SAAS,CAAK,CAAE,CAAI,EAE3C,GADG,AAAO,EAAP,GAAU,GAAQ,IAAI,CAAC,EAAK,EACrB,EAAP,GACA,AAAiB,UAAjB,OAAO,GAAsB,IACpB,EAAP,GAAa,EAAM,UAAU,EAC9B,AAAQ,GAAP,GAAc,AAAsB,YAAtB,OAAO,EAAM,IAAI,EAHvB,OAAO,EAKpB,IAAI6L,EAAK7L,OAAO,MAAM,CAAC,MACtB,EAAoB,CAAC,CAAC6L,GACvB,IAAI,EAAM,CAAC,EACX,EAAiB,GAAkB,CAAC,KAAM,EAAS,CAAC,GAAI,EAAS,EAAE,EAAG,EAAS,GAAU,CACzF,IAAI,IAAI,EAAU,AAAO,EAAP,GAAY,EAAO,AAAkB,UAAlB,OAAO,GAAuB,CAAC,CAAC,EAAe,OAAO,CAAC,GAAU,EAAU,EAAS,GACxH7L,OAAO,mBAAmB,CAAC,GAAS,OAAO,CAAC,AAAC,IAAU,CAAG,CAAC,EAAI,CAAG,IAAO,CAAK,CAAC,EAAI,AAAE,GAItF,OAFA,EAAI,OAAU,CAAG,IAAO,EACxB,EAAoB,CAAC,CAAC6L,EAAI,GACnBA,CACR,MCzBA,EAAoB,CAAC,CAAG,CAAC,EAAS,KACjC,IAAI,IAAI,KAAO,EACL,EAAoB,CAAC,CAAC,EAAY,IAAQ,CAAC,EAAoB,CAAC,CAAC,EAAS,IACzE7L,OAAO,cAAc,CAAC,EAAS,EAAK,CAAE,WAAY,GAAM,IAAK,CAAU,CAAC,EAAI,AAAC,EAGzF,ECNA,EAAoB,CAAC,CAAG,CAAC,EAGzB,EAAoB,CAAC,CAAG,AAAC,GACjBwB,QAAQ,GAAG,CACjBxB,OAAO,IAAI,CAAC,EAAoB,CAAC,EAAE,MAAM,CAAC,CAAC,EAAU,KACpD,EAAoB,CAAC,CAAC,EAAI,CAAC,EAAS,GAC7B,GACL,EAAE,GCPP,EAAoB,CAAC,CAAG,AAAC,GAIhB,mBAAqB,EAAU,IAAM,EAAC,IAAO,WAAW,IAAO,WAAW,IAAO,WAAW,IAAO,WAAW,IAAO,WAAW,IAAO,WAAW,IAAO,WAAW,IAAO,WAAW,IAAO,WAAW,IAAO,WAAW,IAAO,UAAW,EAAC,CAAC,EAAQ,CAAG,MCJlQ,EAAoB,QAAQ,CAAG,AAAC,GAIvB,GAAK,EAAU,OCLxB,EAAoB,CAAC,CAAG,IAAO,mBCA/B,EAAoB,CAAC,CAAG,AAAC,MACxB,GAAI,AAAsB,UAAtB,OAAO8L,WAAyB,OAAOA,WAC3C,GAAI,CACH,OAAO,IAAI,EAAI,AAAIC,SAAS,gBAC7B,CAAE,MAAO,EAAG,CACX,GAAI,AAAkB,UAAlB,OAAO7L,OAAqB,OAAOA,MACxC,CACD,KCPA,EAAoB,CAAC,CAAG,CAAC,EAAK,IAAUF,OAAO,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,EAAK,SCAlF,IAAI,EAAa,CAAC,EAEd,EAAoB,qBAExB,GAAoB,CAAC,CAAG,SAAU,CAAG,CAAE,CAAI,CAAE,CAAG,CAAE,CAAO,EACxD,GAAI,CAAU,CAAC,EAAI,CAAE,YACpB,CAAU,CAAC,EAAI,CAAC,IAAI,CAAC,GAItB,GAAI,AAAQ,SAAR,EAEH,IAAK,IAHF,EAAQ,EAEP,EAAUiD,SAAS,oBAAoB,CAAC,UACnC,EAAI,EAAG,EAAI,EAAQ,MAAM,CAAE,IAAK,CACxC,IAAI,EAAI,CAAO,CAAC,EAAE,CAClB,GAAI,EAAE,YAAY,CAAC,QAAU,GAAO,EAAE,YAAY,CAAC,iBAAmB,EAAoB,EAAK,CAC9F,EAAS,EACT,KACD,CACD,CAEI,IACJ,EAAa,GAIb,AAFE,GAASA,SAAS,aAAa,CAAC,SAAQ,EAEnC,OAAO,CAAG,QACjB,EAAO,OAAO,CAAG,IACb,EAAoB,EAAE,EACzB,EAAO,YAAY,CAAC,QAAS,EAAoB,EAAE,EAEpD,EAAO,YAAY,CAAC,eAAgB,EAAoB,GAExD,EAAO,GAAG,CAAG,GAId,CAAU,CAAC,EAAI,CAAG,CAAC,EAAK,CACxB,IAAI,EAAmB,SAAU,CAAI,CAAE,CAAK,EAC3C,EAAO,OAAO,CAAG,EAAO,MAAM,CAAG,KACjCI,aAAa,GACb,IAAI,EAAU,CAAU,CAAC,EAAI,CAO7B,GANA,OAAO,CAAU,CAAC,EAAI,CACtB,EAAO,UAAU,EAAI,EAAO,UAAU,CAAC,WAAW,CAAC,GACnD,GACC,EAAQ,OAAO,CAAC,SAAU,CAAE,EAC3B,OAAO,EAAG,EACX,GACG,EAAM,OAAO,EAAK,EACvB,EACI,EAAU5B,WACb,EAAiB,IAAI,CAAC,KAAM,OAAW,CACtC,KAAM,UACN,OAAQ,CACT,GACA,KAED,GAAO,OAAO,CAAG,EAAiB,IAAI,CAAC,KAAM,EAAO,OAAO,EAC3D,EAAO,MAAM,CAAG,EAAiB,IAAI,CAAC,KAAM,EAAO,MAAM,EACzD,GAAcwB,SAAS,IAAI,CAAC,WAAW,CAAC,EACzC,MC1DA,EAAoB,CAAC,CAAG,AAAC,IACrB,AAAkB,aAAlB,OAAOhD,QAA0BA,OAAO,WAAW,EACrDD,OAAO,cAAc,CAAC,EAASC,OAAO,WAAW,CAAE,CAAE,MAAO,QAAS,GAEtED,OAAO,cAAc,CAAC,EAAS,aAAc,CAAE,MAAO,EAAK,EAC5D,ECNA,EAAoB,GAAG,CAAG,AAAC,IACzB,EAAO,KAAK,CAAG,EAAE,CACb,AAAC,EAAO,QAAQ,EAAE,GAAO,QAAQ,CAAG,EAAE,AAAD,EAClC,SCHT,IAAI,EAAW,EAAE,AACjB,GAAoB,CAAC,CAAG,CAAC,EAAQ,EAAU,EAAI,KAC9C,GAAI,EAAU,CACb,EAAW,GAAY,EACvB,IAAK,IAAIsD,EAAI,EAAS,MAAM,CAAEA,EAAI,GAAK,CAAQ,CAACA,EAAI,EAAE,CAAC,EAAE,CAAG,EAAUA,IACrE,CAAQ,CAACA,EAAE,CAAG,CAAQ,CAACA,EAAI,EAAE,AAC9B,EAAQ,CAACA,EAAE,CAAG,CAAC,EAAU,EAAI,EAAS,CACtC,MACD,CAEA,IAAK,IADD,EAAe,IACVA,EAAI,EAAGA,EAAI,EAAS,MAAM,CAAEA,IAAK,CAGzC,IAAK,GAFD,CAAC,EAAU,EAAI,EAAS,CAAG,CAAQ,CAACA,EAAE,CACtC,EAAY,GACP,EAAI,EAAG,EAAI,EAAS,MAAM,CAAE,IAEnC,AAAC,CAAY,GAAZ,GAAwB,GAAgB,CAAO,GAChDtD,OAAO,IAAI,CAAC,EAAoB,CAAC,EAAE,KAAK,CAAC,AAAC,GAAS,EAAoB,CAAC,CAAC,EAAI,CAAC,CAAQ,CAAC,EAAE,GAEzF,EAAS,MAAM,CAAC,IAAK,IAErB,EAAY,GACR,EAAW,GAAc,GAAe,CAAO,GAGrD,GAAI,EAAW,CACd,EAAS,MAAM,CAACsD,IAAK,GACrB,IAAI,EAAI,GACJ,AAAM,UAAN,GAAiB,GAAS,EAC/B,CACD,CACA,OAAO,CACR,MC/BA,EAAoB,CAAC,CAAG,ICAxB,EAAoB,EAAE,CAAG,IAAO,eCAhC,EAAoB,CAAC,CAAGL,SAAS,OAAO,EAAI+I,KAAK,QAAQ,CAAC,IAAI,CAKxD,IAAI,EAAkB,CAAC,IAAO,CAAE,CAE9B,GAAoB,CAAC,CAAC,CAAC,CAAG,SAAU,CAAO,CAAE,CAAQ,EAE7D,IAAI,EAAqB,EAAoB,CAAC,CAAC,EAAiB,GAC7D,CAAe,CAAC,EAAQ,CACxB,OACH,GAAI,AAAuB,IAAvB,EAIH,GAAI,EACH,EAAS,IAAI,CAAC,CAAkB,CAAC,EAAE,MAC7B,CAGL,IAAI,EAAU,IAAIxK,QAAQ,CAAC,EAAST,IAAY,EAAqB,CAAe,CAAC,EAAQ,CAAG,CAAC,EAASA,EAAO,EACjH,EAAS,IAAI,CAAE,CAAkB,CAAC,EAAE,CAAG,GAGvC,IAAI,EAAM,EAAoB,CAAC,CAAG,EAAoB,CAAC,CAAC,GAEpD,EAAQ,AAAIR,QAwBhB,EAAoB,CAAC,CAAC,EAvBH,SAAU,CAAK,EACjC,GAAI,EAAoB,CAAC,CAAC,EAAiB,KAEtC,AAAuB,IAD3B,GAAqB,CAAe,CAAC,EAAQ,AAAD,GACd,EAAe,CAAC,EAAQ,CAAG,MAAQ,EAC7D,GAAoB,CACvB,IAAI,EACH,GAAU,CAAe,SAAf,EAAM,IAAI,CAAc,UAAY,EAAM,IAAI,AAAD,EACpD,EAAU,GAAS,EAAM,MAAM,EAAI,EAAM,MAAM,CAAC,GAAG,AACvD,GAAM,OAAO,CACZ,iBACA,EACA,cACA,EACA,KACA,EACA,IACD,EAAM,IAAI,CAAG,iBACb,EAAM,IAAI,CAAG,EACb,EAAM,OAAO,CAAG,EAChB,CAAkB,CAAC,EAAE,CAAC,EACvB,CAEF,EACyC,SAAW,EAAS,EAE/D,CAGO,EACA,EAAoB,CAAC,CAAC,CAAC,CAAG,AAAC,GAAa,AAA6B,IAA7B,CAAe,CAAC,EAAQ,CAExE,IAAI,EAAuB,CAAC,EAA4B,KACvD,IAGI,EAAU,EAHV,CAAC,EAAU,EAAa,EAAQ,CAAG,EAGhB,EAAI,EAC3B,GAAI,EAAS,IAAI,CAAC,AAAC,GAAQ,AAAwB,IAAxB,CAAe,CAAC,EAAG,EAAU,CACvD,IAAK,KAAY,EACZ,EAAoB,CAAC,CAAC,EAAa,IACtC,GAAoB,CAAC,CAAC,EAAS,CAAG,CAAW,CAAC,EAAS,AAAD,EAGxD,GAAI,EAAS,IAAI,EAAS,EAAQ,EACnC,CAEA,IADI,GAA4B,EAA2B,GACpD,EAAI,EAAS,MAAM,CAAE,IAC3B,EAAU,CAAQ,CAAC,EAAE,CAEpB,EAAoB,CAAC,CAAC,EAAiB,IACvC,CAAe,CAAC,EAAQ,EAExB,CAAe,CAAC,EAAQ,CAAC,EAAE,GAE5B,CAAe,CAAC,EAAQ,CAAG,EAE5B,OAAO,EAAoB,CAAC,CAAC,EAC9B,EAEI,EAAqByL,KAAK,8BAAiC,CAAGA,KAAK,8BAAiC,EAAI,EAAE,CAC9G,EAAmB,OAAO,CAAC,EAAqB,IAAI,CAAC,KAAM,IAC3D,EAAmB,IAAI,CAAG,EAAqB,IAAI,CAAC,KAAM,EAAmB,IAAI,CAAC,IAAI,CAAC,QCxFvF,EAAoB,IAAI,CAAG"}
|