[{"data":1,"prerenderedAt":2876},["ShallowReactive",2],{"navLinks":3,"sidebar_docs_navigation_\u002Fdocs\u002Fiam":64,"navigation":257,"navLinks_footer":837,"\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fprivilege_page":850,"\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fprivilege_surround":2004,"\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement\u002Fprivilege":2007},{"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":187,"body":852,"description":1996,"extension":1997,"icon":1998,"meta":1999,"module":2000,"navigation":8,"path":188,"rawbody":2001,"seo":2002,"stem":189,"__hash__":2003},"docs\u002Fdocs\u002Fiam\u002F01.essentials\u002F21.api\u002F02.management\u002F00.privilege.md",{"type":853,"value":854,"toc":1987},"minimark",[855,884,891,894,900,903,906,947,956,961,966,976,1118,1121,1184,1187,1227,1242,1247,1373,1377,1447,1453,1462,1468,1548,1561,1563,1567,1576,1585,1677,1680,1792,1795,1798,1884,1893,1897,1900,1944,1948,1952,1983],[856,857,858,859,863,864,863,867,870,871,874,875,878,879,883],"p",{},"The IAM service, allowed privileges are ",[860,861,862],"code",{},"demo",", ",[860,865,866],{},"restricted",[860,868,869],{},"protected"," ",[860,872,873],{},"full"," and ",[860,876,877],{},"custom",". When a new token is ",[880,881,882],"a",{"href":174},"created",", with a specified privilege, the token is scoped in the database level to that privilege. Any verification attempts with a privilege other then the one specified, will fail.",[856,885,886,887,890],{},"That means the IAM doesn't have any business knowledge, or an 'idea' what each level means to your client or app. Because of this design, and because every app has its own needs, the IAM gives you a flexible ",[888,889,25],"em",{}," to ensure that the token it assigned to a user, will not escalate to a privilege its not created with, and vice versa.",[856,892,893],{},"This lets you structure, features, plans, RBAC, and more, to a specific user (or even plan), reliably.",[895,896,897],"caution",{},[856,898,899],{},"Never let users directly control their privilege if critical business logic in your app depends on that field.",[901,902],"hr",{},[856,904,905],{},"You can control the privilege for each token in 3 processes:",[907,908,909,916,938],"ul",{},[910,911,912,913],"li",{},"When ",[880,914,915],{"href":174},"creating a token",[910,917,918,919,922,923,937],{},"Directly updating the field with ",[860,920,921],{},"updatePrivileges"," or the ",[860,924,928,933],{"className":925,"language":926,"style":927},"language-http shiki shiki-themes light-plus light-plus dracula","http","",[929,930,932],"span",{"class":931},"sZ328","POST",[929,934,936],{"class":935},"sDd4n"," \u002Fapi\u002Fmanage\u002Fprivilege-update"," endpoint.",[910,939,940,941,944,945],{},"Using the ",[860,942,943],{},"privateActionManager"," to make additional verification before updating. The endpoint uses this function, instead of ",[860,946,921],{},[948,949,950],"note",{},[856,951,952,953,955],{},"Follow the ",[880,954,173],{"href":174}," docs to create a token first before directly updating privileges.",[957,958,960],"h2",{"id":959},"updating-privileges","Updating Privileges",[962,963,965],"h3",{"id":964},"using-the-library","Using the library",[856,967,968,969,972,973,975],{},"To update a privilege ",[888,970,971],{},"directly",", you call ",[860,974,921],{},". This function searches for hashed token in the database, the user id, and updates the privilege:",[977,978,983],"pre",{"className":979,"code":980,"filename":981,"language":982,"meta":927,"style":927},"language-ts shiki shiki-themes light-plus light-plus dracula","import { updatePrivileges } from '@riavzon\u002Fauth'\n\nconst userId = 1234\nconst newPriv = 'full'\nconst token = 'token' \u002F\u002F can be hashed or raw.\n\nconst results = await updatePrivileges(userId, token, newPriv)\n\n","example.ts","ts",[860,984,985,1015,1021,1040,1056,1078,1083],{"__ignoreMap":927},[929,986,989,992,995,998,1001,1004,1008,1012],{"class":987,"line":988},"line",1,[929,990,991],{"class":931},"import",[929,993,994],{"class":935}," { ",[929,996,921],{"class":997},"sjsA6",[929,999,1000],{"class":935}," } ",[929,1002,1003],{"class":931},"from",[929,1005,1007],{"class":1006},"sFkSl"," '",[929,1009,1011],{"class":1010},"sFB1V","@riavzon\u002Fauth",[929,1013,1014],{"class":1006},"'\n",[929,1016,1018],{"class":987,"line":1017},2,[929,1019,1020],{"emptyLinePlaceholder":8},"\n",[929,1022,1024,1028,1032,1036],{"class":987,"line":1023},3,[929,1025,1027],{"class":1026},"sl46w","const",[929,1029,1031],{"class":1030},"s3JHE"," userId",[929,1033,1035],{"class":1034},"saOXh"," =",[929,1037,1039],{"class":1038},"spgvN"," 1234\n",[929,1041,1043,1045,1048,1050,1052,1054],{"class":987,"line":1042},4,[929,1044,1027],{"class":1026},[929,1046,1047],{"class":1030}," newPriv",[929,1049,1035],{"class":1034},[929,1051,1007],{"class":1006},[929,1053,873],{"class":1010},[929,1055,1014],{"class":1006},[929,1057,1059,1061,1064,1066,1068,1071,1074],{"class":987,"line":1058},5,[929,1060,1027],{"class":1026},[929,1062,1063],{"class":1030}," token",[929,1065,1035],{"class":1034},[929,1067,1007],{"class":1006},[929,1069,1070],{"class":1010},"token",[929,1072,1073],{"class":1006},"'",[929,1075,1077],{"class":1076},"sghk6"," \u002F\u002F can be hashed or raw.\n",[929,1079,1081],{"class":987,"line":1080},6,[929,1082,1020],{"emptyLinePlaceholder":8},[929,1084,1086,1088,1091,1093,1096,1100,1103,1106,1108,1110,1112,1115],{"class":987,"line":1085},7,[929,1087,1027],{"class":1026},[929,1089,1090],{"class":1030}," results",[929,1092,1035],{"class":1034},[929,1094,1095],{"class":931}," await",[929,1097,1099],{"class":1098},"sHOzp"," updatePrivileges",[929,1101,1102],{"class":935},"(",[929,1104,1105],{"class":997},"userId",[929,1107,863],{"class":935},[929,1109,1070],{"class":997},[929,1111,863],{"class":935},[929,1113,1114],{"class":997},"newPriv",[929,1116,1117],{"class":935},")\n",[856,1119,1120],{},"On success you get back an object with:",[977,1122,1124],{"className":979,"code":1123,"language":982,"meta":927,"style":927},"{\n ok: true,\n date: new Date().toISOString(),\n data: { msg: 'Privileges updated successfully' }\n}\n",[860,1125,1126,1131,1143,1164,1179],{"__ignoreMap":927},[929,1127,1128],{"class":987,"line":988},[929,1129,1130],{"class":935},"{\n",[929,1132,1133,1136,1140],{"class":987,"line":1017},[929,1134,1135],{"class":935}," ok: ",[929,1137,1139],{"class":1138},"sjR7W","true",[929,1141,1142],{"class":935},",\n",[929,1144,1145,1148,1152,1155,1158,1161],{"class":987,"line":1023},[929,1146,1147],{"class":935}," date: ",[929,1149,1151],{"class":1150},"sakC6","new",[929,1153,1154],{"class":1098}," Date",[929,1156,1157],{"class":935},"().",[929,1159,1160],{"class":1098},"toISOString",[929,1162,1163],{"class":935},"(),\n",[929,1165,1166,1169,1171,1174,1176],{"class":987,"line":1042},[929,1167,1168],{"class":935}," data: { msg: ",[929,1170,1073],{"class":1006},[929,1172,1173],{"class":1010},"Privileges updated successfully",[929,1175,1073],{"class":1006},[929,1177,1178],{"class":935}," }\n",[929,1180,1181],{"class":987,"line":1058},[929,1182,1183],{"class":935},"}\n",[856,1185,1186],{},"On error:",[977,1188,1190],{"className":979,"code":1189,"language":982,"meta":927,"style":927}," ok: false,\n date: new Date().toISOString(),\n reason: 'the reason of the failure'\n",[860,1191,1192,1201,1215],{"__ignoreMap":927},[929,1193,1194,1196,1199],{"class":987,"line":988},[929,1195,1135],{"class":935},[929,1197,1198],{"class":1138},"false",[929,1200,1142],{"class":935},[929,1202,1203,1205,1207,1209,1211,1213],{"class":987,"line":1017},[929,1204,1147],{"class":935},[929,1206,1151],{"class":1150},[929,1208,1154],{"class":1098},[929,1210,1157],{"class":935},[929,1212,1160],{"class":1098},[929,1214,1163],{"class":935},[929,1216,1217,1220,1222,1225],{"class":987,"line":1023},[929,1218,1219],{"class":935}," reason: ",[929,1221,1073],{"class":1006},[929,1223,1224],{"class":1010},"the reason of the failure",[929,1226,1014],{"class":1006},[856,1228,1229,1230,1233,1234,1237,1238,1241],{},"If an database error happens the ",[860,1231,1232],{},"reason"," would be ",[860,1235,1236],{},"'Internal server error'"," if the token didn't found ",[860,1239,1240],{},"'Token not found or unauthorized'",".",[1243,1244,1246],"h4",{"id":1245},"signature","Signature",[977,1248,1250],{"className":979,"code":1249,"language":982,"meta":927,"style":927},"export async function updatePrivileges(\n    userId: number,\n    rawToken: string,\n    newPrivileges: 'demo' | 'restricted' | 'protected' | 'full' | 'custom',\n): Promise\u003CResults\u003C{ msg: string }>>\n",[860,1251,1252,1268,1283,1295,1343],{"__ignoreMap":927},[929,1253,1254,1257,1260,1263,1265],{"class":987,"line":988},[929,1255,1256],{"class":931},"export",[929,1258,1259],{"class":1026}," async",[929,1261,1262],{"class":1026}," function",[929,1264,1099],{"class":1098},[929,1266,1267],{"class":935},"(\n",[929,1269,1270,1274,1277,1281],{"class":987,"line":1017},[929,1271,1273],{"class":1272},"sygFZ","    userId",[929,1275,1276],{"class":1034},":",[929,1278,1280],{"class":1279},"sFs1U"," number",[929,1282,1142],{"class":935},[929,1284,1285,1288,1290,1293],{"class":987,"line":1023},[929,1286,1287],{"class":1272},"    rawToken",[929,1289,1276],{"class":1034},[929,1291,1292],{"class":1279}," string",[929,1294,1142],{"class":935},[929,1296,1297,1300,1302,1304,1306,1308,1311,1313,1315,1317,1319,1321,1323,1325,1327,1329,1331,1333,1335,1337,1339,1341],{"class":987,"line":1042},[929,1298,1299],{"class":1272},"    newPrivileges",[929,1301,1276],{"class":1034},[929,1303,1007],{"class":1006},[929,1305,862],{"class":1010},[929,1307,1073],{"class":1006},[929,1309,1310],{"class":1034}," |",[929,1312,1007],{"class":1006},[929,1314,866],{"class":1010},[929,1316,1073],{"class":1006},[929,1318,1310],{"class":1034},[929,1320,1007],{"class":1006},[929,1322,869],{"class":1010},[929,1324,1073],{"class":1006},[929,1326,1310],{"class":1034},[929,1328,1007],{"class":1006},[929,1330,873],{"class":1010},[929,1332,1073],{"class":1006},[929,1334,1310],{"class":1034},[929,1336,1007],{"class":1006},[929,1338,877],{"class":1010},[929,1340,1073],{"class":1006},[929,1342,1142],{"class":935},[929,1344,1345,1348,1350,1353,1356,1360,1363,1366,1368,1370],{"class":987,"line":1058},[929,1346,1347],{"class":935},")",[929,1349,1276],{"class":1034},[929,1351,1352],{"class":1279}," Promise",[929,1354,1355],{"class":935},"\u003C",[929,1357,1359],{"class":1358},"sW-rI","Results",[929,1361,1362],{"class":935},"\u003C{ ",[929,1364,1365],{"class":997},"msg",[929,1367,1276],{"class":1034},[929,1369,1292],{"class":1279},[929,1371,1372],{"class":935}," }>>\n",[1243,1374,1376],{"id":1375},"parameters","Parameters",[1378,1379,1380,1396],"table",{},[1381,1382,1383],"thead",{},[1384,1385,1386,1390,1393],"tr",{},[1387,1388,1389],"th",{},"Field",[1387,1391,1392],{},"Type",[1387,1394,1395],{},"Description",[1397,1398,1399,1414,1432],"tbody",{},[1384,1400,1401,1406,1411],{},[1402,1403,1404],"td",{},[860,1405,1105],{},[1402,1407,1408],{},[860,1409,1410],{},"number",[1402,1412,1413],{},"The user id",[1384,1415,1416,1421,1426],{},[1402,1417,1418],{},[860,1419,1420],{},"rawToken",[1402,1422,1423],{},[860,1424,1425],{},"string",[1402,1427,1428,1429],{},"The token that the updates applies to. can be hashed or ",[888,1430,1431],{},"Raw",[1384,1433,1434,1439,1444],{},[1402,1435,1436],{},[860,1437,1438],{},"newPrivileges",[1402,1440,1441],{},[860,1442,1443],{},"'demo' | 'restricted' | 'protected' | 'full' | 'custom'",[1402,1445,1446],{},"The privilege to update.",[1448,1449,1450],"warning",{},[856,1451,1452],{},"This action should be performed by a fully authenticated client.",[895,1454,1455],{},[856,1456,1457,1458,1461],{},"Aside from searching for the hashed token in the database and the user id, the token is not verified with the ",[880,1459,1460],{"href":178},"verification process",". And its not behind any authentication.",[1243,1463,1465,1466],{"id":1464},"with-the-privateactionmanager","With the ",[860,1467,943],{},[977,1469,1471],{"className":979,"code":1470,"language":982,"meta":927,"style":927},"    const updatePrivilegesResults = \n     await privateActionManager(userId, TokenId, publicIdentifier, tokenName, {\n        action: 'privilege-update',\n        newPrivileges: newPrivilege\n     });\n",[860,1472,1473,1486,1516,1533,1543],{"__ignoreMap":927},[929,1474,1475,1478,1481,1483],{"class":987,"line":988},[929,1476,1477],{"class":1026},"    const",[929,1479,1480],{"class":1030}," updatePrivilegesResults",[929,1482,1035],{"class":1034},[929,1484,1485],{"class":935}," \n",[929,1487,1488,1491,1494,1496,1498,1500,1503,1505,1508,1510,1513],{"class":987,"line":1017},[929,1489,1490],{"class":931},"     await",[929,1492,1493],{"class":1098}," privateActionManager",[929,1495,1102],{"class":935},[929,1497,1105],{"class":997},[929,1499,863],{"class":935},[929,1501,1502],{"class":997},"TokenId",[929,1504,863],{"class":935},[929,1506,1507],{"class":997},"publicIdentifier",[929,1509,863],{"class":935},[929,1511,1512],{"class":997},"tokenName",[929,1514,1515],{"class":935},", {\n",[929,1517,1518,1521,1524,1526,1529,1531],{"class":987,"line":1023},[929,1519,1520],{"class":997},"        action",[929,1522,1276],{"class":1523},"s34zl",[929,1525,1007],{"class":1006},[929,1527,1528],{"class":1010},"privilege-update",[929,1530,1073],{"class":1006},[929,1532,1142],{"class":935},[929,1534,1535,1538,1540],{"class":987,"line":1042},[929,1536,1537],{"class":997},"        newPrivileges",[929,1539,1276],{"class":1523},[929,1541,1542],{"class":997}," newPrivilege\n",[929,1544,1545],{"class":987,"line":1058},[929,1546,1547],{"class":935},"     });\n",[856,1549,1550,1551,1553,1554,1556,1557,1241],{},"The ",[860,1552,943],{}," returns the response of ",[860,1555,921],{}," directly. Learn more at the ",[880,1558,1560],{"href":1559},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement#the-privateactionmanager","introduction page",[901,1562],{},[962,1564,1566],{"id":1565},"using-the-route","Using the route",[856,1568,1569,1570,1572,1573,1575],{},"Lets say you want to update a token privilege from ",[860,1571,862],{}," to ",[860,1574,866],{}," in this example.",[856,1577,1578,1584],{},[860,1579,1580,1582],{"className":925,"language":926,"style":927},[929,1581,932],{"class":931},[929,1583,936],{"class":935}," body:",[977,1586,1589],{"className":1587,"code":1588,"language":5,"meta":927,"style":927},"language-json shiki shiki-themes light-plus light-plus dracula","{\n    \"newPrivilege\": \"restricted\",\n    \"tokenId\": 2,\n    \"publicIdentifier\": \"pubkey\",\n    \"name\": \"the token name\"\n}\n",[860,1590,1591,1595,1619,1635,1654,1673],{"__ignoreMap":927},[929,1592,1593],{"class":987,"line":988},[929,1594,1130],{"class":935},[929,1596,1597,1601,1605,1608,1610,1613,1615,1617],{"class":987,"line":1017},[929,1598,1600],{"class":1599},"saJyd","    \"",[929,1602,1604],{"class":1603},"s_W10","newPrivilege",[929,1606,1607],{"class":1599},"\"",[929,1609,1276],{"class":1034},[929,1611,1612],{"class":1006}," \"",[929,1614,866],{"class":1010},[929,1616,1607],{"class":1006},[929,1618,1142],{"class":935},[929,1620,1621,1623,1626,1628,1630,1633],{"class":987,"line":1023},[929,1622,1600],{"class":1599},[929,1624,1625],{"class":1603},"tokenId",[929,1627,1607],{"class":1599},[929,1629,1276],{"class":1034},[929,1631,1632],{"class":1038}," 2",[929,1634,1142],{"class":935},[929,1636,1637,1639,1641,1643,1645,1647,1650,1652],{"class":987,"line":1042},[929,1638,1600],{"class":1599},[929,1640,1507],{"class":1603},[929,1642,1607],{"class":1599},[929,1644,1276],{"class":1034},[929,1646,1612],{"class":1006},[929,1648,1649],{"class":1010},"pubkey",[929,1651,1607],{"class":1006},[929,1653,1142],{"class":935},[929,1655,1656,1658,1661,1663,1665,1667,1670],{"class":987,"line":1058},[929,1657,1600],{"class":1599},[929,1659,1660],{"class":1603},"name",[929,1662,1607],{"class":1599},[929,1664,1276],{"class":1034},[929,1666,1612],{"class":1006},[929,1668,1669],{"class":1010},"the token name",[929,1671,1672],{"class":1006},"\"\n",[929,1674,1675],{"class":987,"line":1080},[929,1676,1183],{"class":935},[856,1678,1679],{},"On success you will get the following response:",[977,1681,1683],{"className":925,"code":1682,"language":926,"meta":927,"style":927},"HTTP\u002F1.1 200 OK\nContent-Type: application\u002Fjson; charset=utf-8\n\n{\n  \"ok\": true,\n  \"date\": \"current date\",\n  \"data\": { \"msg\": \"Privileges updated successfully\" }\n}\n",[860,1684,1685,1702,1713,1717,1721,1738,1758,1787],{"__ignoreMap":927},[929,1686,1687,1690,1693,1696,1699],{"class":987,"line":988},[929,1688,1689],{"class":1026},"HTTP",[929,1691,1692],{"class":935},"\u002F",[929,1694,1695],{"class":1038},"1.1",[929,1697,1698],{"class":1038}," 200",[929,1700,1701],{"class":1010}," OK\n",[929,1703,1704,1708,1710],{"class":987,"line":1017},[929,1705,1707],{"class":1706},"scd-l","Content-Type",[929,1709,1276],{"class":1026},[929,1711,1712],{"class":1010}," application\u002Fjson; charset=utf-8\n",[929,1714,1715],{"class":987,"line":1023},[929,1716,1020],{"emptyLinePlaceholder":8},[929,1718,1719],{"class":987,"line":1042},[929,1720,1130],{"class":935},[929,1722,1723,1726,1729,1731,1733,1736],{"class":987,"line":1058},[929,1724,1725],{"class":1599},"  \"",[929,1727,1728],{"class":1603},"ok",[929,1730,1607],{"class":1599},[929,1732,1276],{"class":1034},[929,1734,1735],{"class":1138}," true",[929,1737,1142],{"class":935},[929,1739,1740,1742,1745,1747,1749,1751,1754,1756],{"class":987,"line":1080},[929,1741,1725],{"class":1599},[929,1743,1744],{"class":1603},"date",[929,1746,1607],{"class":1599},[929,1748,1276],{"class":1034},[929,1750,1612],{"class":1006},[929,1752,1753],{"class":1010},"current date",[929,1755,1607],{"class":1006},[929,1757,1142],{"class":935},[929,1759,1760,1762,1765,1767,1769,1771,1773,1775,1777,1779,1781,1783,1785],{"class":987,"line":1085},[929,1761,1725],{"class":1599},[929,1763,1764],{"class":1603},"data",[929,1766,1607],{"class":1599},[929,1768,1276],{"class":1034},[929,1770,994],{"class":935},[929,1772,1607],{"class":1599},[929,1774,1365],{"class":1603},[929,1776,1607],{"class":1599},[929,1778,1276],{"class":1034},[929,1780,1612],{"class":1006},[929,1782,1173],{"class":1010},[929,1784,1607],{"class":1006},[929,1786,1178],{"class":935},[929,1788,1790],{"class":987,"line":1789},8,[929,1791,1183],{"class":935},[856,1793,1794],{},"Aside from the standard errors that related to authentication, rate limits, and provided bad data,",[856,1796,1797],{},"The response you get is the same one the the library users get above:",[977,1799,1801],{"className":925,"code":1800,"language":926,"meta":927,"style":927},"HTTP\u002F1.1 400\nContent-Type: application\u002Fjson; charset=utf-8\n\n{\n  \"ok\": false,\n  \"date\": \"current date\",\n  \"reason\": \"reason from `privateActionManager`\"\n}\n",[860,1802,1803,1814,1822,1826,1830,1845,1863,1880],{"__ignoreMap":927},[929,1804,1805,1807,1809,1811],{"class":987,"line":988},[929,1806,1689],{"class":1026},[929,1808,1692],{"class":935},[929,1810,1695],{"class":1038},[929,1812,1813],{"class":1038}," 400\n",[929,1815,1816,1818,1820],{"class":987,"line":1017},[929,1817,1707],{"class":1706},[929,1819,1276],{"class":1026},[929,1821,1712],{"class":1010},[929,1823,1824],{"class":987,"line":1023},[929,1825,1020],{"emptyLinePlaceholder":8},[929,1827,1828],{"class":987,"line":1042},[929,1829,1130],{"class":935},[929,1831,1832,1834,1836,1838,1840,1843],{"class":987,"line":1058},[929,1833,1725],{"class":1599},[929,1835,1728],{"class":1603},[929,1837,1607],{"class":1599},[929,1839,1276],{"class":1034},[929,1841,1842],{"class":1138}," false",[929,1844,1142],{"class":935},[929,1846,1847,1849,1851,1853,1855,1857,1859,1861],{"class":987,"line":1080},[929,1848,1725],{"class":1599},[929,1850,1744],{"class":1603},[929,1852,1607],{"class":1599},[929,1854,1276],{"class":1034},[929,1856,1612],{"class":1006},[929,1858,1753],{"class":1010},[929,1860,1607],{"class":1006},[929,1862,1142],{"class":935},[929,1864,1865,1867,1869,1871,1873,1875,1878],{"class":987,"line":1085},[929,1866,1725],{"class":1599},[929,1868,1232],{"class":1603},[929,1870,1607],{"class":1599},[929,1872,1276],{"class":1034},[929,1874,1612],{"class":1006},[929,1876,1877],{"class":1010},"reason from `privateActionManager`",[929,1879,1672],{"class":1006},[929,1881,1882],{"class":987,"line":1789},[929,1883,1183],{"class":935},[948,1885,1886],{},[856,1887,1888,1889,1892],{},"Check the ",[880,1890,1560],{"href":1891},"\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement#service"," to see the standard error response.",[1243,1894,1896],{"id":1895},"rate-limits","Rate Limits",[856,1898,1899],{},"The endpoint also enforce rate limits controlled under the following configuration options:",[907,1901,1902,1908],{},[910,1903,1904,1907],{},[860,1905,1906],{},"rate_limiters.apiTokensLimiters.operationRateLimits.privilegeUpdate"," - The main limiter for the privilege update endpoint. The default allows 5 creations in a window of 10 minutes and will trigger a block for 30 minutes if this limit is met. Consecutive triggers in this period will block the client permanently.",[910,1909,1910,1913,1914,1917,1918,870,1921,1927,1928,1931,1932],{},[860,1911,1912],{},"rate_limiters.apiTokensLimiters.generalUnionLimiter"," - A ",[860,1915,1916],{},"burstLimiter"," and a ",[860,1919,1920],{},"slowLimiter",[880,1922,1926],{"href":1923,"rel":1924},"https:\u002F\u002Fgithub.com\u002Fanimir\u002Fnode-rate-limiter-flexible\u002Fwiki\u002FRateLimiterUnion",[1925],"nofollow","union limiter",". Enforces no more than one request per second, and only 50 per minute. No Consecutive triggers in this limiter, triggering it again will result in a permanent ban. The limiter is ",[888,1929,1930],{},"restarted"," on successful updates.",[907,1933,1934,1939],{},[910,1935,1936,1938],{},[860,1937,1916],{}," - Will block the client for 15 minutes.",[910,1940,1941,1943],{},[860,1942,1920],{}," - Will block for 1 hour.",[957,1945,1947],{"id":1946},"configuration-reference","Configuration Reference",[962,1949,1951],{"id":1950},"rate-limiters","Rate limiters",[1378,1953,1954,1963],{},[1381,1955,1956],{},[1384,1957,1958,1961],{},[1387,1959,1960],{},"Limiter",[1387,1962,1395],{},[1397,1964,1965,1974],{},[1384,1966,1967,1971],{},[1402,1968,1969],{},[860,1970,1906],{},[1402,1972,1973],{},"The main rate limiter for the privilege update endpoint",[1384,1975,1976,1980],{},[1402,1977,1978],{},[860,1979,1912],{},[1402,1981,1982],{},"General burst limiter",[1984,1985,1986],"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 .sghk6, html code.shiki .sghk6{--shiki-light:#008000;--shiki-default:#008000;--shiki-dark:#6272A4}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":927,"searchDepth":1017,"depth":1017,"links":1988},[1989,1993],{"id":959,"depth":1017,"text":960,"children":1990},[1991,1992],{"id":964,"depth":1023,"text":965},{"id":1565,"depth":1023,"text":1566},{"id":1946,"depth":1017,"text":1947,"children":1994},[1995],{"id":1950,"depth":1023,"text":1951},"What privileges means in the system point of view.","md","i-lucide-check-circle",{},null,"---\ntitle: Privileges\ndescription: What privileges means in the system point of view.\nicon: i-lucide-check-circle\n---\n\nThe IAM service, allowed privileges are `demo`, `restricted`, `protected` `full` and `custom`. When a new token is [created](\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fcreation), with a specified privilege, the token is scoped in the database level to that privilege. Any verification attempts with a privilege other then the one specified, will fail.\n\nThat means the IAM doesn't have any business knowledge, or an 'idea' what each level means to your client or app. Because of this design, and because every app has its own needs, the IAM gives you a flexible *Core* to ensure that the token it assigned to a user, will not escalate to a privilege its not created with, and vice versa.\n\n\nThis lets you structure, features, plans, RBAC, and more, to a specific user (or even plan), reliably. \n\n\n::caution\nNever let users directly control their privilege if critical business logic in your app depends on that field.\n::\n\n---\n\nYou can control the privilege for each token in 3 processes:\n\n- When [creating a token](\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fcreation)\n- Directly updating the field with `updatePrivileges` or the `POST \u002Fapi\u002Fmanage\u002Fprivilege-update`{lang=\"http\"} endpoint.\n- Using the `privateActionManager` to make additional verification before updating. The endpoint uses this function, instead of `updatePrivileges`\n\n::note\nFollow the [Creating Tokens](\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fcreation) docs to create a token first before directly updating privileges. \n::\n\n\n## Updating Privileges\n\n### Using the library\n\nTo update a privilege *directly*, you call `updatePrivileges`. This function searches for hashed token in the database, the user id, and updates the privilege:\n\n\n```ts [example.ts]\nimport { updatePrivileges } from '@riavzon\u002Fauth'\n\nconst userId = 1234\nconst newPriv = 'full'\nconst token = 'token' \u002F\u002F can be hashed or raw.\n\nconst results = await updatePrivileges(userId, token, newPriv)\n\n```\n\nOn success you get back an object with:\n\n```ts\n{\n ok: true,\n date: new Date().toISOString(),\n data: { msg: 'Privileges updated successfully' }\n}\n```\nOn error:\n\n```ts\n ok: false,\n date: new Date().toISOString(),\n reason: 'the reason of the failure'\n```\nIf an database error happens the `reason` would be `'Internal server error'` if the token didn't found `'Token not found or unauthorized'`.\n\n#### Signature \n```ts\nexport async function updatePrivileges(\n    userId: number,\n    rawToken: string,\n    newPrivileges: 'demo' | 'restricted' | 'protected' | 'full' | 'custom',\n): Promise\u003CResults\u003C{ msg: string }>>\n```\n#### Parameters\n\n| Field | Type | Description |\n|---|---|---|\n| `userId` | `number` | The user id |\n| `rawToken` | `string` | The token that the updates applies to. can be hashed or *Raw*  |\n| `newPrivileges` | `'demo' \\| 'restricted' \\| 'protected' \\| 'full' \\| 'custom'` | The privilege to update. |\n\n\n::warning\nThis action should be performed by a fully authenticated client.\n::\n\n::caution\nAside from searching for the hashed token in the database and the user id, the token is not verified with the [verification process](\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fverification). And its not behind any authentication.\n::\n\n#### With the `privateActionManager`\n\n\n```ts\n    const updatePrivilegesResults = \n     await privateActionManager(userId, TokenId, publicIdentifier, tokenName, {\n        action: 'privilege-update',\n        newPrivileges: newPrivilege\n     });\n```\nThe `privateActionManager` returns the response of `updatePrivileges` directly. Learn more at the [introduction page](\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement#the-privateactionmanager).\n\n---\n\n### Using the route\n\nLets say you want to update a token privilege from `demo` to `restricted` in this example.\n\n`POST \u002Fapi\u002Fmanage\u002Fprivilege-update`{lang=\"http\"} body:\n\n```json\n{\n    \"newPrivilege\": \"restricted\",\n    \"tokenId\": 2,\n    \"publicIdentifier\": \"pubkey\",\n    \"name\": \"the token name\"\n}\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  \"ok\": true,\n  \"date\": \"current date\",\n  \"data\": { \"msg\": \"Privileges updated successfully\" }\n}\n```\n\nAside from the standard errors that related to authentication, rate limits, and provided bad data,\n\nThe response you get is the same one the the library users get above:\n\n```http\nHTTP\u002F1.1 400\nContent-Type: application\u002Fjson; charset=utf-8\n\n{\n  \"ok\": false,\n  \"date\": \"current date\",\n  \"reason\": \"reason from `privateActionManager`\"\n}\n```\n\n::note \nCheck the [introduction page](\u002Fdocs\u002Fiam\u002Fessentials\u002Fapi\u002Fmanagement#service) to see the standard error response.\n::\n\n#### Rate Limits\n\nThe endpoint also enforce rate limits controlled under the following configuration options:\n\n- `rate_limiters.apiTokensLimiters.operationRateLimits.privilegeUpdate` - The main limiter for the privilege update endpoint. The default allows 5 creations in a window of 10 minutes and will trigger a block for 30 minutes if this limit is met. Consecutive triggers in this period will block the client permanently.\n\n- `rate_limiters.apiTokensLimiters.generalUnionLimiter` - A `burstLimiter` and a `slowLimiter` [union limiter](https:\u002F\u002Fgithub.com\u002Fanimir\u002Fnode-rate-limiter-flexible\u002Fwiki\u002FRateLimiterUnion). Enforces no more than one request per second, and only 50 per minute. No Consecutive triggers in this limiter, triggering it again will result in a permanent ban. The limiter is *restarted* on successful updates.\n   - `burstLimiter` - Will block the client for 15 minutes.\n   - `slowLimiter` - Will block for 1 hour.\n\n\n## Configuration Reference\n\n### Rate limiters\n| Limiter | Description |\n|---|---|\n| `rate_limiters.apiTokensLimiters.operationRateLimits.privilegeUpdate` | The main rate limiter for the privilege update endpoint |\n| `rate_limiters.apiTokensLimiters.generalUnionLimiter` | General burst limiter |\n",{"title":187,"description":1996},"WIQnAj_ceS7LGPMlpCfwRk5pj9m_wfw7svZoacKvKUQ",[2005,2006],{"title":181,"path":182,"stem":183,"children":-1},{"title":191,"path":192,"stem":193,"children":-1},{"id":851,"title":187,"body":2008,"description":1996,"extension":1997,"icon":1998,"meta":2874,"module":2000,"navigation":8,"path":188,"rawbody":2001,"seo":2875,"stem":189,"__hash__":2003},{"type":853,"value":2009,"toc":2865},[2010,2024,2028,2030,2034,2036,2038,2060,2066,2068,2070,2076,2172,2174,2220,2222,2258,2266,2268,2372,2374,2426,2430,2436,2440,2504,2512,2514,2516,2522,2530,2608,2610,2706,2708,2710,2792,2798,2800,2802,2831,2833,2835,2863],[856,2011,858,2012,863,2014,863,2016,870,2018,874,2020,878,2022,883],{},[860,2013,862],{},[860,2015,866],{},[860,2017,869],{},[860,2019,873],{},[860,2021,877],{},[880,2023,882],{"href":174},[856,2025,886,2026,890],{},[888,2027,25],{},[856,2029,893],{},[895,2031,2032],{},[856,2033,899],{},[901,2035],{},[856,2037,905],{},[907,2039,2040,2044,2054],{},[910,2041,912,2042],{},[880,2043,915],{"href":174},[910,2045,918,2046,922,2048,937],{},[860,2047,921],{},[860,2049,2050,2052],{"className":925,"language":926,"style":927},[929,2051,932],{"class":931},[929,2053,936],{"class":935},[910,2055,940,2056,944,2058],{},[860,2057,943],{},[860,2059,921],{},[948,2061,2062],{},[856,2063,952,2064,955],{},[880,2065,173],{"href":174},[957,2067,960],{"id":959},[962,2069,965],{"id":964},[856,2071,968,2072,972,2074,975],{},[888,2073,971],{},[860,2075,921],{},[977,2077,2078],{"className":979,"code":980,"filename":981,"language":982,"meta":927,"style":927},[860,2079,2080,2098,2102,2112,2126,2142,2146],{"__ignoreMap":927},[929,2081,2082,2084,2086,2088,2090,2092,2094,2096],{"class":987,"line":988},[929,2083,991],{"class":931},[929,2085,994],{"class":935},[929,2087,921],{"class":997},[929,2089,1000],{"class":935},[929,2091,1003],{"class":931},[929,2093,1007],{"class":1006},[929,2095,1011],{"class":1010},[929,2097,1014],{"class":1006},[929,2099,2100],{"class":987,"line":1017},[929,2101,1020],{"emptyLinePlaceholder":8},[929,2103,2104,2106,2108,2110],{"class":987,"line":1023},[929,2105,1027],{"class":1026},[929,2107,1031],{"class":1030},[929,2109,1035],{"class":1034},[929,2111,1039],{"class":1038},[929,2113,2114,2116,2118,2120,2122,2124],{"class":987,"line":1042},[929,2115,1027],{"class":1026},[929,2117,1047],{"class":1030},[929,2119,1035],{"class":1034},[929,2121,1007],{"class":1006},[929,2123,873],{"class":1010},[929,2125,1014],{"class":1006},[929,2127,2128,2130,2132,2134,2136,2138,2140],{"class":987,"line":1058},[929,2129,1027],{"class":1026},[929,2131,1063],{"class":1030},[929,2133,1035],{"class":1034},[929,2135,1007],{"class":1006},[929,2137,1070],{"class":1010},[929,2139,1073],{"class":1006},[929,2141,1077],{"class":1076},[929,2143,2144],{"class":987,"line":1080},[929,2145,1020],{"emptyLinePlaceholder":8},[929,2147,2148,2150,2152,2154,2156,2158,2160,2162,2164,2166,2168,2170],{"class":987,"line":1085},[929,2149,1027],{"class":1026},[929,2151,1090],{"class":1030},[929,2153,1035],{"class":1034},[929,2155,1095],{"class":931},[929,2157,1099],{"class":1098},[929,2159,1102],{"class":935},[929,2161,1105],{"class":997},[929,2163,863],{"class":935},[929,2165,1070],{"class":997},[929,2167,863],{"class":935},[929,2169,1114],{"class":997},[929,2171,1117],{"class":935},[856,2173,1120],{},[977,2175,2176],{"className":979,"code":1123,"language":982,"meta":927,"style":927},[860,2177,2178,2182,2190,2204,2216],{"__ignoreMap":927},[929,2179,2180],{"class":987,"line":988},[929,2181,1130],{"class":935},[929,2183,2184,2186,2188],{"class":987,"line":1017},[929,2185,1135],{"class":935},[929,2187,1139],{"class":1138},[929,2189,1142],{"class":935},[929,2191,2192,2194,2196,2198,2200,2202],{"class":987,"line":1023},[929,2193,1147],{"class":935},[929,2195,1151],{"class":1150},[929,2197,1154],{"class":1098},[929,2199,1157],{"class":935},[929,2201,1160],{"class":1098},[929,2203,1163],{"class":935},[929,2205,2206,2208,2210,2212,2214],{"class":987,"line":1042},[929,2207,1168],{"class":935},[929,2209,1073],{"class":1006},[929,2211,1173],{"class":1010},[929,2213,1073],{"class":1006},[929,2215,1178],{"class":935},[929,2217,2218],{"class":987,"line":1058},[929,2219,1183],{"class":935},[856,2221,1186],{},[977,2223,2224],{"className":979,"code":1189,"language":982,"meta":927,"style":927},[860,2225,2226,2234,2248],{"__ignoreMap":927},[929,2227,2228,2230,2232],{"class":987,"line":988},[929,2229,1135],{"class":935},[929,2231,1198],{"class":1138},[929,2233,1142],{"class":935},[929,2235,2236,2238,2240,2242,2244,2246],{"class":987,"line":1017},[929,2237,1147],{"class":935},[929,2239,1151],{"class":1150},[929,2241,1154],{"class":1098},[929,2243,1157],{"class":935},[929,2245,1160],{"class":1098},[929,2247,1163],{"class":935},[929,2249,2250,2252,2254,2256],{"class":987,"line":1023},[929,2251,1219],{"class":935},[929,2253,1073],{"class":1006},[929,2255,1224],{"class":1010},[929,2257,1014],{"class":1006},[856,2259,1229,2260,1233,2262,1237,2264,1241],{},[860,2261,1232],{},[860,2263,1236],{},[860,2265,1240],{},[1243,2267,1246],{"id":1245},[977,2269,2270],{"className":979,"code":1249,"language":982,"meta":927,"style":927},[860,2271,2272,2284,2294,2304,2350],{"__ignoreMap":927},[929,2273,2274,2276,2278,2280,2282],{"class":987,"line":988},[929,2275,1256],{"class":931},[929,2277,1259],{"class":1026},[929,2279,1262],{"class":1026},[929,2281,1099],{"class":1098},[929,2283,1267],{"class":935},[929,2285,2286,2288,2290,2292],{"class":987,"line":1017},[929,2287,1273],{"class":1272},[929,2289,1276],{"class":1034},[929,2291,1280],{"class":1279},[929,2293,1142],{"class":935},[929,2295,2296,2298,2300,2302],{"class":987,"line":1023},[929,2297,1287],{"class":1272},[929,2299,1276],{"class":1034},[929,2301,1292],{"class":1279},[929,2303,1142],{"class":935},[929,2305,2306,2308,2310,2312,2314,2316,2318,2320,2322,2324,2326,2328,2330,2332,2334,2336,2338,2340,2342,2344,2346,2348],{"class":987,"line":1042},[929,2307,1299],{"class":1272},[929,2309,1276],{"class":1034},[929,2311,1007],{"class":1006},[929,2313,862],{"class":1010},[929,2315,1073],{"class":1006},[929,2317,1310],{"class":1034},[929,2319,1007],{"class":1006},[929,2321,866],{"class":1010},[929,2323,1073],{"class":1006},[929,2325,1310],{"class":1034},[929,2327,1007],{"class":1006},[929,2329,869],{"class":1010},[929,2331,1073],{"class":1006},[929,2333,1310],{"class":1034},[929,2335,1007],{"class":1006},[929,2337,873],{"class":1010},[929,2339,1073],{"class":1006},[929,2341,1310],{"class":1034},[929,2343,1007],{"class":1006},[929,2345,877],{"class":1010},[929,2347,1073],{"class":1006},[929,2349,1142],{"class":935},[929,2351,2352,2354,2356,2358,2360,2362,2364,2366,2368,2370],{"class":987,"line":1058},[929,2353,1347],{"class":935},[929,2355,1276],{"class":1034},[929,2357,1352],{"class":1279},[929,2359,1355],{"class":935},[929,2361,1359],{"class":1358},[929,2363,1362],{"class":935},[929,2365,1365],{"class":997},[929,2367,1276],{"class":1034},[929,2369,1292],{"class":1279},[929,2371,1372],{"class":935},[1243,2373,1376],{"id":1375},[1378,2375,2376,2386],{},[1381,2377,2378],{},[1384,2379,2380,2382,2384],{},[1387,2381,1389],{},[1387,2383,1392],{},[1387,2385,1395],{},[1397,2387,2388,2400,2414],{},[1384,2389,2390,2394,2398],{},[1402,2391,2392],{},[860,2393,1105],{},[1402,2395,2396],{},[860,2397,1410],{},[1402,2399,1413],{},[1384,2401,2402,2406,2410],{},[1402,2403,2404],{},[860,2405,1420],{},[1402,2407,2408],{},[860,2409,1425],{},[1402,2411,1428,2412],{},[888,2413,1431],{},[1384,2415,2416,2420,2424],{},[1402,2417,2418],{},[860,2419,1438],{},[1402,2421,2422],{},[860,2423,1443],{},[1402,2425,1446],{},[1448,2427,2428],{},[856,2429,1452],{},[895,2431,2432],{},[856,2433,1457,2434,1461],{},[880,2435,1460],{"href":178},[1243,2437,1465,2438],{"id":1464},[860,2439,943],{},[977,2441,2442],{"className":979,"code":1470,"language":982,"meta":927,"style":927},[860,2443,2444,2454,2478,2492,2500],{"__ignoreMap":927},[929,2445,2446,2448,2450,2452],{"class":987,"line":988},[929,2447,1477],{"class":1026},[929,2449,1480],{"class":1030},[929,2451,1035],{"class":1034},[929,2453,1485],{"class":935},[929,2455,2456,2458,2460,2462,2464,2466,2468,2470,2472,2474,2476],{"class":987,"line":1017},[929,2457,1490],{"class":931},[929,2459,1493],{"class":1098},[929,2461,1102],{"class":935},[929,2463,1105],{"class":997},[929,2465,863],{"class":935},[929,2467,1502],{"class":997},[929,2469,863],{"class":935},[929,2471,1507],{"class":997},[929,2473,863],{"class":935},[929,2475,1512],{"class":997},[929,2477,1515],{"class":935},[929,2479,2480,2482,2484,2486,2488,2490],{"class":987,"line":1023},[929,2481,1520],{"class":997},[929,2483,1276],{"class":1523},[929,2485,1007],{"class":1006},[929,2487,1528],{"class":1010},[929,2489,1073],{"class":1006},[929,2491,1142],{"class":935},[929,2493,2494,2496,2498],{"class":987,"line":1042},[929,2495,1537],{"class":997},[929,2497,1276],{"class":1523},[929,2499,1542],{"class":997},[929,2501,2502],{"class":987,"line":1058},[929,2503,1547],{"class":935},[856,2505,1550,2506,1553,2508,1556,2510,1241],{},[860,2507,943],{},[860,2509,921],{},[880,2511,1560],{"href":1559},[901,2513],{},[962,2515,1566],{"id":1565},[856,2517,1569,2518,1572,2520,1575],{},[860,2519,862],{},[860,2521,866],{},[856,2523,2524,1584],{},[860,2525,2526,2528],{"className":925,"language":926,"style":927},[929,2527,932],{"class":931},[929,2529,936],{"class":935},[977,2531,2532],{"className":1587,"code":1588,"language":5,"meta":927,"style":927},[860,2533,2534,2538,2556,2570,2588,2604],{"__ignoreMap":927},[929,2535,2536],{"class":987,"line":988},[929,2537,1130],{"class":935},[929,2539,2540,2542,2544,2546,2548,2550,2552,2554],{"class":987,"line":1017},[929,2541,1600],{"class":1599},[929,2543,1604],{"class":1603},[929,2545,1607],{"class":1599},[929,2547,1276],{"class":1034},[929,2549,1612],{"class":1006},[929,2551,866],{"class":1010},[929,2553,1607],{"class":1006},[929,2555,1142],{"class":935},[929,2557,2558,2560,2562,2564,2566,2568],{"class":987,"line":1023},[929,2559,1600],{"class":1599},[929,2561,1625],{"class":1603},[929,2563,1607],{"class":1599},[929,2565,1276],{"class":1034},[929,2567,1632],{"class":1038},[929,2569,1142],{"class":935},[929,2571,2572,2574,2576,2578,2580,2582,2584,2586],{"class":987,"line":1042},[929,2573,1600],{"class":1599},[929,2575,1507],{"class":1603},[929,2577,1607],{"class":1599},[929,2579,1276],{"class":1034},[929,2581,1612],{"class":1006},[929,2583,1649],{"class":1010},[929,2585,1607],{"class":1006},[929,2587,1142],{"class":935},[929,2589,2590,2592,2594,2596,2598,2600,2602],{"class":987,"line":1058},[929,2591,1600],{"class":1599},[929,2593,1660],{"class":1603},[929,2595,1607],{"class":1599},[929,2597,1276],{"class":1034},[929,2599,1612],{"class":1006},[929,2601,1669],{"class":1010},[929,2603,1672],{"class":1006},[929,2605,2606],{"class":987,"line":1080},[929,2607,1183],{"class":935},[856,2609,1679],{},[977,2611,2612],{"className":925,"code":1682,"language":926,"meta":927,"style":927},[860,2613,2614,2626,2634,2638,2642,2656,2674,2702],{"__ignoreMap":927},[929,2615,2616,2618,2620,2622,2624],{"class":987,"line":988},[929,2617,1689],{"class":1026},[929,2619,1692],{"class":935},[929,2621,1695],{"class":1038},[929,2623,1698],{"class":1038},[929,2625,1701],{"class":1010},[929,2627,2628,2630,2632],{"class":987,"line":1017},[929,2629,1707],{"class":1706},[929,2631,1276],{"class":1026},[929,2633,1712],{"class":1010},[929,2635,2636],{"class":987,"line":1023},[929,2637,1020],{"emptyLinePlaceholder":8},[929,2639,2640],{"class":987,"line":1042},[929,2641,1130],{"class":935},[929,2643,2644,2646,2648,2650,2652,2654],{"class":987,"line":1058},[929,2645,1725],{"class":1599},[929,2647,1728],{"class":1603},[929,2649,1607],{"class":1599},[929,2651,1276],{"class":1034},[929,2653,1735],{"class":1138},[929,2655,1142],{"class":935},[929,2657,2658,2660,2662,2664,2666,2668,2670,2672],{"class":987,"line":1080},[929,2659,1725],{"class":1599},[929,2661,1744],{"class":1603},[929,2663,1607],{"class":1599},[929,2665,1276],{"class":1034},[929,2667,1612],{"class":1006},[929,2669,1753],{"class":1010},[929,2671,1607],{"class":1006},[929,2673,1142],{"class":935},[929,2675,2676,2678,2680,2682,2684,2686,2688,2690,2692,2694,2696,2698,2700],{"class":987,"line":1085},[929,2677,1725],{"class":1599},[929,2679,1764],{"class":1603},[929,2681,1607],{"class":1599},[929,2683,1276],{"class":1034},[929,2685,994],{"class":935},[929,2687,1607],{"class":1599},[929,2689,1365],{"class":1603},[929,2691,1607],{"class":1599},[929,2693,1276],{"class":1034},[929,2695,1612],{"class":1006},[929,2697,1173],{"class":1010},[929,2699,1607],{"class":1006},[929,2701,1178],{"class":935},[929,2703,2704],{"class":987,"line":1789},[929,2705,1183],{"class":935},[856,2707,1794],{},[856,2709,1797],{},[977,2711,2712],{"className":925,"code":1800,"language":926,"meta":927,"style":927},[860,2713,2714,2724,2732,2736,2740,2754,2772,2788],{"__ignoreMap":927},[929,2715,2716,2718,2720,2722],{"class":987,"line":988},[929,2717,1689],{"class":1026},[929,2719,1692],{"class":935},[929,2721,1695],{"class":1038},[929,2723,1813],{"class":1038},[929,2725,2726,2728,2730],{"class":987,"line":1017},[929,2727,1707],{"class":1706},[929,2729,1276],{"class":1026},[929,2731,1712],{"class":1010},[929,2733,2734],{"class":987,"line":1023},[929,2735,1020],{"emptyLinePlaceholder":8},[929,2737,2738],{"class":987,"line":1042},[929,2739,1130],{"class":935},[929,2741,2742,2744,2746,2748,2750,2752],{"class":987,"line":1058},[929,2743,1725],{"class":1599},[929,2745,1728],{"class":1603},[929,2747,1607],{"class":1599},[929,2749,1276],{"class":1034},[929,2751,1842],{"class":1138},[929,2753,1142],{"class":935},[929,2755,2756,2758,2760,2762,2764,2766,2768,2770],{"class":987,"line":1080},[929,2757,1725],{"class":1599},[929,2759,1744],{"class":1603},[929,2761,1607],{"class":1599},[929,2763,1276],{"class":1034},[929,2765,1612],{"class":1006},[929,2767,1753],{"class":1010},[929,2769,1607],{"class":1006},[929,2771,1142],{"class":935},[929,2773,2774,2776,2778,2780,2782,2784,2786],{"class":987,"line":1085},[929,2775,1725],{"class":1599},[929,2777,1232],{"class":1603},[929,2779,1607],{"class":1599},[929,2781,1276],{"class":1034},[929,2783,1612],{"class":1006},[929,2785,1877],{"class":1010},[929,2787,1672],{"class":1006},[929,2789,2790],{"class":987,"line":1789},[929,2791,1183],{"class":935},[948,2793,2794],{},[856,2795,1888,2796,1892],{},[880,2797,1560],{"href":1891},[1243,2799,1896],{"id":1895},[856,2801,1899],{},[907,2803,2804,2808],{},[910,2805,2806,1907],{},[860,2807,1906],{},[910,2809,2810,1913,2812,1917,2814,870,2816,1927,2819,1931,2821],{},[860,2811,1912],{},[860,2813,1916],{},[860,2815,1920],{},[880,2817,1926],{"href":1923,"rel":2818},[1925],[888,2820,1930],{},[907,2822,2823,2827],{},[910,2824,2825,1938],{},[860,2826,1916],{},[910,2828,2829,1943],{},[860,2830,1920],{},[957,2832,1947],{"id":1946},[962,2834,1951],{"id":1950},[1378,2836,2837,2845],{},[1381,2838,2839],{},[1384,2840,2841,2843],{},[1387,2842,1960],{},[1387,2844,1395],{},[1397,2846,2847,2855],{},[1384,2848,2849,2853],{},[1402,2850,2851],{},[860,2852,1906],{},[1402,2854,1973],{},[1384,2856,2857,2861],{},[1402,2858,2859],{},[860,2860,1912],{},[1402,2862,1982],{},[1984,2864,1986],{},{"title":927,"searchDepth":1017,"depth":1017,"links":2866},[2867,2871],{"id":959,"depth":1017,"text":960,"children":2868},[2869,2870],{"id":964,"depth":1023,"text":965},{"id":1565,"depth":1023,"text":1566},{"id":1946,"depth":1017,"text":1947,"children":2872},[2873],{"id":1950,"depth":1023,"text":1951},{},{"title":187,"description":1996},1780436286065]