[{"data":1,"prerenderedAt":2177},["ShallowReactive",2],{"navLinks":3,"sidebar_docs_navigation_\u002Fdocs\u002Futils":64,"navigation":263,"navLinks_footer":835,"\u002Fdocs\u002Futils\u002Fserver\u002Fpathresolver_page":848,"\u002Fdocs\u002Futils\u002Fserver\u002Fpathresolver_surround":1605,"\u002Fdocs\u002Futils\u002Fserver\u002Fpathresolver":1608},{"id":4,"extension":5,"links":6,"meta":61,"stem":62,"__hash__":63},"navigationMenu\u002Fnavigation.json","json",[7,52,57],{"nested":8,"label":9,"icon":10,"to":11,"children":12},true,"Docs","i-lucide-book-open","\u002Fdocs\u002Fgetting-started",[13,19,26,32,39,45],{"label":14,"icon":15,"to":11,"description":16,"github":17,"badge":18},"Getting Started","i-lucide-rocket","An introduction to help you understand the core components.","https:\u002F\u002Fgithub.com\u002FSergo706\u002Fdocshub","Start Here",{"label":20,"icon":21,"to":22,"description":23,"github":24,"badge":25},"Auth H3 Client","i-lucide-key-round","\u002Fdocs\u002Fauth-h3client","Seamlessly enforce OAuth 2.0 authentication and session management integrated directly as the client of the IAM module.","https:\u002F\u002Fgithub.com\u002FSergo706\u002Fauth-h3client","Core",{"label":27,"icon":28,"to":29,"description":30,"github":31,"badge":25},"IAM","i-lucide-shield-check","\u002Fdocs\u002Fiam","Identity and Access Management featuring granular roles, permissions, and security policies.","https:\u002F\u002Fgithub.com\u002FSergo706\u002Fauth",{"label":33,"icon":34,"to":35,"description":36,"github":37,"badge":38},"Bot Detection","i-lucide-cpu","\u002Fdocs\u002Fbot-detection","Advanced behavioral analysis and request fingerprinting to stop malicious automated traffic.","https:\u002F\u002Fgithub.com\u002FSergo706\u002Fbot-detector","Security",{"label":40,"icon":41,"to":42,"description":43,"github":44,"badge":38},"Shield Base","i-lucide-database-zap","\u002Fdocs\u002Fshield-base","CLI and programmatic toolkit for compiling offline-ready IP intelligence databases from BGP, GeoIP, Tor, FireHOL, and other public threat feeds.","https:\u002F\u002Fgithub.com\u002FSergo706\u002Fshield-base-cli",{"label":46,"icon":47,"to":48,"description":49,"github":50,"badge":51},"Utils","i-lucide-wrench","\u002Fdocs\u002Futils","A standard library of highly optimized helpers for formatting, validation, and core logic.","https:\u002F\u002Fgithub.com\u002FSergo706\u002Futils","Library",{"nested":53,"label":54,"icon":55,"to":56},false,"Blog","i-lucide-pen-line","\u002Fblog",{"nested":53,"label":58,"icon":59,"to":60},"Website","lucide:app-window-mac","https:\u002F\u002Friavzon.com",{},"navigation","gkaQ0xRGxSLrLyM3kttLe0oBwkrR1EBjlepF8LSbwF8",[65],{"title":9,"path":66,"stem":67,"children":68,"page":53},"\u002Fdocs","docs",[69],{"title":70,"path":48,"stem":71,"children":72},"Utilities","docs\u002Futils\u002Findex",[73,74,91,124,221],{"title":70,"path":48,"stem":71},{"title":75,"path":76,"stem":77,"children":78,"page":53},"Eslint","\u002Fdocs\u002Futils\u002Feslint","docs\u002Futils\u002Feslint",[79,83,87],{"title":80,"path":81,"stem":82},"React Config","\u002Fdocs\u002Futils\u002Feslint\u002Freact","docs\u002Futils\u002Feslint\u002Freact",{"title":84,"path":85,"stem":86},"TypeScript Config","\u002Fdocs\u002Futils\u002Feslint\u002Ftypescript","docs\u002Futils\u002Feslint\u002Ftypescript",{"title":88,"path":89,"stem":90},"Vue Config","\u002Fdocs\u002Futils\u002Feslint\u002Fvue","docs\u002Futils\u002Feslint\u002Fvue",{"title":92,"path":93,"stem":94,"children":95,"page":53},"Server","\u002Fdocs\u002Futils\u002Fserver","docs\u002Futils\u002Fserver",[96,100,104,108,112,116,120],{"title":97,"path":98,"stem":99},"Encryption","\u002Fdocs\u002Futils\u002Fserver\u002Fencryption","docs\u002Futils\u002Fserver\u002Fencryption",{"title":101,"path":102,"stem":103},"Path Resolver","\u002Fdocs\u002Futils\u002Fserver\u002Fpathresolver","docs\u002Futils\u002Fserver\u002FpathResolver",{"title":105,"path":106,"stem":107},"File Replacements","\u002Fdocs\u002Futils\u002Fserver\u002Freplace","docs\u002Futils\u002Fserver\u002Freplace",{"title":109,"path":110,"stem":111},"run","\u002Fdocs\u002Futils\u002Fserver\u002Frun","docs\u002Futils\u002Fserver\u002Frun",{"title":113,"path":114,"stem":115},"scheduleTask","\u002Fdocs\u002Futils\u002Fserver\u002Fscheduletask","docs\u002Futils\u002Fserver\u002FscheduleTask",{"title":117,"path":118,"stem":119},"spawnRun","\u002Fdocs\u002Futils\u002Fserver\u002Fspawnrun","docs\u002Futils\u002Fserver\u002FspawnRun",{"title":121,"path":122,"stem":123},"uploadCsv","\u002Fdocs\u002Futils\u002Fserver\u002Fuploadcsv","docs\u002Futils\u002Fserver\u002FuploadCsv",{"title":125,"path":126,"stem":127,"children":128,"page":53},"Shared","\u002Fdocs\u002Futils\u002Fshared","docs\u002Futils\u002Fshared",[129,133,137,141,145,149,153,157,161,165,169,173,177,181,185,189,193,197,201,205,209,213,217],{"title":130,"path":131,"stem":132},"BatchQueue","\u002Fdocs\u002Futils\u002Fshared\u002Fbatchqueue","docs\u002Futils\u002Fshared\u002FbatchQueue",{"title":134,"path":135,"stem":136},"capitalize","\u002Fdocs\u002Futils\u002Fshared\u002Fcapitalize","docs\u002Futils\u002Fshared\u002Fcapitalize",{"title":138,"path":139,"stem":140},"chunkProcess","\u002Fdocs\u002Futils\u002Fshared\u002Fchunkprocess","docs\u002Futils\u002Fshared\u002FchunkProcess",{"title":142,"path":143,"stem":144},"cleanObject","\u002Fdocs\u002Futils\u002Fshared\u002Fcleanobject","docs\u002Futils\u002Fshared\u002FcleanObject",{"title":146,"path":147,"stem":148},"createConfigManager","\u002Fdocs\u002Futils\u002Fshared\u002Fconfigurationdefiner","docs\u002Futils\u002Fshared\u002FconfigurationDefiner",{"title":150,"path":151,"stem":152},"debounce","\u002Fdocs\u002Futils\u002Fshared\u002Fdebounce","docs\u002Futils\u002Fshared\u002Fdebounce",{"title":154,"path":155,"stem":156},"ensureArray","\u002Fdocs\u002Futils\u002Fshared\u002Fensurearray","docs\u002Futils\u002Fshared\u002FensureArray",{"title":158,"path":159,"stem":160},"fetchWithRetry","\u002Fdocs\u002Futils\u002Fshared\u002Ffetchwithretry","docs\u002Futils\u002Fshared\u002FfetchWithRetry",{"title":162,"path":163,"stem":164},"filterEmptyValues","\u002Fdocs\u002Futils\u002Fshared\u002Ffilteremptyvalues","docs\u002Futils\u002Fshared\u002FfilterEmptyValues",{"title":166,"path":167,"stem":168},"findStringsInObject","\u002Fdocs\u002Futils\u002Fshared\u002Ffindobjectvalues","docs\u002Futils\u002Fshared\u002FfindObjectValues",{"title":170,"path":171,"stem":172},"fisherYatesShuffle","\u002Fdocs\u002Futils\u002Fshared\u002Ffisheryatesshuffle","docs\u002Futils\u002Fshared\u002FfisherYatesShuffle",{"title":174,"path":175,"stem":176},"getRandomImage","\u002Fdocs\u002Futils\u002Fshared\u002Fgetrandomimage","docs\u002Futils\u002Fshared\u002FgetRandomImage",{"title":178,"path":179,"stem":180},"isObjectHasValues","\u002Fdocs\u002Futils\u002Fshared\u002Fisobjecthasvalues","docs\u002Futils\u002Fshared\u002FisObjectHasValues",{"title":182,"path":183,"stem":184},"isAsyncOrPromise","\u002Fdocs\u002Futils\u002Fshared\u002Fispromise","docs\u002Futils\u002Fshared\u002FisPromise",{"title":186,"path":187,"stem":188},"MiniCache","\u002Fdocs\u002Futils\u002Fshared\u002Fminicache","docs\u002Futils\u002Fshared\u002FminiCache",{"title":190,"path":191,"stem":192},"parseCookies","\u002Fdocs\u002Futils\u002Fshared\u002Fparserawcookies","docs\u002Futils\u002Fshared\u002FparseRawCookies",{"title":194,"path":195,"stem":196},"safeAction","\u002Fdocs\u002Futils\u002Fshared\u002Fpromiselocker","docs\u002Futils\u002Fshared\u002FpromiseLocker",{"title":198,"path":199,"stem":200},"Random","\u002Fdocs\u002Futils\u002Fshared\u002Frandom","docs\u002Futils\u002Fshared\u002Frandom",{"title":202,"path":203,"stem":204},"range","\u002Fdocs\u002Futils\u002Fshared\u002Frange","docs\u002Futils\u002Fshared\u002Frange",{"title":206,"path":207,"stem":208},"rateLimiters","\u002Fdocs\u002Futils\u002Fshared\u002Fratelimiters","docs\u002Futils\u002Fshared\u002FrateLimiters",{"title":210,"path":211,"stem":212},"safeObjectMerge","\u002Fdocs\u002Futils\u002Fshared\u002Fsafemerge","docs\u002Futils\u002Fshared\u002FsafeMerge",{"title":214,"path":215,"stem":216},"textTruncation","\u002Fdocs\u002Futils\u002Fshared\u002Ftexttruncation","docs\u002Futils\u002Fshared\u002FtextTruncation",{"title":218,"path":219,"stem":220},"validateZodSchema","\u002Fdocs\u002Futils\u002Fshared\u002Fvalidatezodschema","docs\u002Futils\u002Fshared\u002FvalidateZodSchema",{"title":222,"path":223,"stem":224,"children":225},"Utility Types","\u002Fdocs\u002Futils\u002Ftypes","docs\u002Futils\u002Ftypes\u002Findex",[226,227,231,235,239,243,247,251,255,259],{"title":222,"path":223,"stem":224},{"title":228,"path":229,"stem":230},"Brand","\u002Fdocs\u002Futils\u002Ftypes\u002Fbrand","docs\u002Futils\u002Ftypes\u002FBrand",{"title":232,"path":233,"stem":234},"DeepPartial","\u002Fdocs\u002Futils\u002Ftypes\u002Fdeeppartial","docs\u002Futils\u002Ftypes\u002FDeepPartial",{"title":236,"path":237,"stem":238},"Merge","\u002Fdocs\u002Futils\u002Ftypes\u002Fmerge","docs\u002Futils\u002Ftypes\u002FMerge",{"title":240,"path":241,"stem":242},"NonNullable","\u002Fdocs\u002Futils\u002Ftypes\u002Fnonnullable","docs\u002Futils\u002Ftypes\u002FNonNullable",{"title":244,"path":245,"stem":246},"Prettify","\u002Fdocs\u002Futils\u002Ftypes\u002Fprettify","docs\u002Futils\u002Ftypes\u002FPrettify",{"title":248,"path":249,"stem":250},"PromiseType","\u002Fdocs\u002Futils\u002Ftypes\u002Fpromisetype","docs\u002Futils\u002Ftypes\u002FPromiseType",{"title":252,"path":253,"stem":254},"RequireKeys","\u002Fdocs\u002Futils\u002Ftypes\u002Frequirekeys","docs\u002Futils\u002Ftypes\u002FRequireKeys",{"title":256,"path":257,"stem":258},"StandardResponse","\u002Fdocs\u002Futils\u002Ftypes\u002Fstandardresponse","docs\u002Futils\u002Ftypes\u002FStandardResponse",{"title":260,"path":261,"stem":262},"ValueOf","\u002Fdocs\u002Futils\u002Ftypes\u002Fvalueof","docs\u002Futils\u002Ftypes\u002FValueOf",[264],{"title":9,"path":66,"stem":67,"children":265,"page":53},[266,413,531,536,714,781],{"title":20,"path":22,"stem":267,"children":268},"docs\u002Fauth-h3client\u002Findex",[269,270,279,316,342,364,367,388,392],{"title":20,"path":22,"stem":267},{"title":14,"path":271,"stem":272,"children":273},"\u002Fdocs\u002Fauth-h3client\u002Fgetting-started","docs\u002Fauth-h3client\u002F00.getting-started\u002Findex",[274,275],{"title":14,"path":271,"stem":272},{"title":276,"path":277,"stem":278},"Nuxt Module","\u002Fdocs\u002Fauth-h3client\u002Fgetting-started\u002Fnuxt","docs\u002Fauth-h3client\u002F00.getting-started\u002F00.nuxt",{"title":280,"path":281,"stem":282,"children":283},"Essentials","\u002Fdocs\u002Fauth-h3client\u002Fessentials","docs\u002Fauth-h3client\u002F01.essentials\u002Findex",[284,285,289,293,297,301,305,308,312],{"title":280,"path":281,"stem":282},{"title":286,"path":287,"stem":288},"Session Management","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fsession","docs\u002Fauth-h3client\u002F01.essentials\u002F00.session",{"title":290,"path":291,"stem":292},"Route Protection","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Froute-protection","docs\u002Fauth-h3client\u002F01.essentials\u002F01.route-protection",{"title":294,"path":295,"stem":296},"CSRF Protection","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fcsrf","docs\u002Fauth-h3client\u002F01.essentials\u002F02.csrf",{"title":298,"path":299,"stem":300},"Auth Flows","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fauth-flows","docs\u002Fauth-h3client\u002F01.essentials\u002F03.auth-flows",{"title":302,"path":303,"stem":304},"OAuth and OIDC","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Foauth","docs\u002Fauth-h3client\u002F01.essentials\u002F04.oauth",{"title":33,"path":306,"stem":307},"\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fbot-detection","docs\u002Fauth-h3client\u002F01.essentials\u002F05.bot-detection",{"title":309,"path":310,"stem":311},"Cookies","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fcookies","docs\u002Fauth-h3client\u002F01.essentials\u002F06.cookies",{"title":313,"path":314,"stem":315},"Logging","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Flogging","docs\u002Fauth-h3client\u002F01.essentials\u002F07.logging",{"title":317,"path":318,"stem":319,"children":320},"MFA","\u002Fdocs\u002Fauth-h3client\u002Fmfa","docs\u002Fauth-h3client\u002F02.mfa\u002Findex",[321,322,326,330,334,338],{"title":317,"path":318,"stem":319},{"title":323,"path":324,"stem":325},"Built-in MFA","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fbuilt-in-flow","docs\u002Fauth-h3client\u002F02.mfa\u002F01.built-in-flow",{"title":327,"path":328,"stem":329},"Password Reset","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fpassword-reset","docs\u002Fauth-h3client\u002F02.mfa\u002F02.password-reset",{"title":331,"path":332,"stem":333},"Email Change","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Femail-change","docs\u002Fauth-h3client\u002F02.mfa\u002F03.email-change",{"title":335,"path":336,"stem":337},"Custom MFA Flow","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fcustom-flow","docs\u002Fauth-h3client\u002F02.mfa\u002F04.custom-flow",{"title":339,"path":340,"stem":341},"Client-Side MFA","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fclient-side","docs\u002Fauth-h3client\u002F02.mfa\u002F05.client-side",{"title":343,"path":344,"stem":345,"children":346},"Client-side","\u002Fdocs\u002Fauth-h3client\u002Fclient","docs\u002Fauth-h3client\u002F03.client\u002Findex",[347,348,352,356,360],{"title":343,"path":344,"stem":345},{"title":349,"path":350,"stem":351},"useAuthData","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fuse-auth-data","docs\u002Fauth-h3client\u002F03.client\u002F00.use-auth-data",{"title":353,"path":354,"stem":355},"useMagicLink","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fuse-magic-link","docs\u002Fauth-h3client\u002F03.client\u002F01.use-magic-link",{"title":357,"path":358,"stem":359},"executeRequest","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fexecute-request","docs\u002Fauth-h3client\u002F03.client\u002F02.execute-request",{"title":361,"path":362,"stem":363},"getCsrfToken","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fget-csrf-token","docs\u002Fauth-h3client\u002F03.client\u002F03.get-csrf-token",{"title":38,"path":365,"stem":366},"\u002Fdocs\u002Fauth-h3client\u002Fsecurity","docs\u002Fauth-h3client\u002F04.security",{"title":368,"path":369,"stem":370,"children":371,"page":53},"Guides","\u002Fdocs\u002Fauth-h3client\u002Fguides","docs\u002Fauth-h3client\u002F05.guides",[372,376,380,384],{"title":373,"path":374,"stem":375},"H3 and Nitro Setup","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fh3-nitro","docs\u002Fauth-h3client\u002F05.guides\u002F00.h3-nitro",{"title":377,"path":378,"stem":379},"HMAC Inter-service Auth","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fhmac","docs\u002Fauth-h3client\u002F05.guides\u002Fhmac",{"title":381,"path":382,"stem":383},"Image Upload","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fimage-upload","docs\u002Fauth-h3client\u002F05.guides\u002Fimage-upload",{"title":385,"path":386,"stem":387},"mTLS Configuration","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fmtls","docs\u002Fauth-h3client\u002F05.guides\u002Fmtls",{"title":389,"path":390,"stem":391},"Configuration","\u002Fdocs\u002Fauth-h3client\u002Fconfiguration","docs\u002Fauth-h3client\u002F06.configuration",{"title":393,"path":394,"stem":395,"children":396},"API Reference","\u002Fdocs\u002Fauth-h3client\u002Fapi","docs\u002Fauth-h3client\u002F07.api\u002Findex",[397,398,402,406,410],{"title":393,"path":394,"stem":395},{"title":399,"path":400,"stem":401},"Routes Reference","\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Fcontrollers","docs\u002Fauth-h3client\u002F07.api\u002F00.controllers",{"title":403,"path":404,"stem":405},"Middleware Reference","\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Fmiddleware","docs\u002Fauth-h3client\u002F07.api\u002F01.middleware",{"title":407,"path":408,"stem":409},"Client-side Reference","\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Fcomposables","docs\u002Fauth-h3client\u002F07.api\u002F02.composables",{"title":70,"path":411,"stem":412},"\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Futilities","docs\u002Fauth-h3client\u002F07.api\u002F03.utilities",{"title":414,"path":35,"stem":415,"children":416},"Bot Detector","docs\u002Fbot-detection\u002Findex",[417,418,421,425,429,448,522,525,528],{"title":414,"path":35,"stem":415},{"title":14,"path":419,"stem":420},"\u002Fdocs\u002Fbot-detection\u002Fgetting-started","docs\u002Fbot-detection\u002F00.getting-started",{"title":422,"path":423,"stem":424},"CLI","\u002Fdocs\u002Fbot-detection\u002Fcli","docs\u002Fbot-detection\u002F01.cli",{"title":426,"path":427,"stem":428},"Data Sources","\u002Fdocs\u002Fbot-detection\u002Fdata-sources","docs\u002Fbot-detection\u002F02.data-sources",{"title":368,"path":430,"stem":431,"children":432,"page":53},"\u002Fdocs\u002Fbot-detection\u002Fguides","docs\u002Fbot-detection\u002F03.guides",[433,437,441,444],{"title":434,"path":435,"stem":436},"Custom Checkers","\u002Fdocs\u002Fbot-detection\u002Fguides\u002Fcustom","docs\u002Fbot-detection\u002F03.guides\u002FCUSTOM",{"title":438,"path":439,"stem":440},"Scheduling Database Generation","\u002Fdocs\u002Fbot-detection\u002Fguides\u002Fgenerate","docs\u002Fbot-detection\u002F03.guides\u002FGENERATE",{"title":313,"path":442,"stem":443},"\u002Fdocs\u002Fbot-detection\u002Fguides\u002Flogging","docs\u002Fbot-detection\u002F03.guides\u002FLOGGING",{"title":445,"path":446,"stem":447},"Score Modes and Reputation Healing","\u002Fdocs\u002Fbot-detection\u002Fguides\u002Fscore","docs\u002Fbot-detection\u002F03.guides\u002FSCORE",{"title":449,"path":450,"stem":451,"children":452},"Checkers","\u002Fdocs\u002Fbot-detection\u002Fcheckers","docs\u002Fbot-detection\u002F04.checkers\u002Findex",[453,454,458,462,466,470,474,478,482,486,490,494,498,502,506,510,514,518],{"title":449,"path":450,"stem":451},{"title":455,"path":456,"stem":457},"IP Validation","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fip-validation","docs\u002Fbot-detection\u002F04.checkers\u002F01.ip-validation",{"title":459,"path":460,"stem":461},"Good \u002F Bad Bot Verification","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fgood-bots","docs\u002Fbot-detection\u002F04.checkers\u002F02.good-bots",{"title":463,"path":464,"stem":465},"Browser & Device Fingerprint","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fbrowser-device","docs\u002Fbot-detection\u002F04.checkers\u002F03.browser-device",{"title":467,"path":468,"stem":469},"Locale Map","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Flocale-map","docs\u002Fbot-detection\u002F04.checkers\u002F04.locale-map",{"title":471,"path":472,"stem":473},"Known Threats","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fknown-threats","docs\u002Fbot-detection\u002F04.checkers\u002F05.known-threats",{"title":475,"path":476,"stem":477},"ASN Classification","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fasn-classification","docs\u002Fbot-detection\u002F04.checkers\u002F06.asn-classification",{"title":479,"path":480,"stem":481},"Tor Analysis","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Ftor-analysis","docs\u002Fbot-detection\u002F04.checkers\u002F07.tor-analysis",{"title":483,"path":484,"stem":485},"Timezone Consistency","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Ftimezone-consistency","docs\u002Fbot-detection\u002F04.checkers\u002F08.timezone-consistency",{"title":487,"path":488,"stem":489},"Honeypot","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fhoneypot","docs\u002Fbot-detection\u002F04.checkers\u002F09.honeypot",{"title":491,"path":492,"stem":493},"Known Bad IPs","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fknown-bad-ips","docs\u002Fbot-detection\u002F04.checkers\u002F10.known-bad-ips",{"title":495,"path":496,"stem":497},"Behavior Rate","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fbehavior-rate","docs\u002Fbot-detection\u002F04.checkers\u002F11.behavior-rate",{"title":499,"path":500,"stem":501},"Proxy \u002F ISP \u002F Cookie","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fproxy-isp-cookies","docs\u002Fbot-detection\u002F04.checkers\u002F12.proxy-isp-cookies",{"title":503,"path":504,"stem":505},"Session Coherence","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fsession-coherence","docs\u002Fbot-detection\u002F04.checkers\u002F13.session-coherence",{"title":507,"path":508,"stem":509},"Velocity Fingerprint","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fvelocity-fingerprint","docs\u002Fbot-detection\u002F04.checkers\u002F14.velocity-fingerprint",{"title":511,"path":512,"stem":513},"UA & Header Analysis","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fua-header","docs\u002Fbot-detection\u002F04.checkers\u002F15.ua-header",{"title":515,"path":516,"stem":517},"Geolocation","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fgeolocation","docs\u002Fbot-detection\u002F04.checkers\u002F16.geolocation",{"title":519,"path":520,"stem":521},"Known Bad User-Agents","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fknown-bad-ua","docs\u002Fbot-detection\u002F04.checkers\u002F17.known-bad-ua",{"title":38,"path":523,"stem":524},"\u002Fdocs\u002Fbot-detection\u002Fsecurity","docs\u002Fbot-detection\u002F04.security",{"title":393,"path":526,"stem":527},"\u002Fdocs\u002Fbot-detection\u002Fapi","docs\u002Fbot-detection\u002F05.api",{"title":389,"path":529,"stem":530},"\u002Fdocs\u002Fbot-detection\u002Fconfiguration","docs\u002Fbot-detection\u002F06.configuration",{"title":532,"path":11,"stem":533,"children":534},"Introduction","docs\u002Fgetting-started\u002Findex",[535],{"title":532,"path":11,"stem":533},{"title":27,"path":29,"stem":537,"children":538},"docs\u002Fiam\u002Findex",[539,540,543,678,681,697,700],{"title":27,"path":29,"stem":537},{"title":14,"path":541,"stem":542},"\u002Fdocs\u002Fiam\u002Fgetting-started","docs\u002Fiam\u002F00.getting-started",{"title":280,"path":544,"stem":545,"children":546},"\u002Fdocs\u002Fiam\u002Fessentials","docs\u002Fiam\u002F01.essentials\u002Findex",[547,548,552,556,560,564,568,572,576,580,584,588,591,595,599,603,607,610,614,618,621,625,628],{"title":280,"path":544,"stem":545},{"title":549,"path":550,"stem":551},"Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Ftokens","docs\u002Fiam\u002F01.essentials\u002F00.tokens",{"title":553,"path":554,"stem":555},"Access Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Faccess-tokens","docs\u002Fiam\u002F01.essentials\u002F01.access-tokens",{"title":557,"path":558,"stem":559},"Refresh Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Frefresh-tokens","docs\u002Fiam\u002F01.essentials\u002F02.refresh-tokens",{"title":561,"path":562,"stem":563},"Anomaly Detection","\u002Fdocs\u002Fiam\u002Fessentials\u002Fanomalies","docs\u002Fiam\u002F01.essentials\u002F03.anomalies",{"title":565,"path":566,"stem":567},"Signup","\u002Fdocs\u002Fiam\u002Fessentials\u002Fsignup","docs\u002Fiam\u002F01.essentials\u002F04.signup",{"title":569,"path":570,"stem":571},"Login","\u002Fdocs\u002Fiam\u002Fessentials\u002Flogin","docs\u002Fiam\u002F01.essentials\u002F05.login",{"title":573,"path":574,"stem":575},"Logout","\u002Fdocs\u002Fiam\u002Fessentials\u002Flogout","docs\u002Fiam\u002F01.essentials\u002F06.logout",{"title":577,"path":578,"stem":579},"OAuth","\u002Fdocs\u002Fiam\u002Fessentials\u002Foauth","docs\u002Fiam\u002F01.essentials\u002F07.oauth",{"title":581,"path":582,"stem":583},"Magic Links","\u002Fdocs\u002Fiam\u002Fessentials\u002Fmagic-links","docs\u002Fiam\u002F01.essentials\u002F08.magic-links",{"title":585,"path":586,"stem":587},"Emails","\u002Fdocs\u002Fiam\u002Fessentials\u002Femails","docs\u002Fiam\u002F01.essentials\u002F09.emails",{"title":317,"path":589,"stem":590},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fmfa","docs\u002Fiam\u002F01.essentials\u002F10.mfa",{"title":592,"path":593,"stem":594},"Fingerprinting","\u002Fdocs\u002Fiam\u002Fessentials\u002Ffingerprinting","docs\u002Fiam\u002F01.essentials\u002F11.fingerprinting",{"title":596,"path":597,"stem":598},"Backend for Frontend","\u002Fdocs\u002Fiam\u002Fessentials\u002Fbff","docs\u002Fiam\u002F01.essentials\u002F12.bff",{"title":600,"path":601,"stem":602},"HMAC Authentication","\u002Fdocs\u002Fiam\u002Fessentials\u002Fhmac","docs\u002Fiam\u002F01.essentials\u002F13.hmac",{"title":604,"path":605,"stem":606},"XSS Protection","\u002Fdocs\u002Fiam\u002Fessentials\u002Fxss","docs\u002Fiam\u002F01.essentials\u002F14.xss",{"title":313,"path":608,"stem":609},"\u002Fdocs\u002Fiam\u002Fessentials\u002Flogging","docs\u002Fiam\u002F01.essentials\u002F15.logging",{"title":611,"path":612,"stem":613},"Rate Limiting","\u002Fdocs\u002Fiam\u002Fessentials\u002Frate-limiting","docs\u002Fiam\u002F01.essentials\u002F16.rate-limiting",{"title":615,"path":616,"stem":617},"Database","\u002Fdocs\u002Fiam\u002Fessentials\u002Fdatabase","docs\u002Fiam\u002F01.essentials\u002F17.database",{"title":309,"path":619,"stem":620},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fcookies","docs\u002Fiam\u002F01.essentials\u002F18.cookies",{"title":622,"path":623,"stem":624},"Service Startup","\u002Fdocs\u002Fiam\u002Fessentials\u002Fservice","docs\u002Fiam\u002F01.essentials\u002F19.service",{"title":327,"path":626,"stem":627},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fpassword-reset","docs\u002Fiam\u002F01.essentials\u002F20.password-reset",{"title":629,"path":630,"stem":631,"children":632},"API Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi","docs\u002Fiam\u002F01.essentials\u002F21.api\u002Findex",[633,634,638,642,672,675],{"title":629,"path":630,"stem":631},{"title":635,"path":636,"stem":637},"Creating Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fcreation","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F00.creation",{"title":639,"path":640,"stem":641},"Verifying Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fverification","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F01.verification",{"title":643,"path":644,"stem":645,"children":646},"Manage Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002Findex",[647,648,652,656,660,664,668],{"title":643,"path":644,"stem":645},{"title":649,"path":650,"stem":651},"Privileges","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fprivilege","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F00.privilege",{"title":653,"path":654,"stem":655},"Revocation","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Frevocation","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F01.revocation",{"title":657,"path":658,"stem":659},"Rotation","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Frotation","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F02.rotation",{"title":661,"path":662,"stem":663},"IP Restriction","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fip-updates","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F03.ip-updates",{"title":665,"path":666,"stem":667},"Metadata","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fmetadata","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F04.metadata",{"title":669,"path":670,"stem":671},"Token Listing","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Flist","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F05.list",{"title":611,"path":673,"stem":674},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Frate-limiting","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F03.rate-limiting",{"title":38,"path":676,"stem":677},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fsecurity","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F04.security",{"title":38,"path":679,"stem":680},"\u002Fdocs\u002Fiam\u002Fsecurity","docs\u002Fiam\u002F02.security",{"title":368,"path":682,"stem":683,"children":684,"page":53},"\u002Fdocs\u002Fiam\u002Fguides","docs\u002Fiam\u002F03.guides",[685,689,693],{"title":686,"path":687,"stem":688},"Deployment","\u002Fdocs\u002Fiam\u002Fguides\u002Fdeployment","docs\u002Fiam\u002F03.guides\u002Fdeployment",{"title":690,"path":691,"stem":692},"Operation Scripts","\u002Fdocs\u002Fiam\u002Fguides\u002Foperation-scripts","docs\u002Fiam\u002F03.guides\u002Foperation-scripts",{"title":694,"path":695,"stem":696},"Role-Based Access Control","\u002Fdocs\u002Fiam\u002Fguides\u002Frbac","docs\u002Fiam\u002F03.guides\u002Frbac",{"title":389,"path":698,"stem":699},"\u002Fdocs\u002Fiam\u002Fconfiguration","docs\u002Fiam\u002F04.configuration",{"title":701,"path":702,"stem":703,"children":704,"page":53},"Api","\u002Fdocs\u002Fiam\u002Fapi","docs\u002Fiam\u002F05.API",[705,708,711],{"title":393,"path":706,"stem":707},"\u002Fdocs\u002Fiam\u002Fapi\u002Fapi","docs\u002Fiam\u002F05.API\u002F00.api",{"title":403,"path":709,"stem":710},"\u002Fdocs\u002Fiam\u002Fapi\u002Fmiddlewares","docs\u002Fiam\u002F05.API\u002F02.middlewares",{"title":399,"path":712,"stem":713},"\u002Fdocs\u002Fiam\u002Fapi\u002Froutes","docs\u002Fiam\u002F05.API\u002F03.routes",{"title":40,"path":42,"stem":715,"children":716},"docs\u002Fshield-base\u002Findex",[717,718,721,725,766,770,774,778],{"title":40,"path":42,"stem":715},{"title":14,"path":719,"stem":720},"\u002Fdocs\u002Fshield-base\u002Fgetting-started","docs\u002Fshield-base\u002F00.getting-started",{"title":722,"path":723,"stem":724},"CLI Reference","\u002Fdocs\u002Fshield-base\u002Fcli","docs\u002Fshield-base\u002F01.cli",{"title":426,"path":726,"stem":727,"children":728},"\u002Fdocs\u002Fshield-base\u002Fdata-sources","docs\u002Fshield-base\u002F02.data-sources\u002Findex",[729,730,734,738,742,746,750,754,758,762],{"title":426,"path":726,"stem":727},{"title":731,"path":732,"stem":733},"BGP \u002F ASN","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fbgp","docs\u002Fshield-base\u002F02.data-sources\u002Fbgp",{"title":735,"path":736,"stem":737},"City Geolocation","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fcity","docs\u002Fshield-base\u002F02.data-sources\u002Fcity",{"title":739,"path":740,"stem":741},"Country Geolocation","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fcountry","docs\u002Fshield-base\u002F02.data-sources\u002Fcountry",{"title":743,"path":744,"stem":745},"Verified Crawlers","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fcrawlers","docs\u002Fshield-base\u002F02.data-sources\u002Fcrawlers",{"title":747,"path":748,"stem":749},"Disposable Emails","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Femail","docs\u002Fshield-base\u002F02.data-sources\u002Femail",{"title":751,"path":752,"stem":753},"FireHOL Threat Intelligence","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Ffirehol","docs\u002Fshield-base\u002F02.data-sources\u002Ffirehol",{"title":755,"path":756,"stem":757},"Proxy Detection","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fproxy","docs\u002Fshield-base\u002F02.data-sources\u002Fproxy",{"title":759,"path":760,"stem":761},"Tor Nodes","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Ftor","docs\u002Fshield-base\u002F02.data-sources\u002Ftor",{"title":763,"path":764,"stem":765},"Suspicious User-Agents","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fuseragent","docs\u002Fshield-base\u002F02.data-sources\u002Fuseragent",{"title":767,"path":768,"stem":769},"Programmatic Usage","\u002Fdocs\u002Fshield-base\u002Fusage","docs\u002Fshield-base\u002F03.usage",{"title":771,"path":772,"stem":773},"Custom Data Sources","\u002Fdocs\u002Fshield-base\u002Fcustom-data-sources","docs\u002Fshield-base\u002F04.custom-data-sources",{"title":775,"path":776,"stem":777},"TypeScript Types","\u002Fdocs\u002Fshield-base\u002Ftypes","docs\u002Fshield-base\u002F05.types",{"title":393,"path":779,"stem":780},"\u002Fdocs\u002Fshield-base\u002Fapi","docs\u002Fshield-base\u002F06.api",{"title":70,"path":48,"stem":71,"children":782},[783,784,789,798,823],{"title":70,"path":48,"stem":71},{"title":75,"path":76,"stem":77,"children":785,"page":53},[786,787,788],{"title":80,"path":81,"stem":82},{"title":84,"path":85,"stem":86},{"title":88,"path":89,"stem":90},{"title":92,"path":93,"stem":94,"children":790,"page":53},[791,792,793,794,795,796,797],{"title":97,"path":98,"stem":99},{"title":101,"path":102,"stem":103},{"title":105,"path":106,"stem":107},{"title":109,"path":110,"stem":111},{"title":113,"path":114,"stem":115},{"title":117,"path":118,"stem":119},{"title":121,"path":122,"stem":123},{"title":125,"path":126,"stem":127,"children":799,"page":53},[800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822],{"title":130,"path":131,"stem":132},{"title":134,"path":135,"stem":136},{"title":138,"path":139,"stem":140},{"title":142,"path":143,"stem":144},{"title":146,"path":147,"stem":148},{"title":150,"path":151,"stem":152},{"title":154,"path":155,"stem":156},{"title":158,"path":159,"stem":160},{"title":162,"path":163,"stem":164},{"title":166,"path":167,"stem":168},{"title":170,"path":171,"stem":172},{"title":174,"path":175,"stem":176},{"title":178,"path":179,"stem":180},{"title":182,"path":183,"stem":184},{"title":186,"path":187,"stem":188},{"title":190,"path":191,"stem":192},{"title":194,"path":195,"stem":196},{"title":198,"path":199,"stem":200},{"title":202,"path":203,"stem":204},{"title":206,"path":207,"stem":208},{"title":210,"path":211,"stem":212},{"title":214,"path":215,"stem":216},{"title":218,"path":219,"stem":220},{"title":222,"path":223,"stem":224,"children":824},[825,826,827,828,829,830,831,832,833,834],{"title":222,"path":223,"stem":224},{"title":228,"path":229,"stem":230},{"title":232,"path":233,"stem":234},{"title":236,"path":237,"stem":238},{"title":240,"path":241,"stem":242},{"title":244,"path":245,"stem":246},{"title":248,"path":249,"stem":250},{"title":252,"path":253,"stem":254},{"title":256,"path":257,"stem":258},{"title":260,"path":261,"stem":262},{"id":4,"extension":5,"links":836,"meta":847,"stem":62,"__hash__":63},[837,845,846],{"nested":8,"label":9,"icon":10,"to":11,"children":838},[839,840,841,842,843,844],{"label":14,"icon":15,"to":11,"description":16,"github":17,"badge":18},{"label":20,"icon":21,"to":22,"description":23,"github":24,"badge":25},{"label":27,"icon":28,"to":29,"description":30,"github":31,"badge":25},{"label":33,"icon":34,"to":35,"description":36,"github":37,"badge":38},{"label":40,"icon":41,"to":42,"description":43,"github":44,"badge":38},{"label":46,"icon":47,"to":48,"description":49,"github":50,"badge":51},{"nested":53,"label":54,"icon":55,"to":56},{"nested":53,"label":58,"icon":59,"to":60},{},{"id":849,"title":101,"body":850,"description":1597,"extension":1598,"icon":1599,"meta":1600,"module":1601,"navigation":8,"path":102,"rawbody":1602,"seo":1603,"stem":103,"__hash__":1604},"docs\u002Fdocs\u002Futils\u002Fserver\u002FpathResolver.md",{"type":851,"value":852,"toc":1585},"minimark",[853,857,868,874,879,950,954,1017,1026,1030,1147,1150,1155,1158,1225,1228,1329,1338,1341,1559,1567,1581],[854,855,856],"p",{},"The path resolver module provides two functions for reliably locating files on disk in Node.js environments. They solve a common problem in monorepos and bundled deployments: the working directory at runtime may differ from where source files live, making relative paths fragile.",[854,858,859,863,864,867],{},[860,861,862],"code",{},"getRoot"," walks up the filesystem to find the project root. ",[860,865,866],{},"resolvePath"," searches a prioritized list of directories under that root to find a specific file.",[869,870,872],"h2",{"id":871},"getroot",[860,873,862],{},[875,876,878],"h3",{"id":877},"definition","Definition",[880,881,887],"pre",{"className":882,"code":883,"filename":884,"language":885,"meta":886,"style":886},"language-ts shiki shiki-themes light-plus light-plus dracula","export function getRoot(\n  currentDir?: string,\n  marker?: string\n): string\n","pathResolver.ts","ts","",[860,888,889,910,928,939],{"__ignoreMap":886},[890,891,894,898,902,906],"span",{"class":892,"line":893},"line",1,[890,895,897],{"class":896},"sZ328","export",[890,899,901],{"class":900},"sl46w"," function",[890,903,905],{"class":904},"sHOzp"," getRoot",[890,907,909],{"class":908},"sDd4n","(\n",[890,911,913,917,921,925],{"class":892,"line":912},2,[890,914,916],{"class":915},"sygFZ","  currentDir",[890,918,920],{"class":919},"saOXh","?:",[890,922,924],{"class":923},"sFs1U"," string",[890,926,927],{"class":908},",\n",[890,929,931,934,936],{"class":892,"line":930},3,[890,932,933],{"class":915},"  marker",[890,935,920],{"class":919},[890,937,938],{"class":923}," string\n",[890,940,942,945,948],{"class":892,"line":941},4,[890,943,944],{"class":908},")",[890,946,947],{"class":919},":",[890,949,938],{"class":923},[875,951,953],{"id":952},"parameters","Parameters",[955,956,957,976],"table",{},[958,959,960],"thead",{},[961,962,963,967,970,973],"tr",{},[964,965,966],"th",{},"Parameter",[964,968,969],{},"Type",[964,971,972],{},"Default",[964,974,975],{},"Description",[977,978,979,998],"tbody",{},[961,980,981,987,992,995],{},[982,983,984],"td",{},[860,985,986],{},"currentDir",[982,988,989],{},[860,990,991],{},"string",[982,993,994],{},"Module directory",[982,996,997],{},"Starting directory for the upward search.",[961,999,1000,1005,1009,1014],{},[982,1001,1002],{},[860,1003,1004],{},"marker",[982,1006,1007],{},[860,1008,991],{},[982,1010,1011],{},[860,1012,1013],{},"'package.json'",[982,1015,1016],{},"Filename whose presence signals the project root.",[854,1018,1019,1021,1022,1025],{},[860,1020,862],{}," throws an ",[860,1023,1024],{},"Error"," when the filesystem root is reached without finding the marker file.",[875,1027,1029],{"id":1028},"example-usage","Example Usage",[880,1031,1036],{"className":1032,"code":1033,"filename":1034,"language":1035,"meta":886,"style":886},"language-typescript shiki shiki-themes light-plus light-plus dracula","import { getRoot } from '@riavzon\u002Futils\u002Fserver'\n\n\u002F\u002F Find the nearest ancestor directory that contains a package.json.\nconst root = getRoot()\n\n\u002F\u002F Start the search from a specific directory with a custom marker.\nconst root2 = getRoot(import.meta.dirname, 'tsconfig.json')\n","server\u002Fsetup.ts","typescript",[860,1037,1038,1066,1071,1077,1094,1099,1105],{"__ignoreMap":886},[890,1039,1040,1043,1046,1049,1052,1055,1059,1063],{"class":892,"line":893},[890,1041,1042],{"class":896},"import",[890,1044,1045],{"class":908}," { ",[890,1047,862],{"class":1048},"sjsA6",[890,1050,1051],{"class":908}," } ",[890,1053,1054],{"class":896},"from",[890,1056,1058],{"class":1057},"sFkSl"," '",[890,1060,1062],{"class":1061},"sFB1V","@riavzon\u002Futils\u002Fserver",[890,1064,1065],{"class":1057},"'\n",[890,1067,1068],{"class":892,"line":912},[890,1069,1070],{"emptyLinePlaceholder":8},"\n",[890,1072,1073],{"class":892,"line":930},[890,1074,1076],{"class":1075},"sghk6","\u002F\u002F Find the nearest ancestor directory that contains a package.json.\n",[890,1078,1079,1082,1086,1089,1091],{"class":892,"line":941},[890,1080,1081],{"class":900},"const",[890,1083,1085],{"class":1084},"s3JHE"," root",[890,1087,1088],{"class":919}," =",[890,1090,905],{"class":904},[890,1092,1093],{"class":908},"()\n",[890,1095,1097],{"class":892,"line":1096},5,[890,1098,1070],{"emptyLinePlaceholder":8},[890,1100,1102],{"class":892,"line":1101},6,[890,1103,1104],{"class":1075},"\u002F\u002F Start the search from a specific directory with a custom marker.\n",[890,1106,1108,1110,1113,1115,1117,1120,1122,1125,1128,1130,1133,1136,1139,1142,1144],{"class":892,"line":1107},7,[890,1109,1081],{"class":900},[890,1111,1112],{"class":1084}," root2",[890,1114,1088],{"class":919},[890,1116,905],{"class":904},[890,1118,1119],{"class":908},"(",[890,1121,1042],{"class":896},[890,1123,1124],{"class":908},".",[890,1126,1127],{"class":1048},"meta",[890,1129,1124],{"class":908},[890,1131,1132],{"class":1048},"dirname",[890,1134,1135],{"class":908},", ",[890,1137,1138],{"class":1057},"'",[890,1140,1141],{"class":1061},"tsconfig.json",[890,1143,1138],{"class":1057},[890,1145,1146],{"class":908},")\n",[1148,1149],"hr",{},[869,1151,1153],{"id":1152},"resolvepath",[860,1154,866],{},[875,1156,878],{"id":1157},"definition-1",[880,1159,1161],{"className":882,"code":1160,"filename":884,"language":885,"meta":886,"style":886},"export function resolvePath(\n  fileName: string,\n  searchDirs: string[],\n  optionalFiles?: string[],\n  root?: string\n): string\n",[860,1162,1163,1174,1185,1197,1208,1217],{"__ignoreMap":886},[890,1164,1165,1167,1169,1172],{"class":892,"line":893},[890,1166,897],{"class":896},[890,1168,901],{"class":900},[890,1170,1171],{"class":904}," resolvePath",[890,1173,909],{"class":908},[890,1175,1176,1179,1181,1183],{"class":892,"line":912},[890,1177,1178],{"class":915},"  fileName",[890,1180,947],{"class":919},[890,1182,924],{"class":923},[890,1184,927],{"class":908},[890,1186,1187,1190,1192,1194],{"class":892,"line":930},[890,1188,1189],{"class":915},"  searchDirs",[890,1191,947],{"class":919},[890,1193,924],{"class":923},[890,1195,1196],{"class":908},"[],\n",[890,1198,1199,1202,1204,1206],{"class":892,"line":941},[890,1200,1201],{"class":915},"  optionalFiles",[890,1203,920],{"class":919},[890,1205,924],{"class":923},[890,1207,1196],{"class":908},[890,1209,1210,1213,1215],{"class":892,"line":1096},[890,1211,1212],{"class":915},"  root",[890,1214,920],{"class":919},[890,1216,938],{"class":923},[890,1218,1219,1221,1223],{"class":892,"line":1101},[890,1220,944],{"class":908},[890,1222,947],{"class":919},[890,1224,938],{"class":923},[875,1226,953],{"id":1227},"parameters-1",[955,1229,1230,1243],{},[958,1231,1232],{},[961,1233,1234,1236,1238,1241],{},[964,1235,966],{},[964,1237,969],{},[964,1239,1240],{},"Required",[964,1242,975],{},[977,1244,1245,1266,1287,1308],{},[961,1246,1247,1252,1256,1259],{},[982,1248,1249],{},[860,1250,1251],{},"fileName",[982,1253,1254],{},[860,1255,991],{},[982,1257,1258],{},"Yes",[982,1260,1261,1262,1265],{},"Bare filename to look for (for example, ",[860,1263,1264],{},"\"config.json\"",").",[961,1267,1268,1273,1278,1280],{},[982,1269,1270],{},[860,1271,1272],{},"searchDirs",[982,1274,1275],{},[860,1276,1277],{},"string[]",[982,1279,1258],{},[982,1281,1282,1283,1286],{},"Directories to search relative to ",[860,1284,1285],{},"root",", tried in order.",[961,1288,1289,1294,1298,1301],{},[982,1290,1291],{},[860,1292,1293],{},"optionalFiles",[982,1295,1296],{},[860,1297,1277],{},[982,1299,1300],{},"No",[982,1302,1303,1304,1307],{},"Filenames allowed to be absent. Returns ",[860,1305,1306],{},"\"\""," instead of throwing when not found.",[961,1309,1310,1314,1318,1320],{},[982,1311,1312],{},[860,1313,1285],{},[982,1315,1316],{},[860,1317,991],{},[982,1319,1300],{},[982,1321,1322,1323,1325,1326,1124],{},"Project root to resolve ",[860,1324,1272],{}," against. Defaults to the result of ",[860,1327,1328],{},"getRoot()",[854,1330,1331,1021,1333,1335,1336,1124],{},[860,1332,866],{},[860,1334,1024],{}," when the file is not found and is not listed in ",[860,1337,1293],{},[875,1339,1029],{"id":1340},"example-usage-1",[880,1342,1344],{"className":1032,"code":1343,"filename":1034,"language":1035,"meta":886,"style":886},"import { resolvePath } from '@riavzon\u002Futils\u002Fserver'\n\n\u002F\u002F Resolve a required file, searching two directories in priority order.\nconst schemaPath = resolvePath(\n  'schema.json',\n  ['assets', 'dist\u002Fassets']\n)\n \n\u002F\u002F Resolve an optional file. Returns \"\" when the file does not exist.\nconst localConfigPath = resolvePath(\n  'local.config.json',\n  ['config', 'dist\u002Fconfig'],\n  ['local.config.json']\n)\n  \nif (localConfigPath) {\n  console.log('Local config found at', localConfigPath)\n}\n",[860,1345,1346,1364,1368,1373,1386,1398,1422,1426,1432,1438,1452,1464,1488,1501,1506,1512,1527,1553],{"__ignoreMap":886},[890,1347,1348,1350,1352,1354,1356,1358,1360,1362],{"class":892,"line":893},[890,1349,1042],{"class":896},[890,1351,1045],{"class":908},[890,1353,866],{"class":1048},[890,1355,1051],{"class":908},[890,1357,1054],{"class":896},[890,1359,1058],{"class":1057},[890,1361,1062],{"class":1061},[890,1363,1065],{"class":1057},[890,1365,1366],{"class":892,"line":912},[890,1367,1070],{"emptyLinePlaceholder":8},[890,1369,1370],{"class":892,"line":930},[890,1371,1372],{"class":1075},"\u002F\u002F Resolve a required file, searching two directories in priority order.\n",[890,1374,1375,1377,1380,1382,1384],{"class":892,"line":941},[890,1376,1081],{"class":900},[890,1378,1379],{"class":1084}," schemaPath",[890,1381,1088],{"class":919},[890,1383,1171],{"class":904},[890,1385,909],{"class":908},[890,1387,1388,1391,1394,1396],{"class":892,"line":1096},[890,1389,1390],{"class":1057},"  '",[890,1392,1393],{"class":1061},"schema.json",[890,1395,1138],{"class":1057},[890,1397,927],{"class":908},[890,1399,1400,1403,1405,1408,1410,1412,1414,1417,1419],{"class":892,"line":1101},[890,1401,1402],{"class":908},"  [",[890,1404,1138],{"class":1057},[890,1406,1407],{"class":1061},"assets",[890,1409,1138],{"class":1057},[890,1411,1135],{"class":908},[890,1413,1138],{"class":1057},[890,1415,1416],{"class":1061},"dist\u002Fassets",[890,1418,1138],{"class":1057},[890,1420,1421],{"class":908},"]\n",[890,1423,1424],{"class":892,"line":1107},[890,1425,1146],{"class":908},[890,1427,1429],{"class":892,"line":1428},8,[890,1430,1431],{"class":908}," \n",[890,1433,1435],{"class":892,"line":1434},9,[890,1436,1437],{"class":1075},"\u002F\u002F Resolve an optional file. Returns \"\" when the file does not exist.\n",[890,1439,1441,1443,1446,1448,1450],{"class":892,"line":1440},10,[890,1442,1081],{"class":900},[890,1444,1445],{"class":1084}," localConfigPath",[890,1447,1088],{"class":919},[890,1449,1171],{"class":904},[890,1451,909],{"class":908},[890,1453,1455,1457,1460,1462],{"class":892,"line":1454},11,[890,1456,1390],{"class":1057},[890,1458,1459],{"class":1061},"local.config.json",[890,1461,1138],{"class":1057},[890,1463,927],{"class":908},[890,1465,1467,1469,1471,1474,1476,1478,1480,1483,1485],{"class":892,"line":1466},12,[890,1468,1402],{"class":908},[890,1470,1138],{"class":1057},[890,1472,1473],{"class":1061},"config",[890,1475,1138],{"class":1057},[890,1477,1135],{"class":908},[890,1479,1138],{"class":1057},[890,1481,1482],{"class":1061},"dist\u002Fconfig",[890,1484,1138],{"class":1057},[890,1486,1487],{"class":908},"],\n",[890,1489,1491,1493,1495,1497,1499],{"class":892,"line":1490},13,[890,1492,1402],{"class":908},[890,1494,1138],{"class":1057},[890,1496,1459],{"class":1061},[890,1498,1138],{"class":1057},[890,1500,1421],{"class":908},[890,1502,1504],{"class":892,"line":1503},14,[890,1505,1146],{"class":908},[890,1507,1509],{"class":892,"line":1508},15,[890,1510,1511],{"class":908},"  \n",[890,1513,1515,1518,1521,1524],{"class":892,"line":1514},16,[890,1516,1517],{"class":896},"if",[890,1519,1520],{"class":908}," (",[890,1522,1523],{"class":1048},"localConfigPath",[890,1525,1526],{"class":908},") {\n",[890,1528,1530,1533,1535,1538,1540,1542,1545,1547,1549,1551],{"class":892,"line":1529},17,[890,1531,1532],{"class":1048},"  console",[890,1534,1124],{"class":908},[890,1536,1537],{"class":904},"log",[890,1539,1119],{"class":908},[890,1541,1138],{"class":1057},[890,1543,1544],{"class":1061},"Local config found at",[890,1546,1138],{"class":1057},[890,1548,1135],{"class":908},[890,1550,1523],{"class":1048},[890,1552,1146],{"class":908},[890,1554,1556],{"class":892,"line":1555},18,[890,1557,1558],{"class":908},"}\n",[1560,1561,1562],"note",{},[854,1563,1564,1566],{},[860,1565,1272],{}," are resolved relative to the project root in the order provided. The first directory containing a matching file wins, so list higher-priority directories first.",[1568,1569,1570],"warning",{},[854,1571,1572,1573,1576,1577,1580],{},"Both functions are designed for server-side use only. They rely on ",[860,1574,1575],{},"fs.existsSync"," and ",[860,1578,1579],{},"path.resolve"," from Node.js built-ins and will not work in browser or edge environments.",[1582,1583,1584],"style",{},"html pre.shiki code .sZ328, html code.shiki .sZ328{--shiki-light:#AF00DB;--shiki-default:#AF00DB;--shiki-dark:#FF79C6}html pre.shiki code .sl46w, html code.shiki .sl46w{--shiki-light:#0000FF;--shiki-default:#0000FF;--shiki-dark:#FF79C6}html pre.shiki code .sHOzp, html code.shiki .sHOzp{--shiki-light:#795E26;--shiki-default:#795E26;--shiki-dark:#50FA7B}html pre.shiki code .sDd4n, html code.shiki .sDd4n{--shiki-light:#000000;--shiki-default:#000000;--shiki-dark:#F8F8F2}html pre.shiki code .sygFZ, html code.shiki .sygFZ{--shiki-light:#001080;--shiki-light-font-style:inherit;--shiki-default:#001080;--shiki-default-font-style:inherit;--shiki-dark:#FFB86C;--shiki-dark-font-style:italic}html pre.shiki code .saOXh, html code.shiki .saOXh{--shiki-light:#000000;--shiki-default:#000000;--shiki-dark:#FF79C6}html pre.shiki code .sFs1U, html code.shiki .sFs1U{--shiki-light:#267F99;--shiki-light-font-style:inherit;--shiki-default:#267F99;--shiki-default-font-style:inherit;--shiki-dark:#8BE9FD;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sjsA6, html code.shiki .sjsA6{--shiki-light:#001080;--shiki-default:#001080;--shiki-dark:#F8F8F2}html pre.shiki code .sFkSl, html code.shiki .sFkSl{--shiki-light:#A31515;--shiki-default:#A31515;--shiki-dark:#E9F284}html pre.shiki code .sFB1V, html code.shiki .sFB1V{--shiki-light:#A31515;--shiki-default:#A31515;--shiki-dark:#F1FA8C}html pre.shiki code .sghk6, html code.shiki .sghk6{--shiki-light:#008000;--shiki-default:#008000;--shiki-dark:#6272A4}html pre.shiki code .s3JHE, html code.shiki .s3JHE{--shiki-light:#0070C1;--shiki-default:#0070C1;--shiki-dark:#F8F8F2}",{"title":886,"searchDepth":912,"depth":912,"links":1586},[1587,1592],{"id":871,"depth":912,"text":862,"children":1588},[1589,1590,1591],{"id":877,"depth":930,"text":878},{"id":952,"depth":930,"text":953},{"id":1028,"depth":930,"text":1029},{"id":1152,"depth":912,"text":866,"children":1593},[1594,1595,1596],{"id":1157,"depth":930,"text":878},{"id":1227,"depth":930,"text":953},{"id":1340,"depth":930,"text":1029},"Server-side utilities for locating the project root and resolving absolute paths to data files across deployment layouts.","md","i-lucide-folder-search",{},null,"---\ntitle: Path Resolver\ndescription: Server-side utilities for locating the project root and resolving absolute paths to data files across deployment layouts.\nicon: i-lucide-folder-search\n---\n\nThe path resolver module provides two functions for reliably locating files on disk in Node.js environments. They solve a common problem in monorepos and bundled deployments: the working directory at runtime may differ from where source files live, making relative paths fragile.\n\n`getRoot` walks up the filesystem to find the project root. `resolvePath` searches a prioritized list of directories under that root to find a specific file.\n\n## `getRoot`\n\n### Definition\n\n```ts [pathResolver.ts]\nexport function getRoot(\n  currentDir?: string,\n  marker?: string\n): string\n```\n\n### Parameters\n\n| Parameter | Type | Default | Description |\n| --- | --- | --- | --- |\n| `currentDir` | `string` | Module directory | Starting directory for the upward search. |\n| `marker` | `string` | `'package.json'` | Filename whose presence signals the project root. |\n\n`getRoot` throws an `Error` when the filesystem root is reached without finding the marker file.\n\n### Example Usage\n\n```typescript [server\u002Fsetup.ts]\nimport { getRoot } from '@riavzon\u002Futils\u002Fserver'\n\n\u002F\u002F Find the nearest ancestor directory that contains a package.json.\nconst root = getRoot()\n\n\u002F\u002F Start the search from a specific directory with a custom marker.\nconst root2 = getRoot(import.meta.dirname, 'tsconfig.json')\n```\n\n---\n\n## `resolvePath`\n\n### Definition\n\n```ts [pathResolver.ts]\nexport function resolvePath(\n  fileName: string,\n  searchDirs: string[],\n  optionalFiles?: string[],\n  root?: string\n): string\n```\n\n### Parameters\n\n| Parameter | Type | Required | Description |\n| --- | --- | --- | --- |\n| `fileName` | `string` | Yes | Bare filename to look for (for example, `\"config.json\"`). |\n| `searchDirs` | `string[]` | Yes | Directories to search relative to `root`, tried in order. |\n| `optionalFiles` | `string[]` | No | Filenames allowed to be absent. Returns `\"\"` instead of throwing when not found. |\n| `root` | `string` | No | Project root to resolve `searchDirs` against. Defaults to the result of `getRoot()`. |\n\n`resolvePath` throws an `Error` when the file is not found and is not listed in `optionalFiles`.\n\n### Example Usage\n\n```typescript [server\u002Fsetup.ts]\nimport { resolvePath } from '@riavzon\u002Futils\u002Fserver'\n\n\u002F\u002F Resolve a required file, searching two directories in priority order.\nconst schemaPath = resolvePath(\n  'schema.json',\n  ['assets', 'dist\u002Fassets']\n)\n \n\u002F\u002F Resolve an optional file. Returns \"\" when the file does not exist.\nconst localConfigPath = resolvePath(\n  'local.config.json',\n  ['config', 'dist\u002Fconfig'],\n  ['local.config.json']\n)\n  \nif (localConfigPath) {\n  console.log('Local config found at', localConfigPath)\n}\n```\n\n::note\n`searchDirs` are resolved relative to the project root in the order provided. The first directory containing a matching file wins, so list higher-priority directories first.\n::\n\n::warning\nBoth functions are designed for server-side use only. They rely on `fs.existsSync` and `path.resolve` from Node.js built-ins and will not work in browser or edge environments.\n::\n",{"title":101,"description":1597},"XxetRaUcnEjBpCIgWwph8K4z3-YMcTwoXM2dop6BYsk",[1606,1607],{"title":97,"path":98,"stem":99,"children":-1},{"title":105,"path":106,"stem":107,"children":-1},{"id":849,"title":101,"body":1609,"description":1597,"extension":1598,"icon":1599,"meta":2175,"module":1601,"navigation":8,"path":102,"rawbody":1602,"seo":2176,"stem":103,"__hash__":1604},{"type":851,"value":1610,"toc":2163},[1611,1613,1619,1623,1625,1665,1667,1713,1719,1721,1803,1805,1809,1811,1871,1873,1955,1963,1965,2147,2153,2161],[854,1612,856],{},[854,1614,1615,863,1617,867],{},[860,1616,862],{},[860,1618,866],{},[869,1620,1621],{"id":871},[860,1622,862],{},[875,1624,878],{"id":877},[880,1626,1627],{"className":882,"code":883,"filename":884,"language":885,"meta":886,"style":886},[860,1628,1629,1639,1649,1657],{"__ignoreMap":886},[890,1630,1631,1633,1635,1637],{"class":892,"line":893},[890,1632,897],{"class":896},[890,1634,901],{"class":900},[890,1636,905],{"class":904},[890,1638,909],{"class":908},[890,1640,1641,1643,1645,1647],{"class":892,"line":912},[890,1642,916],{"class":915},[890,1644,920],{"class":919},[890,1646,924],{"class":923},[890,1648,927],{"class":908},[890,1650,1651,1653,1655],{"class":892,"line":930},[890,1652,933],{"class":915},[890,1654,920],{"class":919},[890,1656,938],{"class":923},[890,1658,1659,1661,1663],{"class":892,"line":941},[890,1660,944],{"class":908},[890,1662,947],{"class":919},[890,1664,938],{"class":923},[875,1666,953],{"id":952},[955,1668,1669,1681],{},[958,1670,1671],{},[961,1672,1673,1675,1677,1679],{},[964,1674,966],{},[964,1676,969],{},[964,1678,972],{},[964,1680,975],{},[977,1682,1683,1697],{},[961,1684,1685,1689,1693,1695],{},[982,1686,1687],{},[860,1688,986],{},[982,1690,1691],{},[860,1692,991],{},[982,1694,994],{},[982,1696,997],{},[961,1698,1699,1703,1707,1711],{},[982,1700,1701],{},[860,1702,1004],{},[982,1704,1705],{},[860,1706,991],{},[982,1708,1709],{},[860,1710,1013],{},[982,1712,1016],{},[854,1714,1715,1021,1717,1025],{},[860,1716,862],{},[860,1718,1024],{},[875,1720,1029],{"id":1028},[880,1722,1723],{"className":1032,"code":1033,"filename":1034,"language":1035,"meta":886,"style":886},[860,1724,1725,1743,1747,1751,1763,1767,1771],{"__ignoreMap":886},[890,1726,1727,1729,1731,1733,1735,1737,1739,1741],{"class":892,"line":893},[890,1728,1042],{"class":896},[890,1730,1045],{"class":908},[890,1732,862],{"class":1048},[890,1734,1051],{"class":908},[890,1736,1054],{"class":896},[890,1738,1058],{"class":1057},[890,1740,1062],{"class":1061},[890,1742,1065],{"class":1057},[890,1744,1745],{"class":892,"line":912},[890,1746,1070],{"emptyLinePlaceholder":8},[890,1748,1749],{"class":892,"line":930},[890,1750,1076],{"class":1075},[890,1752,1753,1755,1757,1759,1761],{"class":892,"line":941},[890,1754,1081],{"class":900},[890,1756,1085],{"class":1084},[890,1758,1088],{"class":919},[890,1760,905],{"class":904},[890,1762,1093],{"class":908},[890,1764,1765],{"class":892,"line":1096},[890,1766,1070],{"emptyLinePlaceholder":8},[890,1768,1769],{"class":892,"line":1101},[890,1770,1104],{"class":1075},[890,1772,1773,1775,1777,1779,1781,1783,1785,1787,1789,1791,1793,1795,1797,1799,1801],{"class":892,"line":1107},[890,1774,1081],{"class":900},[890,1776,1112],{"class":1084},[890,1778,1088],{"class":919},[890,1780,905],{"class":904},[890,1782,1119],{"class":908},[890,1784,1042],{"class":896},[890,1786,1124],{"class":908},[890,1788,1127],{"class":1048},[890,1790,1124],{"class":908},[890,1792,1132],{"class":1048},[890,1794,1135],{"class":908},[890,1796,1138],{"class":1057},[890,1798,1141],{"class":1061},[890,1800,1138],{"class":1057},[890,1802,1146],{"class":908},[1148,1804],{},[869,1806,1807],{"id":1152},[860,1808,866],{},[875,1810,878],{"id":1157},[880,1812,1813],{"className":882,"code":1160,"filename":884,"language":885,"meta":886,"style":886},[860,1814,1815,1825,1835,1845,1855,1863],{"__ignoreMap":886},[890,1816,1817,1819,1821,1823],{"class":892,"line":893},[890,1818,897],{"class":896},[890,1820,901],{"class":900},[890,1822,1171],{"class":904},[890,1824,909],{"class":908},[890,1826,1827,1829,1831,1833],{"class":892,"line":912},[890,1828,1178],{"class":915},[890,1830,947],{"class":919},[890,1832,924],{"class":923},[890,1834,927],{"class":908},[890,1836,1837,1839,1841,1843],{"class":892,"line":930},[890,1838,1189],{"class":915},[890,1840,947],{"class":919},[890,1842,924],{"class":923},[890,1844,1196],{"class":908},[890,1846,1847,1849,1851,1853],{"class":892,"line":941},[890,1848,1201],{"class":915},[890,1850,920],{"class":919},[890,1852,924],{"class":923},[890,1854,1196],{"class":908},[890,1856,1857,1859,1861],{"class":892,"line":1096},[890,1858,1212],{"class":915},[890,1860,920],{"class":919},[890,1862,938],{"class":923},[890,1864,1865,1867,1869],{"class":892,"line":1101},[890,1866,944],{"class":908},[890,1868,947],{"class":919},[890,1870,938],{"class":923},[875,1872,953],{"id":1227},[955,1874,1875,1887],{},[958,1876,1877],{},[961,1878,1879,1881,1883,1885],{},[964,1880,966],{},[964,1882,969],{},[964,1884,1240],{},[964,1886,975],{},[977,1888,1889,1905,1921,1937],{},[961,1890,1891,1895,1899,1901],{},[982,1892,1893],{},[860,1894,1251],{},[982,1896,1897],{},[860,1898,991],{},[982,1900,1258],{},[982,1902,1261,1903,1265],{},[860,1904,1264],{},[961,1906,1907,1911,1915,1917],{},[982,1908,1909],{},[860,1910,1272],{},[982,1912,1913],{},[860,1914,1277],{},[982,1916,1258],{},[982,1918,1282,1919,1286],{},[860,1920,1285],{},[961,1922,1923,1927,1931,1933],{},[982,1924,1925],{},[860,1926,1293],{},[982,1928,1929],{},[860,1930,1277],{},[982,1932,1300],{},[982,1934,1303,1935,1307],{},[860,1936,1306],{},[961,1938,1939,1943,1947,1949],{},[982,1940,1941],{},[860,1942,1285],{},[982,1944,1945],{},[860,1946,991],{},[982,1948,1300],{},[982,1950,1322,1951,1325,1953,1124],{},[860,1952,1272],{},[860,1954,1328],{},[854,1956,1957,1021,1959,1335,1961,1124],{},[860,1958,866],{},[860,1960,1024],{},[860,1962,1293],{},[875,1964,1029],{"id":1340},[880,1966,1967],{"className":1032,"code":1343,"filename":1034,"language":1035,"meta":886,"style":886},[860,1968,1969,1987,1991,1995,2007,2017,2037,2041,2045,2049,2061,2071,2091,2103,2107,2111,2121,2143],{"__ignoreMap":886},[890,1970,1971,1973,1975,1977,1979,1981,1983,1985],{"class":892,"line":893},[890,1972,1042],{"class":896},[890,1974,1045],{"class":908},[890,1976,866],{"class":1048},[890,1978,1051],{"class":908},[890,1980,1054],{"class":896},[890,1982,1058],{"class":1057},[890,1984,1062],{"class":1061},[890,1986,1065],{"class":1057},[890,1988,1989],{"class":892,"line":912},[890,1990,1070],{"emptyLinePlaceholder":8},[890,1992,1993],{"class":892,"line":930},[890,1994,1372],{"class":1075},[890,1996,1997,1999,2001,2003,2005],{"class":892,"line":941},[890,1998,1081],{"class":900},[890,2000,1379],{"class":1084},[890,2002,1088],{"class":919},[890,2004,1171],{"class":904},[890,2006,909],{"class":908},[890,2008,2009,2011,2013,2015],{"class":892,"line":1096},[890,2010,1390],{"class":1057},[890,2012,1393],{"class":1061},[890,2014,1138],{"class":1057},[890,2016,927],{"class":908},[890,2018,2019,2021,2023,2025,2027,2029,2031,2033,2035],{"class":892,"line":1101},[890,2020,1402],{"class":908},[890,2022,1138],{"class":1057},[890,2024,1407],{"class":1061},[890,2026,1138],{"class":1057},[890,2028,1135],{"class":908},[890,2030,1138],{"class":1057},[890,2032,1416],{"class":1061},[890,2034,1138],{"class":1057},[890,2036,1421],{"class":908},[890,2038,2039],{"class":892,"line":1107},[890,2040,1146],{"class":908},[890,2042,2043],{"class":892,"line":1428},[890,2044,1431],{"class":908},[890,2046,2047],{"class":892,"line":1434},[890,2048,1437],{"class":1075},[890,2050,2051,2053,2055,2057,2059],{"class":892,"line":1440},[890,2052,1081],{"class":900},[890,2054,1445],{"class":1084},[890,2056,1088],{"class":919},[890,2058,1171],{"class":904},[890,2060,909],{"class":908},[890,2062,2063,2065,2067,2069],{"class":892,"line":1454},[890,2064,1390],{"class":1057},[890,2066,1459],{"class":1061},[890,2068,1138],{"class":1057},[890,2070,927],{"class":908},[890,2072,2073,2075,2077,2079,2081,2083,2085,2087,2089],{"class":892,"line":1466},[890,2074,1402],{"class":908},[890,2076,1138],{"class":1057},[890,2078,1473],{"class":1061},[890,2080,1138],{"class":1057},[890,2082,1135],{"class":908},[890,2084,1138],{"class":1057},[890,2086,1482],{"class":1061},[890,2088,1138],{"class":1057},[890,2090,1487],{"class":908},[890,2092,2093,2095,2097,2099,2101],{"class":892,"line":1490},[890,2094,1402],{"class":908},[890,2096,1138],{"class":1057},[890,2098,1459],{"class":1061},[890,2100,1138],{"class":1057},[890,2102,1421],{"class":908},[890,2104,2105],{"class":892,"line":1503},[890,2106,1146],{"class":908},[890,2108,2109],{"class":892,"line":1508},[890,2110,1511],{"class":908},[890,2112,2113,2115,2117,2119],{"class":892,"line":1514},[890,2114,1517],{"class":896},[890,2116,1520],{"class":908},[890,2118,1523],{"class":1048},[890,2120,1526],{"class":908},[890,2122,2123,2125,2127,2129,2131,2133,2135,2137,2139,2141],{"class":892,"line":1529},[890,2124,1532],{"class":1048},[890,2126,1124],{"class":908},[890,2128,1537],{"class":904},[890,2130,1119],{"class":908},[890,2132,1138],{"class":1057},[890,2134,1544],{"class":1061},[890,2136,1138],{"class":1057},[890,2138,1135],{"class":908},[890,2140,1523],{"class":1048},[890,2142,1146],{"class":908},[890,2144,2145],{"class":892,"line":1555},[890,2146,1558],{"class":908},[1560,2148,2149],{},[854,2150,2151,1566],{},[860,2152,1272],{},[1568,2154,2155],{},[854,2156,1572,2157,1576,2159,1580],{},[860,2158,1575],{},[860,2160,1579],{},[1582,2162,1584],{},{"title":886,"searchDepth":912,"depth":912,"links":2164},[2165,2170],{"id":871,"depth":912,"text":862,"children":2166},[2167,2168,2169],{"id":877,"depth":930,"text":878},{"id":952,"depth":930,"text":953},{"id":1028,"depth":930,"text":1029},{"id":1152,"depth":912,"text":866,"children":2171},[2172,2173,2174],{"id":1157,"depth":930,"text":878},{"id":1227,"depth":930,"text":953},{"id":1340,"depth":930,"text":1029},{},{"title":101,"description":1597},1780436295265]