[{"data":1,"prerenderedAt":3323},["ShallowReactive",2],{"navLinks":3,"sidebar_docs_navigation_\u002Fdocs\u002Fiam":64,"navigation":257,"navLinks_footer":837,"\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fip-updates_page":850,"\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fip-updates_surround":2255,"\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fip-updates":2258},{"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":27,"path":29,"stem":70,"children":71},"docs\u002Fiam\u002Findex",[72,73,76,216,219,236,240],{"title":27,"path":29,"stem":70},{"title":14,"path":74,"stem":75},"\u002Fdocs\u002Fiam\u002Fgetting-started","docs\u002Fiam\u002F00.getting-started",{"title":77,"path":78,"stem":79,"children":80},"Essentials","\u002Fdocs\u002Fiam\u002Fessentials","docs\u002Fiam\u002F01.essentials\u002Findex",[81,82,86,90,94,98,102,106,110,114,118,122,126,130,134,138,142,146,150,154,158,162,166],{"title":77,"path":78,"stem":79},{"title":83,"path":84,"stem":85},"Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Ftokens","docs\u002Fiam\u002F01.essentials\u002F00.tokens",{"title":87,"path":88,"stem":89},"Access Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Faccess-tokens","docs\u002Fiam\u002F01.essentials\u002F01.access-tokens",{"title":91,"path":92,"stem":93},"Refresh Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Frefresh-tokens","docs\u002Fiam\u002F01.essentials\u002F02.refresh-tokens",{"title":95,"path":96,"stem":97},"Anomaly Detection","\u002Fdocs\u002Fiam\u002Fessentials\u002Fanomalies","docs\u002Fiam\u002F01.essentials\u002F03.anomalies",{"title":99,"path":100,"stem":101},"Signup","\u002Fdocs\u002Fiam\u002Fessentials\u002Fsignup","docs\u002Fiam\u002F01.essentials\u002F04.signup",{"title":103,"path":104,"stem":105},"Login","\u002Fdocs\u002Fiam\u002Fessentials\u002Flogin","docs\u002Fiam\u002F01.essentials\u002F05.login",{"title":107,"path":108,"stem":109},"Logout","\u002Fdocs\u002Fiam\u002Fessentials\u002Flogout","docs\u002Fiam\u002F01.essentials\u002F06.logout",{"title":111,"path":112,"stem":113},"OAuth","\u002Fdocs\u002Fiam\u002Fessentials\u002Foauth","docs\u002Fiam\u002F01.essentials\u002F07.oauth",{"title":115,"path":116,"stem":117},"Magic Links","\u002Fdocs\u002Fiam\u002Fessentials\u002Fmagic-links","docs\u002Fiam\u002F01.essentials\u002F08.magic-links",{"title":119,"path":120,"stem":121},"Emails","\u002Fdocs\u002Fiam\u002Fessentials\u002Femails","docs\u002Fiam\u002F01.essentials\u002F09.emails",{"title":123,"path":124,"stem":125},"MFA","\u002Fdocs\u002Fiam\u002Fessentials\u002Fmfa","docs\u002Fiam\u002F01.essentials\u002F10.mfa",{"title":127,"path":128,"stem":129},"Fingerprinting","\u002Fdocs\u002Fiam\u002Fessentials\u002Ffingerprinting","docs\u002Fiam\u002F01.essentials\u002F11.fingerprinting",{"title":131,"path":132,"stem":133},"Backend for Frontend","\u002Fdocs\u002Fiam\u002Fessentials\u002Fbff","docs\u002Fiam\u002F01.essentials\u002F12.bff",{"title":135,"path":136,"stem":137},"HMAC Authentication","\u002Fdocs\u002Fiam\u002Fessentials\u002Fhmac","docs\u002Fiam\u002F01.essentials\u002F13.hmac",{"title":139,"path":140,"stem":141},"XSS Protection","\u002Fdocs\u002Fiam\u002Fessentials\u002Fxss","docs\u002Fiam\u002F01.essentials\u002F14.xss",{"title":143,"path":144,"stem":145},"Logging","\u002Fdocs\u002Fiam\u002Fessentials\u002Flogging","docs\u002Fiam\u002F01.essentials\u002F15.logging",{"title":147,"path":148,"stem":149},"Rate Limiting","\u002Fdocs\u002Fiam\u002Fessentials\u002Frate-limiting","docs\u002Fiam\u002F01.essentials\u002F16.rate-limiting",{"title":151,"path":152,"stem":153},"Database","\u002Fdocs\u002Fiam\u002Fessentials\u002Fdatabase","docs\u002Fiam\u002F01.essentials\u002F17.database",{"title":155,"path":156,"stem":157},"Cookies","\u002Fdocs\u002Fiam\u002Fessentials\u002Fcookies","docs\u002Fiam\u002F01.essentials\u002F18.cookies",{"title":159,"path":160,"stem":161},"Service Startup","\u002Fdocs\u002Fiam\u002Fessentials\u002Fservice","docs\u002Fiam\u002F01.essentials\u002F19.service",{"title":163,"path":164,"stem":165},"Password Reset","\u002Fdocs\u002Fiam\u002Fessentials\u002Fpassword-reset","docs\u002Fiam\u002F01.essentials\u002F20.password-reset",{"title":167,"path":168,"stem":169,"children":170},"API Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi","docs\u002Fiam\u002F01.essentials\u002F21.api\u002Findex",[171,172,176,180,210,213],{"title":167,"path":168,"stem":169},{"title":173,"path":174,"stem":175},"Creating Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fcreation","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F00.creation",{"title":177,"path":178,"stem":179},"Verifying Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fverification","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F01.verification",{"title":181,"path":182,"stem":183,"children":184},"Manage Tokens","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002Findex",[185,186,190,194,198,202,206],{"title":181,"path":182,"stem":183},{"title":187,"path":188,"stem":189},"Privileges","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fprivilege","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F00.privilege",{"title":191,"path":192,"stem":193},"Revocation","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Frevocation","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F01.revocation",{"title":195,"path":196,"stem":197},"Rotation","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Frotation","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F02.rotation",{"title":199,"path":200,"stem":201},"IP Restriction","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fip-updates","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F03.ip-updates",{"title":203,"path":204,"stem":205},"Metadata","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fmetadata","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F04.metadata",{"title":207,"path":208,"stem":209},"Token Listing","\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Flist","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F05.list",{"title":147,"path":211,"stem":212},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Frate-limiting","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F03.rate-limiting",{"title":38,"path":214,"stem":215},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fsecurity","docs\u002Fiam\u002F01.essentials\u002F21.api\u002F04.security",{"title":38,"path":217,"stem":218},"\u002Fdocs\u002Fiam\u002Fsecurity","docs\u002Fiam\u002F02.security",{"title":220,"path":221,"stem":222,"children":223,"page":53},"Guides","\u002Fdocs\u002Fiam\u002Fguides","docs\u002Fiam\u002F03.guides",[224,228,232],{"title":225,"path":226,"stem":227},"Deployment","\u002Fdocs\u002Fiam\u002Fguides\u002Fdeployment","docs\u002Fiam\u002F03.guides\u002Fdeployment",{"title":229,"path":230,"stem":231},"Operation Scripts","\u002Fdocs\u002Fiam\u002Fguides\u002Foperation-scripts","docs\u002Fiam\u002F03.guides\u002Foperation-scripts",{"title":233,"path":234,"stem":235},"Role-Based Access Control","\u002Fdocs\u002Fiam\u002Fguides\u002Frbac","docs\u002Fiam\u002F03.guides\u002Frbac",{"title":237,"path":238,"stem":239},"Configuration","\u002Fdocs\u002Fiam\u002Fconfiguration","docs\u002Fiam\u002F04.configuration",{"title":241,"path":242,"stem":243,"children":244,"page":53},"Api","\u002Fdocs\u002Fiam\u002Fapi","docs\u002Fiam\u002F05.API",[245,249,253],{"title":246,"path":247,"stem":248},"API Reference","\u002Fdocs\u002Fiam\u002Fapi\u002Fapi","docs\u002Fiam\u002F05.API\u002F00.api",{"title":250,"path":251,"stem":252},"Middleware Reference","\u002Fdocs\u002Fiam\u002Fapi\u002Fmiddlewares","docs\u002Fiam\u002F05.API\u002F02.middlewares",{"title":254,"path":255,"stem":256},"Routes Reference","\u002Fdocs\u002Fiam\u002Fapi\u002Froutes","docs\u002Fiam\u002F05.API\u002F03.routes",[258],{"title":9,"path":66,"stem":67,"children":259,"page":53},[260,398,516,521,577,644],{"title":20,"path":22,"stem":261,"children":262},"docs\u002Fauth-h3client\u002Findex",[263,264,273,307,331,353,356,376,379],{"title":20,"path":22,"stem":261},{"title":14,"path":265,"stem":266,"children":267},"\u002Fdocs\u002Fauth-h3client\u002Fgetting-started","docs\u002Fauth-h3client\u002F00.getting-started\u002Findex",[268,269],{"title":14,"path":265,"stem":266},{"title":270,"path":271,"stem":272},"Nuxt Module","\u002Fdocs\u002Fauth-h3client\u002Fgetting-started\u002Fnuxt","docs\u002Fauth-h3client\u002F00.getting-started\u002F00.nuxt",{"title":77,"path":274,"stem":275,"children":276},"\u002Fdocs\u002Fauth-h3client\u002Fessentials","docs\u002Fauth-h3client\u002F01.essentials\u002Findex",[277,278,282,286,290,294,298,301,304],{"title":77,"path":274,"stem":275},{"title":279,"path":280,"stem":281},"Session Management","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fsession","docs\u002Fauth-h3client\u002F01.essentials\u002F00.session",{"title":283,"path":284,"stem":285},"Route Protection","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Froute-protection","docs\u002Fauth-h3client\u002F01.essentials\u002F01.route-protection",{"title":287,"path":288,"stem":289},"CSRF Protection","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fcsrf","docs\u002Fauth-h3client\u002F01.essentials\u002F02.csrf",{"title":291,"path":292,"stem":293},"Auth Flows","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fauth-flows","docs\u002Fauth-h3client\u002F01.essentials\u002F03.auth-flows",{"title":295,"path":296,"stem":297},"OAuth and OIDC","\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Foauth","docs\u002Fauth-h3client\u002F01.essentials\u002F04.oauth",{"title":33,"path":299,"stem":300},"\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fbot-detection","docs\u002Fauth-h3client\u002F01.essentials\u002F05.bot-detection",{"title":155,"path":302,"stem":303},"\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Fcookies","docs\u002Fauth-h3client\u002F01.essentials\u002F06.cookies",{"title":143,"path":305,"stem":306},"\u002Fdocs\u002Fauth-h3client\u002Fessentials\u002Flogging","docs\u002Fauth-h3client\u002F01.essentials\u002F07.logging",{"title":123,"path":308,"stem":309,"children":310},"\u002Fdocs\u002Fauth-h3client\u002Fmfa","docs\u002Fauth-h3client\u002F02.mfa\u002Findex",[311,312,316,319,323,327],{"title":123,"path":308,"stem":309},{"title":313,"path":314,"stem":315},"Built-in MFA","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fbuilt-in-flow","docs\u002Fauth-h3client\u002F02.mfa\u002F01.built-in-flow",{"title":163,"path":317,"stem":318},"\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fpassword-reset","docs\u002Fauth-h3client\u002F02.mfa\u002F02.password-reset",{"title":320,"path":321,"stem":322},"Email Change","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Femail-change","docs\u002Fauth-h3client\u002F02.mfa\u002F03.email-change",{"title":324,"path":325,"stem":326},"Custom MFA Flow","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fcustom-flow","docs\u002Fauth-h3client\u002F02.mfa\u002F04.custom-flow",{"title":328,"path":329,"stem":330},"Client-Side MFA","\u002Fdocs\u002Fauth-h3client\u002Fmfa\u002Fclient-side","docs\u002Fauth-h3client\u002F02.mfa\u002F05.client-side",{"title":332,"path":333,"stem":334,"children":335},"Client-side","\u002Fdocs\u002Fauth-h3client\u002Fclient","docs\u002Fauth-h3client\u002F03.client\u002Findex",[336,337,341,345,349],{"title":332,"path":333,"stem":334},{"title":338,"path":339,"stem":340},"useAuthData","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fuse-auth-data","docs\u002Fauth-h3client\u002F03.client\u002F00.use-auth-data",{"title":342,"path":343,"stem":344},"useMagicLink","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fuse-magic-link","docs\u002Fauth-h3client\u002F03.client\u002F01.use-magic-link",{"title":346,"path":347,"stem":348},"executeRequest","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fexecute-request","docs\u002Fauth-h3client\u002F03.client\u002F02.execute-request",{"title":350,"path":351,"stem":352},"getCsrfToken","\u002Fdocs\u002Fauth-h3client\u002Fclient\u002Fget-csrf-token","docs\u002Fauth-h3client\u002F03.client\u002F03.get-csrf-token",{"title":38,"path":354,"stem":355},"\u002Fdocs\u002Fauth-h3client\u002Fsecurity","docs\u002Fauth-h3client\u002F04.security",{"title":220,"path":357,"stem":358,"children":359,"page":53},"\u002Fdocs\u002Fauth-h3client\u002Fguides","docs\u002Fauth-h3client\u002F05.guides",[360,364,368,372],{"title":361,"path":362,"stem":363},"H3 and Nitro Setup","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fh3-nitro","docs\u002Fauth-h3client\u002F05.guides\u002F00.h3-nitro",{"title":365,"path":366,"stem":367},"HMAC Inter-service Auth","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fhmac","docs\u002Fauth-h3client\u002F05.guides\u002Fhmac",{"title":369,"path":370,"stem":371},"Image Upload","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fimage-upload","docs\u002Fauth-h3client\u002F05.guides\u002Fimage-upload",{"title":373,"path":374,"stem":375},"mTLS Configuration","\u002Fdocs\u002Fauth-h3client\u002Fguides\u002Fmtls","docs\u002Fauth-h3client\u002F05.guides\u002Fmtls",{"title":237,"path":377,"stem":378},"\u002Fdocs\u002Fauth-h3client\u002Fconfiguration","docs\u002Fauth-h3client\u002F06.configuration",{"title":246,"path":380,"stem":381,"children":382},"\u002Fdocs\u002Fauth-h3client\u002Fapi","docs\u002Fauth-h3client\u002F07.api\u002Findex",[383,384,387,390,394],{"title":246,"path":380,"stem":381},{"title":254,"path":385,"stem":386},"\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Fcontrollers","docs\u002Fauth-h3client\u002F07.api\u002F00.controllers",{"title":250,"path":388,"stem":389},"\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Fmiddleware","docs\u002Fauth-h3client\u002F07.api\u002F01.middleware",{"title":391,"path":392,"stem":393},"Client-side Reference","\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Fcomposables","docs\u002Fauth-h3client\u002F07.api\u002F02.composables",{"title":395,"path":396,"stem":397},"Utilities","\u002Fdocs\u002Fauth-h3client\u002Fapi\u002Futilities","docs\u002Fauth-h3client\u002F07.api\u002F03.utilities",{"title":399,"path":35,"stem":400,"children":401},"Bot Detector","docs\u002Fbot-detection\u002Findex",[402,403,406,410,414,433,507,510,513],{"title":399,"path":35,"stem":400},{"title":14,"path":404,"stem":405},"\u002Fdocs\u002Fbot-detection\u002Fgetting-started","docs\u002Fbot-detection\u002F00.getting-started",{"title":407,"path":408,"stem":409},"CLI","\u002Fdocs\u002Fbot-detection\u002Fcli","docs\u002Fbot-detection\u002F01.cli",{"title":411,"path":412,"stem":413},"Data Sources","\u002Fdocs\u002Fbot-detection\u002Fdata-sources","docs\u002Fbot-detection\u002F02.data-sources",{"title":220,"path":415,"stem":416,"children":417,"page":53},"\u002Fdocs\u002Fbot-detection\u002Fguides","docs\u002Fbot-detection\u002F03.guides",[418,422,426,429],{"title":419,"path":420,"stem":421},"Custom Checkers","\u002Fdocs\u002Fbot-detection\u002Fguides\u002Fcustom","docs\u002Fbot-detection\u002F03.guides\u002FCUSTOM",{"title":423,"path":424,"stem":425},"Scheduling Database Generation","\u002Fdocs\u002Fbot-detection\u002Fguides\u002Fgenerate","docs\u002Fbot-detection\u002F03.guides\u002FGENERATE",{"title":143,"path":427,"stem":428},"\u002Fdocs\u002Fbot-detection\u002Fguides\u002Flogging","docs\u002Fbot-detection\u002F03.guides\u002FLOGGING",{"title":430,"path":431,"stem":432},"Score Modes and Reputation Healing","\u002Fdocs\u002Fbot-detection\u002Fguides\u002Fscore","docs\u002Fbot-detection\u002F03.guides\u002FSCORE",{"title":434,"path":435,"stem":436,"children":437},"Checkers","\u002Fdocs\u002Fbot-detection\u002Fcheckers","docs\u002Fbot-detection\u002F04.checkers\u002Findex",[438,439,443,447,451,455,459,463,467,471,475,479,483,487,491,495,499,503],{"title":434,"path":435,"stem":436},{"title":440,"path":441,"stem":442},"IP Validation","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fip-validation","docs\u002Fbot-detection\u002F04.checkers\u002F01.ip-validation",{"title":444,"path":445,"stem":446},"Good \u002F Bad Bot Verification","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fgood-bots","docs\u002Fbot-detection\u002F04.checkers\u002F02.good-bots",{"title":448,"path":449,"stem":450},"Browser & Device Fingerprint","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fbrowser-device","docs\u002Fbot-detection\u002F04.checkers\u002F03.browser-device",{"title":452,"path":453,"stem":454},"Locale Map","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Flocale-map","docs\u002Fbot-detection\u002F04.checkers\u002F04.locale-map",{"title":456,"path":457,"stem":458},"Known Threats","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fknown-threats","docs\u002Fbot-detection\u002F04.checkers\u002F05.known-threats",{"title":460,"path":461,"stem":462},"ASN Classification","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fasn-classification","docs\u002Fbot-detection\u002F04.checkers\u002F06.asn-classification",{"title":464,"path":465,"stem":466},"Tor Analysis","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Ftor-analysis","docs\u002Fbot-detection\u002F04.checkers\u002F07.tor-analysis",{"title":468,"path":469,"stem":470},"Timezone Consistency","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Ftimezone-consistency","docs\u002Fbot-detection\u002F04.checkers\u002F08.timezone-consistency",{"title":472,"path":473,"stem":474},"Honeypot","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fhoneypot","docs\u002Fbot-detection\u002F04.checkers\u002F09.honeypot",{"title":476,"path":477,"stem":478},"Known Bad IPs","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fknown-bad-ips","docs\u002Fbot-detection\u002F04.checkers\u002F10.known-bad-ips",{"title":480,"path":481,"stem":482},"Behavior Rate","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fbehavior-rate","docs\u002Fbot-detection\u002F04.checkers\u002F11.behavior-rate",{"title":484,"path":485,"stem":486},"Proxy \u002F ISP \u002F Cookie","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fproxy-isp-cookies","docs\u002Fbot-detection\u002F04.checkers\u002F12.proxy-isp-cookies",{"title":488,"path":489,"stem":490},"Session Coherence","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fsession-coherence","docs\u002Fbot-detection\u002F04.checkers\u002F13.session-coherence",{"title":492,"path":493,"stem":494},"Velocity Fingerprint","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fvelocity-fingerprint","docs\u002Fbot-detection\u002F04.checkers\u002F14.velocity-fingerprint",{"title":496,"path":497,"stem":498},"UA & Header Analysis","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fua-header","docs\u002Fbot-detection\u002F04.checkers\u002F15.ua-header",{"title":500,"path":501,"stem":502},"Geolocation","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fgeolocation","docs\u002Fbot-detection\u002F04.checkers\u002F16.geolocation",{"title":504,"path":505,"stem":506},"Known Bad User-Agents","\u002Fdocs\u002Fbot-detection\u002Fcheckers\u002Fknown-bad-ua","docs\u002Fbot-detection\u002F04.checkers\u002F17.known-bad-ua",{"title":38,"path":508,"stem":509},"\u002Fdocs\u002Fbot-detection\u002Fsecurity","docs\u002Fbot-detection\u002F04.security",{"title":246,"path":511,"stem":512},"\u002Fdocs\u002Fbot-detection\u002Fapi","docs\u002Fbot-detection\u002F05.api",{"title":237,"path":514,"stem":515},"\u002Fdocs\u002Fbot-detection\u002Fconfiguration","docs\u002Fbot-detection\u002F06.configuration",{"title":517,"path":11,"stem":518,"children":519},"Introduction","docs\u002Fgetting-started\u002Findex",[520],{"title":517,"path":11,"stem":518},{"title":27,"path":29,"stem":70,"children":522},[523,524,525,565,566,571,572],{"title":27,"path":29,"stem":70},{"title":14,"path":74,"stem":75},{"title":77,"path":78,"stem":79,"children":526},[527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549],{"title":77,"path":78,"stem":79},{"title":83,"path":84,"stem":85},{"title":87,"path":88,"stem":89},{"title":91,"path":92,"stem":93},{"title":95,"path":96,"stem":97},{"title":99,"path":100,"stem":101},{"title":103,"path":104,"stem":105},{"title":107,"path":108,"stem":109},{"title":111,"path":112,"stem":113},{"title":115,"path":116,"stem":117},{"title":119,"path":120,"stem":121},{"title":123,"path":124,"stem":125},{"title":127,"path":128,"stem":129},{"title":131,"path":132,"stem":133},{"title":135,"path":136,"stem":137},{"title":139,"path":140,"stem":141},{"title":143,"path":144,"stem":145},{"title":147,"path":148,"stem":149},{"title":151,"path":152,"stem":153},{"title":155,"path":156,"stem":157},{"title":159,"path":160,"stem":161},{"title":163,"path":164,"stem":165},{"title":167,"path":168,"stem":169,"children":550},[551,552,553,554,563,564],{"title":167,"path":168,"stem":169},{"title":173,"path":174,"stem":175},{"title":177,"path":178,"stem":179},{"title":181,"path":182,"stem":183,"children":555},[556,557,558,559,560,561,562],{"title":181,"path":182,"stem":183},{"title":187,"path":188,"stem":189},{"title":191,"path":192,"stem":193},{"title":195,"path":196,"stem":197},{"title":199,"path":200,"stem":201},{"title":203,"path":204,"stem":205},{"title":207,"path":208,"stem":209},{"title":147,"path":211,"stem":212},{"title":38,"path":214,"stem":215},{"title":38,"path":217,"stem":218},{"title":220,"path":221,"stem":222,"children":567,"page":53},[568,569,570],{"title":225,"path":226,"stem":227},{"title":229,"path":230,"stem":231},{"title":233,"path":234,"stem":235},{"title":237,"path":238,"stem":239},{"title":241,"path":242,"stem":243,"children":573,"page":53},[574,575,576],{"title":246,"path":247,"stem":248},{"title":250,"path":251,"stem":252},{"title":254,"path":255,"stem":256},{"title":40,"path":42,"stem":578,"children":579},"docs\u002Fshield-base\u002Findex",[580,581,584,588,629,633,637,641],{"title":40,"path":42,"stem":578},{"title":14,"path":582,"stem":583},"\u002Fdocs\u002Fshield-base\u002Fgetting-started","docs\u002Fshield-base\u002F00.getting-started",{"title":585,"path":586,"stem":587},"CLI Reference","\u002Fdocs\u002Fshield-base\u002Fcli","docs\u002Fshield-base\u002F01.cli",{"title":411,"path":589,"stem":590,"children":591},"\u002Fdocs\u002Fshield-base\u002Fdata-sources","docs\u002Fshield-base\u002F02.data-sources\u002Findex",[592,593,597,601,605,609,613,617,621,625],{"title":411,"path":589,"stem":590},{"title":594,"path":595,"stem":596},"BGP \u002F ASN","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fbgp","docs\u002Fshield-base\u002F02.data-sources\u002Fbgp",{"title":598,"path":599,"stem":600},"City Geolocation","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fcity","docs\u002Fshield-base\u002F02.data-sources\u002Fcity",{"title":602,"path":603,"stem":604},"Country Geolocation","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fcountry","docs\u002Fshield-base\u002F02.data-sources\u002Fcountry",{"title":606,"path":607,"stem":608},"Verified Crawlers","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fcrawlers","docs\u002Fshield-base\u002F02.data-sources\u002Fcrawlers",{"title":610,"path":611,"stem":612},"Disposable Emails","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Femail","docs\u002Fshield-base\u002F02.data-sources\u002Femail",{"title":614,"path":615,"stem":616},"FireHOL Threat Intelligence","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Ffirehol","docs\u002Fshield-base\u002F02.data-sources\u002Ffirehol",{"title":618,"path":619,"stem":620},"Proxy Detection","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fproxy","docs\u002Fshield-base\u002F02.data-sources\u002Fproxy",{"title":622,"path":623,"stem":624},"Tor Nodes","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Ftor","docs\u002Fshield-base\u002F02.data-sources\u002Ftor",{"title":626,"path":627,"stem":628},"Suspicious User-Agents","\u002Fdocs\u002Fshield-base\u002Fdata-sources\u002Fuseragent","docs\u002Fshield-base\u002F02.data-sources\u002Fuseragent",{"title":630,"path":631,"stem":632},"Programmatic Usage","\u002Fdocs\u002Fshield-base\u002Fusage","docs\u002Fshield-base\u002F03.usage",{"title":634,"path":635,"stem":636},"Custom Data Sources","\u002Fdocs\u002Fshield-base\u002Fcustom-data-sources","docs\u002Fshield-base\u002F04.custom-data-sources",{"title":638,"path":639,"stem":640},"TypeScript Types","\u002Fdocs\u002Fshield-base\u002Ftypes","docs\u002Fshield-base\u002F05.types",{"title":246,"path":642,"stem":643},"\u002Fdocs\u002Fshield-base\u002Fapi","docs\u002Fshield-base\u002F06.api",{"title":395,"path":48,"stem":645,"children":646},"docs\u002Futils\u002Findex",[647,648,665,698,795],{"title":395,"path":48,"stem":645},{"title":649,"path":650,"stem":651,"children":652,"page":53},"Eslint","\u002Fdocs\u002Futils\u002Feslint","docs\u002Futils\u002Feslint",[653,657,661],{"title":654,"path":655,"stem":656},"React Config","\u002Fdocs\u002Futils\u002Feslint\u002Freact","docs\u002Futils\u002Feslint\u002Freact",{"title":658,"path":659,"stem":660},"TypeScript Config","\u002Fdocs\u002Futils\u002Feslint\u002Ftypescript","docs\u002Futils\u002Feslint\u002Ftypescript",{"title":662,"path":663,"stem":664},"Vue Config","\u002Fdocs\u002Futils\u002Feslint\u002Fvue","docs\u002Futils\u002Feslint\u002Fvue",{"title":666,"path":667,"stem":668,"children":669,"page":53},"Server","\u002Fdocs\u002Futils\u002Fserver","docs\u002Futils\u002Fserver",[670,674,678,682,686,690,694],{"title":671,"path":672,"stem":673},"Encryption","\u002Fdocs\u002Futils\u002Fserver\u002Fencryption","docs\u002Futils\u002Fserver\u002Fencryption",{"title":675,"path":676,"stem":677},"Path Resolver","\u002Fdocs\u002Futils\u002Fserver\u002Fpathresolver","docs\u002Futils\u002Fserver\u002FpathResolver",{"title":679,"path":680,"stem":681},"File Replacements","\u002Fdocs\u002Futils\u002Fserver\u002Freplace","docs\u002Futils\u002Fserver\u002Freplace",{"title":683,"path":684,"stem":685},"run","\u002Fdocs\u002Futils\u002Fserver\u002Frun","docs\u002Futils\u002Fserver\u002Frun",{"title":687,"path":688,"stem":689},"scheduleTask","\u002Fdocs\u002Futils\u002Fserver\u002Fscheduletask","docs\u002Futils\u002Fserver\u002FscheduleTask",{"title":691,"path":692,"stem":693},"spawnRun","\u002Fdocs\u002Futils\u002Fserver\u002Fspawnrun","docs\u002Futils\u002Fserver\u002FspawnRun",{"title":695,"path":696,"stem":697},"uploadCsv","\u002Fdocs\u002Futils\u002Fserver\u002Fuploadcsv","docs\u002Futils\u002Fserver\u002FuploadCsv",{"title":699,"path":700,"stem":701,"children":702,"page":53},"Shared","\u002Fdocs\u002Futils\u002Fshared","docs\u002Futils\u002Fshared",[703,707,711,715,719,723,727,731,735,739,743,747,751,755,759,763,767,771,775,779,783,787,791],{"title":704,"path":705,"stem":706},"BatchQueue","\u002Fdocs\u002Futils\u002Fshared\u002Fbatchqueue","docs\u002Futils\u002Fshared\u002FbatchQueue",{"title":708,"path":709,"stem":710},"capitalize","\u002Fdocs\u002Futils\u002Fshared\u002Fcapitalize","docs\u002Futils\u002Fshared\u002Fcapitalize",{"title":712,"path":713,"stem":714},"chunkProcess","\u002Fdocs\u002Futils\u002Fshared\u002Fchunkprocess","docs\u002Futils\u002Fshared\u002FchunkProcess",{"title":716,"path":717,"stem":718},"cleanObject","\u002Fdocs\u002Futils\u002Fshared\u002Fcleanobject","docs\u002Futils\u002Fshared\u002FcleanObject",{"title":720,"path":721,"stem":722},"createConfigManager","\u002Fdocs\u002Futils\u002Fshared\u002Fconfigurationdefiner","docs\u002Futils\u002Fshared\u002FconfigurationDefiner",{"title":724,"path":725,"stem":726},"debounce","\u002Fdocs\u002Futils\u002Fshared\u002Fdebounce","docs\u002Futils\u002Fshared\u002Fdebounce",{"title":728,"path":729,"stem":730},"ensureArray","\u002Fdocs\u002Futils\u002Fshared\u002Fensurearray","docs\u002Futils\u002Fshared\u002FensureArray",{"title":732,"path":733,"stem":734},"fetchWithRetry","\u002Fdocs\u002Futils\u002Fshared\u002Ffetchwithretry","docs\u002Futils\u002Fshared\u002FfetchWithRetry",{"title":736,"path":737,"stem":738},"filterEmptyValues","\u002Fdocs\u002Futils\u002Fshared\u002Ffilteremptyvalues","docs\u002Futils\u002Fshared\u002FfilterEmptyValues",{"title":740,"path":741,"stem":742},"findStringsInObject","\u002Fdocs\u002Futils\u002Fshared\u002Ffindobjectvalues","docs\u002Futils\u002Fshared\u002FfindObjectValues",{"title":744,"path":745,"stem":746},"fisherYatesShuffle","\u002Fdocs\u002Futils\u002Fshared\u002Ffisheryatesshuffle","docs\u002Futils\u002Fshared\u002FfisherYatesShuffle",{"title":748,"path":749,"stem":750},"getRandomImage","\u002Fdocs\u002Futils\u002Fshared\u002Fgetrandomimage","docs\u002Futils\u002Fshared\u002FgetRandomImage",{"title":752,"path":753,"stem":754},"isObjectHasValues","\u002Fdocs\u002Futils\u002Fshared\u002Fisobjecthasvalues","docs\u002Futils\u002Fshared\u002FisObjectHasValues",{"title":756,"path":757,"stem":758},"isAsyncOrPromise","\u002Fdocs\u002Futils\u002Fshared\u002Fispromise","docs\u002Futils\u002Fshared\u002FisPromise",{"title":760,"path":761,"stem":762},"MiniCache","\u002Fdocs\u002Futils\u002Fshared\u002Fminicache","docs\u002Futils\u002Fshared\u002FminiCache",{"title":764,"path":765,"stem":766},"parseCookies","\u002Fdocs\u002Futils\u002Fshared\u002Fparserawcookies","docs\u002Futils\u002Fshared\u002FparseRawCookies",{"title":768,"path":769,"stem":770},"safeAction","\u002Fdocs\u002Futils\u002Fshared\u002Fpromiselocker","docs\u002Futils\u002Fshared\u002FpromiseLocker",{"title":772,"path":773,"stem":774},"Random","\u002Fdocs\u002Futils\u002Fshared\u002Frandom","docs\u002Futils\u002Fshared\u002Frandom",{"title":776,"path":777,"stem":778},"range","\u002Fdocs\u002Futils\u002Fshared\u002Frange","docs\u002Futils\u002Fshared\u002Frange",{"title":780,"path":781,"stem":782},"rateLimiters","\u002Fdocs\u002Futils\u002Fshared\u002Fratelimiters","docs\u002Futils\u002Fshared\u002FrateLimiters",{"title":784,"path":785,"stem":786},"safeObjectMerge","\u002Fdocs\u002Futils\u002Fshared\u002Fsafemerge","docs\u002Futils\u002Fshared\u002FsafeMerge",{"title":788,"path":789,"stem":790},"textTruncation","\u002Fdocs\u002Futils\u002Fshared\u002Ftexttruncation","docs\u002Futils\u002Fshared\u002FtextTruncation",{"title":792,"path":793,"stem":794},"validateZodSchema","\u002Fdocs\u002Futils\u002Fshared\u002Fvalidatezodschema","docs\u002Futils\u002Fshared\u002FvalidateZodSchema",{"title":796,"path":797,"stem":798,"children":799},"Utility Types","\u002Fdocs\u002Futils\u002Ftypes","docs\u002Futils\u002Ftypes\u002Findex",[800,801,805,809,813,817,821,825,829,833],{"title":796,"path":797,"stem":798},{"title":802,"path":803,"stem":804},"Brand","\u002Fdocs\u002Futils\u002Ftypes\u002Fbrand","docs\u002Futils\u002Ftypes\u002FBrand",{"title":806,"path":807,"stem":808},"DeepPartial","\u002Fdocs\u002Futils\u002Ftypes\u002Fdeeppartial","docs\u002Futils\u002Ftypes\u002FDeepPartial",{"title":810,"path":811,"stem":812},"Merge","\u002Fdocs\u002Futils\u002Ftypes\u002Fmerge","docs\u002Futils\u002Ftypes\u002FMerge",{"title":814,"path":815,"stem":816},"NonNullable","\u002Fdocs\u002Futils\u002Ftypes\u002Fnonnullable","docs\u002Futils\u002Ftypes\u002FNonNullable",{"title":818,"path":819,"stem":820},"Prettify","\u002Fdocs\u002Futils\u002Ftypes\u002Fprettify","docs\u002Futils\u002Ftypes\u002FPrettify",{"title":822,"path":823,"stem":824},"PromiseType","\u002Fdocs\u002Futils\u002Ftypes\u002Fpromisetype","docs\u002Futils\u002Ftypes\u002FPromiseType",{"title":826,"path":827,"stem":828},"RequireKeys","\u002Fdocs\u002Futils\u002Ftypes\u002Frequirekeys","docs\u002Futils\u002Ftypes\u002FRequireKeys",{"title":830,"path":831,"stem":832},"StandardResponse","\u002Fdocs\u002Futils\u002Ftypes\u002Fstandardresponse","docs\u002Futils\u002Ftypes\u002FStandardResponse",{"title":834,"path":835,"stem":836},"ValueOf","\u002Fdocs\u002Futils\u002Ftypes\u002Fvalueof","docs\u002Futils\u002Ftypes\u002FValueOf",{"id":4,"extension":5,"links":838,"meta":849,"stem":62,"__hash__":63},[839,847,848],{"nested":8,"label":9,"icon":10,"to":11,"children":840},[841,842,843,844,845,846],{"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":851,"title":199,"body":852,"description":2247,"extension":2248,"icon":2249,"meta":2250,"module":2251,"navigation":8,"path":200,"rawbody":2252,"seo":2253,"stem":201,"__hash__":2254},"docs\u002Fdocs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F03.ip-updates.md",{"type":853,"value":854,"toc":2232},"minimark",[855,864,867,873,876,913,922,927,930,935,950,1106,1113,1145,1148,1210,1216,1219,1267,1272,1275,1321,1326,1329,1426,1430,1433,1506,1512,1524,1530,1539,1638,1651,1666,1669,1673,1676,1685,1788,1797,1800,1910,1916,1919,1928,1944,1956,1971,1978,2069,2073,2076,2120,2124,2127,2131,2144,2148,2157,2161,2173,2177,2183,2187,2190,2194,2197,2228],[856,857,858,859,863],"p",{},"IP restriction updates change the whitelist of IP addresses that can use a\nspecific API token during the\n",[860,861,862],"a",{"href":178},"verification process",". When a token has\nan IP list, verification only succeeds if the caller IP matches one of the\nstored addresses.",[856,865,866],{},"The IAM service stores the whitelist in the token record itself. That lets you\nadd, replace, or remove restrictions without generating a new token, while\nkeeping the current privilege, prefix, and expiration settings unchanged.",[868,869,870],"caution",{},[856,871,872],{},"An incorrect IP restriction can block legitimate traffic immediately. Apply\nchanges carefully, especially for server-to-server integrations behind proxies\nor load balancers.",[856,874,875],{},"You can update IP restrictions in 3 ways:",[877,878,879,888,895],"ul",{},[880,881,882,883,887],"li",{},"Directly calling ",[884,885,886],"code",{},"updateRestriction",".",[880,889,890,891,894],{},"Using the ",[884,892,893],{},"privateActionManager"," to validate ownership before updating.",[880,896,897,898,912],{},"Calling the ",[884,899,903,908],{"className":900,"language":901,"style":902},"language-http shiki shiki-themes light-plus light-plus dracula","http","",[904,905,907],"span",{"class":906},"sZ328","POST",[904,909,911],{"class":910},"sDd4n"," \u002Fapi\u002Fmanage\u002Fip-restriction-update"," endpoint\nfrom an authenticated client.",[914,915,916],"note",{},[856,917,918,919,921],{},"Follow the ",[860,920,173],{"href":174}," docs to create\na token first before attempting to update its IP restrictions.",[923,924,926],"h2",{"id":925},"updating-ip-restrictions","Updating IP Restrictions",[856,928,929],{},"You can update IP restrictions either directly in the library or through the\nmanager-backed route. The direct helper updates the database with a user id and\ntoken, while the route adds ownership validation and request-level protections.",[931,932,934],"h3",{"id":933},"using-the-library","Using the library",[856,936,937,938,942,943,945,946,949],{},"To update a token restriction ",[939,940,941],"em",{},"directly",", you call ",[884,944,886],{},". This\nfunction hashes the provided token when needed and updates the\n",[884,947,948],{},"restricted_to_ip_address"," field for the matching user and token.",[951,952,957],"pre",{"className":953,"code":954,"filename":955,"language":956,"meta":902,"style":902},"language-ts shiki shiki-themes light-plus light-plus dracula","import { updateRestriction } from '@riavzon\u002Fauth'\n\nconst userId = 1234\nconst token = 'api_1234'\nconst nextIps = ['203.0.113.10', '198.51.100.22']\n\nconst results = await updateRestriction(userId, token, nextIps)\n","example.ts","ts",[884,958,959,989,995,1014,1031,1065,1070],{"__ignoreMap":902},[904,960,963,966,969,972,975,978,982,986],{"class":961,"line":962},"line",1,[904,964,965],{"class":906},"import",[904,967,968],{"class":910}," { ",[904,970,886],{"class":971},"sjsA6",[904,973,974],{"class":910}," } ",[904,976,977],{"class":906},"from",[904,979,981],{"class":980},"sFkSl"," '",[904,983,985],{"class":984},"sFB1V","@riavzon\u002Fauth",[904,987,988],{"class":980},"'\n",[904,990,992],{"class":961,"line":991},2,[904,993,994],{"emptyLinePlaceholder":8},"\n",[904,996,998,1002,1006,1010],{"class":961,"line":997},3,[904,999,1001],{"class":1000},"sl46w","const",[904,1003,1005],{"class":1004},"s3JHE"," userId",[904,1007,1009],{"class":1008},"saOXh"," =",[904,1011,1013],{"class":1012},"spgvN"," 1234\n",[904,1015,1017,1019,1022,1024,1026,1029],{"class":961,"line":1016},4,[904,1018,1001],{"class":1000},[904,1020,1021],{"class":1004}," token",[904,1023,1009],{"class":1008},[904,1025,981],{"class":980},[904,1027,1028],{"class":984},"api_1234",[904,1030,988],{"class":980},[904,1032,1034,1036,1039,1041,1044,1047,1050,1052,1055,1057,1060,1062],{"class":961,"line":1033},5,[904,1035,1001],{"class":1000},[904,1037,1038],{"class":1004}," nextIps",[904,1040,1009],{"class":1008},[904,1042,1043],{"class":910}," [",[904,1045,1046],{"class":980},"'",[904,1048,1049],{"class":984},"203.0.113.10",[904,1051,1046],{"class":980},[904,1053,1054],{"class":910},", ",[904,1056,1046],{"class":980},[904,1058,1059],{"class":984},"198.51.100.22",[904,1061,1046],{"class":980},[904,1063,1064],{"class":910},"]\n",[904,1066,1068],{"class":961,"line":1067},6,[904,1069,994],{"emptyLinePlaceholder":8},[904,1071,1073,1075,1078,1080,1083,1087,1090,1093,1095,1098,1100,1103],{"class":961,"line":1072},7,[904,1074,1001],{"class":1000},[904,1076,1077],{"class":1004}," results",[904,1079,1009],{"class":1008},[904,1081,1082],{"class":906}," await",[904,1084,1086],{"class":1085},"sHOzp"," updateRestriction",[904,1088,1089],{"class":910},"(",[904,1091,1092],{"class":971},"userId",[904,1094,1054],{"class":910},[904,1096,1097],{"class":971},"token",[904,1099,1054],{"class":910},[904,1101,1102],{"class":971},"nextIps",[904,1104,1105],{"class":910},")\n",[856,1107,1108,1109,1112],{},"To remove all IP restrictions, pass ",[884,1110,1111],{},"null",":",[951,1114,1116],{"className":953,"code":1115,"filename":955,"language":956,"meta":902,"style":902},"const results = await updateRestriction(userId, token, null)\n",[884,1117,1118],{"__ignoreMap":902},[904,1119,1120,1122,1124,1126,1128,1130,1132,1134,1136,1138,1140,1143],{"class":961,"line":962},[904,1121,1001],{"class":1000},[904,1123,1077],{"class":1004},[904,1125,1009],{"class":1008},[904,1127,1082],{"class":906},[904,1129,1086],{"class":1085},[904,1131,1089],{"class":910},[904,1133,1092],{"class":971},[904,1135,1054],{"class":910},[904,1137,1097],{"class":971},[904,1139,1054],{"class":910},[904,1141,1111],{"class":1142},"sjR7W",[904,1144,1105],{"class":910},[856,1146,1147],{},"On success you get back an object with:",[951,1149,1151],{"className":953,"code":1150,"language":956,"meta":902,"style":902},"{\n    ok: true,\n    date: new Date().toISOString(),\n    data: { msg: 'Restriction updated successfully' }\n}\n",[884,1152,1153,1158,1169,1190,1205],{"__ignoreMap":902},[904,1154,1155],{"class":961,"line":962},[904,1156,1157],{"class":910},"{\n",[904,1159,1160,1163,1166],{"class":961,"line":991},[904,1161,1162],{"class":910},"    ok: ",[904,1164,1165],{"class":1142},"true",[904,1167,1168],{"class":910},",\n",[904,1170,1171,1174,1178,1181,1184,1187],{"class":961,"line":997},[904,1172,1173],{"class":910},"    date: ",[904,1175,1177],{"class":1176},"sakC6","new",[904,1179,1180],{"class":1085}," Date",[904,1182,1183],{"class":910},"().",[904,1185,1186],{"class":1085},"toISOString",[904,1188,1189],{"class":910},"(),\n",[904,1191,1192,1195,1197,1200,1202],{"class":961,"line":1016},[904,1193,1194],{"class":910},"    data: { msg: ",[904,1196,1046],{"class":980},[904,1198,1199],{"class":984},"Restriction updated successfully",[904,1201,1046],{"class":980},[904,1203,1204],{"class":910}," }\n",[904,1206,1207],{"class":961,"line":1033},[904,1208,1209],{"class":910},"}\n",[856,1211,1212,1213,1215],{},"On error, ",[884,1214,886],{}," returns the branch that failed.",[856,1217,1218],{},"If the update query affects no rows, it returns:",[951,1220,1222],{"className":953,"code":1221,"language":956,"meta":902,"style":902},"{\n    ok: false,\n    date: new Date().toISOString(),\n    reason: 'Token not found or unauthorized'\n}\n",[884,1223,1224,1228,1237,1251,1263],{"__ignoreMap":902},[904,1225,1226],{"class":961,"line":962},[904,1227,1157],{"class":910},[904,1229,1230,1232,1235],{"class":961,"line":991},[904,1231,1162],{"class":910},[904,1233,1234],{"class":1142},"false",[904,1236,1168],{"class":910},[904,1238,1239,1241,1243,1245,1247,1249],{"class":961,"line":997},[904,1240,1173],{"class":910},[904,1242,1177],{"class":1176},[904,1244,1180],{"class":1085},[904,1246,1183],{"class":910},[904,1248,1186],{"class":1085},[904,1250,1189],{"class":910},[904,1252,1253,1256,1258,1261],{"class":961,"line":1016},[904,1254,1255],{"class":910},"    reason: ",[904,1257,1046],{"class":980},[904,1259,1260],{"class":984},"Token not found or unauthorized",[904,1262,988],{"class":980},[904,1264,1265],{"class":961,"line":1033},[904,1266,1209],{"class":910},[856,1268,1269,1270,887],{},"This happens when the helper cannot find a row that matches the hashed token\nand ",[884,1271,1092],{},[856,1273,1274],{},"If the database update throws, the catch block returns:",[951,1276,1278],{"className":953,"code":1277,"language":956,"meta":902,"style":902},"{\n    ok: false,\n    date: new Date().toISOString(),\n    reason: 'Internal server error'\n}\n",[884,1279,1280,1284,1292,1306,1317],{"__ignoreMap":902},[904,1281,1282],{"class":961,"line":962},[904,1283,1157],{"class":910},[904,1285,1286,1288,1290],{"class":961,"line":991},[904,1287,1162],{"class":910},[904,1289,1234],{"class":1142},[904,1291,1168],{"class":910},[904,1293,1294,1296,1298,1300,1302,1304],{"class":961,"line":997},[904,1295,1173],{"class":910},[904,1297,1177],{"class":1176},[904,1299,1180],{"class":1085},[904,1301,1183],{"class":910},[904,1303,1186],{"class":1085},[904,1305,1189],{"class":910},[904,1307,1308,1310,1312,1315],{"class":961,"line":1016},[904,1309,1255],{"class":910},[904,1311,1046],{"class":980},[904,1313,1314],{"class":984},"Internal server error",[904,1316,988],{"class":980},[904,1318,1319],{"class":961,"line":1033},[904,1320,1209],{"class":910},[1322,1323,1325],"h4",{"id":1324},"signature","Signature",[856,1327,1328],{},"The direct helper exposes the following signature:",[951,1330,1332],{"className":953,"code":1331,"language":956,"meta":902,"style":902},"export async function updateRestriction(\n        userId: number,\n        rawToken: string,\n        newIpAddress: string[] | null,\n): Promise\u003CResults\u003C{ msg: string }>>\n",[884,1333,1334,1350,1364,1376,1396],{"__ignoreMap":902},[904,1335,1336,1339,1342,1345,1347],{"class":961,"line":962},[904,1337,1338],{"class":906},"export",[904,1340,1341],{"class":1000}," async",[904,1343,1344],{"class":1000}," function",[904,1346,1086],{"class":1085},[904,1348,1349],{"class":910},"(\n",[904,1351,1352,1356,1358,1362],{"class":961,"line":991},[904,1353,1355],{"class":1354},"sygFZ","        userId",[904,1357,1112],{"class":1008},[904,1359,1361],{"class":1360},"sFs1U"," number",[904,1363,1168],{"class":910},[904,1365,1366,1369,1371,1374],{"class":961,"line":997},[904,1367,1368],{"class":1354},"        rawToken",[904,1370,1112],{"class":1008},[904,1372,1373],{"class":1360}," string",[904,1375,1168],{"class":910},[904,1377,1378,1381,1383,1385,1388,1391,1394],{"class":961,"line":1016},[904,1379,1380],{"class":1354},"        newIpAddress",[904,1382,1112],{"class":1008},[904,1384,1373],{"class":1360},[904,1386,1387],{"class":910},"[] ",[904,1389,1390],{"class":1008},"|",[904,1392,1393],{"class":1360}," null",[904,1395,1168],{"class":910},[904,1397,1398,1401,1403,1406,1409,1413,1416,1419,1421,1423],{"class":961,"line":1033},[904,1399,1400],{"class":910},")",[904,1402,1112],{"class":1008},[904,1404,1405],{"class":1360}," Promise",[904,1407,1408],{"class":910},"\u003C",[904,1410,1412],{"class":1411},"sW-rI","Results",[904,1414,1415],{"class":910},"\u003C{ ",[904,1417,1418],{"class":971},"msg",[904,1420,1112],{"class":1008},[904,1422,1373],{"class":1360},[904,1424,1425],{"class":910}," }>>\n",[1322,1427,1429],{"id":1428},"parameters","Parameters",[856,1431,1432],{},"The IP update helper accepts the following parameters:",[1434,1435,1436,1452],"table",{},[1437,1438,1439],"thead",{},[1440,1441,1442,1446,1449],"tr",{},[1443,1444,1445],"th",{},"Field",[1443,1447,1448],{},"Type",[1443,1450,1451],{},"Description",[1453,1454,1455,1470,1488],"tbody",{},[1440,1456,1457,1462,1467],{},[1458,1459,1460],"td",{},[884,1461,1092],{},[1458,1463,1464],{},[884,1465,1466],{},"number",[1458,1468,1469],{},"The user id that owns the token.",[1440,1471,1472,1477,1482],{},[1458,1473,1474],{},[884,1475,1476],{},"rawToken",[1458,1478,1479],{},[884,1480,1481],{},"string",[1458,1483,1484,1485,887],{},"The token to update. It can be hashed or ",[939,1486,1487],{},"Raw",[1440,1489,1490,1495,1500],{},[1458,1491,1492],{},[884,1493,1494],{},"newIpAddress",[1458,1496,1497],{},[884,1498,1499],{},"string[] | null",[1458,1501,1502,1503,1505],{},"The new whitelist of allowed IPv4 addresses, or ",[884,1504,1111],{}," to remove restrictions.",[1507,1508,1509],"warning",{},[856,1510,1511],{},"This action should be performed by a fully authenticated client.",[868,1513,1514],{},[856,1515,1516,1517,1520,1521,1523],{},"Aside from matching the hashed token and the user id, this function does not\nverify a ",[884,1518,1519],{},"publicIdentifier",", and it does not run the\n",[860,1522,862],{"href":178}," for the token.\nOnly call it directly in trusted server-side code.",[1322,1525,1527,1528],{"id":1526},"with-the-privateactionmanager","With the ",[884,1529,893],{},[856,1531,1532,1533,1535,1536,1538],{},"The safest internal method is using the ",[884,1534,893],{},". This function\nvalidates the ",[884,1537,1519],{},", token id, token name, user id, and current\nvalid status before it dispatches the IP update.",[951,1540,1542],{"className":953,"code":1541,"filename":955,"language":956,"meta":902,"style":902},"const ipUpdateResults = await privateActionManager(\n    userId,\n    tokenId,\n    publicIdentifier,\n    tokenName,\n    {\n        action: 'ip-restriction-update',\n        newIpAddress: ['203.0.113.10']\n    }\n)\n",[884,1543,1544,1560,1567,1574,1581,1588,1593,1610,1627,1633],{"__ignoreMap":902},[904,1545,1546,1548,1551,1553,1555,1558],{"class":961,"line":962},[904,1547,1001],{"class":1000},[904,1549,1550],{"class":1004}," ipUpdateResults",[904,1552,1009],{"class":1008},[904,1554,1082],{"class":906},[904,1556,1557],{"class":1085}," privateActionManager",[904,1559,1349],{"class":910},[904,1561,1562,1565],{"class":961,"line":991},[904,1563,1564],{"class":971},"    userId",[904,1566,1168],{"class":910},[904,1568,1569,1572],{"class":961,"line":997},[904,1570,1571],{"class":971},"    tokenId",[904,1573,1168],{"class":910},[904,1575,1576,1579],{"class":961,"line":1016},[904,1577,1578],{"class":971},"    publicIdentifier",[904,1580,1168],{"class":910},[904,1582,1583,1586],{"class":961,"line":1033},[904,1584,1585],{"class":971},"    tokenName",[904,1587,1168],{"class":910},[904,1589,1590],{"class":961,"line":1067},[904,1591,1592],{"class":910},"    {\n",[904,1594,1595,1598,1601,1603,1606,1608],{"class":961,"line":1072},[904,1596,1597],{"class":971},"        action",[904,1599,1112],{"class":1600},"s34zl",[904,1602,981],{"class":980},[904,1604,1605],{"class":984},"ip-restriction-update",[904,1607,1046],{"class":980},[904,1609,1168],{"class":910},[904,1611,1613,1615,1617,1619,1621,1623,1625],{"class":961,"line":1612},8,[904,1614,1380],{"class":971},[904,1616,1112],{"class":1600},[904,1618,1043],{"class":910},[904,1620,1046],{"class":980},[904,1622,1049],{"class":984},[904,1624,1046],{"class":980},[904,1626,1064],{"class":910},[904,1628,1630],{"class":961,"line":1629},9,[904,1631,1632],{"class":910},"    }\n",[904,1634,1636],{"class":961,"line":1635},10,[904,1637,1105],{"class":910},[856,1639,1640,1641,1643,1644,1646,1647,887],{},"The ",[884,1642,893],{}," returns the response of ",[884,1645,886],{},"\ndirectly. Learn more at the\n",[860,1648,1650],{"href":1649},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement#the-privateactionmanager","introduction page",[914,1652,1653],{},[856,1654,1655,1656,1659,1660,1663,1664,887],{},"The manager only selects rows where ",[884,1657,1658],{},"valid = 1",". Because of that,\nmanager-backed IP updates cannot target an already revoked token, and the\nmanager returns ",[884,1661,1662],{},"Bad Request"," before it reaches ",[884,1665,886],{},[1667,1668],"hr",{},[931,1670,1672],{"id":1671},"using-the-route","Using the route",[856,1674,1675],{},"Let's say you want to update the allowed IP addresses for a token from your\nauthenticated client or BFF.",[856,1677,1678,1684],{},[884,1679,1680,1682],{"className":900,"language":901,"style":902},[904,1681,907],{"class":906},[904,1683,911],{"class":910}," body:",[951,1686,1689],{"className":1687,"code":1688,"language":5,"meta":902,"style":902},"language-json shiki shiki-themes light-plus light-plus dracula","{\n    \"tokenId\": 12,\n    \"publicIdentifier\": \"public_identifier\",\n    \"name\": \"the token name\",\n    \"ipv4\": [\"203.0.113.10\", \"198.51.100.22\"]\n}\n",[884,1690,1691,1695,1715,1735,1755,1784],{"__ignoreMap":902},[904,1692,1693],{"class":961,"line":962},[904,1694,1157],{"class":910},[904,1696,1697,1701,1705,1708,1710,1713],{"class":961,"line":991},[904,1698,1700],{"class":1699},"saJyd","    \"",[904,1702,1704],{"class":1703},"s_W10","tokenId",[904,1706,1707],{"class":1699},"\"",[904,1709,1112],{"class":1008},[904,1711,1712],{"class":1012}," 12",[904,1714,1168],{"class":910},[904,1716,1717,1719,1721,1723,1725,1728,1731,1733],{"class":961,"line":997},[904,1718,1700],{"class":1699},[904,1720,1519],{"class":1703},[904,1722,1707],{"class":1699},[904,1724,1112],{"class":1008},[904,1726,1727],{"class":980}," \"",[904,1729,1730],{"class":984},"public_identifier",[904,1732,1707],{"class":980},[904,1734,1168],{"class":910},[904,1736,1737,1739,1742,1744,1746,1748,1751,1753],{"class":961,"line":1016},[904,1738,1700],{"class":1699},[904,1740,1741],{"class":1703},"name",[904,1743,1707],{"class":1699},[904,1745,1112],{"class":1008},[904,1747,1727],{"class":980},[904,1749,1750],{"class":984},"the token name",[904,1752,1707],{"class":980},[904,1754,1168],{"class":910},[904,1756,1757,1759,1762,1764,1766,1768,1770,1772,1774,1776,1778,1780,1782],{"class":961,"line":1033},[904,1758,1700],{"class":1699},[904,1760,1761],{"class":1703},"ipv4",[904,1763,1707],{"class":1699},[904,1765,1112],{"class":1008},[904,1767,1043],{"class":910},[904,1769,1707],{"class":980},[904,1771,1049],{"class":984},[904,1773,1707],{"class":980},[904,1775,1054],{"class":910},[904,1777,1707],{"class":980},[904,1779,1059],{"class":984},[904,1781,1707],{"class":980},[904,1783,1064],{"class":910},[904,1785,1786],{"class":961,"line":1067},[904,1787,1209],{"class":910},[856,1789,1790,1791,1793,1794,1796],{},"To remove all restrictions through the route, omit ",[884,1792,1761],{}," or send an empty\narray. The controller converts both cases to ",[884,1795,1111],{}," before it calls the\nmanager.",[856,1798,1799],{},"On success you will get the following response:",[951,1801,1803],{"className":900,"code":1802,"language":901,"meta":902,"style":902},"HTTP\u002F1.1 200 OK\nContent-Type: application\u002Fjson; charset=utf-8\n\n{\n    \"ok\": true,\n    \"date\": \"current date\",\n    \"data\": { \"msg\": \"Restriction updated successfully\" }\n}\n",[884,1804,1805,1822,1833,1837,1841,1857,1877,1906],{"__ignoreMap":902},[904,1806,1807,1810,1813,1816,1819],{"class":961,"line":962},[904,1808,1809],{"class":1000},"HTTP",[904,1811,1812],{"class":910},"\u002F",[904,1814,1815],{"class":1012},"1.1",[904,1817,1818],{"class":1012}," 200",[904,1820,1821],{"class":984}," OK\n",[904,1823,1824,1828,1830],{"class":961,"line":991},[904,1825,1827],{"class":1826},"scd-l","Content-Type",[904,1829,1112],{"class":1000},[904,1831,1832],{"class":984}," application\u002Fjson; charset=utf-8\n",[904,1834,1835],{"class":961,"line":997},[904,1836,994],{"emptyLinePlaceholder":8},[904,1838,1839],{"class":961,"line":1016},[904,1840,1157],{"class":910},[904,1842,1843,1845,1848,1850,1852,1855],{"class":961,"line":1033},[904,1844,1700],{"class":1699},[904,1846,1847],{"class":1703},"ok",[904,1849,1707],{"class":1699},[904,1851,1112],{"class":1008},[904,1853,1854],{"class":1142}," true",[904,1856,1168],{"class":910},[904,1858,1859,1861,1864,1866,1868,1870,1873,1875],{"class":961,"line":1067},[904,1860,1700],{"class":1699},[904,1862,1863],{"class":1703},"date",[904,1865,1707],{"class":1699},[904,1867,1112],{"class":1008},[904,1869,1727],{"class":980},[904,1871,1872],{"class":984},"current date",[904,1874,1707],{"class":980},[904,1876,1168],{"class":910},[904,1878,1879,1881,1884,1886,1888,1890,1892,1894,1896,1898,1900,1902,1904],{"class":961,"line":1072},[904,1880,1700],{"class":1699},[904,1882,1883],{"class":1703},"data",[904,1885,1707],{"class":1699},[904,1887,1112],{"class":1008},[904,1889,968],{"class":910},[904,1891,1707],{"class":1699},[904,1893,1418],{"class":1703},[904,1895,1707],{"class":1699},[904,1897,1112],{"class":1008},[904,1899,1727],{"class":980},[904,1901,1199],{"class":984},[904,1903,1707],{"class":980},[904,1905,1204],{"class":910},[904,1907,1908],{"class":961,"line":1612},[904,1909,1209],{"class":910},[856,1911,1912,1913,887],{},"Standard authentication, body validation, and other shared management-route\nerrors are documented on the\n",[860,1914,1650],{"href":1915},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement#service",[856,1917,1918],{},"The route-specific failures come from the manager and the update helper:",[856,1920,1921,1922,1924,1925,887],{},"If the ",[884,1923,1519],{}," checksum is invalid, the route returns ",[884,1926,1927],{},"Invalid identity",[856,1929,1930,1931,1168,1933,1054,1935,1937,1938,1940,1941,1943],{},"If the manager cannot match a currently valid token for the given ",[884,1932,1704],{},[884,1934,1519],{},[884,1936,1741],{},", and ",[884,1939,1092],{},", it returns ",[884,1942,1662],{},". That means\nthe token is already revoked, belongs to a different user, or the request body\ndoes not point to an active row.",[856,1945,1946,1947,1949,1950,1952,1953,1955],{},"If the manager finds the token but the update query affects no rows, the route\nreturns ",[884,1948,1260],{},". That is the exact failure returned by\n",[884,1951,886],{}," when it cannot update the row with the current ",[884,1954,1092],{}," and\ntoken hash.",[856,1957,1958,1959,1961,1962,1964,1965,1967,1968,887],{},"If the database update throws, ",[884,1960,886],{}," returns\n",[884,1963,1314],{},". If ",[884,1966,893],{}," itself fails unexpectedly,\nthe route can also forward ",[884,1969,1970],{},"Server Error",[856,1972,1973,1974,1977],{},"All of these route-specific failures are returned as ",[884,1975,1976],{},"400 Bad Request"," by the\ncontroller:",[951,1979,1981],{"className":900,"code":1980,"language":901,"meta":902,"style":902},"HTTP\u002F1.1 400 Bad Request\nContent-Type: application\u002Fjson; charset=utf-8\n\n{\n    \"ok\": false,\n    \"date\": \"current date\",\n    \"reason\": \"reason from privateActionManager or updateRestriction\"\n}\n",[884,1982,1983,1997,2005,2009,2013,2028,2046,2065],{"__ignoreMap":902},[904,1984,1985,1987,1989,1991,1994],{"class":961,"line":962},[904,1986,1809],{"class":1000},[904,1988,1812],{"class":910},[904,1990,1815],{"class":1012},[904,1992,1993],{"class":1012}," 400",[904,1995,1996],{"class":984}," Bad Request\n",[904,1998,1999,2001,2003],{"class":961,"line":991},[904,2000,1827],{"class":1826},[904,2002,1112],{"class":1000},[904,2004,1832],{"class":984},[904,2006,2007],{"class":961,"line":997},[904,2008,994],{"emptyLinePlaceholder":8},[904,2010,2011],{"class":961,"line":1016},[904,2012,1157],{"class":910},[904,2014,2015,2017,2019,2021,2023,2026],{"class":961,"line":1033},[904,2016,1700],{"class":1699},[904,2018,1847],{"class":1703},[904,2020,1707],{"class":1699},[904,2022,1112],{"class":1008},[904,2024,2025],{"class":1142}," false",[904,2027,1168],{"class":910},[904,2029,2030,2032,2034,2036,2038,2040,2042,2044],{"class":961,"line":1067},[904,2031,1700],{"class":1699},[904,2033,1863],{"class":1703},[904,2035,1707],{"class":1699},[904,2037,1112],{"class":1008},[904,2039,1727],{"class":980},[904,2041,1872],{"class":984},[904,2043,1707],{"class":980},[904,2045,1168],{"class":910},[904,2047,2048,2050,2053,2055,2057,2059,2062],{"class":961,"line":1072},[904,2049,1700],{"class":1699},[904,2051,2052],{"class":1703},"reason",[904,2054,1707],{"class":1699},[904,2056,1112],{"class":1008},[904,2058,1727],{"class":980},[904,2060,2061],{"class":984},"reason from privateActionManager or updateRestriction",[904,2063,2064],{"class":980},"\"\n",[904,2066,2067],{"class":961,"line":1612},[904,2068,1209],{"class":910},[1322,2070,2072],{"id":2071},"rate-limits","Rate Limits",[856,2074,2075],{},"The endpoint also enforces rate limits controlled under the following\nconfiguration options:",[877,2077,2078,2084],{},[880,2079,2080,2083],{},[884,2081,2082],{},"rate_limiters.apiTokensLimiters.operationRateLimits.ipRestrictionUpdate"," -\nThe main limiter for the IP restriction update endpoint. The default allows 5\nupdates in a window of 10 minutes and will trigger a block for 30 minutes if\nthis limit is met. Consecutive triggers in this period will block the client\npermanently.",[880,2085,2086,2089,2090,2093,2094,2097,2103,2104,2107,2108],{},[884,2087,2088],{},"rate_limiters.apiTokensLimiters.generalUnionLimiter"," - A ",[884,2091,2092],{},"burstLimiter"," and\na ",[884,2095,2096],{},"slowLimiter",[860,2098,2102],{"href":2099,"rel":2100},"https:\u002F\u002Fgithub.com\u002Fanimir\u002Fnode-rate-limiter-flexible\u002Fwiki\u002FRateLimiterUnion",[2101],"nofollow","union limiter",".\nIt enforces no more than one request per second, and only 50 per minute. No\nconsecutive triggers in this limiter are provided, and triggering it again\nwill result in a permanent ban. The limiter is ",[939,2105,2106],{},"restarted"," on successful IP\nupdates.",[877,2109,2110,2115],{},[880,2111,2112,2114],{},[884,2113,2092],{}," - Will block the client for 15 minutes.",[880,2116,2117,2119],{},[884,2118,2096],{}," - Will block for 1 hour.",[923,2121,2123],{"id":2122},"ip-restriction-update-process","IP Restriction Update Process",[856,2125,2126],{},"IP restriction updates apply to future verification requests as soon as the\ndatabase write succeeds.",[931,2128,2130],{"id":2129},"normalize-the-requested-list","Normalize the requested list",[856,2132,2133,2134,2137,2138,2140,2141,2143],{},"The route validates the body with the ",[884,2135,2136],{},"ipRestrictionUpdate"," schema. After that,\nthe controller converts a non-empty ",[884,2139,1761],{}," array to the new whitelist, and it\nconverts an empty array or omitted field to ",[884,2142,1111],{}," so the restriction is\nremoved.",[931,2145,2147],{"id":2146},"validate-ownership","Validate ownership",[856,2149,2150,2151,2153,2154,2156],{},"When you use the manager or route, the system validates the\n",[884,2152,1519],{}," checksum and confirms that the token belongs to the current\nuser and is still valid. This check happens before ",[884,2155,886],{}," runs.",[931,2158,2160],{"id":2159},"update-the-token-record","Update the token record",[856,2162,2163,2164,2166,2167,2169,2170,2172],{},"The direct helper hashes the token if needed and updates the\n",[884,2165,948],{}," column for the matching ",[884,2168,1092],{}," and token. A\nnon-empty array is stored as JSON. A ",[884,2171,1111],{}," value removes the restriction.",[931,2174,2176],{"id":2175},"enforce-the-new-whitelist-during-verification","Enforce the new whitelist during verification",[856,2178,2179,2180,887],{},"After the update succeeds, future verification requests use the new whitelist.\nIf the token has restricted addresses and the caller IP is not in that list,\nthe verification flow returns ",[884,2181,2182],{},"Invalid Host",[923,2184,2186],{"id":2185},"configuration-reference","Configuration Reference",[856,2188,2189],{},"These configuration keys control IP update throttling in the service.",[931,2191,2193],{"id":2192},"rate-limiters","Rate limiters",[856,2195,2196],{},"The IP update flow relies on the following limiter configuration:",[1434,2198,2199,2208],{},[1437,2200,2201],{},[1440,2202,2203,2206],{},[1443,2204,2205],{},"Limiter",[1443,2207,1451],{},[1453,2209,2210,2219],{},[1440,2211,2212,2216],{},[1458,2213,2214],{},[884,2215,2082],{},[1458,2217,2218],{},"The main rate limiter for the IP update endpoint",[1440,2220,2221,2225],{},[1458,2222,2223],{},[884,2224,2088],{},[1458,2226,2227],{},"General burst limiter",[2229,2230,2231],"style",{},"html pre.shiki code .sZ328, html code.shiki .sZ328{--shiki-light:#AF00DB;--shiki-default:#AF00DB;--shiki-dark:#FF79C6}html pre.shiki code .sDd4n, html code.shiki .sDd4n{--shiki-light:#000000;--shiki-default:#000000;--shiki-dark:#F8F8F2}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 .sl46w, html code.shiki .sl46w{--shiki-light:#0000FF;--shiki-default:#0000FF;--shiki-dark:#FF79C6}html pre.shiki code .s3JHE, html code.shiki .s3JHE{--shiki-light:#0070C1;--shiki-default:#0070C1;--shiki-dark:#F8F8F2}html pre.shiki code .saOXh, html code.shiki .saOXh{--shiki-light:#000000;--shiki-default:#000000;--shiki-dark:#FF79C6}html pre.shiki code .spgvN, html code.shiki .spgvN{--shiki-light:#098658;--shiki-default:#098658;--shiki-dark:#BD93F9}html pre.shiki code .sHOzp, html code.shiki .sHOzp{--shiki-light:#795E26;--shiki-default:#795E26;--shiki-dark:#50FA7B}html pre.shiki code .sjR7W, html code.shiki .sjR7W{--shiki-light:#0000FF;--shiki-default:#0000FF;--shiki-dark:#BD93F9}html pre.shiki code .sakC6, html code.shiki .sakC6{--shiki-light:#0000FF;--shiki-light-font-weight:inherit;--shiki-default:#0000FF;--shiki-default-font-weight:inherit;--shiki-dark:#FF79C6;--shiki-dark-font-weight:bold}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 .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 pre.shiki code .sW-rI, html code.shiki .sW-rI{--shiki-light:#267F99;--shiki-light-font-style:inherit;--shiki-default:#267F99;--shiki-default-font-style:inherit;--shiki-dark:#FFB86C;--shiki-dark-font-style:italic}html pre.shiki code .s34zl, html code.shiki .s34zl{--shiki-light:#001080;--shiki-default:#001080;--shiki-dark:#FF79C6}html pre.shiki code .saJyd, html code.shiki .saJyd{--shiki-light:#0451A5;--shiki-default:#0451A5;--shiki-dark:#8BE9FE}html pre.shiki code .s_W10, html code.shiki .s_W10{--shiki-light:#0451A5;--shiki-default:#0451A5;--shiki-dark:#8BE9FD}html pre.shiki code .scd-l, html code.shiki .scd-l{--shiki-light:#800000;--shiki-default:#800000;--shiki-dark:#FF79C6}",{"title":902,"searchDepth":991,"depth":991,"links":2233},[2234,2238,2244],{"id":925,"depth":991,"text":926,"children":2235},[2236,2237],{"id":933,"depth":997,"text":934},{"id":1671,"depth":997,"text":1672},{"id":2122,"depth":991,"text":2123,"children":2239},[2240,2241,2242,2243],{"id":2129,"depth":997,"text":2130},{"id":2146,"depth":997,"text":2147},{"id":2159,"depth":997,"text":2160},{"id":2175,"depth":997,"text":2176},{"id":2185,"depth":991,"text":2186,"children":2245},[2246],{"id":2192,"depth":997,"text":2193},"How to update the whitelist of IP addresses allowed to use a token.","md","i-lucide-globe",{},null,"---\ntitle: IP Restriction\ndescription: How to update the whitelist of IP addresses allowed to use a token.\nicon: i-lucide-globe\n---\n\nIP restriction updates change the whitelist of IP addresses that can use a\nspecific API token during the\n[verification process](\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fverification). When a token has\nan IP list, verification only succeeds if the caller IP matches one of the\nstored addresses.\n\nThe IAM service stores the whitelist in the token record itself. That lets you\nadd, replace, or remove restrictions without generating a new token, while\nkeeping the current privilege, prefix, and expiration settings unchanged.\n\n::caution\nAn incorrect IP restriction can block legitimate traffic immediately. Apply\nchanges carefully, especially for server-to-server integrations behind proxies\nor load balancers.\n::\n\nYou can update IP restrictions in 3 ways:\n\n- Directly calling `updateRestriction`.\n- Using the `privateActionManager` to validate ownership before updating.\n- Calling the `POST \u002Fapi\u002Fmanage\u002Fip-restriction-update`{lang=\"http\"} endpoint\n\tfrom an authenticated client.\n\n::note\nFollow the [Creating Tokens](\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fcreation) docs to create\na token first before attempting to update its IP restrictions.\n::\n\n## Updating IP Restrictions\n\nYou can update IP restrictions either directly in the library or through the\nmanager-backed route. The direct helper updates the database with a user id and\ntoken, while the route adds ownership validation and request-level protections.\n\n### Using the library\n\nTo update a token restriction *directly*, you call `updateRestriction`. This\nfunction hashes the provided token when needed and updates the\n`restricted_to_ip_address` field for the matching user and token.\n\n```ts [example.ts]\nimport { updateRestriction } from '@riavzon\u002Fauth'\n\nconst userId = 1234\nconst token = 'api_1234'\nconst nextIps = ['203.0.113.10', '198.51.100.22']\n\nconst results = await updateRestriction(userId, token, nextIps)\n```\n\nTo remove all IP restrictions, pass `null`:\n\n```ts [example.ts]\nconst results = await updateRestriction(userId, token, null)\n```\n\nOn success you get back an object with:\n\n```ts\n{\n\tok: true,\n\tdate: new Date().toISOString(),\n\tdata: { msg: 'Restriction updated successfully' }\n}\n```\n\nOn error, `updateRestriction` returns the branch that failed.\n\nIf the update query affects no rows, it returns:\n\n```ts\n{\n\tok: false,\n\tdate: new Date().toISOString(),\n\treason: 'Token not found or unauthorized'\n}\n```\n\nThis happens when the helper cannot find a row that matches the hashed token\nand `userId`.\n\nIf the database update throws, the catch block returns:\n\n```ts\n{\n\tok: false,\n\tdate: new Date().toISOString(),\n\treason: 'Internal server error'\n}\n```\n\n#### Signature\n\nThe direct helper exposes the following signature:\n\n```ts\nexport async function updateRestriction(\n\t\tuserId: number,\n\t\trawToken: string,\n\t\tnewIpAddress: string[] | null,\n): Promise\u003CResults\u003C{ msg: string }>>\n```\n\n#### Parameters\n\nThe IP update helper accepts the following parameters:\n\n| Field | Type | Description |\n|---|---|---|\n| `userId` | `number` | The user id that owns the token. |\n| `rawToken` | `string` | The token to update. It can be hashed or *Raw*. |\n| `newIpAddress` | `string[] \\| null` | The new whitelist of allowed IPv4 addresses, or `null` to remove restrictions. |\n\n::warning\nThis action should be performed by a fully authenticated client.\n::\n\n::caution\nAside from matching the hashed token and the user id, this function does not\nverify a `publicIdentifier`, and it does not run the\n[verification process](\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fverification) for the token.\nOnly call it directly in trusted server-side code.\n::\n\n#### With the `privateActionManager`\n\nThe safest internal method is using the `privateActionManager`. This function\nvalidates the `publicIdentifier`, token id, token name, user id, and current\nvalid status before it dispatches the IP update.\n\n```ts [example.ts]\nconst ipUpdateResults = await privateActionManager(\n\tuserId,\n\ttokenId,\n\tpublicIdentifier,\n\ttokenName,\n\t{\n\t\taction: 'ip-restriction-update',\n\t\tnewIpAddress: ['203.0.113.10']\n\t}\n)\n```\n\nThe `privateActionManager` returns the response of `updateRestriction`\ndirectly. Learn more at the\n[introduction page](\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement#the-privateactionmanager).\n\n::note\nThe manager only selects rows where `valid = 1`. Because of that,\nmanager-backed IP updates cannot target an already revoked token, and the\nmanager returns `Bad Request` before it reaches `updateRestriction`.\n::\n\n---\n\n### Using the route\n\nLet's say you want to update the allowed IP addresses for a token from your\nauthenticated client or BFF.\n\n`POST \u002Fapi\u002Fmanage\u002Fip-restriction-update`{lang=\"http\"} body:\n\n```json\n{\n\t\"tokenId\": 12,\n\t\"publicIdentifier\": \"public_identifier\",\n\t\"name\": \"the token name\",\n\t\"ipv4\": [\"203.0.113.10\", \"198.51.100.22\"]\n}\n```\n\nTo remove all restrictions through the route, omit `ipv4` or send an empty\narray. The controller converts both cases to `null` before it calls the\nmanager.\n\nOn success you will get the following response:\n\n```http\nHTTP\u002F1.1 200 OK\nContent-Type: application\u002Fjson; charset=utf-8\n\n{\n\t\"ok\": true,\n\t\"date\": \"current date\",\n\t\"data\": { \"msg\": \"Restriction updated successfully\" }\n}\n```\n\nStandard authentication, body validation, and other shared management-route\nerrors are documented on the\n[introduction page](\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement#service).\n\nThe route-specific failures come from the manager and the update helper:\n\nIf the `publicIdentifier` checksum is invalid, the route returns `Invalid identity`.\n\nIf the manager cannot match a currently valid token for the given `tokenId`,\n`publicIdentifier`, `name`, and `userId`, it returns `Bad Request`. That means\nthe token is already revoked, belongs to a different user, or the request body\ndoes not point to an active row.\n\nIf the manager finds the token but the update query affects no rows, the route\nreturns `Token not found or unauthorized`. That is the exact failure returned by\n`updateRestriction` when it cannot update the row with the current `userId` and\ntoken hash.\n\nIf the database update throws, `updateRestriction` returns\n`Internal server error`. If `privateActionManager` itself fails unexpectedly,\nthe route can also forward `Server Error`.\n\nAll of these route-specific failures are returned as `400 Bad Request` by the\ncontroller:\n\n```http\nHTTP\u002F1.1 400 Bad Request\nContent-Type: application\u002Fjson; charset=utf-8\n\n{\n\t\"ok\": false,\n\t\"date\": \"current date\",\n\t\"reason\": \"reason from privateActionManager or updateRestriction\"\n}\n```\n\n#### Rate Limits\n\nThe endpoint also enforces rate limits controlled under the following\nconfiguration options:\n\n- `rate_limiters.apiTokensLimiters.operationRateLimits.ipRestrictionUpdate` -\n\tThe main limiter for the IP restriction update endpoint. The default allows 5\n\tupdates in a window of 10 minutes and will trigger a block for 30 minutes if\n\tthis limit is met. Consecutive triggers in this period will block the client\n\tpermanently.\n\n- `rate_limiters.apiTokensLimiters.generalUnionLimiter` - A `burstLimiter` and\n\ta `slowLimiter`\n\t[union limiter](https:\u002F\u002Fgithub.com\u002Fanimir\u002Fnode-rate-limiter-flexible\u002Fwiki\u002FRateLimiterUnion).\n\tIt enforces no more than one request per second, and only 50 per minute. No\n\tconsecutive triggers in this limiter are provided, and triggering it again\n\twill result in a permanent ban. The limiter is *restarted* on successful IP\n\tupdates.\n\t- `burstLimiter` - Will block the client for 15 minutes.\n\t- `slowLimiter` - Will block for 1 hour.\n\n## IP Restriction Update Process\n\nIP restriction updates apply to future verification requests as soon as the\ndatabase write succeeds.\n\n### Normalize the requested list\n\nThe route validates the body with the `ipRestrictionUpdate` schema. After that,\nthe controller converts a non-empty `ipv4` array to the new whitelist, and it\nconverts an empty array or omitted field to `null` so the restriction is\nremoved.\n\n### Validate ownership\n\nWhen you use the manager or route, the system validates the\n`publicIdentifier` checksum and confirms that the token belongs to the current\nuser and is still valid. This check happens before `updateRestriction` runs.\n\n### Update the token record\n\nThe direct helper hashes the token if needed and updates the\n`restricted_to_ip_address` column for the matching `userId` and token. A\nnon-empty array is stored as JSON. A `null` value removes the restriction.\n\n### Enforce the new whitelist during verification\n\nAfter the update succeeds, future verification requests use the new whitelist.\nIf the token has restricted addresses and the caller IP is not in that list,\nthe verification flow returns `Invalid Host`.\n\n## Configuration Reference\n\nThese configuration keys control IP update throttling in the service.\n\n### Rate limiters\n\nThe IP update flow relies on the following limiter configuration:\n\n| Limiter | Description |\n|---|---|\n| `rate_limiters.apiTokensLimiters.operationRateLimits.ipRestrictionUpdate` | The main rate limiter for the IP update endpoint |\n| `rate_limiters.apiTokensLimiters.generalUnionLimiter` | General burst limiter |\n",{"title":199,"description":2247},"uKT0zq0_Dkilrn7JU_BhOGQFE5q8w4wD8cuSlEwmn-k",[2256,2257],{"title":195,"path":196,"stem":197,"children":-1},{"title":203,"path":204,"stem":205,"children":-1},{"id":851,"title":199,"body":2259,"description":2247,"extension":2248,"icon":2249,"meta":3321,"module":2251,"navigation":8,"path":200,"rawbody":2252,"seo":3322,"stem":201,"__hash__":2254},{"type":853,"value":2260,"toc":3306},[2261,2265,2267,2271,2273,2291,2297,2299,2301,2303,2311,2417,2421,2451,2453,2499,2503,2505,2549,2553,2555,2599,2601,2603,2677,2679,2681,2735,2739,2747,2751,2757,2841,2849,2859,2861,2863,2865,2873,2963,2969,2971,3067,3071,3073,3079,3091,3099,3109,3113,3197,3199,3201,3230,3232,3234,3236,3244,3246,3252,3254,3262,3264,3268,3270,3272,3274,3276,3304],[856,2262,858,2263,863],{},[860,2264,862],{"href":178},[856,2266,866],{},[868,2268,2269],{},[856,2270,872],{},[856,2272,875],{},[877,2274,2275,2279,2283],{},[880,2276,882,2277,887],{},[884,2278,886],{},[880,2280,890,2281,894],{},[884,2282,893],{},[880,2284,897,2285,912],{},[884,2286,2287,2289],{"className":900,"language":901,"style":902},[904,2288,907],{"class":906},[904,2290,911],{"class":910},[914,2292,2293],{},[856,2294,918,2295,921],{},[860,2296,173],{"href":174},[923,2298,926],{"id":925},[856,2300,929],{},[931,2302,934],{"id":933},[856,2304,937,2305,942,2307,945,2309,949],{},[939,2306,941],{},[884,2308,886],{},[884,2310,948],{},[951,2312,2313],{"className":953,"code":954,"filename":955,"language":956,"meta":902,"style":902},[884,2314,2315,2333,2337,2347,2361,2387,2391],{"__ignoreMap":902},[904,2316,2317,2319,2321,2323,2325,2327,2329,2331],{"class":961,"line":962},[904,2318,965],{"class":906},[904,2320,968],{"class":910},[904,2322,886],{"class":971},[904,2324,974],{"class":910},[904,2326,977],{"class":906},[904,2328,981],{"class":980},[904,2330,985],{"class":984},[904,2332,988],{"class":980},[904,2334,2335],{"class":961,"line":991},[904,2336,994],{"emptyLinePlaceholder":8},[904,2338,2339,2341,2343,2345],{"class":961,"line":997},[904,2340,1001],{"class":1000},[904,2342,1005],{"class":1004},[904,2344,1009],{"class":1008},[904,2346,1013],{"class":1012},[904,2348,2349,2351,2353,2355,2357,2359],{"class":961,"line":1016},[904,2350,1001],{"class":1000},[904,2352,1021],{"class":1004},[904,2354,1009],{"class":1008},[904,2356,981],{"class":980},[904,2358,1028],{"class":984},[904,2360,988],{"class":980},[904,2362,2363,2365,2367,2369,2371,2373,2375,2377,2379,2381,2383,2385],{"class":961,"line":1033},[904,2364,1001],{"class":1000},[904,2366,1038],{"class":1004},[904,2368,1009],{"class":1008},[904,2370,1043],{"class":910},[904,2372,1046],{"class":980},[904,2374,1049],{"class":984},[904,2376,1046],{"class":980},[904,2378,1054],{"class":910},[904,2380,1046],{"class":980},[904,2382,1059],{"class":984},[904,2384,1046],{"class":980},[904,2386,1064],{"class":910},[904,2388,2389],{"class":961,"line":1067},[904,2390,994],{"emptyLinePlaceholder":8},[904,2392,2393,2395,2397,2399,2401,2403,2405,2407,2409,2411,2413,2415],{"class":961,"line":1072},[904,2394,1001],{"class":1000},[904,2396,1077],{"class":1004},[904,2398,1009],{"class":1008},[904,2400,1082],{"class":906},[904,2402,1086],{"class":1085},[904,2404,1089],{"class":910},[904,2406,1092],{"class":971},[904,2408,1054],{"class":910},[904,2410,1097],{"class":971},[904,2412,1054],{"class":910},[904,2414,1102],{"class":971},[904,2416,1105],{"class":910},[856,2418,1108,2419,1112],{},[884,2420,1111],{},[951,2422,2423],{"className":953,"code":1115,"filename":955,"language":956,"meta":902,"style":902},[884,2424,2425],{"__ignoreMap":902},[904,2426,2427,2429,2431,2433,2435,2437,2439,2441,2443,2445,2447,2449],{"class":961,"line":962},[904,2428,1001],{"class":1000},[904,2430,1077],{"class":1004},[904,2432,1009],{"class":1008},[904,2434,1082],{"class":906},[904,2436,1086],{"class":1085},[904,2438,1089],{"class":910},[904,2440,1092],{"class":971},[904,2442,1054],{"class":910},[904,2444,1097],{"class":971},[904,2446,1054],{"class":910},[904,2448,1111],{"class":1142},[904,2450,1105],{"class":910},[856,2452,1147],{},[951,2454,2455],{"className":953,"code":1150,"language":956,"meta":902,"style":902},[884,2456,2457,2461,2469,2483,2495],{"__ignoreMap":902},[904,2458,2459],{"class":961,"line":962},[904,2460,1157],{"class":910},[904,2462,2463,2465,2467],{"class":961,"line":991},[904,2464,1162],{"class":910},[904,2466,1165],{"class":1142},[904,2468,1168],{"class":910},[904,2470,2471,2473,2475,2477,2479,2481],{"class":961,"line":997},[904,2472,1173],{"class":910},[904,2474,1177],{"class":1176},[904,2476,1180],{"class":1085},[904,2478,1183],{"class":910},[904,2480,1186],{"class":1085},[904,2482,1189],{"class":910},[904,2484,2485,2487,2489,2491,2493],{"class":961,"line":1016},[904,2486,1194],{"class":910},[904,2488,1046],{"class":980},[904,2490,1199],{"class":984},[904,2492,1046],{"class":980},[904,2494,1204],{"class":910},[904,2496,2497],{"class":961,"line":1033},[904,2498,1209],{"class":910},[856,2500,1212,2501,1215],{},[884,2502,886],{},[856,2504,1218],{},[951,2506,2507],{"className":953,"code":1221,"language":956,"meta":902,"style":902},[884,2508,2509,2513,2521,2535,2545],{"__ignoreMap":902},[904,2510,2511],{"class":961,"line":962},[904,2512,1157],{"class":910},[904,2514,2515,2517,2519],{"class":961,"line":991},[904,2516,1162],{"class":910},[904,2518,1234],{"class":1142},[904,2520,1168],{"class":910},[904,2522,2523,2525,2527,2529,2531,2533],{"class":961,"line":997},[904,2524,1173],{"class":910},[904,2526,1177],{"class":1176},[904,2528,1180],{"class":1085},[904,2530,1183],{"class":910},[904,2532,1186],{"class":1085},[904,2534,1189],{"class":910},[904,2536,2537,2539,2541,2543],{"class":961,"line":1016},[904,2538,1255],{"class":910},[904,2540,1046],{"class":980},[904,2542,1260],{"class":984},[904,2544,988],{"class":980},[904,2546,2547],{"class":961,"line":1033},[904,2548,1209],{"class":910},[856,2550,1269,2551,887],{},[884,2552,1092],{},[856,2554,1274],{},[951,2556,2557],{"className":953,"code":1277,"language":956,"meta":902,"style":902},[884,2558,2559,2563,2571,2585,2595],{"__ignoreMap":902},[904,2560,2561],{"class":961,"line":962},[904,2562,1157],{"class":910},[904,2564,2565,2567,2569],{"class":961,"line":991},[904,2566,1162],{"class":910},[904,2568,1234],{"class":1142},[904,2570,1168],{"class":910},[904,2572,2573,2575,2577,2579,2581,2583],{"class":961,"line":997},[904,2574,1173],{"class":910},[904,2576,1177],{"class":1176},[904,2578,1180],{"class":1085},[904,2580,1183],{"class":910},[904,2582,1186],{"class":1085},[904,2584,1189],{"class":910},[904,2586,2587,2589,2591,2593],{"class":961,"line":1016},[904,2588,1255],{"class":910},[904,2590,1046],{"class":980},[904,2592,1314],{"class":984},[904,2594,988],{"class":980},[904,2596,2597],{"class":961,"line":1033},[904,2598,1209],{"class":910},[1322,2600,1325],{"id":1324},[856,2602,1328],{},[951,2604,2605],{"className":953,"code":1331,"language":956,"meta":902,"style":902},[884,2606,2607,2619,2629,2639,2655],{"__ignoreMap":902},[904,2608,2609,2611,2613,2615,2617],{"class":961,"line":962},[904,2610,1338],{"class":906},[904,2612,1341],{"class":1000},[904,2614,1344],{"class":1000},[904,2616,1086],{"class":1085},[904,2618,1349],{"class":910},[904,2620,2621,2623,2625,2627],{"class":961,"line":991},[904,2622,1355],{"class":1354},[904,2624,1112],{"class":1008},[904,2626,1361],{"class":1360},[904,2628,1168],{"class":910},[904,2630,2631,2633,2635,2637],{"class":961,"line":997},[904,2632,1368],{"class":1354},[904,2634,1112],{"class":1008},[904,2636,1373],{"class":1360},[904,2638,1168],{"class":910},[904,2640,2641,2643,2645,2647,2649,2651,2653],{"class":961,"line":1016},[904,2642,1380],{"class":1354},[904,2644,1112],{"class":1008},[904,2646,1373],{"class":1360},[904,2648,1387],{"class":910},[904,2650,1390],{"class":1008},[904,2652,1393],{"class":1360},[904,2654,1168],{"class":910},[904,2656,2657,2659,2661,2663,2665,2667,2669,2671,2673,2675],{"class":961,"line":1033},[904,2658,1400],{"class":910},[904,2660,1112],{"class":1008},[904,2662,1405],{"class":1360},[904,2664,1408],{"class":910},[904,2666,1412],{"class":1411},[904,2668,1415],{"class":910},[904,2670,1418],{"class":971},[904,2672,1112],{"class":1008},[904,2674,1373],{"class":1360},[904,2676,1425],{"class":910},[1322,2678,1429],{"id":1428},[856,2680,1432],{},[1434,2682,2683,2693],{},[1437,2684,2685],{},[1440,2686,2687,2689,2691],{},[1443,2688,1445],{},[1443,2690,1448],{},[1443,2692,1451],{},[1453,2694,2695,2707,2721],{},[1440,2696,2697,2701,2705],{},[1458,2698,2699],{},[884,2700,1092],{},[1458,2702,2703],{},[884,2704,1466],{},[1458,2706,1469],{},[1440,2708,2709,2713,2717],{},[1458,2710,2711],{},[884,2712,1476],{},[1458,2714,2715],{},[884,2716,1481],{},[1458,2718,1484,2719,887],{},[939,2720,1487],{},[1440,2722,2723,2727,2731],{},[1458,2724,2725],{},[884,2726,1494],{},[1458,2728,2729],{},[884,2730,1499],{},[1458,2732,1502,2733,1505],{},[884,2734,1111],{},[1507,2736,2737],{},[856,2738,1511],{},[868,2740,2741],{},[856,2742,1516,2743,1520,2745,1523],{},[884,2744,1519],{},[860,2746,862],{"href":178},[1322,2748,1527,2749],{"id":1526},[884,2750,893],{},[856,2752,1532,2753,1535,2755,1538],{},[884,2754,893],{},[884,2756,1519],{},[951,2758,2759],{"className":953,"code":1541,"filename":955,"language":956,"meta":902,"style":902},[884,2760,2761,2775,2781,2787,2793,2799,2803,2817,2833,2837],{"__ignoreMap":902},[904,2762,2763,2765,2767,2769,2771,2773],{"class":961,"line":962},[904,2764,1001],{"class":1000},[904,2766,1550],{"class":1004},[904,2768,1009],{"class":1008},[904,2770,1082],{"class":906},[904,2772,1557],{"class":1085},[904,2774,1349],{"class":910},[904,2776,2777,2779],{"class":961,"line":991},[904,2778,1564],{"class":971},[904,2780,1168],{"class":910},[904,2782,2783,2785],{"class":961,"line":997},[904,2784,1571],{"class":971},[904,2786,1168],{"class":910},[904,2788,2789,2791],{"class":961,"line":1016},[904,2790,1578],{"class":971},[904,2792,1168],{"class":910},[904,2794,2795,2797],{"class":961,"line":1033},[904,2796,1585],{"class":971},[904,2798,1168],{"class":910},[904,2800,2801],{"class":961,"line":1067},[904,2802,1592],{"class":910},[904,2804,2805,2807,2809,2811,2813,2815],{"class":961,"line":1072},[904,2806,1597],{"class":971},[904,2808,1112],{"class":1600},[904,2810,981],{"class":980},[904,2812,1605],{"class":984},[904,2814,1046],{"class":980},[904,2816,1168],{"class":910},[904,2818,2819,2821,2823,2825,2827,2829,2831],{"class":961,"line":1612},[904,2820,1380],{"class":971},[904,2822,1112],{"class":1600},[904,2824,1043],{"class":910},[904,2826,1046],{"class":980},[904,2828,1049],{"class":984},[904,2830,1046],{"class":980},[904,2832,1064],{"class":910},[904,2834,2835],{"class":961,"line":1629},[904,2836,1632],{"class":910},[904,2838,2839],{"class":961,"line":1635},[904,2840,1105],{"class":910},[856,2842,1640,2843,1643,2845,1646,2847,887],{},[884,2844,893],{},[884,2846,886],{},[860,2848,1650],{"href":1649},[914,2850,2851],{},[856,2852,1655,2853,1659,2855,1663,2857,887],{},[884,2854,1658],{},[884,2856,1662],{},[884,2858,886],{},[1667,2860],{},[931,2862,1672],{"id":1671},[856,2864,1675],{},[856,2866,2867,1684],{},[884,2868,2869,2871],{"className":900,"language":901,"style":902},[904,2870,907],{"class":906},[904,2872,911],{"class":910},[951,2874,2875],{"className":1687,"code":1688,"language":5,"meta":902,"style":902},[884,2876,2877,2881,2895,2913,2931,2959],{"__ignoreMap":902},[904,2878,2879],{"class":961,"line":962},[904,2880,1157],{"class":910},[904,2882,2883,2885,2887,2889,2891,2893],{"class":961,"line":991},[904,2884,1700],{"class":1699},[904,2886,1704],{"class":1703},[904,2888,1707],{"class":1699},[904,2890,1112],{"class":1008},[904,2892,1712],{"class":1012},[904,2894,1168],{"class":910},[904,2896,2897,2899,2901,2903,2905,2907,2909,2911],{"class":961,"line":997},[904,2898,1700],{"class":1699},[904,2900,1519],{"class":1703},[904,2902,1707],{"class":1699},[904,2904,1112],{"class":1008},[904,2906,1727],{"class":980},[904,2908,1730],{"class":984},[904,2910,1707],{"class":980},[904,2912,1168],{"class":910},[904,2914,2915,2917,2919,2921,2923,2925,2927,2929],{"class":961,"line":1016},[904,2916,1700],{"class":1699},[904,2918,1741],{"class":1703},[904,2920,1707],{"class":1699},[904,2922,1112],{"class":1008},[904,2924,1727],{"class":980},[904,2926,1750],{"class":984},[904,2928,1707],{"class":980},[904,2930,1168],{"class":910},[904,2932,2933,2935,2937,2939,2941,2943,2945,2947,2949,2951,2953,2955,2957],{"class":961,"line":1033},[904,2934,1700],{"class":1699},[904,2936,1761],{"class":1703},[904,2938,1707],{"class":1699},[904,2940,1112],{"class":1008},[904,2942,1043],{"class":910},[904,2944,1707],{"class":980},[904,2946,1049],{"class":984},[904,2948,1707],{"class":980},[904,2950,1054],{"class":910},[904,2952,1707],{"class":980},[904,2954,1059],{"class":984},[904,2956,1707],{"class":980},[904,2958,1064],{"class":910},[904,2960,2961],{"class":961,"line":1067},[904,2962,1209],{"class":910},[856,2964,1790,2965,1793,2967,1796],{},[884,2966,1761],{},[884,2968,1111],{},[856,2970,1799],{},[951,2972,2973],{"className":900,"code":1802,"language":901,"meta":902,"style":902},[884,2974,2975,2987,2995,2999,3003,3017,3035,3063],{"__ignoreMap":902},[904,2976,2977,2979,2981,2983,2985],{"class":961,"line":962},[904,2978,1809],{"class":1000},[904,2980,1812],{"class":910},[904,2982,1815],{"class":1012},[904,2984,1818],{"class":1012},[904,2986,1821],{"class":984},[904,2988,2989,2991,2993],{"class":961,"line":991},[904,2990,1827],{"class":1826},[904,2992,1112],{"class":1000},[904,2994,1832],{"class":984},[904,2996,2997],{"class":961,"line":997},[904,2998,994],{"emptyLinePlaceholder":8},[904,3000,3001],{"class":961,"line":1016},[904,3002,1157],{"class":910},[904,3004,3005,3007,3009,3011,3013,3015],{"class":961,"line":1033},[904,3006,1700],{"class":1699},[904,3008,1847],{"class":1703},[904,3010,1707],{"class":1699},[904,3012,1112],{"class":1008},[904,3014,1854],{"class":1142},[904,3016,1168],{"class":910},[904,3018,3019,3021,3023,3025,3027,3029,3031,3033],{"class":961,"line":1067},[904,3020,1700],{"class":1699},[904,3022,1863],{"class":1703},[904,3024,1707],{"class":1699},[904,3026,1112],{"class":1008},[904,3028,1727],{"class":980},[904,3030,1872],{"class":984},[904,3032,1707],{"class":980},[904,3034,1168],{"class":910},[904,3036,3037,3039,3041,3043,3045,3047,3049,3051,3053,3055,3057,3059,3061],{"class":961,"line":1072},[904,3038,1700],{"class":1699},[904,3040,1883],{"class":1703},[904,3042,1707],{"class":1699},[904,3044,1112],{"class":1008},[904,3046,968],{"class":910},[904,3048,1707],{"class":1699},[904,3050,1418],{"class":1703},[904,3052,1707],{"class":1699},[904,3054,1112],{"class":1008},[904,3056,1727],{"class":980},[904,3058,1199],{"class":984},[904,3060,1707],{"class":980},[904,3062,1204],{"class":910},[904,3064,3065],{"class":961,"line":1612},[904,3066,1209],{"class":910},[856,3068,1912,3069,887],{},[860,3070,1650],{"href":1915},[856,3072,1918],{},[856,3074,1921,3075,1924,3077,887],{},[884,3076,1519],{},[884,3078,1927],{},[856,3080,1930,3081,1168,3083,1054,3085,1937,3087,1940,3089,1943],{},[884,3082,1704],{},[884,3084,1519],{},[884,3086,1741],{},[884,3088,1092],{},[884,3090,1662],{},[856,3092,1946,3093,1949,3095,1952,3097,1955],{},[884,3094,1260],{},[884,3096,886],{},[884,3098,1092],{},[856,3100,1958,3101,1961,3103,1964,3105,1967,3107,887],{},[884,3102,886],{},[884,3104,1314],{},[884,3106,893],{},[884,3108,1970],{},[856,3110,1973,3111,1977],{},[884,3112,1976],{},[951,3114,3115],{"className":900,"code":1980,"language":901,"meta":902,"style":902},[884,3116,3117,3129,3137,3141,3145,3159,3177,3193],{"__ignoreMap":902},[904,3118,3119,3121,3123,3125,3127],{"class":961,"line":962},[904,3120,1809],{"class":1000},[904,3122,1812],{"class":910},[904,3124,1815],{"class":1012},[904,3126,1993],{"class":1012},[904,3128,1996],{"class":984},[904,3130,3131,3133,3135],{"class":961,"line":991},[904,3132,1827],{"class":1826},[904,3134,1112],{"class":1000},[904,3136,1832],{"class":984},[904,3138,3139],{"class":961,"line":997},[904,3140,994],{"emptyLinePlaceholder":8},[904,3142,3143],{"class":961,"line":1016},[904,3144,1157],{"class":910},[904,3146,3147,3149,3151,3153,3155,3157],{"class":961,"line":1033},[904,3148,1700],{"class":1699},[904,3150,1847],{"class":1703},[904,3152,1707],{"class":1699},[904,3154,1112],{"class":1008},[904,3156,2025],{"class":1142},[904,3158,1168],{"class":910},[904,3160,3161,3163,3165,3167,3169,3171,3173,3175],{"class":961,"line":1067},[904,3162,1700],{"class":1699},[904,3164,1863],{"class":1703},[904,3166,1707],{"class":1699},[904,3168,1112],{"class":1008},[904,3170,1727],{"class":980},[904,3172,1872],{"class":984},[904,3174,1707],{"class":980},[904,3176,1168],{"class":910},[904,3178,3179,3181,3183,3185,3187,3189,3191],{"class":961,"line":1072},[904,3180,1700],{"class":1699},[904,3182,2052],{"class":1703},[904,3184,1707],{"class":1699},[904,3186,1112],{"class":1008},[904,3188,1727],{"class":980},[904,3190,2061],{"class":984},[904,3192,2064],{"class":980},[904,3194,3195],{"class":961,"line":1612},[904,3196,1209],{"class":910},[1322,3198,2072],{"id":2071},[856,3200,2075],{},[877,3202,3203,3207],{},[880,3204,3205,2083],{},[884,3206,2082],{},[880,3208,3209,2089,3211,2093,3213,3215,2103,3218,2107,3220],{},[884,3210,2088],{},[884,3212,2092],{},[884,3214,2096],{},[860,3216,2102],{"href":2099,"rel":3217},[2101],[939,3219,2106],{},[877,3221,3222,3226],{},[880,3223,3224,2114],{},[884,3225,2092],{},[880,3227,3228,2119],{},[884,3229,2096],{},[923,3231,2123],{"id":2122},[856,3233,2126],{},[931,3235,2130],{"id":2129},[856,3237,2133,3238,2137,3240,2140,3242,2143],{},[884,3239,2136],{},[884,3241,1761],{},[884,3243,1111],{},[931,3245,2147],{"id":2146},[856,3247,2150,3248,2153,3250,2156],{},[884,3249,1519],{},[884,3251,886],{},[931,3253,2160],{"id":2159},[856,3255,2163,3256,2166,3258,2169,3260,2172],{},[884,3257,948],{},[884,3259,1092],{},[884,3261,1111],{},[931,3263,2176],{"id":2175},[856,3265,2179,3266,887],{},[884,3267,2182],{},[923,3269,2186],{"id":2185},[856,3271,2189],{},[931,3273,2193],{"id":2192},[856,3275,2196],{},[1434,3277,3278,3286],{},[1437,3279,3280],{},[1440,3281,3282,3284],{},[1443,3283,2205],{},[1443,3285,1451],{},[1453,3287,3288,3296],{},[1440,3289,3290,3294],{},[1458,3291,3292],{},[884,3293,2082],{},[1458,3295,2218],{},[1440,3297,3298,3302],{},[1458,3299,3300],{},[884,3301,2088],{},[1458,3303,2227],{},[2229,3305,2231],{},{"title":902,"searchDepth":991,"depth":991,"links":3307},[3308,3312,3318],{"id":925,"depth":991,"text":926,"children":3309},[3310,3311],{"id":933,"depth":997,"text":934},{"id":1671,"depth":997,"text":1672},{"id":2122,"depth":991,"text":2123,"children":3313},[3314,3315,3316,3317],{"id":2129,"depth":997,"text":2130},{"id":2146,"depth":997,"text":2147},{"id":2159,"depth":997,"text":2160},{"id":2175,"depth":997,"text":2176},{"id":2185,"depth":991,"text":2186,"children":3319},[3320],{"id":2192,"depth":997,"text":2193},{},{"title":199,"description":2247},1780436286340]