@mearl/native-host 2.22.1 → 2.22.3

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/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire as __mearlCreateRequire } from 'node:module'; const require = __mearlCreateRequire(import.meta.url);
3
- var __create=Object.create;var __defProp=Object.defineProperty;var __getOwnPropDesc=Object.getOwnPropertyDescriptor;var __getOwnPropNames=Object.getOwnPropertyNames;var __getProtoOf=Object.getPrototypeOf,__hasOwnProp=Object.prototype.hasOwnProperty;var __require=(x=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(x,{get:(a,b)=>(typeof require<"u"?require:a)[b]}):x)(function(x){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+x+'" is not supported')});var __esm=(fn,res)=>function(){return fn&&(res=(0,fn[__getOwnPropNames(fn)[0]])(fn=0)),res};var __commonJS=(cb,mod)=>function(){return mod||(0,cb[__getOwnPropNames(cb)[0]])((mod={exports:{}}).exports,mod),mod.exports};var __export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__copyProps=(to,from,except,desc)=>{if(from&&typeof from=="object"||typeof from=="function")for(let key of __getOwnPropNames(from))!__hasOwnProp.call(to,key)&&key!==except&&__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to};var __toESM=(mod,isNodeMode,target)=>(target=mod!=null?__create(__getProtoOf(mod)):{},__copyProps(isNodeMode||!mod||!mod.__esModule?__defProp(target,"default",{value:mod,enumerable:!0}):target,mod));import{createRequire}from"node:module";import{fileURLToPath}from"node:url";var require2,CLIENT_VERSION,PLUGIN_TASK_HOST_PATH,PLUGIN_WORKER_PATH,PLUGIN_MODEL_SESSION_WORKER_PATH,init_runtimePaths=__esm({"../client/dist/runtimePaths.js"(){"use strict";require2=createRequire(import.meta.url),CLIENT_VERSION=require2("../package.json").version,PLUGIN_TASK_HOST_PATH=fileURLToPath(new URL("./plugin-task-host.js",import.meta.url)),PLUGIN_WORKER_PATH=fileURLToPath(new URL("./plugin-worker.js",import.meta.url)),PLUGIN_MODEL_SESSION_WORKER_PATH=fileURLToPath(new URL("./pluginModelSessionWorker.js",import.meta.url))}});import{readFileSync,readdirSync}from"node:fs";import{spawnSync}from"node:child_process";function linuxProcessStat(pid){let stat4=readFileSync(`/proc/${pid}/stat`,"utf8"),end=stat4.lastIndexOf(")"),fields3=stat4.slice(end+2).trim().split(/\s+/),group=Number(fields3[2]),threads=Number(fields3[17]);if(end<0||!/^[A-Za-z]$/.test(fields3[0])||!Number.isSafeInteger(group)||group<0||!Number.isSafeInteger(threads)||threads<0||!/^\d+$/.test(fields3[19]??""))throw new Error("Invalid Linux process stat");return{state:fields3[0],group,threads,identity:fields3[19]}}function linuxProcessExited({state,threads}){return threads<=1&&(state==="Z"||state==="X"||state==="x")}function processIdentity(pid){if(!(!Number.isSafeInteger(pid)||pid<1))try{if(process.platform==="linux")return linuxProcessStat(pid).identity;let result=process.platform==="win32"?spawnSync("powershell.exe",["-NoProfile","-NonInteractive","-Command",`(Get-CimInstance Win32_Process -Filter "ProcessId=${pid}").CreationDate.ToUniversalTime().Ticks`],{encoding:"utf8",timeout:2e3,windowsHide:!0}):spawnSync("ps",["-p",String(pid),"-o","lstart="],{encoding:"utf8",timeout:2e3});return result.status===0&&result.stdout.trim()||void 0}catch{return}}function isProcessOwnerAlive(owner){if(!isAlive(owner.pid))return!1;if(typeof owner.processIdentity!="string")return!0;let current=processIdentity(owner.pid);return current===void 0||current===owner.processIdentity}function isAlive(pid){if(!Number.isSafeInteger(pid)||!pid||pid<=0)return!1;try{if(process.kill(pid,0),process.platform==="linux")try{return!linuxProcessExited(linuxProcessStat(pid))}catch{return!0}return!0}catch(error48){return error48.code==="EPERM"}}function isProcessGroupAlive(group){if(!Number.isSafeInteger(group)||group<1)return!1;if(process.platform==="win32")return!0;let probe=()=>{try{return process.kill(-group,0),!0}catch(error48){return error48.code==="ESRCH"?!1:void 0}},present=probe();if(present!==!0)return present!==!1;if(process.platform!=="linux")return!0;let exitedMembers=()=>{let members=new Set;try{for(let name of readdirSync("/proc"))if(/^\d+$/.test(name))try{let stat4=linuxProcessStat(Number(name));if(stat4.group!==group)continue;if(!linuxProcessExited(stat4))return;members.add(`${name}:${stat4.identity}`)}catch(error48){if(!["ENOENT","ESRCH"].includes(error48.code??""))return}return members}catch{return}},first=exitedMembers();if(!first)return!0;let second=exitedMembers();return second?first.size&&first.size===second.size&&[...first].every(pid=>second.has(pid))?!1:probe()!==!1:!0}var init_process=__esm({"../daemon-core/dist/process.js"(){"use strict"}});import{join}from"node:path";import{homedir}from"node:os";import{createHash as createHash2}from"node:crypto";function hashKey(key){return createHash2("sha256").update(key).digest("hex").slice(0,16)}function keyedDir(subdir){return join(DAEMON_HOME,subdir)}function keyedConfigFile(subdir,key){return join(keyedDir(subdir),`${hashKey(key)}.json`)}var DAEMON_HOME,init_paths=__esm({"../daemon-core/dist/paths.js"(){"use strict";DAEMON_HOME=join(homedir(),".mearl")}});import{closeSync,existsSync,linkSync,openSync,statSync,mkdirSync,readFileSync as readFileSync2,writeFileSync,renameSync,rmSync,readdirSync as readdirSync2}from"node:fs";import{dirname,join as join2}from"node:path";import{randomUUID as randomUUID2}from"node:crypto";function ensureDir(dir){existsSync(dir)||mkdirSync(dir,{recursive:!0,mode:448})}function pauseForLock(){Atomics.wait(lockWaitBuffer,0,0,LOCK_WAIT_MS)}function readRecordUnlocked(file2){try{if(!existsSync(file2))return null;let parsed=JSON.parse(readFileSync2(file2,"utf-8"));return parsed&&typeof parsed.pid=="number"?parsed:null}catch{return null}}function removeRecordUnlocked(file2){rmSync(file2,{force:!0})}function writeRecordUnlocked(file2,record4){let tmp=`${file2}.${process.pid}.${randomUUID2()}.tmp`;try{writeFileSync(tmp,JSON.stringify(record4),{mode:384}),renameSync(tmp,file2)}catch(error48){try{rmSync(tmp,{force:!0})}catch{}throw error48}}function removeStaleLock(lockDir){let ownerFile=join2(lockDir,"owner.json"),owner=readRecordUnlocked(ownerFile);if(owner){if(isAlive(owner.pid))return!1}else try{if(Date.now()-statSync(lockDir).mtimeMs<OWNER_WRITE_GRACE_MS)return!1}catch{return!0}try{return rmSync(lockDir,{recursive:!0,force:!0}),!0}catch{return!1}}function withRecordLock(file2,operation){ensureDir(dirname(file2));let lockDir=`${file2}.registry.lock`,ownerFile=join2(lockDir,"owner.json"),token=randomUUID2(),deadline=Date.now()+LOCK_TIMEOUT_MS;for(;;){try{mkdirSync(lockDir,{mode:448})}catch(error48){if(error48.code!=="EEXIST")throw error48;if(!removeStaleLock(lockDir)){if(Date.now()>=deadline)throw new Error(`Timed out waiting for registry lock: ${file2}`,{cause:error48});pauseForLock()}continue}let ownerFd=null;try{ownerFd=openSync(ownerFile,"wx",384),writeFileSync(ownerFd,JSON.stringify({pid:process.pid,token}))}catch(error48){if(ownerFd!==null&&closeSync(ownerFd),ownerFd=null,error48.code==="EEXIST"){if(Date.now()>=deadline)throw new Error(`Timed out acquiring registry lock: ${file2}`,{cause:error48});pauseForLock();continue}throw error48}finally{ownerFd!==null&&closeSync(ownerFd)}try{return operation()}finally{readRecordUnlocked(ownerFile)?.token===token&&rmSync(lockDir,{recursive:!0,force:!0})}}}function writeRecord(file2,record4){withRecordLock(file2,()=>writeRecordUnlocked(file2,record4))}function claimRecord(file2,record4){return withRecordLock(file2,()=>{let candidate=`${file2}.${process.pid}.${randomUUID2()}.claim`;try{return writeFileSync(candidate,JSON.stringify(record4),{mode:384}),linkSync(candidate,file2),!0}catch(error48){if(error48.code==="EEXIST")return!1;throw error48}finally{rmSync(candidate,{force:!0})}})}function readRecord(file2){return readRecordUnlocked(file2)}function removeRecord(file2){try{withRecordLock(file2,()=>removeRecordUnlocked(file2))}catch{}}function removeRecordIfPid(file2,pid){try{return withRecordLock(file2,()=>readRecordUnlocked(file2)?.pid!==pid?!1:(removeRecordUnlocked(file2),!0))}catch{return!1}}function writeRecordIfPid(file2,pid,record4){return withRecordLock(file2,()=>readRecordUnlocked(file2)?.pid!==pid?!1:(writeRecordUnlocked(file2,record4),!0))}function removeInvalidRecord(file2){try{return withRecordLock(file2,()=>!existsSync(file2)||readRecordUnlocked(file2)?!1:(removeRecordUnlocked(file2),!0))}catch{return!1}}function listRecordFiles(dir){try{return readdirSync2(dir).filter(name=>name.endsWith(".json")).map(name=>join2(dir,name))}catch{return[]}}function readLiveRecords(dir){let out=[];for(let file2 of listRecordFiles(dir)){let rec=readRecord(file2);rec&&isAlive(rec.pid)?out.push(rec):rec?removeRecordIfPid(file2,rec.pid):removeInvalidRecord(file2)}return out}var LOCK_WAIT_MS,LOCK_TIMEOUT_MS,OWNER_WRITE_GRACE_MS,lockWaitBuffer,init_registry=__esm({"../daemon-core/dist/registry.js"(){"use strict";init_process();LOCK_WAIT_MS=10,LOCK_TIMEOUT_MS=5e3,OWNER_WRITE_GRACE_MS=1e3,lockWaitBuffer=new Int32Array(new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT))}});import{existsSync as existsSync2,statSync as statSync2,renameSync as renameSync2,readFileSync as readFileSync3,readdirSync as readdirSync3,rmSync as rmSync2}from"node:fs";import{join as join3}from"node:path";function pruneOrphanLogs(directory,retentionMs=7*864e5){try{for(let entry of readdirSync3(directory,{withFileTypes:!0})){let match=/^([a-f0-9]{16})\.log(?:\.1)?$/.exec(entry.name);if(!entry.isFile()||!match||existsSync2(join3(directory,`${match[1]}.json`)))continue;let file2=join3(directory,entry.name);try{Date.now()-statSync2(file2).mtimeMs>=retentionMs&&rmSync2(file2,{force:!0})}catch{}}}catch{}}function rotateLogIfNeeded(logFile,maxBytes=DEFAULT_MAX_LOG_BYTES){try{if(!existsSync2(logFile)||statSync2(logFile).size<maxBytes)return;renameSync2(logFile,`${logFile}.1`)}catch{}}var DEFAULT_MAX_LOG_BYTES,init_log=__esm({"../daemon-core/dist/log.js"(){"use strict";DEFAULT_MAX_LOG_BYTES=5*1024*1024}});import{spawn}from"node:child_process";import{closeSync as closeSync2,openSync as openSync2}from"node:fs";import{dirname as dirname2}from"node:path";var init_daemon=__esm({"../daemon-core/dist/daemon.js"(){"use strict";init_process();init_registry();init_log()}});import fs from"node:fs";import path from"node:path";import{spawn as spawn2}from"node:child_process";function isExecutable(filePath,platform=process.platform){try{return fs.accessSync(filePath,platform==="win32"?fs.constants.F_OK:fs.constants.X_OK),!0}catch{return!1}}function executableNames(name,platform=process.platform){return platform==="win32"?[`${name}.cmd`,`${name}.exe`,name]:[name]}function versionManagerExecutableCandidates(home,names,options={}){let env=options.env??process.env,platform=options.platform??process.platform,readdirSync8=options.readdirSync??fs.readdirSync,fnmDefaultRoot=env.XDG_DATA_HOME?path.join(env.XDG_DATA_HOME,"fnm"):platform==="darwin"?path.join(home,"Library","Application Support","fnm"):platform==="win32"&&env.APPDATA?path.join(env.APPDATA,"fnm"):path.join(home,".local","share","fnm");return[path.join(env.NVM_DIR||path.join(home,".nvm"),"versions","node"),path.join(env.FNM_DIR||fnmDefaultRoot,"node-versions"),path.join(home,".fnm","node-versions")].filter((root,index,all)=>all.indexOf(root)===index).flatMap(root=>{try{return readdirSync8(root,{withFileTypes:!0}).filter(entry=>entry.isDirectory()).sort((left,right)=>right.name.localeCompare(left.name,void 0,{numeric:!0})).flatMap(entry=>names.flatMap(name=>[path.join(root,entry.name,"bin",name),path.join(root,entry.name,"installation","bin",name)]))}catch{return[]}})}function resolveSpawnCommand(executable,args,platform=process.platform,commandInterpreter=process.env.ComSpec){return platform==="win32"&&/\.(?:cmd|bat)$/i.test(executable)?{command:commandInterpreter||"cmd.exe",args:["/d","/s","/c",executable,...args]}:{command:executable,args}}function prependCommandPath(command,env=process.env){return path.isAbsolute(command)?prependPathDirectory(path.dirname(command),env):env}function prependNodePath(env=process.env,nodeExecutable=process.execPath){return prependPathDirectory(path.dirname(nodeExecutable),env)}function prependPathDirectory(directory,env=process.env){let pathKey=Object.keys(env).find(key=>key.toLowerCase()==="path")||"PATH",entries=(env[pathKey]||"").split(path.delimiter).filter(Boolean);return entries.includes(directory)?env:{...env,[pathKey]:[directory,...entries].join(path.delimiter)}}function findExecutable(name,options={}){let env=options.env??process.env,platform=options.platform??process.platform,existsSync12=options.existsSync??(candidate=>isExecutable(candidate,platform)),pathKey=Object.keys(env).find(key=>key.toLowerCase()==="path")||"PATH",directories=[...options.extraDirectories??[],...(env[pathKey]??"").split(path.delimiter).filter(Boolean)];for(let directory of directories)for(let executableName of executableNames(name,platform)){let candidate=path.join(directory,executableName);if(existsSync12(candidate))return candidate}return null}var MAX_CAPTURE_LENGTH,runCommand,init_command=__esm({"../daemon-core/dist/command.js"(){"use strict";MAX_CAPTURE_LENGTH=1e6;runCommand=(command,args,options={})=>new Promise((resolve11,reject)=>{let capture=options.capture===!0||options.tee===!0,launch=resolveSpawnCommand(command,args),child=spawn2(launch.command,launch.args,{cwd:options.cwd,env:options.env,stdio:capture?[options.tee?"inherit":"ignore","pipe","pipe"]:"inherit",windowsHide:!0}),stdout="",stderr="",settled=!1,append=(current,chunk)=>options.tee?(current+chunk).slice(-MAX_CAPTURE_LENGTH):current.length>=MAX_CAPTURE_LENGTH?current:(current+chunk).slice(0,MAX_CAPTURE_LENGTH),finish=(error48,code=1)=>{settled||(settled=!0,timer&&clearTimeout(timer),error48?reject(error48):resolve11({code,stdout,stderr}))},timer=options.timeoutMs===void 0?void 0:setTimeout(()=>{child.kill("SIGTERM"),finish(new Error(`Command timed out after ${options.timeoutMs}ms`))},options.timeoutMs);capture&&(child.stdout?.setEncoding("utf8").on("data",chunk=>{stdout=append(stdout,chunk),options.tee&&process.stdout.write(chunk)}),child.stderr?.setEncoding("utf8").on("data",chunk=>{stderr=append(stderr,chunk),options.tee&&process.stderr.write(chunk)})),child.once("error",error48=>finish(error48)),child.once("close",code=>finish(void 0,code??1))})}});var init_dist=__esm({"../daemon-core/dist/index.js"(){"use strict";init_process();init_paths();init_registry();init_log();init_daemon();init_command()}});function record(value){return value!==null&&typeof value=="object"&&!Array.isArray(value)}function invalid(path27){throw new Error(`Invalid app profile: ${path27}`)}function text(value){return typeof value=="string"&&value.length<=4096&&Array.from(value).every(character=>character.charCodeAt(0)>8)}function strings(value){return Array.isArray(value)&&value.length<=200&&value.every(text)}function fields(value,required2,optional2,path27){(!record(value)||required2.some(key=>!Object.hasOwn(value,key))||Object.keys(value).some(key=>!required2.includes(key)&&!optional2.includes(key)))&&invalid(path27)}function stringMap(value){return record(value)&&Object.keys(value).length<=200&&Object.values(value).every(text)}function json(value,depth=0){return depth>25?!1:value===null||typeof value=="boolean"||text(value)?!0:typeof value=="number"?Number.isFinite(value):Array.isArray(value)?value.length<=1e3&&value.every(item=>json(item,depth+1)):record(value)&&Object.entries(value).every(([key,item])=>!["__proto__","prototype","constructor"].includes(key)&&json(item,depth+1))}function validateActions(value){let arrays=["open","close","title","navigationBar","statusBar","systemInfo","mtop","kvGet","kvSet","kvDelete","pageContext","noop","silent"];fields(value,["open","close","title","systemInfo","mtop","noop"],[...arrays,"responses","behaviors"],"actions");for(let key of arrays)value[key]!==void 0&&!strings(value[key])&&invalid(`actions.${key}`);value.responses!==void 0&&!record(value.responses)&&invalid("actions.responses"),value.behaviors!==void 0&&(!stringMap(value.behaviors)||!Object.values(value.behaviors).every(item=>BEHAVIORS.has(item)))&&invalid("actions.behaviors")}function validateAppProfileDefinition(value){json(value)||invalid("JSON"),JSON.stringify(value).length>65536&&invalid("definition exceeds 64 KiB"),fields(value,["name","label","appName","defaultAppVersion","uaTokens","globals","bridges","activeEvents","actions","schemes"],["uaFamily","uaTemplate","policies","settings","settingsGroup","miniProgram","imagePicker","geolocation","urlSyncHostSuffixes","overlay","popBeforeOpenParam","messageEvent","nativeBack","layerUrlProxy","rootContainer","titleBarHiddenPathnames","statusBarBackgroundColors","titleBarHostStyles","forceH5Mtop"],"definition");for(let key of["name","label","appName","defaultAppVersion"])(!text(value[key])||!value[key])&&invalid(key);/^[a-z][a-z0-9-]*(?:\/[a-z][a-z0-9-]*)?$/.test(value.name)||invalid("name");for(let key of["uaTokens","activeEvents","urlSyncHostSuffixes","titleBarHiddenPathnames"])value[key]!==void 0&&!strings(value[key])&&invalid(key);stringMap(value.globals)||invalid("globals"),(!Array.isArray(value.bridges)||value.bridges.length>20)&&invalid("bridges");let globals=new Set;for(let bridge of value.bridges)fields(bridge,["global","style"],["persistent"],"bridges"),(!text(bridge.global)||!/^[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)*$/.test(bridge.global)||bridge.global.split(".").some(part=>["__proto__","prototype","constructor"].includes(part))||globals.has(bridge.global)||!BRIDGE_STYLES.has(bridge.style)||bridge.persistent!==void 0&&typeof bridge.persistent!="boolean")&&invalid("bridge"),globals.add(bridge.global);if(validateActions(value.actions),value.settingsGroup!==void 0&&!["fliggy","alipay"].includes(value.settingsGroup)&&invalid("settingsGroup"),value.uaFamily!==void 0&&!["aliapp","wechatMiniProgram"].includes(value.uaFamily)&&invalid("uaFamily"),value.uaTemplate!==void 0&&(fields(value.uaTemplate,["ios","android"],[],"uaTemplate"),(!text(value.uaTemplate.ios)||!text(value.uaTemplate.android))&&invalid("uaTemplate")),value.policies!==void 0){fields(value.policies,[],["titleBar","navigatorLanguage","networkResult","languages","defaultLanguage"],"policies");let p=value.policies;p.titleBar!==void 0&&!["default","taobao","fliggy","alipay","wechat"].includes(p.titleBar)&&invalid("policies.titleBar"),p.networkResult!==void 0&&!["default","alipay"].includes(p.networkResult)&&invalid("policies.networkResult"),p.navigatorLanguage!==void 0&&typeof p.navigatorLanguage!="boolean"&&invalid("policies.navigatorLanguage"),p.languages!==void 0&&(!strings(p.languages)||!p.languages.length)&&invalid("policies.languages"),p.defaultLanguage!==void 0&&(!text(p.defaultLanguage)||p.languages&&!p.languages.includes(p.defaultLanguage))&&invalid("policies.defaultLanguage")}(!Array.isArray(value.schemes)||value.schemes.length>100)&&invalid("schemes");for(let rule of value.schemes){fields(rule,["match"],["hostSuffixes","param","useCurrentOrigin","targetPath","targetHostPrefix","targetParams"],"scheme");for(let key of["match","param","targetPath","targetHostPrefix"])rule[key]!==void 0&&!text(rule[key])&&invalid(`scheme.${key}`);rule.hostSuffixes!==void 0&&!strings(rule.hostSuffixes)&&invalid("scheme.hostSuffixes"),rule.useCurrentOrigin!==void 0&&typeof rule.useCurrentOrigin!="boolean"&&invalid("scheme.useCurrentOrigin"),rule.targetParams!==void 0&&!stringMap(rule.targetParams)&&invalid("scheme.targetParams")}if(value.settings!==void 0){(!Array.isArray(value.settings)||value.settings.length>30)&&invalid("settings");let ids=new Set;for(let setting of value.settings){if(fields(setting,["id","label","type","target"],["choices","minimum","maximum"],"setting"),(!text(setting.id)||!/^[a-z][a-zA-Z0-9-]*$/.test(setting.id)||ids.has(setting.id)||!text(setting.label)||!["select","boolean","number","text","json"].includes(setting.type))&&invalid("setting"),ids.add(setting.id),record(setting.target)&&setting.target.option!==void 0)fields(setting.target,["option"],[],"setting.target"),setting.target.option!=="language"&&invalid("setting.target.option");else{fields(setting.target,["method"],["field"],"setting.target"),(!text(setting.target.method)||!setting.target.method||["__proto__","prototype","constructor"].includes(setting.target.method)||setting.target.field!==void 0&&(!text(setting.target.field)||["__proto__","prototype","constructor"].includes(setting.target.field)))&&invalid("setting.target.method");let method=setting.target.method;["open","close","title","navigationBar","statusBar","systemInfo","mtop","kvGet","kvSet","kvDelete","pageContext"].some(key=>value.actions[key]?.includes(method))&&invalid("setting targets a structural method")}setting.choices!==void 0&&(!Array.isArray(setting.choices)||!setting.choices.length||setting.choices.some(choice=>!record(choice)||!text(choice.label)||!text(choice.value)))&&invalid("setting.choices");for(let key of["minimum","maximum"])setting[key]!==void 0&&typeof setting[key]!="number"&&invalid(`setting.${key}`);setting.type==="select"&&!Array.isArray(setting.choices)&&invalid("setting.choices required"),setting.minimum!==void 0&&setting.maximum!==void 0&&setting.minimum>setting.maximum&&invalid("setting range"),"option"in setting.target&&!["select","text"].includes(setting.type)&&invalid("setting.option type")}}for(let key of["forceH5Mtop"])value[key]!==void 0&&typeof value[key]!="boolean"&&invalid(key);for(let key of["popBeforeOpenParam","messageEvent"])value[key]!==void 0&&!text(value[key])&&invalid(key);return value.statusBarBackgroundColors!==void 0&&!stringMap(value.statusBarBackgroundColors)&&invalid("statusBarBackgroundColors"),validateStructuredOptions(value),JSON.parse(JSON.stringify(value))}function validateStructuredOptions(value){let shapes={nativeBack:[[],["event","controlFunction","handler"]],geolocation:[["reverseGeocodeApi","version"],[]],layerUrlProxy:[["sourceHostPrefix","pathPrefix","targetHostSuffixes"],["defaultTargetHost"]],imagePicker:[["schemes","api","version","fcId","fcGroup","uploadUrlFunction","prefix","region"],[]],overlay:[["enabledParam","topRatioParam","radiusParam","maskAlphaParam","tapCloseParam","defaultTopRatio","defaultRadius","defaultMaskAlpha","defaultTapClose"],["heightRatioParam","tapCloseSelectors","silentTapClose","maxWidthPx","maxWidthMinAppVersion"]]};for(let[key,[required2,optional2]]of Object.entries(shapes))if(value[key]!==void 0){fields(value[key],required2,optional2,key);for(let[field,item]of Object.entries(value[key]))(field==="maxWidthPx"?typeof item=="number"&&Number.isFinite(item)&&item>0:field==="maxWidthMinAppVersion"?typeof item=="string"&&/^\d+(?:\.\d+)*$/.test(item):field.startsWith("default")&&field!=="defaultTargetHost"?field==="defaultTapClose"?typeof item=="boolean":typeof item=="number":field==="silentTapClose"?typeof item=="boolean":["schemes","targetHostSuffixes","tapCloseSelectors"].includes(field)?strings(item):text(item))||invalid(`${key}.${field}`)}if(value.rootContainer!==void 0&&(fields(value.rootContainer,[],["statusBarHeightCookie"],"rootContainer"),value.rootContainer.statusBarHeightCookie!==void 0&&(fields(value.rootContainer.statusBarHeightCookie,["name"],["domain","path"],"rootContainer.statusBarHeightCookie"),Object.values(value.rootContainer.statusBarHeightCookie).every(text)||invalid("rootContainer.statusBarHeightCookie"))),value.titleBarHostStyles!==void 0&&(!Array.isArray(value.titleBarHostStyles)||value.titleBarHostStyles.some(rule=>(fields(rule,["hostSuffix"],["titleBarBackgroundColor","statusBarBackgroundColor"],"titleBarHostStyle"),!Object.values(rule).every(text))))&&invalid("titleBarHostStyles"),value.miniProgram!==void 0){fields(value.miniProgram,[],["paymentRoutes","nativeRoutes","messageRules"],"miniProgram");let shapes2={paymentRoutes:[["pathname","paymentParamsParam","successUrlParams","failureUrlParams"],["hostSuffixes","successResultParam","forwardParams","useCurrentOrigin"]],nativeRoutes:[["pathname","actions"],["hostSuffixes"]],messageRules:[["type","action"],["hostSuffixes"]]};for(let[key,list]of Object.entries(value.miniProgram)){(!Array.isArray(list)||list.length>100)&&invalid(`miniProgram.${key}`);for(let rule of list){fields(rule,...shapes2[key],`miniProgram.${key}`);for(let[field,item]of Object.entries(rule))(["hostSuffixes","successUrlParams","failureUrlParams","forwardParams","actions"].includes(field)?!strings(item):field==="useCurrentOrigin"?typeof item!="boolean":!text(item))&&invalid(`miniProgram.${key}.${field}`);key==="messageRules"&&!["stageBackData","closeAll"].includes(rule.action)&&invalid("miniProgram.messageRules.action"),key==="nativeRoutes"&&!rule.actions.every(action=>["navigateMiniProgram","subscribeMessage"].includes(action))&&invalid("miniProgram.nativeRoutes.actions")}}}}function validateAppProfileContribution(value){if(value===void 0)return;fields(value,["version","profiles"],[],"contribution"),(value.version!==1||!Array.isArray(value.profiles)||!value.profiles.length||value.profiles.length>20)&&invalid("contribution");let profiles=value.profiles.map(validateAppProfileDefinition);return JSON.stringify(profiles).length>256e3&&invalid("contribution exceeds 256 KiB"),profiles.some(profile=>profile.name.includes("/"))&&invalid("contribution names must be local identifiers"),new Set(profiles.map(profile=>profile.name)).size!==profiles.length&&invalid("duplicate profile name"),{version:1,profiles}}var BRIDGE_STYLES,APP_BRIDGE_BEHAVIORS,BEHAVIORS,init_app_profile_definition=__esm({"../client/dist/generated/app-profile-definition.js"(){"use strict";BRIDGE_STYLES=new Set(["windvane","fliggy","alipay","callback","btrip","invoke","callHandler","amap","didi","easybikeNative","mega","wechat","wechatMiniProgram"]),APP_BRIDGE_BEHAVIORS=["navigate","closeAll","closeBackData","postMessage","notifySubscribe","notifyUnsubscribe","notifyPost","sharedFileRead","sharedFileWrite","sharedDataGet","sharedDataSet","legacyBroadcastCreate","legacyBroadcastPost","legacyBroadcastClose","memoryGet","memorySet","memoryDelete","availabilityMap","userInfo","authCode","networkInfo","geolocation","permission","imagePicker","prefetch","fptTrack","mtopStream","previewFile","toast","unsupportedNativeInput","payment","userTrack","calendar","networkQualityMonitor","beaconRequest","voiceRecognition"],BEHAVIORS=new Set(APP_BRIDGE_BEHAVIORS)}});function parseToolboxIcon(value){if(typeof value!="string")return;let icon=value.trim();if(!icon||icon.length>32*1024)return;if(/^[a-z][a-z0-9-]{0,39}$/.test(icon))return{kind:"name",name:icon};if(/^(?:<\?xml\s[^>]*\?>\s*)?<svg\b[^>]*(?:\/>|>[\s\S]*<\/svg\s*>)$/i.test(icon)){let svg=/<svg\b[^>]*\sxmlns\s*=/i.test(icon)?icon:icon.replace(/<svg\b/i,'<svg xmlns="http://www.w3.org/2000/svg"');try{return{kind:"image",src:`data:image/svg+xml,${encodeURIComponent(svg)}`,.../\bcurrentColor\b/i.test(svg)?{monochrome:!0}:{}}}catch{return}}let dataHeader=/^data:image\/(?:svg\+xml|png|jpeg|gif|webp|avif)(?:;charset=utf-8|;utf8)?(?:;base64)?,/i.exec(icon);if(dataHeader&&icon.length>dataHeader[0].length)return{kind:"image",src:icon};try{let url2=new URL(icon);if(["http:","https:"].includes(url2.protocol)&&!url2.username&&!url2.password)return{kind:"image",src:url2.href}}catch{}}var init_toolbox_icon=__esm({"../client/dist/generated/toolbox-icon.js"(){"use strict"}});function resolvePageEvalExpression(params){if(typeof params.expression!="string"||!params.expression.trim())throw new Error("Invalid expression");if(params.args===void 0)return params.expression;if(!Array.isArray(params.args))throw new Error("page_eval args must be an array");return`(${params.expression})(...JSON.parse(${JSON.stringify(JSON.stringify(params.args))}))`}function validatePageUserScriptParams(params){if(!Number.isSafeInteger(params?.tabId)||params.tabId<0)throw new Error("Invalid target tab");if(typeof params.worldId!="string"||!/^[a-z][a-z0-9-]{0,63}$/.test(params.worldId))throw new Error("Invalid user script worldId");if(typeof params.code!="string"||!params.code.trim()||params.code.length>256*1024)throw new Error("User script code must be non-empty and within 256 KiB characters")}function actionRequiresTabId(action){return typeof action=="string"&&TAB_ID_REQUIRED_ACTION_SET.has(action)}function validateRequiredActionTabId(action,data){let cookieAction=action==="get_cookie"||action==="set_cookie";if(!actionRequiresTabId(action)&&!cookieAction)return;let input2=data&&typeof data=="object"&&!Array.isArray(data)?data:void 0,tabId=input2?.tabId;if(cookieAction&&tabId===void 0){if(action==="set_cookie"&&input2?.reload===!0)throw new Error("set_cookie: reload requires tabId");if(typeof input2?.url!="string"||!input2.url.trim())throw new Error(`${action}: specify url or tabId`);return}if(typeof tabId!="number"||!Number.isSafeInteger(tabId)||tabId<0)throw new Error(`${action} requires a numeric tabId. Call tab_open or tab_list to obtain a tabId.`)}function isBrowserCapabilityAction(value){return typeof value=="string"&&Object.hasOwn(BROWSER_CAPABILITY_ACTIONS,value)}var BROWSER_DEVICE_PRESET_NAMES,APP_PROFILE_NAMES,TAB_ID_REQUIRED_ACTIONS,TAB_ID_REQUIRED_ACTION_SET,PAGE_ACT_ACTIONS,EXTENSION_BROWSER_ACTIONS,BROWSER_CAPABILITY_ACTIONS,init_browser_action_protocol=__esm({"../client/dist/generated/browser-action-protocol.js"(){"use strict";BROWSER_DEVICE_PRESET_NAMES=["iphone-duo-folded","iphone-duo-unfolded","iphone-17-pro","iphone-17e","pixel-11","ipad-mini-a17-pro","galaxy-s26","pura-x-max","iphone-15-pro","iphone-se","pixel-8","ipad-mini","galaxy-s23"],APP_PROFILE_NAMES=["fliggy","taobao","wechat","tmall","alipay","koubei","taobao-tj","taobao-live","xianyu","etao","eleme","damai","btrip","amap","qianwen","lingyou","didi","easybike"];TAB_ID_REQUIRED_ACTIONS=["tab_checkpoint","capture_checkpoint","get_requests","get_logs","get_events","set_mock","get_mocks","page_screenshot","tab_close","page_click","page_drag","page_type","page_scroll","page_hover","page_eval","page_inspect","page_snapshot","page_press","page_wait","page_navigate","page_upload","page_download","page_frames","set_device_emulation","set_app_profile","set_timezone","run_actions"],TAB_ID_REQUIRED_ACTION_SET=new Set(TAB_ID_REQUIRED_ACTIONS);PAGE_ACT_ACTIONS=["page_click","page_drag","page_type","page_hover","page_scroll","page_press","page_upload","page_eval"],EXTENSION_BROWSER_ACTIONS={tab_checkpoint:!0,capture_checkpoint:!0,get_requests:!0,get_logs:!0,get_events:!0,set_mock:!0,get_mocks:!0,set_rule:!0,get_rules:!0,send_request:!0,send_mtop_request:!0,browser_release:!0,page_screenshot:!0,tab_open:!0,tab_close:!0,tab_list:!0,tab_group:!0,page_click:!0,page_drag:!0,page_type:!0,page_scroll:!0,page_hover:!0,page_eval:!0,page_runtime:!0,page_inspect:!0,page_snapshot:!0,page_press:!0,page_wait:!0,page_navigate:!0,page_upload:!0,page_frames:!0,set_device_emulation:!0,set_app_profile:!0,set_timezone:!0,get_cookie:!0,set_cookie:!0,request_domain_permission:!0,run_actions:!0},BROWSER_CAPABILITY_ACTIONS={...EXTENSION_BROWSER_ACTIONS,page_download:!0}}});var APP_PROFILE_NAME_LIST,DEVICE_PRESET_TYPE,PAGE_DIAGNOSTICS_PARAM,PAGE_OBSERVE_PARAM,PAGE_ACTION_RESULT,COMMANDS,COMMAND_MAP,init_commands=__esm({"../client/dist/commands.js"(){"use strict";init_browser_action_protocol();APP_PROFILE_NAME_LIST=APP_PROFILE_NAMES.join("/"),DEVICE_PRESET_TYPE=BROWSER_DEVICE_PRESET_NAMES.map(name=>JSON.stringify(name)).join(" | "),PAGE_DIAGNOSTICS_PARAM={name:"diagnostics",type:"object | boolean",description:"默认关闭;传 true 返回动作期间新增的 error logs/业务 requests,或传对象自定义通道与过滤",details:["logs: boolean | { level, limit, filter };true 默认采集 error 日志","requests: boolean | { count, filter, source, includeBody, includeHeaders, maxBodySize, fields, keysOnly }","events: boolean | { source, event_type, filter, limit, includeRaw };埋点需显式开启","各通道过滤字段同 get_logs / get_requests / get_events;observe=false 时仍返回诊断增量,但不等待 DOM/导航稳定"]},PAGE_OBSERVE_PARAM={name:"observe",type:"object | false",description:"默认开启 DOM/导航观察;传 false 关闭,不影响显式请求的 diagnostics",details:["quietMs: number,DOM 变化后的稳定窗口,默认 100ms","firstChangeTimeoutMs: number,无 DOM 变化时的观察窗口,默认 500ms","timeoutMs: number,DOM 观察阶段最大时间,默认 3000ms","navigationGraceMs: number,低信息量点击/按键的导航宽限,默认 1000ms;相关网络活动可延长宽限","navigationTimeoutMs: number,导航就绪最大等待时间,默认 15000ms","networkIdleMs: number,文档完成且相关请求归零后的静默时间,默认 500ms","contentReadyAfterMs: number,结构稳定兜底保护期,默认 min(5000, navigationTimeoutMs / 2),并限制在导航超时前"]},PAGE_ACTION_RESULT=["默认返回 { action, observation };action.success 只表示动作成功,业务效果需结合 observation 和目标状态判断。","observe=false 且未开启 diagnostics 时返回裸动作结果(如 { clicked: true }),没有 action/observation;开启 diagnostics 时返回 { action, diagnostics }。","包装结果中的 action.stage=precondition 表示未派发,省略 observation/diagnostics;dispatch-uncertain 表示可能已派发,先查看 action.attempt 与可用观察或最小快照核验,避免重复提交。失败以退出码 1 结束。","observation.effects 返回通知、控件和焦点增量,可直接复用 node.ref/selector;changed=true 且 effects 为空不表示失败。","effects.texts 按需返回普通可见文本的 selector/text,不代表可点击控件或业务成功;超限或覆盖不完整时仍提示补快照。","fullSnapshotRecommended/snapshotReasons 提示是否补充快照;openedTabs 返回可继续操作的 tabId 和 ready。navigation 模式的 ready 表示新页面就绪。","显式开启的诊断通道在 diagnostics 中返回动作期间增量,与 observe 独立。"],COMMANDS=[{name:"browser_control",description:"把控制会话交给用户;用户在 Mearl 浏览器管理页交还后重新观察页面",params:[{name:"operation",type:'"handoff" | "resume"',required:!0,description:"交给用户操作;resume 仅在用户明确交还后使用"},{name:"tabId",type:"number",description:"可选的目标页面"},{name:"reason",type:"string",description:"用户需要处理的事项"}],notes:["必须携带 --session;接管停止后续派发,已经发出的操作可能仍然生效。"]},{name:"page_download",description:"先监听再点击,等待下载完成并创建浏览器文件产物",outputFlag:!0,params:[{name:"tabId",type:"number",required:!0,description:"下载来源页面"},{name:"trigger",type:"object",required:!0,description:"page_click 参数,不含 tabId"},{name:"url",type:"string",description:"预期下载 URL;扩展无法通过 referrer 归属时需显式指定"},{name:"timeout",type:"number",description:"下载等待毫秒,默认 30000,范围 1000–300000"}],notes:["--output 把文件分块保存到调用方机器;未指定时返回 artifactId,可供 page_upload 复用。","共享 CDP 浏览器保持原下载目录;Chrome 未返回文件路径时明确报错。超时不能直接重复点击。"]},{name:"tab_checkpoint",description:"为目标标签页建立日志、请求和埋点增量边界",params:[{name:"tabId",type:"number",required:!0,description:"目标标签页 ID,从 tab_open 获取"}],examples:[`tab_checkpoint --payload '{"tabId":12345}'`]},{name:"get_requests",description:"获取最近的网络请求(mtop 或普通 xhr/fetch)",params:[{name:"tabId",type:"number",required:!0,description:"目标标签页 ID,从 tab_list 获取"},{name:"count",type:"number",description:"返回条数,默认 10"},{name:"source",type:'"mtop" | "requests" | "all"',description:"数据来源,不填时默认 mtop;all 返回全部业务请求"},{name:"filter",type:"string",description:"按 URL 或 API 名称过滤,支持正则"},{name:"since",type:"number",description:"只返回最近 N 秒内的请求"},{name:"after",type:"string",description:"只返回指定 tab checkpoint 或同类查询 cursor 之后的请求"},{name:"includeBody",type:"boolean",description:"是否包含请求/响应体;指定 fields 时默认 false,否则默认 true"},{name:"includeHeaders",type:"boolean",description:"是否包含请求/响应头,默认 false"},{name:"maxBodySize",type:"number",description:"单个请求/响应体最大字符数,默认 50000"},{name:"fields",type:"string[]",description:"从响应体提取指定字段路径,最多 100 个"},{name:"keysOnly",type:"boolean",description:"只返回数据结构,不返回叶子值"}],notes:["流式请求开始后即进入缓冲区;页面及 App 桥代发的 MTop SSE 都归入 mtop。无法归属当前页面 target 的 Service Worker 请求不在采集范围内。"],result:["nextCursor 用于同类查询续读,hasMore 表示还有数据,gap 表示缓冲区淘汰造成缺口;checkpoint cursor 可分别用于三类查询的初始边界。","省略正文时不返回 postData / responseBody 字段;指定 fields 后需要同时读取全文时显式传 includeBody:true。","isPending 标记未完成请求;SSE 的 responseBody 保存按序到达的 event/data/timestamp/duration 分片。敏感请求头返回脱敏值。"],examples:[`get_requests --payload '{"tabId":12345,"count":5}'`,`get_requests --payload '{"tabId":12345,"source":"mtop","filter":"cart"}'`]},{name:"get_logs",description:"获取浏览器控制台日志",params:[{name:"tabId",type:"number",required:!0,description:"目标标签页 ID,从 tab_list 获取"},{name:"limit",type:"number",description:"返回最新 N 条,默认 100"},{name:"level",type:"string",description:"按日志级别过滤:log/info/warn/error/all"},{name:"filter",type:"string",description:"按内容过滤,支持正则"},{name:"since",type:"number",description:"只返回最近 N 秒内的日志"},{name:"after",type:"string",description:"只返回指定 tab checkpoint 或同类查询 cursor 之后的日志"}],result:["nextCursor 用于同类查询续读,hasMore 表示还有数据,gap 表示缓冲区淘汰造成缺口;checkpoint cursor 可分别用于三类查询的初始边界。"],examples:[`get_logs --payload '{"tabId":12345,"limit":10,"level":"error"}'`]},{name:"get_events",description:"获取 RUM/aplus/ARMS 埋点事件",params:[{name:"tabId",type:"number",required:!0,description:"目标标签页 ID,从 tab_list 获取"},{name:"source",type:'"rum" | "aplus" | "arms" | "all"',description:"数据来源,默认 all"},{name:"event_type",type:"string",description:"按事件类型过滤,支持正则,如 CLK/PV"},{name:"filter",type:"string",description:"按 name 或 url 过滤,支持正则"},{name:"since",type:"number",description:"只返回最近 N 秒内的事件"},{name:"after",type:"string",description:"只返回指定 tab checkpoint 之后的事件"},{name:"limit",type:"number",description:"返回条数,默认 20"},{name:"includeRaw",type:"boolean",description:"返回完整 URL、_raw 和 _context;默认 false"}],notes:["tab_open 新页从首屏采集;既有页面首次查询才启用采集,需要刷新或重新触发埋点。同批事件不会被 limit 拆开。"],result:["nextCursor 用于同类查询续读,hasMore 表示还有数据,gap 表示缓冲区淘汰造成缺口;checkpoint cursor 可分别用于三类查询的初始边界。","captureStatus 为 armed/active/inactive;空结果附 hint 时按提示刷新或触发。默认去除 tracking URL query 与 _raw/_context,includeRaw=true 时保留。"],examples:[`get_events --payload '{"tabId":12345,"source":"aplus","event_type":"CLK","limit":10}'`,`get_events --payload '{"tabId":12345,"filter":"order","includeRaw":true,"limit":1}'`,`get_events --payload '{"tabId":12345,"source":"all","limit":20}'`]},{name:"set_mock",description:"设置 API mock 数据",params:[{name:"tabId",type:"number",required:!0,description:"目标标签页 ID,从 tab_list 获取"},{name:"apiName",type:"string",required:!0,description:"API 名称或正则表达式"},{name:"mockData",type:"object",description:"完整 mock 响应数据(与 fields 二选一)"},{name:"fields",type:"array",description:"按字段路径修改真实响应(与 mockData 二选一)"},{name:"enabled",type:"boolean",description:"是否启用,默认 true。false 时恢复真实数据"},{name:"duration",type:"number",description:"完整响应时长(毫秒):mock 的总耗时,绕过真实服务器精确控制"},{name:"conditions",type:"object",description:"请求 query/body 字段子集匹配;$index 从 0 开始指定调用顺序"}],notes:["启用时至少提供 mockData 或非空 fields;非空 fields 优先。fields 每项 { path: string, value: any },path 支持点号和数组索引。","相同 apiName 的多条无条件 Mock 会覆盖;conditions 子集匹配 query/body(含 data 内层),不同条件可共存;$index 从 0 起控制调用顺序,不参与字段匹配。","大字段可用顶层 @<绝对路径> 文件引用或 --payload-file;文件展开后仍受 Native Messaging 单条消息大小限制。"],examples:[`set_mock --payload '{"tabId":12345,"apiName":"mtop.cart.query","mockData":{"ret":["SUCCESS::调用成功"]}}'`,"set_mock --payload-file ./mock-data.json"]},{name:"get_mocks",description:"查看当前生效的 mock 列表",params:[{name:"tabId",type:"number",required:!0,description:"目标标签页 ID,从 tab_list 获取"},{name:"apiName",type:"string",description:"按 API 名称或正则表达式过滤"}],examples:[`get_mocks --payload '{"tabId":12345}'`]},{name:"set_rule",description:"添加浏览器请求规则;enabled=false 且传 ruleId 时彻底删除规则",params:[{name:"ruleId",type:"number",description:"删除时必填,从 get_rules 获取"},{name:"enabled",type:"boolean",description:"省略时添加;false 时按 ruleId 删除"},{name:"actionType",type:'"redirect" | "block" | "allow" | "upgradeScheme" | "modifyHeaders"',description:"添加时必填,规则动作"},{name:"filter",type:"string",description:"添加时必填,URL 过滤表达式"},{name:"redirectUrl",type:"string",description:"redirect 动作的目标 URL"},{name:"requestHeaders",type:"array",description:"modifyHeaders 动作的请求头修改列表",details:['每项 { header: string, operation: "set" | "append" | "remove", value?: string };set/append 需 value']},{name:"responseHeaders",type:"array",description:"modifyHeaders 动作的响应头修改列表",details:['每项 { header: string, operation: "set" | "append" | "remove", value?: string };set/append 需 value']},{name:"initiatorDomains",type:"string",description:"发起方域名过滤"},{name:"resourceTypes",type:"string[]",description:"资源类型过滤"},{name:"priority",type:"number",description:"规则优先级"},{name:"description",type:"string",description:"规则说明"}],notes:["扩展模式规则持久化;CDP 仅支持会话级 modifyHeaders 请求头 set,不支持响应头、initiatorDomains 或其他动作。Provider 是否支持以其能力声明为准。","扩展模式会检查规则请求 URL 和显式来源域名的访问权限;缺失时仍保存规则,返回 warnings 和 missingOrigins,不自动弹窗。可在请求规则页面授权,或按提示调用 request_domain_permission。复杂 URL 表达式无法完整推断域名时会提示手动检查。"],examples:[`set_rule --payload '{"actionType":"block","filter":"^https://example\\\\.com/ads/.*"}'`,`set_rule --payload '{"ruleId":42,"enabled":false}'`]},{name:"get_rules",description:"查看当前模式的请求规则;扩展模式包含 Options 面板配置的规则",examples:["get_rules"]},{name:"send_request",description:"发送 HTTP 请求,自动携带浏览器 Cookie,支持 multipart 和原始二进制上传",params:[{name:"url",type:"string",required:!0,description:"完整目标 URL"},{name:"method",type:"string",description:"HTTP 方法,默认 GET"},{name:"headers",type:"object",description:"自定义请求头"},{name:"params",type:"object",description:"URL 查询参数"},{name:"body",type:"any",description:"请求体(传对象时自动 JSON 序列化)"},{name:"bodyFile",type:"object",description:"原始二进制请求体:filePath 或 base64 二选一,可选 contentType(默认 application/octet-stream);与 body/formData/files 互斥"},{name:"formData",type:"object",description:"multipart 文本字段(值支持 string/number/boolean)"},{name:"files",type:"SendRequestFile[]",description:"multipart 文件,最多 20 个、总计不超过 40 MiB;Base64 文件总计不超过 7 MiB。每项传 fieldName 和绝对 filePath,或传 base64 + filename",details:["fieldName: string(必填);filePath: string 与 base64: string 二选一","filename: string,base64 时必填,filePath 时默认文件 basename","contentType: string(可选),默认按文件名推断 MIME,否则 application/octet-stream"]},{name:"withCookies",type:"boolean",description:"是否附加浏览器 Cookie,默认 true"},{name:"responseType",type:'"json" | "text" | "auto"',description:"响应解析方式,默认 auto"},{name:"timeout",type:"number",description:"超时毫秒数,默认 30000"}],notes:["仅用于非 BUC 请求;BUC 接口使用 mearl buc,不手工传 Token、DPoP 或 Ticket。","body 不能与 formData/files 组合;bodyFile 以原始字节发送,不包 multipart boundary,不能用于 GET/HEAD。","bodyFile.filePath 属于 native-host,最大 40 MiB;base64 解码后最大 7 MiB。multipart 不手工设置 Content-Type,由 Mearl 生成 boundary。","filePath 属于 native-host 所在机器;无法引用远端路径时用 base64。BUC 上传的路径属于插件执行宿主。"],result:["返回 status、statusText、headers、body、bodyType、attachedCookieCount;bodyType 为 json/text/base64,二进制 body 需解码后保存。"],examples:[`send_request --payload '{"url":"https://api.example.com/data","method":"GET"}'`,`send_request --payload '{"url":"https://api.example.com/upload","method":"POST","formData":{"folder":"assets"},"files":[{"fieldName":"file","filePath":"/absolute/path/image.png"}]}'`,`send_request --payload '{"url":"https://api.example.com/upload","method":"POST","bodyFile":{"filePath":"/absolute/path/image.png","contentType":"image/png"}}'`]},{name:"send_mtop_request",description:"使用目标浏览器 Cookie 发起 mtop 请求,自动处理签名和 token",params:[{name:"api",type:"string",required:!0,description:"mtop API 名称"},{name:"data",type:"object",description:"请求数据"},{name:"version",type:"string",description:"API 版本,默认 1.0"},{name:"method",type:"string",description:"HTTP 方法,默认 GET"},{name:"appKey",type:"string",description:"签名使用的 appKey,默认 12574478"},{name:"env",type:'"prod" | "pre"',description:"请求环境,默认 prod"},{name:"timeout",type:"number",description:"超时毫秒数,默认 10000"}],notes:["需要目标浏览器有对应登录态;Mearl 自动处理签名,不依赖页面脚本。api 以 mopen. 开头时使用 mopen 协议。","env=prod 使用 h5api.m.taobao.com,pre 使用 h5api.wapa.taobao.com。"],result:["返回 success、response、requestData;业务成功需检查 response.ret。"],examples:[`send_mtop_request --payload '{"api":"mtop.trade.order.detail","data":{"orderId":"123"}}'`]},{name:"browser_list",description:"列出所有浏览器及其连接状态、类型和 Provider 托管实例信息",summary:"列出本地及远端浏览器与连接状态",examples:["browser_list"]},{name:"browser_release",description:"释放当前浏览器的调试控制和会话级临时效果(含设备/时区模拟);不用于普通任务收尾,Provider 实例的行为以 mearl <providerId> 为准",params:[{name:"closeCreatedTabs",type:"boolean",description:"带 --session 时关闭会话创建的过程页,默认 false"},{name:"keepTabIds",type:"number[]",description:"保留的结果页面;复用的用户页面始终保留"},{name:"preserveEnvironment",type:"boolean",description:"带 --session 时默认 true,保留 Mock 与模拟现场;false 清理这些页面的环境"},{name:"keepArtifactIds",type:"string[]",description:"保留在浏览器宿主的文件产物;其余会话临时文件删除"}],notes:["带 --session 时可用于任务收尾,只释放该会话;未带会话时保留原浏览器级释放行为,活动会话存在时拒绝全局释放。"],summary:"释放浏览器调试控制和会话级临时效果",examples:["browser_release","browser_release --browser chrome-a"]},{name:"browser_launch",description:"启动本地 Chrome,或通过已注册 Provider 创建浏览器实例",params:[{name:"name",type:"string",description:"本地实例名称;使用 local Provider 时必填"},{name:"provider",type:"string",description:"运行环境,默认 local;可传 mearl --help 中展示的已注册 Provider ID"},{name:"providerOptions",type:"Record<string, JSON value>",description:"所选 Provider 声明的结构化启动参数;不能与顶层启动字段混用"},{name:"headless",type:"boolean",description:"本地 Provider 是否无头运行,默认 true"},{name:"userAgentMode",type:'"default" | "desktop"',description:"本地 UA 模式:default 使用默认 UA;desktop 使用匹配本机版本的 UA"},{name:"persistent",type:"boolean",description:"本地实例关闭后是否保留 Profile,默认 false"},{name:"url",type:"string",description:"登录完成后打开的初始页面"},{name:"executablePath",type:"string",description:"自定义 Chrome 可执行文件路径"},{name:"copyCookieDomains",type:'string[] | "mearl-services" | { presets?: ["mearl-services"]; domains?: string[] }',description:"从控制浏览器复制 Cookie:可传域名数组、Mearl 登录态预设,或组合预设与额外域名"}],examples:[`browser_launch --payload '{"provider":"brow","providerOptions":{}}'`,`browser_launch --payload '{"name":"figma","userAgentMode":"desktop","copyCookieDomains":["figma.com"]}'`,`browser_launch --payload '{"name":"with-cookies","copyCookieDomains":["example.com","sub.example.org"]}'`]},{name:"browser_close",description:"关闭指定托管浏览器,并按 Provider 策略保留或清理持久化数据",params:[{name:"browser",type:"string",required:!0,description:"托管浏览器的 browserId 或名称"},{name:"deleteProfile",type:"boolean",description:"强制删除持久化数据,默认 false"}],examples:[`browser_close --payload '{"browser":"managed:account-a"}'`,`browser_close --payload '{"browser":"account-b","deleteProfile":true}'`]},{name:"tab_open",description:"打开或按 URL 规则复用 Tab,并等待新页面加载完成",aliases:["tab_new","new_tab","tab_create","create_tab"],params:[{name:"url",type:"string",required:!0,description:"要打开的 URL"},{name:"active",type:"boolean",description:"是否激活目标 Tab,默认 false;扩展免打扰默认开启,使用后台焦点模拟,关闭后才切换前台;响应返回 activation"},{name:"openerTabId",type:"number",description:"来源 Tab ID;用于把目标 Tab 关联到来源侧边栏对话"},{name:"closeExisting",type:"boolean",description:"打开前先关闭 Agent 受控的已有标签页,默认 false"},{name:"group",type:"string",description:"把新 Tab 加入指定标题的标签页分组(同名分组存在则加入,否则新建)。仅扩展模式支持"},{name:"reuse",type:'"never" | "prefer" | "require"',description:"never 始终新开;prefer 优先复用;require 只允许复用。默认 never"},{name:"match",type:"object",description:"复用匹配规则:urlPattern(支持 *)、ignoreSearch、ignoreHash、onMultiple(error/first)"},{name:"restoreFocusOnClose",type:"boolean",description:"关闭本次新开的 active Tab 后恢复原活动标签页,默认 false"},{name:"emulation",type:"object",description:"开 tab 即进入移动端模拟态(首屏即移动态、无需 reload)。字段同 set_device_emulation 去掉 enabled/reload;与 appProfile、deviceShell=true、orientation=landscape、splitScreen=true 组合可首屏进入左右分屏"},{name:"appProfile",type:"string",description:'开 tab 即注入 App 客户端环境与 JSBridge;档案名同 set_app_profile,如 "fliggy"。需要 iframe WebView 和系统栏时同时传 emulation.deviceShell=true'},{name:"os",type:'"ios" | "android"',description:"与 appProfile 配合;容器系统,默认 ios"},{name:"bridgeConfig",type:"object",description:"与 appProfile 配合;声明式覆盖桥方法,形如 {methods:{api:{behavior|response|noop,silent?}}}"}],notes:["emulation / appProfile 只应用到新建 Tab;复用 Tab 要切换状态时用对应设置 action。","closeExisting 不能与复用或 openerTabId 组合;多匹配默认报错,match.onMultiple=first 可显式选择第一个。"],result:["返回 tabId、url、title、opened/reused;reused=true 的既有页面应保留。","active=true 时 activation 包含 tabActive、windowFocused、windowState、visibilityState;emulation 返回实际生效配置。","capture.cursor 是导航前诊断边界,可分别用于 get_logs/get_requests/get_events 的 after。"],examples:[`tab_open --payload '{"url":"https://example.com"}'`,`tab_open --payload '{"url":"https://example.com/page","reuse":"prefer","match":{"ignoreSearch":true}}'`,`tab_open --payload '{"url":"https://m.example.com","emulation":{"preset":"iphone-17-pro"}}'`,`tab_open --payload '{"url":"https://market.m.taobao.com/app/trip/rx-home/pages/home","appProfile":"fliggy"}'`,`tab_open --payload '{"url":"https://market.m.taobao.com/app/trip/rx-home/pages/home","appProfile":"fliggy","emulation":{"preset":"ipad-mini-a17-pro","orientation":"landscape","deviceShell":true,"splitScreen":true}}'`,`tab_open --payload '{"url":"https://example.com","appProfile":"fliggy","os":"android"}'`,`tab_open --payload '{"url":"https://example.com","group":"验证任务"}'`]},{name:"tab_close",description:"关闭指定标签页",aliases:["tab_remove","remove_tab","tab_delete","delete_tab"],params:[{name:"tabId",type:"number",required:!0,description:"要关闭的标签页 ID"}],examples:[`tab_close --payload '{"tabId":123}'`]},{name:"tab_list",description:"列出目标浏览器所有窗口中的标签页",aliases:["tabs","list_tabs","show_tabs"],examples:["tab_list"]},{name:"tab_group",description:"把同一窗口中的标签页加入分组,或通过 ungroup 取消分组并保留标签页;仅扩展模式支持",params:[{name:"tabIds",type:"number[]",required:!0,description:"标签页 ID,分组最多 100 个,取消分组最多 1000 个"},{name:"title",type:"string",required:!1,description:"分组标题;取消分组时省略"},{name:"ungroup",type:"boolean",required:!1,description:"为 true 时取消分组并保留标签页"}],examples:[`tab_group --payload '{"tabIds":[123,124],"title":"项目文档"}'`,`tab_group --payload '{"tabIds":[123,124],"ungroup":true}'`]},{name:"page_click",description:"点击页面元素,支持 CSS/@ref、可见文本或视口坐标定位",params:[{name:"selector",type:"string",description:"原生 CSS 选择器,或 page_snapshot / 页面动作 observation 返回的 @eN ref(必须带 @ 前缀)。不支持 :has-text/:visible 等 Playwright 私有伪类"},{name:"text",type:"string",description:"按可见文本(accessibility name)定位。需要时配合 role/exact 消歧;多匹配会报错并列出候选"},{name:"point",type:"{ x: number; y: number }",description:'按视口坐标点击(CSS 像素)。默认使用 outer-viewport;容器或 iframe 内坐标配合 coordinateSpace: "active-frame"'},{name:"frameId",type:"string",description:"浏览器扩展后端:显式指定 CSS/text 查询或 active-frame 坐标所属的 frame;省略时容器模式自动使用当前业务 frame"},{name:"coordinateSpace",type:'"outer-viewport" | "active-frame"',description:"仅配合 point 使用;默认 outer-viewport;浏览器扩展后端的 active-frame 会换算 iframe 偏移与缩放后派发可信输入"},{name:"role",type:"string",description:"配合 text 使用,按 AX role 过滤(如 button、link、heading)"},{name:"exact",type:"boolean",description:"配合 text 使用,默认 true 精确匹配;false 时按子串匹配"},{name:"scope",type:"string",description:"配合 text 使用,把文本匹配限制在指定 CSS 元素或 @eN ref 子树内,适合消除重复文案歧义"},{name:"clickMode",type:'"auto" | "dom" | "mouse" | "touch"',description:"默认 auto:可见页使用匹配设备的可信输入,隐藏页使用 DOM;dom/mouse/touch 可强制指定派发方式"},PAGE_OBSERVE_PARAM,PAGE_DIAGNOSTICS_PARAM,{name:"tabId",type:"number",required:!0,description:"目标标签页 ID"}],result:PAGE_ACTION_RESULT,notes:["selector / text / point 必须且只能提供一个。隐藏页 auto 使用 DOM;只有明确依赖真实用户手势时才激活页面。","原生 select 可按 option 文本点击;checkbox/radio 返回 controlState.checkedBefore/checkedAfter。"],examples:[`page_click --payload '{"tabId":12345,"text":"提交"}'`,`page_click --payload '{"tabId":12345,"text":"退款明细","role":"button"}'`,`page_click --payload '{"tabId":12345,"text":"确定","scope":"@e12"}'`,`page_click --payload '{"tabId":12345,"selector":"@e3"}'`,`page_click --payload '{"tabId":12345,"selector":".submit-btn"}'`,`page_click --payload '{"tabId":12345,"selector":".gesture-btn","clickMode":"touch"}'`,`page_click --payload '{"tabId":12345,"point":{"x":336,"y":117}}'`,`page_click --payload '{"tabId":12345,"point":{"x":196,"y":240},"coordinateSpace":"active-frame"}'`]},{name:"page_drag",description:"拖动页面元素或视口坐标,适用于轮播图、滑块和拖放",params:[{name:"from",type:"string | { x: number; y: number }",required:!0,description:"起点:原生 CSS、@eN ref,或 { x, y } 视口坐标(CSS 像素)"},{name:"to",type:"string | { x: number; y: number }",required:!0,description:"终点:原生 CSS、@eN ref,或 { x, y } 视口坐标(CSS 像素)"},{name:"dragMode",type:'"auto" | "dom" | "mouse" | "touch"',description:"默认 auto:可见页使用匹配设备的可信输入,隐藏页使用 DOM;dom/mouse/touch 可强制指定派发方式"},{name:"durationMs",type:"number",description:"拖动持续时间,0–5000ms,默认 400ms;内部自动分段移动"},PAGE_OBSERVE_PARAM,PAGE_DIAGNOSTICS_PARAM,{name:"tabId",type:"number",required:!0,description:"目标标签页 ID"}],result:PAGE_ACTION_RESULT,notes:["起点会自动滚入视口,终点必须同时位于当前视口;否则先滚动页面。隐藏页 auto 使用 DOM,不切换活动页。"],examples:[`page_drag --payload '{"tabId":12345,"from":{"x":350,"y":80},"to":{"x":80,"y":80}}'`,`page_drag --payload '{"tabId":12345,"from":"@e3","to":"#drop-zone","dragMode":"mouse"}'`]},{name:"page_type",description:"向输入框填写文本,兼容 React 受控组件",params:[{name:"selector",type:"string",required:!0,description:"原生 CSS 选择器,或 page_snapshot / 页面动作 observation 返回的 @eN ref(必须带 @ 前缀)"},{name:"text",type:"string",required:!0,description:"要填写的文本"},{name:"clearFirst",type:"boolean",description:"是否先清空原有内容,默认 true"},PAGE_OBSERVE_PARAM,PAGE_DIAGNOSTICS_PARAM,{name:"tabId",type:"number",required:!0,description:"目标标签页 ID"}],result:PAGE_ACTION_RESULT,examples:[`page_type --payload '{"tabId":12345,"selector":"@e6","text":"搜索关键词"}'`]},{name:"page_hover",description:"将鼠标悬停在页面元素上",params:[{name:"selector",type:"string",required:!0,description:"原生 CSS 选择器,或 page_snapshot / 页面动作 observation 返回的 @eN ref(必须带 @ 前缀)"},PAGE_OBSERVE_PARAM,PAGE_DIAGNOSTICS_PARAM,{name:"tabId",type:"number",required:!0,description:"目标标签页 ID"}],result:PAGE_ACTION_RESULT,examples:[`page_hover --payload '{"tabId":12345,"selector":".nav-menu"}'`]},{name:"page_scroll",description:"滚动页面或指定容器;页面根不可滚动时自动发现活动滚动区",params:[{name:"direction",type:'"up" | "down" | "top" | "bottom"',required:!0,description:"滚动方向"},{name:"distance",type:"number",description:"滚动距离(px),默认 600"},{name:"selector",type:"string",description:"目标滚动容器的原生 CSS 选择器,或 page_snapshot 返回的 @eN ref;不传时滚动页面"},{name:"containerPolicy",type:'"self" | "nearest"',description:"默认 self,要求 selector 本身可滚动;nearest 会在其不可滚动时使用最近的可滚动祖先"},PAGE_OBSERVE_PARAM,PAGE_DIAGNOSTICS_PARAM,{name:"tabId",type:"number",required:!0,description:"目标标签页 ID"}],result:[...PAGE_ACTION_RESULT,"action.data 返回 moved、atTop/atBottom、scrollYBefore/After、maxScrollY、resolvedContainer 和 ancestorDistance;自动发现的内部容器提供可复用 containerSelector。"],examples:[`page_scroll --payload '{"tabId":12345,"direction":"down"}'`,`page_scroll --payload '{"tabId":12345,"direction":"bottom"}'`,`page_scroll --payload '{"tabId":12345,"selector":".virtual-list","direction":"down","distance":800}'`,`page_scroll --payload '{"tabId":12345,"selector":"@e8","containerPolicy":"nearest","direction":"bottom"}'`]},{name:"page_runtime",description:"页面运行时传输适配器;插件使用 PluginPageClient 或 app.page",params:[{name:"operation",type:"string",required:!0,description:"resolve/attach/get/send/detach/activation"}]},{name:"page_eval",description:"在页面上下文中执行任意 JavaScript 表达式",params:[{name:"expression",type:"string",required:!0,description:"要执行的 JS 表达式;传 args 时须求值为函数"},{name:"args",type:"unknown[]",description:"传给页面函数的 JSON 参数;SDK/CLI 自动处理大参数分块,保持指定执行环境"},{name:"executionWorld",type:"string",description:"main(默认)读取网页 JS;isolated 使用命名隔离环境,扩展连接无需 debugger"},{name:"worldId",type:"string",description:"isolated 必填,小写字母开头,允许数字和连字符,最长 64 字符"},{name:"awaitPromise",type:"boolean",description:"表达式返回 Promise 时等待完成,默认 true"},{name:"frameId",type:"string",description:"page_frames 返回的目标 frame ID,扩展/CDP 均支持;省略时容器/设备外壳使用当前业务 frame,普通页面使用主 frame"},{...PAGE_OBSERVE_PARAM,type:"object",description:"仅在表达式会修改页面且需要观察结果时显式传入;不传保持轻量裸执行"},PAGE_DIAGNOSTICS_PARAM,{name:"tabId",type:"number",required:!0,description:"目标标签页 ID"}],notes:["优先使用结构化 action;仅在其无法表达需求时执行最小范围脚本。"],result:["默认返回 { result };observe 对象启用观察并返回 { action, observation };仅开启 diagnostics 时返回 { action, diagnostics }。diagnostics=false 不启用包装。失败阶段语义同 page_click。"],examples:[`page_eval --payload '{"tabId":12345,"expression":"document.title"}'`]},{name:"page_inspect",description:"查询 DOM 元素的控件状态、数量、边框盒、计算样式、遮挡、溢出和最近滚动容器",params:[{name:"selector",type:"string",description:"原生 CSS、page_snapshot 返回的 @eN ref,或 DevTools Elements 当前选区 $0;做全页溢出诊断时可省略"},{name:"filter",type:'"all" | "overflowing" | "horizontal-overflow" | "vertical-overflow" | "scrollable"',description:"结果过滤;省略 selector 时必须指定非 all 的过滤条件"},{name:"styles",type:"string[]",description:"要返回的计算样式属性,默认 display/position/box-sizing/overflow-x/overflow-y"},{name:"maxResults",type:"number",description:"最多返回的明细数,默认 20,最大 100;未触发 scanTruncated 时 count 为完整命中数"},{name:"includeOuterHTML",type:"boolean",description:"是否返回 outerHTML(最多 3000 字符);$0 默认 true,其他目标默认 false"},{name:"tabId",type:"number",required:!0,description:"目标标签页 ID"}],result:["matches[] 包含 boundingBox、computedStyle、hitTest、scroll 溢出量及可用的 scrollContainer。receivesPointerEvents=false 时读取 occludedBy。","state 返回原生/ARIA 状态及来源;缺失字段表示未知。","$0 还返回 resolvedSelector、属性、XPath 和可用框架信息。"],examples:[`page_inspect --payload '{"tabId":12345,"selector":".form-field","styles":["display","width"]}'`,`page_inspect --payload '{"tabId":12345,"selector":"@e8"}'`,`page_inspect --payload '{"tabId":12345,"selector":"$0"}'`,`page_inspect --payload '{"tabId":12345,"filter":"horizontal-overflow"}'`,`page_inspect --payload '{"tabId":12345,"filter":"scrollable"}'`]},{name:"page_press",description:"在页面中按下键盘按键或组合键",params:[{name:"key",type:"string",required:!0,description:"按键名称:Enter/Tab/Escape/Backspace 等"},{name:"modifiers",type:"string[]",description:"修饰键数组:ctrl/alt/shift/meta/cmd"},{name:"pressMode",type:'"auto" | "dom" | "keyboard"',description:"派发模式;auto 默认在隐藏页降级为 DOM 键盘事件"},PAGE_OBSERVE_PARAM,PAGE_DIAGNOSTICS_PARAM,{name:"tabId",type:"number",required:!0,description:"目标标签页 ID"}],notes:["隐藏页 DOM 模式支持 Tab 焦点移动、原生控件 Enter/Space 激活和输入框 Enter 提交;编辑、选择、方向键和页面滚动等原生行为需可见页与 pressMode=keyboard。"],result:[...PAGE_ACTION_RESULT,"action.data.dispatchMode / fallbackReason / defaultAction 说明实际输入路径。"],examples:[`page_press --payload '{"tabId":12345,"key":"Enter"}'`]},{name:"page_wait",description:"等待指定时间、元素状态、可见文本或页面条件成立",params:[{name:"time",type:"number",description:"等待毫秒数(与 selector/text/condition 四选一)"},{name:"selector",type:"string",description:"目标 CSS 选择器(与 time/text/condition 四选一)"},{name:"state",type:'"attached" | "detached" | "visible" | "hidden"',description:"selector 的目标状态,默认 attached"},{name:"text",type:"string",description:"等待页面出现的可见文本"},{name:"exact",type:"boolean",description:"text 是否精确匹配,默认 false"},{name:"condition",type:"string",description:"在页面主上下文轮询的 JS 表达式,返回 truthy 时结束"},{name:"timeout",type:"number",description:"等待超时毫秒数,默认 10000"},{name:"interval",type:"number",description:"轮询间隔毫秒数,默认 200"},{name:"tabId",type:"number",required:!0,description:"目标标签页 ID"}],notes:["time / selector / text / condition 必须且只能提供一个;time 范围 0–60000ms。页面交互已有内置观察,仅在需要独立等待条件时使用。"],examples:[`page_wait --payload '{"tabId":12345,"time":1000}'`,`page_wait --payload '{"tabId":12345,"selector":".dialog","state":"visible"}'`,`page_wait --payload '{"tabId":12345,"selector":".loading","state":"hidden"}'`,`page_wait --payload '{"tabId":12345,"text":"提交成功"}'`,`page_wait --payload '{"tabId":12345,"condition":"window.appReady === true","timeout":30000}'`]},{name:"page_navigate",description:"在当前标签页内导航到 URL、刷新页面,或沿浏览历史后退/前进",params:[{name:"url",type:"string",description:"要导航到的 URL;与 refresh/history 互斥"},{name:"refresh",type:"boolean",description:"为 true 时直接重新加载当前页面;与 url/history 互斥"},{name:"history",type:'"back" | "forward"',description:"沿当前标签页浏览历史后退或前进;与 url/refresh 互斥"},{name:"tabId",type:"number",required:!0,description:"目标标签页 ID"}],notes:["url / refresh=true / history 必须且只能提供一个。"],examples:[`page_navigate --payload '{"tabId":12345,"url":"https://example.com/page2"}'`,`page_navigate --payload '{"tabId":12345,"refresh":true}'`,`page_navigate --payload '{"tabId":12345,"history":"back"}'`]},{name:"page_upload",description:'向 <input type="file"> 元素上传一个或多个文件',params:[{name:"files",type:"object[]",description:"调用方绝对路径 {filePath} 或浏览器产物 {artifactId};与 filePaths 二选一"},{name:"selector",type:"string",required:!0,description:"原生 CSS 选择器,或 page_snapshot / 页面动作 observation 返回的 @eN ref(必须带 @ 前缀),必须指向 input[type=file]"},{name:"filePaths",type:"string[]",description:"浏览器宿主上的绝对路径数组;与 files 二选一"},PAGE_OBSERVE_PARAM,PAGE_DIAGNOSTICS_PARAM,{name:"tabId",type:"number",required:!0,description:"目标标签页 ID"}],result:PAGE_ACTION_RESULT,notes:["直接写入 input[type=file],不依赖 file chooser;隐藏的文件节点也可上传。外部 Provider 的文件中转能力查询 mearl <providerId>。"],examples:[`page_upload --payload '{"tabId":12345,"selector":"#file-input","filePaths":["/Users/me/photo.jpg"]}'`]},{name:"page_snapshot",description:"获取带 @ref 的页面结构快照,默认使用无障碍树,也可显式读取渲染 DOM",params:[{name:"depth",type:"number",description:"树深度,默认 15,复杂页面可调大"},{name:"mode",type:'"full" | "interactive" | "viewport" | "dom"',description:"默认 full;interactive/viewport 裁剪 AX 树;AX 信息缺失时可显式使用 dom 读取渲染 DOM"},{name:"rootSelector",type:"string",description:"只获取指定 CSS 元素的局部子树,可与 mode 组合;与 rootRef 互斥"},{name:"rootRef",type:"string",description:"以已有 @eN ref 为根获取局部子树;与 rootSelector 互斥"},{name:"ancestorDepth",type:"number",description:"rootRef 向上扩展的 DOM 祖先层数,默认 0,最大 20"},{name:"query",type:"{ text?: string; role?: string; exact?: boolean }",description:"服务端按 name / role 过滤当前模式的树,只保留命中节点及祖先路径"},{name:"maxNodes",type:"number",description:"最多输出节点数,0 表示不限制"},{name:"maxChars",type:"number",description:"快照文本最大字符数,默认 60000,超出保留首尾;传 0 不限制"},{name:"tabId",type:"number",required:!0,description:"目标标签页 ID"}],notes:["query.text / query.role 至少提供一个;query.exact 默认 true。每次快照刷新有效 ref 集合。","interactive 无 AX 控件时回退到 viewport,不会自动改用 dom;Canvas 内容需截图。"],result:["返回 snapshot、elementCount、outputNodeCount、mode;截断时 truncated=true。","snapshot 中的 @eN 可直接用于操作;内部节点映射仅保存在运行时。无名称、无 ref 且无状态的分组折叠到子节点。","query 返回 matches 与完整 matchCount,matches 最多 100 项,裁剪时 matchesTruncated=true。容器/iframe 的视口裁剪返回 outerViewport、contentViewport 和滚动位置。"],examples:[`page_snapshot --payload '{"tabId":12345}'`,`page_snapshot --payload '{"tabId":1,"mode":"viewport"}'`,`page_snapshot --payload '{"tabId":1,"mode":"dom"}'`,`page_snapshot --payload '{"tabId":1,"rootSelector":"[role=dialog]"}'`,`page_snapshot --payload '{"tabId":1,"rootRef":"@e8","ancestorDepth":1}'`,`page_snapshot --payload '{"tabId":1,"query":{"text":"保存","role":"button"}}'`]},{name:"page_screenshot",description:"获取当前视口或指定元素截图",outputFlag:!0,params:[{name:"selector",type:"string",description:"CSS 选择器,提供后只截取该元素区域"},{name:"format",type:'"png" | "jpeg"',description:"图片格式,默认 png"},{name:"quality",type:"number",description:"JPEG 压缩质量(0-100),默认 80"},{name:"captureMode",type:'"cdp" | "visible"',description:"默认 cdp;visible 使用活动标签页截图,普通网页无需 debugger;设备模拟复用模拟会话并截取业务视口,不支持 selector"},{name:"tabId",type:"number",required:!0,description:"目标标签页 ID"}],notes:["使用 --output <path> 保存图片;省略时 stdout 返回含 base64 data 的 JSON,避免直接将其加载为文本。"],result:["meta 包含 format、width、height、size、url、title;宽高为实际截图的物理像素。"],examples:[`page_screenshot --payload '{"tabId":12345}' --output ./screenshot.png`,`page_screenshot --payload '{"tabId":12345,"selector":".product-card"}' --output ./card.png`]},{name:"set_device_emulation",description:"把目标 tab 切换为移动端模拟(视口/DPR/UA/触摸/视觉比例),等价 DevTools 设备工具栏,作用域 per-tab;需保持调试控制才持续生效",summary:"设置或清除目标标签页的设备模拟",params:[{name:"enabled",type:"boolean",required:!0,description:"true=启用,false=清除"},{name:"preset",type:DEVICE_PRESET_TYPE,description:"内置设备预设,提供 width/height/DPR/UA 默认值;旧机型 ID 继续兼容"},{name:"width",type:"number",description:"视口宽度(覆盖 preset)"},{name:"height",type:"number",description:"视口高度(覆盖 preset)"},{name:"deviceScaleFactor",type:"number",description:"DPR(覆盖 preset)"},{name:"scale",type:"number",description:"画面视觉比例,不改变视口尺寸或 DPR;必须为有限正数,默认 1"},{name:"mobile",type:"boolean",description:"是否走移动渲染模式,默认从 preset 推断"},{name:"userAgent",type:"string",description:"自定义 UA(覆盖 preset)"},{name:"orientation",type:'"portrait" | "landscape"',description:"横竖屏,默认 portrait"},{name:"touch",type:"boolean",description:"是否启用触摸事件,默认从 preset 推断;无 preset 时跟随 mobile"},{name:"deviceShell",type:"boolean",description:"是否使用 iframe WebView 并渲染顶部状态栏与底部操作区,默认 false"},{name:"splitScreen",type:"boolean",description:"是否将首页与业务页分置左右 WebView;仅在已启用 App 档案、deviceShell=true、横屏时生效,默认 false"},{name:"reload",type:"boolean",description:"启用后是否重载页面,默认 true"},{name:"tabId",type:"number",required:!0,description:"目标标签页 ID"}],notes:["无 preset 时 width/height 必须成对提供且 userAgent 必填;mobile 默认 true,touch 跟随 mobile。","deviceShell 开启/移除时必须重载;splitScreen 仅在已启用 App 档案、deviceShell=true、横屏时生效。"],result:["返回实际 viewport(width/height/deviceScaleFactor/scale)、UA、mobile、touch、orientation、deviceShell、splitScreen 和 reloaded;应以响应确认生效状态。"],examples:[`set_device_emulation --payload '{"tabId":12345,"enabled":true,"preset":"iphone-17-pro"}'`,`set_device_emulation --payload '{"tabId":12345,"enabled":true,"preset":"pixel-11","orientation":"landscape"}'`,`set_device_emulation --payload '{"tabId":12345,"enabled":true,"preset":"ipad-mini-a17-pro","orientation":"landscape","deviceShell":true,"splitScreen":true}'`,`set_device_emulation --payload '{"tabId":12345,"enabled":false}'`]},{name:"set_app_profile",description:"设置 App 客户端环境与 JSBridge;可同时设置 MTop 页面接口环境,传 emulation 时联动设备模拟",summary:"设置或清除目标标签页的 App 容器模拟",params:[{name:"enabled",type:"boolean",required:!0,description:"true=启用,false=清除"},{name:"profile",type:"string",description:`容器档案名(enabled=true 时必填);内置 ${APP_PROFILE_NAME_LIST}`},{name:"os",type:'"ios" | "android"',description:"容器系统,默认 ios"},{name:"refreshDefinition",type:"boolean",description:"立即采用最新档案定义,保留用户显式设置"},{name:"lockDefinition",type:"boolean",description:"固定当前定义;默认在下次刷新或文档导航时自动更新"},{name:"appVersion",type:"string",description:"覆盖档案默认 App 版本号"},{name:"deviceModel",type:"string",description:"Android 机型名(拼入 UA 与 __DEVICE_MODEL__)"},{name:"bridgeConfig",type:"object",description:"声明式覆盖桥方法,形如 {methods:{api:{behavior|response|noop,silent?}}};不执行配置脚本"},{name:"mtopEnv",type:'"default" | "prod" | "pre"',description:"可选 MTop 页面接口环境;default 关闭环境改写,省略时保持当前设置。仅作用于目标 tab"},{name:"emulation",type:"object",description:"可选设备联动参数,字段同 set_device_emulation 去掉 enabled/reload;字段覆盖档案推荐设备,deviceShell 默认 true,横屏时可传 splitScreen=true。省略时不设置或清除设备"},{name:"reload",type:"boolean",description:"应用/清除后是否重载页面,默认 true"},{name:"tabId",type:"number",required:!0,description:"目标标签页 ID"}],notes:["只有用户明确要求 App/客户端/容器/JSBridge 模拟时启用。移动视口或普通 H5 调试使用 set_device_emulation。","emulation={} 使用档案推荐设备;enabled=false 时省略 emulation 只清除 App 注入,传 {} 同时清除设备模拟。","bridgeConfig.methods 按方法声明 behavior / response / noop 三选一,可传 silent;只支持受控行为、固定 JSON 回包或成功空实现,不执行配置脚本。"],result:["返回 enabled、profile、label、userAgent、os、mtopEnv、reloaded;联动设备时额外返回实际 emulation。"],examples:[`set_app_profile --payload '{"tabId":12345,"enabled":true,"profile":"fliggy"}'`,`set_app_profile --payload '{"tabId":12345,"enabled":true,"profile":"fliggy","mtopEnv":"pre"}'`,`set_app_profile --payload '{"tabId":12345,"enabled":false,"mtopEnv":"prod"}'`,`set_app_profile --payload '{"tabId":12345,"enabled":true,"profile":"fliggy","emulation":{}}'`,`set_app_profile --payload '{"tabId":12345,"enabled":true,"profile":"alipay","emulation":{"preset":"pixel-11","deviceShell":true}}'`,`set_app_profile --payload '{"tabId":12345,"enabled":true,"profile":"fliggy","emulation":{"preset":"ipad-mini-a17-pro","orientation":"landscape","deviceShell":true,"splitScreen":true}}'`,`set_app_profile --payload '{"tabId":12345,"enabled":false}'`,`set_app_profile --payload '{"tabId":12345,"enabled":false,"emulation":{}}'`]},{name:"set_timezone",description:"覆盖目标 tab 的时区,传空字符串恢复浏览器默认时区",params:[{name:"tabId",type:"number",required:!0,description:"目标标签页 ID"},{name:"timezone",type:"string",required:!0,description:"IANA 时区标识(如 Asia/Shanghai);空字符串表示清除覆盖"}],examples:[`set_timezone --payload '{"tabId":12345,"timezone":"America/New_York"}'`,`set_timezone --payload '{"tabId":12345,"timezone":""}'`]},{name:"get_cookie",description:"从目标浏览器读取一个指定非分区 Cookie;拒绝返回 HttpOnly Cookie",params:[{name:"tabId",type:"number",description:"可选;指定标签页的 Cookie 存储区,省略时使用浏览器默认存储区"},{name:"name",type:"string",required:!0,description:"要读取的 Cookie 名称;不支持列举全部 Cookie"},{name:"url",type:"string",description:"Cookie 查询 URL;未传 tabId 时必填,省略时使用指定标签页 URL"},{name:"domain",type:"string",description:"可选精确域过滤,只允许 Cookie 查询 URL 的 host 或其父域"},{name:"path",type:"string",description:"可选精确 path 过滤"}],notes:["只读取指定非分区 Cookie,不列举全部、不回退分区 Cookie,拒绝 HttpOnly;禁止读取认证 Token。指定 url 不导航,指定 tabId 仅选择存储区时不启动采集。"],result:["找到时 found=true 并返回 value/domain/path;不存在时 found=false。"],examples:[`get_cookie --payload '{"tabId":12345,"name":"feature_flag"}'`,`get_cookie --payload '{"url":"https://www.taobao.com/","name":"tracknick"}'`,`get_cookie --payload '{"tabId":12345,"name":"edith_switch_br.rx-vehicle-search_home","domain":"taobao.com"}'`,`get_cookie --payload '{"tabId":12345,"name":"tracknick","url":"https://www.taobao.com/","domain":"taobao.com","path":"/"}'`]},{name:"set_cookie",description:"在目标浏览器设置一个指定非分区 session Cookie,可选刷新指定页面",params:[{name:"tabId",type:"number",description:"可选;指定标签页的 Cookie 存储区,reload=true 时必填"},{name:"url",type:"string",description:"Cookie 目标 URL;未传 tabId 时必填,省略时使用指定标签页 URL"},{name:"name",type:"string",required:!0,description:"Cookie 名称"},{name:"value",type:"string",required:!0,description:"Cookie 值,可传空字符串;空字符串不会删除 Cookie"},{name:"domain",type:"string",description:"Cookie 域,默认目标 URL 的 host;只允许目标 host 或其父域"},{name:"path",type:"string",description:"Cookie path,默认 /"},{name:"reload",type:"boolean",description:"设置后是否刷新指定 tabId,默认 false;true 时必须传 tabId"}],notes:["仅写非分区 session Cookie,不支持删除。reload=true 时校验目标域与刷新页域的授权。"],result:["返回 url/name/domain/path/reloaded,指定标签页时包含 tabId;不回显 Cookie 值。"],examples:[`set_cookie --payload '{"tabId":12345,"name":"feature_flag","value":"enabled"}'`,`set_cookie --payload '{"url":"https://www.taobao.com/","name":"feature_flag","value":"enabled"}'`,`set_cookie --payload '{"tabId":12345,"name":"edith_switch_br.rx-vehicle-search_home","value":"3.6.63","domain":"taobao.com","reload":true}'`]},{name:"page_frames",description:"获取页面主 frame 与所有 iframe 列表",params:[{name:"tabId",type:"number",required:!0,description:"目标标签页 ID"}],result:["frames[] 包含 frameId、url、name 和 isMainFrame;frameId 可用于 page_eval 等支持 frame 定位的 action。"],examples:[`page_frames --payload '{"tabId":12345}'`]},{name:"request_domain_permission",description:"申请访问指定域名的权限(必要时弹窗让用户授权)",params:[{name:"domain",type:"string",required:!0,description:"需要授权的域名,如 example.com"}],notes:["domain 使用纯主机名,不传 URL。在非 BUC send_request 报域权限缺失,或 set_rule 提示缺少域名权限时申请;BUC 不使用浏览器域权限。","弹窗等待用户选择,90 秒超时或关闭按拒绝处理;granted=true 后才重试原请求。"],result:["返回 granted、domain,授权成功时包含 origin。"],examples:[`request_domain_permission --payload '{"domain":"example.com"}'`]},{name:"run_actions",description:"批量顺序执行多个 action,减少往返延迟。遇错即停,返回已完成步骤结果;步骤内的页面动作不带内置观察",summary:"批量顺序执行多个 action,遇错即停",params:[{name:"actions",type:"Array<{action: string, data?: object}>",required:!0,description:"要依次执行的 action 列表"},{name:"tabId",type:"number",required:!0,description:"所有步骤共享的 tabId,步骤自身指定的优先"}],notes:["最多 50 步,不允许嵌套 run_actions;需要根据每步效果决策时逐步调用普通 action。"],result:["返回 results、completedSteps、totalSteps;失败时包含 error/failedStep,后续步骤未执行。"],examples:[`run_actions --payload '{"tabId":12345,"actions":[{"action":"page_hover","data":{"selector":"#menu"}},{"action":"page_click","data":{"selector":"#menu-item"}}]}'`]}],COMMAND_MAP=new Map(COMMANDS.map(command=>[command.name,command]))}});import{statSync as statSync3}from"node:fs";function pluginFileVersion(path27){let stat4=statSync3(path27);if(!stat4.isFile())throw new Error(`插件资源不是文件: ${path27}`);return`${stat4.dev}-${stat4.ino}-${stat4.mtimeMs}-${stat4.ctimeMs}-${stat4.size}`}var init_pluginSource=__esm({"../client/dist/plugins/pluginSource.js"(){"use strict"}});import{createHash as createHash3}from"node:crypto";import{readFileSync as readFileSync4,realpathSync}from"node:fs";import{basename,dirname as dirname3,extname,isAbsolute,join as join4,relative,resolve,sep}from"node:path";function pluginRoot(entry){let entryDirectory=dirname3(entry);return basename(entryDirectory)==="scripts"?dirname3(entryDirectory):entryDirectory}function attributeValue(tag,name){let match=tag.match(new RegExp(`\\b${name}\\s*=\\s*(?:"([^"]*)"|'([^']*)'|([^\\s>]+))`,"i"));return match?.[1]??match?.[2]??match?.[3]}function removeAttribute(tag,name){return tag.replace(new RegExp(`\\s+${name}\\s*=\\s*(?:"[^"]*"|'[^']*'|[^\\s>]+)`,"i"),"")}function isEmbeddedReference(reference){return/^(?:data:|blob:|#)/i.test(reference.trim())}function isRemoteReference(reference){return/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i.test(reference.trim())}function contentType(path27){return MIME_TYPES[extname(path27).toLowerCase()]??"application/octet-stream"}function escapeStyleText(value){return value.replace(/<\/style/gi,"\\3C /style")}function escapeScriptText(value){return value.replace(/<\/script/gi,"<\\/script")}function buildPluginPageBundle(entry,pageEntry){let root=realpathSync(pluginRoot(entry)),sourceBytes=0,countedFiles=new Set,sources={},resolveLocalFile=(reference,fromFile)=>{let cleanReference=reference.trim().split(/[?#]/,1)[0];if(!cleanReference||isEmbeddedReference(cleanReference))return"";if(isRemoteReference(cleanReference)||isAbsolute(cleanReference))throw new Error(`toolbox.page 不允许远程或绝对资源: ${reference}`);let sourcePath=resolve(dirname3(fromFile),cleanReference),resolved=realpathSync(sourcePath),relativePath=relative(root,resolved);if(relativePath===".."||relativePath.startsWith(`..${sep}`)||isAbsolute(relativePath))throw new Error(`toolbox.page 资源超出插件目录: ${reference}`);return sources[sourcePath]=pluginFileVersion(sourcePath),resolved},readAsset=path27=>{sources[path27]??=pluginFileVersion(path27);let content2=readFileSync4(path27);if(!countedFiles.has(path27)&&(countedFiles.add(path27),sourceBytes+=content2.byteLength,sourceBytes>MAX_PAGE_SOURCE_BYTES))throw new Error("toolbox.page 源文件总大小不能超过 16 MiB");return content2},dataUrl=(reference,fromFile)=>{if(isEmbeddedReference(reference))return reference;let path27=resolveLocalFile(reference,fromFile);return`data:${contentType(path27)};base64,${readAsset(path27).toString("base64")}`},inlineCss=(css,cssPath)=>css.replace(/url\(\s*(['"]?)([^'"()]+)\1\s*\)/gi,(_match,_quote,reference)=>{let value=reference.trim();return isEmbeddedReference(value)?`url("${value}")`:`url("${dataUrl(value,cssPath)}")`}),absoluteEntry=resolveLocalFile(pageEntry,join4(root,"__toolbox_entry__"));if(extname(absoluteEntry).toLowerCase()!==".html")throw new Error("toolbox.page.entry 必须指向 HTML 文件");let html=readAsset(absoluteEntry).toString("utf8").replace(/^\uFEFF/,"");if(!/<html\b|<!doctype\b/i.test(html))throw new Error("toolbox.page.entry 必须是完整 HTML 文档");if(/<base\b/i.test(html))throw new Error("toolbox.page 不允许声明 base 标签");if(/<meta\b[^>]*http-equiv\s*=\s*["']?content-security-policy/i.test(html))throw new Error("toolbox.page 的安全策略由 Mearl 管理,请移除 CSP meta 标签");html=html.replace(/<link\b[^>]*>/gi,tag=>{let rel=attributeValue(tag,"rel")?.toLowerCase().split(/\s+/)??[],href=attributeValue(tag,"href");if(rel.includes("stylesheet")){if(!href)throw new Error("toolbox.page stylesheet 缺少 href");let cssPath=resolveLocalFile(href,absoluteEntry),css=inlineCss(readAsset(cssPath).toString("utf8"),cssPath);return`<style data-mearl-source="${href.replaceAll('"',"&quot;")}">${escapeStyleText(css)}</style>`}if(href&&rel.some(value=>["icon","apple-touch-icon"].includes(value)))return tag.replace(href,dataUrl(href,absoluteEntry));if(href&&isRemoteReference(href))throw new Error(`toolbox.page 不允许远程 link 资源: ${href}`);return tag}),html=html.replace(/<script\b[^>]*>[\s\S]*?<\/script\s*>/gi,tag=>{let src=attributeValue(tag,"src");if(!src)return tag;let scriptPath=resolveLocalFile(src,absoluteEntry),script=readAsset(scriptPath).toString("utf8");if(attributeValue(tag,"type")?.toLowerCase()==="module"&&/(?:^|[;\n]\s*)(?:import\s|export\s)|\bimport\s*\(/m.test(script))throw new Error("toolbox.page 的模块脚本必须先打包为无 import 的单文件");return`${removeAttribute(tag.slice(0,tag.indexOf(">")+1),"src")}${escapeScriptText(script)}</script>`}),html=html.replace(/(<(?:img|source|video|audio|track|input)\b[^>]*?\s(?:src|poster)\s*=\s*)(["'])([^"']+)\2/gi,(_match,prefix,quote,reference)=>`${prefix}${quote}${dataUrl(reference,absoluteEntry)}${quote}`);let injection=`<meta name="color-scheme" content="light dark">${PAGE_SECURITY_META}${PAGE_THEME_STYLE}<script data-mearl-bridge>${escapeScriptText(PAGE_BRIDGE_SCRIPT)}</script>`;html=/<head\b[^>]*>/i.test(html)?html.replace(/<head\b[^>]*>/i,tag=>`${tag}${injection}`):html.replace(/<html\b[^>]*>/i,tag=>`${tag}<head>${injection}</head>`);let content=html,buffer=Buffer.from(content,"utf8");if(buffer.byteLength>MAX_PAGE_BUNDLE_BYTES)throw new Error("toolbox.page 打包后不能超过 24 MiB");return{content,hash:createHash3("sha256").update(buffer).digest("hex"),size:buffer.byteLength,chunks:Math.ceil(buffer.byteLength/PLUGIN_PAGE_CHUNK_BYTES),sources}}var PLUGIN_PAGE_CHUNK_BYTES,MAX_PAGE_SOURCE_BYTES,MAX_PAGE_BUNDLE_BYTES,MIME_TYPES,PAGE_BRIDGE_SCRIPT,PAGE_SECURITY_META,PAGE_THEME_STYLE,PLUGIN_PAGE_RUNTIME_HASH,init_pluginPageBundle=__esm({"../client/dist/plugins/pluginPageBundle.js"(){"use strict";init_pluginSource();PLUGIN_PAGE_CHUNK_BYTES=384*1024,MAX_PAGE_SOURCE_BYTES=16*1024*1024,MAX_PAGE_BUNDLE_BYTES=24*1024*1024,MIME_TYPES={".avif":"image/avif",".gif":"image/gif",".ico":"image/x-icon",".jpeg":"image/jpeg",".jpg":"image/jpeg",".mp3":"audio/mpeg",".mp4":"video/mp4",".ogg":"audio/ogg",".otf":"font/otf",".png":"image/png",".svg":"image/svg+xml",".ttf":"font/ttf",".wav":"audio/wav",".webm":"video/webm",".webp":"image/webp",".woff":"font/woff",".woff2":"font/woff2"},PAGE_BRIDGE_SCRIPT=String.raw`(() => {
3
+ var __create=Object.create;var __defProp=Object.defineProperty;var __getOwnPropDesc=Object.getOwnPropertyDescriptor;var __getOwnPropNames=Object.getOwnPropertyNames;var __getProtoOf=Object.getPrototypeOf,__hasOwnProp=Object.prototype.hasOwnProperty;var __require=(x=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(x,{get:(a,b)=>(typeof require<"u"?require:a)[b]}):x)(function(x){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+x+'" is not supported')});var __esm=(fn,res)=>function(){return fn&&(res=(0,fn[__getOwnPropNames(fn)[0]])(fn=0)),res};var __commonJS=(cb,mod)=>function(){return mod||(0,cb[__getOwnPropNames(cb)[0]])((mod={exports:{}}).exports,mod),mod.exports};var __export=(target,all)=>{for(var name in all)__defProp(target,name,{get:all[name],enumerable:!0})},__copyProps=(to,from,except,desc)=>{if(from&&typeof from=="object"||typeof from=="function")for(let key of __getOwnPropNames(from))!__hasOwnProp.call(to,key)&&key!==except&&__defProp(to,key,{get:()=>from[key],enumerable:!(desc=__getOwnPropDesc(from,key))||desc.enumerable});return to};var __toESM=(mod,isNodeMode,target)=>(target=mod!=null?__create(__getProtoOf(mod)):{},__copyProps(isNodeMode||!mod||!mod.__esModule?__defProp(target,"default",{value:mod,enumerable:!0}):target,mod));import{createRequire}from"node:module";import{fileURLToPath}from"node:url";var require2,CLIENT_VERSION,PLUGIN_TASK_HOST_PATH,PLUGIN_WORKER_PATH,SCRIPT_WORKER_PATH,PLUGIN_MODEL_SESSION_WORKER_PATH,init_runtimePaths=__esm({"../client/dist/runtimePaths.js"(){"use strict";require2=createRequire(import.meta.url),CLIENT_VERSION=require2("../package.json").version,PLUGIN_TASK_HOST_PATH=fileURLToPath(new URL("./plugin-task-host.js",import.meta.url)),PLUGIN_WORKER_PATH=fileURLToPath(new URL("./plugin-worker.js",import.meta.url)),SCRIPT_WORKER_PATH=fileURLToPath(new URL("./scriptWorker.js",import.meta.url)),PLUGIN_MODEL_SESSION_WORKER_PATH=fileURLToPath(new URL("./pluginModelSessionWorker.js",import.meta.url))}});import{readFileSync,readdirSync}from"node:fs";import{spawnSync}from"node:child_process";function linuxProcessStat(pid){let stat4=readFileSync(`/proc/${pid}/stat`,"utf8"),end=stat4.lastIndexOf(")"),fields3=stat4.slice(end+2).trim().split(/\s+/),group=Number(fields3[2]),threads=Number(fields3[17]);if(end<0||!/^[A-Za-z]$/.test(fields3[0])||!Number.isSafeInteger(group)||group<0||!Number.isSafeInteger(threads)||threads<0||!/^\d+$/.test(fields3[19]??""))throw new Error("Invalid Linux process stat");return{state:fields3[0],group,threads,identity:fields3[19]}}function linuxProcessExited({state,threads}){return threads<=1&&(state==="Z"||state==="X"||state==="x")}function processIdentity(pid){if(!(!Number.isSafeInteger(pid)||pid<1))try{if(process.platform==="linux")return linuxProcessStat(pid).identity;let result=process.platform==="win32"?spawnSync("powershell.exe",["-NoProfile","-NonInteractive","-Command",`(Get-CimInstance Win32_Process -Filter "ProcessId=${pid}").CreationDate.ToUniversalTime().Ticks`],{encoding:"utf8",timeout:2e3,windowsHide:!0}):spawnSync("ps",["-p",String(pid),"-o","lstart="],{encoding:"utf8",timeout:2e3});return result.status===0&&result.stdout.trim()||void 0}catch{return}}function isProcessOwnerAlive(owner){if(!isAlive(owner.pid))return!1;if(typeof owner.processIdentity!="string")return!0;let current=processIdentity(owner.pid);return current===void 0||current===owner.processIdentity}function isAlive(pid){if(!Number.isSafeInteger(pid)||!pid||pid<=0)return!1;try{if(process.kill(pid,0),process.platform==="linux")try{return!linuxProcessExited(linuxProcessStat(pid))}catch{return!0}return!0}catch(error48){return error48.code==="EPERM"}}function isProcessGroupAlive(group){if(!Number.isSafeInteger(group)||group<1)return!1;if(process.platform==="win32")return!0;let probe=()=>{try{return process.kill(-group,0),!0}catch(error48){return error48.code==="ESRCH"?!1:void 0}},present=probe();if(present!==!0)return present!==!1;if(process.platform!=="linux")return!0;let exitedMembers=()=>{let members=new Set;try{for(let name of readdirSync("/proc"))if(/^\d+$/.test(name))try{let stat4=linuxProcessStat(Number(name));if(stat4.group!==group)continue;if(!linuxProcessExited(stat4))return;members.add(`${name}:${stat4.identity}`)}catch(error48){if(!["ENOENT","ESRCH"].includes(error48.code??""))return}return members}catch{return}},first=exitedMembers();if(!first)return!0;let second=exitedMembers();return second?first.size&&first.size===second.size&&[...first].every(pid=>second.has(pid))?!1:probe()!==!1:!0}var init_process=__esm({"../daemon-core/dist/process.js"(){"use strict"}});import{join}from"node:path";import{homedir}from"node:os";import{createHash as createHash2}from"node:crypto";function hashKey(key){return createHash2("sha256").update(key).digest("hex").slice(0,16)}function keyedDir(subdir){return join(DAEMON_HOME,subdir)}function keyedConfigFile(subdir,key){return join(keyedDir(subdir),`${hashKey(key)}.json`)}var DAEMON_HOME,init_paths=__esm({"../daemon-core/dist/paths.js"(){"use strict";DAEMON_HOME=join(homedir(),".mearl")}});import{closeSync,existsSync,linkSync,openSync,statSync,mkdirSync,readFileSync as readFileSync2,writeFileSync,renameSync,rmSync,readdirSync as readdirSync2}from"node:fs";import{dirname,join as join2}from"node:path";import{randomUUID as randomUUID2}from"node:crypto";function ensureDir(dir){existsSync(dir)||mkdirSync(dir,{recursive:!0,mode:448})}function pauseForLock(){Atomics.wait(lockWaitBuffer,0,0,LOCK_WAIT_MS)}function readRecordUnlocked(file2){try{if(!existsSync(file2))return null;let parsed=JSON.parse(readFileSync2(file2,"utf-8"));return parsed&&typeof parsed.pid=="number"?parsed:null}catch{return null}}function removeRecordUnlocked(file2){rmSync(file2,{force:!0})}function writeRecordUnlocked(file2,record4){let tmp=`${file2}.${process.pid}.${randomUUID2()}.tmp`;try{writeFileSync(tmp,JSON.stringify(record4),{mode:384}),renameSync(tmp,file2)}catch(error48){try{rmSync(tmp,{force:!0})}catch{}throw error48}}function removeStaleLock(lockDir){let ownerFile=join2(lockDir,"owner.json"),owner=readRecordUnlocked(ownerFile);if(owner){if(isAlive(owner.pid))return!1}else try{if(Date.now()-statSync(lockDir).mtimeMs<OWNER_WRITE_GRACE_MS)return!1}catch{return!0}try{return rmSync(lockDir,{recursive:!0,force:!0}),!0}catch{return!1}}function withRecordLock(file2,operation){ensureDir(dirname(file2));let lockDir=`${file2}.registry.lock`,ownerFile=join2(lockDir,"owner.json"),token=randomUUID2(),deadline=Date.now()+LOCK_TIMEOUT_MS;for(;;){try{mkdirSync(lockDir,{mode:448})}catch(error48){if(error48.code!=="EEXIST")throw error48;if(!removeStaleLock(lockDir)){if(Date.now()>=deadline)throw new Error(`Timed out waiting for registry lock: ${file2}`,{cause:error48});pauseForLock()}continue}let ownerFd=null;try{ownerFd=openSync(ownerFile,"wx",384),writeFileSync(ownerFd,JSON.stringify({pid:process.pid,token}))}catch(error48){if(ownerFd!==null&&closeSync(ownerFd),ownerFd=null,error48.code==="EEXIST"){if(Date.now()>=deadline)throw new Error(`Timed out acquiring registry lock: ${file2}`,{cause:error48});pauseForLock();continue}throw error48}finally{ownerFd!==null&&closeSync(ownerFd)}try{return operation()}finally{readRecordUnlocked(ownerFile)?.token===token&&rmSync(lockDir,{recursive:!0,force:!0})}}}function writeRecord(file2,record4){withRecordLock(file2,()=>writeRecordUnlocked(file2,record4))}function claimRecord(file2,record4){return withRecordLock(file2,()=>{let candidate=`${file2}.${process.pid}.${randomUUID2()}.claim`;try{return writeFileSync(candidate,JSON.stringify(record4),{mode:384}),linkSync(candidate,file2),!0}catch(error48){if(error48.code==="EEXIST")return!1;throw error48}finally{rmSync(candidate,{force:!0})}})}function readRecord(file2){return readRecordUnlocked(file2)}function removeRecord(file2){try{withRecordLock(file2,()=>removeRecordUnlocked(file2))}catch{}}function removeRecordIfPid(file2,pid){try{return withRecordLock(file2,()=>readRecordUnlocked(file2)?.pid!==pid?!1:(removeRecordUnlocked(file2),!0))}catch{return!1}}function writeRecordIfPid(file2,pid,record4){return withRecordLock(file2,()=>readRecordUnlocked(file2)?.pid!==pid?!1:(writeRecordUnlocked(file2,record4),!0))}function removeInvalidRecord(file2){try{return withRecordLock(file2,()=>!existsSync(file2)||readRecordUnlocked(file2)?!1:(removeRecordUnlocked(file2),!0))}catch{return!1}}function listRecordFiles(dir){try{return readdirSync2(dir).filter(name=>name.endsWith(".json")).map(name=>join2(dir,name))}catch{return[]}}function readLiveRecords(dir){let out=[];for(let file2 of listRecordFiles(dir)){let rec=readRecord(file2);rec&&isAlive(rec.pid)?out.push(rec):rec?removeRecordIfPid(file2,rec.pid):removeInvalidRecord(file2)}return out}var LOCK_WAIT_MS,LOCK_TIMEOUT_MS,OWNER_WRITE_GRACE_MS,lockWaitBuffer,init_registry=__esm({"../daemon-core/dist/registry.js"(){"use strict";init_process();LOCK_WAIT_MS=10,LOCK_TIMEOUT_MS=5e3,OWNER_WRITE_GRACE_MS=1e3,lockWaitBuffer=new Int32Array(new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT))}});import{existsSync as existsSync2,statSync as statSync2,renameSync as renameSync2,readFileSync as readFileSync3,readdirSync as readdirSync3,rmSync as rmSync2}from"node:fs";import{join as join3}from"node:path";function pruneOrphanLogs(directory,retentionMs=7*864e5){try{for(let entry of readdirSync3(directory,{withFileTypes:!0})){let match=/^([a-f0-9]{16})\.log(?:\.1)?$/.exec(entry.name);if(!entry.isFile()||!match||existsSync2(join3(directory,`${match[1]}.json`)))continue;let file2=join3(directory,entry.name);try{Date.now()-statSync2(file2).mtimeMs>=retentionMs&&rmSync2(file2,{force:!0})}catch{}}}catch{}}function rotateLogIfNeeded(logFile,maxBytes=DEFAULT_MAX_LOG_BYTES){try{if(!existsSync2(logFile)||statSync2(logFile).size<maxBytes)return;renameSync2(logFile,`${logFile}.1`)}catch{}}var DEFAULT_MAX_LOG_BYTES,init_log=__esm({"../daemon-core/dist/log.js"(){"use strict";DEFAULT_MAX_LOG_BYTES=5*1024*1024}});import{spawn}from"node:child_process";import{closeSync as closeSync2,openSync as openSync2}from"node:fs";import{dirname as dirname2}from"node:path";var init_daemon=__esm({"../daemon-core/dist/daemon.js"(){"use strict";init_process();init_registry();init_log()}});import fs from"node:fs";import path from"node:path";import{spawn as spawn2}from"node:child_process";function isExecutable(filePath,platform=process.platform){try{return fs.accessSync(filePath,platform==="win32"?fs.constants.F_OK:fs.constants.X_OK),!0}catch{return!1}}function executableNames(name,platform=process.platform){return platform==="win32"?[`${name}.cmd`,`${name}.exe`,name]:[name]}function versionManagerExecutableCandidates(home,names,options={}){let env=options.env??process.env,platform=options.platform??process.platform,readdirSync8=options.readdirSync??fs.readdirSync,fnmDefaultRoot=env.XDG_DATA_HOME?path.join(env.XDG_DATA_HOME,"fnm"):platform==="darwin"?path.join(home,"Library","Application Support","fnm"):platform==="win32"&&env.APPDATA?path.join(env.APPDATA,"fnm"):path.join(home,".local","share","fnm");return[path.join(env.NVM_DIR||path.join(home,".nvm"),"versions","node"),path.join(env.FNM_DIR||fnmDefaultRoot,"node-versions"),path.join(home,".fnm","node-versions")].filter((root,index,all)=>all.indexOf(root)===index).flatMap(root=>{try{return readdirSync8(root,{withFileTypes:!0}).filter(entry=>entry.isDirectory()).sort((left,right)=>right.name.localeCompare(left.name,void 0,{numeric:!0})).flatMap(entry=>names.flatMap(name=>[path.join(root,entry.name,"bin",name),path.join(root,entry.name,"installation","bin",name)]))}catch{return[]}})}function resolveSpawnCommand(executable,args,platform=process.platform,commandInterpreter=process.env.ComSpec){return platform==="win32"&&/\.(?:cmd|bat)$/i.test(executable)?{command:commandInterpreter||"cmd.exe",args:["/d","/s","/c",executable,...args]}:{command:executable,args}}function prependCommandPath(command,env=process.env){return path.isAbsolute(command)?prependPathDirectory(path.dirname(command),env):env}function prependNodePath(env=process.env,nodeExecutable=process.execPath){return prependPathDirectory(path.dirname(nodeExecutable),env)}function prependPathDirectory(directory,env=process.env){let pathKey=Object.keys(env).find(key=>key.toLowerCase()==="path")||"PATH",entries=(env[pathKey]||"").split(path.delimiter).filter(Boolean);return entries.includes(directory)?env:{...env,[pathKey]:[directory,...entries].join(path.delimiter)}}function findExecutable(name,options={}){let env=options.env??process.env,platform=options.platform??process.platform,existsSync12=options.existsSync??(candidate=>isExecutable(candidate,platform)),pathKey=Object.keys(env).find(key=>key.toLowerCase()==="path")||"PATH",directories=[...options.extraDirectories??[],...(env[pathKey]??"").split(path.delimiter).filter(Boolean)];for(let directory of directories)for(let executableName of executableNames(name,platform)){let candidate=path.join(directory,executableName);if(existsSync12(candidate))return candidate}return null}var MAX_CAPTURE_LENGTH,runCommand,init_command=__esm({"../daemon-core/dist/command.js"(){"use strict";MAX_CAPTURE_LENGTH=1e6;runCommand=(command,args,options={})=>new Promise((resolve11,reject)=>{let capture=options.capture===!0||options.tee===!0,launch=resolveSpawnCommand(command,args),child=spawn2(launch.command,launch.args,{cwd:options.cwd,env:options.env,stdio:capture?[options.tee?"inherit":"ignore","pipe","pipe"]:"inherit",windowsHide:!0}),stdout="",stderr="",settled=!1,append=(current,chunk)=>options.tee?(current+chunk).slice(-MAX_CAPTURE_LENGTH):current.length>=MAX_CAPTURE_LENGTH?current:(current+chunk).slice(0,MAX_CAPTURE_LENGTH),finish=(error48,code=1)=>{settled||(settled=!0,timer&&clearTimeout(timer),error48?reject(error48):resolve11({code,stdout,stderr}))},timer=options.timeoutMs===void 0?void 0:setTimeout(()=>{child.kill("SIGTERM"),finish(new Error(`Command timed out after ${options.timeoutMs}ms`))},options.timeoutMs);capture&&(child.stdout?.setEncoding("utf8").on("data",chunk=>{stdout=append(stdout,chunk),options.tee&&process.stdout.write(chunk)}),child.stderr?.setEncoding("utf8").on("data",chunk=>{stderr=append(stderr,chunk),options.tee&&process.stderr.write(chunk)})),child.once("error",error48=>finish(error48)),child.once("close",code=>finish(void 0,code??1))})}});var init_dist=__esm({"../daemon-core/dist/index.js"(){"use strict";init_process();init_paths();init_registry();init_log();init_daemon();init_command()}});function record(value){return value!==null&&typeof value=="object"&&!Array.isArray(value)}function invalid(path27){throw new Error(`Invalid app profile: ${path27}`)}function text(value){return typeof value=="string"&&value.length<=4096&&Array.from(value).every(character=>character.charCodeAt(0)>8)}function strings(value){return Array.isArray(value)&&value.length<=200&&value.every(text)}function fields(value,required2,optional2,path27){(!record(value)||required2.some(key=>!Object.hasOwn(value,key))||Object.keys(value).some(key=>!required2.includes(key)&&!optional2.includes(key)))&&invalid(path27)}function stringMap(value){return record(value)&&Object.keys(value).length<=200&&Object.values(value).every(text)}function json(value,depth=0){return depth>25?!1:value===null||typeof value=="boolean"||text(value)?!0:typeof value=="number"?Number.isFinite(value):Array.isArray(value)?value.length<=1e3&&value.every(item=>json(item,depth+1)):record(value)&&Object.entries(value).every(([key,item])=>!["__proto__","prototype","constructor"].includes(key)&&json(item,depth+1))}function validateActions(value){let arrays=["open","close","title","navigationBar","statusBar","systemInfo","mtop","kvGet","kvSet","kvDelete","pageContext","noop","silent"];fields(value,["open","close","title","systemInfo","mtop","noop"],[...arrays,"responses","behaviors"],"actions");for(let key of arrays)value[key]!==void 0&&!strings(value[key])&&invalid(`actions.${key}`);value.responses!==void 0&&!record(value.responses)&&invalid("actions.responses"),value.behaviors!==void 0&&(!stringMap(value.behaviors)||!Object.values(value.behaviors).every(item=>BEHAVIORS.has(item)))&&invalid("actions.behaviors")}function validateAppProfileDefinition(value){json(value)||invalid("JSON"),JSON.stringify(value).length>65536&&invalid("definition exceeds 64 KiB"),fields(value,["name","label","appName","defaultAppVersion","uaTokens","globals","bridges","activeEvents","actions","schemes"],["uaFamily","uaTemplate","policies","settings","settingsGroup","miniProgram","imagePicker","geolocation","urlSyncHostSuffixes","overlay","popBeforeOpenParam","messageEvent","nativeBack","layerUrlProxy","rootContainer","titleBarHiddenPathnames","statusBarBackgroundColors","titleBarHostStyles","forceH5Mtop"],"definition");for(let key of["name","label","appName","defaultAppVersion"])(!text(value[key])||!value[key])&&invalid(key);/^[a-z][a-z0-9-]*(?:\/[a-z][a-z0-9-]*)?$/.test(value.name)||invalid("name");for(let key of["uaTokens","activeEvents","urlSyncHostSuffixes","titleBarHiddenPathnames"])value[key]!==void 0&&!strings(value[key])&&invalid(key);stringMap(value.globals)||invalid("globals"),(!Array.isArray(value.bridges)||value.bridges.length>20)&&invalid("bridges");let globals=new Set;for(let bridge of value.bridges)fields(bridge,["global","style"],["persistent"],"bridges"),(!text(bridge.global)||!/^[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*)*$/.test(bridge.global)||bridge.global.split(".").some(part=>["__proto__","prototype","constructor"].includes(part))||globals.has(bridge.global)||!BRIDGE_STYLES.has(bridge.style)||bridge.persistent!==void 0&&typeof bridge.persistent!="boolean")&&invalid("bridge"),globals.add(bridge.global);if(validateActions(value.actions),value.settingsGroup!==void 0&&!["fliggy","alipay"].includes(value.settingsGroup)&&invalid("settingsGroup"),value.uaFamily!==void 0&&!["aliapp","wechatMiniProgram"].includes(value.uaFamily)&&invalid("uaFamily"),value.uaTemplate!==void 0&&(fields(value.uaTemplate,["ios","android"],[],"uaTemplate"),(!text(value.uaTemplate.ios)||!text(value.uaTemplate.android))&&invalid("uaTemplate")),value.policies!==void 0){fields(value.policies,[],["titleBar","navigatorLanguage","networkResult","languages","defaultLanguage"],"policies");let p=value.policies;p.titleBar!==void 0&&!["default","taobao","fliggy","alipay","wechat"].includes(p.titleBar)&&invalid("policies.titleBar"),p.networkResult!==void 0&&!["default","alipay"].includes(p.networkResult)&&invalid("policies.networkResult"),p.navigatorLanguage!==void 0&&typeof p.navigatorLanguage!="boolean"&&invalid("policies.navigatorLanguage"),p.languages!==void 0&&(!strings(p.languages)||!p.languages.length)&&invalid("policies.languages"),p.defaultLanguage!==void 0&&(!text(p.defaultLanguage)||p.languages&&!p.languages.includes(p.defaultLanguage))&&invalid("policies.defaultLanguage")}(!Array.isArray(value.schemes)||value.schemes.length>100)&&invalid("schemes");for(let rule of value.schemes){fields(rule,["match"],["hostSuffixes","param","useCurrentOrigin","targetPath","targetHostPrefix","targetParams"],"scheme");for(let key of["match","param","targetPath","targetHostPrefix"])rule[key]!==void 0&&!text(rule[key])&&invalid(`scheme.${key}`);rule.hostSuffixes!==void 0&&!strings(rule.hostSuffixes)&&invalid("scheme.hostSuffixes"),rule.useCurrentOrigin!==void 0&&typeof rule.useCurrentOrigin!="boolean"&&invalid("scheme.useCurrentOrigin"),rule.targetParams!==void 0&&!stringMap(rule.targetParams)&&invalid("scheme.targetParams")}if(value.settings!==void 0){(!Array.isArray(value.settings)||value.settings.length>30)&&invalid("settings");let ids=new Set;for(let setting of value.settings){if(fields(setting,["id","label","type","target"],["choices","minimum","maximum"],"setting"),(!text(setting.id)||!/^[a-z][a-zA-Z0-9-]*$/.test(setting.id)||ids.has(setting.id)||!text(setting.label)||!["select","boolean","number","text","json"].includes(setting.type))&&invalid("setting"),ids.add(setting.id),record(setting.target)&&setting.target.option!==void 0)fields(setting.target,["option"],[],"setting.target"),setting.target.option!=="language"&&invalid("setting.target.option");else{fields(setting.target,["method"],["field"],"setting.target"),(!text(setting.target.method)||!setting.target.method||["__proto__","prototype","constructor"].includes(setting.target.method)||setting.target.field!==void 0&&(!text(setting.target.field)||["__proto__","prototype","constructor"].includes(setting.target.field)))&&invalid("setting.target.method");let method=setting.target.method;["open","close","title","navigationBar","statusBar","systemInfo","mtop","kvGet","kvSet","kvDelete","pageContext"].some(key=>value.actions[key]?.includes(method))&&invalid("setting targets a structural method")}setting.choices!==void 0&&(!Array.isArray(setting.choices)||!setting.choices.length||setting.choices.some(choice=>!record(choice)||!text(choice.label)||!text(choice.value)))&&invalid("setting.choices");for(let key of["minimum","maximum"])setting[key]!==void 0&&typeof setting[key]!="number"&&invalid(`setting.${key}`);setting.type==="select"&&!Array.isArray(setting.choices)&&invalid("setting.choices required"),setting.minimum!==void 0&&setting.maximum!==void 0&&setting.minimum>setting.maximum&&invalid("setting range"),"option"in setting.target&&!["select","text"].includes(setting.type)&&invalid("setting.option type")}}for(let key of["forceH5Mtop"])value[key]!==void 0&&typeof value[key]!="boolean"&&invalid(key);for(let key of["popBeforeOpenParam","messageEvent"])value[key]!==void 0&&!text(value[key])&&invalid(key);return value.statusBarBackgroundColors!==void 0&&!stringMap(value.statusBarBackgroundColors)&&invalid("statusBarBackgroundColors"),validateStructuredOptions(value),JSON.parse(JSON.stringify(value))}function validateStructuredOptions(value){let shapes={nativeBack:[[],["event","controlFunction","handler"]],geolocation:[["reverseGeocodeApi","version"],[]],layerUrlProxy:[["sourceHostPrefix","pathPrefix","targetHostSuffixes"],["defaultTargetHost"]],imagePicker:[["schemes","api","version","fcId","fcGroup","uploadUrlFunction","prefix","region"],[]],overlay:[["enabledParam","topRatioParam","radiusParam","maskAlphaParam","tapCloseParam","defaultTopRatio","defaultRadius","defaultMaskAlpha","defaultTapClose"],["heightRatioParam","tapCloseSelectors","silentTapClose","maxWidthPx","maxWidthMinAppVersion"]]};for(let[key,[required2,optional2]]of Object.entries(shapes))if(value[key]!==void 0){fields(value[key],required2,optional2,key);for(let[field,item]of Object.entries(value[key]))(field==="maxWidthPx"?typeof item=="number"&&Number.isFinite(item)&&item>0:field==="maxWidthMinAppVersion"?typeof item=="string"&&/^\d+(?:\.\d+)*$/.test(item):field.startsWith("default")&&field!=="defaultTargetHost"?field==="defaultTapClose"?typeof item=="boolean":typeof item=="number":field==="silentTapClose"?typeof item=="boolean":["schemes","targetHostSuffixes","tapCloseSelectors"].includes(field)?strings(item):text(item))||invalid(`${key}.${field}`)}if(value.rootContainer!==void 0&&(fields(value.rootContainer,[],["statusBarHeightCookie"],"rootContainer"),value.rootContainer.statusBarHeightCookie!==void 0&&(fields(value.rootContainer.statusBarHeightCookie,["name"],["domain","path"],"rootContainer.statusBarHeightCookie"),Object.values(value.rootContainer.statusBarHeightCookie).every(text)||invalid("rootContainer.statusBarHeightCookie"))),value.titleBarHostStyles!==void 0&&(!Array.isArray(value.titleBarHostStyles)||value.titleBarHostStyles.some(rule=>(fields(rule,["hostSuffix"],["titleBarBackgroundColor","statusBarBackgroundColor"],"titleBarHostStyle"),!Object.values(rule).every(text))))&&invalid("titleBarHostStyles"),value.miniProgram!==void 0){fields(value.miniProgram,[],["paymentRoutes","nativeRoutes","messageRules"],"miniProgram");let shapes2={paymentRoutes:[["pathname","paymentParamsParam","successUrlParams","failureUrlParams"],["hostSuffixes","successResultParam","forwardParams","useCurrentOrigin"]],nativeRoutes:[["pathname","actions"],["hostSuffixes"]],messageRules:[["type","action"],["hostSuffixes"]]};for(let[key,list]of Object.entries(value.miniProgram)){(!Array.isArray(list)||list.length>100)&&invalid(`miniProgram.${key}`);for(let rule of list){fields(rule,...shapes2[key],`miniProgram.${key}`);for(let[field,item]of Object.entries(rule))(["hostSuffixes","successUrlParams","failureUrlParams","forwardParams","actions"].includes(field)?!strings(item):field==="useCurrentOrigin"?typeof item!="boolean":!text(item))&&invalid(`miniProgram.${key}.${field}`);key==="messageRules"&&!["stageBackData","closeAll"].includes(rule.action)&&invalid("miniProgram.messageRules.action"),key==="nativeRoutes"&&!rule.actions.every(action=>["navigateMiniProgram","subscribeMessage"].includes(action))&&invalid("miniProgram.nativeRoutes.actions")}}}}function validateAppProfileContribution(value){if(value===void 0)return;fields(value,["version","profiles"],[],"contribution"),(value.version!==1||!Array.isArray(value.profiles)||!value.profiles.length||value.profiles.length>20)&&invalid("contribution");let profiles=value.profiles.map(validateAppProfileDefinition);return JSON.stringify(profiles).length>256e3&&invalid("contribution exceeds 256 KiB"),profiles.some(profile=>profile.name.includes("/"))&&invalid("contribution names must be local identifiers"),new Set(profiles.map(profile=>profile.name)).size!==profiles.length&&invalid("duplicate profile name"),{version:1,profiles}}var BRIDGE_STYLES,APP_BRIDGE_BEHAVIORS,BEHAVIORS,init_app_profile_definition=__esm({"../client/dist/generated/app-profile-definition.js"(){"use strict";BRIDGE_STYLES=new Set(["windvane","fliggy","alipay","callback","btrip","invoke","callHandler","amap","didi","easybikeNative","mega","wechat","wechatMiniProgram"]),APP_BRIDGE_BEHAVIORS=["navigate","closeAll","closeBackData","postMessage","notifySubscribe","notifyUnsubscribe","notifyPost","sharedFileRead","sharedFileWrite","sharedDataGet","sharedDataSet","legacyBroadcastCreate","legacyBroadcastPost","legacyBroadcastClose","memoryGet","memorySet","memoryDelete","availabilityMap","userInfo","authCode","networkInfo","geolocation","permission","imagePicker","prefetch","fptTrack","mtopStream","previewFile","toast","unsupportedNativeInput","payment","userTrack","calendar","networkQualityMonitor","beaconRequest","voiceRecognition"],BEHAVIORS=new Set(APP_BRIDGE_BEHAVIORS)}});function parseToolboxIcon(value){if(typeof value!="string")return;let icon=value.trim();if(!icon||icon.length>32*1024)return;if(/^[a-z][a-z0-9-]{0,39}$/.test(icon))return{kind:"name",name:icon};if(/^(?:<\?xml\s[^>]*\?>\s*)?<svg\b[^>]*(?:\/>|>[\s\S]*<\/svg\s*>)$/i.test(icon)){let svg=/<svg\b[^>]*\sxmlns\s*=/i.test(icon)?icon:icon.replace(/<svg\b/i,'<svg xmlns="http://www.w3.org/2000/svg"');try{return{kind:"image",src:`data:image/svg+xml,${encodeURIComponent(svg)}`,.../\bcurrentColor\b/i.test(svg)?{monochrome:!0}:{}}}catch{return}}let dataHeader=/^data:image\/(?:svg\+xml|png|jpeg|gif|webp|avif)(?:;charset=utf-8|;utf8)?(?:;base64)?,/i.exec(icon);if(dataHeader&&icon.length>dataHeader[0].length)return{kind:"image",src:icon};try{let url2=new URL(icon);if(["http:","https:"].includes(url2.protocol)&&!url2.username&&!url2.password)return{kind:"image",src:url2.href}}catch{}}var init_toolbox_icon=__esm({"../client/dist/generated/toolbox-icon.js"(){"use strict"}});function resolvePageEvalExpression(params){if(typeof params.expression!="string"||!params.expression.trim())throw new Error("Invalid expression");if(params.args===void 0)return params.expression;if(!Array.isArray(params.args))throw new Error("page_eval args must be an array");return`(${params.expression})(...JSON.parse(${JSON.stringify(JSON.stringify(params.args))}))`}function validatePageUserScriptParams(params){if(!Number.isSafeInteger(params?.tabId)||params.tabId<0)throw new Error("Invalid target tab");if(typeof params.worldId!="string"||!/^[a-z][a-z0-9-]{0,63}$/.test(params.worldId))throw new Error("Invalid user script worldId");if(typeof params.code!="string"||!params.code.trim()||params.code.length>256*1024)throw new Error("User script code must be non-empty and within 256 KiB characters")}function actionRequiresTabId(action){return typeof action=="string"&&TAB_ID_REQUIRED_ACTION_SET.has(action)}function validateRequiredActionTabId(action,data){let cookieAction=action==="get_cookie"||action==="set_cookie";if(!actionRequiresTabId(action)&&!cookieAction)return;let input2=data&&typeof data=="object"&&!Array.isArray(data)?data:void 0,tabId=input2?.tabId;if(cookieAction&&tabId===void 0){if(action==="set_cookie"&&input2?.reload===!0)throw new Error("set_cookie: reload requires tabId");if(typeof input2?.url!="string"||!input2.url.trim())throw new Error(`${action}: specify url or tabId`);return}if(typeof tabId!="number"||!Number.isSafeInteger(tabId)||tabId<0)throw new Error(`${action} requires a numeric tabId. Call tab_open or tab_list to obtain a tabId.`)}function isBrowserCapabilityAction(value){return typeof value=="string"&&Object.hasOwn(BROWSER_CAPABILITY_ACTIONS,value)}var BROWSER_DEVICE_PRESET_NAMES,APP_PROFILE_NAMES,TAB_ID_REQUIRED_ACTIONS,TAB_ID_REQUIRED_ACTION_SET,PAGE_ACT_ACTIONS,EXTENSION_BROWSER_ACTIONS,BROWSER_CAPABILITY_ACTIONS,init_browser_action_protocol=__esm({"../client/dist/generated/browser-action-protocol.js"(){"use strict";BROWSER_DEVICE_PRESET_NAMES=["iphone-duo-folded","iphone-duo-unfolded","iphone-17-pro","iphone-17e","pixel-11","ipad-mini-a17-pro","galaxy-s26","pura-x-max","iphone-15-pro","iphone-se","pixel-8","ipad-mini","galaxy-s23"],APP_PROFILE_NAMES=["fliggy","taobao","wechat","tmall","alipay","koubei","taobao-tj","taobao-live","xianyu","etao","eleme","damai","btrip","amap","qianwen","lingyou","didi","easybike"];TAB_ID_REQUIRED_ACTIONS=["tab_checkpoint","capture_checkpoint","get_requests","get_logs","get_events","set_mock","get_mocks","page_screenshot","tab_close","page_click","page_drag","page_type","page_scroll","page_hover","page_eval","page_inspect","page_snapshot","page_press","page_wait","page_navigate","page_upload","page_download","page_frames","set_device_emulation","set_app_profile","set_timezone","run_actions"],TAB_ID_REQUIRED_ACTION_SET=new Set(TAB_ID_REQUIRED_ACTIONS);PAGE_ACT_ACTIONS=["page_click","page_drag","page_type","page_hover","page_scroll","page_press","page_upload","page_eval"],EXTENSION_BROWSER_ACTIONS={tab_checkpoint:!0,capture_checkpoint:!0,get_requests:!0,get_logs:!0,get_events:!0,set_mock:!0,get_mocks:!0,set_rule:!0,get_rules:!0,send_request:!0,send_mtop_request:!0,browser_release:!0,page_screenshot:!0,tab_open:!0,tab_close:!0,tab_list:!0,tab_group:!0,page_click:!0,page_drag:!0,page_type:!0,page_scroll:!0,page_hover:!0,page_eval:!0,page_runtime:!0,page_inspect:!0,page_snapshot:!0,page_press:!0,page_wait:!0,page_navigate:!0,page_upload:!0,page_frames:!0,set_device_emulation:!0,set_app_profile:!0,set_timezone:!0,get_cookie:!0,set_cookie:!0,request_domain_permission:!0,run_actions:!0},BROWSER_CAPABILITY_ACTIONS={...EXTENSION_BROWSER_ACTIONS,page_download:!0}}});var APP_PROFILE_NAME_LIST,DEVICE_PRESET_TYPE,PAGE_DIAGNOSTICS_PARAM,PAGE_OBSERVE_PARAM,PAGE_ACTION_RESULT,COMMANDS,COMMAND_MAP,init_commands=__esm({"../client/dist/commands.js"(){"use strict";init_browser_action_protocol();APP_PROFILE_NAME_LIST=APP_PROFILE_NAMES.join("/"),DEVICE_PRESET_TYPE=BROWSER_DEVICE_PRESET_NAMES.map(name=>JSON.stringify(name)).join(" | "),PAGE_DIAGNOSTICS_PARAM={name:"diagnostics",type:"object | boolean",description:"默认关闭;传 true 返回动作期间新增的 error logs/业务 requests,或传对象自定义通道与过滤",details:["logs: boolean | { level, limit, filter };true 默认采集 error 日志","requests: boolean | { count, filter, source, includeBody, includeHeaders, maxBodySize, fields, keysOnly }","events: boolean | { source, event_type, filter, limit, includeRaw };埋点需显式开启","各通道过滤字段同 get_logs / get_requests / get_events;observe=false 时仍返回诊断增量,但不等待 DOM/导航稳定"]},PAGE_OBSERVE_PARAM={name:"observe",type:"object | false",description:"默认开启 DOM/导航观察;传 false 关闭,不影响显式请求的 diagnostics",details:["quietMs: number,DOM 变化后的稳定窗口,默认 100ms","firstChangeTimeoutMs: number,无 DOM 变化时的观察窗口,默认 500ms","timeoutMs: number,DOM 观察阶段最大时间,默认 3000ms","navigationGraceMs: number,低信息量点击/按键的导航宽限,默认 1000ms;相关网络活动可延长宽限","navigationTimeoutMs: number,导航就绪最大等待时间,默认 15000ms","networkIdleMs: number,文档完成且相关请求归零后的静默时间,默认 500ms","contentReadyAfterMs: number,结构稳定兜底保护期,默认 min(5000, navigationTimeoutMs / 2),并限制在导航超时前"]},PAGE_ACTION_RESULT=["默认返回 { action, observation };action.success 只表示动作成功,业务效果需结合 observation 和目标状态判断。","observe=false 且未开启 diagnostics 时返回裸动作结果(如 { clicked: true }),没有 action/observation;开启 diagnostics 时返回 { action, diagnostics }。","包装结果中的 action.stage=precondition 表示未派发,省略 observation/diagnostics;dispatch-uncertain 表示可能已派发,先查看 action.attempt 与可用观察或最小快照核验,避免重复提交。CLI 单次调用失败以退出码 1 结束;脚本需检查 action.success。","observation.effects 返回通知、控件和焦点增量,可直接复用 node.ref/selector;changed=true 且 effects 为空不表示失败。","effects.texts 按需返回普通可见文本的 selector/text,不代表可点击控件或业务成功;超限或覆盖不完整时仍提示补快照。","fullSnapshotRecommended/snapshotReasons 提示是否补充快照;openedTabs 返回可继续操作的 tabId 和 ready。navigation 模式的 ready 表示新页面就绪。","显式开启的诊断通道在 diagnostics 中返回动作期间增量,与 observe 独立。"],COMMANDS=[{name:"browser_control",description:"把控制会话交给用户;用户在 Mearl 浏览器管理页交还后重新观察页面",params:[{name:"operation",type:'"handoff" | "resume"',required:!0,description:"交给用户操作;resume 仅在用户明确交还后使用"},{name:"tabId",type:"number",description:"可选的目标页面"},{name:"reason",type:"string",description:"用户需要处理的事项"}],notes:["必须携带 --session;接管停止后续派发,已经发出的操作可能仍然生效。"]},{name:"page_download",description:"先监听再点击,等待下载完成并创建浏览器文件产物",outputFlag:!0,params:[{name:"tabId",type:"number",required:!0,description:"下载来源页面"},{name:"trigger",type:"object",required:!0,description:"page_click 参数,不含 tabId"},{name:"url",type:"string",description:"预期下载 URL;扩展无法通过 referrer 归属时需显式指定"},{name:"timeout",type:"number",description:"下载等待毫秒,默认 30000,范围 1000–300000"}],notes:["--output 把文件分块保存到调用方机器;未指定时返回 artifactId,可供 page_upload 复用。","共享 CDP 浏览器保持原下载目录;Chrome 未返回文件路径时明确报错。超时不能直接重复点击。"]},{name:"tab_checkpoint",description:"为目标标签页建立日志、请求和埋点增量边界",params:[{name:"tabId",type:"number",required:!0,description:"目标标签页 ID,从 tab_open 获取"}],examples:[`tab_checkpoint --payload '{"tabId":12345}'`]},{name:"get_requests",description:"获取最近的网络请求(mtop 或普通 xhr/fetch)",params:[{name:"tabId",type:"number",required:!0,description:"目标标签页 ID,从 tab_list 获取"},{name:"count",type:"number",description:"返回条数,默认 10"},{name:"source",type:'"mtop" | "requests" | "all"',description:"数据来源,不填时默认 mtop;all 返回全部业务请求"},{name:"filter",type:"string",description:"按 URL 或 API 名称过滤,支持正则"},{name:"since",type:"number",description:"只返回最近 N 秒内的请求"},{name:"after",type:"string",description:"只返回指定 tab checkpoint 或同类查询 cursor 之后的请求"},{name:"includeBody",type:"boolean",description:"是否包含请求/响应体;指定 fields 时默认 false,否则默认 true"},{name:"includeHeaders",type:"boolean",description:"是否包含请求/响应头,默认 false"},{name:"maxBodySize",type:"number",description:"单个请求/响应体最大字符数,默认 50000"},{name:"fields",type:"string[]",description:"从响应体提取指定字段路径,最多 100 个"},{name:"keysOnly",type:"boolean",description:"只返回数据结构,不返回叶子值"}],notes:["流式请求开始后即进入缓冲区;页面及 App 桥代发的 MTop SSE 都归入 mtop。无法归属当前页面 target 的 Service Worker 请求不在采集范围内。"],result:["nextCursor 用于同类查询续读,hasMore 表示还有数据,gap 表示缓冲区淘汰造成缺口;checkpoint cursor 可分别用于三类查询的初始边界。","省略正文时不返回 postData / responseBody 字段;指定 fields 后需要同时读取全文时显式传 includeBody:true。","isPending 标记未完成请求;SSE 的 responseBody 保存按序到达的 event/data/timestamp/duration 分片。敏感请求头返回脱敏值。"],examples:[`get_requests --payload '{"tabId":12345,"count":5}'`,`get_requests --payload '{"tabId":12345,"source":"mtop","filter":"cart"}'`]},{name:"get_logs",description:"获取浏览器控制台日志",params:[{name:"tabId",type:"number",required:!0,description:"目标标签页 ID,从 tab_list 获取"},{name:"limit",type:"number",description:"返回最新 N 条,默认 100"},{name:"level",type:"string",description:"按日志级别过滤:log/info/warn/error/all"},{name:"filter",type:"string",description:"按内容过滤,支持正则"},{name:"since",type:"number",description:"只返回最近 N 秒内的日志"},{name:"after",type:"string",description:"只返回指定 tab checkpoint 或同类查询 cursor 之后的日志"}],result:["nextCursor 用于同类查询续读,hasMore 表示还有数据,gap 表示缓冲区淘汰造成缺口;checkpoint cursor 可分别用于三类查询的初始边界。"],examples:[`get_logs --payload '{"tabId":12345,"limit":10,"level":"error"}'`]},{name:"get_events",description:"获取 RUM/aplus/ARMS 埋点事件",params:[{name:"tabId",type:"number",required:!0,description:"目标标签页 ID,从 tab_list 获取"},{name:"source",type:'"rum" | "aplus" | "arms" | "all"',description:"数据来源,默认 all"},{name:"event_type",type:"string",description:"按事件类型过滤,支持正则,如 CLK/PV"},{name:"filter",type:"string",description:"按 name 或 url 过滤,支持正则"},{name:"since",type:"number",description:"只返回最近 N 秒内的事件"},{name:"after",type:"string",description:"只返回指定 tab checkpoint 之后的事件"},{name:"limit",type:"number",description:"返回条数,默认 20"},{name:"includeRaw",type:"boolean",description:"返回完整 URL、_raw 和 _context;默认 false"}],notes:["tab_open 新页从首屏采集;既有页面首次查询才启用采集,需要刷新或重新触发埋点。同批事件不会被 limit 拆开。"],result:["nextCursor 用于同类查询续读,hasMore 表示还有数据,gap 表示缓冲区淘汰造成缺口;checkpoint cursor 可分别用于三类查询的初始边界。","captureStatus 为 armed/active/inactive;空结果附 hint 时按提示刷新或触发。默认去除 tracking URL query 与 _raw/_context,includeRaw=true 时保留。"],examples:[`get_events --payload '{"tabId":12345,"source":"aplus","event_type":"CLK","limit":10}'`,`get_events --payload '{"tabId":12345,"filter":"order","includeRaw":true,"limit":1}'`,`get_events --payload '{"tabId":12345,"source":"all","limit":20}'`]},{name:"set_mock",description:"设置 API mock 数据",params:[{name:"tabId",type:"number",required:!0,description:"目标标签页 ID,从 tab_list 获取"},{name:"apiName",type:"string",required:!0,description:"API 名称或正则表达式"},{name:"mockData",type:"object",description:"完整 mock 响应数据(与 fields 二选一)"},{name:"fields",type:"array",description:"按字段路径修改真实响应(与 mockData 二选一)"},{name:"enabled",type:"boolean",description:"是否启用,默认 true。false 时恢复真实数据"},{name:"duration",type:"number",description:"完整响应时长(毫秒):mock 的总耗时,绕过真实服务器精确控制"},{name:"conditions",type:"object",description:"请求 query/body 字段子集匹配;$index 从 0 开始指定调用顺序"}],notes:["启用时至少提供 mockData 或非空 fields;非空 fields 优先。fields 每项 { path: string, value: any },path 支持点号和数组索引。","相同 apiName 的多条无条件 Mock 会覆盖;conditions 子集匹配 query/body(含 data 内层),不同条件可共存;$index 从 0 起控制调用顺序,不参与字段匹配。","大字段可用顶层 @<绝对路径> 文件引用或 --payload-file;文件展开后仍受 Native Messaging 单条消息大小限制。"],examples:[`set_mock --payload '{"tabId":12345,"apiName":"mtop.cart.query","mockData":{"ret":["SUCCESS::调用成功"]}}'`,"set_mock --payload-file ./mock-data.json"]},{name:"get_mocks",description:"查看当前生效的 mock 列表",params:[{name:"tabId",type:"number",required:!0,description:"目标标签页 ID,从 tab_list 获取"},{name:"apiName",type:"string",description:"按 API 名称或正则表达式过滤"}],examples:[`get_mocks --payload '{"tabId":12345}'`]},{name:"set_rule",description:"添加浏览器请求规则;enabled=false 且传 ruleId 时彻底删除规则",params:[{name:"ruleId",type:"number",description:"删除时必填,从 get_rules 获取"},{name:"enabled",type:"boolean",description:"省略时添加;false 时按 ruleId 删除"},{name:"actionType",type:'"redirect" | "block" | "allow" | "upgradeScheme" | "modifyHeaders"',description:"添加时必填,规则动作"},{name:"filter",type:"string",description:"添加时必填,URL 过滤表达式"},{name:"redirectUrl",type:"string",description:"redirect 动作的目标 URL"},{name:"requestHeaders",type:"array",description:"modifyHeaders 动作的请求头修改列表",details:['每项 { header: string, operation: "set" | "append" | "remove", value?: string };set/append 需 value']},{name:"responseHeaders",type:"array",description:"modifyHeaders 动作的响应头修改列表",details:['每项 { header: string, operation: "set" | "append" | "remove", value?: string };set/append 需 value']},{name:"initiatorDomains",type:"string",description:"发起方域名过滤"},{name:"resourceTypes",type:"string[]",description:"资源类型过滤"},{name:"priority",type:"number",description:"规则优先级"},{name:"description",type:"string",description:"规则说明"}],notes:["扩展模式规则持久化;CDP 仅支持会话级 modifyHeaders 请求头 set,不支持响应头、initiatorDomains 或其他动作。Provider 是否支持以其能力声明为准。","扩展模式会检查规则请求 URL 和显式来源域名的访问权限;缺失时仍保存规则,返回 warnings 和 missingOrigins,不自动弹窗。可在请求规则页面授权,或按提示调用 request_domain_permission。复杂 URL 表达式无法完整推断域名时会提示手动检查。"],examples:[`set_rule --payload '{"actionType":"block","filter":"^https://example\\\\.com/ads/.*"}'`,`set_rule --payload '{"ruleId":42,"enabled":false}'`]},{name:"get_rules",description:"查看当前模式的请求规则;扩展模式包含 Options 面板配置的规则",examples:["get_rules"]},{name:"send_request",description:"发送 HTTP 请求,自动携带浏览器 Cookie,支持 multipart 和原始二进制上传",params:[{name:"url",type:"string",required:!0,description:"完整目标 URL"},{name:"method",type:"string",description:"HTTP 方法,默认 GET"},{name:"headers",type:"object",description:"自定义请求头"},{name:"params",type:"object",description:"URL 查询参数"},{name:"body",type:"any",description:"请求体(传对象时自动 JSON 序列化)"},{name:"bodyFile",type:"object",description:"原始二进制请求体:filePath 或 base64 二选一,可选 contentType(默认 application/octet-stream);与 body/formData/files 互斥"},{name:"formData",type:"object",description:"multipart 文本字段(值支持 string/number/boolean)"},{name:"files",type:"SendRequestFile[]",description:"multipart 文件,最多 20 个、总计不超过 40 MiB;Base64 文件总计不超过 7 MiB。每项传 fieldName 和绝对 filePath,或传 base64 + filename",details:["fieldName: string(必填);filePath: string 与 base64: string 二选一","filename: string,base64 时必填,filePath 时默认文件 basename","contentType: string(可选),默认按文件名推断 MIME,否则 application/octet-stream"]},{name:"withCookies",type:"boolean",description:"是否附加浏览器 Cookie,默认 true"},{name:"responseType",type:'"json" | "text" | "auto"',description:"响应解析方式,默认 auto"},{name:"timeout",type:"number",description:"超时毫秒数,默认 30000"}],notes:["仅用于非 BUC 请求;BUC 接口使用 mearl buc,不手工传 Token、DPoP 或 Ticket。","body 不能与 formData/files 组合;bodyFile 以原始字节发送,不包 multipart boundary,不能用于 GET/HEAD。","bodyFile.filePath 属于 native-host,最大 40 MiB;base64 解码后最大 7 MiB。multipart 不手工设置 Content-Type,由 Mearl 生成 boundary。","filePath 属于 native-host 所在机器;无法引用远端路径时用 base64。BUC 上传的路径属于插件执行宿主。"],result:["返回 status、statusText、headers、body、bodyType、attachedCookieCount;bodyType 为 json/text/base64,二进制 body 需解码后保存。"],examples:[`send_request --payload '{"url":"https://api.example.com/data","method":"GET"}'`,`send_request --payload '{"url":"https://api.example.com/upload","method":"POST","formData":{"folder":"assets"},"files":[{"fieldName":"file","filePath":"/absolute/path/image.png"}]}'`,`send_request --payload '{"url":"https://api.example.com/upload","method":"POST","bodyFile":{"filePath":"/absolute/path/image.png","contentType":"image/png"}}'`]},{name:"send_mtop_request",description:"使用目标浏览器 Cookie 发起 mtop 请求,自动处理签名和 token",params:[{name:"api",type:"string",required:!0,description:"mtop API 名称"},{name:"data",type:"object",description:"请求数据"},{name:"version",type:"string",description:"API 版本,默认 1.0"},{name:"method",type:"string",description:"HTTP 方法,默认 GET"},{name:"appKey",type:"string",description:"签名使用的 appKey,默认 12574478"},{name:"env",type:'"prod" | "pre"',description:"请求环境,默认 prod"},{name:"timeout",type:"number",description:"超时毫秒数,默认 10000"}],notes:["需要目标浏览器有对应登录态;Mearl 自动处理签名,不依赖页面脚本。api 以 mopen. 开头时使用 mopen 协议。","env=prod 使用 h5api.m.taobao.com,pre 使用 h5api.wapa.taobao.com。"],result:["返回 success、response、requestData;业务成功需检查 response.ret。"],examples:[`send_mtop_request --payload '{"api":"mtop.trade.order.detail","data":{"orderId":"123"}}'`]},{name:"browser_list",description:"列出所有浏览器及其连接状态、类型和 Provider 托管实例信息",summary:"列出本地及远端浏览器与连接状态",examples:["browser_list"]},{name:"browser_release",description:"释放当前浏览器的调试控制和会话级临时效果(含设备/时区模拟);不用于普通任务收尾,Provider 实例的行为以 mearl <providerId> 为准",params:[{name:"closeCreatedTabs",type:"boolean",description:"带 --session 时关闭会话创建的过程页,默认 false"},{name:"keepTabIds",type:"number[]",description:"保留的结果页面;复用的用户页面始终保留"},{name:"preserveEnvironment",type:"boolean",description:"带 --session 时默认 true,保留 Mock 与模拟现场;false 清理这些页面的环境"},{name:"keepArtifactIds",type:"string[]",description:"保留在浏览器宿主的文件产物;其余会话临时文件删除"}],notes:["带 --session 时可用于任务收尾,只释放该会话;未带会话时保留原浏览器级释放行为,活动会话存在时拒绝全局释放。"],summary:"释放浏览器调试控制和会话级临时效果",examples:["browser_release","browser_release --browser chrome-a"]},{name:"browser_launch",description:"启动本地 Chrome,或通过已注册 Provider 创建浏览器实例",params:[{name:"name",type:"string",description:"本地实例名称;使用 local Provider 时必填"},{name:"provider",type:"string",description:"运行环境,默认 local;可传 mearl --help 中展示的已注册 Provider ID"},{name:"providerOptions",type:"Record<string, JSON value>",description:"所选 Provider 声明的结构化启动参数;不能与顶层启动字段混用"},{name:"headless",type:"boolean",description:"本地 Provider 是否无头运行,默认 true"},{name:"userAgentMode",type:'"default" | "desktop"',description:"本地 UA 模式:default 使用默认 UA;desktop 使用匹配本机版本的 UA"},{name:"persistent",type:"boolean",description:"本地实例关闭后是否保留 Profile,默认 false"},{name:"url",type:"string",description:"登录完成后打开的初始页面"},{name:"executablePath",type:"string",description:"自定义 Chrome 可执行文件路径"},{name:"copyCookieDomains",type:'string[] | "mearl-services" | { presets?: ["mearl-services"]; domains?: string[] }',description:"从控制浏览器复制 Cookie:可传域名数组、Mearl 登录态预设,或组合预设与额外域名"}],examples:[`browser_launch --payload '{"provider":"brow","providerOptions":{}}'`,`browser_launch --payload '{"name":"figma","userAgentMode":"desktop","copyCookieDomains":["figma.com"]}'`,`browser_launch --payload '{"name":"with-cookies","copyCookieDomains":["example.com","sub.example.org"]}'`]},{name:"browser_close",description:"关闭指定托管浏览器,并按 Provider 策略保留或清理持久化数据",params:[{name:"browser",type:"string",required:!0,description:"托管浏览器的 browserId 或名称"},{name:"deleteProfile",type:"boolean",description:"强制删除持久化数据,默认 false"}],examples:[`browser_close --payload '{"browser":"managed:account-a"}'`,`browser_close --payload '{"browser":"account-b","deleteProfile":true}'`]},{name:"tab_open",description:"打开或按 URL 规则复用 Tab,并等待新页面加载完成",aliases:["tab_new","new_tab","tab_create","create_tab"],params:[{name:"url",type:"string",required:!0,description:"要打开的 URL"},{name:"active",type:"boolean",description:"是否激活目标 Tab,默认 false;扩展免打扰默认开启,使用后台焦点模拟,关闭后才切换前台;响应返回 activation"},{name:"openerTabId",type:"number",description:"来源 Tab ID;用于把目标 Tab 关联到来源侧边栏对话"},{name:"closeExisting",type:"boolean",description:"打开前先关闭 Agent 受控的已有标签页,默认 false"},{name:"group",type:"string",description:"把新 Tab 加入指定标题的标签页分组(同名分组存在则加入,否则新建)。仅扩展模式支持"},{name:"reuse",type:'"never" | "prefer" | "require"',description:"never 始终新开;prefer 优先复用;require 只允许复用。默认 never"},{name:"match",type:"object",description:"复用匹配规则:urlPattern(支持 *)、ignoreSearch、ignoreHash、onMultiple(error/first)"},{name:"restoreFocusOnClose",type:"boolean",description:"关闭本次新开的 active Tab 后恢复原活动标签页,默认 false"},{name:"emulation",type:"object",description:"开 tab 即进入移动端模拟态(首屏即移动态、无需 reload)。字段同 set_device_emulation 去掉 enabled/reload;与 appProfile、deviceShell=true、orientation=landscape、splitScreen=true 组合可首屏进入左右分屏"},{name:"appProfile",type:"string",description:'开 tab 即注入 App 客户端环境与 JSBridge;档案名同 set_app_profile,如 "fliggy"。需要 iframe WebView 和系统栏时同时传 emulation.deviceShell=true'},{name:"os",type:'"ios" | "android"',description:"与 appProfile 配合;容器系统,默认 ios"},{name:"bridgeConfig",type:"object",description:"与 appProfile 配合;声明式覆盖桥方法,形如 {methods:{api:{behavior|response|noop,silent?}}}"}],notes:["emulation / appProfile 只应用到新建 Tab;复用 Tab 要切换状态时用对应设置 action。","closeExisting 不能与复用或 openerTabId 组合;多匹配默认报错,match.onMultiple=first 可显式选择第一个。"],result:["返回 tabId、url、title、opened/reused;reused=true 的既有页面应保留。","active=true 时 activation 包含 tabActive、windowFocused、windowState、visibilityState;emulation 返回实际生效配置。","capture.cursor 是导航前诊断边界,可分别用于 get_logs/get_requests/get_events 的 after。"],examples:[`tab_open --payload '{"url":"https://example.com"}'`,`tab_open --payload '{"url":"https://example.com/page","reuse":"prefer","match":{"ignoreSearch":true}}'`,`tab_open --payload '{"url":"https://m.example.com","emulation":{"preset":"iphone-17-pro"}}'`,`tab_open --payload '{"url":"https://market.m.taobao.com/app/trip/rx-home/pages/home","appProfile":"fliggy"}'`,`tab_open --payload '{"url":"https://market.m.taobao.com/app/trip/rx-home/pages/home","appProfile":"fliggy","emulation":{"preset":"ipad-mini-a17-pro","orientation":"landscape","deviceShell":true,"splitScreen":true}}'`,`tab_open --payload '{"url":"https://example.com","appProfile":"fliggy","os":"android"}'`,`tab_open --payload '{"url":"https://example.com","group":"验证任务"}'`]},{name:"tab_close",description:"关闭指定标签页",aliases:["tab_remove","remove_tab","tab_delete","delete_tab"],params:[{name:"tabId",type:"number",required:!0,description:"要关闭的标签页 ID"}],examples:[`tab_close --payload '{"tabId":123}'`]},{name:"tab_list",description:"列出目标浏览器所有窗口中的标签页",aliases:["tabs","list_tabs","show_tabs"],examples:["tab_list"]},{name:"tab_group",description:"把同一窗口中的标签页加入分组,或通过 ungroup 取消分组并保留标签页;仅扩展模式支持",params:[{name:"tabIds",type:"number[]",required:!0,description:"标签页 ID,分组最多 100 个,取消分组最多 1000 个"},{name:"title",type:"string",required:!1,description:"分组标题;取消分组时省略"},{name:"ungroup",type:"boolean",required:!1,description:"为 true 时取消分组并保留标签页"}],examples:[`tab_group --payload '{"tabIds":[123,124],"title":"项目文档"}'`,`tab_group --payload '{"tabIds":[123,124],"ungroup":true}'`]},{name:"page_click",description:"点击页面元素,支持 CSS/@ref、可见文本或视口坐标定位",params:[{name:"selector",type:"string",description:"原生 CSS 选择器,或 page_snapshot / 页面动作 observation 返回的 @eN ref(必须带 @ 前缀)。不支持 :has-text/:visible 等 Playwright 私有伪类"},{name:"text",type:"string",description:"按可见文本(accessibility name)定位。需要时配合 role/exact 消歧;多匹配会报错并列出候选"},{name:"point",type:"{ x: number; y: number }",description:'按视口坐标点击(CSS 像素)。默认使用 outer-viewport;容器或 iframe 内坐标配合 coordinateSpace: "active-frame"'},{name:"frameId",type:"string",description:"浏览器扩展后端:显式指定 CSS/text 查询或 active-frame 坐标所属的 frame;省略时容器模式自动使用当前业务 frame"},{name:"coordinateSpace",type:'"outer-viewport" | "active-frame"',description:"仅配合 point 使用;默认 outer-viewport;浏览器扩展后端的 active-frame 会换算 iframe 偏移与缩放后派发可信输入"},{name:"role",type:"string",description:"配合 text 使用,按 AX role 过滤(如 button、link、heading)"},{name:"exact",type:"boolean",description:"配合 text 使用,默认 true 精确匹配;false 时按子串匹配"},{name:"scope",type:"string",description:"配合 text 使用,把文本匹配限制在指定 CSS 元素或 @eN ref 子树内,适合消除重复文案歧义"},{name:"clickMode",type:'"auto" | "dom" | "mouse" | "touch"',description:"默认 auto:可见页使用匹配设备的可信输入,隐藏页使用 DOM;dom/mouse/touch 可强制指定派发方式"},PAGE_OBSERVE_PARAM,PAGE_DIAGNOSTICS_PARAM,{name:"tabId",type:"number",required:!0,description:"目标标签页 ID"}],result:PAGE_ACTION_RESULT,notes:["selector / text / point 必须且只能提供一个。隐藏页 auto 使用 DOM;只有明确依赖真实用户手势时才激活页面。","原生 select 可按 option 文本点击;checkbox/radio 返回 controlState.checkedBefore/checkedAfter。"],examples:[`page_click --payload '{"tabId":12345,"text":"提交"}'`,`page_click --payload '{"tabId":12345,"text":"退款明细","role":"button"}'`,`page_click --payload '{"tabId":12345,"text":"确定","scope":"@e12"}'`,`page_click --payload '{"tabId":12345,"selector":"@e3"}'`,`page_click --payload '{"tabId":12345,"selector":".submit-btn"}'`,`page_click --payload '{"tabId":12345,"selector":".gesture-btn","clickMode":"touch"}'`,`page_click --payload '{"tabId":12345,"point":{"x":336,"y":117}}'`,`page_click --payload '{"tabId":12345,"point":{"x":196,"y":240},"coordinateSpace":"active-frame"}'`]},{name:"page_drag",description:"拖动页面元素或视口坐标,适用于轮播图、滑块和拖放",params:[{name:"from",type:"string | { x: number; y: number }",required:!0,description:"起点:原生 CSS、@eN ref,或 { x, y } 视口坐标(CSS 像素)"},{name:"to",type:"string | { x: number; y: number }",required:!0,description:"终点:原生 CSS、@eN ref,或 { x, y } 视口坐标(CSS 像素)"},{name:"dragMode",type:'"auto" | "dom" | "mouse" | "touch"',description:"默认 auto:可见页使用匹配设备的可信输入,隐藏页使用 DOM;dom/mouse/touch 可强制指定派发方式"},{name:"durationMs",type:"number",description:"拖动持续时间,0–5000ms,默认 400ms;内部自动分段移动"},PAGE_OBSERVE_PARAM,PAGE_DIAGNOSTICS_PARAM,{name:"tabId",type:"number",required:!0,description:"目标标签页 ID"}],result:PAGE_ACTION_RESULT,notes:["起点会自动滚入视口,终点必须同时位于当前视口;否则先滚动页面。隐藏页 auto 使用 DOM,不切换活动页。"],examples:[`page_drag --payload '{"tabId":12345,"from":{"x":350,"y":80},"to":{"x":80,"y":80}}'`,`page_drag --payload '{"tabId":12345,"from":"@e3","to":"#drop-zone","dragMode":"mouse"}'`]},{name:"page_type",description:"向输入框填写文本,兼容 React 受控组件",params:[{name:"selector",type:"string",required:!0,description:"原生 CSS 选择器,或 page_snapshot / 页面动作 observation 返回的 @eN ref(必须带 @ 前缀)"},{name:"text",type:"string",required:!0,description:"要填写的文本"},{name:"clearFirst",type:"boolean",description:"是否先清空原有内容,默认 true"},PAGE_OBSERVE_PARAM,PAGE_DIAGNOSTICS_PARAM,{name:"tabId",type:"number",required:!0,description:"目标标签页 ID"}],result:PAGE_ACTION_RESULT,examples:[`page_type --payload '{"tabId":12345,"selector":"@e6","text":"搜索关键词"}'`]},{name:"page_hover",description:"将鼠标悬停在页面元素上",params:[{name:"selector",type:"string",required:!0,description:"原生 CSS 选择器,或 page_snapshot / 页面动作 observation 返回的 @eN ref(必须带 @ 前缀)"},PAGE_OBSERVE_PARAM,PAGE_DIAGNOSTICS_PARAM,{name:"tabId",type:"number",required:!0,description:"目标标签页 ID"}],result:PAGE_ACTION_RESULT,examples:[`page_hover --payload '{"tabId":12345,"selector":".nav-menu"}'`]},{name:"page_scroll",description:"滚动页面或指定容器;页面根不可滚动时自动发现活动滚动区",params:[{name:"direction",type:'"up" | "down" | "top" | "bottom"',required:!0,description:"滚动方向"},{name:"distance",type:"number",description:"滚动距离(px),默认 600"},{name:"selector",type:"string",description:"目标滚动容器的原生 CSS 选择器,或 page_snapshot 返回的 @eN ref;不传时滚动页面"},{name:"containerPolicy",type:'"self" | "nearest"',description:"默认 self,要求 selector 本身可滚动;nearest 会在其不可滚动时使用最近的可滚动祖先"},PAGE_OBSERVE_PARAM,PAGE_DIAGNOSTICS_PARAM,{name:"tabId",type:"number",required:!0,description:"目标标签页 ID"}],result:[...PAGE_ACTION_RESULT,"action.data 返回 moved、atTop/atBottom、scrollYBefore/After、maxScrollY、resolvedContainer 和 ancestorDistance;自动发现的内部容器提供可复用 containerSelector。"],examples:[`page_scroll --payload '{"tabId":12345,"direction":"down"}'`,`page_scroll --payload '{"tabId":12345,"direction":"bottom"}'`,`page_scroll --payload '{"tabId":12345,"selector":".virtual-list","direction":"down","distance":800}'`,`page_scroll --payload '{"tabId":12345,"selector":"@e8","containerPolicy":"nearest","direction":"bottom"}'`]},{name:"page_runtime",description:"页面运行时传输适配器;插件使用 PluginPageClient 或 app.page",params:[{name:"operation",type:"string",required:!0,description:"resolve/attach/get/send/detach/activation"}]},{name:"page_eval",description:"在页面上下文中执行任意 JavaScript 表达式",params:[{name:"expression",type:"string",required:!0,description:"要执行的 JS 表达式;传 args 时须求值为函数"},{name:"args",type:"unknown[]",description:"传给页面函数的 JSON 参数;SDK/CLI 自动处理大参数分块,保持指定执行环境"},{name:"executionWorld",type:"string",description:"main(默认)读取网页 JS;isolated 使用命名隔离环境,扩展连接无需 debugger"},{name:"worldId",type:"string",description:"isolated 必填,小写字母开头,允许数字和连字符,最长 64 字符"},{name:"awaitPromise",type:"boolean",description:"表达式返回 Promise 时等待完成,默认 true"},{name:"frameId",type:"string",description:"page_frames 返回的目标 frame ID,扩展/CDP 均支持;省略时容器/设备外壳使用当前业务 frame,普通页面使用主 frame"},{...PAGE_OBSERVE_PARAM,type:"object",description:"仅在表达式会修改页面且需要观察结果时显式传入;不传保持轻量裸执行"},PAGE_DIAGNOSTICS_PARAM,{name:"tabId",type:"number",required:!0,description:"目标标签页 ID"}],notes:["优先使用结构化 action;仅在其无法表达需求时执行最小范围脚本。"],result:["默认返回 { result };observe 对象启用观察并返回 { action, observation };仅开启 diagnostics 时返回 { action, diagnostics }。diagnostics=false 不启用包装。失败阶段语义同 page_click。"],examples:[`page_eval --payload '{"tabId":12345,"expression":"document.title"}'`]},{name:"page_inspect",description:"查询 DOM 元素的控件状态、数量、边框盒、计算样式、遮挡、溢出和最近滚动容器",params:[{name:"selector",type:"string",description:"原生 CSS、page_snapshot 返回的 @eN ref,或 DevTools Elements 当前选区 $0;做全页溢出诊断时可省略"},{name:"filter",type:'"all" | "overflowing" | "horizontal-overflow" | "vertical-overflow" | "scrollable"',description:"结果过滤;省略 selector 时必须指定非 all 的过滤条件"},{name:"styles",type:"string[]",description:"要返回的计算样式属性,默认 display/position/box-sizing/overflow-x/overflow-y"},{name:"maxResults",type:"number",description:"最多返回的明细数,默认 20,最大 100;未触发 scanTruncated 时 count 为完整命中数"},{name:"includeOuterHTML",type:"boolean",description:"是否返回 outerHTML(最多 3000 字符);$0 默认 true,其他目标默认 false"},{name:"tabId",type:"number",required:!0,description:"目标标签页 ID"}],result:["matches[] 包含 boundingBox、computedStyle、hitTest、scroll 溢出量及可用的 scrollContainer。receivesPointerEvents=false 时读取 occludedBy。","state 返回原生/ARIA 状态及来源;缺失字段表示未知。","$0 还返回 resolvedSelector、属性、XPath 和可用框架信息。"],examples:[`page_inspect --payload '{"tabId":12345,"selector":".form-field","styles":["display","width"]}'`,`page_inspect --payload '{"tabId":12345,"selector":"@e8"}'`,`page_inspect --payload '{"tabId":12345,"selector":"$0"}'`,`page_inspect --payload '{"tabId":12345,"filter":"horizontal-overflow"}'`,`page_inspect --payload '{"tabId":12345,"filter":"scrollable"}'`]},{name:"page_press",description:"在页面中按下键盘按键或组合键",params:[{name:"key",type:"string",required:!0,description:"按键名称:Enter/Tab/Escape/Backspace 等"},{name:"modifiers",type:"string[]",description:"修饰键数组:ctrl/alt/shift/meta/cmd"},{name:"pressMode",type:'"auto" | "dom" | "keyboard"',description:"派发模式;auto 默认在隐藏页降级为 DOM 键盘事件"},PAGE_OBSERVE_PARAM,PAGE_DIAGNOSTICS_PARAM,{name:"tabId",type:"number",required:!0,description:"目标标签页 ID"}],notes:["隐藏页 DOM 模式支持 Tab 焦点移动、原生控件 Enter/Space 激活和输入框 Enter 提交;编辑、选择、方向键和页面滚动等原生行为需可见页与 pressMode=keyboard。"],result:[...PAGE_ACTION_RESULT,"action.data.dispatchMode / fallbackReason / defaultAction 说明实际输入路径。"],examples:[`page_press --payload '{"tabId":12345,"key":"Enter"}'`]},{name:"page_wait",description:"等待指定时间、元素状态、可见文本或页面条件成立",params:[{name:"time",type:"number",description:"等待毫秒数(与 selector/text/condition 四选一)"},{name:"selector",type:"string",description:"目标 CSS 选择器(与 time/text/condition 四选一)"},{name:"state",type:'"attached" | "detached" | "visible" | "hidden"',description:"selector 的目标状态,默认 attached"},{name:"text",type:"string",description:"等待页面出现的可见文本"},{name:"exact",type:"boolean",description:"text 是否精确匹配,默认 false"},{name:"condition",type:"string",description:"在页面主上下文轮询的 JS 表达式,返回 truthy 时结束"},{name:"timeout",type:"number",description:"等待超时毫秒数,默认 10000"},{name:"interval",type:"number",description:"轮询间隔毫秒数,默认 200"},{name:"tabId",type:"number",required:!0,description:"目标标签页 ID"}],notes:["time / selector / text / condition 必须且只能提供一个;time 范围 0–60000ms。页面交互已有内置观察,仅在需要独立等待条件时使用。"],examples:[`page_wait --payload '{"tabId":12345,"time":1000}'`,`page_wait --payload '{"tabId":12345,"selector":".dialog","state":"visible"}'`,`page_wait --payload '{"tabId":12345,"selector":".loading","state":"hidden"}'`,`page_wait --payload '{"tabId":12345,"text":"提交成功"}'`,`page_wait --payload '{"tabId":12345,"condition":"window.appReady === true","timeout":30000}'`]},{name:"page_navigate",description:"在当前标签页内导航到 URL、刷新页面,或沿浏览历史后退/前进",params:[{name:"url",type:"string",description:"要导航到的 URL;与 refresh/history 互斥"},{name:"refresh",type:"boolean",description:"为 true 时直接重新加载当前页面;与 url/history 互斥"},{name:"history",type:'"back" | "forward"',description:"沿当前标签页浏览历史后退或前进;与 url/refresh 互斥"},{name:"tabId",type:"number",required:!0,description:"目标标签页 ID"}],notes:["url / refresh=true / history 必须且只能提供一个。"],examples:[`page_navigate --payload '{"tabId":12345,"url":"https://example.com/page2"}'`,`page_navigate --payload '{"tabId":12345,"refresh":true}'`,`page_navigate --payload '{"tabId":12345,"history":"back"}'`]},{name:"page_upload",description:'向 <input type="file"> 元素上传一个或多个文件',params:[{name:"files",type:"object[]",description:"调用方绝对路径 {filePath} 或浏览器产物 {artifactId};与 filePaths 二选一"},{name:"selector",type:"string",required:!0,description:"原生 CSS 选择器,或 page_snapshot / 页面动作 observation 返回的 @eN ref(必须带 @ 前缀),必须指向 input[type=file]"},{name:"filePaths",type:"string[]",description:"浏览器宿主上的绝对路径数组;与 files 二选一"},PAGE_OBSERVE_PARAM,PAGE_DIAGNOSTICS_PARAM,{name:"tabId",type:"number",required:!0,description:"目标标签页 ID"}],result:PAGE_ACTION_RESULT,notes:["直接写入 input[type=file],不依赖 file chooser;隐藏的文件节点也可上传。外部 Provider 的文件中转能力查询 mearl <providerId>。"],examples:[`page_upload --payload '{"tabId":12345,"selector":"#file-input","filePaths":["/Users/me/photo.jpg"]}'`]},{name:"page_snapshot",description:"获取带 @ref 的页面结构快照,默认使用无障碍树,也可显式读取渲染 DOM",params:[{name:"depth",type:"number",description:"树深度,默认 15,复杂页面可调大"},{name:"mode",type:'"full" | "interactive" | "viewport" | "dom"',description:"默认 full;interactive/viewport 裁剪 AX 树;AX 信息缺失时可显式使用 dom 读取渲染 DOM"},{name:"rootSelector",type:"string",description:"只获取指定 CSS 元素的局部子树,可与 mode 组合;与 rootRef 互斥"},{name:"rootRef",type:"string",description:"以已有 @eN ref 为根获取局部子树;与 rootSelector 互斥"},{name:"ancestorDepth",type:"number",description:"rootRef 向上扩展的 DOM 祖先层数,默认 0,最大 20"},{name:"query",type:"{ text?: string; role?: string; exact?: boolean }",description:"服务端按 name / role 过滤当前模式的树,只保留命中节点及祖先路径"},{name:"maxNodes",type:"number",description:"最多输出节点数,0 表示不限制"},{name:"maxChars",type:"number",description:"快照文本最大字符数,默认 60000,超出保留首尾;传 0 不限制"},{name:"tabId",type:"number",required:!0,description:"目标标签页 ID"}],notes:["query.text / query.role 至少提供一个;query.exact 默认 true。每次快照刷新有效 ref 集合。","interactive 无 AX 控件时回退到 viewport,不会自动改用 dom;Canvas 内容需截图。"],result:["返回 snapshot、elementCount、outputNodeCount、mode;截断时 truncated=true。","snapshot 中的 @eN 可直接用于操作;内部节点映射仅保存在运行时。无名称、无 ref 且无状态的分组折叠到子节点。","query 返回 matches 与完整 matchCount,matches 最多 100 项,裁剪时 matchesTruncated=true。容器/iframe 的视口裁剪返回 outerViewport、contentViewport 和滚动位置。"],examples:[`page_snapshot --payload '{"tabId":12345}'`,`page_snapshot --payload '{"tabId":1,"mode":"viewport"}'`,`page_snapshot --payload '{"tabId":1,"mode":"dom"}'`,`page_snapshot --payload '{"tabId":1,"rootSelector":"[role=dialog]"}'`,`page_snapshot --payload '{"tabId":1,"rootRef":"@e8","ancestorDepth":1}'`,`page_snapshot --payload '{"tabId":1,"query":{"text":"保存","role":"button"}}'`]},{name:"page_screenshot",description:"获取当前视口或指定元素截图",outputFlag:!0,params:[{name:"selector",type:"string",description:"CSS 选择器,提供后只截取该元素区域"},{name:"format",type:'"png" | "jpeg"',description:"图片格式,默认 png"},{name:"quality",type:"number",description:"JPEG 压缩质量(0-100),默认 80"},{name:"captureMode",type:'"cdp" | "visible"',description:"默认 cdp;visible 使用活动标签页截图,普通网页无需 debugger;设备模拟复用模拟会话并截取业务视口,不支持 selector"},{name:"tabId",type:"number",required:!0,description:"目标标签页 ID"}],notes:["使用 --output <path> 保存图片;省略时 stdout 返回含 base64 data 的 JSON,避免直接将其加载为文本。"],result:["meta 包含 format、width、height、size、url、title;宽高为实际截图的物理像素。"],examples:[`page_screenshot --payload '{"tabId":12345}' --output ./screenshot.png`,`page_screenshot --payload '{"tabId":12345,"selector":".product-card"}' --output ./card.png`]},{name:"set_device_emulation",description:"把目标 tab 切换为移动端模拟(视口/DPR/UA/触摸/视觉比例),等价 DevTools 设备工具栏,作用域 per-tab;需保持调试控制才持续生效",summary:"设置或清除目标标签页的设备模拟",params:[{name:"enabled",type:"boolean",required:!0,description:"true=启用,false=清除"},{name:"preset",type:DEVICE_PRESET_TYPE,description:"内置设备预设,提供 width/height/DPR/UA 默认值;旧机型 ID 继续兼容"},{name:"width",type:"number",description:"视口宽度(覆盖 preset)"},{name:"height",type:"number",description:"视口高度(覆盖 preset)"},{name:"deviceScaleFactor",type:"number",description:"DPR(覆盖 preset)"},{name:"scale",type:"number",description:"画面视觉比例,不改变视口尺寸或 DPR;必须为有限正数,默认 1"},{name:"mobile",type:"boolean",description:"是否走移动渲染模式,默认从 preset 推断"},{name:"userAgent",type:"string",description:"自定义 UA(覆盖 preset)"},{name:"orientation",type:'"portrait" | "landscape"',description:"横竖屏,默认 portrait"},{name:"touch",type:"boolean",description:"是否启用触摸事件,默认从 preset 推断;无 preset 时跟随 mobile"},{name:"deviceShell",type:"boolean",description:"是否使用 iframe WebView 并渲染顶部状态栏与底部操作区,默认 false"},{name:"splitScreen",type:"boolean",description:"是否将首页与业务页分置左右 WebView;仅在已启用 App 档案、deviceShell=true、横屏时生效,默认 false"},{name:"reload",type:"boolean",description:"启用后是否重载页面,默认 true"},{name:"tabId",type:"number",required:!0,description:"目标标签页 ID"}],notes:["无 preset 时 width/height 必须成对提供且 userAgent 必填;mobile 默认 true,touch 跟随 mobile。","deviceShell 开启/移除时必须重载;splitScreen 仅在已启用 App 档案、deviceShell=true、横屏时生效。"],result:["返回实际 viewport(width/height/deviceScaleFactor/scale)、UA、mobile、touch、orientation、deviceShell、splitScreen 和 reloaded;应以响应确认生效状态。"],examples:[`set_device_emulation --payload '{"tabId":12345,"enabled":true,"preset":"iphone-17-pro"}'`,`set_device_emulation --payload '{"tabId":12345,"enabled":true,"preset":"pixel-11","orientation":"landscape"}'`,`set_device_emulation --payload '{"tabId":12345,"enabled":true,"preset":"ipad-mini-a17-pro","orientation":"landscape","deviceShell":true,"splitScreen":true}'`,`set_device_emulation --payload '{"tabId":12345,"enabled":false}'`]},{name:"set_app_profile",description:"设置 App 客户端环境与 JSBridge;可同时设置 MTop 页面接口环境,传 emulation 时联动设备模拟",summary:"设置或清除目标标签页的 App 容器模拟",params:[{name:"enabled",type:"boolean",required:!0,description:"true=启用,false=清除"},{name:"profile",type:"string",description:`容器档案名(enabled=true 时必填);内置 ${APP_PROFILE_NAME_LIST}`},{name:"os",type:'"ios" | "android"',description:"容器系统,默认 ios"},{name:"refreshDefinition",type:"boolean",description:"立即采用最新档案定义,保留用户显式设置"},{name:"lockDefinition",type:"boolean",description:"固定当前定义;默认在下次刷新或文档导航时自动更新"},{name:"appVersion",type:"string",description:"覆盖档案默认 App 版本号"},{name:"deviceModel",type:"string",description:"Android 机型名(拼入 UA 与 __DEVICE_MODEL__)"},{name:"bridgeConfig",type:"object",description:"声明式覆盖桥方法,形如 {methods:{api:{behavior|response|noop,silent?}}};不执行配置脚本"},{name:"mtopEnv",type:'"default" | "prod" | "pre"',description:"可选 MTop 页面接口环境;default 关闭环境改写,省略时保持当前设置。仅作用于目标 tab"},{name:"emulation",type:"object",description:"可选设备联动参数,字段同 set_device_emulation 去掉 enabled/reload;字段覆盖档案推荐设备,deviceShell 默认 true,横屏时可传 splitScreen=true。省略时不设置或清除设备"},{name:"reload",type:"boolean",description:"应用/清除后是否重载页面,默认 true"},{name:"tabId",type:"number",required:!0,description:"目标标签页 ID"}],notes:["只有用户明确要求 App/客户端/容器/JSBridge 模拟时启用。移动视口或普通 H5 调试使用 set_device_emulation。","emulation={} 使用档案推荐设备;enabled=false 时省略 emulation 只清除 App 注入,传 {} 同时清除设备模拟。","bridgeConfig.methods 按方法声明 behavior / response / noop 三选一,可传 silent;只支持受控行为、固定 JSON 回包或成功空实现,不执行配置脚本。"],result:["返回 enabled、profile、label、userAgent、os、mtopEnv、reloaded;联动设备时额外返回实际 emulation。"],examples:[`set_app_profile --payload '{"tabId":12345,"enabled":true,"profile":"fliggy"}'`,`set_app_profile --payload '{"tabId":12345,"enabled":true,"profile":"fliggy","mtopEnv":"pre"}'`,`set_app_profile --payload '{"tabId":12345,"enabled":false,"mtopEnv":"prod"}'`,`set_app_profile --payload '{"tabId":12345,"enabled":true,"profile":"fliggy","emulation":{}}'`,`set_app_profile --payload '{"tabId":12345,"enabled":true,"profile":"alipay","emulation":{"preset":"pixel-11","deviceShell":true}}'`,`set_app_profile --payload '{"tabId":12345,"enabled":true,"profile":"fliggy","emulation":{"preset":"ipad-mini-a17-pro","orientation":"landscape","deviceShell":true,"splitScreen":true}}'`,`set_app_profile --payload '{"tabId":12345,"enabled":false}'`,`set_app_profile --payload '{"tabId":12345,"enabled":false,"emulation":{}}'`]},{name:"set_timezone",description:"覆盖目标 tab 的时区,传空字符串恢复浏览器默认时区",params:[{name:"tabId",type:"number",required:!0,description:"目标标签页 ID"},{name:"timezone",type:"string",required:!0,description:"IANA 时区标识(如 Asia/Shanghai);空字符串表示清除覆盖"}],examples:[`set_timezone --payload '{"tabId":12345,"timezone":"America/New_York"}'`,`set_timezone --payload '{"tabId":12345,"timezone":""}'`]},{name:"get_cookie",description:"从目标浏览器读取一个指定非分区 Cookie;拒绝返回 HttpOnly Cookie",params:[{name:"tabId",type:"number",description:"可选;指定标签页的 Cookie 存储区,省略时使用浏览器默认存储区"},{name:"name",type:"string",required:!0,description:"要读取的 Cookie 名称;不支持列举全部 Cookie"},{name:"url",type:"string",description:"Cookie 查询 URL;未传 tabId 时必填,省略时使用指定标签页 URL"},{name:"domain",type:"string",description:"可选精确域过滤,只允许 Cookie 查询 URL 的 host 或其父域"},{name:"path",type:"string",description:"可选精确 path 过滤"}],notes:["只读取指定非分区 Cookie,不列举全部、不回退分区 Cookie,拒绝 HttpOnly;禁止读取认证 Token。指定 url 不导航,指定 tabId 仅选择存储区时不启动采集。"],result:["找到时 found=true 并返回 value/domain/path;不存在时 found=false。"],examples:[`get_cookie --payload '{"tabId":12345,"name":"feature_flag"}'`,`get_cookie --payload '{"url":"https://www.taobao.com/","name":"tracknick"}'`,`get_cookie --payload '{"tabId":12345,"name":"edith_switch_br.rx-vehicle-search_home","domain":"taobao.com"}'`,`get_cookie --payload '{"tabId":12345,"name":"tracknick","url":"https://www.taobao.com/","domain":"taobao.com","path":"/"}'`]},{name:"set_cookie",description:"在目标浏览器设置一个指定非分区 session Cookie,可选刷新指定页面",params:[{name:"tabId",type:"number",description:"可选;指定标签页的 Cookie 存储区,reload=true 时必填"},{name:"url",type:"string",description:"Cookie 目标 URL;未传 tabId 时必填,省略时使用指定标签页 URL"},{name:"name",type:"string",required:!0,description:"Cookie 名称"},{name:"value",type:"string",required:!0,description:"Cookie 值,可传空字符串;空字符串不会删除 Cookie"},{name:"domain",type:"string",description:"Cookie 域,默认目标 URL 的 host;只允许目标 host 或其父域"},{name:"path",type:"string",description:"Cookie path,默认 /"},{name:"reload",type:"boolean",description:"设置后是否刷新指定 tabId,默认 false;true 时必须传 tabId"}],notes:["仅写非分区 session Cookie,不支持删除。reload=true 时校验目标域与刷新页域的授权。"],result:["返回 url/name/domain/path/reloaded,指定标签页时包含 tabId;不回显 Cookie 值。"],examples:[`set_cookie --payload '{"tabId":12345,"name":"feature_flag","value":"enabled"}'`,`set_cookie --payload '{"url":"https://www.taobao.com/","name":"feature_flag","value":"enabled"}'`,`set_cookie --payload '{"tabId":12345,"name":"edith_switch_br.rx-vehicle-search_home","value":"3.6.63","domain":"taobao.com","reload":true}'`]},{name:"page_frames",description:"获取页面主 frame 与所有 iframe 列表",params:[{name:"tabId",type:"number",required:!0,description:"目标标签页 ID"}],result:["frames[] 包含 frameId、url、name 和 isMainFrame;frameId 可用于 page_eval 等支持 frame 定位的 action。"],examples:[`page_frames --payload '{"tabId":12345}'`]},{name:"request_domain_permission",description:"申请访问指定域名的权限(必要时弹窗让用户授权)",params:[{name:"domain",type:"string",required:!0,description:"需要授权的域名,如 example.com"}],notes:["domain 使用纯主机名,不传 URL。在非 BUC send_request 报域权限缺失,或 set_rule 提示缺少域名权限时申请;BUC 不使用浏览器域权限。","弹窗等待用户选择,90 秒超时或关闭按拒绝处理;granted=true 后才重试原请求。"],result:["返回 granted、domain,授权成功时包含 origin。"],examples:[`request_domain_permission --payload '{"domain":"example.com"}'`]},{name:"run_actions",description:"批量顺序执行多个 action,减少往返延迟。遇错即停,返回已完成步骤结果;步骤内的页面动作不带内置观察",summary:"批量顺序执行多个 action,遇错即停",params:[{name:"actions",type:"Array<{action: string, data?: object}>",required:!0,description:"要依次执行的 action 列表"},{name:"tabId",type:"number",required:!0,description:"所有步骤共享的 tabId,步骤自身指定的优先"}],notes:["最多 50 步,不允许嵌套 run_actions;需要根据每步效果决策时逐步调用普通 action。"],result:["返回 results、completedSteps、totalSteps;失败时包含 error/failedStep,后续步骤未执行。"],examples:[`run_actions --payload '{"tabId":12345,"actions":[{"action":"page_hover","data":{"selector":"#menu"}},{"action":"page_click","data":{"selector":"#menu-item"}}]}'`]}],COMMAND_MAP=new Map(COMMANDS.map(command=>[command.name,command]))}});import{statSync as statSync3}from"node:fs";function pluginFileVersion(path27){let stat4=statSync3(path27);if(!stat4.isFile())throw new Error(`插件资源不是文件: ${path27}`);return`${stat4.dev}-${stat4.ino}-${stat4.mtimeMs}-${stat4.ctimeMs}-${stat4.size}`}var init_pluginSource=__esm({"../client/dist/plugins/pluginSource.js"(){"use strict"}});import{createHash as createHash3}from"node:crypto";import{readFileSync as readFileSync4,realpathSync}from"node:fs";import{basename,dirname as dirname3,extname,isAbsolute,join as join4,relative,resolve,sep}from"node:path";function pluginRoot(entry){let entryDirectory=dirname3(entry);return basename(entryDirectory)==="scripts"?dirname3(entryDirectory):entryDirectory}function attributeValue(tag,name){let match=tag.match(new RegExp(`\\b${name}\\s*=\\s*(?:"([^"]*)"|'([^']*)'|([^\\s>]+))`,"i"));return match?.[1]??match?.[2]??match?.[3]}function removeAttribute(tag,name){return tag.replace(new RegExp(`\\s+${name}\\s*=\\s*(?:"[^"]*"|'[^']*'|[^\\s>]+)`,"i"),"")}function isEmbeddedReference(reference){return/^(?:data:|blob:|#)/i.test(reference.trim())}function isRemoteReference(reference){return/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i.test(reference.trim())}function contentType(path27){return MIME_TYPES[extname(path27).toLowerCase()]??"application/octet-stream"}function escapeStyleText(value){return value.replace(/<\/style/gi,"\\3C /style")}function escapeScriptText(value){return value.replace(/<\/script/gi,"<\\/script")}function buildPluginPageBundle(entry,pageEntry){let root=realpathSync(pluginRoot(entry)),sourceBytes=0,countedFiles=new Set,sources={},resolveLocalFile=(reference,fromFile)=>{let cleanReference=reference.trim().split(/[?#]/,1)[0];if(!cleanReference||isEmbeddedReference(cleanReference))return"";if(isRemoteReference(cleanReference)||isAbsolute(cleanReference))throw new Error(`toolbox.page 不允许远程或绝对资源: ${reference}`);let sourcePath=resolve(dirname3(fromFile),cleanReference),resolved=realpathSync(sourcePath),relativePath=relative(root,resolved);if(relativePath===".."||relativePath.startsWith(`..${sep}`)||isAbsolute(relativePath))throw new Error(`toolbox.page 资源超出插件目录: ${reference}`);return sources[sourcePath]=pluginFileVersion(sourcePath),resolved},readAsset=path27=>{sources[path27]??=pluginFileVersion(path27);let content2=readFileSync4(path27);if(!countedFiles.has(path27)&&(countedFiles.add(path27),sourceBytes+=content2.byteLength,sourceBytes>MAX_PAGE_SOURCE_BYTES))throw new Error("toolbox.page 源文件总大小不能超过 16 MiB");return content2},dataUrl=(reference,fromFile)=>{if(isEmbeddedReference(reference))return reference;let path27=resolveLocalFile(reference,fromFile);return`data:${contentType(path27)};base64,${readAsset(path27).toString("base64")}`},inlineCss=(css,cssPath)=>css.replace(/url\(\s*(['"]?)([^'"()]+)\1\s*\)/gi,(_match,_quote,reference)=>{let value=reference.trim();return isEmbeddedReference(value)?`url("${value}")`:`url("${dataUrl(value,cssPath)}")`}),absoluteEntry=resolveLocalFile(pageEntry,join4(root,"__toolbox_entry__"));if(extname(absoluteEntry).toLowerCase()!==".html")throw new Error("toolbox.page.entry 必须指向 HTML 文件");let html=readAsset(absoluteEntry).toString("utf8").replace(/^\uFEFF/,"");if(!/<html\b|<!doctype\b/i.test(html))throw new Error("toolbox.page.entry 必须是完整 HTML 文档");if(/<base\b/i.test(html))throw new Error("toolbox.page 不允许声明 base 标签");if(/<meta\b[^>]*http-equiv\s*=\s*["']?content-security-policy/i.test(html))throw new Error("toolbox.page 的安全策略由 Mearl 管理,请移除 CSP meta 标签");html=html.replace(/<link\b[^>]*>/gi,tag=>{let rel=attributeValue(tag,"rel")?.toLowerCase().split(/\s+/)??[],href=attributeValue(tag,"href");if(rel.includes("stylesheet")){if(!href)throw new Error("toolbox.page stylesheet 缺少 href");let cssPath=resolveLocalFile(href,absoluteEntry),css=inlineCss(readAsset(cssPath).toString("utf8"),cssPath);return`<style data-mearl-source="${href.replaceAll('"',"&quot;")}">${escapeStyleText(css)}</style>`}if(href&&rel.some(value=>["icon","apple-touch-icon"].includes(value)))return tag.replace(href,dataUrl(href,absoluteEntry));if(href&&isRemoteReference(href))throw new Error(`toolbox.page 不允许远程 link 资源: ${href}`);return tag}),html=html.replace(/<script\b[^>]*>[\s\S]*?<\/script\s*>/gi,tag=>{let src=attributeValue(tag,"src");if(!src)return tag;let scriptPath=resolveLocalFile(src,absoluteEntry),script=readAsset(scriptPath).toString("utf8");if(attributeValue(tag,"type")?.toLowerCase()==="module"&&/(?:^|[;\n]\s*)(?:import\s|export\s)|\bimport\s*\(/m.test(script))throw new Error("toolbox.page 的模块脚本必须先打包为无 import 的单文件");return`${removeAttribute(tag.slice(0,tag.indexOf(">")+1),"src")}${escapeScriptText(script)}</script>`}),html=html.replace(/(<(?:img|source|video|audio|track|input)\b[^>]*?\s(?:src|poster)\s*=\s*)(["'])([^"']+)\2/gi,(_match,prefix,quote,reference)=>`${prefix}${quote}${dataUrl(reference,absoluteEntry)}${quote}`);let injection=`<meta name="color-scheme" content="light dark">${PAGE_SECURITY_META}${PAGE_THEME_STYLE}<script data-mearl-bridge>${escapeScriptText(PAGE_BRIDGE_SCRIPT)}</script>`;html=/<head\b[^>]*>/i.test(html)?html.replace(/<head\b[^>]*>/i,tag=>`${tag}${injection}`):html.replace(/<html\b[^>]*>/i,tag=>`${tag}<head>${injection}</head>`);let content=html,buffer=Buffer.from(content,"utf8");if(buffer.byteLength>MAX_PAGE_BUNDLE_BYTES)throw new Error("toolbox.page 打包后不能超过 24 MiB");return{content,hash:createHash3("sha256").update(buffer).digest("hex"),size:buffer.byteLength,chunks:Math.ceil(buffer.byteLength/PLUGIN_PAGE_CHUNK_BYTES),sources}}var PLUGIN_PAGE_CHUNK_BYTES,MAX_PAGE_SOURCE_BYTES,MAX_PAGE_BUNDLE_BYTES,MIME_TYPES,PAGE_BRIDGE_SCRIPT,PAGE_SECURITY_META,PAGE_THEME_STYLE,PLUGIN_PAGE_RUNTIME_HASH,init_pluginPageBundle=__esm({"../client/dist/plugins/pluginPageBundle.js"(){"use strict";init_pluginSource();PLUGIN_PAGE_CHUNK_BYTES=384*1024,MAX_PAGE_SOURCE_BYTES=16*1024*1024,MAX_PAGE_BUNDLE_BYTES=24*1024*1024,MIME_TYPES={".avif":"image/avif",".gif":"image/gif",".ico":"image/x-icon",".jpeg":"image/jpeg",".jpg":"image/jpeg",".mp3":"audio/mpeg",".mp4":"video/mp4",".ogg":"audio/ogg",".otf":"font/otf",".png":"image/png",".svg":"image/svg+xml",".ttf":"font/ttf",".wav":"audio/wav",".webm":"video/webm",".webp":"image/webp",".woff":"font/woff",".woff2":"font/woff2"},PAGE_BRIDGE_SCRIPT=String.raw`(() => {
4
4
  let context = null;
5
5
  let port = null;
6
6
  let requestSequence = 0;
@@ -606,7 +606,7 @@ body {
606
606
  }
607
607
  button, input, select, textarea { font: inherit; }
608
608
  </style>`,PLUGIN_PAGE_RUNTIME_HASH=createHash3("sha256").update(PAGE_BRIDGE_SCRIPT).update(PAGE_SECURITY_META).update(PAGE_THEME_STYLE).digest("hex")}});import{randomUUID as randomUUID3}from"node:crypto";import{closeSync as closeSync3,mkdirSync as mkdirSync2,openSync as openSync3,readFileSync as readFileSync5,readSync,readdirSync as readdirSync4,renameSync as renameSync3,rmSync as rmSync3,statSync as statSync4,writeFileSync as writeFileSync2}from"node:fs";import{homedir as homedir2}from"node:os";import{isAbsolute as isAbsolute2,join as join5,resolve as resolve2}from"node:path";function pluginRegistrationNeedsRefresh(registration,includePage=!1){return!registration.source||pluginFileVersion(registration.entry)!==registration.source.entry||Object.entries(registration.source.profiles??{}).some(([path27,version3])=>{try{return pluginFileVersion(path27)!==version3}catch{return!0}})?!0:!includePage||!registration.toolbox?!1:registration.source.pageRuntime!==PLUGIN_PAGE_RUNTIME_HASH||!registration.source.page?!0:Object.entries(registration.source.page).some(([path27,version3])=>pluginFileVersion(path27)!==version3)}function pluginDirectory(){return resolve2(process.env.MEARL_PLUGIN_DIR||join5(homedir2(),".mearl","plugins"))}function pluginPageDirectory(){return join5(pluginDirectory(),".pages")}function pluginPageBundlePath(name,hash2){return join5(pluginPageDirectory(),`${name}-${hash2}.html`)}function removePluginPageBundles(name,exceptHash){let files;try{files=readdirSync4(pluginPageDirectory())}catch(error48){if(error48.code==="ENOENT")return;throw error48}let keep=exceptHash?`${name}-${exceptHash}.html`:void 0;for(let file2 of files)file2===keep||!file2.startsWith(`${name}-`)||!file2.endsWith(".html")||rmSync3(join5(pluginPageDirectory(),file2),{force:!0})}function normalizePageBundle(value){if(!value||typeof value!="object"||Array.isArray(value))throw new Error("invalid page bundle");let candidate=value;if(typeof candidate.hash!="string"||!/^[a-f0-9]{64}$/.test(candidate.hash)||!Number.isInteger(candidate.size)||(candidate.size??0)<=0||!Number.isInteger(candidate.chunks)||candidate.chunks!==Math.ceil((candidate.size??0)/PLUGIN_PAGE_CHUNK_BYTES))throw new Error("invalid page bundle");return{hash:candidate.hash,size:candidate.size,chunks:candidate.chunks}}function persistPluginPageBundle(name,bundle){let directory=pluginPageDirectory();mkdirSync2(directory,{recursive:!0,mode:448});let target=pluginPageBundlePath(name,bundle.hash);try{if(statSync4(target).isFile())return}catch{}let temporary=`${target}.${randomUUID3()}.tmp`;try{writeFileSync2(temporary,bundle.content,{mode:384,flag:"wx"}),renameSync3(temporary,target)}finally{rmSync3(temporary,{force:!0})}}function assertPluginName(name){if(!/^[a-z][a-z0-9-]*$/.test(name)||RESERVED_NAMES.has(name)||COMMAND_MAP.has(name))throw new PluginError("PLUGIN_INVALID_NAME",`不可用的插件名称: ${name}`)}function normalizePluginToolboxContribution(value){if(value===void 0)return;if(!value||typeof value!="object"||Array.isArray(value))throw new Error("toolbox 必须是对象");let candidate=value;if(candidate.displayMode!==void 0&&!["popup","tab","both"].includes(candidate.displayMode))throw new Error("toolbox.displayMode 必须是 popup、tab 或 both");let title=typeof candidate.title=="string"?candidate.title.trim():"",description=typeof candidate.description=="string"?candidate.description.trim():void 0,icon=typeof candidate.icon=="string"?candidate.icon.trim():void 0;if(candidate.version!==1)throw new Error("toolbox.version 必须为 1");if(!title||title.length>80)throw new Error("toolbox.title 必须是 1-80 个字符");if(description&&description.length>240)throw new Error("toolbox.description 不能超过 240 个字符");if(icon&&!parseToolboxIcon(icon))throw new Error("toolbox.icon 必须是图标名称、SVG、图片 Data URL 或 HTTP(S) 图片地址,最多 32768 个字符");let locales;if(candidate.locales!==void 0){if(!candidate.locales||typeof candidate.locales!="object"||Array.isArray(candidate.locales))throw new Error("toolbox.locales 必须是对象");let entries=Object.entries(candidate.locales);if(entries.length===0||entries.length>20)throw new Error("toolbox.locales 必须包含 1-20 个语言");locales=Object.fromEntries(entries.map(([locale,localized])=>{if(!/^[a-z]{2,3}(?:[_-][A-Za-z0-9]{2,8})*$/.test(locale))throw new Error(`toolbox.locales 包含无效语言: ${locale}`);if(!localized||typeof localized!="object"||Array.isArray(localized))throw new Error(`toolbox.locales.${locale} 必须是对象`);let localizedTitle=typeof localized.title=="string"?localized.title.trim():void 0,localizedDescription=typeof localized.description=="string"?localized.description.trim():void 0;if(localizedTitle!==void 0&&(!localizedTitle||localizedTitle.length>80))throw new Error(`toolbox.locales.${locale}.title 必须是 1-80 个字符`);if(localizedDescription!==void 0&&localizedDescription.length>240)throw new Error(`toolbox.locales.${locale}.description 不能超过 240 个字符`);if(!localizedTitle&&!localizedDescription)throw new Error(`toolbox.locales.${locale} 至少声明 title 或 description`);return[locale,{...localizedTitle?{title:localizedTitle}:{},...localizedDescription?{description:localizedDescription}:{}}]}))}if(!candidate.page||typeof candidate.page!="object"||Array.isArray(candidate.page))throw new Error("toolbox.page 必须是对象");let pageCandidate=candidate.page;if(pageCandidate.type!=="sandbox")throw new Error("toolbox.page.type 必须为 sandbox");if(pageCandidate.runtime!==void 0&&pageCandidate.runtime!=="preact")throw new Error("toolbox.page.runtime 仅支持 preact");let pageEntry=typeof pageCandidate.entry=="string"?pageCandidate.entry.trim():"";if(!pageEntry||pageEntry.length>240||isAbsolute2(pageEntry)||pageEntry.includes("\\")||pageEntry.split("/").some(segment=>!segment||segment==="."||segment===".."))throw new Error("toolbox.page.entry 必须是插件目录内的相对 HTML 路径");if(!Array.isArray(pageCandidate.commands))throw new Error("toolbox.page.commands 必须是命令名称数组");let commands=pageCandidate.commands.map(command=>typeof command=="string"?command.trim():"");if(commands.length===0||commands.length>64||new Set(commands).size!==commands.length||commands.some(command=>!/^[a-z][a-z0-9-]*$/.test(command)))throw new Error("toolbox.page.commands 必须包含 1-64 个不重复的插件命令名称");let page={type:"sandbox",...pageCandidate.runtime?{runtime:pageCandidate.runtime}:{},entry:pageEntry,commands};if("lifecycle"in pageCandidate)throw new Error("toolbox.page.lifecycle is unsupported; declare pageRuntime and activation rules");let agent2;if(candidate.agent!==void 0){if(!candidate.agent||typeof candidate.agent!="object"||Array.isArray(candidate.agent))throw new Error("toolbox.agent 必须是对象");let agentCandidate=candidate.agent,skill=typeof agentCandidate.skill=="string"?agentCandidate.skill.trim():"";if(!skill||skill.length>128||!/^[A-Za-z0-9][A-Za-z0-9._:@/-]*$/.test(skill))throw new Error("toolbox.agent.skill 必须是有效的 Skill 名称");let layout=agentCandidate.layout;if(layout!==void 0&&layout!=="drawer"&&layout!=="workspace")throw new Error("toolbox.agent.layout 必须是 drawer 或 workspace");agent2={skill,...layout?{layout}:{}}}if(candidate.order!==void 0&&(!Number.isInteger(candidate.order)||candidate.order<0||candidate.order>1e4))throw new Error("toolbox.order 必须是 0-10000 的整数");return{version:1,title,...candidate.displayMode!==void 0?{displayMode:candidate.displayMode}:{},...description?{description}:{},...icon?{icon}:{},...locales?{locales}:{},...agent2?{agent:agent2}:{},page,...candidate.order!==void 0?{order:candidate.order}:{}}}function findPluginDirectoryEntry(directory){for(let filename of["main.mjs","main.py"]){let entry=join5(directory,"scripts",filename);try{if(statSync4(entry).isFile())return entry}catch{}}}function resolvePluginEntry(target){let absolute=resolve2(target);try{let entry=statSync4(absolute).isDirectory()?findPluginDirectoryEntry(absolute):absolute;if(!entry)throw new Error("not a file");if(!statSync4(entry).isFile())throw new Error("not a file");return entry}catch{throw new PluginError("PLUGIN_ENTRY_MISSING",`入口不存在: ${absolute}(目录默认使用 scripts/main.mjs 或 scripts/main.py)`)}}function registerPlugin(name,target,description,options={}){assertPluginName(name);let entry=resolvePluginEntry(target),entryVersion=pluginFileVersion(entry),directory=pluginDirectory();mkdirSync2(directory,{recursive:!0,mode:448});let file2=join5(directory,`${name}.json`),temporary=`${file2}.${randomUUID3()}.tmp`,summary=description?.trim(),managedBy=options.managedBy?.trim(),toolbox;try{toolbox=normalizePluginToolboxContribution(options.toolbox)}catch(error48){throw new PluginError("PLUGIN_INVALID_TOOLBOX",error48 instanceof Error?error48.message:String(error48))}let builtPage;if(toolbox){try{builtPage=buildPluginPageBundle(entry,toolbox.page.entry)}catch(error48){throw new PluginError("PLUGIN_INVALID_TOOLBOX_PAGE",error48 instanceof Error?error48.message:String(error48))}persistPluginPageBundle(name,builtPage)}let record4={entry,...options.hasPublicCommands!==void 0?{hasPublicCommands:options.hasPublicCommands}:{},source:{entry:entryVersion,...options.profileSources?{profiles:options.profileSources}:{},...builtPage?{page:builtPage.sources,pageRuntime:PLUGIN_PAGE_RUNTIME_HASH}:{}},...summary?{description:summary}:{},...managedBy?{managedBy}:{},...toolbox?{toolbox}:{},...options.appProfiles?{appProfiles:validateAppProfileContribution(options.appProfiles)}:{},...builtPage?{pageBundle:{hash:builtPage.hash,size:builtPage.size,chunks:builtPage.chunks}}:{}};try{writeFileSync2(temporary,`${JSON.stringify(record4)}
609
- `,{mode:384,flag:"wx"}),renameSync3(temporary,file2)}finally{rmSync3(temporary,{force:!0})}return removePluginPageBundles(name,builtPage?.hash),entry}function unregisterPlugin(name){assertPluginName(name);let file2=join5(pluginDirectory(),`${name}.json`);try{return rmSync3(file2),rmSync3(join5(pluginDirectory(),".host","installations",`${name}.json`),{force:!0}),removePluginPageBundles(name),!0}catch(error48){if(error48.code==="ENOENT")return!1;throw new PluginError("PLUGIN_UNINSTALL_FAILED",`无法移除插件注册: ${file2}`)}}function findPluginRegistration(name){if(!/^[a-z][a-z0-9-]*$/.test(name))return;let file2=join5(pluginDirectory(),`${name}.json`),content;try{content=readFileSync5(file2,"utf8")}catch(error48){if(error48.code==="ENOENT")return;throw new PluginError("PLUGIN_REGISTRY_INVALID",`无法读取插件记录: ${file2}`)}try{let record4=JSON.parse(content);if(typeof record4?.entry!="string"||!isAbsolute2(record4.entry))throw new Error("invalid entry");if(record4.hasPublicCommands!==void 0&&typeof record4.hasPublicCommands!="boolean")throw new Error("invalid public commands");let description=typeof record4.description=="string"&&record4.description.trim()?record4.description.trim():void 0,managedBy=typeof record4.managedBy=="string"&&record4.managedBy.trim()?record4.managedBy.trim():void 0,toolbox=normalizePluginToolboxContribution(record4.toolbox),pageBundle=toolbox?normalizePageBundle(record4.pageBundle):void 0,appProfiles=validateAppProfileContribution(record4.appProfiles),source=record4.source;if(source!==void 0&&(!source||typeof source!="object"||Array.isArray(source)||typeof source.entry!="string"||source.profiles!==void 0&&(!source.profiles||typeof source.profiles!="object"||Array.isArray(source.profiles)||Object.entries(source.profiles).some(([path27,version3])=>!isAbsolute2(path27)||typeof version3!="string"))||source.pageRuntime!==void 0&&(typeof source.pageRuntime!="string"||!/^[a-f0-9]{64}$/.test(source.pageRuntime))||source.page!==void 0&&(!source.page||typeof source.page!="object"||Array.isArray(source.page)||Object.entries(source.page).some(([path27,version3])=>!isAbsolute2(path27)||typeof version3!="string"))))throw new Error("invalid source");return{entry:record4.entry,...record4.hasPublicCommands!==void 0?{hasPublicCommands:record4.hasPublicCommands}:{},...description?{description}:{},...managedBy?{managedBy}:{},...toolbox?{toolbox}:{},...pageBundle?{pageBundle}:{},...appProfiles?{appProfiles}:{},...source?{source}:{}}}catch(cause){let reason=cause instanceof SyntaxError?"JSON 格式错误":cause instanceof Error?cause.message:"未知校验错误";throw new PluginError("PLUGIN_REGISTRY_INVALID",`无效的插件记录: ${file2} (${reason})`,{cause})}}function readPluginPageBundleChunk(name,hash2,index){assertPluginName(name);let bundle=findPluginRegistration(name)?.pageBundle;if(!bundle||bundle.hash!==hash2)throw new PluginError("PLUGIN_PAGE_CHANGED",`插件页面已更新: ${name}`);if(!Number.isInteger(index)||index<0||index>=bundle.chunks)throw new PluginError("PLUGIN_PAGE_CHUNK_INVALID",`插件页面分块无效: ${index}`);let path27=pluginPageBundlePath(name,hash2),size;try{size=statSync4(path27).size}catch{throw new PluginError("PLUGIN_PAGE_INVALID",`插件页面产物不存在: ${name}`)}if(size!==bundle.size)throw new PluginError("PLUGIN_PAGE_INVALID",`插件页面产物损坏: ${name}`);let start=index*PLUGIN_PAGE_CHUNK_BYTES,content=Buffer.allocUnsafe(Math.min(PLUGIN_PAGE_CHUNK_BYTES,bundle.size-start)),descriptor;try{descriptor=openSync3(path27,"r")}catch{throw new PluginError("PLUGIN_PAGE_INVALID",`插件页面产物无法读取: ${name}`)}let bytesRead;try{bytesRead=readSync(descriptor,content,0,content.byteLength,start)}finally{closeSync3(descriptor)}if(bytesRead!==content.byteLength)throw new PluginError("PLUGIN_PAGE_INVALID",`插件页面产物损坏: ${name}`);return{data:content.toString("base64"),hash:hash2,index,total:bundle.chunks}}function findPluginEntry(name){return findPluginRegistration(name)?.entry}function listPluginNames(){try{return readdirSync4(pluginDirectory()).filter(file2=>/^[a-z][a-z0-9-]*\.json$/.test(file2)).map(file2=>file2.slice(0,-5)).sort()}catch(error48){if(error48.code==="ENOENT")return[];throw new PluginError("PLUGIN_REGISTRY_INVALID","无法读取插件目录")}}var RESERVED_NAMES,PluginError,init_pluginRegistry=__esm({"../client/dist/plugins/pluginRegistry.js"(){"use strict";init_app_profile_definition();init_toolbox_icon();init_commands();init_pluginPageBundle();init_pluginSource();RESERVED_NAMES=new Set(["check","help","connector_list","capture_checkpoint","plugin","plugins"]),PluginError=class extends Error{code;constructor(code,message,options){super(`${code}: ${message}`,options),this.code=code}}}});import{createHash as createHash4}from"node:crypto";import{tmpdir}from"node:os";import{join as join6}from"node:path";function pluginHostPaths(){let registry2=pluginDirectory(),key=createHash4("sha256").update(registry2).digest("hex").slice(0,16),home=join6(registry2,".host");return{registry:registry2,home,lease:join6(home,"service.json"),log:join6(home,"service.log"),installations:join6(home,"installations"),revisions:join6(home,"revisions"),tasks:join6(home,"tasks"),state:join6(home,"state"),socket:process.platform==="win32"?`\\\\.\\pipe\\mearl-plugin-${key}`:join6(tmpdir(),`mp-${key}.sock`)}}var init_pluginHostPaths=__esm({"../client/dist/plugins/runtime/pluginHostPaths.js"(){"use strict";init_pluginRegistry()}});function isPluginTaskActive(state){return state==="queued"||state==="running"||state==="cancelling"}function isPluginTaskId(value){return typeof value=="string"&&/^pt_[0-9a-f-]{36}_[0-9a-f-]{36}$/i.test(value)}var init_plugin_tasks=__esm({"../client/dist/generated/plugin-tasks.js"(){"use strict"}});import{StringDecoder}from"node:string_decoder";function readPluginTaskMessages(socket,receive){let decoder=new StringDecoder("utf8"),buffer="";socket.on("data",chunk=>{try{buffer+=decoder.write(chunk);let end;for(;(end=buffer.indexOf(`
609
+ `,{mode:384,flag:"wx"}),renameSync3(temporary,file2)}finally{rmSync3(temporary,{force:!0})}return removePluginPageBundles(name,builtPage?.hash),entry}function unregisterPlugin(name){assertPluginName(name);let file2=join5(pluginDirectory(),`${name}.json`);try{return rmSync3(file2),rmSync3(join5(pluginDirectory(),".host","installations",`${name}.json`),{force:!0}),removePluginPageBundles(name),!0}catch(error48){if(error48.code==="ENOENT")return!1;throw new PluginError("PLUGIN_UNINSTALL_FAILED",`无法移除插件注册: ${file2}`)}}function findPluginRegistration(name){if(!/^[a-z][a-z0-9-]*$/.test(name))return;let file2=join5(pluginDirectory(),`${name}.json`),content;try{content=readFileSync5(file2,"utf8")}catch(error48){if(error48.code==="ENOENT")return;throw new PluginError("PLUGIN_REGISTRY_INVALID",`无法读取插件记录: ${file2}`)}try{let record4=JSON.parse(content);if(typeof record4?.entry!="string"||!isAbsolute2(record4.entry))throw new Error("invalid entry");if(record4.hasPublicCommands!==void 0&&typeof record4.hasPublicCommands!="boolean")throw new Error("invalid public commands");let description=typeof record4.description=="string"&&record4.description.trim()?record4.description.trim():void 0,managedBy=typeof record4.managedBy=="string"&&record4.managedBy.trim()?record4.managedBy.trim():void 0,toolbox=normalizePluginToolboxContribution(record4.toolbox),pageBundle=toolbox?normalizePageBundle(record4.pageBundle):void 0,appProfiles=validateAppProfileContribution(record4.appProfiles),source=record4.source;if(source!==void 0&&(!source||typeof source!="object"||Array.isArray(source)||typeof source.entry!="string"||source.profiles!==void 0&&(!source.profiles||typeof source.profiles!="object"||Array.isArray(source.profiles)||Object.entries(source.profiles).some(([path27,version3])=>!isAbsolute2(path27)||typeof version3!="string"))||source.pageRuntime!==void 0&&(typeof source.pageRuntime!="string"||!/^[a-f0-9]{64}$/.test(source.pageRuntime))||source.page!==void 0&&(!source.page||typeof source.page!="object"||Array.isArray(source.page)||Object.entries(source.page).some(([path27,version3])=>!isAbsolute2(path27)||typeof version3!="string"))))throw new Error("invalid source");return{entry:record4.entry,...record4.hasPublicCommands!==void 0?{hasPublicCommands:record4.hasPublicCommands}:{},...description?{description}:{},...managedBy?{managedBy}:{},...toolbox?{toolbox}:{},...pageBundle?{pageBundle}:{},...appProfiles?{appProfiles}:{},...source?{source}:{}}}catch(cause){let reason=cause instanceof SyntaxError?"JSON 格式错误":cause instanceof Error?cause.message:"未知校验错误";throw new PluginError("PLUGIN_REGISTRY_INVALID",`无效的插件记录: ${file2} (${reason})`,{cause})}}function readPluginPageBundleChunk(name,hash2,index){assertPluginName(name);let bundle=findPluginRegistration(name)?.pageBundle;if(!bundle||bundle.hash!==hash2)throw new PluginError("PLUGIN_PAGE_CHANGED",`插件页面已更新: ${name}`);if(!Number.isInteger(index)||index<0||index>=bundle.chunks)throw new PluginError("PLUGIN_PAGE_CHUNK_INVALID",`插件页面分块无效: ${index}`);let path27=pluginPageBundlePath(name,hash2),size;try{size=statSync4(path27).size}catch{throw new PluginError("PLUGIN_PAGE_INVALID",`插件页面产物不存在: ${name}`)}if(size!==bundle.size)throw new PluginError("PLUGIN_PAGE_INVALID",`插件页面产物损坏: ${name}`);let start=index*PLUGIN_PAGE_CHUNK_BYTES,content=Buffer.allocUnsafe(Math.min(PLUGIN_PAGE_CHUNK_BYTES,bundle.size-start)),descriptor;try{descriptor=openSync3(path27,"r")}catch{throw new PluginError("PLUGIN_PAGE_INVALID",`插件页面产物无法读取: ${name}`)}let bytesRead;try{bytesRead=readSync(descriptor,content,0,content.byteLength,start)}finally{closeSync3(descriptor)}if(bytesRead!==content.byteLength)throw new PluginError("PLUGIN_PAGE_INVALID",`插件页面产物损坏: ${name}`);return{data:content.toString("base64"),hash:hash2,index,total:bundle.chunks}}function findPluginEntry(name){return findPluginRegistration(name)?.entry}function listPluginNames(){try{return readdirSync4(pluginDirectory()).filter(file2=>/^[a-z][a-z0-9-]*\.json$/.test(file2)).map(file2=>file2.slice(0,-5)).sort()}catch(error48){if(error48.code==="ENOENT")return[];throw new PluginError("PLUGIN_REGISTRY_INVALID","无法读取插件目录")}}var RESERVED_NAMES,PluginError,init_pluginRegistry=__esm({"../client/dist/plugins/pluginRegistry.js"(){"use strict";init_app_profile_definition();init_toolbox_icon();init_commands();init_pluginPageBundle();init_pluginSource();RESERVED_NAMES=new Set(["check","run","help","connector_list","capture_checkpoint","plugin","plugins"]),PluginError=class extends Error{code;constructor(code,message,options){super(`${code}: ${message}`,options),this.code=code}}}});import{createHash as createHash4}from"node:crypto";import{tmpdir}from"node:os";import{join as join6}from"node:path";function pluginHostPaths(){let registry2=pluginDirectory(),key=createHash4("sha256").update(registry2).digest("hex").slice(0,16),home=join6(registry2,".host");return{registry:registry2,home,lease:join6(home,"service.json"),log:join6(home,"service.log"),installations:join6(home,"installations"),revisions:join6(home,"revisions"),tasks:join6(home,"tasks"),state:join6(home,"state"),socket:process.platform==="win32"?`\\\\.\\pipe\\mearl-plugin-${key}`:join6(tmpdir(),`mp-${key}.sock`)}}var init_pluginHostPaths=__esm({"../client/dist/plugins/runtime/pluginHostPaths.js"(){"use strict";init_pluginRegistry()}});function isPluginTaskActive(state){return state==="queued"||state==="running"||state==="cancelling"}function isPluginTaskId(value){return typeof value=="string"&&/^pt_[0-9a-f-]{36}_[0-9a-f-]{36}$/i.test(value)}var init_plugin_tasks=__esm({"../client/dist/generated/plugin-tasks.js"(){"use strict"}});import{StringDecoder}from"node:string_decoder";function readPluginTaskMessages(socket,receive){let decoder=new StringDecoder("utf8"),buffer="";socket.on("data",chunk=>{try{buffer+=decoder.write(chunk);let end;for(;(end=buffer.indexOf(`
610
610
  `))>=0;){let line=buffer.slice(0,end);if(buffer=buffer.slice(end+1),Buffer.byteLength(line)>MAX_MESSAGE_BYTES)throw new Error("Plugin host message is too large");let message=JSON.parse(line);if(!message||typeof message!="object"||!Number.isSafeInteger(message.id))throw new Error("Invalid plugin host message");receive(message)}if(Buffer.byteLength(buffer)>MAX_MESSAGE_BYTES)throw new Error("Plugin host message buffer exceeded its limit")}catch(error48){socket.destroy(error48 instanceof Error?error48:new Error(String(error48)))}})}function writePluginTaskMessage(socket,message){return new Promise((resolve11,reject)=>{try{let text3=JSON.stringify(message)+`
611
611
  `;if(Buffer.byteLength(text3)>MAX_MESSAGE_BYTES)throw new Error("Plugin host message is too large");if(socket.destroyed)throw new Error("Plugin host connection is closed");socket.write(text3,error48=>error48?reject(error48):resolve11())}catch(error48){reject(error48)}})}var MAX_MESSAGE_BYTES,init_pluginTaskWire=__esm({"../client/dist/plugins/pluginTaskWire.js"(){"use strict";MAX_MESSAGE_BYTES=96*1024*1024}});function serializePluginExecutionError(error48){let value=error48,metadata=Object.fromEntries(Object.entries(value&&typeof value=="object"?value:{}).filter(([key,field])=>!["__proto__","prototype","constructor","message","stack","code","details"].includes(key)&&(field===null||["string","number","boolean"].includes(typeof field)))),serialized={message:typeof value?.message=="string"?value.message:String(error48),...typeof value?.code=="string"?{code:value.code}:{},...value?.details&&typeof value.details=="object"&&!Array.isArray(value.details)?{details:value.details}:{},...Object.keys(metadata).length?{metadata}:{}};try{if(Buffer.byteLength(JSON.stringify(serialized))<=64*1024)return serialized}catch{}return{message:Buffer.from(serialized.message).subarray(0,8192).toString("utf8"),...serialized.code?{code:serialized.code.slice(0,256)}:{},details:{diagnosticTruncated:!0},metadata:Object.fromEntries(Object.entries(metadata).slice(0,32).map(([key,field])=>[key.slice(0,128),typeof field=="string"?field.slice(0,512):field]))}}function pluginExecutionError(value){return Object.assign(new Error(value.message),{...Object.fromEntries(Object.entries(value.metadata??{}).filter(([key])=>!["__proto__","prototype","constructor","message","stack","code","details"].includes(key))),...value.code?{code:value.code}:{},...value.details?{details:value.details}:{}})}var init_pluginExecutorProtocol=__esm({"../client/dist/plugins/runtime/pluginExecutorProtocol.js"(){"use strict"}});var pluginHostConnection_exports={};__export(pluginHostConnection_exports,{PluginHostConnection:()=>PluginHostConnection});import{spawn as spawn3}from"node:child_process";import{closeSync as closeSync4,mkdirSync as mkdirSync3,openSync as openSync4}from"node:fs";import{createConnection}from"node:net";async function ensureHost(runtimePath){let paths=pluginHostPaths(),work=starting.get(paths.registry);work||(work=(async()=>{let lease=readRecord(paths.lease);if(lease&&isProcessOwnerAlive(lease)){if(lease.protocolVersion!==5)throw new Error("Plugin execution service protocol differs; stop the service before updating");return}let lock=`${paths.lease}.start`,existing=readRecord(lock);if(!(existing&&isProcessOwnerAlive(existing))&&(existing?removeRecordIfPid(lock,existing.pid):removeInvalidRecord(lock),!!claimRecord(lock,{pid:process.pid,processIdentity:processIdentity(process.pid)})))try{let owner=readRecord(paths.lease);if(owner&&isProcessOwnerAlive(owner))return;mkdirSync3(paths.home,{recursive:!0,mode:448}),rotateLogIfNeeded(paths.log);let log2=openSync4(paths.log,"a",384);try{let child=spawn3(process.execPath,[runtimePath],{detached:!0,stdio:["ignore",log2,log2],windowsHide:!0});await new Promise((resolve11,reject)=>{child.once("spawn",resolve11),child.once("error",reject)}),child.unref()}finally{closeSync4(log2)}let deadline=Date.now()+1e4;for(;Date.now()<deadline;){if(await new Promise(resolve11=>{let probe=createConnection(paths.socket),finish=value=>{probe.destroy(),resolve11(value)};probe.once("connect",()=>finish(!0)),probe.once("error",()=>finish(!1)),probe.setTimeout(200,()=>finish(!1))}))return;await new Promise(resolve11=>setTimeout(resolve11,50))}throw new Error("Plugin execution service startup timed out")}finally{removeRecordIfPid(lock,process.pid)}})().finally(()=>starting.delete(paths.registry)),starting.set(paths.registry,work)),await work}var starting,PluginHostConnection,init_pluginHostConnection=__esm({"../client/dist/plugins/clients/pluginHostConnection.js"(){"use strict";init_runtimePaths();init_dist();init_pluginHostPaths();init_plugin_tasks();init_pluginTaskWire();init_pluginExecutorProtocol();starting=new Map;PluginHostConnection=class{configuration;get hasInvocationBridge(){return!!this.configuration.invoke}connection;socket;opening=new Set;generation=0;constructor(configuration={}){this.configuration=configuration}async connect(generation){let check2=()=>{if(generation!==this.generation)throw Object.assign(new Error("Plugin task client was disconnected"),{code:"PLUGIN_TASK_CLIENT_DISCONNECTED"})},connectOnce=()=>(check2(),this.open(this.configuration.socketPath??pluginHostPaths().socket,generation));try{return await connectOnce()}catch(error48){if(check2(),this.configuration.autoStart===!1||this.configuration.socketPath)throw error48;let code=error48.code;if(!["ENOENT","ECONNREFUSED","PLUGIN_TASK_CONNECTION_LOST"].includes(code??""))throw error48}await ensureHost(this.configuration.runtimePath??PLUGIN_TASK_HOST_PATH);let deadline=Date.now()+1e4,failure;do{check2();try{return await connectOnce()}catch(error48){failure=error48,await new Promise(resolve11=>setTimeout(resolve11,100))}}while(Date.now()<deadline);throw new Error("Plugin execution service did not become ready; inspect its service.log",{cause:failure})}async open(socketPath,generation){let socket=createConnection(socketPath);this.opening.add(socket);let pending=new Map,sequence=0,fail2=error48=>{for(let request2 of pending.values())clearTimeout(request2.timer),request2.reject(error48);pending.clear()};socket.on("error",fail2),socket.once("close",()=>{fail2(Object.assign(new Error("Plugin execution service connection was lost"),{code:"PLUGIN_TASK_CONNECTION_LOST"})),this.socket===socket&&(this.connection=void 0,this.socket=void 0)});let request=(method,input2={},timeoutMs=15e3)=>new Promise((resolve11,reject)=>{let id=++sequence,timer=setTimeout(()=>{pending.delete(id),reject(Object.assign(new Error("Plugin task request timed out; the task may still be running"),{code:"PLUGIN_TASK_REQUEST_TIMEOUT"}))},timeoutMs);pending.set(id,{resolve:resolve11,reject,timer}),writePluginTaskMessage(socket,{type:"request",id,method,input:input2}).catch(error48=>{clearTimeout(timer),pending.delete(id),reject(error48)})});readPluginTaskMessages(socket,message=>{if(message.type==="response"){let call=pending.get(message.id);if(!call)return;clearTimeout(call.timer),pending.delete(message.id),message.error?call.reject(pluginExecutionError(message.error)):call.resolve(message.result)}else message.type==="invoke"?Promise.resolve().then(()=>{if(!this.configuration.invoke)throw new Error("Plugin task client has no invocation bridge");return this.configuration.invoke(message.action,message.payload,message.options)}).then(result=>writePluginTaskMessage(socket,{type:"invoke-result",id:message.id,result}),error48=>writePluginTaskMessage(socket,{type:"invoke-result",id:message.id,error:serializePluginExecutionError(error48)})).catch(()=>{}):socket.destroy(new Error("Invalid plugin task response direction"))});try{await new Promise((resolve11,reject)=>{let timer=setTimeout(()=>{socket.destroy(),reject(new Error("Plugin task connection timed out"))},2e3);socket.once("connect",()=>{clearTimeout(timer),resolve11()}),socket.once("error",error48=>{clearTimeout(timer),reject(error48)})});let scope={access:this.configuration.access??"public",source:this.configuration.source??"sdk",bridge:this.configuration.invoke?"caller":"service",...this.configuration.plugin?{plugin:this.configuration.plugin}:{},...this.configuration.scopeId?{scopeId:this.configuration.scopeId}:{}},status=await request("hello",{...scope,protocolVersion:5});if(status.protocolVersion!==5)throw new Error("Plugin task protocol version mismatch");if(generation!==this.generation||socket.destroyed)throw new Error("Plugin task client was disconnected");return this.socket=socket,{socket,request,status}}catch(error48){throw socket.destroy(),error48}finally{this.opening.delete(socket)}}async request(method,input2={},timeoutMs){if(!this.connection){let attempt=this.connect(this.generation);this.connection=attempt,attempt.catch(()=>{this.connection===attempt&&(this.connection=void 0)})}return(await this.connection).request(method,input2,timeoutMs)}disconnect(){this.generation++,this.socket?.destroy();for(let socket of this.opening)socket.destroy();this.socket=void 0,this.connection=void 0}}}});import{randomUUID as randomUUID4}from"node:crypto";async function invokePageEvalWithArgs(invoke3,params){if(!Number.isSafeInteger(params.tabId)||params.tabId<0)throw new Error("Invalid target tab");if(resolvePageEvalExpression({expression:params.expression,args:[]}),!Array.isArray(params.args))throw new Error("page_eval args must be an array");if(params.executionWorld!==void 0&&!["main","isolated"].includes(params.executionWorld))throw new Error("Invalid page executionWorld");params.executionWorld==="isolated"&&validatePageUserScriptParams({tabId:params.tabId,worldId:params.worldId??"",code:params.expression});let args=JSON.stringify(params.args);if(args.length>64*1024*1024)throw new Error("Page script arguments must fit within 64 MiB characters");let{args:_args,...request}=params,evaluate2=async(expression,transfer=!1)=>{let payload={...request,...transfer?{observe:!1,diagnostics:!1}:{},expression},result=await(transfer?invoke3(payload,!0):invoke3(payload));if(transfer&&result?.action?.success===!1)throw new Error(result.action.error||"page_eval failed");return result};if(args.length+params.expression.length<=CHUNK_CHARACTERS)return evaluate2(resolvePageEvalExpression(params));let key=JSON.stringify("__mearlPageScriptTransfer_"+randomUUID4());try{for(let offset=0;offset<args.length;offset+=CHUNK_CHARACTERS)await evaluate2(`void (window[${key}] = (window[${key}] || '') + ${JSON.stringify(args.slice(offset,offset+CHUNK_CHARACTERS))})`,!0);return await evaluate2(`(() => { const args = JSON.parse(window[${key}]); delete window[${key}]; return (${params.expression})(...args); })()`)}finally{await evaluate2(`delete window[${key}]`,!0).catch(()=>{})}}var CHUNK_CHARACTERS,init_pageEvalArguments=__esm({"../client/dist/pageEvalArguments.js"(){"use strict";init_browser_action_protocol();CHUNK_CHARACTERS=48*1024}});import{open,mkdir,rename,rm,stat}from"node:fs/promises";import path2 from"node:path";import{randomUUID as randomUUID5}from"node:crypto";async function stageFile(client2,filePath,options){if(!path2.isAbsolute(filePath))throw new Error("Caller-local file paths must be absolute");let source=await open(filePath,"r"),id,pinned=options;try{let metadata=await source.stat();if(!metadata.isFile()||metadata.size>256*1024*1024)throw new Error("Upload requires a regular file of at most 256 MiB");let created=await client2.invoke("__artifact_init",{filename:path2.basename(filePath)},options);pinned={...options,browser:created.browserId},id=created.artifact.artifactId;let offset=0;for await(let chunk of source.createReadStream({highWaterMark:CHUNK_BYTES,autoClose:!1}))await client2.invoke("__artifact_write",{artifactId:id,offset,base64:chunk.toString("base64")},pinned),offset+=chunk.length;return await client2.invoke("__artifact_complete",{artifactId:id,bytes:offset},pinned),{artifactId:id,options:pinned}}catch(error48){throw id&&await client2.invoke("__artifact_remove",{artifactId:id},pinned).catch(()=>{}),error48}finally{await source.close()}}async function exportArtifact(client2,artifact,outputPath2,options={}){if(!Number.isSafeInteger(artifact.bytes)||artifact.bytes<0)throw new Error("Invalid artifact size");if(!path2.isAbsolute(outputPath2))throw new Error("Artifact output paths must be absolute");if(!options.session&&!artifact.browserId&&!options.browser)throw new Error("An artifact requires its originating browser");let pinned={...options,...artifact.browserId?{browser:artifact.browserId}:{}};await mkdir(path2.dirname(outputPath2),{recursive:!0});let temporary=`${outputPath2}.${randomUUID5()}.part`,target=await open(temporary,"wx",384);try{let offset=0;if(artifact.bytes===0){let empty=await client2.invoke("__artifact_read",{artifactId:artifact.artifactId,offset:0},pinned);if(empty.totalBytes!==0||empty.bytes!==0||empty.base64!=="")throw new Error("Artifact export size mismatch")}for(;offset<artifact.bytes;){let chunk=await client2.invoke("__artifact_read",{artifactId:artifact.artifactId,offset},pinned),bytes=Buffer.from(chunk.base64,"base64");if(!bytes.length||bytes.length!==chunk.bytes||chunk.totalBytes!==artifact.bytes||offset+bytes.length>artifact.bytes)throw new Error("Invalid artifact chunk or truncated transfer");await target.write(bytes),offset+=bytes.length}if(await target.sync(),await target.close(),(await stat(temporary)).size!==artifact.bytes)throw new Error("Artifact export size mismatch");return await rename(temporary,outputPath2),{outputPath:outputPath2,bytes:artifact.bytes}}catch(error48){throw await target.close().catch(()=>{}),await rm(temporary,{force:!0}),error48}}var CHUNK_BYTES,init_artifacts=__esm({"../client/dist/artifacts.js"(){"use strict";CHUNK_BYTES=256*1024}});function resolveCloudConnectorSelector(connectors,selector){let normalized=selector.trim().toLowerCase();if(!normalized)return{status:"not_found"};let resolveMatches=matches=>matches.length===1?{status:"matched",connector:matches[0]}:matches.length>1?{status:"ambiguous"}:null,exactId=resolveMatches(connectors.filter(connector=>connector.connectorId.toLowerCase()===normalized));if(exactId)return exactId;let exactName=resolveMatches(connectors.filter(connector=>connector.name.toLowerCase()===normalized));return exactName||(resolveMatches(connectors.filter(connector=>connector.connectorId.toLowerCase().includes(normalized)||connector.name.toLowerCase().includes(normalized)))??{status:"not_found"})}function isHeartbeatMessage(msg){return msg&&(msg.type==="ping"||msg.type==="pong")}var init_dist2=__esm({"../cloud/cloud-types/dist/index.js"(){"use strict"}});function boundedNumber(value,fallback,minimum,maximum){let numeric=Number(value);return Number.isFinite(numeric)?Math.min(Math.max(numeric,minimum),maximum):fallback}function resolveObservedActionTimeoutSec(data){let observe=data.observe??{},observationMs=boundedNumber(observe.timeoutMs,3e3,500,3e4),navigationGraceMs=boundedNumber(observe.navigationGraceMs,1e3,0,5e3),navigationTimeoutMs=boundedNumber(observe.navigationTimeoutMs,15e3,1e3,3e4),totalMs=observationMs+navigationGraceMs+4e3+navigationTimeoutMs+5e3;return Math.max(20,Math.ceil(totalMs/1e3))}function resolveActionTimeoutSec(action,data,fallback=15){if(action==="send_request"){let transferTimeoutMs=data.bodyFile!==void 0||Array.isArray(data.files)&&data.files.length>0?SEND_REQUEST_FILE_TRANSFER_TIMEOUT_MS:0;return Math.max(fallback,Math.ceil(((data.timeout??3e4)+transferTimeoutMs+5e3)/1e3))}if(action==="send_mtop_request")return Math.max(fallback,Math.ceil(((data.timeout??1e4)+5e3)/1e3));if(action==="page_download")return Math.max(fallback,Math.ceil((Number(data.timeout??3e4)+1e4)/1e3));if(action==="page_wait"){let waitMs=data.time??data.timeout??1e4;return Math.max(fallback,Math.ceil((Number(waitMs)+5e3)/1e3))}if(action==="tab_open"||action==="set_cookie"&&data.reload===!0)return Math.max(fallback,40);if(action==="browser_launch")return Math.max(fallback,90);if(action==="browser_close")return Math.max(fallback,BROWSER_CLOSE_TIMEOUT_SEC);if(action==="run_actions"){let timeoutSec=(Array.isArray(data.actions)?data.actions:[{}]).reduce((total,step)=>{let stepAction=String(step?.action??"");return!stepAction||stepAction==="run_actions"?total+15:total+resolveActionTimeoutSec(stepAction,step?.data??{},15)},0);return Math.max(fallback,timeoutSec)}let observedAction=OBSERVED_PAGE_ACTIONS.has(action),observationEnabled=action==="page_eval"?data.observe!==null&&typeof data.observe=="object"&&!Array.isArray(data.observe):data.observe!==!1;if(action==="page_upload"){let actionTimeoutSec=observationEnabled?resolveObservedActionTimeoutSec(data):fallback;return Math.max(fallback,actionTimeoutSec+Math.ceil(PAGE_UPLOAD_FILE_TRANSFER_TIMEOUT_MS/1e3))}return observedAction&&observationEnabled?Math.max(fallback,resolveObservedActionTimeoutSec(data)):fallback}var SEND_REQUEST_FILE_TRANSFER_TIMEOUT_MS,PAGE_UPLOAD_FILE_TRANSFER_TIMEOUT_MS,BROWSER_CLOSE_TIMEOUT_SEC,OBSERVED_PAGE_ACTIONS,init_actionTimeouts=__esm({"../client/dist/actionTimeouts.js"(){"use strict";init_browser_action_protocol();SEND_REQUEST_FILE_TRANSFER_TIMEOUT_MS=12e4,PAGE_UPLOAD_FILE_TRANSFER_TIMEOUT_MS=18e4,BROWSER_CLOSE_TIMEOUT_SEC=1080;OBSERVED_PAGE_ACTIONS=new Set(PAGE_ACT_ACTIONS)}});function assertProviderProtocolVersion(actual,peer="Provider"){if(actual!==3)throw new Error(`PROVIDER_PROTOCOL_MISMATCH: ${peer} uses protocol ${String(actual??"unknown")}; expected 3. Update Mearl and the Provider package, then restart the services.`)}var init_protocol=__esm({"../provider/dist/protocol.js"(){"use strict"}});var init_types=__esm({"../provider/dist/types.js"(){"use strict";init_protocol()}});function isProviderAction(value){return typeof value=="string"&&providerActionSet.has(value)}var PROVIDER_ACTIONS,providerActionSet,init_provider_actions=__esm({"../provider/dist/generated/provider-actions.js"(){"use strict";PROVIDER_ACTIONS=["tab_checkpoint","capture_checkpoint","get_requests","get_logs","get_events","set_mock","get_mocks","set_rule","get_rules","send_request","send_mtop_request","browser_release","page_screenshot","tab_open","tab_close","tab_list","tab_group","page_click","page_drag","page_type","page_scroll","page_hover","page_eval","page_runtime","page_inspect","page_snapshot","page_press","page_wait","page_navigate","page_upload","page_frames","set_device_emulation","set_app_profile","set_timezone","get_cookie","set_cookie","request_domain_permission","run_actions","page_download"],providerActionSet=new Set(PROVIDER_ACTIONS)}});function isJsonValue(value,depth=0){return depth>32?!1:value===null||["string","boolean"].includes(typeof value)?!0:typeof value=="number"?Number.isFinite(value):Array.isArray(value)?value.every(item=>isJsonValue(item,depth+1)):typeof value=="object"&&Object.values(value).every(item=>isJsonValue(item,depth+1))}function isOptionalString(value){return value===void 0||typeof value=="string"}function isOptionalFiniteNumber(value){return value===void 0||typeof value=="number"&&Number.isFinite(value)}function isOptionalCount(value){return value===void 0||Number.isInteger(value)&&Number(value)>=0}function isProviderInputSchema(value,depth=0){if(!value||typeof value!="object"||Array.isArray(value)||depth>32)return!1;let schema=value;if(!isOptionalString(schema.title)||!isOptionalString(schema.description)||schema.component!==void 0&&!["cookie-sync","switch"].includes(String(schema.component))||schema.default!==void 0&&!isJsonValue(schema.default)||schema.formDefault!==void 0&&!isJsonValue(schema.formDefault)||schema.formHidden!==void 0&&typeof schema.formHidden!="boolean"||schema.formWidth!==void 0&&!["half","full"].includes(String(schema.formWidth))||schema.formHideOptional!==void 0&&typeof schema.formHideOptional!="boolean"||schema.formVisibleWhen!==void 0&&(!schema.formVisibleWhen||typeof schema.formVisibleWhen!="object"||Array.isArray(schema.formVisibleWhen)||typeof schema.formVisibleWhen.field!="string"||!schema.formVisibleWhen.field||typeof schema.formVisibleWhen.empty!="boolean"))return!1;if(schema.type==="string"){let validPattern=!0;if(schema.pattern!==void 0)try{new RegExp(String(schema.pattern))}catch{validPattern=!1}if(!((schema.enum===void 0||Array.isArray(schema.enum)&&schema.enum.every(item=>typeof item=="string"))&&(schema.secret===void 0||typeof schema.secret=="boolean")&&isOptionalCount(schema.minLength)&&isOptionalCount(schema.maxLength)&&(schema.minLength===void 0||schema.maxLength===void 0||Number(schema.minLength)<=Number(schema.maxLength))&&isOptionalString(schema.pattern)&&validPattern&&isOptionalString(schema.placeholder)&&(schema.options===void 0||Array.isArray(schema.options)&&schema.options.every(option=>option&&typeof option=="object"&&!Array.isArray(option)&&typeof option.value=="string"&&typeof option.label=="string"&&isOptionalString(option.description)&&(option.disabled===void 0||typeof option.disabled=="boolean")&&(schema.enum===void 0||schema.enum.includes(option.value)))&&new Set(schema.options.map(option=>option.value)).size===schema.options.length)))return!1}else if(schema.type==="number"){if(!((schema.integer===void 0||typeof schema.integer=="boolean")&&isOptionalFiniteNumber(schema.minimum)&&isOptionalFiniteNumber(schema.maximum)&&(schema.minimum===void 0||schema.maximum===void 0||Number(schema.minimum)<=Number(schema.maximum))))return!1}else if(schema.type!=="boolean")if(schema.type==="array"){if(!isProviderInputSchema(schema.items,depth+1)||!isOptionalCount(schema.minItems)||!isOptionalCount(schema.maxItems)||schema.minItems!==void 0&&schema.maxItems!==void 0&&Number(schema.minItems)>Number(schema.maxItems))return!1}else{if(schema.type!=="object"||!schema.properties||typeof schema.properties!="object"||Array.isArray(schema.properties)||schema.additionalProperties!==void 0&&typeof schema.additionalProperties!="boolean")return!1;let properties=schema.properties;if(!Object.values(properties).every(item=>isProviderInputSchema(item,depth+1))||Object.values(properties).some(item=>{let condition=item.formVisibleWhen;return condition!==void 0&&!(String(condition.field)in properties)})||schema.not!==void 0&&(!isProviderInputSchema(schema.not,depth+1)||schema.not.type!=="object")||schema.oneOf!==void 0&&(!Array.isArray(schema.oneOf)||schema.oneOf.length===0||schema.oneOf.some(branch=>!isProviderInputSchema(branch,depth+1)||branch.type!=="object"))||schema.required!==void 0&&(!Array.isArray(schema.required)||schema.required.some(item=>typeof item!="string"||!(item in properties))||new Set(schema.required).size!==schema.required.length))return!1}if(schema.component==="cookie-sync"&&schema.type!=="object"||schema.component==="switch"&&schema.type!=="boolean")return!1;if(schema.default!==void 0)try{validateSchemaValue(value,schema.default,"default")}catch{return!1}if(schema.formDefault!==void 0)try{validateSchemaValue(value,schema.formDefault,"formDefault")}catch{return!1}return!0}function fail(path27,message){throw new Error(`${path27} ${message}`)}function validateSchemaValue(schema,value,path27){if(schema.type==="string"){typeof value!="string"&&fail(path27,"must be a string"),schema.enum&&!schema.enum.includes(value)&&fail(path27,"has an unsupported value"),schema.minLength!==void 0&&value.length<schema.minLength&&fail(path27,`must contain at least ${schema.minLength} characters`),schema.maxLength!==void 0&&value.length>schema.maxLength&&fail(path27,`must contain at most ${schema.maxLength} characters`),schema.pattern!==void 0&&!new RegExp(schema.pattern).test(value)&&fail(path27,"has an invalid format");return}if(schema.type==="number"){(typeof value!="number"||!Number.isFinite(value))&&fail(path27,"must be a number"),schema.integer&&!Number.isInteger(value)&&fail(path27,"must be an integer"),schema.minimum!==void 0&&value<schema.minimum&&fail(path27,`must be at least ${schema.minimum}`),schema.maximum!==void 0&&value>schema.maximum&&fail(path27,`must be at most ${schema.maximum}`);return}if(schema.type==="boolean"){typeof value!="boolean"&&fail(path27,"must be a boolean");return}if(schema.type==="array"){Array.isArray(value)||fail(path27,"must be an array"),schema.minItems!==void 0&&value.length<schema.minItems&&fail(path27,`must contain at least ${schema.minItems} items`),schema.maxItems!==void 0&&value.length>schema.maxItems&&fail(path27,`must contain at most ${schema.maxItems} items`),value.forEach((item,index)=>validateSchemaValue(schema.items,item,`${path27}[${index}]`));return}validateObject(schema,value,path27)}function validateObject(schema,value,path27){(!value||typeof value!="object"||Array.isArray(value))&&fail(path27,"must be an object");let input2=value;for(let key of schema.required??[])input2[key]===void 0&&fail(`${path27}.${key}`,"is required");if(schema.not){let matches=!1;try{validateObject(schema.not,input2,path27),matches=!0}catch{}matches&&fail(path27,"matches a forbidden field combination")}if(schema.oneOf&&schema.oneOf.filter(branch=>{try{return validateObject(branch,input2,path27),!0}catch{return!1}}).length!==1&&fail(path27,"must match exactly one launch form"),schema.additionalProperties!==!0)for(let key of Object.keys(input2))schema.properties[key]||fail(`${path27}.${key}`,"is not supported");for(let[key,item]of Object.entries(input2)){let property=schema.properties[key];property&&validateSchemaValue(property,item,`${path27}.${key}`)}}function validateProviderInput(schema,value){validateObject(schema,value,"options")}function validateProviderBrowser(browser){if(!browser||typeof browser!="object")throw new Error("Provider returned no browser");if(typeof browser.browserId!="string"||!browser.browserId.trim())throw new Error("Provider browserId is required");if(typeof browser.name!="string"||!browser.name.trim())throw new Error(`Provider browser ${browser.browserId} needs a name`);if(!["connected","pairing","running_disconnected","stopped"].includes(browser.status))throw new Error(`Provider browser ${browser.browserId} has an invalid status`);if(!["ephemeral","persistent"].includes(browser.persistence))throw new Error(`Provider browser ${browser.browserId} has invalid persistence`);if(browser.ownership!==void 0&&!["owned","attached"].includes(browser.ownership))throw new Error(`Provider browser ${browser.browserId} has invalid ownership`);if(!browser.control||!["provider","host","none"].includes(browser.control.kind))throw new Error(`Provider browser ${browser.browserId} has invalid control`);if(!Array.isArray(browser.operations)||new Set(browser.operations).size!==browser.operations.length||browser.operations.some(operation=>!LIFECYCLE_OPERATIONS.has(operation)))throw new Error(`Provider browser ${browser.browserId} has invalid lifecycle operations`);if(browser.status==="pairing"){if(browser.pairing?.kind!=="qr"||typeof browser.pairing.url!="string"||!browser.pairing.url.trim())throw new Error(`Pairing browser ${browser.browserId} needs a pairing URL`)}else if(browser.pairing)throw new Error(`Pairing metadata requires a pairing state: ${browser.browserId}`);if(browser.pairing&&(!isOptionalString(browser.pairing.code)||!isOptionalString(browser.pairing.label)))throw new Error(`Provider browser ${browser.browserId} has invalid pairing metadata`);if(browser.lastFocusedAt!==void 0&&(!Number.isFinite(browser.lastFocusedAt)||browser.lastFocusedAt<0))throw new Error(`Provider browser ${browser.browserId} has an invalid lastFocusedAt`);if(browser.status==="stopped"&&browser.control.kind!=="none")throw new Error(`Stopped Provider browser ${browser.browserId} cannot expose live control`);if(browser.status==="connected"&&browser.control.kind==="none")throw new Error(`Connected Provider browser ${browser.browserId} must expose control`);let capabilities=browser.control.kind==="provider"||browser.control.kind==="host"?browser.control.capabilities:void 0;if(browser.control.kind==="provider"||capabilities){if(!Array.isArray(capabilities?.actions))throw new Error(`Provider browser ${browser.browserId} needs action capabilities`);if(capabilities.actions.some(action=>!isProviderAction(action))||new Set(capabilities.actions).size!==capabilities.actions.length)throw new Error(`Provider browser ${browser.browserId} has invalid action capabilities`);if(!["native","reconstructed","none"].includes(capabilities.screenshot))throw new Error(`Provider browser ${browser.browserId} has invalid screenshot capabilities`);if(capabilities.actions.includes("page_screenshot")===(capabilities.screenshot==="none"))throw new Error(`Provider browser ${browser.browserId} has inconsistent screenshot capabilities`)}if(browser.control.kind==="host"&&(!["extension","cdp"].includes(browser.control.transport)||typeof browser.control.browserId!="string"||!browser.control.browserId.trim()))throw new Error(`Provider browser ${browser.browserId} has invalid host control`);if(browser.references!==void 0&&(!Array.isArray(browser.references)||browser.references.some(reference=>!reference||typeof reference.kind!="string"||!reference.kind.trim()||typeof reference.id!="string"||!reference.id.trim()||!isOptionalString(reference.label))||new Set(browser.references.map(reference=>`${reference.kind}:${reference.id}`)).size!==browser.references.length))throw new Error(`Provider browser ${browser.browserId} has invalid references`);if(browser.details!==void 0&&(!browser.details||typeof browser.details!="object"||Array.isArray(browser.details)||!isJsonValue(browser.details)))throw new Error(`Provider browser ${browser.browserId} has invalid details`);if(browser.details){let details=browser.details,strings3=value=>Array.isArray(value)&&value.every(item=>typeof item=="string");if(details.headless!==void 0&&typeof details.headless!="boolean"||details.createdAt!==void 0&&(typeof details.createdAt!="string"||!Number.isFinite(Date.parse(details.createdAt)))||details.cdpPort!==void 0&&(!Number.isInteger(details.cdpPort)||details.cdpPort<1||details.cdpPort>65535)||details.copiedCookies!==void 0&&(!details.copiedCookies||!strings3(details.copiedCookies.domains)||!Number.isInteger(details.copiedCookies.count)||details.copiedCookies.count<0))throw new Error(`Provider browser ${browser.browserId} has invalid common details`)}}function validateDefinition(definition){let{providerId,name,version:version3,protocolVersion}=definition.descriptor;if(!providerId?.trim())throw new Error("providerId is required");if(!name?.trim())throw new Error("provider name is required");if(!version3?.trim())throw new Error("provider version is required");if(protocolVersion!==void 0&&protocolVersion!==3)throw new Error(`Unsupported provider protocol ${protocolVersion}; expected ${3}`);if(!definition.browserType.name?.trim())throw new Error("provider browser type name is required");if(!isProviderInputSchema(definition.browserType.inputSchema)||definition.browserType.inputSchema.type!=="object")throw new Error("Provider input schema is invalid");if(definition.browserType.documentationUrl!==void 0&&(typeof definition.browserType.documentationUrl!="string"||!/^https?:\/\//.test(definition.browserType.documentationUrl)))throw new Error("Provider documentation URL must use HTTP(S)");if(definition.browserType.dynamicLaunchForm!==void 0&&typeof definition.browserType.dynamicLaunchForm!="boolean")throw new Error("Provider dynamic launch form declaration is invalid");if(definition.browserType.dynamicLaunchForm&&!definition.getLaunchForm)throw new Error("Provider does not implement getLaunchForm");definition.browserType.launchForm!==void 0&&validateProviderLaunchForm(definition.browserType.launchForm);let configuration=definition.browserType.configuration;if(configuration&&(!isProviderInputSchema(configuration.inputSchema)||configuration.inputSchema.type!=="object"))throw new Error("Provider configuration schema is invalid")}function validateProviderLaunchForm(form){if(!form||!isProviderInputSchema(form.inputSchema)||form.inputSchema.type!=="object"||!isOptionalString(form.variant)||!isOptionalString(form.message)||form.blocked!==void 0&&typeof form.blocked!="boolean"||form.values!==void 0&&(!form.values||typeof form.values!="object"||Array.isArray(form.values)||!isJsonValue(form.values))||form.dynamicFields!==void 0&&(!Array.isArray(form.dynamicFields)||form.dynamicFields.some(field=>typeof field!="string"||!(field in form.inputSchema.properties)))||form.refreshOn!==void 0&&(!Array.isArray(form.refreshOn)||form.refreshOn.some(field=>typeof field!="string"||!(field in form.inputSchema.properties)))||form.variants!==void 0&&(!Array.isArray(form.variants)||!form.variants.length||form.variants.some(variant=>!variant||typeof variant.id!="string"||!variant.id||typeof variant.title!="string"||!isOptionalString(variant.description))||new Set(form.variants.map(variant=>variant.id)).size!==form.variants.length||!form.variants.some(variant=>variant.id===form.variant)))throw new Error("Provider returned an invalid launch form");for(let variant of form.variants??[])validateProviderLaunchForm({inputSchema:variant.inputSchema===void 0?form.inputSchema:variant.inputSchema,values:variant.values===void 0?form.values:variant.values,refreshOn:variant.refreshOn===void 0?form.refreshOn:variant.refreshOn,dynamicFields:variant.dynamicFields===void 0?form.dynamicFields:variant.dynamicFields})}function createProviderRuntime(definition){validateDefinition(definition);let publishedBrowsers=[],validateRuntimeBrowser=browser=>{validateProviderBrowser(browser);let implementations={start:definition.start,detach:definition.detach,access:definition.getAccess,syncCookies:definition.syncCookies};for(let[operation,implementation]of Object.entries(implementations))if(browser.operations.includes(operation)&&!implementation)throw new Error(`Provider browser ${browser.browserId} advertises ${operation} without implementing it`)},listBrowsers=async(context={})=>{let browsers=definition.listBrowsers?await definition.listBrowsers(context):publishedBrowsers,seen=new Set;for(let browser of browsers){if(validateRuntimeBrowser(browser),seen.has(browser.browserId))throw new Error(`Duplicate provider browserId: ${browser.browserId}`);seen.add(browser.browserId)}return browsers},requireBrowser=async(browserId,operation,context)=>{let browser=(await listBrowsers(context)).find(item=>item.browserId===browserId);if(!browser)throw new Error(`Provider browser not found: ${browserId}`);if(!browser.operations.includes(operation))throw new Error(`Provider browser ${browserId} does not support ${operation}`);return browser};return{definition,listBrowsers,updateBrowsers(browsers){if(browsers.forEach(validateRuntimeBrowser),new Set(browsers.map(browser=>browser.browserId)).size!==browsers.length)throw new Error("Provider browser ids must be unique");publishedBrowsers=[...browsers]},async getLaunchForm(request,context={}){if(!definition.browserType.dynamicLaunchForm||!definition.getLaunchForm)throw new Error("Provider does not support dynamic launch forms");if(!request||!isOptionalString(request.variant)||!request.values||typeof request.values!="object"||Array.isArray(request.values)||!isJsonValue(request.values))throw new Error("Invalid launch form request");let form=await definition.getLaunchForm(request,context);validateProviderLaunchForm(form);for(let[key,value]of Object.entries(form.values??{})){let schema=definition.browserType.inputSchema.properties[key];if(!schema)throw new Error(`Launch form returned an unknown parameter: ${key}`);validateSchemaValue(schema,value,key)}return form},async launch(options,context={}){validateProviderInput(definition.browserType.inputSchema,options);let browser=await definition.launch(options,context);return validateRuntimeBrowser(browser),browser},async start(request,context={}){if(await requireBrowser(request.browserId,"start",context),!definition.start)throw new Error("Provider does not implement start");let browser=await definition.start(request,context);return validateRuntimeBrowser(browser),browser},async close(request,context={}){return await requireBrowser(request.browserId,request.deleteData?"deleteData":"close",context),definition.close(request,context)},async detach(request,context={}){if(await requireBrowser(request.browserId,"detach",context),!definition.detach)throw new Error("Provider does not implement detach");return definition.detach(request,context)},async syncCookies(request,context={}){if(await requireBrowser(request.browserId,"syncCookies",context),!definition.syncCookies)throw new Error("Provider does not implement cookie sync");if(!request.scope||typeof request.scope!="object"||Array.isArray(request.scope)||!isJsonValue(request.scope))throw new Error("Cookie sync scope must be a JSON object");return definition.syncCookies(request,context)},async getAccess(request,context={}){if(await requireBrowser(request.browserId,"access",context),!definition.getAccess)throw new Error("Provider does not expose browser access");let access=await definition.getAccess(request,context);if(!access||typeof access.kind!="string"||!access.kind.trim()||typeof access.url!="string")throw new Error("Provider returned an invalid browser access result");let url2=new URL(access.url),isDevTools=access.kind==="cdp-devtools"&&url2.protocol==="devtools:"&&url2.host==="devtools"&&url2.pathname==="/bundled/inspector.html";if(!["http:","https:"].includes(url2.protocol)&&!isDevTools||access.sensitive!==!0)throw new Error("Provider returned an invalid browser access result");return{...access,url:url2.toString()}},async configure(options,context={}){let configuration=definition.browserType.configuration;if(!configuration||!definition.configure)throw new Error("Provider does not support configuration");return validateProviderInput(configuration.inputSchema,options),definition.configure(options,context)},async invokeAction(actionContext){let browser=(await listBrowsers({controlSource:actionContext.controlSource})).find(item=>item.browserId===actionContext.browserId);if(!browser)throw new Error(`Provider browser not found: ${actionContext.browserId}`);if(browser.status!=="connected")throw new Error(`Provider browser ${actionContext.browserId} is not connected`);if(browser.control.kind!=="provider")throw new Error(`Provider browser ${actionContext.browserId} uses host control`);if(!browser.control.capabilities.actions.includes(actionContext.action))throw new Error(`Provider browser ${actionContext.browserId} does not support ${actionContext.action}`);if(!definition.handleAction)throw new Error("Provider does not implement browser actions");return definition.handleAction(actionContext)}}}var LIFECYCLE_OPERATIONS,init_provider_runtime=__esm({"../provider/dist/provider-runtime.js"(){"use strict";init_types();init_provider_actions();LIFECYCLE_OPERATIONS=new Set(["start","close","detach","deleteData","access","syncCookies"])}});import{existsSync as existsSync3,readFileSync as readFileSync6,renameSync as renameSync4,rmSync as rmSync4,statSync as statSync5,writeFileSync as writeFileSync3}from"node:fs";import{randomUUID as randomUUID6}from"node:crypto";import{isAbsolute as isAbsolute3,join as join7,relative as relative2,resolve as resolve3,sep as sep2}from"node:path";function providerBrowserKey(providerId,browserId){let redundantPrefix=`managed:${providerId}:`,scopedBrowserId=browserId.toLowerCase().startsWith(redundantPrefix.toLowerCase())?browserId.slice(redundantPrefix.length):browserId,encodedBrowserId=encodeURIComponent(scopedBrowserId).replace(/%3A/gi,":");return`provider:${encodeURIComponent(providerId)}:${encodedBrowserId}`}function installedProviderFile(providerId){return keyedConfigFile(INSTALLED_PROVIDERS_SUBDIR,providerId)}function liveProviderFile(providerId){return keyedConfigFile(LIVE_PROVIDERS_SUBDIR,providerId)}function startingProviderFile(providerId){return keyedConfigFile(STARTING_PROVIDERS_SUBDIR,providerId)}function claimProviderStart(providerId,token,pid=process.pid){let file2=startingProviderFile(providerId),existing=readRecord(file2);return existing&&isAlive(existing.pid)?existing.token===token:(existing?removeRecordIfPid(file2,existing.pid):removeInvalidRecord(file2),claimRecord(file2,{pid,providerId,token,startedAt:new Date().toISOString()}))}function readProviderStart(providerId){let record4=readRecord(startingProviderFile(providerId));return record4&&isAlive(record4.pid)?record4:null}function transferProviderStart(providerId,token,pid){let file2=startingProviderFile(providerId),record4=readRecord(file2);return!record4||record4.token!==token?!1:writeRecordIfPid(file2,record4.pid,{...record4,pid})}function releaseProviderStart(providerId,token){let file2=startingProviderFile(providerId),record4=readRecord(file2);return record4?.token===token?removeRecordIfPid(file2,record4.pid):!1}function writeManifest(file2,manifest){ensureDir(keyedDir(INSTALLED_PROVIDERS_SUBDIR));let temporary=`${file2}.${process.pid}.${randomUUID6()}.tmp`;try{writeFileSync3(temporary,JSON.stringify(manifest),{mode:384}),renameSync4(temporary,file2)}catch(error48){throw rmSync4(temporary,{force:!0}),error48}}function validateInstalledProviderManifest(manifest){if(!manifest||typeof manifest.providerId!="string"||!manifest.providerId.trim()||typeof manifest.name!="string"||!manifest.name.trim()||typeof manifest.version!="string"||!manifest.version.trim())return"manifest is incomplete";try{assertProviderProtocolVersion(manifest.protocolVersion,`Installed Provider ${manifest.providerId}`)}catch(error48){return error48.message}if(RESERVED_PROVIDER_IDS.has(manifest.providerId))return`providerId ${manifest.providerId} is reserved for a built-in Provider`;if(!isProviderBrowserType(manifest.browserType))return"browserType is invalid";if(typeof manifest.packageName!="string"||!manifest.packageName.trim())return"packageName is required";if(typeof manifest.packageRoot!="string"||!isAbsolute3(manifest.packageRoot))return"packageRoot must be an absolute path";if(typeof manifest.entryPath!="string"||!isAbsolute3(manifest.entryPath))return"entryPath must be an absolute path";let entryRelative=relative2(manifest.packageRoot,manifest.entryPath);return entryRelative===""||isAbsolute3(entryRelative)||entryRelative===".."||entryRelative.startsWith(`..${sep2}`)?"entryPath must be a file inside packageRoot":isFile(manifest.entryPath)?null:"entryPath does not exist or is not a file"}function installProvider(manifest){let invalid3=validateInstalledProviderManifest(manifest);if(invalid3)throw new Error(`Invalid provider manifest: ${invalid3}`);writeManifest(installedProviderFile(manifest.providerId),manifest)}function packageFile(packageRoot){return join7(packageRoot,"package.json")}function isFile(filePath){try{return statSync5(filePath).isFile()}catch{return!1}}function isProviderBrowserType(value){if(!value||typeof value!="object")return!1;let browserType=value;if(typeof browserType.name!="string"||!browserType.name.trim()||browserType.documentationUrl!==void 0&&(typeof browserType.documentationUrl!="string"||!/^https?:\/\//.test(browserType.documentationUrl))||browserType.help!==void 0&&(!Array.isArray(browserType.help)||browserType.help.some(item=>typeof item!="string"||!item.trim()))||!isProviderObjectSchema(browserType.inputSchema)||browserType.dynamicLaunchForm!==void 0&&typeof browserType.dynamicLaunchForm!="boolean")return!1;if(browserType.launchForm!==void 0)try{validateProviderLaunchForm(browserType.launchForm)}catch{return!1}return browserType.configuration===void 0||!!browserType.configuration&&typeof browserType.configuration=="object"&&isProviderObjectSchema(browserType.configuration.inputSchema)}function isProviderObjectSchema(value){return isProviderInputSchema(value)&&value.type==="object"}function registerProviderPackage(packageRoot){if(!isAbsolute3(packageRoot))throw new Error("Provider packageRoot must be an absolute path");let packageJson;try{packageJson=JSON.parse(readFileSync6(packageFile(packageRoot),"utf8"))}catch(error48){throw new Error(`Unable to read Provider package metadata from ${packageRoot}`,{cause:error48})}let metadata=packageJson.mearl?.provider;if(typeof packageJson.name!="string"||!packageJson.name.trim()||typeof packageJson.version!="string"||!packageJson.version.trim()||typeof metadata?.providerId!="string"||!metadata.providerId.trim()||typeof metadata.name!="string"||!metadata.name.trim()||metadata.protocolVersion!==3||typeof metadata.entry!="string"||!metadata.entry.trim()||!isProviderBrowserType(metadata.browserType))throw new Error(`Invalid mearl.provider metadata in ${packageFile(packageRoot)}`);if(isAbsolute3(metadata.entry))throw new Error(`Provider entry must be relative to ${packageFile(packageRoot)}`);let normalizedRoot=resolve3(packageRoot),entryPath=resolve3(normalizedRoot,metadata.entry),entryRelative=relative2(normalizedRoot,entryPath);if(isAbsolute3(entryRelative)||entryRelative===".."||entryRelative.startsWith(`..${sep2}`)||!isFile(entryPath))throw new Error(`Provider entry must be an existing file inside ${normalizedRoot}`);let installed=listInstalledProviders(),idConflict=installed.find(provider=>provider.providerId===metadata.providerId&&provider.packageName!==packageJson.name);if(idConflict)throw new Error(`Provider id ${metadata.providerId} is already registered by ${idConflict.packageName}`);let packageConflict=installed.find(provider=>provider.packageName===packageJson.name&&provider.providerId!==metadata.providerId);if(packageConflict)throw new Error(`Package ${packageJson.name} is already registered as Provider ${packageConflict.providerId}`);let manifest={providerId:metadata.providerId,name:metadata.name,version:packageJson.version,protocolVersion:metadata.protocolVersion,browserType:metadata.browserType,packageName:packageJson.name,packageRoot:normalizedRoot,entryPath};return installProvider(manifest),manifest}function listInstalledProviders(){let manifests=[];for(let file2 of listRecordFiles(keyedDir(INSTALLED_PROVIDERS_SUBDIR)))try{let parsed=JSON.parse(readFileSync6(file2,"utf8"));parsed&&typeof parsed.providerId=="string"&&typeof parsed.packageName=="string"&&manifests.push(parsed)}catch{}return manifests.sort((a,b)=>a.providerId.localeCompare(b.providerId))}function readLiveProvider(providerId){let record4=readRecord(liveProviderFile(providerId));return record4&&isAlive(record4.pid)?record4:null}function listLiveProviders(){return readLiveRecords(keyedDir(LIVE_PROVIDERS_SUBDIR))}var INSTALLED_PROVIDERS_SUBDIR,LIVE_PROVIDERS_SUBDIR,STARTING_PROVIDERS_SUBDIR,PROVIDER_START_TOKEN_ENV,RESERVED_PROVIDER_IDS,init_registry2=__esm({"../provider/dist/registry.js"(){"use strict";init_dist();init_types();init_provider_runtime();init_protocol();INSTALLED_PROVIDERS_SUBDIR="providers/installed",LIVE_PROVIDERS_SUBDIR="providers/live",STARTING_PROVIDERS_SUBDIR="providers/starting",PROVIDER_START_TOKEN_ENV="MEARL_PROVIDER_START_TOKEN",RESERVED_PROVIDER_IDS=new Set(["local"])}});import{spawn as spawn4}from"node:child_process";import{randomUUID as randomUUID7}from"node:crypto";import{tmpdir as tmpdir2}from"node:os";import{join as join8}from"node:path";function providerControlHostFile(){return keyedConfigFile("control","providers")}function providerControlSocketPath(pid){return process.platform==="win32"?`\\\\.\\pipe\\mearl-provider-control-${pid}`:join8(tmpdir2(),`mearl-provider-control-${pid}.sock`)}function readProviderControlHost(){let record4=readRecord(providerControlHostFile());return!record4?.ready||typeof record4.socketPath!="string"||!isAlive(record4.pid)?null:(assertProviderProtocolVersion(record4.protocolVersion,"Provider control host"),record4)}function ensureProviderControlHost(timeoutMs=1e4){if(startup)return startup;let pending=(async()=>{let file2=providerControlHostFile(),deadline=Date.now()+timeoutMs;for(;Date.now()<deadline;){let ready=readProviderControlHost();if(ready)return ready;let previous=readRecord(file2);if(!previous||!isAlive(previous.pid)){previous?removeRecordIfPid(file2,previous.pid):removeInvalidRecord(file2);let token=randomUUID7();if(claimRecord(file2,{pid:process.pid,socketPath:"",token,ready:!1,protocolVersion:3}))try{let entry=process.env.MEARL_NATIVE_HOST_ENTRY,child=spawn4(entry?process.execPath:"mearl-native-host",[...entry?[entry]:[],"--provider-control",token],{detached:!0,stdio:"ignore",windowsHide:!0});if(await new Promise((resolve11,reject)=>{child.once("error",reject),child.once("spawn",resolve11)}),child.unref(),!child.pid)throw new Error("Provider control host did not report its pid");writeRecordIfPid(file2,process.pid,{pid:child.pid,socketPath:providerControlSocketPath(child.pid),token,ready:!1,protocolVersion:3})}catch(error48){throw removeRecordIfPid(file2,process.pid),error48}}await new Promise(resolve11=>setTimeout(resolve11,50))}throw new Error("Provider control host startup timed out")})();return startup=pending,pending.finally(()=>{startup===pending&&(startup=void 0)}).catch(()=>{}),pending}var startup,init_control_host=__esm({"../provider/dist/control-host.js"(){"use strict";init_protocol();init_dist()}});var init_host=__esm({"../provider/dist/host.js"(){"use strict";init_registry2();init_control_host()}});import net from"node:net";import{chmodSync,rmSync as rmSync5}from"node:fs";import{dirname as dirname4}from"node:path";var MAX_REQUEST_BYTES,init_server=__esm({"../provider/dist/server.js"(){"use strict";init_dist();init_provider_actions();init_provider_runtime();init_registry2();init_types();init_protocol();MAX_REQUEST_BYTES=16*1024*1024}});var init_dist3=__esm({"../provider/dist/index.js"(){"use strict";init_types();init_protocol();init_provider_actions();init_registry2();init_provider_runtime();init_server()}});import{spawn as spawn5}from"node:child_process";import{randomUUID as randomUUID8}from"node:crypto";import{closeSync as closeSync5,existsSync as existsSync4,mkdirSync as mkdirSync4,openSync as openSync5}from"node:fs";import{join as join9}from"node:path";function providerLogFile(providerId){let hash2=hashKey(providerId);return join9(keyedDir(PROVIDER_LOGS_SUBDIR),`${hash2}.log`)}function hasCompatibleLiveProvider(providerId){let live=readLiveProvider(providerId);return live?(assertProviderProtocolVersion(live.providerProtocolVersion,providerId),!0):!1}function delay(ms){return new Promise(resolve11=>setTimeout(resolve11,ms))}async function spawnProvider(manifest,logFile,startToken){mkdirSync4(keyedDir(PROVIDER_LOGS_SUBDIR),{recursive:!0,mode:448}),rotateLogIfNeeded(logFile);let output2=openSync5(logFile,"a");try{return await new Promise((resolve11,reject)=>{let child=spawn5(process.execPath,[manifest.entryPath],{cwd:manifest.packageRoot,env:{...process.env,[PROVIDER_START_TOKEN_ENV]:startToken},detached:!0,stdio:["ignore",output2,output2],windowsHide:!0});child.once("error",reject),child.once("spawn",()=>{child.removeAllListeners("error"),child.on("error",()=>{}),child.unref(),child.pid?resolve11(child.pid):reject(new Error("spawned process has no pid"))})})}finally{closeSync5(output2)}}async function ensureInstalledProvidersRunning(providerIds){let warnings=[],selected=providerIds?new Set(providerIds):void 0,installed=listInstalledProviders().filter(provider=>!selected||selected.has(provider.providerId)),starting2=new Map;for(let manifest of installed){let invalid3=validateInstalledProviderManifest(manifest);if(invalid3){warnings.push(`provider ${manifest.providerId||"(unknown)"}: ${invalid3}`);continue}let startToken;try{if(hasCompatibleLiveProvider(manifest.providerId))continue;if(startToken=randomUUID8(),!claimProviderStart(manifest.providerId,startToken)){if(hasCompatibleLiveProvider(manifest.providerId))continue;readProviderStart(manifest.providerId)?starting2.set(manifest.providerId,null):warnings.push(`provider ${manifest.providerId}: failed to acquire startup ownership`);continue}if(hasCompatibleLiveProvider(manifest.providerId)){releaseProviderStart(manifest.providerId,startToken);continue}let logFile=providerLogFile(manifest.providerId),childPid=await spawnProvider(manifest,logFile,startToken);transferProviderStart(manifest.providerId,startToken,childPid),starting2.set(manifest.providerId,startToken)}catch(error48){startToken&&releaseProviderStart(manifest.providerId,startToken),warnings.push(`provider ${manifest.providerId}: ${error48 instanceof Error?error48.message:String(error48)}`)}}if(starting2.size===0)return warnings;let deadline=Date.now()+2e3,remaining=[...starting2.keys()];for(;remaining.length>0&&Date.now()<deadline;){await delay(100);let current=new Set(listLiveProviders().map(record4=>record4.providerId));remaining=remaining.filter(providerId=>!current.has(providerId))}for(let[providerId,token]of starting2)if(!remaining.includes(providerId)&&token&&releaseProviderStart(providerId,token),!remaining.includes(providerId))try{hasCompatibleLiveProvider(providerId)}catch(error48){warnings.push(`provider ${providerId}: ${error48 instanceof Error?error48.message:String(error48)}`)}for(let providerId of remaining){let logFile=providerLogFile(providerId);warnings.push(`provider ${providerId}: did not become ready within 2s${existsSync4(logFile)?`; see ${logFile}`:""}`)}return await delay(100),warnings}var PROVIDER_LOGS_SUBDIR,init_launcher=__esm({"../provider/dist/launcher.js"(){"use strict";init_dist();init_registry2();init_protocol();PROVIDER_LOGS_SUBDIR="providers/logs"}});var init_runtime=__esm({"../provider/dist/runtime.js"(){"use strict";init_launcher();init_registry2();init_provider_runtime()}});import fs2 from"node:fs";function resolveValue(value){if(typeof value!="string"||!value.startsWith(FILE_REF_PREFIX))return value;let filePath=value.slice(FILE_REF_PREFIX.length);if(!filePath)return value;let content;try{content=fs2.readFileSync(filePath,"utf-8")}catch{return value}try{return JSON.parse(content)}catch{return content}}function resolveFileRefs(data){if(data===null||typeof data!="object"||Array.isArray(data))return data;let out={};for(let[key,value]of Object.entries(data))out[key]=resolveValue(value);return out}var FILE_REF_PREFIX,init_fileRefs=__esm({"../client/dist/fileRefs.js"(){"use strict";FILE_REF_PREFIX="@"}});import fs3 from"node:fs";import os from"node:os";import path3 from"node:path";function isAlive2(pid){if(!pid||pid<=0)return!1;try{return process.kill(pid,0),!0}catch(error48){return error48.code==="EPERM"}}function listLiveBrowsers(){let files;try{files=fs3.readdirSync(BROWSERS_DIR).filter(name=>name.endsWith(".json"))}catch{return[]}let out=[];for(let name of files){let rec;try{rec=JSON.parse(fs3.readFileSync(path3.join(BROWSERS_DIR,name),"utf-8"))}catch{continue}rec&&typeof rec.pid=="number"&&rec.socketPath&&isAlive2(rec.pid)&&out.push(rec)}return out.sort((a,b)=>(b.lastFocusedAt??0)-(a.lastFocusedAt??0))}function findBrowser(browsers,selector){let sel=selector.trim().toLowerCase();if(!sel)return null;let byId=browsers.find(b=>b.browserId.toLowerCase()===sel);if(byId)return byId;let exactNameMatches=browsers.filter(b=>b.browserName.toLowerCase()===sel);if(exactNameMatches.length>1)throw new Error(`Browser name "${selector.trim()}" is ambiguous. Use a full browserId: ${exactNameMatches.map(browser=>browser.browserId).join(", ")}`);return exactNameMatches[0]?exactNameMatches[0]:browsers.find(b=>b.browserId.toLowerCase().includes(sel)||b.browserName.toLowerCase().includes(sel))??null}function describeBrowser(b){let idShort=b.browserId.length>12?`${b.browserId.slice(0,8)}…`:b.browserId;return`${b.browserName} [${idShort}]`}var BROWSERS_DIR,init_browserRegistry=__esm({"../client/dist/browserRegistry.js"(){"use strict";BROWSERS_DIR=path3.join(os.homedir(),".mearl","browsers")}});import net2 from"node:net";import fs4 from"node:fs";import os2 from"node:os";import path4 from"node:path";import{StringDecoder as StringDecoder2}from"node:string_decoder";function toControlSourceWireValue(source){return source==="remote"||source==="cloud"?"cloud":"local"}function setDefaultBrowser(selector){defaultBrowser=selector&&selector.trim()?selector.trim():void 0}function getDefaultBrowser(){return defaultBrowser}function findConnectedBrowser(items,selector){let normalized=selector.trim().toLowerCase(),connected=items.filter(item=>item.status==="connected"),byId=connected.find(item=>String(item.browserId).toLowerCase()===normalized);if(byId)return byId;let exactNameMatches=connected.filter(item=>String(item.name).toLowerCase()===normalized);if(exactNameMatches.length>1)throw new Error(`Browser name "${selector.trim()}" is ambiguous. Use a full browserId: ${exactNameMatches.map(item=>String(item.browserId)).join(", ")}`);return exactNameMatches[0]??connected.find(item=>String(item.browserId).toLowerCase().includes(normalized)||String(item.name).toLowerCase().includes(normalized))??null}function decorateBrowserListResult(result){let browsers=Array.isArray(result?.browsers)?result.browsers:[],selector=getDefaultBrowser()??process.env.MEARL_BROWSER,selected=selector?findConnectedBrowser(browsers,selector):browsers.find(browser=>browser.status==="connected")??null;return{...result,defaultBrowserId:selected?.browserId??null}}function browserListFromProviderRecords(browsers){let providerBrowsers=browsers.filter(browser=>browser.transport==="provider").map(browser=>({browserId:browser.browserId,name:browser.browserName,type:"managed",status:browser.status??"running_disconnected",transport:"provider",provider:browser.provider,ownership:browser.ownership,persistence:browser.persistence,operations:browser.operations,pairing:browser.pairing,references:browser.references,details:browser.details}));return{count:providerBrowsers.length,connectedCount:providerBrowsers.filter(browser=>browser.status==="connected").length,browsers:providerBrowsers}}function withDiscoveryWarning(result,error48){let detail=(error48.cause??error48)?.code??(error48 instanceof Error?error48.message.split(`
612
612
  `)[0]:String(error48));return{...result,warnings:[...Array.isArray(result.warnings)?result.warnings:[],`Local CDP discovery could not complete: ${detail}`]}}function cdpOnlyBrowserList(result){let cdpBrowsers=(Array.isArray(result.browsers)?result.browsers:[]).filter(browser=>browser.transport==="cdp");return{...result,count:cdpBrowsers.length,connectedCount:cdpBrowsers.filter(browser=>browser.status==="connected").length,browsers:cdpBrowsers}}function areInstalledProvidersRunning(){return listInstalledProviders().every(provider=>readLiveProvider(provider.providerId))}function isConnectedBrowser(browser){return browser.status===void 0||browser.status==="connected"}function isOrdinaryLocalBrowser(browser){return!browser.browserId.startsWith("managed:")&&(browser.transport==="extension"||browser.transport==="cdp")}function supportsAction(browser,action,data){if(browser.transport==="provider"){if(action==="browser_control"||action==="browser_release"&&data[SESSION_OPTION])return!0;if(action.startsWith("__artifact_"))return browser.capabilities?.actions.includes("page_upload")===!0||(action==="__artifact_read"||action==="__artifact_remove")&&browser.capabilities?.actions.includes("page_download")===!0;if(action==="run_actions"&&data[SESSION_OPTION])return!0}if(action==="get_versions")return!0;if(action==="get_browser_access_url")return browser.transport!=="provider"||browser.operations?.includes("access")===!0;if(action==="browser_close"){if(browser.transport!=="provider")return!0;let required2=data.deleteProfile===!0?"deleteData":"close";return browser.operations?.includes(required2)===!0}return action==="browser_release"?browser.transport!=="provider"||browser.operations?.includes("detach")===!0:isConnectedBrowser(browser)?browser.transport!=="provider"||browser.capabilities?.actions.some(capability=>capability===action)===!0:!1}function routableBrowsers(browsers,action,data,transport){return browsers.filter(browser=>isConnectedBrowser(browser)&&(action!=="browser_list"||browser.transport!=="provider")&&!(transport==="cdp"&&browser.transport==="provider")&&supportsAction(browser,action,data))}function resolveLocalActionTarget(action,data,options={}){let selector=options.browser??defaultBrowser??process.env.MEARL_BROWSER??void 0,socketPath=options.socketPath??process.env.MEARL_SOCKET_PATH?.trim();if(socketPath&&(options.socketPath||!selector))return{socketPath};let browsers=listLiveBrowsers(),target=selector?findBrowser(browsers,selector):routableBrowsers(browsers,action,data,options.transport)[0];return target?{browser:target.browserId}:void 0}function selectBrowserResult(data){let selector=typeof data.browser=="string"?data.browser.trim():"";if(!selector)return setDefaultBrowser(void 0),{selected:null,note:"Cleared: default target is now the most-recently focused browser."};let browsers=listLiveBrowsers(),controllableBrowsers=browsers.filter(isConnectedBrowser),match=findBrowser(controllableBrowsers,selector);if(!match)throw new Error(formatNoMatchError(selector,browsers));return setDefaultBrowser(match.browserId),{selected:{browserId:match.browserId,name:match.browserName}}}function instanceSocketPath(pid){return process.platform==="win32"?`\\\\.\\pipe\\mearl-agent-${pid}`:path4.join(os2.tmpdir(),`mearl-agent-${pid}.sock`)}function discoveryCacheKey(){let browsers=listLiveBrowsers().map(browser=>[browser.browserId,browser.pid,browser.socketPath,browser.status,browser.updatedAt]).sort((a,b)=>String(a[0]).localeCompare(String(b[0]))),providers=listInstalledProviders().map(provider=>provider.providerId).sort();return JSON.stringify({browsers,providers})}async function spawnNativeHost(args){let{spawn:spawn14}=await import("node:child_process");return new Promise((resolve11,reject)=>{let child=spawn14("mearl-native-host",args,{detached:!0,stdio:"ignore",windowsHide:!0});child.once("error",reject),child.once("spawn",()=>{child.unref(),resolve11(child.pid)})})}async function trySpawnNativeHost(){if(persistentSpawnPromise)return persistentSpawnPromise;let spawnPromise=(async()=>{try{return await spawnNativeHost(["--daemon"]),!0}catch{return!1}})();persistentSpawnPromise=spawnPromise;try{return await spawnPromise}finally{persistentSpawnPromise===spawnPromise&&(persistentSpawnPromise=null)}}async function discoverLocalBrowserList(timeoutSec,controlSource){if(discoveryListPromise)return discoveryListPromise;let cacheKey=discoveryCacheKey();if(discoveryListCache&&discoveryListCache.key===cacheKey&&Date.now()<discoveryListCache.until){if(discoveryListCache.error)throw discoveryListCache.error;return discoveryListCache.result}discoveryListCache=null;let request=(async()=>{let pid=await spawnNativeHost(["--daemon","--discover-cdp"]);if(pid===void 0)throw new Error("Native host did not report its process id");let socketPath=instanceSocketPath(pid),deadline=Date.now()+Math.min(timeoutSec*1e3,DISCOVERY_STARTUP_TIMEOUT_MS);for(;;)try{return await invokeOnce("browser_list",{},timeoutSec,void 0,socketPath,controlSource)}catch(error48){if(!isConnError(error48)||Date.now()>=deadline)throw error48;await new Promise(resolve11=>setTimeout(resolve11,DISCOVERY_RETRY_INTERVAL_MS))}})();discoveryListPromise=request;try{let result=await request;return result.browsers?.some(browser=>browser.transport==="cdp"&&browser.status==="connected"&&!browser.browserId?.startsWith("managed:"))||(discoveryListCache={key:cacheKey,result,until:Date.now()+DISCOVERY_MISS_CACHE_MS}),result}catch(error48){throw discoveryListCache={key:cacheKey,error:error48,until:Date.now()+DISCOVERY_MISS_CACHE_MS},error48}finally{discoveryListPromise===request&&(discoveryListPromise=null)}}function readOwnedLegacySocketIdentity(){if(process.platform==="win32")return null;try{let stat4=fs4.lstatSync(SOCKET_PATH);return!stat4.isSocket()||process.getuid&&stat4.uid!==process.getuid()?null:{dev:stat4.dev,ino:stat4.ino}}catch{return null}}function removeStaleLegacySocket(identity3){if(identity3)try{let current=fs4.lstatSync(SOCKET_PATH);if(!current.isSocket()||current.dev!==identity3.dev||current.ino!==identity3.ino)return;fs4.unlinkSync(SOCKET_PATH)}catch{}}function invoke(action,data={},options={}){if(action==="__resolve_action_target"){if(!isBrowserCapabilityAction(data.action))return Promise.reject(new Error("Invalid browser capability action"));let target=resolveLocalActionTarget(data.action,data.data??{},options),browser2=target?.browser??(target?.socketPath?listLiveBrowsers().find(item=>item.socketPath===target.socketPath&&supportsAction(item,data.action,data.data??{}))?.browserId:void 0);return Promise.resolve(browser2?{browser:browser2}:null)}if(action==="browser_select_browser")try{return Promise.resolve(selectBrowserResult(data))}catch(error48){return Promise.reject(error48)}let{timeoutSec=resolveActionTimeoutSec(action,data),transport,browser,controlSource="local"}=options;if(action==="__control_session_resolve")return resolveControlSession(data.sessionId,timeoutSec,controlSource);let resolvedData=resolveFileRefs(data);if(Object.defineProperty(resolvedData,SESSION_OPTION,{value:options.controlSessionId}),action==="browser_list")return dispatchInvoke(action,resolvedData,timeoutSec,transport,void 0,controlSource,options.socketPath).then(result=>decorateBrowserListResult(transport==="cdp"?cdpOnlyBrowserList(result):result));let selector=browser??defaultBrowser??process.env.MEARL_BROWSER??void 0;return dispatchInvoke(action,resolvedData,timeoutSec,transport,selector,controlSource,options.socketPath)}async function resolveControlSession(sessionId,timeoutSec,controlSource){let browsers=listLiveBrowsers(),configuredSocketPath=process.env.MEARL_SOCKET_PATH?.trim(),sockets=configuredSocketPath?[configuredSocketPath]:[...new Set(browsers.filter(browser=>browser.transport!=="provider").map(browser=>browser.socketPath))],provider=configuredSocketPath?void 0:browsers.find(browser=>browser.transport==="provider");!sockets.length&&!provider&&sockets.push(SOCKET_PATH);let requests=sockets.map(socketPath=>invokeOnce("__control_session_resolve",{sessionId},timeoutSec,void 0,socketPath,controlSource));provider&&requests.push(invokeOnce("__control_session_resolve",{sessionId},timeoutSec,void 0,provider.socketPath,controlSource,provider.browserId));let results=await Promise.allSettled(requests),sessions=results.flatMap(result=>result.status==="fulfilled"&&result.value?.session?.sessionId===sessionId?[result.value.session]:[]);if(sessions.length>1)throw new Error("CONTROL_SESSION_AMBIGUOUS: multiple hosts own this id");if(sessions.length)return{session:sessions[0]};let failure=results.find(result=>result.status==="rejected"&&!isConnError(result.reason));if(failure?.status==="rejected")throw failure.reason;return{session:null}}function isConnError(error48){let code=error48?.code;return code==="ENOENT"||code==="ECONNREFUSED"}function isSocketSandboxError(error48){return error48?.code==="EPERM"}function isUnavailableConnection(error48){let cause=error48.cause??error48,code=cause?.code;return isConnError(cause)||isSocketSandboxError(cause)||code==="EACCES"}async function dispatchInvoke(action,data,timeoutSec,transport,selector,controlSource,socketPath){let configuredSocketPath=socketPath??process.env.MEARL_SOCKET_PATH?.trim();if(configuredSocketPath&&(socketPath||!selector))try{return await invokeOnce(action,data,timeoutSec,transport,configuredSocketPath,controlSource)}catch(error48){throw isConnError(error48)||isSocketSandboxError(error48)?new Error(formatConnectError(error48,configuredSocketPath),{cause:error48}):error48}let browsers=listLiveBrowsers(),controllableBrowsers=browsers.filter(isConnectedBrowser);if(action==="browser_list"&&transport==="cdp"){let registeredCdp=controllableBrowsers.find(browser=>browser.transport==="cdp"&&isOrdinaryLocalBrowser(browser));if(registeredCdp)try{return await invokeOnce(action,data,timeoutSec,transport,registeredCdp.socketPath,controlSource)}catch(error48){if(!isConnError(error48))throw error48}try{return await discoverLocalBrowserList(timeoutSec,controlSource)}catch(error48){if(isUnavailableConnection(error48)&&browsers.some(browser=>browser.transport==="provider")&&areInstalledProvidersRunning())return withDiscoveryWarning(browserListFromProviderRecords(browsers),error48);throw error48}}if(action==="browser_list"&&!controllableBrowsers.some(isOrdinaryLocalBrowser))try{return await discoverLocalBrowserList(timeoutSec,controlSource)}catch(error48){if(isUnavailableConnection(error48)&&browsers.some(browser=>browser.transport==="provider")&&areInstalledProvidersRunning())return withDiscoveryWarning(browserListFromProviderRecords(browsers),error48);throw error48}if(selector){let match=findBrowser(browsers,selector);if(!match)throw new Error(formatNoMatchError(selector,browsers));if(transport==="cdp"&&match.transport==="provider")throw new Error(`Browser ${describeBrowser(match)} does not support the CDP transport`);if(match.status==="pairing"&&action!=="get_versions"&&action!=="browser_close"&&action!=="browser_release"&&action!=="browser_control")throw new Error(`Browser ${describeBrowser(match)} is waiting for device pairing`);if(!supportsAction(match,action,data))throw new Error(`Browser ${describeBrowser(match)} does not support ${action}`);try{return await invokeOnce(action,data,timeoutSec,transport,match.socketPath,controlSource,match.transport==="provider"?match.browserId:void 0)}catch(error48){throw isConnError(error48)||isSocketSandboxError(error48)?new Error(formatConnectError(error48,match.socketPath),{cause:error48}):error48}}let candidates=routableBrowsers(browsers,action,data,transport);if(candidates.length>0){let target=candidates[0];try{return await invokeOnce(action,data,timeoutSec,transport,target.socketPath,controlSource,target.transport==="provider"?target.browserId:void 0)}catch(error48){if(isSocketSandboxError(error48))throw new Error(formatConnectError(error48,target.socketPath),{cause:error48});if(!isConnError(error48))throw error48}}if(action==="browser_list")try{return await discoverLocalBrowserList(timeoutSec,controlSource)}catch(error48){if(isUnavailableConnection(error48)&&browsers.some(browser=>browser.transport==="provider")&&areInstalledProvidersRunning())return withDiscoveryWarning(browserListFromProviderRecords(browsers),error48);throw error48}return invokeViaLegacy(action,data,timeoutSec,transport,controlSource,!1)}async function invokeViaLegacy(action,data,timeoutSec,transport,controlSource,isRetry){let legacySocketIdentity=readOwnedLegacySocketIdentity();try{return await invokeOnce(action,data,timeoutSec,transport,SOCKET_PATH,controlSource)}catch(error48){let err=error48;if((err.code==="ENOENT"||err.code==="ECONNREFUSED")&&!isRetry&&(err.code==="ECONNREFUSED"&&removeStaleLegacySocket(legacySocketIdentity),await trySpawnNativeHost())){await new Promise(r=>setTimeout(r,1200));let target=listLiveBrowsers().find(browser=>isConnectedBrowser(browser)&&!(transport==="cdp"&&browser.transport==="provider")&&supportsAction(browser,action,data));return target?invokeOnce(action,data,timeoutSec,transport,target.socketPath,controlSource,target.transport==="provider"?target.browserId:void 0):invokeViaLegacy(action,data,timeoutSec,transport,controlSource,!0)}throw err instanceof Error&&!isConnError(err)&&!isSocketSandboxError(err)?err:new Error(formatConnectError(err,SOCKET_PATH),{cause:error48})}}async function invokeOnce(action,data,timeoutSec,transport,socketPath,controlSource,providerTarget){providerTarget&&(socketPath=(await ensureProviderControlHost(Math.min(timeoutSec*1e3,1e4))).socketPath);let id=`${Date.now()}_${Math.random().toString(36).slice(2,10)}`,deadline=Date.now()+Math.ceil(timeoutSec*1e3);return new Promise((resolve11,reject)=>{if(process.platform!=="win32"&&fs4.existsSync(socketPath)&&process.getuid&&fs4.statSync(socketPath).uid!==process.getuid()){let error48=new Error(`拒绝连接不属于当前用户的 Socket: ${socketPath}`);Object.assign(error48,{code:"EACCES"}),reject(error48);return}let socket=net2.createConnection(socketPath),settled=!1,buffer="",decoder=new StringDecoder2("utf8"),settle=(error48,result)=>{settled||(settled=!0,clearTimeout(timer),socket.removeAllListeners(),socket.end(),error48?reject(error48 instanceof Error?error48:new Error(String(error48))):resolve11(result))},timer=setTimeout(()=>{settle(new Error(`请求超时,已等待 ${timeoutSec} 秒`))},timeoutSec*1e3);socket.on("connect",()=>{let message={id,action,data,version:CLIENT_VERSION,protocolVersion:3,controlSource:toControlSourceWireValue(controlSource)};data[SESSION_OPTION]&&(message.controlSessionId=data[SESSION_OPTION]),transport&&(message.transport=transport),providerTarget&&(message.providerTarget=providerTarget,message.deadline=deadline),socket.write(JSON.stringify(message)+`
@@ -975,7 +975,7 @@ except BaseException as error:
975
975
  "message": "返回值无法 JSON 序列化: " + _error_message(serialization_error),
976
976
  })
977
977
  sys.exit(1)
978
- `}});import{randomUUID as randomUUID9}from"node:crypto";import{linkSync as linkSync2,mkdirSync as mkdirSync6,readFileSync as readFileSync9,rmSync as rmSync7,writeFileSync as writeFileSync5}from"node:fs";import{join as join13}from"node:path";function localPluginExecutionHost(){let directory=pluginDirectory(),hostId=hostIds.get(directory);if(!hostId){mkdirSync6(directory,{recursive:!0,mode:448});let file2=join13(directory,".execution-host-id"),proposed=randomUUID9(),temporary=`${file2}.${proposed}.tmp`;try{writeFileSync5(temporary,proposed,{flag:"wx",mode:384}),linkSync2(temporary,file2)}catch(error48){if(error48.code!=="EEXIST")throw error48}finally{rmSync7(temporary,{force:!0})}if(hostId=readFileSync9(file2,"utf8").trim(),!UUID.test(hostId))throw new Error("Invalid plugin execution host identity");hostIds.set(directory,hostId)}return Object.freeze({hostId,epoch})}function createPluginInvocationIdentity(plugin,source,parent){return Object.freeze({invocationId:randomUUID9(),host:parent?.host??localPluginExecutionHost(),plugin,source,...parent?{parentInvocationId:parent.invocationId}:{}})}var epoch,hostIds,UUID,init_pluginExecution=__esm({"../client/dist/plugins/runtime/pluginExecution.js"(){"use strict";init_pluginRegistry();epoch=randomUUID9(),hostIds=new Map,UUID=/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i}});import{execFile}from"node:child_process";async function stopPluginProcessTree(pid){if(!Number.isSafeInteger(pid)||pid<1)throw new Error("Invalid plugin process group");if(process.platform==="win32")return new Promise((resolve11,reject)=>{execFile("taskkill",["/PID",String(pid),"/T","/F"],{windowsHide:!0,timeout:5e3},error48=>{error48?reject(error48):resolve11()})});try{process.kill(-pid,"SIGKILL")}catch(error48){if(error48.code==="ESRCH")return;throw error48}let deadline=Date.now()+5e3;for(;isProcessGroupAlive(pid);){if(Date.now()>=deadline)throw new Error("Unable to confirm plugin process group stopped");await new Promise(resolve11=>setTimeout(resolve11,20))}}var init_pluginProcessTree=__esm({"../client/dist/plugins/runtime/pluginProcessTree.js"(){"use strict";init_dist()}});import{fork}from"node:child_process";async function executeRegisteredPlugin(plugin,invocation2,context,options={},dependencies={}){let{signal,onProgress,source,access="public",executionTimeoutMs,cancellationGraceMs=1e3,workerPath,cwd,environment,describe:describe3,model,recovery,migration,expectedRecovery,onExecutorStarted,onExecutorStopped,onDiagnostic,...invokeOptions}=options;for(let[name,value]of[["executionTimeoutMs",executionTimeoutMs],["cancellationGraceMs",cancellationGraceMs]])if(value!==void 0&&(!Number.isSafeInteger(value)||value<1||value>2147483647))throw new Error(`${name} must be a positive integer within the timer range`);signal?.throwIfAborted();let registration=dependencies.registration??findPluginRegistration(plugin);if(!registration)throw new PluginError("PLUGIN_NOT_REGISTERED",`插件未注册: ${plugin}`);let identity3=context.invocation??createPluginInvocationIdentity(plugin,source??context.source??"sdk",context.parentInvocation),entryVersion=pluginFileVersion(registration.entry);return new Promise((resolve11,reject)=>{let child=fork(workerPath??PLUGIN_WORKER_PATH,[],{stdio:["ignore","ignore","pipe","ipc"],serialization:"advanced",execArgv:[],detached:process.platform!=="win32",...cwd?{cwd}:{},...environment?{env:environment}:{}}),stderr="",outcome,stopping,cleanupError,treeStopRequested=!1,treeCleanup=Promise.resolve(),exited=!1,graceTimer,deadlineTimer,pendingActions=new Map;child.stderr?.setEncoding("utf8"),child.stderr?.on("data",chunk=>{stderr=`${stderr}${chunk}`.slice(-65536)});let send=message=>{if(!(!child.connected||exited))try{child.send(message,error48=>{error48&&!exited&&stop(error48)})}catch(error48){stop(error48 instanceof Error?error48:new Error(String(error48)))}},kill=()=>{if(!child.pid||exited||treeStopRequested)return;treeStopRequested=!0;let pid=child.pid;treeCleanup=Promise.resolve().then(()=>(dependencies.stopProcessTree??stopPluginProcessTree)(pid)).catch(()=>{cleanupError=Object.assign(new Error("Unable to confirm plugin process-tree cleanup"),{code:"PLUGIN_EXECUTOR_CLEANUP_FAILED",details:{executionStopped:!1}}),child.kill("SIGKILL")})},stop=error48=>{stopping||outcome||exited||(stopping=error48,send({type:"cancel",error:serializePluginExecutionError(error48)}),graceTimer=setTimeout(kill,cancellationGraceMs))},abort=()=>stop(Object.assign(new Error("Plugin execution cancelled"),{code:"PLUGIN_EXECUTION_CANCELLED"}));signal?.addEventListener("abort",abort,{once:!0}),signal?.aborted&&abort(),executionTimeoutMs!==void 0&&(deadlineTimer=setTimeout(()=>stop(Object.assign(new Error("Plugin execution deadline exceeded"),{code:"PLUGIN_EXECUTION_DEADLINE"})),executionTimeoutMs)),child.on("message",raw=>{if(!(exited||!raw||typeof raw!="object")){if(raw.type==="result"||raw.type==="error"){if(!outcome&&!stopping)try{outcome=raw.type==="result"?{value:JSON.parse(raw.json).value}:{error:pluginExecutionError(raw.error)},raw.type==="result"&&pendingActions.size&&(outcome={error:Object.assign(new Error("Plugin returned with pending host calls"),{code:"PLUGIN_PENDING_HOST_CALLS",details:{pendingActions:[...pendingActions.values()]}})})}catch(error48){stop(error48 instanceof Error?error48:new Error(String(error48)))}kill();return}if(!(stopping||outcome))if(raw.type==="diagnostic"&&model)try{onDiagnostic?.(raw.metadata)}catch(error48){stop(error48 instanceof Error?error48:new Error(String(error48)))}else if(raw.type==="progress")try{onProgress?.(raw.progress)}catch(error48){stop(error48 instanceof Error?error48:new Error(String(error48)))}else raw.type==="invoke"&&(pendingActions.set(raw.id,raw.action),Promise.resolve().then(()=>{if(stopping||exited)throw stopping??new Error("Plugin execution ended");let options2={...invokeOptions,...raw.options};return raw.stream?context.invoke(raw.action,raw.payload,options2,progress=>{!stopping&&!outcome&&pendingActions.has(raw.id)&&send({type:"invoke-progress",id:raw.id,progress})}):context.invoke(raw.action,raw.payload,options2)}).then(result=>send({type:"response",id:raw.id,result}),error48=>send({type:"response",id:raw.id,error:serializePluginExecutionError(error48)})).finally(()=>pendingActions.delete(raw.id)))}});let cleanup=()=>{exited=!0,signal?.removeEventListener("abort",abort),graceTimer&&clearTimeout(graceTimer),deadlineTimer&&clearTimeout(deadlineTimer)};child.once("error",error48=>{cleanup(),reject(error48)}),child.once("exit",()=>{kill(),child.stderr?.destroy()}),child.once("close",(code,exitSignal)=>{cleanup(),treeCleanup.then(()=>{if(!cleanupError&&treeStopRequested)try{onExecutorStopped?.()}catch(error48){reject(error48);return}cleanupError?reject(cleanupError):stopping?(Object.assign(stopping,{details:{pendingActions:[...pendingActions.values()],executionStopped:!0}}),reject(stopping)):outcome?.error?reject(outcome.error):outcome?resolve11(outcome.value):reject(Object.assign(new Error(stderr.trim()||`Plugin executor exited (${code??exitSignal})`),{code:"PLUGIN_EXECUTOR_EXITED"}))})});try{child.pid&&onExecutorStarted?.({pid:child.pid,processIdentity:processIdentity(child.pid)}),send({type:"start",plugin,invocation:invocation2,options:invokeOptions,identity:identity3,entry:registration.entry,entryVersion,access,describe:describe3,model,recovery,migration,expectedRecovery,...dependencies.registration?{registration}:{}})}catch(error48){stop(error48 instanceof Error?error48:new Error(String(error48)))}})}var init_pluginExecutor=__esm({"../client/dist/plugins/runtime/pluginExecutor.js"(){"use strict";init_runtimePaths();init_pluginRegistry();init_pluginSource();init_pluginExecution();init_pluginExecutorProtocol();init_pluginProcessTree();init_dist()}});import{randomUUID as randomUUID10}from"node:crypto";import{closeSync as closeSync7,fsyncSync,mkdirSync as mkdirSync7,openSync as openSync7,renameSync as renameSync6,rmSync as rmSync8,writeFileSync as writeFileSync6}from"node:fs";import{dirname as dirname6}from"node:path";function writePluginHostFile(file2,data){mkdirSync7(dirname6(file2),{recursive:!0,mode:448});let temporary=`${file2}.${randomUUID10()}.tmp`,descriptor;try{descriptor=openSync7(temporary,"wx",384),writeFileSync6(descriptor,data),fsyncSync(descriptor),closeSync7(descriptor),descriptor=void 0,renameSync6(temporary,file2)}finally{descriptor!==void 0&&closeSync7(descriptor),rmSync8(temporary,{force:!0})}}var init_pluginHostFiles=__esm({"../client/dist/plugins/runtime/pluginHostFiles.js"(){"use strict"}});import{createHash as createHash7}from"node:crypto";import{closeSync as closeSync8,openSync as openSync8,opendirSync,readFileSync as readFileSync10,readSync as readSync2,readdirSync as readdirSync5,rmSync as rmSync9,statSync as statSync7}from"node:fs";import{join as join14}from"node:path";function pluginTaskExecutionUnconfirmed(record4){let owner=record4.executorOwner;return owner&&(!Number.isSafeInteger(owner.pid)||owner.pid<1)||owner&&isProcessOwnerAlive(owner)||record4.task.error?.details?.executionStopped===!1||process.platform==="win32"&&record4.task.error?.code==="PLUGIN_TASK_HOST_RESTARTED"?!0:owner&&process.platform!=="win32"?isProcessGroupAlive(owner.pid):!1}var PLUGIN_TASK_RESULT_CHUNK_BYTES,MAX_EVENT_BYTES,MAX_RESULT_BYTES,RETENTION_MS,PluginTaskStore,init_pluginTaskStore=__esm({"../client/dist/plugins/runtime/pluginTaskStore.js"(){"use strict";init_plugin_tasks();init_pluginHostFiles();init_pluginHostPaths();init_dist();PLUGIN_TASK_RESULT_CHUNK_BYTES=192*1024,MAX_EVENT_BYTES=512*1024,MAX_RESULT_BYTES=64*1024*1024,RETENTION_MS=10080*60*1e3;PluginTaskStore=class{directory;activeTaskIds;dedupeIndex;dedupeKeys=new Map;constructor(directory=pluginHostPaths().tasks){this.directory=directory}forgetDedupe(taskId){let key=this.dedupeKeys.get(taskId);if(!key)return;let ids=this.dedupeIndex?.get(key);ids?.delete(taskId),ids?.size||this.dedupeIndex?.delete(key),this.dedupeKeys.delete(taskId)}indexDedupe(record4){if(!this.dedupeIndex)return;let{dedupeKey:key,task}=record4,keep=key&&(!key.startsWith("active:")||isPluginTaskActive(task.state));if(keep&&this.dedupeKeys.get(task.taskId)===key||(this.forgetDedupe(task.taskId),!keep))return;let ids=this.dedupeIndex.get(key)??new Set;ids.add(task.taskId),this.dedupeIndex.set(key,ids),this.dedupeKeys.set(task.taskId,key)}findDedupe(key,activeOnly=!1){if(!this.dedupeIndex){this.dedupeIndex=new Map;for(let record4 of this.list())this.indexDedupe(record4)}for(let taskId of this.dedupeIndex.get(key)??[]){let record4;try{record4=this.read(taskId)}catch(error48){if(error48.code!=="PLUGIN_TASK_NOT_FOUND")throw error48;this.forgetDedupe(taskId);continue}if(this.indexDedupe(record4),record4.dedupeKey===key&&(!activeOnly||isPluginTaskActive(record4.task.state)))return record4}}path(taskId,file2){if(!isPluginTaskId(taskId))throw Object.assign(new Error("Invalid plugin task ID"),{code:"PLUGIN_TASK_INVALID_ID"});return join14(this.directory,taskId,file2)}read(taskId){let record4;try{record4=JSON.parse(readFileSync10(this.path(taskId,"task.json"),"utf8"))}catch(error48){throw error48.code==="ENOENT"?Object.assign(new Error("Plugin task was not found"),{code:"PLUGIN_TASK_NOT_FOUND"}):error48}if(record4?.task?.taskId!==taskId||!Array.isArray(record4.events))throw new Error("Invalid persistent plugin task record");return record4}write(record4){writePluginHostFile(this.path(record4.task.taskId,"task.json"),JSON.stringify(record4)),this.indexDedupe(record4),this.indexActive(record4)}indexActive(record4){isPluginTaskActive(record4.task.state)?this.activeTaskIds?.add(record4.task.taskId):this.activeTaskIds?.delete(record4.task.taskId)}listActive(){if(!this.activeTaskIds){this.activeTaskIds=new Set;for(let record4 of this.list())this.indexActive(record4)}let records=[];for(let taskId of this.activeTaskIds)try{let record4=this.read(taskId);this.indexActive(record4),isPluginTaskActive(record4.task.state)&&records.push(record4)}catch(error48){if(error48.code!=="PLUGIN_TASK_NOT_FOUND")throw error48;this.activeTaskIds.delete(taskId)}return records}update(taskId,update,type="state",fields3={}){let record4=this.read(taskId);Object.assign(record4,fields3),record4.task={...record4.task,...update,sequence:record4.task.sequence+1,updatedAt:Date.now()};let event={sequence:record4.task.sequence,time:record4.task.updatedAt,type,state:record4.task.state,...type==="progress"?{progress:record4.task.progress}:{},...type==="checkpoint"?{checkpoint:record4.task.checkpoint}:{}};record4.events.push(event);let bytes=Buffer.byteLength(JSON.stringify(record4.events));for(;record4.events.length>256||bytes>MAX_EVENT_BYTES&&record4.events.length>1;)bytes-=Buffer.byteLength(JSON.stringify(record4.events.shift()))+1;return this.write(record4),record4.task}list(){let names;try{names=readdirSync5(this.directory)}catch(error48){if(error48.code==="ENOENT")return[];throw error48}return names.filter(isPluginTaskId).map(name=>this.read(name))}diagnosticRecords(taskId){let records=[],bytes=0,scanned=0,limited=!1;if(taskId){let size;try{size=statSync7(this.path(taskId,"task.json")).size}catch(error48){if(error48.code==="ENOENT")return{records,limited};throw error48}if(size>16*1024*1024)return{records,limited:!0};records.push(this.read(taskId)),bytes+=size}let directory;try{directory=opendirSync(this.directory)}catch(error48){if(error48.code==="ENOENT")return{records,limited};throw error48}try{let item;for(;(item=directory.readSync())!==null;){if(++scanned>2048){limited=!0;break}if(!(!isPluginTaskId(item.name)||item.name===taskId))try{let size=statSync7(this.path(item.name,"task.json")).size;if(records.length>=512||bytes+size>16*1024*1024){limited=!0;break}bytes+=size,records.push(this.read(item.name))}catch{limited=!0}}}finally{directory.closeSync()}return{records,limited}}events(taskId,cursor){let record4=this.read(taskId);if(!Number.isSafeInteger(cursor)||cursor<0||cursor>record4.task.sequence)throw new Error("Invalid plugin task event cursor");let first=record4.events[0]?.sequence??record4.task.sequence+1,events=[],bytes=0;for(let event of record4.events){if(event.sequence<=cursor)continue;let size=Buffer.byteLength(JSON.stringify(event));if(bytes+size>192*1024&&events.length)break;events.push(event),bytes+=size}return{task:record4.task,events,firstAvailableSequence:first,nextCursor:events.at(-1)?.sequence??cursor,gap:cursor<first-1}}saveResult(taskId,value){let bytes=Buffer.from(JSON.stringify({value}));if(bytes.length>MAX_RESULT_BYTES)throw Object.assign(new Error("Plugin task result exceeds 64 MiB"),{code:"PLUGIN_TASK_RESULT_TOO_LARGE"});return writePluginHostFile(this.path(taskId,"result.json"),bytes),{bytes:bytes.length,sha256:createHash7("sha256").update(bytes).digest("hex"),chunks:Math.ceil(bytes.length/PLUGIN_TASK_RESULT_CHUNK_BYTES)}}resultChunk(taskId,index){let task=this.read(taskId).task;if(task.state!=="success"||!task.result)throw new Error("Plugin task result is not available");if(!Number.isSafeInteger(index)||index<0||index>=task.result.chunks)throw new Error("Invalid plugin task result chunk");let file2=this.path(taskId,"result.json");if(statSync7(file2).size!==task.result.bytes)throw new Error("Plugin task result size does not match its record");let offset=index*PLUGIN_TASK_RESULT_CHUNK_BYTES,buffer=Buffer.alloc(Math.min(PLUGIN_TASK_RESULT_CHUNK_BYTES,task.result.bytes-offset)),descriptor=openSync8(file2,"r");try{if(readSync2(descriptor,buffer,0,buffer.length,offset)!==buffer.length)throw new Error("Plugin task result is incomplete")}finally{closeSync8(descriptor)}return{taskId,index,data:buffer.toString("base64"),...task.result}}recover(epoch2){this.activeTaskIds=new Set;for(let record4 of this.list()){this.indexActive(record4);let{task}=record4;isPluginTaskActive(task.state)&&task.host.epoch!==epoch2?this.update(task.taskId,{state:"interrupted",error:{code:"PLUGIN_TASK_HOST_RESTARTED",message:"The plugin execution service restarted; external operations may need reconciliation"}}):!isPluginTaskActive(task.state)&&Date.now()-task.updatedAt>RETENTION_MS&&!pluginTaskExecutionUnconfirmed(record4)&&(rmSync9(join14(this.directory,task.taskId),{recursive:!0,force:!0}),this.forgetDedupe(task.taskId))}}prune(now=Date.now()){for(let record4 of this.list()){let{task}=record4;!isPluginTaskActive(task.state)&&now-task.updatedAt>RETENTION_MS&&!pluginTaskExecutionUnconfirmed(record4)&&(rmSync9(join14(this.directory,task.taskId),{recursive:!0,force:!0}),this.forgetDedupe(task.taskId))}}}}});import{rmSync as rmSync10}from"node:fs";import{randomUUID as randomUUID11}from"node:crypto";async function cleanupPluginRuntime(){let paths=pluginHostPaths();if(listPluginNames().length)throw new Error("Registered plugins still use the execution service");let lock=`${paths.lease}.start`,starter=readRecord(lock);if(starter&&!isProcessOwnerAlive(starter)?removeRecordIfPid(lock,starter.pid):starter||removeInvalidRecord(lock),!claimRecord(lock,{pid:process.pid,processIdentity:processIdentity(process.pid)}))throw new Error("Plugin execution service is starting; caches were retained");try{let lease=readRecord(paths.lease);if(lease&&isProcessOwnerAlive(lease)){let client2=new PluginTaskClient({autoStart:!1});try{await client2.stopHost()}finally{client2.disconnect()}}let current=readRecord(paths.lease);if(current&&isProcessOwnerAlive(current)||listPluginNames().length)throw new Error("Plugin execution service restarted during cleanup; caches were retained");let store=new PluginTaskStore;if(store.list().some(pluginTaskExecutionUnconfirmed))throw new Error("Plugin execution is not confirmed stopped; task records were retained");if(store.recover(randomUUID11()),store.list().some(pluginTaskExecutionUnconfirmed))throw new Error("Plugin execution is not confirmed stopped; task records were retained");let replacement=readRecord(paths.lease);if(replacement&&isProcessOwnerAlive(replacement)||listPluginNames().length)throw new Error("Plugin execution service restarted during cleanup; caches were retained");for(let file2 of[paths.tasks,paths.revisions,paths.log,`${paths.log}.1`])rmSync10(file2,{recursive:!0,force:!0});current&&removeRecordIfPid(paths.lease,current.pid),process.platform!=="win32"&&rmSync10(paths.socket,{force:!0})}finally{removeRecordIfPid(lock,process.pid)}}var init_pluginRuntimeCleanup=__esm({"../client/dist/plugins/runtime/pluginRuntimeCleanup.js"(){"use strict";init_dist();init_pluginHostPaths();init_pluginRegistry();init_pluginTasks();init_pluginTaskStore()}});var pluginPages_exports={};__export(pluginPages_exports,{PluginPageClient:()=>PluginPageClient});var PluginPageClient,init_pluginPages=__esm({"../client/dist/plugins/clients/pluginPages.js"(){"use strict";init_unified();PluginPageClient=class{connection;client;constructor(configuration={},connection){this.connection=connection,connection||(this.client=new UnifiedClient(configuration))}call(plugin,operation,input2={},options={}){return this.connection?this.connection.request("page.call",{plugin,input:{...input2,operation},options,execution:{cwd:process.cwd(),environment:Object.fromEntries(Object.entries(process.env).filter(entry=>entry[1]!==void 0))}},Math.max(12e4,typeof input2.timeoutSec=="number"&&Number.isFinite(input2.timeoutSec)?(Math.min(300,input2.timeoutSec)+5)*1e3:0)):this.client.invoke("plugin_page",{...input2,plugin,operation},options)}attach(plugin,input2,options={}){return this.call(plugin,"attach",input2,options)}get(plugin,instanceId){return this.call(plugin,"get",{instanceId})}list(plugin){return this.call(plugin,"list")}send(plugin,instanceId,message,options={}){return this.call(plugin,"send",{instanceId,message,...options},options)}detach(plugin,instanceId){return this.call(plugin,"detach",{instanceId})}events(plugin,instanceId,cursor=0,waitMs=0){return this.call(plugin,"events",{instanceId,cursor,waitMs})}disconnect(){this.client?.disconnect()}}}});var pluginState_exports={};__export(pluginState_exports,{PluginStateClient:()=>PluginStateClient});var PluginStateClient,init_pluginState=__esm({"../client/dist/plugins/clients/pluginState.js"(){"use strict";init_pluginHostConnection();PluginStateClient=class{options;connection;constructor(options={}){this.options=options,this.connection=options.connection??new PluginHostConnection(options)}call(plugin,collection,operation,input2={},options={}){return this.connection.request("state.call",{plugin,input:{...input2,collection,operation},options},3e4)}get(plugin,collection,key,input2={}){return this.call(plugin,collection,"get",{...input2,key})}getMany(plugin,collection,keys,input2={}){return this.call(plugin,collection,"get-many",{...input2,keys})}list(plugin,collection,input2={}){return this.call(plugin,collection,"list",input2)}transact(plugin,collection,transaction,input2={}){return this.call(plugin,collection,"transact",{...input2,transaction})}disconnect(){this.options.connection||this.connection.disconnect()}}}});var pluginModels_exports={};__export(pluginModels_exports,{PluginModelClient:()=>PluginModelClient});var PluginModelClient,init_pluginModels=__esm({"../client/dist/plugins/clients/pluginModels.js"(){"use strict";init_pluginTasks();PluginModelClient=class{tasks;constructor(options={}){this.tasks=new PluginTaskClient(options)}capabilities(){return this.tasks.connection.request("model.capabilities")}list(provider="codex"){return this.tasks.connection.request("model.list",{provider},2e4)}async start(plugin,request,options={}){let{cwd=process.cwd(),environment=process.env,executionTimeoutMs,idempotencyKey,...routing}=options;return this.tasks.connection.request("start",{kind:"model",plugin,command:"model",input:{request},cwd,environment:Object.fromEntries(Object.entries(environment).filter(entry=>entry[1]!==void 0)),options:routing,executionTimeoutMs,idempotencyKey})}async run(plugin,request,options={}){let{signal,onProgress,...execution}=options;signal?.throwIfAborted();let started=await this.start(plugin,request,execution),cancel=()=>{this.tasks.cancel(started.taskId).catch(()=>{})};signal?.addEventListener("abort",cancel,{once:!0});try{return signal?.aborted&&cancel(),await this.tasks.wait(started.taskId,{onProgress})}finally{signal?.removeEventListener("abort",cancel)}}disconnect(){this.tasks.disconnect()}}}});var plugin_exports={};__export(plugin_exports,{OFFICIAL_PLUGINS:()=>OFFICIAL_PLUGINS,OFFICIAL_PLUGIN_MANAGER:()=>OFFICIAL_PLUGIN_MANAGER,PluginError:()=>PluginError,PluginModelClient:()=>PluginModelClient,PluginPageClient:()=>PluginPageClient,PluginStateClient:()=>PluginStateClient,PluginTaskClient:()=>PluginTaskClient,assertPluginName:()=>assertPluginName,cleanupPluginRuntime:()=>cleanupPluginRuntime,executeRegisteredPlugin:()=>executeRegisteredPlugin,findOfficialPlugin:()=>findOfficialPlugin,findPluginDirectoryEntry:()=>findPluginDirectoryEntry,findPluginEntry:()=>findPluginEntry,findPluginRegistration:()=>findPluginRegistration,invokePageEvalWithArgs:()=>invokePageEvalWithArgs,invokeRegisteredPlugin:()=>invokeRegisteredPlugin,invokeRegisteredRecoveryPlugin:()=>invokeRegisteredRecoveryPlugin,invokeRegisteredRuntimePlugin:()=>invokeRegisteredRuntimePlugin,invokeRegisteredToolboxPlugin:()=>invokeRegisteredToolboxPlugin,listOfficialPluginNames:()=>listOfficialPluginNames,listPluginNames:()=>listPluginNames,loadPlugin:()=>loadPlugin,loadRegisteredPlugin:()=>loadRegisteredPlugin,pluginDirectory:()=>pluginDirectory,readPluginPageBundleChunk:()=>readPluginPageBundleChunk,refreshRegisteredPlugin:()=>refreshRegisteredPlugin,registerPlugin:()=>registerPlugin,resolvePluginEntry:()=>resolvePluginEntry,unregisterPlugin:()=>unregisterPlugin});import{readFileSync as readFileSync11}from"node:fs";import{dirname as dirname7,extname as extname2,resolve as resolve5}from"node:path";import{pathToFileURL}from"node:url";function readPluginVersion(entry){try{let manifest=skillManifestPath(resolve5(dirname7(entry),".."));return manifest?readFileSync11(manifest,"utf8").match(/^---\r?\n([\s\S]*?)\r?\n---/)?.[1]?.split(/\r?\n/).find(line=>/^version:\s*/.test(line))?.match(/^version:\s*["']?([^"'#\s]+)["']?\s*$/)?.[1]:void 0}catch{return}}function isObject2(value){return value!==null&&typeof value=="object"&&!Array.isArray(value)}function isPluginInvocation(value){return isObject2(value)&&typeof value.command=="string"&&isObject2(value.input)}function normalizePluginProgress(progress){if(typeof progress=="string"){if(!progress)throw new Error("app.progress 需要非空消息");return progress}if(!isObject2(progress)||typeof progress.message!="string"||!progress.message)throw new Error("app.progress 需要非空消息");if(progress.data!==void 0&&!isObject2(progress.data))throw new Error("app.progress data 必须是对象");let data;if(progress.data)try{let serialized=JSON.stringify(progress.data),parsed=serialized===void 0?void 0:JSON.parse(serialized);if(!isObject2(parsed))throw new Error("invalid object");data=Object.freeze(parsed)}catch{throw new Error("app.progress data 必须是可 JSON 序列化的对象")}return Object.freeze({message:progress.message,...data?{data}:{}})}function missingPluginEntryMessage(entry,pluginName){let name=pluginName??"<name>";return["插件入口已失效","",`插件:${name}`,`入口:${entry}`,"",`卸载命令:npx @mearl/setup plugin uninstall ${name}`].join(`
978
+ `}});import{randomUUID as randomUUID9}from"node:crypto";import{linkSync as linkSync2,mkdirSync as mkdirSync6,readFileSync as readFileSync9,rmSync as rmSync7,writeFileSync as writeFileSync5}from"node:fs";import{join as join13}from"node:path";function localPluginExecutionHost(){let directory=pluginDirectory(),hostId=hostIds.get(directory);if(!hostId){mkdirSync6(directory,{recursive:!0,mode:448});let file2=join13(directory,".execution-host-id"),proposed=randomUUID9(),temporary=`${file2}.${proposed}.tmp`;try{writeFileSync5(temporary,proposed,{flag:"wx",mode:384}),linkSync2(temporary,file2)}catch(error48){if(error48.code!=="EEXIST")throw error48}finally{rmSync7(temporary,{force:!0})}if(hostId=readFileSync9(file2,"utf8").trim(),!UUID.test(hostId))throw new Error("Invalid plugin execution host identity");hostIds.set(directory,hostId)}return Object.freeze({hostId,epoch})}function createPluginInvocationIdentity(plugin,source,parent){return Object.freeze({invocationId:randomUUID9(),host:parent?.host??localPluginExecutionHost(),plugin,source,...parent?{parentInvocationId:parent.invocationId}:{}})}var epoch,hostIds,UUID,init_pluginExecution=__esm({"../client/dist/plugins/runtime/pluginExecution.js"(){"use strict";init_pluginRegistry();epoch=randomUUID9(),hostIds=new Map,UUID=/^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i}});import{execFile}from"node:child_process";async function stopPluginProcessTree(pid){if(!Number.isSafeInteger(pid)||pid<1)throw new Error("Invalid plugin process group");if(process.platform==="win32")return new Promise((resolve11,reject)=>{execFile("taskkill",["/PID",String(pid),"/T","/F"],{windowsHide:!0,timeout:5e3},error48=>{error48?reject(error48):resolve11()})});try{process.kill(-pid,"SIGKILL")}catch(error48){if(error48.code==="ESRCH")return;throw error48}let deadline=Date.now()+5e3;for(;isProcessGroupAlive(pid);){if(Date.now()>=deadline)throw new Error("Unable to confirm plugin process group stopped");await new Promise(resolve11=>setTimeout(resolve11,20))}}var init_pluginProcessTree=__esm({"../client/dist/plugins/runtime/pluginProcessTree.js"(){"use strict";init_dist()}});import{fork}from"node:child_process";async function executeRegisteredPlugin(plugin,invocation2,context,options={},dependencies={}){let{signal,onProgress,source,access="public",executionTimeoutMs,cancellationGraceMs=1e3,workerPath,cwd,environment,describe:describe3,help,onOutput,model,recovery,migration,expectedRecovery,onExecutorStarted,onExecutorStopped,onDiagnostic,...invokeOptions}=options;for(let[name,value]of[["executionTimeoutMs",executionTimeoutMs],["cancellationGraceMs",cancellationGraceMs]])if(value!==void 0&&(!Number.isSafeInteger(value)||value<1||value>2147483647))throw new Error(`${name} must be a positive integer within the timer range`);signal?.throwIfAborted();let registration=dependencies.registration??findPluginRegistration(plugin);if(!registration)throw new PluginError("PLUGIN_NOT_REGISTERED",`插件未注册: ${plugin}`);let identity3=context.invocation??createPluginInvocationIdentity(plugin,source??context.source??"sdk",context.parentInvocation),entryVersion=pluginFileVersion(registration.entry);return new Promise((resolve11,reject)=>{let child=fork(workerPath??PLUGIN_WORKER_PATH,[],{stdio:["ignore",onOutput?"pipe":"ignore","pipe","ipc"],serialization:"advanced",execArgv:[],detached:process.platform!=="win32",...cwd?{cwd}:{},...environment?{env:environment}:{}}),stderr="",outcome,stopping,cleanupError,treeStopRequested=!1,treeCleanup=Promise.resolve(),exited=!1,graceTimer,deadlineTimer,pendingActions=new Map;if(child.stderr?.setEncoding("utf8"),child.stderr?.on("data",chunk=>{stderr=`${stderr}${chunk}`.slice(-65536)}),onOutput)for(let stream of["stdout","stderr"])child[stream]?.on("data",chunk=>{try{onOutput(stream,Buffer.isBuffer(chunk)?chunk:Buffer.from(chunk))}catch(error48){stop(error48 instanceof Error?error48:new Error(String(error48)))}});let send=message=>{if(!(!child.connected||exited))try{child.send(message,error48=>{error48&&!exited&&stop(error48)})}catch(error48){stop(error48 instanceof Error?error48:new Error(String(error48)))}},kill=()=>{if(!child.pid||exited||treeStopRequested)return;treeStopRequested=!0;let pid=child.pid;treeCleanup=Promise.resolve().then(()=>(dependencies.stopProcessTree??stopPluginProcessTree)(pid)).catch(()=>{cleanupError=Object.assign(new Error("Unable to confirm plugin process-tree cleanup"),{code:"PLUGIN_EXECUTOR_CLEANUP_FAILED",details:{executionStopped:!1}}),child.kill("SIGKILL")})},stop=error48=>{stopping||outcome||exited||(stopping=error48,send({type:"cancel",error:serializePluginExecutionError(error48)}),graceTimer=setTimeout(kill,cancellationGraceMs))},abort=()=>stop(Object.assign(new Error("Plugin execution cancelled"),{code:"PLUGIN_EXECUTION_CANCELLED"}));signal?.addEventListener("abort",abort,{once:!0}),signal?.aborted&&abort(),executionTimeoutMs!==void 0&&(deadlineTimer=setTimeout(()=>stop(Object.assign(new Error("Plugin execution deadline exceeded"),{code:"PLUGIN_EXECUTION_DEADLINE"})),executionTimeoutMs)),child.on("message",raw=>{if(!(exited||!raw||typeof raw!="object")){if(raw.type==="result"||raw.type==="error"){if(!outcome&&!stopping)try{outcome=raw.type==="result"?{value:JSON.parse(raw.json).value}:{error:pluginExecutionError(raw.error)},raw.type==="result"&&pendingActions.size&&(outcome={error:Object.assign(new Error("Plugin returned with pending host calls"),{code:"PLUGIN_PENDING_HOST_CALLS",details:{pendingActions:[...pendingActions.values()]}})})}catch(error48){stop(error48 instanceof Error?error48:new Error(String(error48)))}kill();return}if(!(stopping||outcome))if(raw.type==="diagnostic"&&model)try{onDiagnostic?.(raw.metadata)}catch(error48){stop(error48 instanceof Error?error48:new Error(String(error48)))}else if(raw.type==="progress")try{onProgress?.(raw.progress)}catch(error48){stop(error48 instanceof Error?error48:new Error(String(error48)))}else raw.type==="invoke"&&(pendingActions.set(raw.id,raw.action),Promise.resolve().then(()=>{if(stopping||exited)throw stopping??new Error("Plugin execution ended");let options2={...invokeOptions,...raw.options};return raw.stream?context.invoke(raw.action,raw.payload,options2,progress=>{!stopping&&!outcome&&pendingActions.has(raw.id)&&send({type:"invoke-progress",id:raw.id,progress})}):context.invoke(raw.action,raw.payload,options2)}).then(result=>send({type:"response",id:raw.id,result}),error48=>send({type:"response",id:raw.id,error:serializePluginExecutionError(error48)})).finally(()=>pendingActions.delete(raw.id)))}});let cleanup=()=>{exited=!0,signal?.removeEventListener("abort",abort),graceTimer&&clearTimeout(graceTimer),deadlineTimer&&clearTimeout(deadlineTimer)};child.once("error",error48=>{cleanup(),reject(error48)}),child.once("exit",()=>{kill(),child.stderr?.destroy()}),child.once("close",(code,exitSignal)=>{cleanup(),treeCleanup.then(()=>{if(!cleanupError&&treeStopRequested)try{onExecutorStopped?.()}catch(error48){reject(error48);return}cleanupError?reject(cleanupError):stopping?(Object.assign(stopping,{details:{pendingActions:[...pendingActions.values()],executionStopped:!0}}),reject(stopping)):outcome?.error?reject(outcome.error):outcome?resolve11(outcome.value):reject(Object.assign(new Error(stderr.trim()||`Plugin executor exited (${code??exitSignal})`),{code:"PLUGIN_EXECUTOR_EXITED"}))})});try{child.pid&&onExecutorStarted?.({pid:child.pid,processIdentity:processIdentity(child.pid)}),send({type:"start",plugin,invocation:invocation2,options:invokeOptions,identity:identity3,entry:registration.entry,entryVersion,access,describe:describe3,help,model,recovery,migration,expectedRecovery,...dependencies.registration?{registration}:{}})}catch(error48){stop(error48 instanceof Error?error48:new Error(String(error48)))}})}var init_pluginExecutor=__esm({"../client/dist/plugins/runtime/pluginExecutor.js"(){"use strict";init_runtimePaths();init_pluginRegistry();init_pluginSource();init_pluginExecution();init_pluginExecutorProtocol();init_pluginProcessTree();init_dist()}});import{randomUUID as randomUUID10}from"node:crypto";import{closeSync as closeSync7,fsyncSync,mkdirSync as mkdirSync7,openSync as openSync7,renameSync as renameSync6,rmSync as rmSync8,writeFileSync as writeFileSync6}from"node:fs";import{dirname as dirname6}from"node:path";function writePluginHostFile(file2,data){mkdirSync7(dirname6(file2),{recursive:!0,mode:448});let temporary=`${file2}.${randomUUID10()}.tmp`,descriptor;try{descriptor=openSync7(temporary,"wx",384),writeFileSync6(descriptor,data),fsyncSync(descriptor),closeSync7(descriptor),descriptor=void 0,renameSync6(temporary,file2)}finally{descriptor!==void 0&&closeSync7(descriptor),rmSync8(temporary,{force:!0})}}var init_pluginHostFiles=__esm({"../client/dist/plugins/runtime/pluginHostFiles.js"(){"use strict"}});import{createHash as createHash7}from"node:crypto";import{closeSync as closeSync8,openSync as openSync8,opendirSync,readFileSync as readFileSync10,readSync as readSync2,readdirSync as readdirSync5,rmSync as rmSync9,statSync as statSync7}from"node:fs";import{join as join14}from"node:path";function pluginTaskExecutionUnconfirmed(record4){let owner=record4.executorOwner;return owner&&(!Number.isSafeInteger(owner.pid)||owner.pid<1)||owner&&isProcessOwnerAlive(owner)||record4.task.error?.details?.executionStopped===!1||process.platform==="win32"&&record4.task.error?.code==="PLUGIN_TASK_HOST_RESTARTED"?!0:owner&&process.platform!=="win32"?isProcessGroupAlive(owner.pid):!1}var PLUGIN_TASK_RESULT_CHUNK_BYTES,MAX_EVENT_BYTES,MAX_RESULT_BYTES,RETENTION_MS,PluginTaskStore,init_pluginTaskStore=__esm({"../client/dist/plugins/runtime/pluginTaskStore.js"(){"use strict";init_plugin_tasks();init_pluginHostFiles();init_pluginHostPaths();init_dist();PLUGIN_TASK_RESULT_CHUNK_BYTES=192*1024,MAX_EVENT_BYTES=512*1024,MAX_RESULT_BYTES=64*1024*1024,RETENTION_MS=10080*60*1e3;PluginTaskStore=class{directory;activeTaskIds;dedupeIndex;dedupeKeys=new Map;constructor(directory=pluginHostPaths().tasks){this.directory=directory}forgetDedupe(taskId){let key=this.dedupeKeys.get(taskId);if(!key)return;let ids=this.dedupeIndex?.get(key);ids?.delete(taskId),ids?.size||this.dedupeIndex?.delete(key),this.dedupeKeys.delete(taskId)}indexDedupe(record4){if(!this.dedupeIndex)return;let{dedupeKey:key,task}=record4,keep=key&&(!key.startsWith("active:")||isPluginTaskActive(task.state));if(keep&&this.dedupeKeys.get(task.taskId)===key||(this.forgetDedupe(task.taskId),!keep))return;let ids=this.dedupeIndex.get(key)??new Set;ids.add(task.taskId),this.dedupeIndex.set(key,ids),this.dedupeKeys.set(task.taskId,key)}findDedupe(key,activeOnly=!1){if(!this.dedupeIndex){this.dedupeIndex=new Map;for(let record4 of this.list())this.indexDedupe(record4)}for(let taskId of this.dedupeIndex.get(key)??[]){let record4;try{record4=this.read(taskId)}catch(error48){if(error48.code!=="PLUGIN_TASK_NOT_FOUND")throw error48;this.forgetDedupe(taskId);continue}if(this.indexDedupe(record4),record4.dedupeKey===key&&(!activeOnly||isPluginTaskActive(record4.task.state)))return record4}}path(taskId,file2){if(!isPluginTaskId(taskId))throw Object.assign(new Error("Invalid plugin task ID"),{code:"PLUGIN_TASK_INVALID_ID"});return join14(this.directory,taskId,file2)}read(taskId){let record4;try{record4=JSON.parse(readFileSync10(this.path(taskId,"task.json"),"utf8"))}catch(error48){throw error48.code==="ENOENT"?Object.assign(new Error("Plugin task was not found"),{code:"PLUGIN_TASK_NOT_FOUND"}):error48}if(record4?.task?.taskId!==taskId||!Array.isArray(record4.events))throw new Error("Invalid persistent plugin task record");return record4}write(record4){writePluginHostFile(this.path(record4.task.taskId,"task.json"),JSON.stringify(record4)),this.indexDedupe(record4),this.indexActive(record4)}indexActive(record4){isPluginTaskActive(record4.task.state)?this.activeTaskIds?.add(record4.task.taskId):this.activeTaskIds?.delete(record4.task.taskId)}listActive(){if(!this.activeTaskIds){this.activeTaskIds=new Set;for(let record4 of this.list())this.indexActive(record4)}let records=[];for(let taskId of this.activeTaskIds)try{let record4=this.read(taskId);this.indexActive(record4),isPluginTaskActive(record4.task.state)&&records.push(record4)}catch(error48){if(error48.code!=="PLUGIN_TASK_NOT_FOUND")throw error48;this.activeTaskIds.delete(taskId)}return records}update(taskId,update,type="state",fields3={}){let record4=this.read(taskId);Object.assign(record4,fields3),record4.task={...record4.task,...update,sequence:record4.task.sequence+1,updatedAt:Date.now()};let event={sequence:record4.task.sequence,time:record4.task.updatedAt,type,state:record4.task.state,...type==="progress"?{progress:record4.task.progress}:{},...type==="checkpoint"?{checkpoint:record4.task.checkpoint}:{}};record4.events.push(event);let bytes=Buffer.byteLength(JSON.stringify(record4.events));for(;record4.events.length>256||bytes>MAX_EVENT_BYTES&&record4.events.length>1;)bytes-=Buffer.byteLength(JSON.stringify(record4.events.shift()))+1;return this.write(record4),record4.task}list(){let names;try{names=readdirSync5(this.directory)}catch(error48){if(error48.code==="ENOENT")return[];throw error48}return names.filter(isPluginTaskId).map(name=>this.read(name))}diagnosticRecords(taskId){let records=[],bytes=0,scanned=0,limited=!1;if(taskId){let size;try{size=statSync7(this.path(taskId,"task.json")).size}catch(error48){if(error48.code==="ENOENT")return{records,limited};throw error48}if(size>16*1024*1024)return{records,limited:!0};records.push(this.read(taskId)),bytes+=size}let directory;try{directory=opendirSync(this.directory)}catch(error48){if(error48.code==="ENOENT")return{records,limited};throw error48}try{let item;for(;(item=directory.readSync())!==null;){if(++scanned>2048){limited=!0;break}if(!(!isPluginTaskId(item.name)||item.name===taskId))try{let size=statSync7(this.path(item.name,"task.json")).size;if(records.length>=512||bytes+size>16*1024*1024){limited=!0;break}bytes+=size,records.push(this.read(item.name))}catch{limited=!0}}}finally{directory.closeSync()}return{records,limited}}events(taskId,cursor){let record4=this.read(taskId);if(!Number.isSafeInteger(cursor)||cursor<0||cursor>record4.task.sequence)throw new Error("Invalid plugin task event cursor");let first=record4.events[0]?.sequence??record4.task.sequence+1,events=[],bytes=0;for(let event of record4.events){if(event.sequence<=cursor)continue;let size=Buffer.byteLength(JSON.stringify(event));if(bytes+size>192*1024&&events.length)break;events.push(event),bytes+=size}return{task:record4.task,events,firstAvailableSequence:first,nextCursor:events.at(-1)?.sequence??cursor,gap:cursor<first-1}}saveResult(taskId,value){let bytes=Buffer.from(JSON.stringify({value}));if(bytes.length>MAX_RESULT_BYTES)throw Object.assign(new Error("Plugin task result exceeds 64 MiB"),{code:"PLUGIN_TASK_RESULT_TOO_LARGE"});return writePluginHostFile(this.path(taskId,"result.json"),bytes),{bytes:bytes.length,sha256:createHash7("sha256").update(bytes).digest("hex"),chunks:Math.ceil(bytes.length/PLUGIN_TASK_RESULT_CHUNK_BYTES)}}resultChunk(taskId,index){let task=this.read(taskId).task;if(task.state!=="success"||!task.result)throw new Error("Plugin task result is not available");if(!Number.isSafeInteger(index)||index<0||index>=task.result.chunks)throw new Error("Invalid plugin task result chunk");let file2=this.path(taskId,"result.json");if(statSync7(file2).size!==task.result.bytes)throw new Error("Plugin task result size does not match its record");let offset=index*PLUGIN_TASK_RESULT_CHUNK_BYTES,buffer=Buffer.alloc(Math.min(PLUGIN_TASK_RESULT_CHUNK_BYTES,task.result.bytes-offset)),descriptor=openSync8(file2,"r");try{if(readSync2(descriptor,buffer,0,buffer.length,offset)!==buffer.length)throw new Error("Plugin task result is incomplete")}finally{closeSync8(descriptor)}return{taskId,index,data:buffer.toString("base64"),...task.result}}recover(epoch2){this.activeTaskIds=new Set;for(let record4 of this.list()){this.indexActive(record4);let{task}=record4;isPluginTaskActive(task.state)&&task.host.epoch!==epoch2?this.update(task.taskId,{state:"interrupted",error:{code:"PLUGIN_TASK_HOST_RESTARTED",message:"The plugin execution service restarted; external operations may need reconciliation"}}):!isPluginTaskActive(task.state)&&Date.now()-task.updatedAt>RETENTION_MS&&!pluginTaskExecutionUnconfirmed(record4)&&(rmSync9(join14(this.directory,task.taskId),{recursive:!0,force:!0}),this.forgetDedupe(task.taskId))}}prune(now=Date.now()){for(let record4 of this.list()){let{task}=record4;!isPluginTaskActive(task.state)&&now-task.updatedAt>RETENTION_MS&&!pluginTaskExecutionUnconfirmed(record4)&&(rmSync9(join14(this.directory,task.taskId),{recursive:!0,force:!0}),this.forgetDedupe(task.taskId))}}}}});import{rmSync as rmSync10}from"node:fs";import{randomUUID as randomUUID11}from"node:crypto";async function cleanupPluginRuntime(){let paths=pluginHostPaths();if(listPluginNames().length)throw new Error("Registered plugins still use the execution service");let lock=`${paths.lease}.start`,starter=readRecord(lock);if(starter&&!isProcessOwnerAlive(starter)?removeRecordIfPid(lock,starter.pid):starter||removeInvalidRecord(lock),!claimRecord(lock,{pid:process.pid,processIdentity:processIdentity(process.pid)}))throw new Error("Plugin execution service is starting; caches were retained");try{let lease=readRecord(paths.lease);if(lease&&isProcessOwnerAlive(lease)){let client2=new PluginTaskClient({autoStart:!1});try{await client2.stopHost()}finally{client2.disconnect()}}let current=readRecord(paths.lease);if(current&&isProcessOwnerAlive(current)||listPluginNames().length)throw new Error("Plugin execution service restarted during cleanup; caches were retained");let store=new PluginTaskStore;if(store.list().some(pluginTaskExecutionUnconfirmed))throw new Error("Plugin execution is not confirmed stopped; task records were retained");if(store.recover(randomUUID11()),store.list().some(pluginTaskExecutionUnconfirmed))throw new Error("Plugin execution is not confirmed stopped; task records were retained");let replacement=readRecord(paths.lease);if(replacement&&isProcessOwnerAlive(replacement)||listPluginNames().length)throw new Error("Plugin execution service restarted during cleanup; caches were retained");for(let file2 of[paths.tasks,paths.revisions,paths.log,`${paths.log}.1`])rmSync10(file2,{recursive:!0,force:!0});current&&removeRecordIfPid(paths.lease,current.pid),process.platform!=="win32"&&rmSync10(paths.socket,{force:!0})}finally{removeRecordIfPid(lock,process.pid)}}var init_pluginRuntimeCleanup=__esm({"../client/dist/plugins/runtime/pluginRuntimeCleanup.js"(){"use strict";init_dist();init_pluginHostPaths();init_pluginRegistry();init_pluginTasks();init_pluginTaskStore()}});var pluginPages_exports={};__export(pluginPages_exports,{PluginPageClient:()=>PluginPageClient});var PluginPageClient,init_pluginPages=__esm({"../client/dist/plugins/clients/pluginPages.js"(){"use strict";init_unified();PluginPageClient=class{connection;client;constructor(configuration={},connection){this.connection=connection,connection||(this.client=new UnifiedClient(configuration))}call(plugin,operation,input2={},options={}){return this.connection?this.connection.request("page.call",{plugin,input:{...input2,operation},options,execution:{cwd:process.cwd(),environment:Object.fromEntries(Object.entries(process.env).filter(entry=>entry[1]!==void 0))}},Math.max(12e4,typeof input2.timeoutSec=="number"&&Number.isFinite(input2.timeoutSec)?(Math.min(300,input2.timeoutSec)+5)*1e3:0)):this.client.invoke("plugin_page",{...input2,plugin,operation},options)}attach(plugin,input2,options={}){return this.call(plugin,"attach",input2,options)}get(plugin,instanceId){return this.call(plugin,"get",{instanceId})}list(plugin){return this.call(plugin,"list")}send(plugin,instanceId,message,options={}){return this.call(plugin,"send",{instanceId,message,...options},options)}detach(plugin,instanceId){return this.call(plugin,"detach",{instanceId})}events(plugin,instanceId,cursor=0,waitMs=0){return this.call(plugin,"events",{instanceId,cursor,waitMs})}disconnect(){this.client?.disconnect()}}}});var pluginState_exports={};__export(pluginState_exports,{PluginStateClient:()=>PluginStateClient});var PluginStateClient,init_pluginState=__esm({"../client/dist/plugins/clients/pluginState.js"(){"use strict";init_pluginHostConnection();PluginStateClient=class{options;connection;constructor(options={}){this.options=options,this.connection=options.connection??new PluginHostConnection(options)}call(plugin,collection,operation,input2={},options={}){return this.connection.request("state.call",{plugin,input:{...input2,collection,operation},options},3e4)}get(plugin,collection,key,input2={}){return this.call(plugin,collection,"get",{...input2,key})}getMany(plugin,collection,keys,input2={}){return this.call(plugin,collection,"get-many",{...input2,keys})}list(plugin,collection,input2={}){return this.call(plugin,collection,"list",input2)}transact(plugin,collection,transaction,input2={}){return this.call(plugin,collection,"transact",{...input2,transaction})}disconnect(){this.options.connection||this.connection.disconnect()}}}});var pluginModels_exports={};__export(pluginModels_exports,{PluginModelClient:()=>PluginModelClient});var PluginModelClient,init_pluginModels=__esm({"../client/dist/plugins/clients/pluginModels.js"(){"use strict";init_pluginTasks();PluginModelClient=class{tasks;constructor(options={}){this.tasks=new PluginTaskClient(options)}capabilities(){return this.tasks.connection.request("model.capabilities")}list(provider="codex"){return this.tasks.connection.request("model.list",{provider},2e4)}async start(plugin,request,options={}){let{cwd=process.cwd(),environment=process.env,executionTimeoutMs,idempotencyKey,...routing}=options;return this.tasks.connection.request("start",{kind:"model",plugin,command:"model",input:{request},cwd,environment:Object.fromEntries(Object.entries(environment).filter(entry=>entry[1]!==void 0)),options:routing,executionTimeoutMs,idempotencyKey})}async run(plugin,request,options={}){let{signal,onProgress,...execution}=options;signal?.throwIfAborted();let started=await this.start(plugin,request,execution),cancel=()=>{this.tasks.cancel(started.taskId).catch(()=>{})};signal?.addEventListener("abort",cancel,{once:!0});try{return signal?.aborted&&cancel(),await this.tasks.wait(started.taskId,{onProgress})}finally{signal?.removeEventListener("abort",cancel)}}disconnect(){this.tasks.disconnect()}}}});var plugin_exports={};__export(plugin_exports,{OFFICIAL_PLUGINS:()=>OFFICIAL_PLUGINS,OFFICIAL_PLUGIN_MANAGER:()=>OFFICIAL_PLUGIN_MANAGER,PluginError:()=>PluginError,PluginModelClient:()=>PluginModelClient,PluginPageClient:()=>PluginPageClient,PluginStateClient:()=>PluginStateClient,PluginTaskClient:()=>PluginTaskClient,assertPluginName:()=>assertPluginName,cleanupPluginRuntime:()=>cleanupPluginRuntime,executeRegisteredPlugin:()=>executeRegisteredPlugin,findOfficialPlugin:()=>findOfficialPlugin,findPluginDirectoryEntry:()=>findPluginDirectoryEntry,findPluginEntry:()=>findPluginEntry,findPluginRegistration:()=>findPluginRegistration,invokePageEvalWithArgs:()=>invokePageEvalWithArgs,invokeRegisteredPlugin:()=>invokeRegisteredPlugin,invokeRegisteredRecoveryPlugin:()=>invokeRegisteredRecoveryPlugin,invokeRegisteredRuntimePlugin:()=>invokeRegisteredRuntimePlugin,invokeRegisteredToolboxPlugin:()=>invokeRegisteredToolboxPlugin,listOfficialPluginNames:()=>listOfficialPluginNames,listPluginNames:()=>listPluginNames,loadPlugin:()=>loadPlugin,loadRegisteredPlugin:()=>loadRegisteredPlugin,pluginDirectory:()=>pluginDirectory,readPluginPageBundleChunk:()=>readPluginPageBundleChunk,refreshRegisteredPlugin:()=>refreshRegisteredPlugin,registerPlugin:()=>registerPlugin,resolvePluginEntry:()=>resolvePluginEntry,unregisterPlugin:()=>unregisterPlugin});import{readFileSync as readFileSync11}from"node:fs";import{dirname as dirname7,extname as extname2,resolve as resolve5}from"node:path";import{pathToFileURL}from"node:url";function readPluginVersion(entry){try{let manifest=skillManifestPath(resolve5(dirname7(entry),".."));return manifest?readFileSync11(manifest,"utf8").match(/^---\r?\n([\s\S]*?)\r?\n---/)?.[1]?.split(/\r?\n/).find(line=>/^version:\s*/.test(line))?.match(/^version:\s*["']?([^"'#\s]+)["']?\s*$/)?.[1]:void 0}catch{return}}function isObject2(value){return value!==null&&typeof value=="object"&&!Array.isArray(value)}function isPluginInvocation(value){return isObject2(value)&&typeof value.command=="string"&&isObject2(value.input)}function normalizePluginProgress(progress){if(typeof progress=="string"){if(!progress)throw new Error("app.progress 需要非空消息");return progress}if(!isObject2(progress)||typeof progress.message!="string"||!progress.message)throw new Error("app.progress 需要非空消息");if(progress.data!==void 0&&!isObject2(progress.data))throw new Error("app.progress data 必须是对象");let data;if(progress.data)try{let serialized=JSON.stringify(progress.data),parsed=serialized===void 0?void 0:JSON.parse(serialized);if(!isObject2(parsed))throw new Error("invalid object");data=Object.freeze(parsed)}catch{throw new Error("app.progress data 必须是可 JSON 序列化的对象")}return Object.freeze({message:progress.message,...data?{data}:{}})}function missingPluginEntryMessage(entry,pluginName){let name=pluginName??"<name>";return["插件入口已失效","",`插件:${name}`,`入口:${entry}`,"",`卸载命令:npx @mearl/setup plugin uninstall ${name}`].join(`
979
979
  `)}async function refreshRegisteredPlugin(name,includePage=!1){let key=`${pluginDirectory()}/${name}`,pending=registrationRefreshes.get(key);if(pending)return await pending,refreshRegisteredPlugin(name,includePage);let registration=findPluginRegistration(name);if(!registration)return;let entryChanged=pluginRegistrationNeedsRefresh(registration);if(!entryChanged&&(!includePage||!pluginRegistrationNeedsRefresh(registration,!0)))return registration;let refresh=(async()=>{let entryVersion=pluginFileVersion(registration.entry),loaded=entryChanged?await loadPlugin(registration.entry,{options:{},invoke:async()=>{throw new Error("注册时不能执行浏览器操作")},progress:()=>{throw new Error("注册时不能报告执行进度")}},name):registration,current=findPluginRegistration(name);if(JSON.stringify(current)!==JSON.stringify(registration))return current;if(pluginFileVersion(registration.entry)!==entryVersion)throw new PluginError("PLUGIN_SOURCE_CHANGED",`插件更新进行中,请重新打开工具: ${name}`);return registerPlugin(name,registration.entry,loaded.description,{hasPublicCommands:"commandHelp"in loaded?!!loaded.commandHelp(name):loaded.hasPublicCommands,toolbox:loaded.toolbox,appProfiles:loaded.appProfiles,profileSources:"profileSources"in loaded?loaded.profileSources:loaded.source?.profiles,...registration.managedBy?{managedBy:registration.managedBy}:{}}),findPluginRegistration(name)})();registrationRefreshes.set(key,refresh);try{return await refresh}finally{registrationRefreshes.delete(key)}}async function loadPlugin(entry,context,pluginName){let entryVersion;try{entryVersion=pluginFileVersion(entry)}catch{throw new PluginError("PLUGIN_ENTRY_MISSING",missingPluginEntryMessage(entry,pluginName))}let commands=new Map,recoveries=new Map,migrations=new Map,executing=!1,checkpointDeclaration,invocationGeneration=0,registering=!0,name,description,toolbox,pageRuntime,stateStorage,taskRecovery,appProfiles,profileSources,registerCommand=(signature,handler,description2="",examples=[],toolboxOnly=!1,runtimeOnly=!1)=>{if(!registering)throw new Error("命令只能在入口注册阶段声明");let[name2,...args]=signature.trim().split(/\s+/);if(!/^[a-z][a-z0-9-]*$/.test(name2)||commands.has(name2)||typeof handler!="function"||!Array.isArray(examples)||examples.some(example=>typeof example!="string"||!example.trim()))throw new Error(`无效或重复的命令: ${signature}`);let command=new Command(name2).description(description2);for(let argument of args){if(!/^(?:<[a-zA-Z][\w-]*(?:\.\.\.)?>|\[[a-zA-Z][\w-]*(?:\.\.\.)?\])$/.test(argument))throw new Error(`无效的位置参数: ${argument}`);command.argument(argument)}let names=command.registeredArguments.map(argument=>argument.name());if(new Set(names).size!==names.length)throw new Error(`参数名称重复: ${signature}`);commands.set(name2,{command,signature,handler,examples:[...examples],toolboxOnly,runtimeOnly})},app=Object.freeze({options:Object.freeze({...context.options}),command:(signature,handler,description2="",examples=[])=>registerCommand(signature,handler,description2,examples),runtimeCommand:(signature,handler,description2="",examples=[])=>registerCommand(signature,handler,description2,examples,!1,!0),recoveryCommand(command,handler){if(!registering||!/^[a-z][a-z0-9-]*$/.test(command)||typeof handler!="function"||recoveries.has(command))throw new Error("Invalid or duplicate recovery command");recoveries.set(command,handler)},checkpointMigration(command,handler){if(!registering||!/^[a-z][a-z0-9-]*$/.test(command)||typeof handler!="function"||migrations.has(command))throw new Error("Invalid or duplicate checkpoint migration");migrations.set(command,(input2,commandContext)=>handler(input2,commandContext))},checkpoint(data,expectedSequence){if(!executing||!context.invocation?.taskId)throw new PluginError("PLUGIN_TASK_REQUIRED","Checkpoints require a managed task");return context.signal?.throwIfAborted(),context.invoke("plugin_task_checkpoint",{plugin:pluginName??name,data,expectedSequence,expectedDeclaration:checkpointDeclaration})},state(collection,operation,input2={}){if(!executing)throw new Error("app.state is only available during command execution");if(context.signal?.throwIfAborted(),!stateStorage||!Object.hasOwn(stateStorage.collections,collection))throw new PluginError("PLUGIN_STATE_NOT_DECLARED","Plugin state collection is not declared");return context.invoke("plugin_state",{...input2,plugin:pluginName??name,collection,operation,expectedDeclaration:pluginStateSignature(stateStorage.collections[collection])})},model(request,options={}){if(!executing)throw new Error("app.model is only available during command execution");context.signal?.throwIfAborted();let generation=invocationGeneration,observing=()=>executing&&generation===invocationGeneration&&!context.signal?.aborted;if(context.runModel)return context.runModel(pluginName??name,request,{signal:context.signal,onProgress:progress=>{observing()&&(context.progress(progress),options.onProgress?.(progress))}});let payload={plugin:pluginName??name,operation:"run",request};return options.onProgress?context.invoke("plugin_model",payload,{},progress=>{observing()&&options.onProgress?.(progress)}):context.invoke("plugin_model",payload)},page(operation,input2={}){if(!executing)throw new Error("app.page is only available during command execution");return context.signal?.throwIfAborted(),context.invoke("plugin_page",{...input2,plugin:pluginName??name,operation})},toolboxCommand:(signature,handler,description2="",examples=[])=>registerCommand(signature,handler,description2,examples,!0),invoke(action,payload={},options={}){if(!executing)throw new Error("app.invoke 只能在命令执行期间调用");return context.signal?.throwIfAborted(),context.invoke(action,payload,options)},progress(progress){if(!executing)throw new Error("app.progress 只能在命令执行期间调用");context.progress(normalizePluginProgress(progress))}});try{if(extname2(entry).toLowerCase()===".py"){let descriptor=await describePythonPlugin(entry,app.options);name=descriptor.name,description=descriptor.description,toolbox=normalizePluginToolboxContribution(descriptor.toolbox),pageRuntime=normalizePluginPageRuntime(descriptor.pageRuntime),stateStorage=normalizePluginState(descriptor.stateStorage),taskRecovery=normalizePluginTaskRecovery(descriptor.taskRecovery),{appProfiles,profileSources}=loadPluginAppProfiles(entry,descriptor.appProfiles);for(let command of descriptor.commands){let commandName=command.signature.trim().split(/\s+/)[0];if(command.migrationOnly){app.checkpointMigration(commandName,(input2,commandContext)=>runPythonPluginCommand(entry,commandName,input2,app,commandContext,"migration",descriptor));continue}if(command.recoveryOnly){app.recoveryCommand(commandName,(input2,commandContext)=>runPythonPluginCommand(entry,commandName,input2,app,commandContext,!0,descriptor));continue}(command.runtimeOnly?app.runtimeCommand:command.toolboxOnly?app.toolboxCommand:app.command)(command.signature,(input2,commandContext)=>runPythonPluginCommand(entry,commandName,input2,app,commandContext,!1,descriptor,command.runtimeOnly),command.description)}}else{let moduleUrl=pathToFileURL(entry);moduleUrl.searchParams.set("mearl-version",entryVersion);let module=await import(moduleUrl.href);if(module.name!==void 0&&typeof module.name!="string")throw new Error("入口的 name 导出必须为字符串");if(name=module.name,module.description!==void 0&&typeof module.description!="string")throw new Error("入口的 description 导出必须为字符串");if(description=module.description,toolbox=normalizePluginToolboxContribution(module.toolbox),pageRuntime=normalizePluginPageRuntime(module.pageRuntime),stateStorage=normalizePluginState(module.stateStorage),taskRecovery=normalizePluginTaskRecovery(module.taskRecovery),{appProfiles,profileSources}=loadPluginAppProfiles(entry,module.appProfiles),module.default!==void 0&&typeof module.default!="function")throw new Error("入口必须默认导出 register(app) 函数");if(typeof module.default=="function")await module.default(app);else if(!appProfiles)throw new Error("入口必须默认导出 register(app) 函数")}if(commands.size===0&&!appProfiles)throw new Error("入口未注册任何命令");for(let command of Object.keys(taskRecovery?.commands??{}))if(!commands.has(command)||commands.get(command)?.runtimeOnly||commands.get(command)?.toolboxOnly||!recoveries.has(command))throw new Error(`Recovery requires a command and recoveryCommand: ${command}`);for(let command of recoveries.keys())if(!Object.hasOwn(taskRecovery?.commands??{},command))throw new Error(`Undeclared recovery command: ${command}`);for(let[command,definition]of Object.entries(taskRecovery?.commands??{}))if(!!definition.migrateFrom?.length!==migrations.has(command))throw new Error(`Checkpoint migrations require a declaration and checkpointMigration: ${command}`);for(let command of migrations.keys())if(!Object.hasOwn(taskRecovery?.commands??{},command))throw new Error(`Undeclared checkpoint migration: ${command}`);let runtimeCommands=new Set(Object.values(pageRuntime?.events??{}).map(event=>event.command));pageRuntime?.initialize&&runtimeCommands.add(pageRuntime.initialize);for(let[name2,command]of commands)if(command.runtimeOnly&&!runtimeCommands.has(name2))throw new Error(`runtimeCommand is not declared in pageRuntime.events: ${name2}`);for(let name2 of runtimeCommands)if(!commands.has(name2)||commands.get(name2)?.toolboxOnly)throw new Error(`Invalid page runtime command: ${name2}`);let toolboxCommands=toolbox?.page.commands??[];for(let[name2,command]of commands)if(command.toolboxOnly&&!toolboxCommands.includes(name2))throw new Error(`toolboxCommand 未声明在 toolbox.page.commands 中: ${name2}`);for(let command of toolboxCommands)if(!commands.has(command))throw new Error(`toolbox 命令未注册: ${command}`)}catch(error48){throw new PluginError("PLUGIN_LOAD_FAILED",`${entry}: ${error48 instanceof Error?error48.message:String(error48)}`)}finally{registering=!1}let find=(name2,toolboxPage=!1)=>{let command=commands.get(name2);if(!command)throw new PluginError("PLUGIN_COMMAND_NOT_FOUND",`未知子命令: ${name2}`);if(toolboxPage==="runtime"){if(!(pageRuntime?.initialize===name2||Object.values(pageRuntime?.events??{}).some(event=>event.command===name2))||command.toolboxOnly)throw new PluginError("PLUGIN_COMMAND_NOT_ALLOWED","Page runtime command is not declared")}else{if(command.runtimeOnly)throw new PluginError("PLUGIN_COMMAND_RUNTIME_ONLY",`命令仅供页面运行时调用: ${name2}`);if(toolboxPage){if(!toolbox?.page.commands.includes(name2))throw new PluginError("PLUGIN_COMMAND_NOT_ALLOWED",`工具页面不允许调用命令: ${name2}`)}else if(command.toolboxOnly)throw new PluginError("PLUGIN_COMMAND_TOOLBOX_ONLY",`命令仅供工具页面调用: ${name2}`)}return command},publicCommands=()=>[...commands.values()].filter(command=>!command.toolboxOnly&&!command.runtimeOnly),run=async(positionals,payload,namedInput={},toolboxPage=!1)=>{if(payload!==void 0&&positionals.length>0)throw new PluginError("PLUGIN_INVALID_INPUT","位置参数调用与 --payload 调用不能混用");if(payload!==void 0&&Object.keys(namedInput).length>0)throw new PluginError("PLUGIN_INVALID_INPUT","插件业务选项与 --payload 调用不能混用");if(payload!==void 0&&(!isObject2(payload)||typeof payload.command!="string"||!isObject2(payload.input)))throw new PluginError("PLUGIN_INVALID_INPUT",'--payload 必须为 {"command":"...","input":{...}}');let envelope=payload,commandName=envelope?.command??positionals[0]??"",hidden=toolboxPage==="recovery"||toolboxPage==="migration",selected=find(commandName,hidden?!1:toolboxPage),command=selected.command,handler=toolboxPage==="recovery"?recoveries.get(commandName):toolboxPage==="migration"?migrations.get(commandName):selected.handler;if(!handler||toolboxPage==="recovery"&&!context.invocation?.recovery)throw new PluginError("PLUGIN_TASK_RECOVERY_UNAVAILABLE","Recovery handler requires a managed recovery attempt");if(toolboxPage==="recovery"&&context.invocation?.recovery?.declarationHash!==pluginRecoverySignature(taskRecovery.commands[commandName]))throw new PluginError("PLUGIN_RECOVERY_DECLARATION_CHANGED","Recovery declaration differs from the admitted format");let positionalInput=envelope?{...envelope.input}:Object.fromEntries(command.registeredArguments.map((argument,index)=>[argument.name(),argument.variadic?positionals.slice(index+1):positionals[index+1]]).filter(([,value])=>value!==void 0));for(let name2 of Object.keys(namedInput))if(Object.hasOwn(positionalInput,name2))throw new PluginError("PLUGIN_INVALID_INPUT",`参数不能重复传入: ${name2}`);let input2={...positionalInput,...namedInput};if(!envelope&&!command.registeredArguments.some(argument=>argument.variadic)&&positionals.length-1>command.registeredArguments.length)throw new PluginError("PLUGIN_INVALID_INPUT","位置参数过多");for(let argument of hidden?[]:command.registeredArguments){let value=Object.hasOwn(input2,argument.name())?input2[argument.name()]:void 0;if(argument.required&&(value==null||value===""||Array.isArray(value)&&value.length===0))throw new PluginError("PLUGIN_INVALID_INPUT",`缺少必填参数: ${argument.name()}`);if(argument.variadic&&value!==void 0&&!Array.isArray(value))throw new PluginError("PLUGIN_INVALID_INPUT",`${argument.name()} 必须为数组`)}if(executing)throw new PluginError("PLUGIN_BUSY","同一命令实例不能并发执行");let signal=context.signal??new AbortController().signal;signal.throwIfAborted();let identity3=context.invocation??createPluginInvocationIdentity(pluginName??name??"unregistered",context.source??"sdk",context.parentInvocation),generation=++invocationGeneration,assertActive=()=>{if(!executing||generation!==invocationGeneration)throw new PluginError("PLUGIN_INVOCATION_ENDED","命令调用已结束");signal.throwIfAborted()},commandContext=Object.freeze({identity:identity3,signal,...identity3.recovery?{recovery:structuredClone(identity3.recovery)}:{},checkpoint:(data,expectedSequence)=>(assertActive(),app.checkpoint(data,expectedSequence)),...identity3.page?{page:Object.freeze({send:(message,options={})=>(assertActive(),app.page("send",{instanceId:identity3.page.instanceId,message,...options.timeoutSec!==void 0?{timeoutSec:options.timeoutSec}:{}})),get:()=>(assertActive(),app.page("get",{instanceId:identity3.page.instanceId}))})}:{},invoke:(action,payload2,options)=>(assertActive(),app.invoke(action,payload2,options)),state:(collection,operation,input3)=>(assertActive(),app.state(collection,operation,{...identity3.page?{instanceId:identity3.page.instanceId}:{},...input3})),model:(request,options)=>(assertActive(),app.model(request,options)),progress:progress=>{assertActive(),app.progress(progress)}});checkpointDeclaration=taskRecovery&&Object.hasOwn(taskRecovery.commands,commandName)?pluginRecoverySignature(taskRecovery.commands[commandName]):void 0,executing=!0,context.onInvocation?.(identity3);try{return await handler(input2,commandContext)}finally{executing=!1,checkpointDeclaration=void 0,context.onInvocation?.(void 0)}};return{name,description,toolbox,pageRuntime,stateStorage,taskRecovery,appProfiles,profileSources,version:readPluginVersion(entry),commandHelp(namespace){return publicCommands().map(({command,signature})=>` ${namespace} ${signature} ${command.description()}`).join(`
980
980
  `)},help(namespace,name2){let selected=name2?[find(name2)]:publicCommands();if(!selected.length){let location2=toolbox?`请在 Mearl ${toolbox.displayMode==="popup"?"Popup":"工具箱"} 中打开「${toolbox.title}」使用。`:"此插件未提供公开 CLI 命令。";return`${namespace} 未提供 CLI 命令。
981
981
  ${location2}`}let examples=selected.flatMap(({examples:examples2})=>examples2);return["用法:",...selected.map(({command,signature})=>` ${namespace} ${signature} ${command.description()}`),...examples.length?["","示例:",...examples.map(example=>` ${namespace} ${example}`)]:[]].join(`
@@ -987,8 +987,8 @@ ${location2}`}let examples=selected.flatMap(({examples:examples2})=>examples2);r
987
987
  `),encoded="";for(let n=0;n<str.length;n++){let c2=str.charCodeAt(n);c2<128?encoded+=String.fromCharCode(c2):c2<2048?(encoded+=String.fromCharCode(c2>>6|192),encoded+=String.fromCharCode(c2&63|128)):(encoded+=String.fromCharCode(c2>>12|224),encoded+=String.fromCharCode(c2>>6&63|128),encoded+=String.fromCharCode(c2&63|128))}str=encoded;let len=str.length,nw=(len+8>>>6)+1<<4,words=new Array(nw).fill(0);for(let i=0;i<len;i++)words[i>>2]|=str.charCodeAt(i)<<i%4*8;words[len>>2]|=128<<len%4*8,words[nw-2]=len<<3,words[nw-1]=len>>>29;let a=1732584193,b=4023233417,c=2562383102,d=271733878;for(let k=0;k<words.length;k+=16){let aa=a,bb=b,cc=c,dd=d;a=ff(a,b,c,d,words[k],7,3614090360),d=ff(d,a,b,c,words[k+1],12,3905402710),c=ff(c,d,a,b,words[k+2],17,606105819),b=ff(b,c,d,a,words[k+3],22,3250441966),a=ff(a,b,c,d,words[k+4],7,4118548399),d=ff(d,a,b,c,words[k+5],12,1200080426),c=ff(c,d,a,b,words[k+6],17,2821735955),b=ff(b,c,d,a,words[k+7],22,4249261313),a=ff(a,b,c,d,words[k+8],7,1770035416),d=ff(d,a,b,c,words[k+9],12,2336552879),c=ff(c,d,a,b,words[k+10],17,4294925233),b=ff(b,c,d,a,words[k+11],22,2304563134),a=ff(a,b,c,d,words[k+12],7,1804603682),d=ff(d,a,b,c,words[k+13],12,4254626195),c=ff(c,d,a,b,words[k+14],17,2792965006),b=ff(b,c,d,a,words[k+15],22,1236535329),a=gg(a,b,c,d,words[k+1],5,4129170786),d=gg(d,a,b,c,words[k+6],9,3225465664),c=gg(c,d,a,b,words[k+11],14,643717713),b=gg(b,c,d,a,words[k],20,3921069994),a=gg(a,b,c,d,words[k+5],5,3593408605),d=gg(d,a,b,c,words[k+10],9,38016083),c=gg(c,d,a,b,words[k+15],14,3634488961),b=gg(b,c,d,a,words[k+4],20,3889429448),a=gg(a,b,c,d,words[k+9],5,568446438),d=gg(d,a,b,c,words[k+14],9,3275163606),c=gg(c,d,a,b,words[k+3],14,4107603335),b=gg(b,c,d,a,words[k+8],20,1163531501),a=gg(a,b,c,d,words[k+13],5,2850285829),d=gg(d,a,b,c,words[k+2],9,4243563512),c=gg(c,d,a,b,words[k+7],14,1735328473),b=gg(b,c,d,a,words[k+12],20,2368359562),a=hh(a,b,c,d,words[k+5],4,4294588738),d=hh(d,a,b,c,words[k+8],11,2272392833),c=hh(c,d,a,b,words[k+11],16,1839030562),b=hh(b,c,d,a,words[k+14],23,4259657740),a=hh(a,b,c,d,words[k+1],4,2763975236),d=hh(d,a,b,c,words[k+4],11,1272893353),c=hh(c,d,a,b,words[k+7],16,4139469664),b=hh(b,c,d,a,words[k+10],23,3200236656),a=hh(a,b,c,d,words[k+13],4,681279174),d=hh(d,a,b,c,words[k],11,3936430074),c=hh(c,d,a,b,words[k+3],16,3572445317),b=hh(b,c,d,a,words[k+6],23,76029189),a=hh(a,b,c,d,words[k+9],4,3654602809),d=hh(d,a,b,c,words[k+12],11,3873151461),c=hh(c,d,a,b,words[k+15],16,530742520),b=hh(b,c,d,a,words[k+2],23,3299628645),a=ii(a,b,c,d,words[k],6,4096336452),d=ii(d,a,b,c,words[k+7],10,1126891415),c=ii(c,d,a,b,words[k+14],15,2878612391),b=ii(b,c,d,a,words[k+5],21,4237533241),a=ii(a,b,c,d,words[k+12],6,1700485571),d=ii(d,a,b,c,words[k+3],10,2399980690),c=ii(c,d,a,b,words[k+10],15,4293915773),b=ii(b,c,d,a,words[k+1],21,2240044497),a=ii(a,b,c,d,words[k+8],6,1873313359),d=ii(d,a,b,c,words[k+15],10,4264355552),c=ii(c,d,a,b,words[k+6],15,2734768916),b=ii(b,c,d,a,words[k+13],21,1309151649),a=ii(a,b,c,d,words[k+4],6,4149444226),d=ii(d,a,b,c,words[k+11],10,3174756917),c=ii(c,d,a,b,words[k+2],15,718787259),b=ii(b,c,d,a,words[k+9],21,3951481745),a=addUnsigned(a,aa),b=addUnsigned(b,bb),c=addUnsigned(c,cc),d=addUnsigned(d,dd)}let hex3=v=>{let s="";for(let i=0;i<=3;i++){let byte=v>>>i*8&255;s+=("0"+byte.toString(16)).slice(-2)}return s};return(hex3(a)+hex3(b)+hex3(c)+hex3(d)).toLowerCase()}function extractMtopToken(cookieMap,isMopen){if(isMopen){let mTk=cookieMap.get("m_tk"),tbToken=cookieMap.get("_tb_token_");if(mTk)return mTk.split("_")[0]||"";if(tbToken)return tbToken;throw new Error("Missing m_tk or _tb_token_ cookie. Please ensure the user is logged in.")}let h5Tk=cookieMap.get("_m_h5_tk");if(h5Tk)return h5Tk.split("_")[0]||"";throw new Error("Missing _m_h5_tk cookie. Please ensure the user is logged in.")}function computeMtopSign(params){let{api,version:version3,timestamp,appKey,token,dataStr,isMopen}=params;return md5(isMopen?`${api}&${version3}&${timestamp}&${appKey}&${token}&${md5(dataStr)}`:`${token}&${timestamp}&${appKey}&${dataStr}`)}function buildCookieHeaderValue(cookieMap){return[...cookieMap.entries()].map(([k,v])=>`${k}=${v}`).join("; ")}var MTOP_HOST_MAP,init_mtopSigner=__esm({"../browser-core/dist/mtopSigner.js"(){"use strict";MTOP_HOST_MAP={prod:"h5api.m.taobao.com",pre:"h5api.wapa.taobao.com"}}});function parseSseDataValue(value){try{return JSON.parse(value)}catch{return value}}function createSseEventParser(){let buffer="",eventName="",lastEventId,dataLines=[],hasData=!1,dispatch=()=>{if(!hasData)return eventName="",dataLines=[],[];let rawData=dataLines.join(`
988
988
  `);if(eventName=eventName||"message",dataLines=[],hasData=!1,rawData==="[DONE]")return eventName="",[];let event={event:eventName,data:parseSseDataValue(rawData),...lastEventId!==void 0?{eventId:lastEventId}:{}};return eventName="",[event]},consumeLine=line=>{if(line==="")return dispatch();if(line.startsWith(":"))return[];let separator=line.indexOf(":"),field=separator===-1?line:line.slice(0,separator),value=separator===-1?"":line.slice(separator+1);return value.startsWith(" ")&&(value=value.slice(1)),field==="data"?(dataLines.push(value),hasData=!0):field==="event"?eventName=value:field==="id"&&!value.includes("\0")&&(lastEventId=value),[]},drain=final=>{let events=[];for(;buffer.length>0;){let newlineIndex=-1;for(let index=0;index<buffer.length;index++)if(buffer[index]===`
989
989
  `||buffer[index]==="\r"){newlineIndex=index;break}if(newlineIndex===-1){final&&(events.push(...consumeLine(buffer)),buffer="");break}if(buffer[newlineIndex]==="\r"&&newlineIndex===buffer.length-1&&!final)break;let line=buffer.slice(0,newlineIndex),separatorLength=buffer[newlineIndex]==="\r"&&buffer[newlineIndex+1]===`
990
- `?2:1;buffer=buffer.slice(newlineIndex+separatorLength),events.push(...consumeLine(line))}return final&&events.push(...dispatch()),events};return{push(chunk){return buffer+=chunk,drain(!1)},finish(){return drain(!0)}}}var init_sseParser=__esm({"../browser-core/dist/sseParser.js"(){"use strict"}});function selectRequestCookies(cookies,url2){return filterCookiesForUrl(cookies,url2).filter(cookie=>cookie.partitionKey===void 0&&cookie.partitionKeyOpaque!==!0).sort((left,right)=>right.path.length-left.path.length)}function serializeRequestCookies(cookies){return cookies.map(cookie=>`${cookie.name}=${cookie.value}`).join("; ")}function requestCookiesToMap(cookies){let values=new Map;for(let cookie of cookies)values.has(cookie.name)||values.set(cookie.name,cookie.value);return values}function normalizeCookieDomain(input2,action){let value=input2.trim();if(!value)throw new Error(`${action}: "domain" must be a non-empty domain`);let hostname3;try{hostname3=new URL(value.includes("://")?value:`https://${value}`).hostname}catch{throw new Error(`${action}: invalid domain "${input2}"`)}if(hostname3=hostname3.toLowerCase().replace(/^\.+/,"").replace(/\.+$/,""),!hostname3)throw new Error(`${action}: invalid domain "${input2}"`);return hostname3}function isSecureCookieUrl(url2){let hostname3=url2.hostname.replace(/\.$/,""),isLocalhost=hostname3==="localhost"||hostname3.endsWith(".localhost")||hostname3==="[::1]"||/^127\.\d+\.\d+\.\d+$/.test(hostname3);return url2.protocol==="https:"||isLocalhost}function filterCookiesForUrl(cookies,cookieUrl){let url2=new URL(cookieUrl);return cookies.filter(item=>{let domain2=item.domain.replace(/^\./,"").toLowerCase(),hostOnly=item.hostOnly??!item.domain.startsWith(".");return url2.hostname!==domain2&&(hostOnly||!url2.hostname.endsWith(`.${domain2}`))||item.secure&&!isSecureCookieUrl(url2)?!1:url2.pathname===item.path||url2.pathname.startsWith(item.path)&&(item.path.endsWith("/")||url2.pathname[item.path.length]==="/")})}function selectReadableCookie(cookies,target){let cookie=cookies.filter(item=>{if(item.partitionKey!==void 0||item.partitionKeyOpaque===!0||item.name!==target.cookieName)return!1;let domain2=item.domain.replace(/^\./,"").toLowerCase();return!(target.domain&&domain2!==target.domain||target.path&&item.path!==target.path)}).sort((left,right)=>{let pathDifference=right.path.length-left.path.length;return pathDifference!==0?pathDifference:right.domain.length-left.domain.length})[0];if(cookie?.httpOnly)throw new Error(`get_cookie: "${target.cookieName}" is HttpOnly and cannot be read`);return cookie}function validateCookieName(input2,action){if(typeof input2!="string"||!input2.trim())throw new Error(`${action}: "name" is required`);let name=input2.trim();if(name.length>256||!/^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/.test(name))throw new Error(`${action}: "name" contains unsupported cookie characters`);return name}function validateCookieValue(input2){if(typeof input2!="string")throw new Error('set_cookie: "value" must be a string');let hasUnsupportedCharacter=[...input2].some(character=>{let code=character.charCodeAt(0);return code<=32||code===127||character===";"||character===","});if(input2.length>4096||hasUnsupportedCharacter)throw new Error('set_cookie: "value" contains unsupported cookie characters');return input2}function validateCookiePath(input2,action){if(input2===void 0)return;if(typeof input2!="string"||!input2.startsWith("/"))throw new Error(`${action}: "path" must start with "/"`);let hasUnsupportedCharacter=[...input2].some(character=>{let code=character.charCodeAt(0);return code<32||code===127||character===";"});if(input2.length>1024||hasUnsupportedCharacter)throw new Error(`${action}: "path" contains unsupported cookie characters`);return input2}function parseCurrentUrl(currentUrl,action){if(!currentUrl)throw new Error(`${action}: specify url or tabId`);let url2;try{url2=new URL(currentUrl)}catch{throw new Error(`${action}: invalid current page URL "${currentUrl}"`)}if(url2.protocol!=="http:"&&url2.protocol!=="https:")throw new Error(`${action}: current page must use http or https`);return url2}function resolveCookieUrl(currentUrl,input2,action){if(input2.url!==void 0&&(typeof input2.url!="string"||!input2.url.trim()))throw new Error(`${action}: "url" must be a non-empty string`);let url2=parseCurrentUrl(input2.url??currentUrl,action);if(input2.url!==void 0&&(url2.username||url2.password))throw new Error(`${action}: "url" must not contain credentials`);return url2}function resolveExplicitDomain(url2,input2,action){if(input2!==void 0&&typeof input2!="string")throw new Error(`${action}: "domain" must be a string`);let explicitDomain=typeof input2=="string"&&input2?normalizeCookieDomain(input2,action):void 0;if(explicitDomain&&url2.hostname.toLowerCase()!==explicitDomain&&!url2.hostname.toLowerCase().endsWith(`.${explicitDomain}`))throw new Error(`${action}: domain "${explicitDomain}" is not a parent domain of target host "${url2.hostname.toLowerCase()}"`);return explicitDomain}function resolveGetCookieTarget(currentUrl,input2){let action="get_cookie",url2=resolveCookieUrl(currentUrl,input2,action),name=validateCookieName(input2?.name,action),domain2=resolveExplicitDomain(url2,input2?.domain,action),path27=validateCookiePath(input2?.path,action);return{cookieName:name,cookieUrl:`${url2.protocol}//${url2.hostname}${(path27??url2.pathname)||"/"}`,...domain2?{domain:domain2}:{},...path27?{path:path27}:{}}}function resolveSetCookieTarget(currentUrl,input2){let action="set_cookie",url2=resolveCookieUrl(currentUrl,input2,action),name=validateCookieName(input2?.name,action),value=validateCookieValue(input2?.value),path27=validateCookiePath(input2?.path,action)??"/";if(input2.reload!==void 0&&typeof input2.reload!="boolean")throw new Error('set_cookie: "reload" must be a boolean');let explicitDomain=resolveExplicitDomain(url2,input2?.domain,action),domain2=explicitDomain??url2.hostname.toLowerCase();return{cookieName:name,cookieValue:value,...explicitDomain?{cookieDomain:explicitDomain.includes(".")?`.${explicitDomain}`:explicitDomain}:{},cookieUrl:`${url2.protocol}//${url2.hostname.toLowerCase()}${path27}`,domain:domain2,path:path27,reload:input2.reload===!0}}var init_cookie=__esm({"../browser-core/dist/cookie.js"(){"use strict"}});function resolveMtopRequest(data){let{api,data:requestData={},version:version3="1.0",method="GET",appKey="12574478",env="prod",timeout=1e4,headers:customHeaders={},ttid}=data;if(!api||typeof api!="string"||api.trim()==="")throw new Error('Invalid api: api must be a non-empty string (e.g. "mtop.trade.order.create")');let baseHost=MTOP_HOST_MAP[env.toLowerCase()];if(!baseHost)throw new Error(`Invalid env: "${env}". Supported values: ${Object.keys(MTOP_HOST_MAP).join(", ")}`);let normalizedMethod=method.toUpperCase();if(normalizedMethod!=="GET"&&normalizedMethod!=="POST")throw new Error(`Invalid method: ${method}. mtop only supports GET or POST`);if(!Number.isFinite(timeout)||timeout<=0)throw new Error("Invalid timeout: timeout must be a positive number");return{api,requestData,dataStr:typeof requestData=="string"?requestData:JSON.stringify(requestData),version:version3,normalizedMethod,appKey,gatewayUrl:new URL(`https://${baseHost}/h5/${api}/${version3}/`),customHeaders,ttid,timeout,isMopen:api.startsWith("mopen.")}}function prepareSignedMtopRequest(resolved,cookies,stream=!1,timestamp=Date.now()){let cookieMap=cookies instanceof Map?cookies:requestCookiesToMap(cookies),token=extractMtopToken(cookieMap,resolved.isMopen),sign=computeMtopSign({api:resolved.api,version:resolved.version,timestamp,appKey:resolved.appKey,token,dataStr:resolved.dataStr,isMopen:resolved.isMopen}),targetUrl=new URL(resolved.gatewayUrl),queryParams={jsv:"2.7.2",appKey:resolved.appKey,t:timestamp.toString(),sign,api:resolved.api,v:resolved.version,type:"originaljson",dataType:"json"};stream&&(queryParams.xAcceptStream="true"),resolved.ttid&&(queryParams.ttid=resolved.ttid),resolved.normalizedMethod==="GET"&&(queryParams.data=resolved.dataStr);for(let[name,value]of Object.entries(queryParams))targetUrl.searchParams.set(name,value);let requestHeaders={Accept:stream?"text/event-stream":"application/json",...resolved.customHeaders},body;return resolved.normalizedMethod==="POST"&&(body=new URLSearchParams({data:resolved.dataStr}).toString(),requestHeaders["Content-Type"]="application/x-www-form-urlencoded"),{...resolved,targetUrl,requestHeaders,cookieHeader:cookies instanceof Map?buildCookieHeaderValue(cookies):serializeRequestCookies(cookies),body}}function parseMtopResponseText(text3){try{return JSON.parse(text3)}catch{let jsonpMatch=text3.match(/^[^(]*\((.*)\)\s*;?\s*$/s);if(!jsonpMatch?.[1])return text3;try{return JSON.parse(jsonpMatch[1])}catch{return text3}}}function summarizeMtopStreamError(body){if(body&&typeof body=="object"){let record4=body;if(Array.isArray(record4.ret))return record4.ret.map(String).join(", ");if(typeof record4.message=="string")return record4.message}return((typeof body=="string"?body:JSON.stringify(body))??String(body)).slice(0,500)}async function consumeMtopSseResponse(response,onReceive){let contentType2=response.headers.get("content-type")??"";if(!response.ok||!response.body||!contentType2.includes("text/event-stream")){let body=parseMtopResponseText(await response.text());throw new Error(`Unexpected MTOP stream response: ${summarizeMtopStreamError(body)}`)}let reader=response.body.getReader(),decoder=new TextDecoder,parser=createSseEventParser(),lastData=null,emit=async(text3,finished=!1)=>{let events=[...parser.push(text3),...finished?parser.finish():[]];for(let event of events)lastData=event.data,await onReceive(event)};for(;;){let{done,value}=await reader.read();if(done)return await emit(decoder.decode(),!0),lastData;await emit(decoder.decode(value,{stream:!0}))}}var init_mtopRequest=__esm({"../browser-core/dist/mtopRequest.js"(){"use strict";init_mtopSigner();init_sseParser();init_cookie()}});function parseRequestData(data){if(typeof data!="string")return data;try{return JSON.parse(data)}catch{return data}}function parseQueryString(url2){let queryString=[];try{new URL(url2).searchParams.forEach((value,name)=>queryString.push({name,value}))}catch{}return queryString}function redactSensitiveHeaders(headers){let sensitiveNames=new Set(["authorization","cookie","proxy-authorization"]);return headers.map(header=>sensitiveNames.has(header.name.toLowerCase())?{...header,value:"<redacted>"}:header)}function createMtopStreamCapture(data){let timestampMs2=data.timestampMs??Date.now(),url2=data.url??`mtop://${data.api}/`;return{startTimeMs:timestampMs2,request:{id:data.id,timestamp:new Date(timestampMs2).toISOString(),timestampMs:timestampMs2,method:data.method,url:url2,apiName:data.api,status:0,statusText:"SSE Streaming",headers:redactSensitiveHeaders(data.requestHeaders??[]),responseHeaders:[],queryString:parseQueryString(url2),postData:parseRequestData(data.requestData??null),responseBody:[],isProxy:!0,proxyRequestUrl:null,proxyData:null,isSSE:!0,isPending:!0,...data.tabId!==void 0?{tabId:data.tabId}:{},source:"mtop",resourceType:"fetch",captureSequence:data.captureSequence}}}function updateMtopStreamCaptureResponse(capture,response){capture.request.status=response.status,capture.request.statusText=response.statusText,capture.request.responseHeaders=response.responseHeaders}function appendMtopStreamCaptureChunk(capture,data,timestampMs2=Date.now()){return Array.isArray(capture.request.responseBody)?(capture.request.responseBody.push({event:"message",data,timestamp:timestampMs2,duration:capture.lastMessageTimeMs===void 0?0:timestampMs2-capture.lastMessageTimeMs}),capture.lastMessageTimeMs=timestampMs2,!0):!1}function finishMtopStreamCapture(capture,options={}){let timestampMs2=options.timestampMs??Date.now();if(capture.request.isPending=!1,capture.request.duration=Math.max(0,timestampMs2-capture.startTimeMs),options.error){capture.request.statusText=options.error,Array.isArray(capture.request.responseBody)&&capture.request.responseBody.length===0&&(capture.request.responseBody={error:options.error});return}capture.request.status===0&&(capture.request.status=200),(!capture.request.statusText||capture.request.statusText==="SSE Streaming")&&(capture.request.statusText="OK")}var init_mtopStreamCapture=__esm({"../browser-core/dist/mtopStreamCapture.js"(){"use strict"}});function isAppProfileUserInfoUrl(url2){try{let target=new URL(url2);return(target.protocol==="http:"||target.protocol==="https:")&&(target.hostname==="taobao.com"||target.hostname.endsWith(".taobao.com"))}catch{return!1}}function decodeCookieValue(raw){let value=raw;for(let index=0;index<2;index+=1)try{let decoded=decodeURIComponent(value);if(decoded===value)break;value=decoded}catch{break}return value.replace(/\\u([0-9a-f]{4})/gi,(_match,hex3)=>String.fromCharCode(Number.parseInt(hex3,16)))}function firstCookieValue(cookies,name){let value=cookies.find(cookie=>cookie.name===name&&cookie.value&&cookie.value!=="null")?.value;return value?decodeCookieValue(value):""}function resolveAppProfileUserInfo(url2,cookies){if(!isAppProfileUserInfoUrl(url2))return{};let userId=firstCookieValue(cookies,"unb"),userName=["_w_tb_nick","_nk_","snk","tracknick"].map(name=>firstCookieValue(cookies,name)).find(Boolean);return{...userId&&{userId},...userName&&{userName}}}var init_appProfileUserInfo=__esm({"../browser-core/dist/appProfileUserInfo.js"(){"use strict"}});function isTrackingUrl(url2){return APLUS_URL_PATTERN.test(url2)||RUM_URL_PATTERN.test(url2)||ARMS_URL_PATTERN.test(url2)||/retcode\.alicdn\.com|beacon\.taobao\.com|tbsec\./i.test(url2)}function formatTimestamp(ms){let d=new Date(ms),pad=n=>String(n).padStart(2,"0");return`${d.getFullYear()}/${pad(d.getMonth()+1)}/${pad(d.getDate())} ${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`}function parseParams(value){let params={};return value.split("&").forEach(pair=>{let eqIndex=pair.indexOf("=");if(eqIndex===-1)return;let rawKey=pair.slice(0,eqIndex),rawValue=pair.slice(eqIndex+1);try{params[decodeURIComponent(rawKey)]=rawValue}catch{params[rawKey]=rawValue}}),params}function decodeParamValue(value){try{return decodeURIComponent(value)}catch{return value}}function parseJsonParamValue(value){try{return JSON.parse(value)}catch{let decoded=decodeParamValue(value);if(decoded===value)return;try{return JSON.parse(decoded)}catch{return}}}function parseUrlParams(search){let encodedParams=parseParams(search.startsWith("?")?search.slice(1):search);return Object.fromEntries(Object.entries(encodedParams).map(([key,value])=>[key,decodeParamValue(value)]))}function extractSpmFromUrl(spmOrUrl){if(!/^https?:\/\//i.test(spmOrUrl))return spmOrUrl;try{return new URL(spmOrUrl).searchParams.get("spm")??spmOrUrl}catch{return spmOrUrl}}function resolveAplusSpm(eventType,raw){let expSpm=(Array.isArray(raw.expdata)?raw.expdata:[])[0]?.spm||"",gokeyParams=parseParams(raw.gokey||""),gokeySpm=decodeParamValue(gokeyParams.spm||""),rawSpmUrl=raw["spm-url"]||decodeParamValue(gokeyParams["spm-url"]||""),spmUrl=extractSpmFromUrl(rawSpmUrl),pointSpm;switch(eventType){case"CLK":pointSpm=gokeySpm||expSpm;break;case"EXP":pointSpm=expSpm;break;case"PV":pointSpm=spmUrl;break;default:pointSpm=gokeySpm||expSpm}return{mainSpm:pointSpm,highlightSpm:pointSpm}}function parseAplusRequest(url2,options={}){if(!APLUS_URL_PATTERN.test(url2))return null;let urlObj;try{urlObj=new URL(url2)}catch{return null}let params=parseUrlParams(urlObj.search),gmkey=params.gmkey??"UNKNOWN",urlPathName=urlObj.pathname.slice(1),eventType=urlPathName.split(".")[1]==="selfdefine"?"SDF":gmkey,gokeyRaw=params.gokey??"",gokeyParams=parseParams(gokeyRaw),expdata=[];if(gokeyParams.expdata){let parsedExpdata=parseJsonParamValue(gokeyParams.expdata);Array.isArray(parsedExpdata)&&(expdata=parsedExpdata.map(item=>{if(!item?.exargs||typeof item.exargs!="object")return item;let decoded={};for(let[key,value]of Object.entries(item.exargs)){if(typeof value!="string"){decoded[key]=value;continue}let parsedValue=parseJsonParamValue(value);decoded[key]=parsedValue===void 0?value:parsedValue}return{...item,exargs:decoded}}))}let rawBizArgs=gokeyParams.bizArgs,parsedBizArgs=rawBizArgs===void 0?void 0:parseJsonParamValue(rawBizArgs),bizArgs=parsedBizArgs===void 0?rawBizArgs:parsedBizArgs,pageUrl=params._p_url??(gokeyParams._p_url?decodeParamValue(gokeyParams._p_url):""),{gokey:rawGokey,...topLevelParams}=params,rawData={...topLevelParams,_path:urlPathName,_url:url2,gokey:rawGokey,...expdata.length>0?{expdata}:{},...bizArgs!==void 0?{bizArgs}:{}},spm=resolveAplusSpm(eventType,rawData).mainSpm,pathName=urlPathName.split(".").slice(1).join("."),eventName=eventType==="SDF"?pathName:spm||pathName||pageUrl,now=options.now??Date.now();return{id:`aplus-${options.sequence??++aplusCounter}-${now}`,source:"aplus",batchId:0,batchTimestampMs:now,batchTimestamp:formatTimestamp(now),event_type:eventType,name:eventName,url:url2,timestamp:now,_raw:rawData,_context:{requestUrl:url2,app:{},user:{...params.uidaplus?{uidaplus:params.uidaplus}:{},...params._gr_uid_?{_gr_uid_:params._gr_uid_}:{}},session:{},view:{...params["spm-url"]?{"spm-url":params["spm-url"]}:{},...params["spm-pre"]?{"spm-pre":params["spm-pre"]}:{},...params["spm-cnt"]?{"spm-cnt":params["spm-cnt"]}:{},...pageUrl?{page_url:pageUrl}:{}},properties:{},os:{},net:{}}}}function parseRumBody(postData){if(!postData)return null;if(typeof postData=="object")return postData;try{return JSON.parse(postData)}catch{return null}}function tryConvertI18nTracker(event,base){let normalizedType=RUM_TYPE_ALIAS[event.type]??event.type;if(event.event_type!=="action"||normalizedType!=="custom")return null;let snapshots;try{snapshots=typeof event.snapshots=="string"?JSON.parse(event.snapshots):event.snapshots}catch{return null}if(!snapshots||typeof snapshots!="object")return null;let eventType=I18N_TRACKER_TYPE_MAP[snapshots.message];if(!eventType)return null;let spm=[snapshots.c1??"",snapshots.c2??""].filter(Boolean).join("."),exargs={};typeof snapshots.c3=="string"&&snapshots.c3.split("&").forEach(pair=>{let eqIndex=pair.indexOf("=");if(eqIndex===-1)return;let key=pair.slice(0,eqIndex),rawValue=pair.slice(eqIndex+1);try{exargs[key]=JSON.parse(decodeURIComponent(rawValue))}catch{exargs[key]=rawValue}});let dataAttrs=snapshots.trackerInfo?.dataAttrs;if(dataAttrs&&typeof dataAttrs=="object"&&dataAttrs["data-biz-args"]&&!exargs.bizArgs)try{exargs.bizArgs=JSON.parse(dataAttrs["data-biz-args"])}catch{exargs.bizArgs=dataAttrs["data-biz-args"]}return{...base,event_type:eventType,name:spm,_raw:{...event,expdata:[{spm,...Object.keys(exargs).length>0?{exargs}:{}}],"spm-url":spm}}}function parseRumRequest(url2,postData,options={}){if(!RUM_URL_PATTERN.test(url2))return[];let parsed=parseRumBody(postData),rawEvents=Array.isArray(parsed?.events)?parsed.events:[];if(rawEvents.length===0)return[];let now=options.now??Date.now(),batchId=options.sequence??++rumCounter,context={requestUrl:url2,app:parsed?.app??{},user:parsed?.user??{},session:parsed?.session??{},view:parsed?.view??{},properties:parsed?.properties??{},os:parsed?.os??{},net:parsed?.net??{}};return rawEvents.flatMap((rawEvent,index)=>{if(!rawEvent||typeof rawEvent!="object"||Array.isArray(rawEvent))return[];let event=rawEvent,normalizedType=RUM_TYPE_ALIAS[event.type]??event.type,base={id:`${batchId}-${event.event_id??index}`,batchId,batchTimestampMs:now,batchTimestamp:formatTimestamp(now),type:normalizedType,url:event.url,timestamp:event.timestamp??now,success:event.success,status_code:event.status_code,method:event.method,duration:event.duration,source:"rum",_context:context},converted=tryConvertI18nTracker(event,base);return converted?[converted]:[{...base,event_type:event.event_type??"unknown",name:event.name,_raw:event}]})}function parseArmsRequest(url2,options={}){if(!ARMS_URL_PATTERN.test(url2))return null;let urlObj;try{urlObj=new URL(url2)}catch{return null}let params={};urlObj.searchParams.forEach((value,key)=>{params[key]=value});let eventType=(params.t??"unknown").toLowerCase(),page=params.page??"",now=options.now??Date.now(),sequence=options.sequence??++armsCounter,parsedTimestamp2=params.begin?Number.parseInt(params.begin,10):now,timestamp=Number.isFinite(parsedTimestamp2)?parsedTimestamp2:now;return{id:`arms-${sequence}-${now}`,source:"arms",batchId:0,batchTimestampMs:now,batchTimestamp:formatTimestamp(now),event_type:eventType,name:page||url2,url:url2,timestamp,_raw:{...params,_url:url2},_context:{requestUrl:url2,app:{...params.pid?{pid:params.pid}:{},...params.release?{release:params.release}:{},...params.environment?{environment:params.environment}:{},...params._v?{sdk_version:params._v}:{}},user:{...params.uid?{uid:params.uid}:{}},session:{...params.sid?{sid:params.sid}:{}},view:{...page?{page}:{},...params.tag?{tag:params.tag}:{}},properties:{},os:{},net:{...params.ct?{ct:params.ct}:{}}}}}function parseTrackingRequest(url2,postData,options={}){let rumEvents=parseRumRequest(url2,postData,options);if(rumEvents.length>0)return rumEvents;let aplusEvent=parseAplusRequest(url2,options);if(aplusEvent)return[aplusEvent];let armsEvent=parseArmsRequest(url2,options);return armsEvent?[armsEvent]:[]}var APLUS_URL_PATTERN,RUM_URL_PATTERN,ARMS_URL_PATTERN,aplusCounter,armsCounter,rumCounter,RUM_TYPE_ALIAS,I18N_TRACKER_TYPE_MAP,init_eventParsers=__esm({"../browser-core/dist/eventParsers.js"(){"use strict";APLUS_URL_PATTERN=/\.mmstat\.com\//,RUM_URL_PATTERN=/\.rum\.aliyuncs\.com\//,ARMS_URL_PATTERN=/arms-retcode\.aliyuncs\.com\//;aplusCounter=0,armsCounter=0,rumCounter=0;RUM_TYPE_ALIAS={cst:"custom"},I18N_TRACKER_TYPE_MAP={"i18n-tracker-exp":"EXP","i18n-tracker-clk":"CLK"}}});function createCaptureGeneration(){return crypto.randomUUID()}function encodeCaptureCursor(cursor){return`${CURSOR_PREFIX}:${cursor.tabId}:${cursor.generation}:${cursor.scope}:${cursor.sequence}`}function decodeCaptureCursor(value){let match=value.match(/^mearl-capture-v1:(\d+):([^:]+):(all|logs|requests|events):(\d+)$/);if(!match)throw new Error("Invalid capture cursor");let tabId=Number(match[1]),sequence=Number(match[4]);if(!Number.isSafeInteger(tabId)||!Number.isSafeInteger(sequence))throw new Error("Invalid capture cursor");return{tabId,generation:match[2],scope:match[3],sequence}}function captureCheckpoint(state){return encodeCaptureCursor({tabId:state.tabId,generation:state.generation,sequence:state.currentSequence,scope:"all"})}function nextCaptureSequence(state){return state.currentSequence+=1,state.currentSequence}function resolveAfterSequence(after,state,scope){if(!after)return 0;let cursor=decodeCaptureCursor(after);if(cursor.tabId!==state.tabId)throw new Error(`Capture cursor belongs to tab ${cursor.tabId}, not tab ${state.tabId}`);if(cursor.generation!==state.generation)throw new Error("Capture cursor expired because the tab collector was restarted");if(cursor.scope!=="all"&&cursor.scope!==scope)throw new Error(`Capture cursor is scoped to ${cursor.scope}, not ${scope}`);if(cursor.sequence>state.currentSequence)throw new Error("Capture cursor is ahead of the current collector state");return cursor.sequence}function queryCapturedEntries(buffer,state,options,matches,droppedThroughSequence=0,scope="all"){let{after,since,now=Date.now()}=options,limit=Math.max(1,Math.floor(options.limit??100)),afterSequence=resolveAfterSequence(after,state,scope),sinceTimestampMs=since===void 0?void 0:now-since*1e3,matched=buffer.filter(entry=>entry.captureSequence>afterSequence&&(sinceTimestampMs===void 0||entry.timestampMs>=sinceTimestampMs)&&matches(entry)),hasMore=matched.length>limit,entries=after?matched.slice(0,limit):matched.slice(-limit),nextSequence=after&&hasMore&&entries.length>0?entries[entries.length-1].captureSequence:state.currentSequence;return{entries,totalMatched:matched.length,nextCursor:encodeCaptureCursor({tabId:state.tabId,generation:state.generation,sequence:nextSequence,scope}),hasMore,gap:after!==void 0&&afterSequence<droppedThroughSequence}}var CURSOR_PREFIX,init_capture=__esm({"../browser-core/dist/capture.js"(){"use strict";CURSOR_PREFIX="mearl-capture-v1"}});function compileTextPattern(value){try{return{regex:new RegExp(value,"i"),fallback:""}}catch{return{regex:null,fallback:value.toLowerCase()}}}function matchesTextPattern(value,pattern3){return value?pattern3.regex?pattern3.regex.test(value):value.toLowerCase().includes(pattern3.fallback):!1}function compactEventUrl(value){if(value)try{let url2=new URL(value);return url2.origin==="null"?value.split(/[?#]/,1)[0]:`${url2.origin}${url2.pathname}`}catch{return value.split(/[?#]/,1)[0]}}function formatTrackingEvent(event,includeRaw=!1){let{captureSequence:_discardedCaptureSequence,...publicEvent}=event;if(includeRaw)return publicEvent;let{_raw:_discardedRaw,_context,url:url2,...summary}=publicEvent,compactUrl=compactEventUrl(url2??_context.requestUrl);return{...summary,...compactUrl?{url:compactUrl}:{}}}function matchesTrackingEvent(event,options){let{source="all",event_type,filter}=options;if(source!=="all"&&event.source!==source||event_type&&!matchesTextPattern(event.event_type,compileTextPattern(event_type)))return!1;if(filter){let pattern3=compileTextPattern(filter);if(!matchesTextPattern(event.name,pattern3)&&!matchesTextPattern(event.url,pattern3))return!1}return!0}function queryTrackingEvents(buffer,options={}){let{source="all",event_type,filter,since,limit=20,now=Date.now()}=options,events=[...buffer].reverse();if(source!=="all"&&(events=events.filter(event=>event.source===source)),since!==void 0){let sinceTimestamp=now-since*1e3;events=events.filter(event=>event.batchTimestampMs>=sinceTimestamp)}if(event_type){let pattern3=compileTextPattern(event_type);events=events.filter(event=>matchesTextPattern(event.event_type,pattern3))}if(filter){let pattern3=compileTextPattern(filter);events=events.filter(event=>matchesTextPattern(event.name,pattern3)||matchesTextPattern(event.url,pattern3))}return{events:events.slice(0,limit),totalMatched:events.length,totalInBuffer:buffer.length}}function appendCapturedTrackingBatch(buffer,events,maxSize){if(events.length===0)return[];let captureSequence=events[0].captureSequence,insertionIndex=Number.isSafeInteger(captureSequence)?buffer.findIndex(event=>Number.isSafeInteger(event.captureSequence)&&event.captureSequence>captureSequence):-1;if(buffer.splice(insertionIndex<0?buffer.length:insertionIndex,0,...events),buffer.length<=maxSize)return[];let removeCount=buffer.length-maxSize,boundarySequence=buffer[removeCount-1]?.captureSequence;for(;boundarySequence!==void 0&&buffer[removeCount]?.captureSequence===boundarySequence;)removeCount+=1;return buffer.splice(0,removeCount)}function queryCapturedTrackingEvents(buffer,state,options={},droppedThroughSequence=0){let limit=Math.max(1,Math.floor(options.limit??20));if(!options.after){let snapshot=queryTrackingEvents(buffer,options);return{...snapshot,nextCursor:encodeCaptureCursor({tabId:state.tabId,generation:state.generation,sequence:state.currentSequence,scope:"events"}),hasMore:snapshot.totalMatched>limit,gap:!1}}let sinceTimestampMs=options.since===void 0?void 0:(options.now??Date.now())-options.since*1e3,batchesBySequence=new Map;for(let event of buffer){if(!Number.isSafeInteger(event.captureSequence)||sinceTimestampMs!==void 0&&event.batchTimestampMs<sinceTimestampMs||!matchesTrackingEvent(event,options))continue;let captureSequence=event.captureSequence,batch=batchesBySequence.get(captureSequence);batch?batch.events.push(event):batchesBySequence.set(captureSequence,{captureSequence,timestampMs:event.batchTimestampMs,events:[event]})}let batches=[...batchesBySequence.values()].sort((left,right)=>left.captureSequence-right.captureSequence),captured=queryCapturedEntries(batches,state,{after:options.after,limit:Number.MAX_SAFE_INTEGER},()=>!0,droppedThroughSequence,"events"),selected=[],selectedCount=0;for(let batch of captured.entries){if(selected.length>0&&selectedCount+batch.events.length>limit)break;selected.push(batch),selectedCount+=batch.events.length}let hasMore=selected.length<captured.entries.length,nextSequence=hasMore?selected[selected.length-1].captureSequence:state.currentSequence;return{events:selected.flatMap(batch=>batch.events),totalMatched:captured.entries.reduce((total,batch)=>total+batch.events.length,0),totalInBuffer:buffer.length,nextCursor:encodeCaptureCursor({tabId:state.tabId,generation:state.generation,sequence:nextSequence,scope:"events"}),hasMore,gap:captured.gap}}var TRACKING_CAPTURE_ARMED_HINT,init_eventFilters=__esm({"../browser-core/dist/eventFilters.js"(){"use strict";init_capture();TRACKING_CAPTURE_ARMED_HINT="Event capture is active, but this tab has no captured history yet. Reload the current tab or repeat the triggering action, then call get_events again."}});function parsePath(path27){if(path27.length>1e3)throw new Error("Path too long: maximum 1000 characters allowed");let keys=[],current="";for(let i=0;i<path27.length;i++){let char=path27[i];if(char===".")current&&(keys.push(current),current="");else if(char==="["){current&&(keys.push(current),current="");let j=i+1;for(;j<path27.length&&path27[j]!=="]";)j++;if(j<path27.length){let index=parseInt(path27.substring(i+1,j),10);if(!isNaN(index)){if(index<0||index>1e5)throw new Error(`Array index out of safe range: ${index}`);keys.push(index)}i=j}}else current+=char}if(current&&keys.push(current),keys.length>50)throw new Error("Path too deep: maximum 50 levels allowed");return keys}function getValueByPath(obj,path27){let keys=parsePath(path27),current=obj;for(let key of keys){if(current==null)return;current=current[key]}return current}function setValueByPath(obj,path27,value){let keys=parsePath(path27),current=obj;for(let i=0;i<keys.length-1;i++){let key=keys[i],nextKey=keys[i+1];(current[key]===null||current[key]===void 0)&&(current[key]=typeof nextKey=="number"?[]:{}),current=current[key]}current[keys[keys.length-1]]=value}function getStructure(data,maxDepth=5,currentDepth=0){if(currentDepth>=maxDepth)return"<max depth reached>";if(data===null)return"null";if(data===void 0)return"undefined";let type=typeof data;if(type==="string"||type==="number"||type==="boolean")return type;if(Array.isArray(data))return data.length===0?"array[0]":{_type:`array[${data.length}]`,_sample:getStructure(data[0],maxDepth,currentDepth+1)};if(type==="object"){let structure={};for(let key in data)Object.prototype.hasOwnProperty.call(data,key)&&(structure[key]=getStructure(data[key],maxDepth,currentDepth+1));return structure}return type}function truncateData(data,maxSize){let str=JSON.stringify(data);if(str.length<=maxSize)return data;let truncated=str.substring(0,maxSize);return`<truncated: ${str.length} bytes, showing first ${maxSize} chars>
991
- ${truncated}...`}function extractFields(data,fields3){if(fields3.length>100)throw new Error("Too many fields: maximum 100 fields allowed");let result={};for(let fieldPath of fields3)try{result[fieldPath]=getValueByPath(data,fieldPath)}catch(error48){result[fieldPath]=`<error: ${error48 instanceof Error?error48.message:"field not found"}>`}return result}function serializeRequest(request,options={}){let{fields:fields3,includeBody=!fields3?.length,includeHeaders=!1,maxBodySize=5e4,keysOnly=!1}=options,result={id:request.id,timestamp:request.timestamp,timestampMs:request.timestampMs,method:request.method,url:request.url,apiName:request.apiName,status:request.status,statusText:request.statusText,queryString:request.queryString,duration:request.duration,captureSequence:request.captureSequence,isPending:request.isPending,isSSE:request.isSSE,source:request.source,resourceType:request.resourceType};return includeHeaders&&(result.headers=request.headers,result.responseHeaders=request.responseHeaders),keysOnly?(result.postDataStructure=request.postData?getStructure(request.postData):null,result.responseBodyStructure=request.responseBody?getStructure(request.responseBody):null,result):(includeBody&&(result.postData=request.postData==null?request.postData:truncateData(request.postData,maxBodySize),result.responseBody=request.responseBody==null?request.responseBody:truncateData(request.responseBody,maxBodySize)),fields3&&fields3.length>0&&(result.extractedFields=extractFields(request.responseBody,fields3)),result)}var init_requestSerializer=__esm({"../browser-core/dist/requestSerializer.js"(){"use strict"}});function byteLength(value){return textEncoder.encode(value).byteLength}function serializeForStorage(value){if(typeof value=="string")return value;try{return JSON.stringify(value)}catch{return String(value)}}function truncateUtf8(value,maxBytes){if(byteLength(value)<=maxBytes)return value;let low=0,high=Math.min(value.length,maxBytes);for(;low<high;){let middle=Math.ceil((low+high)/2);byteLength(value.slice(0,middle))<=maxBytes?low=middle:high=middle-1}return value.slice(0,low)}function limitBufferedField(value,maxBytes){if(value==null)return value;let serialized=serializeForStorage(value),originalBytes=byteLength(serialized);if(originalBytes<=maxBytes)return value;let marker=`<truncated: ${originalBytes} bytes, buffered preview>
990
+ `?2:1;buffer=buffer.slice(newlineIndex+separatorLength),events.push(...consumeLine(line))}return final&&events.push(...dispatch()),events};return{push(chunk){return buffer+=chunk,drain(!1)},finish(){return drain(!0)}}}var init_sseParser=__esm({"../browser-core/dist/sseParser.js"(){"use strict"}});var require_cjs=__commonJS({"../../node_modules/.pnpm/tldts@7.0.21/node_modules/tldts/dist/cjs/index.js"(exports){"use strict";function shareSameDomainSuffix(hostname3,vhost){return hostname3.endsWith(vhost)?hostname3.length===vhost.length||hostname3[hostname3.length-vhost.length-1]===".":!1}function extractDomainWithSuffix(hostname3,publicSuffix){let publicSuffixIndex=hostname3.length-publicSuffix.length-2,lastDotBeforeSuffixIndex=hostname3.lastIndexOf(".",publicSuffixIndex);return lastDotBeforeSuffixIndex===-1?hostname3:hostname3.slice(lastDotBeforeSuffixIndex+1)}function getDomain$1(suffix,hostname3,options){if(options.validHosts!==null){let validHosts=options.validHosts;for(let vhost of validHosts)if(shareSameDomainSuffix(hostname3,vhost))return vhost}let numberOfLeadingDots=0;if(hostname3.startsWith("."))for(;numberOfLeadingDots<hostname3.length&&hostname3[numberOfLeadingDots]===".";)numberOfLeadingDots+=1;return suffix.length===hostname3.length-numberOfLeadingDots?null:extractDomainWithSuffix(hostname3,suffix)}function getDomainWithoutSuffix$1(domain2,suffix){return domain2.slice(0,-suffix.length-1)}function extractHostname(url2,urlIsValidHostname){let start=0,end=url2.length,hasUpper=!1;if(!urlIsValidHostname){if(url2.startsWith("data:"))return null;for(;start<url2.length&&url2.charCodeAt(start)<=32;)start+=1;for(;end>start+1&&url2.charCodeAt(end-1)<=32;)end-=1;if(url2.charCodeAt(start)===47&&url2.charCodeAt(start+1)===47)start+=2;else{let indexOfProtocol=url2.indexOf(":/",start);if(indexOfProtocol!==-1){let protocolSize=indexOfProtocol-start,c0=url2.charCodeAt(start),c1=url2.charCodeAt(start+1),c2=url2.charCodeAt(start+2),c3=url2.charCodeAt(start+3),c4=url2.charCodeAt(start+4);if(!(protocolSize===5&&c0===104&&c1===116&&c2===116&&c3===112&&c4===115)){if(!(protocolSize===4&&c0===104&&c1===116&&c2===116&&c3===112)){if(!(protocolSize===3&&c0===119&&c1===115&&c2===115)){if(!(protocolSize===2&&c0===119&&c1===115))for(let i=start;i<indexOfProtocol;i+=1){let lowerCaseCode=url2.charCodeAt(i)|32;if(!(lowerCaseCode>=97&&lowerCaseCode<=122||lowerCaseCode>=48&&lowerCaseCode<=57||lowerCaseCode===46||lowerCaseCode===45||lowerCaseCode===43))return null}}}}for(start=indexOfProtocol+2;url2.charCodeAt(start)===47;)start+=1}}let indexOfIdentifier=-1,indexOfClosingBracket=-1,indexOfPort=-1;for(let i=start;i<end;i+=1){let code=url2.charCodeAt(i);if(code===35||code===47||code===63){end=i;break}else code===64?indexOfIdentifier=i:code===93?indexOfClosingBracket=i:code===58?indexOfPort=i:code>=65&&code<=90&&(hasUpper=!0)}if(indexOfIdentifier!==-1&&indexOfIdentifier>start&&indexOfIdentifier<end&&(start=indexOfIdentifier+1),url2.charCodeAt(start)===91)return indexOfClosingBracket!==-1?url2.slice(start+1,indexOfClosingBracket).toLowerCase():null;indexOfPort!==-1&&indexOfPort>start&&indexOfPort<end&&(end=indexOfPort)}for(;end>start+1&&url2.charCodeAt(end-1)===46;)end-=1;let hostname3=start!==0||end!==url2.length?url2.slice(start,end):url2;return hasUpper?hostname3.toLowerCase():hostname3}function isProbablyIpv4(hostname3){if(hostname3.length<7||hostname3.length>15)return!1;let numberOfDots=0;for(let i=0;i<hostname3.length;i+=1){let code=hostname3.charCodeAt(i);if(code===46)numberOfDots+=1;else if(code<48||code>57)return!1}return numberOfDots===3&&hostname3.charCodeAt(0)!==46&&hostname3.charCodeAt(hostname3.length-1)!==46}function isProbablyIpv6(hostname3){if(hostname3.length<3)return!1;let start=hostname3.startsWith("[")?1:0,end=hostname3.length;if(hostname3[end-1]==="]"&&(end-=1),end-start>39)return!1;let hasColon=!1;for(;start<end;start+=1){let code=hostname3.charCodeAt(start);if(code===58)hasColon=!0;else if(!(code>=48&&code<=57||code>=97&&code<=102||code>=65&&code<=90))return!1}return hasColon}function isIp(hostname3){return isProbablyIpv6(hostname3)||isProbablyIpv4(hostname3)}function isValidAscii(code){return code>=97&&code<=122||code>=48&&code<=57||code>127}function isValidHostname(hostname3){if(hostname3.length>255||hostname3.length===0||!isValidAscii(hostname3.charCodeAt(0))&&hostname3.charCodeAt(0)!==46&&hostname3.charCodeAt(0)!==95)return!1;let lastDotIndex=-1,lastCharCode=-1,len=hostname3.length;for(let i=0;i<len;i+=1){let code=hostname3.charCodeAt(i);if(code===46){if(i-lastDotIndex>64||lastCharCode===46||lastCharCode===45||lastCharCode===95)return!1;lastDotIndex=i}else if(!(isValidAscii(code)||code===45||code===95))return!1;lastCharCode=code}return len-lastDotIndex-1<=63&&lastCharCode!==45}function setDefaultsImpl({allowIcannDomains=!0,allowPrivateDomains=!1,detectIp=!0,extractHostname:extractHostname2=!0,mixedInputs=!0,validHosts=null,validateHostname=!0}){return{allowIcannDomains,allowPrivateDomains,detectIp,extractHostname:extractHostname2,mixedInputs,validHosts,validateHostname}}var DEFAULT_OPTIONS=setDefaultsImpl({});function setDefaults(options){return options===void 0?DEFAULT_OPTIONS:setDefaultsImpl(options)}function getSubdomain$1(hostname3,domain2){return domain2.length===hostname3.length?"":hostname3.slice(0,-domain2.length-1)}function getEmptyResult(){return{domain:null,domainWithoutSuffix:null,hostname:null,isIcann:null,isIp:null,isPrivate:null,publicSuffix:null,subdomain:null}}function resetResult(result){result.domain=null,result.domainWithoutSuffix=null,result.hostname=null,result.isIcann=null,result.isIp=null,result.isPrivate=null,result.publicSuffix=null,result.subdomain=null}function parseImpl(url2,step,suffixLookup2,partialOptions,result){let options=setDefaults(partialOptions);return typeof url2!="string"||(options.extractHostname?options.mixedInputs?result.hostname=extractHostname(url2,isValidHostname(url2)):result.hostname=extractHostname(url2,!1):result.hostname=url2,options.detectIp&&result.hostname!==null&&(result.isIp=isIp(result.hostname),result.isIp))?result:options.validateHostname&&options.extractHostname&&result.hostname!==null&&!isValidHostname(result.hostname)?(result.hostname=null,result):(step===0||result.hostname===null||(suffixLookup2(result.hostname,options,result),step===2||result.publicSuffix===null)||(result.domain=getDomain$1(result.publicSuffix,result.hostname,options),step===3||result.domain===null)||(result.subdomain=getSubdomain$1(result.hostname,result.domain),step===4)||(result.domainWithoutSuffix=getDomainWithoutSuffix$1(result.domain,result.publicSuffix)),result)}function fastPathLookup(hostname3,options,out){if(!options.allowPrivateDomains&&hostname3.length>3){let last=hostname3.length-1,c3=hostname3.charCodeAt(last),c2=hostname3.charCodeAt(last-1),c1=hostname3.charCodeAt(last-2),c0=hostname3.charCodeAt(last-3);if(c3===109&&c2===111&&c1===99&&c0===46)return out.isIcann=!0,out.isPrivate=!1,out.publicSuffix="com",!0;if(c3===103&&c2===114&&c1===111&&c0===46)return out.isIcann=!0,out.isPrivate=!1,out.publicSuffix="org",!0;if(c3===117&&c2===100&&c1===101&&c0===46)return out.isIcann=!0,out.isPrivate=!1,out.publicSuffix="edu",!0;if(c3===118&&c2===111&&c1===103&&c0===46)return out.isIcann=!0,out.isPrivate=!1,out.publicSuffix="gov",!0;if(c3===116&&c2===101&&c1===110&&c0===46)return out.isIcann=!0,out.isPrivate=!1,out.publicSuffix="net",!0;if(c3===101&&c2===100&&c1===46)return out.isIcann=!0,out.isPrivate=!1,out.publicSuffix="de",!0}return!1}var exceptions=(function(){let _0=[1,{}],_1=[0,{city:_0}];return[0,{ck:[0,{www:_0}],jp:[0,{kawasaki:_1,kitakyushu:_1,kobe:_1,nagoya:_1,sapporo:_1,sendai:_1,yokohama:_1}]}]})(),rules=(function(){let _2=[1,{}],_3=[2,{}],_4=[1,{com:_2,edu:_2,gov:_2,net:_2,org:_2}],_5=[1,{com:_2,edu:_2,gov:_2,mil:_2,net:_2,org:_2}],_6=[0,{"*":_3}],_7=[2,{s:_6}],_8=[0,{relay:_3}],_9=[2,{id:_3}],_10=[1,{gov:_2}],_11=[0,{airflow:_6,"lambda-url":_3,"transfer-webapp":_3}],_12=[0,{airflow:_6,"transfer-webapp":_3}],_13=[0,{"transfer-webapp":_3}],_14=[0,{"transfer-webapp":_3,"transfer-webapp-fips":_3}],_15=[0,{notebook:_3,studio:_3}],_16=[0,{labeling:_3,notebook:_3,studio:_3}],_17=[0,{notebook:_3}],_18=[0,{labeling:_3,notebook:_3,"notebook-fips":_3,studio:_3}],_19=[0,{notebook:_3,"notebook-fips":_3,studio:_3,"studio-fips":_3}],_20=[0,{shop:_3}],_21=[0,{"*":_2}],_22=[1,{co:_3}],_23=[0,{objects:_3}],_24=[2,{nodes:_3}],_25=[0,{my:_3}],_26=[0,{s3:_3,"s3-accesspoint":_3,"s3-website":_3}],_27=[0,{s3:_3,"s3-accesspoint":_3}],_28=[0,{direct:_3}],_29=[0,{"webview-assets":_3}],_30=[0,{vfs:_3,"webview-assets":_3}],_31=[0,{"execute-api":_3,"emrappui-prod":_3,"emrnotebooks-prod":_3,"emrstudio-prod":_3,dualstack:_26,s3:_3,"s3-accesspoint":_3,"s3-object-lambda":_3,"s3-website":_3,"aws-cloud9":_29,cloud9:_30}],_32=[0,{"execute-api":_3,"emrappui-prod":_3,"emrnotebooks-prod":_3,"emrstudio-prod":_3,dualstack:_27,s3:_3,"s3-accesspoint":_3,"s3-object-lambda":_3,"s3-website":_3,"aws-cloud9":_29,cloud9:_30}],_33=[0,{"execute-api":_3,"emrappui-prod":_3,"emrnotebooks-prod":_3,"emrstudio-prod":_3,dualstack:_26,s3:_3,"s3-accesspoint":_3,"s3-object-lambda":_3,"s3-website":_3,"analytics-gateway":_3,"aws-cloud9":_29,cloud9:_30}],_34=[0,{"execute-api":_3,"emrappui-prod":_3,"emrnotebooks-prod":_3,"emrstudio-prod":_3,dualstack:_26,s3:_3,"s3-accesspoint":_3,"s3-object-lambda":_3,"s3-website":_3}],_35=[0,{s3:_3,"s3-accesspoint":_3,"s3-accesspoint-fips":_3,"s3-fips":_3,"s3-website":_3}],_36=[0,{"execute-api":_3,"emrappui-prod":_3,"emrnotebooks-prod":_3,"emrstudio-prod":_3,dualstack:_35,s3:_3,"s3-accesspoint":_3,"s3-accesspoint-fips":_3,"s3-fips":_3,"s3-object-lambda":_3,"s3-website":_3,"aws-cloud9":_29,cloud9:_30}],_37=[0,{"execute-api":_3,"emrappui-prod":_3,"emrnotebooks-prod":_3,"emrstudio-prod":_3,dualstack:_35,s3:_3,"s3-accesspoint":_3,"s3-accesspoint-fips":_3,"s3-fips":_3,"s3-object-lambda":_3,"s3-website":_3}],_38=[0,{"execute-api":_3,"emrappui-prod":_3,"emrnotebooks-prod":_3,"emrstudio-prod":_3,dualstack:_35,s3:_3,"s3-accesspoint":_3,"s3-accesspoint-fips":_3,"s3-deprecated":_3,"s3-fips":_3,"s3-object-lambda":_3,"s3-website":_3,"analytics-gateway":_3,"aws-cloud9":_29,cloud9:_30}],_39=[0,{auth:_3}],_40=[0,{auth:_3,"auth-fips":_3}],_41=[0,{"auth-fips":_3}],_42=[0,{apps:_3}],_43=[0,{paas:_3}],_44=[2,{eu:_3}],_45=[0,{app:_3}],_46=[0,{site:_3}],_47=[1,{com:_2,edu:_2,net:_2,org:_2}],_48=[0,{j:_3}],_49=[0,{dyn:_3}],_50=[2,{web:_3}],_51=[1,{discourse:_3}],_52=[1,{co:_2,com:_2,edu:_2,gov:_2,net:_2,org:_2}],_53=[0,{p:_3}],_54=[0,{user:_3}],_55=[0,{cdn:_3}],_56=[2,{raw:_6}],_57=[0,{cust:_3,reservd:_3}],_58=[0,{cust:_3}],_59=[0,{s3:_3}],_60=[1,{biz:_2,com:_2,edu:_2,gov:_2,info:_2,net:_2,org:_2}],_61=[0,{ipfs:_3}],_62=[1,{framer:_3}],_63=[0,{forgot:_3}],_64=[1,{gs:_2}],_65=[0,{nes:_2}],_66=[1,{k12:_2,cc:_2,lib:_2}],_67=[1,{cc:_2}],_68=[1,{cc:_2,lib:_2}];return[0,{ac:[1,{com:_2,edu:_2,gov:_2,mil:_2,net:_2,org:_2,drr:_3,feedback:_3,forms:_3}],ad:_2,ae:[1,{ac:_2,co:_2,gov:_2,mil:_2,net:_2,org:_2,sch:_2}],aero:[1,{airline:_2,airport:_2,"accident-investigation":_2,"accident-prevention":_2,aerobatic:_2,aeroclub:_2,aerodrome:_2,agents:_2,"air-surveillance":_2,"air-traffic-control":_2,aircraft:_2,airtraffic:_2,ambulance:_2,association:_2,author:_2,ballooning:_2,broker:_2,caa:_2,cargo:_2,catering:_2,certification:_2,championship:_2,charter:_2,civilaviation:_2,club:_2,conference:_2,consultant:_2,consulting:_2,control:_2,council:_2,crew:_2,design:_2,dgca:_2,educator:_2,emergency:_2,engine:_2,engineer:_2,entertainment:_2,equipment:_2,exchange:_2,express:_2,federation:_2,flight:_2,freight:_2,fuel:_2,gliding:_2,government:_2,groundhandling:_2,group:_2,hanggliding:_2,homebuilt:_2,insurance:_2,journal:_2,journalist:_2,leasing:_2,logistics:_2,magazine:_2,maintenance:_2,marketplace:_2,media:_2,microlight:_2,modelling:_2,navigation:_2,parachuting:_2,paragliding:_2,"passenger-association":_2,pilot:_2,press:_2,production:_2,recreation:_2,repbody:_2,res:_2,research:_2,rotorcraft:_2,safety:_2,scientist:_2,services:_2,show:_2,skydiving:_2,software:_2,student:_2,taxi:_2,trader:_2,trading:_2,trainer:_2,union:_2,workinggroup:_2,works:_2}],af:_4,ag:[1,{co:_2,com:_2,net:_2,nom:_2,org:_2,obj:_3}],ai:[1,{com:_2,net:_2,off:_2,org:_2,uwu:_3,framer:_3,kiloapps:_3}],al:_5,am:[1,{co:_2,com:_2,commune:_2,net:_2,org:_2,radio:_3}],ao:[1,{co:_2,ed:_2,edu:_2,gov:_2,gv:_2,it:_2,og:_2,org:_2,pb:_2}],aq:_2,ar:[1,{bet:_2,com:_2,coop:_2,edu:_2,gob:_2,gov:_2,int:_2,mil:_2,musica:_2,mutual:_2,net:_2,org:_2,seg:_2,senasa:_2,tur:_2}],arpa:[1,{e164:_2,home:_2,"in-addr":_2,ip6:_2,iris:_2,uri:_2,urn:_2}],as:_10,asia:[1,{cloudns:_3,daemon:_3,dix:_3}],at:[1,{4:_3,ac:[1,{sth:_2}],co:_2,gv:_2,or:_2,funkfeuer:[0,{wien:_3}],futurecms:[0,{"*":_3,ex:_6,in:_6}],futurehosting:_3,futuremailing:_3,ortsinfo:[0,{ex:_6,kunden:_6}],biz:_3,info:_3,"123webseite":_3,priv:_3,my:_3,myspreadshop:_3,"12hp":_3,"2ix":_3,"4lima":_3,"lima-city":_3}],au:[1,{asn:_2,com:[1,{cloudlets:[0,{mel:_3}],myspreadshop:_3}],edu:[1,{act:_2,catholic:_2,nsw:_2,nt:_2,qld:_2,sa:_2,tas:_2,vic:_2,wa:_2}],gov:[1,{qld:_2,sa:_2,tas:_2,vic:_2,wa:_2}],id:_2,net:_2,org:_2,conf:_2,oz:_2,act:_2,nsw:_2,nt:_2,qld:_2,sa:_2,tas:_2,vic:_2,wa:_2,hrsn:[0,{vps:_3}]}],aw:[1,{com:_2}],ax:_2,az:[1,{biz:_2,co:_2,com:_2,edu:_2,gov:_2,info:_2,int:_2,mil:_2,name:_2,net:_2,org:_2,pp:_2,pro:_2}],ba:[1,{com:_2,edu:_2,gov:_2,mil:_2,net:_2,org:_2,brendly:_20,rs:_3}],bb:[1,{biz:_2,co:_2,com:_2,edu:_2,gov:_2,info:_2,net:_2,org:_2,store:_2,tv:_2}],bd:[1,{ac:_2,ai:_2,co:_2,com:_2,edu:_2,gov:_2,id:_2,info:_2,it:_2,mil:_2,net:_2,org:_2,sch:_2,tv:_2}],be:[1,{ac:_2,cloudns:_3,webhosting:_3,interhostsolutions:[0,{cloud:_3}],kuleuven:[0,{ezproxy:_3}],"123website":_3,myspreadshop:_3,transurl:_6}],bf:_10,bg:[1,{0:_2,1:_2,2:_2,3:_2,4:_2,5:_2,6:_2,7:_2,8:_2,9:_2,a:_2,b:_2,c:_2,d:_2,e:_2,f:_2,g:_2,h:_2,i:_2,j:_2,k:_2,l:_2,m:_2,n:_2,o:_2,p:_2,q:_2,r:_2,s:_2,t:_2,u:_2,v:_2,w:_2,x:_2,y:_2,z:_2,barsy:_3}],bh:_4,bi:[1,{co:_2,com:_2,edu:_2,or:_2,org:_2}],biz:[1,{activetrail:_3,"cloud-ip":_3,cloudns:_3,jozi:_3,dyndns:_3,"for-better":_3,"for-more":_3,"for-some":_3,"for-the":_3,selfip:_3,webhop:_3,orx:_3,mmafan:_3,myftp:_3,"no-ip":_3,dscloud:_3}],bj:[1,{africa:_2,agro:_2,architectes:_2,assur:_2,avocats:_2,co:_2,com:_2,eco:_2,econo:_2,edu:_2,info:_2,loisirs:_2,money:_2,net:_2,org:_2,ote:_2,restaurant:_2,resto:_2,tourism:_2,univ:_2}],bm:_4,bn:[1,{com:_2,edu:_2,gov:_2,net:_2,org:_2,co:_3}],bo:[1,{com:_2,edu:_2,gob:_2,int:_2,mil:_2,net:_2,org:_2,tv:_2,web:_2,academia:_2,agro:_2,arte:_2,blog:_2,bolivia:_2,ciencia:_2,cooperativa:_2,democracia:_2,deporte:_2,ecologia:_2,economia:_2,empresa:_2,indigena:_2,industria:_2,info:_2,medicina:_2,movimiento:_2,musica:_2,natural:_2,nombre:_2,noticias:_2,patria:_2,plurinacional:_2,politica:_2,profesional:_2,pueblo:_2,revista:_2,salud:_2,tecnologia:_2,tksat:_2,transporte:_2,wiki:_2}],br:[1,{"9guacu":_2,abc:_2,adm:_2,adv:_2,agr:_2,aju:_2,am:_2,anani:_2,aparecida:_2,api:_2,app:_2,arq:_2,art:_2,ato:_2,b:_2,barueri:_2,belem:_2,bet:_2,bhz:_2,bib:_2,bio:_2,blog:_2,bmd:_2,boavista:_2,bsb:_2,campinagrande:_2,campinas:_2,caxias:_2,cim:_2,cng:_2,cnt:_2,com:[1,{simplesite:_3}],contagem:_2,coop:_2,coz:_2,cri:_2,cuiaba:_2,curitiba:_2,def:_2,des:_2,det:_2,dev:_2,ecn:_2,eco:_2,edu:_2,emp:_2,enf:_2,eng:_2,esp:_2,etc:_2,eti:_2,far:_2,feira:_2,flog:_2,floripa:_2,fm:_2,fnd:_2,fortal:_2,fot:_2,foz:_2,fst:_2,g12:_2,geo:_2,ggf:_2,goiania:_2,gov:[1,{ac:_2,al:_2,am:_2,ap:_2,ba:_2,ce:_2,df:_2,es:_2,go:_2,ma:_2,mg:_2,ms:_2,mt:_2,pa:_2,pb:_2,pe:_2,pi:_2,pr:_2,rj:_2,rn:_2,ro:_2,rr:_2,rs:_2,sc:_2,se:_2,sp:_2,to:_2}],gru:_2,ia:_2,imb:_2,ind:_2,inf:_2,jab:_2,jampa:_2,jdf:_2,joinville:_2,jor:_2,jus:_2,leg:[1,{ac:_3,al:_3,am:_3,ap:_3,ba:_3,ce:_3,df:_3,es:_3,go:_3,ma:_3,mg:_3,ms:_3,mt:_3,pa:_3,pb:_3,pe:_3,pi:_3,pr:_3,rj:_3,rn:_3,ro:_3,rr:_3,rs:_3,sc:_3,se:_3,sp:_3,to:_3}],leilao:_2,lel:_2,log:_2,londrina:_2,macapa:_2,maceio:_2,manaus:_2,maringa:_2,mat:_2,med:_2,mil:_2,morena:_2,mp:_2,mus:_2,natal:_2,net:_2,niteroi:_2,nom:_21,not:_2,ntr:_2,odo:_2,ong:_2,org:_2,osasco:_2,palmas:_2,poa:_2,ppg:_2,pro:_2,psc:_2,psi:_2,pvh:_2,qsl:_2,radio:_2,rec:_2,recife:_2,rep:_2,ribeirao:_2,rio:_2,riobranco:_2,riopreto:_2,salvador:_2,sampa:_2,santamaria:_2,santoandre:_2,saobernardo:_2,saogonca:_2,seg:_2,sjc:_2,slg:_2,slz:_2,social:_2,sorocaba:_2,srv:_2,taxi:_2,tc:_2,tec:_2,teo:_2,the:_2,tmp:_2,trd:_2,tur:_2,tv:_2,udi:_2,vet:_2,vix:_2,vlog:_2,wiki:_2,xyz:_2,zlg:_2,tche:_3}],bs:[1,{com:_2,edu:_2,gov:_2,net:_2,org:_2,we:_3}],bt:_4,bv:_2,bw:[1,{ac:_2,co:_2,gov:_2,net:_2,org:_2}],by:[1,{gov:_2,mil:_2,com:_2,of:_2,mediatech:_3}],bz:[1,{co:_2,com:_2,edu:_2,gov:_2,net:_2,org:_2,za:_3,mydns:_3,gsj:_3}],ca:[1,{ab:_2,bc:_2,mb:_2,nb:_2,nf:_2,nl:_2,ns:_2,nt:_2,nu:_2,on:_2,pe:_2,qc:_2,sk:_2,yk:_2,gc:_2,barsy:_3,awdev:_6,co:_3,"no-ip":_3,onid:_3,myspreadshop:_3,box:_3}],cat:_2,cc:[1,{cleverapps:_3,"cloud-ip":_3,cloudns:_3,ccwu:_3,ftpaccess:_3,"game-server":_3,myphotos:_3,scrapping:_3,twmail:_3,csx:_3,fantasyleague:_3,spawn:[0,{instances:_3}],ec:_3,eu:_3,gu:_3,uk:_3,us:_3}],cd:[1,{gov:_2,cc:_3}],cf:_2,cg:_2,ch:[1,{square7:_3,cloudns:_3,cloudscale:[0,{cust:_3,lpg:_23,rma:_23}],objectstorage:[0,{lpg:_3,rma:_3}],flow:[0,{ae:[0,{alp1:_3}],appengine:_3}],"linkyard-cloud":_3,gotdns:_3,dnsking:_3,"123website":_3,myspreadshop:_3,firenet:[0,{"*":_3,svc:_6}],"12hp":_3,"2ix":_3,"4lima":_3,"lima-city":_3}],ci:[1,{ac:_2,"xn--aroport-bya":_2,aéroport:_2,asso:_2,co:_2,com:_2,ed:_2,edu:_2,go:_2,gouv:_2,int:_2,net:_2,or:_2,org:_2,us:_3}],ck:_21,cl:[1,{co:_2,gob:_2,gov:_2,mil:_2,cloudns:_3}],cm:[1,{co:_2,com:_2,gov:_2,net:_2}],cn:[1,{ac:_2,com:[1,{amazonaws:[0,{"cn-north-1":[0,{"execute-api":_3,"emrappui-prod":_3,"emrnotebooks-prod":_3,"emrstudio-prod":_3,rds:_6,dualstack:_26,s3:_3,"s3-accesspoint":_3,"s3-deprecated":_3,"s3-object-lambda":_3,"s3-website":_3}],"cn-northwest-1":[0,{"execute-api":_3,"emrappui-prod":_3,"emrnotebooks-prod":_3,"emrstudio-prod":_3,rds:_6,dualstack:_27,s3:_3,"s3-accesspoint":_3,"s3-object-lambda":_3,"s3-website":_3}],compute:_6,airflow:[0,{"cn-north-1":_6,"cn-northwest-1":_6}],eb:[0,{"cn-north-1":_3,"cn-northwest-1":_3}],elb:_6}],amazonwebservices:[0,{on:[0,{"cn-north-1":_12,"cn-northwest-1":_12}]}],sagemaker:[0,{"cn-north-1":_15,"cn-northwest-1":_15}]}],edu:_2,gov:_2,mil:_2,net:_2,org:_2,"xn--55qx5d":_2,公司:_2,"xn--od0alg":_2,網絡:_2,"xn--io0a7i":_2,网络:_2,ah:_2,bj:_2,cq:_2,fj:_2,gd:_2,gs:_2,gx:_2,gz:_2,ha:_2,hb:_2,he:_2,hi:_2,hk:_2,hl:_2,hn:_2,jl:_2,js:_2,jx:_2,ln:_2,mo:_2,nm:_2,nx:_2,qh:_2,sc:_2,sd:_2,sh:[1,{as:_3}],sn:_2,sx:_2,tj:_2,tw:_2,xj:_2,xz:_2,yn:_2,zj:_2,"canva-apps":_3,canvasite:_25,myqnapcloud:_3,quickconnect:_28}],co:[1,{com:_2,edu:_2,gov:_2,mil:_2,net:_2,nom:_2,org:_2,carrd:_3,crd:_3,otap:_6,hidns:_3,leadpages:_3,lpages:_3,mypi:_3,xmit:_6,rdpa:[0,{clusters:_6,srvrless:_6}],firewalledreplit:_9,repl:_9,supabase:[2,{realtime:_3,storage:_3}],umso:_3}],com:[1,{a2hosted:_3,cpserver:_3,adobeaemcloud:[2,{dev:_6}],africa:_3,auiusercontent:_6,aivencloud:_3,alibabacloudcs:_3,kasserver:_3,amazonaws:[0,{"af-south-1":_31,"ap-east-1":_32,"ap-northeast-1":_33,"ap-northeast-2":_33,"ap-northeast-3":_31,"ap-south-1":_33,"ap-south-2":_34,"ap-southeast-1":_33,"ap-southeast-2":_33,"ap-southeast-3":_34,"ap-southeast-4":_34,"ap-southeast-5":[0,{"execute-api":_3,dualstack:_26,s3:_3,"s3-accesspoint":_3,"s3-deprecated":_3,"s3-object-lambda":_3,"s3-website":_3}],"ca-central-1":_36,"ca-west-1":_37,"eu-central-1":_33,"eu-central-2":_34,"eu-north-1":_32,"eu-south-1":_31,"eu-south-2":_34,"eu-west-1":[0,{"execute-api":_3,"emrappui-prod":_3,"emrnotebooks-prod":_3,"emrstudio-prod":_3,dualstack:_26,s3:_3,"s3-accesspoint":_3,"s3-deprecated":_3,"s3-object-lambda":_3,"s3-website":_3,"analytics-gateway":_3,"aws-cloud9":_29,cloud9:_30}],"eu-west-2":_32,"eu-west-3":_31,"il-central-1":[0,{"execute-api":_3,"emrappui-prod":_3,"emrnotebooks-prod":_3,"emrstudio-prod":_3,dualstack:_26,s3:_3,"s3-accesspoint":_3,"s3-object-lambda":_3,"s3-website":_3,"aws-cloud9":_29,cloud9:[0,{vfs:_3}]}],"me-central-1":_34,"me-south-1":_32,"sa-east-1":_31,"us-east-1":[2,{"execute-api":_3,"emrappui-prod":_3,"emrnotebooks-prod":_3,"emrstudio-prod":_3,dualstack:_35,s3:_3,"s3-accesspoint":_3,"s3-accesspoint-fips":_3,"s3-deprecated":_3,"s3-fips":_3,"s3-object-lambda":_3,"s3-website":_3,"analytics-gateway":_3,"aws-cloud9":_29,cloud9:_30}],"us-east-2":_38,"us-gov-east-1":_37,"us-gov-west-1":_37,"us-west-1":_36,"us-west-2":_38,compute:_6,"compute-1":_6,airflow:[0,{"af-south-1":_6,"ap-east-1":_6,"ap-northeast-1":_6,"ap-northeast-2":_6,"ap-northeast-3":_6,"ap-south-1":_6,"ap-south-2":_6,"ap-southeast-1":_6,"ap-southeast-2":_6,"ap-southeast-3":_6,"ap-southeast-4":_6,"ap-southeast-5":_6,"ap-southeast-7":_6,"ca-central-1":_6,"ca-west-1":_6,"eu-central-1":_6,"eu-central-2":_6,"eu-north-1":_6,"eu-south-1":_6,"eu-south-2":_6,"eu-west-1":_6,"eu-west-2":_6,"eu-west-3":_6,"il-central-1":_6,"me-central-1":_6,"me-south-1":_6,"sa-east-1":_6,"us-east-1":_6,"us-east-2":_6,"us-west-1":_6,"us-west-2":_6}],rds:[0,{"af-south-1":_6,"ap-east-1":_6,"ap-east-2":_6,"ap-northeast-1":_6,"ap-northeast-2":_6,"ap-northeast-3":_6,"ap-south-1":_6,"ap-south-2":_6,"ap-southeast-1":_6,"ap-southeast-2":_6,"ap-southeast-3":_6,"ap-southeast-4":_6,"ap-southeast-5":_6,"ap-southeast-6":_6,"ap-southeast-7":_6,"ca-central-1":_6,"ca-west-1":_6,"eu-central-1":_6,"eu-central-2":_6,"eu-west-1":_6,"eu-west-2":_6,"eu-west-3":_6,"il-central-1":_6,"me-central-1":_6,"me-south-1":_6,"mx-central-1":_6,"sa-east-1":_6,"us-east-1":_6,"us-east-2":_6,"us-gov-east-1":_6,"us-gov-west-1":_6,"us-northeast-1":_6,"us-west-1":_6,"us-west-2":_6}],s3:_3,"s3-1":_3,"s3-ap-east-1":_3,"s3-ap-northeast-1":_3,"s3-ap-northeast-2":_3,"s3-ap-northeast-3":_3,"s3-ap-south-1":_3,"s3-ap-southeast-1":_3,"s3-ap-southeast-2":_3,"s3-ca-central-1":_3,"s3-eu-central-1":_3,"s3-eu-north-1":_3,"s3-eu-west-1":_3,"s3-eu-west-2":_3,"s3-eu-west-3":_3,"s3-external-1":_3,"s3-fips-us-gov-east-1":_3,"s3-fips-us-gov-west-1":_3,"s3-global":[0,{accesspoint:[0,{mrap:_3}]}],"s3-me-south-1":_3,"s3-sa-east-1":_3,"s3-us-east-2":_3,"s3-us-gov-east-1":_3,"s3-us-gov-west-1":_3,"s3-us-west-1":_3,"s3-us-west-2":_3,"s3-website-ap-northeast-1":_3,"s3-website-ap-southeast-1":_3,"s3-website-ap-southeast-2":_3,"s3-website-eu-west-1":_3,"s3-website-sa-east-1":_3,"s3-website-us-east-1":_3,"s3-website-us-gov-west-1":_3,"s3-website-us-west-1":_3,"s3-website-us-west-2":_3,elb:_6}],amazoncognito:[0,{"af-south-1":_39,"ap-east-1":_39,"ap-northeast-1":_39,"ap-northeast-2":_39,"ap-northeast-3":_39,"ap-south-1":_39,"ap-south-2":_39,"ap-southeast-1":_39,"ap-southeast-2":_39,"ap-southeast-3":_39,"ap-southeast-4":_39,"ap-southeast-5":_39,"ap-southeast-7":_39,"ca-central-1":_39,"ca-west-1":_39,"eu-central-1":_39,"eu-central-2":_39,"eu-north-1":_39,"eu-south-1":_39,"eu-south-2":_39,"eu-west-1":_39,"eu-west-2":_39,"eu-west-3":_39,"il-central-1":_39,"me-central-1":_39,"me-south-1":_39,"mx-central-1":_39,"sa-east-1":_39,"us-east-1":_40,"us-east-2":_40,"us-gov-east-1":_41,"us-gov-west-1":_41,"us-west-1":_40,"us-west-2":_40}],amplifyapp:_3,awsapprunner:_6,awsapps:_3,elasticbeanstalk:[2,{"af-south-1":_3,"ap-east-1":_3,"ap-northeast-1":_3,"ap-northeast-2":_3,"ap-northeast-3":_3,"ap-south-1":_3,"ap-southeast-1":_3,"ap-southeast-2":_3,"ap-southeast-3":_3,"ap-southeast-5":_3,"ap-southeast-7":_3,"ca-central-1":_3,"eu-central-1":_3,"eu-north-1":_3,"eu-south-1":_3,"eu-south-2":_3,"eu-west-1":_3,"eu-west-2":_3,"eu-west-3":_3,"il-central-1":_3,"me-central-1":_3,"me-south-1":_3,"sa-east-1":_3,"us-east-1":_3,"us-east-2":_3,"us-gov-east-1":_3,"us-gov-west-1":_3,"us-west-1":_3,"us-west-2":_3}],awsglobalaccelerator:_3,siiites:_3,appspacehosted:_3,appspaceusercontent:_3,"on-aptible":_3,myasustor:_3,"balena-devices":_3,boutir:_3,bplaced:_3,cafjs:_3,"canva-apps":_3,"canva-hosted-embed":_3,canvacode:_3,"rice-labs":_3,"cdn77-storage":_3,br:_3,cn:_3,de:_3,eu:_3,jpn:_3,mex:_3,ru:_3,sa:_3,uk:_3,us:_3,za:_3,"clever-cloud":[0,{services:_6}],abrdns:_3,dnsabr:_3,"ip-ddns":_3,jdevcloud:_3,wpdevcloud:_3,"cf-ipfs":_3,"cloudflare-ipfs":_3,trycloudflare:_3,co:_3,devinapps:_6,builtwithdark:_3,datadetect:[0,{demo:_3,instance:_3}],dattolocal:_3,dattorelay:_3,dattoweb:_3,mydatto:_3,digitaloceanspaces:_6,discordsays:_3,discordsez:_3,drayddns:_3,dreamhosters:_3,durumis:_3,blogdns:_3,cechire:_3,dnsalias:_3,dnsdojo:_3,doesntexist:_3,dontexist:_3,doomdns:_3,"dyn-o-saur":_3,dynalias:_3,"dyndns-at-home":_3,"dyndns-at-work":_3,"dyndns-blog":_3,"dyndns-free":_3,"dyndns-home":_3,"dyndns-ip":_3,"dyndns-mail":_3,"dyndns-office":_3,"dyndns-pics":_3,"dyndns-remote":_3,"dyndns-server":_3,"dyndns-web":_3,"dyndns-wiki":_3,"dyndns-work":_3,"est-a-la-maison":_3,"est-a-la-masion":_3,"est-le-patron":_3,"est-mon-blogueur":_3,"from-ak":_3,"from-al":_3,"from-ar":_3,"from-ca":_3,"from-ct":_3,"from-dc":_3,"from-de":_3,"from-fl":_3,"from-ga":_3,"from-hi":_3,"from-ia":_3,"from-id":_3,"from-il":_3,"from-in":_3,"from-ks":_3,"from-ky":_3,"from-ma":_3,"from-md":_3,"from-mi":_3,"from-mn":_3,"from-mo":_3,"from-ms":_3,"from-mt":_3,"from-nc":_3,"from-nd":_3,"from-ne":_3,"from-nh":_3,"from-nj":_3,"from-nm":_3,"from-nv":_3,"from-oh":_3,"from-ok":_3,"from-or":_3,"from-pa":_3,"from-pr":_3,"from-ri":_3,"from-sc":_3,"from-sd":_3,"from-tn":_3,"from-tx":_3,"from-ut":_3,"from-va":_3,"from-vt":_3,"from-wa":_3,"from-wi":_3,"from-wv":_3,"from-wy":_3,getmyip:_3,gotdns:_3,"hobby-site":_3,homelinux:_3,homeunix:_3,iamallama:_3,"is-a-anarchist":_3,"is-a-blogger":_3,"is-a-bookkeeper":_3,"is-a-bulls-fan":_3,"is-a-caterer":_3,"is-a-chef":_3,"is-a-conservative":_3,"is-a-cpa":_3,"is-a-cubicle-slave":_3,"is-a-democrat":_3,"is-a-designer":_3,"is-a-doctor":_3,"is-a-financialadvisor":_3,"is-a-geek":_3,"is-a-green":_3,"is-a-guru":_3,"is-a-hard-worker":_3,"is-a-hunter":_3,"is-a-landscaper":_3,"is-a-lawyer":_3,"is-a-liberal":_3,"is-a-libertarian":_3,"is-a-llama":_3,"is-a-musician":_3,"is-a-nascarfan":_3,"is-a-nurse":_3,"is-a-painter":_3,"is-a-personaltrainer":_3,"is-a-photographer":_3,"is-a-player":_3,"is-a-republican":_3,"is-a-rockstar":_3,"is-a-socialist":_3,"is-a-student":_3,"is-a-teacher":_3,"is-a-techie":_3,"is-a-therapist":_3,"is-an-accountant":_3,"is-an-actor":_3,"is-an-actress":_3,"is-an-anarchist":_3,"is-an-artist":_3,"is-an-engineer":_3,"is-an-entertainer":_3,"is-certified":_3,"is-gone":_3,"is-into-anime":_3,"is-into-cars":_3,"is-into-cartoons":_3,"is-into-games":_3,"is-leet":_3,"is-not-certified":_3,"is-slick":_3,"is-uberleet":_3,"is-with-theband":_3,"isa-geek":_3,"isa-hockeynut":_3,issmarterthanyou:_3,"likes-pie":_3,likescandy:_3,"neat-url":_3,"saves-the-whales":_3,selfip:_3,"sells-for-less":_3,"sells-for-u":_3,servebbs:_3,"simple-url":_3,"space-to-rent":_3,"teaches-yoga":_3,writesthisblog:_3,ddnsfree:_3,ddnsgeek:_3,giize:_3,gleeze:_3,kozow:_3,loseyourip:_3,ooguy:_3,theworkpc:_3,emergentagent:[0,{preview:_3}],mytuleap:_3,"tuleap-partners":_3,encoreapi:_3,evennode:[0,{"eu-1":_3,"eu-2":_3,"eu-3":_3,"eu-4":_3,"us-1":_3,"us-2":_3,"us-3":_3,"us-4":_3}],onfabrica:_3,"fastly-edge":_3,"fastly-terrarium":_3,"fastvps-server":_3,mydobiss:_3,firebaseapp:_3,fldrv:_3,framercanvas:_3,"freebox-os":_3,freeboxos:_3,freemyip:_3,aliases121:_3,gentapps:_3,gentlentapis:_3,githubusercontent:_3,"0emm":_6,appspot:[2,{r:_6}],blogspot:_3,codespot:_3,googleapis:_3,googlecode:_3,pagespeedmobilizer:_3,withgoogle:_3,withyoutube:_3,grayjayleagues:_3,hatenablog:_3,hatenadiary:_3,"hercules-app":_3,"hercules-dev":_3,herokuapp:_3,gr:_3,smushcdn:_3,wphostedmail:_3,wpmucdn:_3,pixolino:_3,"apps-1and1":_3,"live-website":_3,"webspace-host":_3,dopaas:_3,"hosted-by-previder":_43,hosteur:[0,{"rag-cloud":_3,"rag-cloud-ch":_3}],"ik-server":[0,{jcloud:_3,"jcloud-ver-jpc":_3}],jelastic:[0,{demo:_3}],massivegrid:_43,wafaicloud:[0,{jed:_3,ryd:_3}],"eu1-plenit":_3,"la1-plenit":_3,"us1-plenit":_3,webadorsite:_3,joyent:[0,{cns:_6}],"on-forge":_3,"on-vapor":_3,lpusercontent:_3,linode:[0,{members:_3,nodebalancer:_6}],linodeobjects:_6,linodeusercontent:[0,{ip:_3}],localtonet:_3,lovableproject:_3,barsycenter:_3,barsyonline:_3,lutrausercontent:_6,magicpatternsapp:_3,modelscape:_3,mwcloudnonprod:_3,polyspace:_3,mazeplay:_3,miniserver:_3,atmeta:_3,fbsbx:_42,meteorapp:_44,routingthecloud:_3,"same-app":_3,"same-preview":_3,mydbserver:_3,mochausercontent:_3,hostedpi:_3,"mythic-beasts":[0,{caracal:_3,customer:_3,fentiger:_3,lynx:_3,ocelot:_3,oncilla:_3,onza:_3,sphinx:_3,vs:_3,x:_3,yali:_3}],nospamproxy:[0,{cloud:[2,{o365:_3}]}],"4u":_3,nfshost:_3,"3utilities":_3,blogsyte:_3,ciscofreak:_3,damnserver:_3,ddnsking:_3,ditchyourip:_3,dnsiskinky:_3,dynns:_3,geekgalaxy:_3,"health-carereform":_3,homesecuritymac:_3,homesecuritypc:_3,myactivedirectory:_3,mysecuritycamera:_3,myvnc:_3,"net-freaks":_3,onthewifi:_3,point2this:_3,quicksytes:_3,securitytactics:_3,servebeer:_3,servecounterstrike:_3,serveexchange:_3,serveftp:_3,servegame:_3,servehalflife:_3,servehttp:_3,servehumour:_3,serveirc:_3,servemp3:_3,servep2p:_3,servepics:_3,servequake:_3,servesarcasm:_3,stufftoread:_3,unusualperson:_3,workisboring:_3,myiphost:_3,observableusercontent:[0,{static:_3}],simplesite:_3,oaiusercontent:_6,orsites:_3,operaunite:_3,"customer-oci":[0,{"*":_3,oci:_6,ocp:_6,ocs:_6}],oraclecloudapps:_6,oraclegovcloudapps:_6,"authgear-staging":_3,authgearapps:_3,outsystemscloud:_3,ownprovider:_3,pgfog:_3,pagexl:_3,gotpantheon:_3,paywhirl:_6,forgeblocks:_3,upsunapp:_3,"postman-echo":_3,prgmr:[0,{xen:_3}],"project-study":[0,{dev:_3}],pythonanywhere:_44,qa2:_3,"alpha-myqnapcloud":_3,"dev-myqnapcloud":_3,mycloudnas:_3,mynascloud:_3,myqnapcloud:_3,qualifioapp:_3,ladesk:_3,qualyhqpartner:_6,qualyhqportal:_6,qbuser:_3,quipelements:_6,rackmaze:_3,"readthedocs-hosted":_3,rhcloud:_3,onrender:_3,render:_45,"subsc-pay":_3,"180r":_3,dojin:_3,sakuratan:_3,sakuraweb:_3,x0:_3,code:[0,{builder:_6,"dev-builder":_6,"stg-builder":_6}],salesforce:[0,{platform:[0,{"code-builder-stg":[0,{test:[0,{"001":_6}]}]}]}],logoip:_3,scrysec:_3,"firewall-gateway":_3,myshopblocks:_3,myshopify:_3,shopitsite:_3,"1kapp":_3,appchizi:_3,applinzi:_3,sinaapp:_3,vipsinaapp:_3,streamlitapp:_3,"try-snowplow":_3,"playstation-cloud":_3,myspreadshop:_3,"w-corp-staticblitz":_3,"w-credentialless-staticblitz":_3,"w-staticblitz":_3,"stackhero-network":_3,stdlib:[0,{api:_3}],strapiapp:[2,{media:_3}],"streak-link":_3,streaklinks:_3,streakusercontent:_3,"temp-dns":_3,dsmynas:_3,familyds:_3,mytabit:_3,taveusercontent:_3,"tb-hosting":_46,reservd:_3,thingdustdata:_3,"townnews-staging":_3,typeform:[0,{pro:_3}],hk:_3,it:_3,"deus-canvas":_3,vultrobjects:_6,wafflecell:_3,hotelwithflight:_3,"reserve-online":_3,cprapid:_3,pleskns:_3,remotewd:_3,wiardweb:[0,{pages:_3}],"base44-sandbox":_3,wixsite:_3,wixstudio:_3,messwithdns:_3,"woltlab-demo":_3,wpenginepowered:[2,{js:_3}],xnbay:[2,{u2:_3,"u2-local":_3}],xtooldevice:_3,yolasite:_3}],coop:_2,cr:[1,{ac:_2,co:_2,ed:_2,fi:_2,go:_2,or:_2,sa:_2}],cu:[1,{com:_2,edu:_2,gob:_2,inf:_2,nat:_2,net:_2,org:_2}],cv:[1,{com:_2,edu:_2,id:_2,int:_2,net:_2,nome:_2,org:_2,publ:_2}],cw:_47,cx:[1,{gov:_2,cloudns:_3,ath:_3,info:_3,assessments:_3,calculators:_3,funnels:_3,paynow:_3,quizzes:_3,researched:_3,tests:_3}],cy:[1,{ac:_2,biz:_2,com:[1,{scaleforce:_48}],ekloges:_2,gov:_2,ltd:_2,mil:_2,net:_2,org:_2,press:_2,pro:_2,tm:_2}],cz:[1,{gov:_2,contentproxy9:[0,{rsc:_3}],realm:_3,e4:_3,co:_3,metacentrum:[0,{cloud:_6,custom:_3}],muni:[0,{cloud:[0,{flt:_3,usr:_3}]}]}],de:[1,{bplaced:_3,square7:_3,"bwcloud-os-instance":_6,com:_3,cosidns:_49,dnsupdater:_3,"dynamisches-dns":_3,"internet-dns":_3,"l-o-g-i-n":_3,ddnss:[2,{dyn:_3,dyndns:_3}],"dyn-ip24":_3,dyndns1:_3,"home-webserver":[2,{dyn:_3}],"myhome-server":_3,dnshome:_3,fuettertdasnetz:_3,isteingeek:_3,istmein:_3,lebtimnetz:_3,leitungsen:_3,traeumtgerade:_3,frusky:_6,goip:_3,"xn--gnstigbestellen-zvb":_3,günstigbestellen:_3,"xn--gnstigliefern-wob":_3,günstigliefern:_3,"hs-heilbronn":[0,{it:[0,{pages:_3,"pages-research":_3}]}],"dyn-berlin":_3,"in-berlin":_3,"in-brb":_3,"in-butter":_3,"in-dsl":_3,"in-vpn":_3,iservschule:_3,"mein-iserv":_3,schuldock:_3,schulplattform:_3,schulserver:_3,"test-iserv":_3,keymachine:_3,co:_3,"git-repos":_3,"lcube-server":_3,"svn-repos":_3,barsy:_3,webspaceconfig:_3,"123webseite":_3,rub:_3,"ruhr-uni-bochum":[2,{noc:[0,{io:_3}]}],logoip:_3,"firewall-gateway":_3,"my-gateway":_3,"my-router":_3,spdns:_3,my:_3,speedpartner:[0,{customer:_3}],myspreadshop:_3,"taifun-dns":_3,"12hp":_3,"2ix":_3,"4lima":_3,"lima-city":_3,"virtual-user":_3,virtualuser:_3,"community-pro":_3,diskussionsbereich:_3,xenonconnect:_6}],dj:_2,dk:[1,{biz:_3,co:_3,firm:_3,reg:_3,store:_3,"123hjemmeside":_3,myspreadshop:_3}],dm:_52,do:[1,{art:_2,com:_2,edu:_2,gob:_2,gov:_2,mil:_2,net:_2,org:_2,sld:_2,web:_2}],dz:[1,{art:_2,asso:_2,com:_2,edu:_2,gov:_2,net:_2,org:_2,pol:_2,soc:_2,tm:_2}],ec:[1,{abg:_2,adm:_2,agron:_2,arqt:_2,art:_2,bar:_2,chef:_2,com:_2,cont:_2,cpa:_2,cue:_2,dent:_2,dgn:_2,disco:_2,doc:_2,edu:_2,eng:_2,esm:_2,fin:_2,fot:_2,gal:_2,gob:_2,gov:_2,gye:_2,ibr:_2,info:_2,k12:_2,lat:_2,loj:_2,med:_2,mil:_2,mktg:_2,mon:_2,net:_2,ntr:_2,odont:_2,org:_2,pro:_2,prof:_2,psic:_2,psiq:_2,pub:_2,rio:_2,rrpp:_2,sal:_2,tech:_2,tul:_2,tur:_2,uio:_2,vet:_2,xxx:_2,base:_3,official:_3}],edu:[1,{rit:[0,{"git-pages":_3}]}],ee:[1,{aip:_2,com:_2,edu:_2,fie:_2,gov:_2,lib:_2,med:_2,org:_2,pri:_2,riik:_2}],eg:[1,{ac:_2,com:_2,edu:_2,eun:_2,gov:_2,info:_2,me:_2,mil:_2,name:_2,net:_2,org:_2,sci:_2,sport:_2,tv:_2}],er:_21,es:[1,{com:_2,edu:_2,gob:_2,nom:_2,org:_2,"123miweb":_3,myspreadshop:_3}],et:[1,{biz:_2,com:_2,edu:_2,gov:_2,info:_2,name:_2,net:_2,org:_2}],eu:[1,{amazonwebservices:[0,{on:[0,{"eusc-de-east-1":[0,{"cognito-idp":_39}]}]}],cloudns:_3,prvw:_3,deuxfleurs:_3,dogado:[0,{jelastic:_3}],barsy:_3,spdns:_3,nxa:_6,directwp:_3,transurl:_6}],fi:[1,{aland:_2,dy:_3,"xn--hkkinen-5wa":_3,häkkinen:_3,iki:_3,cloudplatform:[0,{fi:_3}],datacenter:[0,{demo:_3,paas:_3}],kapsi:_3,"123kotisivu":_3,myspreadshop:_3}],fj:[1,{ac:_2,biz:_2,com:_2,edu:_2,gov:_2,id:_2,info:_2,mil:_2,name:_2,net:_2,org:_2,pro:_2}],fk:_21,fm:[1,{com:_2,edu:_2,net:_2,org:_2,radio:_3,user:_6}],fo:_2,fr:[1,{asso:_2,com:_2,gouv:_2,nom:_2,prd:_2,tm:_2,avoues:_2,cci:_2,greta:_2,"huissier-justice":_2,"fbx-os":_3,fbxos:_3,"freebox-os":_3,freeboxos:_3,goupile:_3,"123siteweb":_3,"on-web":_3,"chirurgiens-dentistes-en-france":_3,dedibox:_3,aeroport:_3,avocat:_3,chambagri:_3,"chirurgiens-dentistes":_3,"experts-comptables":_3,medecin:_3,notaires:_3,pharmacien:_3,port:_3,veterinaire:_3,myspreadshop:_3,ynh:_3}],ga:_2,gb:_2,gd:[1,{edu:_2,gov:_2}],ge:[1,{com:_2,edu:_2,gov:_2,net:_2,org:_2,pvt:_2,school:_2}],gf:_2,gg:[1,{co:_2,net:_2,org:_2,ply:[0,{at:_6,d6:_3}],botdash:_3,kaas:_3,stackit:_3,panel:[2,{daemon:_3}]}],gh:[1,{biz:_2,com:_2,edu:_2,gov:_2,mil:_2,net:_2,org:_2}],gi:[1,{com:_2,edu:_2,gov:_2,ltd:_2,mod:_2,org:_2}],gl:[1,{co:_2,com:_2,edu:_2,net:_2,org:_2}],gm:_2,gn:[1,{ac:_2,com:_2,edu:_2,gov:_2,net:_2,org:_2}],gov:_2,gp:[1,{asso:_2,com:_2,edu:_2,mobi:_2,net:_2,org:_2}],gq:_2,gr:[1,{com:_2,edu:_2,gov:_2,net:_2,org:_2,barsy:_3,simplesite:_3}],gs:_2,gt:[1,{com:_2,edu:_2,gob:_2,ind:_2,mil:_2,net:_2,org:_2}],gu:[1,{com:_2,edu:_2,gov:_2,guam:_2,info:_2,net:_2,org:_2,web:_2}],gw:[1,{nx:_3}],gy:_52,hk:[1,{com:_2,edu:_2,gov:_2,idv:_2,net:_2,org:_2,"xn--ciqpn":_2,个人:_2,"xn--gmqw5a":_2,個人:_2,"xn--55qx5d":_2,公司:_2,"xn--mxtq1m":_2,政府:_2,"xn--lcvr32d":_2,敎育:_2,"xn--wcvs22d":_2,教育:_2,"xn--gmq050i":_2,箇人:_2,"xn--uc0atv":_2,組織:_2,"xn--uc0ay4a":_2,組织:_2,"xn--od0alg":_2,網絡:_2,"xn--zf0avx":_2,網络:_2,"xn--mk0axi":_2,组織:_2,"xn--tn0ag":_2,组织:_2,"xn--od0aq3b":_2,网絡:_2,"xn--io0a7i":_2,网络:_2,inc:_3,ltd:_3}],hm:_2,hn:[1,{com:_2,edu:_2,gob:_2,mil:_2,net:_2,org:_2}],hr:[1,{com:_2,from:_2,iz:_2,name:_2,brendly:_20}],ht:[1,{adult:_2,art:_2,asso:_2,com:_2,coop:_2,edu:_2,firm:_2,gouv:_2,info:_2,med:_2,net:_2,org:_2,perso:_2,pol:_2,pro:_2,rel:_2,shop:_2,rt:_3}],hu:[1,{2e3:_2,agrar:_2,bolt:_2,casino:_2,city:_2,co:_2,erotica:_2,erotika:_2,film:_2,forum:_2,games:_2,hotel:_2,info:_2,ingatlan:_2,jogasz:_2,konyvelo:_2,lakas:_2,media:_2,news:_2,org:_2,priv:_2,reklam:_2,sex:_2,shop:_2,sport:_2,suli:_2,szex:_2,tm:_2,tozsde:_2,utazas:_2,video:_2}],id:[1,{ac:_2,biz:_2,co:_2,desa:_2,go:_2,kop:_2,mil:_2,my:_2,net:_2,or:_2,ponpes:_2,sch:_2,web:_2,"xn--9tfky":_2,"ᬩᬮᬶ":_2,e:_3,zone:_3}],ie:[1,{gov:_2,myspreadshop:_3}],il:[1,{ac:_2,co:[1,{ravpage:_3,mytabit:_3,tabitorder:_3}],gov:_2,idf:_2,k12:_2,muni:_2,net:_2,org:_2}],"xn--4dbrk0ce":[1,{"xn--4dbgdty6c":_2,"xn--5dbhl8d":_2,"xn--8dbq2a":_2,"xn--hebda8b":_2}],ישראל:[1,{אקדמיה:_2,ישוב:_2,צהל:_2,ממשל:_2}],im:[1,{ac:_2,co:[1,{ltd:_2,plc:_2}],com:_2,net:_2,org:_2,tt:_2,tv:_2}],in:[1,{"5g":_2,"6g":_2,ac:_2,ai:_2,am:_2,bank:_2,bihar:_2,biz:_2,business:_2,ca:_2,cn:_2,co:_2,com:_2,coop:_2,cs:_2,delhi:_2,dr:_2,edu:_2,er:_2,fin:_2,firm:_2,gen:_2,gov:_2,gujarat:_2,ind:_2,info:_2,int:_2,internet:_2,io:_2,me:_2,mil:_2,net:_2,nic:_2,org:_2,pg:_2,post:_2,pro:_2,res:_2,travel:_2,tv:_2,uk:_2,up:_2,us:_2,cloudns:_3,barsy:_3,web:_3,indevs:_3,supabase:_3}],info:[1,{cloudns:_3,"dynamic-dns":_3,"barrel-of-knowledge":_3,"barrell-of-knowledge":_3,dyndns:_3,"for-our":_3,"groks-the":_3,"groks-this":_3,"here-for-more":_3,knowsitall:_3,selfip:_3,webhop:_3,barsy:_3,mayfirst:_3,mittwald:_3,mittwaldserver:_3,typo3server:_3,dvrcam:_3,ilovecollege:_3,"no-ip":_3,forumz:_3,nsupdate:_3,dnsupdate:_3,"v-info":_3}],int:[1,{eu:_2}],io:[1,{2038:_3,co:_2,com:_2,edu:_2,gov:_2,mil:_2,net:_2,nom:_2,org:_2,"on-acorn":_6,myaddr:_3,apigee:_3,"b-data":_3,beagleboard:_3,bitbucket:_3,bluebite:_3,boxfuse:_3,brave:_7,browsersafetymark:_3,bubble:_55,bubbleapps:_3,bigv:[0,{uk0:_3}],cleverapps:_3,cloudbeesusercontent:_3,dappnode:[0,{dyndns:_3}],darklang:_3,definima:_3,dedyn:_3,icp0:_56,icp1:_56,qzz:_3,"fh-muenster":_3,gitbook:_3,github:_3,gitlab:_3,lolipop:_3,"hasura-app":_3,hostyhosting:_3,hypernode:_3,moonscale:_6,beebyte:_43,beebyteapp:[0,{sekd1:_3}],jele:_3,keenetic:_3,kiloapps:_3,webthings:_3,loginline:_3,barsy:_3,azurecontainer:_6,ngrok:[2,{ap:_3,au:_3,eu:_3,in:_3,jp:_3,sa:_3,us:_3}],nodeart:[0,{stage:_3}],pantheonsite:_3,forgerock:[0,{id:_3}],pstmn:[2,{mock:_3}],protonet:_3,qcx:[2,{sys:_6}],qoto:_3,vaporcloud:_3,myrdbx:_3,"rb-hosting":_46,"on-k3s":_6,"on-rio":_6,readthedocs:_3,resindevice:_3,resinstaging:[0,{devices:_3}],hzc:_3,sandcats:_3,scrypted:[0,{client:_3}],"mo-siemens":_3,lair:_42,stolos:_6,musician:_3,utwente:_3,edugit:_3,telebit:_3,thingdust:[0,{dev:_57,disrec:_57,prod:_58,testing:_57}],tickets:_3,webflow:_3,webflowtest:_3,editorx:_3,wixstudio:_3,basicserver:_3,virtualserver:_3}],iq:_5,ir:[1,{ac:_2,co:_2,gov:_2,id:_2,net:_2,org:_2,sch:_2,"xn--mgba3a4f16a":_2,ایران:_2,"xn--mgba3a4fra":_2,ايران:_2,arvanedge:_3,vistablog:_3}],is:_2,it:[1,{edu:_2,gov:_2,abr:_2,abruzzo:_2,"aosta-valley":_2,aostavalley:_2,bas:_2,basilicata:_2,cal:_2,calabria:_2,cam:_2,campania:_2,"emilia-romagna":_2,emiliaromagna:_2,emr:_2,"friuli-v-giulia":_2,"friuli-ve-giulia":_2,"friuli-vegiulia":_2,"friuli-venezia-giulia":_2,"friuli-veneziagiulia":_2,"friuli-vgiulia":_2,"friuliv-giulia":_2,"friulive-giulia":_2,friulivegiulia:_2,"friulivenezia-giulia":_2,friuliveneziagiulia:_2,friulivgiulia:_2,fvg:_2,laz:_2,lazio:_2,lig:_2,liguria:_2,lom:_2,lombardia:_2,lombardy:_2,lucania:_2,mar:_2,marche:_2,mol:_2,molise:_2,piedmont:_2,piemonte:_2,pmn:_2,pug:_2,puglia:_2,sar:_2,sardegna:_2,sardinia:_2,sic:_2,sicilia:_2,sicily:_2,taa:_2,tos:_2,toscana:_2,"trentin-sud-tirol":_2,"xn--trentin-sd-tirol-rzb":_2,"trentin-süd-tirol":_2,"trentin-sudtirol":_2,"xn--trentin-sdtirol-7vb":_2,"trentin-südtirol":_2,"trentin-sued-tirol":_2,"trentin-suedtirol":_2,trentino:_2,"trentino-a-adige":_2,"trentino-aadige":_2,"trentino-alto-adige":_2,"trentino-altoadige":_2,"trentino-s-tirol":_2,"trentino-stirol":_2,"trentino-sud-tirol":_2,"xn--trentino-sd-tirol-c3b":_2,"trentino-süd-tirol":_2,"trentino-sudtirol":_2,"xn--trentino-sdtirol-szb":_2,"trentino-südtirol":_2,"trentino-sued-tirol":_2,"trentino-suedtirol":_2,"trentinoa-adige":_2,trentinoaadige:_2,"trentinoalto-adige":_2,trentinoaltoadige:_2,"trentinos-tirol":_2,trentinostirol:_2,"trentinosud-tirol":_2,"xn--trentinosd-tirol-rzb":_2,"trentinosüd-tirol":_2,trentinosudtirol:_2,"xn--trentinosdtirol-7vb":_2,trentinosüdtirol:_2,"trentinosued-tirol":_2,trentinosuedtirol:_2,"trentinsud-tirol":_2,"xn--trentinsd-tirol-6vb":_2,"trentinsüd-tirol":_2,trentinsudtirol:_2,"xn--trentinsdtirol-nsb":_2,trentinsüdtirol:_2,"trentinsued-tirol":_2,trentinsuedtirol:_2,tuscany:_2,umb:_2,umbria:_2,"val-d-aosta":_2,"val-daosta":_2,"vald-aosta":_2,valdaosta:_2,"valle-aosta":_2,"valle-d-aosta":_2,"valle-daosta":_2,valleaosta:_2,"valled-aosta":_2,valledaosta:_2,"vallee-aoste":_2,"xn--valle-aoste-ebb":_2,"vallée-aoste":_2,"vallee-d-aoste":_2,"xn--valle-d-aoste-ehb":_2,"vallée-d-aoste":_2,valleeaoste:_2,"xn--valleaoste-e7a":_2,valléeaoste:_2,valleedaoste:_2,"xn--valledaoste-ebb":_2,valléedaoste:_2,vao:_2,vda:_2,ven:_2,veneto:_2,ag:_2,agrigento:_2,al:_2,alessandria:_2,"alto-adige":_2,altoadige:_2,an:_2,ancona:_2,"andria-barletta-trani":_2,"andria-trani-barletta":_2,andriabarlettatrani:_2,andriatranibarletta:_2,ao:_2,aosta:_2,aoste:_2,ap:_2,aq:_2,aquila:_2,ar:_2,arezzo:_2,"ascoli-piceno":_2,ascolipiceno:_2,asti:_2,at:_2,av:_2,avellino:_2,ba:_2,balsan:_2,"balsan-sudtirol":_2,"xn--balsan-sdtirol-nsb":_2,"balsan-südtirol":_2,"balsan-suedtirol":_2,bari:_2,"barletta-trani-andria":_2,barlettatraniandria:_2,belluno:_2,benevento:_2,bergamo:_2,bg:_2,bi:_2,biella:_2,bl:_2,bn:_2,bo:_2,bologna:_2,bolzano:_2,"bolzano-altoadige":_2,bozen:_2,"bozen-sudtirol":_2,"xn--bozen-sdtirol-2ob":_2,"bozen-südtirol":_2,"bozen-suedtirol":_2,br:_2,brescia:_2,brindisi:_2,bs:_2,bt:_2,bulsan:_2,"bulsan-sudtirol":_2,"xn--bulsan-sdtirol-nsb":_2,"bulsan-südtirol":_2,"bulsan-suedtirol":_2,bz:_2,ca:_2,cagliari:_2,caltanissetta:_2,"campidano-medio":_2,campidanomedio:_2,campobasso:_2,"carbonia-iglesias":_2,carboniaiglesias:_2,"carrara-massa":_2,carraramassa:_2,caserta:_2,catania:_2,catanzaro:_2,cb:_2,ce:_2,"cesena-forli":_2,"xn--cesena-forl-mcb":_2,"cesena-forlì":_2,cesenaforli:_2,"xn--cesenaforl-i8a":_2,cesenaforlì:_2,ch:_2,chieti:_2,ci:_2,cl:_2,cn:_2,co:_2,como:_2,cosenza:_2,cr:_2,cremona:_2,crotone:_2,cs:_2,ct:_2,cuneo:_2,cz:_2,"dell-ogliastra":_2,dellogliastra:_2,en:_2,enna:_2,fc:_2,fe:_2,fermo:_2,ferrara:_2,fg:_2,fi:_2,firenze:_2,florence:_2,fm:_2,foggia:_2,"forli-cesena":_2,"xn--forl-cesena-fcb":_2,"forlì-cesena":_2,forlicesena:_2,"xn--forlcesena-c8a":_2,forlìcesena:_2,fr:_2,frosinone:_2,ge:_2,genoa:_2,genova:_2,go:_2,gorizia:_2,gr:_2,grosseto:_2,"iglesias-carbonia":_2,iglesiascarbonia:_2,im:_2,imperia:_2,is:_2,isernia:_2,kr:_2,"la-spezia":_2,laquila:_2,laspezia:_2,latina:_2,lc:_2,le:_2,lecce:_2,lecco:_2,li:_2,livorno:_2,lo:_2,lodi:_2,lt:_2,lu:_2,lucca:_2,macerata:_2,mantova:_2,"massa-carrara":_2,massacarrara:_2,matera:_2,mb:_2,mc:_2,me:_2,"medio-campidano":_2,mediocampidano:_2,messina:_2,mi:_2,milan:_2,milano:_2,mn:_2,mo:_2,modena:_2,monza:_2,"monza-brianza":_2,"monza-e-della-brianza":_2,monzabrianza:_2,monzaebrianza:_2,monzaedellabrianza:_2,ms:_2,mt:_2,na:_2,naples:_2,napoli:_2,no:_2,novara:_2,nu:_2,nuoro:_2,og:_2,ogliastra:_2,"olbia-tempio":_2,olbiatempio:_2,or:_2,oristano:_2,ot:_2,pa:_2,padova:_2,padua:_2,palermo:_2,parma:_2,pavia:_2,pc:_2,pd:_2,pe:_2,perugia:_2,"pesaro-urbino":_2,pesarourbino:_2,pescara:_2,pg:_2,pi:_2,piacenza:_2,pisa:_2,pistoia:_2,pn:_2,po:_2,pordenone:_2,potenza:_2,pr:_2,prato:_2,pt:_2,pu:_2,pv:_2,pz:_2,ra:_2,ragusa:_2,ravenna:_2,rc:_2,re:_2,"reggio-calabria":_2,"reggio-emilia":_2,reggiocalabria:_2,reggioemilia:_2,rg:_2,ri:_2,rieti:_2,rimini:_2,rm:_2,rn:_2,ro:_2,roma:_2,rome:_2,rovigo:_2,sa:_2,salerno:_2,sassari:_2,savona:_2,si:_2,siena:_2,siracusa:_2,so:_2,sondrio:_2,sp:_2,sr:_2,ss:_2,"xn--sdtirol-n2a":_2,südtirol:_2,suedtirol:_2,sv:_2,ta:_2,taranto:_2,te:_2,"tempio-olbia":_2,tempioolbia:_2,teramo:_2,terni:_2,tn:_2,to:_2,torino:_2,tp:_2,tr:_2,"trani-andria-barletta":_2,"trani-barletta-andria":_2,traniandriabarletta:_2,tranibarlettaandria:_2,trapani:_2,trento:_2,treviso:_2,trieste:_2,ts:_2,turin:_2,tv:_2,ud:_2,udine:_2,"urbino-pesaro":_2,urbinopesaro:_2,va:_2,varese:_2,vb:_2,vc:_2,ve:_2,venezia:_2,venice:_2,verbania:_2,vercelli:_2,verona:_2,vi:_2,"vibo-valentia":_2,vibovalentia:_2,vicenza:_2,viterbo:_2,vr:_2,vs:_2,vt:_2,vv:_2,"12chars":_3,ibxos:_3,iliadboxos:_3,neen:[0,{jc:_3}],"123homepage":_3,"16-b":_3,"32-b":_3,"64-b":_3,myspreadshop:_3,syncloud:_3}],je:[1,{co:_2,net:_2,org:_2,of:_3}],jm:_21,jo:[1,{agri:_2,ai:_2,com:_2,edu:_2,eng:_2,fm:_2,gov:_2,mil:_2,net:_2,org:_2,per:_2,phd:_2,sch:_2,tv:_2}],jobs:_2,jp:[1,{ac:_2,ad:_2,co:_2,ed:_2,go:_2,gr:_2,lg:_2,ne:[1,{aseinet:_54,gehirn:_3,ivory:_3,"mail-box":_3,mints:_3,mokuren:_3,opal:_3,sakura:_3,sumomo:_3,topaz:_3}],or:_2,aichi:[1,{aisai:_2,ama:_2,anjo:_2,asuke:_2,chiryu:_2,chita:_2,fuso:_2,gamagori:_2,handa:_2,hazu:_2,hekinan:_2,higashiura:_2,ichinomiya:_2,inazawa:_2,inuyama:_2,isshiki:_2,iwakura:_2,kanie:_2,kariya:_2,kasugai:_2,kira:_2,kiyosu:_2,komaki:_2,konan:_2,kota:_2,mihama:_2,miyoshi:_2,nishio:_2,nisshin:_2,obu:_2,oguchi:_2,oharu:_2,okazaki:_2,owariasahi:_2,seto:_2,shikatsu:_2,shinshiro:_2,shitara:_2,tahara:_2,takahama:_2,tobishima:_2,toei:_2,togo:_2,tokai:_2,tokoname:_2,toyoake:_2,toyohashi:_2,toyokawa:_2,toyone:_2,toyota:_2,tsushima:_2,yatomi:_2}],akita:[1,{akita:_2,daisen:_2,fujisato:_2,gojome:_2,hachirogata:_2,happou:_2,higashinaruse:_2,honjo:_2,honjyo:_2,ikawa:_2,kamikoani:_2,kamioka:_2,katagami:_2,kazuno:_2,kitaakita:_2,kosaka:_2,kyowa:_2,misato:_2,mitane:_2,moriyoshi:_2,nikaho:_2,noshiro:_2,odate:_2,oga:_2,ogata:_2,semboku:_2,yokote:_2,yurihonjo:_2}],aomori:[1,{aomori:_2,gonohe:_2,hachinohe:_2,hashikami:_2,hiranai:_2,hirosaki:_2,itayanagi:_2,kuroishi:_2,misawa:_2,mutsu:_2,nakadomari:_2,noheji:_2,oirase:_2,owani:_2,rokunohe:_2,sannohe:_2,shichinohe:_2,shingo:_2,takko:_2,towada:_2,tsugaru:_2,tsuruta:_2}],chiba:[1,{abiko:_2,asahi:_2,chonan:_2,chosei:_2,choshi:_2,chuo:_2,funabashi:_2,futtsu:_2,hanamigawa:_2,ichihara:_2,ichikawa:_2,ichinomiya:_2,inzai:_2,isumi:_2,kamagaya:_2,kamogawa:_2,kashiwa:_2,katori:_2,katsuura:_2,kimitsu:_2,kisarazu:_2,kozaki:_2,kujukuri:_2,kyonan:_2,matsudo:_2,midori:_2,mihama:_2,minamiboso:_2,mobara:_2,mutsuzawa:_2,nagara:_2,nagareyama:_2,narashino:_2,narita:_2,noda:_2,oamishirasato:_2,omigawa:_2,onjuku:_2,otaki:_2,sakae:_2,sakura:_2,shimofusa:_2,shirako:_2,shiroi:_2,shisui:_2,sodegaura:_2,sosa:_2,tako:_2,tateyama:_2,togane:_2,tohnosho:_2,tomisato:_2,urayasu:_2,yachimata:_2,yachiyo:_2,yokaichiba:_2,yokoshibahikari:_2,yotsukaido:_2}],ehime:[1,{ainan:_2,honai:_2,ikata:_2,imabari:_2,iyo:_2,kamijima:_2,kihoku:_2,kumakogen:_2,masaki:_2,matsuno:_2,matsuyama:_2,namikata:_2,niihama:_2,ozu:_2,saijo:_2,seiyo:_2,shikokuchuo:_2,tobe:_2,toon:_2,uchiko:_2,uwajima:_2,yawatahama:_2}],fukui:[1,{echizen:_2,eiheiji:_2,fukui:_2,ikeda:_2,katsuyama:_2,mihama:_2,minamiechizen:_2,obama:_2,ohi:_2,ono:_2,sabae:_2,sakai:_2,takahama:_2,tsuruga:_2,wakasa:_2}],fukuoka:[1,{ashiya:_2,buzen:_2,chikugo:_2,chikuho:_2,chikujo:_2,chikushino:_2,chikuzen:_2,chuo:_2,dazaifu:_2,fukuchi:_2,hakata:_2,higashi:_2,hirokawa:_2,hisayama:_2,iizuka:_2,inatsuki:_2,kaho:_2,kasuga:_2,kasuya:_2,kawara:_2,keisen:_2,koga:_2,kurate:_2,kurogi:_2,kurume:_2,minami:_2,miyako:_2,miyama:_2,miyawaka:_2,mizumaki:_2,munakata:_2,nakagawa:_2,nakama:_2,nishi:_2,nogata:_2,ogori:_2,okagaki:_2,okawa:_2,oki:_2,omuta:_2,onga:_2,onojo:_2,oto:_2,saigawa:_2,sasaguri:_2,shingu:_2,shinyoshitomi:_2,shonai:_2,soeda:_2,sue:_2,tachiarai:_2,tagawa:_2,takata:_2,toho:_2,toyotsu:_2,tsuiki:_2,ukiha:_2,umi:_2,usui:_2,yamada:_2,yame:_2,yanagawa:_2,yukuhashi:_2}],fukushima:[1,{aizubange:_2,aizumisato:_2,aizuwakamatsu:_2,asakawa:_2,bandai:_2,date:_2,fukushima:_2,furudono:_2,futaba:_2,hanawa:_2,higashi:_2,hirata:_2,hirono:_2,iitate:_2,inawashiro:_2,ishikawa:_2,iwaki:_2,izumizaki:_2,kagamiishi:_2,kaneyama:_2,kawamata:_2,kitakata:_2,kitashiobara:_2,koori:_2,koriyama:_2,kunimi:_2,miharu:_2,mishima:_2,namie:_2,nango:_2,nishiaizu:_2,nishigo:_2,okuma:_2,omotego:_2,ono:_2,otama:_2,samegawa:_2,shimogo:_2,shirakawa:_2,showa:_2,soma:_2,sukagawa:_2,taishin:_2,tamakawa:_2,tanagura:_2,tenei:_2,yabuki:_2,yamato:_2,yamatsuri:_2,yanaizu:_2,yugawa:_2}],gifu:[1,{anpachi:_2,ena:_2,gifu:_2,ginan:_2,godo:_2,gujo:_2,hashima:_2,hichiso:_2,hida:_2,higashishirakawa:_2,ibigawa:_2,ikeda:_2,kakamigahara:_2,kani:_2,kasahara:_2,kasamatsu:_2,kawaue:_2,kitagata:_2,mino:_2,minokamo:_2,mitake:_2,mizunami:_2,motosu:_2,nakatsugawa:_2,ogaki:_2,sakahogi:_2,seki:_2,sekigahara:_2,shirakawa:_2,tajimi:_2,takayama:_2,tarui:_2,toki:_2,tomika:_2,wanouchi:_2,yamagata:_2,yaotsu:_2,yoro:_2}],gunma:[1,{annaka:_2,chiyoda:_2,fujioka:_2,higashiagatsuma:_2,isesaki:_2,itakura:_2,kanna:_2,kanra:_2,katashina:_2,kawaba:_2,kiryu:_2,kusatsu:_2,maebashi:_2,meiwa:_2,midori:_2,minakami:_2,naganohara:_2,nakanojo:_2,nanmoku:_2,numata:_2,oizumi:_2,ora:_2,ota:_2,shibukawa:_2,shimonita:_2,shinto:_2,showa:_2,takasaki:_2,takayama:_2,tamamura:_2,tatebayashi:_2,tomioka:_2,tsukiyono:_2,tsumagoi:_2,ueno:_2,yoshioka:_2}],hiroshima:[1,{asaminami:_2,daiwa:_2,etajima:_2,fuchu:_2,fukuyama:_2,hatsukaichi:_2,higashihiroshima:_2,hongo:_2,jinsekikogen:_2,kaita:_2,kui:_2,kumano:_2,kure:_2,mihara:_2,miyoshi:_2,naka:_2,onomichi:_2,osakikamijima:_2,otake:_2,saka:_2,sera:_2,seranishi:_2,shinichi:_2,shobara:_2,takehara:_2}],hokkaido:[1,{abashiri:_2,abira:_2,aibetsu:_2,akabira:_2,akkeshi:_2,asahikawa:_2,ashibetsu:_2,ashoro:_2,assabu:_2,atsuma:_2,bibai:_2,biei:_2,bifuka:_2,bihoro:_2,biratori:_2,chippubetsu:_2,chitose:_2,date:_2,ebetsu:_2,embetsu:_2,eniwa:_2,erimo:_2,esan:_2,esashi:_2,fukagawa:_2,fukushima:_2,furano:_2,furubira:_2,haboro:_2,hakodate:_2,hamatonbetsu:_2,hidaka:_2,higashikagura:_2,higashikawa:_2,hiroo:_2,hokuryu:_2,hokuto:_2,honbetsu:_2,horokanai:_2,horonobe:_2,ikeda:_2,imakane:_2,ishikari:_2,iwamizawa:_2,iwanai:_2,kamifurano:_2,kamikawa:_2,kamishihoro:_2,kamisunagawa:_2,kamoenai:_2,kayabe:_2,kembuchi:_2,kikonai:_2,kimobetsu:_2,kitahiroshima:_2,kitami:_2,kiyosato:_2,koshimizu:_2,kunneppu:_2,kuriyama:_2,kuromatsunai:_2,kushiro:_2,kutchan:_2,kyowa:_2,mashike:_2,matsumae:_2,mikasa:_2,minamifurano:_2,mombetsu:_2,moseushi:_2,mukawa:_2,muroran:_2,naie:_2,nakagawa:_2,nakasatsunai:_2,nakatombetsu:_2,nanae:_2,nanporo:_2,nayoro:_2,nemuro:_2,niikappu:_2,niki:_2,nishiokoppe:_2,noboribetsu:_2,numata:_2,obihiro:_2,obira:_2,oketo:_2,okoppe:_2,otaru:_2,otobe:_2,otofuke:_2,otoineppu:_2,oumu:_2,ozora:_2,pippu:_2,rankoshi:_2,rebun:_2,rikubetsu:_2,rishiri:_2,rishirifuji:_2,saroma:_2,sarufutsu:_2,shakotan:_2,shari:_2,shibecha:_2,shibetsu:_2,shikabe:_2,shikaoi:_2,shimamaki:_2,shimizu:_2,shimokawa:_2,shinshinotsu:_2,shintoku:_2,shiranuka:_2,shiraoi:_2,shiriuchi:_2,sobetsu:_2,sunagawa:_2,taiki:_2,takasu:_2,takikawa:_2,takinoue:_2,teshikaga:_2,tobetsu:_2,tohma:_2,tomakomai:_2,tomari:_2,toya:_2,toyako:_2,toyotomi:_2,toyoura:_2,tsubetsu:_2,tsukigata:_2,urakawa:_2,urausu:_2,uryu:_2,utashinai:_2,wakkanai:_2,wassamu:_2,yakumo:_2,yoichi:_2}],hyogo:[1,{aioi:_2,akashi:_2,ako:_2,amagasaki:_2,aogaki:_2,asago:_2,ashiya:_2,awaji:_2,fukusaki:_2,goshiki:_2,harima:_2,himeji:_2,ichikawa:_2,inagawa:_2,itami:_2,kakogawa:_2,kamigori:_2,kamikawa:_2,kasai:_2,kasuga:_2,kawanishi:_2,miki:_2,minamiawaji:_2,nishinomiya:_2,nishiwaki:_2,ono:_2,sanda:_2,sannan:_2,sasayama:_2,sayo:_2,shingu:_2,shinonsen:_2,shiso:_2,sumoto:_2,taishi:_2,taka:_2,takarazuka:_2,takasago:_2,takino:_2,tamba:_2,tatsuno:_2,toyooka:_2,yabu:_2,yashiro:_2,yoka:_2,yokawa:_2}],ibaraki:[1,{ami:_2,asahi:_2,bando:_2,chikusei:_2,daigo:_2,fujishiro:_2,hitachi:_2,hitachinaka:_2,hitachiomiya:_2,hitachiota:_2,ibaraki:_2,ina:_2,inashiki:_2,itako:_2,iwama:_2,joso:_2,kamisu:_2,kasama:_2,kashima:_2,kasumigaura:_2,koga:_2,miho:_2,mito:_2,moriya:_2,naka:_2,namegata:_2,oarai:_2,ogawa:_2,omitama:_2,ryugasaki:_2,sakai:_2,sakuragawa:_2,shimodate:_2,shimotsuma:_2,shirosato:_2,sowa:_2,suifu:_2,takahagi:_2,tamatsukuri:_2,tokai:_2,tomobe:_2,tone:_2,toride:_2,tsuchiura:_2,tsukuba:_2,uchihara:_2,ushiku:_2,yachiyo:_2,yamagata:_2,yawara:_2,yuki:_2}],ishikawa:[1,{anamizu:_2,hakui:_2,hakusan:_2,kaga:_2,kahoku:_2,kanazawa:_2,kawakita:_2,komatsu:_2,nakanoto:_2,nanao:_2,nomi:_2,nonoichi:_2,noto:_2,shika:_2,suzu:_2,tsubata:_2,tsurugi:_2,uchinada:_2,wajima:_2}],iwate:[1,{fudai:_2,fujisawa:_2,hanamaki:_2,hiraizumi:_2,hirono:_2,ichinohe:_2,ichinoseki:_2,iwaizumi:_2,iwate:_2,joboji:_2,kamaishi:_2,kanegasaki:_2,karumai:_2,kawai:_2,kitakami:_2,kuji:_2,kunohe:_2,kuzumaki:_2,miyako:_2,mizusawa:_2,morioka:_2,ninohe:_2,noda:_2,ofunato:_2,oshu:_2,otsuchi:_2,rikuzentakata:_2,shiwa:_2,shizukuishi:_2,sumita:_2,tanohata:_2,tono:_2,yahaba:_2,yamada:_2}],kagawa:[1,{ayagawa:_2,higashikagawa:_2,kanonji:_2,kotohira:_2,manno:_2,marugame:_2,mitoyo:_2,naoshima:_2,sanuki:_2,tadotsu:_2,takamatsu:_2,tonosho:_2,uchinomi:_2,utazu:_2,zentsuji:_2}],kagoshima:[1,{akune:_2,amami:_2,hioki:_2,isa:_2,isen:_2,izumi:_2,kagoshima:_2,kanoya:_2,kawanabe:_2,kinko:_2,kouyama:_2,makurazaki:_2,matsumoto:_2,minamitane:_2,nakatane:_2,nishinoomote:_2,satsumasendai:_2,soo:_2,tarumizu:_2,yusui:_2}],kanagawa:[1,{aikawa:_2,atsugi:_2,ayase:_2,chigasaki:_2,ebina:_2,fujisawa:_2,hadano:_2,hakone:_2,hiratsuka:_2,isehara:_2,kaisei:_2,kamakura:_2,kiyokawa:_2,matsuda:_2,minamiashigara:_2,miura:_2,nakai:_2,ninomiya:_2,odawara:_2,oi:_2,oiso:_2,sagamihara:_2,samukawa:_2,tsukui:_2,yamakita:_2,yamato:_2,yokosuka:_2,yugawara:_2,zama:_2,zushi:_2}],kochi:[1,{aki:_2,geisei:_2,hidaka:_2,higashitsuno:_2,ino:_2,kagami:_2,kami:_2,kitagawa:_2,kochi:_2,mihara:_2,motoyama:_2,muroto:_2,nahari:_2,nakamura:_2,nankoku:_2,nishitosa:_2,niyodogawa:_2,ochi:_2,okawa:_2,otoyo:_2,otsuki:_2,sakawa:_2,sukumo:_2,susaki:_2,tosa:_2,tosashimizu:_2,toyo:_2,tsuno:_2,umaji:_2,yasuda:_2,yusuhara:_2}],kumamoto:[1,{amakusa:_2,arao:_2,aso:_2,choyo:_2,gyokuto:_2,kamiamakusa:_2,kikuchi:_2,kumamoto:_2,mashiki:_2,mifune:_2,minamata:_2,minamioguni:_2,nagasu:_2,nishihara:_2,oguni:_2,ozu:_2,sumoto:_2,takamori:_2,uki:_2,uto:_2,yamaga:_2,yamato:_2,yatsushiro:_2}],kyoto:[1,{ayabe:_2,fukuchiyama:_2,higashiyama:_2,ide:_2,ine:_2,joyo:_2,kameoka:_2,kamo:_2,kita:_2,kizu:_2,kumiyama:_2,kyotamba:_2,kyotanabe:_2,kyotango:_2,maizuru:_2,minami:_2,minamiyamashiro:_2,miyazu:_2,muko:_2,nagaokakyo:_2,nakagyo:_2,nantan:_2,oyamazaki:_2,sakyo:_2,seika:_2,tanabe:_2,uji:_2,ujitawara:_2,wazuka:_2,yamashina:_2,yawata:_2}],mie:[1,{asahi:_2,inabe:_2,ise:_2,kameyama:_2,kawagoe:_2,kiho:_2,kisosaki:_2,kiwa:_2,komono:_2,kumano:_2,kuwana:_2,matsusaka:_2,meiwa:_2,mihama:_2,minamiise:_2,misugi:_2,miyama:_2,nabari:_2,shima:_2,suzuka:_2,tado:_2,taiki:_2,taki:_2,tamaki:_2,toba:_2,tsu:_2,udono:_2,ureshino:_2,watarai:_2,yokkaichi:_2}],miyagi:[1,{furukawa:_2,higashimatsushima:_2,ishinomaki:_2,iwanuma:_2,kakuda:_2,kami:_2,kawasaki:_2,marumori:_2,matsushima:_2,minamisanriku:_2,misato:_2,murata:_2,natori:_2,ogawara:_2,ohira:_2,onagawa:_2,osaki:_2,rifu:_2,semine:_2,shibata:_2,shichikashuku:_2,shikama:_2,shiogama:_2,shiroishi:_2,tagajo:_2,taiwa:_2,tome:_2,tomiya:_2,wakuya:_2,watari:_2,yamamoto:_2,zao:_2}],miyazaki:[1,{aya:_2,ebino:_2,gokase:_2,hyuga:_2,kadogawa:_2,kawaminami:_2,kijo:_2,kitagawa:_2,kitakata:_2,kitaura:_2,kobayashi:_2,kunitomi:_2,kushima:_2,mimata:_2,miyakonojo:_2,miyazaki:_2,morotsuka:_2,nichinan:_2,nishimera:_2,nobeoka:_2,saito:_2,shiiba:_2,shintomi:_2,takaharu:_2,takanabe:_2,takazaki:_2,tsuno:_2}],nagano:[1,{achi:_2,agematsu:_2,anan:_2,aoki:_2,asahi:_2,azumino:_2,chikuhoku:_2,chikuma:_2,chino:_2,fujimi:_2,hakuba:_2,hara:_2,hiraya:_2,iida:_2,iijima:_2,iiyama:_2,iizuna:_2,ikeda:_2,ikusaka:_2,ina:_2,karuizawa:_2,kawakami:_2,kiso:_2,kisofukushima:_2,kitaaiki:_2,komagane:_2,komoro:_2,matsukawa:_2,matsumoto:_2,miasa:_2,minamiaiki:_2,minamimaki:_2,minamiminowa:_2,minowa:_2,miyada:_2,miyota:_2,mochizuki:_2,nagano:_2,nagawa:_2,nagiso:_2,nakagawa:_2,nakano:_2,nozawaonsen:_2,obuse:_2,ogawa:_2,okaya:_2,omachi:_2,omi:_2,ookuwa:_2,ooshika:_2,otaki:_2,otari:_2,sakae:_2,sakaki:_2,saku:_2,sakuho:_2,shimosuwa:_2,shinanomachi:_2,shiojiri:_2,suwa:_2,suzaka:_2,takagi:_2,takamori:_2,takayama:_2,tateshina:_2,tatsuno:_2,togakushi:_2,togura:_2,tomi:_2,ueda:_2,wada:_2,yamagata:_2,yamanouchi:_2,yasaka:_2,yasuoka:_2}],nagasaki:[1,{chijiwa:_2,futsu:_2,goto:_2,hasami:_2,hirado:_2,iki:_2,isahaya:_2,kawatana:_2,kuchinotsu:_2,matsuura:_2,nagasaki:_2,obama:_2,omura:_2,oseto:_2,saikai:_2,sasebo:_2,seihi:_2,shimabara:_2,shinkamigoto:_2,togitsu:_2,tsushima:_2,unzen:_2}],nara:[1,{ando:_2,gose:_2,heguri:_2,higashiyoshino:_2,ikaruga:_2,ikoma:_2,kamikitayama:_2,kanmaki:_2,kashiba:_2,kashihara:_2,katsuragi:_2,kawai:_2,kawakami:_2,kawanishi:_2,koryo:_2,kurotaki:_2,mitsue:_2,miyake:_2,nara:_2,nosegawa:_2,oji:_2,ouda:_2,oyodo:_2,sakurai:_2,sango:_2,shimoichi:_2,shimokitayama:_2,shinjo:_2,soni:_2,takatori:_2,tawaramoto:_2,tenkawa:_2,tenri:_2,uda:_2,yamatokoriyama:_2,yamatotakada:_2,yamazoe:_2,yoshino:_2}],niigata:[1,{aga:_2,agano:_2,gosen:_2,itoigawa:_2,izumozaki:_2,joetsu:_2,kamo:_2,kariwa:_2,kashiwazaki:_2,minamiuonuma:_2,mitsuke:_2,muika:_2,murakami:_2,myoko:_2,nagaoka:_2,niigata:_2,ojiya:_2,omi:_2,sado:_2,sanjo:_2,seiro:_2,seirou:_2,sekikawa:_2,shibata:_2,tagami:_2,tainai:_2,tochio:_2,tokamachi:_2,tsubame:_2,tsunan:_2,uonuma:_2,yahiko:_2,yoita:_2,yuzawa:_2}],oita:[1,{beppu:_2,bungoono:_2,bungotakada:_2,hasama:_2,hiji:_2,himeshima:_2,hita:_2,kamitsue:_2,kokonoe:_2,kuju:_2,kunisaki:_2,kusu:_2,oita:_2,saiki:_2,taketa:_2,tsukumi:_2,usa:_2,usuki:_2,yufu:_2}],okayama:[1,{akaiwa:_2,asakuchi:_2,bizen:_2,hayashima:_2,ibara:_2,kagamino:_2,kasaoka:_2,kibichuo:_2,kumenan:_2,kurashiki:_2,maniwa:_2,misaki:_2,nagi:_2,niimi:_2,nishiawakura:_2,okayama:_2,satosho:_2,setouchi:_2,shinjo:_2,shoo:_2,soja:_2,takahashi:_2,tamano:_2,tsuyama:_2,wake:_2,yakage:_2}],okinawa:[1,{aguni:_2,ginowan:_2,ginoza:_2,gushikami:_2,haebaru:_2,higashi:_2,hirara:_2,iheya:_2,ishigaki:_2,ishikawa:_2,itoman:_2,izena:_2,kadena:_2,kin:_2,kitadaito:_2,kitanakagusuku:_2,kumejima:_2,kunigami:_2,minamidaito:_2,motobu:_2,nago:_2,naha:_2,nakagusuku:_2,nakijin:_2,nanjo:_2,nishihara:_2,ogimi:_2,okinawa:_2,onna:_2,shimoji:_2,taketomi:_2,tarama:_2,tokashiki:_2,tomigusuku:_2,tonaki:_2,urasoe:_2,uruma:_2,yaese:_2,yomitan:_2,yonabaru:_2,yonaguni:_2,zamami:_2}],osaka:[1,{abeno:_2,chihayaakasaka:_2,chuo:_2,daito:_2,fujiidera:_2,habikino:_2,hannan:_2,higashiosaka:_2,higashisumiyoshi:_2,higashiyodogawa:_2,hirakata:_2,ibaraki:_2,ikeda:_2,izumi:_2,izumiotsu:_2,izumisano:_2,kadoma:_2,kaizuka:_2,kanan:_2,kashiwara:_2,katano:_2,kawachinagano:_2,kishiwada:_2,kita:_2,kumatori:_2,matsubara:_2,minato:_2,minoh:_2,misaki:_2,moriguchi:_2,neyagawa:_2,nishi:_2,nose:_2,osakasayama:_2,sakai:_2,sayama:_2,sennan:_2,settsu:_2,shijonawate:_2,shimamoto:_2,suita:_2,tadaoka:_2,taishi:_2,tajiri:_2,takaishi:_2,takatsuki:_2,tondabayashi:_2,toyonaka:_2,toyono:_2,yao:_2}],saga:[1,{ariake:_2,arita:_2,fukudomi:_2,genkai:_2,hamatama:_2,hizen:_2,imari:_2,kamimine:_2,kanzaki:_2,karatsu:_2,kashima:_2,kitagata:_2,kitahata:_2,kiyama:_2,kouhoku:_2,kyuragi:_2,nishiarita:_2,ogi:_2,omachi:_2,ouchi:_2,saga:_2,shiroishi:_2,taku:_2,tara:_2,tosu:_2,yoshinogari:_2}],saitama:[1,{arakawa:_2,asaka:_2,chichibu:_2,fujimi:_2,fujimino:_2,fukaya:_2,hanno:_2,hanyu:_2,hasuda:_2,hatogaya:_2,hatoyama:_2,hidaka:_2,higashichichibu:_2,higashimatsuyama:_2,honjo:_2,ina:_2,iruma:_2,iwatsuki:_2,kamiizumi:_2,kamikawa:_2,kamisato:_2,kasukabe:_2,kawagoe:_2,kawaguchi:_2,kawajima:_2,kazo:_2,kitamoto:_2,koshigaya:_2,kounosu:_2,kuki:_2,kumagaya:_2,matsubushi:_2,minano:_2,misato:_2,miyashiro:_2,miyoshi:_2,moroyama:_2,nagatoro:_2,namegawa:_2,niiza:_2,ogano:_2,ogawa:_2,ogose:_2,okegawa:_2,omiya:_2,otaki:_2,ranzan:_2,ryokami:_2,saitama:_2,sakado:_2,satte:_2,sayama:_2,shiki:_2,shiraoka:_2,soka:_2,sugito:_2,toda:_2,tokigawa:_2,tokorozawa:_2,tsurugashima:_2,urawa:_2,warabi:_2,yashio:_2,yokoze:_2,yono:_2,yorii:_2,yoshida:_2,yoshikawa:_2,yoshimi:_2}],shiga:[1,{aisho:_2,gamo:_2,higashiomi:_2,hikone:_2,koka:_2,konan:_2,kosei:_2,koto:_2,kusatsu:_2,maibara:_2,moriyama:_2,nagahama:_2,nishiazai:_2,notogawa:_2,omihachiman:_2,otsu:_2,ritto:_2,ryuoh:_2,takashima:_2,takatsuki:_2,torahime:_2,toyosato:_2,yasu:_2}],shimane:[1,{akagi:_2,ama:_2,gotsu:_2,hamada:_2,higashiizumo:_2,hikawa:_2,hikimi:_2,izumo:_2,kakinoki:_2,masuda:_2,matsue:_2,misato:_2,nishinoshima:_2,ohda:_2,okinoshima:_2,okuizumo:_2,shimane:_2,tamayu:_2,tsuwano:_2,unnan:_2,yakumo:_2,yasugi:_2,yatsuka:_2}],shizuoka:[1,{arai:_2,atami:_2,fuji:_2,fujieda:_2,fujikawa:_2,fujinomiya:_2,fukuroi:_2,gotemba:_2,haibara:_2,hamamatsu:_2,higashiizu:_2,ito:_2,iwata:_2,izu:_2,izunokuni:_2,kakegawa:_2,kannami:_2,kawanehon:_2,kawazu:_2,kikugawa:_2,kosai:_2,makinohara:_2,matsuzaki:_2,minamiizu:_2,mishima:_2,morimachi:_2,nishiizu:_2,numazu:_2,omaezaki:_2,shimada:_2,shimizu:_2,shimoda:_2,shizuoka:_2,susono:_2,yaizu:_2,yoshida:_2}],tochigi:[1,{ashikaga:_2,bato:_2,haga:_2,ichikai:_2,iwafune:_2,kaminokawa:_2,kanuma:_2,karasuyama:_2,kuroiso:_2,mashiko:_2,mibu:_2,moka:_2,motegi:_2,nasu:_2,nasushiobara:_2,nikko:_2,nishikata:_2,nogi:_2,ohira:_2,ohtawara:_2,oyama:_2,sakura:_2,sano:_2,shimotsuke:_2,shioya:_2,takanezawa:_2,tochigi:_2,tsuga:_2,ujiie:_2,utsunomiya:_2,yaita:_2}],tokushima:[1,{aizumi:_2,anan:_2,ichiba:_2,itano:_2,kainan:_2,komatsushima:_2,matsushige:_2,mima:_2,minami:_2,miyoshi:_2,mugi:_2,nakagawa:_2,naruto:_2,sanagochi:_2,shishikui:_2,tokushima:_2,wajiki:_2}],tokyo:[1,{adachi:_2,akiruno:_2,akishima:_2,aogashima:_2,arakawa:_2,bunkyo:_2,chiyoda:_2,chofu:_2,chuo:_2,edogawa:_2,fuchu:_2,fussa:_2,hachijo:_2,hachioji:_2,hamura:_2,higashikurume:_2,higashimurayama:_2,higashiyamato:_2,hino:_2,hinode:_2,hinohara:_2,inagi:_2,itabashi:_2,katsushika:_2,kita:_2,kiyose:_2,kodaira:_2,koganei:_2,kokubunji:_2,komae:_2,koto:_2,kouzushima:_2,kunitachi:_2,machida:_2,meguro:_2,minato:_2,mitaka:_2,mizuho:_2,musashimurayama:_2,musashino:_2,nakano:_2,nerima:_2,ogasawara:_2,okutama:_2,ome:_2,oshima:_2,ota:_2,setagaya:_2,shibuya:_2,shinagawa:_2,shinjuku:_2,suginami:_2,sumida:_2,tachikawa:_2,taito:_2,tama:_2,toshima:_2}],tottori:[1,{chizu:_2,hino:_2,kawahara:_2,koge:_2,kotoura:_2,misasa:_2,nanbu:_2,nichinan:_2,sakaiminato:_2,tottori:_2,wakasa:_2,yazu:_2,yonago:_2}],toyama:[1,{asahi:_2,fuchu:_2,fukumitsu:_2,funahashi:_2,himi:_2,imizu:_2,inami:_2,johana:_2,kamiichi:_2,kurobe:_2,nakaniikawa:_2,namerikawa:_2,nanto:_2,nyuzen:_2,oyabe:_2,taira:_2,takaoka:_2,tateyama:_2,toga:_2,tonami:_2,toyama:_2,unazuki:_2,uozu:_2,yamada:_2}],wakayama:[1,{arida:_2,aridagawa:_2,gobo:_2,hashimoto:_2,hidaka:_2,hirogawa:_2,inami:_2,iwade:_2,kainan:_2,kamitonda:_2,katsuragi:_2,kimino:_2,kinokawa:_2,kitayama:_2,koya:_2,koza:_2,kozagawa:_2,kudoyama:_2,kushimoto:_2,mihama:_2,misato:_2,nachikatsuura:_2,shingu:_2,shirahama:_2,taiji:_2,tanabe:_2,wakayama:_2,yuasa:_2,yura:_2}],yamagata:[1,{asahi:_2,funagata:_2,higashine:_2,iide:_2,kahoku:_2,kaminoyama:_2,kaneyama:_2,kawanishi:_2,mamurogawa:_2,mikawa:_2,murayama:_2,nagai:_2,nakayama:_2,nanyo:_2,nishikawa:_2,obanazawa:_2,oe:_2,oguni:_2,ohkura:_2,oishida:_2,sagae:_2,sakata:_2,sakegawa:_2,shinjo:_2,shirataka:_2,shonai:_2,takahata:_2,tendo:_2,tozawa:_2,tsuruoka:_2,yamagata:_2,yamanobe:_2,yonezawa:_2,yuza:_2}],yamaguchi:[1,{abu:_2,hagi:_2,hikari:_2,hofu:_2,iwakuni:_2,kudamatsu:_2,mitou:_2,nagato:_2,oshima:_2,shimonoseki:_2,shunan:_2,tabuse:_2,tokuyama:_2,toyota:_2,ube:_2,yuu:_2}],yamanashi:[1,{chuo:_2,doshi:_2,fuefuki:_2,fujikawa:_2,fujikawaguchiko:_2,fujiyoshida:_2,hayakawa:_2,hokuto:_2,ichikawamisato:_2,kai:_2,kofu:_2,koshu:_2,kosuge:_2,"minami-alps":_2,minobu:_2,nakamichi:_2,nanbu:_2,narusawa:_2,nirasaki:_2,nishikatsura:_2,oshino:_2,otsuki:_2,showa:_2,tabayama:_2,tsuru:_2,uenohara:_2,yamanakako:_2,yamanashi:_2}],"xn--ehqz56n":_2,三重:_2,"xn--1lqs03n":_2,京都:_2,"xn--qqqt11m":_2,佐賀:_2,"xn--f6qx53a":_2,兵庫:_2,"xn--djrs72d6uy":_2,北海道:_2,"xn--mkru45i":_2,千葉:_2,"xn--0trq7p7nn":_2,和歌山:_2,"xn--5js045d":_2,埼玉:_2,"xn--kbrq7o":_2,大分:_2,"xn--pssu33l":_2,大阪:_2,"xn--ntsq17g":_2,奈良:_2,"xn--uisz3g":_2,宮城:_2,"xn--6btw5a":_2,宮崎:_2,"xn--1ctwo":_2,富山:_2,"xn--6orx2r":_2,山口:_2,"xn--rht61e":_2,山形:_2,"xn--rht27z":_2,山梨:_2,"xn--nit225k":_2,岐阜:_2,"xn--rht3d":_2,岡山:_2,"xn--djty4k":_2,岩手:_2,"xn--klty5x":_2,島根:_2,"xn--kltx9a":_2,広島:_2,"xn--kltp7d":_2,徳島:_2,"xn--c3s14m":_2,愛媛:_2,"xn--vgu402c":_2,愛知:_2,"xn--efvn9s":_2,新潟:_2,"xn--1lqs71d":_2,東京:_2,"xn--4pvxs":_2,栃木:_2,"xn--uuwu58a":_2,沖縄:_2,"xn--zbx025d":_2,滋賀:_2,"xn--8pvr4u":_2,熊本:_2,"xn--5rtp49c":_2,石川:_2,"xn--ntso0iqx3a":_2,神奈川:_2,"xn--elqq16h":_2,福井:_2,"xn--4it168d":_2,福岡:_2,"xn--klt787d":_2,福島:_2,"xn--rny31h":_2,秋田:_2,"xn--7t0a264c":_2,群馬:_2,"xn--uist22h":_2,茨城:_2,"xn--8ltr62k":_2,長崎:_2,"xn--2m4a15e":_2,長野:_2,"xn--32vp30h":_2,青森:_2,"xn--4it797k":_2,静岡:_2,"xn--5rtq34k":_2,香川:_2,"xn--k7yn95e":_2,高知:_2,"xn--tor131o":_2,鳥取:_2,"xn--d5qv7z876c":_2,鹿児島:_2,kawasaki:_21,kitakyushu:_21,kobe:_21,nagoya:_21,sapporo:_21,sendai:_21,yokohama:_21,buyshop:_3,fashionstore:_3,handcrafted:_3,kawaiishop:_3,supersale:_3,theshop:_3,"0am":_3,"0g0":_3,"0j0":_3,"0t0":_3,mydns:_3,pgw:_3,wjg:_3,usercontent:_3,angry:_3,babyblue:_3,babymilk:_3,backdrop:_3,bambina:_3,bitter:_3,blush:_3,boo:_3,boy:_3,boyfriend:_3,but:_3,candypop:_3,capoo:_3,catfood:_3,cheap:_3,chicappa:_3,chillout:_3,chips:_3,chowder:_3,chu:_3,ciao:_3,cocotte:_3,coolblog:_3,cranky:_3,cutegirl:_3,daa:_3,deca:_3,deci:_3,digick:_3,egoism:_3,fakefur:_3,fem:_3,flier:_3,floppy:_3,fool:_3,frenchkiss:_3,girlfriend:_3,girly:_3,gloomy:_3,gonna:_3,greater:_3,hacca:_3,heavy:_3,her:_3,hiho:_3,hippy:_3,holy:_3,hungry:_3,icurus:_3,itigo:_3,jellybean:_3,kikirara:_3,kill:_3,kilo:_3,kuron:_3,littlestar:_3,lolipopmc:_3,lolitapunk:_3,lomo:_3,lovepop:_3,lovesick:_3,main:_3,mods:_3,mond:_3,mongolian:_3,moo:_3,namaste:_3,nikita:_3,nobushi:_3,noor:_3,oops:_3,parallel:_3,parasite:_3,pecori:_3,peewee:_3,penne:_3,pepper:_3,perma:_3,pigboat:_3,pinoko:_3,punyu:_3,pupu:_3,pussycat:_3,pya:_3,raindrop:_3,readymade:_3,sadist:_3,schoolbus:_3,secret:_3,staba:_3,stripper:_3,sub:_3,sunnyday:_3,thick:_3,tonkotsu:_3,under:_3,upper:_3,velvet:_3,verse:_3,versus:_3,vivian:_3,watson:_3,weblike:_3,whitesnow:_3,zombie:_3,hateblo:_3,hatenablog:_3,hatenadiary:_3,"2-d":_3,bona:_3,crap:_3,daynight:_3,eek:_3,flop:_3,halfmoon:_3,jeez:_3,matrix:_3,mimoza:_3,netgamers:_3,nyanta:_3,o0o0:_3,rdy:_3,rgr:_3,rulez:_3,sakurastorage:[0,{isk01:_59,isk02:_59}],saloon:_3,sblo:_3,skr:_3,tank:_3,"uh-oh":_3,undo:_3,webaccel:[0,{rs:_3,user:_3}],websozai:_3,xii:_3}],ke:[1,{ac:_2,co:_2,go:_2,info:_2,me:_2,mobi:_2,ne:_2,or:_2,sc:_2}],kg:[1,{com:_2,edu:_2,gov:_2,mil:_2,net:_2,org:_2,us:_3,xx:_3,ae:_3}],kh:_21,ki:_60,km:[1,{ass:_2,com:_2,edu:_2,gov:_2,mil:_2,nom:_2,org:_2,prd:_2,tm:_2,asso:_2,coop:_2,gouv:_2,medecin:_2,notaires:_2,pharmaciens:_2,presse:_2,veterinaire:_2}],kn:[1,{edu:_2,gov:_2,net:_2,org:_2}],kp:[1,{com:_2,edu:_2,gov:_2,org:_2,rep:_2,tra:_2}],kr:[1,{ac:_2,ai:_2,co:_2,es:_2,go:_2,hs:_2,io:_2,it:_2,kg:_2,me:_2,mil:_2,ms:_2,ne:_2,or:_2,pe:_2,re:_2,sc:_2,busan:_2,chungbuk:_2,chungnam:_2,daegu:_2,daejeon:_2,gangwon:_2,gwangju:_2,gyeongbuk:_2,gyeonggi:_2,gyeongnam:_2,incheon:_2,jeju:_2,jeonbuk:_2,jeonnam:_2,seoul:_2,ulsan:_2,c01:_3,"eliv-api":_3,"eliv-cdn":_3,"eliv-dns":_3,mmv:_3,vki:_3}],kw:[1,{com:_2,edu:_2,emb:_2,gov:_2,ind:_2,net:_2,org:_2}],ky:_47,kz:[1,{com:_2,edu:_2,gov:_2,mil:_2,net:_2,org:_2,jcloud:_3}],la:[1,{com:_2,edu:_2,gov:_2,info:_2,int:_2,net:_2,org:_2,per:_2,bnr:_3}],lb:_4,lc:[1,{co:_2,com:_2,edu:_2,gov:_2,net:_2,org:_2,oy:_3}],li:_2,lk:[1,{ac:_2,assn:_2,com:_2,edu:_2,gov:_2,grp:_2,hotel:_2,int:_2,ltd:_2,net:_2,ngo:_2,org:_2,sch:_2,soc:_2,web:_2}],lr:_4,ls:[1,{ac:_2,biz:_2,co:_2,edu:_2,gov:_2,info:_2,net:_2,org:_2,sc:_2}],lt:_10,lu:[1,{"123website":_3}],lv:[1,{asn:_2,com:_2,conf:_2,edu:_2,gov:_2,id:_2,mil:_2,net:_2,org:_2}],ly:[1,{com:_2,edu:_2,gov:_2,id:_2,med:_2,net:_2,org:_2,plc:_2,sch:_2}],ma:[1,{ac:_2,co:_2,gov:_2,net:_2,org:_2,press:_2}],mc:[1,{asso:_2,tm:_2}],md:[1,{ir:_3}],me:[1,{ac:_2,co:_2,edu:_2,gov:_2,its:_2,net:_2,org:_2,priv:_2,c66:_3,craft:_3,edgestack:_3,filegear:_3,"filegear-sg":_3,lohmus:_3,barsy:_3,mcdir:_3,brasilia:_3,ddns:_3,dnsfor:_3,hopto:_3,loginto:_3,noip:_3,webhop:_3,soundcast:_3,tcp4:_3,vp4:_3,diskstation:_3,dscloud:_3,i234:_3,myds:_3,synology:_3,transip:_46,nohost:_3}],mg:[1,{co:_2,com:_2,edu:_2,gov:_2,mil:_2,nom:_2,org:_2,prd:_2}],mh:_2,mil:_2,mk:[1,{com:_2,edu:_2,gov:_2,inf:_2,name:_2,net:_2,org:_2}],ml:[1,{ac:_2,art:_2,asso:_2,com:_2,edu:_2,gouv:_2,gov:_2,info:_2,inst:_2,net:_2,org:_2,pr:_2,presse:_2}],mm:_21,mn:[1,{edu:_2,gov:_2,org:_2,nyc:_3}],mo:_4,mobi:[1,{barsy:_3,dscloud:_3}],mp:[1,{ju:_3}],mq:_2,mr:_10,ms:[1,{com:_2,edu:_2,gov:_2,net:_2,org:_2,minisite:_3}],mt:_47,mu:[1,{ac:_2,co:_2,com:_2,gov:_2,net:_2,or:_2,org:_2}],museum:_2,mv:[1,{aero:_2,biz:_2,com:_2,coop:_2,edu:_2,gov:_2,info:_2,int:_2,mil:_2,museum:_2,name:_2,net:_2,org:_2,pro:_2}],mw:[1,{ac:_2,biz:_2,co:_2,com:_2,coop:_2,edu:_2,gov:_2,int:_2,net:_2,org:_2}],mx:[1,{com:_2,edu:_2,gob:_2,net:_2,org:_2}],my:[1,{biz:_2,com:_2,edu:_2,gov:_2,mil:_2,name:_2,net:_2,org:_2}],mz:[1,{ac:_2,adv:_2,co:_2,edu:_2,gov:_2,mil:_2,net:_2,org:_2}],na:[1,{alt:_2,co:_2,com:_2,gov:_2,net:_2,org:_2}],name:[1,{her:_63,his:_63,ispmanager:_3,keenetic:_3}],nc:[1,{asso:_2,nom:_2}],ne:_2,net:[1,{adobeaemcloud:_3,"adobeio-static":_3,adobeioruntime:_3,akadns:_3,akamai:_3,"akamai-staging":_3,akamaiedge:_3,"akamaiedge-staging":_3,akamaihd:_3,"akamaihd-staging":_3,akamaiorigin:_3,"akamaiorigin-staging":_3,akamaized:_3,"akamaized-staging":_3,edgekey:_3,"edgekey-staging":_3,edgesuite:_3,"edgesuite-staging":_3,alwaysdata:_3,myamaze:_3,cloudfront:_3,appudo:_3,"atlassian-dev":[0,{prod:_55}],myfritz:_3,shopselect:_3,blackbaudcdn:_3,boomla:_3,bplaced:_3,square7:_3,cdn77:[0,{r:_3}],"cdn77-ssl":_3,gb:_3,hu:_3,jp:_3,se:_3,uk:_3,clickrising:_3,"ddns-ip":_3,"dns-cloud":_3,"dns-dynamic":_3,cloudaccess:_3,cloudflare:[2,{cdn:_3}],cloudflareanycast:_55,cloudflarecn:_55,cloudflareglobal:_55,ctfcloud:_3,"feste-ip":_3,"knx-server":_3,"static-access":_3,cryptonomic:_6,dattolocal:_3,mydatto:_3,debian:_3,definima:_3,deno:_3,icp:_6,de5:_3,"at-band-camp":_3,blogdns:_3,"broke-it":_3,buyshouses:_3,dnsalias:_3,dnsdojo:_3,"does-it":_3,dontexist:_3,dynalias:_3,dynathome:_3,endofinternet:_3,"from-az":_3,"from-co":_3,"from-la":_3,"from-ny":_3,"gets-it":_3,"ham-radio-op":_3,homeftp:_3,homeip:_3,homelinux:_3,homeunix:_3,"in-the-band":_3,"is-a-chef":_3,"is-a-geek":_3,"isa-geek":_3,"kicks-ass":_3,"office-on-the":_3,podzone:_3,"scrapper-site":_3,selfip:_3,"sells-it":_3,servebbs:_3,serveftp:_3,thruhere:_3,webhop:_3,casacam:_3,dynu:_3,dynv6:_3,twmail:_3,ru:_3,channelsdvr:[2,{u:_3}],fastly:[0,{freetls:_3,map:_3,prod:[0,{a:_3,global:_3}],ssl:[0,{a:_3,b:_3,global:_3}]}],fastlylb:[2,{map:_3}],"keyword-on":_3,"live-on":_3,"server-on":_3,"cdn-edges":_3,heteml:_3,cloudfunctions:_3,"grafana-dev":_3,iobb:_3,moonscale:_3,"in-dsl":_3,"in-vpn":_3,oninferno:_3,botdash:_3,"apps-1and1":_3,ipifony:_3,cloudjiffy:[2,{"fra1-de":_3,"west1-us":_3}],elastx:[0,{"jls-sto1":_3,"jls-sto2":_3,"jls-sto3":_3}],massivegrid:[0,{paas:[0,{"fr-1":_3,"lon-1":_3,"lon-2":_3,"ny-1":_3,"ny-2":_3,"sg-1":_3}]}],saveincloud:[0,{jelastic:_3,"nordeste-idc":_3}],scaleforce:_48,kinghost:_3,uni5:_3,krellian:_3,ggff:_3,localto:_6,barsy:_3,luyani:_3,memset:_3,"azure-api":_3,"azure-mobile":_3,azureedge:_3,azurefd:_3,azurestaticapps:[2,{1:_3,2:_3,3:_3,4:_3,5:_3,6:_3,7:_3,centralus:_3,eastasia:_3,eastus2:_3,westeurope:_3,westus2:_3}],azurewebsites:_3,cloudapp:_3,trafficmanager:_3,usgovcloudapi:[0,{servicebus:_3}],usgovcloudapp:_3,windows:[0,{core:[0,{blob:_3}],servicebus:_3}],mynetname:[0,{sn:_3}],routingthecloud:_3,bounceme:_3,ddns:_3,"eating-organic":_3,mydissent:_3,myeffect:_3,mymediapc:_3,mypsx:_3,mysecuritycamera:_3,nhlfan:_3,"no-ip":_3,pgafan:_3,privatizehealthinsurance:_3,redirectme:_3,serveblog:_3,serveminecraft:_3,sytes:_3,dnsup:_3,hicam:_3,"now-dns":_3,ownip:_3,vpndns:_3,cloudycluster:_3,ovh:[0,{hosting:_6,webpaas:_6}],rackmaze:_3,myradweb:_3,in:_3,"subsc-pay":_3,squares:_3,schokokeks:_3,"firewall-gateway":_3,seidat:_3,senseering:_3,siteleaf:_3,mafelo:_3,myspreadshop:_3,"vps-host":[2,{jelastic:[0,{atl:_3,njs:_3,ric:_3}]}],srcf:[0,{soc:_3,user:_3}],supabase:_3,dsmynas:_3,familyds:_3,ts:[2,{c:_6}],torproject:[2,{pages:_3}],tunnelmole:_3,vusercontent:_3,"reserve-online":_3,localcert:_3,"community-pro":_3,meinforum:_3,yandexcloud:[2,{storage:_3,website:_3}],za:_3,zabc:_3}],nf:[1,{arts:_2,com:_2,firm:_2,info:_2,net:_2,other:_2,per:_2,rec:_2,store:_2,web:_2}],ng:[1,{com:_2,edu:_2,gov:_2,i:_2,mil:_2,mobi:_2,name:_2,net:_2,org:_2,sch:_2,biz:[2,{co:_3,dl:_3,go:_3,lg:_3,on:_3}],col:_3,firm:_3,gen:_3,ltd:_3,ngo:_3,plc:_3}],ni:[1,{ac:_2,biz:_2,co:_2,com:_2,edu:_2,gob:_2,in:_2,info:_2,int:_2,mil:_2,net:_2,nom:_2,org:_2,web:_2}],nl:[1,{co:_3,"hosting-cluster":_3,gov:_3,khplay:_3,"123website":_3,myspreadshop:_3,transurl:_6,cistron:_3,demon:_3}],no:[1,{fhs:_2,folkebibl:_2,fylkesbibl:_2,idrett:_2,museum:_2,priv:_2,vgs:_2,dep:_2,herad:_2,kommune:_2,mil:_2,stat:_2,aa:_64,ah:_64,bu:_64,fm:_64,hl:_64,hm:_64,"jan-mayen":_64,mr:_64,nl:_64,nt:_64,of:_64,ol:_64,oslo:_64,rl:_64,sf:_64,st:_64,svalbard:_64,tm:_64,tr:_64,va:_64,vf:_64,akrehamn:_2,"xn--krehamn-dxa":_2,åkrehamn:_2,algard:_2,"xn--lgrd-poac":_2,ålgård:_2,arna:_2,bronnoysund:_2,"xn--brnnysund-m8ac":_2,brønnøysund:_2,brumunddal:_2,bryne:_2,drobak:_2,"xn--drbak-wua":_2,drøbak:_2,egersund:_2,fetsund:_2,floro:_2,"xn--flor-jra":_2,florø:_2,fredrikstad:_2,hokksund:_2,honefoss:_2,"xn--hnefoss-q1a":_2,hønefoss:_2,jessheim:_2,jorpeland:_2,"xn--jrpeland-54a":_2,jørpeland:_2,kirkenes:_2,kopervik:_2,krokstadelva:_2,langevag:_2,"xn--langevg-jxa":_2,langevåg:_2,leirvik:_2,mjondalen:_2,"xn--mjndalen-64a":_2,mjøndalen:_2,"mo-i-rana":_2,mosjoen:_2,"xn--mosjen-eya":_2,mosjøen:_2,nesoddtangen:_2,orkanger:_2,osoyro:_2,"xn--osyro-wua":_2,osøyro:_2,raholt:_2,"xn--rholt-mra":_2,råholt:_2,sandnessjoen:_2,"xn--sandnessjen-ogb":_2,sandnessjøen:_2,skedsmokorset:_2,slattum:_2,spjelkavik:_2,stathelle:_2,stavern:_2,stjordalshalsen:_2,"xn--stjrdalshalsen-sqb":_2,stjørdalshalsen:_2,tananger:_2,tranby:_2,vossevangen:_2,aarborte:_2,aejrie:_2,afjord:_2,"xn--fjord-lra":_2,åfjord:_2,agdenes:_2,akershus:_65,aknoluokta:_2,"xn--koluokta-7ya57h":_2,ákŋoluokta:_2,al:_2,"xn--l-1fa":_2,ål:_2,alaheadju:_2,"xn--laheadju-7ya":_2,álaheadju:_2,alesund:_2,"xn--lesund-hua":_2,ålesund:_2,alstahaug:_2,alta:_2,"xn--lt-liac":_2,áltá:_2,alvdal:_2,amli:_2,"xn--mli-tla":_2,åmli:_2,amot:_2,"xn--mot-tla":_2,åmot:_2,andasuolo:_2,andebu:_2,andoy:_2,"xn--andy-ira":_2,andøy:_2,ardal:_2,"xn--rdal-poa":_2,årdal:_2,aremark:_2,arendal:_2,"xn--s-1fa":_2,ås:_2,aseral:_2,"xn--seral-lra":_2,åseral:_2,asker:_2,askim:_2,askoy:_2,"xn--asky-ira":_2,askøy:_2,askvoll:_2,asnes:_2,"xn--snes-poa":_2,åsnes:_2,audnedaln:_2,aukra:_2,aure:_2,aurland:_2,"aurskog-holand":_2,"xn--aurskog-hland-jnb":_2,"aurskog-høland":_2,austevoll:_2,austrheim:_2,averoy:_2,"xn--avery-yua":_2,averøy:_2,badaddja:_2,"xn--bdddj-mrabd":_2,bådåddjå:_2,"xn--brum-voa":_2,bærum:_2,bahcavuotna:_2,"xn--bhcavuotna-s4a":_2,báhcavuotna:_2,bahccavuotna:_2,"xn--bhccavuotna-k7a":_2,báhccavuotna:_2,baidar:_2,"xn--bidr-5nac":_2,báidár:_2,bajddar:_2,"xn--bjddar-pta":_2,bájddar:_2,balat:_2,"xn--blt-elab":_2,bálát:_2,balestrand:_2,ballangen:_2,balsfjord:_2,bamble:_2,bardu:_2,barum:_2,batsfjord:_2,"xn--btsfjord-9za":_2,båtsfjord:_2,bearalvahki:_2,"xn--bearalvhki-y4a":_2,bearalváhki:_2,beardu:_2,beiarn:_2,berg:_2,bergen:_2,berlevag:_2,"xn--berlevg-jxa":_2,berlevåg:_2,bievat:_2,"xn--bievt-0qa":_2,bievát:_2,bindal:_2,birkenes:_2,bjerkreim:_2,bjugn:_2,bodo:_2,"xn--bod-2na":_2,bodø:_2,bokn:_2,bomlo:_2,"xn--bmlo-gra":_2,bømlo:_2,bremanger:_2,bronnoy:_2,"xn--brnny-wuac":_2,brønnøy:_2,budejju:_2,buskerud:_65,bygland:_2,bykle:_2,cahcesuolo:_2,"xn--hcesuolo-7ya35b":_2,čáhcesuolo:_2,davvenjarga:_2,"xn--davvenjrga-y4a":_2,davvenjárga:_2,davvesiida:_2,deatnu:_2,dielddanuorri:_2,divtasvuodna:_2,divttasvuotna:_2,donna:_2,"xn--dnna-gra":_2,dønna:_2,dovre:_2,drammen:_2,drangedal:_2,dyroy:_2,"xn--dyry-ira":_2,dyrøy:_2,eid:_2,eidfjord:_2,eidsberg:_2,eidskog:_2,eidsvoll:_2,eigersund:_2,elverum:_2,enebakk:_2,engerdal:_2,etne:_2,etnedal:_2,evenassi:_2,"xn--eveni-0qa01ga":_2,evenášši:_2,evenes:_2,"evje-og-hornnes":_2,farsund:_2,fauske:_2,fedje:_2,fet:_2,finnoy:_2,"xn--finny-yua":_2,finnøy:_2,fitjar:_2,fjaler:_2,fjell:_2,fla:_2,"xn--fl-zia":_2,flå:_2,flakstad:_2,flatanger:_2,flekkefjord:_2,flesberg:_2,flora:_2,folldal:_2,forde:_2,"xn--frde-gra":_2,førde:_2,forsand:_2,fosnes:_2,"xn--frna-woa":_2,fræna:_2,frana:_2,frei:_2,frogn:_2,froland:_2,frosta:_2,froya:_2,"xn--frya-hra":_2,frøya:_2,fuoisku:_2,fuossko:_2,fusa:_2,fyresdal:_2,gaivuotna:_2,"xn--givuotna-8ya":_2,gáivuotna:_2,galsa:_2,"xn--gls-elac":_2,gálsá:_2,gamvik:_2,gangaviika:_2,"xn--ggaviika-8ya47h":_2,gáŋgaviika:_2,gaular:_2,gausdal:_2,giehtavuoatna:_2,gildeskal:_2,"xn--gildeskl-g0a":_2,gildeskål:_2,giske:_2,gjemnes:_2,gjerdrum:_2,gjerstad:_2,gjesdal:_2,gjovik:_2,"xn--gjvik-wua":_2,gjøvik:_2,gloppen:_2,gol:_2,gran:_2,grane:_2,granvin:_2,gratangen:_2,grimstad:_2,grong:_2,grue:_2,gulen:_2,guovdageaidnu:_2,ha:_2,"xn--h-2fa":_2,hå:_2,habmer:_2,"xn--hbmer-xqa":_2,hábmer:_2,hadsel:_2,"xn--hgebostad-g3a":_2,hægebostad:_2,hagebostad:_2,halden:_2,halsa:_2,hamar:_2,hamaroy:_2,hammarfeasta:_2,"xn--hmmrfeasta-s4ac":_2,hámmárfeasta:_2,hammerfest:_2,hapmir:_2,"xn--hpmir-xqa":_2,hápmir:_2,haram:_2,hareid:_2,harstad:_2,hasvik:_2,hattfjelldal:_2,haugesund:_2,hedmark:[0,{os:_2,valer:_2,"xn--vler-qoa":_2,våler:_2}],hemne:_2,hemnes:_2,hemsedal:_2,hitra:_2,hjartdal:_2,hjelmeland:_2,hobol:_2,"xn--hobl-ira":_2,hobøl:_2,hof:_2,hol:_2,hole:_2,holmestrand:_2,holtalen:_2,"xn--holtlen-hxa":_2,holtålen:_2,hordaland:[0,{os:_2}],hornindal:_2,horten:_2,hoyanger:_2,"xn--hyanger-q1a":_2,høyanger:_2,hoylandet:_2,"xn--hylandet-54a":_2,høylandet:_2,hurdal:_2,hurum:_2,hvaler:_2,hyllestad:_2,ibestad:_2,inderoy:_2,"xn--indery-fya":_2,inderøy:_2,iveland:_2,ivgu:_2,jevnaker:_2,jolster:_2,"xn--jlster-bya":_2,jølster:_2,jondal:_2,kafjord:_2,"xn--kfjord-iua":_2,kåfjord:_2,karasjohka:_2,"xn--krjohka-hwab49j":_2,kárášjohka:_2,karasjok:_2,karlsoy:_2,karmoy:_2,"xn--karmy-yua":_2,karmøy:_2,kautokeino:_2,klabu:_2,"xn--klbu-woa":_2,klæbu:_2,klepp:_2,kongsberg:_2,kongsvinger:_2,kraanghke:_2,"xn--kranghke-b0a":_2,kråanghke:_2,kragero:_2,"xn--krager-gya":_2,kragerø:_2,kristiansand:_2,kristiansund:_2,krodsherad:_2,"xn--krdsherad-m8a":_2,krødsherad:_2,"xn--kvfjord-nxa":_2,kvæfjord:_2,"xn--kvnangen-k0a":_2,kvænangen:_2,kvafjord:_2,kvalsund:_2,kvam:_2,kvanangen:_2,kvinesdal:_2,kvinnherad:_2,kviteseid:_2,kvitsoy:_2,"xn--kvitsy-fya":_2,kvitsøy:_2,laakesvuemie:_2,"xn--lrdal-sra":_2,lærdal:_2,lahppi:_2,"xn--lhppi-xqa":_2,láhppi:_2,lardal:_2,larvik:_2,lavagis:_2,lavangen:_2,leangaviika:_2,"xn--leagaviika-52b":_2,leaŋgaviika:_2,lebesby:_2,leikanger:_2,leirfjord:_2,leka:_2,leksvik:_2,lenvik:_2,lerdal:_2,lesja:_2,levanger:_2,lier:_2,lierne:_2,lillehammer:_2,lillesand:_2,lindas:_2,"xn--linds-pra":_2,lindås:_2,lindesnes:_2,loabat:_2,"xn--loabt-0qa":_2,loabát:_2,lodingen:_2,"xn--ldingen-q1a":_2,lødingen:_2,lom:_2,loppa:_2,lorenskog:_2,"xn--lrenskog-54a":_2,lørenskog:_2,loten:_2,"xn--lten-gra":_2,løten:_2,lund:_2,lunner:_2,luroy:_2,"xn--lury-ira":_2,lurøy:_2,luster:_2,lyngdal:_2,lyngen:_2,malatvuopmi:_2,"xn--mlatvuopmi-s4a":_2,málatvuopmi:_2,malselv:_2,"xn--mlselv-iua":_2,målselv:_2,malvik:_2,mandal:_2,marker:_2,marnardal:_2,masfjorden:_2,masoy:_2,"xn--msy-ula0h":_2,måsøy:_2,"matta-varjjat":_2,"xn--mtta-vrjjat-k7af":_2,"mátta-várjjat":_2,meland:_2,meldal:_2,melhus:_2,meloy:_2,"xn--mely-ira":_2,meløy:_2,meraker:_2,"xn--merker-kua":_2,meråker:_2,midsund:_2,"midtre-gauldal":_2,moareke:_2,"xn--moreke-jua":_2,moåreke:_2,modalen:_2,modum:_2,molde:_2,"more-og-romsdal":[0,{heroy:_2,sande:_2}],"xn--mre-og-romsdal-qqb":[0,{"xn--hery-ira":_2,sande:_2}],"møre-og-romsdal":[0,{herøy:_2,sande:_2}],moskenes:_2,moss:_2,muosat:_2,"xn--muost-0qa":_2,muosát:_2,naamesjevuemie:_2,"xn--nmesjevuemie-tcba":_2,nååmesjevuemie:_2,"xn--nry-yla5g":_2,nærøy:_2,namdalseid:_2,namsos:_2,namsskogan:_2,nannestad:_2,naroy:_2,narviika:_2,narvik:_2,naustdal:_2,navuotna:_2,"xn--nvuotna-hwa":_2,návuotna:_2,"nedre-eiker":_2,nesna:_2,nesodden:_2,nesseby:_2,nesset:_2,nissedal:_2,nittedal:_2,"nord-aurdal":_2,"nord-fron":_2,"nord-odal":_2,norddal:_2,nordkapp:_2,nordland:[0,{bo:_2,"xn--b-5ga":_2,bø:_2,heroy:_2,"xn--hery-ira":_2,herøy:_2}],"nordre-land":_2,nordreisa:_2,"nore-og-uvdal":_2,notodden:_2,notteroy:_2,"xn--nttery-byae":_2,nøtterøy:_2,odda:_2,oksnes:_2,"xn--ksnes-uua":_2,øksnes:_2,omasvuotna:_2,oppdal:_2,oppegard:_2,"xn--oppegrd-ixa":_2,oppegård:_2,orkdal:_2,orland:_2,"xn--rland-uua":_2,ørland:_2,orskog:_2,"xn--rskog-uua":_2,ørskog:_2,orsta:_2,"xn--rsta-fra":_2,ørsta:_2,osen:_2,osteroy:_2,"xn--ostery-fya":_2,osterøy:_2,ostfold:[0,{valer:_2}],"xn--stfold-9xa":[0,{"xn--vler-qoa":_2}],østfold:[0,{våler:_2}],"ostre-toten":_2,"xn--stre-toten-zcb":_2,"østre-toten":_2,overhalla:_2,"ovre-eiker":_2,"xn--vre-eiker-k8a":_2,"øvre-eiker":_2,oyer:_2,"xn--yer-zna":_2,øyer:_2,oygarden:_2,"xn--ygarden-p1a":_2,øygarden:_2,"oystre-slidre":_2,"xn--ystre-slidre-ujb":_2,"øystre-slidre":_2,porsanger:_2,porsangu:_2,"xn--porsgu-sta26f":_2,porsáŋgu:_2,porsgrunn:_2,rade:_2,"xn--rde-ula":_2,råde:_2,radoy:_2,"xn--rady-ira":_2,radøy:_2,"xn--rlingen-mxa":_2,rælingen:_2,rahkkeravju:_2,"xn--rhkkervju-01af":_2,ráhkkerávju:_2,raisa:_2,"xn--risa-5na":_2,ráisa:_2,rakkestad:_2,ralingen:_2,rana:_2,randaberg:_2,rauma:_2,rendalen:_2,rennebu:_2,rennesoy:_2,"xn--rennesy-v1a":_2,rennesøy:_2,rindal:_2,ringebu:_2,ringerike:_2,ringsaker:_2,risor:_2,"xn--risr-ira":_2,risør:_2,rissa:_2,roan:_2,rodoy:_2,"xn--rdy-0nab":_2,rødøy:_2,rollag:_2,romsa:_2,romskog:_2,"xn--rmskog-bya":_2,rømskog:_2,roros:_2,"xn--rros-gra":_2,røros:_2,rost:_2,"xn--rst-0na":_2,røst:_2,royken:_2,"xn--ryken-vua":_2,røyken:_2,royrvik:_2,"xn--ryrvik-bya":_2,røyrvik:_2,ruovat:_2,rygge:_2,salangen:_2,salat:_2,"xn--slat-5na":_2,sálat:_2,"xn--slt-elab":_2,sálát:_2,saltdal:_2,samnanger:_2,sandefjord:_2,sandnes:_2,sandoy:_2,"xn--sandy-yua":_2,sandøy:_2,sarpsborg:_2,sauda:_2,sauherad:_2,sel:_2,selbu:_2,selje:_2,seljord:_2,siellak:_2,sigdal:_2,siljan:_2,sirdal:_2,skanit:_2,"xn--sknit-yqa":_2,skánit:_2,skanland:_2,"xn--sknland-fxa":_2,skånland:_2,skaun:_2,skedsmo:_2,ski:_2,skien:_2,skierva:_2,"xn--skierv-uta":_2,skiervá:_2,skiptvet:_2,skjak:_2,"xn--skjk-soa":_2,skjåk:_2,skjervoy:_2,"xn--skjervy-v1a":_2,skjervøy:_2,skodje:_2,smola:_2,"xn--smla-hra":_2,smøla:_2,snaase:_2,"xn--snase-nra":_2,snåase:_2,snasa:_2,"xn--snsa-roa":_2,snåsa:_2,snillfjord:_2,snoasa:_2,sogndal:_2,sogne:_2,"xn--sgne-gra":_2,søgne:_2,sokndal:_2,sola:_2,solund:_2,somna:_2,"xn--smna-gra":_2,sømna:_2,"sondre-land":_2,"xn--sndre-land-0cb":_2,"søndre-land":_2,songdalen:_2,"sor-aurdal":_2,"xn--sr-aurdal-l8a":_2,"sør-aurdal":_2,"sor-fron":_2,"xn--sr-fron-q1a":_2,"sør-fron":_2,"sor-odal":_2,"xn--sr-odal-q1a":_2,"sør-odal":_2,"sor-varanger":_2,"xn--sr-varanger-ggb":_2,"sør-varanger":_2,sorfold:_2,"xn--srfold-bya":_2,sørfold:_2,sorreisa:_2,"xn--srreisa-q1a":_2,sørreisa:_2,sortland:_2,sorum:_2,"xn--srum-gra":_2,sørum:_2,spydeberg:_2,stange:_2,stavanger:_2,steigen:_2,steinkjer:_2,stjordal:_2,"xn--stjrdal-s1a":_2,stjørdal:_2,stokke:_2,"stor-elvdal":_2,stord:_2,stordal:_2,storfjord:_2,strand:_2,stranda:_2,stryn:_2,sula:_2,suldal:_2,sund:_2,sunndal:_2,surnadal:_2,sveio:_2,svelvik:_2,sykkylven:_2,tana:_2,telemark:[0,{bo:_2,"xn--b-5ga":_2,bø:_2}],time:_2,tingvoll:_2,tinn:_2,tjeldsund:_2,tjome:_2,"xn--tjme-hra":_2,tjøme:_2,tokke:_2,tolga:_2,tonsberg:_2,"xn--tnsberg-q1a":_2,tønsberg:_2,torsken:_2,"xn--trna-woa":_2,træna:_2,trana:_2,tranoy:_2,"xn--trany-yua":_2,tranøy:_2,troandin:_2,trogstad:_2,"xn--trgstad-r1a":_2,trøgstad:_2,tromsa:_2,tromso:_2,"xn--troms-zua":_2,tromsø:_2,trondheim:_2,trysil:_2,tvedestrand:_2,tydal:_2,tynset:_2,tysfjord:_2,tysnes:_2,"xn--tysvr-vra":_2,tysvær:_2,tysvar:_2,ullensaker:_2,ullensvang:_2,ulvik:_2,unjarga:_2,"xn--unjrga-rta":_2,unjárga:_2,utsira:_2,vaapste:_2,vadso:_2,"xn--vads-jra":_2,vadsø:_2,"xn--vry-yla5g":_2,værøy:_2,vaga:_2,"xn--vg-yiab":_2,vågå:_2,vagan:_2,"xn--vgan-qoa":_2,vågan:_2,vagsoy:_2,"xn--vgsy-qoa0j":_2,vågsøy:_2,vaksdal:_2,valle:_2,vang:_2,vanylven:_2,vardo:_2,"xn--vard-jra":_2,vardø:_2,varggat:_2,"xn--vrggt-xqad":_2,várggát:_2,varoy:_2,vefsn:_2,vega:_2,vegarshei:_2,"xn--vegrshei-c0a":_2,vegårshei:_2,vennesla:_2,verdal:_2,verran:_2,vestby:_2,vestfold:[0,{sande:_2}],vestnes:_2,"vestre-slidre":_2,"vestre-toten":_2,vestvagoy:_2,"xn--vestvgy-ixa6o":_2,vestvågøy:_2,vevelstad:_2,vik:_2,vikna:_2,vindafjord:_2,voagat:_2,volda:_2,voss:_2,co:_3,"123hjemmeside":_3,myspreadshop:_3}],np:_21,nr:_60,nu:[1,{merseine:_3,mine:_3,shacknet:_3,enterprisecloud:_3}],nz:[1,{ac:_2,co:_2,cri:_2,geek:_2,gen:_2,govt:_2,health:_2,iwi:_2,kiwi:_2,maori:_2,"xn--mori-qsa":_2,māori:_2,mil:_2,net:_2,org:_2,parliament:_2,school:_2,cloudns:_3}],om:[1,{co:_2,com:_2,edu:_2,gov:_2,med:_2,museum:_2,net:_2,org:_2,pro:_2}],onion:_2,org:[1,{altervista:_3,pimienta:_3,poivron:_3,potager:_3,sweetpepper:_3,cdn77:[0,{c:_3,rsc:_3}],"cdn77-secure":[0,{origin:[0,{ssl:_3}]}],ae:_3,cloudns:_3,"ip-dynamic":_3,ddnss:_3,dpdns:_3,duckdns:_3,tunk:_3,blogdns:_3,blogsite:_3,boldlygoingnowhere:_3,dnsalias:_3,dnsdojo:_3,doesntexist:_3,dontexist:_3,doomdns:_3,dvrdns:_3,dynalias:_3,dyndns:[2,{go:_3,home:_3}],endofinternet:_3,endoftheinternet:_3,"from-me":_3,"game-host":_3,gotdns:_3,"hobby-site":_3,homedns:_3,homeftp:_3,homelinux:_3,homeunix:_3,"is-a-bruinsfan":_3,"is-a-candidate":_3,"is-a-celticsfan":_3,"is-a-chef":_3,"is-a-geek":_3,"is-a-knight":_3,"is-a-linux-user":_3,"is-a-patsfan":_3,"is-a-soxfan":_3,"is-found":_3,"is-lost":_3,"is-saved":_3,"is-very-bad":_3,"is-very-evil":_3,"is-very-good":_3,"is-very-nice":_3,"is-very-sweet":_3,"isa-geek":_3,"kicks-ass":_3,misconfused:_3,podzone:_3,readmyblog:_3,selfip:_3,sellsyourhome:_3,servebbs:_3,serveftp:_3,servegame:_3,"stuff-4-sale":_3,webhop:_3,accesscam:_3,camdvr:_3,freeddns:_3,mywire:_3,webredirect:_3,twmail:_3,eu:[2,{al:_3,asso:_3,at:_3,au:_3,be:_3,bg:_3,ca:_3,cd:_3,ch:_3,cn:_3,cy:_3,cz:_3,de:_3,dk:_3,edu:_3,ee:_3,es:_3,fi:_3,fr:_3,gr:_3,hr:_3,hu:_3,ie:_3,il:_3,in:_3,int:_3,is:_3,it:_3,jp:_3,kr:_3,lt:_3,lu:_3,lv:_3,me:_3,mk:_3,mt:_3,my:_3,net:_3,ng:_3,nl:_3,no:_3,nz:_3,pl:_3,pt:_3,ro:_3,ru:_3,se:_3,si:_3,sk:_3,tr:_3,uk:_3,us:_3}],fedorainfracloud:_3,fedorapeople:_3,fedoraproject:[0,{cloud:_3,os:_45,stg:[0,{os:_45}]}],freedesktop:_3,hatenadiary:_3,hepforge:_3,"in-dsl":_3,"in-vpn":_3,js:_3,barsy:_3,mayfirst:_3,routingthecloud:_3,bmoattachments:_3,"cable-modem":_3,collegefan:_3,couchpotatofries:_3,hopto:_3,mlbfan:_3,myftp:_3,mysecuritycamera:_3,nflfan:_3,"no-ip":_3,"read-books":_3,ufcfan:_3,zapto:_3,dynserv:_3,"now-dns":_3,"is-local":_3,httpbin:_3,pubtls:_3,jpn:_3,"my-firewall":_3,myfirewall:_3,spdns:_3,"small-web":_3,dsmynas:_3,familyds:_3,teckids:_59,tuxfamily:_3,hk:_3,us:_3,toolforge:_3,wmcloud:[2,{beta:_3}],wmflabs:_3,za:_3}],pa:[1,{abo:_2,ac:_2,com:_2,edu:_2,gob:_2,ing:_2,med:_2,net:_2,nom:_2,org:_2,sld:_2}],pe:[1,{com:_2,edu:_2,gob:_2,mil:_2,net:_2,nom:_2,org:_2}],pf:[1,{com:_2,edu:_2,org:_2}],pg:_21,ph:[1,{com:_2,edu:_2,gov:_2,i:_2,mil:_2,net:_2,ngo:_2,org:_2,cloudns:_3}],pk:[1,{ac:_2,biz:_2,com:_2,edu:_2,fam:_2,gkp:_2,gob:_2,gog:_2,gok:_2,gop:_2,gos:_2,gov:_2,net:_2,org:_2,web:_2}],pl:[1,{com:_2,net:_2,org:_2,agro:_2,aid:_2,atm:_2,auto:_2,biz:_2,edu:_2,gmina:_2,gsm:_2,info:_2,mail:_2,media:_2,miasta:_2,mil:_2,nieruchomosci:_2,nom:_2,pc:_2,powiat:_2,priv:_2,realestate:_2,rel:_2,sex:_2,shop:_2,sklep:_2,sos:_2,szkola:_2,targi:_2,tm:_2,tourism:_2,travel:_2,turystyka:_2,gov:[1,{ap:_2,griw:_2,ic:_2,is:_2,kmpsp:_2,konsulat:_2,kppsp:_2,kwp:_2,kwpsp:_2,mup:_2,mw:_2,oia:_2,oirm:_2,oke:_2,oow:_2,oschr:_2,oum:_2,pa:_2,pinb:_2,piw:_2,po:_2,pr:_2,psp:_2,psse:_2,pup:_2,rzgw:_2,sa:_2,sdn:_2,sko:_2,so:_2,sr:_2,starostwo:_2,ug:_2,ugim:_2,um:_2,umig:_2,upow:_2,uppo:_2,us:_2,uw:_2,uzs:_2,wif:_2,wiih:_2,winb:_2,wios:_2,witd:_2,wiw:_2,wkz:_2,wsa:_2,wskr:_2,wsse:_2,wuoz:_2,wzmiuw:_2,zp:_2,zpisdn:_2}],augustow:_2,"babia-gora":_2,bedzin:_2,beskidy:_2,bialowieza:_2,bialystok:_2,bielawa:_2,bieszczady:_2,boleslawiec:_2,bydgoszcz:_2,bytom:_2,cieszyn:_2,czeladz:_2,czest:_2,dlugoleka:_2,elblag:_2,elk:_2,glogow:_2,gniezno:_2,gorlice:_2,grajewo:_2,ilawa:_2,jaworzno:_2,"jelenia-gora":_2,jgora:_2,kalisz:_2,karpacz:_2,kartuzy:_2,kaszuby:_2,katowice:_2,"kazimierz-dolny":_2,kepno:_2,ketrzyn:_2,klodzko:_2,kobierzyce:_2,kolobrzeg:_2,konin:_2,konskowola:_2,kutno:_2,lapy:_2,lebork:_2,legnica:_2,lezajsk:_2,limanowa:_2,lomza:_2,lowicz:_2,lubin:_2,lukow:_2,malbork:_2,malopolska:_2,mazowsze:_2,mazury:_2,mielec:_2,mielno:_2,mragowo:_2,naklo:_2,nowaruda:_2,nysa:_2,olawa:_2,olecko:_2,olkusz:_2,olsztyn:_2,opoczno:_2,opole:_2,ostroda:_2,ostroleka:_2,ostrowiec:_2,ostrowwlkp:_2,pila:_2,pisz:_2,podhale:_2,podlasie:_2,polkowice:_2,pomorskie:_2,pomorze:_2,prochowice:_2,pruszkow:_2,przeworsk:_2,pulawy:_2,radom:_2,"rawa-maz":_2,rybnik:_2,rzeszow:_2,sanok:_2,sejny:_2,skoczow:_2,slask:_2,slupsk:_2,sosnowiec:_2,"stalowa-wola":_2,starachowice:_2,stargard:_2,suwalki:_2,swidnica:_2,swiebodzin:_2,swinoujscie:_2,szczecin:_2,szczytno:_2,tarnobrzeg:_2,tgory:_2,turek:_2,tychy:_2,ustka:_2,walbrzych:_2,warmia:_2,warszawa:_2,waw:_2,wegrow:_2,wielun:_2,wlocl:_2,wloclawek:_2,wodzislaw:_2,wolomin:_2,wroclaw:_2,zachpomor:_2,zagan:_2,zarow:_2,zgora:_2,zgorzelec:_2,art:_3,gliwice:_3,krakow:_3,poznan:_3,wroc:_3,zakopane:_3,beep:_3,"ecommerce-shop":_3,cfolks:_3,dfirma:_3,dkonto:_3,you2:_3,shoparena:_3,homesklep:_3,sdscloud:_3,unicloud:_3,lodz:_3,pabianice:_3,plock:_3,sieradz:_3,skierniewice:_3,zgierz:_3,krasnik:_3,leczna:_3,lubartow:_3,lublin:_3,poniatowa:_3,swidnik:_3,co:_3,torun:_3,simplesite:_3,myspreadshop:_3,gda:_3,gdansk:_3,gdynia:_3,med:_3,sopot:_3,bielsko:_3}],pm:[1,{own:_3,name:_3}],pn:[1,{co:_2,edu:_2,gov:_2,net:_2,org:_2}],post:_2,pr:[1,{biz:_2,com:_2,edu:_2,gov:_2,info:_2,isla:_2,name:_2,net:_2,org:_2,pro:_2,ac:_2,est:_2,prof:_2}],pro:[1,{aaa:_2,aca:_2,acct:_2,avocat:_2,bar:_2,cpa:_2,eng:_2,jur:_2,law:_2,med:_2,recht:_2,"12chars":_3,cloudns:_3,keenetic:_3,barsy:_3,ngrok:_3}],ps:[1,{com:_2,edu:_2,gov:_2,net:_2,org:_2,plo:_2,sec:_2}],pt:[1,{com:_2,edu:_2,gov:_2,int:_2,net:_2,nome:_2,org:_2,publ:_2,"123paginaweb":_3}],pw:[1,{gov:_2,cloudns:_3,x443:_3}],py:[1,{com:_2,coop:_2,edu:_2,gov:_2,mil:_2,net:_2,org:_2}],qa:[1,{com:_2,edu:_2,gov:_2,mil:_2,name:_2,net:_2,org:_2,sch:_2}],re:[1,{asso:_2,com:_2,netlib:_3,can:_3}],ro:[1,{arts:_2,com:_2,firm:_2,info:_2,nom:_2,nt:_2,org:_2,rec:_2,store:_2,tm:_2,www:_2,co:_3,shop:_3,barsy:_3}],rs:[1,{ac:_2,co:_2,edu:_2,gov:_2,in:_2,org:_2,brendly:_20,barsy:_3,ox:_3}],ru:[1,{ac:_3,edu:_3,gov:_3,int:_3,mil:_3,eurodir:_3,adygeya:_3,bashkiria:_3,bir:_3,cbg:_3,com:_3,dagestan:_3,grozny:_3,kalmykia:_3,kustanai:_3,marine:_3,mordovia:_3,msk:_3,mytis:_3,nalchik:_3,nov:_3,pyatigorsk:_3,spb:_3,vladikavkaz:_3,vladimir:_3,na4u:_3,mircloud:_3,myjino:[2,{hosting:_6,landing:_6,spectrum:_6,vps:_6}],cldmail:[0,{hb:_3}],mcdir:[2,{vps:_3}],mcpre:_3,net:_3,org:_3,pp:_3,ras:_3}],rw:[1,{ac:_2,co:_2,coop:_2,gov:_2,mil:_2,net:_2,org:_2}],sa:[1,{com:_2,edu:_2,gov:_2,med:_2,net:_2,org:_2,pub:_2,sch:_2}],sb:_4,sc:_4,sd:[1,{com:_2,edu:_2,gov:_2,info:_2,med:_2,net:_2,org:_2,tv:_2}],se:[1,{a:_2,ac:_2,b:_2,bd:_2,brand:_2,c:_2,d:_2,e:_2,f:_2,fh:_2,fhsk:_2,fhv:_2,g:_2,h:_2,i:_2,k:_2,komforb:_2,kommunalforbund:_2,komvux:_2,l:_2,lanbib:_2,m:_2,n:_2,naturbruksgymn:_2,o:_2,org:_2,p:_2,parti:_2,pp:_2,press:_2,r:_2,s:_2,t:_2,tm:_2,u:_2,w:_2,x:_2,y:_2,z:_2,com:_3,iopsys:_3,"123minsida":_3,itcouldbewor:_3,myspreadshop:_3}],sg:[1,{com:_2,edu:_2,gov:_2,net:_2,org:_2,enscaled:_3}],sh:[1,{com:_2,gov:_2,mil:_2,net:_2,org:_2,hashbang:_3,botda:_3,lovable:_3,platform:[0,{ent:_3,eu:_3,us:_3}],teleport:_3,now:_3}],si:[1,{f5:_3,gitapp:_3,gitpage:_3}],sj:_2,sk:[1,{org:_2}],sl:_4,sm:_2,sn:[1,{art:_2,com:_2,edu:_2,gouv:_2,org:_2,univ:_2}],so:[1,{com:_2,edu:_2,gov:_2,me:_2,net:_2,org:_2,surveys:_3}],sr:_2,ss:[1,{biz:_2,co:_2,com:_2,edu:_2,gov:_2,me:_2,net:_2,org:_2,sch:_2}],st:[1,{co:_2,com:_2,consulado:_2,edu:_2,embaixada:_2,mil:_2,net:_2,org:_2,principe:_2,saotome:_2,store:_2,helioho:_3,cn:_6,kirara:_3,noho:_3}],su:[1,{abkhazia:_3,adygeya:_3,aktyubinsk:_3,arkhangelsk:_3,armenia:_3,ashgabad:_3,azerbaijan:_3,balashov:_3,bashkiria:_3,bryansk:_3,bukhara:_3,chimkent:_3,dagestan:_3,"east-kazakhstan":_3,exnet:_3,georgia:_3,grozny:_3,ivanovo:_3,jambyl:_3,kalmykia:_3,kaluga:_3,karacol:_3,karaganda:_3,karelia:_3,khakassia:_3,krasnodar:_3,kurgan:_3,kustanai:_3,lenug:_3,mangyshlak:_3,mordovia:_3,msk:_3,murmansk:_3,nalchik:_3,navoi:_3,"north-kazakhstan":_3,nov:_3,obninsk:_3,penza:_3,pokrovsk:_3,sochi:_3,spb:_3,tashkent:_3,termez:_3,togliatti:_3,troitsk:_3,tselinograd:_3,tula:_3,tuva:_3,vladikavkaz:_3,vladimir:_3,vologda:_3}],sv:[1,{com:_2,edu:_2,gob:_2,org:_2,red:_2}],sx:_10,sy:_5,sz:[1,{ac:_2,co:_2,org:_2}],tc:_2,td:_2,tel:_2,tf:[1,{sch:_3}],tg:_2,th:[1,{ac:_2,co:_2,go:_2,in:_2,mi:_2,net:_2,or:_2,online:_3,shop:_3}],tj:[1,{ac:_2,biz:_2,co:_2,com:_2,edu:_2,go:_2,gov:_2,int:_2,mil:_2,name:_2,net:_2,nic:_2,org:_2,test:_2,web:_2}],tk:_2,tl:_10,tm:[1,{co:_2,com:_2,edu:_2,gov:_2,mil:_2,net:_2,nom:_2,org:_2}],tn:[1,{com:_2,ens:_2,fin:_2,gov:_2,ind:_2,info:_2,intl:_2,mincom:_2,nat:_2,net:_2,org:_2,perso:_2,tourism:_2,orangecloud:_3}],to:[1,{611:_3,com:_2,edu:_2,gov:_2,mil:_2,net:_2,org:_2,oya:_3,x0:_3,quickconnect:_28,vpnplus:_3,nett:_3}],tr:[1,{av:_2,bbs:_2,bel:_2,biz:_2,com:_2,dr:_2,edu:_2,gen:_2,gov:_2,info:_2,k12:_2,kep:_2,mil:_2,name:_2,net:_2,org:_2,pol:_2,tel:_2,tsk:_2,tv:_2,web:_2,nc:_10}],tt:[1,{biz:_2,co:_2,com:_2,edu:_2,gov:_2,info:_2,mil:_2,name:_2,net:_2,org:_2,pro:_2}],tv:[1,{"better-than":_3,dyndns:_3,"on-the-web":_3,"worse-than":_3,from:_3,sakura:_3}],tw:[1,{club:_2,com:[1,{mymailer:_3}],ebiz:_2,edu:_2,game:_2,gov:_2,idv:_2,mil:_2,net:_2,org:_2,url:_3,mydns:_3}],tz:[1,{ac:_2,co:_2,go:_2,hotel:_2,info:_2,me:_2,mil:_2,mobi:_2,ne:_2,or:_2,sc:_2,tv:_2}],ua:[1,{com:_2,edu:_2,gov:_2,in:_2,net:_2,org:_2,cherkassy:_2,cherkasy:_2,chernigov:_2,chernihiv:_2,chernivtsi:_2,chernovtsy:_2,ck:_2,cn:_2,cr:_2,crimea:_2,cv:_2,dn:_2,dnepropetrovsk:_2,dnipropetrovsk:_2,donetsk:_2,dp:_2,if:_2,"ivano-frankivsk":_2,kh:_2,kharkiv:_2,kharkov:_2,kherson:_2,khmelnitskiy:_2,khmelnytskyi:_2,kiev:_2,kirovograd:_2,km:_2,kr:_2,kropyvnytskyi:_2,krym:_2,ks:_2,kv:_2,kyiv:_2,lg:_2,lt:_2,lugansk:_2,luhansk:_2,lutsk:_2,lv:_2,lviv:_2,mk:_2,mykolaiv:_2,nikolaev:_2,od:_2,odesa:_2,odessa:_2,pl:_2,poltava:_2,rivne:_2,rovno:_2,rv:_2,sb:_2,sebastopol:_2,sevastopol:_2,sm:_2,sumy:_2,te:_2,ternopil:_2,uz:_2,uzhgorod:_2,uzhhorod:_2,vinnica:_2,vinnytsia:_2,vn:_2,volyn:_2,yalta:_2,zakarpattia:_2,zaporizhzhe:_2,zaporizhzhia:_2,zhitomir:_2,zhytomyr:_2,zp:_2,zt:_2,cc:_3,inf:_3,ltd:_3,cx:_3,biz:_3,co:_3,pp:_3,v:_3}],ug:[1,{ac:_2,co:_2,com:_2,edu:_2,go:_2,gov:_2,mil:_2,ne:_2,or:_2,org:_2,sc:_2,us:_2}],uk:[1,{ac:_2,co:[1,{bytemark:[0,{dh:_3,vm:_3}],layershift:_48,barsy:_3,barsyonline:_3,retrosnub:_58,"nh-serv":_3,"no-ip":_3,adimo:_3,myspreadshop:_3}],gov:[1,{api:_3,campaign:_3,service:_3}],ltd:_2,me:_2,net:_2,nhs:_2,org:[1,{glug:_3,lug:_3,lugs:_3,affinitylottery:_3,raffleentry:_3,weeklylottery:_3}],plc:_2,police:_2,sch:_21,conn:_3,copro:_3,hosp:_3,"independent-commission":_3,"independent-inquest":_3,"independent-inquiry":_3,"independent-panel":_3,"independent-review":_3,"public-inquiry":_3,"royal-commission":_3,pymnt:_3,barsy:_3,nimsite:_3,oraclegovcloudapps:_6}],us:[1,{dni:_2,isa:_2,nsn:_2,ak:_66,al:_66,ar:_66,as:_66,az:_66,ca:_66,co:_66,ct:_66,dc:_66,de:_67,fl:_66,ga:_66,gu:_66,hi:_68,ia:_66,id:_66,il:_66,in:_66,ks:_66,ky:_66,la:_66,ma:[1,{k12:[1,{chtr:_2,paroch:_2,pvt:_2}],cc:_2,lib:_2}],md:_66,me:_66,mi:[1,{k12:_2,cc:_2,lib:_2,"ann-arbor":_2,cog:_2,dst:_2,eaton:_2,gen:_2,mus:_2,tec:_2,washtenaw:_2}],mn:_66,mo:_66,ms:[1,{k12:_2,cc:_2}],mt:_66,nc:_66,nd:_68,ne:_66,nh:_66,nj:_66,nm:_66,nv:_66,ny:_66,oh:_66,ok:_66,or:_66,pa:_66,pr:_66,ri:_68,sc:_66,sd:_68,tn:_66,tx:_66,ut:_66,va:_66,vi:_66,vt:_66,wa:_66,wi:_66,wv:_67,wy:_66,cloudns:_3,"is-by":_3,"land-4-sale":_3,"stuff-4-sale":_3,heliohost:_3,enscaled:[0,{phx:_3}],mircloud:_3,"azure-api":_3,azurewebsites:_3,ngo:_3,golffan:_3,noip:_3,pointto:_3,freeddns:_3,srv:[2,{gh:_3,gl:_3}],servername:_3}],uy:[1,{com:_2,edu:_2,gub:_2,mil:_2,net:_2,org:_2,gv:_3}],uz:[1,{co:_2,com:_2,net:_2,org:_2}],va:_2,vc:[1,{com:_2,edu:_2,gov:_2,mil:_2,net:_2,org:_2,gv:[2,{d:_3}],"0e":_6,mydns:_3}],ve:[1,{arts:_2,bib:_2,co:_2,com:_2,e12:_2,edu:_2,emprende:_2,firm:_2,gob:_2,gov:_2,ia:_2,info:_2,int:_2,mil:_2,net:_2,nom:_2,org:_2,rar:_2,rec:_2,store:_2,tec:_2,web:_2}],vg:[1,{edu:_2}],vi:[1,{co:_2,com:_2,k12:_2,net:_2,org:_2}],vn:[1,{ac:_2,ai:_2,biz:_2,com:_2,edu:_2,gov:_2,health:_2,id:_2,info:_2,int:_2,io:_2,name:_2,net:_2,org:_2,pro:_2,angiang:_2,bacgiang:_2,backan:_2,baclieu:_2,bacninh:_2,"baria-vungtau":_2,bentre:_2,binhdinh:_2,binhduong:_2,binhphuoc:_2,binhthuan:_2,camau:_2,cantho:_2,caobang:_2,daklak:_2,daknong:_2,danang:_2,dienbien:_2,dongnai:_2,dongthap:_2,gialai:_2,hagiang:_2,haiduong:_2,haiphong:_2,hanam:_2,hanoi:_2,hatinh:_2,haugiang:_2,hoabinh:_2,hungyen:_2,khanhhoa:_2,kiengiang:_2,kontum:_2,laichau:_2,lamdong:_2,langson:_2,laocai:_2,longan:_2,namdinh:_2,nghean:_2,ninhbinh:_2,ninhthuan:_2,phutho:_2,phuyen:_2,quangbinh:_2,quangnam:_2,quangngai:_2,quangninh:_2,quangtri:_2,soctrang:_2,sonla:_2,tayninh:_2,thaibinh:_2,thainguyen:_2,thanhhoa:_2,thanhphohochiminh:_2,thuathienhue:_2,tiengiang:_2,travinh:_2,tuyenquang:_2,vinhlong:_2,vinhphuc:_2,yenbai:_2}],vu:_47,wf:[1,{biz:_3,sch:_3}],ws:[1,{com:_2,edu:_2,gov:_2,net:_2,org:_2,advisor:_6,cloud66:_3,dyndns:_3,mypets:_3}],yt:[1,{org:_3}],"xn--mgbaam7a8h":_2,امارات:_2,"xn--y9a3aq":_2,հայ:_2,"xn--54b7fta0cc":_2,বাংলা:_2,"xn--90ae":_2,бг:_2,"xn--mgbcpq6gpa1a":_2,البحرين:_2,"xn--90ais":_2,бел:_2,"xn--fiqs8s":_2,中国:_2,"xn--fiqz9s":_2,中國:_2,"xn--lgbbat1ad8j":_2,الجزائر:_2,"xn--wgbh1c":_2,مصر:_2,"xn--e1a4c":_2,ею:_2,"xn--qxa6a":_2,ευ:_2,"xn--mgbah1a3hjkrd":_2,موريتانيا:_2,"xn--node":_2,გე:_2,"xn--qxam":_2,ελ:_2,"xn--j6w193g":[1,{"xn--gmqw5a":_2,"xn--55qx5d":_2,"xn--mxtq1m":_2,"xn--wcvs22d":_2,"xn--uc0atv":_2,"xn--od0alg":_2}],香港:[1,{個人:_2,公司:_2,政府:_2,教育:_2,組織:_2,網絡:_2}],"xn--2scrj9c":_2,ಭಾರತ:_2,"xn--3hcrj9c":_2,ଭାରତ:_2,"xn--45br5cyl":_2,ভাৰত:_2,"xn--h2breg3eve":_2,भारतम्:_2,"xn--h2brj9c8c":_2,भारोत:_2,"xn--mgbgu82a":_2,ڀارت:_2,"xn--rvc1e0am3e":_2,ഭാരതം:_2,"xn--h2brj9c":_2,भारत:_2,"xn--mgbbh1a":_2,بارت:_2,"xn--mgbbh1a71e":_2,بھارت:_2,"xn--fpcrj9c3d":_2,భారత్:_2,"xn--gecrj9c":_2,ભારત:_2,"xn--s9brj9c":_2,ਭਾਰਤ:_2,"xn--45brj9c":_2,ভারত:_2,"xn--xkc2dl3a5ee0h":_2,இந்தியா:_2,"xn--mgba3a4f16a":_2,ایران:_2,"xn--mgba3a4fra":_2,ايران:_2,"xn--mgbtx2b":_2,عراق:_2,"xn--mgbayh7gpa":_2,الاردن:_2,"xn--3e0b707e":_2,한국:_2,"xn--80ao21a":_2,қаз:_2,"xn--q7ce6a":_2,ລາວ:_2,"xn--fzc2c9e2c":_2,ලංකා:_2,"xn--xkc2al3hye2a":_2,இலங்கை:_2,"xn--mgbc0a9azcg":_2,المغرب:_2,"xn--d1alf":_2,мкд:_2,"xn--l1acc":_2,мон:_2,"xn--mix891f":_2,澳門:_2,"xn--mix082f":_2,澳门:_2,"xn--mgbx4cd0ab":_2,مليسيا:_2,"xn--mgb9awbf":_2,عمان:_2,"xn--mgbai9azgqp6j":_2,پاکستان:_2,"xn--mgbai9a5eva00b":_2,پاكستان:_2,"xn--ygbi2ammx":_2,فلسطين:_2,"xn--90a3ac":[1,{"xn--80au":_2,"xn--90azh":_2,"xn--d1at":_2,"xn--c1avg":_2,"xn--o1ac":_2,"xn--o1ach":_2}],срб:[1,{ак:_2,обр:_2,од:_2,орг:_2,пр:_2,упр:_2}],"xn--p1ai":_2,рф:_2,"xn--wgbl6a":_2,قطر:_2,"xn--mgberp4a5d4ar":_2,السعودية:_2,"xn--mgberp4a5d4a87g":_2,السعودیة:_2,"xn--mgbqly7c0a67fbc":_2,السعودیۃ:_2,"xn--mgbqly7cvafr":_2,السعوديه:_2,"xn--mgbpl2fh":_2,سودان:_2,"xn--yfro4i67o":_2,新加坡:_2,"xn--clchc0ea0b2g2a9gcd":_2,சிங்கப்பூர்:_2,"xn--ogbpf8fl":_2,سورية:_2,"xn--mgbtf8fl":_2,سوريا:_2,"xn--o3cw4h":[1,{"xn--o3cyx2a":_2,"xn--12co0c3b4eva":_2,"xn--m3ch0j3a":_2,"xn--h3cuzk1di":_2,"xn--12c1fe0br":_2,"xn--12cfi8ixb8l":_2}],ไทย:[1,{ทหาร:_2,ธุรกิจ:_2,เน็ต:_2,รัฐบาล:_2,ศึกษา:_2,องค์กร:_2}],"xn--pgbs0dh":_2,تونس:_2,"xn--kpry57d":_2,台灣:_2,"xn--kprw13d":_2,台湾:_2,"xn--nnx388a":_2,臺灣:_2,"xn--j1amh":_2,укр:_2,"xn--mgb2ddes":_2,اليمن:_2,xxx:_2,ye:_5,za:[0,{ac:_2,agric:_2,alt:_2,co:_2,edu:_2,gov:_2,grondar:_2,law:_2,mil:_2,net:_2,ngo:_2,nic:_2,nis:_2,nom:_2,org:_2,school:_2,tm:_2,web:_2}],zm:[1,{ac:_2,biz:_2,co:_2,com:_2,edu:_2,gov:_2,info:_2,mil:_2,net:_2,org:_2,sch:_2}],zw:[1,{ac:_2,co:_2,gov:_2,mil:_2,org:_2}],aaa:_2,aarp:_2,abb:_2,abbott:_2,abbvie:_2,abc:_2,able:_2,abogado:_2,abudhabi:_2,academy:[1,{official:_3}],accenture:_2,accountant:_2,accountants:_2,aco:_2,actor:_2,ads:_2,adult:_2,aeg:_2,aetna:_2,afl:_2,africa:_2,agakhan:_2,agency:_2,aig:_2,airbus:_2,airforce:_2,airtel:_2,akdn:_2,alibaba:_2,alipay:_2,allfinanz:_2,allstate:_2,ally:_2,alsace:_2,alstom:_2,amazon:_2,americanexpress:_2,americanfamily:_2,amex:_2,amfam:_2,amica:_2,amsterdam:_2,analytics:_2,android:_2,anquan:_2,anz:_2,aol:_2,apartments:_2,app:[1,{adaptable:_3,aiven:_3,beget:_6,brave:_7,clerk:_3,clerkstage:_3,cloudflare:_3,wnext:_3,csb:[2,{preview:_3}],convex:_3,corespeed:_3,deta:_3,ondigitalocean:_3,easypanel:_3,encr:[2,{frontend:_3}],evervault:_8,expo:[2,{staging:_3}],edgecompute:_3,"on-fleek":_3,flutterflow:_3,sprites:_3,e2b:_3,framer:_3,gadget:_3,github:_3,hosted:_6,run:[0,{"*":_3,mtls:_6}],web:_3,hackclub:_3,hasura:_3,onhercules:_3,botdash:_3,shiptoday:_3,leapcell:_3,loginline:_3,lovable:_3,luyani:_3,magicpatterns:_3,medusajs:_3,messerli:_3,miren:_3,mocha:_3,netlify:_3,ngrok:_3,"ngrok-free":_3,developer:_6,noop:_3,northflank:_6,upsun:_6,railway:[0,{up:_3}],replit:_9,nyat:_3,snowflake:[0,{"*":_3,privatelink:_6}],streamlit:_3,spawnbase:_3,telebit:_3,typedream:_3,vercel:_3,wal:_3,wasmer:_3,bookonline:_3,windsurf:_3,base44:_3,zeabur:_3,zerops:_6}],apple:[1,{int:[2,{cloud:[0,{"*":_3,r:[0,{"*":_3,"ap-north-1":_6,"ap-south-1":_6,"ap-south-2":_6,"eu-central-1":_6,"eu-north-1":_6,"us-central-1":_6,"us-central-2":_6,"us-east-1":_6,"us-east-2":_6,"us-west-1":_6,"us-west-2":_6,"us-west-3":_6}]}]}]}],aquarelle:_2,arab:_2,aramco:_2,archi:_2,army:_2,art:_2,arte:_2,asda:_2,associates:_2,athleta:_2,attorney:_2,auction:_2,audi:_2,audible:_2,audio:_2,auspost:_2,author:_2,auto:_2,autos:_2,aws:[1,{on:[0,{"af-south-1":_11,"ap-east-1":_11,"ap-northeast-1":_11,"ap-northeast-2":_11,"ap-northeast-3":_11,"ap-south-1":_11,"ap-south-2":_12,"ap-southeast-1":_11,"ap-southeast-2":_11,"ap-southeast-3":_11,"ap-southeast-4":_12,"ap-southeast-5":_12,"ca-central-1":_11,"ca-west-1":_12,"eu-central-1":_11,"eu-central-2":_12,"eu-north-1":_11,"eu-south-1":_11,"eu-south-2":_12,"eu-west-1":_11,"eu-west-2":_11,"eu-west-3":_11,"il-central-1":_12,"me-central-1":_12,"me-south-1":_11,"sa-east-1":_11,"us-east-1":_11,"us-east-2":_11,"us-west-1":_11,"us-west-2":_11,"ap-southeast-7":_13,"mx-central-1":_13,"us-gov-east-1":_14,"us-gov-west-1":_14}],sagemaker:[0,{"ap-northeast-1":_16,"ap-northeast-2":_16,"ap-south-1":_16,"ap-southeast-1":_16,"ap-southeast-2":_16,"ca-central-1":_18,"eu-central-1":_16,"eu-west-1":_16,"eu-west-2":_16,"us-east-1":_18,"us-east-2":_18,"us-west-2":_18,"af-south-1":_15,"ap-east-1":_15,"ap-northeast-3":_15,"ap-south-2":_17,"ap-southeast-3":_15,"ap-southeast-4":_17,"ca-west-1":[0,{notebook:_3,"notebook-fips":_3}],"eu-central-2":_15,"eu-north-1":_15,"eu-south-1":_15,"eu-south-2":_15,"eu-west-3":_15,"il-central-1":_15,"me-central-1":_15,"me-south-1":_15,"sa-east-1":_15,"us-gov-east-1":_19,"us-gov-west-1":_19,"us-west-1":[0,{notebook:_3,"notebook-fips":_3,studio:_3}],experiments:_6}],repost:[0,{private:_6}]}],axa:_2,azure:_2,baby:_2,baidu:_2,banamex:_2,band:_2,bank:_2,bar:_2,barcelona:_2,barclaycard:_2,barclays:_2,barefoot:_2,bargains:_2,baseball:_2,basketball:[1,{aus:_3,nz:_3}],bauhaus:_2,bayern:_2,bbc:_2,bbt:_2,bbva:_2,bcg:_2,bcn:_2,beats:_2,beauty:_2,beer:_2,berlin:_2,best:_2,bestbuy:_2,bet:_2,bharti:_2,bible:_2,bid:_2,bike:_2,bing:_2,bingo:_2,bio:_2,black:_2,blackfriday:_2,blockbuster:_2,blog:_2,bloomberg:_2,blue:_2,bms:_2,bmw:_2,bnpparibas:_2,boats:_2,boehringer:_2,bofa:_2,bom:_2,bond:_2,boo:_2,book:_2,booking:_2,bosch:_2,bostik:_2,boston:_2,bot:_2,boutique:_2,box:_2,bradesco:_2,bridgestone:_2,broadway:_2,broker:_2,brother:_2,brussels:_2,build:[1,{shiptoday:_3,v0:_3,windsurf:_3}],builders:[1,{cloudsite:_3}],business:_22,buy:_2,buzz:_2,bzh:_2,cab:_2,cafe:_2,cal:_2,call:_2,calvinklein:_2,cam:_2,camera:_2,camp:[1,{emf:[0,{at:_3}]}],canon:_2,capetown:_2,capital:_2,capitalone:_2,car:_2,caravan:_2,cards:_2,care:_2,career:_2,careers:_2,cars:_2,casa:[1,{nabu:[0,{ui:_3}]}],case:[1,{sav:_3}],cash:_2,casino:_2,catering:_2,catholic:_2,cba:_2,cbn:_2,cbre:_2,center:_2,ceo:_2,cern:_2,cfa:_2,cfd:_2,chanel:_2,channel:_2,charity:_2,chase:_2,chat:_2,cheap:_2,chintai:_2,christmas:_2,chrome:_2,church:_2,cipriani:_2,circle:_2,cisco:_2,citadel:_2,citi:_2,citic:_2,city:_2,claims:_2,cleaning:_2,click:_2,clinic:_2,clinique:_2,clothing:_2,cloud:[1,{antagonist:_3,convex:_3,elementor:_3,emergent:_3,encoway:[0,{eu:_3}],statics:_6,ravendb:_3,axarnet:[0,{"es-1":_3}],diadem:_3,jelastic:[0,{vip:_3}],jele:_3,"jenv-aruba":[0,{aruba:[0,{eur:[0,{it1:_3}]}],it1:_3}],keliweb:[2,{cs:_3}],oxa:[2,{tn:_3,uk:_3}],primetel:[2,{uk:_3}],reclaim:[0,{ca:_3,uk:_3,us:_3}],trendhosting:[0,{ch:_3,de:_3}],jote:_3,jotelulu:_3,kuleuven:_3,laravel:_3,linkyard:_3,magentosite:_6,matlab:_3,observablehq:_3,perspecta:_3,vapor:_3,"on-rancher":_6,scw:[0,{baremetal:[0,{"fr-par-1":_3,"fr-par-2":_3,"nl-ams-1":_3}],"fr-par":[0,{cockpit:_3,ddl:_3,dtwh:_3,fnc:[2,{functions:_3}],ifr:_3,k8s:_24,kafk:_3,mgdb:_3,rdb:_3,s3:_3,"s3-website":_3,scbl:_3,whm:_3}],instances:[0,{priv:_3,pub:_3}],k8s:_3,"nl-ams":[0,{cockpit:_3,ddl:_3,dtwh:_3,ifr:_3,k8s:_24,kafk:_3,mgdb:_3,rdb:_3,s3:_3,"s3-website":_3,scbl:_3,whm:_3}],"pl-waw":[0,{cockpit:_3,ddl:_3,dtwh:_3,ifr:_3,k8s:_24,kafk:_3,mgdb:_3,rdb:_3,s3:_3,"s3-website":_3,scbl:_3}],scalebook:_3,smartlabeling:_3}],servebolt:_3,onstackit:[0,{runs:_3}],trafficplex:_3,"unison-services":_3,urown:_3,voorloper:_3,zap:_3}],club:[1,{cloudns:_3,jele:_3,barsy:_3}],clubmed:_2,coach:_2,codes:[1,{owo:_6}],coffee:_2,college:_2,cologne:_2,commbank:_2,community:[1,{nog:_3,ravendb:_3,myforum:_3}],company:_2,compare:_2,computer:_2,comsec:_2,condos:_2,construction:_2,consulting:_2,contact:_2,contractors:_2,cooking:_2,cool:[1,{elementor:_3,de:_3}],corsica:_2,country:_2,coupon:_2,coupons:_2,courses:_2,cpa:_2,credit:_2,creditcard:_2,creditunion:_2,cricket:_2,crown:_2,crs:_2,cruise:_2,cruises:_2,cuisinella:_2,cymru:_2,cyou:_2,dad:_2,dance:_2,data:_2,date:_2,dating:_2,datsun:_2,day:_2,dclk:_2,dds:_2,deal:_2,dealer:_2,deals:_2,degree:_2,delivery:_2,dell:_2,deloitte:_2,delta:_2,democrat:_2,dental:_2,dentist:_2,desi:_2,design:[1,{graphic:_3,bss:_3}],dev:[1,{"12chars":_3,myaddr:_3,panel:_3,bearblog:_3,brave:_7,lcl:_6,lclstage:_6,stg:_6,stgstage:_6,pages:_3,r2:_3,workers:_3,deno:_3,"deno-staging":_3,deta:_3,lp:[2,{api:_3,objects:_3}],evervault:_8,fly:_3,githubpreview:_3,gateway:_6,grebedoc:_3,botdash:_3,inbrowser:_6,"is-a-good":_3,iserv:_3,leapcell:_3,runcontainers:_3,localcert:[0,{user:_6}],loginline:_3,barsy:_3,mediatech:_3,"mocha-sandbox":_3,modx:_3,ngrok:_3,"ngrok-free":_3,"is-a-fullstack":_3,"is-cool":_3,"is-not-a":_3,localplayer:_3,xmit:_3,"platter-app":_3,replit:[2,{archer:_3,bones:_3,canary:_3,global:_3,hacker:_3,id:_3,janeway:_3,kim:_3,kira:_3,kirk:_3,odo:_3,paris:_3,picard:_3,pike:_3,prerelease:_3,reed:_3,riker:_3,sisko:_3,spock:_3,staging:_3,sulu:_3,tarpit:_3,teams:_3,tucker:_3,wesley:_3,worf:_3}],crm:[0,{aa:_6,ab:_6,ac:_6,ad:_6,ae:_6,af:_6,ci:_6,d:_6,pa:_6,pb:_6,pc:_6,pd:_6,pe:_6,pf:_6,w:_6,wa:_6,wb:_6,wc:_6,wd:_6,we:_6,wf:_6}],erp:_50,vercel:_3,webhare:_6,hrsn:_3,"is-a":_3}],dhl:_2,diamonds:_2,diet:_2,digital:[1,{cloudapps:[2,{london:_3}]}],direct:[1,{libp2p:_3}],directory:_2,discount:_2,discover:_2,dish:_2,diy:_51,dnp:_2,docs:_2,doctor:_2,dog:_2,domains:_2,dot:_2,download:_2,drive:_2,dtv:_2,dubai:_2,dupont:_2,durban:_2,dvag:_2,dvr:_2,earth:_2,eat:_2,eco:_2,edeka:_2,education:_22,email:[1,{crisp:[0,{on:_3}],tawk:_53,tawkto:_53}],emerck:_2,energy:_2,engineer:_2,engineering:_2,enterprises:_2,epson:_2,equipment:_2,ericsson:_2,erni:_2,esq:_2,estate:[1,{compute:_6}],eurovision:_2,eus:[1,{party:_54}],events:[1,{koobin:_3,co:_3}],exchange:_2,expert:_2,exposed:_2,express:_2,extraspace:_2,fage:_2,fail:_2,fairwinds:_2,faith:_2,family:_2,fan:_2,fans:_2,farm:[1,{storj:_3}],farmers:_2,fashion:_2,fast:_2,fedex:_2,feedback:_2,ferrari:_2,ferrero:_2,fidelity:_2,fido:_2,film:_2,final:_2,finance:_2,financial:_22,fire:_2,firestone:_2,firmdale:_2,fish:_2,fishing:_2,fit:_2,fitness:_2,flickr:_2,flights:_2,flir:_2,florist:_2,flowers:_2,fly:_2,foo:_2,food:_2,football:_2,ford:_2,forex:_2,forsale:_2,forum:_2,foundation:_2,fox:_2,free:_2,fresenius:_2,frl:_2,frogans:_2,frontier:_2,ftr:_2,fujitsu:_2,fun:_2,fund:_2,furniture:_2,futbol:_2,fyi:_2,gal:_2,gallery:_2,gallo:_2,gallup:_2,game:_2,games:[1,{pley:_3,sheezy:_3}],gap:_2,garden:_2,gay:[1,{pages:_3}],gbiz:_2,gdn:[1,{cnpy:_3}],gea:_2,gent:_2,genting:_2,george:_2,ggee:_2,gift:_2,gifts:_2,gives:_2,giving:_2,glass:_2,gle:_2,global:[1,{appwrite:_3}],globo:_2,gmail:_2,gmbh:_2,gmo:_2,gmx:_2,godaddy:_2,gold:_2,goldpoint:_2,golf:_2,goo:_2,goodyear:_2,goog:[1,{cloud:_3,translate:_3,usercontent:_6}],google:_2,gop:_2,got:_2,grainger:_2,graphics:_2,gratis:_2,green:_2,gripe:_2,grocery:_2,group:_51,gucci:_2,guge:_2,guide:_2,guitars:_2,guru:_2,hair:_2,hamburg:_2,hangout:_2,haus:_2,hbo:_2,hdfc:_2,hdfcbank:_2,health:[1,{hra:_3}],healthcare:_2,help:_2,helsinki:_2,here:_2,hermes:_2,hiphop:_2,hisamitsu:_2,hitachi:_2,hiv:_2,hkt:_2,hockey:_2,holdings:_2,holiday:_2,homedepot:_2,homegoods:_2,homes:_2,homesense:_2,honda:_2,horse:_2,hospital:_2,host:[1,{cloudaccess:_3,freesite:_3,easypanel:_3,emergent:_3,fastvps:_3,myfast:_3,gadget:_3,tempurl:_3,wpmudev:_3,iserv:_3,jele:_3,mircloud:_3,bolt:_3,wp2:_3,half:_3}],hosting:[1,{opencraft:_3}],hot:_2,hotel:_2,hotels:_2,hotmail:_2,house:_2,how:_2,hsbc:_2,hughes:_2,hyatt:_2,hyundai:_2,ibm:_2,icbc:_2,ice:_2,icu:_2,ieee:_2,ifm:_2,ikano:_2,imamat:_2,imdb:_2,immo:_2,immobilien:_2,inc:_2,industries:_2,infiniti:_2,ing:_2,ink:_2,institute:_2,insurance:_2,insure:_2,international:_2,intuit:_2,investments:_2,ipiranga:_2,irish:_2,ismaili:_2,ist:_2,istanbul:_2,itau:_2,itv:_2,jaguar:_2,java:_2,jcb:_2,jeep:_2,jetzt:_2,jewelry:_2,jio:_2,jll:_2,jmp:_2,jnj:_2,joburg:_2,jot:_2,joy:_2,jpmorgan:_2,jprs:_2,juegos:_2,juniper:_2,kaufen:_2,kddi:_2,kerryhotels:_2,kerryproperties:_2,kfh:_2,kia:_2,kids:_2,kim:_2,kindle:_2,kitchen:_2,kiwi:_2,koeln:_2,komatsu:_2,kosher:_2,kpmg:_2,kpn:_2,krd:[1,{co:_3,edu:_3}],kred:_2,kuokgroup:_2,kyoto:_2,lacaixa:_2,lamborghini:_2,lamer:_2,land:_2,landrover:_2,lanxess:_2,lasalle:_2,lat:_2,latino:_2,latrobe:_2,law:_2,lawyer:_2,lds:_2,lease:_2,leclerc:_2,lefrak:_2,legal:_2,lego:_2,lexus:_2,lgbt:_2,lidl:_2,life:_2,lifeinsurance:_2,lifestyle:_2,lighting:_2,like:_2,lilly:_2,limited:_2,limo:_2,lincoln:_2,link:[1,{myfritz:_3,cyon:_3,joinmc:_3,dweb:_6,inbrowser:_6,keenetic:_3,nftstorage:_61,mypep:_3,storacha:_61,w3s:_61}],live:[1,{aem:_3,hlx:_3,ewp:_6}],living:_2,llc:_2,llp:_2,loan:_2,loans:_2,locker:_2,locus:_2,lol:[1,{omg:_3}],london:_2,lotte:_2,lotto:_2,love:_2,lpl:_2,lplfinancial:_2,ltd:_2,ltda:_2,lundbeck:_2,luxe:_2,luxury:_2,madrid:_2,maif:_2,maison:_2,makeup:_2,man:_2,management:_2,mango:_2,map:_2,market:_2,marketing:_2,markets:_2,marriott:_2,marshalls:_2,mattel:_2,mba:_2,mckinsey:_2,med:_2,media:_62,meet:_2,melbourne:_2,meme:_2,memorial:_2,men:_2,menu:[1,{barsy:_3,barsyonline:_3}],merck:_2,merckmsd:_2,miami:_2,microsoft:_2,mini:_2,mint:_2,mit:_2,mitsubishi:_2,mlb:_2,mls:_2,mma:_2,mobile:_2,moda:_2,moe:_2,moi:_2,mom:_2,monash:_2,money:_2,monster:_2,mormon:_2,mortgage:_2,moscow:_2,moto:_2,motorcycles:_2,mov:_2,movie:_2,msd:_2,mtn:_2,mtr:_2,music:_2,nab:_2,nagoya:_2,navy:_2,nba:_2,nec:_2,netbank:_2,netflix:_2,network:[1,{aem:_3,alces:_6,appwrite:_3,co:_3,arvo:_3,azimuth:_3,tlon:_3}],neustar:_2,new:_2,news:[1,{noticeable:_3}],next:_2,nextdirect:_2,nexus:_2,nfl:_2,ngo:_2,nhk:_2,nico:_2,nike:_2,nikon:_2,ninja:_2,nissan:_2,nissay:_2,nokia:_2,norton:_2,now:_2,nowruz:_2,nowtv:_2,nra:_2,nrw:_2,ntt:_2,nyc:_2,obi:_2,observer:_2,office:_2,okinawa:_2,olayan:_2,olayangroup:_2,ollo:_2,omega:_2,one:[1,{kin:_6,service:_3,website:_3}],ong:_2,onl:_2,online:[1,{eero:_3,"eero-stage":_3,websitebuilder:_3,leapcell:_3,barsy:_3}],ooo:_2,open:_2,oracle:_2,orange:[1,{tech:_3}],organic:_2,origins:_2,osaka:_2,otsuka:_2,ott:_2,ovh:[1,{nerdpol:_3}],page:[1,{aem:_3,hlx:_3,codeberg:_3,deuxfleurs:_3,heyflow:_3,prvcy:_3,rocky:_3,statichost:_3,pdns:_3,plesk:_3}],panasonic:_2,paris:_2,pars:_2,partners:_2,parts:_2,party:_2,pay:_2,pccw:_2,pet:_2,pfizer:_2,pharmacy:_2,phd:_2,philips:_2,phone:_2,photo:_2,photography:_2,photos:_62,physio:_2,pics:_2,pictet:_2,pictures:[1,{1337:_3}],pid:_2,pin:_2,ping:_2,pink:_2,pioneer:_2,pizza:[1,{ngrok:_3}],place:_22,play:_2,playstation:_2,plumbing:_2,plus:[1,{playit:[2,{at:_6,with:_3}]}],pnc:_2,pohl:_2,poker:_2,politie:_2,porn:_2,praxi:_2,press:_2,prime:_2,prod:_2,productions:_2,prof:_2,progressive:_2,promo:_2,properties:_2,property:_2,protection:_2,pru:_2,prudential:_2,pub:[1,{id:_6,kin:_6,barsy:_3}],pwc:_2,qpon:_2,quebec:_2,quest:_2,racing:_2,radio:_2,read:_2,realestate:_2,realtor:_2,realty:_2,recipes:_2,red:_2,redumbrella:_2,rehab:_2,reise:_2,reisen:_2,reit:_2,reliance:_2,ren:_2,rent:_2,rentals:_2,repair:_2,report:_2,republican:_2,rest:_2,restaurant:_2,review:_2,reviews:[1,{aem:_3}],rexroth:_2,rich:_2,richardli:_2,ricoh:_2,ril:_2,rio:_2,rip:[1,{clan:_3}],rocks:[1,{myddns:_3,stackit:_3,"lima-city":_3,webspace:_3}],rodeo:_2,rogers:_2,room:_2,rsvp:_2,rugby:_2,ruhr:_2,run:[1,{appwrite:_6,canva:_3,development:_3,ravendb:_3,liara:[2,{iran:_3}],lovable:_3,needle:_3,build:_6,code:_6,database:_6,migration:_6,onporter:_3,repl:_3,stackit:_3,val:_50,vercel:_3,wix:_3}],rwe:_2,ryukyu:_2,saarland:_2,safe:_2,safety:_2,sakura:_2,sale:_2,salon:_2,samsclub:_2,samsung:_2,sandvik:_2,sandvikcoromant:_2,sanofi:_2,sap:_2,sarl:_2,sas:_2,save:_2,saxo:_2,sbi:_2,sbs:_2,scb:_2,schaeffler:_2,schmidt:_2,scholarships:_2,school:_2,schule:_2,schwarz:_2,science:_2,scot:[1,{co:_3,me:_3,org:_3,gov:[2,{service:_3}]}],search:_2,seat:_2,secure:_2,security:_2,seek:_2,select:_2,sener:_2,services:[1,{loginline:_3}],seven:_2,sew:_2,sex:_2,sexy:_2,sfr:_2,shangrila:_2,sharp:_2,shell:_2,shia:_2,shiksha:_2,shoes:_2,shop:[1,{base:_3,hoplix:_3,barsy:_3,barsyonline:_3,shopware:_3}],shopping:_2,shouji:_2,show:_2,silk:_2,sina:_2,singles:_2,site:[1,{square:_3,canva:_25,cloudera:_6,convex:_3,cyon:_3,caffeine:_3,fastvps:_3,figma:_3,"figma-gov":_3,preview:_3,heyflow:_3,jele:_3,jouwweb:_3,loginline:_3,barsy:_3,co:_3,notion:_3,omniwe:_3,opensocial:_3,madethis:_3,support:_3,platformsh:_6,tst:_6,byen:_3,sol:_3,srht:_3,novecore:_3,cpanel:_3,wpsquared:_3,sourcecraft:_3}],ski:_2,skin:_2,sky:_2,skype:_2,sling:_2,smart:_2,smile:_2,sncf:_2,soccer:_2,social:_2,softbank:_2,software:_2,sohu:_2,solar:_2,solutions:_2,song:_2,sony:_2,soy:_2,spa:_2,space:[1,{myfast:_3,heiyu:_3,hf:[2,{static:_3}],"app-ionos":_3,project:_3,uber:_3,xs4all:_3}],sport:_2,spot:_2,srl:_2,stada:_2,staples:_2,star:_2,statebank:_2,statefarm:_2,stc:_2,stcgroup:_2,stockholm:_2,storage:_2,store:[1,{barsy:_3,sellfy:_3,shopware:_3,storebase:_3}],stream:_2,studio:_2,study:_2,style:_2,sucks:_2,supplies:_2,supply:_2,support:[1,{barsy:_3}],surf:_2,surgery:_2,suzuki:_2,swatch:_2,swiss:_2,sydney:_2,systems:[1,{knightpoint:_3,miren:_3}],tab:_2,taipei:_2,talk:_2,taobao:_2,target:_2,tatamotors:_2,tatar:_2,tattoo:_2,tax:_2,taxi:_2,tci:_2,tdk:_2,team:[1,{discourse:_3,jelastic:_3}],tech:[1,{cleverapps:_3}],technology:_22,temasek:_2,tennis:_2,teva:_2,thd:_2,theater:_2,theatre:_2,tiaa:_2,tickets:_2,tienda:_2,tips:_2,tires:_2,tirol:_2,tjmaxx:_2,tjx:_2,tkmaxx:_2,tmall:_2,today:[1,{prequalifyme:_3}],tokyo:_2,tools:[1,{addr:_49,myaddr:_3}],top:[1,{ntdll:_3,wadl:_6}],toray:_2,toshiba:_2,total:_2,tours:_2,town:_2,toyota:_2,toys:_2,trade:_2,trading:_2,training:_2,travel:_2,travelers:_2,travelersinsurance:_2,trust:_2,trv:_2,tube:_2,tui:_2,tunes:_2,tushu:_2,tvs:_2,ubank:_2,ubs:_2,unicom:_2,university:_2,uno:_2,uol:_2,ups:_2,vacations:_2,vana:_2,vanguard:_2,vegas:_2,ventures:_2,verisign:_2,versicherung:_2,vet:_2,viajes:_2,video:_2,vig:_2,viking:_2,villas:_2,vin:_2,vip:[1,{hidns:_3}],virgin:_2,visa:_2,vision:_2,viva:_2,vivo:_2,vlaanderen:_2,vodka:_2,volvo:_2,vote:_2,voting:_2,voto:_2,voyage:_2,wales:_2,walmart:_2,walter:_2,wang:_2,wanggou:_2,watch:_2,watches:_2,weather:_2,weatherchannel:_2,webcam:_2,weber:_2,website:_62,wed:_2,wedding:_2,weibo:_2,weir:_2,whoswho:_2,wien:_2,wiki:_62,williamhill:_2,win:_2,windows:_2,wine:_2,winners:_2,wme:_2,wolterskluwer:_2,woodside:_2,work:[1,{"imagine-proxy":_3}],works:_2,world:_2,wow:_2,wtc:_2,wtf:_2,xbox:_2,xerox:_2,xihuan:_2,xin:_2,"xn--11b4c3d":_2,कॉम:_2,"xn--1ck2e1b":_2,セール:_2,"xn--1qqw23a":_2,佛山:_2,"xn--30rr7y":_2,慈善:_2,"xn--3bst00m":_2,集团:_2,"xn--3ds443g":_2,在线:_2,"xn--3pxu8k":_2,点看:_2,"xn--42c2d9a":_2,คอม:_2,"xn--45q11c":_2,八卦:_2,"xn--4gbrim":_2,موقع:_2,"xn--55qw42g":_2,公益:_2,"xn--55qx5d":_2,公司:_2,"xn--5su34j936bgsg":_2,香格里拉:_2,"xn--5tzm5g":_2,网站:_2,"xn--6frz82g":_2,移动:_2,"xn--6qq986b3xl":_2,我爱你:_2,"xn--80adxhks":_2,москва:_2,"xn--80aqecdr1a":_2,католик:_2,"xn--80asehdb":_2,онлайн:_2,"xn--80aswg":_2,сайт:_2,"xn--8y0a063a":_2,联通:_2,"xn--9dbq2a":_2,קום:_2,"xn--9et52u":_2,时尚:_2,"xn--9krt00a":_2,微博:_2,"xn--b4w605ferd":_2,淡马锡:_2,"xn--bck1b9a5dre4c":_2,ファッション:_2,"xn--c1avg":_2,орг:_2,"xn--c2br7g":_2,नेट:_2,"xn--cck2b3b":_2,ストア:_2,"xn--cckwcxetd":_2,アマゾン:_2,"xn--cg4bki":_2,삼성:_2,"xn--czr694b":_2,商标:_2,"xn--czrs0t":_2,商店:_2,"xn--czru2d":_2,商城:_2,"xn--d1acj3b":_2,дети:_2,"xn--eckvdtc9d":_2,ポイント:_2,"xn--efvy88h":_2,新闻:_2,"xn--fct429k":_2,家電:_2,"xn--fhbei":_2,كوم:_2,"xn--fiq228c5hs":_2,中文网:_2,"xn--fiq64b":_2,中信:_2,"xn--fjq720a":_2,娱乐:_2,"xn--flw351e":_2,谷歌:_2,"xn--fzys8d69uvgm":_2,電訊盈科:_2,"xn--g2xx48c":_2,购物:_2,"xn--gckr3f0f":_2,クラウド:_2,"xn--gk3at1e":_2,通販:_2,"xn--hxt814e":_2,网店:_2,"xn--i1b6b1a6a2e":_2,संगठन:_2,"xn--imr513n":_2,餐厅:_2,"xn--io0a7i":_2,网络:_2,"xn--j1aef":_2,ком:_2,"xn--jlq480n2rg":_2,亚马逊:_2,"xn--jvr189m":_2,食品:_2,"xn--kcrx77d1x4a":_2,飞利浦:_2,"xn--kput3i":_2,手机:_2,"xn--mgba3a3ejt":_2,ارامكو:_2,"xn--mgba7c0bbn0a":_2,العليان:_2,"xn--mgbab2bd":_2,بازار:_2,"xn--mgbca7dzdo":_2,ابوظبي:_2,"xn--mgbi4ecexp":_2,كاثوليك:_2,"xn--mgbt3dhd":_2,همراه:_2,"xn--mk1bu44c":_2,닷컴:_2,"xn--mxtq1m":_2,政府:_2,"xn--ngbc5azd":_2,شبكة:_2,"xn--ngbe9e0a":_2,بيتك:_2,"xn--ngbrx":_2,عرب:_2,"xn--nqv7f":_2,机构:_2,"xn--nqv7fs00ema":_2,组织机构:_2,"xn--nyqy26a":_2,健康:_2,"xn--otu796d":_2,招聘:_2,"xn--p1acf":[1,{"xn--90amc":_3,"xn--j1aef":_3,"xn--j1ael8b":_3,"xn--h1ahn":_3,"xn--j1adp":_3,"xn--c1avg":_3,"xn--80aaa0cvac":_3,"xn--h1aliz":_3,"xn--90a1af":_3,"xn--41a":_3}],рус:[1,{биз:_3,ком:_3,крым:_3,мир:_3,мск:_3,орг:_3,самара:_3,сочи:_3,спб:_3,я:_3}],"xn--pssy2u":_2,大拿:_2,"xn--q9jyb4c":_2,みんな:_2,"xn--qcka1pmc":_2,グーグル:_2,"xn--rhqv96g":_2,世界:_2,"xn--rovu88b":_2,書籍:_2,"xn--ses554g":_2,网址:_2,"xn--t60b56a":_2,닷넷:_2,"xn--tckwe":_2,コム:_2,"xn--tiq49xqyj":_2,天主教:_2,"xn--unup4y":_2,游戏:_2,"xn--vermgensberater-ctb":_2,vermögensberater:_2,"xn--vermgensberatung-pwb":_2,vermögensberatung:_2,"xn--vhquv":_2,企业:_2,"xn--vuq861b":_2,信息:_2,"xn--w4r85el8fhu5dnra":_2,嘉里大酒店:_2,"xn--w4rs40l":_2,嘉里:_2,"xn--xhq521b":_2,广东:_2,"xn--zfr164b":_2,政务:_2,xyz:[1,{caffeine:_3,botdash:_3,telebit:_6}],yachts:_2,yahoo:_2,yamaxun:_2,yandex:_2,yodobashi:_2,yoga:_2,yokohama:_2,you:_2,youtube:_2,yun:_2,zappos:_2,zara:_2,zero:_2,zip:_2,zone:[1,{triton:_6,stackit:_3,lima:_3}],zuerich:_2}]})();function lookupInTrie(parts,trie,index,allowedMask){let result=null,node=trie;for(;node!==void 0&&((node[0]&allowedMask)!==0&&(result={index:index+1,isIcann:(node[0]&1)!==0,isPrivate:(node[0]&2)!==0}),index!==-1);){let succ=node[1];node=Object.prototype.hasOwnProperty.call(succ,parts[index])?succ[parts[index]]:succ["*"],index-=1}return result}function suffixLookup(hostname3,options,out){var _a2;if(fastPathLookup(hostname3,options,out))return;let hostnameParts=hostname3.split("."),allowedMask=(options.allowPrivateDomains?2:0)|(options.allowIcannDomains?1:0),exceptionMatch=lookupInTrie(hostnameParts,exceptions,hostnameParts.length-1,allowedMask);if(exceptionMatch!==null){out.isIcann=exceptionMatch.isIcann,out.isPrivate=exceptionMatch.isPrivate,out.publicSuffix=hostnameParts.slice(exceptionMatch.index+1).join(".");return}let rulesMatch=lookupInTrie(hostnameParts,rules,hostnameParts.length-1,allowedMask);if(rulesMatch!==null){out.isIcann=rulesMatch.isIcann,out.isPrivate=rulesMatch.isPrivate,out.publicSuffix=hostnameParts.slice(rulesMatch.index).join(".");return}out.isIcann=!1,out.isPrivate=!1,out.publicSuffix=(_a2=hostnameParts[hostnameParts.length-1])!==null&&_a2!==void 0?_a2:null}var RESULT=getEmptyResult();function parse4(url2,options={}){return parseImpl(url2,5,suffixLookup,options,getEmptyResult())}function getHostname(url2,options={}){return resetResult(RESULT),parseImpl(url2,0,suffixLookup,options,RESULT).hostname}function getPublicSuffix2(url2,options={}){return resetResult(RESULT),parseImpl(url2,2,suffixLookup,options,RESULT).publicSuffix}function getDomain3(url2,options={}){return resetResult(RESULT),parseImpl(url2,3,suffixLookup,options,RESULT).domain}function getSubdomain(url2,options={}){return resetResult(RESULT),parseImpl(url2,4,suffixLookup,options,RESULT).subdomain}function getDomainWithoutSuffix(url2,options={}){return resetResult(RESULT),parseImpl(url2,5,suffixLookup,options,RESULT).domainWithoutSuffix}exports.getDomain=getDomain3;exports.getDomainWithoutSuffix=getDomainWithoutSuffix;exports.getHostname=getHostname;exports.getPublicSuffix=getPublicSuffix2;exports.getSubdomain=getSubdomain;exports.parse=parse4}});function getRequestCookiePartition(url2){let target=new URL(url2),domain2=(0,import_tldts.getDomain)(target.hostname,{allowPrivateDomains:!0})??target.hostname;return{topLevelSite:`${target.protocol}//${domain2}`,hasCrossSiteAncestor:!1}}function selectRequestCookies(cookies,url2){let partition=getRequestCookiePartition(url2);return filterCookiesForUrl(cookies,url2).filter(cookie=>{if(cookie.partitionKeyOpaque===!0)return!1;if(cookie.partitionKey===void 0)return!0;if(!cookie.partitionKey||typeof cookie.partitionKey!="object")return!1;let key=cookie.partitionKey;return key.topLevelSite===partition.topLevelSite&&(key.hasCrossSiteAncestor===void 0||key.hasCrossSiteAncestor===!1)}).sort((left,right)=>right.path.length-left.path.length)}function serializeRequestCookies(cookies){return cookies.map(cookie=>`${cookie.name}=${cookie.value}`).join("; ")}function requestCookiesToMap(cookies){let values=new Map;for(let cookie of cookies)values.has(cookie.name)||values.set(cookie.name,cookie.value);return values}function normalizeCookieDomain(input2,action){let value=input2.trim();if(!value)throw new Error(`${action}: "domain" must be a non-empty domain`);let hostname3;try{hostname3=new URL(value.includes("://")?value:`https://${value}`).hostname}catch{throw new Error(`${action}: invalid domain "${input2}"`)}if(hostname3=hostname3.toLowerCase().replace(/^\.+/,"").replace(/\.+$/,""),!hostname3)throw new Error(`${action}: invalid domain "${input2}"`);return hostname3}function isSecureCookieUrl(url2){let hostname3=url2.hostname.replace(/\.$/,""),isLocalhost=hostname3==="localhost"||hostname3.endsWith(".localhost")||hostname3==="[::1]"||/^127\.\d+\.\d+\.\d+$/.test(hostname3);return url2.protocol==="https:"||isLocalhost}function filterCookiesForUrl(cookies,cookieUrl){let url2=new URL(cookieUrl);return cookies.filter(item=>{let domain2=item.domain.replace(/^\./,"").toLowerCase(),hostOnly=item.hostOnly??!item.domain.startsWith(".");return url2.hostname!==domain2&&(hostOnly||!url2.hostname.endsWith(`.${domain2}`))||item.secure&&!isSecureCookieUrl(url2)?!1:url2.pathname===item.path||url2.pathname.startsWith(item.path)&&(item.path.endsWith("/")||url2.pathname[item.path.length]==="/")})}function selectReadableCookie(cookies,target){let cookie=cookies.filter(item=>{if(item.partitionKey!==void 0||item.partitionKeyOpaque===!0||item.name!==target.cookieName)return!1;let domain2=item.domain.replace(/^\./,"").toLowerCase();return!(target.domain&&domain2!==target.domain||target.path&&item.path!==target.path)}).sort((left,right)=>{let pathDifference=right.path.length-left.path.length;return pathDifference!==0?pathDifference:right.domain.length-left.domain.length})[0];if(cookie?.httpOnly)throw new Error(`get_cookie: "${target.cookieName}" is HttpOnly and cannot be read`);return cookie}function validateCookieName(input2,action){if(typeof input2!="string"||!input2.trim())throw new Error(`${action}: "name" is required`);let name=input2.trim();if(name.length>256||!/^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/.test(name))throw new Error(`${action}: "name" contains unsupported cookie characters`);return name}function validateCookieValue(input2){if(typeof input2!="string")throw new Error('set_cookie: "value" must be a string');let hasUnsupportedCharacter=[...input2].some(character=>{let code=character.charCodeAt(0);return code<=32||code===127||character===";"||character===","});if(input2.length>4096||hasUnsupportedCharacter)throw new Error('set_cookie: "value" contains unsupported cookie characters');return input2}function validateCookiePath(input2,action){if(input2===void 0)return;if(typeof input2!="string"||!input2.startsWith("/"))throw new Error(`${action}: "path" must start with "/"`);let hasUnsupportedCharacter=[...input2].some(character=>{let code=character.charCodeAt(0);return code<32||code===127||character===";"});if(input2.length>1024||hasUnsupportedCharacter)throw new Error(`${action}: "path" contains unsupported cookie characters`);return input2}function parseCurrentUrl(currentUrl,action){if(!currentUrl)throw new Error(`${action}: specify url or tabId`);let url2;try{url2=new URL(currentUrl)}catch{throw new Error(`${action}: invalid current page URL "${currentUrl}"`)}if(url2.protocol!=="http:"&&url2.protocol!=="https:")throw new Error(`${action}: current page must use http or https`);return url2}function resolveCookieUrl(currentUrl,input2,action){if(input2.url!==void 0&&(typeof input2.url!="string"||!input2.url.trim()))throw new Error(`${action}: "url" must be a non-empty string`);let url2=parseCurrentUrl(input2.url??currentUrl,action);if(input2.url!==void 0&&(url2.username||url2.password))throw new Error(`${action}: "url" must not contain credentials`);return url2}function resolveExplicitDomain(url2,input2,action){if(input2!==void 0&&typeof input2!="string")throw new Error(`${action}: "domain" must be a string`);let explicitDomain=typeof input2=="string"&&input2?normalizeCookieDomain(input2,action):void 0;if(explicitDomain&&url2.hostname.toLowerCase()!==explicitDomain&&!url2.hostname.toLowerCase().endsWith(`.${explicitDomain}`))throw new Error(`${action}: domain "${explicitDomain}" is not a parent domain of target host "${url2.hostname.toLowerCase()}"`);return explicitDomain}function resolveGetCookieTarget(currentUrl,input2){let action="get_cookie",url2=resolveCookieUrl(currentUrl,input2,action),name=validateCookieName(input2?.name,action),domain2=resolveExplicitDomain(url2,input2?.domain,action),path27=validateCookiePath(input2?.path,action);return{cookieName:name,cookieUrl:`${url2.protocol}//${url2.hostname}${(path27??url2.pathname)||"/"}`,...domain2?{domain:domain2}:{},...path27?{path:path27}:{}}}function resolveSetCookieTarget(currentUrl,input2){let action="set_cookie",url2=resolveCookieUrl(currentUrl,input2,action),name=validateCookieName(input2?.name,action),value=validateCookieValue(input2?.value),path27=validateCookiePath(input2?.path,action)??"/";if(input2.reload!==void 0&&typeof input2.reload!="boolean")throw new Error('set_cookie: "reload" must be a boolean');let explicitDomain=resolveExplicitDomain(url2,input2?.domain,action),domain2=explicitDomain??url2.hostname.toLowerCase();return{cookieName:name,cookieValue:value,...explicitDomain?{cookieDomain:explicitDomain.includes(".")?`.${explicitDomain}`:explicitDomain}:{},cookieUrl:`${url2.protocol}//${url2.hostname.toLowerCase()}${path27}`,domain:domain2,path:path27,reload:input2.reload===!0}}var import_tldts,init_cookie=__esm({"../browser-core/dist/cookie.js"(){"use strict";import_tldts=__toESM(require_cjs(),1)}});function resolveMtopRequest(data){let{api,data:requestData={},version:version3="1.0",method="GET",appKey="12574478",env="prod",timeout=1e4,headers:customHeaders={},ttid}=data;if(!api||typeof api!="string"||api.trim()==="")throw new Error('Invalid api: api must be a non-empty string (e.g. "mtop.trade.order.create")');let baseHost=MTOP_HOST_MAP[env.toLowerCase()];if(!baseHost)throw new Error(`Invalid env: "${env}". Supported values: ${Object.keys(MTOP_HOST_MAP).join(", ")}`);let normalizedMethod=method.toUpperCase();if(normalizedMethod!=="GET"&&normalizedMethod!=="POST")throw new Error(`Invalid method: ${method}. mtop only supports GET or POST`);if(!Number.isFinite(timeout)||timeout<=0)throw new Error("Invalid timeout: timeout must be a positive number");return{api,requestData,dataStr:typeof requestData=="string"?requestData:JSON.stringify(requestData),version:version3,normalizedMethod,appKey,gatewayUrl:new URL(`https://${baseHost}/h5/${api}/${version3}/`),customHeaders,ttid,timeout,isMopen:api.startsWith("mopen.")}}function prepareSignedMtopRequest(resolved,cookies,stream=!1,timestamp=Date.now()){let cookieMap=cookies instanceof Map?cookies:requestCookiesToMap(cookies),token=extractMtopToken(cookieMap,resolved.isMopen),sign=computeMtopSign({api:resolved.api,version:resolved.version,timestamp,appKey:resolved.appKey,token,dataStr:resolved.dataStr,isMopen:resolved.isMopen}),targetUrl=new URL(resolved.gatewayUrl),queryParams={jsv:"2.7.2",appKey:resolved.appKey,t:timestamp.toString(),sign,api:resolved.api,v:resolved.version,type:"originaljson",dataType:"json"};stream&&(queryParams.xAcceptStream="true"),resolved.ttid&&(queryParams.ttid=resolved.ttid),resolved.normalizedMethod==="GET"&&(queryParams.data=resolved.dataStr);for(let[name,value]of Object.entries(queryParams))targetUrl.searchParams.set(name,value);let requestHeaders={Accept:stream?"text/event-stream":"application/json",...resolved.customHeaders},body;return resolved.normalizedMethod==="POST"&&(body=new URLSearchParams({data:resolved.dataStr}).toString(),requestHeaders["Content-Type"]="application/x-www-form-urlencoded"),{...resolved,targetUrl,requestHeaders,cookieHeader:cookies instanceof Map?buildCookieHeaderValue(cookies):serializeRequestCookies(cookies),body}}function parseMtopResponseText(text3){try{return JSON.parse(text3)}catch{let jsonpMatch=text3.match(/^[^(]*\((.*)\)\s*;?\s*$/s);if(!jsonpMatch?.[1])return text3;try{return JSON.parse(jsonpMatch[1])}catch{return text3}}}function summarizeMtopStreamError(body){if(body&&typeof body=="object"){let record4=body;if(Array.isArray(record4.ret))return record4.ret.map(String).join(", ");if(typeof record4.message=="string")return record4.message}return((typeof body=="string"?body:JSON.stringify(body))??String(body)).slice(0,500)}async function consumeMtopSseResponse(response,onReceive){let contentType2=response.headers.get("content-type")??"";if(!response.ok||!response.body||!contentType2.includes("text/event-stream")){let body=parseMtopResponseText(await response.text());throw new Error(`Unexpected MTOP stream response: ${summarizeMtopStreamError(body)}`)}let reader=response.body.getReader(),decoder=new TextDecoder,parser=createSseEventParser(),lastData=null,emit=async(text3,finished=!1)=>{let events=[...parser.push(text3),...finished?parser.finish():[]];for(let event of events)lastData=event.data,await onReceive(event)};for(;;){let{done,value}=await reader.read();if(done)return await emit(decoder.decode(),!0),lastData;await emit(decoder.decode(value,{stream:!0}))}}var init_mtopRequest=__esm({"../browser-core/dist/mtopRequest.js"(){"use strict";init_mtopSigner();init_sseParser();init_cookie()}});function parseRequestData(data){if(typeof data!="string")return data;try{return JSON.parse(data)}catch{return data}}function parseQueryString(url2){let queryString=[];try{new URL(url2).searchParams.forEach((value,name)=>queryString.push({name,value}))}catch{}return queryString}function redactSensitiveHeaders(headers){let sensitiveNames=new Set(["authorization","cookie","proxy-authorization"]);return headers.map(header=>sensitiveNames.has(header.name.toLowerCase())?{...header,value:"<redacted>"}:header)}function createMtopStreamCapture(data){let timestampMs2=data.timestampMs??Date.now(),url2=data.url??`mtop://${data.api}/`;return{startTimeMs:timestampMs2,request:{id:data.id,timestamp:new Date(timestampMs2).toISOString(),timestampMs:timestampMs2,method:data.method,url:url2,apiName:data.api,status:0,statusText:"SSE Streaming",headers:redactSensitiveHeaders(data.requestHeaders??[]),responseHeaders:[],queryString:parseQueryString(url2),postData:parseRequestData(data.requestData??null),responseBody:[],isProxy:!0,proxyRequestUrl:null,proxyData:null,isSSE:!0,isPending:!0,...data.tabId!==void 0?{tabId:data.tabId}:{},source:"mtop",resourceType:"fetch",captureSequence:data.captureSequence}}}function updateMtopStreamCaptureResponse(capture,response){capture.request.status=response.status,capture.request.statusText=response.statusText,capture.request.responseHeaders=response.responseHeaders}function appendMtopStreamCaptureChunk(capture,data,timestampMs2=Date.now()){return Array.isArray(capture.request.responseBody)?(capture.request.responseBody.push({event:"message",data,timestamp:timestampMs2,duration:capture.lastMessageTimeMs===void 0?0:timestampMs2-capture.lastMessageTimeMs}),capture.lastMessageTimeMs=timestampMs2,!0):!1}function finishMtopStreamCapture(capture,options={}){let timestampMs2=options.timestampMs??Date.now();if(capture.request.isPending=!1,capture.request.duration=Math.max(0,timestampMs2-capture.startTimeMs),options.error){capture.request.statusText=options.error,Array.isArray(capture.request.responseBody)&&capture.request.responseBody.length===0&&(capture.request.responseBody={error:options.error});return}capture.request.status===0&&(capture.request.status=200),(!capture.request.statusText||capture.request.statusText==="SSE Streaming")&&(capture.request.statusText="OK")}var init_mtopStreamCapture=__esm({"../browser-core/dist/mtopStreamCapture.js"(){"use strict"}});function isAppProfileUserInfoUrl(url2){try{let target=new URL(url2);return(target.protocol==="http:"||target.protocol==="https:")&&(target.hostname==="taobao.com"||target.hostname.endsWith(".taobao.com"))}catch{return!1}}function decodeCookieValue(raw){let value=raw;for(let index=0;index<2;index+=1)try{let decoded=decodeURIComponent(value);if(decoded===value)break;value=decoded}catch{break}return value.replace(/\\u([0-9a-f]{4})/gi,(_match,hex3)=>String.fromCharCode(Number.parseInt(hex3,16)))}function firstCookieValue(cookies,name){let value=cookies.find(cookie=>cookie.name===name&&cookie.value&&cookie.value!=="null")?.value;return value?decodeCookieValue(value):""}function resolveAppProfileUserInfo(url2,cookies){if(!isAppProfileUserInfoUrl(url2))return{};let userId=firstCookieValue(cookies,"unb"),userName=["_w_tb_nick","_nk_","snk","tracknick"].map(name=>firstCookieValue(cookies,name)).find(Boolean);return{...userId&&{userId},...userName&&{userName}}}var init_appProfileUserInfo=__esm({"../browser-core/dist/appProfileUserInfo.js"(){"use strict"}});function isTrackingUrl(url2){return APLUS_URL_PATTERN.test(url2)||RUM_URL_PATTERN.test(url2)||ARMS_URL_PATTERN.test(url2)||/retcode\.alicdn\.com|beacon\.taobao\.com|tbsec\./i.test(url2)}function formatTimestamp(ms){let d=new Date(ms),pad=n=>String(n).padStart(2,"0");return`${d.getFullYear()}/${pad(d.getMonth()+1)}/${pad(d.getDate())} ${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`}function parseParams(value){let params={};return value.split("&").forEach(pair=>{let eqIndex=pair.indexOf("=");if(eqIndex===-1)return;let rawKey=pair.slice(0,eqIndex),rawValue=pair.slice(eqIndex+1);try{params[decodeURIComponent(rawKey)]=rawValue}catch{params[rawKey]=rawValue}}),params}function decodeParamValue(value){try{return decodeURIComponent(value)}catch{return value}}function parseJsonParamValue(value){try{return JSON.parse(value)}catch{let decoded=decodeParamValue(value);if(decoded===value)return;try{return JSON.parse(decoded)}catch{return}}}function parseUrlParams(search){let encodedParams=parseParams(search.startsWith("?")?search.slice(1):search);return Object.fromEntries(Object.entries(encodedParams).map(([key,value])=>[key,decodeParamValue(value)]))}function extractSpmFromUrl(spmOrUrl){if(!/^https?:\/\//i.test(spmOrUrl))return spmOrUrl;try{return new URL(spmOrUrl).searchParams.get("spm")??spmOrUrl}catch{return spmOrUrl}}function resolveAplusSpm(eventType,raw){let expSpm=(Array.isArray(raw.expdata)?raw.expdata:[])[0]?.spm||"",gokeyParams=parseParams(raw.gokey||""),gokeySpm=decodeParamValue(gokeyParams.spm||""),rawSpmUrl=raw["spm-url"]||decodeParamValue(gokeyParams["spm-url"]||""),spmUrl=extractSpmFromUrl(rawSpmUrl),pointSpm;switch(eventType){case"CLK":pointSpm=gokeySpm||expSpm;break;case"EXP":pointSpm=expSpm;break;case"PV":pointSpm=spmUrl;break;default:pointSpm=gokeySpm||expSpm}return{mainSpm:pointSpm,highlightSpm:pointSpm}}function parseAplusRequest(url2,options={}){if(!APLUS_URL_PATTERN.test(url2))return null;let urlObj;try{urlObj=new URL(url2)}catch{return null}let params=parseUrlParams(urlObj.search),gmkey=params.gmkey??"UNKNOWN",urlPathName=urlObj.pathname.slice(1),eventType=urlPathName.split(".")[1]==="selfdefine"?"SDF":gmkey,gokeyRaw=params.gokey??"",gokeyParams=parseParams(gokeyRaw),expdata=[];if(gokeyParams.expdata){let parsedExpdata=parseJsonParamValue(gokeyParams.expdata);Array.isArray(parsedExpdata)&&(expdata=parsedExpdata.map(item=>{if(!item?.exargs||typeof item.exargs!="object")return item;let decoded={};for(let[key,value]of Object.entries(item.exargs)){if(typeof value!="string"){decoded[key]=value;continue}let parsedValue=parseJsonParamValue(value);decoded[key]=parsedValue===void 0?value:parsedValue}return{...item,exargs:decoded}}))}let rawBizArgs=gokeyParams.bizArgs,parsedBizArgs=rawBizArgs===void 0?void 0:parseJsonParamValue(rawBizArgs),bizArgs=parsedBizArgs===void 0?rawBizArgs:parsedBizArgs,pageUrl=params._p_url??(gokeyParams._p_url?decodeParamValue(gokeyParams._p_url):""),{gokey:rawGokey,...topLevelParams}=params,rawData={...topLevelParams,_path:urlPathName,_url:url2,gokey:rawGokey,...expdata.length>0?{expdata}:{},...bizArgs!==void 0?{bizArgs}:{}},spm=resolveAplusSpm(eventType,rawData).mainSpm,pathName=urlPathName.split(".").slice(1).join("."),eventName=eventType==="SDF"?pathName:spm||pathName||pageUrl,now=options.now??Date.now();return{id:`aplus-${options.sequence??++aplusCounter}-${now}`,source:"aplus",batchId:0,batchTimestampMs:now,batchTimestamp:formatTimestamp(now),event_type:eventType,name:eventName,url:url2,timestamp:now,_raw:rawData,_context:{requestUrl:url2,app:{},user:{...params.uidaplus?{uidaplus:params.uidaplus}:{},...params._gr_uid_?{_gr_uid_:params._gr_uid_}:{}},session:{},view:{...params["spm-url"]?{"spm-url":params["spm-url"]}:{},...params["spm-pre"]?{"spm-pre":params["spm-pre"]}:{},...params["spm-cnt"]?{"spm-cnt":params["spm-cnt"]}:{},...pageUrl?{page_url:pageUrl}:{}},properties:{},os:{},net:{}}}}function parseRumBody(postData){if(!postData)return null;if(typeof postData=="object")return postData;try{return JSON.parse(postData)}catch{return null}}function tryConvertI18nTracker(event,base){let normalizedType=RUM_TYPE_ALIAS[event.type]??event.type;if(event.event_type!=="action"||normalizedType!=="custom")return null;let snapshots;try{snapshots=typeof event.snapshots=="string"?JSON.parse(event.snapshots):event.snapshots}catch{return null}if(!snapshots||typeof snapshots!="object")return null;let eventType=I18N_TRACKER_TYPE_MAP[snapshots.message];if(!eventType)return null;let spm=[snapshots.c1??"",snapshots.c2??""].filter(Boolean).join("."),exargs={};typeof snapshots.c3=="string"&&snapshots.c3.split("&").forEach(pair=>{let eqIndex=pair.indexOf("=");if(eqIndex===-1)return;let key=pair.slice(0,eqIndex),rawValue=pair.slice(eqIndex+1);try{exargs[key]=JSON.parse(decodeURIComponent(rawValue))}catch{exargs[key]=rawValue}});let dataAttrs=snapshots.trackerInfo?.dataAttrs;if(dataAttrs&&typeof dataAttrs=="object"&&dataAttrs["data-biz-args"]&&!exargs.bizArgs)try{exargs.bizArgs=JSON.parse(dataAttrs["data-biz-args"])}catch{exargs.bizArgs=dataAttrs["data-biz-args"]}return{...base,event_type:eventType,name:spm,_raw:{...event,expdata:[{spm,...Object.keys(exargs).length>0?{exargs}:{}}],"spm-url":spm}}}function parseRumRequest(url2,postData,options={}){if(!RUM_URL_PATTERN.test(url2))return[];let parsed=parseRumBody(postData),rawEvents=Array.isArray(parsed?.events)?parsed.events:[];if(rawEvents.length===0)return[];let now=options.now??Date.now(),batchId=options.sequence??++rumCounter,context={requestUrl:url2,app:parsed?.app??{},user:parsed?.user??{},session:parsed?.session??{},view:parsed?.view??{},properties:parsed?.properties??{},os:parsed?.os??{},net:parsed?.net??{}};return rawEvents.flatMap((rawEvent,index)=>{if(!rawEvent||typeof rawEvent!="object"||Array.isArray(rawEvent))return[];let event=rawEvent,normalizedType=RUM_TYPE_ALIAS[event.type]??event.type,base={id:`${batchId}-${event.event_id??index}`,batchId,batchTimestampMs:now,batchTimestamp:formatTimestamp(now),type:normalizedType,url:event.url,timestamp:event.timestamp??now,success:event.success,status_code:event.status_code,method:event.method,duration:event.duration,source:"rum",_context:context},converted=tryConvertI18nTracker(event,base);return converted?[converted]:[{...base,event_type:event.event_type??"unknown",name:event.name,_raw:event}]})}function parseArmsRequest(url2,options={}){if(!ARMS_URL_PATTERN.test(url2))return null;let urlObj;try{urlObj=new URL(url2)}catch{return null}let params={};urlObj.searchParams.forEach((value,key)=>{params[key]=value});let eventType=(params.t??"unknown").toLowerCase(),page=params.page??"",now=options.now??Date.now(),sequence=options.sequence??++armsCounter,parsedTimestamp2=params.begin?Number.parseInt(params.begin,10):now,timestamp=Number.isFinite(parsedTimestamp2)?parsedTimestamp2:now;return{id:`arms-${sequence}-${now}`,source:"arms",batchId:0,batchTimestampMs:now,batchTimestamp:formatTimestamp(now),event_type:eventType,name:page||url2,url:url2,timestamp,_raw:{...params,_url:url2},_context:{requestUrl:url2,app:{...params.pid?{pid:params.pid}:{},...params.release?{release:params.release}:{},...params.environment?{environment:params.environment}:{},...params._v?{sdk_version:params._v}:{}},user:{...params.uid?{uid:params.uid}:{}},session:{...params.sid?{sid:params.sid}:{}},view:{...page?{page}:{},...params.tag?{tag:params.tag}:{}},properties:{},os:{},net:{...params.ct?{ct:params.ct}:{}}}}}function parseTrackingRequest(url2,postData,options={}){let rumEvents=parseRumRequest(url2,postData,options);if(rumEvents.length>0)return rumEvents;let aplusEvent=parseAplusRequest(url2,options);if(aplusEvent)return[aplusEvent];let armsEvent=parseArmsRequest(url2,options);return armsEvent?[armsEvent]:[]}var APLUS_URL_PATTERN,RUM_URL_PATTERN,ARMS_URL_PATTERN,aplusCounter,armsCounter,rumCounter,RUM_TYPE_ALIAS,I18N_TRACKER_TYPE_MAP,init_eventParsers=__esm({"../browser-core/dist/eventParsers.js"(){"use strict";APLUS_URL_PATTERN=/\.mmstat\.com\//,RUM_URL_PATTERN=/\.rum\.aliyuncs\.com\//,ARMS_URL_PATTERN=/arms-retcode\.aliyuncs\.com\//;aplusCounter=0,armsCounter=0,rumCounter=0;RUM_TYPE_ALIAS={cst:"custom"},I18N_TRACKER_TYPE_MAP={"i18n-tracker-exp":"EXP","i18n-tracker-clk":"CLK"}}});function createCaptureGeneration(){return crypto.randomUUID()}function encodeCaptureCursor(cursor){return`${CURSOR_PREFIX}:${cursor.tabId}:${cursor.generation}:${cursor.scope}:${cursor.sequence}`}function decodeCaptureCursor(value){let match=value.match(/^mearl-capture-v1:(\d+):([^:]+):(all|logs|requests|events):(\d+)$/);if(!match)throw new Error("Invalid capture cursor");let tabId=Number(match[1]),sequence=Number(match[4]);if(!Number.isSafeInteger(tabId)||!Number.isSafeInteger(sequence))throw new Error("Invalid capture cursor");return{tabId,generation:match[2],scope:match[3],sequence}}function captureCheckpoint(state){return encodeCaptureCursor({tabId:state.tabId,generation:state.generation,sequence:state.currentSequence,scope:"all"})}function nextCaptureSequence(state){return state.currentSequence+=1,state.currentSequence}function resolveAfterSequence(after,state,scope){if(!after)return 0;let cursor=decodeCaptureCursor(after);if(cursor.tabId!==state.tabId)throw new Error(`Capture cursor belongs to tab ${cursor.tabId}, not tab ${state.tabId}`);if(cursor.generation!==state.generation)throw new Error("Capture cursor expired because the tab collector was restarted");if(cursor.scope!=="all"&&cursor.scope!==scope)throw new Error(`Capture cursor is scoped to ${cursor.scope}, not ${scope}`);if(cursor.sequence>state.currentSequence)throw new Error("Capture cursor is ahead of the current collector state");return cursor.sequence}function queryCapturedEntries(buffer,state,options,matches,droppedThroughSequence=0,scope="all"){let{after,since,now=Date.now()}=options,limit=Math.max(1,Math.floor(options.limit??100)),afterSequence=resolveAfterSequence(after,state,scope),sinceTimestampMs=since===void 0?void 0:now-since*1e3,matched=buffer.filter(entry=>entry.captureSequence>afterSequence&&(sinceTimestampMs===void 0||entry.timestampMs>=sinceTimestampMs)&&matches(entry)),hasMore=matched.length>limit,entries=after?matched.slice(0,limit):matched.slice(-limit),nextSequence=after&&hasMore&&entries.length>0?entries[entries.length-1].captureSequence:state.currentSequence;return{entries,totalMatched:matched.length,nextCursor:encodeCaptureCursor({tabId:state.tabId,generation:state.generation,sequence:nextSequence,scope}),hasMore,gap:after!==void 0&&afterSequence<droppedThroughSequence}}var CURSOR_PREFIX,init_capture=__esm({"../browser-core/dist/capture.js"(){"use strict";CURSOR_PREFIX="mearl-capture-v1"}});function compileTextPattern(value){try{return{regex:new RegExp(value,"i"),fallback:""}}catch{return{regex:null,fallback:value.toLowerCase()}}}function matchesTextPattern(value,pattern3){return value?pattern3.regex?pattern3.regex.test(value):value.toLowerCase().includes(pattern3.fallback):!1}function compactEventUrl(value){if(value)try{let url2=new URL(value);return url2.origin==="null"?value.split(/[?#]/,1)[0]:`${url2.origin}${url2.pathname}`}catch{return value.split(/[?#]/,1)[0]}}function formatTrackingEvent(event,includeRaw=!1){let{captureSequence:_discardedCaptureSequence,...publicEvent}=event;if(includeRaw)return publicEvent;let{_raw:_discardedRaw,_context,url:url2,...summary}=publicEvent,compactUrl=compactEventUrl(url2??_context.requestUrl);return{...summary,...compactUrl?{url:compactUrl}:{}}}function matchesTrackingEvent(event,options){let{source="all",event_type,filter}=options;if(source!=="all"&&event.source!==source||event_type&&!matchesTextPattern(event.event_type,compileTextPattern(event_type)))return!1;if(filter){let pattern3=compileTextPattern(filter);if(!matchesTextPattern(event.name,pattern3)&&!matchesTextPattern(event.url,pattern3))return!1}return!0}function queryTrackingEvents(buffer,options={}){let{source="all",event_type,filter,since,limit=20,now=Date.now()}=options,events=[...buffer].reverse();if(source!=="all"&&(events=events.filter(event=>event.source===source)),since!==void 0){let sinceTimestamp=now-since*1e3;events=events.filter(event=>event.batchTimestampMs>=sinceTimestamp)}if(event_type){let pattern3=compileTextPattern(event_type);events=events.filter(event=>matchesTextPattern(event.event_type,pattern3))}if(filter){let pattern3=compileTextPattern(filter);events=events.filter(event=>matchesTextPattern(event.name,pattern3)||matchesTextPattern(event.url,pattern3))}return{events:events.slice(0,limit),totalMatched:events.length,totalInBuffer:buffer.length}}function appendCapturedTrackingBatch(buffer,events,maxSize){if(events.length===0)return[];let captureSequence=events[0].captureSequence,insertionIndex=Number.isSafeInteger(captureSequence)?buffer.findIndex(event=>Number.isSafeInteger(event.captureSequence)&&event.captureSequence>captureSequence):-1;if(buffer.splice(insertionIndex<0?buffer.length:insertionIndex,0,...events),buffer.length<=maxSize)return[];let removeCount=buffer.length-maxSize,boundarySequence=buffer[removeCount-1]?.captureSequence;for(;boundarySequence!==void 0&&buffer[removeCount]?.captureSequence===boundarySequence;)removeCount+=1;return buffer.splice(0,removeCount)}function queryCapturedTrackingEvents(buffer,state,options={},droppedThroughSequence=0){let limit=Math.max(1,Math.floor(options.limit??20));if(!options.after){let snapshot=queryTrackingEvents(buffer,options);return{...snapshot,nextCursor:encodeCaptureCursor({tabId:state.tabId,generation:state.generation,sequence:state.currentSequence,scope:"events"}),hasMore:snapshot.totalMatched>limit,gap:!1}}let sinceTimestampMs=options.since===void 0?void 0:(options.now??Date.now())-options.since*1e3,batchesBySequence=new Map;for(let event of buffer){if(!Number.isSafeInteger(event.captureSequence)||sinceTimestampMs!==void 0&&event.batchTimestampMs<sinceTimestampMs||!matchesTrackingEvent(event,options))continue;let captureSequence=event.captureSequence,batch=batchesBySequence.get(captureSequence);batch?batch.events.push(event):batchesBySequence.set(captureSequence,{captureSequence,timestampMs:event.batchTimestampMs,events:[event]})}let batches=[...batchesBySequence.values()].sort((left,right)=>left.captureSequence-right.captureSequence),captured=queryCapturedEntries(batches,state,{after:options.after,limit:Number.MAX_SAFE_INTEGER},()=>!0,droppedThroughSequence,"events"),selected=[],selectedCount=0;for(let batch of captured.entries){if(selected.length>0&&selectedCount+batch.events.length>limit)break;selected.push(batch),selectedCount+=batch.events.length}let hasMore=selected.length<captured.entries.length,nextSequence=hasMore?selected[selected.length-1].captureSequence:state.currentSequence;return{events:selected.flatMap(batch=>batch.events),totalMatched:captured.entries.reduce((total,batch)=>total+batch.events.length,0),totalInBuffer:buffer.length,nextCursor:encodeCaptureCursor({tabId:state.tabId,generation:state.generation,sequence:nextSequence,scope:"events"}),hasMore,gap:captured.gap}}var TRACKING_CAPTURE_ARMED_HINT,init_eventFilters=__esm({"../browser-core/dist/eventFilters.js"(){"use strict";init_capture();TRACKING_CAPTURE_ARMED_HINT="Event capture is active, but this tab has no captured history yet. Reload the current tab or repeat the triggering action, then call get_events again."}});function getStructure2(data,options={}){let{maxDepth=5,maxKeys=50,arraySamples=1,maxNodes=2e3}=options;for(let[name,value,limit]of[["maxDepth",maxDepth,20],["maxKeys",maxKeys,1e3],["arraySamples",arraySamples,20],["maxNodes",maxNodes,1e4]])if(!Number.isSafeInteger(value)||value<1||value>limit)throw new Error(`${name} must be an integer between 1 and ${limit}`);let ancestors=new WeakSet,nodes=0,visit=(value,depth)=>{if(++nodes>maxNodes)return"<max nodes reached>";if(depth>=maxDepth)return"<max depth reached>";if(value===null)return"null";if(typeof value!="object")return typeof value;if(ancestors.has(value))return"<circular>";ancestors.add(value);try{if(Array.isArray(value)){if(!value.length)return"array[0]";let samples=Array.from({length:Math.min(value.length,arraySamples)},(_,index)=>{let descriptor=Object.getOwnPropertyDescriptor(value,index);return descriptor&&"value"in descriptor?visit(descriptor.value,depth+1):descriptor?"<accessor>":"undefined"});return{_type:`array[${value.length}]`,...arraySamples===1?{_sample:samples[0]}:{_samples:samples}}}let keys=Object.keys(value),entries=keys.slice(0,maxKeys).map(key=>{let descriptor=Object.getOwnPropertyDescriptor(value,key);return[key,"value"in descriptor?visit(descriptor.value,depth+1):"<accessor>"]});return keys.length>maxKeys&&entries.push(["<truncated keys>",keys.length-maxKeys]),Object.fromEntries(entries)}finally{ancestors.delete(value)}};return visit(data,0)}var init_dataStructure=__esm({"../browser-core/dist/dataStructure.js"(){"use strict"}});function parsePath(path27){if(path27.length>1e3)throw new Error("Path too long: maximum 1000 characters allowed");let keys=[],current="";for(let i=0;i<path27.length;i++){let char=path27[i];if(char===".")current&&(keys.push(current),current="");else if(char==="["){current&&(keys.push(current),current="");let j=i+1;for(;j<path27.length&&path27[j]!=="]";)j++;if(j<path27.length){let index=parseInt(path27.substring(i+1,j),10);if(!isNaN(index)){if(index<0||index>1e5)throw new Error(`Array index out of safe range: ${index}`);keys.push(index)}i=j}}else current+=char}if(current&&keys.push(current),keys.length>50)throw new Error("Path too deep: maximum 50 levels allowed");return keys}function getValueByPath(obj,path27){let keys=parsePath(path27),current=obj;for(let key of keys){if(current==null)return;current=current[key]}return current}function setValueByPath(obj,path27,value){let keys=parsePath(path27),current=obj;for(let i=0;i<keys.length-1;i++){let key=keys[i],nextKey=keys[i+1];(current[key]===null||current[key]===void 0)&&(current[key]=typeof nextKey=="number"?[]:{}),current=current[key]}current[keys[keys.length-1]]=value}function truncateData(data,maxSize){let str=JSON.stringify(data);if(str.length<=maxSize)return data;let truncated=str.substring(0,maxSize);return`<truncated: ${str.length} bytes, showing first ${maxSize} chars>
991
+ ${truncated}...`}function extractFields(data,fields3){if(fields3.length>100)throw new Error("Too many fields: maximum 100 fields allowed");let result={};for(let fieldPath of fields3)try{result[fieldPath]=getValueByPath(data,fieldPath)}catch(error48){result[fieldPath]=`<error: ${error48 instanceof Error?error48.message:"field not found"}>`}return result}function serializeRequest(request,options={}){let{fields:fields3,includeBody=!fields3?.length,includeHeaders=!1,maxBodySize=5e4,keysOnly=!1}=options,result={id:request.id,timestamp:request.timestamp,timestampMs:request.timestampMs,method:request.method,url:request.url,apiName:request.apiName,status:request.status,statusText:request.statusText,queryString:request.queryString,duration:request.duration,captureSequence:request.captureSequence,isPending:request.isPending,isSSE:request.isSSE,source:request.source,resourceType:request.resourceType};return includeHeaders&&(result.headers=request.headers,result.responseHeaders=request.responseHeaders),keysOnly?(result.postDataStructure=request.postData?getStructure2(request.postData):null,result.responseBodyStructure=request.responseBody?getStructure2(request.responseBody):null,result):(includeBody&&(result.postData=request.postData==null?request.postData:truncateData(request.postData,maxBodySize),result.responseBody=request.responseBody==null?request.responseBody:truncateData(request.responseBody,maxBodySize)),fields3&&fields3.length>0&&(result.extractedFields=extractFields(request.responseBody,fields3)),result)}var init_requestSerializer=__esm({"../browser-core/dist/requestSerializer.js"(){"use strict";init_dataStructure()}});function byteLength(value){return textEncoder.encode(value).byteLength}function serializeForStorage(value){if(typeof value=="string")return value;try{return JSON.stringify(value)}catch{return String(value)}}function truncateUtf8(value,maxBytes){if(byteLength(value)<=maxBytes)return value;let low=0,high=Math.min(value.length,maxBytes);for(;low<high;){let middle=Math.ceil((low+high)/2);byteLength(value.slice(0,middle))<=maxBytes?low=middle:high=middle-1}return value.slice(0,low)}function limitBufferedField(value,maxBytes){if(value==null)return value;let serialized=serializeForStorage(value),originalBytes=byteLength(serialized);if(originalBytes<=maxBytes)return value;let marker=`<truncated: ${originalBytes} bytes, buffered preview>
992
992
  `;if(byteLength(marker)+3>maxBytes)return truncateUtf8(`${marker}...`,maxBytes);let previewBudget=Math.max(0,maxBytes-byteLength(marker)-3);return`${marker}${truncateUtf8(serialized,previewBudget)}...`}function estimateRequestBufferBytes(request){try{return byteLength(JSON.stringify(request))}catch{return byteLength(String(request))}}function createRequestBufferAccounting(){return{sizes:[],totalBytes:0}}function synchronizeAccounting(requests,accounting){accounting.sizes.length!==requests.length&&(accounting.sizes=requests.map(estimateRequestBufferBytes),accounting.totalBytes=accounting.sizes.reduce((total,size)=>total+size,0))}function applyFieldLimits(request,maxFieldBytes){request.postData=limitBufferedField(request.postData,maxFieldBytes),request.responseBody=limitBufferedField(request.responseBody,maxFieldBytes)}function trimRequestBuffer(requests,accounting,maxEntries,maxBytes){let removed=[];for(;requests.length>1&&(requests.length>maxEntries||accounting.totalBytes>maxBytes);){let request=requests.shift();request&&removed.push(request),accounting.totalBytes-=accounting.sizes.shift()??0}return removed}function appendRequestToBuffer(requests,accounting,request,limits={}){let{maxEntries=500,maxBytes=33554432,maxFieldBytes=8388608}=limits;synchronizeAccounting(requests,accounting),applyFieldLimits(request,maxFieldBytes);let size=estimateRequestBufferBytes(request);return requests.push(request),accounting.sizes.push(size),accounting.totalBytes+=size,trimRequestBuffer(requests,accounting,maxEntries,maxBytes)}function refreshRequestInBuffer(requests,accounting,request,limits={}){let{maxEntries=500,maxBytes=33554432,maxFieldBytes=8388608}=limits,index=requests.indexOf(request);if(index===-1)return[];synchronizeAccounting(requests,accounting),applyFieldLimits(request,maxFieldBytes);let previousSize=accounting.sizes[index]??0,nextSize=estimateRequestBufferBytes(request);return accounting.sizes[index]=nextSize,accounting.totalBytes+=nextSize-previousSize,trimRequestBuffer(requests,accounting,maxEntries,maxBytes)}var textEncoder,init_boundedRequestBuffer=__esm({"../browser-core/dist/boundedRequestBuffer.js"(){"use strict";textEncoder=new TextEncoder}});var DomainPermissionError,ALLOWED_ORIGINS,ALLOWED_ORIGINS_LIST,init_proxyPermissions=__esm({"../browser-core/dist/proxyPermissions.js"(){"use strict";DomainPermissionError=class extends Error{action;domain;code="DOMAIN_PERMISSION_REQUIRED";requestDispatched=!1;constructor(action,domain2,message=`${action}: Access to "${domain2}" is not authorized. Call request_domain_permission with domain="${domain2}" to request user authorization, then retry.`){super(message),this.action=action,this.domain=domain2,this.name="DomainPermissionError"}},ALLOWED_ORIGINS=["*://localhost/*","*://127.0.0.1/*","*://*.alibaba.com/*","*://*.alibaba-inc.com/*","*://*.taobao.com/*","*://*.antfin.com/*","*://*.tmall.com/*","*://*.fliggy.com/*","*://*.alitrip.com/*","*://*.aliexpress.com/*","*://*.atatech.org/*","*://*.dingtalk.com/*","*://*.ele.me/*","*://*.effirst.com/*","*://*.example.com/*","*://*.figma.com/*"],ALLOWED_ORIGINS_LIST=[...ALLOWED_ORIGINS]}});function typeIntoElement(el,inputValue,shouldClear){if(!el)return{typed:!1,tag:"",error:"Element is null"};if(!el.isConnected)return{typed:!1,tag:"",error:"Element is detached from the document"};let tagName=el.tagName?el.tagName.toLowerCase():"",isInput=el instanceof HTMLInputElement,isTextArea=el instanceof HTMLTextAreaElement,isFormField=isInput||isTextArea,htmlEl=el,isEditable=!isFormField&&(htmlEl.isContentEditable||el.getAttribute("contenteditable")==="true");if(!isFormField&&!isEditable)return{typed:!1,tag:tagName,error:"Element <"+tagName+"> is neither an input/textarea nor contenteditable"};if(isFormField){let f=el;if(f.disabled)return{typed:!1,tag:tagName,error:"Element is disabled"};if(f.readOnly)return{typed:!1,tag:tagName,error:"Element is readOnly"}}if(htmlEl.scrollIntoView({block:"center",behavior:"instant"}),htmlEl.focus(),isFormField){let f=el,proto=isTextArea?HTMLTextAreaElement.prototype:HTMLInputElement.prototype,nativeSetter=Object.getOwnPropertyDescriptor(proto,"value")?.set,setVal=v=>{nativeSetter?nativeSetter.call(f,v):f.value=v};return shouldClear&&f.value!==""&&(setVal(""),f.dispatchEvent(new Event("input",{bubbles:!0}))),setVal(inputValue),f.dispatchEvent(new InputEvent("beforeinput",{bubbles:!0,cancelable:!0,data:inputValue,inputType:"insertText"})),f.dispatchEvent(new InputEvent("input",{bubbles:!0,data:inputValue,inputType:"insertText"})),f.dispatchEvent(new Event("change",{bubbles:!0})),{typed:!0,tag:tagName}}let selection=window.getSelection();if(shouldClear){if(selection){let range=document.createRange();range.selectNodeContents(htmlEl),selection.removeAllRanges(),selection.addRange(range)}let cleared;try{cleared=document.execCommand("delete")}catch{cleared=!1}cleared||(htmlEl.textContent="")}else if(selection){let range=document.createRange();range.selectNodeContents(htmlEl),range.collapse(!1),selection.removeAllRanges(),selection.addRange(range)}htmlEl.dispatchEvent(new InputEvent("beforeinput",{bubbles:!0,cancelable:!0,data:inputValue,inputType:"insertText"}));let inserted;try{inserted=document.execCommand("insertText",!1,inputValue)}catch{inserted=!1}return inserted||(htmlEl.textContent=(htmlEl.textContent??"")+inputValue),htmlEl.dispatchEvent(new InputEvent("input",{bubbles:!0,data:inputValue,inputType:"insertText"})),{typed:!0,tag:tagName}}var init_domTyping=__esm({"../browser-core/dist/domTyping.js"(){"use strict"}});function validatePageElementSelector(selector,toolName){if(!selector||typeof selector!="string")throw new Error(`${toolName}: "selector" must be a non-empty string. Pass a native CSS selector (e.g. "[aria-label='提交']") or a snapshot ref like "@e3". Note: the field name is "selector", not "ref".`);if(/^e\d+$/.test(selector))throw new Error(`${toolName}: selector "${selector}" looks like a snapshot ref but is missing the "@" prefix. Use "@${selector}" instead. If you don't have refs yet, call page_snapshot first.`);for(let pseudo of UNSUPPORTED_NATIVE_SELECTOR_PSEUDOS)if(selector.includes(pseudo))throw new Error(`${toolName}: selector contains unsupported pseudo "${pseudo}". Only native CSS selectors are supported (no Playwright/jQuery extensions). For text-based matching, run page_snapshot and use the returned "@eN" ref. For attribute matching, prefer "[aria-label='...']", "[title='...']", "[data-testid='...']" etc.`)}var UNSUPPORTED_NATIVE_SELECTOR_PSEUDOS,INVALID_NATIVE_SELECTOR_HINT,init_domSelectors=__esm({"../browser-core/dist/domSelectors.js"(){"use strict";UNSUPPORTED_NATIVE_SELECTOR_PSEUDOS=[":has-text",":text(",":text-is(",":text-matches(",":visible",":hidden",":nth-match(",":light(",":above(",":below(",":near(",":left-of(",":right-of(",":contains("],INVALID_NATIVE_SELECTOR_HINT='Only native CSS is supported (no Playwright extensions like :has-text/:visible). Use page_snapshot to get an "@eN" ref for complex matching.'}});function resolvePageScrollInput(data){let{direction,distance,selector,containerPolicy="self"}=data;if(typeof direction!="string"||!["up","down","top","bottom"].includes(direction))throw new Error("Invalid direction: must be one of up, down, top, bottom");if(distance!==void 0&&(typeof distance!="number"||!Number.isFinite(distance)))throw new Error('"distance" must be a finite number');if(selector!==void 0&&validatePageElementSelector(selector,"page_scroll"),containerPolicy!=="self"&&containerPolicy!=="nearest")throw new Error('"containerPolicy" must be one of self, nearest');return{direction,distance:Math.abs(distance??600),containerPolicy,...selector!==void 0?{selector}:{}}}function scrollElementInPage(direction,distance,targetLabel,containerPolicy="self"){let element=this?.nodeType===3?this.parentElement:this,targetDocument=element?.nodeType===9?element:null;if(targetDocument&&(element=targetDocument.scrollingElement),!element||element.isConnected===!1)return{error:"Cannot resolve scroll container: "+targetLabel};let startingElement=element,ancestorDistance=0;function scrollMetrics(candidate){let scrollTop=Number(candidate?.scrollTop),scrollHeight=Number(candidate?.scrollHeight),clientHeight=Number(candidate?.clientHeight);if(!Number.isFinite(scrollTop)||!Number.isFinite(scrollHeight)||!Number.isFinite(clientHeight))return null;let ownerDocument=candidate.ownerDocument,isRootScroller=!!ownerDocument&&candidate===ownerDocument.scrollingElement,maxScrollTop=Math.max(0,scrollHeight-clientHeight),overflowAllowsScroll=!0;try{let overflowY=ownerDocument?.defaultView?.getComputedStyle(candidate).overflowY;!isRootScroller&&(overflowY==="visible"||overflowY==="clip")&&(overflowAllowsScroll=!1)}catch{}return{scrollTop,scrollHeight,clientHeight,maxScrollTop,isRootScroller,usable:isRootScroller||maxScrollTop>0&&overflowAllowsScroll}}function documentFallback(documentRef){let windowRef=documentRef.defaultView,visited=new Set,viewportWidth=Number(windowRef?.innerWidth)||Number(element?.clientWidth)||0,viewportHeight=Number(windowRef?.innerHeight)||Number(element?.clientHeight)||0,points=[[viewportWidth/2,viewportHeight/2],[viewportWidth/2,viewportHeight*.75],[viewportWidth/2,viewportHeight*.25]];function containerDepth(candidate){if(candidate===documentRef.body||candidate===documentRef.documentElement)return 0;let depth=0,cursor=candidate;for(;cursor&&cursor!==documentRef.body&&cursor!==documentRef.documentElement;)depth+=1,cursor=cursor.parentElement;return depth}function canMove(metrics2){return direction==="up"||direction==="top"?metrics2.scrollTop>0:metrics2.scrollTop<metrics2.maxScrollTop}let sampledPageContainer;for(let[x,y]of points){let candidate=null;try{candidate=documentRef.elementFromPoint?.(x,y)??null}catch{}for(;candidate&&candidate.nodeType===1;){if(!visited.has(candidate)){visited.add(candidate);let candidateMetrics=scrollMetrics(candidate);if(candidateMetrics?.usable&&candidateMetrics.maxScrollTop>0&&canMove(candidateMetrics)){let resolved={element:candidate,metrics:candidateMetrics,distance:containerDepth(candidate)};if(candidate===documentRef.body||candidate===documentRef.documentElement)sampledPageContainer??=resolved;else return resolved}}candidate=candidate.parentElement}}if(sampledPageContainer)return sampledPageContainer;let best,candidates=Array.from(documentRef.querySelectorAll?.("*")??[]).slice(0,1e4);for(let candidate of candidates){let candidateMetrics=scrollMetrics(candidate);if(!candidateMetrics?.usable||candidateMetrics.maxScrollTop<=0||!canMove(candidateMetrics))continue;let rect,style;try{rect=candidate.getBoundingClientRect(),style=windowRef?.getComputedStyle(candidate)}catch{continue}if(!rect||rect.width<=0||rect.height<=0||style?.display==="none"||style?.visibility==="hidden"||style?.visibility==="collapse")continue;let visibleWidth=Math.max(0,Math.min(rect.right,viewportWidth)-Math.max(rect.left,0)),visibleHeight=Math.max(0,Math.min(rect.bottom,viewportHeight)-Math.max(rect.top,0)),area=visibleWidth*visibleHeight;if(area<=0)continue;let depth=containerDepth(candidate);(!best||depth<best.distance||depth===best.distance&&area>best.area)&&(best={element:candidate,metrics:candidateMetrics,distance:depth,area})}return best?{element:best.element,metrics:best.metrics,distance:best.distance}:null}function selectorFor(candidate){let documentRef=candidate?.ownerDocument;if(!documentRef||candidate.nodeType!==1)return"";if(candidate===documentRef.documentElement)return"html";if(candidate===documentRef.body)return"body";let escapeCss=value=>documentRef.defaultView?.CSS?.escape?documentRef.defaultView.CSS.escape(value):value.replace(/[^a-zA-Z0-9_-]/g,character=>"\\"+character);if(candidate.id){let idSelector="#"+escapeCss(String(candidate.id));try{if(documentRef.querySelectorAll(idSelector).length===1)return idSelector}catch{}}let path27=[],cursor=candidate;for(;cursor&&cursor.nodeType===1&&path27.length<8;){let tag=String(cursor.tagName||"").toLowerCase();if(!tag)break;let parent=cursor.parentElement;if(!parent){path27.unshift(tag);break}let siblings=Array.from(parent.children).filter(sibling=>sibling.tagName===cursor.tagName),index=siblings.indexOf(cursor)+1;if(path27.unshift(siblings.length>1?tag+":nth-of-type("+index+")":tag),cursor=parent,cursor===documentRef.documentElement){path27.unshift("html");break}}return path27.join(" > ")}let metrics=scrollMetrics(element);if(!metrics)return{error:"Element is not scrollable: "+targetLabel};if(targetDocument){let fallback=documentFallback(targetDocument);fallback&&(element=fallback.element,metrics=fallback.metrics,ancestorDistance=fallback.distance)}if(!metrics.usable&&containerPolicy==="nearest"){let candidate=element.parentElement;for(;candidate;){ancestorDistance+=1;let candidateMetrics=scrollMetrics(candidate);if(candidateMetrics?.usable){element=candidate,metrics=candidateMetrics;break}candidate=candidate.parentElement}}if(!metrics.usable&&!metrics.isRootScroller)return{error:"Element is not scrollable: "+targetLabel+(containerPolicy==="nearest"?" (no scrollable ancestor found)":"")};let targetTop;switch(direction){case"top":targetTop=0;break;case"bottom":targetTop=metrics.maxScrollTop;break;case"up":targetTop=Math.max(0,metrics.scrollTop-Math.abs(distance));break;default:targetTop=Math.min(metrics.maxScrollTop,metrics.scrollTop+Math.abs(distance));break}if(typeof element.scrollTo=="function")try{element.scrollTo({top:targetTop,left:Number(element.scrollLeft)||0,behavior:"instant"})}catch{element.scrollTop=targetTop}else element.scrollTop=targetTop;let actualScrollTop=Number(element.scrollTop);return!metrics.isRootScroller&&targetTop!==metrics.scrollTop&&actualScrollTop===metrics.scrollTop?{error:"Element is not scrollable: "+targetLabel}:{scrollY:Math.round(actualScrollTop),scrollHeight:metrics.scrollHeight,clientHeight:metrics.clientHeight,maxScrollY:Math.round(metrics.maxScrollTop),scrollYBefore:Math.round(metrics.scrollTop),scrollYAfter:Math.round(actualScrollTop),moved:actualScrollTop!==metrics.scrollTop,atTop:actualScrollTop<=0,atBottom:actualScrollTop>=metrics.maxScrollTop,target:targetLabel,resolvedContainer:targetDocument&&element===targetDocument.body&&element!==startingElement?"document-body":targetDocument&&element!==startingElement?"document-descendant":element===startingElement?"self":"nearest-scrollable-ancestor",ancestorDistance,...targetDocument&&element!==startingElement?{containerSelector:selectorFor(element)}:{}}}function buildPageScrollExpression(input2){return`(() => {
993
993
  const dir = ${JSON.stringify(input2.direction)};
994
994
  const dist = ${JSON.stringify(input2.distance)};
@@ -1063,13 +1063,13 @@ ${SOURCE_BADGES[source]}
1063
1063
  <circle cx="104" cy="104" r="21" fill="#16A34A" stroke="#FFFFFF" stroke-width="6"/>
1064
1064
  `,remote:`
1065
1065
  <circle cx="104" cy="104" r="21" fill="#FF7A00" stroke="#FFFFFF" stroke-width="6"/>
1066
- `}}});function getJsonpCallback(url2){try{let searchParams=new URL(url2).searchParams,callback=searchParams.get("callback")??searchParams.get("jsonp");return callback&&JSONP_CALLBACK_RE.test(callback)?callback:null}catch{return null}}function serializeMockResponse(requestUrl,responseData){let callback=getJsonpCallback(requestUrl);if(!callback)return{body:typeof responseData=="string"?responseData:JSON.stringify(responseData)??"null",isJsonp:!1};let json4=JSON.stringify(responseData)??"null";if(typeof responseData=="string")try{JSON.parse(responseData),json4=responseData}catch{}return{body:`${callback}(${json4});`,isJsonp:!0}}function prepareMockResponseHeaders(headers,isJsonp){let stripped=(headers??[]).filter(header=>!["content-encoding","content-length"].includes(header.name.toLowerCase()));if(!isJsonp)return stripped;let index=stripped.findIndex(header=>header.name.toLowerCase()==="content-type");if(index===-1)return[...stripped,{name:"content-type",value:JSONP_CONTENT_TYPE}];let result=[...stripped];return result[index]={...result[index],value:JSONP_CONTENT_TYPE},result}var JSONP_CALLBACK_RE,JSONP_CONTENT_TYPE,init_mockResponse=__esm({"../browser-core/dist/mockResponse.js"(){"use strict";JSONP_CALLBACK_RE=/^[A-Za-z_$][A-Za-z0-9_$]*(?:\.[A-Za-z_$][A-Za-z0-9_$]*)*$/,JSONP_CONTENT_TYPE="application/javascript; charset=utf-8"}});var init_pluginState2=__esm({"../browser-core/dist/pluginState.js"(){"use strict"}});var init_pluginModels2=__esm({"../browser-core/dist/pluginModels.js"(){"use strict"}});var init_pluginRecovery=__esm({"../browser-core/dist/pluginRecovery.js"(){"use strict"}});var init_pluginDiagnostics=__esm({"../browser-core/dist/pluginDiagnostics.js"(){"use strict"}});function installRootWebViewDocumentTransport(){let browser=window,prefix="/.mearl-document/";if(browser.name==="__mearl_root__"&&location.pathname.startsWith(prefix))try{let original=new URL(decodeURIComponent(location.hash.slice(1)));original.origin===location.origin&&/^https?:$/.test(original.protocol)&&history.replaceState(history.state,"",original.href)}catch{}browser.__mearlRootDocumentUrl__=url2=>{let token=performance.getEntriesByType("navigation")[0]?.serverTiming?.find(entry=>entry.name==="mearl-document")?.description;if(!token||!/^[a-zA-Z0-9-]+$/.test(token))return url2;let original=new URL(url2);return`${original.origin}${prefix}${token}#${encodeURIComponent(original.href)}`}}var init_rootWebViewDocument=__esm({"../browser-core/dist/rootWebViewDocument.js"(){"use strict"}});function isBrowserManagementAction(value){return typeof value=="string"&&Object.hasOwn(BROWSER_MANAGEMENT_ACTIONS,value)}function isCloudConnectorAction(value){return typeof value=="string"&&Object.hasOwn(CLOUD_CONNECTOR_ACTIONS,value)}function isExtensionUiServiceAction(value){return isAgentServiceAction(value)||isToolboxServiceAction(value)||isBrowserManagementAction(value)||isCloudConnectorAction(value)}function isHostToExtensionAction(value){return typeof value=="string"&&Object.hasOwn(HOST_TO_EXTENSION_ACTIONS,value)}function isPrivateExtensionServiceAction(value){return isToolboxServiceAction(value)||isAgentServiceAction(value)&&value!=="agent_chat_run"||typeof value=="string"&&["browser_sessions","browser_instances","browser_providers"].includes(value)||typeof value=="string"&&Object.hasOwn(EXTENSION_BACKGROUND_ACTIONS,value)}function extensionRpcErrorCode(error48){let code=error48&&typeof error48=="object"&&"code"in error48?error48.code:void 0;return code==="PROTOCOL_MISMATCH"||code==="UNSUPPORTED_ACTION"||code==="EXTENSION_UI_REQUIRED"?code:void 0}var EXTENSION_RPC_VERSION,BROWSER_MANAGEMENT_ACTIONS,CLOUD_CONNECTOR_ACTIONS,HOST_TO_EXTENSION_ACTIONS,EXTENSION_BACKGROUND_ACTIONS,ExtensionRpcError,init_extensionServiceProtocol=__esm({"../browser-core/dist/extensionServiceProtocol.js"(){"use strict";init_agentServiceProtocol();init_toolbox();EXTENSION_RPC_VERSION=1,BROWSER_MANAGEMENT_ACTIONS={browser_sessions:!0,browser_instances:!0,browser_providers:!0,browser_list:!0,browser_launch:!0,browser_close:!0,get_browser_access_url:!0};CLOUD_CONNECTOR_ACTIONS={start_cloud_connector:!0,stop_cloud_connector:!0,list_cloud_connectors:!0};HOST_TO_EXTENSION_ACTIONS={__export_cookies:!0,__capture_download:!0,__control_cleanup:!0,__control_deactivate:!0,__send_request_files:!0};EXTENSION_BACKGROUND_ACTIONS={app_profile_catalog:!0,plugin_page_call:!0,plugin_page_event:!0};ExtensionRpcError=class extends Error{code;constructor(code,message){super(message),this.code=code,this.name="ExtensionRpcError"}}}});var init_dist4=__esm({"../browser-core/dist/index.js"(){"use strict";init_appProfileDefinition();init_types2();init_tdbankLogin();init_mtopSigner();init_mtopRequest();init_mtopStreamCapture();init_appProfileUserInfo();init_eventParsers();init_eventFilters();init_requestSerializer();init_boundedRequestBuffer();init_proxyPermissions();init_domTyping();init_domSelectors();init_domScrolling();init_domInspection();init_domSnapshot();init_deviceEmulation();init_debuggerTarget();init_rootWebViewNavigation();init_axTextMatch();init_domClicking();init_pageDragging();init_pagePressing();init_axSnapshot();init_pageObserver();init_navigationTracker();init_pageAct();init_backendNodeRefs();init_pageEffectRefs();init_pageWait();init_pageNavigation();init_tabMatching();init_agentChat();init_agentSkills();init_agentServiceProtocol();init_toolbox();init_toolboxIcon();init_pluginExecution2();init_pluginTasks2();init_pluginPages2();init_pluginPageRuntime();init_pluginPageHost();init_browserActionProtocol();init_runActions();init_sendRequestFiles();init_sendRequestHeaders();init_cookie();init_controlledFavicon();init_capture();init_sseParser();init_mockResponse();init_pluginState2();init_pluginModels2();init_pluginRecovery();init_pluginDiagnostics();init_rootWebViewDocument();init_extensionServiceProtocol()}});import{randomBytes}from"node:crypto";var BROWSER_QUEUE,ControlSessionRegistry,init_control_session=__esm({"src/control-session.ts"(){"use strict";init_dist4();BROWSER_QUEUE=-1,ControlSessionRegistry=class{constructor(browserId){this.browserId=browserId}sessions=new Map;owners=new Map;queues=new Map;pending=new Map;browserReleasing=!1;resuming=new Set;createSessionId(){for(;;){let id=`s_${randomBytes(6).toString("base64url")}`;if(!this.sessions.has(id))return id}}create(transport){if(this.browserReleasing)throw new Error("BROWSER_CONTROL_RELEASING");let record4={sessionId:this.createSessionId(),browserId:this.browserId(),transport,status:"active",tabs:[],generation:1};return this.sessions.set(record4.sessionId,record4),this.info(record4.sessionId)}info(id){let record4=this.require(id);return{...record4,tabs:record4.tabs.map(tab=>({...tab}))}}state(id){let{tabs:_tabs,...state}=this.require(id);return state}find(id){return this.sessions.get(id)?.browserId===this.browserId()?this.info(id):void 0}list(){return[...this.sessions.values()].filter(record4=>record4.status!=="released").map(record4=>this.info(record4.sessionId))}require(id){let record4=this.sessions.get(id);if(!record4||record4.browserId!==this.browserId())throw new Error("CONTROL_SESSION_NOT_FOUND");return record4}assertActive(id,generation){let record4=this.require(id);if(record4.status!=="active"||generation!==void 0&&generation!==record4.generation)throw new Error(`CONTROL_SESSION_PAUSED: ${record4.status}; inspect the page after the user returns control`);return record4}claim(id,tabId,source){let record4=this.require(id),owner=this.owners.get(tabId);if(owner&&owner!==id)throw new Error("TAB_CONTROLLED_BY_SESSION");record4.tabs.some(tab=>tab.tabId===tabId)||record4.tabs.push({tabId,source}),this.owners.set(tabId,id)}blockedTabs(id){return[...this.owners].filter(([,owner])=>owner!==id).map(([tab])=>tab)}assertBrowserRelease(){if(this.list().length)throw new Error("ACTIVE_CONTROL_SESSIONS: release the owning session first")}async releaseBrowser(operation){if(this.assertBrowserRelease(),this.browserReleasing)throw new Error("BROWSER_CONTROL_RELEASING");this.browserReleasing=!0;try{return await Promise.allSettled([...this.pending.values()].flatMap(operations=>[...operations])),await operation()}finally{this.browserReleasing=!1}}async run(id,action,data,operation,transport="extension"){if(this.browserReleasing)throw new Error("BROWSER_CONTROL_RELEASING");let generation=id?this.assertActive(id).generation:void 0,tabs=new Set;typeof data.tabId=="number"&&tabs.add(data.tabId);for(let tab of data.tabIds??[])typeof tab=="number"&&tabs.add(tab);typeof data.openerTabId=="number"&&tabs.add(data.openerTabId);let steps=action==="run_actions"?data.actions:[{action,data}];if(action==="run_actions"){validateActionBatch(data);for(let step of data.actions??[]){typeof step.data?.tabId=="number"&&tabs.add(step.data.tabId);for(let tab of step.data?.tabIds??[])typeof tab=="number"&&tabs.add(tab);typeof step.data?.openerTabId=="number"&&tabs.add(step.data.openerTabId)}}let opensPage=steps.some(step=>step.action==="tab_open"),changesSharedSettings=steps.some(step=>["set_rule","set_cookie"].includes(step.action)||step.action==="set_app_profile"&&transport!=="cdp"&&step.data?.mtopEnv!==void 0),assertSharedResources=()=>{if(action==="run_actions"&&!id&&this.list().length&&steps.some(step=>["tab_open","browser_close"].includes(step.action)))throw new Error("ACTIVE_CONTROL_SESSIONS: open pages outside run_actions while sessions are active");if(changesSharedSettings&&this.list().some(record4=>record4.sessionId!==id))throw new Error("BROWSER_RESOURCE_CONFLICT: use an isolated browser to change shared settings");if(data.closeExisting&&!id&&this.list().length)throw new Error("ACTIVE_CONTROL_SESSIONS")};assertSharedResources();for(let tab of tabs){if(tab<0)continue;let owner=this.owners.get(tab);if(owner&&owner!==id)throw new Error("TAB_CONTROLLED_BY_SESSION")}let unlock,tail=new Promise(resolve11=>{unlock=resolve11}),runtimeTransport=action==="page_runtime",predecessors=runtimeTransport?[]:[...tabs].map(tab=>this.queues.get(tab)).filter(Boolean);if(!runtimeTransport&&this.queues.has(BROWSER_QUEUE)&&predecessors.push(this.queues.get(BROWSER_QUEUE)),(changesSharedSettings||action==="page_download"||opensPage)&&(predecessors.push(...this.queues.values()),tabs.add(BROWSER_QUEUE)),!runtimeTransport)for(let tab of tabs)this.queues.set(tab,tail);let promise2=(async()=>{try{await Promise.all(predecessors),id&&this.assertActive(id,generation),assertSharedResources();for(let tab of tabs){let owner=this.owners.get(tab);if(owner&&owner!==id)throw new Error("TAB_CONTROLLED_BY_SESSION");id&&tab>=0&&this.claim(id,tab,"attached")}return await operation()}finally{unlock();for(let tab of tabs)this.queues.get(tab)===tail&&this.queues.delete(tab)}})(),pending=this.pending.get(id)??new Set;pending.add(promise2),this.pending.set(id,pending);try{return await promise2}finally{pending.delete(promise2),pending.size||this.pending.delete(id)}}async waitForIdle(id){await Promise.allSettled([...this.pending.get(id)??[]])}assertStep(id,generation){this.assertActive(id,generation)}recordResult(id,action,result,data){action==="tab_open"&&typeof result?.tabId=="number"&&this.claim(id,result.tabId,result.opened===!0?"created":"attached");for(let tab of result?.observation?.openedTabs??[])typeof tab.tabId=="number"&&this.claim(id,tab.tabId,"created");let target=this.require(id).tabs.find(tab=>tab.tabId===(result?.tabId??data?.tabId));if(target&&typeof result?.title=="string"&&(target.title=result.title),target&&typeof result?.url=="string"&&(target.url=result.url),action==="tab_close"&&typeof data?.tabId=="number"&&(this.owners.delete(data.tabId),this.require(id).tabs=this.require(id).tabs.filter(tab=>tab.tabId!==data.tabId)),action==="tab_close")for(let tab of this.require(id).tabs)(result?.closedTabIds??[]).includes(tab.tabId)&&this.owners.delete(tab.tabId)}handoff(id,reason){let record4=this.assertActive(id);return record4.status="user",record4.generation+=1,record4.reason=reason,this.info(id)}async resume(id,cleanup=async()=>{}){let record4=this.require(id);if(record4.status!=="user")throw new Error("Session is not waiting for the user");if(this.resuming.has(id))throw new Error("CONTROL_SESSION_RESUMING");this.resuming.add(id);try{return await this.waitForIdle(id),await cleanup(),record4.status="active",record4.reason=void 0,record4.generation+=1,this.info(id)}finally{this.resuming.delete(id)}}async release(id,params,cleanup){let record4=this.require(id);if(this.resuming.has(id))throw new Error("CONTROL_SESSION_RESUMING");if(record4.status==="released")return this.info(id);if(record4.status==="releasing")throw new Error("CONTROL_SESSION_RELEASING");let previous=record4.status;record4.status="releasing",record4.generation+=1,await Promise.allSettled([...this.pending.get(id)??[]]);let tabs=record4.tabs.map(tab=>tab.tabId),keep=new Set(params.keepTabIds??[]),close=params.closeCreatedTabs?record4.tabs.filter(tab=>tab.source==="created"&&!keep.has(tab.tabId)).map(tab=>tab.tabId):[];try{await cleanup(tabs,close);for(let tab of tabs)this.owners.get(tab)===id&&this.owners.delete(tab);record4.status="released";let released=[...this.sessions.values()].filter(session=>session.status==="released"&&session.sessionId!==id);for(let old of released.slice(0,Math.max(0,released.length-99)))this.sessions.delete(old.sessionId)}catch(error48){throw record4.status=previous,error48}return this.info(id)}}}});import{rmSync as rmSync11}from"node:fs";import{randomUUID as randomUUID12}from"node:crypto";import{mkdir as mkdir2,open as open2,rm as rm2,stat as stat2,writeFile}from"node:fs/promises";import path6 from"node:path";import os3 from"node:os";var MAX_BYTES,ARTIFACT_CHUNK_BYTES,BrowserArtifactStore,init_browser_artifacts=__esm({"src/browser-artifacts.ts"(){"use strict";MAX_BYTES=256*1024*1024,ARTIFACT_CHUNK_BYTES=256*1024,BrowserArtifactStore=class{constructor(root=path6.join(os3.tmpdir(),`mearl-artifacts-${process.pid}-${randomUUID12()}`)){this.root=root}files=new Map;directory;sweeper;async create(filename,sessionId){if(typeof filename!="string"||!filename||[".",".."].includes(filename)||/[\\/]/.test(filename)||filename.length>255)throw new Error("Invalid artifact filename");this.sweeper||(this.sweeper=setInterval(()=>{for(let[id,file3]of this.files)!file3.sessionId&&!file3.writing&&Date.now()-file3.accessedAt>3600*1e3&&this.remove(id).catch(()=>{})},6e4),this.sweeper.unref()),await mkdir2(this.root,{recursive:!0,mode:448}),this.directory=this.root;let artifactId=randomUUID12(),directory=path6.join(this.root,artifactId);await mkdir2(directory,{mode:448});let file2={artifactId,filename,bytes:0,location:"browser",path:path6.join(directory,filename),sessionId,ready:!1,accessedAt:Date.now()};return await writeFile(file2.path,"",{mode:384}),this.files.set(artifactId,file2),this.info(file2)}async importFile(filename,sourcePath,sessionId){let source=await open2(sourcePath,"r"),id;try{let metadata=await source.stat();if(!metadata.isFile()||metadata.size>MAX_BYTES)throw new Error("Download is unavailable or exceeds 256 MiB");id=(await this.create(filename,sessionId)).artifactId;let file2=this.require(id,sessionId),target=await open2(file2.path,"w"),copied=0;try{for await(let chunk of source.createReadStream({autoClose:!1})){if(copied+=chunk.length,copied>MAX_BYTES)throw new Error("Download exceeds 256 MiB");let written=0;for(;written<chunk.length;){let result=await target.write(chunk,written,chunk.length-written);if(!result.bytesWritten)throw new Error("Download import made no progress");written+=result.bytesWritten}}}finally{await target.close()}if(copied!==metadata.size)throw new Error("Download changed during import");return file2.bytes=(await stat2(file2.path)).size,file2.ready=!0,this.info(file2)}catch(error48){throw id&&await this.remove(id,sessionId),error48}finally{await source.close()}}require(id,sessionId){let file2=this.files.get(id);if(!file2||file2.sessionId!==void 0&&file2.sessionId!==sessionId)throw new Error("ARTIFACT_NOT_FOUND");return file2.accessedAt=Date.now(),file2}info(file2){return{artifactId:file2.artifactId,filename:file2.filename,bytes:file2.bytes,location:"browser"}}async write(id,offset,base643,sessionId){let file2=this.require(id,sessionId);if(file2.ready||file2.writing||offset!==file2.bytes)throw new Error("Invalid artifact write offset or completed transfer");if(typeof base643!="string"||base643.length>Math.ceil(ARTIFACT_CHUNK_BYTES/3)*4||base643.length%4!==0||!/^[A-Za-z0-9+/]*={0,2}$/.test(base643))throw new Error("Invalid artifact chunk");let chunk=Buffer.from(base643,"base64");if(chunk.toString("base64")!==base643)throw new Error("Invalid artifact chunk");if(file2.bytes+chunk.length>MAX_BYTES)throw new Error("Artifact exceeds 256 MiB");file2.writing=!0;try{let handle=await open2(file2.path,"r+");try{let written=0;for(;written<chunk.length;){let result=await handle.write(chunk,written,chunk.length-written,offset+written);if(!result.bytesWritten)throw new Error("Artifact write made no progress");written+=result.bytesWritten}}finally{await handle.close()}return file2.bytes+=chunk.length,this.info(file2)}finally{file2.writing=!1}}complete(id,bytes,sessionId){let file2=this.require(id,sessionId);if(file2.writing||bytes!==file2.bytes)throw new Error("Artifact size mismatch");return file2.ready=!0,this.info(file2)}resolve(id,sessionId){let file2=this.require(id,sessionId);if(!file2.ready)throw new Error("Artifact is not ready");return file2.path}async read(id,offset,sessionId){let file2=this.require(id,sessionId);if(!file2.ready||!Number.isSafeInteger(offset)||offset<0||offset>file2.bytes)throw new Error("Invalid artifact read");let handle=await open2(file2.path,"r");try{let buffer=Buffer.alloc(Math.min(ARTIFACT_CHUNK_BYTES,file2.bytes-offset)),result=await handle.read(buffer,0,buffer.length,offset);return{base64:buffer.subarray(0,result.bytesRead).toString("base64"),bytes:result.bytesRead,totalBytes:file2.bytes}}finally{await handle.close()}}async remove(id,sessionId){let file2=this.require(id,sessionId);await rm2(path6.dirname(file2.path),{recursive:!0,force:!0}),this.files.delete(id)}async release(sessionId,keep=[]){let retain=new Set(keep);for(let[id,file2]of this.files)file2.sessionId===sessionId&&(retain.has(id)?(file2.sessionId=void 0,file2.accessedAt=Date.now()):await this.remove(id,sessionId))}disposeSync(){this.sweeper&&clearInterval(this.sweeper),this.directory&&rmSync11(this.directory,{recursive:!0,force:!0}),this.files.clear()}async dispose(){this.sweeper&&clearInterval(this.sweeper),this.directory&&await rm2(this.directory,{recursive:!0,force:!0}),this.files.clear()}}}});var ControlSessionManager,init_control_session_manager=__esm({"src/control-session-manager.ts"(){"use strict";init_dist4();init_control_session();init_browser_artifacts();ControlSessionManager=class{constructor(dependencies){this.dependencies=dependencies;this.registry=new ControlSessionRegistry(dependencies.browserId)}registry;artifacts=new BrowserArtifactStore;activityQueues=new Map;async withActivity(id,operation){let pending=(this.activityQueues.get(id)??Promise.resolve()).catch(()=>{}).then(operation);this.activityQueues.set(id,pending);try{return await pending}finally{this.activityQueues.get(id)===pending&&this.activityQueues.delete(id)}}async closeTabs(tabs,transport,sessionId){for(let tabId of tabs)try{let result=await this.dependencies.invoke("tab_close",{tabId},transport);this.registry.recordResult(sessionId,"tab_close",result,{tabId})}catch(error48){let current=await this.dependencies.invoke("tab_list",{},transport);if(!Array.isArray(current.tabs)||current.tabs.some(tab=>(tab.tabId??tab.id)===tabId))throw error48;this.registry.recordResult(sessionId,"tab_close",{},{tabId})}}async userControl(id,operation,reason){if(operation==="release")return await this.invoke("browser_release",{},id),this.registry.info(id);operation==="resume"&&await this.activityQueues.get(id)?.catch(()=>{});let current=this.registry.info(id),info=operation==="resume"?await this.registry.resume(id,()=>this.dependencies.cleanup(current.tabs.map(tab=>tab.tabId),current.transport,!0)):current.status==="user"?current:this.registry.handoff(id,reason);return this.dependencies.notify(),operation==="handoff"?(await this.withActivity(id,async()=>{await this.dependencies.deactivate?.(this.registry.info(id).tabs.map(tab=>tab.tabId),current.transport)}),this.registry.info(id)):info}async invoke(action,data,sessionId,requestedTransport,origin="local"){if(data&&(Object.keys(data).some(key=>key.startsWith("__mearl"))||(data.actions??[]).some(step=>Object.keys(step.data??{}).some(key=>key.startsWith("__mearl")))))throw new Error("Internal session fields are reserved");validateRequiredActionTabId2(action,data);let created=sessionId==="new";if(sessionId==="new"){if(!["tab_open","page_snapshot","page_screenshot"].includes(action))throw new Error("A new session requires tab_open, page_snapshot or page_screenshot");sessionId=this.registry.create(requestedTransport??this.dependencies.transport()).sessionId}let info=sessionId?this.registry.info(sessionId):void 0,transport=info?.transport??requestedTransport??this.dependencies.transport();if(requestedTransport&&transport!==requestedTransport)throw new Error("A session cannot change transport");if(action==="browser_control"){if(!sessionId||!["handoff","resume"].includes(data.operation))throw new Error("browser_control requires --session and handoff/resume");if(data.operation==="resume")return{session:await this.userControl(sessionId,"resume")};if(data.tabId!==void 0&&!info.tabs.some(tab=>tab.tabId===data.tabId))throw new Error("TAB_NOT_IN_CONTROL_SESSION");return{session:await this.userControl(sessionId,"handoff",data.reason)}}if(action==="browser_release"&&sessionId){let params=data;return await this.registry.release(sessionId,params,async(tabs,close)=>{await this.dependencies.cleanup(tabs,transport,params.preserveEnvironment!==!1),await this.closeTabs(close,transport,sessionId),await this.artifacts.release(sessionId,params.keepArtifactIds)}),this.dependencies.notify(),{released:!0,hadActiveControl:!0,transports:[transport],affectedTabIds:info.tabs.map(tab=>tab.tabId),session:this.registry.state(sessionId)}}if((action==="browser_release"||action==="browser_close")&&this.registry.assertBrowserRelease(),(action==="browser_release"||action==="browser_close")&&!sessionId)return this.registry.releaseBrowser(()=>this.dependencies.invoke(action,data,transport));let performStep=async(name,payload,batch=!1)=>{if(name==="tab_open"&&(sessionId&&payload.closeExisting&&(await this.closeTabs(this.registry.info(sessionId).tabs.filter(tab=>tab.source==="created").map(tab=>tab.tabId),transport,sessionId),payload={...payload,closeExisting:!1}),payload={...payload,__mearlBlockedTabIds:this.registry.blockedTabs(sessionId)}),name==="page_upload"&&payload.files){if(payload.filePaths)throw new Error("Use files or filePaths, not both");payload={...payload,filePaths:payload.files.map(file2=>this.artifacts.resolve(file2.artifactId,sessionId))},delete payload.files}if(batch){if(transport==="provider"){let result4=await this.dependencies.invoke(name,{...payload,__mearlControlSource:origin},transport);return sessionId&&this.registry.recordResult(sessionId,name,result4,payload),result4?.action?.success===!1?{...result4.action,success:!1}:result4?.success===!1?{...result4,success:!1}:{success:!0,data:result4}}let result3=await this.dependencies.invoke("run_actions",{tabId:payload.tabId,actions:[{action:name,data:payload}],__mearlControlSource:origin},transport),outcome=result3.results?.[0]??{success:!1,error:result3.error??"Batch step returned no result",stage:result3.stage,attempt:result3.attempt};return sessionId&&outcome.success&&this.registry.recordResult(sessionId,name,outcome.data,payload),outcome}let result2=await this.dependencies.invoke(name,{...payload,__mearlControlSource:origin},transport);return sessionId&&this.registry.recordResult(sessionId,name,result2,payload),result2},invokeStep=(name,payload,batch=!1)=>sessionId&&name==="tab_open"?this.withActivity(sessionId,async()=>(this.registry.assertStep(sessionId,info.generation),performStep(name,payload,batch))):performStep(name,payload,batch),result;try{result=await this.registry.run(sessionId,action,data,async()=>{if(transport==="extension"&&this.dependencies.transport()!=="extension")throw new Error("CONTROL_SESSION_TRANSPORT_UNAVAILABLE: extension is disconnected");if(action.startsWith("__artifact_")){let store=this.artifacts;switch(action){case"__artifact_init":return{artifact:await store.create(data.filename,sessionId),browserId:this.dependencies.browserId()};case"__artifact_write":return store.write(data.artifactId,data.offset,data.base64,sessionId);case"__artifact_complete":return store.complete(data.artifactId,data.bytes,sessionId);case"__artifact_read":return store.read(data.artifactId,data.offset,sessionId);case"__artifact_remove":return await store.remove(data.artifactId,sessionId),{removed:!0};default:throw new Error("Unknown artifact operation")}}if(action==="page_download"){let downloaded=await this.dependencies.download(data,transport,origin);try{return sessionId&&this.registry.recordResult(sessionId,"page_click",downloaded.action,data),{download:{...await this.artifacts.importFile(downloaded.filename,downloaded.filePath,sessionId),browserId:this.dependencies.browserId()},action:downloaded.action}}finally{if(downloaded.owned){let{rm:rm4,rmdir:rmdir2}=await import("node:fs/promises");await rm4(downloaded.filePath,{force:!0}),downloaded.directory&&await rmdir2(downloaded.directory).catch(()=>{})}}}return action==="run_actions"&&sessionId?runActionBatch(data,(name,payload)=>invokeStep(name,payload,!0),{beforeStep:()=>this.registry.assertStep(sessionId,info.generation)}):invokeStep(action,data)},transport)}catch(error48){throw created&&sessionId&&await this.registry.release(sessionId,{},async tabs=>{await this.dependencies.cleanup(tabs,transport,!0),await this.artifacts.release(sessionId)}),this.dependencies.notify(),error48}if(sessionId&&action==="tab_list"&&Array.isArray(result.tabs)){let blocked=new Set(this.registry.blockedTabs(sessionId));result={...result,tabs:result.tabs.filter(tab=>!blocked.has(tab.tabId??tab.id))},result.count=result.tabs.length}return sessionId?(this.dependencies.notify(),{...result,session:this.registry.state(sessionId)}):result}}}});import{StringDecoder as StringDecoder3}from"node:string_decoder";var Utf8LineBuffer,init_socketLines=__esm({"src/socketLines.ts"(){"use strict";Utf8LineBuffer=class{constructor(maxBufferBytes){this.maxBufferBytes=maxBufferBytes}buffer="";decoder=new StringDecoder3("utf8");push(chunk){if(this.buffer+=this.decoder.write(chunk),Buffer.byteLength(this.buffer,"utf8")>this.maxBufferBytes)return this.buffer="",{lines:[],overflow:!0};let lines=[],newlineIndex;for(;(newlineIndex=this.buffer.indexOf(`
1067
- `))!==-1;)lines.push(this.buffer.slice(0,newlineIndex)),this.buffer=this.buffer.slice(newlineIndex+1);return{lines,overflow:!1}}}}});var require_cjs=__commonJS({"../../node_modules/.pnpm/tldts@7.0.21/node_modules/tldts/dist/cjs/index.js"(exports){"use strict";function shareSameDomainSuffix(hostname3,vhost){return hostname3.endsWith(vhost)?hostname3.length===vhost.length||hostname3[hostname3.length-vhost.length-1]===".":!1}function extractDomainWithSuffix(hostname3,publicSuffix){let publicSuffixIndex=hostname3.length-publicSuffix.length-2,lastDotBeforeSuffixIndex=hostname3.lastIndexOf(".",publicSuffixIndex);return lastDotBeforeSuffixIndex===-1?hostname3:hostname3.slice(lastDotBeforeSuffixIndex+1)}function getDomain$1(suffix,hostname3,options){if(options.validHosts!==null){let validHosts=options.validHosts;for(let vhost of validHosts)if(shareSameDomainSuffix(hostname3,vhost))return vhost}let numberOfLeadingDots=0;if(hostname3.startsWith("."))for(;numberOfLeadingDots<hostname3.length&&hostname3[numberOfLeadingDots]===".";)numberOfLeadingDots+=1;return suffix.length===hostname3.length-numberOfLeadingDots?null:extractDomainWithSuffix(hostname3,suffix)}function getDomainWithoutSuffix$1(domain2,suffix){return domain2.slice(0,-suffix.length-1)}function extractHostname(url2,urlIsValidHostname){let start=0,end=url2.length,hasUpper=!1;if(!urlIsValidHostname){if(url2.startsWith("data:"))return null;for(;start<url2.length&&url2.charCodeAt(start)<=32;)start+=1;for(;end>start+1&&url2.charCodeAt(end-1)<=32;)end-=1;if(url2.charCodeAt(start)===47&&url2.charCodeAt(start+1)===47)start+=2;else{let indexOfProtocol=url2.indexOf(":/",start);if(indexOfProtocol!==-1){let protocolSize=indexOfProtocol-start,c0=url2.charCodeAt(start),c1=url2.charCodeAt(start+1),c2=url2.charCodeAt(start+2),c3=url2.charCodeAt(start+3),c4=url2.charCodeAt(start+4);if(!(protocolSize===5&&c0===104&&c1===116&&c2===116&&c3===112&&c4===115)){if(!(protocolSize===4&&c0===104&&c1===116&&c2===116&&c3===112)){if(!(protocolSize===3&&c0===119&&c1===115&&c2===115)){if(!(protocolSize===2&&c0===119&&c1===115))for(let i=start;i<indexOfProtocol;i+=1){let lowerCaseCode=url2.charCodeAt(i)|32;if(!(lowerCaseCode>=97&&lowerCaseCode<=122||lowerCaseCode>=48&&lowerCaseCode<=57||lowerCaseCode===46||lowerCaseCode===45||lowerCaseCode===43))return null}}}}for(start=indexOfProtocol+2;url2.charCodeAt(start)===47;)start+=1}}let indexOfIdentifier=-1,indexOfClosingBracket=-1,indexOfPort=-1;for(let i=start;i<end;i+=1){let code=url2.charCodeAt(i);if(code===35||code===47||code===63){end=i;break}else code===64?indexOfIdentifier=i:code===93?indexOfClosingBracket=i:code===58?indexOfPort=i:code>=65&&code<=90&&(hasUpper=!0)}if(indexOfIdentifier!==-1&&indexOfIdentifier>start&&indexOfIdentifier<end&&(start=indexOfIdentifier+1),url2.charCodeAt(start)===91)return indexOfClosingBracket!==-1?url2.slice(start+1,indexOfClosingBracket).toLowerCase():null;indexOfPort!==-1&&indexOfPort>start&&indexOfPort<end&&(end=indexOfPort)}for(;end>start+1&&url2.charCodeAt(end-1)===46;)end-=1;let hostname3=start!==0||end!==url2.length?url2.slice(start,end):url2;return hasUpper?hostname3.toLowerCase():hostname3}function isProbablyIpv4(hostname3){if(hostname3.length<7||hostname3.length>15)return!1;let numberOfDots=0;for(let i=0;i<hostname3.length;i+=1){let code=hostname3.charCodeAt(i);if(code===46)numberOfDots+=1;else if(code<48||code>57)return!1}return numberOfDots===3&&hostname3.charCodeAt(0)!==46&&hostname3.charCodeAt(hostname3.length-1)!==46}function isProbablyIpv6(hostname3){if(hostname3.length<3)return!1;let start=hostname3.startsWith("[")?1:0,end=hostname3.length;if(hostname3[end-1]==="]"&&(end-=1),end-start>39)return!1;let hasColon=!1;for(;start<end;start+=1){let code=hostname3.charCodeAt(start);if(code===58)hasColon=!0;else if(!(code>=48&&code<=57||code>=97&&code<=102||code>=65&&code<=90))return!1}return hasColon}function isIp(hostname3){return isProbablyIpv6(hostname3)||isProbablyIpv4(hostname3)}function isValidAscii(code){return code>=97&&code<=122||code>=48&&code<=57||code>127}function isValidHostname(hostname3){if(hostname3.length>255||hostname3.length===0||!isValidAscii(hostname3.charCodeAt(0))&&hostname3.charCodeAt(0)!==46&&hostname3.charCodeAt(0)!==95)return!1;let lastDotIndex=-1,lastCharCode=-1,len=hostname3.length;for(let i=0;i<len;i+=1){let code=hostname3.charCodeAt(i);if(code===46){if(i-lastDotIndex>64||lastCharCode===46||lastCharCode===45||lastCharCode===95)return!1;lastDotIndex=i}else if(!(isValidAscii(code)||code===45||code===95))return!1;lastCharCode=code}return len-lastDotIndex-1<=63&&lastCharCode!==45}function setDefaultsImpl({allowIcannDomains=!0,allowPrivateDomains=!1,detectIp=!0,extractHostname:extractHostname2=!0,mixedInputs=!0,validHosts=null,validateHostname=!0}){return{allowIcannDomains,allowPrivateDomains,detectIp,extractHostname:extractHostname2,mixedInputs,validHosts,validateHostname}}var DEFAULT_OPTIONS=setDefaultsImpl({});function setDefaults(options){return options===void 0?DEFAULT_OPTIONS:setDefaultsImpl(options)}function getSubdomain$1(hostname3,domain2){return domain2.length===hostname3.length?"":hostname3.slice(0,-domain2.length-1)}function getEmptyResult(){return{domain:null,domainWithoutSuffix:null,hostname:null,isIcann:null,isIp:null,isPrivate:null,publicSuffix:null,subdomain:null}}function resetResult(result){result.domain=null,result.domainWithoutSuffix=null,result.hostname=null,result.isIcann=null,result.isIp=null,result.isPrivate=null,result.publicSuffix=null,result.subdomain=null}function parseImpl(url2,step,suffixLookup2,partialOptions,result){let options=setDefaults(partialOptions);return typeof url2!="string"||(options.extractHostname?options.mixedInputs?result.hostname=extractHostname(url2,isValidHostname(url2)):result.hostname=extractHostname(url2,!1):result.hostname=url2,options.detectIp&&result.hostname!==null&&(result.isIp=isIp(result.hostname),result.isIp))?result:options.validateHostname&&options.extractHostname&&result.hostname!==null&&!isValidHostname(result.hostname)?(result.hostname=null,result):(step===0||result.hostname===null||(suffixLookup2(result.hostname,options,result),step===2||result.publicSuffix===null)||(result.domain=getDomain$1(result.publicSuffix,result.hostname,options),step===3||result.domain===null)||(result.subdomain=getSubdomain$1(result.hostname,result.domain),step===4)||(result.domainWithoutSuffix=getDomainWithoutSuffix$1(result.domain,result.publicSuffix)),result)}function fastPathLookup(hostname3,options,out){if(!options.allowPrivateDomains&&hostname3.length>3){let last=hostname3.length-1,c3=hostname3.charCodeAt(last),c2=hostname3.charCodeAt(last-1),c1=hostname3.charCodeAt(last-2),c0=hostname3.charCodeAt(last-3);if(c3===109&&c2===111&&c1===99&&c0===46)return out.isIcann=!0,out.isPrivate=!1,out.publicSuffix="com",!0;if(c3===103&&c2===114&&c1===111&&c0===46)return out.isIcann=!0,out.isPrivate=!1,out.publicSuffix="org",!0;if(c3===117&&c2===100&&c1===101&&c0===46)return out.isIcann=!0,out.isPrivate=!1,out.publicSuffix="edu",!0;if(c3===118&&c2===111&&c1===103&&c0===46)return out.isIcann=!0,out.isPrivate=!1,out.publicSuffix="gov",!0;if(c3===116&&c2===101&&c1===110&&c0===46)return out.isIcann=!0,out.isPrivate=!1,out.publicSuffix="net",!0;if(c3===101&&c2===100&&c1===46)return out.isIcann=!0,out.isPrivate=!1,out.publicSuffix="de",!0}return!1}var exceptions=(function(){let _0=[1,{}],_1=[0,{city:_0}];return[0,{ck:[0,{www:_0}],jp:[0,{kawasaki:_1,kitakyushu:_1,kobe:_1,nagoya:_1,sapporo:_1,sendai:_1,yokohama:_1}]}]})(),rules=(function(){let _2=[1,{}],_3=[2,{}],_4=[1,{com:_2,edu:_2,gov:_2,net:_2,org:_2}],_5=[1,{com:_2,edu:_2,gov:_2,mil:_2,net:_2,org:_2}],_6=[0,{"*":_3}],_7=[2,{s:_6}],_8=[0,{relay:_3}],_9=[2,{id:_3}],_10=[1,{gov:_2}],_11=[0,{airflow:_6,"lambda-url":_3,"transfer-webapp":_3}],_12=[0,{airflow:_6,"transfer-webapp":_3}],_13=[0,{"transfer-webapp":_3}],_14=[0,{"transfer-webapp":_3,"transfer-webapp-fips":_3}],_15=[0,{notebook:_3,studio:_3}],_16=[0,{labeling:_3,notebook:_3,studio:_3}],_17=[0,{notebook:_3}],_18=[0,{labeling:_3,notebook:_3,"notebook-fips":_3,studio:_3}],_19=[0,{notebook:_3,"notebook-fips":_3,studio:_3,"studio-fips":_3}],_20=[0,{shop:_3}],_21=[0,{"*":_2}],_22=[1,{co:_3}],_23=[0,{objects:_3}],_24=[2,{nodes:_3}],_25=[0,{my:_3}],_26=[0,{s3:_3,"s3-accesspoint":_3,"s3-website":_3}],_27=[0,{s3:_3,"s3-accesspoint":_3}],_28=[0,{direct:_3}],_29=[0,{"webview-assets":_3}],_30=[0,{vfs:_3,"webview-assets":_3}],_31=[0,{"execute-api":_3,"emrappui-prod":_3,"emrnotebooks-prod":_3,"emrstudio-prod":_3,dualstack:_26,s3:_3,"s3-accesspoint":_3,"s3-object-lambda":_3,"s3-website":_3,"aws-cloud9":_29,cloud9:_30}],_32=[0,{"execute-api":_3,"emrappui-prod":_3,"emrnotebooks-prod":_3,"emrstudio-prod":_3,dualstack:_27,s3:_3,"s3-accesspoint":_3,"s3-object-lambda":_3,"s3-website":_3,"aws-cloud9":_29,cloud9:_30}],_33=[0,{"execute-api":_3,"emrappui-prod":_3,"emrnotebooks-prod":_3,"emrstudio-prod":_3,dualstack:_26,s3:_3,"s3-accesspoint":_3,"s3-object-lambda":_3,"s3-website":_3,"analytics-gateway":_3,"aws-cloud9":_29,cloud9:_30}],_34=[0,{"execute-api":_3,"emrappui-prod":_3,"emrnotebooks-prod":_3,"emrstudio-prod":_3,dualstack:_26,s3:_3,"s3-accesspoint":_3,"s3-object-lambda":_3,"s3-website":_3}],_35=[0,{s3:_3,"s3-accesspoint":_3,"s3-accesspoint-fips":_3,"s3-fips":_3,"s3-website":_3}],_36=[0,{"execute-api":_3,"emrappui-prod":_3,"emrnotebooks-prod":_3,"emrstudio-prod":_3,dualstack:_35,s3:_3,"s3-accesspoint":_3,"s3-accesspoint-fips":_3,"s3-fips":_3,"s3-object-lambda":_3,"s3-website":_3,"aws-cloud9":_29,cloud9:_30}],_37=[0,{"execute-api":_3,"emrappui-prod":_3,"emrnotebooks-prod":_3,"emrstudio-prod":_3,dualstack:_35,s3:_3,"s3-accesspoint":_3,"s3-accesspoint-fips":_3,"s3-fips":_3,"s3-object-lambda":_3,"s3-website":_3}],_38=[0,{"execute-api":_3,"emrappui-prod":_3,"emrnotebooks-prod":_3,"emrstudio-prod":_3,dualstack:_35,s3:_3,"s3-accesspoint":_3,"s3-accesspoint-fips":_3,"s3-deprecated":_3,"s3-fips":_3,"s3-object-lambda":_3,"s3-website":_3,"analytics-gateway":_3,"aws-cloud9":_29,cloud9:_30}],_39=[0,{auth:_3}],_40=[0,{auth:_3,"auth-fips":_3}],_41=[0,{"auth-fips":_3}],_42=[0,{apps:_3}],_43=[0,{paas:_3}],_44=[2,{eu:_3}],_45=[0,{app:_3}],_46=[0,{site:_3}],_47=[1,{com:_2,edu:_2,net:_2,org:_2}],_48=[0,{j:_3}],_49=[0,{dyn:_3}],_50=[2,{web:_3}],_51=[1,{discourse:_3}],_52=[1,{co:_2,com:_2,edu:_2,gov:_2,net:_2,org:_2}],_53=[0,{p:_3}],_54=[0,{user:_3}],_55=[0,{cdn:_3}],_56=[2,{raw:_6}],_57=[0,{cust:_3,reservd:_3}],_58=[0,{cust:_3}],_59=[0,{s3:_3}],_60=[1,{biz:_2,com:_2,edu:_2,gov:_2,info:_2,net:_2,org:_2}],_61=[0,{ipfs:_3}],_62=[1,{framer:_3}],_63=[0,{forgot:_3}],_64=[1,{gs:_2}],_65=[0,{nes:_2}],_66=[1,{k12:_2,cc:_2,lib:_2}],_67=[1,{cc:_2}],_68=[1,{cc:_2,lib:_2}];return[0,{ac:[1,{com:_2,edu:_2,gov:_2,mil:_2,net:_2,org:_2,drr:_3,feedback:_3,forms:_3}],ad:_2,ae:[1,{ac:_2,co:_2,gov:_2,mil:_2,net:_2,org:_2,sch:_2}],aero:[1,{airline:_2,airport:_2,"accident-investigation":_2,"accident-prevention":_2,aerobatic:_2,aeroclub:_2,aerodrome:_2,agents:_2,"air-surveillance":_2,"air-traffic-control":_2,aircraft:_2,airtraffic:_2,ambulance:_2,association:_2,author:_2,ballooning:_2,broker:_2,caa:_2,cargo:_2,catering:_2,certification:_2,championship:_2,charter:_2,civilaviation:_2,club:_2,conference:_2,consultant:_2,consulting:_2,control:_2,council:_2,crew:_2,design:_2,dgca:_2,educator:_2,emergency:_2,engine:_2,engineer:_2,entertainment:_2,equipment:_2,exchange:_2,express:_2,federation:_2,flight:_2,freight:_2,fuel:_2,gliding:_2,government:_2,groundhandling:_2,group:_2,hanggliding:_2,homebuilt:_2,insurance:_2,journal:_2,journalist:_2,leasing:_2,logistics:_2,magazine:_2,maintenance:_2,marketplace:_2,media:_2,microlight:_2,modelling:_2,navigation:_2,parachuting:_2,paragliding:_2,"passenger-association":_2,pilot:_2,press:_2,production:_2,recreation:_2,repbody:_2,res:_2,research:_2,rotorcraft:_2,safety:_2,scientist:_2,services:_2,show:_2,skydiving:_2,software:_2,student:_2,taxi:_2,trader:_2,trading:_2,trainer:_2,union:_2,workinggroup:_2,works:_2}],af:_4,ag:[1,{co:_2,com:_2,net:_2,nom:_2,org:_2,obj:_3}],ai:[1,{com:_2,net:_2,off:_2,org:_2,uwu:_3,framer:_3,kiloapps:_3}],al:_5,am:[1,{co:_2,com:_2,commune:_2,net:_2,org:_2,radio:_3}],ao:[1,{co:_2,ed:_2,edu:_2,gov:_2,gv:_2,it:_2,og:_2,org:_2,pb:_2}],aq:_2,ar:[1,{bet:_2,com:_2,coop:_2,edu:_2,gob:_2,gov:_2,int:_2,mil:_2,musica:_2,mutual:_2,net:_2,org:_2,seg:_2,senasa:_2,tur:_2}],arpa:[1,{e164:_2,home:_2,"in-addr":_2,ip6:_2,iris:_2,uri:_2,urn:_2}],as:_10,asia:[1,{cloudns:_3,daemon:_3,dix:_3}],at:[1,{4:_3,ac:[1,{sth:_2}],co:_2,gv:_2,or:_2,funkfeuer:[0,{wien:_3}],futurecms:[0,{"*":_3,ex:_6,in:_6}],futurehosting:_3,futuremailing:_3,ortsinfo:[0,{ex:_6,kunden:_6}],biz:_3,info:_3,"123webseite":_3,priv:_3,my:_3,myspreadshop:_3,"12hp":_3,"2ix":_3,"4lima":_3,"lima-city":_3}],au:[1,{asn:_2,com:[1,{cloudlets:[0,{mel:_3}],myspreadshop:_3}],edu:[1,{act:_2,catholic:_2,nsw:_2,nt:_2,qld:_2,sa:_2,tas:_2,vic:_2,wa:_2}],gov:[1,{qld:_2,sa:_2,tas:_2,vic:_2,wa:_2}],id:_2,net:_2,org:_2,conf:_2,oz:_2,act:_2,nsw:_2,nt:_2,qld:_2,sa:_2,tas:_2,vic:_2,wa:_2,hrsn:[0,{vps:_3}]}],aw:[1,{com:_2}],ax:_2,az:[1,{biz:_2,co:_2,com:_2,edu:_2,gov:_2,info:_2,int:_2,mil:_2,name:_2,net:_2,org:_2,pp:_2,pro:_2}],ba:[1,{com:_2,edu:_2,gov:_2,mil:_2,net:_2,org:_2,brendly:_20,rs:_3}],bb:[1,{biz:_2,co:_2,com:_2,edu:_2,gov:_2,info:_2,net:_2,org:_2,store:_2,tv:_2}],bd:[1,{ac:_2,ai:_2,co:_2,com:_2,edu:_2,gov:_2,id:_2,info:_2,it:_2,mil:_2,net:_2,org:_2,sch:_2,tv:_2}],be:[1,{ac:_2,cloudns:_3,webhosting:_3,interhostsolutions:[0,{cloud:_3}],kuleuven:[0,{ezproxy:_3}],"123website":_3,myspreadshop:_3,transurl:_6}],bf:_10,bg:[1,{0:_2,1:_2,2:_2,3:_2,4:_2,5:_2,6:_2,7:_2,8:_2,9:_2,a:_2,b:_2,c:_2,d:_2,e:_2,f:_2,g:_2,h:_2,i:_2,j:_2,k:_2,l:_2,m:_2,n:_2,o:_2,p:_2,q:_2,r:_2,s:_2,t:_2,u:_2,v:_2,w:_2,x:_2,y:_2,z:_2,barsy:_3}],bh:_4,bi:[1,{co:_2,com:_2,edu:_2,or:_2,org:_2}],biz:[1,{activetrail:_3,"cloud-ip":_3,cloudns:_3,jozi:_3,dyndns:_3,"for-better":_3,"for-more":_3,"for-some":_3,"for-the":_3,selfip:_3,webhop:_3,orx:_3,mmafan:_3,myftp:_3,"no-ip":_3,dscloud:_3}],bj:[1,{africa:_2,agro:_2,architectes:_2,assur:_2,avocats:_2,co:_2,com:_2,eco:_2,econo:_2,edu:_2,info:_2,loisirs:_2,money:_2,net:_2,org:_2,ote:_2,restaurant:_2,resto:_2,tourism:_2,univ:_2}],bm:_4,bn:[1,{com:_2,edu:_2,gov:_2,net:_2,org:_2,co:_3}],bo:[1,{com:_2,edu:_2,gob:_2,int:_2,mil:_2,net:_2,org:_2,tv:_2,web:_2,academia:_2,agro:_2,arte:_2,blog:_2,bolivia:_2,ciencia:_2,cooperativa:_2,democracia:_2,deporte:_2,ecologia:_2,economia:_2,empresa:_2,indigena:_2,industria:_2,info:_2,medicina:_2,movimiento:_2,musica:_2,natural:_2,nombre:_2,noticias:_2,patria:_2,plurinacional:_2,politica:_2,profesional:_2,pueblo:_2,revista:_2,salud:_2,tecnologia:_2,tksat:_2,transporte:_2,wiki:_2}],br:[1,{"9guacu":_2,abc:_2,adm:_2,adv:_2,agr:_2,aju:_2,am:_2,anani:_2,aparecida:_2,api:_2,app:_2,arq:_2,art:_2,ato:_2,b:_2,barueri:_2,belem:_2,bet:_2,bhz:_2,bib:_2,bio:_2,blog:_2,bmd:_2,boavista:_2,bsb:_2,campinagrande:_2,campinas:_2,caxias:_2,cim:_2,cng:_2,cnt:_2,com:[1,{simplesite:_3}],contagem:_2,coop:_2,coz:_2,cri:_2,cuiaba:_2,curitiba:_2,def:_2,des:_2,det:_2,dev:_2,ecn:_2,eco:_2,edu:_2,emp:_2,enf:_2,eng:_2,esp:_2,etc:_2,eti:_2,far:_2,feira:_2,flog:_2,floripa:_2,fm:_2,fnd:_2,fortal:_2,fot:_2,foz:_2,fst:_2,g12:_2,geo:_2,ggf:_2,goiania:_2,gov:[1,{ac:_2,al:_2,am:_2,ap:_2,ba:_2,ce:_2,df:_2,es:_2,go:_2,ma:_2,mg:_2,ms:_2,mt:_2,pa:_2,pb:_2,pe:_2,pi:_2,pr:_2,rj:_2,rn:_2,ro:_2,rr:_2,rs:_2,sc:_2,se:_2,sp:_2,to:_2}],gru:_2,ia:_2,imb:_2,ind:_2,inf:_2,jab:_2,jampa:_2,jdf:_2,joinville:_2,jor:_2,jus:_2,leg:[1,{ac:_3,al:_3,am:_3,ap:_3,ba:_3,ce:_3,df:_3,es:_3,go:_3,ma:_3,mg:_3,ms:_3,mt:_3,pa:_3,pb:_3,pe:_3,pi:_3,pr:_3,rj:_3,rn:_3,ro:_3,rr:_3,rs:_3,sc:_3,se:_3,sp:_3,to:_3}],leilao:_2,lel:_2,log:_2,londrina:_2,macapa:_2,maceio:_2,manaus:_2,maringa:_2,mat:_2,med:_2,mil:_2,morena:_2,mp:_2,mus:_2,natal:_2,net:_2,niteroi:_2,nom:_21,not:_2,ntr:_2,odo:_2,ong:_2,org:_2,osasco:_2,palmas:_2,poa:_2,ppg:_2,pro:_2,psc:_2,psi:_2,pvh:_2,qsl:_2,radio:_2,rec:_2,recife:_2,rep:_2,ribeirao:_2,rio:_2,riobranco:_2,riopreto:_2,salvador:_2,sampa:_2,santamaria:_2,santoandre:_2,saobernardo:_2,saogonca:_2,seg:_2,sjc:_2,slg:_2,slz:_2,social:_2,sorocaba:_2,srv:_2,taxi:_2,tc:_2,tec:_2,teo:_2,the:_2,tmp:_2,trd:_2,tur:_2,tv:_2,udi:_2,vet:_2,vix:_2,vlog:_2,wiki:_2,xyz:_2,zlg:_2,tche:_3}],bs:[1,{com:_2,edu:_2,gov:_2,net:_2,org:_2,we:_3}],bt:_4,bv:_2,bw:[1,{ac:_2,co:_2,gov:_2,net:_2,org:_2}],by:[1,{gov:_2,mil:_2,com:_2,of:_2,mediatech:_3}],bz:[1,{co:_2,com:_2,edu:_2,gov:_2,net:_2,org:_2,za:_3,mydns:_3,gsj:_3}],ca:[1,{ab:_2,bc:_2,mb:_2,nb:_2,nf:_2,nl:_2,ns:_2,nt:_2,nu:_2,on:_2,pe:_2,qc:_2,sk:_2,yk:_2,gc:_2,barsy:_3,awdev:_6,co:_3,"no-ip":_3,onid:_3,myspreadshop:_3,box:_3}],cat:_2,cc:[1,{cleverapps:_3,"cloud-ip":_3,cloudns:_3,ccwu:_3,ftpaccess:_3,"game-server":_3,myphotos:_3,scrapping:_3,twmail:_3,csx:_3,fantasyleague:_3,spawn:[0,{instances:_3}],ec:_3,eu:_3,gu:_3,uk:_3,us:_3}],cd:[1,{gov:_2,cc:_3}],cf:_2,cg:_2,ch:[1,{square7:_3,cloudns:_3,cloudscale:[0,{cust:_3,lpg:_23,rma:_23}],objectstorage:[0,{lpg:_3,rma:_3}],flow:[0,{ae:[0,{alp1:_3}],appengine:_3}],"linkyard-cloud":_3,gotdns:_3,dnsking:_3,"123website":_3,myspreadshop:_3,firenet:[0,{"*":_3,svc:_6}],"12hp":_3,"2ix":_3,"4lima":_3,"lima-city":_3}],ci:[1,{ac:_2,"xn--aroport-bya":_2,aéroport:_2,asso:_2,co:_2,com:_2,ed:_2,edu:_2,go:_2,gouv:_2,int:_2,net:_2,or:_2,org:_2,us:_3}],ck:_21,cl:[1,{co:_2,gob:_2,gov:_2,mil:_2,cloudns:_3}],cm:[1,{co:_2,com:_2,gov:_2,net:_2}],cn:[1,{ac:_2,com:[1,{amazonaws:[0,{"cn-north-1":[0,{"execute-api":_3,"emrappui-prod":_3,"emrnotebooks-prod":_3,"emrstudio-prod":_3,rds:_6,dualstack:_26,s3:_3,"s3-accesspoint":_3,"s3-deprecated":_3,"s3-object-lambda":_3,"s3-website":_3}],"cn-northwest-1":[0,{"execute-api":_3,"emrappui-prod":_3,"emrnotebooks-prod":_3,"emrstudio-prod":_3,rds:_6,dualstack:_27,s3:_3,"s3-accesspoint":_3,"s3-object-lambda":_3,"s3-website":_3}],compute:_6,airflow:[0,{"cn-north-1":_6,"cn-northwest-1":_6}],eb:[0,{"cn-north-1":_3,"cn-northwest-1":_3}],elb:_6}],amazonwebservices:[0,{on:[0,{"cn-north-1":_12,"cn-northwest-1":_12}]}],sagemaker:[0,{"cn-north-1":_15,"cn-northwest-1":_15}]}],edu:_2,gov:_2,mil:_2,net:_2,org:_2,"xn--55qx5d":_2,公司:_2,"xn--od0alg":_2,網絡:_2,"xn--io0a7i":_2,网络:_2,ah:_2,bj:_2,cq:_2,fj:_2,gd:_2,gs:_2,gx:_2,gz:_2,ha:_2,hb:_2,he:_2,hi:_2,hk:_2,hl:_2,hn:_2,jl:_2,js:_2,jx:_2,ln:_2,mo:_2,nm:_2,nx:_2,qh:_2,sc:_2,sd:_2,sh:[1,{as:_3}],sn:_2,sx:_2,tj:_2,tw:_2,xj:_2,xz:_2,yn:_2,zj:_2,"canva-apps":_3,canvasite:_25,myqnapcloud:_3,quickconnect:_28}],co:[1,{com:_2,edu:_2,gov:_2,mil:_2,net:_2,nom:_2,org:_2,carrd:_3,crd:_3,otap:_6,hidns:_3,leadpages:_3,lpages:_3,mypi:_3,xmit:_6,rdpa:[0,{clusters:_6,srvrless:_6}],firewalledreplit:_9,repl:_9,supabase:[2,{realtime:_3,storage:_3}],umso:_3}],com:[1,{a2hosted:_3,cpserver:_3,adobeaemcloud:[2,{dev:_6}],africa:_3,auiusercontent:_6,aivencloud:_3,alibabacloudcs:_3,kasserver:_3,amazonaws:[0,{"af-south-1":_31,"ap-east-1":_32,"ap-northeast-1":_33,"ap-northeast-2":_33,"ap-northeast-3":_31,"ap-south-1":_33,"ap-south-2":_34,"ap-southeast-1":_33,"ap-southeast-2":_33,"ap-southeast-3":_34,"ap-southeast-4":_34,"ap-southeast-5":[0,{"execute-api":_3,dualstack:_26,s3:_3,"s3-accesspoint":_3,"s3-deprecated":_3,"s3-object-lambda":_3,"s3-website":_3}],"ca-central-1":_36,"ca-west-1":_37,"eu-central-1":_33,"eu-central-2":_34,"eu-north-1":_32,"eu-south-1":_31,"eu-south-2":_34,"eu-west-1":[0,{"execute-api":_3,"emrappui-prod":_3,"emrnotebooks-prod":_3,"emrstudio-prod":_3,dualstack:_26,s3:_3,"s3-accesspoint":_3,"s3-deprecated":_3,"s3-object-lambda":_3,"s3-website":_3,"analytics-gateway":_3,"aws-cloud9":_29,cloud9:_30}],"eu-west-2":_32,"eu-west-3":_31,"il-central-1":[0,{"execute-api":_3,"emrappui-prod":_3,"emrnotebooks-prod":_3,"emrstudio-prod":_3,dualstack:_26,s3:_3,"s3-accesspoint":_3,"s3-object-lambda":_3,"s3-website":_3,"aws-cloud9":_29,cloud9:[0,{vfs:_3}]}],"me-central-1":_34,"me-south-1":_32,"sa-east-1":_31,"us-east-1":[2,{"execute-api":_3,"emrappui-prod":_3,"emrnotebooks-prod":_3,"emrstudio-prod":_3,dualstack:_35,s3:_3,"s3-accesspoint":_3,"s3-accesspoint-fips":_3,"s3-deprecated":_3,"s3-fips":_3,"s3-object-lambda":_3,"s3-website":_3,"analytics-gateway":_3,"aws-cloud9":_29,cloud9:_30}],"us-east-2":_38,"us-gov-east-1":_37,"us-gov-west-1":_37,"us-west-1":_36,"us-west-2":_38,compute:_6,"compute-1":_6,airflow:[0,{"af-south-1":_6,"ap-east-1":_6,"ap-northeast-1":_6,"ap-northeast-2":_6,"ap-northeast-3":_6,"ap-south-1":_6,"ap-south-2":_6,"ap-southeast-1":_6,"ap-southeast-2":_6,"ap-southeast-3":_6,"ap-southeast-4":_6,"ap-southeast-5":_6,"ap-southeast-7":_6,"ca-central-1":_6,"ca-west-1":_6,"eu-central-1":_6,"eu-central-2":_6,"eu-north-1":_6,"eu-south-1":_6,"eu-south-2":_6,"eu-west-1":_6,"eu-west-2":_6,"eu-west-3":_6,"il-central-1":_6,"me-central-1":_6,"me-south-1":_6,"sa-east-1":_6,"us-east-1":_6,"us-east-2":_6,"us-west-1":_6,"us-west-2":_6}],rds:[0,{"af-south-1":_6,"ap-east-1":_6,"ap-east-2":_6,"ap-northeast-1":_6,"ap-northeast-2":_6,"ap-northeast-3":_6,"ap-south-1":_6,"ap-south-2":_6,"ap-southeast-1":_6,"ap-southeast-2":_6,"ap-southeast-3":_6,"ap-southeast-4":_6,"ap-southeast-5":_6,"ap-southeast-6":_6,"ap-southeast-7":_6,"ca-central-1":_6,"ca-west-1":_6,"eu-central-1":_6,"eu-central-2":_6,"eu-west-1":_6,"eu-west-2":_6,"eu-west-3":_6,"il-central-1":_6,"me-central-1":_6,"me-south-1":_6,"mx-central-1":_6,"sa-east-1":_6,"us-east-1":_6,"us-east-2":_6,"us-gov-east-1":_6,"us-gov-west-1":_6,"us-northeast-1":_6,"us-west-1":_6,"us-west-2":_6}],s3:_3,"s3-1":_3,"s3-ap-east-1":_3,"s3-ap-northeast-1":_3,"s3-ap-northeast-2":_3,"s3-ap-northeast-3":_3,"s3-ap-south-1":_3,"s3-ap-southeast-1":_3,"s3-ap-southeast-2":_3,"s3-ca-central-1":_3,"s3-eu-central-1":_3,"s3-eu-north-1":_3,"s3-eu-west-1":_3,"s3-eu-west-2":_3,"s3-eu-west-3":_3,"s3-external-1":_3,"s3-fips-us-gov-east-1":_3,"s3-fips-us-gov-west-1":_3,"s3-global":[0,{accesspoint:[0,{mrap:_3}]}],"s3-me-south-1":_3,"s3-sa-east-1":_3,"s3-us-east-2":_3,"s3-us-gov-east-1":_3,"s3-us-gov-west-1":_3,"s3-us-west-1":_3,"s3-us-west-2":_3,"s3-website-ap-northeast-1":_3,"s3-website-ap-southeast-1":_3,"s3-website-ap-southeast-2":_3,"s3-website-eu-west-1":_3,"s3-website-sa-east-1":_3,"s3-website-us-east-1":_3,"s3-website-us-gov-west-1":_3,"s3-website-us-west-1":_3,"s3-website-us-west-2":_3,elb:_6}],amazoncognito:[0,{"af-south-1":_39,"ap-east-1":_39,"ap-northeast-1":_39,"ap-northeast-2":_39,"ap-northeast-3":_39,"ap-south-1":_39,"ap-south-2":_39,"ap-southeast-1":_39,"ap-southeast-2":_39,"ap-southeast-3":_39,"ap-southeast-4":_39,"ap-southeast-5":_39,"ap-southeast-7":_39,"ca-central-1":_39,"ca-west-1":_39,"eu-central-1":_39,"eu-central-2":_39,"eu-north-1":_39,"eu-south-1":_39,"eu-south-2":_39,"eu-west-1":_39,"eu-west-2":_39,"eu-west-3":_39,"il-central-1":_39,"me-central-1":_39,"me-south-1":_39,"mx-central-1":_39,"sa-east-1":_39,"us-east-1":_40,"us-east-2":_40,"us-gov-east-1":_41,"us-gov-west-1":_41,"us-west-1":_40,"us-west-2":_40}],amplifyapp:_3,awsapprunner:_6,awsapps:_3,elasticbeanstalk:[2,{"af-south-1":_3,"ap-east-1":_3,"ap-northeast-1":_3,"ap-northeast-2":_3,"ap-northeast-3":_3,"ap-south-1":_3,"ap-southeast-1":_3,"ap-southeast-2":_3,"ap-southeast-3":_3,"ap-southeast-5":_3,"ap-southeast-7":_3,"ca-central-1":_3,"eu-central-1":_3,"eu-north-1":_3,"eu-south-1":_3,"eu-south-2":_3,"eu-west-1":_3,"eu-west-2":_3,"eu-west-3":_3,"il-central-1":_3,"me-central-1":_3,"me-south-1":_3,"sa-east-1":_3,"us-east-1":_3,"us-east-2":_3,"us-gov-east-1":_3,"us-gov-west-1":_3,"us-west-1":_3,"us-west-2":_3}],awsglobalaccelerator:_3,siiites:_3,appspacehosted:_3,appspaceusercontent:_3,"on-aptible":_3,myasustor:_3,"balena-devices":_3,boutir:_3,bplaced:_3,cafjs:_3,"canva-apps":_3,"canva-hosted-embed":_3,canvacode:_3,"rice-labs":_3,"cdn77-storage":_3,br:_3,cn:_3,de:_3,eu:_3,jpn:_3,mex:_3,ru:_3,sa:_3,uk:_3,us:_3,za:_3,"clever-cloud":[0,{services:_6}],abrdns:_3,dnsabr:_3,"ip-ddns":_3,jdevcloud:_3,wpdevcloud:_3,"cf-ipfs":_3,"cloudflare-ipfs":_3,trycloudflare:_3,co:_3,devinapps:_6,builtwithdark:_3,datadetect:[0,{demo:_3,instance:_3}],dattolocal:_3,dattorelay:_3,dattoweb:_3,mydatto:_3,digitaloceanspaces:_6,discordsays:_3,discordsez:_3,drayddns:_3,dreamhosters:_3,durumis:_3,blogdns:_3,cechire:_3,dnsalias:_3,dnsdojo:_3,doesntexist:_3,dontexist:_3,doomdns:_3,"dyn-o-saur":_3,dynalias:_3,"dyndns-at-home":_3,"dyndns-at-work":_3,"dyndns-blog":_3,"dyndns-free":_3,"dyndns-home":_3,"dyndns-ip":_3,"dyndns-mail":_3,"dyndns-office":_3,"dyndns-pics":_3,"dyndns-remote":_3,"dyndns-server":_3,"dyndns-web":_3,"dyndns-wiki":_3,"dyndns-work":_3,"est-a-la-maison":_3,"est-a-la-masion":_3,"est-le-patron":_3,"est-mon-blogueur":_3,"from-ak":_3,"from-al":_3,"from-ar":_3,"from-ca":_3,"from-ct":_3,"from-dc":_3,"from-de":_3,"from-fl":_3,"from-ga":_3,"from-hi":_3,"from-ia":_3,"from-id":_3,"from-il":_3,"from-in":_3,"from-ks":_3,"from-ky":_3,"from-ma":_3,"from-md":_3,"from-mi":_3,"from-mn":_3,"from-mo":_3,"from-ms":_3,"from-mt":_3,"from-nc":_3,"from-nd":_3,"from-ne":_3,"from-nh":_3,"from-nj":_3,"from-nm":_3,"from-nv":_3,"from-oh":_3,"from-ok":_3,"from-or":_3,"from-pa":_3,"from-pr":_3,"from-ri":_3,"from-sc":_3,"from-sd":_3,"from-tn":_3,"from-tx":_3,"from-ut":_3,"from-va":_3,"from-vt":_3,"from-wa":_3,"from-wi":_3,"from-wv":_3,"from-wy":_3,getmyip:_3,gotdns:_3,"hobby-site":_3,homelinux:_3,homeunix:_3,iamallama:_3,"is-a-anarchist":_3,"is-a-blogger":_3,"is-a-bookkeeper":_3,"is-a-bulls-fan":_3,"is-a-caterer":_3,"is-a-chef":_3,"is-a-conservative":_3,"is-a-cpa":_3,"is-a-cubicle-slave":_3,"is-a-democrat":_3,"is-a-designer":_3,"is-a-doctor":_3,"is-a-financialadvisor":_3,"is-a-geek":_3,"is-a-green":_3,"is-a-guru":_3,"is-a-hard-worker":_3,"is-a-hunter":_3,"is-a-landscaper":_3,"is-a-lawyer":_3,"is-a-liberal":_3,"is-a-libertarian":_3,"is-a-llama":_3,"is-a-musician":_3,"is-a-nascarfan":_3,"is-a-nurse":_3,"is-a-painter":_3,"is-a-personaltrainer":_3,"is-a-photographer":_3,"is-a-player":_3,"is-a-republican":_3,"is-a-rockstar":_3,"is-a-socialist":_3,"is-a-student":_3,"is-a-teacher":_3,"is-a-techie":_3,"is-a-therapist":_3,"is-an-accountant":_3,"is-an-actor":_3,"is-an-actress":_3,"is-an-anarchist":_3,"is-an-artist":_3,"is-an-engineer":_3,"is-an-entertainer":_3,"is-certified":_3,"is-gone":_3,"is-into-anime":_3,"is-into-cars":_3,"is-into-cartoons":_3,"is-into-games":_3,"is-leet":_3,"is-not-certified":_3,"is-slick":_3,"is-uberleet":_3,"is-with-theband":_3,"isa-geek":_3,"isa-hockeynut":_3,issmarterthanyou:_3,"likes-pie":_3,likescandy:_3,"neat-url":_3,"saves-the-whales":_3,selfip:_3,"sells-for-less":_3,"sells-for-u":_3,servebbs:_3,"simple-url":_3,"space-to-rent":_3,"teaches-yoga":_3,writesthisblog:_3,ddnsfree:_3,ddnsgeek:_3,giize:_3,gleeze:_3,kozow:_3,loseyourip:_3,ooguy:_3,theworkpc:_3,emergentagent:[0,{preview:_3}],mytuleap:_3,"tuleap-partners":_3,encoreapi:_3,evennode:[0,{"eu-1":_3,"eu-2":_3,"eu-3":_3,"eu-4":_3,"us-1":_3,"us-2":_3,"us-3":_3,"us-4":_3}],onfabrica:_3,"fastly-edge":_3,"fastly-terrarium":_3,"fastvps-server":_3,mydobiss:_3,firebaseapp:_3,fldrv:_3,framercanvas:_3,"freebox-os":_3,freeboxos:_3,freemyip:_3,aliases121:_3,gentapps:_3,gentlentapis:_3,githubusercontent:_3,"0emm":_6,appspot:[2,{r:_6}],blogspot:_3,codespot:_3,googleapis:_3,googlecode:_3,pagespeedmobilizer:_3,withgoogle:_3,withyoutube:_3,grayjayleagues:_3,hatenablog:_3,hatenadiary:_3,"hercules-app":_3,"hercules-dev":_3,herokuapp:_3,gr:_3,smushcdn:_3,wphostedmail:_3,wpmucdn:_3,pixolino:_3,"apps-1and1":_3,"live-website":_3,"webspace-host":_3,dopaas:_3,"hosted-by-previder":_43,hosteur:[0,{"rag-cloud":_3,"rag-cloud-ch":_3}],"ik-server":[0,{jcloud:_3,"jcloud-ver-jpc":_3}],jelastic:[0,{demo:_3}],massivegrid:_43,wafaicloud:[0,{jed:_3,ryd:_3}],"eu1-plenit":_3,"la1-plenit":_3,"us1-plenit":_3,webadorsite:_3,joyent:[0,{cns:_6}],"on-forge":_3,"on-vapor":_3,lpusercontent:_3,linode:[0,{members:_3,nodebalancer:_6}],linodeobjects:_6,linodeusercontent:[0,{ip:_3}],localtonet:_3,lovableproject:_3,barsycenter:_3,barsyonline:_3,lutrausercontent:_6,magicpatternsapp:_3,modelscape:_3,mwcloudnonprod:_3,polyspace:_3,mazeplay:_3,miniserver:_3,atmeta:_3,fbsbx:_42,meteorapp:_44,routingthecloud:_3,"same-app":_3,"same-preview":_3,mydbserver:_3,mochausercontent:_3,hostedpi:_3,"mythic-beasts":[0,{caracal:_3,customer:_3,fentiger:_3,lynx:_3,ocelot:_3,oncilla:_3,onza:_3,sphinx:_3,vs:_3,x:_3,yali:_3}],nospamproxy:[0,{cloud:[2,{o365:_3}]}],"4u":_3,nfshost:_3,"3utilities":_3,blogsyte:_3,ciscofreak:_3,damnserver:_3,ddnsking:_3,ditchyourip:_3,dnsiskinky:_3,dynns:_3,geekgalaxy:_3,"health-carereform":_3,homesecuritymac:_3,homesecuritypc:_3,myactivedirectory:_3,mysecuritycamera:_3,myvnc:_3,"net-freaks":_3,onthewifi:_3,point2this:_3,quicksytes:_3,securitytactics:_3,servebeer:_3,servecounterstrike:_3,serveexchange:_3,serveftp:_3,servegame:_3,servehalflife:_3,servehttp:_3,servehumour:_3,serveirc:_3,servemp3:_3,servep2p:_3,servepics:_3,servequake:_3,servesarcasm:_3,stufftoread:_3,unusualperson:_3,workisboring:_3,myiphost:_3,observableusercontent:[0,{static:_3}],simplesite:_3,oaiusercontent:_6,orsites:_3,operaunite:_3,"customer-oci":[0,{"*":_3,oci:_6,ocp:_6,ocs:_6}],oraclecloudapps:_6,oraclegovcloudapps:_6,"authgear-staging":_3,authgearapps:_3,outsystemscloud:_3,ownprovider:_3,pgfog:_3,pagexl:_3,gotpantheon:_3,paywhirl:_6,forgeblocks:_3,upsunapp:_3,"postman-echo":_3,prgmr:[0,{xen:_3}],"project-study":[0,{dev:_3}],pythonanywhere:_44,qa2:_3,"alpha-myqnapcloud":_3,"dev-myqnapcloud":_3,mycloudnas:_3,mynascloud:_3,myqnapcloud:_3,qualifioapp:_3,ladesk:_3,qualyhqpartner:_6,qualyhqportal:_6,qbuser:_3,quipelements:_6,rackmaze:_3,"readthedocs-hosted":_3,rhcloud:_3,onrender:_3,render:_45,"subsc-pay":_3,"180r":_3,dojin:_3,sakuratan:_3,sakuraweb:_3,x0:_3,code:[0,{builder:_6,"dev-builder":_6,"stg-builder":_6}],salesforce:[0,{platform:[0,{"code-builder-stg":[0,{test:[0,{"001":_6}]}]}]}],logoip:_3,scrysec:_3,"firewall-gateway":_3,myshopblocks:_3,myshopify:_3,shopitsite:_3,"1kapp":_3,appchizi:_3,applinzi:_3,sinaapp:_3,vipsinaapp:_3,streamlitapp:_3,"try-snowplow":_3,"playstation-cloud":_3,myspreadshop:_3,"w-corp-staticblitz":_3,"w-credentialless-staticblitz":_3,"w-staticblitz":_3,"stackhero-network":_3,stdlib:[0,{api:_3}],strapiapp:[2,{media:_3}],"streak-link":_3,streaklinks:_3,streakusercontent:_3,"temp-dns":_3,dsmynas:_3,familyds:_3,mytabit:_3,taveusercontent:_3,"tb-hosting":_46,reservd:_3,thingdustdata:_3,"townnews-staging":_3,typeform:[0,{pro:_3}],hk:_3,it:_3,"deus-canvas":_3,vultrobjects:_6,wafflecell:_3,hotelwithflight:_3,"reserve-online":_3,cprapid:_3,pleskns:_3,remotewd:_3,wiardweb:[0,{pages:_3}],"base44-sandbox":_3,wixsite:_3,wixstudio:_3,messwithdns:_3,"woltlab-demo":_3,wpenginepowered:[2,{js:_3}],xnbay:[2,{u2:_3,"u2-local":_3}],xtooldevice:_3,yolasite:_3}],coop:_2,cr:[1,{ac:_2,co:_2,ed:_2,fi:_2,go:_2,or:_2,sa:_2}],cu:[1,{com:_2,edu:_2,gob:_2,inf:_2,nat:_2,net:_2,org:_2}],cv:[1,{com:_2,edu:_2,id:_2,int:_2,net:_2,nome:_2,org:_2,publ:_2}],cw:_47,cx:[1,{gov:_2,cloudns:_3,ath:_3,info:_3,assessments:_3,calculators:_3,funnels:_3,paynow:_3,quizzes:_3,researched:_3,tests:_3}],cy:[1,{ac:_2,biz:_2,com:[1,{scaleforce:_48}],ekloges:_2,gov:_2,ltd:_2,mil:_2,net:_2,org:_2,press:_2,pro:_2,tm:_2}],cz:[1,{gov:_2,contentproxy9:[0,{rsc:_3}],realm:_3,e4:_3,co:_3,metacentrum:[0,{cloud:_6,custom:_3}],muni:[0,{cloud:[0,{flt:_3,usr:_3}]}]}],de:[1,{bplaced:_3,square7:_3,"bwcloud-os-instance":_6,com:_3,cosidns:_49,dnsupdater:_3,"dynamisches-dns":_3,"internet-dns":_3,"l-o-g-i-n":_3,ddnss:[2,{dyn:_3,dyndns:_3}],"dyn-ip24":_3,dyndns1:_3,"home-webserver":[2,{dyn:_3}],"myhome-server":_3,dnshome:_3,fuettertdasnetz:_3,isteingeek:_3,istmein:_3,lebtimnetz:_3,leitungsen:_3,traeumtgerade:_3,frusky:_6,goip:_3,"xn--gnstigbestellen-zvb":_3,günstigbestellen:_3,"xn--gnstigliefern-wob":_3,günstigliefern:_3,"hs-heilbronn":[0,{it:[0,{pages:_3,"pages-research":_3}]}],"dyn-berlin":_3,"in-berlin":_3,"in-brb":_3,"in-butter":_3,"in-dsl":_3,"in-vpn":_3,iservschule:_3,"mein-iserv":_3,schuldock:_3,schulplattform:_3,schulserver:_3,"test-iserv":_3,keymachine:_3,co:_3,"git-repos":_3,"lcube-server":_3,"svn-repos":_3,barsy:_3,webspaceconfig:_3,"123webseite":_3,rub:_3,"ruhr-uni-bochum":[2,{noc:[0,{io:_3}]}],logoip:_3,"firewall-gateway":_3,"my-gateway":_3,"my-router":_3,spdns:_3,my:_3,speedpartner:[0,{customer:_3}],myspreadshop:_3,"taifun-dns":_3,"12hp":_3,"2ix":_3,"4lima":_3,"lima-city":_3,"virtual-user":_3,virtualuser:_3,"community-pro":_3,diskussionsbereich:_3,xenonconnect:_6}],dj:_2,dk:[1,{biz:_3,co:_3,firm:_3,reg:_3,store:_3,"123hjemmeside":_3,myspreadshop:_3}],dm:_52,do:[1,{art:_2,com:_2,edu:_2,gob:_2,gov:_2,mil:_2,net:_2,org:_2,sld:_2,web:_2}],dz:[1,{art:_2,asso:_2,com:_2,edu:_2,gov:_2,net:_2,org:_2,pol:_2,soc:_2,tm:_2}],ec:[1,{abg:_2,adm:_2,agron:_2,arqt:_2,art:_2,bar:_2,chef:_2,com:_2,cont:_2,cpa:_2,cue:_2,dent:_2,dgn:_2,disco:_2,doc:_2,edu:_2,eng:_2,esm:_2,fin:_2,fot:_2,gal:_2,gob:_2,gov:_2,gye:_2,ibr:_2,info:_2,k12:_2,lat:_2,loj:_2,med:_2,mil:_2,mktg:_2,mon:_2,net:_2,ntr:_2,odont:_2,org:_2,pro:_2,prof:_2,psic:_2,psiq:_2,pub:_2,rio:_2,rrpp:_2,sal:_2,tech:_2,tul:_2,tur:_2,uio:_2,vet:_2,xxx:_2,base:_3,official:_3}],edu:[1,{rit:[0,{"git-pages":_3}]}],ee:[1,{aip:_2,com:_2,edu:_2,fie:_2,gov:_2,lib:_2,med:_2,org:_2,pri:_2,riik:_2}],eg:[1,{ac:_2,com:_2,edu:_2,eun:_2,gov:_2,info:_2,me:_2,mil:_2,name:_2,net:_2,org:_2,sci:_2,sport:_2,tv:_2}],er:_21,es:[1,{com:_2,edu:_2,gob:_2,nom:_2,org:_2,"123miweb":_3,myspreadshop:_3}],et:[1,{biz:_2,com:_2,edu:_2,gov:_2,info:_2,name:_2,net:_2,org:_2}],eu:[1,{amazonwebservices:[0,{on:[0,{"eusc-de-east-1":[0,{"cognito-idp":_39}]}]}],cloudns:_3,prvw:_3,deuxfleurs:_3,dogado:[0,{jelastic:_3}],barsy:_3,spdns:_3,nxa:_6,directwp:_3,transurl:_6}],fi:[1,{aland:_2,dy:_3,"xn--hkkinen-5wa":_3,häkkinen:_3,iki:_3,cloudplatform:[0,{fi:_3}],datacenter:[0,{demo:_3,paas:_3}],kapsi:_3,"123kotisivu":_3,myspreadshop:_3}],fj:[1,{ac:_2,biz:_2,com:_2,edu:_2,gov:_2,id:_2,info:_2,mil:_2,name:_2,net:_2,org:_2,pro:_2}],fk:_21,fm:[1,{com:_2,edu:_2,net:_2,org:_2,radio:_3,user:_6}],fo:_2,fr:[1,{asso:_2,com:_2,gouv:_2,nom:_2,prd:_2,tm:_2,avoues:_2,cci:_2,greta:_2,"huissier-justice":_2,"fbx-os":_3,fbxos:_3,"freebox-os":_3,freeboxos:_3,goupile:_3,"123siteweb":_3,"on-web":_3,"chirurgiens-dentistes-en-france":_3,dedibox:_3,aeroport:_3,avocat:_3,chambagri:_3,"chirurgiens-dentistes":_3,"experts-comptables":_3,medecin:_3,notaires:_3,pharmacien:_3,port:_3,veterinaire:_3,myspreadshop:_3,ynh:_3}],ga:_2,gb:_2,gd:[1,{edu:_2,gov:_2}],ge:[1,{com:_2,edu:_2,gov:_2,net:_2,org:_2,pvt:_2,school:_2}],gf:_2,gg:[1,{co:_2,net:_2,org:_2,ply:[0,{at:_6,d6:_3}],botdash:_3,kaas:_3,stackit:_3,panel:[2,{daemon:_3}]}],gh:[1,{biz:_2,com:_2,edu:_2,gov:_2,mil:_2,net:_2,org:_2}],gi:[1,{com:_2,edu:_2,gov:_2,ltd:_2,mod:_2,org:_2}],gl:[1,{co:_2,com:_2,edu:_2,net:_2,org:_2}],gm:_2,gn:[1,{ac:_2,com:_2,edu:_2,gov:_2,net:_2,org:_2}],gov:_2,gp:[1,{asso:_2,com:_2,edu:_2,mobi:_2,net:_2,org:_2}],gq:_2,gr:[1,{com:_2,edu:_2,gov:_2,net:_2,org:_2,barsy:_3,simplesite:_3}],gs:_2,gt:[1,{com:_2,edu:_2,gob:_2,ind:_2,mil:_2,net:_2,org:_2}],gu:[1,{com:_2,edu:_2,gov:_2,guam:_2,info:_2,net:_2,org:_2,web:_2}],gw:[1,{nx:_3}],gy:_52,hk:[1,{com:_2,edu:_2,gov:_2,idv:_2,net:_2,org:_2,"xn--ciqpn":_2,个人:_2,"xn--gmqw5a":_2,個人:_2,"xn--55qx5d":_2,公司:_2,"xn--mxtq1m":_2,政府:_2,"xn--lcvr32d":_2,敎育:_2,"xn--wcvs22d":_2,教育:_2,"xn--gmq050i":_2,箇人:_2,"xn--uc0atv":_2,組織:_2,"xn--uc0ay4a":_2,組织:_2,"xn--od0alg":_2,網絡:_2,"xn--zf0avx":_2,網络:_2,"xn--mk0axi":_2,组織:_2,"xn--tn0ag":_2,组织:_2,"xn--od0aq3b":_2,网絡:_2,"xn--io0a7i":_2,网络:_2,inc:_3,ltd:_3}],hm:_2,hn:[1,{com:_2,edu:_2,gob:_2,mil:_2,net:_2,org:_2}],hr:[1,{com:_2,from:_2,iz:_2,name:_2,brendly:_20}],ht:[1,{adult:_2,art:_2,asso:_2,com:_2,coop:_2,edu:_2,firm:_2,gouv:_2,info:_2,med:_2,net:_2,org:_2,perso:_2,pol:_2,pro:_2,rel:_2,shop:_2,rt:_3}],hu:[1,{2e3:_2,agrar:_2,bolt:_2,casino:_2,city:_2,co:_2,erotica:_2,erotika:_2,film:_2,forum:_2,games:_2,hotel:_2,info:_2,ingatlan:_2,jogasz:_2,konyvelo:_2,lakas:_2,media:_2,news:_2,org:_2,priv:_2,reklam:_2,sex:_2,shop:_2,sport:_2,suli:_2,szex:_2,tm:_2,tozsde:_2,utazas:_2,video:_2}],id:[1,{ac:_2,biz:_2,co:_2,desa:_2,go:_2,kop:_2,mil:_2,my:_2,net:_2,or:_2,ponpes:_2,sch:_2,web:_2,"xn--9tfky":_2,"ᬩᬮᬶ":_2,e:_3,zone:_3}],ie:[1,{gov:_2,myspreadshop:_3}],il:[1,{ac:_2,co:[1,{ravpage:_3,mytabit:_3,tabitorder:_3}],gov:_2,idf:_2,k12:_2,muni:_2,net:_2,org:_2}],"xn--4dbrk0ce":[1,{"xn--4dbgdty6c":_2,"xn--5dbhl8d":_2,"xn--8dbq2a":_2,"xn--hebda8b":_2}],ישראל:[1,{אקדמיה:_2,ישוב:_2,צהל:_2,ממשל:_2}],im:[1,{ac:_2,co:[1,{ltd:_2,plc:_2}],com:_2,net:_2,org:_2,tt:_2,tv:_2}],in:[1,{"5g":_2,"6g":_2,ac:_2,ai:_2,am:_2,bank:_2,bihar:_2,biz:_2,business:_2,ca:_2,cn:_2,co:_2,com:_2,coop:_2,cs:_2,delhi:_2,dr:_2,edu:_2,er:_2,fin:_2,firm:_2,gen:_2,gov:_2,gujarat:_2,ind:_2,info:_2,int:_2,internet:_2,io:_2,me:_2,mil:_2,net:_2,nic:_2,org:_2,pg:_2,post:_2,pro:_2,res:_2,travel:_2,tv:_2,uk:_2,up:_2,us:_2,cloudns:_3,barsy:_3,web:_3,indevs:_3,supabase:_3}],info:[1,{cloudns:_3,"dynamic-dns":_3,"barrel-of-knowledge":_3,"barrell-of-knowledge":_3,dyndns:_3,"for-our":_3,"groks-the":_3,"groks-this":_3,"here-for-more":_3,knowsitall:_3,selfip:_3,webhop:_3,barsy:_3,mayfirst:_3,mittwald:_3,mittwaldserver:_3,typo3server:_3,dvrcam:_3,ilovecollege:_3,"no-ip":_3,forumz:_3,nsupdate:_3,dnsupdate:_3,"v-info":_3}],int:[1,{eu:_2}],io:[1,{2038:_3,co:_2,com:_2,edu:_2,gov:_2,mil:_2,net:_2,nom:_2,org:_2,"on-acorn":_6,myaddr:_3,apigee:_3,"b-data":_3,beagleboard:_3,bitbucket:_3,bluebite:_3,boxfuse:_3,brave:_7,browsersafetymark:_3,bubble:_55,bubbleapps:_3,bigv:[0,{uk0:_3}],cleverapps:_3,cloudbeesusercontent:_3,dappnode:[0,{dyndns:_3}],darklang:_3,definima:_3,dedyn:_3,icp0:_56,icp1:_56,qzz:_3,"fh-muenster":_3,gitbook:_3,github:_3,gitlab:_3,lolipop:_3,"hasura-app":_3,hostyhosting:_3,hypernode:_3,moonscale:_6,beebyte:_43,beebyteapp:[0,{sekd1:_3}],jele:_3,keenetic:_3,kiloapps:_3,webthings:_3,loginline:_3,barsy:_3,azurecontainer:_6,ngrok:[2,{ap:_3,au:_3,eu:_3,in:_3,jp:_3,sa:_3,us:_3}],nodeart:[0,{stage:_3}],pantheonsite:_3,forgerock:[0,{id:_3}],pstmn:[2,{mock:_3}],protonet:_3,qcx:[2,{sys:_6}],qoto:_3,vaporcloud:_3,myrdbx:_3,"rb-hosting":_46,"on-k3s":_6,"on-rio":_6,readthedocs:_3,resindevice:_3,resinstaging:[0,{devices:_3}],hzc:_3,sandcats:_3,scrypted:[0,{client:_3}],"mo-siemens":_3,lair:_42,stolos:_6,musician:_3,utwente:_3,edugit:_3,telebit:_3,thingdust:[0,{dev:_57,disrec:_57,prod:_58,testing:_57}],tickets:_3,webflow:_3,webflowtest:_3,editorx:_3,wixstudio:_3,basicserver:_3,virtualserver:_3}],iq:_5,ir:[1,{ac:_2,co:_2,gov:_2,id:_2,net:_2,org:_2,sch:_2,"xn--mgba3a4f16a":_2,ایران:_2,"xn--mgba3a4fra":_2,ايران:_2,arvanedge:_3,vistablog:_3}],is:_2,it:[1,{edu:_2,gov:_2,abr:_2,abruzzo:_2,"aosta-valley":_2,aostavalley:_2,bas:_2,basilicata:_2,cal:_2,calabria:_2,cam:_2,campania:_2,"emilia-romagna":_2,emiliaromagna:_2,emr:_2,"friuli-v-giulia":_2,"friuli-ve-giulia":_2,"friuli-vegiulia":_2,"friuli-venezia-giulia":_2,"friuli-veneziagiulia":_2,"friuli-vgiulia":_2,"friuliv-giulia":_2,"friulive-giulia":_2,friulivegiulia:_2,"friulivenezia-giulia":_2,friuliveneziagiulia:_2,friulivgiulia:_2,fvg:_2,laz:_2,lazio:_2,lig:_2,liguria:_2,lom:_2,lombardia:_2,lombardy:_2,lucania:_2,mar:_2,marche:_2,mol:_2,molise:_2,piedmont:_2,piemonte:_2,pmn:_2,pug:_2,puglia:_2,sar:_2,sardegna:_2,sardinia:_2,sic:_2,sicilia:_2,sicily:_2,taa:_2,tos:_2,toscana:_2,"trentin-sud-tirol":_2,"xn--trentin-sd-tirol-rzb":_2,"trentin-süd-tirol":_2,"trentin-sudtirol":_2,"xn--trentin-sdtirol-7vb":_2,"trentin-südtirol":_2,"trentin-sued-tirol":_2,"trentin-suedtirol":_2,trentino:_2,"trentino-a-adige":_2,"trentino-aadige":_2,"trentino-alto-adige":_2,"trentino-altoadige":_2,"trentino-s-tirol":_2,"trentino-stirol":_2,"trentino-sud-tirol":_2,"xn--trentino-sd-tirol-c3b":_2,"trentino-süd-tirol":_2,"trentino-sudtirol":_2,"xn--trentino-sdtirol-szb":_2,"trentino-südtirol":_2,"trentino-sued-tirol":_2,"trentino-suedtirol":_2,"trentinoa-adige":_2,trentinoaadige:_2,"trentinoalto-adige":_2,trentinoaltoadige:_2,"trentinos-tirol":_2,trentinostirol:_2,"trentinosud-tirol":_2,"xn--trentinosd-tirol-rzb":_2,"trentinosüd-tirol":_2,trentinosudtirol:_2,"xn--trentinosdtirol-7vb":_2,trentinosüdtirol:_2,"trentinosued-tirol":_2,trentinosuedtirol:_2,"trentinsud-tirol":_2,"xn--trentinsd-tirol-6vb":_2,"trentinsüd-tirol":_2,trentinsudtirol:_2,"xn--trentinsdtirol-nsb":_2,trentinsüdtirol:_2,"trentinsued-tirol":_2,trentinsuedtirol:_2,tuscany:_2,umb:_2,umbria:_2,"val-d-aosta":_2,"val-daosta":_2,"vald-aosta":_2,valdaosta:_2,"valle-aosta":_2,"valle-d-aosta":_2,"valle-daosta":_2,valleaosta:_2,"valled-aosta":_2,valledaosta:_2,"vallee-aoste":_2,"xn--valle-aoste-ebb":_2,"vallée-aoste":_2,"vallee-d-aoste":_2,"xn--valle-d-aoste-ehb":_2,"vallée-d-aoste":_2,valleeaoste:_2,"xn--valleaoste-e7a":_2,valléeaoste:_2,valleedaoste:_2,"xn--valledaoste-ebb":_2,valléedaoste:_2,vao:_2,vda:_2,ven:_2,veneto:_2,ag:_2,agrigento:_2,al:_2,alessandria:_2,"alto-adige":_2,altoadige:_2,an:_2,ancona:_2,"andria-barletta-trani":_2,"andria-trani-barletta":_2,andriabarlettatrani:_2,andriatranibarletta:_2,ao:_2,aosta:_2,aoste:_2,ap:_2,aq:_2,aquila:_2,ar:_2,arezzo:_2,"ascoli-piceno":_2,ascolipiceno:_2,asti:_2,at:_2,av:_2,avellino:_2,ba:_2,balsan:_2,"balsan-sudtirol":_2,"xn--balsan-sdtirol-nsb":_2,"balsan-südtirol":_2,"balsan-suedtirol":_2,bari:_2,"barletta-trani-andria":_2,barlettatraniandria:_2,belluno:_2,benevento:_2,bergamo:_2,bg:_2,bi:_2,biella:_2,bl:_2,bn:_2,bo:_2,bologna:_2,bolzano:_2,"bolzano-altoadige":_2,bozen:_2,"bozen-sudtirol":_2,"xn--bozen-sdtirol-2ob":_2,"bozen-südtirol":_2,"bozen-suedtirol":_2,br:_2,brescia:_2,brindisi:_2,bs:_2,bt:_2,bulsan:_2,"bulsan-sudtirol":_2,"xn--bulsan-sdtirol-nsb":_2,"bulsan-südtirol":_2,"bulsan-suedtirol":_2,bz:_2,ca:_2,cagliari:_2,caltanissetta:_2,"campidano-medio":_2,campidanomedio:_2,campobasso:_2,"carbonia-iglesias":_2,carboniaiglesias:_2,"carrara-massa":_2,carraramassa:_2,caserta:_2,catania:_2,catanzaro:_2,cb:_2,ce:_2,"cesena-forli":_2,"xn--cesena-forl-mcb":_2,"cesena-forlì":_2,cesenaforli:_2,"xn--cesenaforl-i8a":_2,cesenaforlì:_2,ch:_2,chieti:_2,ci:_2,cl:_2,cn:_2,co:_2,como:_2,cosenza:_2,cr:_2,cremona:_2,crotone:_2,cs:_2,ct:_2,cuneo:_2,cz:_2,"dell-ogliastra":_2,dellogliastra:_2,en:_2,enna:_2,fc:_2,fe:_2,fermo:_2,ferrara:_2,fg:_2,fi:_2,firenze:_2,florence:_2,fm:_2,foggia:_2,"forli-cesena":_2,"xn--forl-cesena-fcb":_2,"forlì-cesena":_2,forlicesena:_2,"xn--forlcesena-c8a":_2,forlìcesena:_2,fr:_2,frosinone:_2,ge:_2,genoa:_2,genova:_2,go:_2,gorizia:_2,gr:_2,grosseto:_2,"iglesias-carbonia":_2,iglesiascarbonia:_2,im:_2,imperia:_2,is:_2,isernia:_2,kr:_2,"la-spezia":_2,laquila:_2,laspezia:_2,latina:_2,lc:_2,le:_2,lecce:_2,lecco:_2,li:_2,livorno:_2,lo:_2,lodi:_2,lt:_2,lu:_2,lucca:_2,macerata:_2,mantova:_2,"massa-carrara":_2,massacarrara:_2,matera:_2,mb:_2,mc:_2,me:_2,"medio-campidano":_2,mediocampidano:_2,messina:_2,mi:_2,milan:_2,milano:_2,mn:_2,mo:_2,modena:_2,monza:_2,"monza-brianza":_2,"monza-e-della-brianza":_2,monzabrianza:_2,monzaebrianza:_2,monzaedellabrianza:_2,ms:_2,mt:_2,na:_2,naples:_2,napoli:_2,no:_2,novara:_2,nu:_2,nuoro:_2,og:_2,ogliastra:_2,"olbia-tempio":_2,olbiatempio:_2,or:_2,oristano:_2,ot:_2,pa:_2,padova:_2,padua:_2,palermo:_2,parma:_2,pavia:_2,pc:_2,pd:_2,pe:_2,perugia:_2,"pesaro-urbino":_2,pesarourbino:_2,pescara:_2,pg:_2,pi:_2,piacenza:_2,pisa:_2,pistoia:_2,pn:_2,po:_2,pordenone:_2,potenza:_2,pr:_2,prato:_2,pt:_2,pu:_2,pv:_2,pz:_2,ra:_2,ragusa:_2,ravenna:_2,rc:_2,re:_2,"reggio-calabria":_2,"reggio-emilia":_2,reggiocalabria:_2,reggioemilia:_2,rg:_2,ri:_2,rieti:_2,rimini:_2,rm:_2,rn:_2,ro:_2,roma:_2,rome:_2,rovigo:_2,sa:_2,salerno:_2,sassari:_2,savona:_2,si:_2,siena:_2,siracusa:_2,so:_2,sondrio:_2,sp:_2,sr:_2,ss:_2,"xn--sdtirol-n2a":_2,südtirol:_2,suedtirol:_2,sv:_2,ta:_2,taranto:_2,te:_2,"tempio-olbia":_2,tempioolbia:_2,teramo:_2,terni:_2,tn:_2,to:_2,torino:_2,tp:_2,tr:_2,"trani-andria-barletta":_2,"trani-barletta-andria":_2,traniandriabarletta:_2,tranibarlettaandria:_2,trapani:_2,trento:_2,treviso:_2,trieste:_2,ts:_2,turin:_2,tv:_2,ud:_2,udine:_2,"urbino-pesaro":_2,urbinopesaro:_2,va:_2,varese:_2,vb:_2,vc:_2,ve:_2,venezia:_2,venice:_2,verbania:_2,vercelli:_2,verona:_2,vi:_2,"vibo-valentia":_2,vibovalentia:_2,vicenza:_2,viterbo:_2,vr:_2,vs:_2,vt:_2,vv:_2,"12chars":_3,ibxos:_3,iliadboxos:_3,neen:[0,{jc:_3}],"123homepage":_3,"16-b":_3,"32-b":_3,"64-b":_3,myspreadshop:_3,syncloud:_3}],je:[1,{co:_2,net:_2,org:_2,of:_3}],jm:_21,jo:[1,{agri:_2,ai:_2,com:_2,edu:_2,eng:_2,fm:_2,gov:_2,mil:_2,net:_2,org:_2,per:_2,phd:_2,sch:_2,tv:_2}],jobs:_2,jp:[1,{ac:_2,ad:_2,co:_2,ed:_2,go:_2,gr:_2,lg:_2,ne:[1,{aseinet:_54,gehirn:_3,ivory:_3,"mail-box":_3,mints:_3,mokuren:_3,opal:_3,sakura:_3,sumomo:_3,topaz:_3}],or:_2,aichi:[1,{aisai:_2,ama:_2,anjo:_2,asuke:_2,chiryu:_2,chita:_2,fuso:_2,gamagori:_2,handa:_2,hazu:_2,hekinan:_2,higashiura:_2,ichinomiya:_2,inazawa:_2,inuyama:_2,isshiki:_2,iwakura:_2,kanie:_2,kariya:_2,kasugai:_2,kira:_2,kiyosu:_2,komaki:_2,konan:_2,kota:_2,mihama:_2,miyoshi:_2,nishio:_2,nisshin:_2,obu:_2,oguchi:_2,oharu:_2,okazaki:_2,owariasahi:_2,seto:_2,shikatsu:_2,shinshiro:_2,shitara:_2,tahara:_2,takahama:_2,tobishima:_2,toei:_2,togo:_2,tokai:_2,tokoname:_2,toyoake:_2,toyohashi:_2,toyokawa:_2,toyone:_2,toyota:_2,tsushima:_2,yatomi:_2}],akita:[1,{akita:_2,daisen:_2,fujisato:_2,gojome:_2,hachirogata:_2,happou:_2,higashinaruse:_2,honjo:_2,honjyo:_2,ikawa:_2,kamikoani:_2,kamioka:_2,katagami:_2,kazuno:_2,kitaakita:_2,kosaka:_2,kyowa:_2,misato:_2,mitane:_2,moriyoshi:_2,nikaho:_2,noshiro:_2,odate:_2,oga:_2,ogata:_2,semboku:_2,yokote:_2,yurihonjo:_2}],aomori:[1,{aomori:_2,gonohe:_2,hachinohe:_2,hashikami:_2,hiranai:_2,hirosaki:_2,itayanagi:_2,kuroishi:_2,misawa:_2,mutsu:_2,nakadomari:_2,noheji:_2,oirase:_2,owani:_2,rokunohe:_2,sannohe:_2,shichinohe:_2,shingo:_2,takko:_2,towada:_2,tsugaru:_2,tsuruta:_2}],chiba:[1,{abiko:_2,asahi:_2,chonan:_2,chosei:_2,choshi:_2,chuo:_2,funabashi:_2,futtsu:_2,hanamigawa:_2,ichihara:_2,ichikawa:_2,ichinomiya:_2,inzai:_2,isumi:_2,kamagaya:_2,kamogawa:_2,kashiwa:_2,katori:_2,katsuura:_2,kimitsu:_2,kisarazu:_2,kozaki:_2,kujukuri:_2,kyonan:_2,matsudo:_2,midori:_2,mihama:_2,minamiboso:_2,mobara:_2,mutsuzawa:_2,nagara:_2,nagareyama:_2,narashino:_2,narita:_2,noda:_2,oamishirasato:_2,omigawa:_2,onjuku:_2,otaki:_2,sakae:_2,sakura:_2,shimofusa:_2,shirako:_2,shiroi:_2,shisui:_2,sodegaura:_2,sosa:_2,tako:_2,tateyama:_2,togane:_2,tohnosho:_2,tomisato:_2,urayasu:_2,yachimata:_2,yachiyo:_2,yokaichiba:_2,yokoshibahikari:_2,yotsukaido:_2}],ehime:[1,{ainan:_2,honai:_2,ikata:_2,imabari:_2,iyo:_2,kamijima:_2,kihoku:_2,kumakogen:_2,masaki:_2,matsuno:_2,matsuyama:_2,namikata:_2,niihama:_2,ozu:_2,saijo:_2,seiyo:_2,shikokuchuo:_2,tobe:_2,toon:_2,uchiko:_2,uwajima:_2,yawatahama:_2}],fukui:[1,{echizen:_2,eiheiji:_2,fukui:_2,ikeda:_2,katsuyama:_2,mihama:_2,minamiechizen:_2,obama:_2,ohi:_2,ono:_2,sabae:_2,sakai:_2,takahama:_2,tsuruga:_2,wakasa:_2}],fukuoka:[1,{ashiya:_2,buzen:_2,chikugo:_2,chikuho:_2,chikujo:_2,chikushino:_2,chikuzen:_2,chuo:_2,dazaifu:_2,fukuchi:_2,hakata:_2,higashi:_2,hirokawa:_2,hisayama:_2,iizuka:_2,inatsuki:_2,kaho:_2,kasuga:_2,kasuya:_2,kawara:_2,keisen:_2,koga:_2,kurate:_2,kurogi:_2,kurume:_2,minami:_2,miyako:_2,miyama:_2,miyawaka:_2,mizumaki:_2,munakata:_2,nakagawa:_2,nakama:_2,nishi:_2,nogata:_2,ogori:_2,okagaki:_2,okawa:_2,oki:_2,omuta:_2,onga:_2,onojo:_2,oto:_2,saigawa:_2,sasaguri:_2,shingu:_2,shinyoshitomi:_2,shonai:_2,soeda:_2,sue:_2,tachiarai:_2,tagawa:_2,takata:_2,toho:_2,toyotsu:_2,tsuiki:_2,ukiha:_2,umi:_2,usui:_2,yamada:_2,yame:_2,yanagawa:_2,yukuhashi:_2}],fukushima:[1,{aizubange:_2,aizumisato:_2,aizuwakamatsu:_2,asakawa:_2,bandai:_2,date:_2,fukushima:_2,furudono:_2,futaba:_2,hanawa:_2,higashi:_2,hirata:_2,hirono:_2,iitate:_2,inawashiro:_2,ishikawa:_2,iwaki:_2,izumizaki:_2,kagamiishi:_2,kaneyama:_2,kawamata:_2,kitakata:_2,kitashiobara:_2,koori:_2,koriyama:_2,kunimi:_2,miharu:_2,mishima:_2,namie:_2,nango:_2,nishiaizu:_2,nishigo:_2,okuma:_2,omotego:_2,ono:_2,otama:_2,samegawa:_2,shimogo:_2,shirakawa:_2,showa:_2,soma:_2,sukagawa:_2,taishin:_2,tamakawa:_2,tanagura:_2,tenei:_2,yabuki:_2,yamato:_2,yamatsuri:_2,yanaizu:_2,yugawa:_2}],gifu:[1,{anpachi:_2,ena:_2,gifu:_2,ginan:_2,godo:_2,gujo:_2,hashima:_2,hichiso:_2,hida:_2,higashishirakawa:_2,ibigawa:_2,ikeda:_2,kakamigahara:_2,kani:_2,kasahara:_2,kasamatsu:_2,kawaue:_2,kitagata:_2,mino:_2,minokamo:_2,mitake:_2,mizunami:_2,motosu:_2,nakatsugawa:_2,ogaki:_2,sakahogi:_2,seki:_2,sekigahara:_2,shirakawa:_2,tajimi:_2,takayama:_2,tarui:_2,toki:_2,tomika:_2,wanouchi:_2,yamagata:_2,yaotsu:_2,yoro:_2}],gunma:[1,{annaka:_2,chiyoda:_2,fujioka:_2,higashiagatsuma:_2,isesaki:_2,itakura:_2,kanna:_2,kanra:_2,katashina:_2,kawaba:_2,kiryu:_2,kusatsu:_2,maebashi:_2,meiwa:_2,midori:_2,minakami:_2,naganohara:_2,nakanojo:_2,nanmoku:_2,numata:_2,oizumi:_2,ora:_2,ota:_2,shibukawa:_2,shimonita:_2,shinto:_2,showa:_2,takasaki:_2,takayama:_2,tamamura:_2,tatebayashi:_2,tomioka:_2,tsukiyono:_2,tsumagoi:_2,ueno:_2,yoshioka:_2}],hiroshima:[1,{asaminami:_2,daiwa:_2,etajima:_2,fuchu:_2,fukuyama:_2,hatsukaichi:_2,higashihiroshima:_2,hongo:_2,jinsekikogen:_2,kaita:_2,kui:_2,kumano:_2,kure:_2,mihara:_2,miyoshi:_2,naka:_2,onomichi:_2,osakikamijima:_2,otake:_2,saka:_2,sera:_2,seranishi:_2,shinichi:_2,shobara:_2,takehara:_2}],hokkaido:[1,{abashiri:_2,abira:_2,aibetsu:_2,akabira:_2,akkeshi:_2,asahikawa:_2,ashibetsu:_2,ashoro:_2,assabu:_2,atsuma:_2,bibai:_2,biei:_2,bifuka:_2,bihoro:_2,biratori:_2,chippubetsu:_2,chitose:_2,date:_2,ebetsu:_2,embetsu:_2,eniwa:_2,erimo:_2,esan:_2,esashi:_2,fukagawa:_2,fukushima:_2,furano:_2,furubira:_2,haboro:_2,hakodate:_2,hamatonbetsu:_2,hidaka:_2,higashikagura:_2,higashikawa:_2,hiroo:_2,hokuryu:_2,hokuto:_2,honbetsu:_2,horokanai:_2,horonobe:_2,ikeda:_2,imakane:_2,ishikari:_2,iwamizawa:_2,iwanai:_2,kamifurano:_2,kamikawa:_2,kamishihoro:_2,kamisunagawa:_2,kamoenai:_2,kayabe:_2,kembuchi:_2,kikonai:_2,kimobetsu:_2,kitahiroshima:_2,kitami:_2,kiyosato:_2,koshimizu:_2,kunneppu:_2,kuriyama:_2,kuromatsunai:_2,kushiro:_2,kutchan:_2,kyowa:_2,mashike:_2,matsumae:_2,mikasa:_2,minamifurano:_2,mombetsu:_2,moseushi:_2,mukawa:_2,muroran:_2,naie:_2,nakagawa:_2,nakasatsunai:_2,nakatombetsu:_2,nanae:_2,nanporo:_2,nayoro:_2,nemuro:_2,niikappu:_2,niki:_2,nishiokoppe:_2,noboribetsu:_2,numata:_2,obihiro:_2,obira:_2,oketo:_2,okoppe:_2,otaru:_2,otobe:_2,otofuke:_2,otoineppu:_2,oumu:_2,ozora:_2,pippu:_2,rankoshi:_2,rebun:_2,rikubetsu:_2,rishiri:_2,rishirifuji:_2,saroma:_2,sarufutsu:_2,shakotan:_2,shari:_2,shibecha:_2,shibetsu:_2,shikabe:_2,shikaoi:_2,shimamaki:_2,shimizu:_2,shimokawa:_2,shinshinotsu:_2,shintoku:_2,shiranuka:_2,shiraoi:_2,shiriuchi:_2,sobetsu:_2,sunagawa:_2,taiki:_2,takasu:_2,takikawa:_2,takinoue:_2,teshikaga:_2,tobetsu:_2,tohma:_2,tomakomai:_2,tomari:_2,toya:_2,toyako:_2,toyotomi:_2,toyoura:_2,tsubetsu:_2,tsukigata:_2,urakawa:_2,urausu:_2,uryu:_2,utashinai:_2,wakkanai:_2,wassamu:_2,yakumo:_2,yoichi:_2}],hyogo:[1,{aioi:_2,akashi:_2,ako:_2,amagasaki:_2,aogaki:_2,asago:_2,ashiya:_2,awaji:_2,fukusaki:_2,goshiki:_2,harima:_2,himeji:_2,ichikawa:_2,inagawa:_2,itami:_2,kakogawa:_2,kamigori:_2,kamikawa:_2,kasai:_2,kasuga:_2,kawanishi:_2,miki:_2,minamiawaji:_2,nishinomiya:_2,nishiwaki:_2,ono:_2,sanda:_2,sannan:_2,sasayama:_2,sayo:_2,shingu:_2,shinonsen:_2,shiso:_2,sumoto:_2,taishi:_2,taka:_2,takarazuka:_2,takasago:_2,takino:_2,tamba:_2,tatsuno:_2,toyooka:_2,yabu:_2,yashiro:_2,yoka:_2,yokawa:_2}],ibaraki:[1,{ami:_2,asahi:_2,bando:_2,chikusei:_2,daigo:_2,fujishiro:_2,hitachi:_2,hitachinaka:_2,hitachiomiya:_2,hitachiota:_2,ibaraki:_2,ina:_2,inashiki:_2,itako:_2,iwama:_2,joso:_2,kamisu:_2,kasama:_2,kashima:_2,kasumigaura:_2,koga:_2,miho:_2,mito:_2,moriya:_2,naka:_2,namegata:_2,oarai:_2,ogawa:_2,omitama:_2,ryugasaki:_2,sakai:_2,sakuragawa:_2,shimodate:_2,shimotsuma:_2,shirosato:_2,sowa:_2,suifu:_2,takahagi:_2,tamatsukuri:_2,tokai:_2,tomobe:_2,tone:_2,toride:_2,tsuchiura:_2,tsukuba:_2,uchihara:_2,ushiku:_2,yachiyo:_2,yamagata:_2,yawara:_2,yuki:_2}],ishikawa:[1,{anamizu:_2,hakui:_2,hakusan:_2,kaga:_2,kahoku:_2,kanazawa:_2,kawakita:_2,komatsu:_2,nakanoto:_2,nanao:_2,nomi:_2,nonoichi:_2,noto:_2,shika:_2,suzu:_2,tsubata:_2,tsurugi:_2,uchinada:_2,wajima:_2}],iwate:[1,{fudai:_2,fujisawa:_2,hanamaki:_2,hiraizumi:_2,hirono:_2,ichinohe:_2,ichinoseki:_2,iwaizumi:_2,iwate:_2,joboji:_2,kamaishi:_2,kanegasaki:_2,karumai:_2,kawai:_2,kitakami:_2,kuji:_2,kunohe:_2,kuzumaki:_2,miyako:_2,mizusawa:_2,morioka:_2,ninohe:_2,noda:_2,ofunato:_2,oshu:_2,otsuchi:_2,rikuzentakata:_2,shiwa:_2,shizukuishi:_2,sumita:_2,tanohata:_2,tono:_2,yahaba:_2,yamada:_2}],kagawa:[1,{ayagawa:_2,higashikagawa:_2,kanonji:_2,kotohira:_2,manno:_2,marugame:_2,mitoyo:_2,naoshima:_2,sanuki:_2,tadotsu:_2,takamatsu:_2,tonosho:_2,uchinomi:_2,utazu:_2,zentsuji:_2}],kagoshima:[1,{akune:_2,amami:_2,hioki:_2,isa:_2,isen:_2,izumi:_2,kagoshima:_2,kanoya:_2,kawanabe:_2,kinko:_2,kouyama:_2,makurazaki:_2,matsumoto:_2,minamitane:_2,nakatane:_2,nishinoomote:_2,satsumasendai:_2,soo:_2,tarumizu:_2,yusui:_2}],kanagawa:[1,{aikawa:_2,atsugi:_2,ayase:_2,chigasaki:_2,ebina:_2,fujisawa:_2,hadano:_2,hakone:_2,hiratsuka:_2,isehara:_2,kaisei:_2,kamakura:_2,kiyokawa:_2,matsuda:_2,minamiashigara:_2,miura:_2,nakai:_2,ninomiya:_2,odawara:_2,oi:_2,oiso:_2,sagamihara:_2,samukawa:_2,tsukui:_2,yamakita:_2,yamato:_2,yokosuka:_2,yugawara:_2,zama:_2,zushi:_2}],kochi:[1,{aki:_2,geisei:_2,hidaka:_2,higashitsuno:_2,ino:_2,kagami:_2,kami:_2,kitagawa:_2,kochi:_2,mihara:_2,motoyama:_2,muroto:_2,nahari:_2,nakamura:_2,nankoku:_2,nishitosa:_2,niyodogawa:_2,ochi:_2,okawa:_2,otoyo:_2,otsuki:_2,sakawa:_2,sukumo:_2,susaki:_2,tosa:_2,tosashimizu:_2,toyo:_2,tsuno:_2,umaji:_2,yasuda:_2,yusuhara:_2}],kumamoto:[1,{amakusa:_2,arao:_2,aso:_2,choyo:_2,gyokuto:_2,kamiamakusa:_2,kikuchi:_2,kumamoto:_2,mashiki:_2,mifune:_2,minamata:_2,minamioguni:_2,nagasu:_2,nishihara:_2,oguni:_2,ozu:_2,sumoto:_2,takamori:_2,uki:_2,uto:_2,yamaga:_2,yamato:_2,yatsushiro:_2}],kyoto:[1,{ayabe:_2,fukuchiyama:_2,higashiyama:_2,ide:_2,ine:_2,joyo:_2,kameoka:_2,kamo:_2,kita:_2,kizu:_2,kumiyama:_2,kyotamba:_2,kyotanabe:_2,kyotango:_2,maizuru:_2,minami:_2,minamiyamashiro:_2,miyazu:_2,muko:_2,nagaokakyo:_2,nakagyo:_2,nantan:_2,oyamazaki:_2,sakyo:_2,seika:_2,tanabe:_2,uji:_2,ujitawara:_2,wazuka:_2,yamashina:_2,yawata:_2}],mie:[1,{asahi:_2,inabe:_2,ise:_2,kameyama:_2,kawagoe:_2,kiho:_2,kisosaki:_2,kiwa:_2,komono:_2,kumano:_2,kuwana:_2,matsusaka:_2,meiwa:_2,mihama:_2,minamiise:_2,misugi:_2,miyama:_2,nabari:_2,shima:_2,suzuka:_2,tado:_2,taiki:_2,taki:_2,tamaki:_2,toba:_2,tsu:_2,udono:_2,ureshino:_2,watarai:_2,yokkaichi:_2}],miyagi:[1,{furukawa:_2,higashimatsushima:_2,ishinomaki:_2,iwanuma:_2,kakuda:_2,kami:_2,kawasaki:_2,marumori:_2,matsushima:_2,minamisanriku:_2,misato:_2,murata:_2,natori:_2,ogawara:_2,ohira:_2,onagawa:_2,osaki:_2,rifu:_2,semine:_2,shibata:_2,shichikashuku:_2,shikama:_2,shiogama:_2,shiroishi:_2,tagajo:_2,taiwa:_2,tome:_2,tomiya:_2,wakuya:_2,watari:_2,yamamoto:_2,zao:_2}],miyazaki:[1,{aya:_2,ebino:_2,gokase:_2,hyuga:_2,kadogawa:_2,kawaminami:_2,kijo:_2,kitagawa:_2,kitakata:_2,kitaura:_2,kobayashi:_2,kunitomi:_2,kushima:_2,mimata:_2,miyakonojo:_2,miyazaki:_2,morotsuka:_2,nichinan:_2,nishimera:_2,nobeoka:_2,saito:_2,shiiba:_2,shintomi:_2,takaharu:_2,takanabe:_2,takazaki:_2,tsuno:_2}],nagano:[1,{achi:_2,agematsu:_2,anan:_2,aoki:_2,asahi:_2,azumino:_2,chikuhoku:_2,chikuma:_2,chino:_2,fujimi:_2,hakuba:_2,hara:_2,hiraya:_2,iida:_2,iijima:_2,iiyama:_2,iizuna:_2,ikeda:_2,ikusaka:_2,ina:_2,karuizawa:_2,kawakami:_2,kiso:_2,kisofukushima:_2,kitaaiki:_2,komagane:_2,komoro:_2,matsukawa:_2,matsumoto:_2,miasa:_2,minamiaiki:_2,minamimaki:_2,minamiminowa:_2,minowa:_2,miyada:_2,miyota:_2,mochizuki:_2,nagano:_2,nagawa:_2,nagiso:_2,nakagawa:_2,nakano:_2,nozawaonsen:_2,obuse:_2,ogawa:_2,okaya:_2,omachi:_2,omi:_2,ookuwa:_2,ooshika:_2,otaki:_2,otari:_2,sakae:_2,sakaki:_2,saku:_2,sakuho:_2,shimosuwa:_2,shinanomachi:_2,shiojiri:_2,suwa:_2,suzaka:_2,takagi:_2,takamori:_2,takayama:_2,tateshina:_2,tatsuno:_2,togakushi:_2,togura:_2,tomi:_2,ueda:_2,wada:_2,yamagata:_2,yamanouchi:_2,yasaka:_2,yasuoka:_2}],nagasaki:[1,{chijiwa:_2,futsu:_2,goto:_2,hasami:_2,hirado:_2,iki:_2,isahaya:_2,kawatana:_2,kuchinotsu:_2,matsuura:_2,nagasaki:_2,obama:_2,omura:_2,oseto:_2,saikai:_2,sasebo:_2,seihi:_2,shimabara:_2,shinkamigoto:_2,togitsu:_2,tsushima:_2,unzen:_2}],nara:[1,{ando:_2,gose:_2,heguri:_2,higashiyoshino:_2,ikaruga:_2,ikoma:_2,kamikitayama:_2,kanmaki:_2,kashiba:_2,kashihara:_2,katsuragi:_2,kawai:_2,kawakami:_2,kawanishi:_2,koryo:_2,kurotaki:_2,mitsue:_2,miyake:_2,nara:_2,nosegawa:_2,oji:_2,ouda:_2,oyodo:_2,sakurai:_2,sango:_2,shimoichi:_2,shimokitayama:_2,shinjo:_2,soni:_2,takatori:_2,tawaramoto:_2,tenkawa:_2,tenri:_2,uda:_2,yamatokoriyama:_2,yamatotakada:_2,yamazoe:_2,yoshino:_2}],niigata:[1,{aga:_2,agano:_2,gosen:_2,itoigawa:_2,izumozaki:_2,joetsu:_2,kamo:_2,kariwa:_2,kashiwazaki:_2,minamiuonuma:_2,mitsuke:_2,muika:_2,murakami:_2,myoko:_2,nagaoka:_2,niigata:_2,ojiya:_2,omi:_2,sado:_2,sanjo:_2,seiro:_2,seirou:_2,sekikawa:_2,shibata:_2,tagami:_2,tainai:_2,tochio:_2,tokamachi:_2,tsubame:_2,tsunan:_2,uonuma:_2,yahiko:_2,yoita:_2,yuzawa:_2}],oita:[1,{beppu:_2,bungoono:_2,bungotakada:_2,hasama:_2,hiji:_2,himeshima:_2,hita:_2,kamitsue:_2,kokonoe:_2,kuju:_2,kunisaki:_2,kusu:_2,oita:_2,saiki:_2,taketa:_2,tsukumi:_2,usa:_2,usuki:_2,yufu:_2}],okayama:[1,{akaiwa:_2,asakuchi:_2,bizen:_2,hayashima:_2,ibara:_2,kagamino:_2,kasaoka:_2,kibichuo:_2,kumenan:_2,kurashiki:_2,maniwa:_2,misaki:_2,nagi:_2,niimi:_2,nishiawakura:_2,okayama:_2,satosho:_2,setouchi:_2,shinjo:_2,shoo:_2,soja:_2,takahashi:_2,tamano:_2,tsuyama:_2,wake:_2,yakage:_2}],okinawa:[1,{aguni:_2,ginowan:_2,ginoza:_2,gushikami:_2,haebaru:_2,higashi:_2,hirara:_2,iheya:_2,ishigaki:_2,ishikawa:_2,itoman:_2,izena:_2,kadena:_2,kin:_2,kitadaito:_2,kitanakagusuku:_2,kumejima:_2,kunigami:_2,minamidaito:_2,motobu:_2,nago:_2,naha:_2,nakagusuku:_2,nakijin:_2,nanjo:_2,nishihara:_2,ogimi:_2,okinawa:_2,onna:_2,shimoji:_2,taketomi:_2,tarama:_2,tokashiki:_2,tomigusuku:_2,tonaki:_2,urasoe:_2,uruma:_2,yaese:_2,yomitan:_2,yonabaru:_2,yonaguni:_2,zamami:_2}],osaka:[1,{abeno:_2,chihayaakasaka:_2,chuo:_2,daito:_2,fujiidera:_2,habikino:_2,hannan:_2,higashiosaka:_2,higashisumiyoshi:_2,higashiyodogawa:_2,hirakata:_2,ibaraki:_2,ikeda:_2,izumi:_2,izumiotsu:_2,izumisano:_2,kadoma:_2,kaizuka:_2,kanan:_2,kashiwara:_2,katano:_2,kawachinagano:_2,kishiwada:_2,kita:_2,kumatori:_2,matsubara:_2,minato:_2,minoh:_2,misaki:_2,moriguchi:_2,neyagawa:_2,nishi:_2,nose:_2,osakasayama:_2,sakai:_2,sayama:_2,sennan:_2,settsu:_2,shijonawate:_2,shimamoto:_2,suita:_2,tadaoka:_2,taishi:_2,tajiri:_2,takaishi:_2,takatsuki:_2,tondabayashi:_2,toyonaka:_2,toyono:_2,yao:_2}],saga:[1,{ariake:_2,arita:_2,fukudomi:_2,genkai:_2,hamatama:_2,hizen:_2,imari:_2,kamimine:_2,kanzaki:_2,karatsu:_2,kashima:_2,kitagata:_2,kitahata:_2,kiyama:_2,kouhoku:_2,kyuragi:_2,nishiarita:_2,ogi:_2,omachi:_2,ouchi:_2,saga:_2,shiroishi:_2,taku:_2,tara:_2,tosu:_2,yoshinogari:_2}],saitama:[1,{arakawa:_2,asaka:_2,chichibu:_2,fujimi:_2,fujimino:_2,fukaya:_2,hanno:_2,hanyu:_2,hasuda:_2,hatogaya:_2,hatoyama:_2,hidaka:_2,higashichichibu:_2,higashimatsuyama:_2,honjo:_2,ina:_2,iruma:_2,iwatsuki:_2,kamiizumi:_2,kamikawa:_2,kamisato:_2,kasukabe:_2,kawagoe:_2,kawaguchi:_2,kawajima:_2,kazo:_2,kitamoto:_2,koshigaya:_2,kounosu:_2,kuki:_2,kumagaya:_2,matsubushi:_2,minano:_2,misato:_2,miyashiro:_2,miyoshi:_2,moroyama:_2,nagatoro:_2,namegawa:_2,niiza:_2,ogano:_2,ogawa:_2,ogose:_2,okegawa:_2,omiya:_2,otaki:_2,ranzan:_2,ryokami:_2,saitama:_2,sakado:_2,satte:_2,sayama:_2,shiki:_2,shiraoka:_2,soka:_2,sugito:_2,toda:_2,tokigawa:_2,tokorozawa:_2,tsurugashima:_2,urawa:_2,warabi:_2,yashio:_2,yokoze:_2,yono:_2,yorii:_2,yoshida:_2,yoshikawa:_2,yoshimi:_2}],shiga:[1,{aisho:_2,gamo:_2,higashiomi:_2,hikone:_2,koka:_2,konan:_2,kosei:_2,koto:_2,kusatsu:_2,maibara:_2,moriyama:_2,nagahama:_2,nishiazai:_2,notogawa:_2,omihachiman:_2,otsu:_2,ritto:_2,ryuoh:_2,takashima:_2,takatsuki:_2,torahime:_2,toyosato:_2,yasu:_2}],shimane:[1,{akagi:_2,ama:_2,gotsu:_2,hamada:_2,higashiizumo:_2,hikawa:_2,hikimi:_2,izumo:_2,kakinoki:_2,masuda:_2,matsue:_2,misato:_2,nishinoshima:_2,ohda:_2,okinoshima:_2,okuizumo:_2,shimane:_2,tamayu:_2,tsuwano:_2,unnan:_2,yakumo:_2,yasugi:_2,yatsuka:_2}],shizuoka:[1,{arai:_2,atami:_2,fuji:_2,fujieda:_2,fujikawa:_2,fujinomiya:_2,fukuroi:_2,gotemba:_2,haibara:_2,hamamatsu:_2,higashiizu:_2,ito:_2,iwata:_2,izu:_2,izunokuni:_2,kakegawa:_2,kannami:_2,kawanehon:_2,kawazu:_2,kikugawa:_2,kosai:_2,makinohara:_2,matsuzaki:_2,minamiizu:_2,mishima:_2,morimachi:_2,nishiizu:_2,numazu:_2,omaezaki:_2,shimada:_2,shimizu:_2,shimoda:_2,shizuoka:_2,susono:_2,yaizu:_2,yoshida:_2}],tochigi:[1,{ashikaga:_2,bato:_2,haga:_2,ichikai:_2,iwafune:_2,kaminokawa:_2,kanuma:_2,karasuyama:_2,kuroiso:_2,mashiko:_2,mibu:_2,moka:_2,motegi:_2,nasu:_2,nasushiobara:_2,nikko:_2,nishikata:_2,nogi:_2,ohira:_2,ohtawara:_2,oyama:_2,sakura:_2,sano:_2,shimotsuke:_2,shioya:_2,takanezawa:_2,tochigi:_2,tsuga:_2,ujiie:_2,utsunomiya:_2,yaita:_2}],tokushima:[1,{aizumi:_2,anan:_2,ichiba:_2,itano:_2,kainan:_2,komatsushima:_2,matsushige:_2,mima:_2,minami:_2,miyoshi:_2,mugi:_2,nakagawa:_2,naruto:_2,sanagochi:_2,shishikui:_2,tokushima:_2,wajiki:_2}],tokyo:[1,{adachi:_2,akiruno:_2,akishima:_2,aogashima:_2,arakawa:_2,bunkyo:_2,chiyoda:_2,chofu:_2,chuo:_2,edogawa:_2,fuchu:_2,fussa:_2,hachijo:_2,hachioji:_2,hamura:_2,higashikurume:_2,higashimurayama:_2,higashiyamato:_2,hino:_2,hinode:_2,hinohara:_2,inagi:_2,itabashi:_2,katsushika:_2,kita:_2,kiyose:_2,kodaira:_2,koganei:_2,kokubunji:_2,komae:_2,koto:_2,kouzushima:_2,kunitachi:_2,machida:_2,meguro:_2,minato:_2,mitaka:_2,mizuho:_2,musashimurayama:_2,musashino:_2,nakano:_2,nerima:_2,ogasawara:_2,okutama:_2,ome:_2,oshima:_2,ota:_2,setagaya:_2,shibuya:_2,shinagawa:_2,shinjuku:_2,suginami:_2,sumida:_2,tachikawa:_2,taito:_2,tama:_2,toshima:_2}],tottori:[1,{chizu:_2,hino:_2,kawahara:_2,koge:_2,kotoura:_2,misasa:_2,nanbu:_2,nichinan:_2,sakaiminato:_2,tottori:_2,wakasa:_2,yazu:_2,yonago:_2}],toyama:[1,{asahi:_2,fuchu:_2,fukumitsu:_2,funahashi:_2,himi:_2,imizu:_2,inami:_2,johana:_2,kamiichi:_2,kurobe:_2,nakaniikawa:_2,namerikawa:_2,nanto:_2,nyuzen:_2,oyabe:_2,taira:_2,takaoka:_2,tateyama:_2,toga:_2,tonami:_2,toyama:_2,unazuki:_2,uozu:_2,yamada:_2}],wakayama:[1,{arida:_2,aridagawa:_2,gobo:_2,hashimoto:_2,hidaka:_2,hirogawa:_2,inami:_2,iwade:_2,kainan:_2,kamitonda:_2,katsuragi:_2,kimino:_2,kinokawa:_2,kitayama:_2,koya:_2,koza:_2,kozagawa:_2,kudoyama:_2,kushimoto:_2,mihama:_2,misato:_2,nachikatsuura:_2,shingu:_2,shirahama:_2,taiji:_2,tanabe:_2,wakayama:_2,yuasa:_2,yura:_2}],yamagata:[1,{asahi:_2,funagata:_2,higashine:_2,iide:_2,kahoku:_2,kaminoyama:_2,kaneyama:_2,kawanishi:_2,mamurogawa:_2,mikawa:_2,murayama:_2,nagai:_2,nakayama:_2,nanyo:_2,nishikawa:_2,obanazawa:_2,oe:_2,oguni:_2,ohkura:_2,oishida:_2,sagae:_2,sakata:_2,sakegawa:_2,shinjo:_2,shirataka:_2,shonai:_2,takahata:_2,tendo:_2,tozawa:_2,tsuruoka:_2,yamagata:_2,yamanobe:_2,yonezawa:_2,yuza:_2}],yamaguchi:[1,{abu:_2,hagi:_2,hikari:_2,hofu:_2,iwakuni:_2,kudamatsu:_2,mitou:_2,nagato:_2,oshima:_2,shimonoseki:_2,shunan:_2,tabuse:_2,tokuyama:_2,toyota:_2,ube:_2,yuu:_2}],yamanashi:[1,{chuo:_2,doshi:_2,fuefuki:_2,fujikawa:_2,fujikawaguchiko:_2,fujiyoshida:_2,hayakawa:_2,hokuto:_2,ichikawamisato:_2,kai:_2,kofu:_2,koshu:_2,kosuge:_2,"minami-alps":_2,minobu:_2,nakamichi:_2,nanbu:_2,narusawa:_2,nirasaki:_2,nishikatsura:_2,oshino:_2,otsuki:_2,showa:_2,tabayama:_2,tsuru:_2,uenohara:_2,yamanakako:_2,yamanashi:_2}],"xn--ehqz56n":_2,三重:_2,"xn--1lqs03n":_2,京都:_2,"xn--qqqt11m":_2,佐賀:_2,"xn--f6qx53a":_2,兵庫:_2,"xn--djrs72d6uy":_2,北海道:_2,"xn--mkru45i":_2,千葉:_2,"xn--0trq7p7nn":_2,和歌山:_2,"xn--5js045d":_2,埼玉:_2,"xn--kbrq7o":_2,大分:_2,"xn--pssu33l":_2,大阪:_2,"xn--ntsq17g":_2,奈良:_2,"xn--uisz3g":_2,宮城:_2,"xn--6btw5a":_2,宮崎:_2,"xn--1ctwo":_2,富山:_2,"xn--6orx2r":_2,山口:_2,"xn--rht61e":_2,山形:_2,"xn--rht27z":_2,山梨:_2,"xn--nit225k":_2,岐阜:_2,"xn--rht3d":_2,岡山:_2,"xn--djty4k":_2,岩手:_2,"xn--klty5x":_2,島根:_2,"xn--kltx9a":_2,広島:_2,"xn--kltp7d":_2,徳島:_2,"xn--c3s14m":_2,愛媛:_2,"xn--vgu402c":_2,愛知:_2,"xn--efvn9s":_2,新潟:_2,"xn--1lqs71d":_2,東京:_2,"xn--4pvxs":_2,栃木:_2,"xn--uuwu58a":_2,沖縄:_2,"xn--zbx025d":_2,滋賀:_2,"xn--8pvr4u":_2,熊本:_2,"xn--5rtp49c":_2,石川:_2,"xn--ntso0iqx3a":_2,神奈川:_2,"xn--elqq16h":_2,福井:_2,"xn--4it168d":_2,福岡:_2,"xn--klt787d":_2,福島:_2,"xn--rny31h":_2,秋田:_2,"xn--7t0a264c":_2,群馬:_2,"xn--uist22h":_2,茨城:_2,"xn--8ltr62k":_2,長崎:_2,"xn--2m4a15e":_2,長野:_2,"xn--32vp30h":_2,青森:_2,"xn--4it797k":_2,静岡:_2,"xn--5rtq34k":_2,香川:_2,"xn--k7yn95e":_2,高知:_2,"xn--tor131o":_2,鳥取:_2,"xn--d5qv7z876c":_2,鹿児島:_2,kawasaki:_21,kitakyushu:_21,kobe:_21,nagoya:_21,sapporo:_21,sendai:_21,yokohama:_21,buyshop:_3,fashionstore:_3,handcrafted:_3,kawaiishop:_3,supersale:_3,theshop:_3,"0am":_3,"0g0":_3,"0j0":_3,"0t0":_3,mydns:_3,pgw:_3,wjg:_3,usercontent:_3,angry:_3,babyblue:_3,babymilk:_3,backdrop:_3,bambina:_3,bitter:_3,blush:_3,boo:_3,boy:_3,boyfriend:_3,but:_3,candypop:_3,capoo:_3,catfood:_3,cheap:_3,chicappa:_3,chillout:_3,chips:_3,chowder:_3,chu:_3,ciao:_3,cocotte:_3,coolblog:_3,cranky:_3,cutegirl:_3,daa:_3,deca:_3,deci:_3,digick:_3,egoism:_3,fakefur:_3,fem:_3,flier:_3,floppy:_3,fool:_3,frenchkiss:_3,girlfriend:_3,girly:_3,gloomy:_3,gonna:_3,greater:_3,hacca:_3,heavy:_3,her:_3,hiho:_3,hippy:_3,holy:_3,hungry:_3,icurus:_3,itigo:_3,jellybean:_3,kikirara:_3,kill:_3,kilo:_3,kuron:_3,littlestar:_3,lolipopmc:_3,lolitapunk:_3,lomo:_3,lovepop:_3,lovesick:_3,main:_3,mods:_3,mond:_3,mongolian:_3,moo:_3,namaste:_3,nikita:_3,nobushi:_3,noor:_3,oops:_3,parallel:_3,parasite:_3,pecori:_3,peewee:_3,penne:_3,pepper:_3,perma:_3,pigboat:_3,pinoko:_3,punyu:_3,pupu:_3,pussycat:_3,pya:_3,raindrop:_3,readymade:_3,sadist:_3,schoolbus:_3,secret:_3,staba:_3,stripper:_3,sub:_3,sunnyday:_3,thick:_3,tonkotsu:_3,under:_3,upper:_3,velvet:_3,verse:_3,versus:_3,vivian:_3,watson:_3,weblike:_3,whitesnow:_3,zombie:_3,hateblo:_3,hatenablog:_3,hatenadiary:_3,"2-d":_3,bona:_3,crap:_3,daynight:_3,eek:_3,flop:_3,halfmoon:_3,jeez:_3,matrix:_3,mimoza:_3,netgamers:_3,nyanta:_3,o0o0:_3,rdy:_3,rgr:_3,rulez:_3,sakurastorage:[0,{isk01:_59,isk02:_59}],saloon:_3,sblo:_3,skr:_3,tank:_3,"uh-oh":_3,undo:_3,webaccel:[0,{rs:_3,user:_3}],websozai:_3,xii:_3}],ke:[1,{ac:_2,co:_2,go:_2,info:_2,me:_2,mobi:_2,ne:_2,or:_2,sc:_2}],kg:[1,{com:_2,edu:_2,gov:_2,mil:_2,net:_2,org:_2,us:_3,xx:_3,ae:_3}],kh:_21,ki:_60,km:[1,{ass:_2,com:_2,edu:_2,gov:_2,mil:_2,nom:_2,org:_2,prd:_2,tm:_2,asso:_2,coop:_2,gouv:_2,medecin:_2,notaires:_2,pharmaciens:_2,presse:_2,veterinaire:_2}],kn:[1,{edu:_2,gov:_2,net:_2,org:_2}],kp:[1,{com:_2,edu:_2,gov:_2,org:_2,rep:_2,tra:_2}],kr:[1,{ac:_2,ai:_2,co:_2,es:_2,go:_2,hs:_2,io:_2,it:_2,kg:_2,me:_2,mil:_2,ms:_2,ne:_2,or:_2,pe:_2,re:_2,sc:_2,busan:_2,chungbuk:_2,chungnam:_2,daegu:_2,daejeon:_2,gangwon:_2,gwangju:_2,gyeongbuk:_2,gyeonggi:_2,gyeongnam:_2,incheon:_2,jeju:_2,jeonbuk:_2,jeonnam:_2,seoul:_2,ulsan:_2,c01:_3,"eliv-api":_3,"eliv-cdn":_3,"eliv-dns":_3,mmv:_3,vki:_3}],kw:[1,{com:_2,edu:_2,emb:_2,gov:_2,ind:_2,net:_2,org:_2}],ky:_47,kz:[1,{com:_2,edu:_2,gov:_2,mil:_2,net:_2,org:_2,jcloud:_3}],la:[1,{com:_2,edu:_2,gov:_2,info:_2,int:_2,net:_2,org:_2,per:_2,bnr:_3}],lb:_4,lc:[1,{co:_2,com:_2,edu:_2,gov:_2,net:_2,org:_2,oy:_3}],li:_2,lk:[1,{ac:_2,assn:_2,com:_2,edu:_2,gov:_2,grp:_2,hotel:_2,int:_2,ltd:_2,net:_2,ngo:_2,org:_2,sch:_2,soc:_2,web:_2}],lr:_4,ls:[1,{ac:_2,biz:_2,co:_2,edu:_2,gov:_2,info:_2,net:_2,org:_2,sc:_2}],lt:_10,lu:[1,{"123website":_3}],lv:[1,{asn:_2,com:_2,conf:_2,edu:_2,gov:_2,id:_2,mil:_2,net:_2,org:_2}],ly:[1,{com:_2,edu:_2,gov:_2,id:_2,med:_2,net:_2,org:_2,plc:_2,sch:_2}],ma:[1,{ac:_2,co:_2,gov:_2,net:_2,org:_2,press:_2}],mc:[1,{asso:_2,tm:_2}],md:[1,{ir:_3}],me:[1,{ac:_2,co:_2,edu:_2,gov:_2,its:_2,net:_2,org:_2,priv:_2,c66:_3,craft:_3,edgestack:_3,filegear:_3,"filegear-sg":_3,lohmus:_3,barsy:_3,mcdir:_3,brasilia:_3,ddns:_3,dnsfor:_3,hopto:_3,loginto:_3,noip:_3,webhop:_3,soundcast:_3,tcp4:_3,vp4:_3,diskstation:_3,dscloud:_3,i234:_3,myds:_3,synology:_3,transip:_46,nohost:_3}],mg:[1,{co:_2,com:_2,edu:_2,gov:_2,mil:_2,nom:_2,org:_2,prd:_2}],mh:_2,mil:_2,mk:[1,{com:_2,edu:_2,gov:_2,inf:_2,name:_2,net:_2,org:_2}],ml:[1,{ac:_2,art:_2,asso:_2,com:_2,edu:_2,gouv:_2,gov:_2,info:_2,inst:_2,net:_2,org:_2,pr:_2,presse:_2}],mm:_21,mn:[1,{edu:_2,gov:_2,org:_2,nyc:_3}],mo:_4,mobi:[1,{barsy:_3,dscloud:_3}],mp:[1,{ju:_3}],mq:_2,mr:_10,ms:[1,{com:_2,edu:_2,gov:_2,net:_2,org:_2,minisite:_3}],mt:_47,mu:[1,{ac:_2,co:_2,com:_2,gov:_2,net:_2,or:_2,org:_2}],museum:_2,mv:[1,{aero:_2,biz:_2,com:_2,coop:_2,edu:_2,gov:_2,info:_2,int:_2,mil:_2,museum:_2,name:_2,net:_2,org:_2,pro:_2}],mw:[1,{ac:_2,biz:_2,co:_2,com:_2,coop:_2,edu:_2,gov:_2,int:_2,net:_2,org:_2}],mx:[1,{com:_2,edu:_2,gob:_2,net:_2,org:_2}],my:[1,{biz:_2,com:_2,edu:_2,gov:_2,mil:_2,name:_2,net:_2,org:_2}],mz:[1,{ac:_2,adv:_2,co:_2,edu:_2,gov:_2,mil:_2,net:_2,org:_2}],na:[1,{alt:_2,co:_2,com:_2,gov:_2,net:_2,org:_2}],name:[1,{her:_63,his:_63,ispmanager:_3,keenetic:_3}],nc:[1,{asso:_2,nom:_2}],ne:_2,net:[1,{adobeaemcloud:_3,"adobeio-static":_3,adobeioruntime:_3,akadns:_3,akamai:_3,"akamai-staging":_3,akamaiedge:_3,"akamaiedge-staging":_3,akamaihd:_3,"akamaihd-staging":_3,akamaiorigin:_3,"akamaiorigin-staging":_3,akamaized:_3,"akamaized-staging":_3,edgekey:_3,"edgekey-staging":_3,edgesuite:_3,"edgesuite-staging":_3,alwaysdata:_3,myamaze:_3,cloudfront:_3,appudo:_3,"atlassian-dev":[0,{prod:_55}],myfritz:_3,shopselect:_3,blackbaudcdn:_3,boomla:_3,bplaced:_3,square7:_3,cdn77:[0,{r:_3}],"cdn77-ssl":_3,gb:_3,hu:_3,jp:_3,se:_3,uk:_3,clickrising:_3,"ddns-ip":_3,"dns-cloud":_3,"dns-dynamic":_3,cloudaccess:_3,cloudflare:[2,{cdn:_3}],cloudflareanycast:_55,cloudflarecn:_55,cloudflareglobal:_55,ctfcloud:_3,"feste-ip":_3,"knx-server":_3,"static-access":_3,cryptonomic:_6,dattolocal:_3,mydatto:_3,debian:_3,definima:_3,deno:_3,icp:_6,de5:_3,"at-band-camp":_3,blogdns:_3,"broke-it":_3,buyshouses:_3,dnsalias:_3,dnsdojo:_3,"does-it":_3,dontexist:_3,dynalias:_3,dynathome:_3,endofinternet:_3,"from-az":_3,"from-co":_3,"from-la":_3,"from-ny":_3,"gets-it":_3,"ham-radio-op":_3,homeftp:_3,homeip:_3,homelinux:_3,homeunix:_3,"in-the-band":_3,"is-a-chef":_3,"is-a-geek":_3,"isa-geek":_3,"kicks-ass":_3,"office-on-the":_3,podzone:_3,"scrapper-site":_3,selfip:_3,"sells-it":_3,servebbs:_3,serveftp:_3,thruhere:_3,webhop:_3,casacam:_3,dynu:_3,dynv6:_3,twmail:_3,ru:_3,channelsdvr:[2,{u:_3}],fastly:[0,{freetls:_3,map:_3,prod:[0,{a:_3,global:_3}],ssl:[0,{a:_3,b:_3,global:_3}]}],fastlylb:[2,{map:_3}],"keyword-on":_3,"live-on":_3,"server-on":_3,"cdn-edges":_3,heteml:_3,cloudfunctions:_3,"grafana-dev":_3,iobb:_3,moonscale:_3,"in-dsl":_3,"in-vpn":_3,oninferno:_3,botdash:_3,"apps-1and1":_3,ipifony:_3,cloudjiffy:[2,{"fra1-de":_3,"west1-us":_3}],elastx:[0,{"jls-sto1":_3,"jls-sto2":_3,"jls-sto3":_3}],massivegrid:[0,{paas:[0,{"fr-1":_3,"lon-1":_3,"lon-2":_3,"ny-1":_3,"ny-2":_3,"sg-1":_3}]}],saveincloud:[0,{jelastic:_3,"nordeste-idc":_3}],scaleforce:_48,kinghost:_3,uni5:_3,krellian:_3,ggff:_3,localto:_6,barsy:_3,luyani:_3,memset:_3,"azure-api":_3,"azure-mobile":_3,azureedge:_3,azurefd:_3,azurestaticapps:[2,{1:_3,2:_3,3:_3,4:_3,5:_3,6:_3,7:_3,centralus:_3,eastasia:_3,eastus2:_3,westeurope:_3,westus2:_3}],azurewebsites:_3,cloudapp:_3,trafficmanager:_3,usgovcloudapi:[0,{servicebus:_3}],usgovcloudapp:_3,windows:[0,{core:[0,{blob:_3}],servicebus:_3}],mynetname:[0,{sn:_3}],routingthecloud:_3,bounceme:_3,ddns:_3,"eating-organic":_3,mydissent:_3,myeffect:_3,mymediapc:_3,mypsx:_3,mysecuritycamera:_3,nhlfan:_3,"no-ip":_3,pgafan:_3,privatizehealthinsurance:_3,redirectme:_3,serveblog:_3,serveminecraft:_3,sytes:_3,dnsup:_3,hicam:_3,"now-dns":_3,ownip:_3,vpndns:_3,cloudycluster:_3,ovh:[0,{hosting:_6,webpaas:_6}],rackmaze:_3,myradweb:_3,in:_3,"subsc-pay":_3,squares:_3,schokokeks:_3,"firewall-gateway":_3,seidat:_3,senseering:_3,siteleaf:_3,mafelo:_3,myspreadshop:_3,"vps-host":[2,{jelastic:[0,{atl:_3,njs:_3,ric:_3}]}],srcf:[0,{soc:_3,user:_3}],supabase:_3,dsmynas:_3,familyds:_3,ts:[2,{c:_6}],torproject:[2,{pages:_3}],tunnelmole:_3,vusercontent:_3,"reserve-online":_3,localcert:_3,"community-pro":_3,meinforum:_3,yandexcloud:[2,{storage:_3,website:_3}],za:_3,zabc:_3}],nf:[1,{arts:_2,com:_2,firm:_2,info:_2,net:_2,other:_2,per:_2,rec:_2,store:_2,web:_2}],ng:[1,{com:_2,edu:_2,gov:_2,i:_2,mil:_2,mobi:_2,name:_2,net:_2,org:_2,sch:_2,biz:[2,{co:_3,dl:_3,go:_3,lg:_3,on:_3}],col:_3,firm:_3,gen:_3,ltd:_3,ngo:_3,plc:_3}],ni:[1,{ac:_2,biz:_2,co:_2,com:_2,edu:_2,gob:_2,in:_2,info:_2,int:_2,mil:_2,net:_2,nom:_2,org:_2,web:_2}],nl:[1,{co:_3,"hosting-cluster":_3,gov:_3,khplay:_3,"123website":_3,myspreadshop:_3,transurl:_6,cistron:_3,demon:_3}],no:[1,{fhs:_2,folkebibl:_2,fylkesbibl:_2,idrett:_2,museum:_2,priv:_2,vgs:_2,dep:_2,herad:_2,kommune:_2,mil:_2,stat:_2,aa:_64,ah:_64,bu:_64,fm:_64,hl:_64,hm:_64,"jan-mayen":_64,mr:_64,nl:_64,nt:_64,of:_64,ol:_64,oslo:_64,rl:_64,sf:_64,st:_64,svalbard:_64,tm:_64,tr:_64,va:_64,vf:_64,akrehamn:_2,"xn--krehamn-dxa":_2,åkrehamn:_2,algard:_2,"xn--lgrd-poac":_2,ålgård:_2,arna:_2,bronnoysund:_2,"xn--brnnysund-m8ac":_2,brønnøysund:_2,brumunddal:_2,bryne:_2,drobak:_2,"xn--drbak-wua":_2,drøbak:_2,egersund:_2,fetsund:_2,floro:_2,"xn--flor-jra":_2,florø:_2,fredrikstad:_2,hokksund:_2,honefoss:_2,"xn--hnefoss-q1a":_2,hønefoss:_2,jessheim:_2,jorpeland:_2,"xn--jrpeland-54a":_2,jørpeland:_2,kirkenes:_2,kopervik:_2,krokstadelva:_2,langevag:_2,"xn--langevg-jxa":_2,langevåg:_2,leirvik:_2,mjondalen:_2,"xn--mjndalen-64a":_2,mjøndalen:_2,"mo-i-rana":_2,mosjoen:_2,"xn--mosjen-eya":_2,mosjøen:_2,nesoddtangen:_2,orkanger:_2,osoyro:_2,"xn--osyro-wua":_2,osøyro:_2,raholt:_2,"xn--rholt-mra":_2,råholt:_2,sandnessjoen:_2,"xn--sandnessjen-ogb":_2,sandnessjøen:_2,skedsmokorset:_2,slattum:_2,spjelkavik:_2,stathelle:_2,stavern:_2,stjordalshalsen:_2,"xn--stjrdalshalsen-sqb":_2,stjørdalshalsen:_2,tananger:_2,tranby:_2,vossevangen:_2,aarborte:_2,aejrie:_2,afjord:_2,"xn--fjord-lra":_2,åfjord:_2,agdenes:_2,akershus:_65,aknoluokta:_2,"xn--koluokta-7ya57h":_2,ákŋoluokta:_2,al:_2,"xn--l-1fa":_2,ål:_2,alaheadju:_2,"xn--laheadju-7ya":_2,álaheadju:_2,alesund:_2,"xn--lesund-hua":_2,ålesund:_2,alstahaug:_2,alta:_2,"xn--lt-liac":_2,áltá:_2,alvdal:_2,amli:_2,"xn--mli-tla":_2,åmli:_2,amot:_2,"xn--mot-tla":_2,åmot:_2,andasuolo:_2,andebu:_2,andoy:_2,"xn--andy-ira":_2,andøy:_2,ardal:_2,"xn--rdal-poa":_2,årdal:_2,aremark:_2,arendal:_2,"xn--s-1fa":_2,ås:_2,aseral:_2,"xn--seral-lra":_2,åseral:_2,asker:_2,askim:_2,askoy:_2,"xn--asky-ira":_2,askøy:_2,askvoll:_2,asnes:_2,"xn--snes-poa":_2,åsnes:_2,audnedaln:_2,aukra:_2,aure:_2,aurland:_2,"aurskog-holand":_2,"xn--aurskog-hland-jnb":_2,"aurskog-høland":_2,austevoll:_2,austrheim:_2,averoy:_2,"xn--avery-yua":_2,averøy:_2,badaddja:_2,"xn--bdddj-mrabd":_2,bådåddjå:_2,"xn--brum-voa":_2,bærum:_2,bahcavuotna:_2,"xn--bhcavuotna-s4a":_2,báhcavuotna:_2,bahccavuotna:_2,"xn--bhccavuotna-k7a":_2,báhccavuotna:_2,baidar:_2,"xn--bidr-5nac":_2,báidár:_2,bajddar:_2,"xn--bjddar-pta":_2,bájddar:_2,balat:_2,"xn--blt-elab":_2,bálát:_2,balestrand:_2,ballangen:_2,balsfjord:_2,bamble:_2,bardu:_2,barum:_2,batsfjord:_2,"xn--btsfjord-9za":_2,båtsfjord:_2,bearalvahki:_2,"xn--bearalvhki-y4a":_2,bearalváhki:_2,beardu:_2,beiarn:_2,berg:_2,bergen:_2,berlevag:_2,"xn--berlevg-jxa":_2,berlevåg:_2,bievat:_2,"xn--bievt-0qa":_2,bievát:_2,bindal:_2,birkenes:_2,bjerkreim:_2,bjugn:_2,bodo:_2,"xn--bod-2na":_2,bodø:_2,bokn:_2,bomlo:_2,"xn--bmlo-gra":_2,bømlo:_2,bremanger:_2,bronnoy:_2,"xn--brnny-wuac":_2,brønnøy:_2,budejju:_2,buskerud:_65,bygland:_2,bykle:_2,cahcesuolo:_2,"xn--hcesuolo-7ya35b":_2,čáhcesuolo:_2,davvenjarga:_2,"xn--davvenjrga-y4a":_2,davvenjárga:_2,davvesiida:_2,deatnu:_2,dielddanuorri:_2,divtasvuodna:_2,divttasvuotna:_2,donna:_2,"xn--dnna-gra":_2,dønna:_2,dovre:_2,drammen:_2,drangedal:_2,dyroy:_2,"xn--dyry-ira":_2,dyrøy:_2,eid:_2,eidfjord:_2,eidsberg:_2,eidskog:_2,eidsvoll:_2,eigersund:_2,elverum:_2,enebakk:_2,engerdal:_2,etne:_2,etnedal:_2,evenassi:_2,"xn--eveni-0qa01ga":_2,evenášši:_2,evenes:_2,"evje-og-hornnes":_2,farsund:_2,fauske:_2,fedje:_2,fet:_2,finnoy:_2,"xn--finny-yua":_2,finnøy:_2,fitjar:_2,fjaler:_2,fjell:_2,fla:_2,"xn--fl-zia":_2,flå:_2,flakstad:_2,flatanger:_2,flekkefjord:_2,flesberg:_2,flora:_2,folldal:_2,forde:_2,"xn--frde-gra":_2,førde:_2,forsand:_2,fosnes:_2,"xn--frna-woa":_2,fræna:_2,frana:_2,frei:_2,frogn:_2,froland:_2,frosta:_2,froya:_2,"xn--frya-hra":_2,frøya:_2,fuoisku:_2,fuossko:_2,fusa:_2,fyresdal:_2,gaivuotna:_2,"xn--givuotna-8ya":_2,gáivuotna:_2,galsa:_2,"xn--gls-elac":_2,gálsá:_2,gamvik:_2,gangaviika:_2,"xn--ggaviika-8ya47h":_2,gáŋgaviika:_2,gaular:_2,gausdal:_2,giehtavuoatna:_2,gildeskal:_2,"xn--gildeskl-g0a":_2,gildeskål:_2,giske:_2,gjemnes:_2,gjerdrum:_2,gjerstad:_2,gjesdal:_2,gjovik:_2,"xn--gjvik-wua":_2,gjøvik:_2,gloppen:_2,gol:_2,gran:_2,grane:_2,granvin:_2,gratangen:_2,grimstad:_2,grong:_2,grue:_2,gulen:_2,guovdageaidnu:_2,ha:_2,"xn--h-2fa":_2,hå:_2,habmer:_2,"xn--hbmer-xqa":_2,hábmer:_2,hadsel:_2,"xn--hgebostad-g3a":_2,hægebostad:_2,hagebostad:_2,halden:_2,halsa:_2,hamar:_2,hamaroy:_2,hammarfeasta:_2,"xn--hmmrfeasta-s4ac":_2,hámmárfeasta:_2,hammerfest:_2,hapmir:_2,"xn--hpmir-xqa":_2,hápmir:_2,haram:_2,hareid:_2,harstad:_2,hasvik:_2,hattfjelldal:_2,haugesund:_2,hedmark:[0,{os:_2,valer:_2,"xn--vler-qoa":_2,våler:_2}],hemne:_2,hemnes:_2,hemsedal:_2,hitra:_2,hjartdal:_2,hjelmeland:_2,hobol:_2,"xn--hobl-ira":_2,hobøl:_2,hof:_2,hol:_2,hole:_2,holmestrand:_2,holtalen:_2,"xn--holtlen-hxa":_2,holtålen:_2,hordaland:[0,{os:_2}],hornindal:_2,horten:_2,hoyanger:_2,"xn--hyanger-q1a":_2,høyanger:_2,hoylandet:_2,"xn--hylandet-54a":_2,høylandet:_2,hurdal:_2,hurum:_2,hvaler:_2,hyllestad:_2,ibestad:_2,inderoy:_2,"xn--indery-fya":_2,inderøy:_2,iveland:_2,ivgu:_2,jevnaker:_2,jolster:_2,"xn--jlster-bya":_2,jølster:_2,jondal:_2,kafjord:_2,"xn--kfjord-iua":_2,kåfjord:_2,karasjohka:_2,"xn--krjohka-hwab49j":_2,kárášjohka:_2,karasjok:_2,karlsoy:_2,karmoy:_2,"xn--karmy-yua":_2,karmøy:_2,kautokeino:_2,klabu:_2,"xn--klbu-woa":_2,klæbu:_2,klepp:_2,kongsberg:_2,kongsvinger:_2,kraanghke:_2,"xn--kranghke-b0a":_2,kråanghke:_2,kragero:_2,"xn--krager-gya":_2,kragerø:_2,kristiansand:_2,kristiansund:_2,krodsherad:_2,"xn--krdsherad-m8a":_2,krødsherad:_2,"xn--kvfjord-nxa":_2,kvæfjord:_2,"xn--kvnangen-k0a":_2,kvænangen:_2,kvafjord:_2,kvalsund:_2,kvam:_2,kvanangen:_2,kvinesdal:_2,kvinnherad:_2,kviteseid:_2,kvitsoy:_2,"xn--kvitsy-fya":_2,kvitsøy:_2,laakesvuemie:_2,"xn--lrdal-sra":_2,lærdal:_2,lahppi:_2,"xn--lhppi-xqa":_2,láhppi:_2,lardal:_2,larvik:_2,lavagis:_2,lavangen:_2,leangaviika:_2,"xn--leagaviika-52b":_2,leaŋgaviika:_2,lebesby:_2,leikanger:_2,leirfjord:_2,leka:_2,leksvik:_2,lenvik:_2,lerdal:_2,lesja:_2,levanger:_2,lier:_2,lierne:_2,lillehammer:_2,lillesand:_2,lindas:_2,"xn--linds-pra":_2,lindås:_2,lindesnes:_2,loabat:_2,"xn--loabt-0qa":_2,loabát:_2,lodingen:_2,"xn--ldingen-q1a":_2,lødingen:_2,lom:_2,loppa:_2,lorenskog:_2,"xn--lrenskog-54a":_2,lørenskog:_2,loten:_2,"xn--lten-gra":_2,løten:_2,lund:_2,lunner:_2,luroy:_2,"xn--lury-ira":_2,lurøy:_2,luster:_2,lyngdal:_2,lyngen:_2,malatvuopmi:_2,"xn--mlatvuopmi-s4a":_2,málatvuopmi:_2,malselv:_2,"xn--mlselv-iua":_2,målselv:_2,malvik:_2,mandal:_2,marker:_2,marnardal:_2,masfjorden:_2,masoy:_2,"xn--msy-ula0h":_2,måsøy:_2,"matta-varjjat":_2,"xn--mtta-vrjjat-k7af":_2,"mátta-várjjat":_2,meland:_2,meldal:_2,melhus:_2,meloy:_2,"xn--mely-ira":_2,meløy:_2,meraker:_2,"xn--merker-kua":_2,meråker:_2,midsund:_2,"midtre-gauldal":_2,moareke:_2,"xn--moreke-jua":_2,moåreke:_2,modalen:_2,modum:_2,molde:_2,"more-og-romsdal":[0,{heroy:_2,sande:_2}],"xn--mre-og-romsdal-qqb":[0,{"xn--hery-ira":_2,sande:_2}],"møre-og-romsdal":[0,{herøy:_2,sande:_2}],moskenes:_2,moss:_2,muosat:_2,"xn--muost-0qa":_2,muosát:_2,naamesjevuemie:_2,"xn--nmesjevuemie-tcba":_2,nååmesjevuemie:_2,"xn--nry-yla5g":_2,nærøy:_2,namdalseid:_2,namsos:_2,namsskogan:_2,nannestad:_2,naroy:_2,narviika:_2,narvik:_2,naustdal:_2,navuotna:_2,"xn--nvuotna-hwa":_2,návuotna:_2,"nedre-eiker":_2,nesna:_2,nesodden:_2,nesseby:_2,nesset:_2,nissedal:_2,nittedal:_2,"nord-aurdal":_2,"nord-fron":_2,"nord-odal":_2,norddal:_2,nordkapp:_2,nordland:[0,{bo:_2,"xn--b-5ga":_2,bø:_2,heroy:_2,"xn--hery-ira":_2,herøy:_2}],"nordre-land":_2,nordreisa:_2,"nore-og-uvdal":_2,notodden:_2,notteroy:_2,"xn--nttery-byae":_2,nøtterøy:_2,odda:_2,oksnes:_2,"xn--ksnes-uua":_2,øksnes:_2,omasvuotna:_2,oppdal:_2,oppegard:_2,"xn--oppegrd-ixa":_2,oppegård:_2,orkdal:_2,orland:_2,"xn--rland-uua":_2,ørland:_2,orskog:_2,"xn--rskog-uua":_2,ørskog:_2,orsta:_2,"xn--rsta-fra":_2,ørsta:_2,osen:_2,osteroy:_2,"xn--ostery-fya":_2,osterøy:_2,ostfold:[0,{valer:_2}],"xn--stfold-9xa":[0,{"xn--vler-qoa":_2}],østfold:[0,{våler:_2}],"ostre-toten":_2,"xn--stre-toten-zcb":_2,"østre-toten":_2,overhalla:_2,"ovre-eiker":_2,"xn--vre-eiker-k8a":_2,"øvre-eiker":_2,oyer:_2,"xn--yer-zna":_2,øyer:_2,oygarden:_2,"xn--ygarden-p1a":_2,øygarden:_2,"oystre-slidre":_2,"xn--ystre-slidre-ujb":_2,"øystre-slidre":_2,porsanger:_2,porsangu:_2,"xn--porsgu-sta26f":_2,porsáŋgu:_2,porsgrunn:_2,rade:_2,"xn--rde-ula":_2,råde:_2,radoy:_2,"xn--rady-ira":_2,radøy:_2,"xn--rlingen-mxa":_2,rælingen:_2,rahkkeravju:_2,"xn--rhkkervju-01af":_2,ráhkkerávju:_2,raisa:_2,"xn--risa-5na":_2,ráisa:_2,rakkestad:_2,ralingen:_2,rana:_2,randaberg:_2,rauma:_2,rendalen:_2,rennebu:_2,rennesoy:_2,"xn--rennesy-v1a":_2,rennesøy:_2,rindal:_2,ringebu:_2,ringerike:_2,ringsaker:_2,risor:_2,"xn--risr-ira":_2,risør:_2,rissa:_2,roan:_2,rodoy:_2,"xn--rdy-0nab":_2,rødøy:_2,rollag:_2,romsa:_2,romskog:_2,"xn--rmskog-bya":_2,rømskog:_2,roros:_2,"xn--rros-gra":_2,røros:_2,rost:_2,"xn--rst-0na":_2,røst:_2,royken:_2,"xn--ryken-vua":_2,røyken:_2,royrvik:_2,"xn--ryrvik-bya":_2,røyrvik:_2,ruovat:_2,rygge:_2,salangen:_2,salat:_2,"xn--slat-5na":_2,sálat:_2,"xn--slt-elab":_2,sálát:_2,saltdal:_2,samnanger:_2,sandefjord:_2,sandnes:_2,sandoy:_2,"xn--sandy-yua":_2,sandøy:_2,sarpsborg:_2,sauda:_2,sauherad:_2,sel:_2,selbu:_2,selje:_2,seljord:_2,siellak:_2,sigdal:_2,siljan:_2,sirdal:_2,skanit:_2,"xn--sknit-yqa":_2,skánit:_2,skanland:_2,"xn--sknland-fxa":_2,skånland:_2,skaun:_2,skedsmo:_2,ski:_2,skien:_2,skierva:_2,"xn--skierv-uta":_2,skiervá:_2,skiptvet:_2,skjak:_2,"xn--skjk-soa":_2,skjåk:_2,skjervoy:_2,"xn--skjervy-v1a":_2,skjervøy:_2,skodje:_2,smola:_2,"xn--smla-hra":_2,smøla:_2,snaase:_2,"xn--snase-nra":_2,snåase:_2,snasa:_2,"xn--snsa-roa":_2,snåsa:_2,snillfjord:_2,snoasa:_2,sogndal:_2,sogne:_2,"xn--sgne-gra":_2,søgne:_2,sokndal:_2,sola:_2,solund:_2,somna:_2,"xn--smna-gra":_2,sømna:_2,"sondre-land":_2,"xn--sndre-land-0cb":_2,"søndre-land":_2,songdalen:_2,"sor-aurdal":_2,"xn--sr-aurdal-l8a":_2,"sør-aurdal":_2,"sor-fron":_2,"xn--sr-fron-q1a":_2,"sør-fron":_2,"sor-odal":_2,"xn--sr-odal-q1a":_2,"sør-odal":_2,"sor-varanger":_2,"xn--sr-varanger-ggb":_2,"sør-varanger":_2,sorfold:_2,"xn--srfold-bya":_2,sørfold:_2,sorreisa:_2,"xn--srreisa-q1a":_2,sørreisa:_2,sortland:_2,sorum:_2,"xn--srum-gra":_2,sørum:_2,spydeberg:_2,stange:_2,stavanger:_2,steigen:_2,steinkjer:_2,stjordal:_2,"xn--stjrdal-s1a":_2,stjørdal:_2,stokke:_2,"stor-elvdal":_2,stord:_2,stordal:_2,storfjord:_2,strand:_2,stranda:_2,stryn:_2,sula:_2,suldal:_2,sund:_2,sunndal:_2,surnadal:_2,sveio:_2,svelvik:_2,sykkylven:_2,tana:_2,telemark:[0,{bo:_2,"xn--b-5ga":_2,bø:_2}],time:_2,tingvoll:_2,tinn:_2,tjeldsund:_2,tjome:_2,"xn--tjme-hra":_2,tjøme:_2,tokke:_2,tolga:_2,tonsberg:_2,"xn--tnsberg-q1a":_2,tønsberg:_2,torsken:_2,"xn--trna-woa":_2,træna:_2,trana:_2,tranoy:_2,"xn--trany-yua":_2,tranøy:_2,troandin:_2,trogstad:_2,"xn--trgstad-r1a":_2,trøgstad:_2,tromsa:_2,tromso:_2,"xn--troms-zua":_2,tromsø:_2,trondheim:_2,trysil:_2,tvedestrand:_2,tydal:_2,tynset:_2,tysfjord:_2,tysnes:_2,"xn--tysvr-vra":_2,tysvær:_2,tysvar:_2,ullensaker:_2,ullensvang:_2,ulvik:_2,unjarga:_2,"xn--unjrga-rta":_2,unjárga:_2,utsira:_2,vaapste:_2,vadso:_2,"xn--vads-jra":_2,vadsø:_2,"xn--vry-yla5g":_2,værøy:_2,vaga:_2,"xn--vg-yiab":_2,vågå:_2,vagan:_2,"xn--vgan-qoa":_2,vågan:_2,vagsoy:_2,"xn--vgsy-qoa0j":_2,vågsøy:_2,vaksdal:_2,valle:_2,vang:_2,vanylven:_2,vardo:_2,"xn--vard-jra":_2,vardø:_2,varggat:_2,"xn--vrggt-xqad":_2,várggát:_2,varoy:_2,vefsn:_2,vega:_2,vegarshei:_2,"xn--vegrshei-c0a":_2,vegårshei:_2,vennesla:_2,verdal:_2,verran:_2,vestby:_2,vestfold:[0,{sande:_2}],vestnes:_2,"vestre-slidre":_2,"vestre-toten":_2,vestvagoy:_2,"xn--vestvgy-ixa6o":_2,vestvågøy:_2,vevelstad:_2,vik:_2,vikna:_2,vindafjord:_2,voagat:_2,volda:_2,voss:_2,co:_3,"123hjemmeside":_3,myspreadshop:_3}],np:_21,nr:_60,nu:[1,{merseine:_3,mine:_3,shacknet:_3,enterprisecloud:_3}],nz:[1,{ac:_2,co:_2,cri:_2,geek:_2,gen:_2,govt:_2,health:_2,iwi:_2,kiwi:_2,maori:_2,"xn--mori-qsa":_2,māori:_2,mil:_2,net:_2,org:_2,parliament:_2,school:_2,cloudns:_3}],om:[1,{co:_2,com:_2,edu:_2,gov:_2,med:_2,museum:_2,net:_2,org:_2,pro:_2}],onion:_2,org:[1,{altervista:_3,pimienta:_3,poivron:_3,potager:_3,sweetpepper:_3,cdn77:[0,{c:_3,rsc:_3}],"cdn77-secure":[0,{origin:[0,{ssl:_3}]}],ae:_3,cloudns:_3,"ip-dynamic":_3,ddnss:_3,dpdns:_3,duckdns:_3,tunk:_3,blogdns:_3,blogsite:_3,boldlygoingnowhere:_3,dnsalias:_3,dnsdojo:_3,doesntexist:_3,dontexist:_3,doomdns:_3,dvrdns:_3,dynalias:_3,dyndns:[2,{go:_3,home:_3}],endofinternet:_3,endoftheinternet:_3,"from-me":_3,"game-host":_3,gotdns:_3,"hobby-site":_3,homedns:_3,homeftp:_3,homelinux:_3,homeunix:_3,"is-a-bruinsfan":_3,"is-a-candidate":_3,"is-a-celticsfan":_3,"is-a-chef":_3,"is-a-geek":_3,"is-a-knight":_3,"is-a-linux-user":_3,"is-a-patsfan":_3,"is-a-soxfan":_3,"is-found":_3,"is-lost":_3,"is-saved":_3,"is-very-bad":_3,"is-very-evil":_3,"is-very-good":_3,"is-very-nice":_3,"is-very-sweet":_3,"isa-geek":_3,"kicks-ass":_3,misconfused:_3,podzone:_3,readmyblog:_3,selfip:_3,sellsyourhome:_3,servebbs:_3,serveftp:_3,servegame:_3,"stuff-4-sale":_3,webhop:_3,accesscam:_3,camdvr:_3,freeddns:_3,mywire:_3,webredirect:_3,twmail:_3,eu:[2,{al:_3,asso:_3,at:_3,au:_3,be:_3,bg:_3,ca:_3,cd:_3,ch:_3,cn:_3,cy:_3,cz:_3,de:_3,dk:_3,edu:_3,ee:_3,es:_3,fi:_3,fr:_3,gr:_3,hr:_3,hu:_3,ie:_3,il:_3,in:_3,int:_3,is:_3,it:_3,jp:_3,kr:_3,lt:_3,lu:_3,lv:_3,me:_3,mk:_3,mt:_3,my:_3,net:_3,ng:_3,nl:_3,no:_3,nz:_3,pl:_3,pt:_3,ro:_3,ru:_3,se:_3,si:_3,sk:_3,tr:_3,uk:_3,us:_3}],fedorainfracloud:_3,fedorapeople:_3,fedoraproject:[0,{cloud:_3,os:_45,stg:[0,{os:_45}]}],freedesktop:_3,hatenadiary:_3,hepforge:_3,"in-dsl":_3,"in-vpn":_3,js:_3,barsy:_3,mayfirst:_3,routingthecloud:_3,bmoattachments:_3,"cable-modem":_3,collegefan:_3,couchpotatofries:_3,hopto:_3,mlbfan:_3,myftp:_3,mysecuritycamera:_3,nflfan:_3,"no-ip":_3,"read-books":_3,ufcfan:_3,zapto:_3,dynserv:_3,"now-dns":_3,"is-local":_3,httpbin:_3,pubtls:_3,jpn:_3,"my-firewall":_3,myfirewall:_3,spdns:_3,"small-web":_3,dsmynas:_3,familyds:_3,teckids:_59,tuxfamily:_3,hk:_3,us:_3,toolforge:_3,wmcloud:[2,{beta:_3}],wmflabs:_3,za:_3}],pa:[1,{abo:_2,ac:_2,com:_2,edu:_2,gob:_2,ing:_2,med:_2,net:_2,nom:_2,org:_2,sld:_2}],pe:[1,{com:_2,edu:_2,gob:_2,mil:_2,net:_2,nom:_2,org:_2}],pf:[1,{com:_2,edu:_2,org:_2}],pg:_21,ph:[1,{com:_2,edu:_2,gov:_2,i:_2,mil:_2,net:_2,ngo:_2,org:_2,cloudns:_3}],pk:[1,{ac:_2,biz:_2,com:_2,edu:_2,fam:_2,gkp:_2,gob:_2,gog:_2,gok:_2,gop:_2,gos:_2,gov:_2,net:_2,org:_2,web:_2}],pl:[1,{com:_2,net:_2,org:_2,agro:_2,aid:_2,atm:_2,auto:_2,biz:_2,edu:_2,gmina:_2,gsm:_2,info:_2,mail:_2,media:_2,miasta:_2,mil:_2,nieruchomosci:_2,nom:_2,pc:_2,powiat:_2,priv:_2,realestate:_2,rel:_2,sex:_2,shop:_2,sklep:_2,sos:_2,szkola:_2,targi:_2,tm:_2,tourism:_2,travel:_2,turystyka:_2,gov:[1,{ap:_2,griw:_2,ic:_2,is:_2,kmpsp:_2,konsulat:_2,kppsp:_2,kwp:_2,kwpsp:_2,mup:_2,mw:_2,oia:_2,oirm:_2,oke:_2,oow:_2,oschr:_2,oum:_2,pa:_2,pinb:_2,piw:_2,po:_2,pr:_2,psp:_2,psse:_2,pup:_2,rzgw:_2,sa:_2,sdn:_2,sko:_2,so:_2,sr:_2,starostwo:_2,ug:_2,ugim:_2,um:_2,umig:_2,upow:_2,uppo:_2,us:_2,uw:_2,uzs:_2,wif:_2,wiih:_2,winb:_2,wios:_2,witd:_2,wiw:_2,wkz:_2,wsa:_2,wskr:_2,wsse:_2,wuoz:_2,wzmiuw:_2,zp:_2,zpisdn:_2}],augustow:_2,"babia-gora":_2,bedzin:_2,beskidy:_2,bialowieza:_2,bialystok:_2,bielawa:_2,bieszczady:_2,boleslawiec:_2,bydgoszcz:_2,bytom:_2,cieszyn:_2,czeladz:_2,czest:_2,dlugoleka:_2,elblag:_2,elk:_2,glogow:_2,gniezno:_2,gorlice:_2,grajewo:_2,ilawa:_2,jaworzno:_2,"jelenia-gora":_2,jgora:_2,kalisz:_2,karpacz:_2,kartuzy:_2,kaszuby:_2,katowice:_2,"kazimierz-dolny":_2,kepno:_2,ketrzyn:_2,klodzko:_2,kobierzyce:_2,kolobrzeg:_2,konin:_2,konskowola:_2,kutno:_2,lapy:_2,lebork:_2,legnica:_2,lezajsk:_2,limanowa:_2,lomza:_2,lowicz:_2,lubin:_2,lukow:_2,malbork:_2,malopolska:_2,mazowsze:_2,mazury:_2,mielec:_2,mielno:_2,mragowo:_2,naklo:_2,nowaruda:_2,nysa:_2,olawa:_2,olecko:_2,olkusz:_2,olsztyn:_2,opoczno:_2,opole:_2,ostroda:_2,ostroleka:_2,ostrowiec:_2,ostrowwlkp:_2,pila:_2,pisz:_2,podhale:_2,podlasie:_2,polkowice:_2,pomorskie:_2,pomorze:_2,prochowice:_2,pruszkow:_2,przeworsk:_2,pulawy:_2,radom:_2,"rawa-maz":_2,rybnik:_2,rzeszow:_2,sanok:_2,sejny:_2,skoczow:_2,slask:_2,slupsk:_2,sosnowiec:_2,"stalowa-wola":_2,starachowice:_2,stargard:_2,suwalki:_2,swidnica:_2,swiebodzin:_2,swinoujscie:_2,szczecin:_2,szczytno:_2,tarnobrzeg:_2,tgory:_2,turek:_2,tychy:_2,ustka:_2,walbrzych:_2,warmia:_2,warszawa:_2,waw:_2,wegrow:_2,wielun:_2,wlocl:_2,wloclawek:_2,wodzislaw:_2,wolomin:_2,wroclaw:_2,zachpomor:_2,zagan:_2,zarow:_2,zgora:_2,zgorzelec:_2,art:_3,gliwice:_3,krakow:_3,poznan:_3,wroc:_3,zakopane:_3,beep:_3,"ecommerce-shop":_3,cfolks:_3,dfirma:_3,dkonto:_3,you2:_3,shoparena:_3,homesklep:_3,sdscloud:_3,unicloud:_3,lodz:_3,pabianice:_3,plock:_3,sieradz:_3,skierniewice:_3,zgierz:_3,krasnik:_3,leczna:_3,lubartow:_3,lublin:_3,poniatowa:_3,swidnik:_3,co:_3,torun:_3,simplesite:_3,myspreadshop:_3,gda:_3,gdansk:_3,gdynia:_3,med:_3,sopot:_3,bielsko:_3}],pm:[1,{own:_3,name:_3}],pn:[1,{co:_2,edu:_2,gov:_2,net:_2,org:_2}],post:_2,pr:[1,{biz:_2,com:_2,edu:_2,gov:_2,info:_2,isla:_2,name:_2,net:_2,org:_2,pro:_2,ac:_2,est:_2,prof:_2}],pro:[1,{aaa:_2,aca:_2,acct:_2,avocat:_2,bar:_2,cpa:_2,eng:_2,jur:_2,law:_2,med:_2,recht:_2,"12chars":_3,cloudns:_3,keenetic:_3,barsy:_3,ngrok:_3}],ps:[1,{com:_2,edu:_2,gov:_2,net:_2,org:_2,plo:_2,sec:_2}],pt:[1,{com:_2,edu:_2,gov:_2,int:_2,net:_2,nome:_2,org:_2,publ:_2,"123paginaweb":_3}],pw:[1,{gov:_2,cloudns:_3,x443:_3}],py:[1,{com:_2,coop:_2,edu:_2,gov:_2,mil:_2,net:_2,org:_2}],qa:[1,{com:_2,edu:_2,gov:_2,mil:_2,name:_2,net:_2,org:_2,sch:_2}],re:[1,{asso:_2,com:_2,netlib:_3,can:_3}],ro:[1,{arts:_2,com:_2,firm:_2,info:_2,nom:_2,nt:_2,org:_2,rec:_2,store:_2,tm:_2,www:_2,co:_3,shop:_3,barsy:_3}],rs:[1,{ac:_2,co:_2,edu:_2,gov:_2,in:_2,org:_2,brendly:_20,barsy:_3,ox:_3}],ru:[1,{ac:_3,edu:_3,gov:_3,int:_3,mil:_3,eurodir:_3,adygeya:_3,bashkiria:_3,bir:_3,cbg:_3,com:_3,dagestan:_3,grozny:_3,kalmykia:_3,kustanai:_3,marine:_3,mordovia:_3,msk:_3,mytis:_3,nalchik:_3,nov:_3,pyatigorsk:_3,spb:_3,vladikavkaz:_3,vladimir:_3,na4u:_3,mircloud:_3,myjino:[2,{hosting:_6,landing:_6,spectrum:_6,vps:_6}],cldmail:[0,{hb:_3}],mcdir:[2,{vps:_3}],mcpre:_3,net:_3,org:_3,pp:_3,ras:_3}],rw:[1,{ac:_2,co:_2,coop:_2,gov:_2,mil:_2,net:_2,org:_2}],sa:[1,{com:_2,edu:_2,gov:_2,med:_2,net:_2,org:_2,pub:_2,sch:_2}],sb:_4,sc:_4,sd:[1,{com:_2,edu:_2,gov:_2,info:_2,med:_2,net:_2,org:_2,tv:_2}],se:[1,{a:_2,ac:_2,b:_2,bd:_2,brand:_2,c:_2,d:_2,e:_2,f:_2,fh:_2,fhsk:_2,fhv:_2,g:_2,h:_2,i:_2,k:_2,komforb:_2,kommunalforbund:_2,komvux:_2,l:_2,lanbib:_2,m:_2,n:_2,naturbruksgymn:_2,o:_2,org:_2,p:_2,parti:_2,pp:_2,press:_2,r:_2,s:_2,t:_2,tm:_2,u:_2,w:_2,x:_2,y:_2,z:_2,com:_3,iopsys:_3,"123minsida":_3,itcouldbewor:_3,myspreadshop:_3}],sg:[1,{com:_2,edu:_2,gov:_2,net:_2,org:_2,enscaled:_3}],sh:[1,{com:_2,gov:_2,mil:_2,net:_2,org:_2,hashbang:_3,botda:_3,lovable:_3,platform:[0,{ent:_3,eu:_3,us:_3}],teleport:_3,now:_3}],si:[1,{f5:_3,gitapp:_3,gitpage:_3}],sj:_2,sk:[1,{org:_2}],sl:_4,sm:_2,sn:[1,{art:_2,com:_2,edu:_2,gouv:_2,org:_2,univ:_2}],so:[1,{com:_2,edu:_2,gov:_2,me:_2,net:_2,org:_2,surveys:_3}],sr:_2,ss:[1,{biz:_2,co:_2,com:_2,edu:_2,gov:_2,me:_2,net:_2,org:_2,sch:_2}],st:[1,{co:_2,com:_2,consulado:_2,edu:_2,embaixada:_2,mil:_2,net:_2,org:_2,principe:_2,saotome:_2,store:_2,helioho:_3,cn:_6,kirara:_3,noho:_3}],su:[1,{abkhazia:_3,adygeya:_3,aktyubinsk:_3,arkhangelsk:_3,armenia:_3,ashgabad:_3,azerbaijan:_3,balashov:_3,bashkiria:_3,bryansk:_3,bukhara:_3,chimkent:_3,dagestan:_3,"east-kazakhstan":_3,exnet:_3,georgia:_3,grozny:_3,ivanovo:_3,jambyl:_3,kalmykia:_3,kaluga:_3,karacol:_3,karaganda:_3,karelia:_3,khakassia:_3,krasnodar:_3,kurgan:_3,kustanai:_3,lenug:_3,mangyshlak:_3,mordovia:_3,msk:_3,murmansk:_3,nalchik:_3,navoi:_3,"north-kazakhstan":_3,nov:_3,obninsk:_3,penza:_3,pokrovsk:_3,sochi:_3,spb:_3,tashkent:_3,termez:_3,togliatti:_3,troitsk:_3,tselinograd:_3,tula:_3,tuva:_3,vladikavkaz:_3,vladimir:_3,vologda:_3}],sv:[1,{com:_2,edu:_2,gob:_2,org:_2,red:_2}],sx:_10,sy:_5,sz:[1,{ac:_2,co:_2,org:_2}],tc:_2,td:_2,tel:_2,tf:[1,{sch:_3}],tg:_2,th:[1,{ac:_2,co:_2,go:_2,in:_2,mi:_2,net:_2,or:_2,online:_3,shop:_3}],tj:[1,{ac:_2,biz:_2,co:_2,com:_2,edu:_2,go:_2,gov:_2,int:_2,mil:_2,name:_2,net:_2,nic:_2,org:_2,test:_2,web:_2}],tk:_2,tl:_10,tm:[1,{co:_2,com:_2,edu:_2,gov:_2,mil:_2,net:_2,nom:_2,org:_2}],tn:[1,{com:_2,ens:_2,fin:_2,gov:_2,ind:_2,info:_2,intl:_2,mincom:_2,nat:_2,net:_2,org:_2,perso:_2,tourism:_2,orangecloud:_3}],to:[1,{611:_3,com:_2,edu:_2,gov:_2,mil:_2,net:_2,org:_2,oya:_3,x0:_3,quickconnect:_28,vpnplus:_3,nett:_3}],tr:[1,{av:_2,bbs:_2,bel:_2,biz:_2,com:_2,dr:_2,edu:_2,gen:_2,gov:_2,info:_2,k12:_2,kep:_2,mil:_2,name:_2,net:_2,org:_2,pol:_2,tel:_2,tsk:_2,tv:_2,web:_2,nc:_10}],tt:[1,{biz:_2,co:_2,com:_2,edu:_2,gov:_2,info:_2,mil:_2,name:_2,net:_2,org:_2,pro:_2}],tv:[1,{"better-than":_3,dyndns:_3,"on-the-web":_3,"worse-than":_3,from:_3,sakura:_3}],tw:[1,{club:_2,com:[1,{mymailer:_3}],ebiz:_2,edu:_2,game:_2,gov:_2,idv:_2,mil:_2,net:_2,org:_2,url:_3,mydns:_3}],tz:[1,{ac:_2,co:_2,go:_2,hotel:_2,info:_2,me:_2,mil:_2,mobi:_2,ne:_2,or:_2,sc:_2,tv:_2}],ua:[1,{com:_2,edu:_2,gov:_2,in:_2,net:_2,org:_2,cherkassy:_2,cherkasy:_2,chernigov:_2,chernihiv:_2,chernivtsi:_2,chernovtsy:_2,ck:_2,cn:_2,cr:_2,crimea:_2,cv:_2,dn:_2,dnepropetrovsk:_2,dnipropetrovsk:_2,donetsk:_2,dp:_2,if:_2,"ivano-frankivsk":_2,kh:_2,kharkiv:_2,kharkov:_2,kherson:_2,khmelnitskiy:_2,khmelnytskyi:_2,kiev:_2,kirovograd:_2,km:_2,kr:_2,kropyvnytskyi:_2,krym:_2,ks:_2,kv:_2,kyiv:_2,lg:_2,lt:_2,lugansk:_2,luhansk:_2,lutsk:_2,lv:_2,lviv:_2,mk:_2,mykolaiv:_2,nikolaev:_2,od:_2,odesa:_2,odessa:_2,pl:_2,poltava:_2,rivne:_2,rovno:_2,rv:_2,sb:_2,sebastopol:_2,sevastopol:_2,sm:_2,sumy:_2,te:_2,ternopil:_2,uz:_2,uzhgorod:_2,uzhhorod:_2,vinnica:_2,vinnytsia:_2,vn:_2,volyn:_2,yalta:_2,zakarpattia:_2,zaporizhzhe:_2,zaporizhzhia:_2,zhitomir:_2,zhytomyr:_2,zp:_2,zt:_2,cc:_3,inf:_3,ltd:_3,cx:_3,biz:_3,co:_3,pp:_3,v:_3}],ug:[1,{ac:_2,co:_2,com:_2,edu:_2,go:_2,gov:_2,mil:_2,ne:_2,or:_2,org:_2,sc:_2,us:_2}],uk:[1,{ac:_2,co:[1,{bytemark:[0,{dh:_3,vm:_3}],layershift:_48,barsy:_3,barsyonline:_3,retrosnub:_58,"nh-serv":_3,"no-ip":_3,adimo:_3,myspreadshop:_3}],gov:[1,{api:_3,campaign:_3,service:_3}],ltd:_2,me:_2,net:_2,nhs:_2,org:[1,{glug:_3,lug:_3,lugs:_3,affinitylottery:_3,raffleentry:_3,weeklylottery:_3}],plc:_2,police:_2,sch:_21,conn:_3,copro:_3,hosp:_3,"independent-commission":_3,"independent-inquest":_3,"independent-inquiry":_3,"independent-panel":_3,"independent-review":_3,"public-inquiry":_3,"royal-commission":_3,pymnt:_3,barsy:_3,nimsite:_3,oraclegovcloudapps:_6}],us:[1,{dni:_2,isa:_2,nsn:_2,ak:_66,al:_66,ar:_66,as:_66,az:_66,ca:_66,co:_66,ct:_66,dc:_66,de:_67,fl:_66,ga:_66,gu:_66,hi:_68,ia:_66,id:_66,il:_66,in:_66,ks:_66,ky:_66,la:_66,ma:[1,{k12:[1,{chtr:_2,paroch:_2,pvt:_2}],cc:_2,lib:_2}],md:_66,me:_66,mi:[1,{k12:_2,cc:_2,lib:_2,"ann-arbor":_2,cog:_2,dst:_2,eaton:_2,gen:_2,mus:_2,tec:_2,washtenaw:_2}],mn:_66,mo:_66,ms:[1,{k12:_2,cc:_2}],mt:_66,nc:_66,nd:_68,ne:_66,nh:_66,nj:_66,nm:_66,nv:_66,ny:_66,oh:_66,ok:_66,or:_66,pa:_66,pr:_66,ri:_68,sc:_66,sd:_68,tn:_66,tx:_66,ut:_66,va:_66,vi:_66,vt:_66,wa:_66,wi:_66,wv:_67,wy:_66,cloudns:_3,"is-by":_3,"land-4-sale":_3,"stuff-4-sale":_3,heliohost:_3,enscaled:[0,{phx:_3}],mircloud:_3,"azure-api":_3,azurewebsites:_3,ngo:_3,golffan:_3,noip:_3,pointto:_3,freeddns:_3,srv:[2,{gh:_3,gl:_3}],servername:_3}],uy:[1,{com:_2,edu:_2,gub:_2,mil:_2,net:_2,org:_2,gv:_3}],uz:[1,{co:_2,com:_2,net:_2,org:_2}],va:_2,vc:[1,{com:_2,edu:_2,gov:_2,mil:_2,net:_2,org:_2,gv:[2,{d:_3}],"0e":_6,mydns:_3}],ve:[1,{arts:_2,bib:_2,co:_2,com:_2,e12:_2,edu:_2,emprende:_2,firm:_2,gob:_2,gov:_2,ia:_2,info:_2,int:_2,mil:_2,net:_2,nom:_2,org:_2,rar:_2,rec:_2,store:_2,tec:_2,web:_2}],vg:[1,{edu:_2}],vi:[1,{co:_2,com:_2,k12:_2,net:_2,org:_2}],vn:[1,{ac:_2,ai:_2,biz:_2,com:_2,edu:_2,gov:_2,health:_2,id:_2,info:_2,int:_2,io:_2,name:_2,net:_2,org:_2,pro:_2,angiang:_2,bacgiang:_2,backan:_2,baclieu:_2,bacninh:_2,"baria-vungtau":_2,bentre:_2,binhdinh:_2,binhduong:_2,binhphuoc:_2,binhthuan:_2,camau:_2,cantho:_2,caobang:_2,daklak:_2,daknong:_2,danang:_2,dienbien:_2,dongnai:_2,dongthap:_2,gialai:_2,hagiang:_2,haiduong:_2,haiphong:_2,hanam:_2,hanoi:_2,hatinh:_2,haugiang:_2,hoabinh:_2,hungyen:_2,khanhhoa:_2,kiengiang:_2,kontum:_2,laichau:_2,lamdong:_2,langson:_2,laocai:_2,longan:_2,namdinh:_2,nghean:_2,ninhbinh:_2,ninhthuan:_2,phutho:_2,phuyen:_2,quangbinh:_2,quangnam:_2,quangngai:_2,quangninh:_2,quangtri:_2,soctrang:_2,sonla:_2,tayninh:_2,thaibinh:_2,thainguyen:_2,thanhhoa:_2,thanhphohochiminh:_2,thuathienhue:_2,tiengiang:_2,travinh:_2,tuyenquang:_2,vinhlong:_2,vinhphuc:_2,yenbai:_2}],vu:_47,wf:[1,{biz:_3,sch:_3}],ws:[1,{com:_2,edu:_2,gov:_2,net:_2,org:_2,advisor:_6,cloud66:_3,dyndns:_3,mypets:_3}],yt:[1,{org:_3}],"xn--mgbaam7a8h":_2,امارات:_2,"xn--y9a3aq":_2,հայ:_2,"xn--54b7fta0cc":_2,বাংলা:_2,"xn--90ae":_2,бг:_2,"xn--mgbcpq6gpa1a":_2,البحرين:_2,"xn--90ais":_2,бел:_2,"xn--fiqs8s":_2,中国:_2,"xn--fiqz9s":_2,中國:_2,"xn--lgbbat1ad8j":_2,الجزائر:_2,"xn--wgbh1c":_2,مصر:_2,"xn--e1a4c":_2,ею:_2,"xn--qxa6a":_2,ευ:_2,"xn--mgbah1a3hjkrd":_2,موريتانيا:_2,"xn--node":_2,გე:_2,"xn--qxam":_2,ελ:_2,"xn--j6w193g":[1,{"xn--gmqw5a":_2,"xn--55qx5d":_2,"xn--mxtq1m":_2,"xn--wcvs22d":_2,"xn--uc0atv":_2,"xn--od0alg":_2}],香港:[1,{個人:_2,公司:_2,政府:_2,教育:_2,組織:_2,網絡:_2}],"xn--2scrj9c":_2,ಭಾರತ:_2,"xn--3hcrj9c":_2,ଭାରତ:_2,"xn--45br5cyl":_2,ভাৰত:_2,"xn--h2breg3eve":_2,भारतम्:_2,"xn--h2brj9c8c":_2,भारोत:_2,"xn--mgbgu82a":_2,ڀارت:_2,"xn--rvc1e0am3e":_2,ഭാരതം:_2,"xn--h2brj9c":_2,भारत:_2,"xn--mgbbh1a":_2,بارت:_2,"xn--mgbbh1a71e":_2,بھارت:_2,"xn--fpcrj9c3d":_2,భారత్:_2,"xn--gecrj9c":_2,ભારત:_2,"xn--s9brj9c":_2,ਭਾਰਤ:_2,"xn--45brj9c":_2,ভারত:_2,"xn--xkc2dl3a5ee0h":_2,இந்தியா:_2,"xn--mgba3a4f16a":_2,ایران:_2,"xn--mgba3a4fra":_2,ايران:_2,"xn--mgbtx2b":_2,عراق:_2,"xn--mgbayh7gpa":_2,الاردن:_2,"xn--3e0b707e":_2,한국:_2,"xn--80ao21a":_2,қаз:_2,"xn--q7ce6a":_2,ລາວ:_2,"xn--fzc2c9e2c":_2,ලංකා:_2,"xn--xkc2al3hye2a":_2,இலங்கை:_2,"xn--mgbc0a9azcg":_2,المغرب:_2,"xn--d1alf":_2,мкд:_2,"xn--l1acc":_2,мон:_2,"xn--mix891f":_2,澳門:_2,"xn--mix082f":_2,澳门:_2,"xn--mgbx4cd0ab":_2,مليسيا:_2,"xn--mgb9awbf":_2,عمان:_2,"xn--mgbai9azgqp6j":_2,پاکستان:_2,"xn--mgbai9a5eva00b":_2,پاكستان:_2,"xn--ygbi2ammx":_2,فلسطين:_2,"xn--90a3ac":[1,{"xn--80au":_2,"xn--90azh":_2,"xn--d1at":_2,"xn--c1avg":_2,"xn--o1ac":_2,"xn--o1ach":_2}],срб:[1,{ак:_2,обр:_2,од:_2,орг:_2,пр:_2,упр:_2}],"xn--p1ai":_2,рф:_2,"xn--wgbl6a":_2,قطر:_2,"xn--mgberp4a5d4ar":_2,السعودية:_2,"xn--mgberp4a5d4a87g":_2,السعودیة:_2,"xn--mgbqly7c0a67fbc":_2,السعودیۃ:_2,"xn--mgbqly7cvafr":_2,السعوديه:_2,"xn--mgbpl2fh":_2,سودان:_2,"xn--yfro4i67o":_2,新加坡:_2,"xn--clchc0ea0b2g2a9gcd":_2,சிங்கப்பூர்:_2,"xn--ogbpf8fl":_2,سورية:_2,"xn--mgbtf8fl":_2,سوريا:_2,"xn--o3cw4h":[1,{"xn--o3cyx2a":_2,"xn--12co0c3b4eva":_2,"xn--m3ch0j3a":_2,"xn--h3cuzk1di":_2,"xn--12c1fe0br":_2,"xn--12cfi8ixb8l":_2}],ไทย:[1,{ทหาร:_2,ธุรกิจ:_2,เน็ต:_2,รัฐบาล:_2,ศึกษา:_2,องค์กร:_2}],"xn--pgbs0dh":_2,تونس:_2,"xn--kpry57d":_2,台灣:_2,"xn--kprw13d":_2,台湾:_2,"xn--nnx388a":_2,臺灣:_2,"xn--j1amh":_2,укр:_2,"xn--mgb2ddes":_2,اليمن:_2,xxx:_2,ye:_5,za:[0,{ac:_2,agric:_2,alt:_2,co:_2,edu:_2,gov:_2,grondar:_2,law:_2,mil:_2,net:_2,ngo:_2,nic:_2,nis:_2,nom:_2,org:_2,school:_2,tm:_2,web:_2}],zm:[1,{ac:_2,biz:_2,co:_2,com:_2,edu:_2,gov:_2,info:_2,mil:_2,net:_2,org:_2,sch:_2}],zw:[1,{ac:_2,co:_2,gov:_2,mil:_2,org:_2}],aaa:_2,aarp:_2,abb:_2,abbott:_2,abbvie:_2,abc:_2,able:_2,abogado:_2,abudhabi:_2,academy:[1,{official:_3}],accenture:_2,accountant:_2,accountants:_2,aco:_2,actor:_2,ads:_2,adult:_2,aeg:_2,aetna:_2,afl:_2,africa:_2,agakhan:_2,agency:_2,aig:_2,airbus:_2,airforce:_2,airtel:_2,akdn:_2,alibaba:_2,alipay:_2,allfinanz:_2,allstate:_2,ally:_2,alsace:_2,alstom:_2,amazon:_2,americanexpress:_2,americanfamily:_2,amex:_2,amfam:_2,amica:_2,amsterdam:_2,analytics:_2,android:_2,anquan:_2,anz:_2,aol:_2,apartments:_2,app:[1,{adaptable:_3,aiven:_3,beget:_6,brave:_7,clerk:_3,clerkstage:_3,cloudflare:_3,wnext:_3,csb:[2,{preview:_3}],convex:_3,corespeed:_3,deta:_3,ondigitalocean:_3,easypanel:_3,encr:[2,{frontend:_3}],evervault:_8,expo:[2,{staging:_3}],edgecompute:_3,"on-fleek":_3,flutterflow:_3,sprites:_3,e2b:_3,framer:_3,gadget:_3,github:_3,hosted:_6,run:[0,{"*":_3,mtls:_6}],web:_3,hackclub:_3,hasura:_3,onhercules:_3,botdash:_3,shiptoday:_3,leapcell:_3,loginline:_3,lovable:_3,luyani:_3,magicpatterns:_3,medusajs:_3,messerli:_3,miren:_3,mocha:_3,netlify:_3,ngrok:_3,"ngrok-free":_3,developer:_6,noop:_3,northflank:_6,upsun:_6,railway:[0,{up:_3}],replit:_9,nyat:_3,snowflake:[0,{"*":_3,privatelink:_6}],streamlit:_3,spawnbase:_3,telebit:_3,typedream:_3,vercel:_3,wal:_3,wasmer:_3,bookonline:_3,windsurf:_3,base44:_3,zeabur:_3,zerops:_6}],apple:[1,{int:[2,{cloud:[0,{"*":_3,r:[0,{"*":_3,"ap-north-1":_6,"ap-south-1":_6,"ap-south-2":_6,"eu-central-1":_6,"eu-north-1":_6,"us-central-1":_6,"us-central-2":_6,"us-east-1":_6,"us-east-2":_6,"us-west-1":_6,"us-west-2":_6,"us-west-3":_6}]}]}]}],aquarelle:_2,arab:_2,aramco:_2,archi:_2,army:_2,art:_2,arte:_2,asda:_2,associates:_2,athleta:_2,attorney:_2,auction:_2,audi:_2,audible:_2,audio:_2,auspost:_2,author:_2,auto:_2,autos:_2,aws:[1,{on:[0,{"af-south-1":_11,"ap-east-1":_11,"ap-northeast-1":_11,"ap-northeast-2":_11,"ap-northeast-3":_11,"ap-south-1":_11,"ap-south-2":_12,"ap-southeast-1":_11,"ap-southeast-2":_11,"ap-southeast-3":_11,"ap-southeast-4":_12,"ap-southeast-5":_12,"ca-central-1":_11,"ca-west-1":_12,"eu-central-1":_11,"eu-central-2":_12,"eu-north-1":_11,"eu-south-1":_11,"eu-south-2":_12,"eu-west-1":_11,"eu-west-2":_11,"eu-west-3":_11,"il-central-1":_12,"me-central-1":_12,"me-south-1":_11,"sa-east-1":_11,"us-east-1":_11,"us-east-2":_11,"us-west-1":_11,"us-west-2":_11,"ap-southeast-7":_13,"mx-central-1":_13,"us-gov-east-1":_14,"us-gov-west-1":_14}],sagemaker:[0,{"ap-northeast-1":_16,"ap-northeast-2":_16,"ap-south-1":_16,"ap-southeast-1":_16,"ap-southeast-2":_16,"ca-central-1":_18,"eu-central-1":_16,"eu-west-1":_16,"eu-west-2":_16,"us-east-1":_18,"us-east-2":_18,"us-west-2":_18,"af-south-1":_15,"ap-east-1":_15,"ap-northeast-3":_15,"ap-south-2":_17,"ap-southeast-3":_15,"ap-southeast-4":_17,"ca-west-1":[0,{notebook:_3,"notebook-fips":_3}],"eu-central-2":_15,"eu-north-1":_15,"eu-south-1":_15,"eu-south-2":_15,"eu-west-3":_15,"il-central-1":_15,"me-central-1":_15,"me-south-1":_15,"sa-east-1":_15,"us-gov-east-1":_19,"us-gov-west-1":_19,"us-west-1":[0,{notebook:_3,"notebook-fips":_3,studio:_3}],experiments:_6}],repost:[0,{private:_6}]}],axa:_2,azure:_2,baby:_2,baidu:_2,banamex:_2,band:_2,bank:_2,bar:_2,barcelona:_2,barclaycard:_2,barclays:_2,barefoot:_2,bargains:_2,baseball:_2,basketball:[1,{aus:_3,nz:_3}],bauhaus:_2,bayern:_2,bbc:_2,bbt:_2,bbva:_2,bcg:_2,bcn:_2,beats:_2,beauty:_2,beer:_2,berlin:_2,best:_2,bestbuy:_2,bet:_2,bharti:_2,bible:_2,bid:_2,bike:_2,bing:_2,bingo:_2,bio:_2,black:_2,blackfriday:_2,blockbuster:_2,blog:_2,bloomberg:_2,blue:_2,bms:_2,bmw:_2,bnpparibas:_2,boats:_2,boehringer:_2,bofa:_2,bom:_2,bond:_2,boo:_2,book:_2,booking:_2,bosch:_2,bostik:_2,boston:_2,bot:_2,boutique:_2,box:_2,bradesco:_2,bridgestone:_2,broadway:_2,broker:_2,brother:_2,brussels:_2,build:[1,{shiptoday:_3,v0:_3,windsurf:_3}],builders:[1,{cloudsite:_3}],business:_22,buy:_2,buzz:_2,bzh:_2,cab:_2,cafe:_2,cal:_2,call:_2,calvinklein:_2,cam:_2,camera:_2,camp:[1,{emf:[0,{at:_3}]}],canon:_2,capetown:_2,capital:_2,capitalone:_2,car:_2,caravan:_2,cards:_2,care:_2,career:_2,careers:_2,cars:_2,casa:[1,{nabu:[0,{ui:_3}]}],case:[1,{sav:_3}],cash:_2,casino:_2,catering:_2,catholic:_2,cba:_2,cbn:_2,cbre:_2,center:_2,ceo:_2,cern:_2,cfa:_2,cfd:_2,chanel:_2,channel:_2,charity:_2,chase:_2,chat:_2,cheap:_2,chintai:_2,christmas:_2,chrome:_2,church:_2,cipriani:_2,circle:_2,cisco:_2,citadel:_2,citi:_2,citic:_2,city:_2,claims:_2,cleaning:_2,click:_2,clinic:_2,clinique:_2,clothing:_2,cloud:[1,{antagonist:_3,convex:_3,elementor:_3,emergent:_3,encoway:[0,{eu:_3}],statics:_6,ravendb:_3,axarnet:[0,{"es-1":_3}],diadem:_3,jelastic:[0,{vip:_3}],jele:_3,"jenv-aruba":[0,{aruba:[0,{eur:[0,{it1:_3}]}],it1:_3}],keliweb:[2,{cs:_3}],oxa:[2,{tn:_3,uk:_3}],primetel:[2,{uk:_3}],reclaim:[0,{ca:_3,uk:_3,us:_3}],trendhosting:[0,{ch:_3,de:_3}],jote:_3,jotelulu:_3,kuleuven:_3,laravel:_3,linkyard:_3,magentosite:_6,matlab:_3,observablehq:_3,perspecta:_3,vapor:_3,"on-rancher":_6,scw:[0,{baremetal:[0,{"fr-par-1":_3,"fr-par-2":_3,"nl-ams-1":_3}],"fr-par":[0,{cockpit:_3,ddl:_3,dtwh:_3,fnc:[2,{functions:_3}],ifr:_3,k8s:_24,kafk:_3,mgdb:_3,rdb:_3,s3:_3,"s3-website":_3,scbl:_3,whm:_3}],instances:[0,{priv:_3,pub:_3}],k8s:_3,"nl-ams":[0,{cockpit:_3,ddl:_3,dtwh:_3,ifr:_3,k8s:_24,kafk:_3,mgdb:_3,rdb:_3,s3:_3,"s3-website":_3,scbl:_3,whm:_3}],"pl-waw":[0,{cockpit:_3,ddl:_3,dtwh:_3,ifr:_3,k8s:_24,kafk:_3,mgdb:_3,rdb:_3,s3:_3,"s3-website":_3,scbl:_3}],scalebook:_3,smartlabeling:_3}],servebolt:_3,onstackit:[0,{runs:_3}],trafficplex:_3,"unison-services":_3,urown:_3,voorloper:_3,zap:_3}],club:[1,{cloudns:_3,jele:_3,barsy:_3}],clubmed:_2,coach:_2,codes:[1,{owo:_6}],coffee:_2,college:_2,cologne:_2,commbank:_2,community:[1,{nog:_3,ravendb:_3,myforum:_3}],company:_2,compare:_2,computer:_2,comsec:_2,condos:_2,construction:_2,consulting:_2,contact:_2,contractors:_2,cooking:_2,cool:[1,{elementor:_3,de:_3}],corsica:_2,country:_2,coupon:_2,coupons:_2,courses:_2,cpa:_2,credit:_2,creditcard:_2,creditunion:_2,cricket:_2,crown:_2,crs:_2,cruise:_2,cruises:_2,cuisinella:_2,cymru:_2,cyou:_2,dad:_2,dance:_2,data:_2,date:_2,dating:_2,datsun:_2,day:_2,dclk:_2,dds:_2,deal:_2,dealer:_2,deals:_2,degree:_2,delivery:_2,dell:_2,deloitte:_2,delta:_2,democrat:_2,dental:_2,dentist:_2,desi:_2,design:[1,{graphic:_3,bss:_3}],dev:[1,{"12chars":_3,myaddr:_3,panel:_3,bearblog:_3,brave:_7,lcl:_6,lclstage:_6,stg:_6,stgstage:_6,pages:_3,r2:_3,workers:_3,deno:_3,"deno-staging":_3,deta:_3,lp:[2,{api:_3,objects:_3}],evervault:_8,fly:_3,githubpreview:_3,gateway:_6,grebedoc:_3,botdash:_3,inbrowser:_6,"is-a-good":_3,iserv:_3,leapcell:_3,runcontainers:_3,localcert:[0,{user:_6}],loginline:_3,barsy:_3,mediatech:_3,"mocha-sandbox":_3,modx:_3,ngrok:_3,"ngrok-free":_3,"is-a-fullstack":_3,"is-cool":_3,"is-not-a":_3,localplayer:_3,xmit:_3,"platter-app":_3,replit:[2,{archer:_3,bones:_3,canary:_3,global:_3,hacker:_3,id:_3,janeway:_3,kim:_3,kira:_3,kirk:_3,odo:_3,paris:_3,picard:_3,pike:_3,prerelease:_3,reed:_3,riker:_3,sisko:_3,spock:_3,staging:_3,sulu:_3,tarpit:_3,teams:_3,tucker:_3,wesley:_3,worf:_3}],crm:[0,{aa:_6,ab:_6,ac:_6,ad:_6,ae:_6,af:_6,ci:_6,d:_6,pa:_6,pb:_6,pc:_6,pd:_6,pe:_6,pf:_6,w:_6,wa:_6,wb:_6,wc:_6,wd:_6,we:_6,wf:_6}],erp:_50,vercel:_3,webhare:_6,hrsn:_3,"is-a":_3}],dhl:_2,diamonds:_2,diet:_2,digital:[1,{cloudapps:[2,{london:_3}]}],direct:[1,{libp2p:_3}],directory:_2,discount:_2,discover:_2,dish:_2,diy:_51,dnp:_2,docs:_2,doctor:_2,dog:_2,domains:_2,dot:_2,download:_2,drive:_2,dtv:_2,dubai:_2,dupont:_2,durban:_2,dvag:_2,dvr:_2,earth:_2,eat:_2,eco:_2,edeka:_2,education:_22,email:[1,{crisp:[0,{on:_3}],tawk:_53,tawkto:_53}],emerck:_2,energy:_2,engineer:_2,engineering:_2,enterprises:_2,epson:_2,equipment:_2,ericsson:_2,erni:_2,esq:_2,estate:[1,{compute:_6}],eurovision:_2,eus:[1,{party:_54}],events:[1,{koobin:_3,co:_3}],exchange:_2,expert:_2,exposed:_2,express:_2,extraspace:_2,fage:_2,fail:_2,fairwinds:_2,faith:_2,family:_2,fan:_2,fans:_2,farm:[1,{storj:_3}],farmers:_2,fashion:_2,fast:_2,fedex:_2,feedback:_2,ferrari:_2,ferrero:_2,fidelity:_2,fido:_2,film:_2,final:_2,finance:_2,financial:_22,fire:_2,firestone:_2,firmdale:_2,fish:_2,fishing:_2,fit:_2,fitness:_2,flickr:_2,flights:_2,flir:_2,florist:_2,flowers:_2,fly:_2,foo:_2,food:_2,football:_2,ford:_2,forex:_2,forsale:_2,forum:_2,foundation:_2,fox:_2,free:_2,fresenius:_2,frl:_2,frogans:_2,frontier:_2,ftr:_2,fujitsu:_2,fun:_2,fund:_2,furniture:_2,futbol:_2,fyi:_2,gal:_2,gallery:_2,gallo:_2,gallup:_2,game:_2,games:[1,{pley:_3,sheezy:_3}],gap:_2,garden:_2,gay:[1,{pages:_3}],gbiz:_2,gdn:[1,{cnpy:_3}],gea:_2,gent:_2,genting:_2,george:_2,ggee:_2,gift:_2,gifts:_2,gives:_2,giving:_2,glass:_2,gle:_2,global:[1,{appwrite:_3}],globo:_2,gmail:_2,gmbh:_2,gmo:_2,gmx:_2,godaddy:_2,gold:_2,goldpoint:_2,golf:_2,goo:_2,goodyear:_2,goog:[1,{cloud:_3,translate:_3,usercontent:_6}],google:_2,gop:_2,got:_2,grainger:_2,graphics:_2,gratis:_2,green:_2,gripe:_2,grocery:_2,group:_51,gucci:_2,guge:_2,guide:_2,guitars:_2,guru:_2,hair:_2,hamburg:_2,hangout:_2,haus:_2,hbo:_2,hdfc:_2,hdfcbank:_2,health:[1,{hra:_3}],healthcare:_2,help:_2,helsinki:_2,here:_2,hermes:_2,hiphop:_2,hisamitsu:_2,hitachi:_2,hiv:_2,hkt:_2,hockey:_2,holdings:_2,holiday:_2,homedepot:_2,homegoods:_2,homes:_2,homesense:_2,honda:_2,horse:_2,hospital:_2,host:[1,{cloudaccess:_3,freesite:_3,easypanel:_3,emergent:_3,fastvps:_3,myfast:_3,gadget:_3,tempurl:_3,wpmudev:_3,iserv:_3,jele:_3,mircloud:_3,bolt:_3,wp2:_3,half:_3}],hosting:[1,{opencraft:_3}],hot:_2,hotel:_2,hotels:_2,hotmail:_2,house:_2,how:_2,hsbc:_2,hughes:_2,hyatt:_2,hyundai:_2,ibm:_2,icbc:_2,ice:_2,icu:_2,ieee:_2,ifm:_2,ikano:_2,imamat:_2,imdb:_2,immo:_2,immobilien:_2,inc:_2,industries:_2,infiniti:_2,ing:_2,ink:_2,institute:_2,insurance:_2,insure:_2,international:_2,intuit:_2,investments:_2,ipiranga:_2,irish:_2,ismaili:_2,ist:_2,istanbul:_2,itau:_2,itv:_2,jaguar:_2,java:_2,jcb:_2,jeep:_2,jetzt:_2,jewelry:_2,jio:_2,jll:_2,jmp:_2,jnj:_2,joburg:_2,jot:_2,joy:_2,jpmorgan:_2,jprs:_2,juegos:_2,juniper:_2,kaufen:_2,kddi:_2,kerryhotels:_2,kerryproperties:_2,kfh:_2,kia:_2,kids:_2,kim:_2,kindle:_2,kitchen:_2,kiwi:_2,koeln:_2,komatsu:_2,kosher:_2,kpmg:_2,kpn:_2,krd:[1,{co:_3,edu:_3}],kred:_2,kuokgroup:_2,kyoto:_2,lacaixa:_2,lamborghini:_2,lamer:_2,land:_2,landrover:_2,lanxess:_2,lasalle:_2,lat:_2,latino:_2,latrobe:_2,law:_2,lawyer:_2,lds:_2,lease:_2,leclerc:_2,lefrak:_2,legal:_2,lego:_2,lexus:_2,lgbt:_2,lidl:_2,life:_2,lifeinsurance:_2,lifestyle:_2,lighting:_2,like:_2,lilly:_2,limited:_2,limo:_2,lincoln:_2,link:[1,{myfritz:_3,cyon:_3,joinmc:_3,dweb:_6,inbrowser:_6,keenetic:_3,nftstorage:_61,mypep:_3,storacha:_61,w3s:_61}],live:[1,{aem:_3,hlx:_3,ewp:_6}],living:_2,llc:_2,llp:_2,loan:_2,loans:_2,locker:_2,locus:_2,lol:[1,{omg:_3}],london:_2,lotte:_2,lotto:_2,love:_2,lpl:_2,lplfinancial:_2,ltd:_2,ltda:_2,lundbeck:_2,luxe:_2,luxury:_2,madrid:_2,maif:_2,maison:_2,makeup:_2,man:_2,management:_2,mango:_2,map:_2,market:_2,marketing:_2,markets:_2,marriott:_2,marshalls:_2,mattel:_2,mba:_2,mckinsey:_2,med:_2,media:_62,meet:_2,melbourne:_2,meme:_2,memorial:_2,men:_2,menu:[1,{barsy:_3,barsyonline:_3}],merck:_2,merckmsd:_2,miami:_2,microsoft:_2,mini:_2,mint:_2,mit:_2,mitsubishi:_2,mlb:_2,mls:_2,mma:_2,mobile:_2,moda:_2,moe:_2,moi:_2,mom:_2,monash:_2,money:_2,monster:_2,mormon:_2,mortgage:_2,moscow:_2,moto:_2,motorcycles:_2,mov:_2,movie:_2,msd:_2,mtn:_2,mtr:_2,music:_2,nab:_2,nagoya:_2,navy:_2,nba:_2,nec:_2,netbank:_2,netflix:_2,network:[1,{aem:_3,alces:_6,appwrite:_3,co:_3,arvo:_3,azimuth:_3,tlon:_3}],neustar:_2,new:_2,news:[1,{noticeable:_3}],next:_2,nextdirect:_2,nexus:_2,nfl:_2,ngo:_2,nhk:_2,nico:_2,nike:_2,nikon:_2,ninja:_2,nissan:_2,nissay:_2,nokia:_2,norton:_2,now:_2,nowruz:_2,nowtv:_2,nra:_2,nrw:_2,ntt:_2,nyc:_2,obi:_2,observer:_2,office:_2,okinawa:_2,olayan:_2,olayangroup:_2,ollo:_2,omega:_2,one:[1,{kin:_6,service:_3,website:_3}],ong:_2,onl:_2,online:[1,{eero:_3,"eero-stage":_3,websitebuilder:_3,leapcell:_3,barsy:_3}],ooo:_2,open:_2,oracle:_2,orange:[1,{tech:_3}],organic:_2,origins:_2,osaka:_2,otsuka:_2,ott:_2,ovh:[1,{nerdpol:_3}],page:[1,{aem:_3,hlx:_3,codeberg:_3,deuxfleurs:_3,heyflow:_3,prvcy:_3,rocky:_3,statichost:_3,pdns:_3,plesk:_3}],panasonic:_2,paris:_2,pars:_2,partners:_2,parts:_2,party:_2,pay:_2,pccw:_2,pet:_2,pfizer:_2,pharmacy:_2,phd:_2,philips:_2,phone:_2,photo:_2,photography:_2,photos:_62,physio:_2,pics:_2,pictet:_2,pictures:[1,{1337:_3}],pid:_2,pin:_2,ping:_2,pink:_2,pioneer:_2,pizza:[1,{ngrok:_3}],place:_22,play:_2,playstation:_2,plumbing:_2,plus:[1,{playit:[2,{at:_6,with:_3}]}],pnc:_2,pohl:_2,poker:_2,politie:_2,porn:_2,praxi:_2,press:_2,prime:_2,prod:_2,productions:_2,prof:_2,progressive:_2,promo:_2,properties:_2,property:_2,protection:_2,pru:_2,prudential:_2,pub:[1,{id:_6,kin:_6,barsy:_3}],pwc:_2,qpon:_2,quebec:_2,quest:_2,racing:_2,radio:_2,read:_2,realestate:_2,realtor:_2,realty:_2,recipes:_2,red:_2,redumbrella:_2,rehab:_2,reise:_2,reisen:_2,reit:_2,reliance:_2,ren:_2,rent:_2,rentals:_2,repair:_2,report:_2,republican:_2,rest:_2,restaurant:_2,review:_2,reviews:[1,{aem:_3}],rexroth:_2,rich:_2,richardli:_2,ricoh:_2,ril:_2,rio:_2,rip:[1,{clan:_3}],rocks:[1,{myddns:_3,stackit:_3,"lima-city":_3,webspace:_3}],rodeo:_2,rogers:_2,room:_2,rsvp:_2,rugby:_2,ruhr:_2,run:[1,{appwrite:_6,canva:_3,development:_3,ravendb:_3,liara:[2,{iran:_3}],lovable:_3,needle:_3,build:_6,code:_6,database:_6,migration:_6,onporter:_3,repl:_3,stackit:_3,val:_50,vercel:_3,wix:_3}],rwe:_2,ryukyu:_2,saarland:_2,safe:_2,safety:_2,sakura:_2,sale:_2,salon:_2,samsclub:_2,samsung:_2,sandvik:_2,sandvikcoromant:_2,sanofi:_2,sap:_2,sarl:_2,sas:_2,save:_2,saxo:_2,sbi:_2,sbs:_2,scb:_2,schaeffler:_2,schmidt:_2,scholarships:_2,school:_2,schule:_2,schwarz:_2,science:_2,scot:[1,{co:_3,me:_3,org:_3,gov:[2,{service:_3}]}],search:_2,seat:_2,secure:_2,security:_2,seek:_2,select:_2,sener:_2,services:[1,{loginline:_3}],seven:_2,sew:_2,sex:_2,sexy:_2,sfr:_2,shangrila:_2,sharp:_2,shell:_2,shia:_2,shiksha:_2,shoes:_2,shop:[1,{base:_3,hoplix:_3,barsy:_3,barsyonline:_3,shopware:_3}],shopping:_2,shouji:_2,show:_2,silk:_2,sina:_2,singles:_2,site:[1,{square:_3,canva:_25,cloudera:_6,convex:_3,cyon:_3,caffeine:_3,fastvps:_3,figma:_3,"figma-gov":_3,preview:_3,heyflow:_3,jele:_3,jouwweb:_3,loginline:_3,barsy:_3,co:_3,notion:_3,omniwe:_3,opensocial:_3,madethis:_3,support:_3,platformsh:_6,tst:_6,byen:_3,sol:_3,srht:_3,novecore:_3,cpanel:_3,wpsquared:_3,sourcecraft:_3}],ski:_2,skin:_2,sky:_2,skype:_2,sling:_2,smart:_2,smile:_2,sncf:_2,soccer:_2,social:_2,softbank:_2,software:_2,sohu:_2,solar:_2,solutions:_2,song:_2,sony:_2,soy:_2,spa:_2,space:[1,{myfast:_3,heiyu:_3,hf:[2,{static:_3}],"app-ionos":_3,project:_3,uber:_3,xs4all:_3}],sport:_2,spot:_2,srl:_2,stada:_2,staples:_2,star:_2,statebank:_2,statefarm:_2,stc:_2,stcgroup:_2,stockholm:_2,storage:_2,store:[1,{barsy:_3,sellfy:_3,shopware:_3,storebase:_3}],stream:_2,studio:_2,study:_2,style:_2,sucks:_2,supplies:_2,supply:_2,support:[1,{barsy:_3}],surf:_2,surgery:_2,suzuki:_2,swatch:_2,swiss:_2,sydney:_2,systems:[1,{knightpoint:_3,miren:_3}],tab:_2,taipei:_2,talk:_2,taobao:_2,target:_2,tatamotors:_2,tatar:_2,tattoo:_2,tax:_2,taxi:_2,tci:_2,tdk:_2,team:[1,{discourse:_3,jelastic:_3}],tech:[1,{cleverapps:_3}],technology:_22,temasek:_2,tennis:_2,teva:_2,thd:_2,theater:_2,theatre:_2,tiaa:_2,tickets:_2,tienda:_2,tips:_2,tires:_2,tirol:_2,tjmaxx:_2,tjx:_2,tkmaxx:_2,tmall:_2,today:[1,{prequalifyme:_3}],tokyo:_2,tools:[1,{addr:_49,myaddr:_3}],top:[1,{ntdll:_3,wadl:_6}],toray:_2,toshiba:_2,total:_2,tours:_2,town:_2,toyota:_2,toys:_2,trade:_2,trading:_2,training:_2,travel:_2,travelers:_2,travelersinsurance:_2,trust:_2,trv:_2,tube:_2,tui:_2,tunes:_2,tushu:_2,tvs:_2,ubank:_2,ubs:_2,unicom:_2,university:_2,uno:_2,uol:_2,ups:_2,vacations:_2,vana:_2,vanguard:_2,vegas:_2,ventures:_2,verisign:_2,versicherung:_2,vet:_2,viajes:_2,video:_2,vig:_2,viking:_2,villas:_2,vin:_2,vip:[1,{hidns:_3}],virgin:_2,visa:_2,vision:_2,viva:_2,vivo:_2,vlaanderen:_2,vodka:_2,volvo:_2,vote:_2,voting:_2,voto:_2,voyage:_2,wales:_2,walmart:_2,walter:_2,wang:_2,wanggou:_2,watch:_2,watches:_2,weather:_2,weatherchannel:_2,webcam:_2,weber:_2,website:_62,wed:_2,wedding:_2,weibo:_2,weir:_2,whoswho:_2,wien:_2,wiki:_62,williamhill:_2,win:_2,windows:_2,wine:_2,winners:_2,wme:_2,wolterskluwer:_2,woodside:_2,work:[1,{"imagine-proxy":_3}],works:_2,world:_2,wow:_2,wtc:_2,wtf:_2,xbox:_2,xerox:_2,xihuan:_2,xin:_2,"xn--11b4c3d":_2,कॉम:_2,"xn--1ck2e1b":_2,セール:_2,"xn--1qqw23a":_2,佛山:_2,"xn--30rr7y":_2,慈善:_2,"xn--3bst00m":_2,集团:_2,"xn--3ds443g":_2,在线:_2,"xn--3pxu8k":_2,点看:_2,"xn--42c2d9a":_2,คอม:_2,"xn--45q11c":_2,八卦:_2,"xn--4gbrim":_2,موقع:_2,"xn--55qw42g":_2,公益:_2,"xn--55qx5d":_2,公司:_2,"xn--5su34j936bgsg":_2,香格里拉:_2,"xn--5tzm5g":_2,网站:_2,"xn--6frz82g":_2,移动:_2,"xn--6qq986b3xl":_2,我爱你:_2,"xn--80adxhks":_2,москва:_2,"xn--80aqecdr1a":_2,католик:_2,"xn--80asehdb":_2,онлайн:_2,"xn--80aswg":_2,сайт:_2,"xn--8y0a063a":_2,联通:_2,"xn--9dbq2a":_2,קום:_2,"xn--9et52u":_2,时尚:_2,"xn--9krt00a":_2,微博:_2,"xn--b4w605ferd":_2,淡马锡:_2,"xn--bck1b9a5dre4c":_2,ファッション:_2,"xn--c1avg":_2,орг:_2,"xn--c2br7g":_2,नेट:_2,"xn--cck2b3b":_2,ストア:_2,"xn--cckwcxetd":_2,アマゾン:_2,"xn--cg4bki":_2,삼성:_2,"xn--czr694b":_2,商标:_2,"xn--czrs0t":_2,商店:_2,"xn--czru2d":_2,商城:_2,"xn--d1acj3b":_2,дети:_2,"xn--eckvdtc9d":_2,ポイント:_2,"xn--efvy88h":_2,新闻:_2,"xn--fct429k":_2,家電:_2,"xn--fhbei":_2,كوم:_2,"xn--fiq228c5hs":_2,中文网:_2,"xn--fiq64b":_2,中信:_2,"xn--fjq720a":_2,娱乐:_2,"xn--flw351e":_2,谷歌:_2,"xn--fzys8d69uvgm":_2,電訊盈科:_2,"xn--g2xx48c":_2,购物:_2,"xn--gckr3f0f":_2,クラウド:_2,"xn--gk3at1e":_2,通販:_2,"xn--hxt814e":_2,网店:_2,"xn--i1b6b1a6a2e":_2,संगठन:_2,"xn--imr513n":_2,餐厅:_2,"xn--io0a7i":_2,网络:_2,"xn--j1aef":_2,ком:_2,"xn--jlq480n2rg":_2,亚马逊:_2,"xn--jvr189m":_2,食品:_2,"xn--kcrx77d1x4a":_2,飞利浦:_2,"xn--kput3i":_2,手机:_2,"xn--mgba3a3ejt":_2,ارامكو:_2,"xn--mgba7c0bbn0a":_2,العليان:_2,"xn--mgbab2bd":_2,بازار:_2,"xn--mgbca7dzdo":_2,ابوظبي:_2,"xn--mgbi4ecexp":_2,كاثوليك:_2,"xn--mgbt3dhd":_2,همراه:_2,"xn--mk1bu44c":_2,닷컴:_2,"xn--mxtq1m":_2,政府:_2,"xn--ngbc5azd":_2,شبكة:_2,"xn--ngbe9e0a":_2,بيتك:_2,"xn--ngbrx":_2,عرب:_2,"xn--nqv7f":_2,机构:_2,"xn--nqv7fs00ema":_2,组织机构:_2,"xn--nyqy26a":_2,健康:_2,"xn--otu796d":_2,招聘:_2,"xn--p1acf":[1,{"xn--90amc":_3,"xn--j1aef":_3,"xn--j1ael8b":_3,"xn--h1ahn":_3,"xn--j1adp":_3,"xn--c1avg":_3,"xn--80aaa0cvac":_3,"xn--h1aliz":_3,"xn--90a1af":_3,"xn--41a":_3}],рус:[1,{биз:_3,ком:_3,крым:_3,мир:_3,мск:_3,орг:_3,самара:_3,сочи:_3,спб:_3,я:_3}],"xn--pssy2u":_2,大拿:_2,"xn--q9jyb4c":_2,みんな:_2,"xn--qcka1pmc":_2,グーグル:_2,"xn--rhqv96g":_2,世界:_2,"xn--rovu88b":_2,書籍:_2,"xn--ses554g":_2,网址:_2,"xn--t60b56a":_2,닷넷:_2,"xn--tckwe":_2,コム:_2,"xn--tiq49xqyj":_2,天主教:_2,"xn--unup4y":_2,游戏:_2,"xn--vermgensberater-ctb":_2,vermögensberater:_2,"xn--vermgensberatung-pwb":_2,vermögensberatung:_2,"xn--vhquv":_2,企业:_2,"xn--vuq861b":_2,信息:_2,"xn--w4r85el8fhu5dnra":_2,嘉里大酒店:_2,"xn--w4rs40l":_2,嘉里:_2,"xn--xhq521b":_2,广东:_2,"xn--zfr164b":_2,政务:_2,xyz:[1,{caffeine:_3,botdash:_3,telebit:_6}],yachts:_2,yahoo:_2,yamaxun:_2,yandex:_2,yodobashi:_2,yoga:_2,yokohama:_2,you:_2,youtube:_2,yun:_2,zappos:_2,zara:_2,zero:_2,zip:_2,zone:[1,{triton:_6,stackit:_3,lima:_3}],zuerich:_2}]})();function lookupInTrie(parts,trie,index,allowedMask){let result=null,node=trie;for(;node!==void 0&&((node[0]&allowedMask)!==0&&(result={index:index+1,isIcann:(node[0]&1)!==0,isPrivate:(node[0]&2)!==0}),index!==-1);){let succ=node[1];node=Object.prototype.hasOwnProperty.call(succ,parts[index])?succ[parts[index]]:succ["*"],index-=1}return result}function suffixLookup(hostname3,options,out){var _a2;if(fastPathLookup(hostname3,options,out))return;let hostnameParts=hostname3.split("."),allowedMask=(options.allowPrivateDomains?2:0)|(options.allowIcannDomains?1:0),exceptionMatch=lookupInTrie(hostnameParts,exceptions,hostnameParts.length-1,allowedMask);if(exceptionMatch!==null){out.isIcann=exceptionMatch.isIcann,out.isPrivate=exceptionMatch.isPrivate,out.publicSuffix=hostnameParts.slice(exceptionMatch.index+1).join(".");return}let rulesMatch=lookupInTrie(hostnameParts,rules,hostnameParts.length-1,allowedMask);if(rulesMatch!==null){out.isIcann=rulesMatch.isIcann,out.isPrivate=rulesMatch.isPrivate,out.publicSuffix=hostnameParts.slice(rulesMatch.index).join(".");return}out.isIcann=!1,out.isPrivate=!1,out.publicSuffix=(_a2=hostnameParts[hostnameParts.length-1])!==null&&_a2!==void 0?_a2:null}var RESULT=getEmptyResult();function parse4(url2,options={}){return parseImpl(url2,5,suffixLookup,options,getEmptyResult())}function getHostname(url2,options={}){return resetResult(RESULT),parseImpl(url2,0,suffixLookup,options,RESULT).hostname}function getPublicSuffix2(url2,options={}){return resetResult(RESULT),parseImpl(url2,2,suffixLookup,options,RESULT).publicSuffix}function getDomain2(url2,options={}){return resetResult(RESULT),parseImpl(url2,3,suffixLookup,options,RESULT).domain}function getSubdomain(url2,options={}){return resetResult(RESULT),parseImpl(url2,4,suffixLookup,options,RESULT).subdomain}function getDomainWithoutSuffix(url2,options={}){return resetResult(RESULT),parseImpl(url2,5,suffixLookup,options,RESULT).domainWithoutSuffix}exports.getDomain=getDomain2;exports.getDomainWithoutSuffix=getDomainWithoutSuffix;exports.getHostname=getHostname;exports.getPublicSuffix=getPublicSuffix2;exports.getSubdomain=getSubdomain;exports.parse=parse4}});import fs8 from"node:fs";import os6 from"node:os";import path10 from"node:path";function resolveNativeHostDirectory(options={}){let env=options.env??process.env,home=(options.homedir??os6.homedir)();switch(options.platform??process.platform){case"darwin":return path10.join(home,"Library/Application Support/Google/Chrome/NativeMessagingHosts");case"linux":return path10.join(home,".config/google-chrome/NativeMessagingHosts");case"win32":return path10.join(env.PROGRAMDATA||"C:\\ProgramData","Google\\Chrome\\NativeMessagingHosts");default:throw new Error(`Unsupported platform: ${String(options.platform??process.platform)}`)}}var MEARL_NATIVE_HOST_NAMES,init_nativeHost=__esm({"../client/dist/nativeHost.js"(){"use strict";MEARL_NATIVE_HOST_NAMES={skills:"com.alibaba.mearl.skills",mcp:"com.alibaba.mearl.mcp"}}});var require_ms=__commonJS({"../../node_modules/.pnpm/ms@2.1.3/node_modules/ms/index.js"(exports,module){var s=1e3,m=s*60,h=m*60,d=h*24,w=d*7,y=d*365.25;module.exports=function(val,options){options=options||{};var type=typeof val;if(type==="string"&&val.length>0)return parse4(val);if(type==="number"&&isFinite(val))return options.long?fmtLong(val):fmtShort(val);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(val))};function parse4(str){if(str=String(str),!(str.length>100)){var match=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(str);if(match){var n=parseFloat(match[1]),type=(match[2]||"ms").toLowerCase();switch(type){case"years":case"year":case"yrs":case"yr":case"y":return n*y;case"weeks":case"week":case"w":return n*w;case"days":case"day":case"d":return n*d;case"hours":case"hour":case"hrs":case"hr":case"h":return n*h;case"minutes":case"minute":case"mins":case"min":case"m":return n*m;case"seconds":case"second":case"secs":case"sec":case"s":return n*s;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return n;default:return}}}}function fmtShort(ms){var msAbs=Math.abs(ms);return msAbs>=d?Math.round(ms/d)+"d":msAbs>=h?Math.round(ms/h)+"h":msAbs>=m?Math.round(ms/m)+"m":msAbs>=s?Math.round(ms/s)+"s":ms+"ms"}function fmtLong(ms){var msAbs=Math.abs(ms);return msAbs>=d?plural(ms,msAbs,d,"day"):msAbs>=h?plural(ms,msAbs,h,"hour"):msAbs>=m?plural(ms,msAbs,m,"minute"):msAbs>=s?plural(ms,msAbs,s,"second"):ms+" ms"}function plural(ms,msAbs,n,name){var isPlural=msAbs>=n*1.5;return Math.round(ms/n)+" "+name+(isPlural?"s":"")}}});var require_common=__commonJS({"../../node_modules/.pnpm/debug@4.4.3_supports-color@5.5.0/node_modules/debug/src/common.js"(exports,module){function setup(env){createDebug.debug=createDebug,createDebug.default=createDebug,createDebug.coerce=coerce,createDebug.disable=disable,createDebug.enable=enable,createDebug.enabled=enabled,createDebug.humanize=require_ms(),createDebug.destroy=destroy,Object.keys(env).forEach(key=>{createDebug[key]=env[key]}),createDebug.names=[],createDebug.skips=[],createDebug.formatters={};function selectColor(namespace){let hash2=0;for(let i=0;i<namespace.length;i++)hash2=(hash2<<5)-hash2+namespace.charCodeAt(i),hash2|=0;return createDebug.colors[Math.abs(hash2)%createDebug.colors.length]}createDebug.selectColor=selectColor;function createDebug(namespace){let prevTime,enableOverride=null,namespacesCache,enabledCache;function debug(...args){if(!debug.enabled)return;let self=debug,curr=Number(new Date),ms=curr-(prevTime||curr);self.diff=ms,self.prev=prevTime,self.curr=curr,prevTime=curr,args[0]=createDebug.coerce(args[0]),typeof args[0]!="string"&&args.unshift("%O");let index=0;args[0]=args[0].replace(/%([a-zA-Z%])/g,(match,format)=>{if(match==="%%")return"%";index++;let formatter=createDebug.formatters[format];if(typeof formatter=="function"){let val=args[index];match=formatter.call(self,val),args.splice(index,1),index--}return match}),createDebug.formatArgs.call(self,args),(self.log||createDebug.log).apply(self,args)}return debug.namespace=namespace,debug.useColors=createDebug.useColors(),debug.color=createDebug.selectColor(namespace),debug.extend=extend2,debug.destroy=createDebug.destroy,Object.defineProperty(debug,"enabled",{enumerable:!0,configurable:!1,get:()=>enableOverride!==null?enableOverride:(namespacesCache!==createDebug.namespaces&&(namespacesCache=createDebug.namespaces,enabledCache=createDebug.enabled(namespace)),enabledCache),set:v=>{enableOverride=v}}),typeof createDebug.init=="function"&&createDebug.init(debug),debug}function extend2(namespace,delimiter){let newDebug=createDebug(this.namespace+(typeof delimiter>"u"?":":delimiter)+namespace);return newDebug.log=this.log,newDebug}function enable(namespaces){createDebug.save(namespaces),createDebug.namespaces=namespaces,createDebug.names=[],createDebug.skips=[];let split=(typeof namespaces=="string"?namespaces:"").trim().replace(/\s+/g,",").split(",").filter(Boolean);for(let ns of split)ns[0]==="-"?createDebug.skips.push(ns.slice(1)):createDebug.names.push(ns)}function matchesTemplate(search,template){let searchIndex=0,templateIndex=0,starIndex=-1,matchIndex=0;for(;searchIndex<search.length;)if(templateIndex<template.length&&(template[templateIndex]===search[searchIndex]||template[templateIndex]==="*"))template[templateIndex]==="*"?(starIndex=templateIndex,matchIndex=searchIndex,templateIndex++):(searchIndex++,templateIndex++);else if(starIndex!==-1)templateIndex=starIndex+1,matchIndex++,searchIndex=matchIndex;else return!1;for(;templateIndex<template.length&&template[templateIndex]==="*";)templateIndex++;return templateIndex===template.length}function disable(){let namespaces=[...createDebug.names,...createDebug.skips.map(namespace=>"-"+namespace)].join(",");return createDebug.enable(""),namespaces}function enabled(name){for(let skip of createDebug.skips)if(matchesTemplate(name,skip))return!1;for(let ns of createDebug.names)if(matchesTemplate(name,ns))return!0;return!1}function coerce(val){return val instanceof Error?val.stack||val.message:val}function destroy(){console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.")}return createDebug.enable(createDebug.load()),createDebug}module.exports=setup}});var require_browser=__commonJS({"../../node_modules/.pnpm/debug@4.4.3_supports-color@5.5.0/node_modules/debug/src/browser.js"(exports,module){exports.formatArgs=formatArgs;exports.save=save;exports.load=load;exports.useColors=useColors;exports.storage=localstorage();exports.destroy=(()=>{let warned=!1;return()=>{warned||(warned=!0,console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."))}})();exports.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"];function useColors(){if(typeof window<"u"&&window.process&&(window.process.type==="renderer"||window.process.__nwjs))return!0;if(typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/))return!1;let m;return typeof document<"u"&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||typeof window<"u"&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||typeof navigator<"u"&&navigator.userAgent&&(m=navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/))&&parseInt(m[1],10)>=31||typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)}function formatArgs(args){if(args[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+args[0]+(this.useColors?"%c ":" ")+"+"+module.exports.humanize(this.diff),!this.useColors)return;let c="color: "+this.color;args.splice(1,0,c,"color: inherit");let index=0,lastC=0;args[0].replace(/%[a-zA-Z%]/g,match=>{match!=="%%"&&(index++,match==="%c"&&(lastC=index))}),args.splice(lastC,0,c)}exports.log=console.debug||console.log||(()=>{});function save(namespaces){try{namespaces?exports.storage.setItem("debug",namespaces):exports.storage.removeItem("debug")}catch{}}function load(){let r;try{r=exports.storage.getItem("debug")||exports.storage.getItem("DEBUG")}catch{}return!r&&typeof process<"u"&&"env"in process&&(r=process.env.DEBUG),r}function localstorage(){try{return localStorage}catch{}}module.exports=require_common()(exports);var{formatters}=module.exports;formatters.j=function(v){try{return JSON.stringify(v)}catch(error48){return"[UnexpectedJSONParseError]: "+error48.message}}}});var require_has_flag=__commonJS({"../../node_modules/.pnpm/has-flag@3.0.0/node_modules/has-flag/index.js"(exports,module){"use strict";module.exports=(flag,argv)=>{argv=argv||process.argv;let prefix=flag.startsWith("-")?"":flag.length===1?"-":"--",pos=argv.indexOf(prefix+flag),terminatorPos=argv.indexOf("--");return pos!==-1&&(terminatorPos===-1?!0:pos<terminatorPos)}}});var require_supports_color=__commonJS({"../../node_modules/.pnpm/supports-color@5.5.0/node_modules/supports-color/index.js"(exports,module){"use strict";var os13=__require("os"),hasFlag=require_has_flag(),env=process.env,forceColor;hasFlag("no-color")||hasFlag("no-colors")||hasFlag("color=false")?forceColor=!1:(hasFlag("color")||hasFlag("colors")||hasFlag("color=true")||hasFlag("color=always"))&&(forceColor=!0);"FORCE_COLOR"in env&&(forceColor=env.FORCE_COLOR.length===0||parseInt(env.FORCE_COLOR,10)!==0);function translateLevel(level){return level===0?!1:{level,hasBasic:!0,has256:level>=2,has16m:level>=3}}function supportsColor(stream){if(forceColor===!1)return 0;if(hasFlag("color=16m")||hasFlag("color=full")||hasFlag("color=truecolor"))return 3;if(hasFlag("color=256"))return 2;if(stream&&!stream.isTTY&&forceColor!==!0)return 0;let min=forceColor?1:0;if(process.platform==="win32"){let osRelease=os13.release().split(".");return Number(process.versions.node.split(".")[0])>=8&&Number(osRelease[0])>=10&&Number(osRelease[2])>=10586?Number(osRelease[2])>=14931?3:2:1}if("CI"in env)return["TRAVIS","CIRCLECI","APPVEYOR","GITLAB_CI"].some(sign=>sign in env)||env.CI_NAME==="codeship"?1:min;if("TEAMCITY_VERSION"in env)return/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION)?1:0;if(env.COLORTERM==="truecolor")return 3;if("TERM_PROGRAM"in env){let version3=parseInt((env.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(env.TERM_PROGRAM){case"iTerm.app":return version3>=3?3:2;case"Apple_Terminal":return 2}}return/-256(color)?$/i.test(env.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)||"COLORTERM"in env?1:(env.TERM==="dumb",min)}function getSupportLevel(stream){let level=supportsColor(stream);return translateLevel(level)}module.exports={supportsColor:getSupportLevel,stdout:getSupportLevel(process.stdout),stderr:getSupportLevel(process.stderr)}}});var require_node=__commonJS({"../../node_modules/.pnpm/debug@4.4.3_supports-color@5.5.0/node_modules/debug/src/node.js"(exports,module){var tty=__require("tty"),util=__require("util");exports.init=init;exports.log=log2;exports.formatArgs=formatArgs;exports.save=save;exports.load=load;exports.useColors=useColors;exports.destroy=util.deprecate(()=>{},"Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.");exports.colors=[6,2,3,4,5,1];try{let supportsColor=require_supports_color();supportsColor&&(supportsColor.stderr||supportsColor).level>=2&&(exports.colors=[20,21,26,27,32,33,38,39,40,41,42,43,44,45,56,57,62,63,68,69,74,75,76,77,78,79,80,81,92,93,98,99,112,113,128,129,134,135,148,149,160,161,162,163,164,165,166,167,168,169,170,171,172,173,178,179,184,185,196,197,198,199,200,201,202,203,204,205,206,207,208,209,214,215,220,221])}catch{}exports.inspectOpts=Object.keys(process.env).filter(key=>/^debug_/i.test(key)).reduce((obj,key)=>{let prop=key.substring(6).toLowerCase().replace(/_([a-z])/g,(_,k)=>k.toUpperCase()),val=process.env[key];return/^(yes|on|true|enabled)$/i.test(val)?val=!0:/^(no|off|false|disabled)$/i.test(val)?val=!1:val==="null"?val=null:val=Number(val),obj[prop]=val,obj},{});function useColors(){return"colors"in exports.inspectOpts?!!exports.inspectOpts.colors:tty.isatty(process.stderr.fd)}function formatArgs(args){let{namespace:name,useColors:useColors2}=this;if(useColors2){let c=this.color,colorCode="\x1B[3"+(c<8?c:"8;5;"+c),prefix=` ${colorCode};1m${name} \x1B[0m`;args[0]=prefix+args[0].split(`
1066
+ `}}});function getJsonpCallback(url2){try{let searchParams=new URL(url2).searchParams,callback=searchParams.get("callback")??searchParams.get("jsonp");return callback&&JSONP_CALLBACK_RE.test(callback)?callback:null}catch{return null}}function serializeMockResponse(requestUrl,responseData){let callback=getJsonpCallback(requestUrl);if(!callback)return{body:typeof responseData=="string"?responseData:JSON.stringify(responseData)??"null",isJsonp:!1};let json4=JSON.stringify(responseData)??"null";if(typeof responseData=="string")try{JSON.parse(responseData),json4=responseData}catch{}return{body:`${callback}(${json4});`,isJsonp:!0}}function prepareMockResponseHeaders(headers,isJsonp){let stripped=(headers??[]).filter(header=>!["content-encoding","content-length"].includes(header.name.toLowerCase()));if(!isJsonp)return stripped;let index=stripped.findIndex(header=>header.name.toLowerCase()==="content-type");if(index===-1)return[...stripped,{name:"content-type",value:JSONP_CONTENT_TYPE}];let result=[...stripped];return result[index]={...result[index],value:JSONP_CONTENT_TYPE},result}var JSONP_CALLBACK_RE,JSONP_CONTENT_TYPE,init_mockResponse=__esm({"../browser-core/dist/mockResponse.js"(){"use strict";JSONP_CALLBACK_RE=/^[A-Za-z_$][A-Za-z0-9_$]*(?:\.[A-Za-z_$][A-Za-z0-9_$]*)*$/,JSONP_CONTENT_TYPE="application/javascript; charset=utf-8"}});var init_pluginState2=__esm({"../browser-core/dist/pluginState.js"(){"use strict"}});var init_pluginModels2=__esm({"../browser-core/dist/pluginModels.js"(){"use strict"}});var init_pluginRecovery=__esm({"../browser-core/dist/pluginRecovery.js"(){"use strict"}});var init_pluginDiagnostics=__esm({"../browser-core/dist/pluginDiagnostics.js"(){"use strict"}});function installRootWebViewDocumentTransport(){let browser=window,prefix="/.mearl-document/";if(browser.name==="__mearl_root__"&&location.pathname.startsWith(prefix))try{let original=new URL(decodeURIComponent(location.hash.slice(1)));original.origin===location.origin&&/^https?:$/.test(original.protocol)&&history.replaceState(history.state,"",original.href)}catch{}browser.__mearlRootDocumentUrl__=url2=>{let token=performance.getEntriesByType("navigation")[0]?.serverTiming?.find(entry=>entry.name==="mearl-document")?.description;if(!token||!/^[a-zA-Z0-9-]+$/.test(token))return url2;let original=new URL(url2);return`${original.origin}${prefix}${token}#${encodeURIComponent(original.href)}`}}var init_rootWebViewDocument=__esm({"../browser-core/dist/rootWebViewDocument.js"(){"use strict"}});function isBrowserManagementAction(value){return typeof value=="string"&&Object.hasOwn(BROWSER_MANAGEMENT_ACTIONS,value)}function isCloudConnectorAction(value){return typeof value=="string"&&Object.hasOwn(CLOUD_CONNECTOR_ACTIONS,value)}function isExtensionUiServiceAction(value){return isAgentServiceAction(value)||isToolboxServiceAction(value)||isBrowserManagementAction(value)||isCloudConnectorAction(value)}function isHostToExtensionAction(value){return typeof value=="string"&&Object.hasOwn(HOST_TO_EXTENSION_ACTIONS,value)}function isPrivateExtensionServiceAction(value){return isToolboxServiceAction(value)||isAgentServiceAction(value)&&value!=="agent_chat_run"||typeof value=="string"&&["browser_sessions","browser_instances","browser_providers"].includes(value)||typeof value=="string"&&Object.hasOwn(EXTENSION_BACKGROUND_ACTIONS,value)}function extensionRpcErrorCode(error48){let code=error48&&typeof error48=="object"&&"code"in error48?error48.code:void 0;return code==="PROTOCOL_MISMATCH"||code==="UNSUPPORTED_ACTION"||code==="EXTENSION_UI_REQUIRED"?code:void 0}var EXTENSION_RPC_VERSION,BROWSER_MANAGEMENT_ACTIONS,CLOUD_CONNECTOR_ACTIONS,HOST_TO_EXTENSION_ACTIONS,EXTENSION_BACKGROUND_ACTIONS,ExtensionRpcError,init_extensionServiceProtocol=__esm({"../browser-core/dist/extensionServiceProtocol.js"(){"use strict";init_agentServiceProtocol();init_toolbox();EXTENSION_RPC_VERSION=1,BROWSER_MANAGEMENT_ACTIONS={browser_sessions:!0,browser_instances:!0,browser_providers:!0,browser_list:!0,browser_launch:!0,browser_close:!0,get_browser_access_url:!0};CLOUD_CONNECTOR_ACTIONS={start_cloud_connector:!0,stop_cloud_connector:!0,list_cloud_connectors:!0};HOST_TO_EXTENSION_ACTIONS={__export_cookies:!0,__capture_download:!0,__control_cleanup:!0,__control_deactivate:!0,__send_request_files:!0};EXTENSION_BACKGROUND_ACTIONS={app_profile_catalog:!0,plugin_page_call:!0,plugin_page_event:!0};ExtensionRpcError=class extends Error{code;constructor(code,message){super(message),this.code=code,this.name="ExtensionRpcError"}}}});var init_dist4=__esm({"../browser-core/dist/index.js"(){"use strict";init_appProfileDefinition();init_types2();init_tdbankLogin();init_mtopSigner();init_mtopRequest();init_mtopStreamCapture();init_appProfileUserInfo();init_eventParsers();init_eventFilters();init_requestSerializer();init_dataStructure();init_boundedRequestBuffer();init_proxyPermissions();init_domTyping();init_domSelectors();init_domScrolling();init_domInspection();init_domSnapshot();init_deviceEmulation();init_debuggerTarget();init_rootWebViewNavigation();init_axTextMatch();init_domClicking();init_pageDragging();init_pagePressing();init_axSnapshot();init_pageObserver();init_navigationTracker();init_pageAct();init_backendNodeRefs();init_pageEffectRefs();init_pageWait();init_pageNavigation();init_tabMatching();init_agentChat();init_agentSkills();init_agentServiceProtocol();init_toolbox();init_toolboxIcon();init_pluginExecution2();init_pluginTasks2();init_pluginPages2();init_pluginPageRuntime();init_pluginPageHost();init_browserActionProtocol();init_runActions();init_sendRequestFiles();init_sendRequestHeaders();init_cookie();init_controlledFavicon();init_capture();init_sseParser();init_mockResponse();init_pluginState2();init_pluginModels2();init_pluginRecovery();init_pluginDiagnostics();init_rootWebViewDocument();init_extensionServiceProtocol()}});import{randomBytes}from"node:crypto";var BROWSER_QUEUE,ControlSessionRegistry,init_control_session=__esm({"src/control-session.ts"(){"use strict";init_dist4();BROWSER_QUEUE=-1,ControlSessionRegistry=class{constructor(browserId){this.browserId=browserId}sessions=new Map;owners=new Map;queues=new Map;pending=new Map;browserReleasing=!1;resuming=new Set;createSessionId(){for(;;){let id=`s_${randomBytes(6).toString("base64url")}`;if(!this.sessions.has(id))return id}}create(transport){if(this.browserReleasing)throw new Error("BROWSER_CONTROL_RELEASING");let record4={sessionId:this.createSessionId(),browserId:this.browserId(),transport,status:"active",tabs:[],generation:1};return this.sessions.set(record4.sessionId,record4),this.info(record4.sessionId)}info(id){let record4=this.require(id);return{...record4,tabs:record4.tabs.map(tab=>({...tab}))}}state(id){let{tabs:_tabs,...state}=this.require(id);return state}find(id){return this.sessions.get(id)?.browserId===this.browserId()?this.info(id):void 0}list(){return[...this.sessions.values()].filter(record4=>record4.status!=="released").map(record4=>this.info(record4.sessionId))}require(id){let record4=this.sessions.get(id);if(!record4||record4.browserId!==this.browserId())throw new Error("CONTROL_SESSION_NOT_FOUND");return record4}assertActive(id,generation){let record4=this.require(id);if(record4.status!=="active"||generation!==void 0&&generation!==record4.generation)throw new Error(`CONTROL_SESSION_PAUSED: ${record4.status}; inspect the page after the user returns control`);return record4}claim(id,tabId,source){let record4=this.require(id),owner=this.owners.get(tabId);if(owner&&owner!==id)throw new Error("TAB_CONTROLLED_BY_SESSION");record4.tabs.some(tab=>tab.tabId===tabId)||record4.tabs.push({tabId,source}),this.owners.set(tabId,id)}blockedTabs(id){return[...this.owners].filter(([,owner])=>owner!==id).map(([tab])=>tab)}assertBrowserRelease(){if(this.list().length)throw new Error("ACTIVE_CONTROL_SESSIONS: release the owning session first")}async releaseBrowser(operation){if(this.assertBrowserRelease(),this.browserReleasing)throw new Error("BROWSER_CONTROL_RELEASING");this.browserReleasing=!0;try{return await Promise.allSettled([...this.pending.values()].flatMap(operations=>[...operations])),await operation()}finally{this.browserReleasing=!1}}async run(id,action,data,operation,transport="extension"){if(this.browserReleasing)throw new Error("BROWSER_CONTROL_RELEASING");let generation=id?this.assertActive(id).generation:void 0,tabs=new Set;typeof data.tabId=="number"&&tabs.add(data.tabId);for(let tab of data.tabIds??[])typeof tab=="number"&&tabs.add(tab);typeof data.openerTabId=="number"&&tabs.add(data.openerTabId);let steps=action==="run_actions"?data.actions:[{action,data}];if(action==="run_actions"){validateActionBatch(data);for(let step of data.actions??[]){typeof step.data?.tabId=="number"&&tabs.add(step.data.tabId);for(let tab of step.data?.tabIds??[])typeof tab=="number"&&tabs.add(tab);typeof step.data?.openerTabId=="number"&&tabs.add(step.data.openerTabId)}}let opensPage=steps.some(step=>step.action==="tab_open"),changesSharedSettings=steps.some(step=>["set_rule","set_cookie"].includes(step.action)||step.action==="set_app_profile"&&transport!=="cdp"&&step.data?.mtopEnv!==void 0),assertSharedResources=()=>{if(action==="run_actions"&&!id&&this.list().length&&steps.some(step=>["tab_open","browser_close"].includes(step.action)))throw new Error("ACTIVE_CONTROL_SESSIONS: open pages outside run_actions while sessions are active");if(changesSharedSettings&&this.list().some(record4=>record4.sessionId!==id))throw new Error("BROWSER_RESOURCE_CONFLICT: use an isolated browser to change shared settings");if(data.closeExisting&&!id&&this.list().length)throw new Error("ACTIVE_CONTROL_SESSIONS")};assertSharedResources();for(let tab of tabs){if(tab<0)continue;let owner=this.owners.get(tab);if(owner&&owner!==id)throw new Error("TAB_CONTROLLED_BY_SESSION")}let unlock,tail=new Promise(resolve11=>{unlock=resolve11}),runtimeTransport=action==="page_runtime",predecessors=runtimeTransport?[]:[...tabs].map(tab=>this.queues.get(tab)).filter(Boolean);if(!runtimeTransport&&this.queues.has(BROWSER_QUEUE)&&predecessors.push(this.queues.get(BROWSER_QUEUE)),(changesSharedSettings||action==="page_download"||opensPage)&&(predecessors.push(...this.queues.values()),tabs.add(BROWSER_QUEUE)),!runtimeTransport)for(let tab of tabs)this.queues.set(tab,tail);let promise2=(async()=>{try{await Promise.all(predecessors),id&&this.assertActive(id,generation),assertSharedResources();for(let tab of tabs){let owner=this.owners.get(tab);if(owner&&owner!==id)throw new Error("TAB_CONTROLLED_BY_SESSION");id&&tab>=0&&this.claim(id,tab,"attached")}return await operation()}finally{unlock();for(let tab of tabs)this.queues.get(tab)===tail&&this.queues.delete(tab)}})(),pending=this.pending.get(id)??new Set;pending.add(promise2),this.pending.set(id,pending);try{return await promise2}finally{pending.delete(promise2),pending.size||this.pending.delete(id)}}async waitForIdle(id){await Promise.allSettled([...this.pending.get(id)??[]])}assertStep(id,generation){this.assertActive(id,generation)}recordResult(id,action,result,data){action==="tab_open"&&typeof result?.tabId=="number"&&this.claim(id,result.tabId,result.opened===!0?"created":"attached");for(let tab of result?.observation?.openedTabs??[])typeof tab.tabId=="number"&&this.claim(id,tab.tabId,"created");let target=this.require(id).tabs.find(tab=>tab.tabId===(result?.tabId??data?.tabId));if(target&&typeof result?.title=="string"&&(target.title=result.title),target&&typeof result?.url=="string"&&(target.url=result.url),action==="tab_close"&&typeof data?.tabId=="number"&&(this.owners.delete(data.tabId),this.require(id).tabs=this.require(id).tabs.filter(tab=>tab.tabId!==data.tabId)),action==="tab_close")for(let tab of this.require(id).tabs)(result?.closedTabIds??[]).includes(tab.tabId)&&this.owners.delete(tab.tabId)}handoff(id,reason){let record4=this.assertActive(id);return record4.status="user",record4.generation+=1,record4.reason=reason,this.info(id)}async resume(id,cleanup=async()=>{}){let record4=this.require(id);if(record4.status!=="user")throw new Error("Session is not waiting for the user");if(this.resuming.has(id))throw new Error("CONTROL_SESSION_RESUMING");this.resuming.add(id);try{return await this.waitForIdle(id),await cleanup(),record4.status="active",record4.reason=void 0,record4.generation+=1,this.info(id)}finally{this.resuming.delete(id)}}async release(id,params,cleanup){let record4=this.require(id);if(this.resuming.has(id))throw new Error("CONTROL_SESSION_RESUMING");if(record4.status==="released")return this.info(id);if(record4.status==="releasing")throw new Error("CONTROL_SESSION_RELEASING");let previous=record4.status;record4.status="releasing",record4.generation+=1,await Promise.allSettled([...this.pending.get(id)??[]]);let tabs=record4.tabs.map(tab=>tab.tabId),keep=new Set(params.keepTabIds??[]),close=params.closeCreatedTabs?record4.tabs.filter(tab=>tab.source==="created"&&!keep.has(tab.tabId)).map(tab=>tab.tabId):[];try{await cleanup(tabs,close);for(let tab of tabs)this.owners.get(tab)===id&&this.owners.delete(tab);record4.status="released";let released=[...this.sessions.values()].filter(session=>session.status==="released"&&session.sessionId!==id);for(let old of released.slice(0,Math.max(0,released.length-99)))this.sessions.delete(old.sessionId)}catch(error48){throw record4.status=previous,error48}return this.info(id)}}}});import{rmSync as rmSync11}from"node:fs";import{randomUUID as randomUUID12}from"node:crypto";import{mkdir as mkdir2,open as open2,rm as rm2,stat as stat2,writeFile}from"node:fs/promises";import path6 from"node:path";import os3 from"node:os";var MAX_BYTES,ARTIFACT_CHUNK_BYTES,BrowserArtifactStore,init_browser_artifacts=__esm({"src/browser-artifacts.ts"(){"use strict";MAX_BYTES=256*1024*1024,ARTIFACT_CHUNK_BYTES=256*1024,BrowserArtifactStore=class{constructor(root=path6.join(os3.tmpdir(),`mearl-artifacts-${process.pid}-${randomUUID12()}`)){this.root=root}files=new Map;directory;sweeper;async create(filename,sessionId){if(typeof filename!="string"||!filename||[".",".."].includes(filename)||/[\\/]/.test(filename)||filename.length>255)throw new Error("Invalid artifact filename");this.sweeper||(this.sweeper=setInterval(()=>{for(let[id,file3]of this.files)!file3.sessionId&&!file3.writing&&Date.now()-file3.accessedAt>3600*1e3&&this.remove(id).catch(()=>{})},6e4),this.sweeper.unref()),await mkdir2(this.root,{recursive:!0,mode:448}),this.directory=this.root;let artifactId=randomUUID12(),directory=path6.join(this.root,artifactId);await mkdir2(directory,{mode:448});let file2={artifactId,filename,bytes:0,location:"browser",path:path6.join(directory,filename),sessionId,ready:!1,accessedAt:Date.now()};return await writeFile(file2.path,"",{mode:384}),this.files.set(artifactId,file2),this.info(file2)}async importFile(filename,sourcePath,sessionId){let source=await open2(sourcePath,"r"),id;try{let metadata=await source.stat();if(!metadata.isFile()||metadata.size>MAX_BYTES)throw new Error("Download is unavailable or exceeds 256 MiB");id=(await this.create(filename,sessionId)).artifactId;let file2=this.require(id,sessionId),target=await open2(file2.path,"w"),copied=0;try{for await(let chunk of source.createReadStream({autoClose:!1})){if(copied+=chunk.length,copied>MAX_BYTES)throw new Error("Download exceeds 256 MiB");let written=0;for(;written<chunk.length;){let result=await target.write(chunk,written,chunk.length-written);if(!result.bytesWritten)throw new Error("Download import made no progress");written+=result.bytesWritten}}}finally{await target.close()}if(copied!==metadata.size)throw new Error("Download changed during import");return file2.bytes=(await stat2(file2.path)).size,file2.ready=!0,this.info(file2)}catch(error48){throw id&&await this.remove(id,sessionId),error48}finally{await source.close()}}require(id,sessionId){let file2=this.files.get(id);if(!file2||file2.sessionId!==void 0&&file2.sessionId!==sessionId)throw new Error("ARTIFACT_NOT_FOUND");return file2.accessedAt=Date.now(),file2}info(file2){return{artifactId:file2.artifactId,filename:file2.filename,bytes:file2.bytes,location:"browser"}}async write(id,offset,base643,sessionId){let file2=this.require(id,sessionId);if(file2.ready||file2.writing||offset!==file2.bytes)throw new Error("Invalid artifact write offset or completed transfer");if(typeof base643!="string"||base643.length>Math.ceil(ARTIFACT_CHUNK_BYTES/3)*4||base643.length%4!==0||!/^[A-Za-z0-9+/]*={0,2}$/.test(base643))throw new Error("Invalid artifact chunk");let chunk=Buffer.from(base643,"base64");if(chunk.toString("base64")!==base643)throw new Error("Invalid artifact chunk");if(file2.bytes+chunk.length>MAX_BYTES)throw new Error("Artifact exceeds 256 MiB");file2.writing=!0;try{let handle=await open2(file2.path,"r+");try{let written=0;for(;written<chunk.length;){let result=await handle.write(chunk,written,chunk.length-written,offset+written);if(!result.bytesWritten)throw new Error("Artifact write made no progress");written+=result.bytesWritten}}finally{await handle.close()}return file2.bytes+=chunk.length,this.info(file2)}finally{file2.writing=!1}}complete(id,bytes,sessionId){let file2=this.require(id,sessionId);if(file2.writing||bytes!==file2.bytes)throw new Error("Artifact size mismatch");return file2.ready=!0,this.info(file2)}resolve(id,sessionId){let file2=this.require(id,sessionId);if(!file2.ready)throw new Error("Artifact is not ready");return file2.path}async read(id,offset,sessionId){let file2=this.require(id,sessionId);if(!file2.ready||!Number.isSafeInteger(offset)||offset<0||offset>file2.bytes)throw new Error("Invalid artifact read");let handle=await open2(file2.path,"r");try{let buffer=Buffer.alloc(Math.min(ARTIFACT_CHUNK_BYTES,file2.bytes-offset)),result=await handle.read(buffer,0,buffer.length,offset);return{base64:buffer.subarray(0,result.bytesRead).toString("base64"),bytes:result.bytesRead,totalBytes:file2.bytes}}finally{await handle.close()}}async remove(id,sessionId){let file2=this.require(id,sessionId);await rm2(path6.dirname(file2.path),{recursive:!0,force:!0}),this.files.delete(id)}async release(sessionId,keep=[]){let retain=new Set(keep);for(let[id,file2]of this.files)file2.sessionId===sessionId&&(retain.has(id)?(file2.sessionId=void 0,file2.accessedAt=Date.now()):await this.remove(id,sessionId))}disposeSync(){this.sweeper&&clearInterval(this.sweeper),this.directory&&rmSync11(this.directory,{recursive:!0,force:!0}),this.files.clear()}async dispose(){this.sweeper&&clearInterval(this.sweeper),this.directory&&await rm2(this.directory,{recursive:!0,force:!0}),this.files.clear()}}}});var ControlSessionManager,init_control_session_manager=__esm({"src/control-session-manager.ts"(){"use strict";init_dist4();init_control_session();init_browser_artifacts();ControlSessionManager=class{constructor(dependencies){this.dependencies=dependencies;this.registry=new ControlSessionRegistry(dependencies.browserId)}registry;artifacts=new BrowserArtifactStore;activityQueues=new Map;async withActivity(id,operation){let pending=(this.activityQueues.get(id)??Promise.resolve()).catch(()=>{}).then(operation);this.activityQueues.set(id,pending);try{return await pending}finally{this.activityQueues.get(id)===pending&&this.activityQueues.delete(id)}}async closeTabs(tabs,transport,sessionId){for(let tabId of tabs)try{let result=await this.dependencies.invoke("tab_close",{tabId},transport);this.registry.recordResult(sessionId,"tab_close",result,{tabId})}catch(error48){let current=await this.dependencies.invoke("tab_list",{},transport);if(!Array.isArray(current.tabs)||current.tabs.some(tab=>(tab.tabId??tab.id)===tabId))throw error48;this.registry.recordResult(sessionId,"tab_close",{},{tabId})}}async userControl(id,operation,reason){if(operation==="release")return await this.invoke("browser_release",{},id),this.registry.info(id);operation==="resume"&&await this.activityQueues.get(id)?.catch(()=>{});let current=this.registry.info(id),info=operation==="resume"?await this.registry.resume(id,()=>this.dependencies.cleanup(current.tabs.map(tab=>tab.tabId),current.transport,!0)):current.status==="user"?current:this.registry.handoff(id,reason);return this.dependencies.notify(),operation==="handoff"?(await this.withActivity(id,async()=>{await this.dependencies.deactivate?.(this.registry.info(id).tabs.map(tab=>tab.tabId),current.transport)}),this.registry.info(id)):info}async invoke(action,data,sessionId,requestedTransport,origin="local"){if(data&&(Object.keys(data).some(key=>key.startsWith("__mearl"))||(data.actions??[]).some(step=>Object.keys(step.data??{}).some(key=>key.startsWith("__mearl")))))throw new Error("Internal session fields are reserved");validateRequiredActionTabId2(action,data);let created=sessionId==="new";if(sessionId==="new"){if(!["tab_open","page_snapshot","page_screenshot"].includes(action))throw new Error("A new session requires tab_open, page_snapshot or page_screenshot");sessionId=this.registry.create(requestedTransport??this.dependencies.transport()).sessionId}let info=sessionId?this.registry.info(sessionId):void 0,transport=info?.transport??requestedTransport??this.dependencies.transport();if(requestedTransport&&transport!==requestedTransport)throw new Error("A session cannot change transport");if(action==="browser_control"){if(!sessionId||!["handoff","resume"].includes(data.operation))throw new Error("browser_control requires --session and handoff/resume");if(data.operation==="resume")return{session:await this.userControl(sessionId,"resume")};if(data.tabId!==void 0&&!info.tabs.some(tab=>tab.tabId===data.tabId))throw new Error("TAB_NOT_IN_CONTROL_SESSION");return{session:await this.userControl(sessionId,"handoff",data.reason)}}if(action==="browser_release"&&sessionId){let params=data;return await this.registry.release(sessionId,params,async(tabs,close)=>{await this.dependencies.cleanup(tabs,transport,params.preserveEnvironment!==!1),await this.closeTabs(close,transport,sessionId),await this.artifacts.release(sessionId,params.keepArtifactIds)}),this.dependencies.notify(),{released:!0,hadActiveControl:!0,transports:[transport],affectedTabIds:info.tabs.map(tab=>tab.tabId),session:this.registry.state(sessionId)}}if((action==="browser_release"||action==="browser_close")&&this.registry.assertBrowserRelease(),(action==="browser_release"||action==="browser_close")&&!sessionId)return this.registry.releaseBrowser(()=>this.dependencies.invoke(action,data,transport));let performStep=async(name,payload,batch=!1)=>{if(name==="tab_open"&&(sessionId&&payload.closeExisting&&(await this.closeTabs(this.registry.info(sessionId).tabs.filter(tab=>tab.source==="created").map(tab=>tab.tabId),transport,sessionId),payload={...payload,closeExisting:!1}),payload={...payload,__mearlBlockedTabIds:this.registry.blockedTabs(sessionId)}),name==="page_upload"&&payload.files){if(payload.filePaths)throw new Error("Use files or filePaths, not both");payload={...payload,filePaths:payload.files.map(file2=>this.artifacts.resolve(file2.artifactId,sessionId))},delete payload.files}if(batch){if(transport==="provider"){let result4=await this.dependencies.invoke(name,{...payload,__mearlControlSource:origin},transport);return sessionId&&this.registry.recordResult(sessionId,name,result4,payload),result4?.action?.success===!1?{...result4.action,success:!1}:result4?.success===!1?{...result4,success:!1}:{success:!0,data:result4}}let result3=await this.dependencies.invoke("run_actions",{tabId:payload.tabId,actions:[{action:name,data:payload}],__mearlControlSource:origin},transport),outcome=result3.results?.[0]??{success:!1,error:result3.error??"Batch step returned no result",stage:result3.stage,attempt:result3.attempt};return sessionId&&outcome.success&&this.registry.recordResult(sessionId,name,outcome.data,payload),outcome}let result2=await this.dependencies.invoke(name,{...payload,__mearlControlSource:origin},transport);return sessionId&&this.registry.recordResult(sessionId,name,result2,payload),result2},invokeStep=(name,payload,batch=!1)=>sessionId&&name==="tab_open"?this.withActivity(sessionId,async()=>(this.registry.assertStep(sessionId,info.generation),performStep(name,payload,batch))):performStep(name,payload,batch),result;try{result=await this.registry.run(sessionId,action,data,async()=>{if(transport==="extension"&&this.dependencies.transport()!=="extension")throw new Error("CONTROL_SESSION_TRANSPORT_UNAVAILABLE: extension is disconnected");if(action.startsWith("__artifact_")){let store=this.artifacts;switch(action){case"__artifact_init":return{artifact:await store.create(data.filename,sessionId),browserId:this.dependencies.browserId()};case"__artifact_write":return store.write(data.artifactId,data.offset,data.base64,sessionId);case"__artifact_complete":return store.complete(data.artifactId,data.bytes,sessionId);case"__artifact_read":return store.read(data.artifactId,data.offset,sessionId);case"__artifact_remove":return await store.remove(data.artifactId,sessionId),{removed:!0};default:throw new Error("Unknown artifact operation")}}if(action==="page_download"){let downloaded=await this.dependencies.download(data,transport,origin);try{return sessionId&&this.registry.recordResult(sessionId,"page_click",downloaded.action,data),{download:{...await this.artifacts.importFile(downloaded.filename,downloaded.filePath,sessionId),browserId:this.dependencies.browserId()},action:downloaded.action}}finally{if(downloaded.owned){let{rm:rm4,rmdir:rmdir2}=await import("node:fs/promises");await rm4(downloaded.filePath,{force:!0}),downloaded.directory&&await rmdir2(downloaded.directory).catch(()=>{})}}}return action==="run_actions"&&sessionId?runActionBatch(data,(name,payload)=>invokeStep(name,payload,!0),{beforeStep:()=>this.registry.assertStep(sessionId,info.generation)}):invokeStep(action,data)},transport)}catch(error48){throw created&&sessionId&&await this.registry.release(sessionId,{},async tabs=>{await this.dependencies.cleanup(tabs,transport,!0),await this.artifacts.release(sessionId)}),this.dependencies.notify(),error48}if(sessionId&&action==="tab_list"&&Array.isArray(result.tabs)){let blocked=new Set(this.registry.blockedTabs(sessionId));result={...result,tabs:result.tabs.filter(tab=>!blocked.has(tab.tabId??tab.id))},result.count=result.tabs.length}return sessionId?(this.dependencies.notify(),{...result,session:this.registry.state(sessionId)}):result}}}});import{StringDecoder as StringDecoder3}from"node:string_decoder";var Utf8LineBuffer,init_socketLines=__esm({"src/socketLines.ts"(){"use strict";Utf8LineBuffer=class{constructor(maxBufferBytes){this.maxBufferBytes=maxBufferBytes}buffer="";decoder=new StringDecoder3("utf8");push(chunk){if(this.buffer+=this.decoder.write(chunk),Buffer.byteLength(this.buffer,"utf8")>this.maxBufferBytes)return this.buffer="",{lines:[],overflow:!0};let lines=[],newlineIndex;for(;(newlineIndex=this.buffer.indexOf(`
1067
+ `))!==-1;)lines.push(this.buffer.slice(0,newlineIndex)),this.buffer=this.buffer.slice(newlineIndex+1);return{lines,overflow:!1}}}}});import fs8 from"node:fs";import os6 from"node:os";import path10 from"node:path";function resolveNativeHostDirectory(options={}){let env=options.env??process.env,home=(options.homedir??os6.homedir)();switch(options.platform??process.platform){case"darwin":return path10.join(home,"Library/Application Support/Google/Chrome/NativeMessagingHosts");case"linux":return path10.join(home,".config/google-chrome/NativeMessagingHosts");case"win32":return path10.join(env.PROGRAMDATA||"C:\\ProgramData","Google\\Chrome\\NativeMessagingHosts");default:throw new Error(`Unsupported platform: ${String(options.platform??process.platform)}`)}}var MEARL_NATIVE_HOST_NAMES,init_nativeHost=__esm({"../client/dist/nativeHost.js"(){"use strict";MEARL_NATIVE_HOST_NAMES={skills:"com.alibaba.mearl.skills",mcp:"com.alibaba.mearl.mcp"}}});var require_ms=__commonJS({"../../node_modules/.pnpm/ms@2.1.3/node_modules/ms/index.js"(exports,module){var s=1e3,m=s*60,h=m*60,d=h*24,w=d*7,y=d*365.25;module.exports=function(val,options){options=options||{};var type=typeof val;if(type==="string"&&val.length>0)return parse4(val);if(type==="number"&&isFinite(val))return options.long?fmtLong(val):fmtShort(val);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(val))};function parse4(str){if(str=String(str),!(str.length>100)){var match=/^(-?(?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(str);if(match){var n=parseFloat(match[1]),type=(match[2]||"ms").toLowerCase();switch(type){case"years":case"year":case"yrs":case"yr":case"y":return n*y;case"weeks":case"week":case"w":return n*w;case"days":case"day":case"d":return n*d;case"hours":case"hour":case"hrs":case"hr":case"h":return n*h;case"minutes":case"minute":case"mins":case"min":case"m":return n*m;case"seconds":case"second":case"secs":case"sec":case"s":return n*s;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return n;default:return}}}}function fmtShort(ms){var msAbs=Math.abs(ms);return msAbs>=d?Math.round(ms/d)+"d":msAbs>=h?Math.round(ms/h)+"h":msAbs>=m?Math.round(ms/m)+"m":msAbs>=s?Math.round(ms/s)+"s":ms+"ms"}function fmtLong(ms){var msAbs=Math.abs(ms);return msAbs>=d?plural(ms,msAbs,d,"day"):msAbs>=h?plural(ms,msAbs,h,"hour"):msAbs>=m?plural(ms,msAbs,m,"minute"):msAbs>=s?plural(ms,msAbs,s,"second"):ms+" ms"}function plural(ms,msAbs,n,name){var isPlural=msAbs>=n*1.5;return Math.round(ms/n)+" "+name+(isPlural?"s":"")}}});var require_common=__commonJS({"../../node_modules/.pnpm/debug@4.4.3_supports-color@5.5.0/node_modules/debug/src/common.js"(exports,module){function setup(env){createDebug.debug=createDebug,createDebug.default=createDebug,createDebug.coerce=coerce,createDebug.disable=disable,createDebug.enable=enable,createDebug.enabled=enabled,createDebug.humanize=require_ms(),createDebug.destroy=destroy,Object.keys(env).forEach(key=>{createDebug[key]=env[key]}),createDebug.names=[],createDebug.skips=[],createDebug.formatters={};function selectColor(namespace){let hash2=0;for(let i=0;i<namespace.length;i++)hash2=(hash2<<5)-hash2+namespace.charCodeAt(i),hash2|=0;return createDebug.colors[Math.abs(hash2)%createDebug.colors.length]}createDebug.selectColor=selectColor;function createDebug(namespace){let prevTime,enableOverride=null,namespacesCache,enabledCache;function debug(...args){if(!debug.enabled)return;let self=debug,curr=Number(new Date),ms=curr-(prevTime||curr);self.diff=ms,self.prev=prevTime,self.curr=curr,prevTime=curr,args[0]=createDebug.coerce(args[0]),typeof args[0]!="string"&&args.unshift("%O");let index=0;args[0]=args[0].replace(/%([a-zA-Z%])/g,(match,format)=>{if(match==="%%")return"%";index++;let formatter=createDebug.formatters[format];if(typeof formatter=="function"){let val=args[index];match=formatter.call(self,val),args.splice(index,1),index--}return match}),createDebug.formatArgs.call(self,args),(self.log||createDebug.log).apply(self,args)}return debug.namespace=namespace,debug.useColors=createDebug.useColors(),debug.color=createDebug.selectColor(namespace),debug.extend=extend2,debug.destroy=createDebug.destroy,Object.defineProperty(debug,"enabled",{enumerable:!0,configurable:!1,get:()=>enableOverride!==null?enableOverride:(namespacesCache!==createDebug.namespaces&&(namespacesCache=createDebug.namespaces,enabledCache=createDebug.enabled(namespace)),enabledCache),set:v=>{enableOverride=v}}),typeof createDebug.init=="function"&&createDebug.init(debug),debug}function extend2(namespace,delimiter){let newDebug=createDebug(this.namespace+(typeof delimiter>"u"?":":delimiter)+namespace);return newDebug.log=this.log,newDebug}function enable(namespaces){createDebug.save(namespaces),createDebug.namespaces=namespaces,createDebug.names=[],createDebug.skips=[];let split=(typeof namespaces=="string"?namespaces:"").trim().replace(/\s+/g,",").split(",").filter(Boolean);for(let ns of split)ns[0]==="-"?createDebug.skips.push(ns.slice(1)):createDebug.names.push(ns)}function matchesTemplate(search,template){let searchIndex=0,templateIndex=0,starIndex=-1,matchIndex=0;for(;searchIndex<search.length;)if(templateIndex<template.length&&(template[templateIndex]===search[searchIndex]||template[templateIndex]==="*"))template[templateIndex]==="*"?(starIndex=templateIndex,matchIndex=searchIndex,templateIndex++):(searchIndex++,templateIndex++);else if(starIndex!==-1)templateIndex=starIndex+1,matchIndex++,searchIndex=matchIndex;else return!1;for(;templateIndex<template.length&&template[templateIndex]==="*";)templateIndex++;return templateIndex===template.length}function disable(){let namespaces=[...createDebug.names,...createDebug.skips.map(namespace=>"-"+namespace)].join(",");return createDebug.enable(""),namespaces}function enabled(name){for(let skip of createDebug.skips)if(matchesTemplate(name,skip))return!1;for(let ns of createDebug.names)if(matchesTemplate(name,ns))return!0;return!1}function coerce(val){return val instanceof Error?val.stack||val.message:val}function destroy(){console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.")}return createDebug.enable(createDebug.load()),createDebug}module.exports=setup}});var require_browser=__commonJS({"../../node_modules/.pnpm/debug@4.4.3_supports-color@5.5.0/node_modules/debug/src/browser.js"(exports,module){exports.formatArgs=formatArgs;exports.save=save;exports.load=load;exports.useColors=useColors;exports.storage=localstorage();exports.destroy=(()=>{let warned=!1;return()=>{warned||(warned=!0,console.warn("Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`."))}})();exports.colors=["#0000CC","#0000FF","#0033CC","#0033FF","#0066CC","#0066FF","#0099CC","#0099FF","#00CC00","#00CC33","#00CC66","#00CC99","#00CCCC","#00CCFF","#3300CC","#3300FF","#3333CC","#3333FF","#3366CC","#3366FF","#3399CC","#3399FF","#33CC00","#33CC33","#33CC66","#33CC99","#33CCCC","#33CCFF","#6600CC","#6600FF","#6633CC","#6633FF","#66CC00","#66CC33","#9900CC","#9900FF","#9933CC","#9933FF","#99CC00","#99CC33","#CC0000","#CC0033","#CC0066","#CC0099","#CC00CC","#CC00FF","#CC3300","#CC3333","#CC3366","#CC3399","#CC33CC","#CC33FF","#CC6600","#CC6633","#CC9900","#CC9933","#CCCC00","#CCCC33","#FF0000","#FF0033","#FF0066","#FF0099","#FF00CC","#FF00FF","#FF3300","#FF3333","#FF3366","#FF3399","#FF33CC","#FF33FF","#FF6600","#FF6633","#FF9900","#FF9933","#FFCC00","#FFCC33"];function useColors(){if(typeof window<"u"&&window.process&&(window.process.type==="renderer"||window.process.__nwjs))return!0;if(typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/(edge|trident)\/(\d+)/))return!1;let m;return typeof document<"u"&&document.documentElement&&document.documentElement.style&&document.documentElement.style.WebkitAppearance||typeof window<"u"&&window.console&&(window.console.firebug||window.console.exception&&window.console.table)||typeof navigator<"u"&&navigator.userAgent&&(m=navigator.userAgent.toLowerCase().match(/firefox\/(\d+)/))&&parseInt(m[1],10)>=31||typeof navigator<"u"&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)}function formatArgs(args){if(args[0]=(this.useColors?"%c":"")+this.namespace+(this.useColors?" %c":" ")+args[0]+(this.useColors?"%c ":" ")+"+"+module.exports.humanize(this.diff),!this.useColors)return;let c="color: "+this.color;args.splice(1,0,c,"color: inherit");let index=0,lastC=0;args[0].replace(/%[a-zA-Z%]/g,match=>{match!=="%%"&&(index++,match==="%c"&&(lastC=index))}),args.splice(lastC,0,c)}exports.log=console.debug||console.log||(()=>{});function save(namespaces){try{namespaces?exports.storage.setItem("debug",namespaces):exports.storage.removeItem("debug")}catch{}}function load(){let r;try{r=exports.storage.getItem("debug")||exports.storage.getItem("DEBUG")}catch{}return!r&&typeof process<"u"&&"env"in process&&(r=process.env.DEBUG),r}function localstorage(){try{return localStorage}catch{}}module.exports=require_common()(exports);var{formatters}=module.exports;formatters.j=function(v){try{return JSON.stringify(v)}catch(error48){return"[UnexpectedJSONParseError]: "+error48.message}}}});var require_has_flag=__commonJS({"../../node_modules/.pnpm/has-flag@3.0.0/node_modules/has-flag/index.js"(exports,module){"use strict";module.exports=(flag,argv)=>{argv=argv||process.argv;let prefix=flag.startsWith("-")?"":flag.length===1?"-":"--",pos=argv.indexOf(prefix+flag),terminatorPos=argv.indexOf("--");return pos!==-1&&(terminatorPos===-1?!0:pos<terminatorPos)}}});var require_supports_color=__commonJS({"../../node_modules/.pnpm/supports-color@5.5.0/node_modules/supports-color/index.js"(exports,module){"use strict";var os13=__require("os"),hasFlag=require_has_flag(),env=process.env,forceColor;hasFlag("no-color")||hasFlag("no-colors")||hasFlag("color=false")?forceColor=!1:(hasFlag("color")||hasFlag("colors")||hasFlag("color=true")||hasFlag("color=always"))&&(forceColor=!0);"FORCE_COLOR"in env&&(forceColor=env.FORCE_COLOR.length===0||parseInt(env.FORCE_COLOR,10)!==0);function translateLevel(level){return level===0?!1:{level,hasBasic:!0,has256:level>=2,has16m:level>=3}}function supportsColor(stream){if(forceColor===!1)return 0;if(hasFlag("color=16m")||hasFlag("color=full")||hasFlag("color=truecolor"))return 3;if(hasFlag("color=256"))return 2;if(stream&&!stream.isTTY&&forceColor!==!0)return 0;let min=forceColor?1:0;if(process.platform==="win32"){let osRelease=os13.release().split(".");return Number(process.versions.node.split(".")[0])>=8&&Number(osRelease[0])>=10&&Number(osRelease[2])>=10586?Number(osRelease[2])>=14931?3:2:1}if("CI"in env)return["TRAVIS","CIRCLECI","APPVEYOR","GITLAB_CI"].some(sign=>sign in env)||env.CI_NAME==="codeship"?1:min;if("TEAMCITY_VERSION"in env)return/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION)?1:0;if(env.COLORTERM==="truecolor")return 3;if("TERM_PROGRAM"in env){let version3=parseInt((env.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(env.TERM_PROGRAM){case"iTerm.app":return version3>=3?3:2;case"Apple_Terminal":return 2}}return/-256(color)?$/i.test(env.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)||"COLORTERM"in env?1:(env.TERM==="dumb",min)}function getSupportLevel(stream){let level=supportsColor(stream);return translateLevel(level)}module.exports={supportsColor:getSupportLevel,stdout:getSupportLevel(process.stdout),stderr:getSupportLevel(process.stderr)}}});var require_node=__commonJS({"../../node_modules/.pnpm/debug@4.4.3_supports-color@5.5.0/node_modules/debug/src/node.js"(exports,module){var tty=__require("tty"),util=__require("util");exports.init=init;exports.log=log2;exports.formatArgs=formatArgs;exports.save=save;exports.load=load;exports.useColors=useColors;exports.destroy=util.deprecate(()=>{},"Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.");exports.colors=[6,2,3,4,5,1];try{let supportsColor=require_supports_color();supportsColor&&(supportsColor.stderr||supportsColor).level>=2&&(exports.colors=[20,21,26,27,32,33,38,39,40,41,42,43,44,45,56,57,62,63,68,69,74,75,76,77,78,79,80,81,92,93,98,99,112,113,128,129,134,135,148,149,160,161,162,163,164,165,166,167,168,169,170,171,172,173,178,179,184,185,196,197,198,199,200,201,202,203,204,205,206,207,208,209,214,215,220,221])}catch{}exports.inspectOpts=Object.keys(process.env).filter(key=>/^debug_/i.test(key)).reduce((obj,key)=>{let prop=key.substring(6).toLowerCase().replace(/_([a-z])/g,(_,k)=>k.toUpperCase()),val=process.env[key];return/^(yes|on|true|enabled)$/i.test(val)?val=!0:/^(no|off|false|disabled)$/i.test(val)?val=!1:val==="null"?val=null:val=Number(val),obj[prop]=val,obj},{});function useColors(){return"colors"in exports.inspectOpts?!!exports.inspectOpts.colors:tty.isatty(process.stderr.fd)}function formatArgs(args){let{namespace:name,useColors:useColors2}=this;if(useColors2){let c=this.color,colorCode="\x1B[3"+(c<8?c:"8;5;"+c),prefix=` ${colorCode};1m${name} \x1B[0m`;args[0]=prefix+args[0].split(`
1068
1068
  `).join(`
1069
1069
  `+prefix),args.push(colorCode+"m+"+module.exports.humanize(this.diff)+"\x1B[0m")}else args[0]=getDate()+name+" "+args[0]}function getDate(){return exports.inspectOpts.hideDate?"":new Date().toISOString()+" "}function log2(...args){return process.stderr.write(util.formatWithOptions(exports.inspectOpts,...args)+`
1070
1070
  `)}function save(namespaces){namespaces?process.env.DEBUG=namespaces:delete process.env.DEBUG}function load(){return process.env.DEBUG}function init(debug){debug.inspectOpts={};let keys=Object.keys(exports.inspectOpts);for(let i=0;i<keys.length;i++)debug.inspectOpts[keys[i]]=exports.inspectOpts[keys[i]]}module.exports=require_common()(exports);var{formatters}=module.exports;formatters.o=function(v){return this.inspectOpts.colors=this.useColors,util.inspect(v,this.inspectOpts).split(`
1071
1071
  `).map(str=>str.trim()).join(" ")};formatters.O=function(v){return this.inspectOpts.colors=this.useColors,util.inspect(v,this.inspectOpts)}}});var require_src=__commonJS({"../../node_modules/.pnpm/debug@4.4.3_supports-color@5.5.0/node_modules/debug/src/index.js"(exports,module){typeof process>"u"||process.type==="renderer"||process.browser===!0||process.__nwjs?module.exports=require_browser():module.exports=require_node()}});var require_wrappy=__commonJS({"../../node_modules/.pnpm/wrappy@1.0.2/node_modules/wrappy/wrappy.js"(exports,module){module.exports=wrappy;function wrappy(fn,cb){if(fn&&cb)return wrappy(fn)(cb);if(typeof fn!="function")throw new TypeError("need wrapper function");return Object.keys(fn).forEach(function(k){wrapper[k]=fn[k]}),wrapper;function wrapper(){for(var args=new Array(arguments.length),i=0;i<args.length;i++)args[i]=arguments[i];var ret=fn.apply(this,args),cb2=args[args.length-1];return typeof ret=="function"&&ret!==cb2&&Object.keys(cb2).forEach(function(k){ret[k]=cb2[k]}),ret}}}});var require_once=__commonJS({"../../node_modules/.pnpm/once@1.4.0/node_modules/once/once.js"(exports,module){var wrappy=require_wrappy();module.exports=wrappy(once);module.exports.strict=wrappy(onceStrict);once.proto=once(function(){Object.defineProperty(Function.prototype,"once",{value:function(){return once(this)},configurable:!0}),Object.defineProperty(Function.prototype,"onceStrict",{value:function(){return onceStrict(this)},configurable:!0})});function once(fn){var f=function(){return f.called?f.value:(f.called=!0,f.value=fn.apply(this,arguments))};return f.called=!1,f}function onceStrict(fn){var f=function(){if(f.called)throw new Error(f.onceError);return f.called=!0,f.value=fn.apply(this,arguments)},name=fn.name||"Function wrapped with `once`";return f.onceError=name+" shouldn't be called more than once",f.called=!1,f}}});var require_end_of_stream=__commonJS({"../../node_modules/.pnpm/end-of-stream@1.4.5/node_modules/end-of-stream/index.js"(exports,module){var once=require_once(),noop=function(){},qnt=global.Bare?queueMicrotask:process.nextTick.bind(process),isRequest=function(stream){return stream.setHeader&&typeof stream.abort=="function"},isChildProcess=function(stream){return stream.stdio&&Array.isArray(stream.stdio)&&stream.stdio.length===3},eos=function(stream,opts,callback){if(typeof opts=="function")return eos(stream,null,opts);opts||(opts={}),callback=once(callback||noop);var ws=stream._writableState,rs=stream._readableState,readable=opts.readable||opts.readable!==!1&&stream.readable,writable=opts.writable||opts.writable!==!1&&stream.writable,cancelled=!1,onlegacyfinish=function(){stream.writable||onfinish()},onfinish=function(){writable=!1,readable||callback.call(stream)},onend=function(){readable=!1,writable||callback.call(stream)},onexit=function(exitCode){callback.call(stream,exitCode?new Error("exited with error code: "+exitCode):null)},onerror=function(err){callback.call(stream,err)},onclose=function(){qnt(onclosenexttick)},onclosenexttick=function(){if(!cancelled){if(readable&&!(rs&&rs.ended&&!rs.destroyed))return callback.call(stream,new Error("premature close"));if(writable&&!(ws&&ws.ended&&!ws.destroyed))return callback.call(stream,new Error("premature close"))}},onrequest=function(){stream.req.on("finish",onfinish)};return isRequest(stream)?(stream.on("complete",onfinish),stream.on("abort",onclose),stream.req?onrequest():stream.on("request",onrequest)):writable&&!ws&&(stream.on("end",onlegacyfinish),stream.on("close",onlegacyfinish)),isChildProcess(stream)&&stream.on("exit",onexit),stream.on("end",onend),stream.on("finish",onfinish),opts.error!==!1&&stream.on("error",onerror),stream.on("close",onclose),function(){cancelled=!0,stream.removeListener("complete",onfinish),stream.removeListener("abort",onclose),stream.removeListener("request",onrequest),stream.req&&stream.req.removeListener("finish",onfinish),stream.removeListener("end",onlegacyfinish),stream.removeListener("close",onlegacyfinish),stream.removeListener("finish",onfinish),stream.removeListener("exit",onexit),stream.removeListener("end",onend),stream.removeListener("error",onerror),stream.removeListener("close",onclose)}};module.exports=eos}});var require_pump=__commonJS({"../../node_modules/.pnpm/pump@3.0.4/node_modules/pump/index.js"(exports,module){var once=require_once(),eos=require_end_of_stream(),fs24;try{fs24=__require("fs")}catch{}var noop=function(){},ancient=typeof process>"u"?!1:/^v?\.0/.test(process.version),isFn=function(fn){return typeof fn=="function"},isFS=function(stream){return!ancient||!fs24?!1:(stream instanceof(fs24.ReadStream||noop)||stream instanceof(fs24.WriteStream||noop))&&isFn(stream.close)},isRequest=function(stream){return stream.setHeader&&isFn(stream.abort)},destroyer=function(stream,reading,writing,callback){callback=once(callback);var closed=!1;stream.on("close",function(){closed=!0}),eos(stream,{readable:reading,writable:writing},function(err){if(err)return callback(err);closed=!0,callback()});var destroyed=!1;return function(err){if(!closed&&!destroyed){if(destroyed=!0,isFS(stream))return stream.close(noop);if(isRequest(stream))return stream.abort();if(isFn(stream.destroy))return stream.destroy();callback(err||new Error("stream was destroyed"))}}},call=function(fn){fn()},pipe2=function(from,to){return from.pipe(to)},pump=function(){var streams=Array.prototype.slice.call(arguments),callback=isFn(streams[streams.length-1]||noop)&&streams.pop()||noop;if(Array.isArray(streams[0])&&(streams=streams[0]),streams.length<2)throw new Error("pump requires two streams per minimum");var error48,destroys=streams.map(function(stream,i){var reading=i<streams.length-1,writing=i>0;return destroyer(stream,reading,writing,function(err){error48||(error48=err),err&&destroys.forEach(call),!reading&&(destroys.forEach(call),callback(error48))})});return streams.reduce(pipe2)};module.exports=pump}});var require_buffer_stream=__commonJS({"../../node_modules/.pnpm/get-stream@5.2.0/node_modules/get-stream/buffer-stream.js"(exports,module){"use strict";var{PassThrough:PassThroughStream}=__require("stream");module.exports=options=>{options={...options};let{array:array2}=options,{encoding}=options,isBuffer=encoding==="buffer",objectMode=!1;array2?objectMode=!(encoding||isBuffer):encoding=encoding||"utf8",isBuffer&&(encoding=null);let stream=new PassThroughStream({objectMode});encoding&&stream.setEncoding(encoding);let length=0,chunks=[];return stream.on("data",chunk=>{chunks.push(chunk),objectMode?length=chunks.length:length+=chunk.length}),stream.getBufferedValue=()=>array2?chunks:isBuffer?Buffer.concat(chunks,length):chunks.join(""),stream.getBufferedLength=()=>length,stream}}});var require_get_stream=__commonJS({"../../node_modules/.pnpm/get-stream@5.2.0/node_modules/get-stream/index.js"(exports,module){"use strict";var{constants:BufferConstants}=__require("buffer"),pump=require_pump(),bufferStream=require_buffer_stream(),MaxBufferError=class extends Error{constructor(){super("maxBuffer exceeded"),this.name="MaxBufferError"}};async function getStream(inputStream,options){if(!inputStream)return Promise.reject(new Error("Expected a stream"));options={maxBuffer:1/0,...options};let{maxBuffer}=options,stream;return await new Promise((resolve11,reject)=>{let rejectPromise=error48=>{error48&&stream.getBufferedLength()<=BufferConstants.MAX_LENGTH&&(error48.bufferedData=stream.getBufferedValue()),reject(error48)};stream=pump(inputStream,bufferStream(options),error48=>{if(error48){rejectPromise(error48);return}resolve11()}),stream.on("data",()=>{stream.getBufferedLength()>maxBuffer&&rejectPromise(new MaxBufferError)})}),stream.getBufferedValue()}module.exports=getStream;module.exports.default=getStream;module.exports.buffer=(stream,options)=>getStream(stream,{...options,encoding:"buffer"});module.exports.array=(stream,options)=>getStream(stream,{...options,array:!0});module.exports.MaxBufferError=MaxBufferError}});var require_pend=__commonJS({"../../node_modules/.pnpm/pend@1.2.0/node_modules/pend/index.js"(exports,module){module.exports=Pend;function Pend(){this.pending=0,this.max=1/0,this.listeners=[],this.waiting=[],this.error=null}Pend.prototype.go=function(fn){this.pending<this.max?pendGo(this,fn):this.waiting.push(fn)};Pend.prototype.wait=function(cb){this.pending===0?cb(this.error):this.listeners.push(cb)};Pend.prototype.hold=function(){return pendHold(this)};function pendHold(self){self.pending+=1;var called=!1;return onCb;function onCb(err){if(called)throw new Error("callback called twice");if(called=!0,self.error=self.error||err,self.pending-=1,self.waiting.length>0&&self.pending<self.max)pendGo(self,self.waiting.shift());else if(self.pending===0){var listeners=self.listeners;self.listeners=[],listeners.forEach(cbListener)}}function cbListener(listener){listener(self.error)}}function pendGo(self,fn){fn(pendHold(self))}}});var require_fd_slicer=__commonJS({"../../node_modules/.pnpm/fd-slicer@1.1.0/node_modules/fd-slicer/index.js"(exports){var fs24=__require("fs"),util=__require("util"),stream=__require("stream"),Readable2=stream.Readable,Writable2=stream.Writable,PassThrough=stream.PassThrough,Pend=require_pend(),EventEmitter2=__require("events").EventEmitter;exports.createFromBuffer=createFromBuffer;exports.createFromFd=createFromFd;exports.BufferSlicer=BufferSlicer;exports.FdSlicer=FdSlicer;util.inherits(FdSlicer,EventEmitter2);function FdSlicer(fd,options){options=options||{},EventEmitter2.call(this),this.fd=fd,this.pend=new Pend,this.pend.max=1,this.refCount=0,this.autoClose=!!options.autoClose}FdSlicer.prototype.read=function(buffer,offset,length,position,callback){var self=this;self.pend.go(function(cb){fs24.read(self.fd,buffer,offset,length,position,function(err,bytesRead,buffer2){cb(),callback(err,bytesRead,buffer2)})})};FdSlicer.prototype.write=function(buffer,offset,length,position,callback){var self=this;self.pend.go(function(cb){fs24.write(self.fd,buffer,offset,length,position,function(err,written,buffer2){cb(),callback(err,written,buffer2)})})};FdSlicer.prototype.createReadStream=function(options){return new ReadStream(this,options)};FdSlicer.prototype.createWriteStream=function(options){return new WriteStream(this,options)};FdSlicer.prototype.ref=function(){this.refCount+=1};FdSlicer.prototype.unref=function(){var self=this;if(self.refCount-=1,self.refCount>0)return;if(self.refCount<0)throw new Error("invalid unref");self.autoClose&&fs24.close(self.fd,onCloseDone);function onCloseDone(err){err?self.emit("error",err):self.emit("close")}};util.inherits(ReadStream,Readable2);function ReadStream(context,options){options=options||{},Readable2.call(this,options),this.context=context,this.context.ref(),this.start=options.start||0,this.endOffset=options.end,this.pos=this.start,this.destroyed=!1}ReadStream.prototype._read=function(n){var self=this;if(!self.destroyed){var toRead=Math.min(self._readableState.highWaterMark,n);if(self.endOffset!=null&&(toRead=Math.min(toRead,self.endOffset-self.pos)),toRead<=0){self.destroyed=!0,self.push(null),self.context.unref();return}self.context.pend.go(function(cb){if(self.destroyed)return cb();var buffer=new Buffer(toRead);fs24.read(self.context.fd,buffer,0,toRead,self.pos,function(err,bytesRead){err?self.destroy(err):bytesRead===0?(self.destroyed=!0,self.push(null),self.context.unref()):(self.pos+=bytesRead,self.push(buffer.slice(0,bytesRead))),cb()})})}};ReadStream.prototype.destroy=function(err){this.destroyed||(err=err||new Error("stream destroyed"),this.destroyed=!0,this.emit("error",err),this.context.unref())};util.inherits(WriteStream,Writable2);function WriteStream(context,options){options=options||{},Writable2.call(this,options),this.context=context,this.context.ref(),this.start=options.start||0,this.endOffset=options.end==null?1/0:+options.end,this.bytesWritten=0,this.pos=this.start,this.destroyed=!1,this.on("finish",this.destroy.bind(this))}WriteStream.prototype._write=function(buffer,encoding,callback){var self=this;if(!self.destroyed){if(self.pos+buffer.length>self.endOffset){var err=new Error("maximum file length exceeded");err.code="ETOOBIG",self.destroy(),callback(err);return}self.context.pend.go(function(cb){if(self.destroyed)return cb();fs24.write(self.context.fd,buffer,0,buffer.length,self.pos,function(err2,bytes){err2?(self.destroy(),cb(),callback(err2)):(self.bytesWritten+=bytes,self.pos+=bytes,self.emit("progress"),cb(),callback())})})}};WriteStream.prototype.destroy=function(){this.destroyed||(this.destroyed=!0,this.context.unref())};util.inherits(BufferSlicer,EventEmitter2);function BufferSlicer(buffer,options){EventEmitter2.call(this),options=options||{},this.refCount=0,this.buffer=buffer,this.maxChunkSize=options.maxChunkSize||Number.MAX_SAFE_INTEGER}BufferSlicer.prototype.read=function(buffer,offset,length,position,callback){var end=position+length,delta=end-this.buffer.length,written=delta>0?delta:length;this.buffer.copy(buffer,offset,position,end),setImmediate(function(){callback(null,written)})};BufferSlicer.prototype.write=function(buffer,offset,length,position,callback){buffer.copy(this.buffer,position,offset,offset+length),setImmediate(function(){callback(null,length,buffer)})};BufferSlicer.prototype.createReadStream=function(options){options=options||{};var readStream=new PassThrough(options);readStream.destroyed=!1,readStream.start=options.start||0,readStream.endOffset=options.end,readStream.pos=readStream.endOffset||this.buffer.length;for(var entireSlice=this.buffer.slice(readStream.start,readStream.pos),offset=0;;){var nextOffset=offset+this.maxChunkSize;if(nextOffset>=entireSlice.length){offset<entireSlice.length&&readStream.write(entireSlice.slice(offset,entireSlice.length));break}readStream.write(entireSlice.slice(offset,nextOffset)),offset=nextOffset}return readStream.end(),readStream.destroy=function(){readStream.destroyed=!0},readStream};BufferSlicer.prototype.createWriteStream=function(options){var bufferSlicer=this;options=options||{};var writeStream=new Writable2(options);return writeStream.start=options.start||0,writeStream.endOffset=options.end==null?this.buffer.length:+options.end,writeStream.bytesWritten=0,writeStream.pos=writeStream.start,writeStream.destroyed=!1,writeStream._write=function(buffer,encoding,callback){if(!writeStream.destroyed){var end=writeStream.pos+buffer.length;if(end>writeStream.endOffset){var err=new Error("maximum file length exceeded");err.code="ETOOBIG",writeStream.destroyed=!0,callback(err);return}buffer.copy(bufferSlicer.buffer,writeStream.pos,0,buffer.length),writeStream.bytesWritten+=buffer.length,writeStream.pos=end,writeStream.emit("progress"),callback()}},writeStream.destroy=function(){writeStream.destroyed=!0},writeStream};BufferSlicer.prototype.ref=function(){this.refCount+=1};BufferSlicer.prototype.unref=function(){if(this.refCount-=1,this.refCount<0)throw new Error("invalid unref")};function createFromBuffer(buffer,options){return new BufferSlicer(buffer,options)}function createFromFd(fd,options){return new FdSlicer(fd,options)}}});var require_buffer_crc32=__commonJS({"../../node_modules/.pnpm/buffer-crc32@0.2.13/node_modules/buffer-crc32/index.js"(exports,module){var Buffer2=__require("buffer").Buffer,CRC_TABLE=[0,1996959894,3993919788,2567524794,124634137,1886057615,3915621685,2657392035,249268274,2044508324,3772115230,2547177864,162941995,2125561021,3887607047,2428444049,498536548,1789927666,4089016648,2227061214,450548861,1843258603,4107580753,2211677639,325883990,1684777152,4251122042,2321926636,335633487,1661365465,4195302755,2366115317,997073096,1281953886,3579855332,2724688242,1006888145,1258607687,3524101629,2768942443,901097722,1119000684,3686517206,2898065728,853044451,1172266101,3705015759,2882616665,651767980,1373503546,3369554304,3218104598,565507253,1454621731,3485111705,3099436303,671266974,1594198024,3322730930,2970347812,795835527,1483230225,3244367275,3060149565,1994146192,31158534,2563907772,4023717930,1907459465,112637215,2680153253,3904427059,2013776290,251722036,2517215374,3775830040,2137656763,141376813,2439277719,3865271297,1802195444,476864866,2238001368,4066508878,1812370925,453092731,2181625025,4111451223,1706088902,314042704,2344532202,4240017532,1658658271,366619977,2362670323,4224994405,1303535960,984961486,2747007092,3569037538,1256170817,1037604311,2765210733,3554079995,1131014506,879679996,2909243462,3663771856,1141124467,855842277,2852801631,3708648649,1342533948,654459306,3188396048,3373015174,1466479909,544179635,3110523913,3462522015,1591671054,702138776,2966460450,3352799412,1504918807,783551873,3082640443,3233442989,3988292384,2596254646,62317068,1957810842,3939845945,2647816111,81470997,1943803523,3814918930,2489596804,225274430,2053790376,3826175755,2466906013,167816743,2097651377,4027552580,2265490386,503444072,1762050814,4150417245,2154129355,426522225,1852507879,4275313526,2312317920,282753626,1742555852,4189708143,2394877945,397917763,1622183637,3604390888,2714866558,953729732,1340076626,3518719985,2797360999,1068828381,1219638859,3624741850,2936675148,906185462,1090812512,3747672003,2825379669,829329135,1181335161,3412177804,3160834842,628085408,1382605366,3423369109,3138078467,570562233,1426400815,3317316542,2998733608,733239954,1555261956,3268935591,3050360625,752459403,1541320221,2607071920,3965973030,1969922972,40735498,2617837225,3943577151,1913087877,83908371,2512341634,3803740692,2075208622,213261112,2463272603,3855990285,2094854071,198958881,2262029012,4057260610,1759359992,534414190,2176718541,4139329115,1873836001,414664567,2282248934,4279200368,1711684554,285281116,2405801727,4167216745,1634467795,376229701,2685067896,3608007406,1308918612,956543938,2808555105,3495958263,1231636301,1047427035,2932959818,3654703836,1088359270,936918e3,2847714899,3736837829,1202900863,817233897,3183342108,3401237130,1404277552,615818150,3134207493,3453421203,1423857449,601450431,3009837614,3294710456,1567103746,711928724,3020668471,3272380065,1510334235,755167117];typeof Int32Array<"u"&&(CRC_TABLE=new Int32Array(CRC_TABLE));function ensureBuffer(input2){if(Buffer2.isBuffer(input2))return input2;var hasNewBufferAPI=typeof Buffer2.alloc=="function"&&typeof Buffer2.from=="function";if(typeof input2=="number")return hasNewBufferAPI?Buffer2.alloc(input2):new Buffer2(input2);if(typeof input2=="string")return hasNewBufferAPI?Buffer2.from(input2):new Buffer2(input2);throw new Error("input must be buffer, number, or string, received "+typeof input2)}function bufferizeInt(num){var tmp=ensureBuffer(4);return tmp.writeInt32BE(num,0),tmp}function _crc32(buf,previous){buf=ensureBuffer(buf),Buffer2.isBuffer(previous)&&(previous=previous.readUInt32BE(0));for(var crc=~~previous^-1,n=0;n<buf.length;n++)crc=CRC_TABLE[(crc^buf[n])&255]^crc>>>8;return crc^-1}function crc32(){return bufferizeInt(_crc32.apply(null,arguments))}crc32.signed=function(){return _crc32.apply(null,arguments)};crc32.unsigned=function(){return _crc32.apply(null,arguments)>>>0};module.exports=crc32}});var require_yauzl=__commonJS({"../../node_modules/.pnpm/yauzl@2.10.0/node_modules/yauzl/index.js"(exports){var fs24=__require("fs"),zlib=__require("zlib"),fd_slicer=require_fd_slicer(),crc32=require_buffer_crc32(),util=__require("util"),EventEmitter2=__require("events").EventEmitter,Transform=__require("stream").Transform,PassThrough=__require("stream").PassThrough,Writable2=__require("stream").Writable;exports.open=open4;exports.fromFd=fromFd;exports.fromBuffer=fromBuffer;exports.fromRandomAccessReader=fromRandomAccessReader;exports.dosDateTimeToDate=dosDateTimeToDate;exports.validateFileName=validateFileName;exports.ZipFile=ZipFile;exports.Entry=Entry;exports.RandomAccessReader=RandomAccessReader;function open4(path27,options,callback){typeof options=="function"&&(callback=options,options=null),options==null&&(options={}),options.autoClose==null&&(options.autoClose=!0),options.lazyEntries==null&&(options.lazyEntries=!1),options.decodeStrings==null&&(options.decodeStrings=!0),options.validateEntrySizes==null&&(options.validateEntrySizes=!0),options.strictFileNames==null&&(options.strictFileNames=!1),callback==null&&(callback=defaultCallback),fs24.open(path27,"r",function(err,fd){if(err)return callback(err);fromFd(fd,options,function(err2,zipfile){err2&&fs24.close(fd,defaultCallback),callback(err2,zipfile)})})}function fromFd(fd,options,callback){typeof options=="function"&&(callback=options,options=null),options==null&&(options={}),options.autoClose==null&&(options.autoClose=!1),options.lazyEntries==null&&(options.lazyEntries=!1),options.decodeStrings==null&&(options.decodeStrings=!0),options.validateEntrySizes==null&&(options.validateEntrySizes=!0),options.strictFileNames==null&&(options.strictFileNames=!1),callback==null&&(callback=defaultCallback),fs24.fstat(fd,function(err,stats){if(err)return callback(err);var reader=fd_slicer.createFromFd(fd,{autoClose:!0});fromRandomAccessReader(reader,stats.size,options,callback)})}function fromBuffer(buffer,options,callback){typeof options=="function"&&(callback=options,options=null),options==null&&(options={}),options.autoClose=!1,options.lazyEntries==null&&(options.lazyEntries=!1),options.decodeStrings==null&&(options.decodeStrings=!0),options.validateEntrySizes==null&&(options.validateEntrySizes=!0),options.strictFileNames==null&&(options.strictFileNames=!1);var reader=fd_slicer.createFromBuffer(buffer,{maxChunkSize:65536});fromRandomAccessReader(reader,buffer.length,options,callback)}function fromRandomAccessReader(reader,totalSize,options,callback){typeof options=="function"&&(callback=options,options=null),options==null&&(options={}),options.autoClose==null&&(options.autoClose=!0),options.lazyEntries==null&&(options.lazyEntries=!1),options.decodeStrings==null&&(options.decodeStrings=!0);var decodeStrings=!!options.decodeStrings;if(options.validateEntrySizes==null&&(options.validateEntrySizes=!0),options.strictFileNames==null&&(options.strictFileNames=!1),callback==null&&(callback=defaultCallback),typeof totalSize!="number")throw new Error("expected totalSize parameter to be a number");if(totalSize>Number.MAX_SAFE_INTEGER)throw new Error("zip file too large. only file sizes up to 2^52 are supported due to JavaScript's Number type being an IEEE 754 double.");reader.ref();var eocdrWithoutCommentSize=22,maxCommentSize=65535,bufferSize=Math.min(eocdrWithoutCommentSize+maxCommentSize,totalSize),buffer=newBuffer(bufferSize),bufferReadStart=totalSize-buffer.length;readAndAssertNoEof(reader,buffer,0,bufferSize,bufferReadStart,function(err){if(err)return callback(err);for(var i=bufferSize-eocdrWithoutCommentSize;i>=0;i-=1)if(buffer.readUInt32LE(i)===101010256){var eocdrBuffer=buffer.slice(i),diskNumber=eocdrBuffer.readUInt16LE(4);if(diskNumber!==0)return callback(new Error("multi-disk zip files are not supported: found disk number: "+diskNumber));var entryCount=eocdrBuffer.readUInt16LE(10),centralDirectoryOffset=eocdrBuffer.readUInt32LE(16),commentLength=eocdrBuffer.readUInt16LE(20),expectedCommentLength=eocdrBuffer.length-eocdrWithoutCommentSize;if(commentLength!==expectedCommentLength)return callback(new Error("invalid comment length. expected: "+expectedCommentLength+". found: "+commentLength));var comment=decodeStrings?decodeBuffer(eocdrBuffer,22,eocdrBuffer.length,!1):eocdrBuffer.slice(22);if(!(entryCount===65535||centralDirectoryOffset===4294967295))return callback(null,new ZipFile(reader,centralDirectoryOffset,totalSize,entryCount,comment,options.autoClose,options.lazyEntries,decodeStrings,options.validateEntrySizes,options.strictFileNames));var zip64EocdlBuffer=newBuffer(20),zip64EocdlOffset=bufferReadStart+i-zip64EocdlBuffer.length;readAndAssertNoEof(reader,zip64EocdlBuffer,0,zip64EocdlBuffer.length,zip64EocdlOffset,function(err2){if(err2)return callback(err2);if(zip64EocdlBuffer.readUInt32LE(0)!==117853008)return callback(new Error("invalid zip64 end of central directory locator signature"));var zip64EocdrOffset=readUInt64LE(zip64EocdlBuffer,8),zip64EocdrBuffer=newBuffer(56);readAndAssertNoEof(reader,zip64EocdrBuffer,0,zip64EocdrBuffer.length,zip64EocdrOffset,function(err3){return err3?callback(err3):zip64EocdrBuffer.readUInt32LE(0)!==101075792?callback(new Error("invalid zip64 end of central directory record signature")):(entryCount=readUInt64LE(zip64EocdrBuffer,32),centralDirectoryOffset=readUInt64LE(zip64EocdrBuffer,48),callback(null,new ZipFile(reader,centralDirectoryOffset,totalSize,entryCount,comment,options.autoClose,options.lazyEntries,decodeStrings,options.validateEntrySizes,options.strictFileNames)))})});return}callback(new Error("end of central directory record signature not found"))})}util.inherits(ZipFile,EventEmitter2);function ZipFile(reader,centralDirectoryOffset,fileSize,entryCount,comment,autoClose,lazyEntries,decodeStrings,validateEntrySizes,strictFileNames){var self=this;EventEmitter2.call(self),self.reader=reader,self.reader.on("error",function(err){emitError(self,err)}),self.reader.once("close",function(){self.emit("close")}),self.readEntryCursor=centralDirectoryOffset,self.fileSize=fileSize,self.entryCount=entryCount,self.comment=comment,self.entriesRead=0,self.autoClose=!!autoClose,self.lazyEntries=!!lazyEntries,self.decodeStrings=!!decodeStrings,self.validateEntrySizes=!!validateEntrySizes,self.strictFileNames=!!strictFileNames,self.isOpen=!0,self.emittedError=!1,self.lazyEntries||self._readEntry()}ZipFile.prototype.close=function(){this.isOpen&&(this.isOpen=!1,this.reader.unref())};function emitErrorAndAutoClose(self,err){self.autoClose&&self.close(),emitError(self,err)}function emitError(self,err){self.emittedError||(self.emittedError=!0,self.emit("error",err))}ZipFile.prototype.readEntry=function(){if(!this.lazyEntries)throw new Error("readEntry() called without lazyEntries:true");this._readEntry()};ZipFile.prototype._readEntry=function(){var self=this;if(self.entryCount===self.entriesRead){setImmediate(function(){self.autoClose&&self.close(),!self.emittedError&&self.emit("end")});return}if(!self.emittedError){var buffer=newBuffer(46);readAndAssertNoEof(self.reader,buffer,0,buffer.length,self.readEntryCursor,function(err){if(err)return emitErrorAndAutoClose(self,err);if(!self.emittedError){var entry=new Entry,signature=buffer.readUInt32LE(0);if(signature!==33639248)return emitErrorAndAutoClose(self,new Error("invalid central directory file header signature: 0x"+signature.toString(16)));if(entry.versionMadeBy=buffer.readUInt16LE(4),entry.versionNeededToExtract=buffer.readUInt16LE(6),entry.generalPurposeBitFlag=buffer.readUInt16LE(8),entry.compressionMethod=buffer.readUInt16LE(10),entry.lastModFileTime=buffer.readUInt16LE(12),entry.lastModFileDate=buffer.readUInt16LE(14),entry.crc32=buffer.readUInt32LE(16),entry.compressedSize=buffer.readUInt32LE(20),entry.uncompressedSize=buffer.readUInt32LE(24),entry.fileNameLength=buffer.readUInt16LE(28),entry.extraFieldLength=buffer.readUInt16LE(30),entry.fileCommentLength=buffer.readUInt16LE(32),entry.internalFileAttributes=buffer.readUInt16LE(36),entry.externalFileAttributes=buffer.readUInt32LE(38),entry.relativeOffsetOfLocalHeader=buffer.readUInt32LE(42),entry.generalPurposeBitFlag&64)return emitErrorAndAutoClose(self,new Error("strong encryption is not supported"));self.readEntryCursor+=46,buffer=newBuffer(entry.fileNameLength+entry.extraFieldLength+entry.fileCommentLength),readAndAssertNoEof(self.reader,buffer,0,buffer.length,self.readEntryCursor,function(err2){if(err2)return emitErrorAndAutoClose(self,err2);if(!self.emittedError){var isUtf8=(entry.generalPurposeBitFlag&2048)!==0;entry.fileName=self.decodeStrings?decodeBuffer(buffer,0,entry.fileNameLength,isUtf8):buffer.slice(0,entry.fileNameLength);var fileCommentStart=entry.fileNameLength+entry.extraFieldLength,extraFieldBuffer=buffer.slice(entry.fileNameLength,fileCommentStart);entry.extraFields=[];for(var i=0;i<extraFieldBuffer.length-3;){var headerId=extraFieldBuffer.readUInt16LE(i+0),dataSize=extraFieldBuffer.readUInt16LE(i+2),dataStart=i+4,dataEnd=dataStart+dataSize;if(dataEnd>extraFieldBuffer.length)return emitErrorAndAutoClose(self,new Error("extra field length exceeds extra field buffer size"));var dataBuffer=newBuffer(dataSize);extraFieldBuffer.copy(dataBuffer,0,dataStart,dataEnd),entry.extraFields.push({id:headerId,data:dataBuffer}),i=dataEnd}if(entry.fileComment=self.decodeStrings?decodeBuffer(buffer,fileCommentStart,fileCommentStart+entry.fileCommentLength,isUtf8):buffer.slice(fileCommentStart,fileCommentStart+entry.fileCommentLength),entry.comment=entry.fileComment,self.readEntryCursor+=buffer.length,self.entriesRead+=1,entry.uncompressedSize===4294967295||entry.compressedSize===4294967295||entry.relativeOffsetOfLocalHeader===4294967295){for(var zip64EiefBuffer=null,i=0;i<entry.extraFields.length;i++){var extraField=entry.extraFields[i];if(extraField.id===1){zip64EiefBuffer=extraField.data;break}}if(zip64EiefBuffer==null)return emitErrorAndAutoClose(self,new Error("expected zip64 extended information extra field"));var index=0;if(entry.uncompressedSize===4294967295){if(index+8>zip64EiefBuffer.length)return emitErrorAndAutoClose(self,new Error("zip64 extended information extra field does not include uncompressed size"));entry.uncompressedSize=readUInt64LE(zip64EiefBuffer,index),index+=8}if(entry.compressedSize===4294967295){if(index+8>zip64EiefBuffer.length)return emitErrorAndAutoClose(self,new Error("zip64 extended information extra field does not include compressed size"));entry.compressedSize=readUInt64LE(zip64EiefBuffer,index),index+=8}if(entry.relativeOffsetOfLocalHeader===4294967295){if(index+8>zip64EiefBuffer.length)return emitErrorAndAutoClose(self,new Error("zip64 extended information extra field does not include relative header offset"));entry.relativeOffsetOfLocalHeader=readUInt64LE(zip64EiefBuffer,index),index+=8}}if(self.decodeStrings)for(var i=0;i<entry.extraFields.length;i++){var extraField=entry.extraFields[i];if(extraField.id===28789){if(extraField.data.length<6||extraField.data.readUInt8(0)!==1)continue;var oldNameCrc32=extraField.data.readUInt32LE(1);if(crc32.unsigned(buffer.slice(0,entry.fileNameLength))!==oldNameCrc32)continue;entry.fileName=decodeBuffer(extraField.data,5,extraField.data.length,!0);break}}if(self.validateEntrySizes&&entry.compressionMethod===0){var expectedCompressedSize=entry.uncompressedSize;if(entry.isEncrypted()&&(expectedCompressedSize+=12),entry.compressedSize!==expectedCompressedSize){var msg="compressed/uncompressed size mismatch for stored file: "+entry.compressedSize+" != "+entry.uncompressedSize;return emitErrorAndAutoClose(self,new Error(msg))}}if(self.decodeStrings){self.strictFileNames||(entry.fileName=entry.fileName.replace(/\\/g,"/"));var errorMessage3=validateFileName(entry.fileName,self.validateFileNameOptions);if(errorMessage3!=null)return emitErrorAndAutoClose(self,new Error(errorMessage3))}self.emit("entry",entry),self.lazyEntries||self._readEntry()}})}})}};ZipFile.prototype.openReadStream=function(entry,options,callback){var self=this,relativeStart=0,relativeEnd=entry.compressedSize;if(callback==null)callback=options,options={};else{if(options.decrypt!=null){if(!entry.isEncrypted())throw new Error("options.decrypt can only be specified for encrypted entries");if(options.decrypt!==!1)throw new Error("invalid options.decrypt value: "+options.decrypt);if(entry.isCompressed()&&options.decompress!==!1)throw new Error("entry is encrypted and compressed, and options.decompress !== false")}if(options.decompress!=null){if(!entry.isCompressed())throw new Error("options.decompress can only be specified for compressed entries");if(!(options.decompress===!1||options.decompress===!0))throw new Error("invalid options.decompress value: "+options.decompress)}if(options.start!=null||options.end!=null){if(entry.isCompressed()&&options.decompress!==!1)throw new Error("start/end range not allowed for compressed entry without options.decompress === false");if(entry.isEncrypted()&&options.decrypt!==!1)throw new Error("start/end range not allowed for encrypted entry without options.decrypt === false")}if(options.start!=null){if(relativeStart=options.start,relativeStart<0)throw new Error("options.start < 0");if(relativeStart>entry.compressedSize)throw new Error("options.start > entry.compressedSize")}if(options.end!=null){if(relativeEnd=options.end,relativeEnd<0)throw new Error("options.end < 0");if(relativeEnd>entry.compressedSize)throw new Error("options.end > entry.compressedSize");if(relativeEnd<relativeStart)throw new Error("options.end < options.start")}}if(!self.isOpen)return callback(new Error("closed"));if(entry.isEncrypted()&&options.decrypt!==!1)return callback(new Error("entry is encrypted, and options.decrypt !== false"));self.reader.ref();var buffer=newBuffer(30);readAndAssertNoEof(self.reader,buffer,0,buffer.length,entry.relativeOffsetOfLocalHeader,function(err){try{if(err)return callback(err);var signature=buffer.readUInt32LE(0);if(signature!==67324752)return callback(new Error("invalid local file header signature: 0x"+signature.toString(16)));var fileNameLength=buffer.readUInt16LE(26),extraFieldLength=buffer.readUInt16LE(28),localFileHeaderEnd=entry.relativeOffsetOfLocalHeader+buffer.length+fileNameLength+extraFieldLength,decompress;if(entry.compressionMethod===0)decompress=!1;else if(entry.compressionMethod===8)decompress=options.decompress!=null?options.decompress:!0;else return callback(new Error("unsupported compression method: "+entry.compressionMethod));var fileDataStart=localFileHeaderEnd,fileDataEnd=fileDataStart+entry.compressedSize;if(entry.compressedSize!==0&&fileDataEnd>self.fileSize)return callback(new Error("file data overflows file bounds: "+fileDataStart+" + "+entry.compressedSize+" > "+self.fileSize));var readStream=self.reader.createReadStream({start:fileDataStart+relativeStart,end:fileDataStart+relativeEnd}),endpointStream=readStream;if(decompress){var destroyed=!1,inflateFilter=zlib.createInflateRaw();readStream.on("error",function(err2){setImmediate(function(){destroyed||inflateFilter.emit("error",err2)})}),readStream.pipe(inflateFilter),self.validateEntrySizes?(endpointStream=new AssertByteCountStream(entry.uncompressedSize),inflateFilter.on("error",function(err2){setImmediate(function(){destroyed||endpointStream.emit("error",err2)})}),inflateFilter.pipe(endpointStream)):endpointStream=inflateFilter,endpointStream.destroy=function(){destroyed=!0,inflateFilter!==endpointStream&&inflateFilter.unpipe(endpointStream),readStream.unpipe(inflateFilter),readStream.destroy()}}callback(null,endpointStream)}finally{self.reader.unref()}})};function Entry(){}Entry.prototype.getLastModDate=function(){return dosDateTimeToDate(this.lastModFileDate,this.lastModFileTime)};Entry.prototype.isEncrypted=function(){return(this.generalPurposeBitFlag&1)!==0};Entry.prototype.isCompressed=function(){return this.compressionMethod===8};function dosDateTimeToDate(date5,time3){var day=date5&31,month=(date5>>5&15)-1,year=(date5>>9&127)+1980,millisecond=0,second=(time3&31)*2,minute=time3>>5&63,hour=time3>>11&31;return new Date(year,month,day,hour,minute,second,millisecond)}function validateFileName(fileName){return fileName.indexOf("\\")!==-1?"invalid characters in fileName: "+fileName:/^[a-zA-Z]:/.test(fileName)||/^\//.test(fileName)?"absolute path: "+fileName:fileName.split("/").indexOf("..")!==-1?"invalid relative path: "+fileName:null}function readAndAssertNoEof(reader,buffer,offset,length,position,callback){if(length===0)return setImmediate(function(){callback(null,newBuffer(0))});reader.read(buffer,offset,length,position,function(err,bytesRead){if(err)return callback(err);if(bytesRead<length)return callback(new Error("unexpected EOF"));callback()})}util.inherits(AssertByteCountStream,Transform);function AssertByteCountStream(byteCount){Transform.call(this),this.actualByteCount=0,this.expectedByteCount=byteCount}AssertByteCountStream.prototype._transform=function(chunk,encoding,cb){if(this.actualByteCount+=chunk.length,this.actualByteCount>this.expectedByteCount){var msg="too many bytes in the stream. expected "+this.expectedByteCount+". got at least "+this.actualByteCount;return cb(new Error(msg))}cb(null,chunk)};AssertByteCountStream.prototype._flush=function(cb){if(this.actualByteCount<this.expectedByteCount){var msg="not enough bytes in the stream. expected "+this.expectedByteCount+". got only "+this.actualByteCount;return cb(new Error(msg))}cb()};util.inherits(RandomAccessReader,EventEmitter2);function RandomAccessReader(){EventEmitter2.call(this),this.refCount=0}RandomAccessReader.prototype.ref=function(){this.refCount+=1};RandomAccessReader.prototype.unref=function(){var self=this;if(self.refCount-=1,self.refCount>0)return;if(self.refCount<0)throw new Error("invalid unref");self.close(onCloseDone);function onCloseDone(err){if(err)return self.emit("error",err);self.emit("close")}};RandomAccessReader.prototype.createReadStream=function(options){var start=options.start,end=options.end;if(start===end){var emptyStream=new PassThrough;return setImmediate(function(){emptyStream.end()}),emptyStream}var stream=this._readStreamForRange(start,end),destroyed=!1,refUnrefFilter=new RefUnrefFilter(this);stream.on("error",function(err){setImmediate(function(){destroyed||refUnrefFilter.emit("error",err)})}),refUnrefFilter.destroy=function(){stream.unpipe(refUnrefFilter),refUnrefFilter.unref(),stream.destroy()};var byteCounter=new AssertByteCountStream(end-start);return refUnrefFilter.on("error",function(err){setImmediate(function(){destroyed||byteCounter.emit("error",err)})}),byteCounter.destroy=function(){destroyed=!0,refUnrefFilter.unpipe(byteCounter),refUnrefFilter.destroy()},stream.pipe(refUnrefFilter).pipe(byteCounter)};RandomAccessReader.prototype._readStreamForRange=function(start,end){throw new Error("not implemented")};RandomAccessReader.prototype.read=function(buffer,offset,length,position,callback){var readStream=this.createReadStream({start:position,end:position+length}),writeStream=new Writable2,written=0;writeStream._write=function(chunk,encoding,cb){chunk.copy(buffer,offset+written,0,chunk.length),written+=chunk.length,cb()},writeStream.on("finish",callback),readStream.on("error",function(error48){callback(error48)}),readStream.pipe(writeStream)};RandomAccessReader.prototype.close=function(callback){setImmediate(callback)};util.inherits(RefUnrefFilter,PassThrough);function RefUnrefFilter(context){PassThrough.call(this),this.context=context,this.context.ref(),this.unreffedYet=!1}RefUnrefFilter.prototype._flush=function(cb){this.unref(),cb()};RefUnrefFilter.prototype.unref=function(cb){this.unreffedYet||(this.unreffedYet=!0,this.context.unref())};var cp437="\0☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ";function decodeBuffer(buffer,start,end,isUtf8){if(isUtf8)return buffer.toString("utf8",start,end);for(var result="",i=start;i<end;i++)result+=cp437[buffer[i]];return result}function readUInt64LE(buffer,offset){var lower32=buffer.readUInt32LE(offset),upper32=buffer.readUInt32LE(offset+4);return upper32*4294967296+lower32}var newBuffer;typeof Buffer.allocUnsafe=="function"?newBuffer=function(len){return Buffer.allocUnsafe(len)}:newBuffer=function(len){return new Buffer(len)};function defaultCallback(err){if(err)throw err}}});var require_extract_zip=__commonJS({"../../node_modules/.pnpm/extract-zip@2.0.1/node_modules/extract-zip/index.js"(exports,module){var debug=require_src()("extract-zip"),{createWriteStream,promises:fs24}=__require("fs"),getStream=require_get_stream(),path27=__require("path"),{promisify}=__require("util"),stream=__require("stream"),yauzl=require_yauzl(),openZip=promisify(yauzl.open),pipeline=promisify(stream.pipeline),Extractor=class{constructor(zipPath,opts){this.zipPath=zipPath,this.opts=opts}async extract(){return debug("opening",this.zipPath,"with opts",this.opts),this.zipfile=await openZip(this.zipPath,{lazyEntries:!0}),this.canceled=!1,new Promise((resolve11,reject)=>{this.zipfile.on("error",err=>{this.canceled=!0,reject(err)}),this.zipfile.readEntry(),this.zipfile.on("close",()=>{this.canceled||(debug("zip extraction complete"),resolve11())}),this.zipfile.on("entry",async entry=>{if(this.canceled){debug("skipping entry",entry.fileName,{cancelled:this.canceled});return}if(debug("zipfile entry",entry.fileName),entry.fileName.startsWith("__MACOSX/")){this.zipfile.readEntry();return}let destDir=path27.dirname(path27.join(this.opts.dir,entry.fileName));try{await fs24.mkdir(destDir,{recursive:!0});let canonicalDestDir=await fs24.realpath(destDir);if(path27.relative(this.opts.dir,canonicalDestDir).split(path27.sep).includes(".."))throw new Error(`Out of bound path "${canonicalDestDir}" found while processing file ${entry.fileName}`);await this.extractEntry(entry),debug("finished processing",entry.fileName),this.zipfile.readEntry()}catch(err){this.canceled=!0,this.zipfile.close(),reject(err)}})})}async extractEntry(entry){if(this.canceled){debug("skipping entry extraction",entry.fileName,{cancelled:this.canceled});return}this.opts.onEntry&&this.opts.onEntry(entry,this.zipfile);let dest=path27.join(this.opts.dir,entry.fileName),mode=entry.externalFileAttributes>>16&65535,IFMT=61440,IFDIR=16384,symlink=(mode&IFMT)===40960,isDir=(mode&IFMT)===IFDIR;!isDir&&entry.fileName.endsWith("/")&&(isDir=!0);let madeBy=entry.versionMadeBy>>8;isDir||(isDir=madeBy===0&&entry.externalFileAttributes===16),debug("extracting entry",{filename:entry.fileName,isDir,isSymlink:symlink});let procMode=this.getExtractedMode(mode,isDir)&511,destDir=isDir?dest:path27.dirname(dest),mkdirOptions={recursive:!0};if(isDir&&(mkdirOptions.mode=procMode),debug("mkdir",{dir:destDir,...mkdirOptions}),await fs24.mkdir(destDir,mkdirOptions),isDir)return;debug("opening read stream",dest);let readStream=await promisify(this.zipfile.openReadStream.bind(this.zipfile))(entry);if(symlink){let link=await getStream(readStream);debug("creating symlink",link,dest),await fs24.symlink(link,dest)}else await pipeline(readStream,createWriteStream(dest,{mode:procMode}))}getExtractedMode(entryMode,isDir){let mode=entryMode;return mode===0&&(isDir?(this.opts.defaultDirMode&&(mode=parseInt(this.opts.defaultDirMode,10)),mode||(mode=493)):(this.opts.defaultFileMode&&(mode=parseInt(this.opts.defaultFileMode,10)),mode||(mode=420))),mode}};module.exports=async function(zipPath,opts){if(debug("creating target directory",opts.dir),!path27.isAbsolute(opts.dir))throw new Error("Target directory is expected to be absolute");return await fs24.mkdir(opts.dir,{recursive:!0}),opts.dir=await fs24.realpath(opts.dir),new Extractor(zipPath,opts).extract()}}});import fs11 from"node:fs";import path13 from"node:path";import{execFileSync}from"node:child_process";function unregisterWindowsNativeHost(hostName){let registryKey=`HKCU\\SOFTWARE\\Google\\Chrome\\NativeMessagingHosts\\${hostName}`;try{execFileSync("reg",["delete",registryKey,"/f"],{stdio:"pipe"})}catch{}}function uninstallNativeHostArtifacts(options={},dependencies={}){let{mode="both",silent=!1}=options;if(mode==="both")return["skills","mcp"].map(integrationMode=>uninstallNativeHostArtifacts({...options,mode:integrationMode},dependencies)).every(Boolean);let writeLine=dependencies.writeLine??(line=>console.error(line)),log2=line=>{silent||writeLine(line)};try{let existsSync12=dependencies.existsSync??fs11.existsSync,platform=dependencies.platform??process.platform,hostDir=dependencies.hostDir??resolveNativeHostDirectory({env:dependencies.env,homedir:dependencies.homedir,platform}),unlinkSync=dependencies.unlinkSync??fs11.unlinkSync,unregister=dependencies.unregisterWindowsNativeHost??unregisterWindowsNativeHost,hostName=MEARL_NATIVE_HOST_NAMES[mode],launcherExtension=platform==="win32"?"cmd":"sh",artifacts=[path13.join(hostDir,`${hostName}.json`),path13.join(hostDir,`${hostName}-launcher.${launcherExtension}`)];for(let artifact of artifacts)existsSync12(artifact)&&(unlinkSync(artifact),log2(`✅ Removed: ${artifact}`));return platform==="win32"&&unregister(hostName),!0}catch(error48){return log2(`❌ Uninstall failed: ${error48 instanceof Error?error48.message:String(error48)}`),!1}}var init_nativeHost2=__esm({"../setup/dist/nativeHost.js"(){"use strict";init_nativeHost()}});function initBrowserRegistry(deps){logFn=deps.log}function recordFileFor(browserId){return keyedConfigFile(BROWSERS_SUBDIR,browserId)}function persist(patch){if(!identity)return!1;let file2=recordFileFor(identity.browserId),previous=readRecord(file2);if(previous&&previous.pid!==process.pid&&isAlive(previous.pid))return!1;let record4={pid:process.pid,browserId:identity.browserId,socketPath:identity.socketPath,browserName:identity.browserName,nativeHostVersion:identity.nativeHostVersion,transport:identity.transport,startedAt:identity.startedAt,lastFocusedAt:previous?.lastFocusedAt,extensionVersion:previous?.extensionVersion,...patch,updatedAt:Date.now()};try{return previous?.pid===process.pid?writeRecordIfPid(file2,process.pid,record4):previous&&!removeRecordIfPid(file2,previous.pid)?!1:claimRecord(file2,record4)}catch(error48){return logFn("browser-registry: failed to write record:",String(error48)),!1}}async function retireUnreachableBrowserRecord(browserId,canConnect){let file2=recordFileFor(browserId),existing=readRecord(file2);return!existing||existing.pid===process.pid||!isAlive(existing.pid)||await canConnect(existing.socketPath)?!1:removeRecordIfPid(file2,existing.pid)}function registerBrowser(info){let startedAt=identity?.startedAt??new Date().toISOString();identity={browserId:info.browserId,socketPath:info.socketPath,browserName:info.browserName,nativeHostVersion:info.nativeHostVersion,transport:info.transport,startedAt};let previous=readRecord(recordFileFor(info.browserId)),registered=persist({lastFocusedAt:info.preserveFocus===!1?info.lastFocusedAt??0:previous?.lastFocusedAt??info.lastFocusedAt??Date.now(),extensionVersion:info.extensionVersion});return logFn(`browser-registry: ${registered?"registered":"registration skipped"} ${info.browserName} (${info.browserId})`),registered}function writeFocusNow(){lastFocusWriteAt=Date.now(),persist({lastFocusedAt:lastFocusWriteAt})}function touchFocus(){if(!identity)return;let elapsed=Date.now()-lastFocusWriteAt;if(elapsed>=FOCUS_WRITE_THROTTLE_MS){writeFocusNow();return}focusFlushTimer||(focusFlushTimer=setTimeout(()=>{focusFlushTimer=null,writeFocusNow()},FOCUS_WRITE_THROTTLE_MS-elapsed),focusFlushTimer.unref())}function unregisterBrowser(){if(focusFlushTimer&&(clearTimeout(focusFlushTimer),focusFlushTimer=null),!identity)return;let file2=recordFileFor(identity.browserId);removeRecordIfPid(file2,process.pid)}function pruneDeadBrowsers(){let now=Date.now();for(let file2 of listRecordFiles(keyedDir(BROWSERS_SUBDIR))){let rec=readRecord(file2);if(!rec){removeInvalidRecord(file2);continue}isAlive(rec.pid)||now-(rec.updatedAt??0)>STALE_RECORD_TTL_MS&&removeRecordIfPid(file2,rec.pid)}}function listRegisteredBrowsers(){let records=[];for(let file2 of listRecordFiles(keyedDir(BROWSERS_SUBDIR))){let record4=readRecord(file2);record4&&isAlive(record4.pid)&&records.push(record4)}return records.sort((a,b)=>(b.lastFocusedAt??0)-(a.lastFocusedAt??0)||(b.updatedAt??0)-(a.updatedAt??0))}var BROWSERS_SUBDIR,STALE_RECORD_TTL_MS,FOCUS_WRITE_THROTTLE_MS,identity,logFn,lastFocusWriteAt,focusFlushTimer,init_browser_registry=__esm({"src/browser-registry.ts"(){"use strict";init_dist();BROWSERS_SUBDIR="browsers",STALE_RECORD_TTL_MS=5*6e4,FOCUS_WRITE_THROTTLE_MS=1e3,identity=null,logFn=()=>{};lastFocusWriteAt=0,focusFlushTimer=null}});import net3 from"node:net";function requestBrowserSocket(socketPath,action,data,version3,timeoutMs=6e4,browserId,host,routing){let id=`browser_rpc_${Date.now()}_${Math.random().toString(36).slice(2,10)}`;return new Promise((resolve11,reject)=>{let client2=net3.createConnection(socketPath),lines=new Utf8LineBuffer(MAX_RESPONSE_BUFFER_SIZE),settled=!1,finish=(error48,result)=>{settled||(settled=!0,clearTimeout(timer),client2.removeAllListeners(),client2.destroy(),error48?reject(error48):resolve11(result))},timer=setTimeout(()=>finish(new Error(`Browser request timeout after ${timeoutMs}ms`)),timeoutMs),deadline=Date.now()+timeoutMs;client2.on("connect",()=>{client2.write(`${JSON.stringify({id,action,data,version:version3,protocolVersion:3,controlSource:routing?.controlSource??"local",...routing?.providerTarget?{providerTarget:routing.providerTarget,deadline}:{},...browserId?{browserId}:{},...host?{host}:{}})}
1072
- `)}),client2.on("data",chunk=>{let result=lines.push(chunk);if(result.overflow){finish(new Error("Browser response exceeded the supported size"));return}for(let line of result.lines){let response;try{response=JSON.parse(line)}catch{continue}if(response.id===id){response.success?finish(void 0,response.data):finish(new Error(response.error||"Browser request failed"));return}}}),client2.on("error",error48=>finish(error48)),client2.on("end",()=>finish(new Error("Browser connection closed before responding"))),client2.on("close",()=>finish(new Error("Browser connection closed before responding")))})}var MAX_RESPONSE_BUFFER_SIZE,init_browser_socket_request=__esm({"src/browser-socket-request.ts"(){"use strict";init_socketLines();init_dist3();MAX_RESPONSE_BUFFER_SIZE=64*1024*1024}});var NATIVE_HOST_VERSION,init_version=__esm({"src/version.ts"(){"use strict";NATIVE_HOST_VERSION="2.22.1"}});function providerRequestTimeoutMs(action,data,deadline){if(deadline!==void 0){if(!Number.isSafeInteger(deadline)||deadline<=0)throw new Error("Invalid Provider request deadline");let remaining=deadline-Date.now();if(remaining<=0)throw new Error("Provider request deadline exceeded");if(remaining>2147483647)throw new Error("Provider request deadline exceeds the supported range");return remaining}return resolveActionTimeoutSec(action,data,120)*1e3}var init_provider_request_timeout=__esm({"src/provider-request-timeout.ts"(){"use strict";init_actionTimeouts()}});import{isAbsolute as isAbsolute7}from"node:path";import{AsyncLocalStorage}from"node:async_hooks";function identity2(browser){return`${browser.pid}:${browser.startedAt}:${browser.socketPath}`}var ProviderControlService,init_provider_control=__esm({"src/provider-control.ts"(){"use strict";init_dist4();init_control_session_manager();init_dist3();init_provider_request_timeout();ProviderControlService=class{constructor(dependencies){this.dependencies=dependencies}deadlines=new AsyncLocalStorage;controls=new Map;retired=new Set;retire(manager){let cleanup=Promise.all(manager.registry.list().map(session=>manager.registry.waitForIdle(session.sessionId))).then(()=>manager.artifacts.dispose());this.retired.add(cleanup),cleanup.finally(()=>this.retired.delete(cleanup)).catch(()=>{})}reap(){let browsers=this.dependencies.browsers();for(let[browserId,control]of this.controls){let browser=browsers.find(item=>item.browserId===browserId);(!browser||identity2(browser)!==control.identity)&&(this.controls.delete(browserId),this.retire(control.manager))}}browser(browserId){let browser=this.dependencies.browsers().find(item=>item.browserId===browserId);if(browser?.transport!=="provider"||!browser.providerBrowserId)throw new Error("CONTROL_SESSION_NOT_FOUND: Provider browser is unavailable");return assertProviderProtocolVersion(browser.provider?.protocolVersion,browser.provider?.id??"Provider"),browser}list(){return this.reap(),[...this.controls.values()].flatMap(control=>control.manager.registry.list())}find(sessionId){this.reap();let sessions=[...this.controls.values()].map(control=>control.manager.registry.find(sessionId)).filter(session=>session!==void 0);if(sessions.length>1)throw new Error("CONTROL_SESSION_AMBIGUOUS: multiple browsers own this id");return sessions[0]}async userControl(sessionId,operation){this.reap();for(let[browserId,control]of this.controls){try{control.manager.registry.info(sessionId)}catch{continue}if(identity2(this.browser(browserId))!==control.identity)throw new Error("CONTROL_SESSION_NOT_FOUND");return control.manager.userControl(sessionId,operation)}throw new Error("CONTROL_SESSION_NOT_FOUND")}getControl(browser){let previous=this.controls.get(browser.browserId);if(previous?.identity===identity2(browser))return previous;previous&&this.retire(previous.manager);let control={identity:identity2(browser),manager:new ControlSessionManager({browserId:()=>browser.browserId,transport:()=>"provider",invoke:async(action,payload)=>{let current=this.browser(browser.browserId);if(identity2(current)!==control.identity)throw new Error("CONTROL_SESSION_NOT_FOUND");let{__mearlControlSource:origin="local",__mearlBlockedTabIds:blocked,...data}=payload;if(action==="tab_open"&&blocked?.length&&data.reuse!=="never"){let result=await this.request(current,"tab_list",{},origin);if(!Array.isArray(result.tabs))throw new Error("Provider did not return its current pages");if(findMatchingTabs(result.tabs,data.url,data.match).some(tab=>blocked.includes(tab.tabId??tab.id)))throw new Error("TAB_CONTROLLED_BY_SESSION")}return this.request(current,action,data,origin)},cleanup:async(tabs,_transport,preserveEnvironment)=>{preserveEnvironment||await this.clearEnvironment(browser.browserId,tabs)},download:async(data,_transport,origin)=>{let current=this.browser(browser.browserId);if(identity2(current)!==control.identity)throw new Error("CONTROL_SESSION_NOT_FOUND");let result=await this.request(current,"page_download",data,origin);if(!result||typeof result.filename!="string"||!result.filename||typeof result.filePath!="string"||!isAbsolute7(result.filePath)||!Object.hasOwn(result,"action")||result.owned!==void 0&&typeof result.owned!="boolean")throw new Error("Provider page_download must return a completed file with filename, absolute filePath and action");return{filename:result.filename,filePath:result.filePath,action:result.action,owned:result.owned===!0}},notify:this.dependencies.notify})};return this.controls.set(browser.browserId,control),control}async request(browser,action,data,origin,host){action==="browser_release"&&(action="browser_instances",data={operation:"detach"});let lifecycle=action==="browser_close"?data.deleteProfile===!0?"deleteData":"close":action==="get_browser_access_url"?"access":action==="browser_instances"?data.operation==="sync_cookies"?"syncCookies":data.operation:void 0;if(lifecycle&&!browser.operations?.includes(lifecycle))throw new Error(`Provider browser does not support ${lifecycle}`);if(!lifecycle&&action!=="get_versions"){if(browser.status!=="connected")throw new Error("Provider browser is not connected");if(!browser.capabilities?.actions.some(capability=>capability===action))throw new Error(`Provider browser does not support ${action}`)}let deadline=this.deadlines.getStore();return deadline!==void 0?(providerRequestTimeoutMs(action,data,deadline),this.dependencies.request(browser,action,data,origin,host,deadline)):this.dependencies.request(browser,action,data,origin,host)}async clearEnvironment(browserId,tabs){let browser=this.browser(browserId),actions=new Set(browser.capabilities?.actions??[]);if(actions.has("set_mock")&&!actions.has("get_mocks"))throw new Error("Provider cannot enumerate Mock state for cleanup");let clear=async(action,data)=>{let result=await this.request(browser,action,data,"local");if(result?.success===!1||result?.action?.success===!1)throw new Error(result.error??result.action?.error??"Provider environment cleanup failed")};for(let tabId of tabs){if(actions.has("set_mock")){let result=await this.request(browser,"get_mocks",{tabId},"local");if(!Array.isArray(result.mocks))throw new Error("Provider did not return its Mock state");let names=new Set(result.mocks.map(mock=>mock.apiName));for(let apiName of names)await clear("set_mock",{tabId,apiName,enabled:!1})}for(let[action,data]of[["set_app_profile",{tabId,enabled:!1,mtopEnv:"default"}],["set_device_emulation",{tabId,enabled:!1}],["set_timezone",{tabId,timezone:""}]])actions.has(action)&&await clear(action,data)}}async invoke(browserId,action,data={},sessionId,origin="local",host,deadline){return this.deadlines.run(deadline,async()=>{deadline!==void 0&&providerRequestTimeoutMs(action,data,deadline),this.reap();let browser=this.browser(browserId),{manager}=this.getControl(browser);if(action==="get_versions"||action==="get_browser_access_url")return this.request(browser,action,data,origin);if(action==="browser_instances"){if(!["start","detach","sync_cookies"].includes(data.operation))throw new Error("Invalid browser instance operation");return manager.registry.releaseBrowser(()=>this.request(browser,action,data,origin,host))}return manager.invoke(action,data,sessionId,void 0,origin)})}async dispose(){await Promise.all([...this.retired,...[...this.controls.values()].map(async({manager})=>{await Promise.all(manager.registry.list().map(session=>manager.registry.waitForIdle(session.sessionId))),await manager.artifacts.dispose()})])}}}});var provider_control_host_exports={};__export(provider_control_host_exports,{runProviderControlHost:()=>runProviderControlHost});import net4 from"node:net";import{chmodSync as chmodSync2,rmSync as rmSync14}from"node:fs";import{randomUUID as randomUUID21}from"node:crypto";async function runProviderControlHost(token){let file2=providerControlHostFile(),owner=readRecord(file2);if(!owner||owner.token!==token)throw new Error("Provider control host startup ownership was lost");let socketPath=providerControlSocketPath(process.pid);if(!writeRecordIfPid(file2,owner.pid,{pid:process.pid,socketPath,token,ready:!1,protocolVersion:3}))throw new Error("Provider control host startup ownership was lost");let connections=new Set,service=new ProviderControlService({browsers:listRegisteredBrowsers,request:(browser,action,data,origin,host,deadline)=>requestBrowserSocket(browser.socketPath,action,data,NATIVE_HOST_VERSION,providerRequestTimeoutMs(action,data,deadline),browser.providerBrowserId,host,{controlSource:origin}),notify:()=>{for(let browser of listRegisteredBrowsers())browser.transport==="extension"&&requestBrowserSocket(browser.socketPath,"provider_control_sessions_changed",{},NATIVE_HOST_VERSION,5e3).catch(()=>{})}}),server=net4.createServer(socket=>{connections.add(socket),socket.on("error",()=>{}),socket.once("close",()=>connections.delete(socket));let lines=new Utf8LineBuffer(16*1024*1024);socket.on("data",chunk=>{let result=lines.push(chunk);if(result.overflow)return socket.destroy();for(let line of result.lines)handle(line,socket)})});async function handle(line,socket){let id="";try{let request=JSON.parse(line);id=typeof request.id=="string"?request.id:randomUUID21(),assertProviderProtocolVersion(request.protocolVersion,"Provider control client");let data=request.data??{},result;if(request.action==="__control_session_resolve")result={session:service.find(data.sessionId)??null};else if(request.action==="browser_sessions")if(data.operation==="list")result={sessions:service.list()};else{if(!["handoff","resume","release"].includes(data.operation)||typeof data.sessionId!="string"||!data.sessionId)throw new Error("Invalid browser session operation");result={session:await service.userControl(data.sessionId,data.operation)}}else{if(typeof request.providerTarget!="string"||typeof request.action!="string")throw new Error("Provider browser and action are required");if(!data||typeof data!="object"||Array.isArray(data))throw new Error("Invalid action payload");if(request.transport&&request.transport!=="provider")throw new Error("A session cannot change transport");result=await service.invoke(request.providerTarget,request.action,data,request.controlSessionId,request.controlSource??"local",request.host,request.deadline)}socket.destroyed||socket.write(JSON.stringify({id,success:!0,data:result})+`
1072
+ `)}),client2.on("data",chunk=>{let result=lines.push(chunk);if(result.overflow){finish(new Error("Browser response exceeded the supported size"));return}for(let line of result.lines){let response;try{response=JSON.parse(line)}catch{continue}if(response.id===id){response.success?finish(void 0,response.data):finish(new Error(response.error||"Browser request failed"));return}}}),client2.on("error",error48=>finish(error48)),client2.on("end",()=>finish(new Error("Browser connection closed before responding"))),client2.on("close",()=>finish(new Error("Browser connection closed before responding")))})}var MAX_RESPONSE_BUFFER_SIZE,init_browser_socket_request=__esm({"src/browser-socket-request.ts"(){"use strict";init_socketLines();init_dist3();MAX_RESPONSE_BUFFER_SIZE=64*1024*1024}});var NATIVE_HOST_VERSION,init_version=__esm({"src/version.ts"(){"use strict";NATIVE_HOST_VERSION="2.22.3"}});function providerRequestTimeoutMs(action,data,deadline){if(deadline!==void 0){if(!Number.isSafeInteger(deadline)||deadline<=0)throw new Error("Invalid Provider request deadline");let remaining=deadline-Date.now();if(remaining<=0)throw new Error("Provider request deadline exceeded");if(remaining>2147483647)throw new Error("Provider request deadline exceeds the supported range");return remaining}return resolveActionTimeoutSec(action,data,120)*1e3}var init_provider_request_timeout=__esm({"src/provider-request-timeout.ts"(){"use strict";init_actionTimeouts()}});import{isAbsolute as isAbsolute7}from"node:path";import{AsyncLocalStorage}from"node:async_hooks";function identity2(browser){return`${browser.pid}:${browser.startedAt}:${browser.socketPath}`}var ProviderControlService,init_provider_control=__esm({"src/provider-control.ts"(){"use strict";init_dist4();init_control_session_manager();init_dist3();init_provider_request_timeout();ProviderControlService=class{constructor(dependencies){this.dependencies=dependencies}deadlines=new AsyncLocalStorage;controls=new Map;retired=new Set;retire(manager){let cleanup=Promise.all(manager.registry.list().map(session=>manager.registry.waitForIdle(session.sessionId))).then(()=>manager.artifacts.dispose());this.retired.add(cleanup),cleanup.finally(()=>this.retired.delete(cleanup)).catch(()=>{})}reap(){let browsers=this.dependencies.browsers();for(let[browserId,control]of this.controls){let browser=browsers.find(item=>item.browserId===browserId);(!browser||identity2(browser)!==control.identity)&&(this.controls.delete(browserId),this.retire(control.manager))}}browser(browserId){let browser=this.dependencies.browsers().find(item=>item.browserId===browserId);if(browser?.transport!=="provider"||!browser.providerBrowserId)throw new Error("CONTROL_SESSION_NOT_FOUND: Provider browser is unavailable");return assertProviderProtocolVersion(browser.provider?.protocolVersion,browser.provider?.id??"Provider"),browser}list(){return this.reap(),[...this.controls.values()].flatMap(control=>control.manager.registry.list())}find(sessionId){this.reap();let sessions=[...this.controls.values()].map(control=>control.manager.registry.find(sessionId)).filter(session=>session!==void 0);if(sessions.length>1)throw new Error("CONTROL_SESSION_AMBIGUOUS: multiple browsers own this id");return sessions[0]}async userControl(sessionId,operation){this.reap();for(let[browserId,control]of this.controls){try{control.manager.registry.info(sessionId)}catch{continue}if(identity2(this.browser(browserId))!==control.identity)throw new Error("CONTROL_SESSION_NOT_FOUND");return control.manager.userControl(sessionId,operation)}throw new Error("CONTROL_SESSION_NOT_FOUND")}getControl(browser){let previous=this.controls.get(browser.browserId);if(previous?.identity===identity2(browser))return previous;previous&&this.retire(previous.manager);let control={identity:identity2(browser),manager:new ControlSessionManager({browserId:()=>browser.browserId,transport:()=>"provider",invoke:async(action,payload)=>{let current=this.browser(browser.browserId);if(identity2(current)!==control.identity)throw new Error("CONTROL_SESSION_NOT_FOUND");let{__mearlControlSource:origin="local",__mearlBlockedTabIds:blocked,...data}=payload;if(action==="tab_open"&&blocked?.length&&data.reuse!=="never"){let result=await this.request(current,"tab_list",{},origin);if(!Array.isArray(result.tabs))throw new Error("Provider did not return its current pages");if(findMatchingTabs(result.tabs,data.url,data.match).some(tab=>blocked.includes(tab.tabId??tab.id)))throw new Error("TAB_CONTROLLED_BY_SESSION")}return this.request(current,action,data,origin)},cleanup:async(tabs,_transport,preserveEnvironment)=>{preserveEnvironment||await this.clearEnvironment(browser.browserId,tabs)},download:async(data,_transport,origin)=>{let current=this.browser(browser.browserId);if(identity2(current)!==control.identity)throw new Error("CONTROL_SESSION_NOT_FOUND");let result=await this.request(current,"page_download",data,origin);if(!result||typeof result.filename!="string"||!result.filename||typeof result.filePath!="string"||!isAbsolute7(result.filePath)||!Object.hasOwn(result,"action")||result.owned!==void 0&&typeof result.owned!="boolean")throw new Error("Provider page_download must return a completed file with filename, absolute filePath and action");return{filename:result.filename,filePath:result.filePath,action:result.action,owned:result.owned===!0}},notify:this.dependencies.notify})};return this.controls.set(browser.browserId,control),control}async request(browser,action,data,origin,host){action==="browser_release"&&(action="browser_instances",data={operation:"detach"});let lifecycle=action==="browser_close"?data.deleteProfile===!0?"deleteData":"close":action==="get_browser_access_url"?"access":action==="browser_instances"?data.operation==="sync_cookies"?"syncCookies":data.operation:void 0;if(lifecycle&&!browser.operations?.includes(lifecycle))throw new Error(`Provider browser does not support ${lifecycle}`);if(!lifecycle&&action!=="get_versions"){if(browser.status!=="connected")throw new Error("Provider browser is not connected");if(!browser.capabilities?.actions.some(capability=>capability===action))throw new Error(`Provider browser does not support ${action}`)}let deadline=this.deadlines.getStore();return deadline!==void 0?(providerRequestTimeoutMs(action,data,deadline),this.dependencies.request(browser,action,data,origin,host,deadline)):this.dependencies.request(browser,action,data,origin,host)}async clearEnvironment(browserId,tabs){let browser=this.browser(browserId),actions=new Set(browser.capabilities?.actions??[]);if(actions.has("set_mock")&&!actions.has("get_mocks"))throw new Error("Provider cannot enumerate Mock state for cleanup");let clear=async(action,data)=>{let result=await this.request(browser,action,data,"local");if(result?.success===!1||result?.action?.success===!1)throw new Error(result.error??result.action?.error??"Provider environment cleanup failed")};for(let tabId of tabs){if(actions.has("set_mock")){let result=await this.request(browser,"get_mocks",{tabId},"local");if(!Array.isArray(result.mocks))throw new Error("Provider did not return its Mock state");let names=new Set(result.mocks.map(mock=>mock.apiName));for(let apiName of names)await clear("set_mock",{tabId,apiName,enabled:!1})}for(let[action,data]of[["set_app_profile",{tabId,enabled:!1,mtopEnv:"default"}],["set_device_emulation",{tabId,enabled:!1}],["set_timezone",{tabId,timezone:""}]])actions.has(action)&&await clear(action,data)}}async invoke(browserId,action,data={},sessionId,origin="local",host,deadline){return this.deadlines.run(deadline,async()=>{deadline!==void 0&&providerRequestTimeoutMs(action,data,deadline),this.reap();let browser=this.browser(browserId),{manager}=this.getControl(browser);if(action==="get_versions"||action==="get_browser_access_url")return this.request(browser,action,data,origin);if(action==="browser_instances"){if(!["start","detach","sync_cookies"].includes(data.operation))throw new Error("Invalid browser instance operation");return manager.registry.releaseBrowser(()=>this.request(browser,action,data,origin,host))}return manager.invoke(action,data,sessionId,void 0,origin)})}async dispose(){await Promise.all([...this.retired,...[...this.controls.values()].map(async({manager})=>{await Promise.all(manager.registry.list().map(session=>manager.registry.waitForIdle(session.sessionId))),await manager.artifacts.dispose()})])}}}});var provider_control_host_exports={};__export(provider_control_host_exports,{runProviderControlHost:()=>runProviderControlHost});import net4 from"node:net";import{chmodSync as chmodSync2,rmSync as rmSync14}from"node:fs";import{randomUUID as randomUUID21}from"node:crypto";async function runProviderControlHost(token){let file2=providerControlHostFile(),owner=readRecord(file2);if(!owner||owner.token!==token)throw new Error("Provider control host startup ownership was lost");let socketPath=providerControlSocketPath(process.pid);if(!writeRecordIfPid(file2,owner.pid,{pid:process.pid,socketPath,token,ready:!1,protocolVersion:3}))throw new Error("Provider control host startup ownership was lost");let connections=new Set,service=new ProviderControlService({browsers:listRegisteredBrowsers,request:(browser,action,data,origin,host,deadline)=>requestBrowserSocket(browser.socketPath,action,data,NATIVE_HOST_VERSION,providerRequestTimeoutMs(action,data,deadline),browser.providerBrowserId,host,{controlSource:origin}),notify:()=>{for(let browser of listRegisteredBrowsers())browser.transport==="extension"&&requestBrowserSocket(browser.socketPath,"provider_control_sessions_changed",{},NATIVE_HOST_VERSION,5e3).catch(()=>{})}}),server=net4.createServer(socket=>{connections.add(socket),socket.on("error",()=>{}),socket.once("close",()=>connections.delete(socket));let lines=new Utf8LineBuffer(16*1024*1024);socket.on("data",chunk=>{let result=lines.push(chunk);if(result.overflow)return socket.destroy();for(let line of result.lines)handle(line,socket)})});async function handle(line,socket){let id="";try{let request=JSON.parse(line);id=typeof request.id=="string"?request.id:randomUUID21(),assertProviderProtocolVersion(request.protocolVersion,"Provider control client");let data=request.data??{},result;if(request.action==="__control_session_resolve")result={session:service.find(data.sessionId)??null};else if(request.action==="browser_sessions")if(data.operation==="list")result={sessions:service.list()};else{if(!["handoff","resume","release"].includes(data.operation)||typeof data.sessionId!="string"||!data.sessionId)throw new Error("Invalid browser session operation");result={session:await service.userControl(data.sessionId,data.operation)}}else{if(typeof request.providerTarget!="string"||typeof request.action!="string")throw new Error("Provider browser and action are required");if(!data||typeof data!="object"||Array.isArray(data))throw new Error("Invalid action payload");if(request.transport&&request.transport!=="provider")throw new Error("A session cannot change transport");result=await service.invoke(request.providerTarget,request.action,data,request.controlSessionId,request.controlSource??"local",request.host,request.deadline)}socket.destroyed||socket.write(JSON.stringify({id,success:!0,data:result})+`
1073
1073
  `)}catch(error48){socket.destroyed||socket.write(JSON.stringify({id,success:!1,error:error48 instanceof Error?error48.message:String(error48)})+`
1074
1074
  `)}}try{if(await new Promise((resolve11,reject)=>{server.once("error",reject),server.listen(socketPath,()=>{server.removeListener("error",reject),resolve11()})}),process.platform!=="win32"&&chmodSync2(socketPath,384),!writeRecordIfPid(file2,process.pid,{pid:process.pid,socketPath,token,ready:!0,protocolVersion:3}))throw new Error("Provider control host startup ownership was lost");await new Promise(resolve11=>{let stop=()=>{removeRecordIfPid(file2,process.pid);for(let socket of connections)socket.destroy();server.close(()=>resolve11())};process.once("SIGTERM",stop),process.once("SIGINT",stop)})}finally{removeRecordIfPid(file2,process.pid);for(let socket of connections)socket.destroy();server.close(),process.platform!=="win32"&&rmSync14(socketPath,{force:!0}),await service.dispose()}}var init_provider_control_host=__esm({"src/provider-control-host.ts"(){"use strict";init_dist();init_host();init_browser_registry();init_browser_socket_request();init_provider_control();init_socketLines();init_version();init_dist3();init_provider_request_timeout()}});import fs18 from"node:fs";import path21 from"node:path";function resolveLauncherNodePaths(execPath){let nodePath=path21.resolve(execPath),homebrewNode=nodePath.match(/^(.*)\/Cellar\/(node(?:@\d+(?:\.\d+)*)?)\/[^/]+\/bin\/node$/);if(!homebrewNode)return[nodePath];let[,prefix,formula]=homebrewNode,stablePath=path21.join(prefix,"opt",formula,"bin","node");try{if(fs18.accessSync(stablePath,fs18.constants.X_OK),fs18.statSync(stablePath).isFile()&&fs18.realpathSync(stablePath)===fs18.realpathSync(nodePath))return[stablePath,nodePath]}catch{}return[nodePath,stablePath]}function shellQuote(value){return`'${value.replaceAll("'","'\\''")}'`}function createLauncherScript(hostDir,hostPath,hostName,execPath=process.execPath){let nodePaths=process.platform==="win32"?[path21.resolve(execPath)]:resolveLauncherNodePaths(execPath),metadataLine=`mearl-native-host-launcher: ${JSON.stringify({version:1,nodePaths,hostPath})}`;if(process.platform==="win32"){let launcherPath2=path21.join(hostDir,`${hostName}-launcher.cmd`),content2=`@echo off\r
1075
1075
  rem ${metadataLine}\r
@@ -1693,7 +1693,7 @@ ${message}`:message,promptContent=[...prompt?[{type:"text",text:prompt}]:[],...i
1693
1693
  <li data-auth-step data-state="waiting"><span class="step-mark">2</span><span></span></li>
1694
1694
  <li data-auth-step data-state="waiting"><span class="step-mark">3</span><span></span></li></ol></div>
1695
1695
  <footer><button class="cancel" type="button" data-auth-cancel></button></footer>
1696
- </section></div>`,shadow.querySelector("[data-auth-eyebrow]").textContent=authCodeText.eyebrow,shadow.querySelector("[data-auth-title]").textContent=authCodeText.title,shadow.querySelector("[data-auth-status]").textContent=authCodeText.starting,shadow.querySelector("[data-auth-detail]").textContent=authCodeText.startingDetail,shadow.querySelector("[data-auth-visual-label]").textContent=authCodeText.starting,shadow.querySelector(".cancel").textContent=authCodeText.cancel,shadow.querySelector(".close").setAttribute("aria-label",authCodeText.cancel),shadow.querySelectorAll("[data-auth-step]").forEach((step,index)=>{step.lastElementChild.textContent=authCodeText.steps[index]??""}),shadow.querySelectorAll("[data-auth-cancel]").forEach(button=>{button.addEventListener("click",()=>{window.postMessage({source:SRC,type:"authCodeCancel",requestId},"*"),finishAuthCode(requestId,{success:!1,error:"User cancelled authorization"})})}),(document.body??document.documentElement).appendChild(overlay),pending.overlay=overlay}if(svg){let parsed=new DOMParser().parseFromString(svg,"image/svg+xml").documentElement;if(parsed.namespaceURI!=="http://www.w3.org/2000/svg"||parsed.tagName!=="svg")return;let image=document.importNode(parsed,!0);image.setAttribute("role","img"),image.setAttribute("aria-label","支付宝扫码配对二维码"),pending.overlay.shadowRoot?.querySelector("[data-auth-qr]")?.replaceChildren(image);let visual=pending.overlay.shadowRoot?.querySelector("[data-auth-visual]");visual&&(visual.dataset.ready="true"),armAuthCodeTimeout(requestId,135e3),(pending.phase==="starting"||pending.phase==="installing")&&updateAuthCodeProgress(requestId,"pairing")}}}function callAuthCode(params,succ,fail2){activeAuthCodeRequestId!==null&&(window.postMessage({source:SRC,type:"authCodeCancel",requestId:activeAuthCodeRequestId},"*"),finishAuthCode(activeAuthCodeRequestId,{success:!1,error:"Authorization request replaced"}));let requestId=++bridgeRequestSeq;activeAuthCodeRequestId=requestId,pendingAuthCode[requestId]={succ,fail:fail2,phase:"starting"},armAuthCodeTimeout(requestId,135e3),showAuthCodePairing(requestId),window.postMessage({source:SRC,type:"authCode",requestId,payload:params},"*")}function degradedUserInfo(fallback,reason){let result={...fallback};try{Object.defineProperties(result,{__mearlDegraded:{enumerable:!1,value:!0},__mearlDegradedReason:{enumerable:!1,value:reason}})}catch{}return console.warn(TAG,"userInfo 降级:",reason),result}function callMtop(params,succ,fail2){let id=++bridgeRequestSeq;pendingMtop[id]={succ,fail:fail2};let post=params.post,rawTimeout=params.timeout??params.timer,timeout=typeof rawTimeout=="number"?rawTimeout:typeof rawTimeout=="string"&&rawTimeout.trim()!==""?Number(rawTimeout):void 0,payload={...params,data:params.data!==void 0?params.data:params.param??{},method:params.method??(post===!0||post===1||post==="1"||post==="true"?"POST":"GET"),env:params.env??(/(^|\.)wapa\.taobao\.com$/i.test(location.hostname)?"pre":"prod"),...Number.isFinite(timeout)&&{timeout}};window.postMessage({source:SRC,type:"mtop",requestId:id,payload},"*"),log2("mtop 代发 →",params.api)}function callMtopAsync(params){return new Promise((resolve11,reject)=>callMtop(params,resolve11,reject))}function callMtopStream(params,succ,fail2){let sessionId=typeof params.id=="string"?params.id:String(params.id??""),request=params.request&&typeof params.request=="object"?params.request:null;if(!sessionId||!request||typeof request.api!="string"){fail2?.("invalid mtop_stream params");return}let requestId=++bridgeRequestSeq;pendingMtopStreams[requestId]={sessionId},window.postMessage({source:SRC,type:"mtopStream",requestId,payload:{...request,timeout:params.timeout,method:params.method??request.method,env:/(^|\.)wapa\.taobao\.com$/i.test(location.hostname)?"pre":"prod"}},"*"),succ?.({}),log2("mtop 流式代发 →",request.api)}function callUserInfo(fallback,succ){if(fallback.userId){succ?.(fallback);return}let requestId=++bridgeRequestSeq,timer=setTimeout(()=>{let pending=pendingUserInfo[requestId];pending&&(delete pendingUserInfo[requestId],pending.succ?.(degradedUserInfo(pending.fallback,"native relay timeout")))},1e3);pendingUserInfo[requestId]={fallback,succ,timer},window.postMessage({source:SRC,type:"userInfo",requestId},"*")}function emitMtopStreamEvent(sessionId,eventType,data){let detail=data&&typeof data=="object"?{...data,eventType}:{data,eventType};document.dispatchEvent(new CustomEvent(`mtop_stream${sessionId}`,{detail}))}function pickDirectUploadTarget(response){if(!response||typeof response!="object")return null;let data=response.data;if(data?.success===!1)return null;let result=data?.result,target=Array.isArray(result?.urls)?result.urls[0]:void 0;if(!target||typeof target!="object")return null;let item=target;if(typeof item.put!="string"||!item.put||typeof item.get!="string"||!item.get)return null;let rawHeaders=item.putHeaders&&typeof item.putHeaders=="object"?item.putHeaders:{},putHeaders=Object.fromEntries(Object.entries(rawHeaders).map(([key,value])=>[key,String(value)]));return{put:item.put,get:item.get,putHeaders}}async function uploadImage(file2){let uploader=config2.imagePicker;if(!uploader)throw new Error("图片上传能力未配置");let env=/(^|\.)wapa\.taobao\.com$/i.test(location.hostname)?"pre":"prod",response=await callMtopAsync({api:uploader.api,v:uploader.version,method:"POST",env,timeout:6e4,data:{fcId:uploader.fcId,fcGroup:uploader.fcGroup,fcName:uploader.uploadUrlFunction,fcData:JSON.stringify({requestType:"url",mimes:[file2.type||"image/jpeg"],prefix:uploader.prefix,region:uploader.region,uploadNumber:1}),fcConfig:JSON.stringify({timeout:6e4,disasterRecover:!0})}}),target=pickDirectUploadTarget(response);if(!target)throw new Error("获取图片上传地址失败");let uploadUrl=`${target.put}${target.put.includes("?")?"&":"?"}getAvatar=1`,uploadResponse=await fetch(uploadUrl,{method:"PUT",headers:target.putHeaders,body:file2});if(uploadResponse.status!==200)throw new Error(`图片直传失败: HTTP ${uploadResponse.status}`);return target.get}function readImageDataUrl(file2){return new Promise((resolve11,reject)=>{let reader=new FileReader;reader.addEventListener("load",()=>{if(typeof reader.result=="string"&&reader.result.startsWith("data:")){resolve11(reader.result);return}reject(new Error("读取图片数据失败"))},{once:!0}),reader.addEventListener("error",()=>reject(reader.error??new Error("读取图片数据失败")),{once:!0}),reader.readAsDataURL(file2)})}function openImagePicker(options,onSuccess,onFailure){let input2=document.createElement("input");input2.type="file",input2.accept="image/*";let maxSelect=Number.isFinite(options.maxSelect)?Math.min(999,Math.max(1,Math.floor(options.maxSelect))):1;input2.multiple=maxSelect>1,options.capture&&(input2.capture="environment"),input2.style.display="none";let settled=!1,finish=()=>{settled=!0,input2.remove()},fail2=reason=>{settled||(finish(),onFailure(reason))};input2.addEventListener("cancel",()=>fail2("image selection cancelled"),{once:!0}),input2.addEventListener("change",()=>{let files=Array.from(input2.files??[]).slice(0,maxSelect);if(files.length===0){fail2("image selection cancelled");return}if(files.some(file2=>!file2.type.startsWith("image/"))){console.error(TAG,"仅支持选择图片文件"),fail2("only image files are supported");return}let resolveImage=options.resultType==="dataUrl"?readImageDataUrl:uploadImage;Promise.all(files.map(resolveImage)).then(urls=>{settled||(onSuccess(urls),log2(options.resultType==="dataUrl"?"图片选择并读取完成:":"图片选择并上传完成:",urls))}).catch(error48=>{console.error(TAG,"图片处理失败:",error48),fail2(error48 instanceof Error?error48.message:"image processing failed")}).finally(finish)},{once:!0}),(document.body??document.documentElement).appendChild(input2),input2.click(),window.addEventListener("focus",()=>{setTimeout(()=>{!settled&&!input2.files?.length&&fail2("image selection cancelled")},1e3)},{once:!0})}function showPaymentDialog(api,params,succeed,failed){document.querySelector('[data-mearl-payment-dialog="true"]')?.remove();let overlay=document.createElement("div");overlay.setAttribute("data-mearl-payment-dialog","true"),Object.assign(overlay.style,{position:"fixed",inset:"0",zIndex:"2147483647",display:"flex",alignItems:"center",justifyContent:"center",background:"rgba(0,0,0,0.5)"});let card=document.createElement("div");Object.assign(card.style,{background:"#fff",borderRadius:"12px",padding:"24px",width:"300px",textAlign:"center",fontFamily:"system-ui, sans-serif"});let title=document.createElement("div");Object.assign(title.style,{fontSize:"17px",fontWeight:"600",marginBottom:"8px"}),title.textContent="支付确认";let desc=document.createElement("div");Object.assign(desc.style,{fontSize:"14px",color:"#666",marginBottom:"20px"}),desc.textContent=`模拟 ${api} 支付,请选择操作`;let btnRow=document.createElement("div");Object.assign(btnRow.style,{display:"flex",gap:"12px"});let btnBase=(text3,bg,color,action)=>{let btn=document.createElement("button");return btn.textContent=text3,btn.setAttribute("data-mearl-action",action),Object.assign(btn.style,{flex:"1",padding:"10px 0",border:"none",borderRadius:"8px",fontSize:"15px",fontWeight:"500",cursor:"pointer",background:bg,color}),btn},confirmBtn=btnBase("完成支付","#1677ff","#fff","payment-confirm"),cancelBtn=btnBase("取消支付","#f5f5f5","#333","payment-cancel"),cleanup=()=>{overlay.remove()};confirmBtn.addEventListener("click",()=>{cleanup(),log2("用户完成支付",api),succeed(api==="wx.requestPayment"?{errMsg:"requestPayment:ok"}:{ResultStatus:"9000",resultStatus:"9000"})}),cancelBtn.addEventListener("click",()=>{cleanup(),log2("用户取消支付",api),failed(api==="wx.requestPayment"?{errMsg:"requestPayment:fail cancel"}:{ResultStatus:"6001",resultStatus:"6001"})}),btnRow.appendChild(cancelBtn),btnRow.appendChild(confirmBtn),card.appendChild(title),card.appendChild(desc),card.appendChild(btnRow),overlay.appendChild(card),(document.body??document.documentElement).appendChild(overlay)}function showMiniProgramActionDialog(action,params,confirmed,cancelled){document.querySelector('[data-mearl-mini-program-dialog="true"]')?.remove();let overlay=document.createElement("div");overlay.setAttribute("data-mearl-mini-program-dialog","true"),overlay.setAttribute("data-mearl-mini-program-action",action),Object.assign(overlay.style,{position:"fixed",inset:"0",zIndex:"2147483647",display:"flex",alignItems:"center",justifyContent:"center",background:"rgba(0,0,0,0.5)"});let card=document.createElement("div");Object.assign(card.style,{background:"#fff",borderRadius:"12px",padding:"24px",width:"300px",textAlign:"center",fontFamily:"system-ui, sans-serif"});let title=document.createElement("div");Object.assign(title.style,{fontSize:"17px",fontWeight:"600",marginBottom:"8px"}),title.textContent=action==="navigateMiniProgram"?"打开其他小程序":"订阅消息";let desc=document.createElement("div");Object.assign(desc.style,{fontSize:"14px",color:"#666",marginBottom:"20px"});let targetTitle=params.title?.trim()||"其他";desc.textContent=action==="navigateMiniProgram"?`即将打开“${targetTitle}”小程序,是否继续?`:"模拟微信订阅消息授权,请选择操作";let btnRow=document.createElement("div");Object.assign(btnRow.style,{display:"flex",gap:"12px"});let createButton=(text3,background,color,actionName)=>{let button=document.createElement("button");return button.textContent=text3,button.setAttribute("data-mearl-action",actionName),Object.assign(button.style,{flex:"1",padding:"10px 0",border:"none",borderRadius:"8px",fontSize:"15px",fontWeight:"500",cursor:"pointer",background,color}),button},confirmButton=createButton(action==="navigateMiniProgram"?"确定":"允许","#1677ff","#fff","mini-program-confirm"),cancelButton=createButton("取消","#f5f5f5","#333","mini-program-cancel"),cleanup=()=>overlay.remove();confirmButton.addEventListener("click",()=>{cleanup();let result=action==="navigateMiniProgram"?{errMsg:"navigateToMiniProgram:ok"}:{result:"SUCCESS",data:{totalCount:1,acceptCount:1}};log2("用户确认小程序原生能力",action,params.appId??params.scene??""),confirmed(result)}),cancelButton.addEventListener("click",()=>{cleanup();let result=action==="navigateMiniProgram"?{errMsg:"navigateToMiniProgram:fail cancel"}:{result:"CLOSE_BY_USER"};log2("用户取消小程序原生能力",action),cancelled(result)}),btnRow.appendChild(cancelButton),btnRow.appendChild(confirmButton),card.appendChild(title),card.appendChild(desc),card.appendChild(btnRow),overlay.appendChild(card),(document.body??document.documentElement).appendChild(overlay)}function handleMessage(msg){if(msg.source==="mearl-content"&&msg.type==="APP_BRIDGE_AUTH_CODE_PROGRESS")return(msg.phase==="installing"||msg.phase==="connected"||msg.phase==="authorizing")&&updateAuthCodeProgress(msg.requestId,msg.phase),!0;if(msg.source==="mearl-content"&&msg.type==="APP_BRIDGE_AUTH_CODE_PAIRING"){let result=msg.result;return typeof result?.qrSvg=="string"&&showAuthCodePairing(msg.requestId,result.qrSvg),!0}if(msg.source==="mearl-content"&&msg.type==="APP_BRIDGE_AUTH_CODE_RESPONSE")return finishAuthCode(msg.requestId,msg.result),!0;if(msg.source==="mearl-content"&&msg.type==="APP_BRIDGE_MTOP_RESPONSE"){let pending=pendingMtop[msg.requestId];if(!pending)return!0;delete pendingMtop[msg.requestId];let result=msg.result;return result?.success?pending.succ?.(result.response):pending.fail?.(result?.error??"mtop delegate failed"),!0}if(msg.source==="mearl-content"&&msg.type==="APP_BRIDGE_USER_INFO_RESPONSE"){let requestId=msg.requestId,pending=pendingUserInfo[requestId];if(!pending)return!0;delete pendingUserInfo[requestId],clearTimeout(pending.timer);let result=msg.result,response=result?.success&&result.response&&typeof result.response=="object"?result.response:{};return pending.succ?.(result?.success?{...pending.fallback,...response}:degradedUserInfo(pending.fallback,typeof result?.error=="string"&&result.error?result.error:"native relay failed")),!0}if(msg.source==="mearl-content"&&msg.type==="APP_BRIDGE_MTOP_STREAM_EVENT"){let requestId=msg.requestId,pending=pendingMtopStreams[requestId];if(!pending)return!0;let eventType=msg.eventType;return emitMtopStreamEvent(pending.sessionId,eventType,msg.data),(eventType==="onFinish"||eventType==="onError")&&delete pendingMtopStreams[requestId],!0}return!1}return{showAppToast,callMtop,callMtopStream,callUserInfo,callAuthCode,openImagePicker,showPaymentDialog,showMiniProgramActionDialog,handleMessage}}function installAppProfileBridgeProtocol(config2,environment,host){let{w,SRC,TAG,isTop,log:log2}=environment,{pageTransport,systemBars,requestOpen,requestClose,requestCloseAll,requestContainerData}=host,{showAppToast,callMtop,callMtopStream,callUserInfo,callAuthCode,openImagePicker,showPaymentDialog,showMiniProgramActionDialog}=pageTransport,{applyNavigationBarState,applyStatusBarState,syncSimulatedTitleBar}=systemBars,NOT_IMPLEMENTED_PAYLOAD=JSON.stringify({ret:["HY_FAILED"],msg:"not implemented"}),FPT_STORAGE_KEY=`__mearl_app_fpt__:${config2.profile}`,CALENDAR_STORAGE_KEY=`__mearl_app_calendar_events__:${config2.profile}`,unsupportedNativeInputNotified=!1,stopNetworkQualityMonitor=null,voiceRecognition=null,voiceRecognitionSession=0,voiceRecognitionTranscript="",voiceRecognitionInterimTranscript="",voiceRecognitionStopping=!1,voiceRecognitionRunning=!1,simulatedPageHidden=!1,simulatedVisibilityInstalled=!1,hasPendingMiniProgramBackData=!1,pendingMiniProgramBackData,notificationListeners=new Map,megaListenerSeq=0,megaBroadcastListeners=new Map,megaLifeCycleListeners=new Set,megaPageCloseListeners=new Set,megaSystemBackListener=null,megaKVMutationVersion=0,MEGA_KV_TOTAL_SIZE=5*1024*1024,MEGA_KV_STORAGE_KEY=`__mearl_mega_kv__:${config2.profile}`;function readMegaKVStorage(){let storage=new Map;try{let parsed=JSON.parse(localStorage.getItem(MEGA_KV_STORAGE_KEY)??"{}");if(!parsed||typeof parsed!="object"||Array.isArray(parsed))return storage;for(let[bizId,rawEntries]of Object.entries(parsed)){if(!rawEntries||typeof rawEntries!="object"||Array.isArray(rawEntries))continue;let entries=new Map;for(let[key,value]of Object.entries(rawEntries))typeof value=="string"&&entries.set(key,value);storage.set(bizId,entries)}}catch{}return storage}let megaKVStorage=readMegaKVStorage();function megaKVSnapshot(){let snapshot={};for(let[bizId,values]of megaKVStorage)snapshot[bizId]=Object.fromEntries(values);return snapshot}function persistMegaKVStorage(){try{localStorage.setItem(MEGA_KV_STORAGE_KEY,JSON.stringify(megaKVSnapshot()))}catch{}}function replaceMegaKVStorage(value){if(!(!value||typeof value!="object"||Array.isArray(value))){megaKVStorage.clear();for(let[bizId,rawEntries]of Object.entries(value)){if(!rawEntries||typeof rawEntries!="object"||Array.isArray(rawEntries))continue;let entries=new Map;for(let[key,entryValue]of Object.entries(rawEntries))typeof entryValue=="string"&&entries.set(key,entryValue);megaKVStorage.set(bizId,entries)}persistMegaKVStorage()}}function applyMegaKVMutation(payload){let operation=typeof payload.operation=="string"?payload.operation:"",bizId=typeof payload.bizId=="string"?payload.bizId:"",key=typeof payload.key=="string"?payload.key:"";if(bizId){if(operation==="set"&&key&&typeof payload.value=="string"){let entries=megaKVStorage.get(bizId)??new Map;entries.set(key,payload.value),megaKVStorage.set(bizId,entries)}else if(operation==="remove"&&key){let entries=megaKVStorage.get(bizId);entries?.delete(key),entries?.size===0&&megaKVStorage.delete(bizId)}else if(operation==="clear")megaKVStorage.delete(bizId);else return;megaKVMutationVersion+=1,persistMegaKVStorage()}}function emitMegaCallback(callback,value){callback&&setTimeout(()=>callback(value),0)}function megaBroadcastBizId(value){return typeof value=="string"&&value?value:"__MEGA_GLOBAL_MESSAGE__"}function dispatchMegaBroadcast(payload){let bizId=megaBroadcastBizId(payload.bizId),eventName=typeof payload.eventName=="string"?payload.eventName:"";if(eventName)for(let listener of Array.from(megaBroadcastListeners.values()))listener.bizId!==bizId||listener.eventName!==eventName||(listener.once&&megaBroadcastListeners.delete(listener.id),emitMegaCallback(listener.callback,{statusCode:1,type:"onEvent",data:{detail:payload.detail}}),listener.once&&emitMegaCallback(listener.callback,{statusCode:99,type:"finish"}))}let documentPrototype=typeof Document=="function"?Document.prototype:null,nativeHiddenDescriptor=documentPrototype?Object.getOwnPropertyDescriptor(documentPrototype,"hidden"):void 0,nativeVisibilityDescriptor=documentPrototype?Object.getOwnPropertyDescriptor(documentPrototype,"visibilityState"):void 0;function installSimulatedVisibilityState(){if(!simulatedVisibilityInstalled){simulatedVisibilityInstalled=!0;try{Object.defineProperty(document,"hidden",{configurable:!0,get:()=>simulatedPageHidden||!!(nativeHiddenDescriptor?.get?.call(document)??!1)}),Object.defineProperty(document,"visibilityState",{configurable:!0,get:()=>simulatedPageHidden?"hidden":nativeVisibilityDescriptor?.get?.call(document)??"visible"})}catch{}}}function dispatchPageTransitionEvent(type){try{let event=typeof PageTransitionEvent=="function"?new PageTransitionEvent(type,{persisted:!1}):new Event(type);window.dispatchEvent(event)}catch{}}function dispatchActiveEvents(){for(let name of config2.activeEvents)try{document.dispatchEvent(new Event(name))}catch{}}function handlePageVisibility(hidden){if(hidden===simulatedPageHidden)return;installSimulatedVisibilityState(),simulatedPageHidden=hidden;let lifeCycleType=hidden?"onPageDisappear":"onPageAppear";for(let callback of megaLifeCycleListeners)emitMegaCallback(callback,{statusCode:1,type:lifeCycleType,data:{pageId:location.href}});try{document.dispatchEvent(new Event("visibilitychange"))}catch{}if(hidden){try{window.dispatchEvent(new Event("blur"))}catch{}dispatchPageTransitionEvent("pagehide");return}dispatchPageTransitionEvent("pageshow");try{window.dispatchEvent(new Event("focus"))}catch{}dispatchActiveEvents()}function resolveWindowFunction(path27){let parts=path27.split(".").filter(Boolean),owner=w;for(let index=0;index<parts.length-1;index+=1){let next=owner[parts[index]];if(!next||typeof next!="object")return null;owner=next}let fn=owner[parts[parts.length-1]];return typeof fn=="function"?fn.bind(owner):null}function handleNativeBack(){let megaHandled=!1;for(let callback of megaPageCloseListeners)megaHandled=!0,emitMegaCallback(callback,{statusCode:1,type:"onClose",data:{}});if(megaSystemBackListener&&(megaHandled=!0,emitMegaCallback(megaSystemBackListener,{statusCode:1,type:"onSuccess",data:{}})),megaHandled)return!0;let nativeBack=config2.nativeBack;if(!nativeBack)return!1;if(nativeBack.handler){let handler=resolveWindowFunction(nativeBack.handler);if(!handler)return!1;try{return handler(),!0}catch{return!1}}let controlled=!1;if(nativeBack.controlFunction){let control=resolveWindowFunction(nativeBack.controlFunction);if(!control)return!1;try{controlled=control()===!0}catch{return!1}if(!controlled)return!1}if(!nativeBack.event)return controlled;try{let event=new Event(nativeBack.event,{cancelable:!0});return document.dispatchEvent(event),controlled||event.defaultPrevented}catch{return controlled}}function handleAppMessage(message){if(!message||typeof message!="object")return;let payload=message;if(payload.kind==="megaBroadcast"){dispatchMegaBroadcast(payload);return}if(payload.kind==="megaKVStorage"){applyMegaKVMutation(payload);return}if(payload.kind==="legacyBroadcast"&&typeof payload.instanceId=="string"){try{let event=new CustomEvent(`Broadcast.Message.${payload.instanceId}`,{detail:payload.message});Object.defineProperty(event,"param",{configurable:!0,value:payload.message}),document.dispatchEvent(event)}catch{}return}if(payload.kind==="notification"&&typeof payload.name=="string"){let listener=notificationListeners.get(payload.name);listener&&setTimeout(()=>listener(payload.data),0);return}if(!(payload.kind!=="message"||!config2.messageEvent))try{document.dispatchEvent(new CustomEvent(config2.messageEvent,{detail:{data:payload.data}}))}catch{}}function sendAppMessage(message){if(isTop){handleAppMessage(message);return}window.top?.postMessage({source:SRC,type:"appMessageToOpener",message},"*")}function applyRuntimeResponses(responses){let current=config2.actions.responses??{};for(let[api,response]of Object.entries(responses))current[api]=response;config2.actions.responses=current}function parseFpt(value){let entries=[],normalized=value.trim();if(!normalized)return entries;let pattern3=/([0-9A-Za-z._-]+)\(([0-9A-Za-z._-]+)\)/g,consumed="";for(let match of normalized.matchAll(pattern3))consumed+=match[0],entries.push([match[1],match[2]]);return consumed===normalized?entries:[]}function setFptEntry(entries,key,value){entries.delete(key),entries.set(key,value)}function readInitialFptEntries(){let entries=new Map;try{for(let[key,value]of parseFpt(sessionStorage.getItem(FPT_STORAGE_KEY)??""))setFptEntry(entries,key,value)}catch{}try{let currentFpt=new URL(location.href).searchParams.get("fpt")??"";for(let[key,value]of parseFpt(currentFpt))setFptEntry(entries,key,value)}catch{}return entries}let fptEntries=readInitialFptEntries();function serializeFpt(entries){return Array.from(entries,([key,value])=>`${key}(${value})`).join("")}function persistFpt(){try{let value=serializeFpt(fptEntries);value?sessionStorage.setItem(FPT_STORAGE_KEY,value):sessionStorage.removeItem(FPT_STORAGE_KEY)}catch{}}function decorateUrlWithFpt(rawUrl){let targetUrl=mapScheme(rawUrl)??rawUrl;if(fptEntries.size===0)return targetUrl;try{let url2=new URL(targetUrl,location.href);if(url2.protocol!=="http:"&&url2.protocol!=="https:")return targetUrl;let merged=new Map(fptEntries);for(let[key,value]of parseFpt(url2.searchParams.get("fpt")??""))setFptEntry(merged,key,value);return url2.searchParams.set("fpt",serializeFpt(merged)),url2.href}catch{return targetUrl}}function classify(api){let a=config2.actions;return a.open.includes(api)?"open":a.close.includes(api)?"close":a.title.includes(api)?"title":a.navigationBar?.includes(api)?"navigationBar":a.statusBar?.includes(api)?"statusBar":a.systemInfo.includes(api)?"systemInfo":a.mtop.includes(api)?"mtop":a.kvGet?.includes(api)?"kvGet":a.kvSet?.includes(api)?"kvSet":a.kvDelete?.includes(api)?"kvDelete":a.pageContext?.includes(api)?"pageContext":a.responses&&Object.prototype.hasOwnProperty.call(a.responses,api)?"response":a.behaviors&&Object.prototype.hasOwnProperty.call(a.behaviors,api)?a.behaviors[api]:a.noop.includes(api)?"noop":"unknown"}function pickUrl(params){if(!params||typeof params!="object")return null;let p=params,candidates=[p.url,p.data?.url,p.param?.url,p.value?.params?.url];for(let c of candidates)if(typeof c=="string"&&c)return c;return null}function pickCloseData(params){if(params&&typeof params=="object"){let p=params;if("data"in p&&p.data!==void 0)return p.data;if(Object.keys(p).length>0)return p}}function decodeCookieValue2(raw){let value=raw;for(let i=0;i<2;i+=1)try{let decoded=decodeURIComponent(value);if(decoded===value)break;value=decoded}catch{break}return value.replace(/\\u([0-9a-f]{4})/gi,(_match,hex3)=>String.fromCharCode(Number.parseInt(hex3,16)))}function readCookie(name){let prefix=`${name}=`,pair=document.cookie.split(";").map(value=>value.trim()).find(value=>value.startsWith(prefix));return pair?decodeCookieValue2(pair.slice(prefix.length)):""}function readUserCookie(name){let pageUserCookie=w.userCookie;if(!pageUserCookie||typeof pageUserCookie!="object")return"";let value=pageUserCookie[name];return typeof value=="string"?decodeCookieValue2(value):""}function readFirstUserCookie(names){for(let name of names){let value=readCookie(name)||readUserCookie(name);if(value&&value!=="null")return value}return""}let cbSeq=0,callbacks={};function stashCallback(fn){if(typeof fn!="function")return 0;let id=++cbSeq;return callbacks[id]=fn,id}function extractQuery(url2,param){let q=url2.indexOf("?");if(q===-1)return null;for(let pair of url2.slice(q+1).split("&")){let eq=pair.indexOf("=");if(eq>0&&pair.slice(0,eq)===param)return pair.slice(eq+1)}return null}function matchesHostSuffix(hostname3,suffixes){if(!suffixes?.length)return!0;let normalizedHost=hostname3.toLowerCase().replace(/\.$/,"");return suffixes.some(value=>{let suffix=value.toLowerCase().replace(/^\./,"").replace(/\.$/,"");return normalizedHost===suffix||normalizedHost.endsWith(`.${suffix}`)})}function matchesRouteHost(rawUrl,suffixes){if(!suffixes?.length)return!0;try{let parsed=new URL(rawUrl,location.href),hostname3=parsed.protocol==="http:"||parsed.protocol==="https:"?parsed.hostname:location.hostname;return matchesHostSuffix(hostname3,suffixes)}catch{return matchesHostSuffix(location.hostname,suffixes)}}function resolveSchemeValue(raw,depth){if(depth>3)return null;let value=raw;try{value=decodeURIComponent(raw)}catch{}if(value.startsWith("{"))try{let found=pickUrl(JSON.parse(value));if(!found)return null;value=found}catch{return null}if(/^https?:/i.test(value))return value;if(/^[a-z][a-z0-9+.-]*:/i.test(value))return mapScheme(value,depth+1);let nestedUrl=extractQuery(value,"url");return nestedUrl?resolveSchemeValue(nestedUrl,depth+1):null}function mapScheme(url2,depth=0){if(depth>3)return null;let lower=url2.toLowerCase();for(let rule of config2.schemes){if(!matchesRouteHost(url2,rule.hostSuffixes))continue;let normalizedMatch=rule.match.toLowerCase(),matchedUrl=url2;if(!lower.startsWith(normalizedMatch)){if(!normalizedMatch.startsWith("/"))continue;try{let parsed=new URL(url2,location.href);if(matchedUrl=`${parsed.pathname}${parsed.search}${parsed.hash}`,!matchedUrl.toLowerCase().startsWith(normalizedMatch))continue}catch{continue}}if(rule.targetPath){let suffix=matchedUrl.slice(rule.match.length);if(suffix&&!suffix.startsWith("?")&&!suffix.startsWith("#"))continue;try{let source=new URL(matchedUrl),origin=location.origin;if(rule.targetHostPrefix){let hostname3=location.hostname.toLowerCase(),domainSuffix=hostname3==="wapa.taobao.com"||hostname3.endsWith(".wapa.taobao.com")?"wapa.taobao.com":hostname3==="m.taobao.com"||hostname3.endsWith(".m.taobao.com")?"m.taobao.com":"";domainSuffix&&(origin=`https://${rule.targetHostPrefix}.${domainSuffix}`)}let target=new URL(rule.targetPath,`${origin}/`);target.search=source.search,target.hash=source.hash;for(let[key,value]of Object.entries(rule.targetParams??{}))target.searchParams.has(key)||target.searchParams.set(key,value);return target.href}catch{return null}}if(!rule.param)continue;let raw=extractQuery(matchedUrl,rule.param);if(!raw)return null;let resolved=resolveSchemeValue(raw,depth);if(!resolved||!rule.useCurrentOrigin)return resolved;try{let target=new URL(resolved);return`${location.origin}${target.pathname}${target.search}${target.hash}`}catch{return resolved}}return null}function firstRouteParam(params,names){for(let name of names){let value=params.get(name);if(value)return value}return""}function resolvePaymentCallbackUrl(rawUrl,paymentPageUrl,useCurrentOrigin,forwardParams,resultParam){if(!rawUrl)return null;try{let target=new URL(rawUrl,location.href);for(let name of forwardParams){let value=paymentPageUrl.searchParams.get(name);value&&!target.searchParams.get(name)&&target.searchParams.set(name,value)}resultParam&&target.searchParams.set(resultParam.name,JSON.stringify(resultParam.value));let resolved=useCurrentOrigin&&(target.protocol==="http:"||target.protocol==="https:")?`${location.origin}${target.pathname}${target.search}${target.hash}`:target.href;return decorateUrlWithFpt(resolved)}catch{return null}}function openPaymentCallback(rawUrl,paymentPageUrl,useCurrentOrigin,forwardParams,resultParam){let target=resolvePaymentCallbackUrl(rawUrl,paymentPageUrl,useCurrentOrigin,forwardParams,resultParam);target&&requestOpen(target,0,!1)}function handleMiniProgramPaymentRoute(rawUrl){let paymentPageUrl;try{paymentPageUrl=new URL(rawUrl,location.href)}catch{return!1}let normalizedPathname=paymentPageUrl.pathname.replace(/\/+$/,"")||"/",rule=config2.miniProgram?.paymentRoutes?.find(candidate=>(candidate.pathname.replace(/\/+$/,"")||"/")===normalizedPathname&&matchesHostSuffix(paymentPageUrl.hostname,candidate.hostSuffixes));if(!rule)return!1;let successUrl=firstRouteParam(paymentPageUrl.searchParams,rule.successUrlParams),failureUrl=firstRouteParam(paymentPageUrl.searchParams,rule.failureUrlParams),forwardParams=rule.forwardParams??[],useCurrentOrigin=rule.useCurrentOrigin===!0,paymentParams;try{let parsed=JSON.parse(paymentPageUrl.searchParams.get(rule.paymentParamsParam)??"");if(!parsed||typeof parsed!="object"||Array.isArray(parsed))throw new Error;paymentParams=parsed,paymentParams.timeStamp!==void 0&&(paymentParams.timeStamp=String(paymentParams.timeStamp))}catch{return log2("微信支付参数解析失败,执行失败回跳",rawUrl),openPaymentCallback(failureUrl,paymentPageUrl,useCurrentOrigin,forwardParams),!0}return showPaymentDialog("wx.requestPayment",paymentParams,result=>{openPaymentCallback(successUrl,paymentPageUrl,useCurrentOrigin,forwardParams,rule.successResultParam?{name:rule.successResultParam,value:result}:void 0)},()=>{openPaymentCallback(failureUrl,paymentPageUrl,useCurrentOrigin,forwardParams)}),!0}function finishMiniProgramNativeRoute(action,result,storageId){handleResume({data:action==="subscribeMessage"?result:void 0,storageId,callbackId:0,final:!0})}function handleMiniProgramNativeRoute(rawUrl){let nativePageUrl;try{nativePageUrl=new URL(rawUrl,location.href)}catch{return!1}let normalizedPathname=nativePageUrl.pathname.replace(/\/+$/,"")||"/",action=nativePageUrl.searchParams.get("action");if(action!=="navigateMiniProgram"&&action!=="subscribeMessage"||!config2.miniProgram?.nativeRoutes?.find(candidate=>(candidate.pathname.replace(/\/+$/,"")||"/")===normalizedPathname&&candidate.actions.includes(action)&&matchesHostSuffix(nativePageUrl.hostname,candidate.hostSuffixes)))return!1;let params={};nativePageUrl.searchParams.forEach((value,name)=>{params[name]=value});let storageId=nativePageUrl.searchParams.get("__storage_id");return handlePageVisibility(!0),showMiniProgramActionDialog(action,params,result=>finishMiniProgramNativeRoute(action,result,storageId),result=>finishMiniProgramNativeRoute(action,result,storageId)),!0}function handleMiniProgramPostMessage(data){let rules=config2.miniProgram?.messageRules;if(!rules?.length)return!1;let messages=Array.isArray(data)?data:[data],handled=!1;for(let value of messages){if(!value||typeof value!="object"||Array.isArray(value))continue;let message=value;if(typeof message.type!="string")continue;let rule=rules.find(candidate=>candidate.type===message.type&&matchesHostSuffix(location.hostname,candidate.hostSuffixes));rule&&(handled=!0,rule.action==="stageBackData"?(pendingMiniProgramBackData=message.data,hasPendingMiniProgramBackData=!0):rule.action==="closeAll"&&(isTop?requestCloseAll(message.data)||requestClose(message.data):window.top?.postMessage({source:SRC,type:"closeAll",data:message.data},"*")))}return handled}function matchesImagePickerScheme(url2){let lower=url2.toLowerCase();return config2.imagePicker?.schemes.some(scheme=>lower.startsWith(scheme))===!0}function createImagePickerCallbackId(){try{if(typeof crypto.randomUUID=="function")return crypto.randomUUID()}catch{}return`${Date.now()}-${Math.random().toString(36).slice(2)}`}function handleMaybeScheme(url2){if(typeof url2!="string"||!url2||!/^[a-z][a-z0-9+.-]*:/i.test(url2)||/^(https?|about|blob|data|javascript):/i.test(url2))return!1;let mapped=mapScheme(url2);return mapped?(log2("scheme 映射为 H5 open:",url2,"→",mapped),requestOpen(decorateUrlWithFpt(mapped),0,!1)):log2("外部 scheme 已拦截(真机表现为唤端):",url2),!0}function handleResume(msg){let{data,storageId,callbackId,final,gotoEvent,silent}=msg;if(gotoEvent&&dispatchGotoEvent(data),callbackId&&callbacks[callbackId]){if(!silent)try{callbacks[callbackId]({backdata:data})}catch(e){console.error(TAG,"callbackCommand 执行失败",e)}final&&delete callbacks[callbackId]}if(data&&typeof data=="object"&&storageId)try{let d={...data};d.__$data=!0,d.__$storageId=String(storageId),localStorage.setItem("XPI_BACK_LISTENER_DATA_STORAGE",JSON.stringify(d))}catch{}simulatedPageHidden?handlePageVisibility(!1):dispatchActiveEvents()}function dispatchGotoEvent(data){if(data!==void 0)try{document.dispatchEvent(new CustomEvent("WV.GotoEvent",{detail:{data}}))}catch{}}function sendUserTrack(params){if(!params||typeof params!="object")return;let p=params,logkey=typeof p.logkey=="string"?p.logkey:"",gmkey=typeof p.gmkey=="string"?p.gmkey:typeof p.event=="string"?p.event:"",gokey=typeof p.gokey=="string"?p.gokey:"";if(!/^\/[0-9A-Za-z._/-]+$/.test(logkey)||!/^[0-9A-Za-z_-]+$/.test(gmkey))return;let pageWindow=w,aplus=pageWindow.goldlog??pageWindow.aplus;if(typeof aplus?.send!="function")return;let configuredHost=aplus.getMetaInfo?.("aplus-rhost-g"),host2=(typeof configuredHost=="string"?configuredHost:"gm.mmstat.com").replace(/^https?:\/\//i,"").replace(/^\/\//,"").split("/")[0];if(!(!host2||!/^[0-9A-Za-z.-]+$/.test(host2)))try{aplus.send(`//${host2}${logkey}`,`gmkey=${encodeURIComponent(gmkey)}&gokey=${gokey}&ts=${Date.now()}`,"GET")}catch{}}function readNetworkState(){let connection=navigator.connection;return navigator.onLine?connection?.type==="wifi"?"wifi":connection?.effectiveType??"unknown":"fail"}function networkTypeNumber(state){return{wifi:2,"slow-2g":3,"2g":3,"3g":4,"4g":5,"5g":6,fail:7}[state]??0}function emitVoiceRecognitionEvent(name,detail){try{document.dispatchEvent(new CustomEvent(name,{detail}))}catch{}}function browserSpeechRecognitionConstructor(){let candidate=w.SpeechRecognition??w.webkitSpeechRecognition;return typeof candidate=="function"?candidate:null}function voiceRecognitionLanguage(){let language=config2.language||navigator.language||"zh-CN";return/^zh-hans$/i.test(language)?"zh-CN":/^zh-hant$/i.test(language)?"zh-TW":language}function localVoiceRecognitionLanguage(language){return/^zh-(cn|hans)$/i.test(language)?"cmn-Hans-CN":/^zh-(tw|hant)$/i.test(language)?"cmn-Hant-TW":language}function detachVoiceRecognition(recognition){recognition.onstart=null,recognition.onresult=null,recognition.onerror=null,recognition.onend=null,recognition.onspeechstart=null,recognition.onspeechend=null}function finishVoiceRecognition(recognition,status){if(voiceRecognition!==recognition)return;let content=voiceRecognitionInterimTranscript.trim()||voiceRecognitionTranscript.trim();voiceRecognition=null,voiceRecognitionSession+=1,voiceRecognitionRunning=!1,voiceRecognitionStopping=!1,voiceRecognitionInterimTranscript="",detachVoiceRecognition(recognition),emitVoiceRecognitionEvent("WV.Voicetone",{tone:0}),emitVoiceRecognitionEvent("WV.VoiceRecog",{content,finished:!0,status})}function cancelVoiceRecognition(notifyPage){let recognition=voiceRecognition;if(recognition){voiceRecognition=null,voiceRecognitionSession+=1,voiceRecognitionRunning=!1,voiceRecognitionStopping=!1,voiceRecognitionInterimTranscript="",detachVoiceRecognition(recognition);try{recognition.abort()}catch{}emitVoiceRecognitionEvent("WV.Voicetone",{tone:0}),notifyPage&&emitVoiceRecognitionEvent("WV.VoiceRecogFailed",{status:2})}}function startVoiceRecognition(succeed,failed){cancelVoiceRecognition(!1);let SpeechRecognition=browserSpeechRecognitionConstructor();if(!SpeechRecognition){let error48={error_code:-1,error_message:"speech recognition unavailable"};emitVoiceRecognitionEvent("WV.VoiceRecogFailed",{status:-1,...error48}),failed(error48);return}let recognition=new SpeechRecognition,session=++voiceRecognitionSession;voiceRecognition=recognition,voiceRecognitionTranscript="",voiceRecognitionInterimTranscript="",voiceRecognitionStopping=!1,voiceRecognitionRunning=!1,recognition.continuous=!0,recognition.interimResults=!0,recognition.maxAlternatives=1,recognition.lang=voiceRecognitionLanguage();let isCurrent=()=>voiceRecognition===recognition&&voiceRecognitionSession===session,recognitionFailed=!1,failRecognition=(message,code)=>{if(!isCurrent()||recognitionFailed)return;recognitionFailed=!0;let error48={error_code:-1,error_message:message,error:code};voiceRecognition=null,voiceRecognitionSession+=1,voiceRecognitionRunning=!1,voiceRecognitionStopping=!1,detachVoiceRecognition(recognition);try{recognition.abort()}catch{}emitVoiceRecognitionEvent("WV.Voicetone",{tone:0}),emitVoiceRecognitionEvent("WV.VoiceRecogFailed",{status:-1,...error48}),failed(error48)},beginRecognition=()=>{if(isCurrent())try{recognition.start(),voiceRecognitionRunning=!0,succeed({})}catch(error48){failRecognition(error48 instanceof Error?error48.message:"speech recognition start failed","start-failed")}};recognition.onstart=()=>{isCurrent()&&(voiceRecognitionRunning=!0)},recognition.onspeechstart=()=>{isCurrent()&&emitVoiceRecognitionEvent("WV.Voicetone",{tone:10})},recognition.onspeechend=()=>{isCurrent()&&emitVoiceRecognitionEvent("WV.Voicetone",{tone:0})},recognition.onresult=event=>{if(!isCurrent()||!event.results)return;let interimTranscript="",startIndex=Math.max(0,event.resultIndex??0);for(let index=startIndex;index<event.results.length;index+=1){let result=event.results[index],transcript=result?.[0]?.transcript??"";result?.isFinal?voiceRecognitionTranscript+=transcript:interimTranscript+=transcript}let content=`${voiceRecognitionTranscript}${interimTranscript}`.trim();voiceRecognitionInterimTranscript=content,content&&emitVoiceRecognitionEvent("WV.VoiceRecogPartial",{content})},recognition.onerror=event=>{if(!isCurrent())return;let code=event.error??"unknown";code!=="no-speech"&&(code==="aborted"&&voiceRecognitionStopping||failRecognition(event.message||`speech recognition failed: ${code}`,code))},recognition.onend=()=>{if(isCurrent()){if(voiceRecognitionRunning=!1,voiceRecognitionStopping){finishVoiceRecognition(recognition,1);return}setTimeout(()=>{if(!(!isCurrent()||voiceRecognitionStopping))try{recognition.start(),voiceRecognitionRunning=!0}catch(error48){failRecognition(error48 instanceof Error?error48.message:"speech recognition restart failed","restart-failed")}},0)}};let localLanguage=localVoiceRecognitionLanguage(recognition.lang);if(typeof recognition.processLocally=="boolean"&&typeof SpeechRecognition.available=="function"){SpeechRecognition.available({langs:[localLanguage],processLocally:!0}).then(availability=>{if(isCurrent()){if(availability==="available"){recognition.lang=localLanguage,recognition.processLocally=!0,beginRecognition();return}if((availability==="downloadable"||availability==="downloading")&&typeof SpeechRecognition.install=="function"){showAppToast({message:"正在准备语音识别,首次使用可能需要一些时间",milliseconds:3e3}),SpeechRecognition.install({langs:[localLanguage],processLocally:!0}).then(installed=>{if(!installed){isCurrent()&&beginRecognition();return}if(!isCurrent()){showAppToast({message:"语音识别已准备好,请再试一次",milliseconds:3e3});return}recognition.lang=localLanguage,recognition.processLocally=!0,beginRecognition()}).catch(()=>beginRecognition());return}beginRecognition()}}).catch(()=>beginRecognition());return}beginRecognition()}function calendarTimestamp(value){if(typeof value=="number"&&Number.isFinite(value))return value;if(typeof value!="string"||!value.trim())return null;let numeric=Number(value);if(Number.isFinite(numeric)&&numeric>0)return numeric;let parsed=Date.parse(value);return Number.isFinite(parsed)?parsed:null}function calendarEventFromParams(params){let p=params&&typeof params=="object"?params:{},stringValue=(...values)=>values.find(value=>typeof value=="string")??"";return{title:stringValue(p.calendar_title,p.title),startTime:calendarTimestamp(p.calendar_start_ms??p.start_time??p.calendar_start_datetime),endTime:calendarTimestamp(p.calendar_end_ms??p.end_time??p.calendar_end_datetime),url:stringValue(p.calendar_url,p.url),note:stringValue(p.calendar_note,p.note),location:stringValue(p.calendar_location,p.location)}}function readCalendarEvents(){try{let parsed=JSON.parse(localStorage.getItem(CALENDAR_STORAGE_KEY)??"[]");return Array.isArray(parsed)?parsed.filter(event=>event!==null&&typeof event=="object"&&typeof event.title=="string"):[]}catch{return[]}}function writeCalendarEvents(events){try{return localStorage.setItem(CALENDAR_STORAGE_KEY,JSON.stringify(events)),!0}catch{return!1}}function sameCalendarEvent(stored,candidate){return candidate.url?stored.url===candidate.url:!!candidate.title&&stored.title===candidate.title&&(candidate.startTime===null||stored.startTime===candidate.startTime)&&(candidate.endTime===null||stored.endTime===candidate.endTime)}function calendarEventResponse(event){return{title:event.title,start_time:event.startTime,end_time:event.endTime,url:event.url,note:event.note,location:event.location}}function dispatch(api,params,onSuccess,onFailure,callbackCommandFn){let succeed=value=>{onSuccess&&setTimeout(()=>onSuccess(value),0)},failed=reason=>{onFailure&&setTimeout(()=>onFailure(reason),0)},kind=classify(api),silent=config2.actions.silent?.includes(api)===!0;if(silent||log2("桥调用",api,`(${kind})`,params??""),kind==="open"||kind==="navigate"){let p=params&&typeof params=="object"?params:{},navigationData=p.data&&typeof p.data=="object"?p.data:void 0;if(kind==="navigate"&&navigationData?.type==="back"){isTop?requestCloseAll(navigationData.data,!0)||dispatchGotoEvent(navigationData.data):window.top?.postMessage({source:SRC,type:"closeAll",data:navigationData.data,gotoEvent:!0},"*"),succeed({});return}let url2=pickUrl(params);if(!url2){failed("missing url");return}if(matchesImagePickerScheme(url2)){openImagePicker({maxSelect:1,capture:!1},urls=>{let pic=urls[0];pic&&typeof callbackCommandFn=="function"&&callbackCommandFn({pic,uuid:createImagePickerCallbackId(),timeStamp:Date.now()})},error48=>console.error(TAG,"图片选择失败:",error48)),succeed({});return}if(handleMiniProgramPaymentRoute(url2)){succeed({});return}if(handleMiniProgramNativeRoute(url2)){succeed({});return}let wd=p.useWebdialog===!0||p.useWebdialog==="true"||p.useWebdialog===1||p.useWebdialog==="1";requestOpen(decorateUrlWithFpt(url2),stashCallback(callbackCommandFn),wd,p),succeed({});return}if(kind==="closeAll"){isTop?requestCloseAll(void 0):window.top?.postMessage({source:SRC,type:"closeAll"},"*"),succeed({});return}if(kind==="closeBackData"){let p=params&&typeof params=="object"?params:{};requestClose(Object.prototype.hasOwnProperty.call(p,"backdata")?p.backdata:pickCloseData(p)),succeed({});return}if(kind==="close"){if(api==="navigateBack"&&hasPendingMiniProgramBackData){let data=pendingMiniProgramBackData;pendingMiniProgramBackData=void 0,hasPendingMiniProgramBackData=!1,requestClose(data)}else requestClose(pickCloseData(params));succeed({});return}if(kind==="postMessage"){let p=params&&typeof params=="object"?params:{},data=p.data??p;handleMiniProgramPostMessage(data)||sendAppMessage({kind:"message",data}),succeed({});return}if(kind==="notifySubscribe"){let p=params&&typeof params=="object"?params:{};if(typeof p.name!="string"||!p.name){failed("missing notification name");return}onSuccess&&notificationListeners.set(p.name,onSuccess);return}if(kind==="notifyUnsubscribe"){let p=params&&typeof params=="object"?params:{};typeof p.name=="string"&&notificationListeners.delete(p.name),succeed({});return}if(kind==="notifyPost"){let p=params&&typeof params=="object"?params:{};if(typeof p.name!="string"||!p.name){failed("missing notification name");return}sendAppMessage({kind:"notification",name:p.name,data:p.data}),succeed({});return}if(kind==="sharedFileRead"||kind==="sharedFileWrite"||kind==="sharedDataGet"||kind==="sharedDataSet"){requestContainerData(kind,params&&typeof params=="object"?params:{},succeed,failed);return}if(kind==="legacyBroadcastCreate"||kind==="legacyBroadcastPost"||kind==="legacyBroadcastClose"){requestContainerData(kind,params&&typeof params=="object"?params:{},succeed,failed);return}if(kind==="title"){let title=params&&typeof params=="object"?params.title??params.name:void 0;if(typeof title=="string"&&title){systemBars.markStateExplicit();try{document.title=title,syncSimulatedTitleBar()}catch{}isTop||window.top?.postMessage({source:SRC,type:"title",title},"*")}succeed({});return}if(kind==="navigationBar"){applyNavigationBarState(api,params),succeed({});return}if(kind==="statusBar"){applyStatusBarState(params),succeed({});return}if(kind==="systemInfo"){let model=config2.globals.__DEVICE_MODEL__||"iPhone",info={language:config2.language,model,systemVersion:config2.systemVersion,statusBarHeight:config2.statusBarHeight,platform:config2.platform,brand:config2.platform==="iOS"?"Apple":"Android",client_version:config2.globals.__APP_VERSION__??"",client_type:config2.clientType};succeed(api==="WVNativeDetector.getModelInfo"?{...info,platform:model}:info);return}if(kind==="mtop"){callMtop(params??{},onSuccess,onFailure);return}if(kind==="mtopStream"){callMtopStream(params??{},succeed,failed);return}if(kind==="kvGet"||kind==="kvSet"||kind==="kvDelete"){let p=params&&typeof params=="object"?params:{},key=typeof p.key=="string"?p.key:"";if(!key){failed("missing key");return}try{let storageKey=`__mearl_app_kv__:${key}`;if(kind==="kvGet"){let stored=localStorage.getItem(storageKey);stored!==null?succeed(stored):failed(JSON.stringify({ret:["HY_FAILED"],msg:"key not found"}))}else if(kind==="kvSet"){let value=typeof p.value=="string"?p.value:p.value===void 0?"":JSON.stringify(p.value);localStorage.setItem(storageKey,value),succeed({})}else localStorage.removeItem(storageKey),succeed({})}catch{failed(JSON.stringify({ret:["HY_FAILED"],msg:"kv storage unavailable"}))}return}if(kind==="pageContext"){succeed({pageContext:void 0});return}if(kind==="memoryGet"||kind==="memorySet"||kind==="memoryDelete"){let p=params&&typeof params=="object"?params:{},key=typeof p.key=="string"?p.key:"";if(!key){failed({error_message:"missing key"});return}try{let storageKey=`__mearl_app_memory__:${key}`;if(kind==="memoryGet"){let value=sessionStorage.getItem(storageKey);succeed(value===null?{}:{value})}else if(kind==="memorySet"){let value=typeof p.value=="string"?p.value:p.value===void 0?"":JSON.stringify(p.value);sessionStorage.setItem(storageKey,value),succeed({key,success:!0})}else sessionStorage.removeItem(storageKey),succeed({key,success:!0})}catch{failed({error_message:"memory cache unavailable"})}return}if(kind==="availabilityMap"){let p=params&&typeof params=="object"?params:{},channels=Array.isArray(p.data)?p.data.filter(value=>typeof value=="string"):[];succeed({res:"success",data:Object.fromEntries(channels.map(channel=>[channel,!1]))});return}if(kind==="userInfo"){let userId=readFirstUserCookie(["unb"]),userName=readFirstUserCookie(["_w_tb_nick","_nk_","snk","tracknick"]);callUserInfo({...userId&&{userId},...userName&&{userName}},succeed);return}if(kind==="authCode"){callAuthCode(params,succeed,failed);return}if(kind==="networkInfo"){let state=readNetworkState();if(api==="WVNetwork.getNetworkType"){succeed({type:{wifi:"WIFI","slow-2g":"2G","2g":"2G","3g":"3G","4g":"4G"}[state]??"UNKNOWN"});return}if(config2.policies?.networkResult==="alipay"){succeed({networkAvailable:state!=="fail",networkType:{wifi:"WIFI","slow-2g":"2G","2g":"2G","3g":"3G","4g":"4G",fail:"NOTREACHABLE"}[state]??"UNKNOWN"});return}let type=networkTypeNumber(state);succeed({type,state:state==="slow-2g"?"2g":state});return}if(kind==="networkQualityMonitor"){let p=params&&typeof params=="object"?params:{},action=typeof p.action=="string"?p.action:"";if(action==="add_notify_network_quality"){if(!stopNetworkQualityMonitor){let notify=()=>{try{document.dispatchEvent(new CustomEvent("WV.NETWORK_TYPE_CHANGED",{detail:{new_network_type:networkTypeNumber(readNetworkState())}}))}catch{}},connection=navigator.connection;window.addEventListener("online",notify),window.addEventListener("offline",notify),connection?.addEventListener?.("change",notify),stopNetworkQualityMonitor=()=>{window.removeEventListener("online",notify),window.removeEventListener("offline",notify),connection?.removeEventListener?.("change",notify)}}succeed({});return}if(action==="remove_notify_network_quality"){stopNetworkQualityMonitor?.(),stopNetworkQualityMonitor=null,succeed({});return}failed({error_message:"unsupported network quality monitor action"});return}if(kind==="voiceRecognition"){let status=Number((params&&typeof params=="object"?params:{}).status);if(status===0){startVoiceRecognition(succeed,failed);return}if(status===1){let recognition=voiceRecognition;if(recognition)if(voiceRecognitionStopping=!0,voiceRecognitionRunning)try{recognition.stop()}catch{finishVoiceRecognition(recognition,1)}else finishVoiceRecognition(recognition,1);succeed({});return}if(status===2){cancelVoiceRecognition(!0),succeed({});return}failed({error_code:-1,error_message:"unsupported voice recognition status"});return}if(kind==="beaconRequest"){let url2=pickUrl(params);if(!url2){failed({error_message:"missing url"});return}try{let resolved=new URL(url2,location.href);if(resolved.protocol!=="http:"&&resolved.protocol!=="https:"){failed({error_message:"unsupported request protocol"});return}let image=new Image;image.referrerPolicy="no-referrer-when-downgrade",image.src=resolved.href,succeed({})}catch{failed({error_message:"invalid url"})}return}if(kind==="calendar"){let p=params&&typeof params=="object"?params:{},events=readCalendarEvents();if(api==="store_calendar_event"){let event=calendarEventFromParams(p);if(!event.title||event.startTime===null){failed({error_message:"calendar title and start time are required"});return}let next=events.filter(stored=>!sameCalendarEvent(stored,event));if(next.push(event),!writeCalendarEvents(next)){failed({error_message:"calendar storage unavailable"});return}succeed({success:!0});return}if(api==="remove_calendar_event"){let candidate=calendarEventFromParams(p),next=events.filter(stored=>!sameCalendarEvent(stored,candidate));if(!writeCalendarEvents(next)){failed({error_message:"calendar storage unavailable"});return}succeed({success:!0,removed:events.length-next.length});return}if(api==="check_batch_calendar"){let batch=Array.isArray(p.batch)?p.batch:[];succeed({batch:batch.map(item=>{let candidate=calendarEventFromParams(item);return{...item&&typeof item=="object"?item:{},success:events.some(stored=>sameCalendarEvent(stored,candidate))}})});return}let urls=Array.isArray(p.urls)?p.urls.filter(value=>typeof value=="string"):typeof p.url=="string"?[p.url]:[],titles=Array.isArray(p.calendar_titles)?p.calendar_titles.filter(value=>typeof value=="string"):typeof p.calendar_title=="string"?[p.calendar_title]:[],matched=events.filter(event=>(urls.length===0||urls.includes(event.url))&&(titles.length===0||titles.includes(event.title)));succeed({events:matched.map(calendarEventResponse)});return}if(kind==="geolocation"){let p=params&&typeof params=="object"?params:{},windvane=api==="WVLocation.getLocation",wechat=api==="getLocation"&&config2.bridges.some(bridge=>bridge.style==="wechat"),failLocation=(errorCode,errorMsg)=>{failed({errorCode,errorMsg,...windvane&&{ret:["HY_FAILED"],errMsg:errorCode===1?"PERMISSION_DENIED":"POSITION_UNAVAILABLE",message:errorMsg},...wechat&&{errMsg:`getLocation:fail ${errorMsg}`}})};if(wechat&&p.type&&p.type!=="wgs84"){failLocation(2,`unsupported coordinate type: ${String(p.type)}`);return}if(!navigator.geolocation){failLocation(2,"geolocation unavailable");return}let locate=()=>navigator.geolocation.getCurrentPosition(position=>{let{latitude,longitude,accuracy,altitude,altitudeAccuracy,heading,speed}=position.coords,coords={latitude,longitude,accuracy,altitude,altitudeAccuracy,heading,speed};if(api==="lbs"){let provider=config2.geolocation;if(!provider){failLocation(2,"reverse geocoding unavailable");return}callMtop({api:provider.reverseGeocodeApi,v:provider.version,data:{latitude,longitude,includeGJ:1},timeout:5e3},value=>{let response=value??{},address=response.data??{};if(!Array.isArray(response.ret)||!response.ret.some(ret=>typeof ret=="string"&&ret.startsWith("SUCCESS::"))||typeof address.cityName!="string"||!address.cityName.trim()||typeof address.cityCode!="string"||!address.cityCode.trim()){failLocation(2,"reverse geocoding returned no city");return}succeed({...coords,timestamp:position.timestamp,country:address.country,province:address.province,district:address.district,city:address.cityName,cityName:address.cityName,cityCode:address.cityCode,divisionId:address.divisionId,iataCode:address.iataCode,address:address.detail})},()=>failLocation(2,"reverse geocoding failed"));return}succeed(windvane?{ret:["HY_SUCCESS"],coords,timestamp:position.timestamp}:{...coords,timestamp:position.timestamp,...wechat&&{errMsg:"getLocation:ok"}})},error48=>failLocation(error48.code,error48.message),{enableHighAccuracy:p.enableHighAccuracy===!0||p.enableHighAcuracy===!0,timeout:1e4,maximumAge:p.useCache===!1?0:3e5});navigator.permissions?.query?navigator.permissions.query({name:"geolocation"}).then(status=>{status.state==="granted"?locate():failLocation(1,"location permission not granted")}).catch(locate):locate();return}if(kind==="permission"){let p=params&&typeof params=="object"?params:{},action=typeof p.action=="string"?p.action:"",permission=typeof p.permission=="string"?p.permission:"",permissionFailed=message=>failed({error_code:-1,error_message:message});if(permission==="album"||permission==="MODIFY_AUDIO_SETTINGS"){action==="check"||action==="request"?succeed({}):permissionFailed("unsupported permission action");return}let browserPermission=permission==="mic"?"microphone":permission==="camera"?"camera":permission==="lbs"?"geolocation":"";if(!browserPermission){permissionFailed("unsupported permission");return}if(action==="check"&&navigator.permissions?.query){navigator.permissions.query({name:browserPermission}).then(status=>{status.state==="granted"?succeed({}):permissionFailed("permission not granted")}).catch(()=>permissionFailed("permission check failed"));return}if(action==="request"&&(permission==="mic"||permission==="camera")){if(!navigator.mediaDevices?.getUserMedia){permissionFailed("media permission unavailable");return}navigator.mediaDevices.getUserMedia({audio:permission==="mic",video:permission==="camera"}).then(stream=>{for(let track of stream.getTracks())track.stop();succeed({})}).catch(()=>permissionFailed("permission denied"));return}if(action==="request"&&permission==="lbs"&&navigator.geolocation){navigator.geolocation.getCurrentPosition(()=>succeed({}),()=>permissionFailed("permission denied"),{timeout:1e4});return}permissionFailed("unsupported permission action");return}if(kind==="imagePicker"){let p=params&&typeof params=="object"?params:{},requestedMaxSelect=Number(p.maxSelect??p.max_select),maxSelect=Number.isFinite(requestedMaxSelect)?requestedMaxSelect:1,pickType=Number(p.pickType??p.pick_type),uploadType=Number(p.uploadType??p.upload_type);openImagePicker({maxSelect,capture:pickType===1,resultType:uploadType===3?"dataUrl":"uploadedUrl"},urls=>succeed({imgUrls:urls}),failed);return}if(kind==="prefetch"){let p=params&&typeof params=="object"?params:{},url2=typeof p.url=="string"?p.url:"";if(!url2){failed({code:-1,errorMsg:"url is empty"});return}let resolvedUrl;try{resolvedUrl=new URL(url2,location.href).href}catch{failed({code:-1,errorMsg:"invalid url"});return}if(!Array.from(document.querySelectorAll('link[rel="prefetch"]')).some(link=>link.href===resolvedUrl)){let link=document.createElement("link");link.rel="prefetch",link.href=url2,(document.head??document.documentElement).appendChild(link)}succeed({});return}if(kind==="fptTrack"){let p=params&&typeof params=="object"?params:{},action=typeof p.action=="string"?p.action:"",actionParams=p.params&&typeof p.params=="object"?p.params:{},key=typeof actionParams.key=="string"?actionParams.key:"";if(action==="setFpt"){let value=typeof actionParams.value=="string"?actionParams.value:"";if(!key||!value||!/^[0-9A-Za-z._-]+$/.test(key)||!/^[0-9A-Za-z._-]+$/.test(value)||`${key}(${value})`.length>100){failed({error_message:"invalid fpt key or value"});return}setFptEntry(fptEntries,key,value),persistFpt()}else action==="deleteFpt"&&key&&(fptEntries.delete(key),persistFpt());succeed({});return}if(kind==="previewFile"){let p=params&&typeof params=="object"?params:{},fileUrl=typeof p.file_url=="string"?p.file_url:"",remoteUrl=typeof p.file_remote_url=="string"?p.file_remote_url:"",url2=(fileUrl.startsWith("http")?fileUrl:remoteUrl)||fileUrl||remoteUrl;url2?(requestOpen(url2,0,!1),succeed({})):failed({code:-1,errorMsg:"file_url is empty"});return}if(kind==="toast"){let error48=showAppToast(params);error48?failed({error_message:error48}):succeed({});return}if(kind==="unsupportedNativeInput"){let containerType="";try{containerType=new URL(location.href).searchParams.get("containerType")??""}catch{}!unsupportedNativeInputNotified&&(containerType==="h5_dx"||containerType==="flutter_h5")&&(unsupportedNativeInputNotified=!0,showAppToast({message:"当前页面使用原生输入框,请移除 URL 中的 containerType 参数以正常操作",milliseconds:4e3})),succeed({});return}if(kind==="payment"){log2("桥调用支付,等待用户确认",api,params),showPaymentDialog(api,params,succeed,failed);return}if(kind==="userTrack"){sendUserTrack(params),succeed({});return}if(kind==="response"){succeed(config2.actions.responses?.[api]);return}if(kind==="noop"){succeed({});return}silent||log2("未覆盖桥方法,回调 failure(页面库将走 H5 兜底):",api),failed(NOT_IMPLEMENTED_PAYLOAD)}let MEGA_SUPPORTED_APIS={stdPop:["showWeex2","showWeex","showH5","changeSize","close"],broadcast:["addEventListener","dispatchEvent","removeEventListener"],kvStorage:["setItem","getItem","removeItem","getAllKeys","clear","getCurrentInfo","getCurrentInfoAndKeys"],LifeCycle:["addPageLifeCycleListener","removePageLifeCycleListener"],Container:["interceptPageClose","disableInterceptPageClose"],navigator:["openURL","close","replace","setSystemBackBlockListener","removeSystemBackBlockListener"],NavBar:["setTitle"],Router:["popPage"]};function isMegaApiSupported(ability,api){return typeof ability=="string"&&typeof api=="string"&&MEGA_SUPPORTED_APIS[ability]?.includes(api)===!0}function megaParams(value){return value&&typeof value=="object"&&!Array.isArray(value)?value:{}}function megaError(callback,statusCode,message){emitMegaCallback(callback,{statusCode,type:"result",data:{errorMessage:typeof message=="string"?message:String(message??"")}})}function cloneMegaDetail(value){if(value===void 0)return{success:!0,value:void 0};try{return{success:!0,value:JSON.parse(JSON.stringify(value))}}catch{return{success:!1}}}function megaSuccess(data={}){return{statusCode:0,type:"result",data}}function megaFailure(message){return{statusCode:500,type:"result",data:{errorMessage:message}}}function megaKVParams(params){return{bizId:typeof params.bizID=="string"?params.bizID:typeof params.bizId=="string"?params.bizId:"",key:typeof params.key=="string"?params.key:"",value:typeof params.value=="string"?params.value:null}}function megaStringByteLength(value){try{return typeof TextEncoder=="function"?new TextEncoder().encode(value).length:value.length}catch{return value.length}}function megaKVUsedSize(entries){let size=0;for(let value of entries.values())size+=megaStringByteLength(value);return size}function reportMegaKVMutation(operation,bizId,key="",value,onSuccess,onFailure){requestContainerData("megaKVMutation",{operation,bizId,key,...value===void 0?{}:{value}},()=>onSuccess?.(),reason=>{log2("KVStorage 容器同步失败:",reason),onFailure?.(reason)})}function completeMegaKVMutation(operation,bizId,key,value,synchronous,callback){let result=megaSuccess();return reportMegaKVMutation(operation,bizId,key,value,synchronous?void 0:()=>emitMegaCallback(callback,result),synchronous?void 0:reason=>emitMegaCallback(callback,megaFailure(String(reason??"container sync failed")))),synchronous?result:null}function executeMegaKVStorage(api,params,synchronous,callback){let{bizId,key,value}=megaKVParams(params);if(!bizId)return megaFailure("missing bizID");let entries=megaKVStorage.get(bizId)??new Map;if(api==="setItem"){if(!key)return megaFailure("missing key");if(value===null||value==="")return megaFailure("missing value");let previousSize=megaStringByteLength(entries.get(key)??"");return megaKVUsedSize(entries)-previousSize+megaStringByteLength(value)>MEGA_KV_TOTAL_SIZE?megaFailure("KVStorage quota exceeded"):(entries.set(key,value),megaKVStorage.set(bizId,entries),megaKVMutationVersion+=1,persistMegaKVStorage(),completeMegaKVMutation("set",bizId,key,value,synchronous,callback))}if(api==="getItem"){if(!key)return megaFailure("missing key");let result=entries.get(key)??"";return megaSuccess(synchronous?{result}:result)}if(api==="removeItem")return key?(entries.delete(key),entries.size===0&&megaKVStorage.delete(bizId),megaKVMutationVersion+=1,persistMegaKVStorage(),completeMegaKVMutation("remove",bizId,key,void 0,synchronous,callback)):megaFailure("missing key");if(api==="getAllKeys"){let result=Array.from(entries.keys());return megaSuccess(synchronous?{result}:result)}if(api==="clear")return megaKVStorage.delete(bizId),megaKVMutationVersion+=1,persistMegaKVStorage(),completeMegaKVMutation("clear",bizId,"",void 0,synchronous,callback);if(api==="getCurrentInfo"||api==="getCurrentInfoAndKeys"){let data={totalSize:MEGA_KV_TOTAL_SIZE,freeSize:Math.max(MEGA_KV_TOTAL_SIZE-megaKVUsedSize(entries),0)};return api==="getCurrentInfoAndKeys"&&(data.keys=Array.from(entries.keys())),megaSuccess(data)}return{statusCode:405,type:"result",data:{}}}function handleMegaLifeCycle(api,callback){if(api==="addPageLifeCycleListener"){callback&&megaLifeCycleListeners.add(callback),emitMegaCallback(callback,megaSuccess());return}if(api==="removePageLifeCycleListener"){let listeners=Array.from(megaLifeCycleListeners);megaLifeCycleListeners.clear(),emitMegaCallback(callback,megaSuccess());for(let listener of listeners)emitMegaCallback(listener,{statusCode:99,type:"finish",data:{}});return}megaError(callback,405,`LifeCycle.${api} is not supported`)}function handleMegaContainer(api,callback){if(api==="interceptPageClose"){callback&&megaPageCloseListeners.add(callback),emitMegaCallback(callback,megaSuccess());return}if(api==="disableInterceptPageClose"){let listeners=Array.from(megaPageCloseListeners);megaPageCloseListeners.clear(),emitMegaCallback(callback,megaSuccess());for(let listener of listeners)emitMegaCallback(listener,{statusCode:99,type:"finish",data:{}});return}megaError(callback,405,`Container.${api} is not supported`)}function megaNavigationUrl(params){let rawUrl=pickUrl(params);if(!rawUrl)return null;if(!params.extQuery||typeof params.extQuery!="object"||Array.isArray(params.extQuery))return rawUrl;try{let target=new URL(rawUrl,location.href);for(let[key,value]of Object.entries(params.extQuery))value!=null&&target.searchParams.set(key,String(value));return target.href}catch{return rawUrl}}function handleMegaNavigator(api,params,callback){if(api==="openURL"||api==="replace"){let url2=megaNavigationUrl(params);if(!url2){megaError(callback,500,"missing url");return}let callbackId=api==="openURL"&&callback?stashCallback(value=>{let backdata=value&&typeof value=="object"?value.backdata:void 0;emitMegaCallback(callback,{statusCode:1,type:"onResult",data:{result:!0,...backdata===void 0?{}:{data:backdata}}}),emitMegaCallback(callback,{statusCode:99,type:"finish",data:{}})}):0;requestOpen(url2,callbackId,!1,{...params,...api==="replace"?{__mearlReplace:!0}:{}}),emitMegaCallback(callback,megaSuccess());return}if(api==="close"){emitMegaCallback(callback,megaSuccess()),requestClose(void 0);return}if(api==="setSystemBackBlockListener"){megaSystemBackListener&&megaSystemBackListener!==callback&&emitMegaCallback(megaSystemBackListener,{statusCode:99,type:"finish",data:{}}),megaSystemBackListener=callback??null,emitMegaCallback(callback,megaSuccess());return}if(api==="removeSystemBackBlockListener"){let listener=megaSystemBackListener;megaSystemBackListener=null,emitMegaCallback(callback,megaSuccess()),listener&&emitMegaCallback(listener,{statusCode:99,type:"finish",data:{}});return}megaError(callback,405,`navigator.${api} is not supported`)}function handleMegaNavBar(api,params,callback){if(api!=="setTitle"){megaError(callback,405,`NavBar.${api} is not supported`);return}applyNavigationBarState(api,params),emitMegaCallback(callback,megaSuccess())}function handleMegaRouter(api,callback){if(api!=="popPage"){megaError(callback,405,`Router.${api} is not supported`);return}emitMegaCallback(callback,megaSuccess()),requestClose(void 0)}function handleMegaStdPop(api,params,callback){if(api==="showH5"||api==="showWeex2"||api==="showWeex"){let url2=pickUrl(params),popId=typeof params.popId=="string"?params.popId.trim():"";if(!url2||!popId){megaError(callback,500,url2?"missing popId":"missing url");return}let callbackId=stashCallback(value=>{let result=value&&typeof value=="object"&&"backdata"in value?value.backdata:void 0;emitMegaCallback(callback,{statusCode:1,type:"onClose",data:result}),emitMegaCallback(callback,{statusCode:99,type:"finish"})});requestOpen(url2,callbackId,!0,{...params,__mearlMegaPopId:popId}),emitMegaCallback(callback,{statusCode:0,type:"result",data:{}});return}if(api==="close"){let popId=typeof params.popId=="string"?params.popId.trim():"";if(!popId){megaError(callback,500,"missing popId");return}let cloned=cloneMegaDetail(params.result);if(!cloned.success){megaError(callback,500,"result is not serializable");return}requestContainerData("megaPopClose",{popId,result:cloned.value},()=>emitMegaCallback(callback,{statusCode:0,type:"result",data:{}}),reason=>megaError(callback,500,reason));return}if(api==="changeSize"){let popId=typeof params.popId=="string"?params.popId.trim():"";if(!popId){megaError(callback,500,"missing popId");return}requestContainerData("megaPopResize",{...params,popId},()=>emitMegaCallback(callback,{statusCode:0,type:"result",data:{}}),reason=>megaError(callback,500,reason));return}megaError(callback,405,`stdPop.${api} is not supported`)}function handleMegaBroadcast(api,params,callback){let bizId=megaBroadcastBizId(params.bizId),eventName=typeof params.eventName=="string"?params.eventName.trim():"";if(!eventName){megaError(callback,500,"missing eventName");return}if(api==="addEventListener"){if(!callback)return;let id=`mearl-mega-listener-${++megaListenerSeq}`;megaBroadcastListeners.set(id,{id,bizId,eventName,once:params.once===!0,callback}),emitMegaCallback(callback,{statusCode:0,type:"result",data:{}}),emitMegaCallback(callback,{statusCode:1,type:"onAdd",data:{listenerId:id}});return}if(api==="dispatchEvent"){let detail=cloneMegaDetail(params.detail);if(!detail.success){megaError(callback,500,"detail is not serializable");return}requestContainerData("megaBroadcast",{message:{kind:"megaBroadcast",bizId,eventName,detail:detail.value}},()=>emitMegaCallback(callback,{statusCode:0,type:"result",data:{}}),reason=>megaError(callback,500,reason));return}if(api==="removeEventListener"){let listenerId=typeof params.listenerId=="string"?params.listenerId:"",removed=[];for(let listener of Array.from(megaBroadcastListeners.values()))listener.bizId!==bizId||listener.eventName!==eventName||listenerId&&listener.id!==listenerId||(megaBroadcastListeners.delete(listener.id),removed.push(listener));emitMegaCallback(callback,{statusCode:0,type:"result",data:{}});for(let listener of removed)emitMegaCallback(listener.callback,{statusCode:99,type:"finish"});return}megaError(callback,405,`broadcast.${api} is not supported`)}function makeMegaBridge(){return{asyncCall:(ability,api,rawParams,callback)=>{let params=megaParams(rawParams);if(ability==="ability"&&api==="available"){emitMegaCallback(callback,{statusCode:0,type:isMegaApiSupported(params.ability,params.api)?"YES":"NO",data:{}});return}if(ability==="ability"&&api==="batchFinishTrace"){emitMegaCallback(callback,{statusCode:0,type:"result",data:{}});return}if(!isMegaApiSupported(ability,api)){megaError(callback,405,`${ability}.${api} is not supported`);return}if(ability==="stdPop")handleMegaStdPop(api,params,callback);else if(ability==="broadcast")handleMegaBroadcast(api,params,callback);else if(ability==="kvStorage"){let result=executeMegaKVStorage(api,params,!1,callback);result&&emitMegaCallback(callback,result)}else ability==="LifeCycle"?handleMegaLifeCycle(api,callback):ability==="Container"?handleMegaContainer(api,callback):ability==="navigator"?handleMegaNavigator(api,params,callback):ability==="NavBar"?handleMegaNavBar(api,params,callback):handleMegaRouter(api,callback)},syncCall:(ability,api,rawParams)=>{let params=megaParams(rawParams);return ability==="ability"&&api==="available"?{statusCode:0,type:isMegaApiSupported(params.ability,params.api)?"YES":"NO",data:{}}:ability==="kvStorage"&&isMegaApiSupported(ability,api)?executeMegaKVStorage(api,params,!0)??megaFailure("container sync pending"):{statusCode:405,type:"result",data:{}}}}}function makeBridge(style){if(style==="mega")return makeMegaBridge();if(style==="easybikeNative"){let callNative=rawPayload=>{let payload;try{payload=typeof rawPayload=="string"?JSON.parse(rawPayload):rawPayload??{}}catch{return}let classMap=typeof payload.classMap=="string"?payload.classMap:"",method=typeof payload.method=="string"?payload.method:"",callbackId=typeof payload.callbackId=="string"||typeof payload.callbackId=="number"?String(payload.callbackId):"",params;try{params=typeof payload.params=="string"?payload.params?JSON.parse(payload.params):{}:payload.params??{}}catch{params={}}let complete=(code,data,msg="")=>{let callback=resolveWindowFunction("callBack");callbackId&&callback&&callback({callbackId,code,data,msg})};dispatch(`${classMap}.${method}`,params,value=>complete(0,value),error48=>complete(1,void 0,typeof error48=="string"?error48:String(error48??"")))};return{postMessage:callNative,callNative}}if(style==="windvane"){let call=(api,params,success2,failure)=>{let onSuccess=typeof success2=="function"?success2:void 0,onFailure=typeof failure=="function"?failure:void 0;if(onSuccess||onFailure){dispatch(api,params,onSuccess,onFailure);return}return new Promise((resolve11,reject)=>dispatch(api,params,resolve11,reject))};return{isAvailable:!0,version:"8.7.0",call2:call,call:(cls,method,params,succ,fail2)=>call(`${cls}.${method}`,params,succ,fail2)}}if(style==="fliggy"||style==="alipay"||style==="callback"){let bridge={call:(api,params,succ,fail2)=>{typeof params=="function"&&(fail2=succ,succ=params,params=void 0);let p=params&&typeof params=="object"?params:{},successFn=succ??(typeof p.success_callback=="function"?p.success_callback:void 0)??(typeof p.successCallback=="function"?p.successCallback:void 0),failureFn=fail2??(typeof p.fail_callback=="function"?p.fail_callback:void 0)??(typeof p.failure_callback=="function"?p.failure_callback:void 0)??(typeof p.failCallback=="function"?p.failCallback:void 0)??(typeof p.failureCallback=="function"?p.failureCallback:void 0);dispatch(api,p,res=>successFn?.(res),err=>{failureFn?failureFn(err):successFn?.({error:err})},p.callbackCommand??p.callback_command)},pushBack:(prefixOrApi,apiOrParams,paramsOrSucc,succ)=>{let api=prefixOrApi,params=apiOrParams,success2=paramsOrSucc;typeof apiOrParams=="string"&&(api=apiOrParams,params=paramsOrSucc,success2=succ);let p=params??{},successFn=(typeof success2=="function"?success2:void 0)??(typeof p.successCallback=="function"?p.successCallback:void 0);return dispatch(api,p,res=>successFn?.(res),void 0,p.callbackCommand??p.callback_command),bridge},sendUriScheme:uri=>(handleMaybeScheme(uri),bridge)};if(style==="fliggy"){let normalizedAppName=(config2.globals.__APP_NAME__??"").toUpperCase(),os13=config2.clientType==="iphone"?"ios":"android",isAliApp=name=>normalizedAppName===name.toUpperCase();Object.assign(bridge,{version:"1.0.21",device:{os:os13,OS:config2.platform,type:os13,version:config2.systemVersion,model:config2.globals.__DEVICE_MODEL__??""},platform:os13,isAliApp,isTmall:isAliApp("TM"),isTaobao:isAliApp("TB"),isAlipay:isAliApp("AP"),isAlitrip:isAliApp("LX"),isKoubei:isAliApp("KB"),isElm:isAliApp("ELMC"),isGaode:isAliApp("amap"),isUC:/UCBrowser/i.test(config2.userAgent),isWeibo:/Weibo/i.test(config2.userAgent),isWeixin:/MicroMessenger/i.test(config2.userAgent),isWindVane:config2.bridges.some(item=>item.style==="windvane"),isAlipayClient:/AlipayClient/i.test(config2.userAgent)})}return bridge}if(style==="btrip")return{call:(api,params)=>dispatch(api,params??{},void 0,void 0)};if(style==="invoke")return{invoke:(api,params)=>{let p=params??{};dispatch(api,p,p.success,p.fail)}};if(style==="callHandler")return{callHandler:(api,params)=>dispatch(api,params??{},void 0,void 0)};if(style==="amap")return{ready:cb=>cb?.(),send:(msg,cb)=>{let m=msg??{};dispatch(typeof m.action=="string"?m.action:"",m,res=>cb?.(res),err=>cb?.({error:err}))}};if(style==="didi")return{openPage:params=>dispatch("openPage",params??{},void 0,void 0),closePage:params=>dispatch("closePage",params??{},void 0,void 0)};if(style==="wechat"||style==="wechatMiniProgram"){let invoke3=(api,params)=>{let p=params&&typeof params=="object"?params:{};dispatch(api,p,value=>{p.success?.(value),p.complete?.(value)},error48=>{p.fail?.(error48),p.complete?.(error48)})};return style==="wechat"?{ready:callback=>{callback&&setTimeout(callback,0)},getLocation:params=>invoke3("getLocation",params)}:{navigateTo:params=>invoke3("navigateTo",params),redirectTo:params=>invoke3("redirectTo",params),switchTab:params=>invoke3("switchTab",params),reLaunch:params=>invoke3("reLaunch",params),navigateBack:params=>invoke3("navigateBack",params),postMessage:params=>invoke3("postMessage",params),getEnv:callback=>{callback&&setTimeout(()=>callback({miniprogram:!0}),0)}}}return{}}function setGlobal(path27,value){let parts=path27.split("."),obj=w;for(let i=0;i<parts.length-1;i++){let cur=obj[parts[i]];(!cur||typeof cur!="object")&&(obj[parts[i]]={}),obj=obj[parts[i]]}obj[parts[parts.length-1]]=value}function setPersistentGlobal(path27,value){let parts=path27.split(".").filter(Boolean);if(parts.length<2){setGlobal(path27,value);return}let[rootKey,...nestedParts]=parts,isObjectLike=candidate=>typeof candidate=="object"&&candidate!==null||typeof candidate=="function",attachBridge=candidate=>{let root=isObjectLike(candidate)?candidate:{},obj=root;for(let index=0;index<nestedParts.length-1;index+=1){let key=nestedParts[index],child=obj[key];if(!isObjectLike(child))try{obj[key]={}}catch{return root}obj=obj[key]}let leaf=nestedParts[nestedParts.length-1];try{Object.defineProperty(obj,leaf,{configurable:!1,enumerable:!0,get:()=>value,set:()=>{}})}catch{try{obj[leaf]=value}catch{}}return root},currentRoot=attachBridge(w[rootKey]);try{Object.defineProperty(w,rootKey,{configurable:!1,enumerable:!0,get:()=>currentRoot,set:next=>{currentRoot=attachBridge(next)}})}catch{w[rootKey]=currentRoot}}if(config2.bridges.some(spec=>spec.style==="mega")){let hydrationVersion=megaKVMutationVersion;requestContainerData("megaKVSnapshot",{},value=>{let entries=value&&typeof value=="object"?value.entries:void 0;megaKVMutationVersion===hydrationVersion&&replaceMegaKVStorage(entries)},()=>{})}for(let spec of config2.bridges)try{let bridge=makeBridge(spec.style);spec.persistent?setPersistentGlobal(spec.global,bridge):setGlobal(spec.global,bridge)}catch(e){console.error(TAG,"桥安装失败:",spec.global,e)}return{mapScheme,handleMaybeScheme,handleAppMessage,handleNativeBack,handleResume,handlePageVisibility,applyRuntimeResponses}}function installAppProfileContainerStack(config2,environment,links){let{SRC,TAG,simulateSystemBars,ROOT_FRAME_NAME,LAYER_FRAME_NAME,isTop,isRootFrame,isLayerFrame,isContainerFrame,usesRootContainer,log:log2}=environment,{pageTransport}=links,initialLayerTitleBarState=url2=>links.getSystemBars().initialLayerTitleBarState(url2),resolvedTitleBarState=layer=>links.getSystemBars().resolvedTitleBarState(layer),parseReportedTitleBarState=value=>links.getSystemBars().parseReportedTitleBarState(value),createSimulatedNavigationBarView=(placement,onBack)=>links.getSystemBars().createNavigationBarView(placement,onBack),destroySimulatedNavigationBarView=view=>links.getSystemBars().destroyNavigationBarView(view),syncLayerViewport=(layer,state)=>links.getSystemBars().syncLayerViewport(layer,state),syncActiveSystemBars=()=>links.getSystemBars().syncActiveSystemBars(),syncSimulatedTitleBar=()=>links.getSystemBars().syncSimulatedTitleBar(),rootContainerActive=!1,rootOverlayActive=!1,rootFrame=null,rootBusinessUrl=location.href,splitScreenActive=usesRootContainer&&config2.rootContainer?.splitScreen===!0,webViewEnvironmentRequestSeq=0,simulatedPageHidden=!1,runtimeResponses=null;function syncSimulatorStateToWindow(target){target&&(target.postMessage({source:SRC,type:"requestTitleBarState"},"*"),runtimeResponses&&target.postMessage({source:SRC,type:"runtimeResponses",profile:config2.profile,responses:runtimeResponses},"*"),simulatedPageHidden&&target.postMessage({source:SRC,type:"simulatorVisibility",hidden:!0},"*"))}function startPreparedWebViewNavigation(frame,target,canCommit,registerCleanup){let insets=config2.safeAreaInsets??{top:config2.statusBarHeight,right:0,bottom:0,left:0};if(!usesRootContainer||!Object.values(insets).some(value=>value>0)){canCommit()&&(frame.src=target);return}let requestId=++webViewEnvironmentRequestSeq,startedAt=Date.now(),settled=!1,fallbackTimer=0,cleanup=()=>{settled||(settled=!0,clearTimeout(fallbackTimer),window.removeEventListener("message",handleResponse),registerCleanup?.(null))},commitNavigation=fallbackReason=>{cleanup(),fallbackReason&&console.warn(TAG,"WebView 环境准备未完成,降级提交导航",JSON.stringify({reason:fallbackReason,elapsedMs:Date.now()-startedAt,requestId,target})),canCommit()&&(frame.src=target)},handleResponse=event=>{if(event.source!==window||event.data?.source!=="mearl-content"||event.data?.type!=="APP_BRIDGE_PREPARE_WEBVIEW_RESPONSE"||event.data?.requestId!==requestId)return;let result=event.data.result;result?.success===!0?commitNavigation():commitNavigation(String(result?.error??"unknown preparation failure"))};registerCleanup?.(cleanup),window.addEventListener("message",handleResponse),fallbackTimer=setTimeout(()=>commitNavigation("preparation timed out after 500ms"),500);try{window.postMessage({source:SRC,type:"prepareWebView",requestId},"*")}catch(error48){commitNavigation(error48 instanceof Error?error48.message:String(error48))}}function installRootContainer(){if(!usesRootContainer||!/^https?:$/i.test(location.protocol)||!/^(text\/html|application\/xhtml\+xml)$/i.test(document.contentType))return;let shellRoot,frame;try{let rootOverlay=splitScreenActive?null:resolveOverlayPresentation(rootBusinessUrl,void 0,!1);rootOverlayActive=rootOverlay!==null;for(let cookie of config2.rootContainer?.initialCookies??[]){if(!cookie.name)continue;let parts=[`${encodeURIComponent(cookie.name)}=${encodeURIComponent(cookie.value)}`,`Path=${cookie.path??"/"}`];cookie.domain&&parts.push(`Domain=${cookie.domain}`),document.cookie=parts.join("; ")}shellRoot=document.createElement("html");let shellHead=document.createElement("head"),charset=document.createElement("meta"),viewport=document.createElement("meta"),title=document.createElement("title"),shellBody=document.createElement("body");if(frame=document.createElement("iframe"),shellRoot.setAttribute("data-mearl-app-shell",""),shellBody.setAttribute("data-mearl-app-shell",""),charset.setAttribute("charset","utf-8"),viewport.name="viewport",viewport.content="width=device-width,initial-scale=1,viewport-fit=cover",shellHead.append(charset,viewport,title),shellRoot.append(shellHead,shellBody),shellRoot.style.cssText="width:100%;height:100%;margin:0;overflow:hidden;background:#fff;",shellBody.style.cssText="width:100%;height:100%;margin:0;overflow:hidden;background:#fff;",frame.name=ROOT_FRAME_NAME,frame.setAttribute("data-mearl-root-webview",config2.profile),frame.setAttribute("allow","microphone; on-device-speech-recognition"),splitScreenActive&&frame.setAttribute("data-mearl-split-pane","left"),frame.style.cssText=rootOverlay?"position:absolute;inset:0;width:100%;height:100%;border:0;display:block;background:#fff;z-index:0;opacity:1;":splitScreenActive?"position:fixed;left:0;right:auto;top:0;bottom:0;width:50%;height:100%;border:0;border-right:1px solid rgba(15,23,42,.14);box-sizing:border-box;display:block;background:#fff;z-index:0;opacity:1;":"position:fixed;left:0;right:0;top:0;bottom:0;width:100%;height:100%;border:0;display:block;background:#fff;z-index:0;opacity:1;",frame.addEventListener("load",()=>{let committedSrc=frame.getAttribute("src");!committedSrc||committedSrc==="about:blank"||(syncSimulatorStateToWindow(frame.contentWindow),requestAnimationFrame(()=>{rootFrame!==frame||!frame.isConnected||(frame.setAttribute("data-mearl-webview-ready",""),syncSimulatedTitleBar())}))}),rootOverlay){let overlayRoot=document.createElement("div"),mask=document.createElement("div"),sheet=document.createElement("div"),width=rootOverlay.widthRatio*100,left=(1-rootOverlay.widthRatio)/2*100;overlayRoot.setAttribute("data-mearl-root-overlay",config2.profile),mask.setAttribute("data-mearl-root-overlay-mask",""),sheet.setAttribute("data-mearl-root-overlay-sheet",""),overlayRoot.style.cssText="position:fixed;inset:0;z-index:0;pointer-events:none;",mask.style.cssText=`position:absolute;inset:0;background:rgba(0,0,0,${rootOverlay.maskAlpha});pointer-events:auto;`,sheet.style.cssText=`position:absolute;left:${left}%;right:auto;bottom:0;width:${width}%;height:${(1-rootOverlay.topRatio)*100}%;background:#fff;border-radius:${rootOverlay.radius}px ${rootOverlay.radius}px 0 0;overflow:hidden;pointer-events:auto;`,syncOverlayWidth(sheet,rootOverlay.widthRatio),rootOverlay.tapClose&&mask.addEventListener("click",()=>requestCloseOnTop(void 0)),sheet.appendChild(frame),overlayRoot.append(mask,sheet),shellBody.appendChild(overlayRoot)}else shellBody.appendChild(frame);let currentRoot=document.documentElement;currentRoot?document.replaceChild(shellRoot,currentRoot):document.appendChild(shellRoot)}catch(error48){console.warn(TAG,"根 WebView 容器创建失败,保留当前页面",error48),rootFrame=null;return}rootFrame=frame,rootContainerActive=!0;try{typeof window.stop=="function"&&window.stop()}catch(error48){console.warn(TAG,"停止外层文档加载失败,继续启动根 WebView",error48)}let initialRootUrl=window.__mearlRootDocumentUrl__?.(rootBusinessUrl)??rootBusinessUrl;try{startPreparedWebViewNavigation(frame,initialRootUrl,()=>rootFrame===frame&&frame.isConnected)}catch(error48){console.warn(TAG,"根 WebView 环境准备启动失败,直接提交业务导航",error48),rootFrame===frame&&frame.isConnected&&(frame.src=initialRootUrl)}}installRootContainer();function normalizeProxyPathPrefix(prefix){let withLeadingSlash=prefix.startsWith("/")?prefix:`/${prefix}`;return withLeadingSlash.endsWith("/")?withLeadingSlash:`${withLeadingSlash}/`}function matchesProxyTarget(hostname3,suffixes){return suffixes.some(suffix=>hostname3===suffix||hostname3.endsWith(`.${suffix}`))}function mapLayerFrameUrl(url2){let proxy=config2.layerUrlProxy;if(!proxy||!location.hostname.startsWith(proxy.sourceHostPrefix))return url2;try{let target=new URL(url2,location.href);if(!/^https?:$/.test(target.protocol))return url2;let prefix=normalizeProxyPathPrefix(proxy.pathPrefix);if(target.hostname===location.hostname){if(target.pathname.startsWith(prefix))return url2;let derivedHost=location.pathname.startsWith(prefix)?location.pathname.slice(prefix.length).split("/")[0]:proxy.defaultTargetHost;return!derivedHost||!matchesProxyTarget(derivedHost,proxy.targetHostSuffixes)?url2:`${location.origin}${prefix}${derivedHost}${target.pathname}${target.search}${target.hash}`}return matchesProxyTarget(target.hostname,proxy.targetHostSuffixes)?`${location.origin}${prefix}${target.host}${target.pathname}${target.search}${target.hash}`:url2}catch{return url2}}function restoreLayerBusinessUrl(url2){let proxy=config2.layerUrlProxy;if(!proxy)return url2;try{let current=new URL(url2,location.href),prefix=normalizeProxyPathPrefix(proxy.pathPrefix);if(current.origin!==location.origin||!current.pathname.startsWith(prefix))return url2;let rest=current.pathname.slice(prefix.length),slash=rest.indexOf("/"),host=slash===-1?rest:rest.slice(0,slash);if(!host)return url2;let hostname3=new URL(`${current.protocol}//${host}`).hostname;if(!matchesProxyTarget(hostname3,proxy.targetHostSuffixes))return url2;let pathname=slash===-1?"/":rest.slice(slash);return`${current.protocol}//${host}${pathname}${current.search}${current.hash}`}catch{return url2}}let ANIM_MS=config2.animationMs??300;function overlayMaxWidth(){let{maxWidthPx,maxWidthMinAppVersion}=config2.overlay??{};if(!(!maxWidthPx||!Number.isFinite(maxWidthPx)||maxWidthPx<=0)){if(maxWidthMinAppVersion){let version3=config2.globals.__APP_VERSION__??"";if(!/^\d+(?:\.\d+)*$/.test(version3))return;let current=version3.split(".").map(Number),minimum=maxWidthMinAppVersion.split(".").map(Number);for(let index=0;index<Math.max(current.length,minimum.length);index+=1){let difference=(current[index]??0)-(minimum[index]??0);if(difference<0)return;if(difference>0)break}}return maxWidthPx}}function syncOverlayWidth(sheet,widthRatio){let maximum=overlayMaxWidth();sheet.style.width=`${widthRatio*100}%`,sheet.style.left=maximum?"0":`${(1-widthRatio)/2*100}%`,sheet.style.right=maximum?"0":"auto",maximum&&(sheet.style.maxWidth=`${maximum}px`,sheet.style.marginLeft="auto",sheet.style.marginRight="auto")}function boolParam(value,fallback){return value===!0||value===1||value==="1"||value==="true"?!0:value===!1||value===0||value==="0"||value==="false"?!1:value===""?!0:fallback}function numberParam(value,fallback,min,max){let parsed=typeof value=="number"?value:Number(value);return Number.isFinite(parsed)?Math.min(Math.max(parsed,min),max):fallback}function resolveOverlayPresentation(url2,params,explicitWebdialog){let query=null;try{query=new URL(url2,location.href).searchParams}catch{}let records=[],addRecord=value=>{value&&typeof value=="object"&&!Array.isArray(value)&&records.push(value)};addRecord(params?.pageParams),addRecord(params?.page_params),addRecord(params?.popConfig),addRecord(params?.data),addRecord(params?.param),addRecord(params);let read=key=>{for(let record4 of records)if(Object.prototype.hasOwnProperty.call(record4,key))return record4[key];return query?.has(key)?query.get(key):void 0},protocol=config2.overlay;if(!explicitWebdialog&&(!protocol||!boolParam(read(protocol.enabledParam),!1)))return null;let configuredTopRatio=protocol?read(protocol.topRatioParam):void 0,configuredHeightRatio=protocol?.heightRatioParam?read(protocol.heightRatioParam):void 0,configuredMaxHeight=read("maxHeight")??configuredHeightRatio,defaultTopRatio=protocol?.defaultTopRatio??.2;return{topRatio:configuredTopRatio!==void 0?numberParam(configuredTopRatio,defaultTopRatio,0,1):configuredMaxHeight!==void 0?1-numberParam(configuredMaxHeight,1-defaultTopRatio,0,1):defaultTopRatio,widthRatio:numberParam(read("maxWidth"),1,0,1),radius:numberParam((protocol?read(protocol.radiusParam):void 0)??read("cornerRadius"),protocol?.defaultRadius??0,0,50),maskAlpha:numberParam(protocol?read(protocol.maskAlphaParam):void 0,protocol?.defaultMaskAlpha??.3,0,1),tapClose:boolParam((protocol?read(protocol.tapCloseParam):void 0)??read("tapEnable"),protocol?.defaultTapClose??!0)}}function requestsPopBeforeOpen(url2,params){if(params?.__mearlReplace===!0)return!0;let key=config2.popBeforeOpenParam;if(!key)return!1;let records=[params?.pageParams,params?.page_params,params?.data,params?.param,params];for(let value of records){if(!value||typeof value!="object"||Array.isArray(value))continue;let record4=value;if(Object.prototype.hasOwnProperty.call(record4,key))return boolParam(record4[key],!1)}try{let query=new URL(url2,location.href).searchParams;return query.has(key)&&boolParam(query.get(key),!1)}catch{return!1}}let layers=[],forwardStack=[],layerSeq=0,enteringLayerCount=0,closingLayerCount=0,explicitLayerTitleBarStates=new Map,rootScrollStyles=null,pendingClose=null,nativeBackRequestSeq=0,pendingNativeBack=null,containerDataRequestSeq=0,containerDataCallbacks=new Map,sharedFiles=new Map,sharedData=new Map,legacyBroadcastChannels=new Set,MEGA_KV_STORAGE_KEY=`__mearl_mega_kv__:${config2.profile}`;function readMegaKVStorage(){let storage=new Map;try{let parsed=JSON.parse(localStorage.getItem(MEGA_KV_STORAGE_KEY)??"{}");if(!parsed||typeof parsed!="object"||Array.isArray(parsed))return storage;for(let[bizId,rawEntries]of Object.entries(parsed)){if(!rawEntries||typeof rawEntries!="object"||Array.isArray(rawEntries))continue;let entries=new Map;for(let[key,value]of Object.entries(rawEntries))typeof value=="string"&&entries.set(key,value);storage.set(bizId,entries)}}catch{}return storage}let megaKVStorage=readMegaKVStorage();function megaKVSnapshot(){let snapshot={};for(let[bizId,values]of megaKVStorage)snapshot[bizId]=Object.fromEntries(values);return snapshot}function persistMegaKVStorage(){try{localStorage.setItem(MEGA_KV_STORAGE_KEY,JSON.stringify(megaKVSnapshot()))}catch{}}let PENDING_CLOSE_TIMEOUT_MS=400,pendingHistoryDepth=null,pendingSplitRootOpen=null;function clearPendingClose(){pendingClose&&(clearTimeout(pendingClose.timer),pendingClose=null)}function clearPendingNativeBack(){pendingNativeBack&&(clearTimeout(pendingNativeBack.timer),pendingNativeBack=null)}function clearPendingHistoryDepth(){pendingHistoryDepth&&(clearTimeout(pendingHistoryDepth.timer),pendingHistoryDepth=null)}function syncHistoryAfterDirectClose(){clearPendingHistoryDepth();let depth=layers.length,timer=setTimeout(()=>{pendingHistoryDepth=null,console.warn(TAG,"WebView 已出栈,但浏览器历史未在预期时间内同步",{depth})},PENDING_CLOSE_TIMEOUT_MS);pendingHistoryDepth={depth,timer},history.back()}function armPendingClose(data,retries){clearPendingClose();let timer=setTimeout(()=>{pendingClose=null,log2("close 未等到 popstate,直接关栈顶兜底"),closeToDepth(Math.max(layers.length-1,0),data,!0)},PENDING_CLOSE_TIMEOUT_MS);pendingClose={data,retries,timer},history.back()}function parseStorageId(url2){try{return new URL(url2,location.href).searchParams.get("__storage_id")}catch{return null}}function titleBarStateCacheKey(url2){try{let parsed=new URL(url2,location.href);return parsed.hash="",parsed.href}catch{return url2}}function cacheExplicitTitleBarState(layer,state){explicitLayerTitleBarStates.set(titleBarStateCacheKey(layer.entryUrl),state),explicitLayerTitleBarStates.set(titleBarStateCacheKey(layer.url),state)}function readDepth(state){if(state&&typeof state=="object"){let d=state.__mearl_layer__;if(typeof d=="number")return d}return null}function mapUrlForSync(url2,allowHostBorrowing=!0){let suffixes=config2.urlSyncHostSuffixes??[];try{let u=new URL(url2,location.href);if(!/^https?:$/.test(u.protocol))return;if(u.origin===location.origin)return u.pathname+u.search+u.hash;if(!(suffixes.length===0||suffixes.some(s=>u.host===s||u.host.endsWith(`.${s}`))))return;let proxy=config2.layerUrlProxy;return proxy&&location.hostname.startsWith(proxy.sourceHostPrefix)&&matchesProxyTarget(u.hostname,proxy.targetHostSuffixes)?`${normalizeProxyPathPrefix(proxy.pathPrefix)}${u.host}${u.pathname}${u.search}${u.hash}`:allowHostBorrowing?u.pathname+u.search+u.hash:void 0}catch{return}}function createLayerEl(overlay,id){let el=document.createElement("div");el.setAttribute("data-mearl-layer",String(id)),splitScreenActive&&el.setAttribute("data-mearl-split-pane","right"),el.style.cssText=splitScreenActive?`position:fixed;left:50%;right:0;top:0;bottom:0;width:50%;z-index:${2147483e3+id%100*2};`:`position:fixed;inset:0;z-index:${2147483e3+id%100*2};`;let frame=document.createElement("iframe");if(frame.name=LAYER_FRAME_NAME,frame.setAttribute("allow","microphone; on-device-speech-recognition"),frame.setAttribute("sandbox","allow-scripts allow-same-origin allow-forms allow-modals allow-downloads allow-popups"),frame.style.cssText="position:absolute;inset:0;width:100%;height:100%;border:0;display:block;background:#fff;z-index:0;opacity:1;",overlay){el.style.pointerEvents="none";let mask=document.createElement("div");mask.style.cssText=`position:absolute;inset:0;background:rgba(0,0,0,${overlay.maskAlpha});opacity:0;pointer-events:auto;`;let sheet=document.createElement("div"),width=overlay.widthRatio*100,left=(1-overlay.widthRatio)/2*100;return sheet.style.cssText=`position:absolute;left:${left}%;right:auto;bottom:0;width:${width}%;height:${(1-overlay.topRatio)*100}%;background:#fff;border-radius:${overlay.radius}px ${overlay.radius}px 0 0;overflow:hidden;pointer-events:auto;`,syncOverlayWidth(sheet,overlay.widthRatio),sheet.appendChild(frame),el.appendChild(mask),el.appendChild(sheet),{el,frame,animEl:sheet,mask}}return el.style.background="#fff",el.appendChild(frame),{el,frame,animEl:el,mask:null}}function setLayerInteractive(layer,interactive){layer.frame.style.pointerEvents=interactive?"":"none",layer.titleBarView&&(layer.titleBarView.root.style.pointerEvents=interactive?"":"none"),interactive?(layer.frame.removeAttribute("inert"),layer.frame.removeAttribute("aria-hidden"),layer.frame.removeAttribute("tabindex")):(layer.frame.setAttribute("inert",""),layer.frame.setAttribute("aria-hidden","true"),layer.frame.setAttribute("tabindex","-1"),layer.frame.blur()),layer.overlay?(layer.el.style.pointerEvents="none",layer.animEl.style.pointerEvents=interactive?"auto":"none",layer.mask&&(layer.mask.style.pointerEvents=interactive?"auto":"none")):layer.el.style.pointerEvents=interactive?"":"none"}function setRootFrameInteractive(interactive){rootFrame&&(rootFrame.style.pointerEvents=interactive?"":"none",interactive?(rootFrame.removeAttribute("inert"),rootFrame.removeAttribute("aria-hidden"),rootFrame.removeAttribute("tabindex")):(rootFrame.setAttribute("inert",""),rootFrame.setAttribute("aria-hidden","true"),rootFrame.setAttribute("tabindex","-1"),rootFrame.blur()))}function blockClosingLayerInteractions(layer){setLayerInteractive(layer,!1),layer.el.style.pointerEvents="auto"}function syncRootScrollLock(locked){let body=document.body;if(locked&&!rootScrollStyles){rootScrollStyles={html:document.documentElement.style.overflow,body:body?.style.overflow??null},document.documentElement.style.overflow="hidden",body&&(body.style.overflow="hidden");return}!locked&&rootScrollStyles&&(document.documentElement.style.overflow=rootScrollStyles.html,body&&rootScrollStyles.body!==null&&(body.style.overflow=rootScrollStyles.body),rootScrollStyles=null)}function syncLayerInteractivity(){let activeLayer=closingLayerCount===0&&enteringLayerCount===0?layers[layers.length-1]:void 0;for(let layer of layers)setLayerInteractive(layer,layer===activeLayer),!activeLayer&&layer===layers[layers.length-1]&&(layer.el.style.pointerEvents="auto");setRootFrameInteractive(splitScreenActive?pendingSplitRootOpen===null:layers.length===0&&enteringLayerCount===0&&closingLayerCount===0),syncRootScrollLock(layers.length>0||enteringLayerCount>0||closingLayerCount>0)}function finishLayerEntry(layer){layer.entering&&(layer.entering=!1,layer.enterTimer!==null&&clearTimeout(layer.enterTimer),layer.enterTimer=null,layer.enterTransitionEnd&&(layer.animEl.removeEventListener("transitionend",layer.enterTransitionEnd),layer.enterTransitionEnd=null),enteringLayerCount=Math.max(enteringLayerCount-1,0),syncLayerInteractivity())}function animateIn(layer){let t=layer.animEl;if(t.style.transform=layer.overlay?"translateY(100%)":"translateX(100%)",t.offsetWidth,t.style.transition=`transform ${ANIM_MS}ms ease`,t.style.transform="translate(0px, 0px)",layer.mask&&(layer.mask.style.transition=`opacity ${ANIM_MS}ms ease`,layer.mask.style.opacity="1"),ANIM_MS<=0){finishLayerEntry(layer);return}layer.enterTransitionEnd=event=>{event.target===t&&event.propertyName==="transform"&&finishLayerEntry(layer)},t.addEventListener("transitionend",layer.enterTransitionEnd),layer.enterTimer=setTimeout(()=>finishLayerEntry(layer),ANIM_MS+60)}function animateOut(layer,done){let t=layer.animEl;if(ANIM_MS<=0){t.style.transform=layer.overlay?"translateY(100%)":"translateX(100%)",layer.mask&&(layer.mask.style.opacity="0"),setTimeout(done,0);return}let settled=!1,fallbackTimer=0,finish=()=>{settled||(settled=!0,t.removeEventListener("transitionend",onTransitionEnd),clearTimeout(fallbackTimer),done())},onTransitionEnd=event=>{event.target===t&&event.propertyName==="transform"&&finish()};t.addEventListener("transitionend",onTransitionEnd),t.style.transition=`transform ${ANIM_MS}ms ease`,t.style.transform=layer.overlay?"translateY(100%)":"translateX(100%)",layer.mask&&(layer.mask.style.opacity="0"),fallbackTimer=setTimeout(finish,ANIM_MS+60)}function startLayerNavigation(layer,target){startPreparedWebViewNavigation(layer.frame,target,()=>!layer.closing&&layer.el.isConnected,cleanup=>{layer.navigationPreparationCleanup=cleanup})}function setPageVisibility(target,hidden){if(target===window){links.getBridgeProtocol().handlePageVisibility(hidden);return}try{target.postMessage({source:SRC,type:"simulatorVisibility",hidden},"*")}catch{}}function openLayer(url2,callbackId,overlay,openerWin,pushHistory,popId=null,animateEntry=!0){clearPendingClose();let target=url2;if(!/^https?:/i.test(target)){let mapped=links.getBridgeProtocol().mapScheme(target);if(!mapped)return log2("open 失败,scheme 未映射:",url2),null;target=mapped}location.protocol==="https:"&&target.startsWith("http:")&&(target="https:"+target.slice(5));let presentation=overlay??resolveOverlayPresentation(target,void 0,!1);log2("open →",presentation?"(webdialog) ":"",target);let parts=createLayerEl(presentation,++layerSeq),restoredTitleBarState=explicitLayerTitleBarStates.get(titleBarStateCacheKey(target)),layer={id:layerSeq,win:parts.frame.contentWindow,frame:parts.frame,entryUrl:target,url:target,overlay:presentation,openerWin,callbackId,storageId:parseStorageId(target),popId,el:parts.el,animEl:parts.animEl,mask:parts.mask,entering:animateEntry,enterTimer:null,enterTransitionEnd:null,closing:!1,navigationPreparationCleanup:null,titleBarState:restoredTitleBarState??initialLayerTitleBarState(target),titleBarStateExplicit:restoredTitleBarState!==void 0,titleBarStateReady:restoredTitleBarState!==void 0,titleBarView:null};if(popId&&layer.el.setAttribute("data-mearl-pop-id",popId),layer.mask&&presentation?.tapClose&&layer.mask.addEventListener("click",()=>requestOverlayClose(layer)),!presentation&&simulateSystemBars&&config2.titleBar&&(layer.titleBarView=createSimulatedNavigationBarView("layer",()=>requestNativeBack()),layer.titleBarView.root.setAttribute("data-mearl-layer-titlebar",String(layer.id)),parts.el.appendChild(layer.titleBarView.root)),layers.push(layer),splitScreenActive&&rootFrame?.contentWindow===openerWin||setPageVisibility(openerWin,!0),animateEntry&&(enteringLayerCount+=1),syncLayerViewport(layer,layer.titleBarState),syncLayerInteractivity(),parts.frame.addEventListener("load",()=>{layer.win=parts.frame.contentWindow,parts.frame.name=LAYER_FRAME_NAME;let committedSrc=parts.frame.getAttribute("src");!committedSrc||committedSrc==="about:blank"||(syncSimulatorStateToWindow(parts.frame.contentWindow),requestAnimationFrame(()=>{layer.titleBarStateReady||layer.closing||!layer.el.isConnected||(layer.titleBarStateReady=!0,syncLayerViewport(layer,resolvedTitleBarState(layer)))}))}),(document.body??document.documentElement).appendChild(parts.el),layer.win=parts.frame.contentWindow,startLayerNavigation(layer,mapLayerFrameUrl(target)),animateEntry&&animateIn(layer),pushHistory){forwardStack.length=0;try{history.pushState({__mearl_layer__:layers.length},"",mapUrlForSync(target))}catch{}}return layer}function replaceLayer(sourceLayer,url2,callbackId,overlay,popId=null){if(sourceLayer.closing||layers[layers.length-1]!==sourceLayer){openLayer(url2,callbackId,overlay,sourceLayer.win??window,!0,popId);return}let replacement=openLayer(url2,callbackId,overlay,sourceLayer.openerWin,!1,popId);if(!replacement)return;sourceLayer.navigationPreparationCleanup?.(),sourceLayer.navigationPreparationCleanup=null,sourceLayer.entering&&(sourceLayer.entering=!1,enteringLayerCount=Math.max(enteringLayerCount-1,0),sourceLayer.enterTimer!==null&&clearTimeout(sourceLayer.enterTimer),sourceLayer.enterTransitionEnd&&sourceLayer.animEl.removeEventListener("transitionend",sourceLayer.enterTransitionEnd));let sourceIndex=layers.indexOf(sourceLayer);sourceIndex>=0&&layers.splice(sourceIndex,1),destroySimulatedNavigationBarView(sourceLayer.titleBarView),sourceLayer.el.remove(),forwardStack.length=0,syncLayerInteractivity(),syncActiveSystemBars();try{history.replaceState({__mearl_layer__:layers.length},"",mapUrlForSync(replacement.url))}catch{}}function closeLayer(layer,data,final,gotoEvent=!1,resumeOpener=!0,silent=!1,immediate=!1){if(layer.closing)return;layer.navigationPreparationCleanup?.(),layer.navigationPreparationCleanup=null,layer.entering&&(layer.entering=!1,enteringLayerCount=Math.max(enteringLayerCount-1,0),layer.enterTimer!==null&&clearTimeout(layer.enterTimer),layer.enterTimer=null,layer.enterTransitionEnd&&(layer.animEl.removeEventListener("transitionend",layer.enterTransitionEnd),layer.enterTransitionEnd=null)),layer.closing=!0;let idx=layers.indexOf(layer);idx>=0&&layers.splice(idx,1),closingLayerCount+=1,blockClosingLayerInteractions(layer),syncLayerInteractivity(),syncActiveSystemBars(),final?forwardStack.length=0:forwardStack.push({url:layer.url,overlay:layer.overlay,openerWin:layer.openerWin,callbackId:layer.callbackId,storageId:layer.storageId,popId:layer.popId}),log2("close ←",layer.url,data===void 0?"":data);let finishClose=()=>{if(destroySimulatedNavigationBarView(layer.titleBarView),layer.el.remove(),closingLayerCount=Math.max(closingLayerCount-1,0),syncLayerInteractivity(),syncActiveSystemBars(),!!resumeOpener)if(layer.openerWin===window)links.getBridgeProtocol().handleResume({data,storageId:layer.storageId,callbackId:layer.callbackId,final,gotoEvent,silent});else try{layer.openerWin.postMessage({source:SRC,type:"resume",data,storageId:layer.storageId,callbackId:layer.callbackId,final,gotoEvent,silent},"*")}catch{}};immediate?finishClose():animateOut(layer,finishClose)}function closeToDepth(depth,data,final){for(;layers.length>depth;){let revealsTarget=layers.length===depth+1;closeLayer(layers[layers.length-1],revealsTarget?data:void 0,final,!1,revealsTarget)}}function closeAllLayers(data,gotoEvent=!1,silent=!1,immediate=!1){let depth=layers.length;for(;layers.length>0;){let isRootmostLayer=layers.length===1;closeLayer(layers[layers.length-1],isRootmostLayer?data:void 0,!0,isRootmostLayer&&gotoEvent,isRootmostLayer,silent,immediate)}if(depth>0)try{history.go(-depth)}catch{}return depth>0}function openFromSplitRoot(url2,callbackId,overlay,openerWin,popId){if(pendingSplitRootOpen){pendingSplitRootOpen={url:url2,callbackId,overlay,openerWin,popId};return}if(layers.length===0){openLayer(url2,callbackId,overlay,openerWin,!0,popId);return}pendingSplitRootOpen={url:url2,callbackId,overlay,openerWin,popId},closeAllLayers(void 0,!1,!0,!0)}function finishPendingSplitRootOpen(){let pending=pendingSplitRootOpen;pending&&(pendingSplitRootOpen=null,openLayer(pending.url,pending.callbackId,pending.overlay,pending.openerWin,!0,pending.popId,!1))}function requestOverlayClose(layer){if(!(layer.closing||layers[layers.length-1]!==layer)){if(!config2.overlay?.silentTapClose){for(let selector of config2.overlay?.tapCloseSelectors??[])try{let control=layer.frame.contentDocument?.querySelector(selector);if(typeof control?.click!="function")continue;control.click();return}catch{}requestCloseOnTop(void 0);return}pendingClose||pendingHistoryDepth||(closeLayer(layer,void 0,!0,!1,!0,!0),syncHistoryAfterDirectClose())}}function forwardToDepth(depth){for(;layers.length<depth&&forwardStack.length>0;){let entry=forwardStack.pop();openLayer(entry.url,entry.callbackId,entry.overlay,entry.openerWin,!1,entry.popId)}}function requestCloseOnTop(data){if(layers.length===0){history.back();return}if(rootContainerActive){closeLayer(layers[layers.length-1],data,!0),syncHistoryAfterDirectClose();return}armPendingClose(data,8)}function isActiveBusinessWindow(target){let topLayer=layers[layers.length-1];return topLayer?topLayer.frame.contentWindow===target:rootFrame?rootFrame.contentWindow===target:target===window}function finishNativeBack(requestId,target,handled){pendingNativeBack?.requestId!==requestId||pendingNativeBack.target!==target||(clearPendingNativeBack(),!handled&&isActiveBusinessWindow(target)&&requestCloseOnTop(void 0))}function requestNativeBack(){if(!isTop||pendingNativeBack)return;let target=layers[layers.length-1]?.frame.contentWindow??rootFrame?.contentWindow??window;if(!target||target===window){links.getBridgeProtocol().handleNativeBack()||requestCloseOnTop(void 0);return}let requestId=++nativeBackRequestSeq,timer=setTimeout(()=>finishNativeBack(requestId,target,!1),120);pendingNativeBack={requestId,target,timer};try{target.postMessage({source:SRC,type:"nativeBack",requestId},"*")}catch{finishNativeBack(requestId,target,!1)}}function layerForWindow(source){if(source)for(let layer of layers){if(layer.win===source)return layer;let currentWindow=layer.frame.contentWindow;if(currentWindow&&currentWindow===source)return layer.win=currentWindow,layer}}if(isTop){if(!rootContainerActive){let rawPushState=history.pushState.bind(history),rawReplaceState=history.replaceState.bind(history),withDepth=state=>state==null?{__mearl_layer__:layers.length}:typeof state=="object"&&!Array.isArray(state)?{...state,__mearl_layer__:layers.length}:state;try{history.pushState=function(...args){rawPushState(withDepth(args[0]),args[1],args[2])},history.replaceState=function(...args){rawReplaceState(withDepth(args[0]),args[1],args[2])}}catch{}}try{readDepth(history.state)===null&&history.replaceState({__mearl_layer__:0},"")}catch{}window.addEventListener("popstate",e=>{let depth=readDepth(e.state);if(pendingSplitRootOpen&&depth===0){finishPendingSplitRootOpen();return}if(pendingHistoryDepth){let expectedDepth=pendingHistoryDepth.depth;if(clearPendingHistoryDepth(),depth===expectedDepth)return;console.warn(TAG,"浏览器历史深度与 WebView 出栈事务不一致",{expectedDepth,actualDepth:depth})}if(rootContainerActive){if(depth===null)return;depth<layers.length?closeToDepth(depth,void 0,!1):depth>layers.length&&forwardToDepth(depth);return}if(pendingClose){if(depth!==null&&depth<layers.length){let{data}=pendingClose;clearPendingClose(),closeToDepth(depth,data,!0)}else if(pendingClose.retries>0)armPendingClose(pendingClose.data,pendingClose.retries-1);else{let{data}=pendingClose;clearPendingClose(),closeToDepth(layers.length-1,data,!0)}return}depth!==null&&(depth<layers.length?closeToDepth(depth,void 0,!1):depth>layers.length&&forwardToDepth(depth))})}function broadcastAppMessage(message){links.getBridgeProtocol().handleAppMessage(message);let targets=[rootFrame?.contentWindow??null,...layers.filter(layer=>!layer.closing).map(layer=>layer.frame.contentWindow)];for(let target of targets)if(!(!target||target===window))try{target.postMessage({source:SRC,type:"appMessage",message},"*")}catch{}}function closeMegaPop(popId,data){let index=layers.findIndex(layer=>layer.popId===popId&&!layer.closing);if(index<0)return!1;let closingDepth=layers.length-index;closeToDepth(index,data,!0);try{history.go(-closingDepth)}catch{}return!0}function resizeMegaPop(popId,params){let layer=layers.find(candidate=>candidate.popId===popId&&!candidate.closing);if(!layer?.overlay)return!1;if(params.maxHeight!==void 0){let maxHeight=numberParam(params.maxHeight,1-layer.overlay.topRatio,0,1);layer.overlay.topRatio=1-maxHeight,layer.animEl.style.height=`${maxHeight*100}%`}if(params.maxWidth!==void 0){let maxWidth=numberParam(params.maxWidth,1,0,1);layer.overlay.widthRatio=maxWidth,syncOverlayWidth(layer.animEl,maxWidth)}return params.animated===!0&&(layer.animEl.style.transition="height 200ms ease, width 200ms ease, left 200ms ease"),!0}function executeContainerData(action,params){if(action==="sharedFileRead"||action==="sharedFileWrite"){let fileName=typeof params.fileName=="string"?params.fileName:"";if(!fileName)return{success:!1,value:"missing fileName"};if(action==="sharedFileRead")return{success:!0,value:{data:sharedFiles.get(fileName)??""}};let data=typeof params.data=="string"?params.data:String(params.data??"");return sharedFiles.set(fileName,data),{success:!0,value:{}}}if(action==="sharedDataGet"){let keys=Array.isArray(params.keys)?params.keys.filter(key=>typeof key=="string"):[],data={};for(let key of keys)sharedData.has(key)&&(data[key]=sharedData.get(key));return{success:!0,value:{data}}}if(action==="sharedDataSet"){if(!params.data||typeof params.data!="object"||Array.isArray(params.data))return{success:!1,value:"missing shared data"};for(let[key,value]of Object.entries(params.data))value==null?sharedData.delete(key):sharedData.set(key,value);return{success:!0,value:{}}}if(action==="megaBroadcast")return!params.message||typeof params.message!="object"||Array.isArray(params.message)?{success:!1,value:"missing broadcast message"}:(broadcastAppMessage(params.message),{success:!0,value:{}});if(action==="megaKVSnapshot")return{success:!0,value:{entries:megaKVSnapshot()}};if(action==="megaKVMutation"){let operation=typeof params.operation=="string"?params.operation:"",bizId=typeof params.bizId=="string"?params.bizId:"";if(!bizId)return{success:!1,value:"missing bizID"};let key=typeof params.key=="string"?params.key:"";if((operation==="set"||operation==="remove")&&!key)return{success:!1,value:"missing key"};if(operation==="set"){if(typeof params.value!="string")return{success:!1,value:"missing value"};let entries=megaKVStorage.get(bizId)??new Map;entries.set(key,params.value),megaKVStorage.set(bizId,entries)}else if(operation==="remove"){let entries=megaKVStorage.get(bizId);entries?.delete(key),entries?.size===0&&megaKVStorage.delete(bizId)}else if(operation==="clear")megaKVStorage.delete(bizId);else return{success:!1,value:"unsupported KVStorage operation"};return persistMegaKVStorage(),broadcastAppMessage({kind:"megaKVStorage",operation,bizId,key,value:params.value}),{success:!0,value:{}}}if(action==="legacyBroadcastCreate"){let instanceId=typeof params.instanceId=="string"?params.instanceId:"";return instanceId?(legacyBroadcastChannels.add(instanceId),{success:!0,value:{}}):{success:!1,value:"missing instanceId"}}if(action==="legacyBroadcastPost"){let instanceId=typeof params.instanceId=="string"?params.instanceId:"";return instanceId?legacyBroadcastChannels.has(instanceId)?(broadcastAppMessage({kind:"legacyBroadcast",instanceId,message:params.message}),{success:!0,value:{}}):{success:!1,value:"broadcast channel not found"}:{success:!1,value:"missing instanceId"}}if(action==="legacyBroadcastClose"){let instanceId=typeof params.instanceId=="string"?params.instanceId:"";return instanceId?(legacyBroadcastChannels.delete(instanceId),{success:!0,value:{}}):{success:!1,value:"missing instanceId"}}if(action==="megaPopClose"){let popId=typeof params.popId=="string"?params.popId:"";return popId?closeMegaPop(popId,params.result)?{success:!0,value:{}}:{success:!1,value:"popId not found"}:{success:!1,value:"missing popId"}}if(action==="megaPopResize"){let popId=typeof params.popId=="string"?params.popId:"";return popId?resizeMegaPop(popId,params)?{success:!0,value:{}}:{success:!1,value:"popId not found"}:{success:!1,value:"missing popId"}}return{success:!1,value:"unsupported container data action"}}function requestContainerData(action,params,onSuccess,onFailure){if(isTop){let result=executeContainerData(action,params);setTimeout(()=>result.success?onSuccess(result.value):onFailure(result.value),0);return}let requestId=++containerDataRequestSeq;containerDataCallbacks.set(requestId,{success:onSuccess,failure:onFailure});try{window.top?.postMessage({source:SRC,type:"containerDataRequest",requestId,action,params},"*")}catch(error48){containerDataCallbacks.delete(requestId),onFailure(error48 instanceof Error?error48.message:String(error48))}}function requestOpen(url2,callbackId,webdialog,params){let overlay=resolveOverlayPresentation(url2,params,webdialog),popBeforeOpen=requestsPopBeforeOpen(url2,params),popId=typeof params?.__mearlMegaPopId=="string"?params.__mearlMegaPopId:null;isTop?openLayer(url2,callbackId,overlay,window,!0,popId):window.top?.postMessage({source:SRC,type:"open",url:url2,callbackId,overlay,popBeforeOpen,popId},"*")}function requestClose(data){let payload;try{payload=data===void 0?void 0:JSON.parse(JSON.stringify(data))}catch{payload=void 0}isTop?requestCloseOnTop(payload):window.top?.postMessage({source:SRC,type:"close",data:payload},"*")}if(window.addEventListener("message",event=>{let msg=event.data;if(!(!msg||typeof msg!="object")){if(msg.source==="mearl-content"&&(msg.type==="APP_BRIDGE_SIMULATOR_VISIBILITY"||msg.type==="APP_BRIDGE_RUNTIME_RESPONSES")){if(!isTop||event.source!==window)return;if(msg.type==="APP_BRIDGE_SIMULATOR_VISIBILITY"&&typeof msg.hidden=="boolean"){simulatedPageHidden=msg.hidden,links.getBridgeProtocol().handlePageVisibility(msg.hidden);let lifecycleMessage={source:SRC,type:"simulatorVisibility",hidden:msg.hidden};rootFrame?.contentWindow?.postMessage(lifecycleMessage,"*");for(let layer of layers)layer.closing||layer.frame.contentWindow?.postMessage(lifecycleMessage,"*")}else if(msg.type==="APP_BRIDGE_RUNTIME_RESPONSES"&&msg.profile===config2.profile&&msg.responses&&typeof msg.responses=="object"&&!Array.isArray(msg.responses)){let responses=msg.responses;runtimeResponses={...runtimeResponses??{},...responses},links.getBridgeProtocol().applyRuntimeResponses(responses);let configMessage={source:SRC,type:"runtimeResponses",profile:config2.profile,responses};rootFrame?.contentWindow?.postMessage(configMessage,"*");for(let layer of layers)layer.closing||layer.frame.contentWindow?.postMessage(configMessage,"*")}return}if(msg.source===SRC){if(isTop){let sourceLayer=layerForWindow(event.source),sourceIsRoot=!!(rootFrame?.contentWindow&&rootFrame.contentWindow===event.source);if(!sourceLayer&&!sourceIsRoot)return;if(msg.type==="open"&&typeof msg.url=="string"){let rawOverlay=msg.overlay&&typeof msg.overlay=="object"?msg.overlay:void 0,overlay=rawOverlay?{topRatio:numberParam(rawOverlay.topRatio,.2,0,1),widthRatio:numberParam(rawOverlay.widthRatio,1,0,1),radius:numberParam(rawOverlay.radius,0,0,50),maskAlpha:numberParam(rawOverlay.maskAlpha,.3,0,1),tapClose:boolParam(rawOverlay.tapClose,!0)}:resolveOverlayPresentation(msg.url,void 0,!1),callbackId=typeof msg.callbackId=="number"?msg.callbackId:0,popId=typeof msg.popId=="string"&&msg.popId?msg.popId:null;splitScreenActive&&sourceIsRoot?openFromSplitRoot(msg.url,callbackId,overlay,event.source??window,popId):msg.popBeforeOpen===!0&&sourceLayer?replaceLayer(sourceLayer,msg.url,callbackId,overlay,popId):openLayer(msg.url,callbackId,overlay,event.source??window,!0,popId)}else if(msg.type==="close")requestCloseOnTop(msg.data);else if(msg.type==="closeAll"){let gotoEvent=msg.gotoEvent===!0;if(gotoEvent&&sourceIsRoot&&layers.length===0&&msg.data!==void 0)try{event.source.postMessage({source:SRC,type:"resume",data:msg.data,storageId:null,callbackId:0,final:!0,gotoEvent:!0},"*")}catch{}else closeAllLayers(msg.data,gotoEvent)}else if(msg.type==="appMessageToOpener"&&sourceLayer){let target=sourceLayer.openerWin;if(target===window)links.getBridgeProtocol().handleAppMessage(msg.message);else try{target.postMessage({source:SRC,type:"appMessage",message:msg.message},"*")}catch{}}else if(msg.type==="containerDataRequest"&&typeof msg.requestId=="number"&&typeof msg.action=="string"&&msg.params&&typeof msg.params=="object"&&!Array.isArray(msg.params)&&event.source){let result=executeContainerData(msg.action,msg.params);try{event.source.postMessage({source:SRC,type:"containerDataResponse",requestId:msg.requestId,success:result.success,value:result.value},"*")}catch{}}else if(msg.type==="nativeBackResult"&&typeof msg.requestId=="number"&&typeof msg.handled=="boolean"&&event.source)finishNativeBack(msg.requestId,event.source,msg.handled);else if(msg.type==="urlChanged"&&typeof msg.url=="string"){let topLayer=layers[layers.length-1];if(sourceIsRoot){try{let target=new URL(msg.url,location.href);if(!/^https?:$/.test(target.protocol))return;rootBusinessUrl=target.href}catch{return}if(topLayer)return;let mapped=mapUrlForSync(rootBusinessUrl,!1);if(mapped)try{history.replaceState({__mearl_layer__:0},"",mapped)}catch{}}else if(topLayer&&!topLayer.closing&&sourceLayer===topLayer){topLayer.url=msg.url,topLayer.titleBarStateExplicit&&topLayer.titleBarState&&cacheExplicitTitleBarState(topLayer,topLayer.titleBarState);let mapped=mapUrlForSync(msg.url);if(mapped)try{history.replaceState({__mearl_layer__:layers.length},"",mapped)}catch{}}}else if(msg.type==="title"&&typeof msg.title=="string"){let topLayer=layers[layers.length-1];if(sourceIsRoot&&!topLayer)try{document.title=msg.title,syncSimulatedTitleBar()}catch{}else if(topLayer&&sourceLayer===topLayer){document.title=msg.title;let state=resolvedTitleBarState(topLayer);topLayer.titleBarState={...state,title:msg.title},syncLayerViewport(topLayer,topLayer.titleBarState)}}else if(msg.type==="titleBarState"){let state=parseReportedTitleBarState(msg.state);if(state&&sourceIsRoot)links.getSystemBars().setPresentedRootTitleBarState(state);else if(state&&sourceLayer){let explicit=msg.explicit===!0;sourceLayer.titleBarStateReady=!0,explicit?(sourceLayer.titleBarState=state,sourceLayer.titleBarStateExplicit=!0,cacheExplicitTitleBarState(sourceLayer,state)):sourceLayer.titleBarStateExplicit||(sourceLayer.titleBarState=state);let resolvedState=sourceLayer.titleBarState??state;syncLayerViewport(sourceLayer,resolvedState)}}}else if(msg.type==="requestTitleBarState"){if(event.source!==window.top)return;syncSimulatedTitleBar()}else if(msg.type==="simulatorVisibility"&&typeof msg.hidden=="boolean"){if(event.source!==window.top)return;links.getBridgeProtocol().handlePageVisibility(msg.hidden)}else if(msg.type==="appMessage"){if(event.source!==window.top)return;links.getBridgeProtocol().handleAppMessage(msg.message)}else if(msg.type==="nativeBack"&&typeof msg.requestId=="number"){if(event.source!==window.top)return;let handled=links.getBridgeProtocol().handleNativeBack();window.top?.postMessage({source:SRC,type:"nativeBackResult",requestId:msg.requestId,handled},"*")}else if(msg.type==="containerDataResponse"&&typeof msg.requestId=="number"){if(event.source!==window.top)return;let callback=containerDataCallbacks.get(msg.requestId);if(!callback)return;containerDataCallbacks.delete(msg.requestId),msg.success===!0?callback.success(msg.value):callback.failure(msg.value)}else if(msg.type==="runtimeResponses"&&msg.profile===config2.profile&&msg.responses&&typeof msg.responses=="object"&&!Array.isArray(msg.responses)){if(event.source!==window.top)return;links.getBridgeProtocol().applyRuntimeResponses(msg.responses)}else if(msg.type==="resume"){if(event.source!==window.top)return;links.getBridgeProtocol().handleResume({data:msg.data,storageId:msg.storageId??null,callbackId:typeof msg.callbackId=="number"?msg.callbackId:0,final:msg.final===!0,gotoEvent:msg.gotoEvent===!0,silent:msg.silent===!0})}else event.source!==window.top&&window.top?.postMessage(msg,"*");return}pageTransport.handleMessage(msg)}}),!isTop&&isContainerFrame){let reportUrl=()=>{try{window.top?.postMessage({source:SRC,type:"urlChanged",url:restoreLayerBusinessUrl(location.href)},"*")}catch{}};try{let origPushState=history.pushState.bind(history),origReplaceState=history.replaceState.bind(history);history.pushState=function(...args){origPushState(...args),reportUrl()},history.replaceState=function(...args){origReplaceState(...args),reportUrl()},window.addEventListener("popstate",reportUrl),window.addEventListener("hashchange",reportUrl),window.addEventListener("pageshow",reportUrl),document.readyState==="complete"&&reportUrl()}catch{}}if(isContainerFrame){let requestProxyLocationOpen=url2=>{if(links.getBridgeProtocol().handleMaybeScheme(url2))return!0;try{let current=new URL(restoreLayerBusinessUrl(location.href)),target=new URL(url2,current);return!/^https?:$/.test(target.protocol)||target.origin===current.origin&&target.pathname===current.pathname&&target.search===current.search?!1:(requestOpen(target.href,0,!1),!0)}catch{return!1}};Object.defineProperty(window,"__PROXY_LOCATION__",{value:{get href(){return location.href},set href(url2){requestProxyLocationOpen(url2)||(location.href=mapLayerFrameUrl(url2))},replace(url2){links.getBridgeProtocol().handleMaybeScheme(url2)||location.replace(mapLayerFrameUrl(url2))},assign(url2){requestProxyLocationOpen(url2)||location.assign(mapLayerFrameUrl(url2))}},writable:!1,configurable:!0})}if(isContainerFrame){document.addEventListener("click",event=>{let el=event.target;for(;el&&el.tagName!=="A";)el=el.parentElement;if(!el)return;let href=el.getAttribute("href");if(href){if(links.getBridgeProtocol().handleMaybeScheme(href)){event.preventDefault(),event.stopPropagation();return}/^https?:/i.test(href)&&el.getAttribute("target")==="_blank"&&(event.preventDefault(),event.stopPropagation(),requestOpen(href,0,!1))}},!0);let origOpen=window.open;window.open=function(url2,target,features){let urlStr=typeof url2=="string"?url2:url2 instanceof URL?url2.href:"";return links.getBridgeProtocol().handleMaybeScheme(urlStr)?null:/^https?:/i.test(urlStr)?(requestOpen(urlStr,0,!1),null):origOpen?origOpen.call(window,url2,target,features):null};try{let proto=Location.prototype,origAssign=proto.assign,origReplace=proto.replace;origAssign&&(proto.assign=function(url2){if(links.getBridgeProtocol().handleMaybeScheme(url2))return;let upgraded=location.protocol==="https:"&&url2.startsWith("http:")?"https:"+url2.slice(5):url2;origAssign.call(this,upgraded)}),origReplace&&(proto.replace=function(url2){if(links.getBridgeProtocol().handleMaybeScheme(url2))return;let upgraded=location.protocol==="https:"&&url2.startsWith("http:")?"https:"+url2.slice(5):url2;origReplace.call(this,upgraded)})}catch{}}return log2("容器环境已就绪",isTop?"(top)":isRootFrame?"(root)":isLayerFrame?"(layer)":"(iframe,仅桥)"),{getRootFrame:()=>rootFrame,hasRootOverlay:()=>rootOverlayActive,getLayers:()=>layers,getClosingLayerCount:()=>closingLayerCount,requestOpen,requestClose,requestNativeBack,requestContainerData,closeAllLayers}}var APP_PROFILE_RUNTIME_FACTORIES={documentTransport:installRootWebViewDocumentTransport,environment:installAppProfileEnvironment,containerStack:installAppProfileContainerStack,bridgeProtocol:installAppProfileBridgeProtocol,pageTransport:installAppProfilePageTransport,systemBars:installAppProfileSystemBars};function buildAppProfileRuntimeCallSource(configExpression){return`(${installAppProfileRuntime.toString()})(${configExpression},{documentTransport:${installRootWebViewDocumentTransport.toString()},environment:${installAppProfileEnvironment.toString()},pageTransport:${installAppProfilePageTransport.toString()},containerStack:${installAppProfileContainerStack.toString()},systemBars:${installAppProfileSystemBars.toString()},bridgeProtocol:${installAppProfileBridgeProtocol.toString()}})`}function installAppProfileRuntime(config2,factories=APP_PROFILE_RUNTIME_FACTORIES){factories.documentTransport();let environment=factories.environment(config2);if(!environment)return;let pageTransport=factories.pageTransport(config2,environment),containerStack=factories.containerStack(config2,environment,{pageTransport,getSystemBars:()=>systemBars,getBridgeProtocol:()=>bridgeProtocol}),systemBars=factories.systemBars(config2,environment,{getRootFrame:containerStack.getRootFrame,hasRootOverlay:containerStack.hasRootOverlay,getLayers:containerStack.getLayers,getClosingLayerCount:containerStack.getClosingLayerCount,requestClose:containerStack.requestClose,requestNativeBack:containerStack.requestNativeBack}),bridgeProtocol=factories.bridgeProtocol(config2,environment,{pageTransport,systemBars,requestOpen:containerStack.requestOpen,requestClose:containerStack.requestClose,requestCloseAll:containerStack.closeAllLayers,requestContainerData:containerStack.requestContainerData})}init_dist4();import https from"node:https";import http3 from"node:http";var TYPE_INTO_ELEMENT_SRC=typeIntoElement.toString(),CLICK_ELEMENT_VIA_JS_SRC=clickElementViaJS.toString(),GET_CLICK_COORDS_FROM_NODE_SRC=getClickCoordsFromNode.toString();async function readCdpCurrentUrl(session,action){let url2=(await session.client.sendCommand("Runtime.evaluate",{expression:"location.href",returnByValue:!0})).result?.value;if(typeof url2!="string"||!url2)throw new Error(`${action}: could not read the current page URL`);return session.url=url2,url2}function nodeFetch(urlStr,options={}){return new Promise((resolve11,reject)=>{let url2=new URL(urlStr),isHttps=url2.protocol==="https:",lib=isHttps?https:http3,{method="GET",headers={},body,timeoutMs=3e4}=options,req=lib.request({host:url2.hostname,port:url2.port||(isHttps?443:80),path:url2.pathname+url2.search,method,headers},res=>{let responseHeaders={};for(let[key,value]of Object.entries(res.headers))typeof value=="string"?responseHeaders[key]=value:Array.isArray(value)&&(responseHeaders[key]=value.join(", "));let chunks=[];res.on("data",chunk=>chunks.push(Buffer.from(chunk))),res.on("end",()=>{let bodyBuffer=Buffer.concat(chunks);resolve11({status:res.statusCode??0,statusText:res.statusMessage??"",headers:responseHeaders,body:bodyBuffer.toString("utf-8"),bodyBuffer,setCookies:res.headers["set-cookie"]??[]})})});req.on("error",reject),req.setTimeout(timeoutMs,()=>{req.destroy(),reject(new Error(`Request timeout: ${urlStr}`))}),body&&req.write(body),req.end()})}async function getCookiesForUrl(session,targetUrl){let result=await session.client.sendCommand("Network.getCookies",{urls:[targetUrl]});return selectRequestCookies(result.cookies??[],targetUrl)}async function waitForPageLoad(session,timeoutMs,options={}){if(options.probeReadyState!==!1&&isCdpDeviceShellActive(session)){let deadline=Date.now()+timeoutMs;for(;Date.now()<deadline;){if((await sendCdpDeviceShellPageCommand(session,"Runtime.evaluate",{expression:"document.readyState",returnByValue:!0}).catch(()=>null))?.result?.value==="complete")return;await new Promise(resolve11=>setTimeout(resolve11,50))}throw new Error(`Page load timeout after ${timeoutMs}ms`)}return new Promise((resolve11,reject)=>{let settled=!1,removeLoadListener=()=>{},finish=error48=>{settled||(settled=!0,clearTimeout(timer),removeLoadListener(),error48?reject(error48):resolve11())},timer=setTimeout(()=>{finish(new Error(`Page load timeout after ${timeoutMs}ms`))},timeoutMs);removeLoadListener=session.client.on("Page.loadEventFired",()=>finish()),options.probeReadyState!==!1&&session.client.sendCommand("Runtime.evaluate",{expression:"document.readyState",returnByValue:!0}).then(result=>{result.result?.value==="complete"&&finish()}).catch(()=>{})})}async function toCdpInputPoint(session,x,y){if(isCdpDeviceShellActive(session)){let offset=await getCdpDeviceShellInputOffset(session);return{x:x+offset.x,y:y+offset.y}}return{x,y}}async function dispatchCdpClick(session,x,y,pointerType){let point=await toCdpInputPoint(session,x,y);if(pointerType==="touch"){await dispatchPairedPageInputCommands(()=>sendCdpInputCommand(session,"Input.dispatchTouchEvent",{type:"touchStart",touchPoints:[point]}),()=>sendCdpInputCommand(session,"Input.dispatchTouchEvent",{type:"touchEnd",touchPoints:[]}));return}await sendCdpInputCommand(session,"Input.dispatchMouseEvent",{type:"mouseMoved",x:point.x,y:point.y}),await dispatchPairedPageInputCommands(()=>sendCdpInputCommand(session,"Input.dispatchMouseEvent",{type:"mousePressed",x:point.x,y:point.y,button:"left",buttons:1,clickCount:1}),()=>sendCdpInputCommand(session,"Input.dispatchMouseEvent",{type:"mouseReleased",x:point.x,y:point.y,button:"left",buttons:0,clickCount:1}))}async function dispatchCdpDrag(session,from,to,pointerType,durationMs){let[start,end]=await Promise.all([toCdpInputPoint(session,from.x,from.y),toCdpInputPoint(session,to.x,to.y)]),path27=buildPageDragPath(start,end,durationMs),waitForNextPoint=async()=>{path27.intervalMs<=0||await new Promise(resolve11=>setTimeout(resolve11,path27.intervalMs))};if(pointerType==="touch"){await sendCdpInputCommand(session,"Input.dispatchTouchEvent",{type:"touchStart",touchPoints:[start]});let primaryError2;try{for(let point of path27.points)await waitForNextPoint(),await sendCdpInputCommand(session,"Input.dispatchTouchEvent",{type:"touchMove",touchPoints:[point]})}catch(error48){throw primaryError2=error48,error48}finally{await sendCdpInputCommand(session,"Input.dispatchTouchEvent",{type:"touchEnd",touchPoints:[]}).catch(error48=>{if(primaryError2===void 0)throw error48})}return{steps:path27.points.length}}await sendCdpInputCommand(session,"Input.dispatchMouseEvent",{type:"mouseMoved",x:start.x,y:start.y}),await sendCdpInputCommand(session,"Input.dispatchMouseEvent",{type:"mousePressed",x:start.x,y:start.y,button:"left",buttons:1,clickCount:1});let primaryError;try{for(let point of path27.points)await waitForNextPoint(),await sendCdpInputCommand(session,"Input.dispatchMouseEvent",{type:"mouseMoved",x:point.x,y:point.y,button:"left",buttons:1})}catch(error48){throw primaryError=error48,error48}finally{await sendCdpInputCommand(session,"Input.dispatchMouseEvent",{type:"mouseReleased",x:end.x,y:end.y,button:"left",buttons:0,clickCount:1}).catch(error48=>{if(primaryError===void 0)throw error48})}return{steps:path27.points.length}}async function sendCdpInputCommand(session,method,params){try{await session.client.sendCommand(method,params,1e4)}catch(error48){if(error48 instanceof Error&&error48.message===`CDP command timeout: ${method}`){let eventType=typeof params.type=="string"?` (${params.type})`:"",targetHint=method==="Input.dispatchTouchEvent"?'Touch input can stall on a hidden, background, or headless target; use clickMode "auto" or make the target visible. ':"",message=`CDP ${method}${eventType} timed out after ${1e4}ms. `+targetHint+"The page may already have changed; verify its current state before retrying.";throw/^(mousePressed|mouseReleased|touchStart|touchEnd)$/.test(String(params.type??""))?new PageActionDispatchUncertainError(message,{cause:error48,attempt:{inputCommand:{method,type:String(params.type??"")}}}):new Error(message,{cause:error48})}throw error48}}async function resolveBackendNodeObjectId(session,backendNodeId){let objectId=(await sendCdpDeviceShellPageCommand(session,"DOM.resolveNode",{backendNodeId})).object?.objectId;if(!objectId)throw new Error(`Cannot resolve element for backendNodeId ${backendNodeId}`);return objectId}var SCREENSHOT_HIDDEN_DISPLAY_PROPERTIES=["--mearl-side-panel-toggle-display","--mearl-device-cutout-display"],screenshotQueueTails=new WeakMap;async function runScreenshotExclusive(session,operation){let previous=screenshotQueueTails.get(session)??Promise.resolve(),unlock,tail=new Promise(resolve11=>{unlock=resolve11});screenshotQueueTails.set(session,tail),await previous;try{return await operation()}finally{unlock(),screenshotQueueTails.get(session)===tail&&screenshotQueueTails.delete(session)}}async function hideScreenshotArtifacts(session){return(await session.client.sendCommand("Runtime.evaluate",{expression:`
1696
+ </section></div>`,shadow.querySelector("[data-auth-eyebrow]").textContent=authCodeText.eyebrow,shadow.querySelector("[data-auth-title]").textContent=authCodeText.title,shadow.querySelector("[data-auth-status]").textContent=authCodeText.starting,shadow.querySelector("[data-auth-detail]").textContent=authCodeText.startingDetail,shadow.querySelector("[data-auth-visual-label]").textContent=authCodeText.starting,shadow.querySelector(".cancel").textContent=authCodeText.cancel,shadow.querySelector(".close").setAttribute("aria-label",authCodeText.cancel),shadow.querySelectorAll("[data-auth-step]").forEach((step,index)=>{step.lastElementChild.textContent=authCodeText.steps[index]??""}),shadow.querySelectorAll("[data-auth-cancel]").forEach(button=>{button.addEventListener("click",()=>{window.postMessage({source:SRC,type:"authCodeCancel",requestId},"*"),finishAuthCode(requestId,{success:!1,error:"User cancelled authorization"})})}),(document.body??document.documentElement).appendChild(overlay),pending.overlay=overlay}if(svg){let parsed=new DOMParser().parseFromString(svg,"image/svg+xml").documentElement;if(parsed.namespaceURI!=="http://www.w3.org/2000/svg"||parsed.tagName!=="svg")return;let image=document.importNode(parsed,!0);image.setAttribute("role","img"),image.setAttribute("aria-label","支付宝扫码配对二维码"),pending.overlay.shadowRoot?.querySelector("[data-auth-qr]")?.replaceChildren(image);let visual=pending.overlay.shadowRoot?.querySelector("[data-auth-visual]");visual&&(visual.dataset.ready="true"),armAuthCodeTimeout(requestId,135e3),(pending.phase==="starting"||pending.phase==="installing")&&updateAuthCodeProgress(requestId,"pairing")}}}function callAuthCode(params,succ,fail2){activeAuthCodeRequestId!==null&&(window.postMessage({source:SRC,type:"authCodeCancel",requestId:activeAuthCodeRequestId},"*"),finishAuthCode(activeAuthCodeRequestId,{success:!1,error:"Authorization request replaced"}));let requestId=++bridgeRequestSeq;activeAuthCodeRequestId=requestId,pendingAuthCode[requestId]={succ,fail:fail2,phase:"starting"},armAuthCodeTimeout(requestId,135e3),showAuthCodePairing(requestId),window.postMessage({source:SRC,type:"authCode",requestId,payload:params},"*")}function degradedUserInfo(fallback,reason){let result={...fallback};try{Object.defineProperties(result,{__mearlDegraded:{enumerable:!1,value:!0},__mearlDegradedReason:{enumerable:!1,value:reason}})}catch{}return console.warn(TAG,"userInfo 降级:",reason),result}function callMtop(params,succ,fail2){let id=++bridgeRequestSeq;pendingMtop[id]={succ,fail:fail2};let post=params.post,rawTimeout=params.timeout??params.timer,timeout=typeof rawTimeout=="number"?rawTimeout:typeof rawTimeout=="string"&&rawTimeout.trim()!==""?Number(rawTimeout):void 0,payload={...params,data:params.data!==void 0?params.data:params.param??{},method:params.method??(post===!0||post===1||post==="1"||post==="true"?"POST":"GET"),env:params.env??(/(^|\.)wapa\.taobao\.com$/i.test(location.hostname)?"pre":"prod"),...Number.isFinite(timeout)&&{timeout}};window.postMessage({source:SRC,type:"mtop",requestId:id,payload},"*"),log2("mtop 代发 →",params.api)}function callMtopAsync(params){return new Promise((resolve11,reject)=>callMtop(params,resolve11,reject))}function callMtopStream(params,succ,fail2){let sessionId=typeof params.id=="string"?params.id:String(params.id??""),request=params.request&&typeof params.request=="object"?params.request:null;if(!sessionId||!request||typeof request.api!="string"){fail2?.("invalid mtop_stream params");return}let requestId=++bridgeRequestSeq;pendingMtopStreams[requestId]={sessionId},window.postMessage({source:SRC,type:"mtopStream",requestId,payload:{...request,timeout:params.timeout,method:params.method??request.method,env:/(^|\.)wapa\.taobao\.com$/i.test(location.hostname)?"pre":"prod"}},"*"),succ?.({}),log2("mtop 流式代发 →",request.api)}function callUserInfo(fallback,succ){if(fallback.userId){succ?.(fallback);return}let requestId=++bridgeRequestSeq,timer=setTimeout(()=>{let pending=pendingUserInfo[requestId];pending&&(delete pendingUserInfo[requestId],pending.succ?.(degradedUserInfo(pending.fallback,"native relay timeout")))},1e3);pendingUserInfo[requestId]={fallback,succ,timer},window.postMessage({source:SRC,type:"userInfo",requestId},"*")}function emitMtopStreamEvent(sessionId,eventType,data){let detail=data&&typeof data=="object"?{...data,eventType}:{data,eventType};document.dispatchEvent(new CustomEvent(`mtop_stream${sessionId}`,{detail}))}function pickDirectUploadTarget(response){if(!response||typeof response!="object")return null;let data=response.data;if(data?.success===!1)return null;let result=data?.result,target=Array.isArray(result?.urls)?result.urls[0]:void 0;if(!target||typeof target!="object")return null;let item=target;if(typeof item.put!="string"||!item.put||typeof item.get!="string"||!item.get)return null;let rawHeaders=item.putHeaders&&typeof item.putHeaders=="object"?item.putHeaders:{},putHeaders=Object.fromEntries(Object.entries(rawHeaders).map(([key,value])=>[key,String(value)]));return{put:item.put,get:item.get,putHeaders}}async function uploadImage(file2){let uploader=config2.imagePicker;if(!uploader)throw new Error("图片上传能力未配置");let env=/(^|\.)wapa\.taobao\.com$/i.test(location.hostname)?"pre":"prod",response=await callMtopAsync({api:uploader.api,v:uploader.version,method:"POST",env,timeout:6e4,data:{fcId:uploader.fcId,fcGroup:uploader.fcGroup,fcName:uploader.uploadUrlFunction,fcData:JSON.stringify({requestType:"url",mimes:[file2.type||"image/jpeg"],prefix:uploader.prefix,region:uploader.region,uploadNumber:1}),fcConfig:JSON.stringify({timeout:6e4,disasterRecover:!0})}}),target=pickDirectUploadTarget(response);if(!target)throw new Error("获取图片上传地址失败");let uploadUrl=`${target.put}${target.put.includes("?")?"&":"?"}getAvatar=1`,uploadResponse=await fetch(uploadUrl,{method:"PUT",headers:target.putHeaders,body:file2});if(uploadResponse.status!==200)throw new Error(`图片直传失败: HTTP ${uploadResponse.status}`);return target.get}function readImageDataUrl(file2){return new Promise((resolve11,reject)=>{let reader=new FileReader;reader.addEventListener("load",()=>{if(typeof reader.result=="string"&&reader.result.startsWith("data:")){resolve11(reader.result);return}reject(new Error("读取图片数据失败"))},{once:!0}),reader.addEventListener("error",()=>reject(reader.error??new Error("读取图片数据失败")),{once:!0}),reader.readAsDataURL(file2)})}function openImagePicker(options,onSuccess,onFailure){let input2=document.createElement("input");input2.type="file",input2.accept="image/*";let maxSelect=Number.isFinite(options.maxSelect)?Math.min(999,Math.max(1,Math.floor(options.maxSelect))):1;input2.multiple=maxSelect>1,options.capture&&(input2.capture="environment"),input2.style.display="none";let settled=!1,finish=()=>{settled=!0,input2.remove()},fail2=reason=>{settled||(finish(),onFailure(reason))};input2.addEventListener("cancel",()=>fail2("image selection cancelled"),{once:!0}),input2.addEventListener("change",()=>{let files=Array.from(input2.files??[]).slice(0,maxSelect);if(files.length===0){fail2("image selection cancelled");return}if(files.some(file2=>!file2.type.startsWith("image/"))){console.error(TAG,"仅支持选择图片文件"),fail2("only image files are supported");return}let resolveImage=options.resultType==="dataUrl"?readImageDataUrl:uploadImage;Promise.all(files.map(resolveImage)).then(urls=>{settled||(onSuccess(urls),log2(options.resultType==="dataUrl"?"图片选择并读取完成:":"图片选择并上传完成:",urls))}).catch(error48=>{console.error(TAG,"图片处理失败:",error48),fail2(error48 instanceof Error?error48.message:"image processing failed")}).finally(finish)},{once:!0}),(document.body??document.documentElement).appendChild(input2),input2.click(),window.addEventListener("focus",()=>{setTimeout(()=>{!settled&&!input2.files?.length&&fail2("image selection cancelled")},1e3)},{once:!0})}function showPaymentDialog(api,params,succeed,failed){document.querySelector('[data-mearl-payment-dialog="true"]')?.remove();let overlay=document.createElement("div");overlay.setAttribute("data-mearl-payment-dialog","true"),Object.assign(overlay.style,{position:"fixed",inset:"0",zIndex:"2147483647",display:"flex",alignItems:"center",justifyContent:"center",background:"rgba(0,0,0,0.5)"});let card=document.createElement("div");Object.assign(card.style,{background:"#fff",borderRadius:"12px",padding:"24px",width:"300px",textAlign:"center",fontFamily:"system-ui, sans-serif"});let title=document.createElement("div");Object.assign(title.style,{fontSize:"17px",fontWeight:"600",marginBottom:"8px"}),title.textContent="支付确认";let desc=document.createElement("div");Object.assign(desc.style,{fontSize:"14px",color:"#666",marginBottom:"20px"}),desc.textContent=`模拟 ${api} 支付,请选择操作`;let btnRow=document.createElement("div");Object.assign(btnRow.style,{display:"flex",gap:"12px"});let btnBase=(text3,bg,color,action)=>{let btn=document.createElement("button");return btn.textContent=text3,btn.setAttribute("data-mearl-action",action),Object.assign(btn.style,{flex:"1",padding:"10px 0",border:"none",borderRadius:"8px",fontSize:"15px",fontWeight:"500",cursor:"pointer",background:bg,color}),btn},confirmBtn=btnBase("完成支付","#1677ff","#fff","payment-confirm"),cancelBtn=btnBase("取消支付","#f5f5f5","#333","payment-cancel"),cleanup=()=>{overlay.remove()};confirmBtn.addEventListener("click",()=>{cleanup(),log2("用户完成支付",api),succeed(api==="wx.requestPayment"?{errMsg:"requestPayment:ok"}:{ResultStatus:"9000",resultStatus:"9000"})}),cancelBtn.addEventListener("click",()=>{cleanup(),log2("用户取消支付",api),failed(api==="wx.requestPayment"?{errMsg:"requestPayment:fail cancel"}:{ResultStatus:"6001",resultStatus:"6001"})}),btnRow.appendChild(cancelBtn),btnRow.appendChild(confirmBtn),card.appendChild(title),card.appendChild(desc),card.appendChild(btnRow),overlay.appendChild(card),(document.body??document.documentElement).appendChild(overlay)}function showMiniProgramActionDialog(action,params,confirmed,cancelled){document.querySelector('[data-mearl-mini-program-dialog="true"]')?.remove();let overlay=document.createElement("div");overlay.setAttribute("data-mearl-mini-program-dialog","true"),overlay.setAttribute("data-mearl-mini-program-action",action),Object.assign(overlay.style,{position:"fixed",inset:"0",zIndex:"2147483647",display:"flex",alignItems:"center",justifyContent:"center",background:"rgba(0,0,0,0.5)"});let card=document.createElement("div");Object.assign(card.style,{background:"#fff",borderRadius:"12px",padding:"24px",width:"300px",textAlign:"center",fontFamily:"system-ui, sans-serif"});let title=document.createElement("div");Object.assign(title.style,{fontSize:"17px",fontWeight:"600",marginBottom:"8px"}),title.textContent=action==="navigateMiniProgram"?"打开其他小程序":"订阅消息";let desc=document.createElement("div");Object.assign(desc.style,{fontSize:"14px",color:"#666",marginBottom:"20px"});let targetTitle=params.title?.trim()||"其他";desc.textContent=action==="navigateMiniProgram"?`即将打开“${targetTitle}”小程序,是否继续?`:"模拟微信订阅消息授权,请选择操作";let btnRow=document.createElement("div");Object.assign(btnRow.style,{display:"flex",gap:"12px"});let createButton=(text3,background,color,actionName)=>{let button=document.createElement("button");return button.textContent=text3,button.setAttribute("data-mearl-action",actionName),Object.assign(button.style,{flex:"1",padding:"10px 0",border:"none",borderRadius:"8px",fontSize:"15px",fontWeight:"500",cursor:"pointer",background,color}),button},confirmButton=createButton(action==="navigateMiniProgram"?"确定":"允许","#1677ff","#fff","mini-program-confirm"),cancelButton=createButton("取消","#f5f5f5","#333","mini-program-cancel"),cleanup=()=>overlay.remove();confirmButton.addEventListener("click",()=>{cleanup();let result=action==="navigateMiniProgram"?{errMsg:"navigateToMiniProgram:ok"}:{result:"SUCCESS",data:{totalCount:1,acceptCount:1}};log2("用户确认小程序原生能力",action,params.appId??params.scene??""),confirmed(result)}),cancelButton.addEventListener("click",()=>{cleanup();let result=action==="navigateMiniProgram"?{errMsg:"navigateToMiniProgram:fail cancel"}:{result:"CLOSE_BY_USER"};log2("用户取消小程序原生能力",action),cancelled(result)}),btnRow.appendChild(cancelButton),btnRow.appendChild(confirmButton),card.appendChild(title),card.appendChild(desc),card.appendChild(btnRow),overlay.appendChild(card),(document.body??document.documentElement).appendChild(overlay)}function handleMessage(msg){if(msg.source==="mearl-content"&&msg.type==="APP_BRIDGE_AUTH_CODE_PROGRESS")return(msg.phase==="installing"||msg.phase==="connected"||msg.phase==="authorizing")&&updateAuthCodeProgress(msg.requestId,msg.phase),!0;if(msg.source==="mearl-content"&&msg.type==="APP_BRIDGE_AUTH_CODE_PAIRING"){let result=msg.result;return typeof result?.qrSvg=="string"&&showAuthCodePairing(msg.requestId,result.qrSvg),!0}if(msg.source==="mearl-content"&&msg.type==="APP_BRIDGE_AUTH_CODE_RESPONSE")return finishAuthCode(msg.requestId,msg.result),!0;if(msg.source==="mearl-content"&&msg.type==="APP_BRIDGE_MTOP_RESPONSE"){let pending=pendingMtop[msg.requestId];if(!pending)return!0;delete pendingMtop[msg.requestId];let result=msg.result;return result?.success?pending.succ?.(result.response):pending.fail?.(result?.error??"mtop delegate failed"),!0}if(msg.source==="mearl-content"&&msg.type==="APP_BRIDGE_USER_INFO_RESPONSE"){let requestId=msg.requestId,pending=pendingUserInfo[requestId];if(!pending)return!0;delete pendingUserInfo[requestId],clearTimeout(pending.timer);let result=msg.result,response=result?.success&&result.response&&typeof result.response=="object"?result.response:{};return pending.succ?.(result?.success?{...pending.fallback,...response}:degradedUserInfo(pending.fallback,typeof result?.error=="string"&&result.error?result.error:"native relay failed")),!0}if(msg.source==="mearl-content"&&msg.type==="APP_BRIDGE_MTOP_STREAM_EVENT"){let requestId=msg.requestId,pending=pendingMtopStreams[requestId];if(!pending)return!0;let eventType=msg.eventType;return emitMtopStreamEvent(pending.sessionId,eventType,msg.data),(eventType==="onFinish"||eventType==="onError")&&delete pendingMtopStreams[requestId],!0}return!1}return{showAppToast,callMtop,callMtopStream,callUserInfo,callAuthCode,openImagePicker,showPaymentDialog,showMiniProgramActionDialog,handleMessage}}function installAppProfileBridgeProtocol(config2,environment,host){let{w,SRC,TAG,isTop,log:log2}=environment,{pageTransport,systemBars,requestOpen,requestClose,requestCloseAll,requestContainerData}=host,{showAppToast,callMtop,callMtopStream,callUserInfo,callAuthCode,openImagePicker,showPaymentDialog,showMiniProgramActionDialog}=pageTransport,{applyNavigationBarState,applyStatusBarState,syncSimulatedTitleBar}=systemBars,NOT_IMPLEMENTED_PAYLOAD=JSON.stringify({ret:["HY_FAILED"],msg:"not implemented"}),FPT_STORAGE_KEY=`__mearl_app_fpt__:${config2.profile}`,CALENDAR_STORAGE_KEY=`__mearl_app_calendar_events__:${config2.profile}`,unsupportedNativeInputNotified=!1,stopNetworkQualityMonitor=null,voiceRecognition=null,voiceRecognitionSession=0,voiceRecognitionTranscript="",voiceRecognitionInterimTranscript="",voiceRecognitionStopping=!1,voiceRecognitionRunning=!1,simulatedPageHidden=!1,simulatedVisibilityInstalled=!1,hasPendingMiniProgramBackData=!1,pendingMiniProgramBackData,notificationListeners=new Map,megaListenerSeq=0,megaBroadcastListeners=new Map,megaLifeCycleListeners=new Set,megaPageCloseListeners=new Set,megaSystemBackListener=null,megaKVMutationVersion=0,MEGA_KV_TOTAL_SIZE=5*1024*1024,MEGA_KV_STORAGE_KEY=`__mearl_mega_kv__:${config2.profile}`;function readMegaKVStorage(){let storage=new Map;try{let parsed=JSON.parse(localStorage.getItem(MEGA_KV_STORAGE_KEY)??"{}");if(!parsed||typeof parsed!="object"||Array.isArray(parsed))return storage;for(let[bizId,rawEntries]of Object.entries(parsed)){if(!rawEntries||typeof rawEntries!="object"||Array.isArray(rawEntries))continue;let entries=new Map;for(let[key,value]of Object.entries(rawEntries))typeof value=="string"&&entries.set(key,value);storage.set(bizId,entries)}}catch{}return storage}let megaKVStorage=readMegaKVStorage();function megaKVSnapshot(){let snapshot={};for(let[bizId,values]of megaKVStorage)snapshot[bizId]=Object.fromEntries(values);return snapshot}function persistMegaKVStorage(){try{localStorage.setItem(MEGA_KV_STORAGE_KEY,JSON.stringify(megaKVSnapshot()))}catch{}}function replaceMegaKVStorage(value){if(!(!value||typeof value!="object"||Array.isArray(value))){megaKVStorage.clear();for(let[bizId,rawEntries]of Object.entries(value)){if(!rawEntries||typeof rawEntries!="object"||Array.isArray(rawEntries))continue;let entries=new Map;for(let[key,entryValue]of Object.entries(rawEntries))typeof entryValue=="string"&&entries.set(key,entryValue);megaKVStorage.set(bizId,entries)}persistMegaKVStorage()}}function applyMegaKVMutation(payload){let operation=typeof payload.operation=="string"?payload.operation:"",bizId=typeof payload.bizId=="string"?payload.bizId:"",key=typeof payload.key=="string"?payload.key:"";if(bizId){if(operation==="set"&&key&&typeof payload.value=="string"){let entries=megaKVStorage.get(bizId)??new Map;entries.set(key,payload.value),megaKVStorage.set(bizId,entries)}else if(operation==="remove"&&key){let entries=megaKVStorage.get(bizId);entries?.delete(key),entries?.size===0&&megaKVStorage.delete(bizId)}else if(operation==="clear")megaKVStorage.delete(bizId);else return;megaKVMutationVersion+=1,persistMegaKVStorage()}}function emitMegaCallback(callback,value){callback&&setTimeout(()=>callback(value),0)}function megaBroadcastBizId(value){return typeof value=="string"&&value?value:"__MEGA_GLOBAL_MESSAGE__"}function dispatchMegaBroadcast(payload){let bizId=megaBroadcastBizId(payload.bizId),eventName=typeof payload.eventName=="string"?payload.eventName:"";if(eventName)for(let listener of Array.from(megaBroadcastListeners.values()))listener.bizId!==bizId||listener.eventName!==eventName||(listener.once&&megaBroadcastListeners.delete(listener.id),emitMegaCallback(listener.callback,{statusCode:1,type:"onEvent",data:{detail:payload.detail}}),listener.once&&emitMegaCallback(listener.callback,{statusCode:99,type:"finish"}))}let documentPrototype=typeof Document=="function"?Document.prototype:null,nativeHiddenDescriptor=documentPrototype?Object.getOwnPropertyDescriptor(documentPrototype,"hidden"):void 0,nativeVisibilityDescriptor=documentPrototype?Object.getOwnPropertyDescriptor(documentPrototype,"visibilityState"):void 0;function installSimulatedVisibilityState(){if(!simulatedVisibilityInstalled){simulatedVisibilityInstalled=!0;try{Object.defineProperty(document,"hidden",{configurable:!0,get:()=>simulatedPageHidden||!!(nativeHiddenDescriptor?.get?.call(document)??!1)}),Object.defineProperty(document,"visibilityState",{configurable:!0,get:()=>simulatedPageHidden?"hidden":nativeVisibilityDescriptor?.get?.call(document)??"visible"})}catch{}}}function dispatchPageTransitionEvent(type){try{let event=typeof PageTransitionEvent=="function"?new PageTransitionEvent(type,{persisted:!1}):new Event(type);window.dispatchEvent(event)}catch{}}function dispatchActiveEvents(){for(let name of config2.activeEvents)try{document.dispatchEvent(new Event(name))}catch{}}function handlePageVisibility(hidden){if(hidden===simulatedPageHidden)return;installSimulatedVisibilityState(),simulatedPageHidden=hidden;let lifeCycleType=hidden?"onPageDisappear":"onPageAppear";for(let callback of megaLifeCycleListeners)emitMegaCallback(callback,{statusCode:1,type:lifeCycleType,data:{pageId:location.href}});try{document.dispatchEvent(new Event("visibilitychange"))}catch{}if(hidden){try{window.dispatchEvent(new Event("blur"))}catch{}dispatchPageTransitionEvent("pagehide");return}dispatchPageTransitionEvent("pageshow");try{window.dispatchEvent(new Event("focus"))}catch{}dispatchActiveEvents()}function resolveWindowFunction(path27){let parts=path27.split(".").filter(Boolean),owner=w;for(let index=0;index<parts.length-1;index+=1){let next=owner[parts[index]];if(!next||typeof next!="object")return null;owner=next}let fn=owner[parts[parts.length-1]];return typeof fn=="function"?fn.bind(owner):null}function handleNativeBack(){let megaHandled=!1;for(let callback of megaPageCloseListeners)megaHandled=!0,emitMegaCallback(callback,{statusCode:1,type:"onClose",data:{}});if(megaSystemBackListener&&(megaHandled=!0,emitMegaCallback(megaSystemBackListener,{statusCode:1,type:"onSuccess",data:{}})),megaHandled)return!0;let nativeBack=config2.nativeBack;if(!nativeBack)return!1;if(nativeBack.handler){let handler=resolveWindowFunction(nativeBack.handler);if(!handler)return!1;try{return handler(),!0}catch{return!1}}let controlled=!1;if(nativeBack.controlFunction){let control=resolveWindowFunction(nativeBack.controlFunction);if(!control)return!1;try{controlled=control()===!0}catch{return!1}if(!controlled)return!1}if(!nativeBack.event)return controlled;try{let event=new Event(nativeBack.event,{cancelable:!0});return document.dispatchEvent(event),controlled||event.defaultPrevented}catch{return controlled}}function handleAppMessage(message){if(!message||typeof message!="object")return;let payload=message;if(payload.kind==="megaBroadcast"){dispatchMegaBroadcast(payload);return}if(payload.kind==="megaKVStorage"){applyMegaKVMutation(payload);return}if(payload.kind==="legacyBroadcast"&&typeof payload.instanceId=="string"){try{let event=new CustomEvent(`Broadcast.Message.${payload.instanceId}`,{detail:payload.message});Object.defineProperty(event,"param",{configurable:!0,value:payload.message}),document.dispatchEvent(event)}catch{}return}if(payload.kind==="notification"&&typeof payload.name=="string"){let listener=notificationListeners.get(payload.name);listener&&setTimeout(()=>listener(payload.data),0);return}if(!(payload.kind!=="message"||!config2.messageEvent))try{document.dispatchEvent(new CustomEvent(config2.messageEvent,{detail:{data:payload.data}}))}catch{}}function sendAppMessage(message){if(isTop){handleAppMessage(message);return}window.top?.postMessage({source:SRC,type:"appMessageToOpener",message},"*")}function applyRuntimeResponses(responses){let current=config2.actions.responses??{};for(let[api,response]of Object.entries(responses))current[api]=response;config2.actions.responses=current}function parseFpt(value){let entries=[],normalized=value.trim();if(!normalized)return entries;let pattern3=/([0-9A-Za-z._-]+)\(([0-9A-Za-z._-]+)\)/g,consumed="";for(let match of normalized.matchAll(pattern3))consumed+=match[0],entries.push([match[1],match[2]]);return consumed===normalized?entries:[]}function setFptEntry(entries,key,value){entries.delete(key),entries.set(key,value)}function readInitialFptEntries(){let entries=new Map;try{for(let[key,value]of parseFpt(sessionStorage.getItem(FPT_STORAGE_KEY)??""))setFptEntry(entries,key,value)}catch{}try{let currentFpt=new URL(location.href).searchParams.get("fpt")??"";for(let[key,value]of parseFpt(currentFpt))setFptEntry(entries,key,value)}catch{}return entries}let fptEntries=readInitialFptEntries();function serializeFpt(entries){return Array.from(entries,([key,value])=>`${key}(${value})`).join("")}function persistFpt(){try{let value=serializeFpt(fptEntries);value?sessionStorage.setItem(FPT_STORAGE_KEY,value):sessionStorage.removeItem(FPT_STORAGE_KEY)}catch{}}function decorateUrlWithFpt(rawUrl){let targetUrl=mapScheme(rawUrl)??rawUrl;if(fptEntries.size===0)return targetUrl;try{let url2=new URL(targetUrl,location.href);if(url2.protocol!=="http:"&&url2.protocol!=="https:")return targetUrl;let merged=new Map(fptEntries);for(let[key,value]of parseFpt(url2.searchParams.get("fpt")??""))setFptEntry(merged,key,value);return url2.searchParams.set("fpt",serializeFpt(merged)),url2.href}catch{return targetUrl}}function classify(api){let a=config2.actions;return a.open.includes(api)?"open":a.close.includes(api)?"close":a.title.includes(api)?"title":a.navigationBar?.includes(api)?"navigationBar":a.statusBar?.includes(api)?"statusBar":a.systemInfo.includes(api)?"systemInfo":a.mtop.includes(api)?"mtop":a.kvGet?.includes(api)?"kvGet":a.kvSet?.includes(api)?"kvSet":a.kvDelete?.includes(api)?"kvDelete":a.pageContext?.includes(api)?"pageContext":a.responses&&Object.prototype.hasOwnProperty.call(a.responses,api)?"response":a.behaviors&&Object.prototype.hasOwnProperty.call(a.behaviors,api)?a.behaviors[api]:a.noop.includes(api)?"noop":"unknown"}function pickUrl(params){if(!params||typeof params!="object")return null;let p=params,candidates=[p.url,p.data?.url,p.param?.url,p.value?.params?.url];for(let c of candidates)if(typeof c=="string"&&c)return c;return null}function pickCloseData(params){if(params&&typeof params=="object"){let p=params;if("data"in p&&p.data!==void 0)return p.data;if(Object.keys(p).length>0)return p}}function decodeCookieValue2(raw){let value=raw;for(let i=0;i<2;i+=1)try{let decoded=decodeURIComponent(value);if(decoded===value)break;value=decoded}catch{break}return value.replace(/\\u([0-9a-f]{4})/gi,(_match,hex3)=>String.fromCharCode(Number.parseInt(hex3,16)))}function readCookie(name){let prefix=`${name}=`,pair=document.cookie.split(";").map(value=>value.trim()).find(value=>value.startsWith(prefix));return pair?decodeCookieValue2(pair.slice(prefix.length)):""}function readUserCookie(name){let pageUserCookie=w.userCookie;if(!pageUserCookie||typeof pageUserCookie!="object")return"";let value=pageUserCookie[name];return typeof value=="string"?decodeCookieValue2(value):""}function readFirstUserCookie(names){for(let name of names){let value=readCookie(name)||readUserCookie(name);if(value&&value!=="null")return value}return""}let cbSeq=0,callbacks={};function stashCallback(fn){if(typeof fn!="function")return 0;let id=++cbSeq;return callbacks[id]=fn,id}function extractQuery(url2,param){let q=url2.indexOf("?");if(q===-1)return null;for(let pair of url2.slice(q+1).split("&")){let eq=pair.indexOf("=");if(eq>0&&pair.slice(0,eq)===param)return pair.slice(eq+1)}return null}function matchesHostSuffix(hostname3,suffixes){if(!suffixes?.length)return!0;let normalizedHost=hostname3.toLowerCase().replace(/\.$/,"");return suffixes.some(value=>{let suffix=value.toLowerCase().replace(/^\./,"").replace(/\.$/,"");return normalizedHost===suffix||normalizedHost.endsWith(`.${suffix}`)})}function matchesRouteHost(rawUrl,suffixes){if(!suffixes?.length)return!0;try{let parsed=new URL(rawUrl,location.href),hostname3=parsed.protocol==="http:"||parsed.protocol==="https:"?parsed.hostname:location.hostname;return matchesHostSuffix(hostname3,suffixes)}catch{return matchesHostSuffix(location.hostname,suffixes)}}function resolveSchemeValue(raw,depth){if(depth>3)return null;let value=raw;try{value=decodeURIComponent(raw)}catch{}if(value.startsWith("{"))try{let found=pickUrl(JSON.parse(value));if(!found)return null;value=found}catch{return null}if(/^https?:/i.test(value))return value;if(/^[a-z][a-z0-9+.-]*:/i.test(value))return mapScheme(value,depth+1);let nestedUrl=extractQuery(value,"url");return nestedUrl?resolveSchemeValue(nestedUrl,depth+1):null}function mapScheme(url2,depth=0){if(depth>3)return null;let lower=url2.toLowerCase();for(let rule of config2.schemes){if(!matchesRouteHost(url2,rule.hostSuffixes))continue;let normalizedMatch=rule.match.toLowerCase(),matchedUrl=url2;if(!lower.startsWith(normalizedMatch)){if(!normalizedMatch.startsWith("/"))continue;try{let parsed=new URL(url2,location.href);if(matchedUrl=`${parsed.pathname}${parsed.search}${parsed.hash}`,!matchedUrl.toLowerCase().startsWith(normalizedMatch))continue}catch{continue}}if(rule.targetPath){let suffix=matchedUrl.slice(rule.match.length);if(suffix&&!suffix.startsWith("?")&&!suffix.startsWith("#"))continue;try{let source=new URL(matchedUrl),origin=location.origin;if(rule.targetHostPrefix){let hostname3=location.hostname.toLowerCase(),domainSuffix=hostname3==="wapa.taobao.com"||hostname3.endsWith(".wapa.taobao.com")?"wapa.taobao.com":hostname3==="m.taobao.com"||hostname3.endsWith(".m.taobao.com")?"m.taobao.com":"";domainSuffix&&(origin=`https://${rule.targetHostPrefix}.${domainSuffix}`)}let target=new URL(rule.targetPath,`${origin}/`);target.search=source.search,target.hash=source.hash;for(let[key,value]of Object.entries(rule.targetParams??{}))target.searchParams.has(key)||target.searchParams.set(key,value);return target.href}catch{return null}}if(!rule.param)continue;let raw=extractQuery(matchedUrl,rule.param);if(!raw)return null;let resolved=resolveSchemeValue(raw,depth);if(!resolved||!rule.useCurrentOrigin)return resolved;try{let target=new URL(resolved);return`${location.origin}${target.pathname}${target.search}${target.hash}`}catch{return resolved}}return null}function firstRouteParam(params,names){for(let name of names){let value=params.get(name);if(value)return value}return""}function resolvePaymentCallbackUrl(rawUrl,paymentPageUrl,useCurrentOrigin,forwardParams,resultParam){if(!rawUrl)return null;try{let target=new URL(rawUrl,location.href);for(let name of forwardParams){let value=paymentPageUrl.searchParams.get(name);value&&!target.searchParams.get(name)&&target.searchParams.set(name,value)}resultParam&&target.searchParams.set(resultParam.name,JSON.stringify(resultParam.value));let resolved=useCurrentOrigin&&(target.protocol==="http:"||target.protocol==="https:")?`${location.origin}${target.pathname}${target.search}${target.hash}`:target.href;return decorateUrlWithFpt(resolved)}catch{return null}}function openPaymentCallback(rawUrl,paymentPageUrl,useCurrentOrigin,forwardParams,resultParam){let target=resolvePaymentCallbackUrl(rawUrl,paymentPageUrl,useCurrentOrigin,forwardParams,resultParam);target&&requestOpen(target,0,!1)}function handleMiniProgramPaymentRoute(rawUrl){let paymentPageUrl;try{paymentPageUrl=new URL(rawUrl,location.href)}catch{return!1}let normalizedPathname=paymentPageUrl.pathname.replace(/\/+$/,"")||"/",rule=config2.miniProgram?.paymentRoutes?.find(candidate=>(candidate.pathname.replace(/\/+$/,"")||"/")===normalizedPathname&&matchesHostSuffix(paymentPageUrl.hostname,candidate.hostSuffixes));if(!rule)return!1;let successUrl=firstRouteParam(paymentPageUrl.searchParams,rule.successUrlParams),failureUrl=firstRouteParam(paymentPageUrl.searchParams,rule.failureUrlParams),forwardParams=rule.forwardParams??[],useCurrentOrigin=rule.useCurrentOrigin===!0,paymentParams;try{let parsed=JSON.parse(paymentPageUrl.searchParams.get(rule.paymentParamsParam)??"");if(!parsed||typeof parsed!="object"||Array.isArray(parsed))throw new Error;paymentParams=parsed,paymentParams.timeStamp!==void 0&&(paymentParams.timeStamp=String(paymentParams.timeStamp))}catch{return log2("微信支付参数解析失败,执行失败回跳",rawUrl),openPaymentCallback(failureUrl,paymentPageUrl,useCurrentOrigin,forwardParams),!0}return showPaymentDialog("wx.requestPayment",paymentParams,result=>{openPaymentCallback(successUrl,paymentPageUrl,useCurrentOrigin,forwardParams,rule.successResultParam?{name:rule.successResultParam,value:result}:void 0)},()=>{openPaymentCallback(failureUrl,paymentPageUrl,useCurrentOrigin,forwardParams)}),!0}function finishMiniProgramNativeRoute(action,result,storageId){handleResume({data:action==="subscribeMessage"?result:void 0,storageId,callbackId:0,final:!0})}function handleMiniProgramNativeRoute(rawUrl){let nativePageUrl;try{nativePageUrl=new URL(rawUrl,location.href)}catch{return!1}let normalizedPathname=nativePageUrl.pathname.replace(/\/+$/,"")||"/",action=nativePageUrl.searchParams.get("action");if(action!=="navigateMiniProgram"&&action!=="subscribeMessage"||!config2.miniProgram?.nativeRoutes?.find(candidate=>(candidate.pathname.replace(/\/+$/,"")||"/")===normalizedPathname&&candidate.actions.includes(action)&&matchesHostSuffix(nativePageUrl.hostname,candidate.hostSuffixes)))return!1;let params={};nativePageUrl.searchParams.forEach((value,name)=>{params[name]=value});let storageId=nativePageUrl.searchParams.get("__storage_id");return handlePageVisibility(!0),showMiniProgramActionDialog(action,params,result=>finishMiniProgramNativeRoute(action,result,storageId),result=>finishMiniProgramNativeRoute(action,result,storageId)),!0}function handleMiniProgramPostMessage(data){let rules=config2.miniProgram?.messageRules;if(!rules?.length)return!1;let messages=Array.isArray(data)?data:[data],handled=!1;for(let value of messages){if(!value||typeof value!="object"||Array.isArray(value))continue;let message=value;if(typeof message.type!="string")continue;let rule=rules.find(candidate=>candidate.type===message.type&&matchesHostSuffix(location.hostname,candidate.hostSuffixes));rule&&(handled=!0,rule.action==="stageBackData"?(pendingMiniProgramBackData=message.data,hasPendingMiniProgramBackData=!0):rule.action==="closeAll"&&(isTop?requestCloseAll(message.data)||requestClose(message.data):window.top?.postMessage({source:SRC,type:"closeAll",data:message.data},"*")))}return handled}function matchesImagePickerScheme(url2){let lower=url2.toLowerCase();return config2.imagePicker?.schemes.some(scheme=>lower.startsWith(scheme))===!0}function createImagePickerCallbackId(){try{if(typeof crypto.randomUUID=="function")return crypto.randomUUID()}catch{}return`${Date.now()}-${Math.random().toString(36).slice(2)}`}function handleMaybeScheme(url2){if(typeof url2!="string"||!url2||!/^[a-z][a-z0-9+.-]*:/i.test(url2)||/^(https?|about|blob|data|javascript):/i.test(url2))return!1;let mapped=mapScheme(url2);return mapped?(log2("scheme 映射为 H5 open:",url2,"→",mapped),requestOpen(decorateUrlWithFpt(mapped),0,!1)):log2("外部 scheme 已拦截(真机表现为唤端):",url2),!0}function handleResume(msg){let{data,storageId,callbackId,final,gotoEvent,silent}=msg;if(gotoEvent&&dispatchGotoEvent(data),callbackId&&callbacks[callbackId]){if(!silent)try{callbacks[callbackId]({backdata:data})}catch(e){console.error(TAG,"callbackCommand 执行失败",e)}final&&delete callbacks[callbackId]}if(data&&typeof data=="object"&&storageId)try{let d={...data};d.__$data=!0,d.__$storageId=String(storageId),localStorage.setItem("XPI_BACK_LISTENER_DATA_STORAGE",JSON.stringify(d))}catch{}simulatedPageHidden?handlePageVisibility(!1):dispatchActiveEvents()}function dispatchGotoEvent(data){if(data!==void 0)try{document.dispatchEvent(new CustomEvent("WV.GotoEvent",{detail:{data}}))}catch{}}function sendUserTrack(params){if(!params||typeof params!="object")return;let p=params,logkey=typeof p.logkey=="string"?p.logkey:"",gmkey=typeof p.gmkey=="string"?p.gmkey:typeof p.event=="string"?p.event:"",gokey=typeof p.gokey=="string"?p.gokey:"";if(!/^\/[0-9A-Za-z._/-]+$/.test(logkey)||!/^[0-9A-Za-z_-]+$/.test(gmkey))return;let pageWindow=w,aplus=pageWindow.goldlog??pageWindow.aplus;if(typeof aplus?.send!="function")return;let configuredHost=aplus.getMetaInfo?.("aplus-rhost-g"),host2=(typeof configuredHost=="string"?configuredHost:"gm.mmstat.com").replace(/^https?:\/\//i,"").replace(/^\/\//,"").split("/")[0];if(!(!host2||!/^[0-9A-Za-z.-]+$/.test(host2)))try{aplus.send(`//${host2}${logkey}`,`gmkey=${encodeURIComponent(gmkey)}&gokey=${gokey}&ts=${Date.now()}`,"GET")}catch{}}function readNetworkState(){let connection=navigator.connection;return navigator.onLine?connection?.type==="wifi"?"wifi":connection?.effectiveType??"unknown":"fail"}function networkTypeNumber(state){return{wifi:2,"slow-2g":3,"2g":3,"3g":4,"4g":5,"5g":6,fail:7}[state]??0}function emitVoiceRecognitionEvent(name,detail){try{document.dispatchEvent(new CustomEvent(name,{detail}))}catch{}}function browserSpeechRecognitionConstructor(){let candidate=w.SpeechRecognition??w.webkitSpeechRecognition;return typeof candidate=="function"?candidate:null}function voiceRecognitionLanguage(){let language=config2.language||navigator.language||"zh-CN";return/^zh-hans$/i.test(language)?"zh-CN":/^zh-hant$/i.test(language)?"zh-TW":language}function localVoiceRecognitionLanguage(language){return/^zh-(cn|hans)$/i.test(language)?"cmn-Hans-CN":/^zh-(tw|hant)$/i.test(language)?"cmn-Hant-TW":language}function detachVoiceRecognition(recognition){recognition.onstart=null,recognition.onresult=null,recognition.onerror=null,recognition.onend=null,recognition.onspeechstart=null,recognition.onspeechend=null}function finishVoiceRecognition(recognition,status){if(voiceRecognition!==recognition)return;let content=voiceRecognitionInterimTranscript.trim()||voiceRecognitionTranscript.trim();voiceRecognition=null,voiceRecognitionSession+=1,voiceRecognitionRunning=!1,voiceRecognitionStopping=!1,voiceRecognitionInterimTranscript="",detachVoiceRecognition(recognition),emitVoiceRecognitionEvent("WV.Voicetone",{tone:0}),emitVoiceRecognitionEvent("WV.VoiceRecog",{content,finished:!0,status})}function cancelVoiceRecognition(notifyPage){let recognition=voiceRecognition;if(recognition){voiceRecognition=null,voiceRecognitionSession+=1,voiceRecognitionRunning=!1,voiceRecognitionStopping=!1,voiceRecognitionInterimTranscript="",detachVoiceRecognition(recognition);try{recognition.abort()}catch{}emitVoiceRecognitionEvent("WV.Voicetone",{tone:0}),notifyPage&&emitVoiceRecognitionEvent("WV.VoiceRecogFailed",{status:2})}}function startVoiceRecognition(succeed,failed){cancelVoiceRecognition(!1);let SpeechRecognition=browserSpeechRecognitionConstructor();if(!SpeechRecognition){let error48={error_code:-1,error_message:"speech recognition unavailable"};emitVoiceRecognitionEvent("WV.VoiceRecogFailed",{status:-1,...error48}),failed(error48);return}let recognition=new SpeechRecognition,session=++voiceRecognitionSession;voiceRecognition=recognition,voiceRecognitionTranscript="",voiceRecognitionInterimTranscript="",voiceRecognitionStopping=!1,voiceRecognitionRunning=!1,recognition.continuous=!0,recognition.interimResults=!0,recognition.maxAlternatives=1,recognition.lang=voiceRecognitionLanguage();let isCurrent=()=>voiceRecognition===recognition&&voiceRecognitionSession===session,recognitionFailed=!1,failRecognition=(message,code)=>{if(!isCurrent()||recognitionFailed)return;recognitionFailed=!0;let error48={error_code:-1,error_message:message,error:code};voiceRecognition=null,voiceRecognitionSession+=1,voiceRecognitionRunning=!1,voiceRecognitionStopping=!1,detachVoiceRecognition(recognition);try{recognition.abort()}catch{}emitVoiceRecognitionEvent("WV.Voicetone",{tone:0}),emitVoiceRecognitionEvent("WV.VoiceRecogFailed",{status:-1,...error48}),failed(error48)},beginRecognition=()=>{if(isCurrent())try{recognition.start(),voiceRecognitionRunning=!0,succeed({})}catch(error48){failRecognition(error48 instanceof Error?error48.message:"speech recognition start failed","start-failed")}};recognition.onstart=()=>{isCurrent()&&(voiceRecognitionRunning=!0)},recognition.onspeechstart=()=>{isCurrent()&&emitVoiceRecognitionEvent("WV.Voicetone",{tone:10})},recognition.onspeechend=()=>{isCurrent()&&emitVoiceRecognitionEvent("WV.Voicetone",{tone:0})},recognition.onresult=event=>{if(!isCurrent()||!event.results)return;let interimTranscript="",startIndex=Math.max(0,event.resultIndex??0);for(let index=startIndex;index<event.results.length;index+=1){let result=event.results[index],transcript=result?.[0]?.transcript??"";result?.isFinal?voiceRecognitionTranscript+=transcript:interimTranscript+=transcript}let content=`${voiceRecognitionTranscript}${interimTranscript}`.trim();voiceRecognitionInterimTranscript=content,content&&emitVoiceRecognitionEvent("WV.VoiceRecogPartial",{content})},recognition.onerror=event=>{if(!isCurrent())return;let code=event.error??"unknown";code!=="no-speech"&&(code==="aborted"&&voiceRecognitionStopping||failRecognition(event.message||`speech recognition failed: ${code}`,code))},recognition.onend=()=>{if(isCurrent()){if(voiceRecognitionRunning=!1,voiceRecognitionStopping){finishVoiceRecognition(recognition,1);return}setTimeout(()=>{if(!(!isCurrent()||voiceRecognitionStopping))try{recognition.start(),voiceRecognitionRunning=!0}catch(error48){failRecognition(error48 instanceof Error?error48.message:"speech recognition restart failed","restart-failed")}},0)}};let localLanguage=localVoiceRecognitionLanguage(recognition.lang);if(typeof recognition.processLocally=="boolean"&&typeof SpeechRecognition.available=="function"){SpeechRecognition.available({langs:[localLanguage],processLocally:!0}).then(availability=>{if(isCurrent()){if(availability==="available"){recognition.lang=localLanguage,recognition.processLocally=!0,beginRecognition();return}if((availability==="downloadable"||availability==="downloading")&&typeof SpeechRecognition.install=="function"){showAppToast({message:"正在准备语音识别,首次使用可能需要一些时间",milliseconds:3e3}),SpeechRecognition.install({langs:[localLanguage],processLocally:!0}).then(installed=>{if(!installed){isCurrent()&&beginRecognition();return}if(!isCurrent()){showAppToast({message:"语音识别已准备好,请再试一次",milliseconds:3e3});return}recognition.lang=localLanguage,recognition.processLocally=!0,beginRecognition()}).catch(()=>beginRecognition());return}beginRecognition()}}).catch(()=>beginRecognition());return}beginRecognition()}function calendarTimestamp(value){if(typeof value=="number"&&Number.isFinite(value))return value;if(typeof value!="string"||!value.trim())return null;let numeric=Number(value);if(Number.isFinite(numeric)&&numeric>0)return numeric;let parsed=Date.parse(value);return Number.isFinite(parsed)?parsed:null}function calendarEventFromParams(params){let p=params&&typeof params=="object"?params:{},stringValue=(...values)=>values.find(value=>typeof value=="string")??"";return{title:stringValue(p.calendar_title,p.title),startTime:calendarTimestamp(p.calendar_start_ms??p.start_time??p.calendar_start_datetime),endTime:calendarTimestamp(p.calendar_end_ms??p.end_time??p.calendar_end_datetime),url:stringValue(p.calendar_url,p.url),note:stringValue(p.calendar_note,p.note),location:stringValue(p.calendar_location,p.location)}}function readCalendarEvents(){try{let parsed=JSON.parse(localStorage.getItem(CALENDAR_STORAGE_KEY)??"[]");return Array.isArray(parsed)?parsed.filter(event=>event!==null&&typeof event=="object"&&typeof event.title=="string"):[]}catch{return[]}}function writeCalendarEvents(events){try{return localStorage.setItem(CALENDAR_STORAGE_KEY,JSON.stringify(events)),!0}catch{return!1}}function sameCalendarEvent(stored,candidate){return candidate.url?stored.url===candidate.url:!!candidate.title&&stored.title===candidate.title&&(candidate.startTime===null||stored.startTime===candidate.startTime)&&(candidate.endTime===null||stored.endTime===candidate.endTime)}function calendarEventResponse(event){return{title:event.title,start_time:event.startTime,end_time:event.endTime,url:event.url,note:event.note,location:event.location}}function dispatch(api,params,onSuccess,onFailure,callbackCommandFn){let succeed=value=>{onSuccess&&setTimeout(()=>onSuccess(value),0)},failed=reason=>{onFailure&&setTimeout(()=>onFailure(reason),0)},kind=classify(api),silent=config2.actions.silent?.includes(api)===!0;if(silent||log2("桥调用",api,`(${kind})`,params??""),kind==="open"||kind==="navigate"){let p=params&&typeof params=="object"?params:{},navigationData=p.data&&typeof p.data=="object"?p.data:void 0;if(kind==="navigate"&&navigationData?.type==="back"){isTop?requestCloseAll(navigationData.data,!0)||dispatchGotoEvent(navigationData.data):window.top?.postMessage({source:SRC,type:"closeAll",data:navigationData.data,gotoEvent:!0},"*"),succeed({});return}let url2=pickUrl(params);if(!url2){failed("missing url");return}if(matchesImagePickerScheme(url2)){openImagePicker({maxSelect:1,capture:!1},urls=>{let pic=urls[0];pic&&typeof callbackCommandFn=="function"&&callbackCommandFn({pic,uuid:createImagePickerCallbackId(),timeStamp:Date.now()})},error48=>console.error(TAG,"图片选择失败:",error48)),succeed({});return}if(handleMiniProgramPaymentRoute(url2)){succeed({});return}if(handleMiniProgramNativeRoute(url2)){succeed({});return}let wd=p.useWebdialog===!0||p.useWebdialog==="true"||p.useWebdialog===1||p.useWebdialog==="1";requestOpen(decorateUrlWithFpt(url2),stashCallback(callbackCommandFn),wd,p),succeed({});return}if(kind==="closeAll"){isTop?requestCloseAll(void 0):window.top?.postMessage({source:SRC,type:"closeAll"},"*"),succeed({});return}if(kind==="closeBackData"){let p=params&&typeof params=="object"?params:{};requestClose(Object.prototype.hasOwnProperty.call(p,"backdata")?p.backdata:pickCloseData(p)),succeed({});return}if(kind==="close"){if(api==="navigateBack"&&hasPendingMiniProgramBackData){let data=pendingMiniProgramBackData;pendingMiniProgramBackData=void 0,hasPendingMiniProgramBackData=!1,requestClose(data)}else requestClose(pickCloseData(params));succeed({});return}if(kind==="postMessage"){let p=params&&typeof params=="object"?params:{},data=p.data??p;handleMiniProgramPostMessage(data)||sendAppMessage({kind:"message",data}),succeed({});return}if(kind==="notifySubscribe"){let p=params&&typeof params=="object"?params:{};if(typeof p.name!="string"||!p.name){failed("missing notification name");return}onSuccess&&notificationListeners.set(p.name,onSuccess);return}if(kind==="notifyUnsubscribe"){let p=params&&typeof params=="object"?params:{};typeof p.name=="string"&&notificationListeners.delete(p.name),succeed({});return}if(kind==="notifyPost"){let p=params&&typeof params=="object"?params:{};if(typeof p.name!="string"||!p.name){failed("missing notification name");return}sendAppMessage({kind:"notification",name:p.name,data:p.data}),succeed({});return}if(kind==="sharedFileRead"||kind==="sharedFileWrite"||kind==="sharedDataGet"||kind==="sharedDataSet"){requestContainerData(kind,params&&typeof params=="object"?params:{},succeed,failed);return}if(kind==="legacyBroadcastCreate"||kind==="legacyBroadcastPost"||kind==="legacyBroadcastClose"){requestContainerData(kind,params&&typeof params=="object"?params:{},succeed,failed);return}if(kind==="title"){let title=params&&typeof params=="object"?params.title??params.name:void 0;if(typeof title=="string"&&title){systemBars.markStateExplicit();try{document.title=title,syncSimulatedTitleBar()}catch{}isTop||window.top?.postMessage({source:SRC,type:"title",title},"*")}succeed({});return}if(kind==="navigationBar"){applyNavigationBarState(api,params),succeed({});return}if(kind==="statusBar"){applyStatusBarState(params),succeed({});return}if(kind==="systemInfo"){let model=config2.globals.__DEVICE_MODEL__||"iPhone",info={language:config2.language,model,systemVersion:config2.systemVersion,statusBarHeight:config2.statusBarHeight,platform:config2.platform,brand:config2.platform==="iOS"?"Apple":"Android",client_version:config2.globals.__APP_VERSION__??"",client_type:config2.clientType};succeed(api==="WVNativeDetector.getModelInfo"?{...info,platform:model}:info);return}if(kind==="mtop"){callMtop(params??{},onSuccess,onFailure);return}if(kind==="mtopStream"){callMtopStream(params??{},succeed,failed);return}if(kind==="kvGet"||kind==="kvSet"||kind==="kvDelete"){let p=params&&typeof params=="object"?params:{},key=typeof p.key=="string"?p.key:"";if(!key){failed("missing key");return}try{let storageKey=`__mearl_app_kv__:${key}`;if(kind==="kvGet"){let stored=localStorage.getItem(storageKey);stored!==null?succeed(stored):failed(JSON.stringify({ret:["HY_FAILED"],msg:"key not found"}))}else if(kind==="kvSet"){let value=typeof p.value=="string"?p.value:p.value===void 0?"":JSON.stringify(p.value);localStorage.setItem(storageKey,value),succeed({})}else localStorage.removeItem(storageKey),succeed({})}catch{failed(JSON.stringify({ret:["HY_FAILED"],msg:"kv storage unavailable"}))}return}if(kind==="pageContext"){succeed({pageContext:void 0});return}if(kind==="memoryGet"||kind==="memorySet"||kind==="memoryDelete"){let p=params&&typeof params=="object"?params:{},key=typeof p.key=="string"?p.key:"";if(!key){failed({error_message:"missing key"});return}try{let storageKey=`__mearl_app_memory__:${key}`;if(kind==="memoryGet"){let value=sessionStorage.getItem(storageKey);succeed(value===null?{}:{value})}else if(kind==="memorySet"){let value=typeof p.value=="string"?p.value:p.value===void 0?"":JSON.stringify(p.value);sessionStorage.setItem(storageKey,value),succeed({key,success:!0})}else sessionStorage.removeItem(storageKey),succeed({key,success:!0})}catch{failed({error_message:"memory cache unavailable"})}return}if(kind==="availabilityMap"){let p=params&&typeof params=="object"?params:{},channels=Array.isArray(p.data)?p.data.filter(value=>typeof value=="string"):[];succeed({res:"success",data:Object.fromEntries(channels.map(channel=>[channel,!1]))});return}if(kind==="userInfo"){let userId=readFirstUserCookie(["unb"]),userName=readFirstUserCookie(["_w_tb_nick","_nk_","snk","tracknick"]);callUserInfo({...userId&&{userId},...userName&&{userName}},succeed);return}if(kind==="authCode"){callAuthCode(params,succeed,failed);return}if(kind==="networkInfo"){let state=readNetworkState();if(api==="WVNetwork.getNetworkType"){succeed({type:{wifi:"WIFI","slow-2g":"2G","2g":"2G","3g":"3G","4g":"4G"}[state]??"UNKNOWN"});return}if(config2.policies?.networkResult==="alipay"){succeed({networkAvailable:state!=="fail",networkType:{wifi:"WIFI","slow-2g":"2G","2g":"2G","3g":"3G","4g":"4G",fail:"NOTREACHABLE"}[state]??"UNKNOWN"});return}let type=networkTypeNumber(state);succeed({type,state:state==="slow-2g"?"2g":state});return}if(kind==="networkQualityMonitor"){let p=params&&typeof params=="object"?params:{},action=typeof p.action=="string"?p.action:"";if(action==="add_notify_network_quality"){if(!stopNetworkQualityMonitor){let notify=()=>{try{document.dispatchEvent(new CustomEvent("WV.NETWORK_TYPE_CHANGED",{detail:{new_network_type:networkTypeNumber(readNetworkState())}}))}catch{}},connection=navigator.connection;window.addEventListener("online",notify),window.addEventListener("offline",notify),connection?.addEventListener?.("change",notify),stopNetworkQualityMonitor=()=>{window.removeEventListener("online",notify),window.removeEventListener("offline",notify),connection?.removeEventListener?.("change",notify)}}succeed({});return}if(action==="remove_notify_network_quality"){stopNetworkQualityMonitor?.(),stopNetworkQualityMonitor=null,succeed({});return}failed({error_message:"unsupported network quality monitor action"});return}if(kind==="voiceRecognition"){let status=Number((params&&typeof params=="object"?params:{}).status);if(status===0){startVoiceRecognition(succeed,failed);return}if(status===1){let recognition=voiceRecognition;if(recognition)if(voiceRecognitionStopping=!0,voiceRecognitionRunning)try{recognition.stop()}catch{finishVoiceRecognition(recognition,1)}else finishVoiceRecognition(recognition,1);succeed({});return}if(status===2){cancelVoiceRecognition(!0),succeed({});return}failed({error_code:-1,error_message:"unsupported voice recognition status"});return}if(kind==="beaconRequest"){let url2=pickUrl(params);if(!url2){failed({error_message:"missing url"});return}try{let resolved=new URL(url2,location.href);if(resolved.protocol!=="http:"&&resolved.protocol!=="https:"){failed({error_message:"unsupported request protocol"});return}let image=new Image;image.referrerPolicy="no-referrer-when-downgrade",image.src=resolved.href,succeed({})}catch{failed({error_message:"invalid url"})}return}if(kind==="calendar"){let p=params&&typeof params=="object"?params:{},events=readCalendarEvents();if(api==="store_calendar_event"){let event=calendarEventFromParams(p);if(!event.title||event.startTime===null){failed({error_message:"calendar title and start time are required"});return}let next=events.filter(stored=>!sameCalendarEvent(stored,event));if(next.push(event),!writeCalendarEvents(next)){failed({error_message:"calendar storage unavailable"});return}succeed({success:!0});return}if(api==="remove_calendar_event"){let candidate=calendarEventFromParams(p),next=events.filter(stored=>!sameCalendarEvent(stored,candidate));if(!writeCalendarEvents(next)){failed({error_message:"calendar storage unavailable"});return}succeed({success:!0,removed:events.length-next.length});return}if(api==="check_batch_calendar"){let batch=Array.isArray(p.batch)?p.batch:[];succeed({batch:batch.map(item=>{let candidate=calendarEventFromParams(item);return{...item&&typeof item=="object"?item:{},success:events.some(stored=>sameCalendarEvent(stored,candidate))}})});return}let urls=Array.isArray(p.urls)?p.urls.filter(value=>typeof value=="string"):typeof p.url=="string"?[p.url]:[],titles=Array.isArray(p.calendar_titles)?p.calendar_titles.filter(value=>typeof value=="string"):typeof p.calendar_title=="string"?[p.calendar_title]:[],matched=events.filter(event=>(urls.length===0||urls.includes(event.url))&&(titles.length===0||titles.includes(event.title)));succeed({events:matched.map(calendarEventResponse)});return}if(kind==="geolocation"){let p=params&&typeof params=="object"?params:{},windvane=api==="WVLocation.getLocation",wechat=api==="getLocation"&&config2.bridges.some(bridge=>bridge.style==="wechat"),failLocation=(errorCode,errorMsg)=>{failed({errorCode,errorMsg,...windvane&&{ret:["HY_FAILED"],errMsg:errorCode===1?"PERMISSION_DENIED":"POSITION_UNAVAILABLE",message:errorMsg},...wechat&&{errMsg:`getLocation:fail ${errorMsg}`}})};if(wechat&&p.type&&p.type!=="wgs84"){failLocation(2,`unsupported coordinate type: ${String(p.type)}`);return}if(!navigator.geolocation){failLocation(2,"geolocation unavailable");return}let locate=()=>navigator.geolocation.getCurrentPosition(position=>{let{latitude,longitude,accuracy,altitude,altitudeAccuracy,heading,speed}=position.coords,coords={latitude,longitude,accuracy,altitude,altitudeAccuracy,heading,speed};if(api==="lbs"){let provider=config2.geolocation;if(!provider){failLocation(2,"reverse geocoding unavailable");return}callMtop({api:provider.reverseGeocodeApi,v:provider.version,data:{latitude,longitude,includeGJ:1},timeout:5e3},value=>{let response=value??{},address=response.data??{};if(!Array.isArray(response.ret)||!response.ret.some(ret=>typeof ret=="string"&&ret.startsWith("SUCCESS::"))||typeof address.cityName!="string"||!address.cityName.trim()||typeof address.cityCode!="string"||!address.cityCode.trim()){failLocation(2,"reverse geocoding returned no city");return}succeed({...coords,timestamp:position.timestamp,country:address.country,province:address.province,district:address.district,city:address.cityName,cityName:address.cityName,cityCode:address.cityCode,divisionId:address.divisionId,iataCode:address.iataCode,address:address.detail})},()=>failLocation(2,"reverse geocoding failed"));return}succeed(windvane?{ret:["HY_SUCCESS"],coords,timestamp:position.timestamp}:{...coords,timestamp:position.timestamp,...wechat&&{errMsg:"getLocation:ok"}})},error48=>failLocation(error48.code,error48.message),{enableHighAccuracy:p.enableHighAccuracy===!0||p.enableHighAcuracy===!0,timeout:1e4,maximumAge:p.useCache===!1?0:3e5});navigator.permissions?.query?navigator.permissions.query({name:"geolocation"}).then(status=>{status.state==="granted"?locate():failLocation(1,"location permission not granted")}).catch(locate):locate();return}if(kind==="permission"){let p=params&&typeof params=="object"?params:{},action=typeof p.action=="string"?p.action:"",permission=typeof p.permission=="string"?p.permission:"",permissionFailed=message=>failed({error_code:-1,error_message:message});if(permission==="album"||permission==="MODIFY_AUDIO_SETTINGS"){action==="check"||action==="request"?succeed({}):permissionFailed("unsupported permission action");return}let browserPermission=permission==="mic"?"microphone":permission==="camera"?"camera":permission==="lbs"?"geolocation":"";if(!browserPermission){permissionFailed("unsupported permission");return}if(action==="check"&&navigator.permissions?.query){navigator.permissions.query({name:browserPermission}).then(status=>{status.state==="granted"?succeed({}):permissionFailed("permission not granted")}).catch(()=>permissionFailed("permission check failed"));return}if(action==="request"&&(permission==="mic"||permission==="camera")){if(!navigator.mediaDevices?.getUserMedia){permissionFailed("media permission unavailable");return}navigator.mediaDevices.getUserMedia({audio:permission==="mic",video:permission==="camera"}).then(stream=>{for(let track of stream.getTracks())track.stop();succeed({})}).catch(()=>permissionFailed("permission denied"));return}if(action==="request"&&permission==="lbs"&&navigator.geolocation){navigator.geolocation.getCurrentPosition(()=>succeed({}),()=>permissionFailed("permission denied"),{timeout:1e4});return}permissionFailed("unsupported permission action");return}if(kind==="imagePicker"){let p=params&&typeof params=="object"?params:{},requestedMaxSelect=Number(p.maxSelect??p.max_select),maxSelect=Number.isFinite(requestedMaxSelect)?requestedMaxSelect:1,pickType=Number(p.pickType??p.pick_type),uploadType=Number(p.uploadType??p.upload_type);openImagePicker({maxSelect,capture:pickType===1,resultType:uploadType===3?"dataUrl":"uploadedUrl"},urls=>succeed({imgUrls:urls}),failed);return}if(kind==="prefetch"){let p=params&&typeof params=="object"?params:{},url2=typeof p.url=="string"?p.url:"";if(!url2){failed({code:-1,errorMsg:"url is empty"});return}let resolvedUrl;try{resolvedUrl=new URL(url2,location.href).href}catch{failed({code:-1,errorMsg:"invalid url"});return}if(!Array.from(document.querySelectorAll('link[rel="prefetch"]')).some(link=>link.href===resolvedUrl)){let link=document.createElement("link");link.rel="prefetch",link.href=url2,(document.head??document.documentElement).appendChild(link)}succeed({});return}if(kind==="fptTrack"){let p=params&&typeof params=="object"?params:{},action=typeof p.action=="string"?p.action:"",actionParams=p.params&&typeof p.params=="object"?p.params:{},key=typeof actionParams.key=="string"?actionParams.key:"";if(action==="setFpt"){let value=typeof actionParams.value=="string"?actionParams.value:"";if(!key||!value||!/^[0-9A-Za-z._-]+$/.test(key)||!/^[0-9A-Za-z._-]+$/.test(value)||`${key}(${value})`.length>100){failed({error_message:"invalid fpt key or value"});return}setFptEntry(fptEntries,key,value),persistFpt()}else action==="deleteFpt"&&key&&(fptEntries.delete(key),persistFpt());succeed({});return}if(kind==="previewFile"){let p=params&&typeof params=="object"?params:{},fileUrl=typeof p.file_url=="string"?p.file_url:"",remoteUrl=typeof p.file_remote_url=="string"?p.file_remote_url:"",url2=(fileUrl.startsWith("http")?fileUrl:remoteUrl)||fileUrl||remoteUrl;url2?(requestOpen(url2,0,!1),succeed({})):failed({code:-1,errorMsg:"file_url is empty"});return}if(kind==="toast"){let error48=showAppToast(params);error48?failed({error_message:error48}):succeed({});return}if(kind==="unsupportedNativeInput"){let containerType="";try{containerType=new URL(location.href).searchParams.get("containerType")??""}catch{}!unsupportedNativeInputNotified&&(containerType==="h5_dx"||containerType==="flutter_h5")&&(unsupportedNativeInputNotified=!0,showAppToast({message:"当前页面使用原生输入框,请移除 URL 中的 containerType 参数以正常操作",milliseconds:4e3})),succeed({});return}if(kind==="payment"){log2("桥调用支付,等待用户确认",api,params),showPaymentDialog(api,params,succeed,failed);return}if(kind==="userTrack"){sendUserTrack(params),succeed({});return}if(kind==="response"){succeed(config2.actions.responses?.[api]);return}if(kind==="noop"){succeed({});return}silent||log2("未覆盖桥方法,回调 failure(页面库将走 H5 兜底):",api),failed(NOT_IMPLEMENTED_PAYLOAD)}let MEGA_SUPPORTED_APIS={stdPop:["showWeex2","showWeex","showH5","changeSize","close"],broadcast:["addEventListener","dispatchEvent","removeEventListener"],kvStorage:["setItem","getItem","removeItem","getAllKeys","clear","getCurrentInfo","getCurrentInfoAndKeys"],LifeCycle:["addPageLifeCycleListener","removePageLifeCycleListener"],Container:["interceptPageClose","disableInterceptPageClose"],navigator:["openURL","close","replace","setSystemBackBlockListener","removeSystemBackBlockListener"],NavBar:["setTitle"],Router:["popPage"]};function isMegaApiSupported(ability,api){return typeof ability=="string"&&typeof api=="string"&&MEGA_SUPPORTED_APIS[ability]?.includes(api)===!0}function megaParams(value){return value&&typeof value=="object"&&!Array.isArray(value)?value:{}}function megaError(callback,statusCode,message){emitMegaCallback(callback,{statusCode,type:"result",data:{errorMessage:typeof message=="string"?message:String(message??"")}})}function cloneMegaDetail(value){if(value===void 0)return{success:!0,value:void 0};try{return{success:!0,value:JSON.parse(JSON.stringify(value))}}catch{return{success:!1}}}function megaSuccess(data={}){return{statusCode:0,type:"result",data}}function megaFailure(message){return{statusCode:500,type:"result",data:{errorMessage:message}}}function megaKVParams(params){return{bizId:typeof params.bizID=="string"?params.bizID:typeof params.bizId=="string"?params.bizId:"",key:typeof params.key=="string"?params.key:"",value:typeof params.value=="string"?params.value:null}}function megaStringByteLength(value){try{return typeof TextEncoder=="function"?new TextEncoder().encode(value).length:value.length}catch{return value.length}}function megaKVUsedSize(entries){let size=0;for(let value of entries.values())size+=megaStringByteLength(value);return size}function reportMegaKVMutation(operation,bizId,key="",value,onSuccess,onFailure){requestContainerData("megaKVMutation",{operation,bizId,key,...value===void 0?{}:{value}},()=>onSuccess?.(),reason=>{log2("KVStorage 容器同步失败:",reason),onFailure?.(reason)})}function completeMegaKVMutation(operation,bizId,key,value,synchronous,callback){let result=megaSuccess();return reportMegaKVMutation(operation,bizId,key,value,synchronous?void 0:()=>emitMegaCallback(callback,result),synchronous?void 0:reason=>emitMegaCallback(callback,megaFailure(String(reason??"container sync failed")))),synchronous?result:null}function executeMegaKVStorage(api,params,synchronous,callback){let{bizId,key,value}=megaKVParams(params);if(!bizId)return megaFailure("missing bizID");let entries=megaKVStorage.get(bizId)??new Map;if(api==="setItem"){if(!key)return megaFailure("missing key");if(value===null||value==="")return megaFailure("missing value");let previousSize=megaStringByteLength(entries.get(key)??"");return megaKVUsedSize(entries)-previousSize+megaStringByteLength(value)>MEGA_KV_TOTAL_SIZE?megaFailure("KVStorage quota exceeded"):(entries.set(key,value),megaKVStorage.set(bizId,entries),megaKVMutationVersion+=1,persistMegaKVStorage(),completeMegaKVMutation("set",bizId,key,value,synchronous,callback))}if(api==="getItem"){if(!key)return megaFailure("missing key");let result=entries.get(key)??"";return megaSuccess(synchronous?{result}:result)}if(api==="removeItem")return key?(entries.delete(key),entries.size===0&&megaKVStorage.delete(bizId),megaKVMutationVersion+=1,persistMegaKVStorage(),completeMegaKVMutation("remove",bizId,key,void 0,synchronous,callback)):megaFailure("missing key");if(api==="getAllKeys"){let result=Array.from(entries.keys());return megaSuccess(synchronous?{result}:result)}if(api==="clear")return megaKVStorage.delete(bizId),megaKVMutationVersion+=1,persistMegaKVStorage(),completeMegaKVMutation("clear",bizId,"",void 0,synchronous,callback);if(api==="getCurrentInfo"||api==="getCurrentInfoAndKeys"){let data={totalSize:MEGA_KV_TOTAL_SIZE,freeSize:Math.max(MEGA_KV_TOTAL_SIZE-megaKVUsedSize(entries),0)};return api==="getCurrentInfoAndKeys"&&(data.keys=Array.from(entries.keys())),megaSuccess(data)}return{statusCode:405,type:"result",data:{}}}function handleMegaLifeCycle(api,callback){if(api==="addPageLifeCycleListener"){callback&&megaLifeCycleListeners.add(callback),emitMegaCallback(callback,megaSuccess());return}if(api==="removePageLifeCycleListener"){let listeners=Array.from(megaLifeCycleListeners);megaLifeCycleListeners.clear(),emitMegaCallback(callback,megaSuccess());for(let listener of listeners)emitMegaCallback(listener,{statusCode:99,type:"finish",data:{}});return}megaError(callback,405,`LifeCycle.${api} is not supported`)}function handleMegaContainer(api,callback){if(api==="interceptPageClose"){callback&&megaPageCloseListeners.add(callback),emitMegaCallback(callback,megaSuccess());return}if(api==="disableInterceptPageClose"){let listeners=Array.from(megaPageCloseListeners);megaPageCloseListeners.clear(),emitMegaCallback(callback,megaSuccess());for(let listener of listeners)emitMegaCallback(listener,{statusCode:99,type:"finish",data:{}});return}megaError(callback,405,`Container.${api} is not supported`)}function megaNavigationUrl(params){let rawUrl=pickUrl(params);if(!rawUrl)return null;if(!params.extQuery||typeof params.extQuery!="object"||Array.isArray(params.extQuery))return rawUrl;try{let target=new URL(rawUrl,location.href);for(let[key,value]of Object.entries(params.extQuery))value!=null&&target.searchParams.set(key,String(value));return target.href}catch{return rawUrl}}function handleMegaNavigator(api,params,callback){if(api==="openURL"||api==="replace"){let url2=megaNavigationUrl(params);if(!url2){megaError(callback,500,"missing url");return}let callbackId=api==="openURL"&&callback?stashCallback(value=>{let backdata=value&&typeof value=="object"?value.backdata:void 0;emitMegaCallback(callback,{statusCode:1,type:"onResult",data:{result:!0,...backdata===void 0?{}:{data:backdata}}}),emitMegaCallback(callback,{statusCode:99,type:"finish",data:{}})}):0;requestOpen(url2,callbackId,!1,{...params,...api==="replace"?{__mearlReplace:!0}:{}}),emitMegaCallback(callback,megaSuccess());return}if(api==="close"){emitMegaCallback(callback,megaSuccess()),requestClose(void 0);return}if(api==="setSystemBackBlockListener"){megaSystemBackListener&&megaSystemBackListener!==callback&&emitMegaCallback(megaSystemBackListener,{statusCode:99,type:"finish",data:{}}),megaSystemBackListener=callback??null,emitMegaCallback(callback,megaSuccess());return}if(api==="removeSystemBackBlockListener"){let listener=megaSystemBackListener;megaSystemBackListener=null,emitMegaCallback(callback,megaSuccess()),listener&&emitMegaCallback(listener,{statusCode:99,type:"finish",data:{}});return}megaError(callback,405,`navigator.${api} is not supported`)}function handleMegaNavBar(api,params,callback){if(api!=="setTitle"){megaError(callback,405,`NavBar.${api} is not supported`);return}applyNavigationBarState(api,params),emitMegaCallback(callback,megaSuccess())}function handleMegaRouter(api,callback){if(api!=="popPage"){megaError(callback,405,`Router.${api} is not supported`);return}emitMegaCallback(callback,megaSuccess()),requestClose(void 0)}function handleMegaStdPop(api,params,callback){if(api==="showH5"||api==="showWeex2"||api==="showWeex"){let url2=pickUrl(params),popId=typeof params.popId=="string"?params.popId.trim():"";if(!url2||!popId){megaError(callback,500,url2?"missing popId":"missing url");return}let callbackId=stashCallback(value=>{let result=value&&typeof value=="object"&&"backdata"in value?value.backdata:void 0;emitMegaCallback(callback,{statusCode:1,type:"onClose",data:result}),emitMegaCallback(callback,{statusCode:99,type:"finish"})});requestOpen(url2,callbackId,!0,{...params,__mearlMegaPopId:popId}),emitMegaCallback(callback,{statusCode:0,type:"result",data:{}});return}if(api==="close"){let popId=typeof params.popId=="string"?params.popId.trim():"";if(!popId){megaError(callback,500,"missing popId");return}let cloned=cloneMegaDetail(params.result);if(!cloned.success){megaError(callback,500,"result is not serializable");return}requestContainerData("megaPopClose",{popId,result:cloned.value},()=>emitMegaCallback(callback,{statusCode:0,type:"result",data:{}}),reason=>megaError(callback,500,reason));return}if(api==="changeSize"){let popId=typeof params.popId=="string"?params.popId.trim():"";if(!popId){megaError(callback,500,"missing popId");return}requestContainerData("megaPopResize",{...params,popId},()=>emitMegaCallback(callback,{statusCode:0,type:"result",data:{}}),reason=>megaError(callback,500,reason));return}megaError(callback,405,`stdPop.${api} is not supported`)}function handleMegaBroadcast(api,params,callback){let bizId=megaBroadcastBizId(params.bizId),eventName=typeof params.eventName=="string"?params.eventName.trim():"";if(!eventName){megaError(callback,500,"missing eventName");return}if(api==="addEventListener"){if(!callback)return;let id=`mearl-mega-listener-${++megaListenerSeq}`;megaBroadcastListeners.set(id,{id,bizId,eventName,once:params.once===!0,callback}),emitMegaCallback(callback,{statusCode:0,type:"result",data:{}}),emitMegaCallback(callback,{statusCode:1,type:"onAdd",data:{listenerId:id}});return}if(api==="dispatchEvent"){let detail=cloneMegaDetail(params.detail);if(!detail.success){megaError(callback,500,"detail is not serializable");return}requestContainerData("megaBroadcast",{message:{kind:"megaBroadcast",bizId,eventName,detail:detail.value}},()=>emitMegaCallback(callback,{statusCode:0,type:"result",data:{}}),reason=>megaError(callback,500,reason));return}if(api==="removeEventListener"){let listenerId=typeof params.listenerId=="string"?params.listenerId:"",removed=[];for(let listener of Array.from(megaBroadcastListeners.values()))listener.bizId!==bizId||listener.eventName!==eventName||listenerId&&listener.id!==listenerId||(megaBroadcastListeners.delete(listener.id),removed.push(listener));emitMegaCallback(callback,{statusCode:0,type:"result",data:{}});for(let listener of removed)emitMegaCallback(listener.callback,{statusCode:99,type:"finish"});return}megaError(callback,405,`broadcast.${api} is not supported`)}function makeMegaBridge(){return{asyncCall:(ability,api,rawParams,callback)=>{let params=megaParams(rawParams);if(ability==="ability"&&api==="available"){emitMegaCallback(callback,{statusCode:0,type:isMegaApiSupported(params.ability,params.api)?"YES":"NO",data:{}});return}if(ability==="ability"&&api==="batchFinishTrace"){emitMegaCallback(callback,{statusCode:0,type:"result",data:{}});return}if(!isMegaApiSupported(ability,api)){megaError(callback,405,`${ability}.${api} is not supported`);return}if(ability==="stdPop")handleMegaStdPop(api,params,callback);else if(ability==="broadcast")handleMegaBroadcast(api,params,callback);else if(ability==="kvStorage"){let result=executeMegaKVStorage(api,params,!1,callback);result&&emitMegaCallback(callback,result)}else ability==="LifeCycle"?handleMegaLifeCycle(api,callback):ability==="Container"?handleMegaContainer(api,callback):ability==="navigator"?handleMegaNavigator(api,params,callback):ability==="NavBar"?handleMegaNavBar(api,params,callback):handleMegaRouter(api,callback)},syncCall:(ability,api,rawParams)=>{let params=megaParams(rawParams);return ability==="ability"&&api==="available"?{statusCode:0,type:isMegaApiSupported(params.ability,params.api)?"YES":"NO",data:{}}:ability==="kvStorage"&&isMegaApiSupported(ability,api)?executeMegaKVStorage(api,params,!0)??megaFailure("container sync pending"):{statusCode:405,type:"result",data:{}}}}}function makeBridge(style){if(style==="mega")return makeMegaBridge();if(style==="easybikeNative"){let callNative=rawPayload=>{let payload;try{payload=typeof rawPayload=="string"?JSON.parse(rawPayload):rawPayload??{}}catch{return}let classMap=typeof payload.classMap=="string"?payload.classMap:"",method=typeof payload.method=="string"?payload.method:"",callbackId=typeof payload.callbackId=="string"||typeof payload.callbackId=="number"?String(payload.callbackId):"",params;try{params=typeof payload.params=="string"?payload.params?JSON.parse(payload.params):{}:payload.params??{}}catch{params={}}let complete=(code,data,msg="")=>{let callback=resolveWindowFunction("callBack");callbackId&&callback&&callback({callbackId,code,data,msg})};dispatch(`${classMap}.${method}`,params,value=>complete(0,value),error48=>complete(1,void 0,typeof error48=="string"?error48:String(error48??"")))};return{postMessage:callNative,callNative}}if(style==="windvane"){let call=(api,params,success2,failure)=>{let onSuccess=typeof success2=="function"?success2:void 0,onFailure=typeof failure=="function"?failure:void 0;if(onSuccess||onFailure){dispatch(api,params,onSuccess,onFailure);return}return new Promise((resolve11,reject)=>dispatch(api,params,resolve11,reject))};return{isAvailable:!0,version:"8.7.0",call2:call,call:(cls,method,params,succ,fail2)=>call(`${cls}.${method}`,params,succ,fail2)}}if(style==="fliggy"||style==="alipay"||style==="callback"){let bridge={call:(api,params,succ,fail2)=>{typeof params=="function"&&(fail2=succ,succ=params,params=void 0);let p=params&&typeof params=="object"?params:{},successFn=succ??(typeof p.success_callback=="function"?p.success_callback:void 0)??(typeof p.successCallback=="function"?p.successCallback:void 0),failureFn=fail2??(typeof p.fail_callback=="function"?p.fail_callback:void 0)??(typeof p.failure_callback=="function"?p.failure_callback:void 0)??(typeof p.failCallback=="function"?p.failCallback:void 0)??(typeof p.failureCallback=="function"?p.failureCallback:void 0);dispatch(api,p,res=>successFn?.(res),err=>{failureFn?failureFn(err):successFn?.({error:err})},p.callbackCommand??p.callback_command)},pushBack:(prefixOrApi,apiOrParams,paramsOrSucc,succ)=>{let api=prefixOrApi,params=apiOrParams,success2=paramsOrSucc;typeof apiOrParams=="string"&&(api=apiOrParams,params=paramsOrSucc,success2=succ);let p=params??{},successFn=(typeof success2=="function"?success2:void 0)??(typeof p.successCallback=="function"?p.successCallback:void 0);return dispatch(api,p,res=>successFn?.(res),void 0,p.callbackCommand??p.callback_command),bridge},sendUriScheme:uri=>(handleMaybeScheme(uri),bridge)};if(style==="fliggy"){let normalizedAppName=(config2.globals.__APP_NAME__??"").toUpperCase(),os13=config2.clientType==="iphone"?"ios":"android",isAliApp=name=>normalizedAppName===name.toUpperCase();Object.assign(bridge,{version:"1.0.21",device:{os:os13,OS:config2.platform,type:os13,version:config2.systemVersion,model:config2.globals.__DEVICE_MODEL__??""},platform:os13,isAliApp,isTmall:isAliApp("TM"),isTaobao:isAliApp("TB"),isAlipay:isAliApp("AP"),isAlitrip:isAliApp("LX"),isKoubei:isAliApp("KB"),isElm:isAliApp("ELMC"),isGaode:isAliApp("amap"),isUC:/UCBrowser/i.test(config2.userAgent),isWeibo:/Weibo/i.test(config2.userAgent),isWeixin:/MicroMessenger/i.test(config2.userAgent),isWindVane:config2.bridges.some(item=>item.style==="windvane"),isAlipayClient:/AlipayClient/i.test(config2.userAgent)})}return bridge}if(style==="btrip")return{call:(api,params)=>dispatch(api,params??{},void 0,void 0)};if(style==="invoke")return{invoke:(api,params)=>{let p=params??{};dispatch(api,p,p.success,p.fail)}};if(style==="callHandler")return{callHandler:(api,params)=>dispatch(api,params??{},void 0,void 0)};if(style==="amap")return{ready:cb=>cb?.(),send:(msg,cb)=>{let m=msg??{};dispatch(typeof m.action=="string"?m.action:"",m,res=>cb?.(res),err=>cb?.({error:err}))}};if(style==="didi")return{openPage:params=>dispatch("openPage",params??{},void 0,void 0),closePage:params=>dispatch("closePage",params??{},void 0,void 0)};if(style==="wechat"||style==="wechatMiniProgram"){let invoke3=(api,params)=>{let p=params&&typeof params=="object"?params:{};dispatch(api,p,value=>{p.success?.(value),p.complete?.(value)},error48=>{p.fail?.(error48),p.complete?.(error48)})};return style==="wechat"?{ready:callback=>{callback&&setTimeout(callback,0)},getLocation:params=>invoke3("getLocation",params)}:{navigateTo:params=>invoke3("navigateTo",params),redirectTo:params=>invoke3("redirectTo",params),switchTab:params=>invoke3("switchTab",params),reLaunch:params=>invoke3("reLaunch",params),navigateBack:params=>invoke3("navigateBack",params),postMessage:params=>invoke3("postMessage",params),getEnv:callback=>{callback&&setTimeout(()=>callback({miniprogram:!0}),0)}}}return{}}function setGlobal(path27,value){let parts=path27.split("."),obj=w;for(let i=0;i<parts.length-1;i++){let cur=obj[parts[i]];(!cur||typeof cur!="object")&&(obj[parts[i]]={}),obj=obj[parts[i]]}obj[parts[parts.length-1]]=value}function setPersistentGlobal(path27,value){let parts=path27.split(".").filter(Boolean);if(parts.length<2){setGlobal(path27,value);return}let[rootKey,...nestedParts]=parts,isObjectLike=candidate=>typeof candidate=="object"&&candidate!==null||typeof candidate=="function",attachBridge=candidate=>{let root=isObjectLike(candidate)?candidate:{},obj=root;for(let index=0;index<nestedParts.length-1;index+=1){let key=nestedParts[index],child=obj[key];if(!isObjectLike(child))try{obj[key]={}}catch{return root}obj=obj[key]}let leaf=nestedParts[nestedParts.length-1];try{Object.defineProperty(obj,leaf,{configurable:!1,enumerable:!0,get:()=>value,set:()=>{}})}catch{try{obj[leaf]=value}catch{}}return root},currentRoot=attachBridge(w[rootKey]);try{Object.defineProperty(w,rootKey,{configurable:!1,enumerable:!0,get:()=>currentRoot,set:next=>{currentRoot=attachBridge(next)}})}catch{w[rootKey]=currentRoot}}if(config2.bridges.some(spec=>spec.style==="mega")){let hydrationVersion=megaKVMutationVersion;requestContainerData("megaKVSnapshot",{},value=>{let entries=value&&typeof value=="object"?value.entries:void 0;megaKVMutationVersion===hydrationVersion&&replaceMegaKVStorage(entries)},()=>{})}for(let spec of config2.bridges)try{let bridge=makeBridge(spec.style);spec.persistent?setPersistentGlobal(spec.global,bridge):setGlobal(spec.global,bridge)}catch(e){console.error(TAG,"桥安装失败:",spec.global,e)}return{mapScheme,handleMaybeScheme,handleAppMessage,handleNativeBack,handleResume,handlePageVisibility,applyRuntimeResponses}}function installAppProfileContainerStack(config2,environment,links){let{SRC,TAG,simulateSystemBars,ROOT_FRAME_NAME,LAYER_FRAME_NAME,isTop,isRootFrame,isLayerFrame,isContainerFrame,usesRootContainer,log:log2}=environment,{pageTransport}=links,initialLayerTitleBarState=url2=>links.getSystemBars().initialLayerTitleBarState(url2),resolvedTitleBarState=layer=>links.getSystemBars().resolvedTitleBarState(layer),parseReportedTitleBarState=value=>links.getSystemBars().parseReportedTitleBarState(value),createSimulatedNavigationBarView=(placement,onBack)=>links.getSystemBars().createNavigationBarView(placement,onBack),destroySimulatedNavigationBarView=view=>links.getSystemBars().destroyNavigationBarView(view),syncLayerViewport=(layer,state)=>links.getSystemBars().syncLayerViewport(layer,state),syncActiveSystemBars=()=>links.getSystemBars().syncActiveSystemBars(),syncSimulatedTitleBar=()=>links.getSystemBars().syncSimulatedTitleBar(),rootContainerActive=!1,rootOverlayActive=!1,rootFrame=null,rootBusinessUrl=location.href,splitScreenActive=usesRootContainer&&config2.rootContainer?.splitScreen===!0,webViewEnvironmentRequestSeq=0,simulatedPageHidden=!1,runtimeResponses=null;function syncSimulatorStateToWindow(target){target&&(target.postMessage({source:SRC,type:"requestTitleBarState"},"*"),runtimeResponses&&target.postMessage({source:SRC,type:"runtimeResponses",profile:config2.profile,responses:runtimeResponses},"*"),simulatedPageHidden&&target.postMessage({source:SRC,type:"simulatorVisibility",hidden:!0},"*"))}function startPreparedWebViewNavigation(frame,target,canCommit,registerCleanup){let insets=config2.safeAreaInsets??{top:config2.statusBarHeight,right:0,bottom:0,left:0};if(!usesRootContainer||!Object.values(insets).some(value=>value>0)){canCommit()&&(frame.src=target);return}let requestId=++webViewEnvironmentRequestSeq,startedAt=Date.now(),settled=!1,fallbackTimer=0,cleanup=()=>{settled||(settled=!0,clearTimeout(fallbackTimer),window.removeEventListener("message",handleResponse),registerCleanup?.(null))},commitNavigation=fallbackReason=>{cleanup(),fallbackReason&&console.warn(TAG,"WebView 环境准备未完成,降级提交导航",JSON.stringify({reason:fallbackReason,elapsedMs:Date.now()-startedAt,requestId,target})),canCommit()&&(frame.src=target)},handleResponse=event=>{if(event.source!==window||event.data?.source!=="mearl-content"||event.data?.type!=="APP_BRIDGE_PREPARE_WEBVIEW_RESPONSE"||event.data?.requestId!==requestId)return;let result=event.data.result;result?.success===!0?commitNavigation():commitNavigation(String(result?.error??"unknown preparation failure"))};registerCleanup?.(cleanup),window.addEventListener("message",handleResponse),fallbackTimer=setTimeout(()=>commitNavigation("preparation timed out after 500ms"),500);try{window.postMessage({source:SRC,type:"prepareWebView",requestId},"*")}catch(error48){commitNavigation(error48 instanceof Error?error48.message:String(error48))}}function installRootContainer(){if(!usesRootContainer||!/^https?:$/i.test(location.protocol)||!/^(text\/html|application\/xhtml\+xml)$/i.test(document.contentType))return;let shellRoot,frame;try{let rootOverlay=splitScreenActive?null:resolveOverlayPresentation(rootBusinessUrl,void 0,!1);rootOverlayActive=rootOverlay!==null;for(let cookie of config2.rootContainer?.initialCookies??[]){if(!cookie.name)continue;let parts=[`${encodeURIComponent(cookie.name)}=${encodeURIComponent(cookie.value)}`,`Path=${cookie.path??"/"}`];cookie.domain&&parts.push(`Domain=${cookie.domain}`),document.cookie=parts.join("; ")}shellRoot=document.createElement("html");let shellHead=document.createElement("head"),charset=document.createElement("meta"),viewport=document.createElement("meta"),title=document.createElement("title"),shellBody=document.createElement("body");if(frame=document.createElement("iframe"),shellRoot.setAttribute("data-mearl-app-shell",""),shellBody.setAttribute("data-mearl-app-shell",""),charset.setAttribute("charset","utf-8"),viewport.name="viewport",viewport.content="width=device-width,initial-scale=1,viewport-fit=cover",shellHead.append(charset,viewport,title),shellRoot.append(shellHead,shellBody),shellRoot.style.cssText="width:100%;height:100%;margin:0;overflow:hidden;background:#fff;",shellBody.style.cssText="width:100%;height:100%;margin:0;overflow:hidden;background:#fff;",frame.name=ROOT_FRAME_NAME,frame.setAttribute("data-mearl-root-webview",config2.profile),frame.setAttribute("allow","microphone; on-device-speech-recognition"),splitScreenActive&&frame.setAttribute("data-mearl-split-pane","left"),frame.style.cssText=rootOverlay?"position:absolute;inset:0;width:100%;height:100%;border:0;display:block;background:#fff;z-index:0;opacity:1;":splitScreenActive?"position:fixed;left:0;right:auto;top:0;bottom:0;width:50%;height:100%;border:0;border-right:1px solid rgba(15,23,42,.14);box-sizing:border-box;display:block;background:#fff;z-index:0;opacity:1;":"position:fixed;left:0;right:0;top:0;bottom:0;width:100%;height:100%;border:0;display:block;background:#fff;z-index:0;opacity:1;",frame.addEventListener("load",()=>{let committedSrc=frame.getAttribute("src");!committedSrc||committedSrc==="about:blank"||(syncSimulatorStateToWindow(frame.contentWindow),requestAnimationFrame(()=>{rootFrame!==frame||!frame.isConnected||(frame.setAttribute("data-mearl-webview-ready",""),syncSimulatedTitleBar())}))}),rootOverlay){let overlayRoot=document.createElement("div"),mask=document.createElement("div"),sheet=document.createElement("div"),width=rootOverlay.widthRatio*100,left=(1-rootOverlay.widthRatio)/2*100;overlayRoot.setAttribute("data-mearl-root-overlay",config2.profile),mask.setAttribute("data-mearl-root-overlay-mask",""),sheet.setAttribute("data-mearl-root-overlay-sheet",""),overlayRoot.style.cssText="position:fixed;inset:0;z-index:0;pointer-events:none;",mask.style.cssText=`position:absolute;inset:0;background:rgba(0,0,0,${rootOverlay.maskAlpha});pointer-events:auto;`,sheet.style.cssText=`position:absolute;left:${left}%;right:auto;bottom:0;width:${width}%;height:${(1-rootOverlay.topRatio)*100}%;background:#fff;border-radius:${rootOverlay.radius}px ${rootOverlay.radius}px 0 0;overflow:hidden;pointer-events:auto;`,syncOverlayWidth(sheet,rootOverlay.widthRatio),rootOverlay.tapClose&&mask.addEventListener("click",()=>requestCloseOnTop(void 0)),sheet.appendChild(frame),overlayRoot.append(mask,sheet),shellBody.appendChild(overlayRoot)}else shellBody.appendChild(frame);let currentRoot=document.documentElement;currentRoot?document.replaceChild(shellRoot,currentRoot):document.appendChild(shellRoot)}catch(error48){console.warn(TAG,"根 WebView 容器创建失败,保留当前页面",error48),rootFrame=null;return}rootFrame=frame,rootContainerActive=!0;try{typeof window.stop=="function"&&window.stop()}catch(error48){console.warn(TAG,"停止外层文档加载失败,继续启动根 WebView",error48)}let initialRootUrl=window.__mearlRootDocumentUrl__?.(rootBusinessUrl)??rootBusinessUrl;try{startPreparedWebViewNavigation(frame,initialRootUrl,()=>rootFrame===frame&&frame.isConnected)}catch(error48){console.warn(TAG,"根 WebView 环境准备启动失败,直接提交业务导航",error48),rootFrame===frame&&frame.isConnected&&(frame.src=initialRootUrl)}}installRootContainer();function normalizeProxyPathPrefix(prefix){let withLeadingSlash=prefix.startsWith("/")?prefix:`/${prefix}`;return withLeadingSlash.endsWith("/")?withLeadingSlash:`${withLeadingSlash}/`}function matchesProxyTarget(hostname3,suffixes){return suffixes.some(suffix=>hostname3===suffix||hostname3.endsWith(`.${suffix}`))}function mapLayerFrameUrl(url2){let proxy=config2.layerUrlProxy;if(!proxy||!location.hostname.startsWith(proxy.sourceHostPrefix))return url2;try{let target=new URL(url2,location.href);if(!/^https?:$/.test(target.protocol))return url2;let prefix=normalizeProxyPathPrefix(proxy.pathPrefix);if(target.hostname===location.hostname){if(target.pathname.startsWith(prefix))return url2;let derivedHost=location.pathname.startsWith(prefix)?location.pathname.slice(prefix.length).split("/")[0]:proxy.defaultTargetHost;return!derivedHost||!matchesProxyTarget(derivedHost,proxy.targetHostSuffixes)?url2:`${location.origin}${prefix}${derivedHost}${target.pathname}${target.search}${target.hash}`}return matchesProxyTarget(target.hostname,proxy.targetHostSuffixes)?`${location.origin}${prefix}${target.host}${target.pathname}${target.search}${target.hash}`:url2}catch{return url2}}function restoreLayerBusinessUrl(url2){let proxy=config2.layerUrlProxy;if(!proxy)return url2;try{let current=new URL(url2,location.href),prefix=normalizeProxyPathPrefix(proxy.pathPrefix);if(current.origin!==location.origin||!current.pathname.startsWith(prefix))return url2;let rest=current.pathname.slice(prefix.length),slash=rest.indexOf("/"),host=slash===-1?rest:rest.slice(0,slash);if(!host)return url2;let hostname3=new URL(`${current.protocol}//${host}`).hostname;if(!matchesProxyTarget(hostname3,proxy.targetHostSuffixes))return url2;let pathname=slash===-1?"/":rest.slice(slash);return`${current.protocol}//${host}${pathname}${current.search}${current.hash}`}catch{return url2}}let ANIM_MS=config2.animationMs??300;function overlayMaxWidth(){let{maxWidthPx,maxWidthMinAppVersion}=config2.overlay??{};if(!(!maxWidthPx||!Number.isFinite(maxWidthPx)||maxWidthPx<=0)){if(maxWidthMinAppVersion){let version3=config2.globals.__APP_VERSION__??"";if(!/^\d+(?:\.\d+)*$/.test(version3))return;let current=version3.split(".").map(Number),minimum=maxWidthMinAppVersion.split(".").map(Number);for(let index=0;index<Math.max(current.length,minimum.length);index+=1){let difference=(current[index]??0)-(minimum[index]??0);if(difference<0)return;if(difference>0)break}}return maxWidthPx}}function syncOverlayWidth(sheet,widthRatio){let maximum=overlayMaxWidth();sheet.style.width=`${widthRatio*100}%`,sheet.style.left=maximum?"0":`${(1-widthRatio)/2*100}%`,sheet.style.right=maximum?"0":"auto",maximum&&(sheet.style.maxWidth=`${maximum}px`,sheet.style.marginLeft="auto",sheet.style.marginRight="auto")}function boolParam(value,fallback){return value===!0||value===1||value==="1"||value==="true"?!0:value===!1||value===0||value==="0"||value==="false"?!1:value===""?!0:fallback}function numberParam(value,fallback,min,max){let parsed=typeof value=="number"?value:Number(value);return Number.isFinite(parsed)?Math.min(Math.max(parsed,min),max):fallback}function resolveOverlayPresentation(url2,params,explicitWebdialog){let query=null;try{query=new URL(url2,location.href).searchParams}catch{}let records=[],addRecord=value=>{value&&typeof value=="object"&&!Array.isArray(value)&&records.push(value)};addRecord(params?.pageParams),addRecord(params?.page_params),addRecord(params?.popConfig),addRecord(params?.data),addRecord(params?.param),addRecord(params);let read=key=>{for(let record4 of records)if(Object.prototype.hasOwnProperty.call(record4,key))return record4[key];return query?.has(key)?query.get(key):void 0},protocol=config2.overlay;if(!explicitWebdialog&&(!protocol||!boolParam(read(protocol.enabledParam),!1)))return null;let configuredTopRatio=protocol?read(protocol.topRatioParam):void 0,configuredHeightRatio=protocol?.heightRatioParam?read(protocol.heightRatioParam):void 0,configuredMaxHeight=read("maxHeight")??configuredHeightRatio,defaultTopRatio=protocol?.defaultTopRatio??.2;return{topRatio:configuredTopRatio!==void 0?numberParam(configuredTopRatio,defaultTopRatio,0,1):configuredMaxHeight!==void 0?1-numberParam(configuredMaxHeight,1-defaultTopRatio,0,1):defaultTopRatio,widthRatio:numberParam(read("maxWidth"),1,0,1),radius:numberParam((protocol?read(protocol.radiusParam):void 0)??read("cornerRadius"),protocol?.defaultRadius??0,0,50),maskAlpha:numberParam(protocol?read(protocol.maskAlphaParam):void 0,protocol?.defaultMaskAlpha??.3,0,1),tapClose:boolParam((protocol?read(protocol.tapCloseParam):void 0)??read("tapEnable"),protocol?.defaultTapClose??!0)}}function requestsPopBeforeOpen(url2,params){if(params?.__mearlReplace===!0)return!0;let key=config2.popBeforeOpenParam;if(!key)return!1;let records=[params?.pageParams,params?.page_params,params?.data,params?.param,params];for(let value of records){if(!value||typeof value!="object"||Array.isArray(value))continue;let record4=value;if(Object.prototype.hasOwnProperty.call(record4,key))return boolParam(record4[key],!1)}try{let query=new URL(url2,location.href).searchParams;return query.has(key)&&boolParam(query.get(key),!1)}catch{return!1}}let layers=[],forwardStack=[],layerSeq=0,enteringLayerCount=0,closingLayerCount=0,explicitLayerTitleBarStates=new Map,rootScrollStyles=null,pendingClose=null,nativeBackRequestSeq=0,pendingNativeBack=null,containerDataRequestSeq=0,containerDataCallbacks=new Map,sharedFiles=new Map,sharedData=new Map,legacyBroadcastChannels=new Set,MEGA_KV_STORAGE_KEY=`__mearl_mega_kv__:${config2.profile}`;function readMegaKVStorage(){let storage=new Map;try{let parsed=JSON.parse(localStorage.getItem(MEGA_KV_STORAGE_KEY)??"{}");if(!parsed||typeof parsed!="object"||Array.isArray(parsed))return storage;for(let[bizId,rawEntries]of Object.entries(parsed)){if(!rawEntries||typeof rawEntries!="object"||Array.isArray(rawEntries))continue;let entries=new Map;for(let[key,value]of Object.entries(rawEntries))typeof value=="string"&&entries.set(key,value);storage.set(bizId,entries)}}catch{}return storage}let megaKVStorage=readMegaKVStorage();function megaKVSnapshot(){let snapshot={};for(let[bizId,values]of megaKVStorage)snapshot[bizId]=Object.fromEntries(values);return snapshot}function persistMegaKVStorage(){try{localStorage.setItem(MEGA_KV_STORAGE_KEY,JSON.stringify(megaKVSnapshot()))}catch{}}let PENDING_CLOSE_TIMEOUT_MS=400,pendingHistoryDepth=null,pendingSplitRootOpen=null;function clearPendingClose(){pendingClose&&(clearTimeout(pendingClose.timer),pendingClose=null)}function clearPendingNativeBack(){pendingNativeBack&&(clearTimeout(pendingNativeBack.timer),pendingNativeBack=null)}function clearPendingHistoryDepth(){pendingHistoryDepth&&(clearTimeout(pendingHistoryDepth.timer),pendingHistoryDepth=null)}function syncHistoryAfterDirectClose(){clearPendingHistoryDepth();let depth=layers.length,timer=setTimeout(()=>{pendingHistoryDepth=null,console.warn(TAG,"WebView 已出栈,但浏览器历史未在预期时间内同步",{depth})},PENDING_CLOSE_TIMEOUT_MS);pendingHistoryDepth={depth,timer},history.back()}function armPendingClose(data,retries){clearPendingClose();let timer=setTimeout(()=>{pendingClose=null,log2("close 未等到 popstate,直接关栈顶兜底"),closeToDepth(Math.max(layers.length-1,0),data,!0)},PENDING_CLOSE_TIMEOUT_MS);pendingClose={data,retries,timer},history.back()}function parseStorageId(url2){try{return new URL(url2,location.href).searchParams.get("__storage_id")}catch{return null}}function titleBarStateCacheKey(url2){try{let parsed=new URL(url2,location.href);return parsed.hash="",parsed.href}catch{return url2}}function cacheExplicitTitleBarState(layer,state){explicitLayerTitleBarStates.set(titleBarStateCacheKey(layer.entryUrl),state),explicitLayerTitleBarStates.set(titleBarStateCacheKey(layer.url),state)}function readDepth(state){if(state&&typeof state=="object"){let d=state.__mearl_layer__;if(typeof d=="number")return d}return null}function mapUrlForSync(url2,allowHostBorrowing=!0){let suffixes=config2.urlSyncHostSuffixes??[];try{let u=new URL(url2,location.href);if(!/^https?:$/.test(u.protocol))return;if(u.origin===location.origin)return u.pathname+u.search+u.hash;if(!(suffixes.length===0||suffixes.some(s=>u.host===s||u.host.endsWith(`.${s}`))))return;let proxy=config2.layerUrlProxy;return proxy&&location.hostname.startsWith(proxy.sourceHostPrefix)&&matchesProxyTarget(u.hostname,proxy.targetHostSuffixes)?`${normalizeProxyPathPrefix(proxy.pathPrefix)}${u.host}${u.pathname}${u.search}${u.hash}`:allowHostBorrowing?u.pathname+u.search+u.hash:void 0}catch{return}}function createLayerEl(overlay,id){let el=document.createElement("div");el.setAttribute("data-mearl-layer",String(id)),splitScreenActive&&el.setAttribute("data-mearl-split-pane","right"),el.style.cssText=splitScreenActive?`position:fixed;left:50%;right:0;top:0;bottom:0;width:50%;z-index:${2147483e3+id%100*2};`:`position:fixed;inset:0;z-index:${2147483e3+id%100*2};`;let frame=document.createElement("iframe");if(frame.name=LAYER_FRAME_NAME,frame.setAttribute("allow","microphone; on-device-speech-recognition"),frame.setAttribute("sandbox","allow-scripts allow-same-origin allow-forms allow-modals allow-downloads allow-popups"),frame.style.cssText="position:absolute;inset:0;width:100%;height:100%;border:0;display:block;background:#fff;z-index:0;opacity:1;",overlay){el.style.pointerEvents="none";let mask=document.createElement("div");mask.style.cssText=`position:absolute;inset:0;background:rgba(0,0,0,${overlay.maskAlpha});opacity:0;pointer-events:auto;`;let sheet=document.createElement("div"),width=overlay.widthRatio*100,left=(1-overlay.widthRatio)/2*100;return sheet.style.cssText=`position:absolute;left:${left}%;right:auto;bottom:0;width:${width}%;height:${(1-overlay.topRatio)*100}%;background:#fff;border-radius:${overlay.radius}px ${overlay.radius}px 0 0;overflow:hidden;pointer-events:auto;`,syncOverlayWidth(sheet,overlay.widthRatio),sheet.appendChild(frame),el.appendChild(mask),el.appendChild(sheet),{el,frame,animEl:sheet,mask}}return el.style.background="#fff",el.appendChild(frame),{el,frame,animEl:el,mask:null}}function setLayerInteractive(layer,interactive){layer.frame.style.pointerEvents=interactive?"":"none",layer.titleBarView&&(layer.titleBarView.root.style.pointerEvents=interactive?"":"none"),interactive?(layer.frame.removeAttribute("inert"),layer.frame.removeAttribute("aria-hidden"),layer.frame.removeAttribute("tabindex")):(layer.frame.setAttribute("inert",""),layer.frame.setAttribute("aria-hidden","true"),layer.frame.setAttribute("tabindex","-1"),layer.frame.blur()),layer.overlay?(layer.el.style.pointerEvents="none",layer.animEl.style.pointerEvents=interactive?"auto":"none",layer.mask&&(layer.mask.style.pointerEvents=interactive?"auto":"none")):layer.el.style.pointerEvents=interactive?"":"none"}function setRootFrameInteractive(interactive){rootFrame&&(rootFrame.style.pointerEvents=interactive?"":"none",interactive?(rootFrame.removeAttribute("inert"),rootFrame.removeAttribute("aria-hidden"),rootFrame.removeAttribute("tabindex")):(rootFrame.setAttribute("inert",""),rootFrame.setAttribute("aria-hidden","true"),rootFrame.setAttribute("tabindex","-1"),rootFrame.blur()))}function blockClosingLayerInteractions(layer){setLayerInteractive(layer,!1),layer.el.style.pointerEvents="auto"}function syncRootScrollLock(locked){let body=document.body;if(locked&&!rootScrollStyles){rootScrollStyles={html:document.documentElement.style.overflow,body:body?.style.overflow??null},document.documentElement.style.overflow="hidden",body&&(body.style.overflow="hidden");return}!locked&&rootScrollStyles&&(document.documentElement.style.overflow=rootScrollStyles.html,body&&rootScrollStyles.body!==null&&(body.style.overflow=rootScrollStyles.body),rootScrollStyles=null)}function syncLayerInteractivity(){let activeLayer=closingLayerCount===0&&enteringLayerCount===0?layers[layers.length-1]:void 0;for(let layer of layers)setLayerInteractive(layer,layer===activeLayer),!activeLayer&&layer===layers[layers.length-1]&&(layer.el.style.pointerEvents="auto");setRootFrameInteractive(splitScreenActive?pendingSplitRootOpen===null:layers.length===0&&enteringLayerCount===0&&closingLayerCount===0),syncRootScrollLock(layers.length>0||enteringLayerCount>0||closingLayerCount>0)}function finishLayerEntry(layer){layer.entering&&(layer.entering=!1,layer.enterTimer!==null&&clearTimeout(layer.enterTimer),layer.enterTimer=null,layer.enterTransitionEnd&&(layer.animEl.removeEventListener("transitionend",layer.enterTransitionEnd),layer.enterTransitionEnd=null),enteringLayerCount=Math.max(enteringLayerCount-1,0),syncLayerInteractivity())}function animateIn(layer){let t=layer.animEl;if(t.style.transform=layer.overlay?"translateY(100%)":"translateX(100%)",t.offsetWidth,t.style.transition=`transform ${ANIM_MS}ms ease`,t.style.transform="translate(0px, 0px)",layer.mask&&(layer.mask.style.transition=`opacity ${ANIM_MS}ms ease`,layer.mask.style.opacity="1"),ANIM_MS<=0){finishLayerEntry(layer);return}layer.enterTransitionEnd=event=>{event.target===t&&event.propertyName==="transform"&&finishLayerEntry(layer)},t.addEventListener("transitionend",layer.enterTransitionEnd),layer.enterTimer=setTimeout(()=>finishLayerEntry(layer),ANIM_MS+60)}function animateOut(layer,done){let t=layer.animEl;if(ANIM_MS<=0){t.style.transform=layer.overlay?"translateY(100%)":"translateX(100%)",layer.mask&&(layer.mask.style.opacity="0"),setTimeout(done,0);return}let settled=!1,fallbackTimer=0,finish=()=>{settled||(settled=!0,t.removeEventListener("transitionend",onTransitionEnd),clearTimeout(fallbackTimer),done())},onTransitionEnd=event=>{event.target===t&&event.propertyName==="transform"&&finish()};t.addEventListener("transitionend",onTransitionEnd),t.style.transition=`transform ${ANIM_MS}ms ease`,t.style.transform=layer.overlay?"translateY(100%)":"translateX(100%)",layer.mask&&(layer.mask.style.opacity="0"),fallbackTimer=setTimeout(finish,ANIM_MS+60)}function startLayerNavigation(layer,target){startPreparedWebViewNavigation(layer.frame,target,()=>!layer.closing&&layer.el.isConnected,cleanup=>{layer.navigationPreparationCleanup=cleanup})}function setPageVisibility(target,hidden){if(target===window){links.getBridgeProtocol().handlePageVisibility(hidden);return}try{target.postMessage({source:SRC,type:"simulatorVisibility",hidden},"*")}catch{}}function openLayer(url2,callbackId,overlay,openerWin,pushHistory,popId=null,animateEntry=!0){clearPendingClose();let target=url2;if(!/^https?:/i.test(target)){let mapped=links.getBridgeProtocol().mapScheme(target);if(!mapped)return log2("open 失败,scheme 未映射:",url2),null;target=mapped}location.protocol==="https:"&&target.startsWith("http:")&&(target="https:"+target.slice(5));let presentation=overlay??resolveOverlayPresentation(target,void 0,!1);log2("open →",presentation?"(webdialog) ":"",target);let parts=createLayerEl(presentation,++layerSeq),restoredTitleBarState=explicitLayerTitleBarStates.get(titleBarStateCacheKey(target)),layer={id:layerSeq,win:parts.frame.contentWindow,frame:parts.frame,entryUrl:target,url:target,overlay:presentation,openerWin,callbackId,storageId:parseStorageId(target),popId,el:parts.el,animEl:parts.animEl,mask:parts.mask,entering:animateEntry,enterTimer:null,enterTransitionEnd:null,closing:!1,navigationPreparationCleanup:null,titleBarState:restoredTitleBarState??initialLayerTitleBarState(target),titleBarStateExplicit:restoredTitleBarState!==void 0,titleBarStateReady:restoredTitleBarState!==void 0,titleBarView:null};if(popId&&layer.el.setAttribute("data-mearl-pop-id",popId),layer.mask&&presentation?.tapClose&&layer.mask.addEventListener("click",()=>requestOverlayClose(layer)),!presentation&&simulateSystemBars&&config2.titleBar&&(layer.titleBarView=createSimulatedNavigationBarView("layer",()=>requestNativeBack()),layer.titleBarView.root.setAttribute("data-mearl-layer-titlebar",String(layer.id)),parts.el.appendChild(layer.titleBarView.root)),layers.push(layer),splitScreenActive&&rootFrame?.contentWindow===openerWin||setPageVisibility(openerWin,!0),animateEntry&&(enteringLayerCount+=1),syncLayerViewport(layer,layer.titleBarState),syncLayerInteractivity(),parts.frame.addEventListener("load",()=>{layer.win=parts.frame.contentWindow,parts.frame.name=LAYER_FRAME_NAME;let committedSrc=parts.frame.getAttribute("src");!committedSrc||committedSrc==="about:blank"||(syncSimulatorStateToWindow(parts.frame.contentWindow),requestAnimationFrame(()=>{layer.titleBarStateReady||layer.closing||!layer.el.isConnected||(layer.titleBarStateReady=!0,syncLayerViewport(layer,resolvedTitleBarState(layer)))}))}),(document.body??document.documentElement).appendChild(parts.el),layer.win=parts.frame.contentWindow,startLayerNavigation(layer,mapLayerFrameUrl(target)),animateEntry&&animateIn(layer),pushHistory){forwardStack.length=0;try{history.pushState({__mearl_layer__:layers.length},"",mapUrlForSync(target))}catch{}}return layer}function replaceLayer(sourceLayer,url2,callbackId,overlay,popId=null){if(sourceLayer.closing||layers[layers.length-1]!==sourceLayer){openLayer(url2,callbackId,overlay,sourceLayer.win??window,!0,popId);return}let replacement=openLayer(url2,callbackId,overlay,sourceLayer.openerWin,!1,popId);if(!replacement)return;sourceLayer.navigationPreparationCleanup?.(),sourceLayer.navigationPreparationCleanup=null,sourceLayer.entering&&(sourceLayer.entering=!1,enteringLayerCount=Math.max(enteringLayerCount-1,0),sourceLayer.enterTimer!==null&&clearTimeout(sourceLayer.enterTimer),sourceLayer.enterTransitionEnd&&sourceLayer.animEl.removeEventListener("transitionend",sourceLayer.enterTransitionEnd));let sourceIndex=layers.indexOf(sourceLayer);sourceIndex>=0&&layers.splice(sourceIndex,1),destroySimulatedNavigationBarView(sourceLayer.titleBarView),sourceLayer.el.remove(),forwardStack.length=0,syncLayerInteractivity(),syncActiveSystemBars();try{history.replaceState({__mearl_layer__:layers.length},"",mapUrlForSync(replacement.url))}catch{}}function closeLayer(layer,data,final,gotoEvent=!1,resumeOpener=!0,silent=!1,immediate=!1){if(layer.closing)return;layer.navigationPreparationCleanup?.(),layer.navigationPreparationCleanup=null,layer.entering&&(layer.entering=!1,enteringLayerCount=Math.max(enteringLayerCount-1,0),layer.enterTimer!==null&&clearTimeout(layer.enterTimer),layer.enterTimer=null,layer.enterTransitionEnd&&(layer.animEl.removeEventListener("transitionend",layer.enterTransitionEnd),layer.enterTransitionEnd=null)),layer.closing=!0;let idx=layers.indexOf(layer);idx>=0&&layers.splice(idx,1),closingLayerCount+=1,blockClosingLayerInteractions(layer),syncLayerInteractivity(),syncActiveSystemBars(),final?forwardStack.length=0:forwardStack.push({url:layer.url,overlay:layer.overlay,openerWin:layer.openerWin,callbackId:layer.callbackId,storageId:layer.storageId,popId:layer.popId}),log2("close ←",layer.url,data===void 0?"":data);let finishClose=()=>{if(destroySimulatedNavigationBarView(layer.titleBarView),layer.el.remove(),closingLayerCount=Math.max(closingLayerCount-1,0),syncLayerInteractivity(),syncActiveSystemBars(),!!resumeOpener)if(layer.openerWin===window)links.getBridgeProtocol().handleResume({data,storageId:layer.storageId,callbackId:layer.callbackId,final,gotoEvent,silent});else try{layer.openerWin.postMessage({source:SRC,type:"resume",data,storageId:layer.storageId,callbackId:layer.callbackId,final,gotoEvent,silent},"*")}catch{}};immediate?finishClose():animateOut(layer,finishClose)}function closeToDepth(depth,data,final){for(;layers.length>depth;){let revealsTarget=layers.length===depth+1;closeLayer(layers[layers.length-1],revealsTarget?data:void 0,final,!1,revealsTarget)}}function closeAllLayers(data,gotoEvent=!1,silent=!1,immediate=!1){let depth=layers.length;for(;layers.length>0;){let isRootmostLayer=layers.length===1;closeLayer(layers[layers.length-1],isRootmostLayer?data:void 0,!0,isRootmostLayer&&gotoEvent,isRootmostLayer,silent,immediate)}if(depth>0)try{history.go(-depth)}catch{}return depth>0}function openFromSplitRoot(url2,callbackId,overlay,openerWin,popId){if(pendingSplitRootOpen){pendingSplitRootOpen={url:url2,callbackId,overlay,openerWin,popId};return}if(layers.length===0){openLayer(url2,callbackId,overlay,openerWin,!0,popId);return}pendingSplitRootOpen={url:url2,callbackId,overlay,openerWin,popId},closeAllLayers(void 0,!1,!0,!0)}function finishPendingSplitRootOpen(){let pending=pendingSplitRootOpen;pending&&(pendingSplitRootOpen=null,openLayer(pending.url,pending.callbackId,pending.overlay,pending.openerWin,!0,pending.popId,!1))}function requestOverlayClose(layer){if(!(layer.closing||layers[layers.length-1]!==layer)){if(!config2.overlay?.silentTapClose){for(let selector of config2.overlay?.tapCloseSelectors??[])try{let control=layer.frame.contentDocument?.querySelector(selector);if(typeof control?.click!="function")continue;control.click();return}catch{}requestCloseOnTop(void 0);return}pendingClose||pendingHistoryDepth||(closeLayer(layer,void 0,!0,!1,!0,!0),syncHistoryAfterDirectClose())}}function forwardToDepth(depth){for(;layers.length<depth&&forwardStack.length>0;){let entry=forwardStack.pop();openLayer(entry.url,entry.callbackId,entry.overlay,entry.openerWin,!1,entry.popId)}}function requestCloseOnTop(data){if(layers.length===0){history.back();return}if(rootContainerActive){closeLayer(layers[layers.length-1],data,!0),syncHistoryAfterDirectClose();return}armPendingClose(data,8)}function isActiveBusinessWindow(target){let topLayer=layers[layers.length-1];return topLayer?topLayer.frame.contentWindow===target:rootFrame?rootFrame.contentWindow===target:target===window}function finishNativeBack(requestId,target,handled){pendingNativeBack?.requestId!==requestId||pendingNativeBack.target!==target||(clearPendingNativeBack(),!handled&&isActiveBusinessWindow(target)&&requestCloseOnTop(void 0))}function requestNativeBack(){if(!isTop||pendingNativeBack)return;let target=layers[layers.length-1]?.frame.contentWindow??rootFrame?.contentWindow??window;if(!target||target===window){links.getBridgeProtocol().handleNativeBack()||requestCloseOnTop(void 0);return}let requestId=++nativeBackRequestSeq,timer=setTimeout(()=>finishNativeBack(requestId,target,!1),120);pendingNativeBack={requestId,target,timer};try{target.postMessage({source:SRC,type:"nativeBack",requestId},"*")}catch{finishNativeBack(requestId,target,!1)}}function layerForWindow(source){if(source)for(let layer of layers){if(layer.win===source)return layer;let currentWindow=layer.frame.contentWindow;if(currentWindow&&currentWindow===source)return layer.win=currentWindow,layer}}if(isTop){if(!rootContainerActive){let rawPushState=history.pushState.bind(history),rawReplaceState=history.replaceState.bind(history),withDepth=state=>state==null?{__mearl_layer__:layers.length}:typeof state=="object"&&!Array.isArray(state)?{...state,__mearl_layer__:layers.length}:state;try{history.pushState=function(...args){rawPushState(withDepth(args[0]),args[1],args[2])},history.replaceState=function(...args){rawReplaceState(withDepth(args[0]),args[1],args[2])}}catch{}}try{readDepth(history.state)===null&&history.replaceState({__mearl_layer__:0},"")}catch{}window.addEventListener("popstate",e=>{let depth=readDepth(e.state);if(pendingSplitRootOpen&&depth===0){finishPendingSplitRootOpen();return}if(pendingHistoryDepth){let expectedDepth=pendingHistoryDepth.depth;if(clearPendingHistoryDepth(),depth===expectedDepth)return;console.warn(TAG,"浏览器历史深度与 WebView 出栈事务不一致",{expectedDepth,actualDepth:depth})}if(rootContainerActive){if(depth===null)return;depth<layers.length?closeToDepth(depth,void 0,!1):depth>layers.length&&forwardToDepth(depth);return}if(pendingClose){if(depth!==null&&depth<layers.length){let{data}=pendingClose;clearPendingClose(),closeToDepth(depth,data,!0)}else if(pendingClose.retries>0)armPendingClose(pendingClose.data,pendingClose.retries-1);else{let{data}=pendingClose;clearPendingClose(),closeToDepth(layers.length-1,data,!0)}return}depth!==null&&(depth<layers.length?closeToDepth(depth,void 0,!1):depth>layers.length&&forwardToDepth(depth))})}function broadcastAppMessage(message){links.getBridgeProtocol().handleAppMessage(message);let targets=[rootFrame?.contentWindow??null,...layers.filter(layer=>!layer.closing).map(layer=>layer.frame.contentWindow)];for(let target of targets)if(!(!target||target===window))try{target.postMessage({source:SRC,type:"appMessage",message},"*")}catch{}}function closeMegaPop(popId,data){let index=layers.findIndex(layer=>layer.popId===popId&&!layer.closing);if(index<0)return!1;let closingDepth=layers.length-index;closeToDepth(index,data,!0);try{history.go(-closingDepth)}catch{}return!0}function resizeMegaPop(popId,params){let layer=layers.find(candidate=>candidate.popId===popId&&!candidate.closing);if(!layer?.overlay)return!1;if(params.maxHeight!==void 0){let maxHeight=numberParam(params.maxHeight,1-layer.overlay.topRatio,0,1);layer.overlay.topRatio=1-maxHeight,layer.animEl.style.height=`${maxHeight*100}%`}if(params.maxWidth!==void 0){let maxWidth=numberParam(params.maxWidth,1,0,1);layer.overlay.widthRatio=maxWidth,syncOverlayWidth(layer.animEl,maxWidth)}return params.animated===!0&&(layer.animEl.style.transition="height 200ms ease, width 200ms ease, left 200ms ease"),!0}function executeContainerData(action,params){if(action==="sharedFileRead"||action==="sharedFileWrite"){let fileName=typeof params.fileName=="string"?params.fileName:"";if(!fileName)return{success:!1,value:"missing fileName"};if(action==="sharedFileRead")return{success:!0,value:{data:sharedFiles.get(fileName)??""}};let data=typeof params.data=="string"?params.data:String(params.data??"");return sharedFiles.set(fileName,data),{success:!0,value:{}}}if(action==="sharedDataGet"){let keys=Array.isArray(params.keys)?params.keys.filter(key=>typeof key=="string"):[],data={};for(let key of keys)sharedData.has(key)&&(data[key]=sharedData.get(key));return{success:!0,value:{data}}}if(action==="sharedDataSet"){if(!params.data||typeof params.data!="object"||Array.isArray(params.data))return{success:!1,value:"missing shared data"};for(let[key,value]of Object.entries(params.data))value==null?sharedData.delete(key):sharedData.set(key,value);return{success:!0,value:{}}}if(action==="megaBroadcast")return!params.message||typeof params.message!="object"||Array.isArray(params.message)?{success:!1,value:"missing broadcast message"}:(broadcastAppMessage(params.message),{success:!0,value:{}});if(action==="megaKVSnapshot")return{success:!0,value:{entries:megaKVSnapshot()}};if(action==="megaKVMutation"){let operation=typeof params.operation=="string"?params.operation:"",bizId=typeof params.bizId=="string"?params.bizId:"";if(!bizId)return{success:!1,value:"missing bizID"};let key=typeof params.key=="string"?params.key:"";if((operation==="set"||operation==="remove")&&!key)return{success:!1,value:"missing key"};if(operation==="set"){if(typeof params.value!="string")return{success:!1,value:"missing value"};let entries=megaKVStorage.get(bizId)??new Map;entries.set(key,params.value),megaKVStorage.set(bizId,entries)}else if(operation==="remove"){let entries=megaKVStorage.get(bizId);entries?.delete(key),entries?.size===0&&megaKVStorage.delete(bizId)}else if(operation==="clear")megaKVStorage.delete(bizId);else return{success:!1,value:"unsupported KVStorage operation"};return persistMegaKVStorage(),broadcastAppMessage({kind:"megaKVStorage",operation,bizId,key,value:params.value}),{success:!0,value:{}}}if(action==="legacyBroadcastCreate"){let instanceId=typeof params.instanceId=="string"?params.instanceId:"";return instanceId?(legacyBroadcastChannels.add(instanceId),{success:!0,value:{}}):{success:!1,value:"missing instanceId"}}if(action==="legacyBroadcastPost"){let instanceId=typeof params.instanceId=="string"?params.instanceId:"";return instanceId?legacyBroadcastChannels.has(instanceId)?(broadcastAppMessage({kind:"legacyBroadcast",instanceId,message:params.message}),{success:!0,value:{}}):{success:!1,value:"broadcast channel not found"}:{success:!1,value:"missing instanceId"}}if(action==="legacyBroadcastClose"){let instanceId=typeof params.instanceId=="string"?params.instanceId:"";return instanceId?(legacyBroadcastChannels.delete(instanceId),{success:!0,value:{}}):{success:!1,value:"missing instanceId"}}if(action==="megaPopClose"){let popId=typeof params.popId=="string"?params.popId:"";return popId?closeMegaPop(popId,params.result)?{success:!0,value:{}}:{success:!1,value:"popId not found"}:{success:!1,value:"missing popId"}}if(action==="megaPopResize"){let popId=typeof params.popId=="string"?params.popId:"";return popId?resizeMegaPop(popId,params)?{success:!0,value:{}}:{success:!1,value:"popId not found"}:{success:!1,value:"missing popId"}}return{success:!1,value:"unsupported container data action"}}function requestContainerData(action,params,onSuccess,onFailure){if(isTop){let result=executeContainerData(action,params);setTimeout(()=>result.success?onSuccess(result.value):onFailure(result.value),0);return}let requestId=++containerDataRequestSeq;containerDataCallbacks.set(requestId,{success:onSuccess,failure:onFailure});try{window.top?.postMessage({source:SRC,type:"containerDataRequest",requestId,action,params},"*")}catch(error48){containerDataCallbacks.delete(requestId),onFailure(error48 instanceof Error?error48.message:String(error48))}}function requestOpen(url2,callbackId,webdialog,params){let overlay=resolveOverlayPresentation(url2,params,webdialog),popBeforeOpen=requestsPopBeforeOpen(url2,params),popId=typeof params?.__mearlMegaPopId=="string"?params.__mearlMegaPopId:null;isTop?openLayer(url2,callbackId,overlay,window,!0,popId):window.top?.postMessage({source:SRC,type:"open",url:url2,callbackId,overlay,popBeforeOpen,popId},"*")}function requestClose(data){let payload;try{payload=data===void 0?void 0:JSON.parse(JSON.stringify(data))}catch{payload=void 0}isTop?requestCloseOnTop(payload):window.top?.postMessage({source:SRC,type:"close",data:payload},"*")}if(window.addEventListener("message",event=>{let msg=event.data;if(!(!msg||typeof msg!="object")){if(msg.source==="mearl-content"&&(msg.type==="APP_BRIDGE_SIMULATOR_VISIBILITY"||msg.type==="APP_BRIDGE_RUNTIME_RESPONSES")){if(!isTop||event.source!==window)return;if(msg.type==="APP_BRIDGE_SIMULATOR_VISIBILITY"&&typeof msg.hidden=="boolean"){simulatedPageHidden=msg.hidden,links.getBridgeProtocol().handlePageVisibility(msg.hidden);let lifecycleMessage={source:SRC,type:"simulatorVisibility",hidden:msg.hidden};rootFrame?.contentWindow?.postMessage(lifecycleMessage,"*");for(let layer of layers)layer.closing||layer.frame.contentWindow?.postMessage(lifecycleMessage,"*")}else if(msg.type==="APP_BRIDGE_RUNTIME_RESPONSES"&&msg.profile===config2.profile&&msg.responses&&typeof msg.responses=="object"&&!Array.isArray(msg.responses)){let responses=msg.responses;runtimeResponses={...runtimeResponses??{},...responses},links.getBridgeProtocol().applyRuntimeResponses(responses);let configMessage={source:SRC,type:"runtimeResponses",profile:config2.profile,responses};rootFrame?.contentWindow?.postMessage(configMessage,"*");for(let layer of layers)layer.closing||layer.frame.contentWindow?.postMessage(configMessage,"*")}return}if(msg.source===SRC){if(isTop){let sourceLayer=layerForWindow(event.source),sourceIsRoot=!!(rootFrame?.contentWindow&&rootFrame.contentWindow===event.source);if(!sourceLayer&&!sourceIsRoot)return;if(msg.type==="open"&&typeof msg.url=="string"){let rawOverlay=msg.overlay&&typeof msg.overlay=="object"?msg.overlay:void 0,overlay=rawOverlay?{topRatio:numberParam(rawOverlay.topRatio,.2,0,1),widthRatio:numberParam(rawOverlay.widthRatio,1,0,1),radius:numberParam(rawOverlay.radius,0,0,50),maskAlpha:numberParam(rawOverlay.maskAlpha,.3,0,1),tapClose:boolParam(rawOverlay.tapClose,!0)}:resolveOverlayPresentation(msg.url,void 0,!1),callbackId=typeof msg.callbackId=="number"?msg.callbackId:0,popId=typeof msg.popId=="string"&&msg.popId?msg.popId:null;splitScreenActive&&sourceIsRoot?openFromSplitRoot(msg.url,callbackId,overlay,event.source??window,popId):msg.popBeforeOpen===!0&&sourceLayer?replaceLayer(sourceLayer,msg.url,callbackId,overlay,popId):openLayer(msg.url,callbackId,overlay,event.source??window,!0,popId)}else if(msg.type==="close")requestCloseOnTop(msg.data);else if(msg.type==="closeAll"){let gotoEvent=msg.gotoEvent===!0;if(gotoEvent&&sourceIsRoot&&layers.length===0&&msg.data!==void 0)try{event.source.postMessage({source:SRC,type:"resume",data:msg.data,storageId:null,callbackId:0,final:!0,gotoEvent:!0},"*")}catch{}else closeAllLayers(msg.data,gotoEvent)}else if(msg.type==="appMessageToOpener"&&sourceLayer){let target=sourceLayer.openerWin;if(target===window)links.getBridgeProtocol().handleAppMessage(msg.message);else try{target.postMessage({source:SRC,type:"appMessage",message:msg.message},"*")}catch{}}else if(msg.type==="containerDataRequest"&&typeof msg.requestId=="number"&&typeof msg.action=="string"&&msg.params&&typeof msg.params=="object"&&!Array.isArray(msg.params)&&event.source){let result=executeContainerData(msg.action,msg.params);try{event.source.postMessage({source:SRC,type:"containerDataResponse",requestId:msg.requestId,success:result.success,value:result.value},"*")}catch{}}else if(msg.type==="nativeBackResult"&&typeof msg.requestId=="number"&&typeof msg.handled=="boolean"&&event.source)finishNativeBack(msg.requestId,event.source,msg.handled);else if(msg.type==="urlChanged"&&typeof msg.url=="string"){let topLayer=layers[layers.length-1];if(sourceIsRoot){try{let target=new URL(msg.url,location.href);if(!/^https?:$/.test(target.protocol))return;rootBusinessUrl=target.href}catch{return}if(topLayer)return;let mapped=mapUrlForSync(rootBusinessUrl,!1);if(mapped)try{history.replaceState({__mearl_layer__:0},"",mapped)}catch{}}else if(topLayer&&!topLayer.closing&&sourceLayer===topLayer){topLayer.url=msg.url,topLayer.titleBarStateExplicit&&topLayer.titleBarState&&cacheExplicitTitleBarState(topLayer,topLayer.titleBarState);let mapped=mapUrlForSync(msg.url);if(mapped)try{history.replaceState({__mearl_layer__:layers.length},"",mapped)}catch{}}}else if(msg.type==="title"&&typeof msg.title=="string"){let topLayer=layers[layers.length-1];if(sourceIsRoot&&!topLayer)try{document.title=msg.title,syncSimulatedTitleBar()}catch{}else if(topLayer&&sourceLayer===topLayer){document.title=msg.title;let state=resolvedTitleBarState(topLayer);topLayer.titleBarState={...state,title:msg.title},syncLayerViewport(topLayer,topLayer.titleBarState)}}else if(msg.type==="titleBarState"){let state=parseReportedTitleBarState(msg.state);if(state&&sourceIsRoot)links.getSystemBars().setPresentedRootTitleBarState(state);else if(state&&sourceLayer){let explicit=msg.explicit===!0;sourceLayer.titleBarStateReady=!0,explicit?(sourceLayer.titleBarState=state,sourceLayer.titleBarStateExplicit=!0,cacheExplicitTitleBarState(sourceLayer,state)):sourceLayer.titleBarStateExplicit||(sourceLayer.titleBarState=state);let resolvedState=sourceLayer.titleBarState??state;syncLayerViewport(sourceLayer,resolvedState)}}}else if(msg.type==="requestTitleBarState"){if(event.source!==window.top)return;syncSimulatedTitleBar()}else if(msg.type==="simulatorVisibility"&&typeof msg.hidden=="boolean"){if(event.source!==window.top)return;links.getBridgeProtocol().handlePageVisibility(msg.hidden)}else if(msg.type==="appMessage"){if(event.source!==window.top)return;links.getBridgeProtocol().handleAppMessage(msg.message)}else if(msg.type==="nativeBack"&&typeof msg.requestId=="number"){if(event.source!==window.top)return;let handled=links.getBridgeProtocol().handleNativeBack();window.top?.postMessage({source:SRC,type:"nativeBackResult",requestId:msg.requestId,handled},"*")}else if(msg.type==="containerDataResponse"&&typeof msg.requestId=="number"){if(event.source!==window.top)return;let callback=containerDataCallbacks.get(msg.requestId);if(!callback)return;containerDataCallbacks.delete(msg.requestId),msg.success===!0?callback.success(msg.value):callback.failure(msg.value)}else if(msg.type==="runtimeResponses"&&msg.profile===config2.profile&&msg.responses&&typeof msg.responses=="object"&&!Array.isArray(msg.responses)){if(event.source!==window.top)return;links.getBridgeProtocol().applyRuntimeResponses(msg.responses)}else if(msg.type==="resume"){if(event.source!==window.top)return;links.getBridgeProtocol().handleResume({data:msg.data,storageId:msg.storageId??null,callbackId:typeof msg.callbackId=="number"?msg.callbackId:0,final:msg.final===!0,gotoEvent:msg.gotoEvent===!0,silent:msg.silent===!0})}else event.source!==window.top&&window.top?.postMessage(msg,"*");return}pageTransport.handleMessage(msg)}}),!isTop&&isContainerFrame){let reportUrl=()=>{try{window.top?.postMessage({source:SRC,type:"urlChanged",url:restoreLayerBusinessUrl(location.href)},"*")}catch{}};try{let origPushState=history.pushState.bind(history),origReplaceState=history.replaceState.bind(history);history.pushState=function(...args){origPushState(...args),reportUrl()},history.replaceState=function(...args){origReplaceState(...args),reportUrl()},window.addEventListener("popstate",reportUrl),window.addEventListener("hashchange",reportUrl),window.addEventListener("pageshow",reportUrl),document.readyState==="complete"&&reportUrl()}catch{}}if(isContainerFrame){let requestProxyLocationOpen=url2=>{if(links.getBridgeProtocol().handleMaybeScheme(url2))return!0;try{let current=new URL(restoreLayerBusinessUrl(location.href)),target=new URL(url2,current);return!/^https?:$/.test(target.protocol)||target.origin===current.origin&&target.pathname===current.pathname&&target.search===current.search?!1:(requestOpen(target.href,0,!1),!0)}catch{return!1}};Object.defineProperty(window,"__PROXY_LOCATION__",{value:{get href(){return location.href},set href(url2){requestProxyLocationOpen(url2)||(location.href=mapLayerFrameUrl(url2))},replace(url2){links.getBridgeProtocol().handleMaybeScheme(url2)||location.replace(mapLayerFrameUrl(url2))},assign(url2){requestProxyLocationOpen(url2)||location.assign(mapLayerFrameUrl(url2))}},writable:!1,configurable:!0})}if(isContainerFrame){document.addEventListener("click",event=>{let el=event.target;for(;el&&el.tagName!=="A";)el=el.parentElement;if(!el)return;let href=el.getAttribute("href");if(href){if(links.getBridgeProtocol().handleMaybeScheme(href)){event.preventDefault(),event.stopPropagation();return}/^https?:/i.test(href)&&el.getAttribute("target")==="_blank"&&(event.preventDefault(),event.stopPropagation(),requestOpen(href,0,!1))}},!0);let origOpen=window.open;window.open=function(url2,target,features){let urlStr=typeof url2=="string"?url2:url2 instanceof URL?url2.href:"";return links.getBridgeProtocol().handleMaybeScheme(urlStr)?null:/^https?:/i.test(urlStr)?(requestOpen(urlStr,0,!1),null):origOpen?origOpen.call(window,url2,target,features):null};try{let proto=Location.prototype,origAssign=proto.assign,origReplace=proto.replace;origAssign&&(proto.assign=function(url2){if(links.getBridgeProtocol().handleMaybeScheme(url2))return;let upgraded=location.protocol==="https:"&&url2.startsWith("http:")?"https:"+url2.slice(5):url2;origAssign.call(this,upgraded)}),origReplace&&(proto.replace=function(url2){if(links.getBridgeProtocol().handleMaybeScheme(url2))return;let upgraded=location.protocol==="https:"&&url2.startsWith("http:")?"https:"+url2.slice(5):url2;origReplace.call(this,upgraded)})}catch{}}return log2("容器环境已就绪",isTop?"(top)":isRootFrame?"(root)":isLayerFrame?"(layer)":"(iframe,仅桥)"),{getRootFrame:()=>rootFrame,hasRootOverlay:()=>rootOverlayActive,getLayers:()=>layers,getClosingLayerCount:()=>closingLayerCount,requestOpen,requestClose,requestNativeBack,requestContainerData,closeAllLayers}}var APP_PROFILE_RUNTIME_FACTORIES={documentTransport:installRootWebViewDocumentTransport,environment:installAppProfileEnvironment,containerStack:installAppProfileContainerStack,bridgeProtocol:installAppProfileBridgeProtocol,pageTransport:installAppProfilePageTransport,systemBars:installAppProfileSystemBars};function buildAppProfileRuntimeCallSource(configExpression){return`(${installAppProfileRuntime.toString()})(${configExpression},{documentTransport:${installRootWebViewDocumentTransport.toString()},environment:${installAppProfileEnvironment.toString()},pageTransport:${installAppProfilePageTransport.toString()},containerStack:${installAppProfileContainerStack.toString()},systemBars:${installAppProfileSystemBars.toString()},bridgeProtocol:${installAppProfileBridgeProtocol.toString()}})`}function installAppProfileRuntime(config2,factories=APP_PROFILE_RUNTIME_FACTORIES){factories.documentTransport();let environment=factories.environment(config2);if(!environment)return;let pageTransport=factories.pageTransport(config2,environment),containerStack=factories.containerStack(config2,environment,{pageTransport,getSystemBars:()=>systemBars,getBridgeProtocol:()=>bridgeProtocol}),systemBars=factories.systemBars(config2,environment,{getRootFrame:containerStack.getRootFrame,hasRootOverlay:containerStack.hasRootOverlay,getLayers:containerStack.getLayers,getClosingLayerCount:containerStack.getClosingLayerCount,requestClose:containerStack.requestClose,requestNativeBack:containerStack.requestNativeBack}),bridgeProtocol=factories.bridgeProtocol(config2,environment,{pageTransport,systemBars,requestOpen:containerStack.requestOpen,requestClose:containerStack.requestClose,requestCloseAll:containerStack.closeAllLayers,requestContainerData:containerStack.requestContainerData})}init_dist4();import https from"node:https";import http3 from"node:http";var TYPE_INTO_ELEMENT_SRC=typeIntoElement.toString(),CLICK_ELEMENT_VIA_JS_SRC=clickElementViaJS.toString(),GET_CLICK_COORDS_FROM_NODE_SRC=getClickCoordsFromNode.toString();async function readCdpCurrentUrl(session,action){let url2=(await session.client.sendCommand("Runtime.evaluate",{expression:"location.href",returnByValue:!0})).result?.value;if(typeof url2!="string"||!url2)throw new Error(`${action}: could not read the current page URL`);return session.url=url2,url2}function nodeFetch(urlStr,options={}){return new Promise((resolve11,reject)=>{let url2=new URL(urlStr),isHttps=url2.protocol==="https:",lib=isHttps?https:http3,{method="GET",headers={},body,timeoutMs=3e4}=options,req=lib.request({host:url2.hostname,port:url2.port||(isHttps?443:80),path:url2.pathname+url2.search,method,headers},res=>{let responseHeaders={};for(let[key,value]of Object.entries(res.headers))typeof value=="string"?responseHeaders[key]=value:Array.isArray(value)&&(responseHeaders[key]=value.join(", "));let chunks=[];res.on("data",chunk=>chunks.push(Buffer.from(chunk))),res.on("end",()=>{let bodyBuffer=Buffer.concat(chunks);resolve11({status:res.statusCode??0,statusText:res.statusMessage??"",headers:responseHeaders,body:bodyBuffer.toString("utf-8"),bodyBuffer,setCookies:res.headers["set-cookie"]??[]})})});req.on("error",reject),req.setTimeout(timeoutMs,()=>{req.destroy(),reject(new Error(`Request timeout: ${urlStr}`))}),body&&req.write(body),req.end()})}async function getCookiesForUrl(session,targetUrl){let result=await session.client.sendCommand("Network.getAllCookies");return selectRequestCookies(result.cookies??[],targetUrl)}async function waitForPageLoad(session,timeoutMs,options={}){if(options.probeReadyState!==!1&&isCdpDeviceShellActive(session)){let deadline=Date.now()+timeoutMs;for(;Date.now()<deadline;){if((await sendCdpDeviceShellPageCommand(session,"Runtime.evaluate",{expression:"document.readyState",returnByValue:!0}).catch(()=>null))?.result?.value==="complete")return;await new Promise(resolve11=>setTimeout(resolve11,50))}throw new Error(`Page load timeout after ${timeoutMs}ms`)}return new Promise((resolve11,reject)=>{let settled=!1,removeLoadListener=()=>{},finish=error48=>{settled||(settled=!0,clearTimeout(timer),removeLoadListener(),error48?reject(error48):resolve11())},timer=setTimeout(()=>{finish(new Error(`Page load timeout after ${timeoutMs}ms`))},timeoutMs);removeLoadListener=session.client.on("Page.loadEventFired",()=>finish()),options.probeReadyState!==!1&&session.client.sendCommand("Runtime.evaluate",{expression:"document.readyState",returnByValue:!0}).then(result=>{result.result?.value==="complete"&&finish()}).catch(()=>{})})}async function toCdpInputPoint(session,x,y){if(isCdpDeviceShellActive(session)){let offset=await getCdpDeviceShellInputOffset(session);return{x:x+offset.x,y:y+offset.y}}return{x,y}}async function dispatchCdpClick(session,x,y,pointerType){let point=await toCdpInputPoint(session,x,y);if(pointerType==="touch"){await dispatchPairedPageInputCommands(()=>sendCdpInputCommand(session,"Input.dispatchTouchEvent",{type:"touchStart",touchPoints:[point]}),()=>sendCdpInputCommand(session,"Input.dispatchTouchEvent",{type:"touchEnd",touchPoints:[]}));return}await sendCdpInputCommand(session,"Input.dispatchMouseEvent",{type:"mouseMoved",x:point.x,y:point.y}),await dispatchPairedPageInputCommands(()=>sendCdpInputCommand(session,"Input.dispatchMouseEvent",{type:"mousePressed",x:point.x,y:point.y,button:"left",buttons:1,clickCount:1}),()=>sendCdpInputCommand(session,"Input.dispatchMouseEvent",{type:"mouseReleased",x:point.x,y:point.y,button:"left",buttons:0,clickCount:1}))}async function dispatchCdpDrag(session,from,to,pointerType,durationMs){let[start,end]=await Promise.all([toCdpInputPoint(session,from.x,from.y),toCdpInputPoint(session,to.x,to.y)]),path27=buildPageDragPath(start,end,durationMs),waitForNextPoint=async()=>{path27.intervalMs<=0||await new Promise(resolve11=>setTimeout(resolve11,path27.intervalMs))};if(pointerType==="touch"){await sendCdpInputCommand(session,"Input.dispatchTouchEvent",{type:"touchStart",touchPoints:[start]});let primaryError2;try{for(let point of path27.points)await waitForNextPoint(),await sendCdpInputCommand(session,"Input.dispatchTouchEvent",{type:"touchMove",touchPoints:[point]})}catch(error48){throw primaryError2=error48,error48}finally{await sendCdpInputCommand(session,"Input.dispatchTouchEvent",{type:"touchEnd",touchPoints:[]}).catch(error48=>{if(primaryError2===void 0)throw error48})}return{steps:path27.points.length}}await sendCdpInputCommand(session,"Input.dispatchMouseEvent",{type:"mouseMoved",x:start.x,y:start.y}),await sendCdpInputCommand(session,"Input.dispatchMouseEvent",{type:"mousePressed",x:start.x,y:start.y,button:"left",buttons:1,clickCount:1});let primaryError;try{for(let point of path27.points)await waitForNextPoint(),await sendCdpInputCommand(session,"Input.dispatchMouseEvent",{type:"mouseMoved",x:point.x,y:point.y,button:"left",buttons:1})}catch(error48){throw primaryError=error48,error48}finally{await sendCdpInputCommand(session,"Input.dispatchMouseEvent",{type:"mouseReleased",x:end.x,y:end.y,button:"left",buttons:0,clickCount:1}).catch(error48=>{if(primaryError===void 0)throw error48})}return{steps:path27.points.length}}async function sendCdpInputCommand(session,method,params){try{await session.client.sendCommand(method,params,1e4)}catch(error48){if(error48 instanceof Error&&error48.message===`CDP command timeout: ${method}`){let eventType=typeof params.type=="string"?` (${params.type})`:"",targetHint=method==="Input.dispatchTouchEvent"?'Touch input can stall on a hidden, background, or headless target; use clickMode "auto" or make the target visible. ':"",message=`CDP ${method}${eventType} timed out after ${1e4}ms. `+targetHint+"The page may already have changed; verify its current state before retrying.";throw/^(mousePressed|mouseReleased|touchStart|touchEnd)$/.test(String(params.type??""))?new PageActionDispatchUncertainError(message,{cause:error48,attempt:{inputCommand:{method,type:String(params.type??"")}}}):new Error(message,{cause:error48})}throw error48}}async function resolveBackendNodeObjectId(session,backendNodeId){let objectId=(await sendCdpDeviceShellPageCommand(session,"DOM.resolveNode",{backendNodeId})).object?.objectId;if(!objectId)throw new Error(`Cannot resolve element for backendNodeId ${backendNodeId}`);return objectId}var SCREENSHOT_HIDDEN_DISPLAY_PROPERTIES=["--mearl-side-panel-toggle-display","--mearl-device-cutout-display"],screenshotQueueTails=new WeakMap;async function runScreenshotExclusive(session,operation){let previous=screenshotQueueTails.get(session)??Promise.resolve(),unlock,tail=new Promise(resolve11=>{unlock=resolve11});screenshotQueueTails.set(session,tail),await previous;try{return await operation()}finally{unlock(),screenshotQueueTails.get(session)===tail&&screenshotQueueTails.delete(session)}}async function hideScreenshotArtifacts(session){return(await session.client.sendCommand("Runtime.evaluate",{expression:`
1697
1697
  (() => {
1698
1698
  const root = document.documentElement;
1699
1699
  if (!root) return [];
@@ -1741,7 +1741,7 @@ Content-Type: ${file2.contentType}\r
1741
1741
  \r
1742
1742
  `),file2.content,Buffer.from(`\r
1743
1743
  `))}return chunks.push(Buffer.from(`--${boundary}--\r
1744
- `)),{contentType:`multipart/form-data; boundary=${boundary}`,body:Buffer.concat(chunks)}}function hasMultipartPayload(data){return data.formData!==void 0||data.files!==void 0}async function executeNodeSendRequest(data,cookies=[],onResponseCookies){let{url:url2,method="GET",headers={},params,body,formData,files,responseType="auto",timeout=3e4}=data;if(!url2||typeof url2!="string"||url2.trim()==="")throw new Error("Invalid url: url must be a non-empty string");let normalizedMethod=method.toUpperCase();if(!ALLOWED_METHODS.has(normalizedMethod))throw new Error(`Invalid method: ${method}. Allowed: ${[...ALLOWED_METHODS].join(", ")}`);if(!Number.isFinite(timeout)||timeout<=0)throw new Error("timeout must be a positive number");let targetUrl=new URL(url2);for(let[key,value]of Object.entries(params??{}))targetUrl.searchParams.set(key,String(value));let requestHeaders={Accept:"application/json, text/plain, */*","Accept-Language":"zh-CN,zh;q=0.9,en;q=0.8","User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36",...headers},resolvedSourceHeaders=getSendRequestSourceHeaders(targetUrl,headers);resolvedSourceHeaders.referer?setHeader(requestHeaders,"Referer",resolvedSourceHeaders.referer):removeHeader(requestHeaders,"Referer"),resolvedSourceHeaders.origin?setHeader(requestHeaders,"Origin",resolvedSourceHeaders.origin):removeHeader(requestHeaders,"Origin");let cookieHeader=serializeRequestCookies(cookies);cookieHeader&&setHeader(requestHeaders,"Cookie",cookieHeader);let xsrfToken=cookies.find(cookie=>cookie.name==="XSRF-TOKEN")?.value;xsrfToken&&!findSendRequestHeaderName(requestHeaders,"x-xsrf-token")&&setHeader(requestHeaders,"X-XSRF-TOKEN",xsrfToken);let requestBody,rawBodyFile=getSendRequestBodyFile(data);if(rawBodyFile){let[file2]=await readMultipartFiles([rawBodyFile]);requestBody=file2.content,findSendRequestHeaderName(requestHeaders,"content-type")||setHeader(requestHeaders,"Content-Type",file2.contentType),setHeader(requestHeaders,"Content-Length",String(requestBody.byteLength))}else if(hasMultipartPayload(data)){if(body!=null)throw new Error("body cannot be combined with formData or files");if(normalizedMethod==="GET"||normalizedMethod==="HEAD")throw new Error(`${normalizedMethod} requests cannot use formData or files`);if(findSendRequestHeaderName(requestHeaders,"content-type"))throw new Error("Do not set Content-Type when using formData or files; Mearl sets the boundary");let multipart=await buildMultipartBody(formData,files);requestBody=multipart.body,setHeader(requestHeaders,"Content-Type",multipart.contentType),setHeader(requestHeaders,"Content-Length",String(multipart.body.byteLength))}else body!=null&&!["GET","HEAD"].includes(normalizedMethod)&&(typeof body=="string"?(requestBody=body,findSendRequestHeaderName(requestHeaders,"content-type")||setHeader(requestHeaders,"Content-Type","text/plain")):(requestBody=JSON.stringify(body),findSendRequestHeaderName(requestHeaders,"content-type")||setHeader(requestHeaders,"Content-Type","application/json")));let result=await nodeFetch(targetUrl.toString(),{method:normalizedMethod,headers:requestHeaders,body:requestBody,timeoutMs:timeout}),cookieSync=data.withCookies!==!1?await onResponseCookies?.(targetUrl.href,result.setCookies):void 0,contentType2=(result.headers["content-type"]??"").split(";")[0].trim().toLowerCase(),responseHeaders=Object.fromEntries(Object.entries(result.headers).filter(([name])=>name.toLowerCase()!=="set-cookie"&&name.toLowerCase()!=="set-cookie2")),responseBody,bodyType;if(responseType==="auto"&&isBinarySendRequestContentType(contentType2))responseBody=result.bodyBuffer.toString("base64"),bodyType="base64";else{let trimmed=result.body.trimStart();if(responseType==="json"||responseType==="auto"&&contentType2.includes("application/json")||responseType==="auto"&&(trimmed.startsWith("{")||trimmed.startsWith("[")))try{responseBody=JSON.parse(result.body),bodyType="json"}catch{if(responseType==="json")throw new Error("send_request expected a JSON response");responseBody=result.body,bodyType="text"}else responseBody=result.body,bodyType="text"}return{success:!0,status:result.status,statusText:result.statusText,headers:responseHeaders,body:responseBody,bodyType,attachedCookieCount:cookies.length,...cookieSync?{cookieSync}:{}}}var import_tldts=__toESM(require_cjs(),1);function pathMatch(reqPath,cookiePath){return!!(cookiePath===reqPath||reqPath.indexOf(cookiePath)===0&&(cookiePath[cookiePath.length-1]==="/"||reqPath.startsWith(cookiePath)&&reqPath[cookiePath.length]==="/"))}var SPECIAL_USE_DOMAINS=["local","example","invalid","localhost","test"],SPECIAL_TREATMENT_DOMAINS=["localhost","invalid"],defaultGetPublicSuffixOptions={allowSpecialUseDomain:!1,ignoreError:!1};function getPublicSuffix(domain2,options={}){options={...defaultGetPublicSuffixOptions,...options};let domainParts=domain2.split("."),topLevelDomain=domainParts[domainParts.length-1],allowSpecialUseDomain=!!options.allowSpecialUseDomain,ignoreError=!!options.ignoreError;if(allowSpecialUseDomain&&topLevelDomain!==void 0&&SPECIAL_USE_DOMAINS.includes(topLevelDomain)){if(domainParts.length>1)return`${domainParts[domainParts.length-2]}.${topLevelDomain}`;if(SPECIAL_TREATMENT_DOMAINS.includes(topLevelDomain))return topLevelDomain}if(!ignoreError&&topLevelDomain!==void 0&&SPECIAL_USE_DOMAINS.includes(topLevelDomain))throw new Error(`Cookie has domain set to the public suffix "${topLevelDomain}" which is a special use domain. To allow this, configure your CookieJar with {allowSpecialUseDomain: true, rejectPublicSuffixes: false}.`);let publicSuffix=(0,import_tldts.getDomain)(domain2,{allowIcannDomains:!0,allowPrivateDomains:!0});if(publicSuffix)return publicSuffix}function permuteDomain(domain2,allowSpecialUseDomain){let pubSuf=getPublicSuffix(domain2,{allowSpecialUseDomain});if(!pubSuf)return;if(pubSuf==domain2)return[domain2];domain2.slice(-1)=="."&&(domain2=domain2.slice(0,-1));let parts=domain2.slice(0,-(pubSuf.length+1)).split(".").reverse(),cur=pubSuf,permutations=[cur];for(;parts.length;)cur=`${parts.shift()}.${cur}`,permutations.push(cur);return permutations}var Store=class{constructor(){this.synchronous=!1}findCookie(_domain,_path,_key,_callback){throw new Error("findCookie is not implemented")}findCookies(_domain,_path,_allowSpecialUseDomain=!1,_callback){throw new Error("findCookies is not implemented")}putCookie(_cookie,_callback){throw new Error("putCookie is not implemented")}updateCookie(_oldCookie,_newCookie,_callback){throw new Error("updateCookie is not implemented")}removeCookie(_domain,_path,_key,_callback){throw new Error("removeCookie is not implemented")}removeCookies(_domain,_path,_callback){throw new Error("removeCookies is not implemented")}removeAllCookies(_callback){throw new Error("removeAllCookies is not implemented")}getAllCookies(_callback){throw new Error("getAllCookies is not implemented (therefore jar cannot be serialized)")}},objectToString=obj=>Object.prototype.toString.call(obj),safeArrayToString=(arr,seenArrays)=>typeof arr.join!="function"?objectToString(arr):(seenArrays.add(arr),arr.map(val=>val==null||seenArrays.has(val)?"":safeToStringImpl(val,seenArrays)).join()),safeToStringImpl=(val,seenArrays=new WeakSet)=>typeof val!="object"||val===null?String(val):typeof val.toString=="function"?Array.isArray(val)?safeArrayToString(val,seenArrays):String(val):objectToString(val),safeToString=val=>safeToStringImpl(val);function createPromiseCallback(cb){let callback,resolve11,reject,promise2=new Promise((_resolve,_reject)=>{resolve11=_resolve,reject=_reject});return typeof cb=="function"?callback=(err,result)=>{try{err?cb(err):cb(null,result)}catch(e){reject(e instanceof Error?e:new Error)}}:callback=(err,result)=>{try{err?reject(err):resolve11(result)}catch(e){reject(e instanceof Error?e:new Error)}},{promise:promise2,callback,resolve:value=>(callback(null,value),promise2),reject:error48=>(callback(error48),promise2)}}function inOperator(k,o){return k in o}var MemoryCookieStore=class extends Store{constructor(){super(),this.synchronous=!0,this.idx=Object.create(null)}findCookie(domain2,path27,key,callback){let promiseCallback=createPromiseCallback(callback);if(domain2==null||path27==null||key==null)return promiseCallback.resolve(void 0);let result=this.idx[domain2]?.[path27]?.[key];return promiseCallback.resolve(result)}findCookies(domain2,path27,allowSpecialUseDomain=!1,callback){typeof allowSpecialUseDomain=="function"&&(callback=allowSpecialUseDomain,allowSpecialUseDomain=!0);let results=[],promiseCallback=createPromiseCallback(callback);if(!domain2)return promiseCallback.resolve([]);let pathMatcher;path27?pathMatcher=function(domainIndex){for(let cookiePath in domainIndex)if(pathMatch(path27,cookiePath)){let pathIndex=domainIndex[cookiePath];for(let key in pathIndex){let value=pathIndex[key];value&&results.push(value)}}}:pathMatcher=function(domainIndex){for(let curPath in domainIndex){let pathIndex=domainIndex[curPath];for(let key in pathIndex){let value=pathIndex[key];value&&results.push(value)}}};let domains=permuteDomain(domain2,allowSpecialUseDomain)||[domain2],idx=this.idx;return domains.forEach(curDomain=>{let domainIndex=idx[curDomain];domainIndex&&pathMatcher(domainIndex)}),promiseCallback.resolve(results)}putCookie(cookie,callback){let promiseCallback=createPromiseCallback(callback),{domain:domain2,path:path27,key}=cookie;if(domain2==null||path27==null||key==null)return promiseCallback.resolve(void 0);let domainEntry=this.idx[domain2]??Object.create(null);this.idx[domain2]=domainEntry;let pathEntry=domainEntry[path27]??Object.create(null);return domainEntry[path27]=pathEntry,pathEntry[key]=cookie,promiseCallback.resolve(void 0)}updateCookie(_oldCookie,newCookie,callback){if(callback)this.putCookie(newCookie,callback);else return this.putCookie(newCookie)}removeCookie(domain2,path27,key,callback){let promiseCallback=createPromiseCallback(callback);return delete this.idx[domain2]?.[path27]?.[key],promiseCallback.resolve(void 0)}removeCookies(domain2,path27,callback){let promiseCallback=createPromiseCallback(callback),domainEntry=this.idx[domain2];return domainEntry&&(path27?delete domainEntry[path27]:delete this.idx[domain2]),promiseCallback.resolve(void 0)}removeAllCookies(callback){let promiseCallback=createPromiseCallback(callback);return this.idx=Object.create(null),promiseCallback.resolve(void 0)}getAllCookies(callback){let promiseCallback=createPromiseCallback(callback),cookies=[],idx=this.idx;return Object.keys(idx).forEach(domain2=>{let domainEntry=idx[domain2]??{};Object.keys(domainEntry).forEach(path27=>{let pathEntry=domainEntry[path27]??{};Object.keys(pathEntry).forEach(key=>{let keyEntry=pathEntry[key];keyEntry!=null&&cookies.push(keyEntry)})})}),cookies.sort((a,b)=>(a.creationIndex||0)-(b.creationIndex||0)),promiseCallback.resolve(cookies)}};function isNonEmptyString(data){return isString(data)&&data!==""}function isEmptyString(data){return data===""||data instanceof String&&data.toString()===""}function isString(data){return typeof data=="string"||data instanceof String}function isObject3(data){return objectToString(data)==="[object Object]"}function validate(bool,cbOrMessage,message){if(bool)return;let cb=typeof cbOrMessage=="function"?cbOrMessage:void 0,options=typeof cbOrMessage=="function"?message:cbOrMessage;isObject3(options)||(options="[object Object]");let err=new ParameterError(safeToString(options));if(cb)cb(err);else throw err}var ParameterError=class extends Error{},version="6.0.0",PrefixSecurityEnum={SILENT:"silent",STRICT:"strict",DISABLED:"unsafe-disabled"};Object.freeze(PrefixSecurityEnum);var IP_V6_REGEX=`
1744
+ `)),{contentType:`multipart/form-data; boundary=${boundary}`,body:Buffer.concat(chunks)}}function hasMultipartPayload(data){return data.formData!==void 0||data.files!==void 0}async function executeNodeSendRequest(data,cookies=[],onResponseCookies){let{url:url2,method="GET",headers={},params,body,formData,files,responseType="auto",timeout=3e4}=data;if(!url2||typeof url2!="string"||url2.trim()==="")throw new Error("Invalid url: url must be a non-empty string");let normalizedMethod=method.toUpperCase();if(!ALLOWED_METHODS.has(normalizedMethod))throw new Error(`Invalid method: ${method}. Allowed: ${[...ALLOWED_METHODS].join(", ")}`);if(!Number.isFinite(timeout)||timeout<=0)throw new Error("timeout must be a positive number");let targetUrl=new URL(url2);for(let[key,value]of Object.entries(params??{}))targetUrl.searchParams.set(key,String(value));let requestHeaders={Accept:"application/json, text/plain, */*","Accept-Language":"zh-CN,zh;q=0.9,en;q=0.8","User-Agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36",...headers},resolvedSourceHeaders=getSendRequestSourceHeaders(targetUrl,headers);resolvedSourceHeaders.referer?setHeader(requestHeaders,"Referer",resolvedSourceHeaders.referer):removeHeader(requestHeaders,"Referer"),resolvedSourceHeaders.origin?setHeader(requestHeaders,"Origin",resolvedSourceHeaders.origin):removeHeader(requestHeaders,"Origin");let cookieHeader=serializeRequestCookies(cookies);cookieHeader&&setHeader(requestHeaders,"Cookie",cookieHeader);let xsrfToken=cookies.find(cookie=>cookie.name==="XSRF-TOKEN")?.value;xsrfToken&&!findSendRequestHeaderName(requestHeaders,"x-xsrf-token")&&setHeader(requestHeaders,"X-XSRF-TOKEN",xsrfToken);let requestBody,rawBodyFile=getSendRequestBodyFile(data);if(rawBodyFile){let[file2]=await readMultipartFiles([rawBodyFile]);requestBody=file2.content,findSendRequestHeaderName(requestHeaders,"content-type")||setHeader(requestHeaders,"Content-Type",file2.contentType),setHeader(requestHeaders,"Content-Length",String(requestBody.byteLength))}else if(hasMultipartPayload(data)){if(body!=null)throw new Error("body cannot be combined with formData or files");if(normalizedMethod==="GET"||normalizedMethod==="HEAD")throw new Error(`${normalizedMethod} requests cannot use formData or files`);if(findSendRequestHeaderName(requestHeaders,"content-type"))throw new Error("Do not set Content-Type when using formData or files; Mearl sets the boundary");let multipart=await buildMultipartBody(formData,files);requestBody=multipart.body,setHeader(requestHeaders,"Content-Type",multipart.contentType),setHeader(requestHeaders,"Content-Length",String(multipart.body.byteLength))}else body!=null&&!["GET","HEAD"].includes(normalizedMethod)&&(typeof body=="string"?(requestBody=body,findSendRequestHeaderName(requestHeaders,"content-type")||setHeader(requestHeaders,"Content-Type","text/plain")):(requestBody=JSON.stringify(body),findSendRequestHeaderName(requestHeaders,"content-type")||setHeader(requestHeaders,"Content-Type","application/json")));let result=await nodeFetch(targetUrl.toString(),{method:normalizedMethod,headers:requestHeaders,body:requestBody,timeoutMs:timeout}),cookieSync=data.withCookies!==!1?await onResponseCookies?.(targetUrl.href,result.setCookies):void 0,contentType2=(result.headers["content-type"]??"").split(";")[0].trim().toLowerCase(),responseHeaders=Object.fromEntries(Object.entries(result.headers).filter(([name])=>name.toLowerCase()!=="set-cookie"&&name.toLowerCase()!=="set-cookie2")),responseBody,bodyType;if(responseType==="auto"&&isBinarySendRequestContentType(contentType2))responseBody=result.bodyBuffer.toString("base64"),bodyType="base64";else{let trimmed=result.body.trimStart();if(responseType==="json"||responseType==="auto"&&contentType2.includes("application/json")||responseType==="auto"&&(trimmed.startsWith("{")||trimmed.startsWith("[")))try{responseBody=JSON.parse(result.body),bodyType="json"}catch{if(responseType==="json")throw new Error("send_request expected a JSON response");responseBody=result.body,bodyType="text"}else responseBody=result.body,bodyType="text"}return{success:!0,status:result.status,statusText:result.statusText,headers:responseHeaders,body:responseBody,bodyType,attachedCookieCount:cookies.length,...cookieSync?{cookieSync}:{}}}var import_tldts2=__toESM(require_cjs(),1);function pathMatch(reqPath,cookiePath){return!!(cookiePath===reqPath||reqPath.indexOf(cookiePath)===0&&(cookiePath[cookiePath.length-1]==="/"||reqPath.startsWith(cookiePath)&&reqPath[cookiePath.length]==="/"))}var SPECIAL_USE_DOMAINS=["local","example","invalid","localhost","test"],SPECIAL_TREATMENT_DOMAINS=["localhost","invalid"],defaultGetPublicSuffixOptions={allowSpecialUseDomain:!1,ignoreError:!1};function getPublicSuffix(domain2,options={}){options={...defaultGetPublicSuffixOptions,...options};let domainParts=domain2.split("."),topLevelDomain=domainParts[domainParts.length-1],allowSpecialUseDomain=!!options.allowSpecialUseDomain,ignoreError=!!options.ignoreError;if(allowSpecialUseDomain&&topLevelDomain!==void 0&&SPECIAL_USE_DOMAINS.includes(topLevelDomain)){if(domainParts.length>1)return`${domainParts[domainParts.length-2]}.${topLevelDomain}`;if(SPECIAL_TREATMENT_DOMAINS.includes(topLevelDomain))return topLevelDomain}if(!ignoreError&&topLevelDomain!==void 0&&SPECIAL_USE_DOMAINS.includes(topLevelDomain))throw new Error(`Cookie has domain set to the public suffix "${topLevelDomain}" which is a special use domain. To allow this, configure your CookieJar with {allowSpecialUseDomain: true, rejectPublicSuffixes: false}.`);let publicSuffix=(0,import_tldts2.getDomain)(domain2,{allowIcannDomains:!0,allowPrivateDomains:!0});if(publicSuffix)return publicSuffix}function permuteDomain(domain2,allowSpecialUseDomain){let pubSuf=getPublicSuffix(domain2,{allowSpecialUseDomain});if(!pubSuf)return;if(pubSuf==domain2)return[domain2];domain2.slice(-1)=="."&&(domain2=domain2.slice(0,-1));let parts=domain2.slice(0,-(pubSuf.length+1)).split(".").reverse(),cur=pubSuf,permutations=[cur];for(;parts.length;)cur=`${parts.shift()}.${cur}`,permutations.push(cur);return permutations}var Store=class{constructor(){this.synchronous=!1}findCookie(_domain,_path,_key,_callback){throw new Error("findCookie is not implemented")}findCookies(_domain,_path,_allowSpecialUseDomain=!1,_callback){throw new Error("findCookies is not implemented")}putCookie(_cookie,_callback){throw new Error("putCookie is not implemented")}updateCookie(_oldCookie,_newCookie,_callback){throw new Error("updateCookie is not implemented")}removeCookie(_domain,_path,_key,_callback){throw new Error("removeCookie is not implemented")}removeCookies(_domain,_path,_callback){throw new Error("removeCookies is not implemented")}removeAllCookies(_callback){throw new Error("removeAllCookies is not implemented")}getAllCookies(_callback){throw new Error("getAllCookies is not implemented (therefore jar cannot be serialized)")}},objectToString=obj=>Object.prototype.toString.call(obj),safeArrayToString=(arr,seenArrays)=>typeof arr.join!="function"?objectToString(arr):(seenArrays.add(arr),arr.map(val=>val==null||seenArrays.has(val)?"":safeToStringImpl(val,seenArrays)).join()),safeToStringImpl=(val,seenArrays=new WeakSet)=>typeof val!="object"||val===null?String(val):typeof val.toString=="function"?Array.isArray(val)?safeArrayToString(val,seenArrays):String(val):objectToString(val),safeToString=val=>safeToStringImpl(val);function createPromiseCallback(cb){let callback,resolve11,reject,promise2=new Promise((_resolve,_reject)=>{resolve11=_resolve,reject=_reject});return typeof cb=="function"?callback=(err,result)=>{try{err?cb(err):cb(null,result)}catch(e){reject(e instanceof Error?e:new Error)}}:callback=(err,result)=>{try{err?reject(err):resolve11(result)}catch(e){reject(e instanceof Error?e:new Error)}},{promise:promise2,callback,resolve:value=>(callback(null,value),promise2),reject:error48=>(callback(error48),promise2)}}function inOperator(k,o){return k in o}var MemoryCookieStore=class extends Store{constructor(){super(),this.synchronous=!0,this.idx=Object.create(null)}findCookie(domain2,path27,key,callback){let promiseCallback=createPromiseCallback(callback);if(domain2==null||path27==null||key==null)return promiseCallback.resolve(void 0);let result=this.idx[domain2]?.[path27]?.[key];return promiseCallback.resolve(result)}findCookies(domain2,path27,allowSpecialUseDomain=!1,callback){typeof allowSpecialUseDomain=="function"&&(callback=allowSpecialUseDomain,allowSpecialUseDomain=!0);let results=[],promiseCallback=createPromiseCallback(callback);if(!domain2)return promiseCallback.resolve([]);let pathMatcher;path27?pathMatcher=function(domainIndex){for(let cookiePath in domainIndex)if(pathMatch(path27,cookiePath)){let pathIndex=domainIndex[cookiePath];for(let key in pathIndex){let value=pathIndex[key];value&&results.push(value)}}}:pathMatcher=function(domainIndex){for(let curPath in domainIndex){let pathIndex=domainIndex[curPath];for(let key in pathIndex){let value=pathIndex[key];value&&results.push(value)}}};let domains=permuteDomain(domain2,allowSpecialUseDomain)||[domain2],idx=this.idx;return domains.forEach(curDomain=>{let domainIndex=idx[curDomain];domainIndex&&pathMatcher(domainIndex)}),promiseCallback.resolve(results)}putCookie(cookie,callback){let promiseCallback=createPromiseCallback(callback),{domain:domain2,path:path27,key}=cookie;if(domain2==null||path27==null||key==null)return promiseCallback.resolve(void 0);let domainEntry=this.idx[domain2]??Object.create(null);this.idx[domain2]=domainEntry;let pathEntry=domainEntry[path27]??Object.create(null);return domainEntry[path27]=pathEntry,pathEntry[key]=cookie,promiseCallback.resolve(void 0)}updateCookie(_oldCookie,newCookie,callback){if(callback)this.putCookie(newCookie,callback);else return this.putCookie(newCookie)}removeCookie(domain2,path27,key,callback){let promiseCallback=createPromiseCallback(callback);return delete this.idx[domain2]?.[path27]?.[key],promiseCallback.resolve(void 0)}removeCookies(domain2,path27,callback){let promiseCallback=createPromiseCallback(callback),domainEntry=this.idx[domain2];return domainEntry&&(path27?delete domainEntry[path27]:delete this.idx[domain2]),promiseCallback.resolve(void 0)}removeAllCookies(callback){let promiseCallback=createPromiseCallback(callback);return this.idx=Object.create(null),promiseCallback.resolve(void 0)}getAllCookies(callback){let promiseCallback=createPromiseCallback(callback),cookies=[],idx=this.idx;return Object.keys(idx).forEach(domain2=>{let domainEntry=idx[domain2]??{};Object.keys(domainEntry).forEach(path27=>{let pathEntry=domainEntry[path27]??{};Object.keys(pathEntry).forEach(key=>{let keyEntry=pathEntry[key];keyEntry!=null&&cookies.push(keyEntry)})})}),cookies.sort((a,b)=>(a.creationIndex||0)-(b.creationIndex||0)),promiseCallback.resolve(cookies)}};function isNonEmptyString(data){return isString(data)&&data!==""}function isEmptyString(data){return data===""||data instanceof String&&data.toString()===""}function isString(data){return typeof data=="string"||data instanceof String}function isObject3(data){return objectToString(data)==="[object Object]"}function validate(bool,cbOrMessage,message){if(bool)return;let cb=typeof cbOrMessage=="function"?cbOrMessage:void 0,options=typeof cbOrMessage=="function"?message:cbOrMessage;isObject3(options)||(options="[object Object]");let err=new ParameterError(safeToString(options));if(cb)cb(err);else throw err}var ParameterError=class extends Error{},version="6.0.0",PrefixSecurityEnum={SILENT:"silent",STRICT:"strict",DISABLED:"unsafe-disabled"};Object.freeze(PrefixSecurityEnum);var IP_V6_REGEX=`
1745
1745
  \\[?(?:
1746
1746
  (?:[a-fA-F\\d]{1,4}:){7}(?:[a-fA-F\\d]{1,4}|:)|
1747
1747
  (?:[a-fA-F\\d]{1,4}:){6}(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|:[a-fA-F\\d]{1,4}|:)|