<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>ChatGPT on KnightLi Blog</title>
        <link>https://knightli.com/en/tags/chatgpt/</link>
        <description>Recent content in ChatGPT on KnightLi Blog</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>en</language>
        <lastBuildDate>Thu, 21 May 2026 08:33:14 +0800</lastBuildDate><atom:link href="https://knightli.com/en/tags/chatgpt/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>After Google I/O, Should You Subscribe to GPT or Gemini? A Comparison for Regular Users and Developers</title>
        <link>https://knightli.com/en/2026/05/21/gpt-vs-gemini-subscription-after-google-io-2026/</link>
        <pubDate>Thu, 21 May 2026 08:33:14 +0800</pubDate>
        
        <guid>https://knightli.com/en/2026/05/21/gpt-vs-gemini-subscription-after-google-io-2026/</guid>
        <description>&lt;p&gt;After Google I/O 2026, choosing an AI subscription has become more complicated.&lt;/p&gt;
&lt;p&gt;The old question was simpler: for writing, Q&amp;amp;A, coding, and file analysis, most people looked at ChatGPT first; if they were deeply tied to Google Search, Android, Gmail, Docs, or YouTube, they would then consider Gemini. That has changed. At I/O, Google put Gemini 3.5 Flash, Gemini Omni, Antigravity 2.0, Gemini API Managed Agents, Google AI Studio, and AI Ultra into one broader subscription story. Gemini is no longer just an optional alternative; it has become a serious competing ecosystem.&lt;/p&gt;
&lt;p&gt;This article does not compare abstract benchmark scores. It answers a practical question: should regular users, developers, content creators, and enterprise users subscribe to GPT / ChatGPT, or to Gemini / Google AI?&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Note: AI subscription prices, quotas, regions, and model availability change quickly. This article was written on May 21, 2026. Before subscribing, always check the current OpenAI and Google pages.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;the-short-answer&#34;&gt;The Short Answer
&lt;/h2&gt;&lt;p&gt;If you only want one primary subscription, use this logic:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Daily writing, Q&amp;amp;A, file analysis, office work, and mixed Chinese-English tasks: prioritize ChatGPT Plus.&lt;/li&gt;
&lt;li&gt;Heavy coding, Codex usage, complex reasoning, and project-level code tasks: prioritize ChatGPT Plus / Pro, then decide whether to upgrade based on quota.&lt;/li&gt;
&lt;li&gt;Deep use of the Google ecosystem, including Gmail, Docs, Drive, Android, and Search: prioritize Gemini / Google AI Pro.&lt;/li&gt;
&lt;li&gt;Video, AI imagery, Google Flow, YouTube Shorts, and Gemini Omni: prioritize Google AI Pro / Ultra.&lt;/li&gt;
&lt;li&gt;Antigravity, Gemini API Managed Agents, and workflows from AI Studio to Android: focus on Google AI Pro / Ultra.&lt;/li&gt;
&lt;li&gt;Enterprise teams: do not compare only personal plans; look at Business / Enterprise, Workspace, permissions, audit, and data boundaries.&lt;/li&gt;
&lt;li&gt;Limited budget: one paid primary subscription plus another platform&amp;rsquo;s free tier or pay-as-you-go API is usually better than two high-end subscriptions.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In one sentence: GPT is still the stronger default productivity and coding assistant; after Google I/O, Gemini looks more like a system-level AI suite inside the Google ecosystem.&lt;/p&gt;
&lt;h2 id=&#34;what-changed-for-gemini-after-google-io&#34;&gt;What Changed for Gemini After Google I/O
&lt;/h2&gt;&lt;p&gt;Google I/O 2026 made Gemini&amp;rsquo;s value depend on much more than the Gemini App itself.&lt;/p&gt;
&lt;p&gt;Several changes matter:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Gemini 3.5 Flash&lt;/code&gt;: Google positions it as a fast model for prompt-to-action workflows and real agent tasks.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Gemini Omni&lt;/code&gt;: creates content from arbitrary input, currently starting with video, with multimodal creation and natural-language iterative editing.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Google Antigravity 2.0&lt;/code&gt;: an agent-first development platform for multi-agent orchestration and coding.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Gemini API Managed Agents&lt;/code&gt;: lets developers create hosted agents that can reason, use tools, and execute code through the API.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Google AI Studio&lt;/code&gt;: moves from a prompt playground toward mobile, Android native app generation, and Antigravity project export.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Google AI Ultra&lt;/code&gt;: a new $100/month tier after I/O, aimed at developers, technical leads, knowledge workers, and advanced creators.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;More importantly, Google moved Gemini App usage from traditional daily prompt limits toward a &lt;code&gt;compute-used&lt;/code&gt; model. Complex video, code, and long-context tasks consume more quota, while simple text tasks consume less. Quotas refresh every five hours until weekly limits are reached.&lt;/p&gt;
&lt;p&gt;That shows Google is trying to package Gemini subscriptions as an entry point for &amp;ldquo;model + app + creation + development tools + Google ecosystem.&amp;rdquo;&lt;/p&gt;
&lt;h2 id=&#34;who-is-chatgpt--gpt-best-for-now&#34;&gt;Who Is ChatGPT / GPT Best For Now?
&lt;/h2&gt;&lt;p&gt;ChatGPT remains very strong, especially for people who treat AI as a daily workhorse.&lt;/p&gt;
&lt;p&gt;According to OpenAI&amp;rsquo;s current pricing page and help documentation, ChatGPT Free includes basic capabilities such as GPT-5.5 Instant. Plus provides GPT-5.5 Thinking, higher message and upload limits, stronger image generation, deep research, agent mode, projects, tasks, custom GPTs, and expanded Codex usage. Pro provides higher limits, GPT-5.5 Pro, higher Codex usage, and the largest deep research and agent mode capacity.&lt;/p&gt;
&lt;p&gt;ChatGPT is especially suitable for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Writing, summarizing, translation, and editing.&lt;/li&gt;
&lt;li&gt;Complex Q&amp;amp;A and structured analysis.&lt;/li&gt;
&lt;li&gt;File upload, spreadsheet analysis, and research reports.&lt;/li&gt;
&lt;li&gt;Coding Q&amp;amp;A, code review, and refactoring advice.&lt;/li&gt;
&lt;li&gt;Using Codex for repository-level tasks.&lt;/li&gt;
&lt;li&gt;Multilingual content production.&lt;/li&gt;
&lt;li&gt;Users who care about model quality and response stability but are not deeply tied to Google products.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For regular users, ChatGPT Plus is still the safest primary subscription. It covers a wide range of work, has a low learning curve, and handles Chinese and English tasks evenly.&lt;/p&gt;
&lt;p&gt;For developers, the key part of ChatGPT is not only chat, but Codex. OpenAI&amp;rsquo;s help documentation says Codex can be used with eligible ChatGPT plans, with usage limits varying by plan. If you use Codex heavily for code edits, PRs, refactoring, or test fixes, you need to include Codex quota in your subscription decision.&lt;/p&gt;
&lt;h2 id=&#34;who-is-gemini--google-ai-best-for-now&#34;&gt;Who Is Gemini / Google AI Best For Now?
&lt;/h2&gt;&lt;p&gt;After Google I/O, Gemini&amp;rsquo;s advantage is clearer: it is more deeply bound to the Google ecosystem.&lt;/p&gt;
&lt;p&gt;Google AI subscriptions are no longer only model quota inside the Gemini App. They also include Gemini Omni, Google Flow, Antigravity, AI Studio, some YouTube Premium / Lite benefits, and Workspace / Android / Search ecosystem capabilities. Google also expanded AI Ultra into a $100 and higher-tier subscription line, emphasizing developers, technical leads, knowledge workers, and advanced creators.&lt;/p&gt;
&lt;p&gt;Gemini is especially suitable if:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You deeply use Gmail, Docs, Drive, Sheets, Slides, and Android.&lt;/li&gt;
&lt;li&gt;You want AI inside Google Search, YouTube, and Workspace.&lt;/li&gt;
&lt;li&gt;You care about Gemini Omni, Google Flow, video generation, and video editing.&lt;/li&gt;
&lt;li&gt;You want to try Antigravity, Gemini API Managed Agents, and AI Studio mobile.&lt;/li&gt;
&lt;li&gt;You need ultra-long-context document understanding.&lt;/li&gt;
&lt;li&gt;You build Google ecosystem apps, Android native apps, or Workspace automation.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Google&amp;rsquo;s help page says Gemini Apps context windows increase with subscription level: 32K without an AI plan, 128K with AI Plus, and 1 million with AI Pro and AI Ultra. AI Pro / Ultra also provides higher usage limits, more features, and some early access capabilities.&lt;/p&gt;
&lt;p&gt;If your work already lives in the Google ecosystem, Gemini&amp;rsquo;s value becomes much larger. Otherwise, subscribing to Gemini only as &amp;ldquo;another chatbot&amp;rdquo; may not be more cost-effective than ChatGPT.&lt;/p&gt;
&lt;h2 id=&#34;how-regular-users-should-choose&#34;&gt;How Regular Users Should Choose
&lt;/h2&gt;&lt;p&gt;The easiest trap for regular users is subscribing to multiple platforms just because a new model was announced.&lt;/p&gt;
&lt;p&gt;A more rational choice starts with your main use case.&lt;/p&gt;
&lt;p&gt;If you mainly do:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Writing.&lt;/li&gt;
&lt;li&gt;Research.&lt;/li&gt;
&lt;li&gt;Summaries.&lt;/li&gt;
&lt;li&gt;Reading PDFs.&lt;/li&gt;
&lt;li&gt;Email.&lt;/li&gt;
&lt;li&gt;Resume editing.&lt;/li&gt;
&lt;li&gt;Language learning.&lt;/li&gt;
&lt;li&gt;Daily Q&amp;amp;A.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Choose ChatGPT Plus first. It is more general-purpose, has clearer task boundaries, and does not require deep ecosystem lock-in.&lt;/p&gt;
&lt;p&gt;If you mainly do:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Heavy Gmail / Docs / Drive / YouTube / Android use.&lt;/li&gt;
&lt;li&gt;Want AI directly inside Google&amp;rsquo;s ecosystem.&lt;/li&gt;
&lt;li&gt;Want to try Gemini App, Daily Brief, Google Search AI, and YouTube content Q&amp;amp;A.&lt;/li&gt;
&lt;li&gt;Need long-context reading of Google documents.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Choose Google AI Pro first.&lt;/p&gt;
&lt;p&gt;If you are a light user, start with the free tiers on both platforms and pay only after you clearly hit limits. Do not subscribe to a high-end plan just because you might use it someday.&lt;/p&gt;
&lt;h2 id=&#34;how-developers-should-choose&#34;&gt;How Developers Should Choose
&lt;/h2&gt;&lt;p&gt;Developers fall into two broad groups.&lt;/p&gt;
&lt;p&gt;The first group mainly asks coding questions, fixes bugs, writes scripts, and reads repositories. For them, start with ChatGPT Plus / Pro + Codex.&lt;/p&gt;
&lt;p&gt;Reasons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Codex is tied to the ChatGPT account.&lt;/li&gt;
&lt;li&gt;ChatGPT is stable for code explanation, refactoring, tests, and error analysis.&lt;/li&gt;
&lt;li&gt;Plus already covers many daily development tasks.&lt;/li&gt;
&lt;li&gt;Pro is better for high-frequency, long-running, complex repository tasks.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The second group builds around the Google ecosystem, agent platforms, Android, Workspace, or Gemini API. For them, start with Google AI Pro / Ultra.&lt;/p&gt;
&lt;p&gt;Reasons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Gemini 3.5 Flash is a key post-I/O model for agent workflows.&lt;/li&gt;
&lt;li&gt;Antigravity 2.0 is Google&amp;rsquo;s agent-first development platform.&lt;/li&gt;
&lt;li&gt;Managed Agents can create tool-using agents with isolated Linux environments through the API.&lt;/li&gt;
&lt;li&gt;AI Studio connects more naturally with Android, Workspace, and Antigravity.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For full-stack developers, the most practical combination is usually:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ChatGPT Plus as the main tool for daily code and documentation.&lt;/li&gt;
&lt;li&gt;Gemini free tier or AI Pro for Google ecosystem tasks, long context, and new video / agent capabilities.&lt;/li&gt;
&lt;li&gt;Use APIs pay-as-you-go, and do not treat a personal subscription as a production API budget.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;how-content-creators-should-choose&#34;&gt;How Content Creators Should Choose
&lt;/h2&gt;&lt;p&gt;For content creators, the answer depends on what you create.&lt;/p&gt;
&lt;p&gt;If you mainly do:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Copywriting.&lt;/li&gt;
&lt;li&gt;Headlines.&lt;/li&gt;
&lt;li&gt;Scripts.&lt;/li&gt;
&lt;li&gt;Articles.&lt;/li&gt;
&lt;li&gt;Image-and-text content.&lt;/li&gt;
&lt;li&gt;Research organization.&lt;/li&gt;
&lt;li&gt;Multilingual rewriting.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ChatGPT Plus is still very reliable.&lt;/p&gt;
&lt;p&gt;If you mainly do:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Video generation.&lt;/li&gt;
&lt;li&gt;Short-video ideas.&lt;/li&gt;
&lt;li&gt;AI imagery.&lt;/li&gt;
&lt;li&gt;YouTube Shorts.&lt;/li&gt;
&lt;li&gt;Google Flow workflows.&lt;/li&gt;
&lt;li&gt;Multimodal asset assembly.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Gemini / Google AI Pro or Ultra deserves more attention. After I/O, Gemini Omni and Google Flow are Google&amp;rsquo;s core offerings for creation.&lt;/p&gt;
&lt;p&gt;If your budget is limited, subscribe to one text-first primary tool, then use the other platform&amp;rsquo;s free tier or a short-term subscription to test video capabilities. Video model quotas, queues, duration, resolution, and regional limits change quickly, so do not plan long-term production around them too early.&lt;/p&gt;
&lt;h2 id=&#34;how-enterprises-and-teams-should-choose&#34;&gt;How Enterprises and Teams Should Choose
&lt;/h2&gt;&lt;p&gt;Enterprises should not choose like individual users.&lt;/p&gt;
&lt;p&gt;What enterprises really need to examine is not &amp;ldquo;which model is stronger this week,&amp;rdquo; but:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Whether data is used for training.&lt;/li&gt;
&lt;li&gt;Whether SSO, MFA, and RBAC are available.&lt;/li&gt;
&lt;li&gt;Whether audit logs exist.&lt;/li&gt;
&lt;li&gt;Whether internal knowledge connections are supported.&lt;/li&gt;
&lt;li&gt;Whether plugins, connectors, and agent permissions can be controlled.&lt;/li&gt;
&lt;li&gt;Whether the product meets compliance requirements.&lt;/li&gt;
&lt;li&gt;Whether it integrates with the existing office suite.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If a company already heavily uses Google Workspace, Gemini enterprise plans are naturally worth evaluating. If the team has already built processes around ChatGPT, Codex, OpenAI API, and internal toolchains, OpenAI Business / Enterprise is the more natural fit.&lt;/p&gt;
&lt;p&gt;Engineering teams also need to separately evaluate Codex, Antigravity, Gemini API Managed Agents, MCP, CI/CD, code permissions, repository access, and audit.&lt;/p&gt;
&lt;h2 id=&#34;when-you-need-pro--ultra&#34;&gt;When You Need Pro / Ultra
&lt;/h2&gt;&lt;p&gt;Many people do not actually need a high-end tier.&lt;/p&gt;
&lt;p&gt;Typical signs that you need ChatGPT Pro:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You use ChatGPT for long periods every day.&lt;/li&gt;
&lt;li&gt;Plus limits are often insufficient.&lt;/li&gt;
&lt;li&gt;You use Codex heavily.&lt;/li&gt;
&lt;li&gt;You often run deep research, agent mode, and complex reasoning.&lt;/li&gt;
&lt;li&gt;You need higher-end models such as GPT-5.5 Pro.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Typical signs that you need Google AI Ultra:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You use Gemini, Flow, and Antigravity frequently.&lt;/li&gt;
&lt;li&gt;You need higher Gemini / Antigravity usage limits.&lt;/li&gt;
&lt;li&gt;You create videos, AI imagery, or long-context research.&lt;/li&gt;
&lt;li&gt;You deeply depend on the Google ecosystem and early access to new features.&lt;/li&gt;
&lt;li&gt;You need Gemini Spark, Project Genie, or higher-tier subscription benefits.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you only ask a few questions a day or occasionally write articles or edit code, Plus / Pro or AI Pro / Ultra may not be necessary.&lt;/p&gt;
&lt;h2 id=&#34;the-most-cost-effective-subscription-strategy&#34;&gt;The Most Cost-Effective Subscription Strategy
&lt;/h2&gt;&lt;p&gt;This combination is usually better:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Choose one paid primary subscription first.&lt;/li&gt;
&lt;li&gt;Use the other platform&amp;rsquo;s free tier.&lt;/li&gt;
&lt;li&gt;Pay for API only when you actually need API usage.&lt;/li&gt;
&lt;li&gt;Turn high-consumption features such as video, agents, and deep research on and off monthly instead of subscribing all year blindly.&lt;/li&gt;
&lt;li&gt;Review once a month: did you really use the quota?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Common combinations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;General office work: ChatGPT Plus + Gemini free tier.&lt;/li&gt;
&lt;li&gt;Google ecosystem users: Google AI Pro + ChatGPT free tier.&lt;/li&gt;
&lt;li&gt;Developers: ChatGPT Plus/Pro + Gemini API/AI Studio as needed.&lt;/li&gt;
&lt;li&gt;Video creators: Google AI Pro/Ultra + ChatGPT free tier or Plus.&lt;/li&gt;
&lt;li&gt;Enterprise teams: do not piece together personal plans; evaluate Business / Enterprise / Workspace plans directly.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;checklist-before-subscribing&#34;&gt;Checklist Before Subscribing
&lt;/h2&gt;&lt;p&gt;Before paying, confirm these points:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Is the plan available in your region?&lt;/li&gt;
&lt;li&gt;Is the model you need included in the plan?&lt;/li&gt;
&lt;li&gt;Are Codex, Antigravity, Flow, and Omni actually available?&lt;/li&gt;
&lt;li&gt;Do video features have region, age, queue, or resolution limits?&lt;/li&gt;
&lt;li&gt;Is API usage included in the subscription, or billed separately?&lt;/li&gt;
&lt;li&gt;Do file upload, context window, agent mode, and deep research have limits?&lt;/li&gt;
&lt;li&gt;Do the privacy settings meet your project requirements?&lt;/li&gt;
&lt;li&gt;Do you already have Google One, Workspace, ChatGPT Business, or school / company benefits?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Be especially careful: a personal subscription does not mean free API usage, unlimited commercial use, or enterprise compliance.&lt;/p&gt;
&lt;h2 id=&#34;summary&#34;&gt;Summary
&lt;/h2&gt;&lt;p&gt;After Google I/O, Gemini is much more competitive, especially in video, multimodality, the Google ecosystem, Android, AI Studio, and Antigravity. But ChatGPT remains the steadier general-purpose choice, especially for daily writing, complex Q&amp;amp;A, file analysis, coding assistance, and Codex workflows.&lt;/p&gt;
&lt;p&gt;The simplest judgment is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If you do not know which to choose: start with ChatGPT Plus.&lt;/li&gt;
&lt;li&gt;If you are a deep Google user: choose Google AI Pro.&lt;/li&gt;
&lt;li&gt;If you are a heavy developer: compare Codex and Antigravity against your actual workflow.&lt;/li&gt;
&lt;li&gt;If you are a video creator: look first at Gemini Omni, Flow, and Google AI Pro / Ultra.&lt;/li&gt;
&lt;li&gt;If you are an enterprise user: choose by compliance, permissions, audit, and existing office ecosystem, not model hype.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;More AI subscriptions are not automatically better. The more economical path is to define one primary workflow, then use other platforms as supplements instead of opening a long-term subscription after every product keynote.&lt;/p&gt;
&lt;p&gt;References:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://chatgpt.com/pricing/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;OpenAI: ChatGPT Pricing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://help.openai.com/en/articles/11369540-using-codex-with-your-chatgpt-plan&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;OpenAI Help: Using Codex with your ChatGPT plan&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://blog.google/products-and-platforms/products/google-one/google-ai-subscriptions/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Google Blog: Everything new in Google AI subscriptions from I/O 2026&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://blog.google/innovation-and-ai/technology/developers-tools/google-io-2026-developer-highlights/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Google Blog: I/O 2026 developer highlights&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://support.google.com/gemini/answer/16275805&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Google Help: Gemini Apps limits and upgrades for Google AI subscribers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>How Did AI Agents Evolve? A Complete 2022-2026 Five-Generation Timeline</title>
        <link>https://knightli.com/en/2026/05/16/ai-agent-evolution-2022-2026/</link>
        <pubDate>Sat, 16 May 2026 19:19:52 +0800</pubDate>
        
        <guid>https://knightli.com/en/2026/05/16/ai-agent-evolution-2022-2026/</guid>
        <description>&lt;p&gt;AI Agents did not appear overnight.&lt;/p&gt;
&lt;p&gt;At the end of 2022, ChatGPT was still mainly a chat window. By 2026, agents had begun to gain tool calling, file operations, computer control, long-term memory, remote collaboration, and persistent execution. In four years, they moved from &amp;ldquo;models that answer questions&amp;rdquo; toward &amp;ldquo;digital workers that can move tasks forward.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;If we look at the timeline, AI Agents have roughly gone through five generations. Each generation solved the previous one&amp;rsquo;s core limitation, while creating new bubbles and new safety problems.&lt;/p&gt;
&lt;h2 id=&#34;overview-five-generations-of-agents&#34;&gt;Overview: five generations of Agents
&lt;/h2&gt;&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Stage&lt;/th&gt;
          &lt;th&gt;Time&lt;/th&gt;
          &lt;th&gt;Keyword&lt;/th&gt;
          &lt;th&gt;Capability shift&lt;/th&gt;
          &lt;th&gt;Core problem&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Generation 0&lt;/td&gt;
          &lt;td&gt;Late 2022 - early 2023&lt;/td&gt;
          &lt;td&gt;Chat box&lt;/td&gt;
          &lt;td&gt;Generates text, but cannot act&lt;/td&gt;
          &lt;td&gt;Model and real world are disconnected&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Generation 1&lt;/td&gt;
          &lt;td&gt;Mid-2023 - late 2023&lt;/td&gt;
          &lt;td&gt;Tool calling&lt;/td&gt;
          &lt;td&gt;Outputs structured calls, connects APIs and RAG&lt;/td&gt;
          &lt;td&gt;Open-loop execution and task drift&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Generation 2&lt;/td&gt;
          &lt;td&gt;Late 2023 - 2024&lt;/td&gt;
          &lt;td&gt;Engineered workflows&lt;/td&gt;
          &lt;td&gt;Planning, state, reflection, and multi-agent collaboration&lt;/td&gt;
          &lt;td&gt;Workflows are easy to copy; low-code bubble&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Generation 3&lt;/td&gt;
          &lt;td&gt;2024 - 2025&lt;/td&gt;
          &lt;td&gt;Computer Use&lt;/td&gt;
          &lt;td&gt;Sees screens, clicks, and operates GUIs&lt;/td&gt;
          &lt;td&gt;Permission, safety, and misoperation risks&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Generation 4&lt;/td&gt;
          &lt;td&gt;2025 - 2026&lt;/td&gt;
          &lt;td&gt;MCP / Skills / persistence&lt;/td&gt;
          &lt;td&gt;Tool networks, long-term context, and professional skills&lt;/td&gt;
          &lt;td&gt;Persistent execution expands the risk radius&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Generation 5 preview&lt;/td&gt;
          &lt;td&gt;After 2026&lt;/td&gt;
          &lt;td&gt;Loops and world models&lt;/td&gt;
          &lt;td&gt;Stronger memory, validation, and physical action&lt;/td&gt;
          &lt;td&gt;Governance becomes harder&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;late-2022-generation-0-the-chatgpt-chat-box-era&#34;&gt;Late 2022: Generation 0, the ChatGPT chat-box era
&lt;/h2&gt;&lt;p&gt;Generation 0 begins with the release of ChatGPT on November 30, 2022.&lt;/p&gt;
&lt;p&gt;This generation was not yet a real Agent. It had strong language generation ability, but it was mostly trapped in a chat box. It could write Python code, but not run it on your computer. It could plan a trip, but not book tickets. It could tell you how to edit a file, but not enter the file system and make the change.&lt;/p&gt;
&lt;p&gt;Its capability boundary was clear:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;understand natural language;&lt;/li&gt;
&lt;li&gt;generate articles, answers, code, and plans;&lt;/li&gt;
&lt;li&gt;no active access to fresh data;&lt;/li&gt;
&lt;li&gt;no stable access to internal company knowledge;&lt;/li&gt;
&lt;li&gt;no external action;&lt;/li&gt;
&lt;li&gt;no long-term task state.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The core issue was the break between model capability and the real world. It could think and speak, but not act.&lt;/p&gt;
&lt;p&gt;This stage also produced the first bubble: prompt engineers, prompt template markets, prompt courses, and prompt certifications. Early models were indeed sensitive to prompts, but the market mistook a temporary patch for a long-term moat.&lt;/p&gt;
&lt;p&gt;As GPT-4-level models, system prompts, function calling, and better product defaults matured, many prompt templates lost scarcity. This pattern would repeat: a new capability creates a middle layer; the next generation internalizes it; the middle layer evaporates.&lt;/p&gt;
&lt;h2 id=&#34;mid-2023-generation-1-tool-calling-wakes-up&#34;&gt;Mid-2023: Generation 1, tool calling wakes up
&lt;/h2&gt;&lt;p&gt;The keyword for Generation 1 is tool calling.&lt;/p&gt;
&lt;p&gt;In June 2023, OpenAI released &lt;code&gt;function calling&lt;/code&gt;. Developers could describe function names, purposes, parameter types, and &lt;code&gt;JSON Schema&lt;/code&gt;. After understanding a user request, the model could output a structured JSON call instead of ordinary natural language, and an external system would execute it.&lt;/p&gt;
&lt;p&gt;The architectural significance was large: the model started moving from a brain that only talks to a brain that can drive external tools.&lt;/p&gt;
&lt;p&gt;Key capabilities included:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;choosing tools based on user intent;&lt;/li&gt;
&lt;li&gt;outputting structured arguments;&lt;/li&gt;
&lt;li&gt;calling external APIs;&lt;/li&gt;
&lt;li&gt;feeding API results back into the model;&lt;/li&gt;
&lt;li&gt;using RAG to access external knowledge;&lt;/li&gt;
&lt;li&gt;forming early personas through plugins and knowledge bases.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;At the same time, &lt;code&gt;RAG&lt;/code&gt; and vector databases became popular. They addressed the model&amp;rsquo;s lack of fresh information, private enterprise materials, and internal knowledge. The system retrieved relevant document chunks, injected them into context, and let the model answer from those materials.&lt;/p&gt;
&lt;p&gt;The basic Agent structure became:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;who you are: system prompt and persona;&lt;/li&gt;
&lt;li&gt;what you know: knowledge base, RAG, private documents;&lt;/li&gt;
&lt;li&gt;what you can do: function calling, plugins, external APIs.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The most dramatic bubble of this generation was AutoGPT. It showed an attractive idea: the user gives a broad goal, and AI breaks it down, searches, writes files, evaluates, loops, and stops when it believes the work is done.&lt;/p&gt;
&lt;p&gt;But AutoGPT quickly exposed the problem. It lacked state constraints, stopping conditions, and reliable feedback. Tasks drifted, APIs were called with bad arguments again and again, and bills could be burned by huge numbers of model calls. The lesson was simple: tools plus an infinite loop do not make a production-grade Agent.&lt;/p&gt;
&lt;h2 id=&#34;late-2023-to-2024-generation-2-engineered-workflows&#34;&gt;Late 2023 to 2024: Generation 2, engineered workflows
&lt;/h2&gt;&lt;p&gt;AutoGPT&amp;rsquo;s failure taught the industry that models cannot simply be left to improvise. Complex tasks need structure.&lt;/p&gt;
&lt;p&gt;Generation 2 is about engineered workflows. An Agent became not just one model call, but a software system with state, control flow, and evaluation.&lt;/p&gt;
&lt;p&gt;Key capabilities included:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;task planning: breaking large goals into steps;&lt;/li&gt;
&lt;li&gt;state management: tracking where work stands;&lt;/li&gt;
&lt;li&gt;reflection and revision: generating, reviewing, and improving;&lt;/li&gt;
&lt;li&gt;tool orchestration: switching between tools;&lt;/li&gt;
&lt;li&gt;human-in-the-loop: asking for confirmation at key points;&lt;/li&gt;
&lt;li&gt;multi-agent collaboration: dividing roles.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A typical pattern is &lt;code&gt;ReAct&lt;/code&gt;, or &lt;code&gt;Reasoning + Acting&lt;/code&gt;. The model reasons, calls a tool, observes the result, and then reasons again. The Agent no longer acts blindly; each step has auditable logic and feedback.&lt;/p&gt;
&lt;p&gt;Common &lt;code&gt;agentic workflow&lt;/code&gt; patterns emerged:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;reflection: generate, review, revise;&lt;/li&gt;
&lt;li&gt;tool use: choose search, databases, code execution, and enterprise APIs;&lt;/li&gt;
&lt;li&gt;planning: decompose goals and track state;&lt;/li&gt;
&lt;li&gt;multi-agent collaboration: product, developer, tester, reviewer roles.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The value of Generation 2 was putting model capability inside a controllable process. A well-designed workflow can sometimes make a smaller model produce more stable results than a single large-model call.&lt;/p&gt;
&lt;p&gt;This generation also produced the low-code Agent platform bubble. Many tools used drag-and-drop interfaces to combine prompts, RAG, plugins, and flows. They lowered the building barrier, but if a workflow can be copied cheaply, the platform itself has a weak moat.&lt;/p&gt;
&lt;p&gt;Low-code tools can capture early demand, but a demand window is not a defensible wall.&lt;/p&gt;
&lt;h2 id=&#34;2024-to-2025-generation-3-computer-use-reaches-real-interfaces&#34;&gt;2024 to 2025: Generation 3, Computer Use reaches real interfaces
&lt;/h2&gt;&lt;p&gt;The keyword for Generation 3 is &lt;code&gt;Computer Use&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Earlier tool calling relied mostly on APIs. What an Agent could do depended on what developers had connected. But many real-world apps do not have clean APIs, or their APIs are incomplete, closed, or inconsistent.&lt;/p&gt;
&lt;p&gt;Computer Use lets models look at screens, click, and operate GUIs. The general computer interface itself becomes a tool.&lt;/p&gt;
&lt;p&gt;Key capabilities included:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;recognizing screen content;&lt;/li&gt;
&lt;li&gt;clicking buttons, typing text, switching windows;&lt;/li&gt;
&lt;li&gt;operating web and desktop software;&lt;/li&gt;
&lt;li&gt;reading repositories, editing files, running tests;&lt;/li&gt;
&lt;li&gt;inspecting terminal output and errors;&lt;/li&gt;
&lt;li&gt;behaving more like a real engineering assistant.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This pushed Agents from &amp;ldquo;using connected tools&amp;rdquo; toward &amp;ldquo;operating software like a person.&amp;rdquo; It also made coding agents closer to real workflows: read a project, change code, run tests, and continue from errors.&lt;/p&gt;
&lt;p&gt;But the trust boundary expanded. If AI operates a computer, it can click the wrong button, delete the wrong file, submit the wrong form, or be manipulated by webpage text, documents, and UI instructions. Prompt injection becomes a file-operation, permission, and system-safety problem.&lt;/p&gt;
&lt;p&gt;Vibe coding debates also concentrated in this stage. Fast AI-generated projects feel exciting, but without tests, evaluation, permissions, and deployment boundaries, fast prototypes can become fast incidents.&lt;/p&gt;
&lt;p&gt;Generation 3&amp;rsquo;s lesson: the closer an Agent gets to real operations, the more it needs sandboxing, approvals, rollback, and least privilege.&lt;/p&gt;
&lt;h2 id=&#34;2025-to-2026-generation-4-mcp-skills-and-persistent-digital-workers&#34;&gt;2025 to 2026: Generation 4, MCP, Skills, and persistent digital workers
&lt;/h2&gt;&lt;p&gt;Generation 4 is about persistence, connection, memory, and specialization.&lt;/p&gt;
&lt;p&gt;The focus is not only stronger single tasks. Agents start to have long-term context, tool networks, professional skills, and a sense of time. They become less like helpers in one chat and more like digital workers that can continue working.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;MCP&lt;/code&gt; addresses tool connection. It lets Agents connect to file systems, databases, browsers, design tools, project management tools, and enterprise systems in a more standardized way. Once the protocol stabilizes, many &amp;ldquo;tool-connection middle layer&amp;rdquo; products get compressed.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Skills&lt;/code&gt; address professional method. Tools tell an Agent what it can do; skills tell it how to do the work. A good skill is not just a prompt. It packages domain workflows, constraints, checks, common pitfalls, and tool-call order.&lt;/p&gt;
&lt;p&gt;Key capabilities included:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;long-term memory: storing preferences, project rules, and history;&lt;/li&gt;
&lt;li&gt;project context: understanding repositories, docs, and work rules;&lt;/li&gt;
&lt;li&gt;tool networks: connecting through MCP, APIs, browsers, and file systems;&lt;/li&gt;
&lt;li&gt;professional skills: packaging task methods through Skills;&lt;/li&gt;
&lt;li&gt;persistent execution: waiting, waking, reminding, and following up;&lt;/li&gt;
&lt;li&gt;remote collaboration: users can return from different devices to approve and steer.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This generation starts to feel like an employee:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;identity and responsibility boundaries;&lt;/li&gt;
&lt;li&gt;long-term context;&lt;/li&gt;
&lt;li&gt;professional work methods;&lt;/li&gt;
&lt;li&gt;time awareness;&lt;/li&gt;
&lt;li&gt;tool permissions;&lt;/li&gt;
&lt;li&gt;ability to continue work without being watched.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;But the more it resembles an employee, the more its risk radius resembles an employee&amp;rsquo;s. Persistent execution, local data access, secrets, tool calls, and task handling move security from the edge to the center.&lt;/p&gt;
&lt;p&gt;One point matters especially: text is also an attack surface. If an Agent reads and follows Markdown, documentation, skill packs, or webpages, malicious text can change its behavior. Prompt injection becomes a supply-chain, permission, and execution-safety problem.&lt;/p&gt;
&lt;p&gt;Generation 4&amp;rsquo;s lesson: persistent Agents need governance, not just capability.&lt;/p&gt;
&lt;h2 id=&#34;after-2026-generation-5-preview-loops-internal-memory-and-world-models&#34;&gt;After 2026: Generation 5 preview, loops, internal memory, and world models
&lt;/h2&gt;&lt;p&gt;Generation 5 is not established history yet. It is an extrapolation from the previous four years.&lt;/p&gt;
&lt;p&gt;The first direction is more complete closed loops.&lt;/p&gt;
&lt;p&gt;A mature Agent needs at least three loops:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;execution loop: verify after each action, rollback, revise, and retry if needed;&lt;/li&gt;
&lt;li&gt;time loop: track long-term goals across multiple wake cycles;&lt;/li&gt;
&lt;li&gt;cognitive loop: know what is certain, what is guessed, and what is outdated.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The second direction is internal memory.&lt;/p&gt;
&lt;p&gt;Most memory so far is outside the model: RAG, vector stores, chat logs, local files, and &lt;code&gt;memory.md&lt;/code&gt;. If future model architectures support persistent state across sessions, Agent memory systems may be rebuilt.&lt;/p&gt;
&lt;p&gt;The third direction is world models.&lt;/p&gt;
&lt;p&gt;Many Agents today are still reactive: observe, respond, observe again. High-risk tasks require the model to simulate consequences. Before changing a database script, it should think about data loss, rollback failure, and compatibility issues, not learn only after an accident.&lt;/p&gt;
&lt;p&gt;The fourth direction is embodiment.&lt;/p&gt;
&lt;p&gt;Earlier generations mainly happened in digital space: APIs, screens, files, browsers, and enterprise tools. The next step may extend Agent action into the physical world, including robots, device control, industrial systems, and standardized physical interfaces.&lt;/p&gt;
&lt;p&gt;Generation 5 will need to solve not only how Agents execute tasks, but how they understand consequences, manage long-term state, and stay reliable inside a larger risk radius.&lt;/p&gt;
&lt;h2 id=&#34;six-patterns-behind-the-timeline&#34;&gt;Six patterns behind the timeline
&lt;/h2&gt;&lt;p&gt;First, base-model capability remains the ceiling. An Agent is not magic outside the model; it is a way to release model capability through engineering systems.&lt;/p&gt;
&lt;p&gt;Second, engineered architecture amplifies model capability. Planning, verification, reflection, revision, evaluation, and permission control are closer to deliverable work than one-shot generation.&lt;/p&gt;
&lt;p&gt;Third, open protocols reshape value distribution. Once MCP, Skills, and project-context standards stabilize, competition shifts from &amp;ldquo;who connected the tool first&amp;rdquo; to &amp;ldquo;who accumulated real domain capability.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Fourth, the hidden main line of Agent evolution is expanding human-machine trust. From trusting text, to API calls, to workflows, to computer operations, to persistent execution, each generation pushes the risk radius outward.&lt;/p&gt;
&lt;p&gt;Fifth, every generation&amp;rsquo;s accidents become the next generation&amp;rsquo;s rules. AutoGPT&amp;rsquo;s loops pushed structured orchestration; vibe coding failures pushed evaluation-driven development; production deletions pushed least privilege and sandboxing; skill poisoning pushed supply-chain safety.&lt;/p&gt;
&lt;p&gt;Sixth, the Agent ecosystem repeatedly booms and collapses. New capabilities create temporary middle layers, and model or platform internalization later removes them. Mistaking a time window for a moat is dangerous.&lt;/p&gt;
&lt;h2 id=&#34;the-real-moat&#34;&gt;The real moat
&lt;/h2&gt;&lt;p&gt;The real moat in AI Agents is not packaging a new capability first.&lt;/p&gt;
&lt;p&gt;More reliable moats include three things.&lt;/p&gt;
&lt;p&gt;First, vertical depth. Do you truly understand an industry&amp;rsquo;s workflow, risks, exceptions, and responsibility boundaries? General models can learn concepts, but they may not replace hard-earned domain execution experience.&lt;/p&gt;
&lt;p&gt;Second, a data flywheel. Can you collect high-quality feedback from real usage and improve workflows, evaluation, fine-tuning, and product decisions?&lt;/p&gt;
&lt;p&gt;Third, user trust. Will users hand you higher-value, longer-running, riskier work, or only treat you as a one-off tool?&lt;/p&gt;
&lt;p&gt;If a platform or base model absorbs a capability, the products that still retain process, feedback, responsibility boundaries, and trust are more likely to survive. Many others are temporary bubbles.&lt;/p&gt;
&lt;h2 id=&#34;final-note&#34;&gt;Final note
&lt;/h2&gt;&lt;p&gt;From 2022 to 2026, AI Agent evolution was not &amp;ldquo;models getting better at chatting.&amp;rdquo; It was &amp;ldquo;humans becoming willing to hand more work to AI.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;A mature Agent is not the system most eager to execute automatically. It is the system that knows when to execute, when to verify, when to pause, and when to ask a human.&lt;/p&gt;
&lt;p&gt;To judge whether an Agent product has long-term value, ask one question: when the next model or platform builds this capability in, what remains?&lt;/p&gt;
&lt;p&gt;If the answer is domain workflow, real data, verifiable results, and user trust, there may be long-term value.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Codex Mobile Remote Access: Use the ChatGPT App to Follow Coding Tasks on Your Mac</title>
        <link>https://knightli.com/en/2026/05/16/codex-mobile-remote-access-chatgpt-app/</link>
        <pubDate>Sat, 16 May 2026 17:42:40 +0800</pubDate>
        
        <guid>https://knightli.com/en/2026/05/16/codex-mobile-remote-access-chatgpt-app/</guid>
        <description>&lt;p&gt;In mid-May 2026, OpenAI brought &lt;code&gt;Codex remote access&lt;/code&gt; into the ChatGPT mobile app. The point is not to write code on a phone. It is to let you follow and steer Codex while it keeps working on a Mac.&lt;/p&gt;
&lt;p&gt;Think of it as a mobile approval and monitoring surface: Codex still reads the project, runs commands, edits files, and checks test results on the computer; the phone is used to review progress, answer questions, add instructions, and approve actions.&lt;/p&gt;
&lt;p&gt;For people who often let Codex run longer tasks, this is useful. You no longer need to sit in front of the Mac waiting for Codex to ask for approval or get stuck.&lt;/p&gt;
&lt;h2 id=&#34;what-it-can-do&#34;&gt;What it can do
&lt;/h2&gt;&lt;p&gt;According to OpenAI&amp;rsquo;s Codex remote connections documentation, mobile access can:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;start new threads in projects on the host, or continue existing ones;&lt;/li&gt;
&lt;li&gt;send follow-up instructions, answer questions, and steer active work;&lt;/li&gt;
&lt;li&gt;approve commands and other actions;&lt;/li&gt;
&lt;li&gt;review outputs, diffs, test results, terminal output, and screenshots;&lt;/li&gt;
&lt;li&gt;receive notifications when Codex completes a task or needs attention;&lt;/li&gt;
&lt;li&gt;switch between connected hosts and threads.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So the mobile app is not just a small chat box. It connects to the actual Codex work context on the host.&lt;/p&gt;
&lt;h2 id=&#34;requirements&#34;&gt;Requirements
&lt;/h2&gt;&lt;p&gt;First, you need Codex access in the ChatGPT account and workspace you want to use. The phone and Mac must use the same account and workspace.&lt;/p&gt;
&lt;p&gt;Second, install the latest ChatGPT mobile app on iOS or Android. If Codex does not appear in the app, update ChatGPT first.&lt;/p&gt;
&lt;p&gt;Third, the host currently needs to be a Mac that is awake, online, running the Codex App, and signed in to the same account and workspace. OpenAI&amp;rsquo;s documentation says mobile setup and device control currently require &lt;code&gt;Codex App for macOS&lt;/code&gt;; setup is not available from Codex CLI or the IDE Extension.&lt;/p&gt;
&lt;p&gt;Fourth, complete any required MFA, SSO, or passkey flow. In a ChatGPT workspace, an admin may also need to enable Remote Control access.&lt;/p&gt;
&lt;p&gt;This makes the feature a mobile control layer for Codex App on macOS, not a generic remote desktop or a universal Codex connection for every environment.&lt;/p&gt;
&lt;h2 id=&#34;limits-of-codex-mobile-remote-access&#34;&gt;Limits of Codex mobile remote access
&lt;/h2&gt;&lt;p&gt;The feature is convenient, but the limits matter.&lt;/p&gt;
&lt;p&gt;First, it currently needs a &lt;code&gt;macOS host&lt;/code&gt;. The phone connects to Codex App running on a Mac, not directly to Codex CLI, the IDE Extension, or any Linux / Windows development machine.&lt;/p&gt;
&lt;p&gt;Second, the host must stay online. The Mac needs to remain awake, connected to the network, and running Codex App. If it sleeps, loses network access, or closes Codex, the remote session can disconnect.&lt;/p&gt;
&lt;p&gt;Third, connection uses a QR-code setup flow. You start &lt;code&gt;Set up Codex mobile&lt;/code&gt; on the Mac, scan the QR code with your phone, and finish setup in ChatGPT. It is not a simple &amp;ldquo;enter host address&amp;rdquo; flow.&lt;/p&gt;
&lt;p&gt;Fourth, remote actions still go through approvals. You can approve commands and actions from the phone, but you should read what Codex is asking to do before confirming, especially for terminal commands, file edits, tests, and external access.&lt;/p&gt;
&lt;p&gt;In short, it is for following up after you leave the computer. It is not a full development environment replacement and should not be treated as unattended remote control.&lt;/p&gt;
&lt;h2 id=&#34;how-to-connect&#34;&gt;How to connect
&lt;/h2&gt;&lt;p&gt;Start from Codex App on the Mac:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Open Codex on the Mac.&lt;/li&gt;
&lt;li&gt;Select &lt;code&gt;Set up Codex mobile&lt;/code&gt; in the sidebar.&lt;/li&gt;
&lt;li&gt;Codex enables remote access for this host and shows a QR code.&lt;/li&gt;
&lt;li&gt;Scan the QR code with your phone to open the Codex mobile setup flow in ChatGPT.&lt;/li&gt;
&lt;li&gt;Confirm the same ChatGPT account and workspace.&lt;/li&gt;
&lt;li&gt;Complete any required MFA, SSO, or passkey verification.&lt;/li&gt;
&lt;li&gt;After setup succeeds, the Mac appears in Codex on your phone.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;After connection, use &lt;code&gt;Settings &amp;gt; Connections&lt;/code&gt; in Codex on the Mac to manage connected devices. You can also configure whether the computer stays awake, whether Computer Use is enabled, and whether the Chrome extension is installed.&lt;/p&gt;
&lt;h2 id=&#34;what-the-phone-is-good-for&#34;&gt;What the phone is good for
&lt;/h2&gt;&lt;p&gt;The phone is best for approvals, course corrections, and result review.&lt;/p&gt;
&lt;p&gt;Approvals are the obvious case: Codex asks to run a command or continue an action, and you can decide from the phone.&lt;/p&gt;
&lt;p&gt;Course correction is just as useful. If Codex misunderstood the task, chose the wrong direction, or hit a failing test, you can send a short instruction and let it continue.&lt;/p&gt;
&lt;p&gt;Result review is the third case. You can inspect diffs, test output, terminal logs, and screenshots without returning to the computer.&lt;/p&gt;
&lt;p&gt;The value is not &amp;ldquo;coding on a phone&amp;rdquo;; it is turning the phone into a small control surface for engineering work that still runs on the host.&lt;/p&gt;
&lt;h2 id=&#34;common-issues&#34;&gt;Common issues
&lt;/h2&gt;&lt;p&gt;If the host does not appear on your phone, confirm that Codex App is running on the Mac, &lt;code&gt;Allow other devices to connect&lt;/code&gt; is enabled, and both devices use the same ChatGPT account and workspace.&lt;/p&gt;
&lt;p&gt;If the approval request does not appear, open the ChatGPT mobile app, go to Codex, scan the QR code again, or restart setup from the host. Workspace users should also confirm that Remote Control access is enabled by an admin.&lt;/p&gt;
&lt;p&gt;If the remote session disconnects, check whether the Mac slept, lost network access, or closed Codex App.&lt;/p&gt;
&lt;p&gt;If authentication blocks setup, complete MFA, SSO, or passkey prompts first. In enterprise environments, workspace permissions may require admin help.&lt;/p&gt;
&lt;h2 id=&#34;best-use-cases&#34;&gt;Best use cases
&lt;/h2&gt;&lt;p&gt;It fits users who run longer Codex coding tasks, want to approve commands away from the desk, manage multiple projects or threads, and already use a Mac as the main development machine.&lt;/p&gt;
&lt;p&gt;It is less useful if you mainly use Windows or Linux, only use Codex CLI or an IDE Extension, expect the phone to be an independent development environment, or work on an unstable network.&lt;/p&gt;
&lt;h2 id=&#34;my-take&#34;&gt;My take
&lt;/h2&gt;&lt;p&gt;Codex mobile remote access is not about moving development to a phone. It is about making the waiting time around Codex more manageable.&lt;/p&gt;
&lt;p&gt;Previously, long Codex tasks often stopped at approval, clarification, failing tests, or direction changes. Now those moments can be handled from the ChatGPT mobile app, while the Mac continues to do the actual engineering work.&lt;/p&gt;
&lt;p&gt;If you already use Codex heavily on a Mac, this is worth enabling. If you only ask occasional coding questions, the value will be less obvious.&lt;/p&gt;
&lt;h2 id=&#34;references&#34;&gt;References
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://help.openai.com/en/articles/6825453-chatgpt-release-notes&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;OpenAI Help Center: ChatGPT Release Notes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://developers.openai.com/codex/remote-connections&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;OpenAI Developers: Codex Remote Connections&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>What Is ChatGPT File Library? File Storage, Limits, and Privacy Boundaries</title>
        <link>https://knightli.com/en/2026/05/16/chatgpt-file-library-storage-limits-privacy/</link>
        <pubDate>Sat, 16 May 2026 17:40:14 +0800</pubDate>
        
        <guid>https://knightli.com/en/2026/05/16/chatgpt-file-library-storage-limits-privacy/</guid>
        <description>&lt;p&gt;&lt;code&gt;ChatGPT File Library&lt;/code&gt; is the file library inside ChatGPT.&lt;/p&gt;
&lt;p&gt;Previously, files uploaded to a conversation were mostly useful for that one chat. With File Library, files you upload or files created by ChatGPT can be saved to your account, found later, downloaded, deleted, or referenced again in a new conversation.&lt;/p&gt;
&lt;p&gt;This makes ChatGPT feel more like a persistent workspace, not just a temporary chat box.&lt;/p&gt;
&lt;h2 id=&#34;latest-availability&#34;&gt;Latest availability
&lt;/h2&gt;&lt;p&gt;According to OpenAI&amp;rsquo;s May 14, 2026 ChatGPT Release Notes, File Library is expanding to Free and Go users, including users in the European Economic Area. OpenAI also added storage management across plans.&lt;/p&gt;
&lt;p&gt;One detail matters: the dedicated File storage and Library help page still showed an older availability statement when checked, saying the Library was for Plus, Pro, and Business users outside the EEA, Switzerland, and the UK, and web-only.&lt;/p&gt;
&lt;p&gt;Help pages can lag behind release notes. This article follows the newer May 14, 2026 Release Notes: File Library has started expanding to Free, Go, and more regions, but actual visibility still depends on rollout, region, and app version.&lt;/p&gt;
&lt;h2 id=&#34;what-it-saves&#34;&gt;What it saves
&lt;/h2&gt;&lt;p&gt;ChatGPT can save files you upload or create, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;documents;&lt;/li&gt;
&lt;li&gt;spreadsheets;&lt;/li&gt;
&lt;li&gt;presentations;&lt;/li&gt;
&lt;li&gt;PDFs;&lt;/li&gt;
&lt;li&gt;images;&lt;/li&gt;
&lt;li&gt;files generated by ChatGPT.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Generated images still appear in the Images tab. File Library is more like a central place to manage uploaded and generated files.&lt;/p&gt;
&lt;p&gt;If you often ask ChatGPT to analyze PDFs, organize spreadsheets, create documents, or work with presentations, this reduces repeated uploads and makes reuse easier.&lt;/p&gt;
&lt;h2 id=&#34;adding-files-to-a-new-chat&#34;&gt;Adding files to a new chat
&lt;/h2&gt;&lt;p&gt;In supported clients, you can open the attachment or add menu near the composer and choose &lt;code&gt;Add from library&lt;/code&gt;, then select a saved file.&lt;/p&gt;
&lt;p&gt;The Release Notes also mention Library and Recent files in the composer across Web, iOS, and Android. That means mobile clients can continue using saved or recent files too.&lt;/p&gt;
&lt;h2 id=&#34;finding-and-managing-files&#34;&gt;Finding and managing files
&lt;/h2&gt;&lt;p&gt;On the web, Library is available from the left sidebar. You can review uploaded and generated files, filter by type or source, and manage storage.&lt;/p&gt;
&lt;p&gt;The help page lists filters such as uploaded files, generated files, images, documents, spreadsheets, presentations, and PDFs.&lt;/p&gt;
&lt;p&gt;Storage management is available from &lt;code&gt;Settings &amp;gt; Storage&lt;/code&gt;, and files can also be deleted directly from Library.&lt;/p&gt;
&lt;h2 id=&#34;storage-by-plan&#34;&gt;Storage by plan
&lt;/h2&gt;&lt;p&gt;OpenAI&amp;rsquo;s May 14, 2026 Release Notes list these capacities:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Plan&lt;/th&gt;
          &lt;th&gt;File Library storage&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Free&lt;/td&gt;
          &lt;td&gt;500 MB&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Go&lt;/td&gt;
          &lt;td&gt;4 GB&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Plus&lt;/td&gt;
          &lt;td&gt;20 GB&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Business&lt;/td&gt;
          &lt;td&gt;20 GB&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Pro&lt;/td&gt;
          &lt;td&gt;100 GB&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;This storage includes uploaded files and files created by ChatGPT, such as documents, spreadsheets, presentations, and images.&lt;/p&gt;
&lt;p&gt;For light users, 500 MB is enough for some PDFs, screenshots, and small documents. Heavy users should treat 20 GB or 100 GB more like a real working library and manage it regularly.&lt;/p&gt;
&lt;h2 id=&#34;per-file-limits&#34;&gt;Per-file limits
&lt;/h2&gt;&lt;p&gt;OpenAI&amp;rsquo;s help page lists these file limits:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;files uploaded to GPTs or ChatGPT conversations can be up to 512 MB each;&lt;/li&gt;
&lt;li&gt;text and document files can contain up to 2 million tokens;&lt;/li&gt;
&lt;li&gt;CSV or spreadsheet files are usually around 50 MB, depending on row size;&lt;/li&gt;
&lt;li&gt;images can be up to 20 MB each.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These are separate from account storage. Even if your account has free space, a single file cannot exceed its own limit.&lt;/p&gt;
&lt;h2 id=&#34;deleting-and-downloading&#34;&gt;Deleting and downloading
&lt;/h2&gt;&lt;p&gt;Files stay in your account until you delete them.&lt;/p&gt;
&lt;p&gt;In Library, select a file and use delete or the trash icon. OpenAI&amp;rsquo;s help page says deleted files are removed from the account immediately and scheduled for permanent deletion from OpenAI systems within 30 days, unless they have been de-identified and disconnected from the account or must be retained for security or legal obligations.&lt;/p&gt;
&lt;p&gt;Files can also be downloaded from Library. If you often ask ChatGPT to generate documents, spreadsheets, or presentations, download and cleanup will become normal maintenance.&lt;/p&gt;
&lt;h2 id=&#34;temporary-chat-does-not-save-files&#34;&gt;Temporary Chat does not save files
&lt;/h2&gt;&lt;p&gt;Files uploaded in Temporary Chat are not saved to your account or Library.&lt;/p&gt;
&lt;p&gt;This is important. File Library is designed for reuse; Temporary Chat is better for temporary, sensitive, or one-off tasks where you do not want long-term context.&lt;/p&gt;
&lt;p&gt;If a file is only for a quick question and should not be kept, use Temporary Chat. If you will reuse it, Library is more convenient.&lt;/p&gt;
&lt;h2 id=&#34;data-and-training-settings&#34;&gt;Data and training settings
&lt;/h2&gt;&lt;p&gt;OpenAI&amp;rsquo;s help page says files and chats follow your settings and data controls.&lt;/p&gt;
&lt;p&gt;If Memory is enabled, files and chats may help ChatGPT remember useful information across conversations. For consumer services, if &lt;code&gt;Improve the model for everyone&lt;/code&gt; is enabled, OpenAI may use content submitted to ChatGPT, including uploaded files, to improve model performance. This can be turned off in &lt;code&gt;Settings &amp;gt; Data Controls&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;File Library is not a local folder. It is a cloud account feature, so think carefully about which documents should be uploaded.&lt;/p&gt;
&lt;h2 id=&#34;good-and-bad-use-cases&#34;&gt;Good and bad use cases
&lt;/h2&gt;&lt;p&gt;Good fits:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;analyzing the same PDFs or reports over time;&lt;/li&gt;
&lt;li&gt;reusing course materials, meeting notes, or product documents;&lt;/li&gt;
&lt;li&gt;continuing to edit files generated by ChatGPT;&lt;/li&gt;
&lt;li&gt;reusing the same source material across conversations;&lt;/li&gt;
&lt;li&gt;turning ChatGPT into a lightweight knowledge workspace.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Poor fits:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;highly sensitive identity documents, contracts, medical records, or financial statements;&lt;/li&gt;
&lt;li&gt;using it as a formal cloud backup;&lt;/li&gt;
&lt;li&gt;letting old files accumulate without cleanup;&lt;/li&gt;
&lt;li&gt;uploading company internal documents without checking data controls.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;my-take&#34;&gt;My take
&lt;/h2&gt;&lt;p&gt;The value of ChatGPT File Library is not just a file list. It changes ChatGPT from a one-off chat tool into a workspace with persistent materials.&lt;/p&gt;
&lt;p&gt;That also creates new habits: clean up old files, watch storage, distinguish normal chats from Temporary Chat, and review data controls.&lt;/p&gt;
&lt;p&gt;If you often use ChatGPT for documents, spreadsheets, and research materials, File Library saves time. If you only upload sensitive files occasionally, be more careful.&lt;/p&gt;
&lt;h2 id=&#34;references&#34;&gt;References
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://help.openai.com/en/articles/20001052-file-storage-and-library-in-chatgpt&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;OpenAI Help Center: File storage and Library in ChatGPT&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://help.openai.com/en/articles/6825453-chatgpt-release-notes&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;OpenAI Help Center: ChatGPT Release Notes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>OpenAI&#39;s New Realtime Voice Models: GPT-Realtime-2, Live Translation, and Streaming Transcription</title>
        <link>https://knightli.com/en/2026/05/09/openai-realtime-voice-models-gpt-realtime-2-translate-whisper/</link>
        <pubDate>Sat, 09 May 2026 10:58:47 +0800</pubDate>
        
        <guid>https://knightli.com/en/2026/05/09/openai-realtime-voice-models-gpt-realtime-2-translate-whisper/</guid>
        <description>&lt;p&gt;On May 7, 2026, OpenAI introduced a new generation of voice models for the Realtime API. The point is not only to make AI sound more natural, but to let voice agents understand, reason, call tools, translate, and transcribe during a live conversation.&lt;/p&gt;
&lt;p&gt;The update includes three models:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;GPT-Realtime-2&lt;/code&gt;: the main model for realtime voice agents, with stronger reasoning, tool calling, and longer context.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GPT-Realtime-Translate&lt;/code&gt;: a live speech translation model that supports 70+ input languages and 13 output languages.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GPT-Realtime-Whisper&lt;/code&gt;: a low-latency streaming speech-to-text model for captions, meeting notes, and realtime workflows.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If early voice assistants were mostly “ask once, answer once,” this release moves closer to a voice interface that can listen and act at the same time.&lt;/p&gt;
&lt;h2 id=&#34;gpt-realtime-2-the-main-model-for-voice-agents&#34;&gt;GPT-Realtime-2: the main model for voice agents
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;GPT-Realtime-2&lt;/code&gt; is built for live voice interactions. It does not just answer questions; it needs to keep context while the user speaks, changes direction, interrupts, or adds constraints, and then call tools when needed.&lt;/p&gt;
&lt;p&gt;Officially highlighted capabilities include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Short preambles before a response, such as “let me check that,” so users know the system is working.&lt;/li&gt;
&lt;li&gt;Parallel tool calls for calendars, search, orders, support systems, and other multi-tool workflows.&lt;/li&gt;
&lt;li&gt;More natural recovery behavior when something fails.&lt;/li&gt;
&lt;li&gt;A context window increased from 32K to 128K for longer conversations and more complex task flows.&lt;/li&gt;
&lt;li&gt;Better retention of specialized terminology, proper nouns, and medical vocabulary.&lt;/li&gt;
&lt;li&gt;More controllable tone and delivery, such as calm, empathetic, confirmational, or upbeat responses.&lt;/li&gt;
&lt;li&gt;Adjustable reasoning effort: &lt;code&gt;minimal&lt;/code&gt;, &lt;code&gt;low&lt;/code&gt;, &lt;code&gt;medium&lt;/code&gt;, &lt;code&gt;high&lt;/code&gt;, and &lt;code&gt;xhigh&lt;/code&gt;, with &lt;code&gt;low&lt;/code&gt; as the default.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This means developers can use voice agents in more demanding products, not only simple Q&amp;amp;A. A support agent can listen while checking an order; a travel app can give next steps after a flight change; a real estate assistant can filter listings and schedule a tour from spoken requirements.&lt;/p&gt;
&lt;h2 id=&#34;live-translation-for-multilingual-voice-products&#34;&gt;Live translation for multilingual voice products
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;GPT-Realtime-Translate&lt;/code&gt; is designed for live speech translation. People can speak in their own language while the other side hears translated speech and sees realtime transcripts.&lt;/p&gt;
&lt;p&gt;Clear use cases include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Multilingual customer support.&lt;/li&gt;
&lt;li&gt;Cross-border sales and pre-sales conversations.&lt;/li&gt;
&lt;li&gt;Online education and live events.&lt;/li&gt;
&lt;li&gt;International meetings and hosting.&lt;/li&gt;
&lt;li&gt;Creator and video platform localization.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The hard part of live translation is not only accuracy. It also requires low latency, natural pauses, tone preservation, accent handling, and domain vocabulary. OpenAI is emphasizing cross-language conversations that feel closer to natural speech, instead of waiting for an entire segment before translation begins.&lt;/p&gt;
&lt;h2 id=&#34;streaming-transcription-voice-content-enters-workflows-immediately&#34;&gt;Streaming transcription: voice content enters workflows immediately
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;GPT-Realtime-Whisper&lt;/code&gt; is the new streaming speech-to-text model. Its value is turning speech into usable text while it is happening, instead of waiting for a recording to finish.&lt;/p&gt;
&lt;p&gt;Common applications include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Live meeting captions.&lt;/li&gt;
&lt;li&gt;Classroom and broadcast captions.&lt;/li&gt;
&lt;li&gt;Realtime meeting notes.&lt;/li&gt;
&lt;li&gt;Continuous dictation input for voice agents.&lt;/li&gt;
&lt;li&gt;Follow-up workflows in support, healthcare, recruiting, sales, and other high-volume voice scenarios.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For products, streaming transcription shortens the time from spoken words to actionable text. Captions appear faster, notes can be generated during the conversation, and downstream workflows such as summaries, task extraction, and CRM updates can start earlier.&lt;/p&gt;
&lt;h2 id=&#34;pricing-and-availability&#34;&gt;Pricing and availability
&lt;/h2&gt;&lt;p&gt;All three models are available in the Realtime API. Official pricing is:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Model&lt;/th&gt;
          &lt;th&gt;Price&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;GPT-Realtime-2&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Audio input $32 / 1M tokens, cached input $0.40 / 1M tokens, audio output $64 / 1M tokens&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;GPT-Realtime-Translate&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;$0.034 / minute&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;GPT-Realtime-Whisper&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;$0.017 / minute&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;OpenAI also says the Realtime API supports EU Data Residency and is covered by its enterprise privacy commitments. For European businesses or products with data residency requirements, that is worth evaluating separately.&lt;/p&gt;
&lt;h2 id=&#34;what-this-means-for-developers&#34;&gt;What this means for developers
&lt;/h2&gt;&lt;p&gt;The key shift is that voice is becoming part of the product interaction layer, not just an input/output layer.&lt;/p&gt;
&lt;p&gt;In many earlier voice features, speech was converted to text, and text responses were converted back into speech. The hard middle layer is intent understanding, interruption handling, context tracking, tool calls, tool transparency, and graceful recovery.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;GPT-Realtime-2&lt;/code&gt; tries to move more of that capability directly into the realtime voice model. For developers, the question is not only answer quality, but whether the model can support sustained conversations and multi-step tasks.&lt;/p&gt;
&lt;p&gt;Products that are especially worth testing include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Customer support voice agents.&lt;/li&gt;
&lt;li&gt;In-car and mobile voice assistants.&lt;/li&gt;
&lt;li&gt;Travel, booking, real estate, finance, and other services that need conversation plus lookup.&lt;/li&gt;
&lt;li&gt;Multilingual meetings and cross-border communication tools.&lt;/li&gt;
&lt;li&gt;Live captions, meeting notes, and call quality systems.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;safety-and-disclosure-still-matter&#34;&gt;Safety and disclosure still matter
&lt;/h2&gt;&lt;p&gt;OpenAI says the Realtime API includes multiple safety layers, such as active classifiers over sessions and the ability to stop policy-violating conversations. Developers can also add their own guardrails through the Agents SDK.&lt;/p&gt;
&lt;p&gt;One easily missed requirement is disclosure: developers should make it clear when end users are interacting with AI, unless that is already obvious from the context.&lt;/p&gt;
&lt;p&gt;This matters in support, sales, education, healthcare, and similar scenarios. The more natural voice becomes, the more important product boundaries become: users should know they are talking to AI, and understand when speech may be recorded, transcribed, or used to trigger tools.&lt;/p&gt;
&lt;h2 id=&#34;summary&#34;&gt;Summary
&lt;/h2&gt;&lt;p&gt;OpenAI&amp;rsquo;s Realtime API update moves live voice from “can listen and speak” toward “can listen while working through tasks.”&lt;/p&gt;
&lt;p&gt;&lt;code&gt;GPT-Realtime-2&lt;/code&gt; handles more complex voice agents, &lt;code&gt;GPT-Realtime-Translate&lt;/code&gt; handles live cross-language communication, and &lt;code&gt;GPT-Realtime-Whisper&lt;/code&gt; handles low-latency transcription. Together, they cover the three basic capabilities most voice products need: conversation, translation, and transcription.&lt;/p&gt;
&lt;p&gt;If you are building support, in-car, meeting, education, cross-border communication, or mobile voice assistant products, this release is worth testing. The important question is not only whether the model sounds natural, but how it performs in long conversations, interruptions, tool calls, failure recovery, and cost control.&lt;/p&gt;
&lt;p&gt;Reference:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://openai.com/index/advancing-voice-intelligence-with-new-models-in-the-api/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;OpenAI: Advancing voice intelligence with new models in the API&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>What Is the Difference Between GPT-5.5, GPT-5.5 Instant, GPT-5.5 Thinking, and GPT-5.5 Pro?</title>
        <link>https://knightli.com/en/2026/05/07/gpt-5-5-instant-thinking-pro-differences/</link>
        <pubDate>Thu, 07 May 2026 21:59:33 +0800</pubDate>
        
        <guid>https://knightli.com/en/2026/05/07/gpt-5-5-instant-thinking-pro-differences/</guid>
        <description>&lt;p&gt;OpenAI now separates GPT-5.5 into clearer usage tiers: &lt;code&gt;Instant&lt;/code&gt;, &lt;code&gt;Thinking&lt;/code&gt;, and &lt;code&gt;Pro&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Many people mix up &lt;code&gt;GPT-5.5&lt;/code&gt;, &lt;code&gt;GPT-5.5 Instant&lt;/code&gt;, &lt;code&gt;GPT-5.5 Thinking&lt;/code&gt;, and &lt;code&gt;GPT-5.5 Pro&lt;/code&gt;. The short version: &lt;code&gt;GPT-5.5&lt;/code&gt; is the overall name for this generation of model capabilities. &lt;code&gt;Instant&lt;/code&gt; is the fast everyday model, &lt;code&gt;Thinking&lt;/code&gt; is the deeper reasoning mode, and &lt;code&gt;Pro&lt;/code&gt; is a heavier research-grade mode.&lt;/p&gt;
&lt;h2 id=&#34;quick-comparison&#34;&gt;Quick Comparison
&lt;/h2&gt;&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Name&lt;/th&gt;
          &lt;th&gt;What It Is&lt;/th&gt;
          &lt;th&gt;Best For&lt;/th&gt;
          &lt;th&gt;Speed/Cost&lt;/th&gt;
          &lt;th&gt;Availability&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;GPT-5.5&lt;/td&gt;
          &lt;td&gt;Main GPT-5.5 model/family name; in ChatGPT it usually maps to the capability positioning of GPT-5.5 Thinking&lt;/td&gt;
          &lt;td&gt;Complex work, code, research, analysis, tool use&lt;/td&gt;
          &lt;td&gt;Heavier than Instant, but more capable&lt;/td&gt;
          &lt;td&gt;Plus, Pro, Business, Enterprise&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;GPT-5.5 Instant&lt;/td&gt;
          &lt;td&gt;Fast default model, replacing GPT-5.3 Instant&lt;/td&gt;
          &lt;td&gt;Daily Q&amp;amp;A, writing, summarization, light coding, quick lookup&lt;/td&gt;
          &lt;td&gt;Fastest and most quota-efficient&lt;/td&gt;
          &lt;td&gt;Gradual rollout to all ChatGPT users&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;GPT-5.5 Thinking&lt;/td&gt;
          &lt;td&gt;Deep reasoning mode&lt;/td&gt;
          &lt;td&gt;Hard problems, long-context analysis, complex code, research, document-heavy tasks&lt;/td&gt;
          &lt;td&gt;Slower, but more reliable reasoning&lt;/td&gt;
          &lt;td&gt;Paid users can select it manually&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;GPT-5.5 Pro&lt;/td&gt;
          &lt;td&gt;Heavier research-grade mode&lt;/td&gt;
          &lt;td&gt;High-risk or high-precision tasks: law, business, education, data science, scientific analysis&lt;/td&gt;
          &lt;td&gt;Slowest and heaviest, optimized for quality&lt;/td&gt;
          &lt;td&gt;Pro, Business, Enterprise, Edu&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;If you only want one rule:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Fast everyday tasks&lt;/strong&gt;: use &lt;code&gt;GPT-5.5 Instant&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Complex reasoning and code analysis&lt;/strong&gt;: use &lt;code&gt;GPT-5.5 Thinking&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Especially hard, important, or accuracy-sensitive work&lt;/strong&gt;: use &lt;code&gt;GPT-5.5 Pro&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;what-is-gpt-55&#34;&gt;What Is GPT-5.5
&lt;/h2&gt;&lt;p&gt;When people say &lt;code&gt;GPT-5.5&lt;/code&gt; by itself, they usually mean the overall capability of the GPT-5.5 generation, not a single fixed button.&lt;/p&gt;
&lt;p&gt;OpenAI positions GPT-5.5 as a stronger model for real work. Its improvements focus on:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;agentic coding;&lt;/li&gt;
&lt;li&gt;complex code debugging;&lt;/li&gt;
&lt;li&gt;research and synthesis;&lt;/li&gt;
&lt;li&gt;generating documents, spreadsheets, and presentations;&lt;/li&gt;
&lt;li&gt;computer use and cross-tool work;&lt;/li&gt;
&lt;li&gt;sustained reasoning and self-checking in long tasks.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In ChatGPT, users do not usually see a vague &lt;code&gt;GPT-5.5&lt;/code&gt; button. They see more specific options: &lt;code&gt;Instant&lt;/code&gt;, &lt;code&gt;Thinking&lt;/code&gt;, and &lt;code&gt;Pro&lt;/code&gt;. So if someone says &amp;ldquo;I am using GPT-5.5,&amp;rdquo; it is worth asking: Instant, Thinking, or Pro?&lt;/p&gt;
&lt;h2 id=&#34;gpt-55-instant-default-fast-everyday-use&#34;&gt;GPT-5.5 Instant: Default, Fast, Everyday Use
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;GPT-5.5 Instant&lt;/code&gt; is the new fast default model. OpenAI&amp;rsquo;s official announcement says it begins replacing &lt;code&gt;GPT-5.3 Instant&lt;/code&gt; as the default ChatGPT model and is available in the API as &lt;code&gt;chat-latest&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;It is suitable for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;everyday chat;&lt;/li&gt;
&lt;li&gt;quick Q&amp;amp;A;&lt;/li&gt;
&lt;li&gt;ordinary writing;&lt;/li&gt;
&lt;li&gt;article summarization;&lt;/li&gt;
&lt;li&gt;email rewriting;&lt;/li&gt;
&lt;li&gt;light code explanation;&lt;/li&gt;
&lt;li&gt;simple tables and lists;&lt;/li&gt;
&lt;li&gt;tasks that do not need long reasoning.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Instant&amp;rsquo;s main advantages are speed and default availability. You do not need to manually select a reasoning mode every time, and ordinary questions do not pay a higher latency cost.&lt;/p&gt;
&lt;p&gt;It also changes the default tone: OpenAI emphasizes that GPT-5.5 Instant answers more clearly and concisely, with stronger personalization. For ordinary users, that makes it better as the model you leave open all day.&lt;/p&gt;
&lt;p&gt;The caveat is that Instant is not the strongest mode. For complex math, long code, architecture design, multi-file analysis, or serious research, it may switch to Thinking automatically, or you may need to select Thinking manually.&lt;/p&gt;
&lt;h2 id=&#34;gpt-55-thinking-the-main-mode-for-complex-tasks&#34;&gt;GPT-5.5 Thinking: The Main Mode for Complex Tasks
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;GPT-5.5 Thinking&lt;/code&gt; is the reasoning mode better suited to complex tasks.&lt;/p&gt;
&lt;p&gt;It fits:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;code debugging;&lt;/li&gt;
&lt;li&gt;architecture design;&lt;/li&gt;
&lt;li&gt;multi-step reasoning;&lt;/li&gt;
&lt;li&gt;long-document analysis;&lt;/li&gt;
&lt;li&gt;academic material organization;&lt;/li&gt;
&lt;li&gt;business scenario planning;&lt;/li&gt;
&lt;li&gt;data-analysis explanation;&lt;/li&gt;
&lt;li&gt;tasks that require comparison, tradeoffs, and verification.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thinking spends more time reasoning. The OpenAI Help Center says that when GPT-5.5 Thinking or GPT-5.5 Pro starts reasoning, it may first show a short preamble explaining what it plans to do. Users can also add instructions while the model is still thinking to adjust direction early.&lt;/p&gt;
&lt;p&gt;In ChatGPT, when manually choosing Thinking, users can also adjust thinking time. According to the official explanation, Plus and Business users can use &lt;code&gt;Standard&lt;/code&gt; and &lt;code&gt;Extended&lt;/code&gt;; Pro users also have options such as &lt;code&gt;Light&lt;/code&gt; and &lt;code&gt;Heavy&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;My interpretation: Thinking is the default choice for serious work. Whenever a task involves multiple steps, long context, or higher accuracy requirements, it is more suitable than Instant.&lt;/p&gt;
&lt;h2 id=&#34;gpt-55-pro-research-grade-heavier-more-rigorous&#34;&gt;GPT-5.5 Pro: Research-Grade, Heavier, More Rigorous
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;GPT-5.5 Pro&lt;/code&gt; is the mode for harder problems and higher-precision work.&lt;/p&gt;
&lt;p&gt;It fits:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;legal material analysis;&lt;/li&gt;
&lt;li&gt;business research;&lt;/li&gt;
&lt;li&gt;education and curriculum design;&lt;/li&gt;
&lt;li&gt;data science;&lt;/li&gt;
&lt;li&gt;scientific literature synthesis;&lt;/li&gt;
&lt;li&gt;deep review before high-risk decisions;&lt;/li&gt;
&lt;li&gt;multi-document, multi-constraint, multi-round verification tasks.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In the GPT-5.5 announcement, OpenAI says early testers found GPT-5.5 Pro to improve over GPT-5.4 Pro in completeness, structure, accuracy, relevance, and usefulness, especially in business, law, education, and data science.&lt;/p&gt;
&lt;p&gt;The downside is also clear: Pro is slower and heavier, and it is not meant for every small question. It is more like an expert reviewer or research partner than a daily chat entry point.&lt;/p&gt;
&lt;p&gt;Pro also has special tool-support limitations. The OpenAI Help Center says Apps, Memory, Canvas, and image generation are not available in Pro. If your task needs those ChatGPT features, Instant or Thinking may be the better choice.&lt;/p&gt;
&lt;h2 id=&#34;tool-support-differences&#34;&gt;Tool Support Differences
&lt;/h2&gt;&lt;p&gt;According to the OpenAI Help Center, &lt;code&gt;GPT-5.5 Instant&lt;/code&gt; and &lt;code&gt;GPT-5.5 Thinking&lt;/code&gt; support common ChatGPT tools, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Web search;&lt;/li&gt;
&lt;li&gt;Data analysis;&lt;/li&gt;
&lt;li&gt;Image analysis;&lt;/li&gt;
&lt;li&gt;File analysis;&lt;/li&gt;
&lt;li&gt;Canvas;&lt;/li&gt;
&lt;li&gt;Image generation;&lt;/li&gt;
&lt;li&gt;Memory;&lt;/li&gt;
&lt;li&gt;Custom Instructions.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;GPT-5.5 Pro&lt;/code&gt; is more focused on research-grade reasoning, but not all ChatGPT tools are available. Pay particular attention:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Apps are unavailable;&lt;/li&gt;
&lt;li&gt;Memory is unavailable;&lt;/li&gt;
&lt;li&gt;Canvas is unavailable;&lt;/li&gt;
&lt;li&gt;image generation is unavailable.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So when choosing a model, do not only ask &amp;ldquo;which one is smarter.&amp;rdquo; Also ask which tools you need.&lt;/p&gt;
&lt;h2 id=&#34;context-window-differences&#34;&gt;Context Window Differences
&lt;/h2&gt;&lt;p&gt;The OpenAI Help Center describes ChatGPT context windows roughly as:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Mode&lt;/th&gt;
          &lt;th&gt;Context Window&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;GPT-5.5 Instant&lt;/td&gt;
          &lt;td&gt;Free: 16K; Plus/Business: 32K; Pro/Enterprise: 128K&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;GPT-5.5 Thinking&lt;/td&gt;
          &lt;td&gt;Usually 256K when manually selected on paid plans; up to 400K on Pro&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;This means:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Instant is enough for ordinary chat and short documents;&lt;/li&gt;
&lt;li&gt;Thinking is better for multi-file work, multi-round research, and long-codebase analysis;&lt;/li&gt;
&lt;li&gt;for especially long, complex, high-precision tasks, Pro users can use a larger context and heavier reasoning.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;how-to-choose&#34;&gt;How to Choose
&lt;/h2&gt;&lt;h3 id=&#34;everyday-qa&#34;&gt;Everyday Q&amp;amp;A
&lt;/h3&gt;&lt;p&gt;Use &lt;code&gt;GPT-5.5 Instant&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;It is fast, smart enough, and good for quick questions, quick writing, and quick edits.&lt;/p&gt;
&lt;h3 id=&#34;writing-summarizing-email-editing&#34;&gt;Writing, Summarizing, Email Editing
&lt;/h3&gt;&lt;p&gt;Start with &lt;code&gt;GPT-5.5 Instant&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;If the article is long, needs structural rewriting, or requires multiple rounds of proofreading, switch to &lt;code&gt;GPT-5.5 Thinking&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&#34;coding-and-debugging&#34;&gt;Coding and Debugging
&lt;/h3&gt;&lt;p&gt;Use &lt;code&gt;Instant&lt;/code&gt; for simple code explanation.&lt;/p&gt;
&lt;p&gt;Use &lt;code&gt;Thinking&lt;/code&gt; for multi-file debugging, architecture design, and complex error analysis. For very difficult long-running engineering problems, consider &lt;code&gt;Pro&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id=&#34;research-and-material-analysis&#34;&gt;Research and Material Analysis
&lt;/h3&gt;&lt;p&gt;Use &lt;code&gt;Thinking&lt;/code&gt; for ordinary material organization.&lt;/p&gt;
&lt;p&gt;For law, business, scientific research, and data science tasks that need higher precision, &lt;code&gt;Pro&lt;/code&gt; is more suitable.&lt;/p&gt;
&lt;h3 id=&#34;tasks-requiring-image-generation-canvas-or-memory&#34;&gt;Tasks Requiring Image Generation, Canvas, or Memory
&lt;/h3&gt;&lt;p&gt;Prefer &lt;code&gt;Instant&lt;/code&gt; or &lt;code&gt;Thinking&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Do not automatically choose &lt;code&gt;Pro&lt;/code&gt;, because Pro does not support some ChatGPT tools.&lt;/p&gt;
&lt;h2 id=&#34;short-conclusion&#34;&gt;Short Conclusion
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;GPT-5.5 Instant&lt;/code&gt; is the everyday default model: fast, clear, quota-efficient, and suitable for most ordinary tasks.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;GPT-5.5 Thinking&lt;/code&gt; is the main mode for complex work: code, research, long documents, analysis, and multi-step reasoning.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;GPT-5.5 Pro&lt;/code&gt; is the high-precision research mode: suitable for harder and more important tasks that need more rigor, but with more limits on speed and tool support.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;GPT-5.5&lt;/code&gt; itself is more like the overall name for this generation. In practice, the real choice is whether you select &lt;code&gt;Instant&lt;/code&gt;, &lt;code&gt;Thinking&lt;/code&gt;, or &lt;code&gt;Pro&lt;/code&gt; in ChatGPT.&lt;/p&gt;
&lt;h2 id=&#34;related-links&#34;&gt;Related Links
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;GPT-5.5 Instant announcement: &lt;a class=&#34;link&#34; href=&#34;https://openai.com/index/gpt-5-5-instant/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://openai.com/index/gpt-5-5-instant/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;GPT-5.5 announcement: &lt;a class=&#34;link&#34; href=&#34;https://openai.com/index/introducing-gpt-5-5/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://openai.com/index/introducing-gpt-5-5/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;GPT-5.5 in ChatGPT Help Center: &lt;a class=&#34;link&#34; href=&#34;https://help.openai.com/en/articles/11909943-gpt-53-and-gpt-55-in-chatgpt&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://help.openai.com/en/articles/11909943-gpt-53-and-gpt-55-in-chatgpt&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>How ChatGPT, Claude Code, and Gemini memory mechanisms differ</title>
        <link>https://knightli.com/en/2026/05/07/chatgpt-claude-code-gemini-memory-comparison/</link>
        <pubDate>Thu, 07 May 2026 14:47:17 +0800</pubDate>
        
        <guid>https://knightli.com/en/2026/05/07/chatgpt-claude-code-gemini-memory-comparison/</guid>
        <description>&lt;p&gt;&amp;ldquo;Memory&amp;rdquo; is becoming increasingly important in AI products. It marks the shift from one-off conversations to long-term collaboration: you do not need to reintroduce your background, repeat your preferences, or ask the model to understand the same project again and again.&lt;/p&gt;
&lt;p&gt;But memory does not mean the same thing in every product. &lt;code&gt;ChatGPT&lt;/code&gt;, &lt;code&gt;Claude Code&lt;/code&gt;, and &lt;code&gt;Gemini&lt;/code&gt; all try to help AI remember longer, but their goals, storage locations, transparency, and use cases are very different.&lt;/p&gt;
&lt;p&gt;As of May 7, 2026, they can be roughly understood as three types:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ChatGPT is more like personal assistant memory.&lt;/li&gt;
&lt;li&gt;Claude Code is more like engineering project memory.&lt;/li&gt;
&lt;li&gt;Gemini is more like Google ecosystem context.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;chatgpt-long-term-preferences-around-the-person&#34;&gt;ChatGPT: long-term preferences around the person
&lt;/h2&gt;&lt;p&gt;ChatGPT memory is mainly designed for personal collaboration. It cares about who you are, what you prefer, and what you work on over time.&lt;/p&gt;
&lt;p&gt;OpenAI currently separates ChatGPT memory into &lt;code&gt;saved memories&lt;/code&gt; and &lt;code&gt;chat history&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;saved memories&lt;/code&gt; are important pieces of information ChatGPT stores, such as your name, preferences, goals, common tech stack, and writing habits. You can explicitly ask it to remember something, and it may also save information from conversation when it thinks it will be useful later.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;chat history&lt;/code&gt; lets ChatGPT reference past conversations when answering. It does not mean every chat becomes a permanent memory. Instead, ChatGPT can search past conversations for relevant context when needed.&lt;/p&gt;
&lt;p&gt;So ChatGPT&amp;rsquo;s core logic is: understand the same user across sessions.&lt;/p&gt;
&lt;p&gt;Typical examples include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;ldquo;Keep code examples concise for me.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&amp;ldquo;I mainly use Python and TypeScript.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&amp;ldquo;I am writing a Hugo blog about AI tools.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&amp;ldquo;I prefer conclusions first, then details.&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These memories are not bound to one project. They follow the account and the user&amp;rsquo;s working habits.&lt;/p&gt;
&lt;h2 id=&#34;memory-sources-making-personalization-more-visible&#34;&gt;Memory Sources: making personalization more visible
&lt;/h2&gt;&lt;p&gt;OpenAI emphasized &lt;code&gt;Memory sources&lt;/code&gt; in its May 2026 update.&lt;/p&gt;
&lt;p&gt;The purpose is not to add another type of memory, but to show users what sources ChatGPT referenced when personalizing a response. According to OpenAI help documents, Memory Sources may show:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Past chats.&lt;/li&gt;
&lt;li&gt;Saved memories.&lt;/li&gt;
&lt;li&gt;Custom instructions.&lt;/li&gt;
&lt;li&gt;Files in the file library.&lt;/li&gt;
&lt;li&gt;Emails from connected Gmail.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Files and Gmail visibility depend on plan, region, and connection status. OpenAI also states that Memory sources may not show every factor that influenced a response, but they help users understand and manage personalization.&lt;/p&gt;
&lt;p&gt;This matters. The more AI can &amp;ldquo;remember you,&amp;rdquo; the more users need to know what it used to answer. Otherwise personalization becomes a black box: it seems to know you, but you do not know why.&lt;/p&gt;
&lt;p&gt;ChatGPT&amp;rsquo;s advantage is cross-session, cross-topic understanding of personal preferences. The risk is that memories can become outdated, or users may forget an old memory is still affecting answers. It is worth periodically cleaning saved memories and old chats.&lt;/p&gt;
&lt;h2 id=&#34;claude-code-around-codebases-and-engineering-rules&#34;&gt;Claude Code: around codebases and engineering rules
&lt;/h2&gt;&lt;p&gt;Claude Code memory is more engineering-oriented. It cares less about a user&amp;rsquo;s everyday preferences and more about how this codebase should be changed.&lt;/p&gt;
&lt;p&gt;Claude Code has two memory mechanisms that are easy to confuse:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Explicit project memory: &lt;code&gt;CLAUDE.md&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Automatic project memory: Auto Memory.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;CLAUDE.md&lt;/code&gt; is the most basic and stable project memory file. It can live at the project root or inside subdirectories. Claude Code reads these files as project instructions and operating rules.&lt;/p&gt;
&lt;p&gt;Good content for &lt;code&gt;CLAUDE.md&lt;/code&gt; includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Common build, test, and lint commands.&lt;/li&gt;
&lt;li&gt;Code style and naming rules.&lt;/li&gt;
&lt;li&gt;Project architecture notes.&lt;/li&gt;
&lt;li&gt;Module boundaries and risky areas.&lt;/li&gt;
&lt;li&gt;Team conventions and commit workflow.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If &lt;code&gt;CLAUDE.md&lt;/code&gt; is stored in the repository, it can be committed to Git and shared as a team agent guide. This is completely different from ChatGPT&amp;rsquo;s cloud-based personal memory.&lt;/p&gt;
&lt;h2 id=&#34;claude-code-auto-memory-accumulating-project-experience&#34;&gt;Claude Code Auto Memory: accumulating project experience
&lt;/h2&gt;&lt;p&gt;Claude Code also has &lt;code&gt;Auto Memory&lt;/code&gt;. Its goal is to let Claude automatically accumulate project knowledge across sessions without requiring users to write every note manually.&lt;/p&gt;
&lt;p&gt;According to Claude Code documentation, Auto Memory lets Claude save notes while working, such as build commands, debugging discoveries, architecture notes, code style preferences, and workflow habits. It does not save every session, but judges what may be useful later.&lt;/p&gt;
&lt;p&gt;One common misconception is that Auto Memory writes by default to &lt;code&gt;.claude/memory.md&lt;/code&gt; in the project root. Official documentation says each project has its own memory directory under the user&amp;rsquo;s home directory, with a path like:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;~/.claude/projects/&amp;lt;project&amp;gt;/memory/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;code&gt;MEMORY.md&lt;/code&gt; loads the first 200 lines or 25KB at the start of each conversation, while detailed content may be split into other topic files. Auto Memory files are local Markdown files, and users can view, edit, or delete them through &lt;code&gt;/memory&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This makes Claude Code memory more like a local project knowledge base. It is closer to the codebase than ChatGPT&amp;rsquo;s personal memory, and more dynamic than a plain &lt;code&gt;CLAUDE.md&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;But Auto Memory is local to the machine. It does not naturally follow the repository to other machines or cloud environments. For team-shared stable rules, put them in the repository&amp;rsquo;s &lt;code&gt;CLAUDE.md&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;gemini-around-google-ecosystem-context&#34;&gt;Gemini: around Google ecosystem context
&lt;/h2&gt;&lt;p&gt;Gemini&amp;rsquo;s memory logic is different again.&lt;/p&gt;
&lt;p&gt;Gemini also supports saved information and past-chat references. Google help documents say users can save information about life, work, or preferences, and Gemini can reference past chats before answering. When it uses this information, the response may show sources such as &lt;code&gt;Your saved info&lt;/code&gt; or &lt;code&gt;Previous chats&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;But Gemini&amp;rsquo;s differentiation is not only &amp;ldquo;saving a few preferences.&amp;rdquo; It is Google ecosystem integration.&lt;/p&gt;
&lt;p&gt;With user authorization and feature availability, Gemini can access context from connected Google apps such as Gmail, Google Drive, Docs, and Sheets. Its advantage is not making users teach it every item manually, but turning existing Google account data into searchable work context.&lt;/p&gt;
&lt;p&gt;A typical difference:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ChatGPT remembers: &amp;ldquo;I have been repairing an LTO tape drive recently.&amp;rdquo;&lt;/li&gt;
&lt;li&gt;Gemini may find the purchase confirmation email in Gmail or read repair notes from Drive.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This does not mean Gemini can unconditionally read all Google data. It depends on account type, region, permissions, connected apps, Keep Activity settings, and product availability. Enterprise and school accounts may also be controlled by Google Workspace administrators.&lt;/p&gt;
&lt;p&gt;More accurately, Gemini memory is a combination of saved info, past chats, and connected Google ecosystem data.&lt;/p&gt;
&lt;h2 id=&#34;core-differences&#34;&gt;Core differences
&lt;/h2&gt;&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Dimension&lt;/th&gt;
          &lt;th&gt;ChatGPT&lt;/th&gt;
          &lt;th&gt;Claude Code&lt;/th&gt;
          &lt;th&gt;Gemini&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Core object&lt;/td&gt;
          &lt;td&gt;Person and preferences&lt;/td&gt;
          &lt;td&gt;Project and codebase&lt;/td&gt;
          &lt;td&gt;Google account and ecosystem data&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Typical memory&lt;/td&gt;
          &lt;td&gt;Preferences, background, long-term goals&lt;/td&gt;
          &lt;td&gt;Architecture, commands, conventions, debugging experience&lt;/td&gt;
          &lt;td&gt;Saved info, past chats, Gmail/Drive/Docs context&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Storage form&lt;/td&gt;
          &lt;td&gt;Memory and chat context in OpenAI account&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;CLAUDE.md&lt;/code&gt;, &lt;code&gt;MEMORY.md&lt;/code&gt;, local Markdown files&lt;/td&gt;
          &lt;td&gt;Google account activity, saved info, connected app data&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Transparency&lt;/td&gt;
          &lt;td&gt;Memory sources show part of the source&lt;/td&gt;
          &lt;td&gt;Markdown files can be opened and edited&lt;/td&gt;
          &lt;td&gt;Managed through source prompts, Gemini Apps Activity, and Google settings&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Cross-project ability&lt;/td&gt;
          &lt;td&gt;Strong, follows user account&lt;/td&gt;
          &lt;td&gt;Weak, mainly follows project or local project memory&lt;/td&gt;
          &lt;td&gt;Strong, depends on Google data and permissions&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Team sharing&lt;/td&gt;
          &lt;td&gt;Not suitable for direct sharing&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;CLAUDE.md&lt;/code&gt; can be shared through Git&lt;/td&gt;
          &lt;td&gt;Mainly depends on Workspace and permissions&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Best for&lt;/td&gt;
          &lt;td&gt;Personal preferences and long-term assistant behavior&lt;/td&gt;
          &lt;td&gt;Long-term coding projects and agent collaboration&lt;/td&gt;
          &lt;td&gt;Google Workspace retrieval and cross-tool work&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;how-to-choose&#34;&gt;How to choose
&lt;/h2&gt;&lt;p&gt;If you want AI to remember who you are, what style you prefer, and how you usually work, ChatGPT memory is more suitable.&lt;/p&gt;
&lt;p&gt;It is good for saving personal preferences such as writing style, tech stack, answer format, professional background, and long-term project direction. Its focus is reducing self-introduction cost so each new conversation can start faster.&lt;/p&gt;
&lt;p&gt;If you want AI to remember how a codebase should be changed, which commands work, and which traps to avoid, Claude Code is more suitable.&lt;/p&gt;
&lt;p&gt;Put stable rules into &lt;code&gt;CLAUDE.md&lt;/code&gt; for team sharing. Let Auto Memory assist with dynamic experience. Important decisions should still be organized into documentation or &lt;code&gt;CLAUDE.md&lt;/code&gt;, not left only in local automatic memory.&lt;/p&gt;
&lt;p&gt;If most of your materials live in Gmail, Drive, Docs, and Sheets, Gemini&amp;rsquo;s ecosystem context has an advantage.&lt;/p&gt;
&lt;p&gt;It is useful for finding old emails, organizing Drive documents, and connecting calendar and office materials. The key to using Gemini is not repeatedly reminding it in chat, but making sure the relevant app connections, permissions, and activity settings are correct.&lt;/p&gt;
&lt;h2 id=&#34;a-practical-division-of-labor&#34;&gt;A practical division of labor
&lt;/h2&gt;&lt;p&gt;You can divide them like this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ChatGPT remembers general personal preferences.&lt;/li&gt;
&lt;li&gt;Claude Code remembers engineering knowledge for a repository.&lt;/li&gt;
&lt;li&gt;Gemini retrieves materials from your Google ecosystem.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In other words, ChatGPT is like a personal secretary, Claude Code is like a senior engineer inside the project, and Gemini is like an indexer for your Google account.&lt;/p&gt;
&lt;p&gt;There is no absolute winner. They have different goals.&lt;/p&gt;
&lt;p&gt;The biggest mistake is mixing them together. Personal preferences do not always belong in project memory; project architecture does not always belong in cloud personal memory; and Google ecosystem retrieval does not mean the model has truly understood you long-term.&lt;/p&gt;
&lt;h2 id=&#34;short-take&#34;&gt;Short Take
&lt;/h2&gt;&lt;p&gt;The next stage of AI memory is not simply &amp;ldquo;remember more.&amp;rdquo; Memory needs layers, visibility, and control.&lt;/p&gt;
&lt;p&gt;ChatGPT focuses on cross-session personalization. Claude Code focuses on code project continuity. Gemini focuses on Google ecosystem context. Good long-term AI collaboration does not put all information into one black box; it keeps different kinds of memory in the right places.&lt;/p&gt;
&lt;p&gt;Put personal preferences in personal memory, engineering rules in the codebase, and historical materials in the original document and email systems. AI&amp;rsquo;s job is to call the right context when needed, not mix everything into one pile.&lt;/p&gt;
&lt;h2 id=&#34;links&#34;&gt;Links
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;OpenAI Memory FAQ: &lt;a class=&#34;link&#34; href=&#34;https://help.openai.com/en/articles/8590148-memory-faq&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://help.openai.com/en/articles/8590148-memory-faq&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;ChatGPT Release Notes: &lt;a class=&#34;link&#34; href=&#34;https://help.openai.com/en/articles/6825453-chatgpt-release-notes&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://help.openai.com/en/articles/6825453-chatgpt-release-notes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Claude Code Memory: &lt;a class=&#34;link&#34; href=&#34;https://code.claude.com/docs/en/memory&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://code.claude.com/docs/en/memory&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Gemini Saved info: &lt;a class=&#34;link&#34; href=&#34;https://support.google.com/gemini/answer/15637730&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://support.google.com/gemini/answer/15637730&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Gemini Apps Privacy Hub: &lt;a class=&#34;link&#34; href=&#34;https://support.google.com/gemini/answer/13594961&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://support.google.com/gemini/answer/13594961&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>What ChatGPT Release Notes reveal about OpenAI&#39;s product rhythm</title>
        <link>https://knightli.com/en/2026/05/07/chatgpt-release-notes-product-rhythm/</link>
        <pubDate>Thu, 07 May 2026 14:31:22 +0800</pubDate>
        
        <guid>https://knightli.com/en/2026/05/07/chatgpt-release-notes-product-rhythm/</guid>
        <description>&lt;p&gt;OpenAI&amp;rsquo;s &lt;code&gt;ChatGPT Release Notes&lt;/code&gt; page is a direct way to observe the product rhythm of ChatGPT. The page continuously records changes to ChatGPT models, features, account security, app integrations, and client experience.&lt;/p&gt;
&lt;p&gt;As of May 7, 2026, the page shows the latest update as &amp;ldquo;yesterday,&amp;rdquo; with the newest entries concentrated on May 5, 2026. They may look like ordinary updates, but together they show where ChatGPT is heading: a more reliable default model, more controllable memory, deeper office workflows, and stronger account security.&lt;/p&gt;
&lt;h2 id=&#34;latest-focus-one-memory-sources-become-visible&#34;&gt;Latest focus one: memory sources become visible
&lt;/h2&gt;&lt;p&gt;The first May 5 update is about ChatGPT memory improvements.&lt;/p&gt;
&lt;p&gt;OpenAI says Plus and Pro users will gradually receive more personalized and continuous responses. ChatGPT can better use past chats, saved memories, available files, and connected Gmail context to provide more tailored suggestions, recommendations, and next steps.&lt;/p&gt;
&lt;p&gt;The value of this capability becomes clear in long-term use. If a user is working on a project, writing a series of posts, following a set of emails, or repeatedly handling similar work, the most annoying part is re-explaining the background every time. Stronger memory is meant to reduce that repetition.&lt;/p&gt;
&lt;p&gt;But the stronger memory becomes, the more users need to know what context the model used. That is why OpenAI is introducing &lt;code&gt;memory sources&lt;/code&gt;. Users can see relevant saved memories, past chats, custom instructions, and, in certain cases, referenced files and Gmail messages under a response.&lt;/p&gt;
&lt;p&gt;If information is outdated, inaccurate, or no longer relevant, users can correct it, delete it, or mark it as not relevant.&lt;/p&gt;
&lt;h2 id=&#34;personalization-is-not-just-knowing-you-better&#34;&gt;Personalization is not just &amp;ldquo;knowing you better&amp;rdquo;
&lt;/h2&gt;&lt;p&gt;When people talk about AI personalization, they often focus only on whether the model understands them better. But sustainable personalization must answer three questions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Can users see what the model referenced?&lt;/li&gt;
&lt;li&gt;Can users edit or delete that information?&lt;/li&gt;
&lt;li&gt;Can users turn memory off when they do not need it?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The release notes clearly say memory sources are only shown inside the user&amp;rsquo;s own account experience, and are not exposed when a chat is shared. Users can also delete chats, use temporary chats, turn memory off, disconnect apps, and manage whether content is used to improve models.&lt;/p&gt;
&lt;p&gt;This shows OpenAI is not only adding personalization capability. It is also adding control surfaces. For a long-term assistant, that step matters.&lt;/p&gt;
&lt;h2 id=&#34;latest-focus-two-gpt-55-instant-becomes-the-default-model&#34;&gt;Latest focus two: GPT-5.5 Instant becomes the default model
&lt;/h2&gt;&lt;p&gt;On the same day, OpenAI also began rolling out &lt;code&gt;GPT-5.5 Instant&lt;/code&gt; as ChatGPT&amp;rsquo;s new default model, replacing &lt;code&gt;GPT-5.3 Instant&lt;/code&gt; for all users.&lt;/p&gt;
&lt;p&gt;The release notes describe the model update in practical terms: more accurate, clearer, more concise, better at image understanding and STEM questions, and better at deciding when to use web search.&lt;/p&gt;
&lt;p&gt;Default model updates have a large impact. Most users do not switch models every day. The ChatGPT quality they feel is the quality of the default model. If the default model has fewer hallucinations, less filler, and fewer pointless follow-up questions, the actual experience improves noticeably.&lt;/p&gt;
&lt;p&gt;OpenAI also says GPT-5.5 Instant reduces overformatting and unnecessary decorative content. This may seem small, but it is close to everyday use. Many users do not need a fully structured essay. They need an accurate, direct, actionable answer.&lt;/p&gt;
&lt;p&gt;Paid users can continue using GPT-5.3 Instant for three months before it is retired.&lt;/p&gt;
&lt;h2 id=&#34;latest-focus-three-chatgpt-enters-excel-and-google-sheets&#34;&gt;Latest focus three: ChatGPT enters Excel and Google Sheets
&lt;/h2&gt;&lt;p&gt;The third May 5 update is the global launch of ChatGPT for Excel and Google Sheets.&lt;/p&gt;
&lt;p&gt;This feature puts ChatGPT into the sidebar of Microsoft Excel and Google Sheets, allowing users to build, update, and understand data inside spreadsheets. Official scenarios include trackers, budgets, formulas, multi-tab files, scenario work, and spreadsheet cleanup.&lt;/p&gt;
&lt;p&gt;This shows ChatGPT is not staying inside a chat window. It is moving into places where users already work.&lt;/p&gt;
&lt;p&gt;For office users, spreadsheets are a very common work surface. Many companies, teams, and individuals keep business data not in complex data platforms, but in piles of Excel and Google Sheets files. If ChatGPT can understand data, write formulas, organize multiple sheets, and explain results next to the spreadsheet, the barrier is much lower than copying everything into a chat window.&lt;/p&gt;
&lt;p&gt;OpenAI also reminds users to review outputs before relying on formulas or analysis. That is realistic: AI can speed up spreadsheet work, but it cannot take full responsibility for financial, operational, or business judgments.&lt;/p&gt;
&lt;h2 id=&#34;late-april-groundwork-security-and-model-selection&#34;&gt;Late April groundwork: security and model selection
&lt;/h2&gt;&lt;p&gt;Looking back, the April 30 &lt;code&gt;Advanced Account Security&lt;/code&gt; update is also worth attention.&lt;/p&gt;
&lt;p&gt;It is an optional security setting for personal ChatGPT accounts. When enabled, the account uses stronger sign-in methods such as passkeys or compatible security keys, and disables weaker paths such as password sign-in, email or SMS sign-in codes, and email-based account recovery. It also includes recovery keys, shorter active sessions, login notifications, and session management controls.&lt;/p&gt;
&lt;p&gt;This shows ChatGPT accounts are becoming more important. As files, memories, app connections, email, spreadsheets, and work projects enter ChatGPT, account security is no longer just a login issue. It relates to the user&amp;rsquo;s long-term work context.&lt;/p&gt;
&lt;p&gt;On April 28, OpenAI also moved model selection closer to the composer and put Thinking and Pro model &lt;code&gt;thinking effort&lt;/code&gt; controls into the model picker. This is a typical product detail change: as the number of models grows, users need an easier way to choose the right tool before sending a message.&lt;/p&gt;
&lt;h2 id=&#34;another-late-april-direction-faster-ordinary-answers&#34;&gt;Another late-April direction: faster ordinary answers
&lt;/h2&gt;&lt;p&gt;On April 22, ChatGPT introduced &lt;code&gt;Fast answers&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This feature is for common information queries. When a question does not need personalization and ChatGPT has a high-confidence answer, it can return results faster. Fast answers do not reference past chats or memory, and users can turn them off in personalization settings.&lt;/p&gt;
&lt;p&gt;This may look opposite to stronger memory, but it is the same product logic: different questions need different handling.&lt;/p&gt;
&lt;p&gt;Some questions need long-term context, such as &amp;ldquo;help me continue planning that project from last week.&amp;rdquo; Others only need a fast and accurate answer, such as &amp;ldquo;what are the Seven Wonders of the World?&amp;rdquo; The former needs memory and context; the latter needs speed and clarity. ChatGPT is separating these paths.&lt;/p&gt;
&lt;h2 id=&#34;product-rhythm-is-changing&#34;&gt;Product rhythm is changing
&lt;/h2&gt;&lt;p&gt;These release notes show that ChatGPT updates are no longer only model releases.&lt;/p&gt;
&lt;p&gt;Updates now cover:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Default model quality.&lt;/li&gt;
&lt;li&gt;Memory and personalization.&lt;/li&gt;
&lt;li&gt;App connections and office add-ins.&lt;/li&gt;
&lt;li&gt;Account security.&lt;/li&gt;
&lt;li&gt;Model selection and interaction entry points.&lt;/li&gt;
&lt;li&gt;Fast answers and mobile experience.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This means ChatGPT is moving from a single AI chat product into a more complete work platform. Model capability is still important, but product experience, context management, tool entry points, account security, and third-party integrations now matter just as much.&lt;/p&gt;
&lt;h2 id=&#34;short-take&#34;&gt;Short Take
&lt;/h2&gt;&lt;p&gt;The most interesting part of these ChatGPT Release Notes is not one specific update, but the direction they form together.&lt;/p&gt;
&lt;p&gt;OpenAI is making ChatGPT faster, more context-aware, more present in office workflows, and also more controllable and secure. GPT-5.5 Instant improves default answer quality, memory sources explain personalization, Excel and Google Sheets bring ChatGPT into real work files, and Advanced Account Security protects heavier account usage.&lt;/p&gt;
&lt;p&gt;Going forward, ChatGPT&amp;rsquo;s competitiveness will not depend only on model parameters. It will also depend on whether OpenAI can organize these updates into a stable, clear product experience that users are willing to trust with long-term context.&lt;/p&gt;
&lt;h2 id=&#34;links&#34;&gt;Links
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;ChatGPT Release Notes: &lt;a class=&#34;link&#34; href=&#34;https://help.openai.com/en/articles/6825453-chatgpt-release-notes%253F.ejs&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://help.openai.com/en/articles/6825453-chatgpt-release-notes%253F.ejs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>ChatGPT Release Notes update: memory sources, GPT-5.5 Instant, and spreadsheet add-ins</title>
        <link>https://knightli.com/en/2026/05/07/chatgpt-release-notes-memory-gpt-5-5-sheets/</link>
        <pubDate>Thu, 07 May 2026 14:30:15 +0800</pubDate>
        
        <guid>https://knightli.com/en/2026/05/07/chatgpt-release-notes-memory-gpt-5-5-sheets/</guid>
        <description>&lt;p&gt;OpenAI&amp;rsquo;s &lt;code&gt;ChatGPT Release Notes&lt;/code&gt; page was updated in early May 2026. The latest batch focuses on three things: memory sources and stronger personalization in ChatGPT, &lt;code&gt;GPT-5.5 Instant&lt;/code&gt; becoming the new default model, and the global launch of ChatGPT for Excel and Google Sheets.&lt;/p&gt;
&lt;p&gt;Taken together, these updates point in a clear direction: ChatGPT is continuing to move from a chat entry point toward a more continuous, more personalized, and more office-native work assistant.&lt;/p&gt;
&lt;h2 id=&#34;memory-sources-make-personalization-more-transparent&#34;&gt;Memory sources make personalization more transparent
&lt;/h2&gt;&lt;p&gt;The most important update is &lt;code&gt;memory sources&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;OpenAI says ChatGPT Plus and Pro users are beginning to receive stronger memory improvements. ChatGPT can better pull relevant context from past chats, saved memories, available files, and connected Gmail apps to provide more tailored ideas, recommendations, and next steps.&lt;/p&gt;
&lt;p&gt;This means users do not have to repeatedly explain project background, preferences, habits, or existing materials in every new conversation. For long-term writing, project planning, research organization, learning, and teamwork, continuity becomes stronger.&lt;/p&gt;
&lt;p&gt;But the stronger personalization becomes, the more important transparency becomes. That is why OpenAI is introducing memory sources, so users can see what information helped personalize a response. Users can click the Sources icon under a response to view relevant saved memories, past chats, and custom instructions. Plus and Pro users may also see files from their library and referenced emails from connected Gmail.&lt;/p&gt;
&lt;p&gt;If some information is outdated, irrelevant, or wrong, users can correct it, delete it, or mark it as not relevant.&lt;/p&gt;
&lt;h2 id=&#34;memory-control-is-still-the-key&#34;&gt;Memory control is still the key
&lt;/h2&gt;&lt;p&gt;OpenAI also notes that memory sources may not show every factor that shaped a response, and that it will keep improving the view.&lt;/p&gt;
&lt;p&gt;That matters. Memory sources are not a complete &amp;ldquo;model thinking log.&amp;rdquo; They are a product interface for understanding personalized context. They improve visibility, but cannot fully expose every factor that influenced an answer.&lt;/p&gt;
&lt;p&gt;For privacy and control, OpenAI says memory sources only appear inside the user&amp;rsquo;s own account experience. If a user shares a chat, the sources do not appear in the shared chat. Users can also delete chats, use temporary chats that do not use or update memory and do not appear in history, turn off memory, disconnect apps at any time, and manage whether their content is used to improve models.&lt;/p&gt;
&lt;p&gt;This shows ChatGPT personalization is following a clearer path: make the assistant more aware of the user, while also giving the user ways to see and manage why it answered that way.&lt;/p&gt;
&lt;h2 id=&#34;gpt-55-instant-becomes-the-default-model&#34;&gt;GPT-5.5 Instant becomes the default model
&lt;/h2&gt;&lt;p&gt;The release notes also confirm that &lt;code&gt;GPT-5.5 Instant&lt;/code&gt; is rolling out as the new default ChatGPT model, replacing &lt;code&gt;GPT-5.3 Instant&lt;/code&gt; for all users.&lt;/p&gt;
&lt;p&gt;The default model update improves several areas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Accuracy.&lt;/li&gt;
&lt;li&gt;Clarity and concision.&lt;/li&gt;
&lt;li&gt;Image understanding.&lt;/li&gt;
&lt;li&gt;STEM answers.&lt;/li&gt;
&lt;li&gt;Deciding when to use web search.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;OpenAI emphasizes that GPT-5.5 Instant is more factually reliable, especially for prompts where accuracy matters. It also gives tighter and more direct answers, reduces unnecessary follow-up questions, and lowers clutter from overformatting and decorative content.&lt;/p&gt;
&lt;p&gt;For users, this may not be as visible as a new feature button, but it changes the feel of opening ChatGPT every day: fewer detours, less verbosity, and less formatting piled onto simple questions.&lt;/p&gt;
&lt;h2 id=&#34;personalization-and-the-default-model-now-work-together&#34;&gt;Personalization and the default model now work together
&lt;/h2&gt;&lt;p&gt;For Plus and Pro users on the web, GPT-5.5 Instant can also use context from past chats, files, and connected Gmail more effectively.&lt;/p&gt;
&lt;p&gt;This is part of the same product direction as memory sources. The model is not only &amp;ldquo;smarter.&amp;rdquo; It should also know, when appropriate, what you worked on before, what you care about, and what materials you already provided. When continuing a project, writing a plan, organizing email information, or making suggestions based on past preferences, ChatGPT can ask fewer repeated questions.&lt;/p&gt;
&lt;p&gt;Paid users can continue using GPT-5.3 Instant for three months through model configuration settings before it is retired.&lt;/p&gt;
&lt;h2 id=&#34;chatgpt-for-excel-and-google-sheets&#34;&gt;ChatGPT for Excel and Google Sheets
&lt;/h2&gt;&lt;p&gt;Another important update is the global launch of ChatGPT for Excel and Google Sheets.&lt;/p&gt;
&lt;p&gt;It brings ChatGPT into a sidebar inside Microsoft Excel and Google Sheets, so users can build, update, and understand data in place. OpenAI mentions use cases including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Trackers.&lt;/li&gt;
&lt;li&gt;Budgets.&lt;/li&gt;
&lt;li&gt;Formulas.&lt;/li&gt;
&lt;li&gt;Multi-tab files.&lt;/li&gt;
&lt;li&gt;Scenario work.&lt;/li&gt;
&lt;li&gt;Spreadsheet cleanup.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Where available, it also supports Skills and apps.&lt;/p&gt;
&lt;p&gt;The meaning is straightforward: a lot of office data does not live in a specialized BI system. It lives in Excel and Google Sheets. Putting ChatGPT into the spreadsheet sidebar is more natural than asking users to copy and paste into a chat window, and makes it easier to enter real workflows.&lt;/p&gt;
&lt;h2 id=&#34;usage-limits-and-installation&#34;&gt;Usage limits and installation
&lt;/h2&gt;&lt;p&gt;The release notes say Free and Go plans include limited usage, while Plus and Pro use the same agentic usage limits as Codex. Users can buy additional credits if they need to go beyond plan limits.&lt;/p&gt;
&lt;p&gt;Installation is also direct: install ChatGPT for Excel from Microsoft Marketplace or ChatGPT from Google Workspace Marketplace, then sign in with an eligible ChatGPT account.&lt;/p&gt;
&lt;p&gt;OpenAI also reminds users to review outputs before relying on formulas or analysis. That point is important. AI can speed up spreadsheet work, but formulas, budgets, financial work, and business analysis still need human review.&lt;/p&gt;
&lt;h2 id=&#34;recent-update-pattern&#34;&gt;Recent update pattern
&lt;/h2&gt;&lt;p&gt;Looking at the release notes from late April to early May, ChatGPT&amp;rsquo;s direction is clearer.&lt;/p&gt;
&lt;p&gt;On April 30, OpenAI introduced Advanced Account Security for personal ChatGPT accounts, adding stronger sign-in requirements and account protections, including passkeys, security keys, recovery keys, shorter sessions, and login notifications.&lt;/p&gt;
&lt;p&gt;On April 28, model selection moved closer to the composer, making it easier to choose a model before sending a message. Thinking effort controls for Thinking and Pro models were also moved into the model picker.&lt;/p&gt;
&lt;p&gt;On April 22, ChatGPT introduced Fast answers for common information queries that do not require personalization and where the model has a high-confidence answer. Fast answers do not reference past chats or memory, and users can turn them off in personalization settings.&lt;/p&gt;
&lt;p&gt;These updates all serve the same goal: make ChatGPT better for frequent everyday use. It should be fast when speed matters, personalized when context matters, and provide security and visibility controls when needed.&lt;/p&gt;
&lt;h2 id=&#34;short-take&#34;&gt;Short Take
&lt;/h2&gt;&lt;p&gt;The point of this ChatGPT Release Notes update is not one single feature. It is the continued shaping of the product.&lt;/p&gt;
&lt;p&gt;GPT-5.5 Instant improves the default answer quality. Memory sources make personalization more visible. Excel and Google Sheets add-ins put ChatGPT inside office spreadsheets. Advanced Account Security and model picker changes strengthen account protection and interaction design.&lt;/p&gt;
&lt;p&gt;ChatGPT is becoming a longer-term work layer. It remembers more context, enters more tools, and handles more daily tasks. The next questions are whether personalization transparency is clear enough, whether office add-ins remain stable in real complex spreadsheets, and whether users can keep a healthy balance between convenience and control.&lt;/p&gt;
&lt;h2 id=&#34;links&#34;&gt;Links
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;ChatGPT Release Notes: &lt;a class=&#34;link&#34; href=&#34;https://help.openai.com/en/articles/6825453-chatgpt-release-notes&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://help.openai.com/en/articles/6825453-chatgpt-release-notes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>GPT-5.5 Instant launches: ChatGPT&#39;s default model gets more accurate, shorter, and more personal</title>
        <link>https://knightli.com/en/2026/05/07/gpt-5-5-instant-chatgpt-default-model/</link>
        <pubDate>Thu, 07 May 2026 14:28:40 +0800</pubDate>
        
        <guid>https://knightli.com/en/2026/05/07/gpt-5-5-instant-chatgpt-default-model/</guid>
        <description>&lt;p&gt;OpenAI released &lt;code&gt;GPT-5.5 Instant&lt;/code&gt; on May 5, 2026 and began rolling it out as the default model for all ChatGPT users.&lt;/p&gt;
&lt;p&gt;The keywords in this update are not &amp;ldquo;bigger&amp;rdquo; or &amp;ldquo;flashier.&amp;rdquo; They are closer to everyday use: more accurate answers, clearer and shorter responses, a more natural tone, and better use of context users have already shared. For ChatGPT, changes to the default model matter especially because they affect the experience most people actually use every day.&lt;/p&gt;
&lt;h2 id=&#34;why-the-default-model-matters&#34;&gt;Why the default model matters
&lt;/h2&gt;&lt;p&gt;Instant is ChatGPT&amp;rsquo;s daily driver model. Many users do not manually switch models or study the differences between them. Their experience of ChatGPT is the quality of the default model.&lt;/p&gt;
&lt;p&gt;So GPT-5.5 Instant is not just another model name. It moves the base experience forward. OpenAI says the update makes everyday interactions more useful and smoother: stronger answers across topics, tighter conversations, and better use of existing context when appropriate.&lt;/p&gt;
&lt;p&gt;This kind of improvement is less dramatic than a large multimodal launch, but for hundreds of millions of users, a default model that makes fewer mistakes, writes less unnecessarily, and asks fewer pointless follow-up questions is a major product change.&lt;/p&gt;
&lt;h2 id=&#34;fewer-hallucinations-and-more-reliable-answers&#34;&gt;Fewer hallucinations and more reliable answers
&lt;/h2&gt;&lt;p&gt;OpenAI puts accuracy first.&lt;/p&gt;
&lt;p&gt;In internal evaluations, OpenAI says GPT-5.5 Instant produced 52.5% fewer hallucinated claims than GPT-5.3 Instant on high-stakes prompts covering medicine, law, and finance. On especially difficult conversations users had flagged for factual errors, inaccurate claims were reduced by 37.3%.&lt;/p&gt;
&lt;p&gt;These numbers matter. They show OpenAI is not only trying to make the model more fluent, but also continuing to reduce factual errors. In areas such as medicine, law, and finance, a model cannot merely sound smooth. It has to be more cautious and invent less.&lt;/p&gt;
&lt;p&gt;This does not mean users should treat ChatGPT as a replacement for professional advice. A more accurate model still needs verification, sources, and human judgment in high-risk contexts. But as a product experience, better factual reliability in the default model reduces many everyday risks.&lt;/p&gt;
&lt;h2 id=&#34;stronger-everyday-task-performance&#34;&gt;Stronger everyday task performance
&lt;/h2&gt;&lt;p&gt;GPT-5.5 Instant also improves across daily tasks.&lt;/p&gt;
&lt;p&gt;OpenAI mentions better analysis of photo and image uploads, stronger STEM answers, and better judgment about when to use web search. The last point is important. Many users do not care whether the model internally calls a tool. They care whether the answer is fresh, accurate, and clearly explained.&lt;/p&gt;
&lt;p&gt;If the model can better decide which questions need web search and which can be answered directly, users do not have to keep saying &amp;ldquo;look it up.&amp;rdquo; ChatGPT feels more like a proactive assistant than a chat box waiting for explicit instructions.&lt;/p&gt;
&lt;p&gt;OpenAI&amp;rsquo;s math example also points in this direction. GPT-5.5 Instant initially accepts an incorrect solution, but then checks the result, finds the algebra error, and solves the corrected equation. The important point is not that it never makes a mistake, but that it has a better chance of catching and repairing one during the reasoning process.&lt;/p&gt;
&lt;h2 id=&#34;shorter-answers-not-less-substance&#34;&gt;Shorter answers, not less substance
&lt;/h2&gt;&lt;p&gt;OpenAI also emphasizes that GPT-5.5 Instant gives tighter, more direct answers while keeping useful content and ChatGPT&amp;rsquo;s friendly tone.&lt;/p&gt;
&lt;p&gt;This matters for a default model. AI response fatigue often comes not from too little information, but from too much structure, too much setup, and too much formatting. A simple question can become five headings and a dozen caveats, which feels unnatural.&lt;/p&gt;
&lt;p&gt;GPT-5.5 Instant aims to reduce unnecessary verbosity and overformatting, ask fewer unneeded follow-up questions, and avoid decorative clutter. For daily office work, writing advice, life questions, and quick explanations, these changes often matter more than one benchmark score.&lt;/p&gt;
&lt;p&gt;Shorter does not mean shallower. A good default model should judge whether the user needs one practical sentence, an explanation, or a full plan. GPT-5.5 Instant is moving toward steadier judgment on that balance.&lt;/p&gt;
&lt;h2 id=&#34;personalization-keeps-improving&#34;&gt;Personalization keeps improving
&lt;/h2&gt;&lt;p&gt;Another main thread is personalization.&lt;/p&gt;
&lt;p&gt;OpenAI says Instant is now better at using context from past chats, files, and connected Gmail, when available, to make responses more relevant. It decides when extra personalization can improve an answer and searches past conversations faster, so users do not need to repeat background as often.&lt;/p&gt;
&lt;p&gt;This is valuable for long-term ChatGPT users. When planning, writing, selecting tools, organizing projects, or continuing a workflow, users may already have provided preferences, constraints, and context in earlier chats. If the model can pick up naturally, it reduces repeated explanation.&lt;/p&gt;
&lt;p&gt;But personalization has to come with transparency and control. Otherwise users do not know why the model suddenly references a preference or which memories are shaping an answer.&lt;/p&gt;
&lt;h2 id=&#34;memory-sources-make-personalization-more-visible&#34;&gt;Memory sources make personalization more visible
&lt;/h2&gt;&lt;p&gt;OpenAI is also introducing &lt;code&gt;memory sources&lt;/code&gt; across all ChatGPT models.&lt;/p&gt;
&lt;p&gt;The feature lets users see which context was used to personalize a response, such as saved memories or past chats. If something is outdated, inaccurate, or no longer wanted, users can delete or correct it.&lt;/p&gt;
&lt;p&gt;OpenAI also says memory sources are not shown to others when users share a chat. Users can delete chats they do not want cited, edit saved memories in settings, or use temporary chats that do not use or update memory.&lt;/p&gt;
&lt;p&gt;This matters. The more personalized an AI assistant becomes, the more it needs to explain &amp;ldquo;what I used to answer you.&amp;rdquo; Memory sources may not show every factor, but they move part of personalization out of the black box.&lt;/p&gt;
&lt;h2 id=&#34;availability&#34;&gt;Availability
&lt;/h2&gt;&lt;p&gt;GPT-5.5 Instant is rolling out from the announcement day to all ChatGPT users, replacing GPT-5.3 Instant as the default model. In the API, it corresponds to &lt;code&gt;chat-latest&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Paid users can continue using GPT-5.3 Instant for three months through model configuration settings before it is retired.&lt;/p&gt;
&lt;p&gt;Enhanced personalization from past chats, files, and connected Gmail is rolling out first to Plus and Pro users on the web, with mobile support coming later. OpenAI plans to expand it to Free, Go, Business, and Enterprise in the following weeks. Memory sources are rolling out on the web for ChatGPT consumer plans and will come to mobile later. Availability of specific personalization sources may vary by region.&lt;/p&gt;
&lt;h2 id=&#34;short-take&#34;&gt;Short Take
&lt;/h2&gt;&lt;p&gt;GPT-5.5 Instant is an upgrade to the default ChatGPT experience.&lt;/p&gt;
&lt;p&gt;It is not only about stronger model capability. It adjusts accuracy, answer density, tone, context use, and personalization transparency together. For ordinary users, the most direct change should be: less fluff, fewer factual errors, and better continuity with your background.&lt;/p&gt;
&lt;p&gt;For OpenAI, this is another step in the evolution of the default assistant. ChatGPT is becoming less of a tool that starts from zero every time and more of a long-term assistant that can remember preferences, understand context, know when to search, and let users manage those memory sources.&lt;/p&gt;
&lt;h2 id=&#34;links&#34;&gt;Links
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;OpenAI announcement: &lt;a class=&#34;link&#34; href=&#34;https://openai.com/index/gpt-5-5-instant/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://openai.com/index/gpt-5-5-instant/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>Why ChatGPT Says &#39;This Chat Was Flagged for Possible Cybersecurity Risk&#39; and What to Do</title>
        <link>https://knightli.com/en/2026/05/06/chatgpt-cybersecurity-risk-flag/</link>
        <pubDate>Wed, 06 May 2026 00:17:00 +0800</pubDate>
        
        <guid>https://knightli.com/en/2026/05/06/chatgpt-cybersecurity-risk-flag/</guid>
        <description>&lt;p&gt;When using ChatGPT or similar large language models, you may occasionally see a notice: &amp;ldquo;This chat was flagged for possible cybersecurity risk.&amp;rdquo; This means the platform&amp;rsquo;s automated safety system has detected that the conversation may violate its usage policies.&lt;/p&gt;
&lt;p&gt;Below is an analysis of what triggers this notice, what it actually affects, and how to respond.&lt;/p&gt;
&lt;h2 id=&#34;why-a-chat-may-be-flagged&#34;&gt;Why a Chat May Be Flagged
&lt;/h2&gt;&lt;h3 id=&#34;sensitive-input&#34;&gt;Sensitive Input
&lt;/h3&gt;&lt;p&gt;The conversation may contain content that could be interpreted as harmful, such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Requests to generate malicious code or scripts.&lt;/li&gt;
&lt;li&gt;Analysis or exploitation of network vulnerabilities.&lt;/li&gt;
&lt;li&gt;Questions related to illegal activities.&lt;/li&gt;
&lt;li&gt;Instructions for bypassing security restrictions.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;false-positive&#34;&gt;False Positive
&lt;/h3&gt;&lt;p&gt;Even when the intent is legitimate code analysis or technical research, the system may still misread cybersecurity-related terminology as a potential attack attempt. AI moderation models tend to be sensitive to keywords, and the line between technical discussion and offensive behavior is not always precise.&lt;/p&gt;
&lt;h3 id=&#34;platform-review-mechanism&#34;&gt;Platform Review Mechanism
&lt;/h3&gt;&lt;p&gt;The system automatically scans conversation content for risk assessment. In newer versions, such as the April 2026 update, this kind of notice appears more often, suggesting that the platform may have introduced a stricter external review process.&lt;/p&gt;
&lt;h2 id=&#34;what-happens-after-the-notice-appears&#34;&gt;What Happens After the Notice Appears
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;The current chat may be stopped&lt;/strong&gt;: The platform may restrict or halt generation in the current conversation.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Risk records&lt;/strong&gt;: Repeated risk-control triggers may be recorded, and accumulating too many of them could affect account status.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A trend toward higher sensitivity&lt;/strong&gt;: Review mechanisms are becoming stricter, making technical discussions more likely to hit boundary cases.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;how-to-handle-it&#34;&gt;How to Handle It
&lt;/h2&gt;&lt;h3 id=&#34;start-a-new-chat&#34;&gt;Start a New Chat
&lt;/h3&gt;&lt;p&gt;The most direct approach is to abandon the current conversation and click &amp;ldquo;New Chat&amp;rdquo; to start fresh. The previous context will no longer carry over, so the same moderation trigger usually will not repeat.&lt;/p&gt;
&lt;h3 id=&#34;adjust-your-prompt&#34;&gt;Adjust Your Prompt
&lt;/h3&gt;&lt;p&gt;Review what you entered earlier, remove terms that may be judged sensitive, and ask in a more neutral way. For example, change &amp;ldquo;how to bypass a certain restriction&amp;rdquo; to &amp;ldquo;what is the principle behind this restriction,&amp;rdquo; or change &amp;ldquo;how to write an attack script&amp;rdquo; to &amp;ldquo;what mechanisms do scripts of this type typically use.&amp;rdquo;&lt;/p&gt;
&lt;h3 id=&#34;do-not-try-to-bypass-it&#34;&gt;Do Not Try to Bypass It
&lt;/h3&gt;&lt;p&gt;Avoid using prompt injection or similar methods to force the AI to answer questions it has refused. This increases the risk of account penalties and often backfires.&lt;/p&gt;
&lt;h3 id=&#34;check-the-nature-of-your-activity&#34;&gt;Check the Nature of Your Activity
&lt;/h3&gt;&lt;p&gt;If you were not doing anything high-risk, such as analyzing phishing links or writing malware, the issue is most likely the AI misreading technical concepts. In that case, you can consider reporting it to the platform, though the short-term effect is usually limited.&lt;/p&gt;
&lt;h3 id=&#34;protect-privacy&#34;&gt;Protect Privacy
&lt;/h3&gt;&lt;p&gt;Do not submit content containing sensitive personal information or trade secrets for AI analysis. Even if it does not trigger risk control, there is still a risk of data leakage.&lt;/p&gt;
&lt;h2 id=&#34;prevention-tips&#34;&gt;Prevention Tips
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;Use neutral wording as much as possible when discussing technical topics.&lt;/li&gt;
&lt;li&gt;Avoid concentrating a large number of sensitive topics in a single conversation.&lt;/li&gt;
&lt;li&gt;Regularly clean up unnecessary chat history.&lt;/li&gt;
&lt;li&gt;Avoid frequently testing moderation boundaries on important accounts.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;summary&#34;&gt;Summary
&lt;/h2&gt;&lt;p&gt;&amp;ldquo;This chat was flagged for possible cybersecurity risk&amp;rdquo; is usually triggered by automated moderation and does not necessarily mean the account has violated rules. The priority is straightforward: start a new chat &amp;gt; adjust the wording &amp;gt; do not fight the system head-on. In daily use, paying attention to wording boundaries can prevent most triggers.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Why ChatGPT and Codex Ask for Phone Verification at Login</title>
        <link>https://knightli.com/en/2026/05/06/chatgpt-codex-phone-verification-plus/</link>
        <pubDate>Wed, 06 May 2026 00:07:43 +0800</pubDate>
        
        <guid>https://knightli.com/en/2026/05/06/chatgpt-codex-phone-verification-plus/</guid>
        <description>&lt;p&gt;Recently, some users have run into a situation where their ChatGPT account has already been registered, but the system asks for phone verification again when logging into ChatGPT or Codex. This is especially confusing with Codex: the account was fine for signup, so why ask for a phone number when logging into the tool?&lt;/p&gt;
&lt;p&gt;This is usually related to account risk controls, abuse of free quotas, network environment, and account security policies. Below is a summary of common causes and how to approach them.&lt;/p&gt;
&lt;h2 id=&#34;why-phone-verification-is-required&#34;&gt;Why phone verification is required
&lt;/h2&gt;&lt;p&gt;The most direct reason is tighter risk controls.&lt;/p&gt;
&lt;p&gt;Once Codex opens up to users, its free quota attracts not only legitimate users but also mass registration and quota-farming. When registration bots create accounts in bulk and drain free quotas, platforms naturally tighten verification policies.&lt;/p&gt;
&lt;p&gt;From the user&amp;rsquo;s side, the result looks like: an account that previously only needed email or third-party login is suddenly asked for a phone number when accessing ChatGPT or Codex.&lt;/p&gt;
&lt;p&gt;This does not necessarily mean your account has a problem. It may simply be that the login environment looks risky. For example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You are using a network exit shared by many users.&lt;/li&gt;
&lt;li&gt;The current IP range has been heavily used for registrations or suspicious logins.&lt;/li&gt;
&lt;li&gt;The account is brand new but immediately accesses a resource-intensive tool.&lt;/li&gt;
&lt;li&gt;The device, region, or network changes frequently.&lt;/li&gt;
&lt;li&gt;Free-tier usage patterns resemble those of bulk accounts.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you recently experienced account anomalies, login restrictions, or false bans, your network environment may have been flagged along with others using the same exit. Shared nodes used by many people carry inherently higher risk.&lt;/p&gt;
&lt;h2 id=&#34;why-codex-triggers-it-more-often&#34;&gt;Why Codex triggers it more often
&lt;/h2&gt;&lt;p&gt;Codex differs from normal chat—it is closer to a development tool, potentially involves heavier resource usage, and is more attractive for bulk accounts draining free quotas.&lt;/p&gt;
&lt;p&gt;So it is not unusual for the same account to look fine on the regular ChatGPT page but hit phone verification in the Codex login flow. Think of it as different product entry points applying different risk judgments.&lt;/p&gt;
&lt;p&gt;For normal users, this kind of verification is usually not targeting individuals—it is aimed at curbing mass registration and quota abuse. But if your network environment is not clean, you can get caught in the crossfire.&lt;/p&gt;
&lt;h2 id=&#34;approach-1-upgrade-to-plus&#34;&gt;Approach 1: Upgrade to Plus
&lt;/h2&gt;&lt;p&gt;If you use ChatGPT or Codex long-term, the simplest fix is upgrading to ChatGPT Plus.&lt;/p&gt;
&lt;p&gt;In practice, paid accounts are generally less likely to trigger quota-abuse risk controls than free accounts. A Plus account is also better suited for stable use of Codex, advanced ChatGPT models, and other high-frequency features.&lt;/p&gt;
&lt;p&gt;That said, upgrading to Plus does not mean you will never see another verification prompt. If it still asks for a phone number after upgrading, the common cause is still the network environment.&lt;/p&gt;
&lt;p&gt;At this point, check:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Whether you are on a shared network used by many people.&lt;/li&gt;
&lt;li&gt;Whether your exit IP keeps changing.&lt;/li&gt;
&lt;li&gt;Whether you have been using low-quality proxies or public nodes long-term.&lt;/li&gt;
&lt;li&gt;Whether many OpenAI accounts are active on the same network.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If possible, switching to a more stable and cleaner network environment before logging in is usually more effective than repeated retries.&lt;/p&gt;
&lt;h2 id=&#34;approach-2-check-your-network-environment&#34;&gt;Approach 2: Check your network environment
&lt;/h2&gt;&lt;p&gt;Many login verification problems that look like account issues are fundamentally network issues.&lt;/p&gt;
&lt;p&gt;If a particular exit IP is shared by many users, or has been used for bulk registration, suspicious logins, or automated requests, it is more likely to be flagged. When that happens, even a legitimate user may be asked for additional verification when logging into ChatGPT or Codex.&lt;/p&gt;
&lt;p&gt;Check from these angles:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Switch to a more stable network environment.&lt;/li&gt;
&lt;li&gt;Avoid public, cheap, high-user-count shared nodes.&lt;/li&gt;
&lt;li&gt;Minimize frequent region switches over short periods.&lt;/li&gt;
&lt;li&gt;Do not rapidly switch between multiple accounts in the same browser.&lt;/li&gt;
&lt;li&gt;If using a proxy, prefer lines with more stable quality and less abuse history.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You can also use third-party network quality detection tools to check the risk profile of your current IP, but such results are only a reference and do not fully represent OpenAI&amp;rsquo;s internal assessment.&lt;/p&gt;
&lt;h2 id=&#34;approach-3-complete-the-phone-verification-as-required&#34;&gt;Approach 3: Complete the phone verification as required
&lt;/h2&gt;&lt;p&gt;If the system explicitly asks for phone verification, the safest approach is to complete it as requested.&lt;/p&gt;
&lt;p&gt;It is advisable to use a phone number you can keep long-term. That way, if your account later needs security verification, recovery, or alerts, you can handle them.&lt;/p&gt;
&lt;p&gt;Do not bind important accounts to numbers of unknown origin, shared numbers, or numbers you cannot keep. It may get you through the short term, but in the long run it creates risks for account recovery, security audits, and secondary verification.&lt;/p&gt;
&lt;p&gt;If you are using a work account, team account, or a development account you rely on heavily, you should especially avoid temporary numbers you cannot control. Account security matters more than short-term convenience.&lt;/p&gt;
&lt;h2 id=&#34;what-to-watch-for-when-upgrading-to-plus&#34;&gt;What to watch for when upgrading to Plus
&lt;/h2&gt;&lt;p&gt;If you plan to upgrade to Plus, confirm a few things first:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The account itself can log in normally.&lt;/li&gt;
&lt;li&gt;The current network environment is stable and not frequently hopping regions.&lt;/li&gt;
&lt;li&gt;The payment method is reliable—do not use third-party proxy payments of unknown origin.&lt;/li&gt;
&lt;li&gt;After upgrading, keep the payment record and account email safe.&lt;/li&gt;
&lt;li&gt;Do not share the account with multiple people.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Many account problems are not caused by Plus itself, but by the network, payment, and sharing habits around the upgrade. An account that is shared by many, logged into from different locations, and frequently environment-switched can trigger security verification even if it is paid.&lt;/p&gt;
&lt;p&gt;If you are only trying it out occasionally, a free account works fine. But if you already use Codex as a daily development tool, Plus is better suited for long-term use.&lt;/p&gt;
&lt;h2 id=&#34;quota-farming-is-not-recommended&#34;&gt;Quota farming is not recommended
&lt;/h2&gt;&lt;p&gt;The free quota for tools like Codex is meant to let regular users try and experience the product. If large numbers of bulk accounts continuously drain that quota, the platform has no choice but to keep tightening risk controls.&lt;/p&gt;
&lt;p&gt;The result is that normal users get affected too: more login friction, more verification steps, more false bans, and higher account usage costs.&lt;/p&gt;
&lt;p&gt;For people genuinely using Codex for coding, modifying projects, and running engineering tasks, it is more worthwhile to clean up the account and network environment than to spend time dodging risk controls. In the long run, that is easier than constantly registering new accounts, switching nodes, and dealing with verification issues.&lt;/p&gt;
&lt;h2 id=&#34;summary&#34;&gt;Summary
&lt;/h2&gt;&lt;p&gt;When ChatGPT or Codex asks for phone verification at login, it is usually tied to account risk controls, free-quota abuse, and network environment risk. It does not necessarily mean the account violated any rules, but it does indicate that the current login environment or account state triggered a higher verification level.&lt;/p&gt;
&lt;p&gt;The order of action is straightforward:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;First check the network environment; avoid shared high-risk exits.&lt;/li&gt;
&lt;li&gt;If you are a long-term user, consider upgrading to Plus.&lt;/li&gt;
&lt;li&gt;If the system requires phone verification, use a number you can control long-term.&lt;/li&gt;
&lt;li&gt;Avoid bulk registration, account sharing, and frequent login-environment switching.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The core of stable AI tool usage is not about bypassing verification forever—it is about keeping the account, network, and usage patterns as normal as possible. That reduces login friction and lowers the chance of collateral damage later.&lt;/p&gt;
</description>
        </item>
        <item>
        <title>OpenAI Introduces Advanced Account Security: A Stronger Layer of Protection for ChatGPT and Codex Accounts</title>
        <link>https://knightli.com/en/2026/05/01/openai-advanced-account-security/</link>
        <pubDate>Fri, 01 May 2026 06:15:29 +0800</pubDate>
        
        <guid>https://knightli.com/en/2026/05/01/openai-advanced-account-security/</guid>
        <description>&lt;p&gt;OpenAI introduced &lt;code&gt;Advanced Account Security&lt;/code&gt; on April 30, 2026, as an optional high-security setting for ChatGPT accounts.&lt;/p&gt;
&lt;p&gt;It is mainly designed for two groups of users. One includes journalists, elected officials, political dissidents, researchers, and others who are more likely to face targeted attacks. The other includes security-conscious users who want stronger protection for their ChatGPT and Codex accounts.&lt;/p&gt;
&lt;p&gt;Once enabled, this feature protects not only ChatGPT, but also Codex when accessed through the same login account.&lt;/p&gt;
&lt;h2 id=&#34;why-chatgpt-accounts-need-a-higher-level-of-security&#34;&gt;Why ChatGPT accounts need a higher level of security
&lt;/h2&gt;&lt;p&gt;Many people now use ChatGPT for increasingly private and high-stakes work.&lt;/p&gt;
&lt;p&gt;A ChatGPT account may contain:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Personal questions and long-running conversations&lt;/li&gt;
&lt;li&gt;Work documents and project context&lt;/li&gt;
&lt;li&gt;Connected tools and workflows&lt;/li&gt;
&lt;li&gt;Code and development tasks in Codex&lt;/li&gt;
&lt;li&gt;Enterprise, research, or security-related materials&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If an account is taken over, the loss is not limited to leaked chat history. An attacker may also access connected tools, view sensitive context, or interfere with work in progress.&lt;/p&gt;
&lt;p&gt;So what OpenAI is introducing is not just another login option. It is a stricter set of account protection measures.&lt;/p&gt;
&lt;h2 id=&#34;what-advanced-account-security-includes&#34;&gt;What Advanced Account Security includes
&lt;/h2&gt;&lt;p&gt;OpenAI places this capability in the Security settings of ChatGPT accounts on the web, where users can opt in.&lt;/p&gt;
&lt;p&gt;After it is enabled, it strengthens account security in several ways.&lt;/p&gt;
&lt;p&gt;First, sign-in becomes stronger.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Advanced Account Security&lt;/code&gt; requires &lt;code&gt;passkeys&lt;/code&gt; or physical security keys and disables password-based login. The goal is to make phishing-resistant sign-in the default for people who need it most.&lt;/p&gt;
&lt;p&gt;Second, account recovery becomes stricter.&lt;/p&gt;
&lt;p&gt;Traditional account recovery often relies on email or SMS. If an attacker controls a user&amp;rsquo;s email account or phone number, they may use that access to reset the account. To reduce this risk, Advanced Account Security disables email and SMS recovery and uses stronger recovery methods instead, such as backup passkeys, security keys, and recovery keys.&lt;/p&gt;
&lt;p&gt;There is an important tradeoff here: after enabling the feature, account recovery depends much more on the user keeping those recovery methods safe. OpenAI explicitly states that if users enrolled in this feature lose their recovery methods, OpenAI Support will not be able to help recover the account.&lt;/p&gt;
&lt;p&gt;Third, sessions become shorter and easier to manage.&lt;/p&gt;
&lt;p&gt;OpenAI shortens sign-in sessions to reduce the exposure window if a device or active session is compromised. Users also receive login alerts and can review and manage active sessions across their devices.&lt;/p&gt;
&lt;p&gt;Fourth, training exclusion becomes automatic.&lt;/p&gt;
&lt;p&gt;For people handling sensitive information, preventing conversations from being used for model training is an important privacy setting. When Advanced Account Security is enabled, that preference takes effect automatically: conversations from those accounts will not be used to train OpenAI models.&lt;/p&gt;
&lt;h2 id=&#34;working-with-yubico-to-promote-physical-security-keys&#34;&gt;Working with Yubico to promote physical security keys
&lt;/h2&gt;&lt;p&gt;OpenAI also announced a partnership with Yubico to offer users a customized security key bundle.&lt;/p&gt;
&lt;p&gt;It includes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;YubiKey C Nano&lt;/code&gt;: designed to stay plugged into a laptop, reducing daily sign-in friction&lt;/li&gt;
&lt;li&gt;&lt;code&gt;YubiKey C NFC&lt;/code&gt;: designed as a backup and for use across laptops and mobile devices&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;OpenAI says users can also use other FIDO-compliant physical security keys or software passkeys.&lt;/p&gt;
&lt;p&gt;This means Advanced Account Security is not tied to one specific piece of hardware. It is designed around phishing-resistant authentication methods.&lt;/p&gt;
&lt;h2 id=&#34;trusted-access-for-cyber-users-will-be-required-to-enable-it&#34;&gt;Trusted Access for Cyber users will be required to enable it
&lt;/h2&gt;&lt;p&gt;OpenAI also says that individual members of &lt;code&gt;Trusted Access for Cyber&lt;/code&gt; who access its more capable and permissive cybersecurity models will be required to enable Advanced Account Security starting June 1, 2026.&lt;/p&gt;
&lt;p&gt;Organizations can meet the requirement in another way: by attesting that their single sign-on workflow already uses phishing-resistant authentication.&lt;/p&gt;
&lt;p&gt;This arrangement makes sense. The more powerful the model capability, the stronger the account protection needs to be. This is especially true for cybersecurity research, vulnerability analysis, and red-teaming scenarios, where the account itself becomes a high-value target.&lt;/p&gt;
&lt;h2 id=&#34;who-should-consider-enabling-it&#34;&gt;Who should consider enabling it
&lt;/h2&gt;&lt;p&gt;This feature is not necessarily for everyone.&lt;/p&gt;
&lt;p&gt;If you only use ChatGPT for ordinary conversations and do not want to deal with the complexity of stricter recovery, it may be reasonable to wait.&lt;/p&gt;
&lt;p&gt;But the following users should seriously consider it:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;People who often handle sensitive work materials in ChatGPT&lt;/li&gt;
&lt;li&gt;People who use Codex with private code repositories&lt;/li&gt;
&lt;li&gt;Journalists, public affairs professionals, researchers, executives, and other high-risk users&lt;/li&gt;
&lt;li&gt;Cybersecurity professionals&lt;/li&gt;
&lt;li&gt;People already comfortable with passkeys or physical security keys&lt;/li&gt;
&lt;li&gt;People especially concerned about phishing, SIM swapping, or email account takeover&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Before enabling it, it is best to prepare backup passkeys, security keys, and recovery keys, and make sure they are stored properly. Otherwise, security improves, but account recovery becomes much harder.&lt;/p&gt;
&lt;h2 id=&#34;what-this-means-for-ai-products&#34;&gt;What this means for AI products
&lt;/h2&gt;&lt;p&gt;Advanced Account Security is not a model capability update, but it reflects the fact that AI products are entering higher-risk usage.&lt;/p&gt;
&lt;p&gt;As ChatGPT and Codex begin to carry workflows, code, documents, enterprise connectors, and long-term context, the account is no longer just a way to &amp;ldquo;log in to a chat tool.&amp;rdquo; It becomes the key to an AI work environment.&lt;/p&gt;
&lt;p&gt;The more these products resemble personal workspaces, the more important account security, recovery mechanisms, session management, and training-data controls become.&lt;/p&gt;
&lt;p&gt;OpenAI&amp;rsquo;s decision to put passkeys, physical security keys, recovery restrictions, session management, and training exclusion into one setting is the right direction. It gives high-risk users a clear place to raise account protection to a level more suitable for sensitive work.&lt;/p&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;Advanced Account Security&lt;/code&gt; can be understood as a high-security mode for ChatGPT and Codex.&lt;/p&gt;
&lt;p&gt;It reduces the risk of account takeover through stronger sign-in, stricter recovery, shorter sessions, login alerts, and automatic training exclusion. The tradeoff is that users must manage their own recovery methods more carefully, because traditional email and SMS recovery are no longer available after enabling it, and OpenAI Support cannot serve as a fallback.&lt;/p&gt;
&lt;p&gt;If you already use ChatGPT or Codex for important work, especially involving private code, sensitive documents, or a high-risk identity, this feature is worth paying attention to.&lt;/p&gt;
&lt;p&gt;Reference link:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://openai.com/index/advanced-account-security/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Introducing Advanced Account Security - OpenAI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>How to Split Tasks Between ChatGPT, Claude, and Gemini: Choosing for Daily Use, Coding, and Special Capabilities</title>
        <link>https://knightli.com/en/2026/04/25/chatgpt-claude-gemini-task-selection/</link>
        <pubDate>Sat, 25 Apr 2026 10:51:19 +0800</pubDate>
        
        <guid>https://knightli.com/en/2026/04/25/chatgpt-claude-gemini-task-selection/</guid>
        <description>&lt;p&gt;Many people no longer rely on just one model. Instead, they switch back and forth between &lt;code&gt;ChatGPT&lt;/code&gt;, &lt;code&gt;Claude&lt;/code&gt;, and &lt;code&gt;Gemini&lt;/code&gt;. That makes the question much more practical: &lt;strong&gt;which kinds of tasks should go to which model?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This feels confusing not because all three are weak, but because they are now strong in different ways. If you still choose based on a vague standard like “which one is smarter,” you can easily end up picking the wrong tool.&lt;/p&gt;
&lt;p&gt;If we simplify the conclusion first, it roughly looks like this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;For daily conversations and general-purpose tasks, many people start with &lt;code&gt;ChatGPT&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;For command-line coding, long-context collaboration, and sustained task execution, &lt;code&gt;Claude&lt;/code&gt; often feels smoother&lt;/li&gt;
&lt;li&gt;When you need Google ecosystem integration, search, multimodal entry points, or certain product-level capabilities, &lt;code&gt;Gemini&lt;/code&gt; tends to stand out more&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Let’s break that down into three parts.&lt;/p&gt;
&lt;h2 id=&#34;1-daily-conversations-why-many-people-still-open-chatgpt-first&#34;&gt;1. Daily conversations: why many people still open &lt;code&gt;ChatGPT&lt;/code&gt; first
&lt;/h2&gt;&lt;p&gt;For most everyday scenarios, &lt;code&gt;ChatGPT&lt;/code&gt; still feels like the “default entry point.”&lt;/p&gt;
&lt;p&gt;This is not about a single benchmark. It is about the overall experience:&lt;br&gt;
when you want to ask a quick question, organize your thoughts, draft some copy, create a first version, or summarize a piece of material, &lt;code&gt;ChatGPT&lt;/code&gt; usually feels fairly balanced.&lt;/p&gt;
&lt;p&gt;Its strengths often show up in a few places:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Its response style is relatively stable&lt;/li&gt;
&lt;li&gt;The learning curve is low for general users&lt;/li&gt;
&lt;li&gt;Most broad tasks do not require much extra prompt tuning&lt;/li&gt;
&lt;li&gt;The product feels polished and works well for frequent everyday use&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So if your task is something like this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Help me organize a topic&lt;/li&gt;
&lt;li&gt;Turn an idea into structured content&lt;/li&gt;
&lt;li&gt;Summarize a long article&lt;/li&gt;
&lt;li&gt;Brainstorm several approaches&lt;/li&gt;
&lt;li&gt;Rewrite something more clearly&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Then &lt;code&gt;ChatGPT&lt;/code&gt; is often a very natural place to start.&lt;/p&gt;
&lt;p&gt;That does not mean it is always the strongest option for every professional task. It means that for broad, general-purpose use, it often feels more like the default workspace.&lt;/p&gt;
&lt;h2 id=&#34;2-command-line-coding-and-long-tasks-why-many-people-lean-toward-claude&#34;&gt;2. Command-line coding and long tasks: why many people lean toward &lt;code&gt;Claude&lt;/code&gt;
&lt;/h2&gt;&lt;p&gt;Once a task shifts from “let’s chat” to “let’s keep working until this is done,” many people start preferring &lt;code&gt;Claude&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;This is especially true in scenarios like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Command-line programming&lt;/li&gt;
&lt;li&gt;Understanding the context of a large project&lt;/li&gt;
&lt;li&gt;Coordinating edits across multiple files&lt;/li&gt;
&lt;li&gt;Debugging long task chains&lt;/li&gt;
&lt;li&gt;Reading code while steadily moving a task forward&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In this kind of work, the key is usually not whether one reply is especially impressive. It is whether the model can stay stable across a longer chain of work.&lt;/p&gt;
&lt;p&gt;The reason &lt;code&gt;Claude&lt;/code&gt; is often favored is usually not that “it says one sentence better than the others,” but that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It holds up better on long-context tasks&lt;/li&gt;
&lt;li&gt;It feels steadier when reading files, logs, and rules continuously&lt;/li&gt;
&lt;li&gt;It is better suited to gradually advancing complex coding work&lt;/li&gt;
&lt;li&gt;In command-line and agent workflows, it is often treated as the primary working model&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you are doing &lt;code&gt;vibe coding&lt;/code&gt;, fixing bugs in the terminal, understanding project structure, or changing features across multiple files, &lt;code&gt;Claude&lt;/code&gt;’s strengths tend to show up more clearly.&lt;/p&gt;
&lt;p&gt;Put simply, &lt;code&gt;Claude&lt;/code&gt; feels more like a model you work with to get things done, not just one you ask a question and get an answer from.&lt;/p&gt;
&lt;h2 id=&#34;3-gemini-often-wins-not-by-competing-head-on-in-everything&#34;&gt;3. &lt;code&gt;Gemini&lt;/code&gt; often wins not by “competing head-on in everything”
&lt;/h2&gt;&lt;p&gt;When people talk about &lt;code&gt;Gemini&lt;/code&gt;, they often frame the question like this: is it the strongest of the three?&lt;/p&gt;
&lt;p&gt;But in real usage, the more useful question is usually not that. It is: &lt;strong&gt;in which scenarios is it especially worth pulling out and using on purpose?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Gemini&lt;/code&gt;’s value often shows up more clearly in these directions:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Integration with the Google ecosystem&lt;/li&gt;
&lt;li&gt;Search and information gathering&lt;/li&gt;
&lt;li&gt;Multimodal entry points&lt;/li&gt;
&lt;li&gt;Certain product-side feature linkages&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If your workflow is already close to Google’s toolchain, for example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Search&lt;/li&gt;
&lt;li&gt;Documents&lt;/li&gt;
&lt;li&gt;Email&lt;/li&gt;
&lt;li&gt;Browser-side usage&lt;/li&gt;
&lt;li&gt;Mobile entry points&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Then &lt;code&gt;Gemini&lt;/code&gt;’s practical convenience may matter more than a simple model-score comparison.&lt;/p&gt;
&lt;p&gt;In other words, &lt;code&gt;Gemini&lt;/code&gt; is often useful because it plugs into your workflow more naturally, not just because it may or may not beat someone else in a single response.&lt;/p&gt;
&lt;h2 id=&#34;4-the-useful-way-to-choose-is-not-asking-who-is-strongest-but-asking-what-kind-of-task-you-have&#34;&gt;4. The useful way to choose is not asking who is strongest, but asking what kind of task you have
&lt;/h2&gt;&lt;p&gt;When people compare all three models side by side, the easiest trap is trying to find one “single best” model.&lt;/p&gt;
&lt;p&gt;But real tasks vary too much:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Some are one-off Q&amp;amp;A&lt;/li&gt;
&lt;li&gt;Some are long-running conversations&lt;/li&gt;
&lt;li&gt;Some are software projects&lt;/li&gt;
&lt;li&gt;Some are information retrieval&lt;/li&gt;
&lt;li&gt;Some are multimodal processing&lt;/li&gt;
&lt;li&gt;Some are toolchain collaboration&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So the more effective approach is usually to sort by task type:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If you want a broad, high-frequency assistant that works right away, start with &lt;code&gt;ChatGPT&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;If you need long context, command-line work, coding collaboration, and steady progress on complex tasks, try &lt;code&gt;Claude&lt;/code&gt; first&lt;/li&gt;
&lt;li&gt;If you need help from the Google ecosystem, search, multimodal entry points, or certain product integrations, pay special attention to &lt;code&gt;Gemini&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That kind of division of labor is much closer to real-world use than forcing a single overall champion.&lt;/p&gt;
&lt;h2 id=&#34;5-why-many-heavy-users-subscribe-to-all-three&#34;&gt;5. Why many heavy users subscribe to all three
&lt;/h2&gt;&lt;p&gt;From a light user’s perspective, paying for all three can look redundant.&lt;br&gt;
From a heavy user’s perspective, it is more like assigning different tools to different jobs.&lt;/p&gt;
&lt;p&gt;The reason is simple:&lt;br&gt;
if the strengths of the three models have already started to diverge clearly, then using them together is not really duplicated spending. It is a way to reduce switching costs and trial-and-error costs.&lt;/p&gt;
&lt;p&gt;For example:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use &lt;code&gt;ChatGPT&lt;/code&gt; for daily organization and general Q&amp;amp;A&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;Claude&lt;/code&gt; for primary coding work&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;Gemini&lt;/code&gt; for certain search, multimodal, or Google-related workflows&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The logic of this setup is not fundamentally different from designers installing multiple creative tools or developers using multiple IDEs.&lt;/p&gt;
&lt;h2 id=&#34;6-when-you-should-not-switch-models-too-often&#34;&gt;6. When you should not switch models too often
&lt;/h2&gt;&lt;p&gt;Of course, having more models is not always better.&lt;/p&gt;
&lt;p&gt;If you are still building a stable workflow, jumping too early and too often between three models can actually make things messier. Common issues include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Re-explaining the same task three times&lt;/li&gt;
&lt;li&gt;Getting different suggestions from different models and struggling more to judge them&lt;/li&gt;
&lt;li&gt;Losing context and increasing collaboration costs&lt;/li&gt;
&lt;li&gt;Getting stuck on tool choice before forming your own working boundaries&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So a steadier way is usually this:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Give each model one primary scenario first&lt;/li&gt;
&lt;li&gt;Use it continuously in that scenario for a while&lt;/li&gt;
&lt;li&gt;Gradually build your own habits of division of labor&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That makes it easier to gain reusable experience instead of staying forever in the “let me try this one today” stage.&lt;/p&gt;
&lt;h2 id=&#34;7-a-simple-way-to-remember-it&#34;&gt;7. A simple way to remember it
&lt;/h2&gt;&lt;p&gt;If you just want a practical version to remember, you can use this plain-language split:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ChatGPT&lt;/code&gt;: more like the default general-purpose assistant&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Claude&lt;/code&gt;: more like the main option for long tasks and coding collaboration&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Gemini&lt;/code&gt;: more like the tool with stronger advantages in search, multimodal work, and the Google ecosystem&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is not an absolute rule, and it does not mean the three cannot replace each other. It is simply a more realistic starting point.&lt;/p&gt;
&lt;p&gt;What really matters is not choosing the “strongest model in the universe,” but figuring out as soon as possible:&lt;br&gt;
&lt;strong&gt;for the kind of task in front of you, which model saves the most time, costs the least mental effort, and makes it easiest to get results?&lt;/strong&gt;&lt;/p&gt;
</description>
        </item>
        <item>
        <title>OpenAI Releases GPT-5.5: Stronger Agentic Coding, Knowledge Work, and Research</title>
        <link>https://knightli.com/en/2026/04/24/openai-gpt-5-5-release/</link>
        <pubDate>Fri, 24 Apr 2026 08:39:56 +0800</pubDate>
        
        <guid>https://knightli.com/en/2026/04/24/openai-gpt-5-5-release/</guid>
        <description>&lt;p&gt;OpenAI published &lt;a class=&#34;link&#34; href=&#34;https://openai.com/index/introducing-gpt-5-5/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Introducing GPT-5.5&lt;/a&gt; on April 23, 2026. Judging from the official page, this release is not just about making the model &amp;ldquo;smarter&amp;rdquo;; it is more about whether the model can keep pushing complex tasks forward.&lt;/p&gt;
&lt;p&gt;OpenAI positions GPT-5.5 as a model better suited for real work. It is expected not only to answer questions, but also to write code, debug, research online, analyze data, create documents and spreadsheets, operate software, and move across tools until the task is finished.&lt;/p&gt;
&lt;h2 id=&#34;1-where-gpt-55-is-strongest&#34;&gt;1. Where GPT-5.5 Is Strongest
&lt;/h2&gt;&lt;p&gt;The release page repeatedly highlights four areas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Agentic coding&lt;/li&gt;
&lt;li&gt;Computer use and tool use&lt;/li&gt;
&lt;li&gt;Knowledge work&lt;/li&gt;
&lt;li&gt;Early scientific research assistance&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In other words, GPT-5.5 is aimed less at short Q&amp;amp;A and more at long-running tasks. For example, an engineering problem is not just &amp;ldquo;how should this code be changed&amp;rdquo;; the model needs to understand the project structure, locate the cause of failure, edit related files, add tests, verify results, and reduce repeated prompting from the user.&lt;/p&gt;
&lt;p&gt;OpenAI also emphasizes that GPT-5.5 uses fewer tokens in Codex tasks. This matters in practice because coding agents can consume tokens quickly once they start reading files, running commands, and fixing bugs. If a model can complete the same task in fewer steps, both cost and waiting time go down.&lt;/p&gt;
&lt;h2 id=&#34;2-coding-is-the-main-showcase&#34;&gt;2. Coding Is the Main Showcase
&lt;/h2&gt;&lt;p&gt;OpenAI calls GPT-5.5 its strongest agentic coding model to date.&lt;/p&gt;
&lt;p&gt;The most notable public numbers include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Terminal-Bench 2.0&lt;/code&gt;: GPT-5.5 reaches &lt;code&gt;82.7%&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SWE-Bench Pro&lt;/code&gt;: GPT-5.5 reaches &lt;code&gt;58.6%&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;OpenAI&amp;rsquo;s internal &lt;code&gt;Expert-SWE&lt;/code&gt;: GPT-5.5 also scores higher than GPT-5.4&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These evaluations have one thing in common: they are closer to real engineering workflows than isolated algorithm questions. Terminal-Bench in particular involves command-line operations, planning, trial and error, tool coordination, and multi-step verification.&lt;/p&gt;
&lt;p&gt;For everyday developers, the implication is direct: whether a model can take on larger tasks depends on whether it can hold context for a long time, check its own assumptions, know when to run tests, and understand what else a change may affect.&lt;/p&gt;
&lt;p&gt;The value of GPT-5.5 in Codex also shows up mainly in these behaviors. It feels more like a collaborator that can take over part of an engineering task, rather than a tool that only completes code fragments.&lt;/p&gt;
&lt;h2 id=&#34;3-knowledge-work-becomes-a-core-scenario&#34;&gt;3. Knowledge Work Becomes a Core Scenario
&lt;/h2&gt;&lt;p&gt;Beyond coding, OpenAI is placing GPT-5.5 into a broader office-work context.&lt;/p&gt;
&lt;p&gt;The announcement says GPT-5.5 can generate documents, spreadsheets, and slide decks better in Codex, and is also better suited for operational research, spreadsheet modeling, and organizing business materials. Combined with computer use, its goal is not merely to offer suggestions, but to participate in the full workflow of finding information, understanding content, using tools, checking output, and turning raw material into a result.&lt;/p&gt;
&lt;p&gt;The page also notes that OpenAI already uses Codex across many internal departments, including software engineering, finance, communications, marketing, data science, and product management. The interesting part is not any single example, but the direction: OpenAI is expanding Codex from a developer tool into a more general work tool.&lt;/p&gt;
&lt;p&gt;In ChatGPT, GPT-5.5 Thinking is available to Plus, Pro, Business, and Enterprise users; GPT-5.5 Pro is aimed at harder questions and higher-accuracy work, and is available to Pro, Business, and Enterprise users.&lt;/p&gt;
&lt;h2 id=&#34;4-research-capability-is-more-than-better-answers&#34;&gt;4. Research Capability Is More Than Better Answers
&lt;/h2&gt;&lt;p&gt;GPT-5.5 also receives a strong research-focused presentation.&lt;/p&gt;
&lt;p&gt;OpenAI says it has improved in genetics, quantitative biology, bioinformatics, mathematical proof, and related areas. The key is not whether the model can recall a fact, but whether it can handle more realistic research problems: reading data, spotting anomalies, proposing analyses, interpreting results, and continuing based on intermediate findings.&lt;/p&gt;
&lt;p&gt;The release page mentions &lt;code&gt;GeneBench&lt;/code&gt; and &lt;code&gt;BixBench&lt;/code&gt;, both of which focus more on multi-stage scientific analysis. OpenAI also says an internal version of GPT-5.5, with a custom harness, helped discover a new proof related to Ramsey numbers and verified it with Lean.&lt;/p&gt;
&lt;p&gt;These examples should not be simplified into &amp;ldquo;AI can now do research independently.&amp;rdquo; But they do suggest that models are moving from answer engines toward research collaborators. In scenarios where code, data, papers, experiment ideas, and notes are mixed together, GPT-5.5&amp;rsquo;s long-horizon reasoning and tool use become especially important.&lt;/p&gt;
&lt;h2 id=&#34;5-inference-efficiency-stronger-without-getting-much-slower&#34;&gt;5. Inference Efficiency: Stronger Without Getting Much Slower
&lt;/h2&gt;&lt;p&gt;One easily overlooked point is that OpenAI says GPT-5.5 matches GPT-5.4 in real-world per-token latency.&lt;/p&gt;
&lt;p&gt;Normally, larger and more capable models bring higher latency. This time, OpenAI emphasizes that inference-system optimization helped GPT-5.5 become more capable while keeping speed stable. The release page also mentions that Codex analyzed production traffic patterns and wrote load-balancing heuristic algorithms, increasing token generation speed by more than &lt;code&gt;20%&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;That detail is interesting: the model is not only served by infrastructure, but also helps improve the infrastructure that serves it.&lt;/p&gt;
&lt;h2 id=&#34;6-safety-gets-stricter-especially-around-cybersecurity&#34;&gt;6. Safety Gets Stricter, Especially Around Cybersecurity
&lt;/h2&gt;&lt;p&gt;Because GPT-5.5 has stronger cybersecurity capabilities, OpenAI is also tightening safety controls.&lt;/p&gt;
&lt;p&gt;The announcement says GPT-5.5 improves over GPT-5.4 in cybersecurity capability, so OpenAI is deploying stricter classifiers, especially for high-risk activity, sensitive cybersecurity requests, and repeated misuse.&lt;/p&gt;
&lt;p&gt;This means some users may see more refusals or friction when working on cybersecurity-related tasks. OpenAI also offers Trusted Access for Cyber, intended to reduce unnecessary barriers for verified defensive users.&lt;/p&gt;
&lt;p&gt;For ordinary developers, the simple takeaway is: legitimate security hardening, vulnerability fixing, and code auditing should continue to be supported, while high-risk attack workflows will be more tightly controlled.&lt;/p&gt;
&lt;h2 id=&#34;7-availability-and-api-pricing&#34;&gt;7. Availability and API Pricing
&lt;/h2&gt;&lt;p&gt;According to OpenAI&amp;rsquo;s release page, GPT-5.5 availability is as follows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ChatGPT: GPT-5.5 Thinking for Plus, Pro, Business, and Enterprise users&lt;/li&gt;
&lt;li&gt;ChatGPT: GPT-5.5 Pro for Pro, Business, and Enterprise users&lt;/li&gt;
&lt;li&gt;Codex: GPT-5.5 for Plus, Pro, Business, Enterprise, Edu, and Go plans&lt;/li&gt;
&lt;li&gt;Codex: &lt;code&gt;400K&lt;/code&gt; context window&lt;/li&gt;
&lt;li&gt;Codex Fast mode: about &lt;code&gt;1.5x&lt;/code&gt; token generation speed at &lt;code&gt;2.5x&lt;/code&gt; the cost&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For the API, OpenAI says &lt;code&gt;gpt-5.5&lt;/code&gt; and &lt;code&gt;gpt-5.5-pro&lt;/code&gt; will be available soon.&lt;/p&gt;
&lt;p&gt;The announced API prices are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;gpt-5.5&lt;/code&gt;: &lt;code&gt;US$5 / 1M tokens&lt;/code&gt; input and &lt;code&gt;US$30 / 1M tokens&lt;/code&gt; output&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gpt-5.5-pro&lt;/code&gt;: &lt;code&gt;US$30 / 1M tokens&lt;/code&gt; input and &lt;code&gt;US$180 / 1M tokens&lt;/code&gt; output&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gpt-5.5&lt;/code&gt; API context window: &lt;code&gt;1M&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Batch and Flex are half the standard API price&lt;/li&gt;
&lt;li&gt;Priority processing is &lt;code&gt;2.5x&lt;/code&gt; the standard price&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is clearly more expensive than many everyday models, so it is better suited for high-value tasks: complex engineering changes, long-document analysis, office automation, research assistance, and important business workflows, rather than casual chat.&lt;/p&gt;
&lt;h2 id=&#34;8-how-to-read-this-release&#34;&gt;8. How to Read This Release
&lt;/h2&gt;&lt;p&gt;In one sentence, GPT-5.5 is about OpenAI pushing models further from &amp;ldquo;answering questions&amp;rdquo; toward &amp;ldquo;getting work done.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;The most important part is not just higher benchmark scores, but the convergence of several capabilities:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Better long-task persistence&lt;/li&gt;
&lt;li&gt;More reliable tool use&lt;/li&gt;
&lt;li&gt;Stronger engineering context understanding&lt;/li&gt;
&lt;li&gt;Better fit for documents, spreadsheets, research, and business workflows&lt;/li&gt;
&lt;li&gt;Longer context and higher token efficiency&lt;/li&gt;
&lt;li&gt;Stricter controls around high-risk capabilities&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For developers, the most interesting thing to test is complex engineering work in Codex. For enterprise users, the bigger question is whether it can turn some cross-tool, cross-document, cross-process work into deliverable output.&lt;/p&gt;
&lt;p&gt;GPT-5.5 is not a small update aimed only at chat experience. It looks more like another step in OpenAI&amp;rsquo;s push toward AI as an execution layer for work.&lt;/p&gt;
&lt;h2 id=&#34;related-links&#34;&gt;Related Links
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://openai.com/index/introducing-gpt-5-5/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Introducing GPT-5.5 - OpenAI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>OpenAI Introduces ChatGPT Images 2.0: Image Generation Starts Moving Toward Deliverable Output</title>
        <link>https://knightli.com/en/2026/04/22/openai-chatgpt-images-2-0-deliverable-image-generation/</link>
        <pubDate>Wed, 22 Apr 2026 14:21:45 +0800</pubDate>
        
        <guid>https://knightli.com/en/2026/04/22/openai-chatgpt-images-2-0-deliverable-image-generation/</guid>
        <description>&lt;p&gt;OpenAI published &lt;a class=&#34;link&#34; href=&#34;https://openai.com/index/introducing-chatgpt-images-2-0/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Introducing ChatGPT Images 2.0&lt;/a&gt; on April 21, 2026. Judging from the announcement page, the main point is not simply that the images look better. The bigger message is that image generation is moving toward something more controllable, more layout-aware, and more directly usable.&lt;/p&gt;
&lt;p&gt;If you look only at this launch page, it reads more like a dense capability showcase than a traditional technical announcement. There is very little about model architecture, training details, or benchmarks. Instead, OpenAI uses a large set of examples to answer a more practical question: can ChatGPT now handle more of the work that previously required repeated manual fixes for text, layout, and final polish?&lt;/p&gt;
&lt;h2 id=&#34;01-the-clearest-signals-in-this-release&#34;&gt;01 The clearest signals in this release
&lt;/h2&gt;&lt;p&gt;The most prominent phrases on the page already summarize the focus:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Greater precision and control&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Stronger across languages&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Stylistic sophistication and realism&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Taken together, those three ideas say a lot.&lt;/p&gt;
&lt;p&gt;First, the emphasis is shifting away from imagination alone and toward control. The page includes many examples such as posters, magazine spreads, promo pages, infographics, character sheets, comic pages, and print-ready bookmark designs. What these examples share is not just visual appeal. They require text handling, hierarchy, whitespace, composition, stylistic consistency, and format control at the same time. That suggests OpenAI is intentionally pushing the product from &amp;ldquo;generate an image&amp;rdquo; toward &amp;ldquo;generate a visual asset people can actually use.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Second, multilingual text rendering is being treated as a headline feature. The page includes multilingual posters, book covers, a Korean hospitality campaign, Japanese manga, and several typography-focused examples. That matters because one of the most persistent weak points in image models has been long text, complex layouts, and non-English scripts. OpenAI putting this front and center is itself a signal: text rendering and cross-language layout are now capabilities it believes are worth showcasing directly.&lt;/p&gt;
&lt;p&gt;Third, the stylistic range is very broad. The examples span photorealistic images, retro collage posters, Bauhaus-inspired graphics, fashion editorials, black-and-white documentary styles, children&amp;rsquo;s-book illustrations, manga, educational infographics, product grids, and character reference sheets. The message is not only that the model can imitate many visual styles. It is that the system is trying to adapt to a wider set of real visual tasks.&lt;/p&gt;
&lt;h2 id=&#34;02-why-this-looks-like-a-move-toward-deliverable-output&#34;&gt;02 Why this looks like a move toward deliverable output
&lt;/h2&gt;&lt;p&gt;From the announcement itself, ChatGPT Images 2.0 looks less like a stronger text-to-image model and more like an upgraded visual production tool.&lt;/p&gt;
&lt;p&gt;Earlier models could produce impressive pictures, but the experience often broke down when the task changed into things like these:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;creating a poster with a full headline, subtitle, and supporting copy&lt;/li&gt;
&lt;li&gt;building a magazine or promo page with dense information&lt;/li&gt;
&lt;li&gt;generating a comic page with continuity across characters and panels&lt;/li&gt;
&lt;li&gt;producing marketing assets with fixed aspect ratios, clear layout constraints, and brand tone&lt;/li&gt;
&lt;li&gt;creating polished visual content that includes multilingual text&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This release seems designed to answer those older limitations directly.&lt;/p&gt;
&lt;p&gt;The page includes educational infographics, design-trend posters, print-ready bookmark layouts, a cafe launch poster, tourism promo material, product-merch mockups, and a redesigned academic poster. These are not just images that look nice at a glance. They are much closer to semi-finished or even finished outputs from real creative workflows.&lt;/p&gt;
&lt;p&gt;In that sense, the most important change here may not be a simple increase in image quality. It may be that the model is starting to look more like a system for content production, brand materials, education, and lightweight design work.&lt;/p&gt;
&lt;h2 id=&#34;03-what-this-means-for-chatgpts-product-direction&#34;&gt;03 What this means for ChatGPT&amp;rsquo;s product direction
&lt;/h2&gt;&lt;p&gt;The structure of the announcement also hints at a broader product shift.&lt;/p&gt;
&lt;p&gt;OpenAI does not present ChatGPT Images 2.0 as a niche tool only for artists or visual creators. Instead, it repeatedly frames the feature through research, reasoning, source transformation, layout organization, knowledge communication, and marketing output. The page even includes examples built around math proofs, design trends, historical notes, and academic papers.&lt;/p&gt;
&lt;p&gt;That suggests image generation inside ChatGPT is no longer just about adding a picture to a chat or generating a single illustration. It is moving closer to being a general-purpose expression layer. The goal seems to be this: once a user has already researched, thought through, organized, and written something in ChatGPT, the system should also be able to handle the final visual output.&lt;/p&gt;
&lt;p&gt;If that direction continues, competition in image generation will rely less on pure aesthetics or realism alone and more on capabilities like these:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;whether the system can reliably handle complex text&lt;/li&gt;
&lt;li&gt;whether it can preserve consistency across pages or panels&lt;/li&gt;
&lt;li&gt;whether it can produce layouts closer to real working materials&lt;/li&gt;
&lt;li&gt;whether it can connect naturally to research, writing, marketing, and teaching workflows&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;04-what-the-announcement-does-not-say&#34;&gt;04 What the announcement does not say
&lt;/h2&gt;&lt;p&gt;At the same time, the format of the page also makes its limits clear.&lt;/p&gt;
&lt;p&gt;As of the official page published on April 21, 2026, the announcement focuses much more on outputs than on methods. It does not go into detail about:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;quantified improvements over the previous generation&lt;/li&gt;
&lt;li&gt;explicit metrics for text accuracy or multilingual rendering&lt;/li&gt;
&lt;li&gt;failure boundaries for complex layout tasks&lt;/li&gt;
&lt;li&gt;API details, pricing, access modes, or enterprise integration specifics&lt;/li&gt;
&lt;li&gt;concrete changes to safety policies or generation limits&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So the page is best read as a product signal rather than a full technical specification.&lt;/p&gt;
&lt;h2 id=&#34;05-short-conclusion&#34;&gt;05 Short conclusion
&lt;/h2&gt;&lt;p&gt;If I had to summarize ChatGPT Images 2.0 in one sentence, the key upgrade is not that it &amp;ldquo;draws better,&amp;rdquo; but that it is becoming better at producing finished work.&lt;/p&gt;
&lt;p&gt;OpenAI clearly wants image generation to evolve from an inspiration tool into a production tool that is more executable, more layout-aware, more communicative, and more directly usable. Text control, multilingual output, layout structure, stylistic range, and long-form visual organization used to be places where image models often showed their weaknesses. In this release, those same areas are being presented as selling points.&lt;/p&gt;
&lt;p&gt;That does not mean image generation has solved every design problem. But this announcement does suggest a shift in what matters. The next competitive edge may not come from who can generate the most striking single image. It may come from who can most reliably generate visual content that is actually ready to use.&lt;/p&gt;
&lt;h2 id=&#34;related-links&#34;&gt;Related Links
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://openai.com/index/introducing-chatgpt-images-2-0/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Introducing ChatGPT Images 2.0 - OpenAI&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>codex-quota Practical Guide: Local, Web, and Docker Usage with Original CLI Commands</title>
        <link>https://knightli.com/en/2026/04/16/codex-quota-cli-web-docker-guide/</link>
        <pubDate>Thu, 16 Apr 2026 18:13:04 +0800</pubDate>
        
        <guid>https://knightli.com/en/2026/04/16/codex-quota-cli-web-docker-guide/</guid>
        <description>&lt;h2 id=&#34;what-this-project-does&#34;&gt;What This Project Does
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;codex-quota&lt;/code&gt; is a lightweight tool for checking ChatGPT Codex quota usage, with data fetched from &lt;code&gt;https://chatgpt.com/backend-api/wham/usage&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Main features:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Supports both single-account and multi-account queries (&lt;code&gt;account/*.auth.json&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Outputs &lt;code&gt;five_hour%&lt;/code&gt;, &lt;code&gt;weekly%&lt;/code&gt;, &lt;code&gt;weekly_reset&lt;/code&gt;, and marks the source (&lt;code&gt;network&lt;/code&gt; or &lt;code&gt;cache&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Uses exponential backoff retries for temporary failures (&lt;code&gt;408&lt;/code&gt;, &lt;code&gt;429&lt;/code&gt;, &lt;code&gt;5xx&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Includes local caching to reduce repeated requests when quota is already exhausted.&lt;/li&gt;
&lt;li&gt;Provides a Web Dashboard, JSON API, and auth file management pages.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Advantages:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Lightweight: runs with simple scripts and minimal dependencies.&lt;/li&gt;
&lt;li&gt;Practical: supports both CLI and Web entry points.&lt;/li&gt;
&lt;li&gt;Deployable: works with Docker and Docker Compose.&lt;/li&gt;
&lt;li&gt;Easy to operate: includes retry, cache, and scheduled refresh support.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;prepare-account-credentials-first&#34;&gt;Prepare Account Credentials First
&lt;/h2&gt;&lt;p&gt;Create credential files in &lt;code&gt;account/&amp;lt;name&amp;gt;.auth.json&lt;/code&gt;, for example:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;tokens&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;#34;access_token&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;eyJ...&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;#34;account_id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;user-xxxxxxxx&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Explanation:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;access_token&lt;/code&gt; and &lt;code&gt;account_id&lt;/code&gt; are required by the usage API.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;name&amp;gt;&lt;/code&gt; in the filename is used as the account name in output.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;local-cli-usage-keep-original-commands&#34;&gt;Local CLI Usage (Keep Original Commands)
&lt;/h2&gt;&lt;p&gt;Install dependencies:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pip install -r requirements.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Explanation: installs project dependencies.&lt;/p&gt;
&lt;p&gt;Query all accounts:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;python codex_quota.py
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Explanation: reads &lt;code&gt;account/*.auth.json&lt;/code&gt; and outputs quota summary for all accounts.&lt;/p&gt;
&lt;p&gt;Query one account:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;python codex_quota.py your_account_name
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Explanation: only queries &lt;code&gt;account/your_account_name.auth.json&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Force refresh (skip cache):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;python codex_quota.py --refresh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Explanation: ignores local cache and fetches fresh data directly.&lt;/p&gt;
&lt;h2 id=&#34;cli-options-aligned-with-readme&#34;&gt;CLI Options (Aligned with README)
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;account_name&lt;/code&gt;: optional account name (without &lt;code&gt;.auth.json&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--account-dir&lt;/code&gt;: auth directory, default &lt;code&gt;account&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--chatgpt-url&lt;/code&gt;: quota API endpoint.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--raw-json&lt;/code&gt;: print full JSON response body.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--raw-headers&lt;/code&gt;: print response headers.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--refresh&lt;/code&gt;: ignore cache.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--retries&lt;/code&gt;: retry count, default &lt;code&gt;3&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--retry-delay&lt;/code&gt;: base retry delay in seconds, default &lt;code&gt;2.0&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;web-dashboard-usage-keep-original-command&#34;&gt;Web Dashboard Usage (Keep Original Command)
&lt;/h2&gt;&lt;p&gt;Start the service:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;python codex_quota_service.py --host 0.0.0.0 --port &lt;span class=&#34;m&#34;&gt;8081&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Explanation: starts HTTP service listening on port &lt;code&gt;8081&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Access URL: &lt;code&gt;http://localhost:8081&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Service options:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--host&lt;/code&gt;: bind address, default &lt;code&gt;0.0.0.0&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--port&lt;/code&gt;: service port, default &lt;code&gt;8081&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--interval-seconds&lt;/code&gt;: scheduled refresh interval, default &lt;code&gt;3600&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--account-dir&lt;/code&gt;: auth directory, default &lt;code&gt;account&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--state-file&lt;/code&gt;: state file path, default &lt;code&gt;&amp;lt;account-dir&amp;gt;/codex_quota_web_results.json&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--account-name&lt;/code&gt;: optional single-account mode.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--chatgpt-url&lt;/code&gt;: quota API endpoint.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--retries&lt;/code&gt;: retry count.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--retry-delay&lt;/code&gt;: base retry delay.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--refresh&lt;/code&gt;: ignore CLI cache during scheduled runs.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;http-endpoints-for-automation&#34;&gt;HTTP Endpoints (For Automation)
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;GET /&lt;/code&gt;: dashboard page.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GET /api/results&lt;/code&gt;: latest results in JSON.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GET /refresh&lt;/code&gt;: trigger immediate refresh and redirect to &lt;code&gt;/&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GET /auth&lt;/code&gt;: list auth files.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GET /auth/new&lt;/code&gt;: form to create auth file.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GET /auth/edit?name=&amp;lt;account&amp;gt;&lt;/code&gt;: form to edit auth file.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;POST /auth/save&lt;/code&gt;: create/update auth file.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;POST /auth/delete&lt;/code&gt;: delete auth file.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;docker-usage-keep-original-commands&#34;&gt;Docker Usage (Keep Original Commands)
&lt;/h2&gt;&lt;p&gt;Build image:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker build -t codex-quota .
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Explanation: builds the current project as image &lt;code&gt;codex-quota&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Run container (map 8081):&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker run --rm -p 8081:8081 -v ./account:/app/account codex-quota
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Explanation:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--rm&lt;/code&gt;: remove container automatically after exit.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-p 8081:8081&lt;/code&gt;: map host port to container port.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-v ./account:/app/account&lt;/code&gt;: mount local credentials into container.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Access URL: &lt;code&gt;http://localhost:8081&lt;/code&gt;&lt;/p&gt;
&lt;h2 id=&#34;docker-compose-usage-keep-original-command&#34;&gt;Docker Compose Usage (Keep Original Command)
&lt;/h2&gt;&lt;p&gt;Start:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker compose up --build
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Explanation: build and start services based on &lt;code&gt;docker-compose.yml&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Access URL: &lt;code&gt;http://localhost:8081&lt;/code&gt;&lt;/p&gt;
&lt;h2 id=&#34;usage-tips&#34;&gt;Usage Tips
&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;For multi-account scenarios, use Dashboard first for unified view and auth management.&lt;/li&gt;
&lt;li&gt;For alerting or automation, prefer &lt;code&gt;GET /api/results&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Do not commit real &lt;code&gt;access_token&lt;/code&gt; values to public repositories.&lt;/li&gt;
&lt;li&gt;If you see many temporary failures, increase &lt;code&gt;--retries&lt;/code&gt; and &lt;code&gt;--retry-delay&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
</description>
        </item>
        <item>
        <title>How Codex Usage Limits Work: 5-Hour Limits, Weekly Limits, and Credits</title>
        <link>https://knightli.com/en/2026/04/15/codex-usage-limits-five-hour-weekly-credits/</link>
        <pubDate>Wed, 15 Apr 2026 22:50:00 +0800</pubDate>
        
        <guid>https://knightli.com/en/2026/04/15/codex-usage-limits-five-hour-weekly-credits/</guid>
        <description>&lt;p&gt;When people first look at Codex usage limits, it is easy to assume that the &lt;code&gt;5-hour limit&lt;/code&gt; is a short-term balance, and that the &lt;code&gt;weekly limit&lt;/code&gt; only starts decreasing after the 5-hour quota is used up.&lt;/p&gt;
&lt;p&gt;That is not how it works. Codex is better understood as checking multiple limit windows at the same time: a short window prevents burst usage, while the weekly window controls total usage over the week. A Codex request usually counts against both.&lt;/p&gt;
&lt;p&gt;So this situation is usually normal:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;5-hour quota still has plenty left
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;but weekly quota has already decreased
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;01-the-short-version&#34;&gt;01 The Short Version
&lt;/h2&gt;&lt;p&gt;You can understand Codex usage with three rules:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;The &lt;code&gt;5-hour limit&lt;/code&gt; and the &lt;code&gt;weekly limit&lt;/code&gt; apply at the same time.&lt;/li&gt;
&lt;li&gt;If the weekly limit is exhausted, you usually cannot continue using the same subscription quota pool even if the 5-hour quota still has room.&lt;/li&gt;
&lt;li&gt;Codex is not priced by simple message count. Usage depends on the model, tokens, task complexity, context size, and execution location.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;In pseudocode:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;can_use_codex =
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    five_hour_remaining &amp;gt; 0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &amp;amp;&amp;amp; weekly_remaining &amp;gt; 0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &amp;amp;&amp;amp; no other product policy is triggered
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;When the 5-hour window resets, only the 5-hour quota is restored. It does not restore weekly quota. Weekly quota resets on its own schedule, or you may be able to buy extra credits on supported plans.&lt;/p&gt;
&lt;h2 id=&#34;02-why-both-windows-decrease&#34;&gt;02 Why Both Windows Decrease
&lt;/h2&gt;&lt;p&gt;Think of Codex limits as two gates:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Window&lt;/th&gt;
          &lt;th&gt;Purpose&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;5-hour window&lt;/td&gt;
          &lt;td&gt;Prevents high-frequency burst usage&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Weekly window&lt;/td&gt;
          &lt;td&gt;Controls total weekly usage&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Each Codex task creates real usage. That usage is reflected in the relevant rate limit windows.&lt;/p&gt;
&lt;p&gt;It is not:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Use 5-hour quota first
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;After the 5-hour quota runs out
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Start using weekly quota
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;It is closer to:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;One Codex request
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;=&amp;gt; counts toward the 5-hour window
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;=&amp;gt; also counts toward the weekly window
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;That is why weekly usage can drop even when the 5-hour quota is not exhausted.&lt;/p&gt;
&lt;h2 id=&#34;03-look-at-token-based-credits&#34;&gt;03 Look at Token-Based Credits
&lt;/h2&gt;&lt;p&gt;OpenAI does not publish a formula that lets users fully reproduce the exact Codex charge. What is public is the rate card, the main factors, and per-model credit pricing.&lt;/p&gt;
&lt;p&gt;As of 2026-04-15, the main Codex rate card model is &lt;code&gt;token-based credits&lt;/code&gt;. Usage is estimated from input tokens, cached input tokens, and output tokens.&lt;/p&gt;
&lt;p&gt;Example official rates:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Model&lt;/th&gt;
          &lt;th style=&#34;text-align: right&#34;&gt;Input / 1M tokens&lt;/th&gt;
          &lt;th style=&#34;text-align: right&#34;&gt;Cached input / 1M tokens&lt;/th&gt;
          &lt;th style=&#34;text-align: right&#34;&gt;Output / 1M tokens&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;GPT-5.4&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;62.50 credits&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;6.250 credits&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;375 credits&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;GPT-5.4-Mini&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;18.75 credits&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;1.875 credits&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;113 credits&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;GPT-5.3-Codex&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;43.75 credits&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;4.375 credits&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;350 credits&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;GPT-5.2-Codex&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;43.75 credits&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;4.375 credits&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;350 credits&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;GPT-5.1-Codex-Max&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;31.25 credits&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;3.125 credits&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;250 credits&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;GPT-5.1-Codex-mini&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;6.25 credits&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;0.625 credits&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;50 credits&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;A rough estimate is:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;usage
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;≈ input tokens / 1,000,000 × model input price
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;+ cached input tokens / 1,000,000 × model cached input price
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;+ output tokens / 1,000,000 × model output price
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This is not an exact billing formula, but it explains the trend: output is expensive, long context is expensive, and stronger models cost more. The official rate card also says &lt;code&gt;Fast mode&lt;/code&gt; uses 2x credits, and &lt;code&gt;Code review&lt;/code&gt; uses GPT-5.3-Codex pricing.&lt;/p&gt;
&lt;h2 id=&#34;04-do-not-only-count-messages&#34;&gt;04 Do Not Only Count Messages
&lt;/h2&gt;&lt;p&gt;Ten Codex messages can consume very different amounts.&lt;/p&gt;
&lt;p&gt;Light tasks are usually cheaper:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Editing one small function&lt;/li&gt;
&lt;li&gt;Explaining a short code snippet&lt;/li&gt;
&lt;li&gt;Writing a short paragraph&lt;/li&gt;
&lt;li&gt;Making a local change in a clearly specified file&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Heavy tasks cost more:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Scanning a large codebase&lt;/li&gt;
&lt;li&gt;Running a long agent session&lt;/li&gt;
&lt;li&gt;Repeated read, edit, test, and fix loops&lt;/li&gt;
&lt;li&gt;Generating lots of code or a long report&lt;/li&gt;
&lt;li&gt;Using cloud tasks&lt;/li&gt;
&lt;li&gt;Enabling fast mode&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So message count is only a rough feeling. It does not tell you the real usage.&lt;/p&gt;
&lt;h2 id=&#34;05-local-tasks-vs-cloud-tasks&#34;&gt;05 Local Tasks vs Cloud Tasks
&lt;/h2&gt;&lt;p&gt;Execution location can make a big difference.&lt;/p&gt;
&lt;p&gt;A &lt;code&gt;local task&lt;/code&gt; works in your local workspace: reading files, editing code, and running commands. A &lt;code&gt;cloud task&lt;/code&gt; is delegated to a hosted cloud environment, which is better for longer and more automated workflows.&lt;/p&gt;
&lt;p&gt;Cloud tasks are often more expensive because they involve:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A hosted execution environment&lt;/li&gt;
&lt;li&gt;Longer tasks&lt;/li&gt;
&lt;li&gt;More tool calls&lt;/li&gt;
&lt;li&gt;Larger context&lt;/li&gt;
&lt;li&gt;A more complete automation loop&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For normal code edits, article cleanup, or small fixes, local tasks are usually cheaper. Use cloud tasks when the job truly needs hosted execution.&lt;/p&gt;
&lt;h2 id=&#34;06-why-weekly-usage-drops-fast&#34;&gt;06 Why Weekly Usage Drops Fast
&lt;/h2&gt;&lt;p&gt;If your 5-hour quota barely moves but weekly usage drops a lot, common causes include:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;You used cloud tasks.&lt;/li&gt;
&lt;li&gt;You used a more expensive model.&lt;/li&gt;
&lt;li&gt;You enabled fast mode.&lt;/li&gt;
&lt;li&gt;The context was large, with many files or a long conversation.&lt;/li&gt;
&lt;li&gt;The output was long, such as lots of code, a long report, or log analysis.&lt;/li&gt;
&lt;li&gt;The task chain was long: search, edit, test, fix, test again.&lt;/li&gt;
&lt;li&gt;Your quota script mislabeled the limit windows.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you read fields from something like &lt;code&gt;/backend-api/wham/usage&lt;/code&gt;, do not only trust processed labels such as &lt;code&gt;five_hour%&lt;/code&gt; or &lt;code&gt;weekly%&lt;/code&gt;. Check the raw JSON fields:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;limit_window_seconds&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;percent_left&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;reset_at&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;bucket / feature name&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Typical windows:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;limit_window_seconds = 18000
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;=&amp;gt; about 5 hours
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;limit_window_seconds = 604800
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;=&amp;gt; about 7 days
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;If your script labels the windows backwards, the quota display will be misleading.&lt;/p&gt;
&lt;h2 id=&#34;07-how-to-save-quota&#34;&gt;07 How to Save Quota
&lt;/h2&gt;&lt;p&gt;To make weekly quota last longer:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Split large jobs into smaller tasks.&lt;/li&gt;
&lt;li&gt;Prefer local tasks when possible.&lt;/li&gt;
&lt;li&gt;Tell Codex the relevant paths to reduce unnecessary scanning.&lt;/li&gt;
&lt;li&gt;Avoid dumping huge logs, long files, or unrelated context.&lt;/li&gt;
&lt;li&gt;Use cheaper mini models for light work.&lt;/li&gt;
&lt;li&gt;Ask for a plan before starting a long task.&lt;/li&gt;
&lt;li&gt;Ask for concise answers when you do not need a long report.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;A useful mental model:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;can continue using
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;= short window has quota
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;amp;&amp;amp; weekly window has quota
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;usage speed
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;= model price
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;× tokens
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;× output length
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;× task complexity
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;× execution location
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;This model is not exact billing math, but it explains most Codex usage-limit behavior.&lt;/p&gt;
&lt;h2 id=&#34;related-links&#34;&gt;Related Links
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://help.openai.com/en/articles/11369540-using-codex-with-your-chatgpt-plan&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Using Codex with your ChatGPT plan - OpenAI Help Center&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://help.openai.com/en/articles/11481834&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;ChatGPT Rate Card - OpenAI Help Center&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://help.openai.com/zh-hans-cn/articles/20001106-codex-rate-card&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Codex rate card - OpenAI Help Center&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&#34;link&#34; href=&#34;https://help.openai.com/en/articles/12642688-using-credits-for-flexible-usage-in-chatgpt-pluspro&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Using Credits for Flexible Usage in ChatGPT - OpenAI Help Center&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        </item>
        <item>
        <title>Codex Usage and Quota Check</title>
        <link>https://knightli.com/en/2026/04/12/codex-usage-quota-check/</link>
        <pubDate>Sun, 12 Apr 2026 00:01:33 +0800</pubDate>
        
        <guid>https://knightli.com/en/2026/04/12/codex-usage-quota-check/</guid>
        <description>&lt;p&gt;If you want to check the remaining quota for a Codex account, a small local script can call ChatGPT&amp;rsquo;s &lt;code&gt;/backend-api/wham/usage&lt;/code&gt; endpoint directly.&lt;/p&gt;
&lt;p&gt;The overall flow is simple:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Read &lt;code&gt;tokens.access_token&lt;/code&gt; and &lt;code&gt;tokens.account_id&lt;/code&gt; from &lt;code&gt;auth.json&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Send a request to &lt;code&gt;https://chatgpt.com/backend-api/wham/usage&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Include &lt;code&gt;Authorization: Bearer ...&lt;/code&gt; and &lt;code&gt;ChatGPT-Account-Id&lt;/code&gt; in the headers&lt;/li&gt;
&lt;li&gt;Parse the five-hour and weekly quota windows from the response&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;what-this-is-useful-for&#34;&gt;What this is useful for
&lt;/h2&gt;&lt;p&gt;This approach is handy when you want to quickly confirm:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;how much five-hour quota is left&lt;/li&gt;
&lt;li&gt;how much weekly quota is left&lt;/li&gt;
&lt;li&gt;when the quota resets&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you manage multiple accounts, the script can also scan &lt;code&gt;account/*.auth.json&lt;/code&gt; and print a compact summary table. The &lt;code&gt;auth.json&lt;/code&gt; file for your current signed-in ChatGPT account can usually be found under &lt;code&gt;~/.codex/&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;the-key-inputs&#34;&gt;The key inputs
&lt;/h2&gt;&lt;p&gt;In practice, the script mainly depends on two values:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;access_token&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;account_id&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Both are often available in a local &lt;code&gt;auth.json&lt;/code&gt;. With them, the request headers usually look like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;headers&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;Authorization&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Bearer &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;auth_token&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;Accept&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;application/json&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;ChatGPT-Account-Id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;auth_account_id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;Origin&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;https://chatgpt.com&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;Referer&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;https://chatgpt.com/&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;User-Agent&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Mozilla/5.0&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;how-to-read-the-response&#34;&gt;How to read the response
&lt;/h2&gt;&lt;p&gt;After the request succeeds, the most important entries are the two quota windows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;five_hour&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;weekly&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A practical script usually normalizes them into:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;remaining percentage&lt;/li&gt;
&lt;li&gt;reset time&lt;/li&gt;
&lt;li&gt;window length&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It is also useful to handle alternate field names such as &lt;code&gt;primary_window&lt;/code&gt;, &lt;code&gt;secondary_window&lt;/code&gt;, &lt;code&gt;five_hour_limit&lt;/code&gt;, and &lt;code&gt;weekly_limit&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id=&#34;common-issues&#34;&gt;Common issues
&lt;/h2&gt;&lt;p&gt;A 401 response usually means the &lt;code&gt;access_token&lt;/code&gt; is expired or invalid.&lt;/p&gt;
&lt;p&gt;A 403 response usually means the account cannot access this endpoint, or the account is in an abnormal state.&lt;/p&gt;
&lt;p&gt;If the response uses inconsistent field names, it is better to normalize them before printing the summary.&lt;/p&gt;
&lt;h2 id=&#34;reference&#34;&gt;Reference
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;codex-auth-manager&lt;/code&gt;: &lt;a class=&#34;link&#34; href=&#34;https://github.com/RioArisk/codex-auth-manager&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/RioArisk/codex-auth-manager&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;code&#34;&gt;Code
&lt;/h2&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;  1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;  2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;  3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;  4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;  5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;  6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;  7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;  8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;  9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 20
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 21
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 22
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 23
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 24
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 25
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 26
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 27
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 28
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 29
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 30
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 31
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 32
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 33
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 34
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 35
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 36
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 37
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 38
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 39
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 40
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 41
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 42
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 43
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 44
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 45
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 46
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 47
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 48
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 49
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 50
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 51
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 52
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 53
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 54
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 55
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 56
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 57
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 58
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 59
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 60
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 61
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 62
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 63
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 64
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 65
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 66
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 67
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 68
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 69
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 70
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 71
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 72
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 73
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 74
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 75
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 76
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 77
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 78
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 79
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 80
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 81
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 82
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 83
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 84
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 85
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 86
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 87
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 88
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 89
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 90
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 91
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 92
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 93
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 94
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 95
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 96
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 97
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 98
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 99
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;100
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;101
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;102
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;103
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;104
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;105
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;106
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;107
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;108
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;109
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;110
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;111
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;112
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;113
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;114
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;115
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;116
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;117
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;118
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;119
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;120
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;121
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;122
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;123
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;124
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;125
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;126
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;127
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;128
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;129
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;130
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;131
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;132
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;133
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;134
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;135
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;136
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;137
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;138
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;139
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;140
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;141
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;142
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;143
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;144
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;145
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;146
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;147
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;148
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;149
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;150
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;151
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;152
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;153
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;154
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;155
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;156
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;157
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;158
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;159
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;160
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;161
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;162
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;163
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;164
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;165
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;166
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;167
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;168
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;169
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;170
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;171
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;172
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;173
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;174
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;175
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;176
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;177
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;178
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;179
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;180
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;181
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;182
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;183
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;184
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;185
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;186
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;187
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;188
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;189
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;190
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;191
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;192
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;193
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;194
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;195
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;196
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;197
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;198
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;199
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;200
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;201
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;202
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;203
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;204
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;205
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;206
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;207
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;208
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;209
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;210
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;211
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;212
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;213
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;214
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;215
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;216
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;217
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;218
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;219
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;220
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;221
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;222
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;223
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;224
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;225
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;226
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;227
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;228
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;229
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;230
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;231
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;232
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;233
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;234
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;235
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;236
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;237
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;238
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;239
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;240
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;241
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;242
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;243
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;244
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;245
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;246
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;247
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;248
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;249
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;250
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;251
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;252
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;253
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;254
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;255
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;256
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;257
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;258
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;259
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;260
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;261
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;262
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;263
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;264
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;265
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;266
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;267
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;268
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;269
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;270
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;271
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;272
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;273
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;274
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;275
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;276
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;277
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;278
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;279
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;280
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;281
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;282
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;283
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;284
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;285
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;286
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;287
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;288
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;289
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;290
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;291
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;292
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;293
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;294
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;295
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;296
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;297
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;298
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;299
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;300
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;301
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;302
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;303
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;304
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;305
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;306
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;307
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;308
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;309
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;310
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;311
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;312
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;313
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;314
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;315
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;316
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;317
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;318
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;319
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;320
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;321
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;322
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;323
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;324
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;325
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;326
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;327
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;328
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;329
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;330
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;331
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;332
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;333
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;334
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;335
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;336
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;337
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;338
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;339
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;340
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;341
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;342
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;343
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;344
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;345
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;346
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;347
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;348
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;349
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;350
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;351
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;352
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;353
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;354
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;355
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;356
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;357
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;358
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;359
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;360
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;361
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;362
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;363
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;364
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;365
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;366
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;367
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;368
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;369
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;370
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;371
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;372
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;373
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;374
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;375
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;376
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;377
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;378
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;379
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;380
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;381
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;382
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;383
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;384
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;385
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;386
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;387
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;388
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;389
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;390
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;391
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;392
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;393
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;394
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;395
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;396
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;397
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;398
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;399
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;400
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;401
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;402
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;403
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;404
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;405
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;406
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;407
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;408
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;409
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;410
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;411
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;412
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;413
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;414
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;415
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;416
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;417
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;418
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;419
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;420
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;421
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;422
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;423
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;424
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;425
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;426
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;427
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;428
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;429
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;430
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;431
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;432
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;433
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;434
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;435
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;436
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;437
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;438
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;439
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;440
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;441
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;442
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;443
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;444
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;445
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;446
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;447
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;448
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;449
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;450
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;451
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;452
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;453
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;454
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;455
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;456
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;457
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;458
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;459
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;460
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;argparse&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;base64&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;json&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;os&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;sys&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;datetime&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;datetime&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;timedelta&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;timezone&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;pathlib&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Path&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;typing&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Any&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;requests&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;UTC&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;timezone&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;utc&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;CST&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;timezone&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;timedelta&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;hours&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;8&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;CST&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;JSONDict&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;dict&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Any&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;parse_args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;argparse&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Namespace&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;parser&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;argparse&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ArgumentParser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;description&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Query ChatGPT Codex usage from /backend-api/wham/usage.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;parser&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;add_argument&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;account_name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;nargs&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;?&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;help&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Account name used to load account/&amp;lt;account_name&amp;gt;.auth.json. If omitted, load all *.auth.json files in account/.&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;parser&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;add_argument&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;--account-dir&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;default&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;account&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;help&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Directory containing &amp;lt;account_name&amp;gt;.auth.json files.&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;parser&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;add_argument&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;--chatgpt-url&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;default&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;https://chatgpt.com/backend-api/wham/usage&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;help&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;ChatGPT usage endpoint.&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;parser&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;add_argument&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;--raw-json&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;action&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;store_true&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;help&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Print the full JSON response body.&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;parser&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;add_argument&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;--raw-headers&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;action&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;store_true&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;help&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Print response headers.&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;parser&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;parse_args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;print_json&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Any&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;json&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dumps&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;indent&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ensure_ascii&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;False&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;load_auth_json&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;path_str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Path&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;JSONDict&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;path_str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;path&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;path_str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;expanduser&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;is_file&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;try&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;json&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;loads&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;read_text&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;encoding&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;utf-8&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;except&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;ne&#34;&gt;OSError&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;json&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;JSONDecodeError&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;get_nested_string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;JSONDict&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;keys&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;current&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Any&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;key&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;keys&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;isinstance&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;current&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;dict&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;current&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;current&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;current&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;isinstance&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;current&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;and&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;current&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;format_dt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;datetime&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;dt&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;dt&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;astimezone&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;CST&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;strftime&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;%Y-%m-&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;%d&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt; %H:%M:%S %Z&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;format_cst&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;datetime&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;format_dt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;dt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;epoch_ms_to_dt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Any&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;datetime&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;try&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;raw&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;except&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;ne&#34;&gt;TypeError&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;ne&#34;&gt;ValueError&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;c1&#34;&gt;# Newer responses sometimes use epoch seconds, older ones use epoch milliseconds.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;timestamp&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;raw&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;/&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1000&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;raw&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;**&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;11&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;raw&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;datetime&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fromtimestamp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;timestamp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tz&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;UTC&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;first_dict&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Any&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;keys&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;JSONDict&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;key&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;keys&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;isinstance&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;dict&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;isinstance&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;dict&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;decode_jwt_exp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;token&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;datetime&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;parts&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;token&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;split&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;.&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;parts&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;try&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;payload&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;parts&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;payload&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;=&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;payload&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;%&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;4&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;data&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;json&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;loads&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;base64&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;urlsafe_b64decode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;payload&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;encode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;ascii&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;exp&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;exp&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;exp&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;datetime&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fromtimestamp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;exp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tz&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;UTC&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;except&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;ne&#34;&gt;ValueError&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;ne&#34;&gt;TypeError&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;json&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;JSONDecodeError&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;get_percent_left&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;JSONDict&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;float&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;percent_left&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;percent_left&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;percent_left&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;percent_left&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;remaining_percent&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;percent_left&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;percent_left&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;used_percent&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;used_percent&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;try&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;used_percent&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;max&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;100&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;float&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;used_percent&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;except&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;ne&#34;&gt;TypeError&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;ne&#34;&gt;ValueError&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;resolve_limit_window&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;JSONDict&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;JSONDict&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;reset_at&amp;#34;&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;ow&#34;&gt;and&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;reset_time_ms&amp;#34;&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;ow&#34;&gt;and&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;isinstance&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;primary_window&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;dict&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;primary_window&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;parse_limit_entry&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Any&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;JSONDict&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;isinstance&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;dict&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;resolve_limit_window&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;percent_left&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;get_percent_left&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;reset_time_ms&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;reset_time_ms&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;reset_time_ms&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;reset_time_ms&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;reset_at&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;window_seconds&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;limit_window_seconds&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;percent_left&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;percent_left&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;reset_time_ms&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;reset_time_ms&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;reset_at&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;epoch_ms_to_dt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;reset_time_ms&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;limit_window_seconds&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;window_seconds&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;infer_limit_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;window_seconds&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Any&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;isinstance&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;window_seconds&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;float&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;window_seconds&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;6&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3600&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;five_hour&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;window_seconds&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;6&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;24&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3600&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;weekly&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;relabel_rate_limits&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;primary&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;JSONDict&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;secondary&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;JSONDict&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;tuple&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;JSONDict&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;JSONDict&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;entry&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;primary&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;secondary&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;entry&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;continue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;inferred_name&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;infer_limit_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;entry&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;limit_window_seconds&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;inferred_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;entry&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;inferred_name&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;primary&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;and&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;secondary&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;and&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;primary&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;secondary&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;primary&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;weekly&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;primary&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;five_hour&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;secondary&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;weekly&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;primary&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;and&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;primary&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;weekly&amp;#34;&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;and&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;secondary&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;primary&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;secondary&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;and&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;secondary&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;five_hour&amp;#34;&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;and&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;primary&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;secondary&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;primary&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;secondary&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;parse_rate_limits&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;JSONDict&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;tuple&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;JSONDict&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;JSONDict&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;primary&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;secondary&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;primary_key&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;five_hour&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;five_hour_limit&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;five_hour_rate_limit&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;primary&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;primary_key&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;primary&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;parse_limit_entry&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;five_hour&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;primary_key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;primary&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;k&#34;&gt;break&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;secondary_key&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;weekly&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;weekly_limit&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;weekly_rate_limit&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;secondary&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;secondary_key&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;secondary&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;parse_limit_entry&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;weekly&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;secondary_key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;secondary&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;k&#34;&gt;break&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;primary&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;primary&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;parse_limit_entry&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;five_hour&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;primary_window&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;secondary&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;secondary&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;parse_limit_entry&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;weekly&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;secondary_window&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;relabel_rate_limits&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;primary&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;secondary&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;format_percent&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Any&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;isinstance&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;float&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;value&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;-&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;percent_sort_value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Any&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;descending&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;bool&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;tuple&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;float&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;isinstance&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;float&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;numeric_value&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;float&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;numeric_value&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;descending&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;numeric_value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;0.0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;get_auth_paths&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;account_dir&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;account_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;list&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;base_dir&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;account_dir&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;account_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;base_dir&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;/&lt;/span&gt; &lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;account_name&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;.auth.json&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;sorted&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;base_dir&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;glob&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;*.auth.json&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;get_account_name_from_path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;suffix&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;.auth.json&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[:&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;suffix&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)]&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;endswith&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;suffix&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;path&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stem&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;build_summary_row&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;account_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;five_hour&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;JSONDict&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;weekly&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;JSONDict&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;JSONDict&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;account&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;account_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;five_hour_percent&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;five_hour&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;percent_left&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;five_hour&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;weekly_percent&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;weekly&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;percent_left&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;weekly&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;weekly_reset_at&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;weekly&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;reset_at&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;weekly&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;print_summary_rows&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;rows&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;list&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;JSONDict&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;])&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;rows&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;sorted_rows&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;sorted&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;rows&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;lambda&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;row&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;percent_sort_value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;row&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;five_hour_percent&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;descending&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;True&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;percent_sort_value&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;row&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;weekly_percent&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;descending&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;True&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;format_cst&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;row&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;weekly_reset_at&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;row&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;account&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;display_rows&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;row&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;sorted_rows&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;display_rows&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;append&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;s2&#34;&gt;&amp;#34;account&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;row&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;account&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;s2&#34;&gt;&amp;#34;five_hour&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;format_percent&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;row&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;five_hour_percent&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;s2&#34;&gt;&amp;#34;weekly&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;format_percent&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;row&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;weekly_percent&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;s2&#34;&gt;&amp;#34;weekly_reset&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;format_cst&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;row&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;weekly_reset_at&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;headers&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;account&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;account&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;five_hour&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;five_hour%&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;weekly&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;weekly%&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;weekly_reset&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;weekly_reset&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;widths&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;max&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;headers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]),&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;max&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;item&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;key&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;])&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;item&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;display_rows&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;key&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;headers&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;headers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;account&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;widths&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;account&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;  &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;headers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;five_hour&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;widths&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;five_hour&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;  &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;headers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;weekly&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;widths&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;weekly&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;  &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;headers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;weekly_reset&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;widths&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;weekly_reset&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;item&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;display_rows&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;item&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;account&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;widths&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;account&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;  &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;item&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;five_hour&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;widths&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;five_hour&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;  &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;item&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;weekly&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;widths&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;weekly&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;  &amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;item&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;weekly_reset&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;widths&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;weekly_reset&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;validate_token_inputs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;token&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;account_id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;auth_token&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;auth_account_id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;str&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;token&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;startswith&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;sess-&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;status: invalid_token_type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stderr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;s2&#34;&gt;&amp;#34;message: --chatgpt-token looks like a session token (sess-...). Use the JWT access_token instead.&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stderr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;auth_token&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;s2&#34;&gt;&amp;#34;hint: Found tokens.access_token in auth.json; omit --chatgpt-token or pass that value instead.&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;                &lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stderr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;token_exp&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;decode_jwt_exp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;token&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;token_exp&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;and&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;token_exp&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;datetime&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;now&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;UTC&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;status: expired&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stderr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;message: access_token expired at &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;format_dt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;token_exp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stderr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;auth_token&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;and&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;auth_token&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;token&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;auth_token_exp&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;decode_jwt_exp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;auth_token&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;hint&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;format_dt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;auth_token_exp&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;auth_token_exp&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;unknown time&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;hint: auth.json contains a different access_token expiring at &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;hint&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stderr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;auth_account_id&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;and&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;account_id&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;!=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;auth_account_id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;warning: supplied --account-id does not match auth.json tokens.account_id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stderr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;handle_error_response&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;response&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;requests&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Response&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Any&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;raw_json&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;bool&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;int&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;response&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;status_code&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;401&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;status: expired&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stderr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;message: Token 宸茶繃鏈熸垨鏃犳晥&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stderr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;raw_json&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;print_json&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;response&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;status_code&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;403&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;status: forbidden&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stderr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;message: 璐﹀彿宸茶灏佺鎴栨棤鏉冭闂?, file=sys.stderr)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;raw_json&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;print_json&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;response&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;status_code&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;400&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;HTTP &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;response&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;status_code&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stderr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;print_json&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;fetch_chatgpt_usage&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;auth_path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;argparse&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;Namespace&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;tuple&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;JSONDict&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;|&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;auth_data&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;load_auth_json&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;auth_path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;account_name&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;get_account_name_from_path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;auth_path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;auth_token&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;get_nested_string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;auth_data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;tokens&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;access_token&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;auth_account_id&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;get_nested_string&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;auth_data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;tokens&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;account_id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;auth_data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;account_name&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;: auth file not found or invalid&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stderr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;auth_token&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;account_name&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;: missing access_token&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stderr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;auth_account_id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;account_name&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;: missing account_id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stderr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;validation_error&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;validate_token_inputs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;auth_token&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;auth_account_id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;auth_token&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;auth_account_id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;validation_error&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;validation_error&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;headers&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;Authorization&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Bearer &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;auth_token&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;Accept&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;application/json&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;ChatGPT-Account-Id&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;auth_account_id&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;Origin&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;https://chatgpt.com&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;Referer&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;https://chatgpt.com/&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;s2&#34;&gt;&amp;#34;User-Agent&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Mozilla/5.0&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;try&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;response&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;requests&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;get&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;chatgpt_url&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;headers&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;headers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;timeout&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;60&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;except&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;requests&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;RequestException&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;as&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;exc&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;Request failed: &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;exc&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stderr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;raw_headers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;=== Headers ===&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;print_json&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;dict&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;response&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;headers&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;try&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;data&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;response&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;json&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;except&lt;/span&gt; &lt;span class=&#34;ne&#34;&gt;ValueError&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;HTTP &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;response&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;status_code&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stderr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;response&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;text&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stderr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;3&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;error_response&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;handle_error_response&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;response&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;raw_json&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;error_response&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;error_response&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;raw_json&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;=== Raw JSON ===&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;print_json&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;rate_limits&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;first_dict&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;rate_limit&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;rate_limits&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;rate_limits&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;build_summary_row&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;account_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;five_hour&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;weekly&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;parse_rate_limits&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;rate_limits&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;build_summary_row&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;account_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;five_hour&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;weekly&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;parse_args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;auth_paths&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;get_auth_paths&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;account_dir&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;account_name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;auth_paths&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;No auth files found.&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;file&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;stderr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;exit&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;exit_code&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;summary_rows&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;list&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;JSONDict&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;auth_path&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;auth_paths&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;current_exit_code&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;summary_row&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fetch_chatgpt_usage&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;auth_path&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;exit_code&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;max&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;exit_code&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;current_exit_code&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;summary_row&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;is&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;kc&#34;&gt;None&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;and&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;args&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;raw_json&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;            &lt;span class=&#34;n&#34;&gt;summary_rows&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;append&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;summary_row&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;summary_rows&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;n&#34;&gt;print_summary_rows&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;summary_rows&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;sys&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;exit&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;exit_code&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;vm&#34;&gt;__name__&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;__main__&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;main&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
        </item>
        
    </channel>
</rss>
