UNPKG

mlld

Version:

mlld: llm scripting language

1 lines 73.1 kB
{"version":3,"sources":["../core/resolvers/utils/PathMatcher.ts","../core/resolvers/LocalResolver.ts"],"names":["PathMatcher","fileSystem","directoryCache","Map","CACHE_TTL","findMatch","targetPath","basePath","config","maxDepth","cfg","DEFAULT_CONFIG","includes","exact","confidence","enabled","fullPath","join","exists","path","undefined","cleanPath","startsWith","substring","segments","split","filter","s","length","depth","Math","max","exactPath","process","env","DEBUG_FUZZY","console","log","result","matchSegments","candidates","topConfidence","equalMatches","c","error","clearCache","clear","currentPath","currentSegment","remainingSegments","entries","getCachedDirectoryEntries","matches","findSegmentMatches","suggestions","generateSuggestions","slice","sort","a","b","typePriority","case","whitespace","fuzzy","matchType","results","match","subResult","push","equalResults","r","map","segment","entry","entryPath","stats","stat","entryParsed","parse","segmentParsed","entryName","isFile","name","segmentName","entryExt","ext","segmentExt","toLowerCase","caseInsensitive","normalizeWhitespace","normalizedEntry","normalizedSegment","calculateWhitespaceConfidence","str","replace","original","target","originalChars","getWhitespaceChars","targetChars","charPriority","originalPriority","targetPriority","priorityDiff","abs","dashes","underscores","spaces","score","calculateSimilarity","suggestionThreshold","str1","str2","s1","s2","maxLen","distance","levenshteinDistance","m","n","dp","Array","fill","i","j","min","dirPath","now","Date","cached","get","timestamp","readdir","set","LocalResolver","description","type","capabilities","io","read","write","list","contexts","import","output","supportedContentTypes","defaultContentType","priority","cache","strategy","pathMatcher","canResolve","ref","isAbsolute","resolve","ResolverError","resolverName","operation","relativePath","extractRelativePath","mldMdPath","content","readFile","metadata","source","mimeType","size","Buffer","byteLength","taint","contentType","mx","securePath","resolveFullPath","fuzzyConfig","fuzzyMatch","fuzzyEnabled","matchResult","candidatePaths","relative","reference","extname","existsAsIs","extensions","foundWithExtension","pathWithExt","extMatchResult","MlldFileNotFoundError","details","filePath","withMldMd","withMld","withMd","withLegacy","allowedExtensions","detectContentType","getMimeType","code","message","resolutionFailed","readonly","dir","dirname","mkdir","recursive","writeFile","originalError","prefix","isDirectory","entryStats","lastModified","validateConfig","errors","isArray","every","followSymlinks","checkAccess","dirExists","prefixMatch","normalizedBase","normalizedPath","normalizedFull","relativeParts","sep","p","mlldExtensions","hasMLLDExtension","some","endsWith","inferMlldMode","mode","success","hasModuleExports","ast","JSON","node","kind","mimeTypes"],"mappings":";;;;AAuDO,IAAMA,YAAAA,GAAN,MAAMA,YAAAA,CAAAA;AAWX,EAAA,WAAA,CAAoBC,UAAgC,EAAA;;AAH5CC,IAAAA,aAAAA,CAAAA,IAAAA,EAAAA,gBAAAA,sBAA4EC,GAAAA,EAAAA,CAAAA;AACnEC,IAAY,aAAA,CAAA,IAAA,EAAA,WAAA,EAAA,GAAA,CAAA;SAETH,UAAAA,GAAAA,UAAAA;AAAiC;;;;AAKrD,EAAA,MAAMI,SACJC,CAAAA,UAAAA,EACAC,QACAC,EAAAA,MAAAA,EACAC,QAC0B,EAAA;AAC1B,IAAA,MAAMC,GAAM,GAAA;AAAE,MAAA,GAAGV,YAAYW,CAAAA,cAAAA;MAAgB,GAAGH;AAAO,KAAA;AAGvD,IAAIF,IAAAA,UAAAA,CAAWM,QAAS,CAAA,IAAA,CAAO,EAAA;AAE7B,MAAO,OAAA;QAAEC,KAAO,EAAA,KAAA;QAAOC,UAAY,EAAA;AAAE,OAAA;AACvC;AAGA,IAAI,IAAA,CAACJ,IAAIK,OAAS,EAAA;AAChB,MAAMC,MAAAA,QAAAA,GAAgBC,KAAKV,CAAAA,IAAAA,CAAAA,QAAAA,EAAUD,UAAAA,CAAAA;AACrC,MAAA,MAAMY,MAAS,GAAA,MAAM,IAAKjB,CAAAA,UAAAA,CAAWiB,OAAOF,QAAAA,CAAAA;AAC5C,MAAO,OAAA;AACLG,QAAAA,IAAAA,EAAMD,SAASF,QAAWI,GAAAA,MAAAA;QAC1BP,KAAO,EAAA,IAAA;AACPC,QAAAA,UAAAA,EAAYI,SAAS,CAAI,GAAA;AAC3B,OAAA;AACF;AAIA,IAAMG,MAAAA,SAAAA,GAAYf,WAAWgB,UAAW,CAAA,IAAA,IAAQhB,UAAWiB,CAAAA,SAAAA,CAAU,CAAA,CAAKjB,GAAAA,UAAAA;AAC1E,IAAMkB,MAAAA,QAAAA,GAAWH,SAAUI,CAAAA,KAAAA,CAAM,GAAA,CAAA,CAAKC,OAAOC,CAAAA,CAAAA,KAAKA,CAAEC,CAAAA,MAAAA,GAAS,CAAA,CAAA;AAK7D,IAAA,IAAIJ,QAASI,CAAAA,MAAAA,GAAS,CAAKnB,IAAAA,QAAAA,KAAaW,MAAW,EAAA;AACjD,MAAA,MAAMS,QAAQC,IAAKC,CAAAA,GAAAA,CAAI,CAAGP,EAAAA,QAAAA,CAASI,SAAS,CAAA,CAAA;AAC5C,MAAA,IAAIC,SAASpB,QAAU,EAAA;AAErB,QAAO,OAAA;UAAEI,KAAO,EAAA,KAAA;UAAOC,UAAY,EAAA;AAAE,SAAA;AACvC;AACF;AAGA,IAAMkB,MAAAA,SAAAA,GAAiBf,KAAKV,CAAAA,IAAAA,CAAAA,QAAAA,EAAUD,UAAAA,CAAAA;AACtC,IAAA,IAAI,MAAM,IAAA,CAAKL,UAAWiB,CAAAA,MAAAA,CAAOc,SAAAA,CAAY,EAAA;AAC3C,MAAO,OAAA;QACLb,IAAMa,EAAAA,SAAAA;QACNnB,KAAO,EAAA,IAAA;QACPC,UAAY,EAAA;AACd,OAAA;AACF;AAGA,IAAImB,IAAAA,OAAAA,CAAQC,IAAIC,WAAa,EAAA;AAC3BC,MAAQC,OAAAA,CAAAA,GAAAA,CAAI,CAAsBL,mBAAAA,EAAAA,SAAAA,CAA4B,iBAAA,CAAA,CAAA;AAChE;AAEA,IAAIR,IAAAA,QAAAA,CAASI,WAAW,CAAG,EAAA;AACzB,MAAO,OAAA;QAAEf,KAAO,EAAA,KAAA;QAAOC,UAAY,EAAA;AAAE,OAAA;AACvC;AAGA,IAAI,IAAA;AACF,MAAA,MAAMwB,SAAS,MAAM,IAAA,CAAKC,aAAcf,CAAAA,QAAAA,EAAUjB,UAAUG,GAAAA,CAAAA;AAG5D,MAAA,IAAI4B,MAAOE,CAAAA,UAAAA,IAAcF,MAAOE,CAAAA,UAAAA,CAAWZ,SAAS,CAAG,EAAA;AACrD,QAAA,MAAMa,aAAgBH,GAAAA,MAAAA,CAAOE,UAAW,CAAA,CAAA,CAAG1B,CAAAA,UAAAA;AAC3C,QAAM4B,MAAAA,YAAAA,GAAeJ,OAAOE,UAAWd,CAAAA,MAAAA,CAAOiB,CAAAA,CAAKA,KAAAA,CAAAA,CAAE7B,eAAe2B,aAAAA,CAAAA;AAEpE,QAAIC,IAAAA,YAAAA,CAAad,SAAS,CAAG,EAAA;AAC3B,UAAO,OAAA;YACLf,KAAO,EAAA,KAAA;YACPC,UAAY,EAAA,CAAA;YACZ0B,UAAYE,EAAAA;AACd,WAAA;AACF;AACF;AAEA,MAAOJ,OAAAA,MAAAA;AACT,KAAA,CAAA,OAASM,KAAO,EAAA;AAEd,MAAO,OAAA;QAAE/B,KAAO,EAAA,KAAA;QAAOC,UAAY,EAAA;AAAE,OAAA;AACvC;AACF;;;;EAKA+B,UAAmB,GAAA;AACjB,IAAA,IAAA,CAAK3C,eAAe4C,KAAK,EAAA;AAC3B;;;;AAKA,EAAA,MAAcP,aACZf,CAAAA,QAAAA,EACAuB,WACAvC,EAAAA,MAAAA,EACAqB,QAAgB,CACU,EAAA;AAE1B,IAAII,IAAAA,OAAAA,CAAQC,IAAIC,WAAa,EAAA;AAC3BC,MAAQC,OAAAA,CAAAA,GAAAA,CAAI,CAA2Bb,wBAAAA,EAAAA,QAAAA,CAASP,IAAK,CAAA,GAAA,CAAA,CAAqB8B,cAAAA,EAAAA,WAAAA,CAAsBlB,QAAAA,EAAAA,KAAAA,CAAO,CAAA,CAAA;AACzG;AAGA,IAAIL,IAAAA,QAAAA,CAASI,WAAW,CAAG,EAAA;AACzB,MAAO,OAAA;QACLT,IAAM4B,EAAAA,WAAAA;QACNlC,KAAO,EAAA,KAAA;QACPC,UAAY,EAAA;AACd,OAAA;AACF;AAEA,IAAA,MAAM,CAACkC,cAAAA,EAAgB,GAAGC,iBAAAA,CAAqBzB,GAAAA,QAAAA;AAG/C,IAAA,MAAM0B,OAAU,GAAA,MAAM,IAAKC,CAAAA,yBAAAA,CAA0BJ,WAAAA,CAAAA;AACrD,IAAA,IAAI,CAACG,OAAS,EAAA;AACZ,MAAIjB,IAAAA,OAAAA,CAAQC,IAAIC,WAAa,EAAA;AAC3BC,QAAQC,OAAAA,CAAAA,GAAAA,CAAI,CAAkCU,+BAAAA,EAAAA,WAAAA,CAAa,CAAA,CAAA;AAC7D;AACA,MAAO,OAAA;QAAElC,KAAO,EAAA,KAAA;QAAOC,UAAY,EAAA;AAAE,OAAA;AACvC;AAEA,IAAImB,IAAAA,OAAAA,CAAQC,IAAIC,WAAa,EAAA;AAC3BC,MAAAA,OAAAA,CAAQC,IAAI,CAAsBa,mBAAAA,EAAAA,OAAAA,CAAQjC,IAAK,CAAA,IAAA,CAAA,CAAO,CAAA,CAAA;AACxD;AAGA,IAAA,MAAMmC,UAAU,MAAM,IAAA,CAAKC,mBACzBL,cACAE,EAAAA,OAAAA,EACAH,aACAvC,MAAAA,CAAAA;AAGF,IAAI4C,IAAAA,OAAAA,CAAQxB,WAAW,CAAG,EAAA;AAExB,MAAA,MAAM0B,WAAc,GAAA,IAAA,CAAKC,mBAAoBP,CAAAA,cAAAA,EAAgBE,SAAS1C,MAAAA,CAAAA;AAEtE,MAAIyB,IAAAA,OAAAA,CAAQC,IAAIC,WAAa,EAAA;AAC3BC,QAAAA,OAAAA,CAAQC,IAAI,CAA2BW,wBAAAA,EAAAA,cAAAA,CAA8BM,aAAAA,EAAAA,WAAAA,CAAY1B,MAAM,CAAc,YAAA,CAAA,CAAA;AACvG;AAEA,MAAO,OAAA;QACLf,KAAO,EAAA,KAAA;QACPC,UAAY,EAAA,CAAA;QACZwC,WAAaA,EAAAA,WAAAA,CAAYE,KAAM,CAAA,CAAA,EAAG,CAAA;;AACpC,OAAA;AACF;AAGA,IAAIP,IAAAA,iBAAAA,CAAkBrB,WAAW,CAAG,EAAA;AAElCwB,MAAQK,OAAAA,CAAAA,IAAAA,CAAK,CAACC,CAAAA,EAAGC,CAAAA,KAAAA;AACf,QAAID,IAAAA,CAAAA,CAAE5C,UAAe6C,KAAAA,CAAAA,CAAE7C,UAAY,EAAA;AACjC,UAAO6C,OAAAA,CAAAA,CAAE7C,aAAa4C,CAAE5C,CAAAA,UAAAA;AAC1B;AAEA,QAAA,MAAM8C,YAAe,GAAA;UAAE/C,KAAO,EAAA,CAAA;UAAGgD,IAAM,EAAA,CAAA;UAAGC,UAAY,EAAA,CAAA;UAAGC,KAAO,EAAA;AAAE,SAAA;AAClE,QAAA,OAAOH,aAAaD,CAAEK,CAAAA,SAAS,CAAIJ,GAAAA,YAAAA,CAAaF,EAAEM,SAAS,CAAA;OAC7D,CAAA;AAEA,MAAO,OAAA;QACL7C,IAAMiC,EAAAA,OAAAA,CAAQ,CAAA,CAAGjC,CAAAA,IAAAA;QACjBN,KAAOuC,EAAAA,OAAAA,CAAQ,CAAA,CAAA,CAAGY,SAAc,KAAA,OAAA;QAChClD,UAAYsC,EAAAA,OAAAA,CAAQ,CAAA,CAAGtC,CAAAA,UAAAA;QACvB0B,UAAYY,EAAAA,OAAAA,CAAQxB,MAAS,GAAA,CAAA,GAAIwB,OAAUhC,GAAAA;AAC7C,OAAA;AACF;AAGA,IAAA,MAAM6C,UAA6B,EAAA;AACnC,IAAA,KAAA,MAAWC,SAASd,OAAS,EAAA;AAC3B,MAAMe,MAAAA,SAAAA,GAAY,MAAM,IAAK5B,CAAAA,aAAAA,CAC3BU,mBACAiB,KAAM/C,CAAAA,IAAAA,EACNX,MACAqB,EAAAA,KAAAA,GAAQ,CAAA,CAAA;AAGV,MAAA,IAAIsC,UAAUhD,IAAM,EAAA;AAClB8C,QAAAA,OAAAA,CAAQG,IAAK,CAAA;UACX,GAAGD,SAAAA;UACHrD,UAAYoD,EAAAA,KAAAA,CAAMpD,aAAaqD,SAAUrD,CAAAA;SAC3C,CAAA;AACF;AACF;AAEA,IAAImD,IAAAA,OAAAA,CAAQrC,WAAW,CAAG,EAAA;AACxB,MAAO,OAAA;QAAEf,KAAO,EAAA,KAAA;QAAOC,UAAY,EAAA;AAAE,OAAA;AACvC;AAGAmD,IAAAA,OAAAA,CAAQR,KAAK,CAACC,CAAAA,EAAGC,MAAMA,CAAE7C,CAAAA,UAAAA,GAAa4C,EAAE5C,UAAU,CAAA;AAGlD,IAAM2B,MAAAA,aAAAA,GAAgBwB,OAAQ,CAAA,CAAA,CAAGnD,CAAAA,UAAAA;AACjC,IAAA,MAAMuD,eAAeJ,OAAQvC,CAAAA,MAAAA,CAAO4C,CAAAA,CAAKA,KAAAA,CAAAA,CAAExD,eAAe2B,aAAAA,CAAAA;AAE1D,IAAI4B,IAAAA,YAAAA,CAAazC,SAAS,CAAG,EAAA;AAC3B,MAAO,OAAA;QACLf,KAAO,EAAA,KAAA;QACPC,UAAY,EAAA,CAAA;QACZ0B,UAAY6B,EAAAA,YAAAA,CAAaE,GAAID,CAAAA,CAAAA,CAAM,MAAA;AACjCnD,UAAAA,IAAAA,EAAMmD,CAAEnD,CAAAA,IAAAA;AACRL,UAAAA,UAAAA,EAAYwD,CAAExD,CAAAA,UAAAA;UACdkD,SAAW,EAAA;SACb,CAAA;AACF,OAAA;AACF;AAEA,IAAA,OAAOC,QAAQ,CAAA,CAAA;AACjB;;;;AAKA,EAAA,MAAcZ,kBACZmB,CAAAA,OAAAA,EACAtB,OACA3C,EAAAA,QAAAA,EACAC,MAC0B,EAAA;AAC1B,IAAA,MAAM4C,UAA2B,EAAA;AAEjC,IAAA,KAAA,MAAWqB,SAASvB,OAAS,EAAA;AAC3B,MAAMwB,MAAAA,SAAAA,GAAiBzD,KAAKV,CAAAA,IAAAA,CAAAA,QAAAA,EAAUkE,KAAAA,CAAAA;AAGtC,MAAA,MAAME,KAAQ,GAAA,MAAM,IAAK1E,CAAAA,UAAAA,CAAW2E,KAAKF,SAAAA,CAAAA;AAGzC,MAAMG,MAAAA,WAAAA,GAAmBC,YAAML,KAAAA,CAAAA;AAC/B,MAAMM,MAAAA,aAAAA,GAAqBD,YAAMN,OAAAA,CAAAA;AACjC,MAAA,MAAMQ,SAAYL,GAAAA,KAAAA,CAAMM,MAAM,EAAA,GAAKJ,YAAYK,IAAOT,GAAAA,KAAAA;AACtD,MAAA,MAAMU,cAAcJ,aAAcG,CAAAA,IAAAA;AAClC,MAAA,MAAME,WAAWP,WAAYQ,CAAAA,GAAAA;AAC7B,MAAA,MAAMC,aAAaP,aAAcM,CAAAA,GAAAA;AAGjC,MAAIC,IAAAA,UAAAA,IAAcX,MAAMM,MAAM,EAAA,IAAMG,SAASG,WAAW,EAAA,KAAOD,UAAWC,CAAAA,WAAAA,EAAe,EAAA;AACvF,QAAA;AACF;AAGA,MAAA,IAAId,UAAUD,OAAYG,IAAAA,KAAAA,CAAMM,MAAM,EAAA,IAAMD,cAAcG,WAAc,EAAA;AACtE/B,QAAAA,OAAAA,CAAQgB,IAAK,CAAA;UACXjD,IAAMuD,EAAAA,SAAAA;UACN5D,UAAY,EAAA,CAAA;UACZkD,SAAW,EAAA;SACb,CAAA;AACA,QAAA;AACF;AAGA,MAAA,IAAIxD,OAAOgF,eAAiB,EAAA;AAC1B,QAAA,IAAIf,KAAMc,CAAAA,WAAAA,EAAkBf,KAAAA,OAAAA,CAAQe,aAC/BZ,IAAAA,KAAAA,CAAMM,MAAM,EAAA,IAAMD,SAAUO,CAAAA,WAAAA,EAAkBJ,KAAAA,WAAAA,CAAYI,aAAgB,EAAA;AAC7EnC,UAAAA,OAAAA,CAAQgB,IAAK,CAAA;YACXjD,IAAMuD,EAAAA,SAAAA;YACN5D,UAAY,EAAA,IAAA;YACZkD,SAAW,EAAA;WACb,CAAA;AACA,UAAA;AACF;AACF;AAGA,MAAA,IAAIxD,OAAOiF,mBAAqB,EAAA;AAC9B,QAAMC,MAAAA,eAAAA,GAAkB,IAAKD,CAAAA,mBAAAA,CAAoBT,SAAAA,CAAAA;AACjD,QAAMW,MAAAA,iBAAAA,GAAoB,IAAKF,CAAAA,mBAAAA,CAAoBN,WAAAA,CAAAA;AAGnD,QAAA,IAAIO,oBAAoBC,iBAAmB,EAAA;AAEzC,UAAA,MAAM7E,UAAa,GAAA,IAAA,CAAK8E,6BAA8BZ,CAAAA,SAAAA,EAAWG,WAAAA,CAAAA;AACjE/B,UAAAA,OAAAA,CAAQgB,IAAK,CAAA;YACXjD,IAAMuD,EAAAA,SAAAA;AACN5D,YAAAA,UAAAA;YACAkD,SAAW,EAAA;WACb,CAAA;AACA,UAAA;AACF;AAGA,QAAA,IAAIxD,OAAOgF,eACPE,IAAAA,eAAAA,CAAgBH,aAAkBI,KAAAA,iBAAAA,CAAkBJ,aAAe,EAAA;AACrE,UAAA,MAAMzE,UAAa,GAAA,IAAA,CAAK8E,6BAA8BZ,CAAAA,SAAAA,EAAWG,WAAAA,CAAe,GAAA,IAAA;AAChF/B,UAAAA,OAAAA,CAAQgB,IAAK,CAAA;YACXjD,IAAMuD,EAAAA,SAAAA;AACN5D,YAAAA,UAAAA;YACAkD,SAAW,EAAA;WACb,CAAA;AACF;AACF;AACF;AAEA,IAAOZ,OAAAA,OAAAA;AACT;;;;AAKQqC,EAAAA,mBAAAA,CAAoBI,GAAqB,EAAA;AAE/C,IAAOA,OAAAA,GAAAA,CAAIC,OAAQ,CAAA,WAAA,EAAa,GAAA,CAAA;AAClC;;;;AAKQF,EAAAA,6BAAAA,CAA8BG,UAAkBC,MAAwB,EAAA;AAE9E,IAAMC,MAAAA,aAAAA,GAAgB,IAAKC,CAAAA,kBAAAA,CAAmBH,QAAAA,CAAAA;AAC9C,IAAMI,MAAAA,WAAAA,GAAc,IAAKD,CAAAA,kBAAAA,CAAmBF,MAAAA,CAAAA;AAE5C,IAAIC,IAAAA,aAAAA,KAAkBE,aAAoB,OAAA,GAAA;AAE1C,IAAA,MAAMC,YAAuC,GAAA;MAC3C,GAAK,EAAA,CAAA;MACL,GAAK,EAAA,CAAA;MACL,GAAK,EAAA,CAAA;MACL,OAAS,EAAA;AACX,KAAA;AAEA,IAAMC,MAAAA,gBAAAA,GAAmBD,YAAaH,CAAAA,aAAAA,CAAkB,IAAA,CAAA;AACxD,IAAMK,MAAAA,cAAAA,GAAiBF,YAAaD,CAAAA,WAAAA,CAAgB,IAAA,CAAA;AAGpD,IAAA,MAAMI,YAAezE,GAAAA,IAAAA,CAAK0E,GAAIH,CAAAA,gBAAAA,GAAmBC,cAAAA,CAAAA;AACjD,IAAA,OAAO,MAAOC,YAAe,GAAA,GAAA;AAC/B;;;;AAKQL,EAAAA,kBAAAA,CAAmBL,GAAqB,EAAA;AAC9C,IAAA,MAAMY,UAAUZ,GAAI3B,CAAAA,KAAAA,CAAM,IAAA,CAAA,IAAS,EAAItC,EAAAA,MAAAA;AACvC,IAAA,MAAM8E,eAAeb,GAAI3B,CAAAA,KAAAA,CAAM,IAAA,CAAA,IAAS,EAAItC,EAAAA,MAAAA;AAC5C,IAAA,MAAM+E,UAAUd,GAAI3B,CAAAA,KAAAA,CAAM,IAAA,CAAA,IAAS,EAAItC,EAAAA,MAAAA;AAEvC,IAAA,IAAI6E,SAAS,CAAKC,IAAAA,WAAAA,KAAgB,CAAKC,IAAAA,MAAAA,KAAW,GAAU,OAAA,GAAA;AAC5D,IAAA,IAAID,cAAc,CAAKD,IAAAA,MAAAA,KAAW,CAAKE,IAAAA,MAAAA,KAAW,GAAU,OAAA,GAAA;AAC5D,IAAA,IAAIA,SAAS,CAAKF,IAAAA,MAAAA,KAAW,CAAKC,IAAAA,WAAAA,KAAgB,GAAU,OAAA,GAAA;AAC5D,IAAO,OAAA,OAAA;AACT;;;;EAKQnD,mBACNiB,CAAAA,OAAAA,EACAtB,SACA1C,MACU,EAAA;AACV,IAAA,MAAM8C,cAAuD,EAAA;AAE7D,IAAIrB,IAAAA,OAAAA,CAAQC,IAAIC,WAAa,EAAA;AAC3BC,MAAAA,OAAAA,CAAQC,GAAI,CAAA,CAAA,4BAAA,EAA+BmC,OAAAA,CAAAA,eAAAA,CAAAA,EAA0BtB,OAAAA,CAAAA;AACvE;AAEA,IAAA,KAAA,MAAWuB,SAASvB,OAAS,EAAA;AAC3B,MAAA,MAAM0D,KAAQ,GAAA,IAAA,CAAKC,mBAAoBrC,CAAAA,OAAAA,EAASC,OAAOjE,MAAAA,CAAAA;AAEvD,MAAIyB,IAAAA,OAAAA,CAAQC,IAAIC,WAAa,EAAA;AAC3BC,QAAQC,OAAAA,CAAAA,GAAAA,CAAI,KAAKoC,KAAAA,CAAAA,QAAAA,EAAgBmC,KAAAA,CAAoBpG,YAAAA,EAAAA,MAAAA,CAAOsG,mBAAmB,CAAE,CAAA,CAAA;AACnF;AAEA,MAAIF,IAAAA,KAAAA,IAASpG,OAAOsG,mBAAqB,EAAA;AACvCxD,QAAAA,WAAAA,CAAYc,IAAK,CAAA;AAAEK,UAAAA,KAAAA;AAAOmC,UAAAA;SAAM,CAAA;AAClC;AACF;AAGA,IAAA,OAAOtD,WACJG,CAAAA,IAAAA,CAAK,CAACC,CAAAA,EAAGC,MAAMA,CAAEiD,CAAAA,KAAAA,GAAQlD,CAAEkD,CAAAA,KAAK,CAChCrC,CAAAA,GAAAA,CAAI5C,CAAAA,CAAAA,KAAKA,EAAE8C,KAAK,CAAA;AACrB;;;;EAKQoC,mBACNE,CAAAA,IAAAA,EACAC,MACAxG,MACQ,EAAA;AACR,IAAA,IAAIyG,EAAKF,GAAAA,IAAAA;AACT,IAAA,IAAIG,EAAKF,GAAAA,IAAAA;AAET,IAAA,IAAIxG,OAAOiF,mBAAqB,EAAA;AAC9BwB,MAAK,EAAA,GAAA,IAAA,CAAKxB,oBAAoBwB,EAAAA,CAAAA;AAC9BC,MAAK,EAAA,GAAA,IAAA,CAAKzB,oBAAoByB,EAAAA,CAAAA;AAChC;AAEA,IAAA,IAAI1G,OAAOgF,eAAiB,EAAA;AAC1ByB,MAAAA,EAAAA,GAAKA,GAAG1B,WAAW,EAAA;AACnB2B,MAAAA,EAAAA,GAAKA,GAAG3B,WAAW,EAAA;AACrB;AAGA,IAAA,MAAM4B,SAASrF,IAAKC,CAAAA,GAAAA,CAAIkF,EAAGrF,CAAAA,MAAAA,EAAQsF,GAAGtF,MAAM,CAAA;AAC5C,IAAIuF,IAAAA,MAAAA,KAAW,GAAU,OAAA,CAAA;AAEzB,IAAA,MAAMC,QAAW,GAAA,IAAA,CAAKC,mBAAoBJ,CAAAA,EAAAA,EAAIC,EAAAA,CAAAA;AAC9C,IAAA,OAAO,IAAKE,QAAWD,GAAAA,MAAAA;AACzB;;;;AAKQE,EAAAA,mBAAAA,CAAoBN,MAAcC,IAAsB,EAAA;AAC9D,IAAA,MAAMM,IAAIP,IAAKnF,CAAAA,MAAAA;AACf,IAAA,MAAM2F,IAAIP,IAAKpF,CAAAA,MAAAA;AACf,IAAA,MAAM4F,KAAiBC,KAAMH,CAAAA,CAAAA,GAAI,CAAA,CAAA,CAAGI,KAAK,IAAA,CAAA,CAAMnD,GAAI,CAAA,MAAMkD,MAAMF,CAAI,GAAA,CAAA,CAAGG,CAAAA,IAAAA,CAAK,CAAA,CAAA,CAAA;AAE3E,IAASC,KAAAA,IAAAA,CAAAA,GAAI,GAAGA,CAAKL,IAAAA,CAAAA,EAAGK,KAAQA,EAAAA,CAAAA,CAAAA,CAAG,CAAA,CAAA,CAAKA,GAAAA,CAAAA;AACxC,IAASC,KAAAA,IAAAA,CAAAA,GAAI,GAAGA,CAAKL,IAAAA,CAAAA,EAAGK,KAAQ,EAAA,CAAA,CAAA,CAAGA,CAAAA,CAAAA,CAAKA,GAAAA,CAAAA;AAExC,IAAA,KAAA,IAASD,CAAI,GAAA,CAAA,EAAGA,CAAKL,IAAAA,CAAAA,EAAGK,CAAK,EAAA,EAAA;AAC3B,MAAA,KAAA,IAASC,CAAI,GAAA,CAAA,EAAGA,CAAKL,IAAAA,CAAAA,EAAGK,CAAK,EAAA,EAAA;AAC3B,QAAA,IAAIb,KAAKY,CAAI,GAAA,CAAA,MAAOX,IAAKY,CAAAA,CAAAA,GAAI,CAAA,CAAI,EAAA;AAC/BJ,UAAGG,EAAAA,CAAAA,CAAAA,EAAGC,CAAAA,CAAAA,GAAKJ,GAAGG,CAAI,GAAA,CAAA,CAAGC,CAAAA,CAAAA,GAAI,CAAA,CAAA;SACpB,MAAA;AACLJ,UAAAA,EAAAA,CAAGG,CAAAA,CAAAA,CAAGC,CAAAA,CAAAA,GAAK,IAAI9F,IAAK+F,CAAAA,GAAAA;YAClBL,EAAGG,CAAAA,CAAAA,GAAI,CAAA,CAAA,CAAGC,CAAAA,CAAAA;YACVJ,EAAGG,CAAAA,CAAAA,CAAGC,CAAAA,CAAAA,GAAI,CAAA,CAAA;AACVJ,YAAAA,EAAAA,CAAGG,CAAI,GAAA,CAAA,CAAGC,CAAAA,CAAAA,GAAI,CAAA;;;AAElB;AACF;AACF;AAEA,IAAOJ,OAAAA,EAAAA,CAAGF,CAAAA,CAAAA,CAAGC,CAAAA,CAAAA;AACf;;;;AAKA,EAAA,MAAcpE,0BAA0B2E,OAA2C,EAAA;AACjF,IAAMC,MAAAA,GAAAA,GAAMC,KAAKD,GAAG,EAAA;AACpB,IAAA,MAAME,MAAS,GAAA,IAAA,CAAK/H,cAAegI,CAAAA,GAAAA,CAAIJ,OAAAA,CAAAA;AAEvC,IAAA,IAAIG,MAAUF,IAAAA,GAAAA,GAAME,MAAOE,CAAAA,SAAAA,GAAY,KAAK/H,SAAW,EAAA;AACrD,MAAA,OAAO6H,MAAO/E,CAAAA,OAAAA;AAChB;AAEA,IAAI,IAAA;AACF,MAAA,MAAMA,OAAU,GAAA,MAAM,IAAKjD,CAAAA,UAAAA,CAAWmI,QAAQN,OAAAA,CAAAA;AAC9C,MAAK5H,IAAAA,CAAAA,cAAAA,CAAemI,IAAIP,OAAS,EAAA;AAAE5E,QAAAA,OAAAA;QAASiF,SAAWJ,EAAAA;OAAI,CAAA;AAC3D,MAAO7E,OAAAA,OAAAA;AACT,KAAA,CAAA,OAASN,KAAO,EAAA;AACd,MAAO,OAAA,IAAA;AACT;AACF;AACF,CAAA;AA1da5C,MAAAA,CAAAA,YAAAA,EAAAA,aAAAA,CAAAA;AACX,aAAA,CADWA,cACaW,gBAA6C,EAAA;EACnEI,OAAS,EAAA,IAAA;EACTyE,eAAiB,EAAA,IAAA;EACjBC,mBAAqB,EAAA,IAAA;EACrBqB,mBAAqB,EAAA;AACvB,CAAA,CAAA;AANK,IAAM9G,WAAN,GAAA;;;ACFA,IAAMsI,cAAAA,GAAN,MAAMA,cAAAA,CAAAA;AAgBX,EAAA,WAAA,CAAoBrI,UAAgC,EAAA;;AAfpDiF,IAAO,aAAA,CAAA,IAAA,EAAA,MAAA,EAAA,OAAA,CAAA;AACPqD,IAAc,aAAA,CAAA,IAAA,EAAA,aAAA,EAAA,8CAAA,CAAA;AACdC,IAAqB,aAAA,CAAA,IAAA,EAAA,MAAA,EAAA,IAAA,CAAA;AAErBC,IAAqC,aAAA,CAAA,IAAA,EAAA,cAAA,EAAA;MACnCC,EAAI,EAAA;QAAEC,IAAM,EAAA,IAAA;QAAMC,KAAO,EAAA,KAAA;QAAOC,IAAM,EAAA;AAAK,OAAA;MAC3CC,QAAU,EAAA;QAAEC,MAAQ,EAAA,IAAA;QAAM5H,IAAM,EAAA,IAAA;QAAM6H,MAAQ,EAAA;AAAM,OAAA;MACpDC,qBAAuB,EAAA;AAAC,QAAA,QAAA;AAAU,QAAA,MAAA;AAAQ,QAAA;;MAC1CC,kBAAoB,EAAA,MAAA;MACpBC,QAAU,EAAA,EAAA;MACVC,KAAO,EAAA;QAAEC,QAAU,EAAA;AAAO;;AAC5B,KAAA,CAAA;AAEQC,IAAAA,aAAAA,CAAAA,IAAAA,EAAAA,aAAAA,CAAAA;SAEYrJ,UAAAA,GAAAA,UAAAA;AAClB,IAAKqJ,IAAAA,CAAAA,WAAAA,GAAc,IAAItJ,WAAAA,CAAYC,UAAAA,CAAAA;AACrC;;;;;AAMAsJ,EAAAA,UAAAA,CAAWC,KAAahJ,MAAuC,EAAA;AAG7D,IAAA,OAAO,CAAC,CAACA,MAAQD,EAAAA,QAAAA,IAAiBkJ,iBAAWD,GAAAA,CAAAA;AAC/C;;;;EAKA,MAAME,OAAAA,CAAQF,KAAahJ,MAAwD,EAAA;AAEjF,IAAA,IAAI,CAACA,MAAQD,EAAAA,QAAAA,IAAY,CAAMkJ,KAAAA,CAAAA,UAAAA,CAAWD,GAAAA,CAAM,EAAA;AAC9C,MAAM,MAAA,IAAIG,cACR,qEACA,EAAA;QAAEC,YAAc,EAAA,eAAA;QAAiBC,SAAW,EAAA;OAAU,CAAA;AAE1D;AAIA,IAAA,MAAMC,YAAe,GAAA,IAAA,CAAKC,mBAAoBP,CAAAA,GAAAA,EAAKhJ,MAAAA,CAAAA;AAGnD,IAAA,IAAIA,QAAQD,QAAU,EAAA;AACpB,MAAA,MAAMyJ,SAAiB/I,GAAAA,KAAAA,CAAAA,IAAAA,CAAKT,MAAOD,CAAAA,QAAAA,EAAUuJ,eAAe,SAAA,CAAA;AAC5D,MAAA,IAAI,MAAM,IAAA,CAAK7J,UAAWiB,CAAAA,MAAAA,CAAO8I,SAAAA,CAAY,EAAA;AAC3C,QAAA,MAAMC,UAAU,MAAM,IAAA,CAAKhK,UAAWiK,CAAAA,QAAAA,CAASF,WAAW,MAAA,CAAA;AAC1D,QAAA,MAAMG,QAAW,GAAA;AACfC,UAAAA,MAAAA,EAAQ,UAAUJ,SAAAA,CAAAA,CAAAA;UAClBK,QAAU,EAAA,oBAAA;UACVC,IAAMC,EAAAA,MAAAA,CAAOC,UAAWP,CAAAA,OAAAA,EAAS,MAAA,CAAA;AACjC9B,UAAAA,SAAAA,sBAAeH,IAAAA,EAAAA;AACfyC,UAAAA,KAAAA,EAAO;AACT,SAAA;AACA,QAAO,OAAA;AACLR,UAAAA,OAAAA;UACAS,WAAa,EAAA,QAAA;UACbC,EAAIR,EAAAA,QAAAA;AACJA,UAAAA;AACF,SAAA;AACF;AACF;AAGA,IAAA,IAAIL,aAAalJ,QAAS,CAAA,IAAA,CAAc6I,IAAAA,KAAAA,CAAAA,UAAAA,CAAWK,YAAAA,CAAe,EAAA;AAEhE,MAAI,IAAA;AACF,QAAA,MAAMc,UAAa,GAAA,MAAM,IAAKC,CAAAA,eAAAA,CAAgBf,cAActJ,MAAAA,CAAAA;AAE9D,OAAA,CAAA,OAASoC,KAAO,EAAA;AAEd,QAAMA,MAAAA,KAAAA;AACR;AACF;AAGA,IAAA,MAAMkI,WAActK,GAAAA,MAAAA,EAAQuK,UAAe3J,KAAAA,MAAAA,GAAYZ,OAAOuK,UAAa,GAAA,IAAA;AAC3E,IAAA,MAAMC,eAAe,OAAOF,WAAAA,KAAgB,SAAYA,GAAAA,WAAAA,GAAeA,YAAiC/J,OAAY,KAAA,KAAA;AAEpH,IAAIC,IAAAA,QAAAA;AAEJ,IAAIgK,IAAAA,YAAAA,IAAgBxK,QAAQD,QAAU,EAAA;AAEpC,MAAA,MAAM0K,WAAc,GAAA,MAAM,IAAK3B,CAAAA,WAAAA,CAAYjJ,UACzCyJ,YACAtJ,EAAAA,MAAAA,CAAOD,QACP,EAAA,OAAOuK,WAAgB,KAAA,QAAA,GAAWA,WAAc1J,GAAAA,MAAAA,EAChDZ,OAAOC,QAAQ,CAAA;AAGjB,MAAA,IAAIwK,WAAYzI,CAAAA,UAAAA,IAAcyI,WAAYzI,CAAAA,UAAAA,CAAWZ,SAAS,CAAG,EAAA;AAE/D,QAAA,MAAMsJ,iBAAiBD,WAAYzI,CAAAA,UAAAA,CAChC+B,IAAI5B,CAAAA,CAAAA,KAAK,OAAYwI,KAAS3K,CAAAA,QAAAA,CAAAA,MAAAA,CAAOD,UAAUoC,CAAExB,CAAAA,IAAI,CAAA,CAAMwB,EAAAA,EAAAA,CAAAA,CAAEqB,SAAS,CAAS,OAAA,CAAA,CAAA,CAC/E/C,KAAK,IAAA,CAAA;AAER,QAAM,MAAA,IAAI0I,aACR,CAAA,CAAA,gBAAA,EAAmBG,YAAAA,CAAAA;EAA0CoB,cAAAA;;AAC7D,gCAAA,CAAA,EAAA;UAAEtB,YAAc,EAAA,eAAA;UAAiBwB,SAAW5B,EAAAA,GAAAA;UAAKK,SAAW,EAAA;SAAU,CAAA;AAE1E;AAEA,MAAA,IAAIoB,YAAY9J,IAAM,EAAA;AACpBH,QAAAA,QAAAA,GAAWiK,WAAY9J,CAAAA,IAAAA;OAClB,MAAA;AAELH,QAAAA,QAAAA,GAAW,MAAM,IAAA,CAAK6J,eAAgBf,CAAAA,YAAAA,EAActJ,MAAAA,CAAAA;AAGpD,QAAI,IAAA,CAAM6K,KAAQrK,CAAAA,OAAAA,CAAAA,QAAAA,CAAW,EAAA;AAC3B,UAAA,MAAMsK,UAAa,GAAA,MAAM,IAAKrL,CAAAA,UAAAA,CAAWiB,OAAOF,QAAAA,CAAAA;AAChD,UAAA,IAAI,CAACsK,UAAY,EAAA;AAEf,YAAA,MAAMC,UAAa,GAAA;AAAC,cAAA,SAAA;AAAW,cAAA,MAAA;AAAQ,cAAA,KAAA;AAAO,cAAA;;AAC9C,YAAA,IAAIC,kBAAqB,GAAA,KAAA;AAEzB,YAAA,KAAA,MAAWnG,OAAOkG,UAAY,EAAA;AAC5B,cAAA,MAAME,cAAc3B,YAAezE,GAAAA,GAAAA;AACnC,cAAA,MAAMqG,cAAiB,GAAA,MAAM,IAAKpC,CAAAA,WAAAA,CAAYjJ,UAC5CoL,WACAjL,EAAAA,MAAAA,CAAOD,QACP,EAAA,OAAOuK,WAAgB,KAAA,QAAA,GAAWA,WAAc1J,GAAAA,MAAAA,EAChDZ,OAAOC,QAAQ,CAAA;AAGjB,cAAA,IAAIiL,eAAevK,IAAM,EAAA;AACvBH,gBAAAA,QAAAA,GAAW0K,cAAevK,CAAAA,IAAAA;AAC1BqK,gBAAqB,kBAAA,GAAA,IAAA;AACrB,gBAAA;AACF;AACF;AAEA,YAAA,IAAI,CAACA,kBAAsBP,IAAAA,WAAAA,CAAY3H,eAAe2H,WAAY3H,CAAAA,WAAAA,CAAY1B,SAAS,CAAG,EAAA;AAExF,cAAA,MAAM0B,WAAc2H,GAAAA,WAAAA,CAAY3H,WAC7BE,CAAAA,KAAAA,CAAM,GAAG,CAAA,CAAA,CACTe,GAAI5C,CAAAA,CAAAA,MAAK,CAAOA,IAAAA,EAAAA,CAAAA,CAAG,CAAA,CAAA,CACnBV,KAAK,IAAA,CAAA;AAER,cAAM,MAAA,IAAI0K,qBACR,CAAA,CAAA,gBAAA,EAAmB7B,YAAAA;;;AAAkCxG,EAAAA,WAAAA,CACrD,CAAA,EAAA;gBACEsI,OAAS,EAAA;kBACPC,QAAU/B,EAAAA,YAAAA;kBACVD,SAAW,EAAA;AACb;eACF,CAAA;AAEJ;AACF;AACF;AACF;KACK,MAAA;AAEL7I,MAAAA,QAAAA,GAAW,MAAM,IAAA,CAAK6J,eAAgBf,CAAAA,YAAAA,EAActJ,MAAAA,CAAAA;AAGpD,MAAI,IAAA,CAAM6K,KAAQrK,CAAAA,OAAAA,CAAAA,QAAAA,CAAW,EAAA;AAC3B,QAAA,MAAMsK,UAAa,GAAA,MAAM,IAAKrL,CAAAA,UAAAA,CAAWiB,OAAOF,QAAAA,CAAAA;AAChD,QAAA,IAAI,CAACsK,UAAY,EAAA;AAEf,UAAA,MAAMQ,YAAY9K,QAAW,GAAA,SAAA;AAC7B,UAAA,IAAI,MAAM,IAAA,CAAKf,UAAWiB,CAAAA,MAAAA,CAAO4K,SAAAA,CAAY,EAAA;AAC3C9K,YAAW8K,QAAAA,GAAAA,SAAAA;WACN,MAAA;AAEL,YAAA,MAAMC,UAAU/K,QAAW,GAAA,MAAA;AAC3B,YAAA,IAAI,MAAM,IAAA,CAAKf,UAAWiB,CAAAA,MAAAA,CAAO6K,OAAAA,CAAU,EAAA;AACzC/K,cAAW+K,QAAAA,GAAAA,OAAAA;aACN,MAAA;AAEL,cAAA,MAAMC,SAAShL,QAAW,GAAA,KAAA;AAC1B,cAAA,IAAI,MAAM,IAAA,CAAKf,UAAWiB,CAAAA,MAAAA,CAAO8K,MAAAA,CAAS,EAAA;AACxChL,gBAAWgL,QAAAA,GAAAA,MAAAA;eACN,MAAA;AACL,gBAAA,MAAMC,aAAajL,QAAW,GAAA,UAAA;AAC9B,gBAAA,IAAI,MAAM,IAAA,CAAKf,UAAWiB,CAAAA,MAAAA,CAAO+K,UAAAA,CAAa,EAAA;AAC5CjL,kBAAWiL,QAAAA,GAAAA,UAAAA;AACb;AACF;AACF;AACF;AACF;AACF;AACF;AAGA,IAAA,IAAIzL,OAAO0L,iBAAmB,EAAA;AAC5B,MAAA,MAAM7G,GAAWgG,GAAAA,KAAAA,CAAAA,OAAAA,CAAQrK,QAAAA,CAAAA,CAAUuE,WAAW,EAAA;AAC9C,MAAA,IAAI,CAAC/E,MAAAA,CAAO0L,iBAAkBtL,CAAAA,QAAAA,CAASyE,GAAAA,CAAM,EAAA;AAC3C,QAAM,MAAA,IAAIsE,aACR,CAAA,CAAA,gBAAA,EAAmBtE,GAAAA,CAAAA,wBAAAA,EAA8B7E,OAAO0L,iBAAkBjL,CAAAA,IAAAA,CAAK,IAAA,CAAA,CAC/E,CAAA,EAAA;UAAE2I,YAAc,EAAA,eAAA;UAAiBwB,SAAW5B,EAAAA,GAAAA;UAAKK,SAAW,EAAA;SAAU,CAAA;AAE1E;AACF;AAEA,IAAI,IAAA;AAEF,MAAA,MAAMI,OAAU,GAAA,MAAM,IAAKhK,CAAAA,UAAAA,CAAWiK,SAASlJ,QAAAA,CAAAA;AAG/C,MAAA,MAAM2D,KAAQ,GAAA,MAAM,IAAK1E,CAAAA,UAAAA,CAAW2E,KAAK5D,QAAAA,CAAAA;AAGzC,MAAA,MAAM0J,WAAc,GAAA,MAAM,IAAKyB,CAAAA,iBAAAA,CAAkBnL,UAAUiJ,OAAAA,CAAAA;AAE3D,MAAA,MAAME,QAAW,GAAA;AACfC,QAAAA,MAAAA,EAAQ,UAAUpJ,QAAAA,CAAAA,CAAAA;AAClBmH,QAAAA,SAAAA,sBAAeH,IAAAA,EAAAA;AACfyC,QAAAA,KAAAA,EAAO,EAAA;AACPH,QAAAA,IAAAA,EAAML,OAAQrI,CAAAA,MAAAA;QACdyI,QAAU,EAAA,IAAA,CAAK+B,YAAYpL,QAAAA;AAC7B,OAAA;AAEA,MAAO,OAAA;AACLiJ,QAAAA,OAAAA;AACAS,QAAAA,WAAAA;QACAC,EAAIR,EAAAA,QAAAA;AACJA,QAAAA;AACF,OAAA;AACF,KAAA,CAAA,OAASvH,KAAO,EAAA;AACd,MAAA,IAAIA,MAAMyJ,IAAS,KAAA,QAAA,IAAYzJ,MAAM0J,OAAS1L,EAAAA,QAAAA,CAAS,gBAAA,CAAmB,EAAA;AACxE,QAAA,MAAM,IAAI+K,qBAAAA,CACR,CAAmB7B,gBAAAA,EAAAA,YAAAA,CACnB,CAAA,EAAA;UACE8B,OAAS,EAAA;YACPC,QAAU/B,EAAAA,YAAAA;YACVD,SAAW,EAAA;AACb;SACF,CAAA;AAEJ;AACA,MAAA,MAAMF,aAAc4C,CAAAA,gBAAAA,CAClB,eACA/C,EAAAA,GAAAA,EACA5G,KAAAA,CAAAA;AAEJ;AACF;;;;EAKA,MAAMgG,KAAAA,CAAMY,GAAaS,EAAAA,OAAAA,EAAiBzJ,MAA6C,EAAA;AACrF,IAAI,IAAA,CAACA,QAAQD,QAAU,EAAA;AACrB,MAAM,MAAA,IAAIoJ,cACR,kDACA,EAAA;QAAEC,YAAc,EAAA,eAAA;QAAiBC,SAAW,EAAA;OAAQ,CAAA;AAExD;AAEA,IAAA,IAAIrJ,OAAOgM,QAAU,EAAA;AACnB,MAAM,MAAA,IAAI7C,cACR,wDACA,EAAA;QAAEC,YAAc,EAAA,eAAA;QAAiBC,SAAW,EAAA,OAAA;QAASuB,SAAW5B,EAAAA;OAAI,CAAA;AAExE;AAEA,IAAA,MAAMM,YAAe,GAAA,IAAA,CAAKC,mBAAoBP,CAAAA,GAAAA,EAAKhJ,MAAAA,CAAAA;AACnD,IAAA,MAAMQ,QAAW,GAAA,MAAM,IAAK6J,CAAAA,eAAAA,CAAgBf,cAActJ,MAAAA,CAAAA;AAG1D,IAAA,IAAIA,OAAO0L,iBAAmB,EAAA;AAC5B,MAAA,MAAM7G,GAAWgG,GAAAA,KAAAA,CAAAA,OAAAA,CAAQrK,QAAAA,CAAAA,CAAUuE,WAAW,EAAA;AAC9C,MAAA,IAAI,CAAC/E,MAAAA,CAAO0L,iBAAkBtL,CAAAA,QAAAA,CAASyE,GAAAA,CAAM,EAAA;AAC3C,QAAM,MAAA,IAAIsE,aACR,CAAA,CAAA,gBAAA,EAAmBtE,GAAAA,CAAAA,wBAAAA,EAA8B7E,OAAO0L,iBAAkBjL,CAAAA,IAAAA,CAAK,IAAA,CAAA,CAC/E,CAAA,EAAA;UAAE2I,YAAc,EAAA,eAAA;UAAiBwB,SAAW5B,EAAAA,GAAAA;UAAKK,SAAW,EAAA;SAAU,CAAA;AAE1E;AACF;AAEA,IAAI,IAAA;AAEF,MAAM4C,MAAAA,GAAAA,GAAWC,cAAQ1L,QAAAA,CAAAA;AACzB,MAAM,MAAA,IAAA,CAAKf,UAAW0M,CAAAA,KAAAA,CAAMF,GAAK,EAAA;QAAEG,SAAW,EAAA;OAAK,CAAA;AAGnD,MAAA,MAAM,IAAK3M,CAAAA,UAAAA,CAAW4M,SAAU7L,CAAAA,QAAAA,EAAUiJ,OAAAA,CAAAA;AAC5C,KAAA,CAAA,OAASrH,KAAO,EAAA;AACd,MAAA,MAAM,IAAI+G,aAAAA,CACR,CAAyB/G,sBAAAA,EAAAA,KAAAA,CAAM0J,OAAO,CACtC,CAAA,EAAA;QAAE1C,YAAc,EAAA,eAAA;QAAiBwB,SAAW5B,EAAAA,GAAAA;QAAKK,SAAW,EAAA,OAAA;QAASiD,aAAelK,EAAAA;OAAe,CAAA;AAEvG;AACF;;;;EAKA,MAAMiG,IAAAA,CAAKkE,QAAgBvM,MAAsD,EAAA;AAC/E,IAAI,IAAA,CAACA,QAAQD,QAAU,EAAA;AACrB,MAAA,OAAO,EAAA;AACT;AAEA,IAAA,MAAMuJ,YAAe,GAAA,IAAA,CAAKC,mBAAoBgD,CAAAA,MAAAA,EAAQvM,MAAAA,CAAAA;AAGtD,IAAA,MAAMsK,WAActK,GAAAA,MAAAA,EAAQuK,UAAe3J,KAAAA,MAAAA,GAAYZ,OAAOuK,UAAa,GAAA,IAAA;AAC3E,IAAA,MAAMC,eAAe,OAAOF,WAAAA,KAAgB,SAAYA,GAAAA,WAAAA,GAAeA,YAAiC/J,OAAY,KAAA,KAAA;AAEpH,IAAIC,IAAAA,QAAAA;AAEJ,IAAA,IAAIgK,YAAc,EAAA;AAEhB,MAAA,MAAMC,WAAc,GAAA,MAAM,IAAK3B,CAAAA,WAAAA,CAAYjJ,UACzCyJ,YACAtJ,EAAAA,MAAAA,CAAOD,QACP,EAAA,OAAOuK,WAAgB,KAAA,QAAA,GAAWA,WAAc1J,GAAAA,MAAAA,EAChDZ,OAAOC,QAAQ,CAAA;AAGjB,MAAI,IAAA,CAACwK,YAAY9J,IAAM,EAAA;AACrB,QAAA,OAAO,EAAA;AACT;AAEAH,MAAAA,QAAAA,GAAWiK,WAAY9J,CAAAA,IAAAA;KAClB,MAAA;AACLH,MAAAA,QAAAA,GAAW,MAAM,IAAA,CAAK6J,eAAgBf,CAAAA,YAAAA,EAActJ,MAAAA,CAAAA;AACtD;AAEA,IAAI,IAAA;AACF,MAAA,MAAMmE,KAAQ,GAAA,MAAM,IAAK1E,CAAAA,UAAAA,CAAW2E,KAAK5D,QAAAA,CAAAA;AACzC,MAAI,IAAA,CAAC2D,KAAMqI,CAAAA,WAAAA,EAAe,EAAA;AACxB,QAAA,OAAO,EAAA;AACT;AAEA,MAAA,MAAM9J,OAAU,GAAA,MAAM,IAAKjD,CAAAA,UAAAA,CAAWmI,QAAQpH,QAAAA,CAAAA;AAC9C,MAAA,MAAMiD,UAAyB,EAAA;AAE/B,MAAA,KAAA,MAAWe,aAAa9B,OAAS,EAAA;AAC/B,QAAMwB,MAAAA,SAAAA,GAAiBzD,KAAKD,CAAAA,IAAAA,CAAAA,QAAAA,EAAUgE,SAAAA,CAAAA;AAEtC,QAAI,IAAA;AACF,UAAA,MAAMiI,UAAa,GAAA,MAAM,IAAKhN,CAAAA,UAAAA,CAAW2E,KAAKF,SAAAA,CAAAA;AAG9C,UAAA,IAAIlE,MAAO0L,CAAAA,iBAAAA,IAAqBe,UAAWhI,CAAAA,MAAAA,EAAU,EAAA;AACnD,YAAA,MAAMI,GAAWgG,GAAAA,KAAAA,CAAAA,OAAAA,CAAQrG,SAAAA,CAAAA,CAAWO,WAAW,EAAA;AAC/C,YAAA,IAAI,CAAC/E,MAAAA,CAAO0L,iBAAkBtL,CAAAA,QAAAA,CAASyE,GAAAA,CAAM,EAAA;AAC3C,cAAA;AACF;AACF;AAEApB,UAAAA,OAAAA,CAAQG,IAAK,CAAA;YACXjD,IAAWF,EAAAA,KAAAA,CAAAA,IAAAA,CAAK8L,QAAQ/H,SAAAA,CAAAA;YACxBwD,IAAMyE,EAAAA,UAAAA,CAAWD,WAAW,EAAA,GAAK,WAAc,GAAA,MAAA;YAC/C1C,IAAM,EAAA,CAAA;AACN4C,YAAAA,YAAAA,sBAAkBlF,IAAAA;;WACpB,CAAA;AACF,SAAA,CAAA,OAASpF,KAAO,EAAA;AAEd,UAAA;AACF;AACF;AAEA,MAAOqB,OAAAA,OAAAA;AACT,KAAA,CAAA,OAASrB,KAAO,EAAA;AAEd,MAAA,IAAIA,MAAMyJ,IAAS,KAAA,QAAA,IAAYzJ,MAAM0J,OAAS1L,EAAAA,QAAAA,CAAS,gBAAA,CAAmB,EAAA;AACxE,QAAA,OAAO,EAAA;AACT;AACA,MAAMgC,MAAAA,KAAAA;AACR;AACF;;;;AAKAuK,EAAAA,cAAAA,CAAe3M,MAAuB,EAAA;AACpC,IAAA,MAAM4M,SAAmB,EAAA;AACzB,IAAM1M,MAAAA,GAAAA,GAAMF,UAAU,EAAC;AAEvB,IAAI,IAAA,CAACE,IAAIH,QAAU,EAAA;AACjB6M,MAAAA,MAAAA,CAAOhJ,KAAK,sBAAA,CAAA;KACH,MAAA,IAAA,OAAO1D,GAAIH,CAAAA,QAAAA,KAAa,QAAU,EAAA;AAC3C6M,MAAAA,MAAAA,CAAOhJ,KAAK,2BAAA,CAAA;AACd;AAEA,IAAA,IAAI1D,IAAI8L,QAAapL,KAAAA,MAAAA,IAAa,OAAOV,GAAAA,CAAI8L,aAAa,SAAW,EAAA;AACnEY,MAAAA,MAAAA,CAAOhJ,KAAK,4BAAA,CAAA;AACd;AAEA,IAAI1D,IAAAA,GAAAA,CAAIwL,sBAAsB9K,MAAW,EAAA;AACvC,MAAA,IAAI,CAACqG,KAAAA,CAAM4F,OAAQ3M,CAAAA,GAAAA,CAAIwL,iBAAiB,CAAG,EAAA;AACzCkB,QAAAA,MAAAA,CAAOhJ,KAAK,oCAAA,CAAA;OACH,MAAA,IAAA,CAAC1D,IAAIwL,iBAAkBoB,CAAAA,KAAAA,CAAM,CAACjI,GAAiB,KAAA,OAAOA,GAAQ,KAAA,QAAA,CAAW,EAAA;AAClF+H,QAAAA,MAAAA,CAAOhJ,KAAK,6CAAA,CAAA;AACd;AACF;AAEA,IAAA,IAAI1D,IAAI6M,cAAmBnM,KAAAA,MAAAA,IAAa,OAAOV,GAAAA,CAAI6M,mBAAmB,SAAW,EAAA;AAC/EH,MAAAA,MAAAA,CAAOhJ,KAAK,kCAAA,CAAA;AACd;AAEA,IAAI1D,IAAAA,GAAAA,CAAID,aAAaW,MAAW,EAAA;AAC9B,MAAA,IAAI,OAAOV,GAAID,CAAAA,QAAAA,KAAa,QAAYC,IAAAA,GAAAA,CAAID,WAAW,CAAG,EAAA;AACxD2M,QAAAA,MAAAA,CAAOhJ,KAAK,wCAAA,CAAA;AACd;AACF;AAEA,IAAOgJ,OAAAA,MAAAA;AACT;;;;EAKA,MAAMI,WAAAA,CAAYhE,GAAaK,EAAAA,SAAAA,EAA6BrJ,MAAgD,EAAA;AAC1G,IAAI,IAAA,CAACA,QAAQD,QAAU,EAAA;AACrB,MAAO,OAAA,KAAA;AACT;AAEA,IAAIsJ,IAAAA,SAAAA,KAAc,OAAWrJ,IAAAA,MAAAA,CAAOgM,QAAU,EAAA;AAC5C,MAAO,OAAA,KAAA;AACT;AAEA,IAAI,IAAA;AACF,MAAA,MAAM1C,YAAe,GAAA,IAAA,CAAKC,mBAAoBP,CAAAA,GAAAA,EAAKhJ,MAAAA,CAAAA;AAGnD,MAAA,MAAMwJ,SAAiB/I,GAAAA,KAAAA,CAAAA,IAAAA,CAAKT,MAAOD,CAAAA,QAAAA,EAAUuJ,eAAe,SAAA,CAAA;AAC5D,MAAA,IAAI,MAAM,IAAA,CAAK7J,UAAWiB,CAAAA,MAAAA,CAAO8I,SAAAA,CAAY,EAAA;AAC3C,QAAO,OAAA,IAAA;AACT;AAGA,MAAA,MAAMc,WAActK,GAAAA,MAAAA,EAAQuK,UAAe3J,KAAAA,KAAAA,CAAAA,GAAYZ,OAAOuK,UAAa,GAAA,IAAA;AAC3E,MAAA,MAAMC,eAAe,OAAOF,WAAAA,KAAgB,SAAYA,GAAAA,WAAAA,GAAeA,YAAiC/J,OAAY,KAAA,KAAA;AAEpH,MAAIiK,IAAAA,YAAAA,IAAgBnB,cAAc,MAAQ,EAAA;AAExC,QAAA,MAAMoB,WAAc,GAAA,MAAM,IAAK3B,CAAAA,WAAAA,CAAYjJ,UACzCyJ,YACAtJ,EAAAA,MAAAA,CAAOD,QACP,EAAA,OAAOuK,WAAgB,KAAA,QAAA,GAAWA,WAAc1J,GAAAA,KAAAA,CAAAA,EAChDZ,OAAOC,QAAQ,CAAA;AAGjB,QAAA,IAAIwK,YAAY9J,IAAM,EAAA;AACpB,UAAO,OAAA,IAAA;AACT;AAGA,QAAA,MAAMoK,UAAa,GAAA;AAAC,UAAA,SAAA;AAAW,UAAA,MAAA;AAAQ,UAAA,KAAA;AAAO,UAAA;;AAC9C,QAAA,KAAA,MAAWlG,OAAOkG,UAAY,EAAA;AAC5B,UAAA,MAAME,cAAc3B,YAAezE,GAAAA,GAAAA;AACnC,UAAA,MAAMqG,cAAiB,GAAA,MAAM,IAAKpC,CAAAA,WAAAA,CAAYjJ,UAC5CoL,WACAjL,EAAAA,MAAAA,CAAOD,QACP,EAAA,OAAOuK,WAAgB,KAAA,QAAA,GAAWA,WAAc1J,GAAAA,KAAAA,CAAAA,EAChDZ,OAAOC,QAAQ,CAAA;AAGjB,UAAA,IAAIiL,eAAevK,IAAM,EAAA;AACvB,YAAO,OAAA,IAAA;AACT;AACF;AAEA,QAAO,OAAA,KAAA;OACF,MAAA;AAEL,QAAA,MAAMH,QAAW,GAAA,MAAM,IAAK6J,CAAAA,eAAAA,CAAgBf,cAActJ,MAAAA,CAAAA;AAG1D,QAAA,IAAIqJ,SAAc,KAAA,MAAA,IAAU,CAAMwB,KAAAA,CAAAA,OAAAA,CAAQrK,QAAAA,CAAW,EAAA;AACnD,UAAA,MAAMsK,UAAa,GAAA,MAAM,IAAKrL,CAAAA,UAAAA,CAAWiB,OAAOF,QAAAA,CAAAA;AAChD,UAAA,IAAI,CAACsK,UAAY,EAAA;AAEf,YAAA,MAAMQ,YAAY9K,QAAW,GAAA,SAAA;AAC7B,YAAA,IAAI,MAAM,IAAA,CAAKf,UAAWiB,CAAAA,MAAAA,CAAO4K,SAAAA,CAAY,EAAA;AAC3C,cAAO,OAAA,IAAA;AACT;AAEA,YAAA,MAAMC,UAAU/K,QAAW,GAAA,MAAA;AAC3B,YAAA,IAAI,MAAM,IAAA,CAAKf,UAAWiB,CAAAA,MAAAA,CAAO6K,OAAAA,CAAU,EAAA;AACzC,cAAO,OAAA,IAAA;AACT;AAEA,YAAA,MAAMC,SAAShL,QAAW,GAAA,KAAA;AAC1B,YAAA,IAAI,MAAM,IAAA,CAAKf,UAAWiB,CAAAA,MAAAA,CAAO8K,MAAAA,CAAS,EAAA;AACxC,cAAO,OAAA,IAAA;AACT;AACA,YAAA,MAAMC,aAAajL,QAAW,GAAA,UAAA;AAC9B,YAAA,IAAI,MAAM,IAAA,CAAKf,UAAWiB,CAAAA,MAAAA,CAAO+K,UAAAA,CAAa,EAAA;AAC5C,cAAO,OAAA,IAAA;AACT;AACF;AACF;AAGA,QAAA,IAAIpC,cAAc,OAAS,EAAA;AACzB,UAAM4C,MAAAA,GAAAA,GAAWC,cAAQ1L,QAAAA,CAAAA;AAEzB,UAAA,MAAMyM,SAAY,GAAA,MAAM,IAAKxN,CAAAA,UAAAA,CAAWiB,OAAOuL,GAAAA,CAAAA;AAC/C,UAAOgB,OAAAA,SAAAA;SACF,MAAA;AAEL,UAAA,OAAO,MAAM,IAAA,CAAKxN,UAAWiB,CAAAA,MAAAA,CAAOF,QAAAA,CAAAA;AACtC;AACF;AACF,KAAA,CAAA,OAAS4B,KAAO,EAAA;AACd,MAAO,OAAA,KAAA;AACT;AACF;;;;;AAMQmH,EAAAA,mBAAAA,CAAoBP,KAAahJ,MAAiD,EAAA;AAGxF,IAAMkN,MAAAA,WAAAA,GAAclE,GAAItF,CAAAA,KAAAA,CAAM,eAAA,CAAA;AAC9B,IAAA,IAAIwJ,WAAa,EAAA;AACf,MAAA,OAAOA,YAAY,CAAA,CAAA;AACrB;AAEA,IAAOlE,OAAAA,GAAAA;AACT;;;;EAKA,MAAcqB,eAAAA,CAAgBf,cAAsBtJ,MAA0D,EAAA;AAE5G,IAAMD,MAAAA,QAAAA,GAAWC,QAAQD,QAAY,IAAA,GAAA;AACrC,IAAMoN,MAAAA,cAAAA,GAAsBjE,cAAQnJ,QAAAA,CAAAA;AAGpC,IAASkJ,IAAAA,KAAAA,CAAAA,UAAAA,CAAWK,YAAAA,CAAe,EAAA;AACjC,MAAM8D,MAAAA,cAAAA,GAAsBlE,cAAQI,YAAAA,CAAAA;AACpC,MAAI8D,IAAAA,cAAAA,CAAetM,UAAWqM,CAAAA,cAAAA,CAAiB,EAAA;AAE7C,QAAOC,OAAAA,cAAAA;AACT;AAEA,MAAM,MAAA,IAAIjE,cACR,kEACA,EAAA;QACEC,YAAc,EAAA,eAAA;QACdwB,SAAWtB,EAAAA,YAAAA;QACXD,SAAW,EAAA;OACb,CAAA;AAEJ;AAGA,IAAMxI,MAAAA,SAAAA,GAAYyI,aAAaxI,UAAW,CAAA,GAAA,IAAOwI,YAAatG,CAAAA,KAAAA,CAAM,CAAA,CAAKsG,GAAAA,YAAAA;AAGzE,IAAA,MAAM9I,QAAgB0I,GAAAA,KAAAA,CAAAA,OAAAA,CAAQlJ,MAAOD,CAAAA,QAAAA,EAAUc,SAAAA,CAAAA;AAC/C,IAAMwM,MAAAA,cAAAA,GAAsBnE,cAAQ1I,QAAAA,CAAAA;AAGpC,IAAA,IAAI,CAAC6M,cAAAA,CAAevM,UAAWqM,CAAAA,cAAAA,CAAiB,EAAA;AAC9C,MAAM,MAAA,IAAIhE,cACR,kEACA,EAAA;QACEC,YAAc,EAAA,eAAA;QACdwB,SAAWtB,EAAAA,YAAAA;QACXD,SAAW,EAAA;OACb,CAAA;AAEJ;AAGA,IAAIrJ,IAAAA,MAAAA,CAAOC,aAAaW,MAAW,EAAA;AACjC,MAAA,MAAM0M,aAAqB3C,GAAAA,KAAAA,CAAAA,QAAAA,CAASwC,cAAgBE,EAAAA,cAAAA,CAAgBpM,CAAAA,KAAAA,CAAWsM,KAAG,CAAA,GAAA,CAAA,CAAErM,MAAOsM,CAAAA,CAAAA,CAAKA,KAAAA,CAAAA,IAAKA,MAAM,GAAA,CAAA;AAI3G,MAAA,MAAMnM,QAAQC,IAAKC,CAAAA,GAAAA,CAAI,CAAG+L,EAAAA,aAAAA,CAAclM,SAAS,CAAA,CAAA;AAGjD,MAAIC,IAAAA,KAAAA,IAASrB,OAAOC,QAAU,EAAA;AAC5B,QAAA,MAAM,IAAIkJ,aAAAA,CACR,CAAiCnJ,8BAAAA,EAAAA,MAAAA,CAAOC,QAAQ,CAChD,CAAA,EAAA;UAAEmJ,YAAc,EAAA,eAAA;UAAiBwB,SAAWtB,EAAAA,YAAAA;UAAcD,SAAW,EAAA;SAAU,CAAA;AAEnF;AACF;AAMA,IAAOgE,OAAAA,cAAAA;AACT;;;;EAKA,MAAc1B,iBAAAA,CAAkBN,UAAkB5B,OAAsD,EAAA;AAEtG,IAAA,MAAMgE,cAAiB,GAAA;AAAC,MAAA,SAAA;AAAW,MAAA,MAAA;AAAQ,MAAA,KAAA;AAAO,MAAA,UAAA;AAAY,MAAA;;AAG9D,IAAMC,MAAAA,gBAAAA,GAAmBD,eAAeE,IAAK9I,CAAAA,CAAAA,QAAOwG,QAASuC,CAAAA,QAAAA,CAAS/I,GAAAA,CAAAA,CAAAA;AAGtE,IAAA,IAAI6I,gBAAqB,IAAA,CAACrC,QAASuC,CAAAA,QAAAA,CAAS,OAAA,CAAW,EAAA;AACrD,MAAI,IAAA;AACF,QAAA,MAAM,EAAEtJ,KAAAA,EAAAA,MAAAA,EAAU,GAAA,MAAM,OAAO,uBAAA,CAAA;AAC/B,QAAA,MAAM,EAAEuJ,aAAAA,EAAkB,GAAA,MAAM,OAAO,qBAAA,CAAA;AACvC,QAAMC,MAAAA,IAAAA,GAAOD,cAAcxC,QAAAA,CAAAA;AAC3B,QAAMvJ,MAAAA,MAAAA,GAAS,MAAMwC,MAAAA,CAAMmF,OAAS,EAAA;AAAEqE,UAAAA;SAAK,CAAA;AAC3C,QAAA,IAAIhM,OAAOiM,OAAW,IAAA,IAAA,CAAKC,gBAAiBlM,CAAAA,MAAAA,CAAOmM,GAAG,CAAG,EAAA;AACvD,UAAO,OAAA,QAAA;AACT;OACM,CAAA,MAAA;AAER;AACF;AAGA,IAAI5C,IAAAA,QAAAA,CAASuC,QAAS,CAAA,OAAA,CAAU,EAAA;AAC9B,MAAO,OAAA,MAAA;AACT;AAGA,IAAI,IAAA;AACFM,MAAAA,IAAAA,CAAK5J,MAAMmF,OAAAA,CAAAA;AACX,MAAO,OAAA,MAAA;KACD,CAAA,MAAA;AAER;AAEA,IAAO,OAAA,MAAA;AACT;;;;AAKQuE,EAAAA,gBAAAA,CAAiBC,GAAmB,EAAA;AAE1C,IAAA,IAAI,CAACA,GAAO,IAAA,CAAChH,MAAM4F,OAAQoB,CAAAA,GAAAA,GAAa,OAAA,KAAA;AAExC,IAAA,OAAOA,IAAIN,IAAKQ,CAAAA,CAAAA,SACdA,IAAQA,IAAAA,IAAAA,CAAKnG,SAAS,WACtB,IAAA;AAAC,MAAA,KAAA;AAAO,MAAA,KAAA;AAAO,MAAA;MAAQ5H,QAAS+N,CAAAA,IAAAA,CAAKC,IAAI,CAAA,CAAA;AAE7C;;;;AAKQxC,EAAAA,WAAAA,CAAYP,QAA0B,EAAA;AAC5C,IAAA,MAAMxG,GAAWgG,GAAAA,KAAAA,CAAAA,OAAAA,CAAQQ,QAAAA,CAAAA,CAAUtG,WAAW,EAAA;AAC9C,IAAA,MAAMsJ,SAAoC,GAAA;MACxC,MAAQ,EAAA,aAAA;MACR,OAAS,EAAA,aAAA;MACT,KAAO,EAAA,eAAA;MACP,MAAQ,EAAA,YAAA;MACR,OAAS,EAAA,kBAAA;MACT,OAAS,EAAA,WAAA;MACT,MAAQ,EAAA,WAAA;MACR,KAAO,EAAA,iBAAA;MACP,KAAO,EAAA,iBAAA;MACP,KAAO,EAAA,eAAA;MACP,KAAO,EAAA,oBAAA;MACP,MAAQ,EAAA,UAAA;MACR,OAAS,EAAA,WAAA;MACT,MAAQ,EAAA;AACV,KAAA;AAEA,IAAOA,OAAAA,SAAAA,CAAUxJ,GAAAA,CAAQ,IAAA,YAAA;AAC3B;AACF,CAAA;AAhqBaiD,MAAAA,CAAAA,cAAAA,EAAAA,eAAAA,CAAAA;AAAN,IAAMA,aAAN,GAAA","file":"chunk-CIWUSUU2.mjs","sourcesContent":["import * as path from 'path';\nimport { IFileSystemService } from '@services/fs/IFileSystemService';\n\n/**\n * Configuration for fuzzy path matching\n */\nexport interface FuzzyMatchConfig {\n  enabled?: boolean;\n  caseInsensitive?: boolean;\n  normalizeWhitespace?: boolean;\n  suggestionThreshold?: number;\n}\n\n/**\n * Result of a fuzzy path match attempt\n */\nexport interface PathMatchResult {\n  /**\n   * The matched path (if found)\n   */\n  path?: string;\n  \n  /**\n   * Whether an exact match was found\n   */\n  exact: boolean;\n  \n  /**\n   * Confidence score (0-1)\n   */\n  confidence: number;\n  \n  /**\n   * All potential matches (for ambiguity errors)\n   */\n  candidates?: PathCandidate[];\n  \n  /**\n   * Suggested alternatives (for \"did you mean?\" errors)\n   */\n  suggestions?: string[];\n}\n\n/**\n * A candidate path with match details\n */\nexport interface PathCandidate {\n  path: string;\n  confidence: number;\n  matchType: 'exact' | 'case' | 'whitespace' | 'fuzzy';\n}\n\n/**\n * Utility for fuzzy path matching with case and whitespace normalization\n */\nexport class PathMatcher {\n  private static readonly DEFAULT_CONFIG: Required<FuzzyMatchConfig> = {\n    enabled: true,\n    caseInsensitive: true,\n    normalizeWhitespace: true,\n    suggestionThreshold: 0.7\n  };\n\n  private directoryCache: Map<string, { entries: string[], timestamp: number }> = new Map();\n  private readonly CACHE_TTL = 5000; // 5 seconds\n\n  constructor(private fileSystem: IFileSystemService) {}\n\n  /**\n   * Find a matching path with fuzzy matching support\n   */\n  async findMatch(\n    targetPath: string,\n    basePath: string,\n    config?: FuzzyMatchConfig,\n    maxDepth?: number\n  ): Promise<PathMatchResult> {\n    const cfg = { ...PathMatcher.DEFAULT_CONFIG, ...config };\n    \n    // Security check: prevent path traversal\n    if (targetPath.includes('..')) {\n      // Don't use fuzzy matching for paths with traversal attempts\n      return { exact: false, confidence: 0 };\n    }\n    \n    // If fuzzy matching is disabled, just check exact path\n    if (!cfg.enabled) {\n      const fullPath = path.join(basePath, targetPath);\n      const exists = await this.fileSystem.exists(fullPath);\n      return {\n        path: exists ? fullPath : undefined,\n        exact: true,\n        confidence: exists ? 1 : 0\n      };\n    }\n\n    // Split path into segments for checking\n    // Handle leading ./ by removing it\n    const cleanPath = targetPath.startsWith('./') ? targetPath.substring(2) : targetPath;\n    const segments = cleanPath.split('/').filter(s => s.length > 0);\n    \n    // Check max depth if specified (applies to all matches, including exact)\n    // Depth is number of directories, not total segments\n    // 'README.md' = depth 0, 'modules/utils.mld' = depth 1\n    if (segments.length > 0 && maxDepth !== undefined) {\n      const depth = Math.max(0, segments.length - 1);\n      if (depth >= maxDepth) {\n        // Don't use fuzzy matching for paths that exceed max depth\n        return { exact: false, confidence: 0 };\n      }\n    }\n\n    // Try exact match first\n    const exactPath = path.join(basePath, targetPath);\n    if (await this.fileSystem.exists(exactPath)) {\n      return {\n        path: exactPath,\n        exact: true,\n        confidence: 1\n      };\n    }\n    \n    // Debug log\n    if (process.env.DEBUG_FUZZY) {\n      console.log(`No exact match for ${exactPath}, trying fuzzy...`);\n    }\n\n    if (segments.length === 0) {\n      return { exact: false, confidence: 0 };\n    }\n\n    // Recursively match path segments\n    try {\n      const result = await this.matchSegments(segments, basePath, cfg);\n      \n      // If we found multiple candidates with equal confidence, it's ambiguous\n      if (result.candidates && result.candidates.length > 1) {\n        const topConfidence = result.candidates[0].confidence;\n        const equalMatches = result.candidates.filter(c => c.confidence === topConfidence);\n        \n        if (equalMatches.length > 1) {\n          return {\n            exact: false,\n            confidence: 0,\n            candidates: equalMatches\n          };\n        }\n      }\n\n      return result;\n    } catch (error) {\n      // If directory doesn't exist or other error, return no match\n      return { exact: false, confidence: 0 };\n    }\n  }\n\n  /**\n   * Clear the directory cache\n   */\n  clearCache(): void {\n    this.directoryCache.clear();\n  }\n\n  /**\n   * Recursively match path segments with fuzzy matching\n   */\n  private async matchSegments(\n    segments: string[],\n    currentPath: string,\n    config: Required<FuzzyMatchConfig>,\n    depth: number = 0\n  ): Promise<PathMatchResult> {\n    // Debug log\n    if (process.env.DEBUG_FUZZY) {\n      console.log(`matchSegments: segments=${segments.join('/')}, currentPath=${currentPath}, depth=${depth}`);\n    }\n    \n    // Base case: no more segments\n    if (segments.length === 0) {\n      return {\n        path: currentPath,\n        exact: false,\n        confidence: 1\n      };\n    }\n\n    const [currentSegment, ...remainingSegments] = segments;\n    \n    // Get directory entries (with caching)\n    const entries = await this.getCachedDirectoryEntries(currentPath);\n    if (!entries) {\n      if (process.env.DEBUG_FUZZY) {\n        console.log(`No entries found in directory: ${currentPath}`);\n      }\n      return { exact: false, confidence: 0 };\n    }\n    \n    if (process.env.DEBUG_FUZZY) {\n      console.log(`Directory entries: ${entries.join(', ')}`);\n    }\n\n    // Find matching entries for current segment\n    const matches = await this.findSegmentMatches(\n      currentSegment,\n      entries,\n      currentPath,\n      config\n    );\n\n    if (matches.length === 0) {\n      // No matches found - generate suggestions\n      const suggestions = this.generateSuggestions(currentSegment, entries, config);\n      \n      if (process.env.DEBUG_FUZZY) {\n        console.log(`No matches for segment '${currentSegment}', generated ${suggestions.length} suggestions`);\n      }\n      \n      return {\n        exact: false,\n        confidence: 0,\n        suggestions: suggestions.slice(0, 3) // Top 3 suggestions\n      };\n    }\n\n    // If this is the last segment, return the matches\n    if (remainingSegments.length === 0) {\n      // Sort by confidence and match type priority\n      matches.sort((a, b) => {\n        if (a.confidence !== b.confidence) {\n          return b.confidence - a.confidence;\n        }\n        // Priority: exact > case > whitespace > fuzzy\n        const typePriority = { exact: 4, case: 3, whitespace: 2, fuzzy: 1 };\n        return typePriority[b.matchType] - typePriority[a.matchType];\n      });\n\n      return {\n        path: matches[0].path,\n        exact: matches[0].matchType === 'exact',\n        confidence: matches[0].confidence,\n        candidates: matches.length > 1 ? matches : undefined\n      };\n    }\n\n    // Recursively match remaining segments for each candidate\n    const results: PathMatchResult[] = [];\n    for (const match of matches) {\n      const subResult = await this.matchSegments(\n        remainingSegments,\n        match.path,\n        config,\n        depth + 1\n      );\n      \n      if (subResult.path) {\n        results.push({\n          ...subResult,\n          confidence: match.confidence * subResult.confidence\n        });\n      }\n    }\n\n    if (results.length === 0) {\n      return { exact: false, confidence: 0 };\n    }\n\n    // Sort by confidence\n    results.sort((a, b) => b.confidence - a.confidence);\n    \n    // Check for ambiguity\n    const topConfidence = results[0].confidence;\n    const equalResults = results.filter(r => r.confidence === topConfidence);\n    \n    if (equalResults.length > 1) {\n      return {\n        exact: false,\n        confidence: 0,\n        candidates: equalResults.map(r => ({\n          path: r.path!,\n          confidence: r.confidence,\n          matchType: 'fuzzy' as const\n        }))\n      };\n    }\n\n    return results[0];\n  }\n\n  /**\n   * Find matching entries for a path segment\n   */\n  private async findSegmentMatches(\n    segment: string,\n    entries: string[],\n    basePath: string,\n    config: Required<FuzzyMatchConfig>\n  ): Promise<PathCandidate[]> {\n    const matches: PathCandidate[] = [];\n\n    for (const entry of entries) {\n      const entryPath = path.join(basePath, entry);\n      \n      // Check if it's a file or directory\n      const stats = await this.fileSystem.stat(entryPath);\n      \n      // For files, check extension match first\n      const entryParsed = path.parse(entry);\n      const segmentParsed = path.parse(segment);\n      const entryName = stats.isFile() ? entryParsed.name : entry;\n      const segmentName = segmentParsed.name;\n      const entryExt = entryParsed.ext;\n      const segmentExt = segmentParsed.ext;\n      \n      // If segment has an extension, it must match exactly (case-insensitive)\n      if (segmentExt && stats.isFile() && entryExt.toLowerCase() !== segmentExt.toLowerCase()) {\n        continue;\n      }\n\n      // Exact match\n      if (entry === segment || (stats.isFile() && entryName === segmentName)) {\n        matches.push({\n          path: entryPath,\n          confidence: 1,\n          matchType: 'exact'\n        });\n        continue;\n      }\n\n      // Case-insensitive match\n      if (config.caseInsensitive) {\n        if (entry.toLowerCase() === segment.toLowerCase() ||\n            (stats.isFile() && entryName.toLowerCase() === segmentName.toLowerCase())) {\n          matches.push({\n            path: entryPath,\n            confidence: 0.95,\n            matchType: 'case'\n          });\n          continue;\n        }\n      }\n\n      // Whitespace normalization match\n      if (config.normalizeWhitespace) {\n        const normalizedEntry = this.normalizeWhitespace(entryName);\n        const normalizedSegment = this.normalizeWhitespace(segmentName);\n        \n        // Only check normalized match if not already found with higher priority\n        if (normalizedEntry === normalizedSegment) {\n          // Calculate confidence based on transformation distance\n          const confidence = this.calculateWhitespaceConfidence(entryName, segmentName);\n          matches.push({\n            path: entryPath,\n            confidence,\n            matchType: 'whitespace'\n          });\n          continue;\n        }\n\n        // Case-insensitive + whitespace normalization (only if both are enabled)\n        if (config.caseInsensitive && \n            normalizedEntry.toLowerCase() === normalizedSegment.toLowerCase()) {\n          const confidence = this.calculateWhitespaceConfidence(entryName, segmentName) * 0.95;\n          matches.push({\n            path: entryPath,\n            confidence,\n            matchType: 'fuzzy'\n          });\n        }\n      }\n    }\n\n    return matches;\n  }\n\n  /**\n   * Normalize whitespace in a string (spaces, dashes, underscores)\n   */\n  private normalizeWhitespace(str: string): string {\n    // Replace all whitespace variants with a single dash\n    return str.replace(/[\\s\\-_]+/g, '-');\n  }\n\n  /**\n   * Calculate confidence based on whitespace transformation\n   */\n  private calculateWhitespaceConfidence(original: string, target: string): number {\n    // Priority: exact > dashes > underscores > spaces\n    const originalChars = this.getWhitespaceChars(original);\n    const targetChars = this.getWhitespaceChars(target);\n    \n    if (originalChars === targetChars) return 0.9;\n    \n    const charPriority: Record<string, number> = {\n      '-': 3,\n      '_': 2,\n      ' ': 1,\n      'mixed': 0\n    };\n    \n    const originalPriority = charPriority[originalChars] || 0;\n    const targetPriority = charPriority[targetChars] || 0;\n    \n    // Higher confidence if target uses higher priority separator\n    const priorityDiff = Math.abs(originalPriority - targetPriority);\n    return 0.9 - (priorityDiff * 0.1);\n  }\n\n  /**\n   * Get the predominant whitespace character type\n   */\n  private getWhitespaceChars(str: string): string {\n    const dashes = (str.match(/-/g) || []).length;\n    const underscores = (str.match(/_/g) || []).length;\n    const spaces = (str.match(/ /g) || []).length;\n    \n    if (dashes > 0 && underscores === 0 && spaces === 0) return '-';\n    if (underscores > 0 && dashes === 0 && spaces === 0) return '_';\n    if (spaces > 0 && dashes === 0 && underscores === 0) return ' ';\n    return 'mixed';\n  }\n\n  /**\n   * Generate suggestions for a failed match\n   */\n  private generateSuggestions(\n    segment: string,\n    entries: string[],\n    config: Required<FuzzyMatchConfig>\n  ): string[] {\n    const suggestions: Array<{ entry: string, score: number }> = [];\n    \n    if (process.env.DEBUG_FUZZY) {\n      console.log(`Generating suggestions for '${segment}' from entries:`, entries);\n    }\n    \n    for (const entry of entries) {\n      const score = this.calculateSimilarity(segment, entry, config);\n      \n      if (process.env.DEBUG_FUZZY) {\n        console.log(`  ${entry}: score=${score}, threshold=${config.suggestionThreshold}`);\n      }\n      \n      if (score >= config.suggestionThreshold) {\n        suggestions.push({ entry, score });\n      }\n    }\n    \n    // Sort by score and return entry names\n    return suggestions\n      .sort((a, b) => b.score - a.score)\n      .map(s => s.entry);\n  }\n\n  /**\n   * Calculate similarity score between two strings\n   */\n  private calculateSimilarity(\n    str1: string,\n    str2: string,\n    config: Required<FuzzyMatchConfig>\n  ): number {\n    let s1 = str1;\n    let s2 = str2;\n    \n    if (config.normalizeWhitespace) {\n      s1 = this.normalizeWhitespace(s1);\n      s2 = this.normalizeWhitespace(s2);\n    }\n    \n    if (config.caseInsensitive) {\n      s1 = s1.toLowerCase();\n      s2 = s2.toLowerCase();\n    }\n    \n    // Simple Levenshtein distance-based similarity\n    const maxLen = Math.max(s1.length, s2.length);\n    if (maxLen === 0) return 1;\n    \n    const distance = this.levenshteinDistance(s1, s2);\n    return 1 - (distance / maxLen);\n  }\n\n  /**\n   * Calculate Levenshtein distance between two strings\n   */\n  private levenshteinDistance(str1: string, str2: string): number {\n    const m = str1.length;\n    const n = str2.length;\n    const dp: number[][] = Array(m + 1).fill(null).map(() => Array(n + 1).fill(0));\n    \n    for (let i = 0; i <= m; i++) dp[i][0] = i;\n    for (let j = 0; j <= n; j++) dp[0][j] = j;\n    \n    for (let i = 1; i <= m; i++) {\n      for (let j = 1; j <= n; j++) {\n        if (str1[i - 1] === str2[j - 1]) {\n          dp[i][j] = dp[i - 1][j - 1];\n        } else {\n          dp[i][j] = 1 + Math.min(\n            dp[i - 1][j],     // deletion\n            dp[i][j - 1],     // insertion\n            dp[i - 1][j - 1]  // substitution\n          );\n        }\n      }\n    }\n    \n    return dp[m][n];\n  }\n\n  /**\n   * Get cached directory entries or read from filesystem\n   */\n  private async getCachedDirectoryEntries(dirPath: string): Promise<string[] | null> {\n    const now = Date.now();\n    const cached = this.directoryCache.get(dirPath);\n    \n    if (cached && now - cached.timestamp < this.CACHE_TTL) {\n      return cached.entries;\n    }\n    \n    try {\n      const entries = await this.fileSystem.readdir(dirPath);\n      this.directoryCache.set(dirPath, { entries, timestamp: now });\n      return entries;\n    } catch (error) {\n      return null;\n    }\n  }\n}","import * as path from 'path';\nimport { \n  Resolver, \n  ResolverContent, \n  ResolverType,\n  ContentInfo,\n  ResolverCapabilities,\n  FuzzyMatchConfig\n} from '@core/resolvers/types';\nimport { MlldFileNotFoundError } from '@core/errors';\nimport { ResolverError } from '@core/errors/ResolverError';\nimport { IFileSystemService } from '@services/fs/IFileSystemService';\nimport { PathMatcher } from '@core/resolvers/utils/PathMatcher';\n\n/**\n * Configuration for LocalResolver\n */\nexport interface LocalResolverConfig {\n  /**\n   * Base path for resolving references\n   */\n  basePath: string;\n\n  /**\n   * Whether this resolver is read-only\n   */\n  readonly?: boolean;\n\n  /**\n   * Allowed file extensions (if not specified, allows all)\n   */\n  allowedExtensions?: string[];\n\n  /**\n   * Whether to follow symlinks\n   */\n  followSymlinks?: boolean;\n\n  /**\n   * Maximum directory depth to traverse\n   */\n  maxDepth?: number;\n\n  /**\n   * Fuzzy matching configuration\n   */\n  fuzzyMatch?: FuzzyMatchConfig;\n}\n\n/**\n * Local Resolver - maps prefixes to filesystem paths\n * Provides secure access to local files with path validation\n */\nexport class LocalResolver implements Resolver {\n  name = 'LOCAL';\n  description = 'Resolves modules from local filesystem paths';\n  type: ResolverType = 'io';\n  \n  capabilities: ResolverCapabilities = {\n    io: { read: true, write: false, list: true },\n    contexts: { import: true, path: true, output: false },\n    supportedContentTypes: ['module', 'data', 'text'],\n    defaultContentType: 'text',\n    priority: 20, // Lower priority than built-ins and modules\n    cache: { strategy: 'none' } // Local files don't need caching\n  };\n\n  private pathMatcher: PathMatcher;\n\n  constructor(private fileSystem: IFileSystemService) {\n    this.pathMatcher = new PathMatcher(fileSystem);\n  }\n\n  /**\n   * Check if this resolver can handle the reference\n   * Always returns true since prefix matching is done by ResolverManager\n   */\n  canResolve(ref: string, config?: LocalResolverConfig): boolean {\n    // We can handle any reference if we have a valid config\n    // OR if the reference is an absolute path (for backwards compatibility)\n    return !!config?.basePath || path.isAbsolute(ref);\n  }\n\n  /**\n   * Resolve a reference to local file content\n   */\n  async resolve(ref: string, config?: LocalResolverConfig): Promise<ResolverContent> {\n    // For absolute paths without config, use root as basePath for backwards compatibility\n    if (!config?.basePath && !path.isAbsolute(ref)) {\n      throw new ResolverError(\n        'LocalResolver requires basePath in configuration for relative paths',\n        { resolverName: 'LocalResolver', operation: 'resolve' }\n      );\n    }\n\n    // Extract the path after the prefix\n    // The ResolverManager will have already matched the prefix\n    const relativePath = this.extractRelativePath(ref, config);\n    \n    // Quick check for .mld.md files (common module format)\n    if (config?.basePath) {\n      const mldMdPath = path.join(config.basePath, relativePath + '.mld.md');\n      if (await this.fileSystem.exists(mldMdPath)) {\n        const content = await this.fileSystem.readFile(mldMdPath, 'utf8');\n        const metadata = {\n          source: `file://${mldMdPath}`,\n          mimeType: 'text/x-mlld-module',\n          size: Buffer.byteLength(content, 'utf8'),\n          timestamp: new Date(),\n          taint: []\n        };\n        return {\n          content,\n          contentType: 'module',\n          mx: metadata,\n          metadata\n        };\n      }\n    }\n    \n    // First check for path traversal attempts (security check before fuzzy matching)\n    if (relativePath.includes('..') || path.isAbsolute(relativePath)) {\n      // Validate through resolveFullPath which has security checks\n      try {\n        const securePath = await this.resolveFullPath(relativePath, config);\n        // If it passes security checks, we can proceed\n      } catch (error) {\n        // Security error - re-throw it\n        throw error;\n      }\n    }\n    \n    // Use fuzzy matching if enabled (default: true)\n    const fuzzyConfig = config?.fuzzyMatch !== undefined ? config.fuzzyMatch : true;\n    const fuzzyEnabled = typeof fuzzyConfig === 'boolean' ? fuzzyConfig : (fuzzyConfig as FuzzyMatchConfig).enabled !== false;\n    \n    let fullPath: string;\n    \n    if (fuzzyEnabled && config?.basePath) {\n      // Try fuzzy matching\n      const matchResult = await this.pathMatcher.findMatch(\n        relativePath,\n        config.basePath,\n        typeof fuzzyConfig === 'object' ? fuzzyConfig : undefined,\n        config.maxDepth\n      );\n      \n      if (matchResult.candidates && matchResult.candidates.length > 1) {\n        // Ambiguous match - throw error with all candidates\n        const candidatePaths = matchResult.candidates\n          .map(c => `  - ${path.relative(config.basePath, c.path)} (${c.matchType} match)`)\n          .join('\\n');\n        \n        throw new ResolverError(\n          `Ambiguous path '${relativePath}' matches multiple files:\\n${candidatePaths}\\n\\nPlease use a more specific path.`,\n          { resolverName: 'LocalResolver', reference: ref, operation: 'resolve' }\n        );\n      }\n      \n      if (matchResult.path) {\n        fullPath = matchResult.path;\n      } else {\n        // No fuzzy match found - try with extensions\n        fullPath = await this.resolveFullPath(relativePath, config);\n        \n        // If no extension and the file doesn't exist, try with .mld.md, .mld, or .md extensions\n        if (!path.extname(fullPath)) {\n          const existsAsIs = await this.fileSystem.exists(fullPath);\n          if (!existsAsIs) {\n            // Try with extensions using fuzzy matching\n            const extensions = ['.mld.md', '.mld', '.md', '.mlld.md'];\n            let foundWithExtension = false;\n            \n            for (const ext of extensions) {\n              const pathWithExt = relativePath + ext;\n              const extMatchResult = await this.pathMatcher.findMatch(\n                pathWithExt,\n                config.basePath,\n                typeof fuzzyConfig === 'object' ? fuzzyConfig : undefined,\n                config.maxDepth\n              );\n              \n              if (extMatchResult.path) {\n                fullPath = extMatchResult.path;\n                foundWithExtension = true;\n                break;\n              }\n            }\n            \n            if (!foundWithExtension && matchResult.suggestions && matchResult.suggestions.length > 0) {\n              // Provide helpful suggestions\n              const suggestions = matchResult.suggestions\n                .slice(0, 3)\n                .map(s => `  - ${s}`)\n                .join('\\n');\n              \n              throw new MlldFileNotFoundError(\n                `File not found: ${relativePath}\\n\\nDid you mean:\\n${suggestions}`,\n                {\n                  details: {\n                    filePath: relativePath,\n                    operation: 'resolve'\n                  }\n                }\n              );\n            }\n          }\n        }\n      }\n    } else {\n      // Fuzzy matching disabled - use original logic\n      fullPath = await this.resolveFullPath(relativePath, config);\n      \n      // If no extension and the file doesn't exist, try with .mld.md, .mld, or .md extensions\n      if (!path.extname(fullPath)) {\n        const existsAsIs = await this.fileSystem.exists(fullPath);\n        if (!existsAsIs) {\n          // Try .mld.md first (module with docs)\n          const withMldMd = fullPath + '.mld.md';\n          if (await this.fileSystem.exists(withMldMd)) {\n            fullPath = withMldMd;\n          } else {\n            // Try .mld as fallback\n            const withMld = fullPath + '.mld';\n            if (await this.fileSystem.exists(withMld)) {\n              fullPath = withMld;\n            } else {\n              // Try .md as final fallback\n              const withMd = fullPath + '.md';\n              if (await this.fileSystem.exists(withMd)) {\n                fullPath = withMd;\n              } else {\n                const withLegacy = fullPath + '.mlld.md';\n                if (await this.fileSystem.exists(withLegacy)) {\n                  fullPath = withLegacy;\n                }\n              }\n            }\n          }\n        }\n      }\n    }\n\n    // Check file extension if restrictions are configured\n    if (config.allowedExtensions) {\n      const ext = path.extname(fullPath).toLowerCase();\n      if (!config.allowedExtensions.includes(ext)) {\n        throw new ResolverError(\n          `File extension '${ext}' not allowed. Allowed: ${config.allowedExtensions.join(', ')}`,\n          { resolverName: 'LocalResolver', reference: ref, operation: 'resolve' }\n        );\n      }\n    }\n\n    try {\n      // Read the file\n      const content = await this.fileSystem.readFile(fullPath);\n      \n      // Get file stats for metadata\n      const stats = await this.fileSystem.stat(fullPath);\n      \n      // Detect content type\n      const contentType = await this.detectContentType(fullPath, content);\n\n      const metadata = {\n        source: `file://${fullPath}`,\n        timestamp: new Date(),  // Use current time since IFileSystemService doesn't provide mtime\n        taint: [],\n        size: content.length,  // Calculate size from content\n        mimeType: this.getMimeType(fullPath)\n      };\n\n      return {\n        content,\n        contentType,\n        mx: metadata,\n        metadata\n      };\n    } catch (error) {\n      if (error.code === 'ENOENT' || error.message?.includes('File not found')) {\n        throw new MlldFileNotFoundError(\n          `File not found: ${relativePath}`,\n          {\n            details: {\n              filePath: relativePath,\n              operation: 'resolve'\n            }\n          }\n        );\n      }\n      throw ResolverError.resolutionFailed(\n        'LocalResolver',\n        ref,\n        error as Error\n      );\n    }\n  }\n\n  /**\n   * Write content to a local file\n   */\n  async write(ref: string, content: string, config?: LocalResolverConfig): Promise<void> {\n    if (!config?.basePath) {\n      throw new ResolverError(\n        'LocalResolver requires basePath in configuration',\n        { resolverName: 'LocalResolver', operation: 'write' }\n      );\n    }\n\n    if (config.readonly) {\n      throw new ResolverError(\n        'Cannot write: LocalResolver is configured as read-only',\n        { resolverName: 'LocalResolver', operation: 'write', reference: ref }\n      );\n    }\n\n    const relativePath = this.extractRelativePath(ref, config);\n    const fullPath = await this.resolveFullPath(relativePath, config);\n\n    // Check file extension if restrictions are configured\n    if (config.allowedExtensions) {\n      const ext = path.extname(fullPath).toLowerCase();\n      if (!config.allowedExtensions.includes(ext)) {\n        throw new ResolverError(\n          `File extension '${ext}' not allowed. Allowed: ${config.allowedExtensions.join(', ')}`,\n          { resolverName: 'LocalResolver', reference: ref, operation: 'resolve' }\n        );\n      }\n    }\n\n    try {\n      // Ensure directory exists\n      const dir = path.dirname(fullPath);\n      await this.fileSystem.mkdir(dir, { recursive: true });\n\n      // Write the file\n      await this.fileSystem.writeFile(fullPath, content);\n    } catch (error) {\n      throw new ResolverError(\n        `Failed to write file: ${error.message}`,\n        { resolverName: 'LocalResolver', reference: ref, operation: 'write', originalError: error as Error }\n      );\n    }\n  }\n\n  /**\n   * List files under a prefix\n   */\n  async list(prefix: string, config?: LocalResolverConfig): Promise<ContentInfo[]> {\n    if (!config?.basePath) {\n      return [];\n    }\n\n    const relativePath = this.extractRelativePath(prefix, config);\n    \n    // Use fuzzy matching if enabled (default: true)\n    const fuzzyConfig = config?.fuzzyMatch !== undefined ? config.fuzzyMatch : true;\n    const fuzzyEnabled = typeof fuzzyConfig === 'boolean' ? fuzzyConfig : (fuzzyConfig as FuzzyMatchConfig).enabled !== false;\n    \n    let fullPath: string;\n    \n    if (fuzzyEnabled) {\n      // Try to find the directory with fuzzy matching\n      const matchResult = await this.pathMatcher.findMatch(\n        relativePath,\n        config.basePath,\n        typeof fuzzyConfig === 'object' ? fuzzyConfig : undefined,\n        config.maxDepth\n      );\n      \n      if (!matchResult.path) {\n        return [];\n      }\n      \n      fullPath = matchResult.path;\n    } else {\n      fullPath = await this.resolveFullPath(relativePath, config);\n    }\n\n    try {\n      const stats = await this.fileSystem.stat(fullPath);\n      if (!stats.isDirectory()) {\n        return [];\n      }\n\n      const entries = await this.fileSystem.readdir(fullPath);\n      const results: ContentInfo[] = [];\n\n      for (const entryName of entries) {\n        const entryPath = path.join(fullPath, entryName);\n        \n        try {\n          const entryStats = await this.fileSystem.stat(entryPath);\n\n          // Apply extension filter if configured\n          if (config.allowedExtensions && entryStats.isFile()) {\n            const ext = path.extname(entryName).toLowerCase();\n            if (!config.allowedExtensions.includes(ext)) {\n              continue;\n            }\n          }\n\n          results.push({\n            path: path.join(prefix, entryName),\n            type: entryStats.isDirectory() ? 'directory' : 'file',\n            size: 0,  // IFileSystemService doesn't provide size\n            lastModified: new Date()  // Use current time\n          });\n        } catch (error) {\n          // Skip entries we can't stat\n          continue;\n        }\n      }\n\n      return results;\n    } catch (error) {\n      // If directory doesn't exist, return empty list\n      if (error.code === 'ENOENT' || error.message?.includes('Path not found')) {\n        return [];\n      }\n      throw error;\n    }\n  }\n\n  /**\n   * Validate configuration\n   */\n  validateConfig(config: any): string[] {\n    const errors: string[] = [];\n    const cfg = config ?? {};\n\n    if (!cfg.basePath) {\n      errors.push('basePath is required');\n    } else if (typeof cfg.basePath !== 'string') {\n      errors.push('basePath must be a string');\n    }\n\n    if (cfg.readonly !== undefined && typeof cfg.readonly !== 'boolean') {\n      errors.push('readonly must be a boolean');\n    }\n\n    if (cfg.allowedExtensions !== undefined) {\n      if (!Array.isArray(cfg.allowedExtensions)) {\n        errors.push('allowedExtensions must be an array');\n      } else if (!cfg.allowedExtensions.every((ext: unknown) => typeof ext === 'string')) {\n        errors.push('allowedExtensions must contain only strings');\n      }\n    }\n\n    if (cfg.followSymlinks !== undefined && typeof cfg.followSymlinks !== 'boolean') {\n      errors.push('followSymlinks must be a boolean');\n    }\n\n    if (cfg.maxDepth !== undefined) {\n      if (typeof cfg.maxDepth !== 'number' || cfg.maxDepth < 0) {\n        errors.push('maxDepth must be a non-negative number');\n      }\n    }\n\n    return errors;\n  }\n\n  /**\n   * Check access permissions\n   */\n  async checkAccess(ref: string, operation: 'read' | 'write', config?: LocalResolverConfig): Promise<boolean> {\n    if (!config?.basePath) {\n      return false;\n    }\n\n    if (operation === 'write' && config.readonly) {\n      return false;\n    }\n\n    try {\n      const relativePath = this.extractRelativePath(ref, config);\n      \n      // Quick check for .mld.md files (common module format)\n      const mldMdPath = path.join(config.basePath, relativePath + '.mld.md');\n      if (await this.fileSystem.exists(mldMdPath)) {\n        return true;\n      }\n      \n      // Use fuzzy matching if enabled (default: true)\n      const fuzzyConfig = config?.fuzzyMatch !== undefined ? config.fuzzyMatch : true;\n      const fuzzyEnabled = typeof fuzzyConfig === 'boolean' ? fuzzyConfig : (fuzzyConfig as FuzzyMatchConfig).enabled !== false;\n      \n      if (fuzzyEnabled && operation === 'read') {\n        // Try fuzzy matching for read operations\n        const matchResult = await this.pathMatcher.findMatch(\n          relativePath,\n          config.basePath,\n          typeof fuzzyConfig === 'object' ? fuzzyConfig : undefined,\n          config.maxDepth\n        );\n        \n        if (matchResult.path) {\n          return true;\n        }\n        \n        // Try with extensions\n        const extensions = ['.mld.md', '.mld', '.md', '.mlld.md'];\n        for (const ext of extensions) {\n          const pathWithExt = relativePath + ext;\n          const extMatchResult = await this.pathMatcher.findMatch(\n            pathWithExt,\n            config.basePath,\n            typeof fuzzyConfig === 'object' ? fuzzyConfig : undefined,\n            config.maxDepth\n          );\n          \n          if (extMatchResult.path) {\n            return true;\n          }\n        }\n        \n        return false;\n      } else {\n        // Fuzzy matching disabled or write operation - use original logic\n        const fullPath = await this.resolveFullPath(relativePath, config);\n\n        // If no extension and the file doesn't exist, try with .mld.md, .mld, or .md extensions\n        if (operation === 'read' && !path.extname(fullPath)) {\n          const existsAsIs = await this.fileSystem.exists(fullPath);\n          if (!existsAsIs) {\n            // Try .mld.md first (module with docs)\n            const withMldMd = fullPath + '.mld.md';\n            if (await this.fileSystem.exists(withMldMd)) {\n              return true;\n            }\n            // Try .mld as fallback\n            const withMld = fullPath + '.mld';\n            if (await this.fileSystem.exists(withMld)) {\n              return true;\n            }\n            // Try .md as final fallback\n            const withMd = fullPath + '.md';\n            if (await this.fileSystem.exists(withMd)) {\n              return true;\n            }\n            const withLegacy = fullPath + '.mlld.md';\n            if (await this.fileSystem.exists(withLegacy)) {\n              return true;\n            }\n          }\n        }\n\n        // For write operations, check directory access\n        if (operation === 'write') {\n          const dir = path.dirname(fullPath);\n          // Check if directory exists\n          const dirExists = await this.fileSystem.exists(dir);\n          return dirExists;\n        } else {\n          // For read operations, check file exists\n          return await this.fileSystem.exists(fullPath);\n        }\n      }\n    } catch (error) {\n      return false;\n    }\n  }\n\n  /**\n   * Extract relative path from reference\n   * Assumes the ResolverManager has already matched and removed the prefix\n   */\n  private extractRelativePath(ref: string, config: LocalResolverConfig | undefined): string {\n    // Strip common module prefixes like @local/, @notes/, etc.\n    // The ResolverManager passes the full reference, so we need to extract the path\n    const prefixMatch = ref.match(/^@[^/]+\\/(.*)/);\n    if (prefixMatch) {\n      return prefixMatch[1];\n    }\n    // If no prefix match, use as-is (for direct file paths)\n    return ref;\n  }\n\n  /**\n   * Resolve and validate the full filesystem path\n   */\n  private async resolveFullPath(relativePath: string, config: LocalResolverConfig | undefined): Promise<string> {\n    // If no config and path is absolute, use root as base (for backwards compatibility)\n    const basePath = config?.basePath || '/';\n    const normalizedBase = path.resolve(basePath);\n    \n    // Check if the path is already absolute and within basePath\n    if (path.isAbsolute(relativePath)) {\n      const normalizedPath = path.resolve(relativePath);\n      if (normalizedPath.startsWith(normalizedBase)) {\n        // Path is already absolute and within basePath, use it as-is\n        return normalizedPath;\n      }\n      // Absolute path outside basePath - security error\n      throw new ResolverError(\n        'Path traversal detected: absolute path is outside base directory',\n        { \n          resolverName: 'LocalResolver',\n          reference: relativePath,\n          operation: 'resolve'\n        }\n      );\n    }\n    \n    // Remove leading slash if present for relative paths\n    const cleanPath = relativePath.startsWith('/') ? relativePath.slice(1) : relativePath;\n    \n    // Resolve the full path\n    const fullPath = path.resolve(config.basePath, cleanPath);\n    const normalizedFull = path.resolve(fullPath);\n\n    // Security: Ensure the resolved path is within the base path\n    if (!normalizedFull.startsWith(normalizedBase)) {\n      throw new ResolverError(\n        'Path traversal detected: resolved path is outside base directory',\n        { \n          resolverName: 'LocalResolver',\n          reference: relativePath,\n          operation: 'resolve'\n        }\n      );\n    }\n\n    // Check depth if configured\n    if (config.maxDepth !== undefined) {\n      const relativeParts = path.relative(normalizedBase, normalizedFull).split(path.sep).filter(p => p && p !== '.');\n      // Count the number of directories in the path\n      // For 'README.md', depth = 0\n      // For 'modules/utils.mld', depth = 1\n      const depth = Math.max(0, relativeParts.length - 1);\n      \n      // maxDepth is the maximum allowed depth, so >= comparison\n      if (depth >= config.maxDepth) {\n        throw new ResolverError(\n          `Path exceeds maximum depth of ${config.maxDepth}`,\n          { resolverName: 'LocalResolver', reference: relativePath, operation: 'resolve' }\n        );\n      }\n    }\n\n    // Handle symlinks based on configuration\n    // Note: IFileSystemService doesn't support lstat, so we skip symlink checking\n    // for basic file systems. This is acceptable for testing environments.\n\n    return normalizedFull;\n  }\n\n  /**\n   * Detect content type based on file extension and content\n   */\n  private async detectContentType(filePath: string, content: string): Promise<'module' | 'data' | 'text'> {\n    // Check file extension - all mlld extensions are recognized as modules\n    const mlldExtensions = ['.mld.md', '.mld', '.md', '.mlld.md', '.mlld'];\n\n    // Check if file has an mlld extension\n    const hasMLLDExtension = mlldExtensions.some(ext => filePath.endsWith(ext));\n\n    // For mlld extensions or unknown extensions, try parsing as mlld\n    if (hasMLLDExtension || (!filePath.endsWith('.json'))) {\n      try {\n        const { parse } = await import('@grammar/parser');\n        const { inferMlldMode } = await import('@core/utils/mode');\n        const mode = inferMlldMode(filePath);\n        const result = await parse(content, { mode });\n        if (result.success && this.hasModuleExports(result.ast)) {\n          return 'module';\n        }\n      } catch {\n        // Parse failed - continue to other checks\n      }\n    }\n\n    // Check for JSON files\n    if (filePath.endsWith('.json')) {\n      return 'data';\n    }\n\n    // Try JSON parsing as fallback\n    try {\n      JSON.parse(content);\n      return 'data';\n    } catch {\n      // Not JSON\n    }\n\n    return 'text';\n  }\n  \n  /**\n   * Check if AST has module exports\n   */\n  private hasModuleExports(ast: any): boolean {\n    // Check if there are any directive nodes (not just text/newlines)\n    if (!ast || !Array.isArray(ast)) return false;\n    \n    return ast.some(node => \n      node && node.type === 'Directive' && \n      ['var', 'exe', 'path'].includes(node.kind)\n    );\n  }\n\n  /**\n   * Get MIME type based on file extension\n   */\n  private getMimeType(filePath: string): string {\n    const ext = path.extname(filePath).toLowerCase();\n    const mimeTypes: Record<string, string> = {\n      '.mld': 'text/x-mlld',\n      '.mlld': 'text/x-mlld',\n      '.md': 'text/markdown',\n      '.txt': 'text/plain',\n      '.json': 'application/json',\n      '.yaml': 'text/yaml',\n      '.yml': 'text/yaml',\n      '.js': 'text/javascript',\n      '.ts': 'text/typescript',\n      '.py': 'text/x-python',\n      '.sh': 'text/x-shellscript',\n      '.xml': 'text/xml',\n      '.html': 'text/html',\n      '.css': 'text/css'\n    };\n\n    return mimeTypes[ext] || 'text/plain';\n  }\n}\n"]}