[{"data":1,"prerenderedAt":7},["ShallowReactive",2],{"code:txt:1qjbvbj":3,"code:ts:pa6d8m":4,"code:python:fkayzf":5,"code:go:1ve2dng":6},"\u003Cpre class=\"shiki ipscope\" style=\"background-color:var(--shiki-background);color:var(--shiki-foreground)\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan>Input IP Stream (Iterable \u002F AsyncIterable \u002F Channel \u002F Stream)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>   |\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>   v\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>[ Stage 1: Lazy 100-IP Chunking Window ]\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>   |  Pulls at most 100 IPs at a time from the caller's stream\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>   v\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>[ Stage 2: Bounded O(1) LRU Cache &#x26; Intra-Batch Deduplicator ]\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>   |  1. Satisfies hot IPs immediately from in-memory LRU cache (0 network calls)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>   |  2. Deduplicates repeated IPs inside the current 100-IP window\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>   v\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>[ Stage 3: Single POST \u002Fv1\u002Fip\u002Fbatch HTTP\u002F2 Request ]\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>   |  Sends only the unique cache-miss IPs, populates LRU cache,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>   |  and reconstructs the 100-item BatchLookupResponse in original order\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>   v\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan>Yields BatchLookupResponse to caller (Steady-State Heap &#x3C; 350 KB)\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki ipscope\" style=\"background-color:var(--shiki-background);color:var(--shiki-foreground)\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">import\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> { createReadStream\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> createWriteStream } \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">from\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> 'node:fs'\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">import\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> { createInterface } \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">from\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> 'node:readline'\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">import\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> { IpScopeClient } \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">from\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> '@ipscope\u002Fsdk-node'\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">const\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> client\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> =\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> new\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\"> IpScopeClient\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">({\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">  apiKey\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> process\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">env\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">IPSCOPE_KEY\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">!\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">  maxCacheEntries\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> 8192\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">  cacheTtlMs\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> 300_000\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-comment)\"> \u002F\u002F 5-minute TTL for log enrichment runs\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">  timeoutMs\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> 10_000\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">  maxRetries\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> 3\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">});\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">async\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> function*\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\"> extractIpsFromLog\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(filePath\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> string\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">)\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\"> AsyncGenerator\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">&#x3C;\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">string\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">> {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">  const\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> rl\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> =\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\"> createInterface\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">({\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">    input\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\"> createReadStream\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(filePath\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> { encoding\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> 'utf8'\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> })\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">    crlfDelay\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> Infinity\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">  });\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">  for\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> await\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> (\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">const\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> line\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> of\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> rl) {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">    const\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> trimmed\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> =\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> line\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">.trim\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">();\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">    if\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> (\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">!\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">trimmed \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">||\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> trimmed\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">.startsWith\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">'#'\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">)) \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">continue\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-comment)\">    \u002F\u002F Extract first whitespace-delimited token (e.g. NGINX $remote_addr)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">    const\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> firstSpace\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> =\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> trimmed\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">.indexOf\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">' '\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">);\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">    const\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> ip\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> =\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> firstSpace \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">===\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> -\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">1\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> ?\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> trimmed \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> trimmed\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">.slice\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">0\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> firstSpace);\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">    yield\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> ip;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">  }\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">async\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> function\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\"> enrichAccessLog\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(inputPath\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> string\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> outputPath\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> string\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">)\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\"> Promise\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">&#x3C;\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">void\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">> {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">  const\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> out\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> =\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\"> createWriteStream\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(outputPath\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> { encoding\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> 'utf8'\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> });\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">  let\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> totalEnriched \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> 0\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">  for\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> await\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> (\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">const\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> batch\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> of\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> client\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">.lookupBatchStream\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">extractIpsFromLog\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(inputPath))) {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">    for\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> (\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">const\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> record\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> of\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> batch\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">.results) {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">      const\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> row\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> =\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> JSON\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">.stringify\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">({\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">        ip\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> record\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">.ip\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">        country\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> record\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">geo\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">.physical_country_code\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">        declared_country\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> record\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">geo\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">.declared_country_code\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">        asn\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> record\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">network\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">.asn\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">        org\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> record\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">network\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">.organization\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">        is_vpn\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> record\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">security\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">.is_vpn\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">        is_proxy\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> record\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">security\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">.is_proxy\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">        velocity\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> record\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">security_extensions\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">?.abuse_velocity_score \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">??\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> 0\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">      });\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">      if\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> (\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">!\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">out\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">.write\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(row \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">+\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> '\\n'\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">)) {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">        await\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> new\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> Promise\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">&#x3C;\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">void\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">>((resolve) \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">=>\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> out\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">.once\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">'drain'\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> resolve));\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">      }\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">    }\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">    totalEnriched \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">+=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> batch\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">.count;\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">  }\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-constant)\">  out\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">.end\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">();\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-constant)\">  console\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">.log\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">`Successfully enriched \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">${\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">totalEnriched\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">}\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> log lines.`\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">);\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-function)\">enrichAccessLog\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">'\u002Fvar\u002Flog\u002Fnginx\u002Faccess.log'\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> '\u002Ftmp\u002Fenriched.ndjson'\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">)\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">.catch\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">console\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">.error);\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki ipscope\" style=\"background-color:var(--shiki-background);color:var(--shiki-foreground)\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">import\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> asyncio\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">import\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> json\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">import\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> os\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">from\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> collections\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">abc \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">import\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> AsyncIterator\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">from\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> ipscope \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">import\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> AsyncIpScopeClient\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">async\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> def\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\"> iter_log_ips\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-parameter)\">log_path\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> str\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">) \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">->\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> AsyncIterator\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">[\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">str\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">]\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">    with\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\"> open\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">(log_path, \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"r\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">, encoding\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"utf-8\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">)\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> as\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> fh\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">        for\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> line \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">in\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> fh\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">            ip \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> line\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">strip\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">().\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">split\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">(\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\" \"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">, \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">1\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">)\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">[\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">0\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">]\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">            if\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> ip \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">and\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> not\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> ip\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">startswith\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">(\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"#\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">):\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">                yield\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> ip\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">async\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> def\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\"> enrich_siem_export\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-parameter)\">log_path\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">:\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> str\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">) \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">->\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> None\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">    async\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> with\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\"> AsyncIpScopeClient\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">(\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-punctuation)\">        api_key\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">os.environ[\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"IPSCOPE_KEY\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">],\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-punctuation)\">        max_cache_entries\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">8192\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-punctuation)\">        cache_ttl_seconds\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">300.0\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-punctuation)\">    )\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> as\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> client\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">        flagged_count \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> 0\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">        total_count \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> 0\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">        async\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> for\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> batch \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">in\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> client\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">lookup_batch_stream\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">(\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">iter_log_ips\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">(log_path)):\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">            total_count \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">+=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> batch\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">[\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"count\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">]\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">            for\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> item \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">in\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> batch\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">[\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"results\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">]:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">                sec \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> item\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">[\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"security\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">]\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">                ext \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> item\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">get\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">(\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"security_extensions\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">)\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> or\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\"> {}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">                if\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> sec\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">[\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"is_vpn\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">]\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> or\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> sec\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">[\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"is_proxy\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">]\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> or\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> ext\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">get\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">(\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"abuse_velocity_score\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">, \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">0\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">)\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> >=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> 70\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">                    flagged_count \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">+=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> 1\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-function)\">                    print\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">(\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-punctuation)\">                        json.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">dumps\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">(\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-punctuation)\">                            {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-string-expression)\">                                \"ip\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">: item[\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"ip\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">],\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-string-expression)\">                                \"country\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">: item[\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"geo\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">][\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"physical_country_code\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">],\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-string-expression)\">                                \"asn\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">: item[\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"network\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">][\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"asn\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">],\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-string-expression)\">                                \"anonymizer_type\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">: sec[\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"anonymizer_type\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">],\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-string-expression)\">                                \"reason_codes\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">: sec[\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"reason_codes\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">],\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-string-expression)\">                                \"abuse_velocity_score\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">: ext.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">get\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">(\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"abuse_velocity_score\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">, \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">0\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">),\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-punctuation)\">                            }\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-punctuation)\">                        )\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-punctuation)\">                    )\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-function)\">        print\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">(\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">f\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"Processed \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">{\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">total_count\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">}\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> IPs (\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">{\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">flagged_count\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">}\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> flagged).\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">if\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> __name__\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> ==\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> \"__main__\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">    asyncio\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">run\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">(\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">enrich_siem_export\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">(\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"\u002Fvar\u002Flog\u002Fauth-ips.txt\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-punctuation)\">))\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>","\u003Cpre class=\"shiki ipscope\" style=\"background-color:var(--shiki-background);color:var(--shiki-foreground)\" tabindex=\"0\">\u003Ccode>\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">package\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\"> main\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">import\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> (\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\t\"bufio\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\t\"context\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\t\"fmt\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\t\"log\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\t\"os\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\t\"strings\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\t\"time\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">\tipscope \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"github.com\u002Fbadele-llc\u002Fipscope-go\"\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">func\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\"> streamFileIps\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(ctx \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">context\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">Context\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">, path \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">string\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">) (\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">&#x3C;-chan\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> string\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">, \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">error\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">) {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">\tfile, err \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">:=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> os.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">Open\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(path)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">\tif\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> err \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">!=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> nil\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">\t\treturn\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> nil\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">, err\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">\t}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">\tout \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">:=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\"> make\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">chan\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> string\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">, \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">256\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">\tgo\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> func\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">() {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">\t\tdefer\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\"> close\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(out)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">\t\tdefer\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> file.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">Close\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">()\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">\t\tscanner \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">:=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> bufio.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">NewScanner\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(file)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">\t\tfor\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> scanner.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">Scan\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">() {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">\t\t\tip \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">:=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> strings.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">TrimSpace\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(scanner.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">Text\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">())\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">\t\t\tif\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> ip \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">==\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> \"\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> ||\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> strings.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">HasPrefix\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(ip, \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"#\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">) {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">\t\t\t\tcontinue\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">\t\t\t}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">\t\t\tselect\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">\t\t\tcase\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> out \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">&#x3C;-\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> ip:\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">\t\t\tcase\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> &#x3C;-\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">ctx.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">Done\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">():\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">\t\t\t\treturn\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">\t\t\t}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">\t\t}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">\t}()\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">\treturn\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> out, \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">nil\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">func\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\"> main\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">() {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">\tctx, cancel \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">:=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> context.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">WithTimeout\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(context.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">Background\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(), \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">10\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">*\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">time.Minute)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">\tdefer\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\"> cancel\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">()\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">\tclient \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">:=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> ipscope.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">NewClient\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">\t\tos.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">Getenv\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"IPSCOPE_KEY\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">),\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">\t\tipscope.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">WithCache\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">8192\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">, \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">5\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">*\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">time.Minute),\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">\t)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">\tipChan, err \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">:=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\"> streamFileIps\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(ctx, \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"\u002Fvar\u002Flog\u002Ffirewall-ips.txt\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">\tif\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> err \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">!=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> nil\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">\t\tlog.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">Fatal\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(err)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">\t}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">\tvar\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> total \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">int\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">\tfor\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> batchRes \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">:=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> range\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> client.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">LookupBatchStream\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(ctx, ipChan, \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">100\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">) {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">\t\tif\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> batchRes.Err \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">!=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\"> nil\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">\t\t\tlog.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">Fatalf\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"batch stream error: \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">%v\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">, batchRes.Err)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">\t\t}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">\t\ttotal \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">+=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> batchRes.Response.Count\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">\t\tfor\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> _, item \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">:=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\"> range\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> batchRes.Response.Results {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-token-keyword)\">\t\t\tif\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> item.Security.IsTorExit \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-keyword)\">||\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\"> item.Security.IsProxy {\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">\t\t\t\tfmt.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">Printf\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"Blocked \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">%s\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> (\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">%s\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">) reasons=\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">%v\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\\n\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">,\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">\t\t\t\t\titem.IP, item.Security.AnonymizerType, item.Security.ReasonCodes)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">\t\t\t}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">\t\t}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">\t}\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">\tfmt.\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-function)\">Printf\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">(\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\">\"Enriched \u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-constant)\">%d\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-token-string-expression)\"> IPs cleanly\\n\"\u003C\u002Fspan>\u003Cspan style=\"color:var(--shiki-foreground)\">, total)\u003C\u002Fspan>\u003C\u002Fspan>\n\u003Cspan class=\"line\">\u003Cspan style=\"color:var(--shiki-foreground)\">}\u003C\u002Fspan>\u003C\u002Fspan>\u003C\u002Fcode>\u003C\u002Fpre>",1793226491655]