{"componentChunkName":"component---gatsby-theme-spaceout-src-templates-article-template-tsx","path":"/how-browsers-read-html-render-and-apply-styles-the-sequence-and-developer-best-practices","result":{"pageContext":{"article":{"id":"61fa597a-8957-56d5-9c77-a33a0581d31b","slug":"/how-browsers-read-html-render-and-apply-styles-the-sequence-and-developer-best-practices","secret":false,"title":"How Browsers Read HTML, Render, and Apply Styles, The Sequence and Developer Best Practices","author":"Luke Celitan","date":"July 2nd, 2025","dateForSEO":"2025-07-02T00:00:00.000Z","timeToRead":6,"excerpt":"A comprehensive deep-dive into the browser rendering pipeline, from HTML parsing to painting pixels, with actionable insights for building fast, responsive web apps.","subscription":true,"body":"var _excluded = [\"components\"];\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n/* @jsxRuntime classic */\n/* @jsx mdx */\n\nvar _frontmatter = {\n  \"title\": \"How Browsers Read HTML, Render, and Apply Styles, The Sequence and Developer Best Practices\",\n  \"excerpt\": \"A comprehensive deep-dive into the browser rendering pipeline, from HTML parsing to painting pixels, with actionable insights for building fast, responsive web apps.\",\n  \"date\": \"2025-07-02T00:00:00.000Z\",\n  \"hero\": \"browser.png\",\n  \"author\": \"Luke Celitan\",\n  \"category\": \"Post\",\n  \"tech\": [\"TS\", \"JS\"]\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n    props = _objectWithoutProperties(_ref, _excluded);\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"h1\", {\n    \"id\": \"how-browsers-read-html-render-and-apply-styles-the-sequence-and-developer-best-practices\"\n  }, \"How Browsers Read HTML, Render, and Apply Styles: The Sequence and Developer Best Practices\"), mdx(\"h2\", {\n    \"id\": \"introduction\"\n  }, \"Introduction\"), mdx(\"p\", null, \"Have you ever wondered what happens under the hood when you load a web page? As developers, understanding the browser\\u2019s rendering pipeline is crucial for building fast, responsive, and accessible web apps. In this deep-dive, I\\u2019ll walk you through every step of how browsers read HTML, apply styles, execute scripts, and paint pixels to the screen. We\\u2019ll explore the technical sequence, performance implications, and actionable best practices to help you optimize your sites for real-world users.\"), mdx(\"p\", null, \"Whether you\\u2019re a frontend engineer, a performance enthusiast, or just curious about browser internals, this guide will equip you with the knowledge to make informed decisions and troubleshoot rendering bottlenecks. Let\\u2019s get started!\"), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"the-browser-rendering-pipeline-an-overview\"\n  }, \"The Browser Rendering Pipeline: An Overview\"), mdx(\"p\", null, \"At a high level, the browser rendering pipeline consists of several sequential steps:\"), mdx(\"ol\", null, mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Navigation & Network Requests\"), \": The browser locates the server, establishes a connection, and requests the HTML document.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Receiving the HTML Response\"), \": The browser receives the initial chunk of HTML and begins resource discovery.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Parsing HTML\"), \": The browser tokenizes the HTML and builds the DOM tree, requesting additional resources as it parses.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Building the CSSOM\"), \": CSS is parsed and the CSS Object Model is constructed.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"JavaScript Compilation\"), \": Scripts are parsed, compiled, and executed, potentially modifying the DOM and CSSOM.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Accessibility Tree\"), \": The browser builds a semantic tree for assistive technologies.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Critical Rendering Path\"), \": The DOM and CSSOM are combined into the render tree, which is styled, laid out, painted, and composited.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Interactivity\"), \": The browser becomes responsive to user input once the main thread is free.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Performance Optimization\"), \": Techniques like lazy loading, speculative loading, and performance budgets are applied.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Animation and Frame Rate\"), \": Smoothness and responsiveness are maintained through efficient animation techniques.\")), mdx(\"p\", null, \"Each step has its own performance considerations, edge cases, and best practices. Let\\u2019s break down each phase in detail.\"), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"step-1-navigation-and-network-requests\"\n  }, \"Step 1: Navigation and Network Requests\"), mdx(\"p\", null, \"Before any HTML is parsed, the browser must locate and connect to the server hosting your site. This involves several network steps:\"), mdx(\"h3\", {\n    \"id\": \"dns-lookup\"\n  }, \"DNS Lookup\"), mdx(\"p\", null, \"When a user enters a URL, the browser performs a DNS lookup to resolve the domain name to an IP address. Multiple hostnames (for fonts, images, scripts) mean multiple DNS lookups, which can add latency\\u2014especially on mobile networks.\"), mdx(\"h3\", {\n    \"id\": \"tcp-handshake\"\n  }, \"TCP Handshake\"), mdx(\"p\", null, \"Once the IP is known, the browser establishes a TCP connection using a three-way handshake (SYN, SYN-ACK, ACK). This ensures reliable communication.\"), mdx(\"h3\", {\n    \"id\": \"tls-negotiation\"\n  }, \"TLS Negotiation\"), mdx(\"p\", null, \"For HTTPS sites, a TLS handshake negotiates encryption and verifies the server. This adds several round trips before data transfer begins.\"), mdx(\"h3\", {\n    \"id\": \"latency-and-bandwidth\"\n  }, \"Latency and Bandwidth\"), mdx(\"p\", null, \"Network latency (the time for data to travel) and bandwidth (the amount of data that can be transferred) are major factors in perceived performance. Optimizing for fewer hostnames, using HTTP/2 multiplexing, and leveraging CDNs can reduce these costs.\"), mdx(\"h4\", {\n    \"id\": \"performance-impact-and-optimization-tips\"\n  }, \"Performance Impact and Optimization Tips\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Minimize DNS lookups\"), \": Consolidate resources under fewer hostnames.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Use HTTP/2\"), \": Multiplex requests to reduce connection overhead.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Leverage CDNs\"), \": Serve assets closer to users.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Preconnect and dns-prefetch\"), \": Use \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"<link rel=\\\"preconnect\\\">\"), \" and \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"<link rel=\\\"dns-prefetch\\\">\"), \" to speed up connections.\")), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"step-2-receiving-and-parsing-html\"\n  }, \"Step 2: Receiving and Parsing HTML\"), mdx(\"p\", null, \"Once the connection is established, the browser requests the HTML document. The server responds, and the browser receives the first chunk of data.\"), mdx(\"h3\", {\n    \"id\": \"time-to-first-byte-ttfb\"\n  }, \"Time to First Byte (TTFB)\"), mdx(\"p\", null, \"TTFB measures the time from the request to the first byte received. Fast TTFB is critical for perceived performance.\"), mdx(\"h3\", {\n    \"id\": \"initial-chunk-and-resource-discovery\"\n  }, \"Initial Chunk and Resource Discovery\"), mdx(\"p\", null, \"Browsers typically start with a 14KB chunk. As the HTML is parsed, the browser discovers references to CSS, JS, images, and other resources.\"), mdx(\"h3\", {\n    \"id\": \"parsing-html-tokenization-and-dom-construction\"\n  }, \"Parsing HTML: Tokenization and DOM Construction\"), mdx(\"p\", null, \"The browser tokenizes the HTML and builds the Document Object Model (DOM) tree, representing the structure and content of the page.\"), mdx(\"h4\", {\n    \"id\": \"preload-scanner\"\n  }, \"Preload Scanner\"), mdx(\"p\", null, \"While parsing, the preload scanner looks ahead to request high-priority resources (CSS, JS, fonts) early, reducing blocking.\"), mdx(\"h4\", {\n    \"id\": \"blocking-vs-non-blocking-resources\"\n  }, \"Blocking vs. Non-Blocking Resources\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Blocking\"), \": \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"<script>\"), \" tags without \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"async\"), \" or \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"defer\"), \" block parsing and rendering.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Non-Blocking\"), \": Images, CSS (to some extent), and scripts with \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"async\"), \"/\", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"defer\"), \" do not block parsing.\")), mdx(\"h4\", {\n    \"id\": \"code-example-minimal-html-and-resource-loading\"\n  }, \"Code Example: Minimal HTML and Resource Loading\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-html\"\n  }, \"<!doctype html>\\n<html lang=\\\"en\\\">\\n  <head>\\n    <meta charset=\\\"UTF-8\\\" />\\n    <title>Minimal Page</title>\\n    <link rel=\\\"stylesheet\\\" href=\\\"styles.css\\\" />\\n    <script src=\\\"main.js\\\" defer></script>\\n  </head>\\n  <body>\\n    <h1>Hello, world!</h1>\\n    <img src=\\\"hero.jpg\\\" alt=\\\"Hero Image\\\" />\\n  </body>\\n</html>\\n\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Tip:\"), \" Place critical CSS in the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"<head>\"), \" and use \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"defer\"), \" for scripts to avoid blocking rendering.\"), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"step-3-cssom-construction\"\n  }, \"Step 3: CSSOM Construction\"), mdx(\"p\", null, \"After discovering CSS resources, the browser parses them and builds the CSS Object Model (CSSOM).\"), mdx(\"h3\", {\n    \"id\": \"css-parsing-cascade-and-specificity\"\n  }, \"CSS Parsing, Cascade, and Specificity\"), mdx(\"p\", null, \"CSS rules are parsed, and the cascade determines which styles apply to each element. Specificity resolves conflicts between selectors.\"), mdx(\"h3\", {\n    \"id\": \"render-blocking-resources\"\n  }, \"Render-Blocking Resources\"), mdx(\"p\", null, \"External CSS files block rendering until they\\u2019re downloaded and parsed. Inline styles and critical CSS can reduce this blocking.\"), mdx(\"h4\", {\n    \"id\": \"code-example-css-that-blocks-vs-async-loading\"\n  }, \"Code Example: CSS That Blocks vs. Async Loading\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-html\"\n  }, \"<!-- Render-blocking CSS -->\\n<link rel=\\\"stylesheet\\\" href=\\\"main.css\\\" />\\n\\n<!-- Non-blocking CSS (for non-critical styles) -->\\n<link rel=\\\"stylesheet\\\" href=\\\"print.css\\\" media=\\\"print\\\" />\\n\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Tip:\"), \" Use \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"media\"), \" attributes or split critical/non-critical CSS to minimize render-blocking.\"), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"step-4-javascript-compilation-and-execution\"\n  }, \"Step 4: JavaScript Compilation and Execution\"), mdx(\"p\", null, \"JavaScript can significantly impact rendering and interactivity.\"), mdx(\"h3\", {\n    \"id\": \"parsing-compiling-and-main-thread-impact\"\n  }, \"Parsing, Compiling, and Main Thread Impact\"), mdx(\"p\", null, \"Scripts are parsed and compiled into bytecode. Execution happens on the main thread, which can block rendering and user interactions.\"), mdx(\"h3\", {\n    \"id\": \"async-and-defer-attributes\"\n  }, \"Async and Defer Attributes\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"strong\"\n  }, \"async\")), \": Script downloads and executes asynchronously, not blocking HTML parsing.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"strong\"\n  }, \"defer\")), \": Script downloads asynchronously but executes after HTML parsing is complete.\")), mdx(\"h4\", {\n    \"id\": \"code-example-async-vs-blocking-scripts\"\n  }, \"Code Example: Async vs. Blocking Scripts\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-html\"\n  }, \"<!-- Blocking script -->\\n<script src=\\\"blocking.js\\\"></script>\\n\\n<!-- Async script -->\\n<script src=\\\"async.js\\\" async></script>\\n\\n<!-- Defer script -->\\n<script src=\\\"defer.js\\\" defer></script>\\n\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Tip:\"), \" Use \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"async\"), \" for independent scripts and \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"defer\"), \" for scripts that depend on DOM readiness.\"), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"step-5-building-the-accessibility-tree\"\n  }, \"Step 5: Building the Accessibility Tree\"), mdx(\"p\", null, \"Accessibility is a first-class concern. The browser builds an Accessibility Object Model (AOM) for assistive technologies.\"), mdx(\"h3\", {\n    \"id\": \"aom-and-accessibility-best-practices\"\n  }, \"AOM and Accessibility Best Practices\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use semantic HTML (\", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"<nav>\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"<main>\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"<header>\"), \", etc.).\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Provide \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"aria-*\"), \" attributes for additional context.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Ensure all interactive elements are keyboard accessible.\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Tip:\"), \" Test with screen readers and accessibility tools to ensure your site is usable for all users.\"), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"step-6-the-critical-rendering-path\"\n  }, \"Step 6: The Critical Rendering Path\"), mdx(\"p\", null, \"The critical rendering path is the sequence of steps the browser takes to convert HTML, CSS, and JS into pixels on the screen.\"), mdx(\"h3\", {\n    \"id\": \"render-tree-construction\"\n  }, \"Render Tree Construction\"), mdx(\"p\", null, \"The DOM and CSSOM are combined into the render tree, which contains only visible elements and their computed styles.\"), mdx(\"h4\", {\n    \"id\": \"style-calculation\"\n  }, \"Style Calculation\"), mdx(\"p\", null, \"The browser applies CSS rules to each node in the render tree, resolving the cascade and specificity.\"), mdx(\"h4\", {\n    \"id\": \"layout-geometry\"\n  }, \"Layout (Geometry)\"), mdx(\"p\", null, \"The browser calculates the size and position of each element, considering the viewport and box model properties.\"), mdx(\"h4\", {\n    \"id\": \"paint-rasterization\"\n  }, \"Paint (Rasterization)\"), mdx(\"p\", null, \"Elements are drawn to the screen, converting boxes and styles into pixels.\"), mdx(\"h4\", {\n    \"id\": \"compositing-layers\"\n  }, \"Compositing (Layers)\"), mdx(\"p\", null, \"Some elements are promoted to their own layers (e.g., with \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"will-change\"), \", 3D transforms, opacity), which are composited for efficient painting.\"), mdx(\"h4\", {\n    \"id\": \"diagrams-dom-cssom-render-tree\"\n  }, \"Diagrams: DOM, CSSOM, Render Tree\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\"\n  }, \"[HTML] --> [DOM Tree]\\n[CSS]  --> [CSSOM Tree]\\n[DOM + CSSOM] --> [Render Tree] --> [Layout] --> [Paint] --> [Composite]\\n\")), mdx(\"h4\", {\n    \"id\": \"code-example-impact-of-display-none-vs-visibility-hidden\"\n  }, \"Code Example: Impact of \", mdx(\"inlineCode\", {\n    parentName: \"h4\"\n  }, \"display: none\"), \" vs. \", mdx(\"inlineCode\", {\n    parentName: \"h4\"\n  }, \"visibility: hidden\")), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-html\"\n  }, \"<div style=\\\"display: none;\\\">Not in render tree</div>\\n<div style=\\\"visibility: hidden;\\\">In render tree, but not visible</div>\\n\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Tip:\"), \" Use \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"display: none\"), \" to remove elements from the render tree and avoid layout calculations.\"), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"step-7-interactivity-and-time-to-interactive\"\n  }, \"Step 7: Interactivity and Time to Interactive\"), mdx(\"p\", null, \"A page is only truly usable when it responds quickly to user input.\"), mdx(\"h3\", {\n    \"id\": \"main-thread-responsiveness-and-tti\"\n  }, \"Main Thread, Responsiveness, and TTI\"), mdx(\"p\", null, \"The main thread handles parsing, layout, paint, and JS execution. If it\\u2019s busy, the page can\\u2019t respond to interactions.\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Time to Interactive (TTI)\"), \" measures when the page is visually rendered and reliably responsive.\"), mdx(\"h4\", {\n    \"id\": \"code-example-heavy-js-blocking-interactivity\"\n  }, \"Code Example: Heavy JS Blocking Interactivity\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-html\"\n  }, \"<script>\\n// Simulate heavy computation\\nconst start = performance.now();\\nwhile (performance.now() - start < 2000) {\\n  // Block main thread for 2 seconds\\n}\\n</script>\\n\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Tip:\"), \" Offload heavy work to Web Workers or defer non-critical JS to avoid blocking interactivity.\"), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"performance-optimization-strategies\"\n  }, \"Performance Optimization Strategies\"), mdx(\"p\", null, \"Optimizing the rendering pipeline is key to fast, smooth web experiences.\"), mdx(\"h3\", {\n    \"id\": \"lazy-loading\"\n  }, \"Lazy Loading\"), mdx(\"p\", null, \"Load non-critical resources (images, scripts) only when needed.\"), mdx(\"h3\", {\n    \"id\": \"speculative-loading\"\n  }, \"Speculative Loading\"), mdx(\"p\", null, \"Predict and preload resources the user is likely to need next.\"), mdx(\"h3\", {\n    \"id\": \"performance-budgets\"\n  }, \"Performance Budgets\"), mdx(\"p\", null, \"Set limits on resource sizes and load times to prevent regressions.\"), mdx(\"h3\", {\n    \"id\": \"apis-for-measurement\"\n  }, \"APIs for Measurement\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Performance API\"), \": High-precision timing for benchmarking.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Resource Timing API\"), \": Detailed network timing for each resource.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Navigation Timing API\"), \": Metrics for page navigation events.\")), mdx(\"h4\", {\n    \"id\": \"code-example-using-performance-api-to-measure-tti\"\n  }, \"Code Example: Using Performance API to Measure TTI\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-js\"\n  }, \"window.addEventListener('load', () => {\\n  const tti = performance.now();\\n  console.log('Time to Interactive:', tti, 'ms');\\n});\\n\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Tip:\"), \" Use Lighthouse, WebPageTest, and browser dev tools to profile and optimize performance.\"), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"animation-and-frame-rate\"\n  }, \"Animation and Frame Rate\"), mdx(\"p\", null, \"Animations can delight users\\u2014or cause jank if not optimized.\"), mdx(\"h3\", {\n    \"id\": \"css-vs-js-animation\"\n  }, \"CSS vs. JS Animation\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"CSS Animations/Transitions\"), \": Offloaded to the browser, often GPU-accelerated.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"JS Animations\"), \": Use \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"requestAnimationFrame\"), \" for smoothness, but can block the main thread if not managed.\")), mdx(\"h3\", {\n    \"id\": \"impact-on-smoothness-and-jank\"\n  }, \"Impact on Smoothness and Jank\"), mdx(\"p\", null, \"Aim for frame times under 16.7ms (60fps) for smooth animations.\"), mdx(\"h4\", {\n    \"id\": \"code-example-requestanimationframe-vs-css-transitions\"\n  }, \"Code Example: \", mdx(\"inlineCode\", {\n    parentName: \"h4\"\n  }, \"requestAnimationFrame\"), \" vs. CSS Transitions\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-css\"\n  }, \"/* CSS Transition */\\n.box {\\n  transition: transform 0.3s ease;\\n}\\n\")), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-js\"\n  }, \"// JS Animation\\nfunction animateBox() {\\n  let start = null;\\n  function step(timestamp) {\\n    if (!start) start = timestamp;\\n    const progress = timestamp - start;\\n    box.style.transform = `translateX(${progress}px)`;\\n    if (progress < 300) {\\n      requestAnimationFrame(step);\\n    }\\n  }\\n  requestAnimationFrame(step);\\n}\\nanimateBox();\\n\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Tip:\"), \" Prefer CSS for simple animations; use JS only when necessary and avoid layout thrashing.\"), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"best-practices-and-common-pitfalls\"\n  }, \"Best Practices and Common Pitfalls\"), mdx(\"h3\", {\n    \"id\": \"minimizing-main-thread-work\"\n  }, \"Minimizing Main Thread Work\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Defer non-critical JS and CSS.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use Web Workers for heavy computation.\")), mdx(\"h3\", {\n    \"id\": \"optimizing-resource-order-and-attributes\"\n  }, \"Optimizing Resource Order and Attributes\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Place critical CSS in \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"<head>\"), \".\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"async\"), \"/\", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"defer\"), \" for scripts.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Preload important resources.\")), mdx(\"h3\", {\n    \"id\": \"avoiding-layout-thrashing-and-excessive-reflows\"\n  }, \"Avoiding Layout Thrashing and Excessive Reflows\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Batch DOM reads/writes.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Avoid changing layout properties in rapid succession.\")), mdx(\"h3\", {\n    \"id\": \"defining-image-dimensions-to-prevent-reflows\"\n  }, \"Defining Image Dimensions to Prevent Reflows\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Always set \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"width\"), \" and \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"height\"), \" on images to reserve space.\")), mdx(\"h3\", {\n    \"id\": \"using-layers-and-compositing-judiciously\"\n  }, \"Using Layers and Compositing Judiciously\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Promote only necessary elements to layers (e.g., with \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"will-change\"), \").\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Avoid excessive layer creation, which can hurt memory usage.\")), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"advanced-concepts\"\n  }, \"Advanced Concepts\"), mdx(\"h3\", {\n    \"id\": \"compositing-and-gpu-acceleration\"\n  }, \"Compositing and GPU Acceleration\"), mdx(\"p\", null, \"Elements with certain CSS properties (opacity, 3D transforms, \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"will-change\"), \") are promoted to GPU layers for efficient compositing.\"), mdx(\"h3\", {\n    \"id\": \"performance-monitoring-rum-vs-synthetic\"\n  }, \"Performance Monitoring: RUM vs. Synthetic\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"RUM (Real User Monitoring)\"), \": Measures actual user experiences.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Synthetic Monitoring\"), \": Simulates user interactions for regression testing.\")), mdx(\"h3\", {\n    \"id\": \"profiling-tools-and-apis\"\n  }, \"Profiling Tools and APIs\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Chrome DevTools\"), \": Performance tab for flame charts, call trees.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Firefox Profiler\"), \": Advanced performance analysis.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"PerformanceObserver API\"), \": Programmatic access to performance entries.\")), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"real-world-use-cases\"\n  }, \"Real-World Use Cases\"), mdx(\"h3\", {\n    \"id\": \"case-study-optimizing-a-slow-loading-page\"\n  }, \"Case Study: Optimizing a Slow-Loading Page\"), mdx(\"p\", null, \"Suppose your site loads slowly on mobile. Using the techniques above:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Consolidate resources under fewer hostnames.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Inline critical CSS and defer non-critical JS.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use lazy loading for images below the fold.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Profile with Lighthouse and fix main thread bottlenecks.\")), mdx(\"h3\", {\n    \"id\": \"troubleshooting-guide-diagnosing-render-bottlenecks\"\n  }, \"Troubleshooting Guide: Diagnosing Render Bottlenecks\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use DevTools to identify long tasks and main thread blocks.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Check for render-blocking CSS/JS.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Audit image sizes and dimensions.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Monitor TTI and FCP (First Contentful Paint).\")), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"conclusion\"\n  }, \"Conclusion\"), mdx(\"p\", null, \"Understanding the browser\\u2019s rendering pipeline is essential for building fast, responsive, and accessible web apps. By optimizing each step\\u2014from network requests to painting pixels\\u2014you can deliver delightful experiences to your users. Remember to measure, profile, and iterate using the tools and APIs available. With these best practices, you\\u2019ll be well-equipped to tackle performance challenges and build world-class web applications.\"), mdx(\"p\", null, \"Ready to dive deeper? Explore browser developer tools, performance APIs, and accessibility guides to further enhance your skills. Happy coding!\"));\n}\n;\nMDXContent.isMDXComponent = true;","tech":["TS","JS"],"category":"Post","appDescription":null,"hero":{"full":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsSAAALEgHS3X78AAAE8klEQVQ4y1VU+U9UVxR+KhWJYhTKYiRUBkRksYLgjhuRWGw0aiKKwtRGw+IolQFhoCCkWNlVBlkaZZFlhn0tDCiy6QgiA1JMrG1NA7Gpf0Njvn73Gk384ebe9955555vOUcJDw9HeXkFTp48CUVRPltLly6FjY0NVq9eDXd3D+zYsQOnTp1GQ0MDpqenodUmyjgrKyssWbIEixYtghIXF4e6unqUlZUhMzMTeXl5KOW5uroaXV1dGHz0CA8ePsTQ0DBqampQWFSElpZWxMbG4fbtYqxcufLzQkymfgwPDzOo5VPiq1eTERERgdDQUPj6+kKlckdTUzPUajWsra2Rn1+AI0eOorm5BQcPhsrKHB0d4ePj8yGh0WhEaWkZIVp/umnx4sUy0MrqC/mckXENxcXF2L9/Pzo6OoigRiIQqLRaLXJycpGamgalqOgmmnl7Q30DvDZskBXY29uTNztW5wd//wCZMCYmFuPj46ioqMDExATevv0HFouFl+hRWFgkqejt7YOi06WisbEJ/aYBhIWFSSFsbW2Z9EsEBW2F53pPSXp4+Cn09w/Azs5OVvWQvBqNjXjx4gVyc/MobDlqSZlSUFAIg8GAzs4uREdHy2oEHx4eHlC5qXh2wqpVqxAYGCTd4OLigqioKJnIYpnG3bv3ELw7mC5wh7e3NxQRJKAI0rOzr0vunJyc4Oy8Bo4OjrAj9I+XlJWV4x4TmEwmzM3NobunB7W1tfDz82MyH4QcCIEi1BWWGB0dozCl0k8igdhFZZ6enlT0CNLS0tDe3o7Xr/+QrhD22kDORTEajUaqLWykGAyNaGtrw9jYY1llSEgI9u7di4SEBOj1eknH4OAgzOanmJ2dxatXr/CYsSUlJdCl6FBVWYXSO6VMegnpGRlQIiLOIoUfnk1O4ubNW/RYPnoIpbu7Gx2dnRgZGZEJ9foSPHliJsQ6FtCOIip740YOjAajfBZqC28qzs7OCAjYIn3Yzg8zMzNM+Cuyf8pGVVU1aug3ATEzMwut7JCsrCyk/5guUU1NTWF0ZJStaEBlZSUy0q9BcXBwwInjJyQnzyef492/7wi9CQ8GHsDUZ5JJxPuhR0OYfDaJhfkFKcgkEV28eBF7goORzM4SMQKhUnjrFoYpSE9fH9o6OmGmafNp0gHCHDOb0ctOGufPs3Mv8ff8PB6TSxFnIZJc0tPU2ipj20hPIwVWSiJOI+/oUSTt3ImUPcHIDD2I815eiKEV0vbtw8+HD3OFIYdKX//2MBIZFx8YiCzGFR4/huxvDiFS5cZ3W5C8exeUcFrkikqFK25ucmlp6CSuq7SEZs0aaNevRyLPP/CbZu1a6NiOsWxN8d/HpaZ3z3I/I+bABc66a9u3I2XTJqQFBOASOyGZEyaJrk/194du82Ykbdwon0VMPBNHsj2juM5xVn7H3ldbf3hW86xErViBy2yxGN6uWbcOcdzj2UbxPF/mnsTkGtevoBMU8ALxPo5dIwo5u2wZ1PxfvXw5znEuil2xtV4GH05jXw6BIL+vodVcRoX+Dhpr69FJo09QsLkpC3rbO2Cm0k+HR5B//QZC9x1A8DZO8GMncCk6Br//9hILf72BYk/buLGSXZTfxdUVZyKjcI/+a+Akec7m/+/9e/z55g2q799HHf0Ww0kdtHUbvH188f35C/iFvX2F81CbmAjL9Az+ByoFkXWUHm8uAAAAAElFTkSuQmCC","aspectRatio":1,"src":"/static/f4485edfdde8a60673160ba454fafa80/a1946/browser.png","srcSet":"/static/f4485edfdde8a60673160ba454fafa80/5b37e/browser.png 236w,\n/static/f4485edfdde8a60673160ba454fafa80/49058/browser.png 472w,\n/static/f4485edfdde8a60673160ba454fafa80/a1946/browser.png 944w,\n/static/f4485edfdde8a60673160ba454fafa80/6050d/browser.png 1200w","srcWebp":"/static/f4485edfdde8a60673160ba454fafa80/99fbb/browser.webp","srcSetWebp":"/static/f4485edfdde8a60673160ba454fafa80/77392/browser.webp 236w,\n/static/f4485edfdde8a60673160ba454fafa80/1f177/browser.webp 472w,\n/static/f4485edfdde8a60673160ba454fafa80/99fbb/browser.webp 944w,\n/static/f4485edfdde8a60673160ba454fafa80/9000d/browser.webp 1200w","sizes":"(max-width: 944px) 100vw, 944px","tracedSVG":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='400'%20height='400'%20viewBox='0%200%20400%20400'%20preserveAspectRatio='none'%3e%3cpath%20d='M0%2023v23h3c6%200%208%201%208%203-1%202-1%202%201%200l3-2%203-4%201-4v-4l3-3%202-2c1-2%201-2%202-1h1v3c-1%202-1%202%205%202l9-2a766%20766%200%200171-5A29085%2029085%200%2001304%209c-2%200-3%200-2-2%200-1-1-1-2%201-3%203-3%201%200-4l1-4-2%202c-1%205-5%208-11%208-14%202-13%202-12%200%200-1%200-2-2-2-3%201-4%200-1-3l1-3-4%204c-3%205-3%206-7%206-4%201-6-2-4-3s5-7%205-8L164%200%2065%201l-5%2014-4%2015-2-6c0-2%200-2%201%200s1%202%201-1v-2c1%201%201%201%201-2v-3l1%201v-3l1-6c2-8%202-8-3-8-4%200-4%200-5%204-2%208-3%2010-2%205l1-7-1-2-2%204-2%207-1%203v-3c0-2%200-2-1%200h-1c0-1%200-2-1-1l-1-1%201-1V6l1-1c1%201%202-1%201-3-1-3-2-2-3%204-2%205-2%206%200%208%201%201%201%201-1%203v4c-1-1-2%201-2%204%200%205%200%205%203%205h2l-3%201c-3%200-4%200-3-3%200-3%200-3-1%200-1%204-3%205-3%203%200-1-1-1-1%201-2%201-2%201-1-2l2-9%205-20-2-1-2%202-1%202-1-1-1-1-2%201%201%201c2%200%203%201%202%204l-2%202-1%201%201%201c3%200%203%202%201%207-3%207-5%209-5%205%200-2%200-2-1%200-1%201-1%201-1-1s-2-4-2-1l-1%202-1%202h2c2-1%203%200%201%203-1%202-5-2-5-4l-1-2v1l-1%201c-2-1-2%200-2%201%200%202%200%202%201%201h2a43%2043%200%2001-2%2017l-1%202-1-4v-3l-1%204-2%202c-4%200-5-1-4-5l7-37%201-3H0v23M316%203c-6%206-7%208-5%2011s5%2010%205%2013%201%205%204%206%203%206%200%206c-2%200-2%200-2%206a1632%201632%200%20016%2036l2%208%202%204c0-2%200-2%202-1l2%202%201%201c1-1%203%201%202%202l1%201h1l2%206c5%2010%205%2029%200%2032l-1-1v-2l-2%202-2%201%202-5%202-7-1-3-2-10-3-7v7c0%205%201%206%201%204%201-3%201-3%201%201v8c1%205%200%207-3%206v3c1%201%201%201-2%201-1%200-2%200-1-1l1-2c0-2%200-2-1-1%200%201-1%202-2%201v-1l1-2h-1l-1-2c0-3-2-2-2%201v5l-1%201-6%202c-5%202-3%203%203%201%204-2%205-2%205-1l2%203v1c-2%200-2%200%200%202s4%202%204-1c0-2%201-3%202-3v5c2%200%203%201%206%2012l4%2012c1-2%201-2%203%201%207%209%209%2018%207%2026l-1%207-3-12c-2-11-4-17-4-12l1%205%203%2017%203%2011%201-4%201-3%202-3%201-1%201-1-1-1v-2l1-2%201-1c1%201%201%201%200%200l1-3%201%201c-1%202%200%202%202%200%202-1%202%200%201%205-1%202-1%202-1%200v-3l-2%202-2%204v1l2%2010-1%2013c-1%201%200%202%202%205l5%203h1v-2l1-3%202%204c1%206%202%207%204%206l3-1c3%200%205%200%203-1h-3v-3l-1-7-2-4v5l1%205v2c0%201-5-5-6-9h-1c0%202-2%202-2-1h1c2%201%201-2-1-3-3-3-2-24%201-22a1664%201664%200%20017%202c-4-3-3%200%201%204%206%206%209%2011%2010%2018%201%206%201%206-3%204-2-1-2-1-2%202s0%203%201%201c1-3%201-3%202%201l-1%202-1%202%201%201h1c1%201%200%201-1%201l1%201%202%202-2%201c-2%201-2%201%201%201s1%202-3%202c-1%200-2%200-1%201v1l1%201%201%201v2c-2%202-1%203%201%202h1c0%201%206%202%207%201l-3-1c-2%200-3%200-2-1%200-2%207-1%207%201l-1%201v1h6l-1%202v8h1c1-1%201%200%201%203l-1%203-1%201v5l1%201-1%201c-2-1-1%201%201%202%201%201%201%201%201-1a891%20891%200%20001-76v-5l-6-1c-11-2-19-5-21-7-3-3-4-12-2-13%202-2%202-5%201-4v-4c1-1%202-2%204-1l5-1c3-1%206-1%205%201v1l2-1%201-1c2%200%201%205-1%205v-1h-1c-2%200-2%201-1%202v4l2-1c2-1%202-2%201-2-1-1%200-1%201-1l3-1%201-1c1%200-2%206-5%206l-2%202c1%200%200%202-2%202-1%202-2%202-2%201h-1c-3%204-7%203-8-2l-2-2v3c3%204%2010%209%208%206%200-3%204-3%2011-1%209%202%209%202%209%200l-1-2v-1l-1-3-3-1c0%202-2%203-5%202l2-3c3-2%204-2%204-1%202%204%204%202%204-2%200-5-1-6-3-5l-1-1%202-1c2%200%203-6%203-20l-1-17v-5h-22l11-1c10-1%2011-1%2011-3s0-2-7-2a727%20727%200%2001-41%201l1-2v-1c0-1%201-3%2016-13%2013-11%2016-13%2017-16%200-2%200-2-5%202l-6%204-6%203c-3%202-7%203-10%203-6%201-9%202-7%203h2l4-1c6%200%205%203-5%2010-3%202-4%204-4%205l-1%202-2%205c1%201%200%203-1%204v-3l1-7%201-3c-1-3%201-8%204-10v-1l-4%203c-3%205-4%205-4%201l-4-7-3-6c0-2-1-2-2-2l-1-1%203-1a734%20734%200%200127-6l8-2a560%20560%200%2000-5%203l5%201a325%20325%200%200118-3l6-1%205-1-5-1h-6l4-1c6%200%207-1%207-4%200-2%200-3-2-3l1-2c2-1%203-4%201-2l-1-1c1-1%201-1-1-1l-7%202-3%201v1l-2%202a1888%201888%200%2000-60%209c1-1%200-2-1-3l-1-2v-2c-2-2-3-9-1-9l3%204%201%202c0-2%200-2%2026-6l43-7c5%200%205%201%204-31V0h-82l-2%203m-15%2019l2%201%201%201-3%203a633%20633%200%2000-19%200l2-1h-2c-2%200-3%201-4%204-2%205-2%205-1%2018l3%2013v-1l1-3h5c3%200%204-1%204-3l-1-2-1-1c0-2%203%200%203%203%201%202%202%202%204%202l8-2-2-2a1161%201161%200%20002-8c1%201%201%201%201-1l-1-8-1-6%201-1%202-2%201-1c2-1%201-4-2-4l-3%201m-65%206c-5%200-7%201-9%203-3%203-3%202%201%2029%203%2019%203%2020%206%2023%201%201%203%202%205%201a374%20374%200%200126-6h1l2-3c2-5%201-26-1-28l2%2021c0%202%200%202-1%201v1c0%202%200%202-1%201h-1v1l-1%202v1h-1l-3%202v1l-3%201c-2%200-1-2%202-3v-2h-1c-3%202-3%201-1-1%201-2%202-2%202-1l1%201%201-2h-1l-1-1%201-1h1c0%202%204-2%204-4%201-11-2-25-6-28l-1-1%201-1%201-1v-3h-5v-1l-11-1c-11%201-11%200%201-1l8-1h-6l-12%201m-9%208a131%20131%200%20006%2040h-1l2%202h2c-2-2%200-1%203%201%202%203%203%203%208%202l5-1h-5l-5-1h9l-4-1h-5c-2%200-2%200-1-1h-1c-2%200-2%200-1-1%202-1%200-2-2-1v-1l-1-1c-3%202-7-14-8-36%200-3-1-3-1-1m-52%204A3171%203171%200%200155%2055c-1%200-1%207%201%209l1%207c0%202%200%203%201%202v3l1%202c1-1%201%200%201%202v3c1-1%201%200%201%202v2c1-1%201-1%201%201a558%20558%200%200013%2077c-1%202%200%203%201%207l2%203c1-2%201-1%204%2012l3%2010v1c0%202%202%205%203%205v-1c-2-2%200-2%203-1v2c-3%200%202%202%206%202l-1-1c-6-2-5-3%2020-9a220%20220%200%200023-7%201439%201439%200%200072-19c10-2%2011-2%2011-8%200-3-1-5-2-3-1%201-1%200-1-1l-1-5h1l1%203v-3l-1-11c0-8%200-7%203%207%202%2010%202%204%200-7-1-6-2-12-1-13%200-2%200-3-2-4l-1-7v-3c-1%203-2-4-1-9%200-2%200-3-1-2-1%202-3-13-2-15l-1-2-2-8a305%20305%200%2000-9-40l-4-1-23%203M31%2051c-3%204-4%207-2%2011v-3l1-4%201%203%204%2017a74%2074%200%20013%2021c1-2%201-2%201%201l1%207v2c1-3%201-2%201%202v3c0-3%201-1%204%2011%203%2013%204%2021%202%2015-1-2-1-2-1%200l1%206c2%203%202%204%202%202v-2l1%202%201%206v2c1-2%201-2%201%202v5c0%203%200%204%201%202s1-2%201%202v2l1-2v-16l2-1h1l2-1c1%200%202%200%201-1l-1-2-1%201v-2c0-4%200-4-1-2l-1%201c0-1%200-2-1-1l-1-1v-2l1-1-3-1h-2c1-2%200-5-1-4-1%202-2%200-2-5v-4c1%201%201%200%201-1a161%20161%200%20010-5c-4-4-5-6-6-11l1-6v-6l-1-1h-3l-1-2h3v-2l-1-3%201-4v-2l1%202-1-16-5-13c-1%200%200%206%202%2010l-1%202-1-3-1-2-1-2-1-2-3-2%201-3%202-3-3%204M12%2064l-5%207%202-1%203-2%201-2c2-2%203%200%205%205%201%207%201%2010-1%205l-2-4v3l6%2035%205%2022c13%2050%2013%2054%2013%2046-1-7%200-12%201-10%202%202%201%200-1-9l-2-7%201%206c0%204%200%206-1%205l-1-2-4-9v-8c1%201%201%200%201-1%200-2%201%200%202%203a295%20295%200%2001-4-18c2%205%202%2011%201%2011v3h-2v-7l-3-4c-2-6-3-13-2-14l-1-1v-2l-1-2-1-9v-1l-2-16-1-6%202%206a885%20885%200%2000-4-26c0-1-3%201-5%204m14-3l2%2010c3%2012%204%2022%203%2023l1%202%201%203a22299%2022299%200%20005%2012l1-1c-2-1-2-1-4-11a684%20684%200%2000-9-38m267%200c-10%202-12%203-8%206%204%202%209%204%209%202h4l3-1%202-2c3-1%204%200%203%202%200%201%201%202%203%202%204%200%205-1%203-2v-3c1-3%200-6-2-4v1c2%200%201%203-1%203-2%201-2%200-2-2%201-3-1-3-14-2M6%2094l-5%203c-1-1-1%201-1%209s0%2010%201%209h2l1-2%202-2c2%200%205%206%203%207-1%201-1%201-1-1l-1-2%201%208c1%202%201%202%201-1v-3l1%203v4c-2%201-4-1-4-4%200-2%200-2-1-1v2l-2%202c-3%201-3%203%201%202l2%201-2%201v1l1%203c0%201%200%202%201%201s13-1%2014%201c2%202%201-2-1-6l-1-4v7c-1%200-2-2-1-6l-1-4-1-2v-1c2%201%202%200%202-1%200-4-3-12-4-13l-1-2h1v-6c-2-7-3-7-7-3m241%203c-3%201-5%201-4%202l-2%203h-1v-2l-1%202v2h1l-2%201v1l-1%201-1%205c0%204%200%204-1%202v3a317%20317%200%20003%2030l-1-2c-1-1-1%200-1%201%200%202%200%203%201%202l4%203c3%203%203%203%208%202%202-1%205-2%206-1l2-1%202-1%209-3c9-3%2010-4%2010-12v-5l-1%204-2%206v3l-8%203c-10%202-10%202-9%200l-3-1h-3l3-1%207-3%204-1-3%203-4%202c0%202%205%200%207-2%201-2%201-2%202-1%202%203%206-6%207-12%200-8%200-8%201-4l1%205v-5l-1-12-2-11-1-3c0%201-3%200-5-2-5-3-14-4-21-1m52%2020a77%2077%200%2000-7%202c-1%200-2%203-1%205%200%202%201%202%205%202l5-1%203-1c5%201%209-1%209-3l-1-4h-13m-69%207c1%203%200%204-1%204-2%200-2%200-1%201%202%202%204%207%202%207l-1%201%201%201c2%200%204%208%203%2010-2%202-6%201-6-1l-1-1%201%207c1%207%202%208%206%206%203-1%204%200%204%205l1%203%201-2-1-7-1-6v-2l-1%202c-1%201-1%201-1-1a336%20336%200%2000-5-27m9%2012l2%208v2l1%201h1v1c1-1%202%200%203%201%203%202%208%202%208%200h1l1-1-6-1c-2%200-2%200-1-1%202%200%202%200-1-2-3-1-3-1-2-2s0-2-2-2h-1l-1-3-3-5v4M1%20144c0%202%201%203%202%203v1H2l-1%201%202%201%203%201H3c-2%200-3%203-1%205l1%201-1%201c-2-2-1%201%203%209l5%207c0-2%200-2%201-1l1%203h-1v4c1%201%201%201%201-1%200-4%203%203%203%208%200%202%200%202-1%200v18l-6%201-5%202c-2%200-2%201-2%2033l1%2033%204-2c4-4%2013-8%2015-7%202%200%205%203%208%206l6%205%201%201%202%204%202%205H1l-1%2057v57h94l-1-14%201-14%201%202c0%202%205%207%206%206l5%203%205%202%201%201%201%201c3%200-11-13-17-18-5-3-6-4-5-6%200-1%202-1%204%201%201%201%203%202%203%200h1v-1c-1-2%200-2%2014-2%2013%200%2015%200%2017%202%201%201%201%201%201-1-1-1-1-2%206-2l8%201h1c1-1%201%200%203%202l2%202h1c0%204%200%205%201%203h1v3h1c1-1%201-1%201%201v1h1v3c2%200%2011-3%2011-5h-1c-2%201-6-4-5-6l-1-1v-2c1-2%203-2%2016-2l13%201%201%201h3l-1%201c-1%200-2%200-1%201l-1%201c-1-1-1%200-1%201h-3c-1-2-2-2-2-1l4%203c3%202%203%202%205%200s3-6%201-6v-1a786%20786%200%200188-1l3%201-5%203-3%202%206-2c3-2%205-3%2010-3%207%200%206%201-7%208l-18%209c-8%205-10%206-10%204h-5l-1%201%202%201c1%200%201%201-1%204l-6%2011a354%20354%200%200062-2c0-3%200-4%201-2s4-1%204-5l2-5%203-5c1-3%202-4%203-3l6%202c6%201%206%202%202%209-2%205-3%206%200%203l2-1-1%203-2%202%202-1%204%201h3c3-2%203-2%205%200%201%201%202%201%203-2s1-4-1-5c-2-2-3-2-3-1%200%202-2%203-2%201l-2-1c-1%201-1%201%200%200l-1-1v-2l1-1%201-1c-1-2%202-4%203-2h1l6%204c2%203%205%205%206%205%201%201-1%202-5%205-4%202-7%205-6%205l23%201%2023-1v-1h-1l-1-1c1-1-21-15-24-15l1%201c1%202%201%202-2%203l-3%201h-2l-4-3-4-3-1-4c0-3%200-3%202-2%203%202%204%200%201-2-3-1-4-4-2-2l1-1-2-2c-1-1%200-1%202-1l3-2%201-1v3c0%202%200%202%201%201%200-2%201-2%201-1h2v-2l-1-2c1-2%2012-2%2012-1h1l7-2c6%200%207%200%2013%204l8%204v16l1-41-1-58-3-3-2-1c1%201%200%202-1%202l-2-3-1-3-1-1v-3l-1%203v7h2v1h1c0%201-3%202-9%202-8%200-12-1-7-2%201%200%201-1-1-3l-2-3-4%202-4%204c1%202%200%202-5%202h-6l8-4c8-5%209-6%208-8-1-1-1-1%201-1h1l1-1c1%201%201%201%201-1l-2-2v2h-3c-2-2-3-2-10%202-6%203-9%204-10%203-2%200-2%200-1%201%202%201-15%2010-18%208h-3l-10%201c-7%200-8%200-7-2v-1l-2%201c1%201-1%202-11%202-8%200-10%200-12-2l-2-2-5%202c-4%202-9%203-10%201v-2l-4%201c-3%203-16%203-15%200h-2c-1%202-3%202-8%202-6%200-7-1-8-4s-1-3-1-1l-1%203v1l-14%201-15-1c0-2%200-3-1-2l-1%202c1%201-1%201-8%201l-9-1h-24c1-1%200-2-1-2l-1%202c1%201%200%201-6%201s-7%200-6-2h-1l-2%202v-2c3-3%204-12%201-12v5l-2%201%201%201%201%201-3%201c-2%200-2%200-1-1v-3h-1l-2%202c-1%202-1%202-2%200-3-2-3-1-2%203l2%203-10%201h-10l5-2%204-3%201-1%203-1%203-2h1c0-2-1-2-2-2-4%201-5%200-3-4%202-7%200-14-5-16l-2-3h-2c-2%200-2%200%200-1%201-1%201-1-3-1-5%200-14%204-12%205v3c-1%204-2%209-1%2012%202%203%203%204%204%203h1v1c-3%200%203%205%207%206h3l-2%202c-2%201-3%201-4-1h-3c-2%200-3-1-2-3l-1-1v-1l-1-1-2-3c-2-5-3-5-2%200%202%206%200%207-2%203l-3-4%203%207%204%207c0%202-13%201-13%200h-1l-3%201c-4%200-4%200-8-8l-11-20c-7-14-7-14-5-16%201-2%201-2%203%201%200%202%201%203%202%203l-3-6-3-9c-1-4-1-4-2-2v-2c0-3%200-4-1-3-1%202-1%202-1%200-1-2-1-3-2-2s-3-5-4-11c0-3%200-3%201-2l1%203%202%202v-7c-1-3-2-5-2-3l-1%202c-1-1-1%200-1%201h-1c-2-3-1%202%202%2012a167%20167%200%200022%2056l6%2011h-4l-4-1-1-3v2l-1%202-1-4v-1h-1c1-2-10-23-11-22l-1-1-2-6-2-6c2%200%201-2-1-5l-2-3-1-2v-4l-2-2v-3l-1-1-2-3-2-1c-1%201-1%201-1-1v-1h-2l1-1%201-1%201-2%201-3c0-2%200-2-2-2-2%201-2%200-7-19l-3-11%202%2011%201%2010-2-5v-4l-1%203c-1%203-1%203-1-1v-5l-1-5c0-3%200-5-1-3%200%202-1%201-2-4-3-10-14-31-14-26H6v-4c-1-2%200-4%203-4l3%202c0%202%200%202%201%201%201-2%201-2%202%201%201%204%201%205%202%202%202-4%200-7-3-7l-8-1c-4%200-5%200-5%202m305%2011l-17%204-4%201%204%2018%205%2017%202-1c2%200%2029-8%2031-10%202-1-5-32-7-33l-14%204m-70%2018c-2%203-3%203-5%203h-2c1%201%201%201-1%201h-2a1047%201047%200%2001-124%2034l-11%203h-5c-5%200-5%200-1%201l4%201h-4l-6-1v-2l-2-1c-2%201-4%200-4-2h-2v-1c2-1%202-3-1-14l-4-11%203%2012%202%2010-2%202-2%202-1-2-1-1%202%206c1%204%201%205-1%203l-1-1%201%203v1l1%201h1c-1%202%204%204%208%204l16-4a3312%203312%200%200186-24%202923%202923%200%200045-13c11-3%2011-3%2013-7l2-4v-2l-2%203m31-1l-1%203c0%202-2%203-2%200l-1%201c-1%201-1%201-1-1-1-2-1-2-1%201l1%203%201%202%203%203c1%201%201%201-1%201-1-1-2%200-2%201l1%201h3c2%201%205-2%204-4h2v-3c0-2%203%201%203%203l1%204c1%201%201%201%201-1v-3l1%203h1c1-1%202-2%201-3-2%200-10-8-10-10l-2-1h-2m58%2019l-3%203h5l-2%201%201%201c3%201%202%203%200%202l-3%201-4%201-2-1%203-1c3-1%203-1%201-1l-4%201-3%203h2c4%200%204%200%205%203l1%203v2l-1%203-1-2v-2l-1-2-1-1v5l-1%203-2-2c0-3-3-7-5-6h-3v1c1%202-1%207-3%206v3l-1%204c-1%201-1%200-1-1l-1-6c-1-2-2-4-1-5l-2-1-1%201%203%206c2%205%202%205-4%205-3%201-4%200-4-1l-4%202c-2%202-4%204-3%205-1-1-2%200-3%201s-1%201-2-4l-2-6v2c1%203-1%207-3%206l-1%202-1-2c-2-12-3-15-6-18l-1-2%203%201%201%201v-1c-1-2-12-3-10-1l2%201c5-3%2011%2016%208%2024-1%204-3%203-3-1%201-1%200-5-1-8l-1-2c1%206%200%2014-1%2015h-1v-2c-1%201-2-5-2-8l-4-7%201%204c2%202%202%203%201%207-1%206-4%207-4%203s-5-14-8-17c-4-3-4-3-2-4h6c-2-2-2-2%200-2h5c2%200%202%200%201-1s-1-1%201-1v-1l-2-2c-1-1-1-1-1%201%200%201-1%202-3%202l-4%201-7%203c-8%203-8%204-3%2010%204%206%207%2014%207%2019s1%205%2010%203l7-2%204-2%2012-5%209-3%207-2a129%20129%200%200034-16l5-2h4l4-1h-7l3-1%204-2-3-1c-2%200-3%200-2-1v-1c-2%200-2%200-1-3s1-3-1-2c-2%200-2%200-1%201v1c-3%200-3-1-2-4%202-1%202-2%200-3-1-1-1-1%201-2%201-1%201-1-1-1-3%200-4%201-6%203m-41%204l-1%202c-1-1-2%200-3%201s-1%201%202%201h6l2%201%202%202%203%201c1-1%201%200%202%201l2%201c1-2%205-2%205%200l2-1%201-2v-1l1-2c0-3-1-4-6-1l-5%201h-6c-1-1%200-1%201-1%202%200%202%200%201-1l-1-2-2-1h-4c-1-1-1-1-2%201m-76%2010l-2%201h-2l-1%201c-2%200-4%203-4%207%200%202%200%202-1%201h-3v-1c1-1%201-1%200%200l-2-1h-1c-1%201%200%205%202%208%201%201%204%200%203-2l1-1c1%200%202%201%201%203v1c1%200%202%201%202%203s0%202-2%201l-2-1c0%203%2010%207%2012%205%201-1%201-1%201%201a1201%201201%200%20002%205l3%202h1l3-2%202-2v-2l1%205v5l2-8%202-4c0-2%200-2-3-1l-3-1-2-2v1l-1%201-4-4c-1-3-7-8-10-7-3%200-4-1-2-4%201-3%208-2%2015%202l5%202-2-2c-4-2-4-3%200-2l2-1v-1c2%200%200-1-3-2-5%200-8-2-8-4l-1-1-1%201m-49%2010c-2%200-3%202-1%202l1%201h-3v-1h-3c-1%202%201%206%202%204l1%201%202%201c3%200%207%204%206%205l2%203c3%204-2%209-6%205-2-1-2-1-1%201%200%201%201%202%203%202%203%200%205%203%204%206-1%202%200%203%203%201l1-6-1-5c-1-6-2-7-3-6l-1-1c1-1%200-2-1-4l-1-3v-1h-1l-2-2c-1-1%200-2%201-3h-2m238%204l-3%204c-2%201-2%201-1%202%203%200%202%201%200%204l-1%202%201%202-1%201c-2%200%200%206%203%209l4%207%201%204v-18c0-18-1-22-3-17m-269%201l-1%204v1c1-2%204%203%203%206h1c1-2%203%200%201%202l1%201h1l2%206c3%203%204%204%208%204%205%200%205%200%204-1s-2-2%200-3v-3l-8-10c-6-8-8-9-12-7m-11%209l-5%203-3%202c-2%200-2%200-1%201l1%202c0%203%200%203%202%203v2c-2%201-1%202%203%203l4%201h-4c-5%200-5%201%200%201l2%201h3l3-2v-1l1-2%201-5c2-2%202-3%201-3v-3c1-4%201-4-3-5l-5%202m204%2011l-27%2011c-2%202-1%204%200%203l1%201%201%203c1%202%202%202%203%201l3-2-1%202-2%201c-2-1-1%202%202%205l2%201%203-1c2%200%202%200%200%201l-2%201c-2-1-1%202%202%205l4%203%2011-5%2026-12c19-8%2019-8%2012-17l-6-5-1%201v-3h-1l-3-5-27%2011M39%20250c2%201%201%202-2%201-3-2-6-1-3%200v3c0%201-1%201-5-2l-4-2%204%203c5%204%2014%2016%2012%2017l1%202h1l4%205%204%205%201%202c1%202%2012%203%2012%201%200-5-10-21-11-19l-3-1c-1-1-1-1%201-1s2-1%200-3v-4l-1-2h-1l-4-2-6-4v1m70%203l-1%201-1%202c-2%202-3%202-3%200l-2%203c-2%204-2%205-1%208l3%203-1-3-1-5%201-2v2c0%204%202%204%202%201l2-5c2-3%203-2%200%202-1%203-1%203%201%207l4%204c7%200%2012-4%2010-8v-3h-1v-1h-1v-1h-1l-1-1h-1c-2%200-2%200-1-1%202-1%202-1-1-2-3-2-4-2-6-1m-84%208c4%202%207%205%207%206%200%202%202%204%204%206l3%205%201%201%203%204%203%203c2%200%201-1-3-8-8-14-16-22-21-22-3%200-3%200%203%205m239%205c-2%202-2%202-1%203v2h1v5c-1%202-2%201-3-1-1-1-1%200-1%202l1%203h-4c-5-1-5-1-6-7%200-6%200-5-4-3s-4%202-1%202l2%203%201%202%201%203v2h-1c0%201%203%203%206%203%205-2%207-2%208-4s1-2%202-1h3v-2l-2-3h2c2%203%208%203%207%200h2l3-2%202-3h-1c-2%202-11%202-11%200h1l1-1-2-2-3-2c-1-1-2-1-3%201m-58%2039c0%202%200%202-3%202l-4%202c-3%205%200%209%206%209h3v-8l-1-8-1%203m-137%206v7h4c5%200%208-4%205-8v-1c3-2-1-6-6-6h-3v8m94%200l1%207%201-3c0-4%202-4%205%200s4%203%202%200-2-3-1-5c4-3%201-7-5-7h-3v8m-33%2019c0%203%200%203-2%203-2-1-6%202-6%205s3%206%206%206h4v-9l-1-8-1%203m-110%207l1%207%201-3c0-2%200-3%202-3l4%203c0%202%202%203%202%203l-1-3c-1-3-2-4%200-4v-7l-5-1h-4v8m136-4c-2%200-3%2015-1%2015l1-2%202-2c3%200%206-3%206-6%200-4-4-6-8-5m114%2036a777%20777%200%2001-43%2024c9-5%2013-6%2013-5%201%201%201%201%202-1l2-2h1c1-2%2014-9%2015-7%201%201%203%200%203-2l7-5c8-5%208-5%206-5l-6%203m-50%202v1h-1c-2%200-2%200-1%201s1%201-1%201l-2%202h-4l-1%202-1%201v1l2%202v1c-1%201-4-2-4-3l-1-1-2%201-1%201h-1l-1%201h-2l-1%201c1%201%201%201%200%200-2%200-3%201-2%203h1c0-2%200-2%201-1v3l1%201v1h2c-1%203%202%202%2012-3%209-5%2016-10%2013-10v-1l-2-2-2-3h-2M97%20386c0%202%200%202-1%201s-1%200-1%205c1%208%201%208%204%208h3l-3-4-3-5c0-2%200-2%208%205%206%205%207%205%203%200-3-2-4-4-3-4l5%204%204%204c2%200%200-1-8-9-7-6-8-7-8-5'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"regular":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsSAAALEgHS3X78AAAE8klEQVQ4y1VU+U9UVxR+KhWJYhTKYiRUBkRksYLgjhuRWGw0aiKKwtRGw+IolQFhoCCkWNlVBlkaZZFlhn0tDCiy6QgiA1JMrG1NA7Gpf0Njvn73Gk384ebe9955555vOUcJDw9HeXkFTp48CUVRPltLly6FjY0NVq9eDXd3D+zYsQOnTp1GQ0MDpqenodUmyjgrKyssWbIEixYtghIXF4e6unqUlZUhMzMTeXl5KOW5uroaXV1dGHz0CA8ePsTQ0DBqampQWFSElpZWxMbG4fbtYqxcufLzQkymfgwPDzOo5VPiq1eTERERgdDQUPj6+kKlckdTUzPUajWsra2Rn1+AI0eOorm5BQcPhsrKHB0d4ePj8yGh0WhEaWkZIVp/umnx4sUy0MrqC/mckXENxcXF2L9/Pzo6OoigRiIQqLRaLXJycpGamgalqOgmmnl7Q30DvDZskBXY29uTNztW5wd//wCZMCYmFuPj46ioqMDExATevv0HFouFl+hRWFgkqejt7YOi06WisbEJ/aYBhIWFSSFsbW2Z9EsEBW2F53pPSXp4+Cn09w/Azs5OVvWQvBqNjXjx4gVyc/MobDlqSZlSUFAIg8GAzs4uREdHy2oEHx4eHlC5qXh2wqpVqxAYGCTd4OLigqioKJnIYpnG3bv3ELw7mC5wh7e3NxQRJKAI0rOzr0vunJyc4Oy8Bo4OjrAj9I+XlJWV4x4TmEwmzM3NobunB7W1tfDz82MyH4QcCIEi1BWWGB0dozCl0k8igdhFZZ6enlT0CNLS0tDe3o7Xr/+QrhD22kDORTEajUaqLWykGAyNaGtrw9jYY1llSEgI9u7di4SEBOj1eknH4OAgzOanmJ2dxatXr/CYsSUlJdCl6FBVWYXSO6VMegnpGRlQIiLOIoUfnk1O4ubNW/RYPnoIpbu7Gx2dnRgZGZEJ9foSPHliJsQ6FtCOIip740YOjAajfBZqC28qzs7OCAjYIn3Yzg8zMzNM+Cuyf8pGVVU1aug3ATEzMwut7JCsrCyk/5guUU1NTWF0ZJStaEBlZSUy0q9BcXBwwInjJyQnzyef492/7wi9CQ8GHsDUZ5JJxPuhR0OYfDaJhfkFKcgkEV28eBF7goORzM4SMQKhUnjrFoYpSE9fH9o6OmGmafNp0gHCHDOb0ctOGufPs3Mv8ff8PB6TSxFnIZJc0tPU2ipj20hPIwVWSiJOI+/oUSTt3ImUPcHIDD2I815eiKEV0vbtw8+HD3OFIYdKX//2MBIZFx8YiCzGFR4/huxvDiFS5cZ3W5C8exeUcFrkikqFK25ucmlp6CSuq7SEZs0aaNevRyLPP/CbZu1a6NiOsWxN8d/HpaZ3z3I/I+bABc66a9u3I2XTJqQFBOASOyGZEyaJrk/194du82Ykbdwon0VMPBNHsj2juM5xVn7H3ldbf3hW86xErViBy2yxGN6uWbcOcdzj2UbxPF/mnsTkGtevoBMU8ALxPo5dIwo5u2wZ1PxfvXw5znEuil2xtV4GH05jXw6BIL+vodVcRoX+Dhpr69FJo09QsLkpC3rbO2Cm0k+HR5B//QZC9x1A8DZO8GMncCk6Br//9hILf72BYk/buLGSXZTfxdUVZyKjcI/+a+Akec7m/+/9e/z55g2q799HHf0Ww0kdtHUbvH188f35C/iFvX2F81CbmAjL9Az+ByoFkXWUHm8uAAAAAElFTkSuQmCC","aspectRatio":1,"src":"/static/f4485edfdde8a60673160ba454fafa80/3ddd4/browser.png","srcSet":"/static/f4485edfdde8a60673160ba454fafa80/078a8/browser.png 163w,\n/static/f4485edfdde8a60673160ba454fafa80/e56da/browser.png 327w,\n/static/f4485edfdde8a60673160ba454fafa80/3ddd4/browser.png 653w,\n/static/f4485edfdde8a60673160ba454fafa80/c5cc7/browser.png 980w,\n/static/f4485edfdde8a60673160ba454fafa80/6050d/browser.png 1200w","srcWebp":"/static/f4485edfdde8a60673160ba454fafa80/0acdf/browser.webp","srcSetWebp":"/static/f4485edfdde8a60673160ba454fafa80/ac59e/browser.webp 163w,\n/static/f4485edfdde8a60673160ba454fafa80/7660b/browser.webp 327w,\n/static/f4485edfdde8a60673160ba454fafa80/0acdf/browser.webp 653w,\n/static/f4485edfdde8a60673160ba454fafa80/75470/browser.webp 980w,\n/static/f4485edfdde8a60673160ba454fafa80/9000d/browser.webp 1200w","sizes":"(max-width: 653px) 100vw, 653px","tracedSVG":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='400'%20height='400'%20viewBox='0%200%20400%20400'%20preserveAspectRatio='none'%3e%3cpath%20d='M0%2023v23h3c6%200%208%201%208%203-1%202-1%202%201%200l3-2%203-4%201-4v-4l3-3%202-2c1-2%201-2%202-1h1v3c-1%202-1%202%205%202l9-2a766%20766%200%200171-5A29085%2029085%200%2001304%209c-2%200-3%200-2-2%200-1-1-1-2%201-3%203-3%201%200-4l1-4-2%202c-1%205-5%208-11%208-14%202-13%202-12%200%200-1%200-2-2-2-3%201-4%200-1-3l1-3-4%204c-3%205-3%206-7%206-4%201-6-2-4-3s5-7%205-8L164%200%2065%201l-5%2014-4%2015-2-6c0-2%200-2%201%200s1%202%201-1v-2c1%201%201%201%201-2v-3l1%201v-3l1-6c2-8%202-8-3-8-4%200-4%200-5%204-2%208-3%2010-2%205l1-7-1-2-2%204-2%207-1%203v-3c0-2%200-2-1%200h-1c0-1%200-2-1-1l-1-1%201-1V6l1-1c1%201%202-1%201-3-1-3-2-2-3%204-2%205-2%206%200%208%201%201%201%201-1%203v4c-1-1-2%201-2%204%200%205%200%205%203%205h2l-3%201c-3%200-4%200-3-3%200-3%200-3-1%200-1%204-3%205-3%203%200-1-1-1-1%201-2%201-2%201-1-2l2-9%205-20-2-1-2%202-1%202-1-1-1-1-2%201%201%201c2%200%203%201%202%204l-2%202-1%201%201%201c3%200%203%202%201%207-3%207-5%209-5%205%200-2%200-2-1%200-1%201-1%201-1-1s-2-4-2-1l-1%202-1%202h2c2-1%203%200%201%203-1%202-5-2-5-4l-1-2v1l-1%201c-2-1-2%200-2%201%200%202%200%202%201%201h2a43%2043%200%2001-2%2017l-1%202-1-4v-3l-1%204-2%202c-4%200-5-1-4-5l7-37%201-3H0v23M316%203c-6%206-7%208-5%2011s5%2010%205%2013%201%205%204%206%203%206%200%206c-2%200-2%200-2%206a1632%201632%200%20016%2036l2%208%202%204c0-2%200-2%202-1l2%202%201%201c1-1%203%201%202%202l1%201h1l2%206c5%2010%205%2029%200%2032l-1-1v-2l-2%202-2%201%202-5%202-7-1-3-2-10-3-7v7c0%205%201%206%201%204%201-3%201-3%201%201v8c1%205%200%207-3%206v3c1%201%201%201-2%201-1%200-2%200-1-1l1-2c0-2%200-2-1-1%200%201-1%202-2%201v-1l1-2h-1l-1-2c0-3-2-2-2%201v5l-1%201-6%202c-5%202-3%203%203%201%204-2%205-2%205-1l2%203v1c-2%200-2%200%200%202s4%202%204-1c0-2%201-3%202-3v5c2%200%203%201%206%2012l4%2012c1-2%201-2%203%201%207%209%209%2018%207%2026l-1%207-3-12c-2-11-4-17-4-12l1%205%203%2017%203%2011%201-4%201-3%202-3%201-1%201-1-1-1v-2l1-2%201-1c1%201%201%201%200%200l1-3%201%201c-1%202%200%202%202%200%202-1%202%200%201%205-1%202-1%202-1%200v-3l-2%202-2%204v1l2%2010-1%2013c-1%201%200%202%202%205l5%203h1v-2l1-3%202%204c1%206%202%207%204%206l3-1c3%200%205%200%203-1h-3v-3l-1-7-2-4v5l1%205v2c0%201-5-5-6-9h-1c0%202-2%202-2-1h1c2%201%201-2-1-3-3-3-2-24%201-22a1664%201664%200%20017%202c-4-3-3%200%201%204%206%206%209%2011%2010%2018%201%206%201%206-3%204-2-1-2-1-2%202s0%203%201%201c1-3%201-3%202%201l-1%202-1%202%201%201h1c1%201%200%201-1%201l1%201%202%202-2%201c-2%201-2%201%201%201s1%202-3%202c-1%200-2%200-1%201v1l1%201%201%201v2c-2%202-1%203%201%202h1c0%201%206%202%207%201l-3-1c-2%200-3%200-2-1%200-2%207-1%207%201l-1%201v1h6l-1%202v8h1c1-1%201%200%201%203l-1%203-1%201v5l1%201-1%201c-2-1-1%201%201%202%201%201%201%201%201-1a891%20891%200%20001-76v-5l-6-1c-11-2-19-5-21-7-3-3-4-12-2-13%202-2%202-5%201-4v-4c1-1%202-2%204-1l5-1c3-1%206-1%205%201v1l2-1%201-1c2%200%201%205-1%205v-1h-1c-2%200-2%201-1%202v4l2-1c2-1%202-2%201-2-1-1%200-1%201-1l3-1%201-1c1%200-2%206-5%206l-2%202c1%200%200%202-2%202-1%202-2%202-2%201h-1c-3%204-7%203-8-2l-2-2v3c3%204%2010%209%208%206%200-3%204-3%2011-1%209%202%209%202%209%200l-1-2v-1l-1-3-3-1c0%202-2%203-5%202l2-3c3-2%204-2%204-1%202%204%204%202%204-2%200-5-1-6-3-5l-1-1%202-1c2%200%203-6%203-20l-1-17v-5h-22l11-1c10-1%2011-1%2011-3s0-2-7-2a727%20727%200%2001-41%201l1-2v-1c0-1%201-3%2016-13%2013-11%2016-13%2017-16%200-2%200-2-5%202l-6%204-6%203c-3%202-7%203-10%203-6%201-9%202-7%203h2l4-1c6%200%205%203-5%2010-3%202-4%204-4%205l-1%202-2%205c1%201%200%203-1%204v-3l1-7%201-3c-1-3%201-8%204-10v-1l-4%203c-3%205-4%205-4%201l-4-7-3-6c0-2-1-2-2-2l-1-1%203-1a734%20734%200%200127-6l8-2a560%20560%200%2000-5%203l5%201a325%20325%200%200118-3l6-1%205-1-5-1h-6l4-1c6%200%207-1%207-4%200-2%200-3-2-3l1-2c2-1%203-4%201-2l-1-1c1-1%201-1-1-1l-7%202-3%201v1l-2%202a1888%201888%200%2000-60%209c1-1%200-2-1-3l-1-2v-2c-2-2-3-9-1-9l3%204%201%202c0-2%200-2%2026-6l43-7c5%200%205%201%204-31V0h-82l-2%203m-15%2019l2%201%201%201-3%203a633%20633%200%2000-19%200l2-1h-2c-2%200-3%201-4%204-2%205-2%205-1%2018l3%2013v-1l1-3h5c3%200%204-1%204-3l-1-2-1-1c0-2%203%200%203%203%201%202%202%202%204%202l8-2-2-2a1161%201161%200%20002-8c1%201%201%201%201-1l-1-8-1-6%201-1%202-2%201-1c2-1%201-4-2-4l-3%201m-65%206c-5%200-7%201-9%203-3%203-3%202%201%2029%203%2019%203%2020%206%2023%201%201%203%202%205%201a374%20374%200%200126-6h1l2-3c2-5%201-26-1-28l2%2021c0%202%200%202-1%201v1c0%202%200%202-1%201h-1v1l-1%202v1h-1l-3%202v1l-3%201c-2%200-1-2%202-3v-2h-1c-3%202-3%201-1-1%201-2%202-2%202-1l1%201%201-2h-1l-1-1%201-1h1c0%202%204-2%204-4%201-11-2-25-6-28l-1-1%201-1%201-1v-3h-5v-1l-11-1c-11%201-11%200%201-1l8-1h-6l-12%201m-9%208a131%20131%200%20006%2040h-1l2%202h2c-2-2%200-1%203%201%202%203%203%203%208%202l5-1h-5l-5-1h9l-4-1h-5c-2%200-2%200-1-1h-1c-2%200-2%200-1-1%202-1%200-2-2-1v-1l-1-1c-3%202-7-14-8-36%200-3-1-3-1-1m-52%204A3171%203171%200%200155%2055c-1%200-1%207%201%209l1%207c0%202%200%203%201%202v3l1%202c1-1%201%200%201%202v3c1-1%201%200%201%202v2c1-1%201-1%201%201a558%20558%200%200013%2077c-1%202%200%203%201%207l2%203c1-2%201-1%204%2012l3%2010v1c0%202%202%205%203%205v-1c-2-2%200-2%203-1v2c-3%200%202%202%206%202l-1-1c-6-2-5-3%2020-9a220%20220%200%200023-7%201439%201439%200%200072-19c10-2%2011-2%2011-8%200-3-1-5-2-3-1%201-1%200-1-1l-1-5h1l1%203v-3l-1-11c0-8%200-7%203%207%202%2010%202%204%200-7-1-6-2-12-1-13%200-2%200-3-2-4l-1-7v-3c-1%203-2-4-1-9%200-2%200-3-1-2-1%202-3-13-2-15l-1-2-2-8a305%20305%200%2000-9-40l-4-1-23%203M31%2051c-3%204-4%207-2%2011v-3l1-4%201%203%204%2017a74%2074%200%20013%2021c1-2%201-2%201%201l1%207v2c1-3%201-2%201%202v3c0-3%201-1%204%2011%203%2013%204%2021%202%2015-1-2-1-2-1%200l1%206c2%203%202%204%202%202v-2l1%202%201%206v2c1-2%201-2%201%202v5c0%203%200%204%201%202s1-2%201%202v2l1-2v-16l2-1h1l2-1c1%200%202%200%201-1l-1-2-1%201v-2c0-4%200-4-1-2l-1%201c0-1%200-2-1-1l-1-1v-2l1-1-3-1h-2c1-2%200-5-1-4-1%202-2%200-2-5v-4c1%201%201%200%201-1a161%20161%200%20010-5c-4-4-5-6-6-11l1-6v-6l-1-1h-3l-1-2h3v-2l-1-3%201-4v-2l1%202-1-16-5-13c-1%200%200%206%202%2010l-1%202-1-3-1-2-1-2-1-2-3-2%201-3%202-3-3%204M12%2064l-5%207%202-1%203-2%201-2c2-2%203%200%205%205%201%207%201%2010-1%205l-2-4v3l6%2035%205%2022c13%2050%2013%2054%2013%2046-1-7%200-12%201-10%202%202%201%200-1-9l-2-7%201%206c0%204%200%206-1%205l-1-2-4-9v-8c1%201%201%200%201-1%200-2%201%200%202%203a295%20295%200%2001-4-18c2%205%202%2011%201%2011v3h-2v-7l-3-4c-2-6-3-13-2-14l-1-1v-2l-1-2-1-9v-1l-2-16-1-6%202%206a885%20885%200%2000-4-26c0-1-3%201-5%204m14-3l2%2010c3%2012%204%2022%203%2023l1%202%201%203a22299%2022299%200%20005%2012l1-1c-2-1-2-1-4-11a684%20684%200%2000-9-38m267%200c-10%202-12%203-8%206%204%202%209%204%209%202h4l3-1%202-2c3-1%204%200%203%202%200%201%201%202%203%202%204%200%205-1%203-2v-3c1-3%200-6-2-4v1c2%200%201%203-1%203-2%201-2%200-2-2%201-3-1-3-14-2M6%2094l-5%203c-1-1-1%201-1%209s0%2010%201%209h2l1-2%202-2c2%200%205%206%203%207-1%201-1%201-1-1l-1-2%201%208c1%202%201%202%201-1v-3l1%203v4c-2%201-4-1-4-4%200-2%200-2-1-1v2l-2%202c-3%201-3%203%201%202l2%201-2%201v1l1%203c0%201%200%202%201%201s13-1%2014%201c2%202%201-2-1-6l-1-4v7c-1%200-2-2-1-6l-1-4-1-2v-1c2%201%202%200%202-1%200-4-3-12-4-13l-1-2h1v-6c-2-7-3-7-7-3m241%203c-3%201-5%201-4%202l-2%203h-1v-2l-1%202v2h1l-2%201v1l-1%201-1%205c0%204%200%204-1%202v3a317%20317%200%20003%2030l-1-2c-1-1-1%200-1%201%200%202%200%203%201%202l4%203c3%203%203%203%208%202%202-1%205-2%206-1l2-1%202-1%209-3c9-3%2010-4%2010-12v-5l-1%204-2%206v3l-8%203c-10%202-10%202-9%200l-3-1h-3l3-1%207-3%204-1-3%203-4%202c0%202%205%200%207-2%201-2%201-2%202-1%202%203%206-6%207-12%200-8%200-8%201-4l1%205v-5l-1-12-2-11-1-3c0%201-3%200-5-2-5-3-14-4-21-1m52%2020a77%2077%200%2000-7%202c-1%200-2%203-1%205%200%202%201%202%205%202l5-1%203-1c5%201%209-1%209-3l-1-4h-13m-69%207c1%203%200%204-1%204-2%200-2%200-1%201%202%202%204%207%202%207l-1%201%201%201c2%200%204%208%203%2010-2%202-6%201-6-1l-1-1%201%207c1%207%202%208%206%206%203-1%204%200%204%205l1%203%201-2-1-7-1-6v-2l-1%202c-1%201-1%201-1-1a336%20336%200%2000-5-27m9%2012l2%208v2l1%201h1v1c1-1%202%200%203%201%203%202%208%202%208%200h1l1-1-6-1c-2%200-2%200-1-1%202%200%202%200-1-2-3-1-3-1-2-2s0-2-2-2h-1l-1-3-3-5v4M1%20144c0%202%201%203%202%203v1H2l-1%201%202%201%203%201H3c-2%200-3%203-1%205l1%201-1%201c-2-2-1%201%203%209l5%207c0-2%200-2%201-1l1%203h-1v4c1%201%201%201%201-1%200-4%203%203%203%208%200%202%200%202-1%200v18l-6%201-5%202c-2%200-2%201-2%2033l1%2033%204-2c4-4%2013-8%2015-7%202%200%205%203%208%206l6%205%201%201%202%204%202%205H1l-1%2057v57h94l-1-14%201-14%201%202c0%202%205%207%206%206l5%203%205%202%201%201%201%201c3%200-11-13-17-18-5-3-6-4-5-6%200-1%202-1%204%201%201%201%203%202%203%200h1v-1c-1-2%200-2%2014-2%2013%200%2015%200%2017%202%201%201%201%201%201-1-1-1-1-2%206-2l8%201h1c1-1%201%200%203%202l2%202h1c0%204%200%205%201%203h1v3h1c1-1%201-1%201%201v1h1v3c2%200%2011-3%2011-5h-1c-2%201-6-4-5-6l-1-1v-2c1-2%203-2%2016-2l13%201%201%201h3l-1%201c-1%200-2%200-1%201l-1%201c-1-1-1%200-1%201h-3c-1-2-2-2-2-1l4%203c3%202%203%202%205%200s3-6%201-6v-1a786%20786%200%200188-1l3%201-5%203-3%202%206-2c3-2%205-3%2010-3%207%200%206%201-7%208l-18%209c-8%205-10%206-10%204h-5l-1%201%202%201c1%200%201%201-1%204l-6%2011a354%20354%200%200062-2c0-3%200-4%201-2s4-1%204-5l2-5%203-5c1-3%202-4%203-3l6%202c6%201%206%202%202%209-2%205-3%206%200%203l2-1-1%203-2%202%202-1%204%201h3c3-2%203-2%205%200%201%201%202%201%203-2s1-4-1-5c-2-2-3-2-3-1%200%202-2%203-2%201l-2-1c-1%201-1%201%200%200l-1-1v-2l1-1%201-1c-1-2%202-4%203-2h1l6%204c2%203%205%205%206%205%201%201-1%202-5%205-4%202-7%205-6%205l23%201%2023-1v-1h-1l-1-1c1-1-21-15-24-15l1%201c1%202%201%202-2%203l-3%201h-2l-4-3-4-3-1-4c0-3%200-3%202-2%203%202%204%200%201-2-3-1-4-4-2-2l1-1-2-2c-1-1%200-1%202-1l3-2%201-1v3c0%202%200%202%201%201%200-2%201-2%201-1h2v-2l-1-2c1-2%2012-2%2012-1h1l7-2c6%200%207%200%2013%204l8%204v16l1-41-1-58-3-3-2-1c1%201%200%202-1%202l-2-3-1-3-1-1v-3l-1%203v7h2v1h1c0%201-3%202-9%202-8%200-12-1-7-2%201%200%201-1-1-3l-2-3-4%202-4%204c1%202%200%202-5%202h-6l8-4c8-5%209-6%208-8-1-1-1-1%201-1h1l1-1c1%201%201%201%201-1l-2-2v2h-3c-2-2-3-2-10%202-6%203-9%204-10%203-2%200-2%200-1%201%202%201-15%2010-18%208h-3l-10%201c-7%200-8%200-7-2v-1l-2%201c1%201-1%202-11%202-8%200-10%200-12-2l-2-2-5%202c-4%202-9%203-10%201v-2l-4%201c-3%203-16%203-15%200h-2c-1%202-3%202-8%202-6%200-7-1-8-4s-1-3-1-1l-1%203v1l-14%201-15-1c0-2%200-3-1-2l-1%202c1%201-1%201-8%201l-9-1h-24c1-1%200-2-1-2l-1%202c1%201%200%201-6%201s-7%200-6-2h-1l-2%202v-2c3-3%204-12%201-12v5l-2%201%201%201%201%201-3%201c-2%200-2%200-1-1v-3h-1l-2%202c-1%202-1%202-2%200-3-2-3-1-2%203l2%203-10%201h-10l5-2%204-3%201-1%203-1%203-2h1c0-2-1-2-2-2-4%201-5%200-3-4%202-7%200-14-5-16l-2-3h-2c-2%200-2%200%200-1%201-1%201-1-3-1-5%200-14%204-12%205v3c-1%204-2%209-1%2012%202%203%203%204%204%203h1v1c-3%200%203%205%207%206h3l-2%202c-2%201-3%201-4-1h-3c-2%200-3-1-2-3l-1-1v-1l-1-1-2-3c-2-5-3-5-2%200%202%206%200%207-2%203l-3-4%203%207%204%207c0%202-13%201-13%200h-1l-3%201c-4%200-4%200-8-8l-11-20c-7-14-7-14-5-16%201-2%201-2%203%201%200%202%201%203%202%203l-3-6-3-9c-1-4-1-4-2-2v-2c0-3%200-4-1-3-1%202-1%202-1%200-1-2-1-3-2-2s-3-5-4-11c0-3%200-3%201-2l1%203%202%202v-7c-1-3-2-5-2-3l-1%202c-1-1-1%200-1%201h-1c-2-3-1%202%202%2012a167%20167%200%200022%2056l6%2011h-4l-4-1-1-3v2l-1%202-1-4v-1h-1c1-2-10-23-11-22l-1-1-2-6-2-6c2%200%201-2-1-5l-2-3-1-2v-4l-2-2v-3l-1-1-2-3-2-1c-1%201-1%201-1-1v-1h-2l1-1%201-1%201-2%201-3c0-2%200-2-2-2-2%201-2%200-7-19l-3-11%202%2011%201%2010-2-5v-4l-1%203c-1%203-1%203-1-1v-5l-1-5c0-3%200-5-1-3%200%202-1%201-2-4-3-10-14-31-14-26H6v-4c-1-2%200-4%203-4l3%202c0%202%200%202%201%201%201-2%201-2%202%201%201%204%201%205%202%202%202-4%200-7-3-7l-8-1c-4%200-5%200-5%202m305%2011l-17%204-4%201%204%2018%205%2017%202-1c2%200%2029-8%2031-10%202-1-5-32-7-33l-14%204m-70%2018c-2%203-3%203-5%203h-2c1%201%201%201-1%201h-2a1047%201047%200%2001-124%2034l-11%203h-5c-5%200-5%200-1%201l4%201h-4l-6-1v-2l-2-1c-2%201-4%200-4-2h-2v-1c2-1%202-3-1-14l-4-11%203%2012%202%2010-2%202-2%202-1-2-1-1%202%206c1%204%201%205-1%203l-1-1%201%203v1l1%201h1c-1%202%204%204%208%204l16-4a3312%203312%200%200186-24%202923%202923%200%200045-13c11-3%2011-3%2013-7l2-4v-2l-2%203m31-1l-1%203c0%202-2%203-2%200l-1%201c-1%201-1%201-1-1-1-2-1-2-1%201l1%203%201%202%203%203c1%201%201%201-1%201-1-1-2%200-2%201l1%201h3c2%201%205-2%204-4h2v-3c0-2%203%201%203%203l1%204c1%201%201%201%201-1v-3l1%203h1c1-1%202-2%201-3-2%200-10-8-10-10l-2-1h-2m58%2019l-3%203h5l-2%201%201%201c3%201%202%203%200%202l-3%201-4%201-2-1%203-1c3-1%203-1%201-1l-4%201-3%203h2c4%200%204%200%205%203l1%203v2l-1%203-1-2v-2l-1-2-1-1v5l-1%203-2-2c0-3-3-7-5-6h-3v1c1%202-1%207-3%206v3l-1%204c-1%201-1%200-1-1l-1-6c-1-2-2-4-1-5l-2-1-1%201%203%206c2%205%202%205-4%205-3%201-4%200-4-1l-4%202c-2%202-4%204-3%205-1-1-2%200-3%201s-1%201-2-4l-2-6v2c1%203-1%207-3%206l-1%202-1-2c-2-12-3-15-6-18l-1-2%203%201%201%201v-1c-1-2-12-3-10-1l2%201c5-3%2011%2016%208%2024-1%204-3%203-3-1%201-1%200-5-1-8l-1-2c1%206%200%2014-1%2015h-1v-2c-1%201-2-5-2-8l-4-7%201%204c2%202%202%203%201%207-1%206-4%207-4%203s-5-14-8-17c-4-3-4-3-2-4h6c-2-2-2-2%200-2h5c2%200%202%200%201-1s-1-1%201-1v-1l-2-2c-1-1-1-1-1%201%200%201-1%202-3%202l-4%201-7%203c-8%203-8%204-3%2010%204%206%207%2014%207%2019s1%205%2010%203l7-2%204-2%2012-5%209-3%207-2a129%20129%200%200034-16l5-2h4l4-1h-7l3-1%204-2-3-1c-2%200-3%200-2-1v-1c-2%200-2%200-1-3s1-3-1-2c-2%200-2%200-1%201v1c-3%200-3-1-2-4%202-1%202-2%200-3-1-1-1-1%201-2%201-1%201-1-1-1-3%200-4%201-6%203m-41%204l-1%202c-1-1-2%200-3%201s-1%201%202%201h6l2%201%202%202%203%201c1-1%201%200%202%201l2%201c1-2%205-2%205%200l2-1%201-2v-1l1-2c0-3-1-4-6-1l-5%201h-6c-1-1%200-1%201-1%202%200%202%200%201-1l-1-2-2-1h-4c-1-1-1-1-2%201m-76%2010l-2%201h-2l-1%201c-2%200-4%203-4%207%200%202%200%202-1%201h-3v-1c1-1%201-1%200%200l-2-1h-1c-1%201%200%205%202%208%201%201%204%200%203-2l1-1c1%200%202%201%201%203v1c1%200%202%201%202%203s0%202-2%201l-2-1c0%203%2010%207%2012%205%201-1%201-1%201%201a1201%201201%200%20002%205l3%202h1l3-2%202-2v-2l1%205v5l2-8%202-4c0-2%200-2-3-1l-3-1-2-2v1l-1%201-4-4c-1-3-7-8-10-7-3%200-4-1-2-4%201-3%208-2%2015%202l5%202-2-2c-4-2-4-3%200-2l2-1v-1c2%200%200-1-3-2-5%200-8-2-8-4l-1-1-1%201m-49%2010c-2%200-3%202-1%202l1%201h-3v-1h-3c-1%202%201%206%202%204l1%201%202%201c3%200%207%204%206%205l2%203c3%204-2%209-6%205-2-1-2-1-1%201%200%201%201%202%203%202%203%200%205%203%204%206-1%202%200%203%203%201l1-6-1-5c-1-6-2-7-3-6l-1-1c1-1%200-2-1-4l-1-3v-1h-1l-2-2c-1-1%200-2%201-3h-2m238%204l-3%204c-2%201-2%201-1%202%203%200%202%201%200%204l-1%202%201%202-1%201c-2%200%200%206%203%209l4%207%201%204v-18c0-18-1-22-3-17m-269%201l-1%204v1c1-2%204%203%203%206h1c1-2%203%200%201%202l1%201h1l2%206c3%203%204%204%208%204%205%200%205%200%204-1s-2-2%200-3v-3l-8-10c-6-8-8-9-12-7m-11%209l-5%203-3%202c-2%200-2%200-1%201l1%202c0%203%200%203%202%203v2c-2%201-1%202%203%203l4%201h-4c-5%200-5%201%200%201l2%201h3l3-2v-1l1-2%201-5c2-2%202-3%201-3v-3c1-4%201-4-3-5l-5%202m204%2011l-27%2011c-2%202-1%204%200%203l1%201%201%203c1%202%202%202%203%201l3-2-1%202-2%201c-2-1-1%202%202%205l2%201%203-1c2%200%202%200%200%201l-2%201c-2-1-1%202%202%205l4%203%2011-5%2026-12c19-8%2019-8%2012-17l-6-5-1%201v-3h-1l-3-5-27%2011M39%20250c2%201%201%202-2%201-3-2-6-1-3%200v3c0%201-1%201-5-2l-4-2%204%203c5%204%2014%2016%2012%2017l1%202h1l4%205%204%205%201%202c1%202%2012%203%2012%201%200-5-10-21-11-19l-3-1c-1-1-1-1%201-1s2-1%200-3v-4l-1-2h-1l-4-2-6-4v1m70%203l-1%201-1%202c-2%202-3%202-3%200l-2%203c-2%204-2%205-1%208l3%203-1-3-1-5%201-2v2c0%204%202%204%202%201l2-5c2-3%203-2%200%202-1%203-1%203%201%207l4%204c7%200%2012-4%2010-8v-3h-1v-1h-1v-1h-1l-1-1h-1c-2%200-2%200-1-1%202-1%202-1-1-2-3-2-4-2-6-1m-84%208c4%202%207%205%207%206%200%202%202%204%204%206l3%205%201%201%203%204%203%203c2%200%201-1-3-8-8-14-16-22-21-22-3%200-3%200%203%205m239%205c-2%202-2%202-1%203v2h1v5c-1%202-2%201-3-1-1-1-1%200-1%202l1%203h-4c-5-1-5-1-6-7%200-6%200-5-4-3s-4%202-1%202l2%203%201%202%201%203v2h-1c0%201%203%203%206%203%205-2%207-2%208-4s1-2%202-1h3v-2l-2-3h2c2%203%208%203%207%200h2l3-2%202-3h-1c-2%202-11%202-11%200h1l1-1-2-2-3-2c-1-1-2-1-3%201m-58%2039c0%202%200%202-3%202l-4%202c-3%205%200%209%206%209h3v-8l-1-8-1%203m-137%206v7h4c5%200%208-4%205-8v-1c3-2-1-6-6-6h-3v8m94%200l1%207%201-3c0-4%202-4%205%200s4%203%202%200-2-3-1-5c4-3%201-7-5-7h-3v8m-33%2019c0%203%200%203-2%203-2-1-6%202-6%205s3%206%206%206h4v-9l-1-8-1%203m-110%207l1%207%201-3c0-2%200-3%202-3l4%203c0%202%202%203%202%203l-1-3c-1-3-2-4%200-4v-7l-5-1h-4v8m136-4c-2%200-3%2015-1%2015l1-2%202-2c3%200%206-3%206-6%200-4-4-6-8-5m114%2036a777%20777%200%2001-43%2024c9-5%2013-6%2013-5%201%201%201%201%202-1l2-2h1c1-2%2014-9%2015-7%201%201%203%200%203-2l7-5c8-5%208-5%206-5l-6%203m-50%202v1h-1c-2%200-2%200-1%201s1%201-1%201l-2%202h-4l-1%202-1%201v1l2%202v1c-1%201-4-2-4-3l-1-1-2%201-1%201h-1l-1%201h-2l-1%201c1%201%201%201%200%200-2%200-3%201-2%203h1c0-2%200-2%201-1v3l1%201v1h2c-1%203%202%202%2012-3%209-5%2016-10%2013-10v-1l-2-2-2-3h-2M97%20386c0%202%200%202-1%201s-1%200-1%205c1%208%201%208%204%208h3l-3-4-3-5c0-2%200-2%208%205%206%205%207%205%203%200-3-2-4-4-3-4l5%204%204%204c2%200%200-1-8-9-7-6-8-7-8-5'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"narrow":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsSAAALEgHS3X78AAAE8klEQVQ4y1VU+U9UVxR+KhWJYhTKYiRUBkRksYLgjhuRWGw0aiKKwtRGw+IolQFhoCCkWNlVBlkaZZFlhn0tDCiy6QgiA1JMrG1NA7Gpf0Njvn73Gk384ebe9955555vOUcJDw9HeXkFTp48CUVRPltLly6FjY0NVq9eDXd3D+zYsQOnTp1GQ0MDpqenodUmyjgrKyssWbIEixYtghIXF4e6unqUlZUhMzMTeXl5KOW5uroaXV1dGHz0CA8ePsTQ0DBqampQWFSElpZWxMbG4fbtYqxcufLzQkymfgwPDzOo5VPiq1eTERERgdDQUPj6+kKlckdTUzPUajWsra2Rn1+AI0eOorm5BQcPhsrKHB0d4ePj8yGh0WhEaWkZIVp/umnx4sUy0MrqC/mckXENxcXF2L9/Pzo6OoigRiIQqLRaLXJycpGamgalqOgmmnl7Q30DvDZskBXY29uTNztW5wd//wCZMCYmFuPj46ioqMDExATevv0HFouFl+hRWFgkqejt7YOi06WisbEJ/aYBhIWFSSFsbW2Z9EsEBW2F53pPSXp4+Cn09w/Azs5OVvWQvBqNjXjx4gVyc/MobDlqSZlSUFAIg8GAzs4uREdHy2oEHx4eHlC5qXh2wqpVqxAYGCTd4OLigqioKJnIYpnG3bv3ELw7mC5wh7e3NxQRJKAI0rOzr0vunJyc4Oy8Bo4OjrAj9I+XlJWV4x4TmEwmzM3NobunB7W1tfDz82MyH4QcCIEi1BWWGB0dozCl0k8igdhFZZ6enlT0CNLS0tDe3o7Xr/+QrhD22kDORTEajUaqLWykGAyNaGtrw9jYY1llSEgI9u7di4SEBOj1eknH4OAgzOanmJ2dxatXr/CYsSUlJdCl6FBVWYXSO6VMegnpGRlQIiLOIoUfnk1O4ubNW/RYPnoIpbu7Gx2dnRgZGZEJ9foSPHliJsQ6FtCOIip740YOjAajfBZqC28qzs7OCAjYIn3Yzg8zMzNM+Cuyf8pGVVU1aug3ATEzMwut7JCsrCyk/5guUU1NTWF0ZJStaEBlZSUy0q9BcXBwwInjJyQnzyef492/7wi9CQ8GHsDUZ5JJxPuhR0OYfDaJhfkFKcgkEV28eBF7goORzM4SMQKhUnjrFoYpSE9fH9o6OmGmafNp0gHCHDOb0ctOGufPs3Mv8ff8PB6TSxFnIZJc0tPU2ipj20hPIwVWSiJOI+/oUSTt3ImUPcHIDD2I815eiKEV0vbtw8+HD3OFIYdKX//2MBIZFx8YiCzGFR4/huxvDiFS5cZ3W5C8exeUcFrkikqFK25ucmlp6CSuq7SEZs0aaNevRyLPP/CbZu1a6NiOsWxN8d/HpaZ3z3I/I+bABc66a9u3I2XTJqQFBOASOyGZEyaJrk/194du82Ykbdwon0VMPBNHsj2juM5xVn7H3ldbf3hW86xErViBy2yxGN6uWbcOcdzj2UbxPF/mnsTkGtevoBMU8ALxPo5dIwo5u2wZ1PxfvXw5znEuil2xtV4GH05jXw6BIL+vodVcRoX+Dhpr69FJo09QsLkpC3rbO2Cm0k+HR5B//QZC9x1A8DZO8GMncCk6Br//9hILf72BYk/buLGSXZTfxdUVZyKjcI/+a+Akec7m/+/9e/z55g2q799HHf0Ww0kdtHUbvH188f35C/iFvX2F81CbmAjL9Az+ByoFkXWUHm8uAAAAAElFTkSuQmCC","aspectRatio":1,"src":"/static/f4485edfdde8a60673160ba454fafa80/502b1/browser.png","srcSet":"/static/f4485edfdde8a60673160ba454fafa80/f2e6d/browser.png 114w,\n/static/f4485edfdde8a60673160ba454fafa80/4ddba/browser.png 229w,\n/static/f4485edfdde8a60673160ba454fafa80/502b1/browser.png 457w,\n/static/f4485edfdde8a60673160ba454fafa80/7ddc2/browser.png 686w,\n/static/f4485edfdde8a60673160ba454fafa80/435bf/browser.png 914w,\n/static/f4485edfdde8a60673160ba454fafa80/6050d/browser.png 1200w","srcWebp":"/static/f4485edfdde8a60673160ba454fafa80/15384/browser.webp","srcSetWebp":"/static/f4485edfdde8a60673160ba454fafa80/31fce/browser.webp 114w,\n/static/f4485edfdde8a60673160ba454fafa80/e3e25/browser.webp 229w,\n/static/f4485edfdde8a60673160ba454fafa80/15384/browser.webp 457w,\n/static/f4485edfdde8a60673160ba454fafa80/0258d/browser.webp 686w,\n/static/f4485edfdde8a60673160ba454fafa80/64ea2/browser.webp 914w,\n/static/f4485edfdde8a60673160ba454fafa80/9000d/browser.webp 1200w","sizes":"(max-width: 457px) 100vw, 457px","tracedSVG":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='400'%20height='400'%20viewBox='0%200%20400%20400'%20preserveAspectRatio='none'%3e%3cpath%20d='M0%2023v23h3c6%200%208%201%208%203-1%202-1%202%201%200l3-2%203-4%201-4v-4l3-3%202-2c1-2%201-2%202-1h1v3c-1%202-1%202%205%202l9-2a766%20766%200%200171-5A29085%2029085%200%2001304%209c-2%200-3%200-2-2%200-1-1-1-2%201-3%203-3%201%200-4l1-4-2%202c-1%205-5%208-11%208-14%202-13%202-12%200%200-1%200-2-2-2-3%201-4%200-1-3l1-3-4%204c-3%205-3%206-7%206-4%201-6-2-4-3s5-7%205-8L164%200%2065%201l-5%2014-4%2015-2-6c0-2%200-2%201%200s1%202%201-1v-2c1%201%201%201%201-2v-3l1%201v-3l1-6c2-8%202-8-3-8-4%200-4%200-5%204-2%208-3%2010-2%205l1-7-1-2-2%204-2%207-1%203v-3c0-2%200-2-1%200h-1c0-1%200-2-1-1l-1-1%201-1V6l1-1c1%201%202-1%201-3-1-3-2-2-3%204-2%205-2%206%200%208%201%201%201%201-1%203v4c-1-1-2%201-2%204%200%205%200%205%203%205h2l-3%201c-3%200-4%200-3-3%200-3%200-3-1%200-1%204-3%205-3%203%200-1-1-1-1%201-2%201-2%201-1-2l2-9%205-20-2-1-2%202-1%202-1-1-1-1-2%201%201%201c2%200%203%201%202%204l-2%202-1%201%201%201c3%200%203%202%201%207-3%207-5%209-5%205%200-2%200-2-1%200-1%201-1%201-1-1s-2-4-2-1l-1%202-1%202h2c2-1%203%200%201%203-1%202-5-2-5-4l-1-2v1l-1%201c-2-1-2%200-2%201%200%202%200%202%201%201h2a43%2043%200%2001-2%2017l-1%202-1-4v-3l-1%204-2%202c-4%200-5-1-4-5l7-37%201-3H0v23M316%203c-6%206-7%208-5%2011s5%2010%205%2013%201%205%204%206%203%206%200%206c-2%200-2%200-2%206a1632%201632%200%20016%2036l2%208%202%204c0-2%200-2%202-1l2%202%201%201c1-1%203%201%202%202l1%201h1l2%206c5%2010%205%2029%200%2032l-1-1v-2l-2%202-2%201%202-5%202-7-1-3-2-10-3-7v7c0%205%201%206%201%204%201-3%201-3%201%201v8c1%205%200%207-3%206v3c1%201%201%201-2%201-1%200-2%200-1-1l1-2c0-2%200-2-1-1%200%201-1%202-2%201v-1l1-2h-1l-1-2c0-3-2-2-2%201v5l-1%201-6%202c-5%202-3%203%203%201%204-2%205-2%205-1l2%203v1c-2%200-2%200%200%202s4%202%204-1c0-2%201-3%202-3v5c2%200%203%201%206%2012l4%2012c1-2%201-2%203%201%207%209%209%2018%207%2026l-1%207-3-12c-2-11-4-17-4-12l1%205%203%2017%203%2011%201-4%201-3%202-3%201-1%201-1-1-1v-2l1-2%201-1c1%201%201%201%200%200l1-3%201%201c-1%202%200%202%202%200%202-1%202%200%201%205-1%202-1%202-1%200v-3l-2%202-2%204v1l2%2010-1%2013c-1%201%200%202%202%205l5%203h1v-2l1-3%202%204c1%206%202%207%204%206l3-1c3%200%205%200%203-1h-3v-3l-1-7-2-4v5l1%205v2c0%201-5-5-6-9h-1c0%202-2%202-2-1h1c2%201%201-2-1-3-3-3-2-24%201-22a1664%201664%200%20017%202c-4-3-3%200%201%204%206%206%209%2011%2010%2018%201%206%201%206-3%204-2-1-2-1-2%202s0%203%201%201c1-3%201-3%202%201l-1%202-1%202%201%201h1c1%201%200%201-1%201l1%201%202%202-2%201c-2%201-2%201%201%201s1%202-3%202c-1%200-2%200-1%201v1l1%201%201%201v2c-2%202-1%203%201%202h1c0%201%206%202%207%201l-3-1c-2%200-3%200-2-1%200-2%207-1%207%201l-1%201v1h6l-1%202v8h1c1-1%201%200%201%203l-1%203-1%201v5l1%201-1%201c-2-1-1%201%201%202%201%201%201%201%201-1a891%20891%200%20001-76v-5l-6-1c-11-2-19-5-21-7-3-3-4-12-2-13%202-2%202-5%201-4v-4c1-1%202-2%204-1l5-1c3-1%206-1%205%201v1l2-1%201-1c2%200%201%205-1%205v-1h-1c-2%200-2%201-1%202v4l2-1c2-1%202-2%201-2-1-1%200-1%201-1l3-1%201-1c1%200-2%206-5%206l-2%202c1%200%200%202-2%202-1%202-2%202-2%201h-1c-3%204-7%203-8-2l-2-2v3c3%204%2010%209%208%206%200-3%204-3%2011-1%209%202%209%202%209%200l-1-2v-1l-1-3-3-1c0%202-2%203-5%202l2-3c3-2%204-2%204-1%202%204%204%202%204-2%200-5-1-6-3-5l-1-1%202-1c2%200%203-6%203-20l-1-17v-5h-22l11-1c10-1%2011-1%2011-3s0-2-7-2a727%20727%200%2001-41%201l1-2v-1c0-1%201-3%2016-13%2013-11%2016-13%2017-16%200-2%200-2-5%202l-6%204-6%203c-3%202-7%203-10%203-6%201-9%202-7%203h2l4-1c6%200%205%203-5%2010-3%202-4%204-4%205l-1%202-2%205c1%201%200%203-1%204v-3l1-7%201-3c-1-3%201-8%204-10v-1l-4%203c-3%205-4%205-4%201l-4-7-3-6c0-2-1-2-2-2l-1-1%203-1a734%20734%200%200127-6l8-2a560%20560%200%2000-5%203l5%201a325%20325%200%200118-3l6-1%205-1-5-1h-6l4-1c6%200%207-1%207-4%200-2%200-3-2-3l1-2c2-1%203-4%201-2l-1-1c1-1%201-1-1-1l-7%202-3%201v1l-2%202a1888%201888%200%2000-60%209c1-1%200-2-1-3l-1-2v-2c-2-2-3-9-1-9l3%204%201%202c0-2%200-2%2026-6l43-7c5%200%205%201%204-31V0h-82l-2%203m-15%2019l2%201%201%201-3%203a633%20633%200%2000-19%200l2-1h-2c-2%200-3%201-4%204-2%205-2%205-1%2018l3%2013v-1l1-3h5c3%200%204-1%204-3l-1-2-1-1c0-2%203%200%203%203%201%202%202%202%204%202l8-2-2-2a1161%201161%200%20002-8c1%201%201%201%201-1l-1-8-1-6%201-1%202-2%201-1c2-1%201-4-2-4l-3%201m-65%206c-5%200-7%201-9%203-3%203-3%202%201%2029%203%2019%203%2020%206%2023%201%201%203%202%205%201a374%20374%200%200126-6h1l2-3c2-5%201-26-1-28l2%2021c0%202%200%202-1%201v1c0%202%200%202-1%201h-1v1l-1%202v1h-1l-3%202v1l-3%201c-2%200-1-2%202-3v-2h-1c-3%202-3%201-1-1%201-2%202-2%202-1l1%201%201-2h-1l-1-1%201-1h1c0%202%204-2%204-4%201-11-2-25-6-28l-1-1%201-1%201-1v-3h-5v-1l-11-1c-11%201-11%200%201-1l8-1h-6l-12%201m-9%208a131%20131%200%20006%2040h-1l2%202h2c-2-2%200-1%203%201%202%203%203%203%208%202l5-1h-5l-5-1h9l-4-1h-5c-2%200-2%200-1-1h-1c-2%200-2%200-1-1%202-1%200-2-2-1v-1l-1-1c-3%202-7-14-8-36%200-3-1-3-1-1m-52%204A3171%203171%200%200155%2055c-1%200-1%207%201%209l1%207c0%202%200%203%201%202v3l1%202c1-1%201%200%201%202v3c1-1%201%200%201%202v2c1-1%201-1%201%201a558%20558%200%200013%2077c-1%202%200%203%201%207l2%203c1-2%201-1%204%2012l3%2010v1c0%202%202%205%203%205v-1c-2-2%200-2%203-1v2c-3%200%202%202%206%202l-1-1c-6-2-5-3%2020-9a220%20220%200%200023-7%201439%201439%200%200072-19c10-2%2011-2%2011-8%200-3-1-5-2-3-1%201-1%200-1-1l-1-5h1l1%203v-3l-1-11c0-8%200-7%203%207%202%2010%202%204%200-7-1-6-2-12-1-13%200-2%200-3-2-4l-1-7v-3c-1%203-2-4-1-9%200-2%200-3-1-2-1%202-3-13-2-15l-1-2-2-8a305%20305%200%2000-9-40l-4-1-23%203M31%2051c-3%204-4%207-2%2011v-3l1-4%201%203%204%2017a74%2074%200%20013%2021c1-2%201-2%201%201l1%207v2c1-3%201-2%201%202v3c0-3%201-1%204%2011%203%2013%204%2021%202%2015-1-2-1-2-1%200l1%206c2%203%202%204%202%202v-2l1%202%201%206v2c1-2%201-2%201%202v5c0%203%200%204%201%202s1-2%201%202v2l1-2v-16l2-1h1l2-1c1%200%202%200%201-1l-1-2-1%201v-2c0-4%200-4-1-2l-1%201c0-1%200-2-1-1l-1-1v-2l1-1-3-1h-2c1-2%200-5-1-4-1%202-2%200-2-5v-4c1%201%201%200%201-1a161%20161%200%20010-5c-4-4-5-6-6-11l1-6v-6l-1-1h-3l-1-2h3v-2l-1-3%201-4v-2l1%202-1-16-5-13c-1%200%200%206%202%2010l-1%202-1-3-1-2-1-2-1-2-3-2%201-3%202-3-3%204M12%2064l-5%207%202-1%203-2%201-2c2-2%203%200%205%205%201%207%201%2010-1%205l-2-4v3l6%2035%205%2022c13%2050%2013%2054%2013%2046-1-7%200-12%201-10%202%202%201%200-1-9l-2-7%201%206c0%204%200%206-1%205l-1-2-4-9v-8c1%201%201%200%201-1%200-2%201%200%202%203a295%20295%200%2001-4-18c2%205%202%2011%201%2011v3h-2v-7l-3-4c-2-6-3-13-2-14l-1-1v-2l-1-2-1-9v-1l-2-16-1-6%202%206a885%20885%200%2000-4-26c0-1-3%201-5%204m14-3l2%2010c3%2012%204%2022%203%2023l1%202%201%203a22299%2022299%200%20005%2012l1-1c-2-1-2-1-4-11a684%20684%200%2000-9-38m267%200c-10%202-12%203-8%206%204%202%209%204%209%202h4l3-1%202-2c3-1%204%200%203%202%200%201%201%202%203%202%204%200%205-1%203-2v-3c1-3%200-6-2-4v1c2%200%201%203-1%203-2%201-2%200-2-2%201-3-1-3-14-2M6%2094l-5%203c-1-1-1%201-1%209s0%2010%201%209h2l1-2%202-2c2%200%205%206%203%207-1%201-1%201-1-1l-1-2%201%208c1%202%201%202%201-1v-3l1%203v4c-2%201-4-1-4-4%200-2%200-2-1-1v2l-2%202c-3%201-3%203%201%202l2%201-2%201v1l1%203c0%201%200%202%201%201s13-1%2014%201c2%202%201-2-1-6l-1-4v7c-1%200-2-2-1-6l-1-4-1-2v-1c2%201%202%200%202-1%200-4-3-12-4-13l-1-2h1v-6c-2-7-3-7-7-3m241%203c-3%201-5%201-4%202l-2%203h-1v-2l-1%202v2h1l-2%201v1l-1%201-1%205c0%204%200%204-1%202v3a317%20317%200%20003%2030l-1-2c-1-1-1%200-1%201%200%202%200%203%201%202l4%203c3%203%203%203%208%202%202-1%205-2%206-1l2-1%202-1%209-3c9-3%2010-4%2010-12v-5l-1%204-2%206v3l-8%203c-10%202-10%202-9%200l-3-1h-3l3-1%207-3%204-1-3%203-4%202c0%202%205%200%207-2%201-2%201-2%202-1%202%203%206-6%207-12%200-8%200-8%201-4l1%205v-5l-1-12-2-11-1-3c0%201-3%200-5-2-5-3-14-4-21-1m52%2020a77%2077%200%2000-7%202c-1%200-2%203-1%205%200%202%201%202%205%202l5-1%203-1c5%201%209-1%209-3l-1-4h-13m-69%207c1%203%200%204-1%204-2%200-2%200-1%201%202%202%204%207%202%207l-1%201%201%201c2%200%204%208%203%2010-2%202-6%201-6-1l-1-1%201%207c1%207%202%208%206%206%203-1%204%200%204%205l1%203%201-2-1-7-1-6v-2l-1%202c-1%201-1%201-1-1a336%20336%200%2000-5-27m9%2012l2%208v2l1%201h1v1c1-1%202%200%203%201%203%202%208%202%208%200h1l1-1-6-1c-2%200-2%200-1-1%202%200%202%200-1-2-3-1-3-1-2-2s0-2-2-2h-1l-1-3-3-5v4M1%20144c0%202%201%203%202%203v1H2l-1%201%202%201%203%201H3c-2%200-3%203-1%205l1%201-1%201c-2-2-1%201%203%209l5%207c0-2%200-2%201-1l1%203h-1v4c1%201%201%201%201-1%200-4%203%203%203%208%200%202%200%202-1%200v18l-6%201-5%202c-2%200-2%201-2%2033l1%2033%204-2c4-4%2013-8%2015-7%202%200%205%203%208%206l6%205%201%201%202%204%202%205H1l-1%2057v57h94l-1-14%201-14%201%202c0%202%205%207%206%206l5%203%205%202%201%201%201%201c3%200-11-13-17-18-5-3-6-4-5-6%200-1%202-1%204%201%201%201%203%202%203%200h1v-1c-1-2%200-2%2014-2%2013%200%2015%200%2017%202%201%201%201%201%201-1-1-1-1-2%206-2l8%201h1c1-1%201%200%203%202l2%202h1c0%204%200%205%201%203h1v3h1c1-1%201-1%201%201v1h1v3c2%200%2011-3%2011-5h-1c-2%201-6-4-5-6l-1-1v-2c1-2%203-2%2016-2l13%201%201%201h3l-1%201c-1%200-2%200-1%201l-1%201c-1-1-1%200-1%201h-3c-1-2-2-2-2-1l4%203c3%202%203%202%205%200s3-6%201-6v-1a786%20786%200%200188-1l3%201-5%203-3%202%206-2c3-2%205-3%2010-3%207%200%206%201-7%208l-18%209c-8%205-10%206-10%204h-5l-1%201%202%201c1%200%201%201-1%204l-6%2011a354%20354%200%200062-2c0-3%200-4%201-2s4-1%204-5l2-5%203-5c1-3%202-4%203-3l6%202c6%201%206%202%202%209-2%205-3%206%200%203l2-1-1%203-2%202%202-1%204%201h3c3-2%203-2%205%200%201%201%202%201%203-2s1-4-1-5c-2-2-3-2-3-1%200%202-2%203-2%201l-2-1c-1%201-1%201%200%200l-1-1v-2l1-1%201-1c-1-2%202-4%203-2h1l6%204c2%203%205%205%206%205%201%201-1%202-5%205-4%202-7%205-6%205l23%201%2023-1v-1h-1l-1-1c1-1-21-15-24-15l1%201c1%202%201%202-2%203l-3%201h-2l-4-3-4-3-1-4c0-3%200-3%202-2%203%202%204%200%201-2-3-1-4-4-2-2l1-1-2-2c-1-1%200-1%202-1l3-2%201-1v3c0%202%200%202%201%201%200-2%201-2%201-1h2v-2l-1-2c1-2%2012-2%2012-1h1l7-2c6%200%207%200%2013%204l8%204v16l1-41-1-58-3-3-2-1c1%201%200%202-1%202l-2-3-1-3-1-1v-3l-1%203v7h2v1h1c0%201-3%202-9%202-8%200-12-1-7-2%201%200%201-1-1-3l-2-3-4%202-4%204c1%202%200%202-5%202h-6l8-4c8-5%209-6%208-8-1-1-1-1%201-1h1l1-1c1%201%201%201%201-1l-2-2v2h-3c-2-2-3-2-10%202-6%203-9%204-10%203-2%200-2%200-1%201%202%201-15%2010-18%208h-3l-10%201c-7%200-8%200-7-2v-1l-2%201c1%201-1%202-11%202-8%200-10%200-12-2l-2-2-5%202c-4%202-9%203-10%201v-2l-4%201c-3%203-16%203-15%200h-2c-1%202-3%202-8%202-6%200-7-1-8-4s-1-3-1-1l-1%203v1l-14%201-15-1c0-2%200-3-1-2l-1%202c1%201-1%201-8%201l-9-1h-24c1-1%200-2-1-2l-1%202c1%201%200%201-6%201s-7%200-6-2h-1l-2%202v-2c3-3%204-12%201-12v5l-2%201%201%201%201%201-3%201c-2%200-2%200-1-1v-3h-1l-2%202c-1%202-1%202-2%200-3-2-3-1-2%203l2%203-10%201h-10l5-2%204-3%201-1%203-1%203-2h1c0-2-1-2-2-2-4%201-5%200-3-4%202-7%200-14-5-16l-2-3h-2c-2%200-2%200%200-1%201-1%201-1-3-1-5%200-14%204-12%205v3c-1%204-2%209-1%2012%202%203%203%204%204%203h1v1c-3%200%203%205%207%206h3l-2%202c-2%201-3%201-4-1h-3c-2%200-3-1-2-3l-1-1v-1l-1-1-2-3c-2-5-3-5-2%200%202%206%200%207-2%203l-3-4%203%207%204%207c0%202-13%201-13%200h-1l-3%201c-4%200-4%200-8-8l-11-20c-7-14-7-14-5-16%201-2%201-2%203%201%200%202%201%203%202%203l-3-6-3-9c-1-4-1-4-2-2v-2c0-3%200-4-1-3-1%202-1%202-1%200-1-2-1-3-2-2s-3-5-4-11c0-3%200-3%201-2l1%203%202%202v-7c-1-3-2-5-2-3l-1%202c-1-1-1%200-1%201h-1c-2-3-1%202%202%2012a167%20167%200%200022%2056l6%2011h-4l-4-1-1-3v2l-1%202-1-4v-1h-1c1-2-10-23-11-22l-1-1-2-6-2-6c2%200%201-2-1-5l-2-3-1-2v-4l-2-2v-3l-1-1-2-3-2-1c-1%201-1%201-1-1v-1h-2l1-1%201-1%201-2%201-3c0-2%200-2-2-2-2%201-2%200-7-19l-3-11%202%2011%201%2010-2-5v-4l-1%203c-1%203-1%203-1-1v-5l-1-5c0-3%200-5-1-3%200%202-1%201-2-4-3-10-14-31-14-26H6v-4c-1-2%200-4%203-4l3%202c0%202%200%202%201%201%201-2%201-2%202%201%201%204%201%205%202%202%202-4%200-7-3-7l-8-1c-4%200-5%200-5%202m305%2011l-17%204-4%201%204%2018%205%2017%202-1c2%200%2029-8%2031-10%202-1-5-32-7-33l-14%204m-70%2018c-2%203-3%203-5%203h-2c1%201%201%201-1%201h-2a1047%201047%200%2001-124%2034l-11%203h-5c-5%200-5%200-1%201l4%201h-4l-6-1v-2l-2-1c-2%201-4%200-4-2h-2v-1c2-1%202-3-1-14l-4-11%203%2012%202%2010-2%202-2%202-1-2-1-1%202%206c1%204%201%205-1%203l-1-1%201%203v1l1%201h1c-1%202%204%204%208%204l16-4a3312%203312%200%200186-24%202923%202923%200%200045-13c11-3%2011-3%2013-7l2-4v-2l-2%203m31-1l-1%203c0%202-2%203-2%200l-1%201c-1%201-1%201-1-1-1-2-1-2-1%201l1%203%201%202%203%203c1%201%201%201-1%201-1-1-2%200-2%201l1%201h3c2%201%205-2%204-4h2v-3c0-2%203%201%203%203l1%204c1%201%201%201%201-1v-3l1%203h1c1-1%202-2%201-3-2%200-10-8-10-10l-2-1h-2m58%2019l-3%203h5l-2%201%201%201c3%201%202%203%200%202l-3%201-4%201-2-1%203-1c3-1%203-1%201-1l-4%201-3%203h2c4%200%204%200%205%203l1%203v2l-1%203-1-2v-2l-1-2-1-1v5l-1%203-2-2c0-3-3-7-5-6h-3v1c1%202-1%207-3%206v3l-1%204c-1%201-1%200-1-1l-1-6c-1-2-2-4-1-5l-2-1-1%201%203%206c2%205%202%205-4%205-3%201-4%200-4-1l-4%202c-2%202-4%204-3%205-1-1-2%200-3%201s-1%201-2-4l-2-6v2c1%203-1%207-3%206l-1%202-1-2c-2-12-3-15-6-18l-1-2%203%201%201%201v-1c-1-2-12-3-10-1l2%201c5-3%2011%2016%208%2024-1%204-3%203-3-1%201-1%200-5-1-8l-1-2c1%206%200%2014-1%2015h-1v-2c-1%201-2-5-2-8l-4-7%201%204c2%202%202%203%201%207-1%206-4%207-4%203s-5-14-8-17c-4-3-4-3-2-4h6c-2-2-2-2%200-2h5c2%200%202%200%201-1s-1-1%201-1v-1l-2-2c-1-1-1-1-1%201%200%201-1%202-3%202l-4%201-7%203c-8%203-8%204-3%2010%204%206%207%2014%207%2019s1%205%2010%203l7-2%204-2%2012-5%209-3%207-2a129%20129%200%200034-16l5-2h4l4-1h-7l3-1%204-2-3-1c-2%200-3%200-2-1v-1c-2%200-2%200-1-3s1-3-1-2c-2%200-2%200-1%201v1c-3%200-3-1-2-4%202-1%202-2%200-3-1-1-1-1%201-2%201-1%201-1-1-1-3%200-4%201-6%203m-41%204l-1%202c-1-1-2%200-3%201s-1%201%202%201h6l2%201%202%202%203%201c1-1%201%200%202%201l2%201c1-2%205-2%205%200l2-1%201-2v-1l1-2c0-3-1-4-6-1l-5%201h-6c-1-1%200-1%201-1%202%200%202%200%201-1l-1-2-2-1h-4c-1-1-1-1-2%201m-76%2010l-2%201h-2l-1%201c-2%200-4%203-4%207%200%202%200%202-1%201h-3v-1c1-1%201-1%200%200l-2-1h-1c-1%201%200%205%202%208%201%201%204%200%203-2l1-1c1%200%202%201%201%203v1c1%200%202%201%202%203s0%202-2%201l-2-1c0%203%2010%207%2012%205%201-1%201-1%201%201a1201%201201%200%20002%205l3%202h1l3-2%202-2v-2l1%205v5l2-8%202-4c0-2%200-2-3-1l-3-1-2-2v1l-1%201-4-4c-1-3-7-8-10-7-3%200-4-1-2-4%201-3%208-2%2015%202l5%202-2-2c-4-2-4-3%200-2l2-1v-1c2%200%200-1-3-2-5%200-8-2-8-4l-1-1-1%201m-49%2010c-2%200-3%202-1%202l1%201h-3v-1h-3c-1%202%201%206%202%204l1%201%202%201c3%200%207%204%206%205l2%203c3%204-2%209-6%205-2-1-2-1-1%201%200%201%201%202%203%202%203%200%205%203%204%206-1%202%200%203%203%201l1-6-1-5c-1-6-2-7-3-6l-1-1c1-1%200-2-1-4l-1-3v-1h-1l-2-2c-1-1%200-2%201-3h-2m238%204l-3%204c-2%201-2%201-1%202%203%200%202%201%200%204l-1%202%201%202-1%201c-2%200%200%206%203%209l4%207%201%204v-18c0-18-1-22-3-17m-269%201l-1%204v1c1-2%204%203%203%206h1c1-2%203%200%201%202l1%201h1l2%206c3%203%204%204%208%204%205%200%205%200%204-1s-2-2%200-3v-3l-8-10c-6-8-8-9-12-7m-11%209l-5%203-3%202c-2%200-2%200-1%201l1%202c0%203%200%203%202%203v2c-2%201-1%202%203%203l4%201h-4c-5%200-5%201%200%201l2%201h3l3-2v-1l1-2%201-5c2-2%202-3%201-3v-3c1-4%201-4-3-5l-5%202m204%2011l-27%2011c-2%202-1%204%200%203l1%201%201%203c1%202%202%202%203%201l3-2-1%202-2%201c-2-1-1%202%202%205l2%201%203-1c2%200%202%200%200%201l-2%201c-2-1-1%202%202%205l4%203%2011-5%2026-12c19-8%2019-8%2012-17l-6-5-1%201v-3h-1l-3-5-27%2011M39%20250c2%201%201%202-2%201-3-2-6-1-3%200v3c0%201-1%201-5-2l-4-2%204%203c5%204%2014%2016%2012%2017l1%202h1l4%205%204%205%201%202c1%202%2012%203%2012%201%200-5-10-21-11-19l-3-1c-1-1-1-1%201-1s2-1%200-3v-4l-1-2h-1l-4-2-6-4v1m70%203l-1%201-1%202c-2%202-3%202-3%200l-2%203c-2%204-2%205-1%208l3%203-1-3-1-5%201-2v2c0%204%202%204%202%201l2-5c2-3%203-2%200%202-1%203-1%203%201%207l4%204c7%200%2012-4%2010-8v-3h-1v-1h-1v-1h-1l-1-1h-1c-2%200-2%200-1-1%202-1%202-1-1-2-3-2-4-2-6-1m-84%208c4%202%207%205%207%206%200%202%202%204%204%206l3%205%201%201%203%204%203%203c2%200%201-1-3-8-8-14-16-22-21-22-3%200-3%200%203%205m239%205c-2%202-2%202-1%203v2h1v5c-1%202-2%201-3-1-1-1-1%200-1%202l1%203h-4c-5-1-5-1-6-7%200-6%200-5-4-3s-4%202-1%202l2%203%201%202%201%203v2h-1c0%201%203%203%206%203%205-2%207-2%208-4s1-2%202-1h3v-2l-2-3h2c2%203%208%203%207%200h2l3-2%202-3h-1c-2%202-11%202-11%200h1l1-1-2-2-3-2c-1-1-2-1-3%201m-58%2039c0%202%200%202-3%202l-4%202c-3%205%200%209%206%209h3v-8l-1-8-1%203m-137%206v7h4c5%200%208-4%205-8v-1c3-2-1-6-6-6h-3v8m94%200l1%207%201-3c0-4%202-4%205%200s4%203%202%200-2-3-1-5c4-3%201-7-5-7h-3v8m-33%2019c0%203%200%203-2%203-2-1-6%202-6%205s3%206%206%206h4v-9l-1-8-1%203m-110%207l1%207%201-3c0-2%200-3%202-3l4%203c0%202%202%203%202%203l-1-3c-1-3-2-4%200-4v-7l-5-1h-4v8m136-4c-2%200-3%2015-1%2015l1-2%202-2c3%200%206-3%206-6%200-4-4-6-8-5m114%2036a777%20777%200%2001-43%2024c9-5%2013-6%2013-5%201%201%201%201%202-1l2-2h1c1-2%2014-9%2015-7%201%201%203%200%203-2l7-5c8-5%208-5%206-5l-6%203m-50%202v1h-1c-2%200-2%200-1%201s1%201-1%201l-2%202h-4l-1%202-1%201v1l2%202v1c-1%201-4-2-4-3l-1-1-2%201-1%201h-1l-1%201h-2l-1%201c1%201%201%201%200%200-2%200-3%201-2%203h1c0-2%200-2%201-1v3l1%201v1h2c-1%203%202%202%2012-3%209-5%2016-10%2013-10v-1l-2-2-2-3h-2M97%20386c0%202%200%202-1%201s-1%200-1%205c1%208%201%208%204%208h3l-3-4-3-5c0-2%200-2%208%205%206%205%207%205%203%200-3-2-4-4-3-4l5%204%204%204c2%200%200-1-8-9-7-6-8-7-8-5'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"seo":{"src":"/static/f4485edfdde8a60673160ba454fafa80/6050d/browser.png"}}},"authors":[{"authorsPage":true,"bio":"Hello everybody 👋 !  My name is Luke and I am the creator and owner of the spaceout.pl. Personally, I am a big geek with huge love for Star Wars, Marvel and DC comic books, Funk and 80s music. I take most of my design inspiration from offline experiences like going to art museums, galleries and working with other creative people on various projects. I also work with various Activist and NGO groups as a pro-bono designer and developer.\n","id":"f69d27c7-7f9a-5fbd-b05d-1a324fd10c0a","name":"Luke Celitan","featured":true,"social":[{"url":"https://www.facebook.com/spaceout/"},{"url":"https://twitter.com/spaceout.pl"},{"url":"https://www.instagram.com/spaceout.pl/"},{"url":"https://huggingface.co/MassivDash"},{"url":"https://bsky.app/profile/lukecelitan.bsky.social"}],"slug":"/authors/luke-celitan","avatar":{"small":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAIFAQME/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABvOTVgtERIAH/xAAaEAEBAQEAAwAAAAAAAAAAAAACAQMEABAS/9oACAEBAAEFAmoDjs0/Oq1a9kUzN+j7/8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAwEBPwEf/8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAgEBPwEf/8QAHhAAAgEDBQAAAAAAAAAAAAAAAQIAAxESECAxMlH/2gAIAQEABj8CLHgTGqmBPXSlTANsrmKyXLK0B92f/8QAHhABAAECBwAAAAAAAAAAAAAAAREAIRAgMUFhcdH/2gAIAQEAAT8hUmKFDbjke4JaIOG01Fthsd0YugnJ/9oADAMBAAIAAwAAABDzzzz/xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/EB//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/EB//xAAfEAEBAAEDBQEAAAAAAAAAAAABETEAQWEQICFxgZH/2gAIAQEAAT8QhmFXf0c6oSU1s8jwz0W5QpAeFf1+Gp7aimCmBvvoV0CRyUvZ/9k=","aspectRatio":1,"src":"/static/4f53b0980dc97328dd1294bbc374fd0e/fa1ea/spaceghost.jpg","srcSet":"/static/4f53b0980dc97328dd1294bbc374fd0e/afb2b/spaceghost.jpg 13w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/7c20e/spaceghost.jpg 25w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/fa1ea/spaceghost.jpg 50w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/03612/spaceghost.jpg 75w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/61cdf/spaceghost.jpg 100w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/442ab/spaceghost.jpg 305w","srcWebp":"/static/4f53b0980dc97328dd1294bbc374fd0e/e7b2c/spaceghost.webp","srcSetWebp":"/static/4f53b0980dc97328dd1294bbc374fd0e/58718/spaceghost.webp 13w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/74aad/spaceghost.webp 25w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/e7b2c/spaceghost.webp 50w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/ed320/spaceghost.webp 75w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/66016/spaceghost.webp 100w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/85828/spaceghost.webp 305w","sizes":"(max-width: 50px) 100vw, 50px","tracedSVG":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='400'%20height='400'%20viewBox='0%200%20400%20400'%20preserveAspectRatio='none'%3e%3cpath%20d='M189%2065A519%20519%200%200065%20299c-5%2020-5%2018%203%2015%208-4%2039-10%2057-12%2011-1%2010%200%2010-11%200-29%206-103%2010-121%204-21%2016-36%2033-43%206-2%208-2%2020-2%2018%200%2024%202%2036%2013%2020%2021%2025%2046%2029%20138l2%2026h10a267%20267%200%200168%2014l-6-26A607%20607%200%2000218%2071c-10-10-15-15-18-15-2%200-6%203-11%209m47%20129c-14%208-26%2015-26%2017%200%203%2018%205%2024%202%205-3%209-10%209-18%200-5%200-5-7-1m-82%201l1%205c1%2011%209%2018%2020%2017%207-1%2013-3%2013-5s-32-19-34-17'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"medium":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAIFAQME/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABvOTVgtERIAH/xAAaEAEBAQEAAwAAAAAAAAAAAAACAQMEABAS/9oACAEBAAEFAmoDjs0/Oq1a9kUzN+j7/8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAwEBPwEf/8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAgEBPwEf/8QAHhAAAgEDBQAAAAAAAAAAAAAAAQIAAxESECAxMlH/2gAIAQEABj8CLHgTGqmBPXSlTANsrmKyXLK0B92f/8QAHhABAAECBwAAAAAAAAAAAAAAAREAIRAgMUFhcdH/2gAIAQEAAT8hUmKFDbjke4JaIOG01Fthsd0YugnJ/9oADAMBAAIAAwAAABDzzzz/xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/EB//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/EB//xAAfEAEBAAEDBQEAAAAAAAAAAAABETEAQWEQICFxgZH/2gAIAQEAAT8QhmFXf0c6oSU1s8jwz0W5QpAeFf1+Gp7aimCmBvvoV0CRyUvZ/9k=","aspectRatio":1,"src":"/static/4f53b0980dc97328dd1294bbc374fd0e/61cdf/spaceghost.jpg","srcSet":"/static/4f53b0980dc97328dd1294bbc374fd0e/7c20e/spaceghost.jpg 25w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/fa1ea/spaceghost.jpg 50w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/61cdf/spaceghost.jpg 100w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/59538/spaceghost.jpg 150w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/fd013/spaceghost.jpg 200w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/442ab/spaceghost.jpg 305w","srcWebp":"/static/4f53b0980dc97328dd1294bbc374fd0e/66016/spaceghost.webp","srcSetWebp":"/static/4f53b0980dc97328dd1294bbc374fd0e/74aad/spaceghost.webp 25w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/e7b2c/spaceghost.webp 50w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/66016/spaceghost.webp 100w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/d9b14/spaceghost.webp 150w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/6b183/spaceghost.webp 200w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/85828/spaceghost.webp 305w","sizes":"(max-width: 100px) 100vw, 100px","tracedSVG":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='400'%20height='400'%20viewBox='0%200%20400%20400'%20preserveAspectRatio='none'%3e%3cpath%20d='M189%2065A519%20519%200%200065%20299c-5%2020-5%2018%203%2015%208-4%2039-10%2057-12%2011-1%2010%200%2010-11%200-29%206-103%2010-121%204-21%2016-36%2033-43%206-2%208-2%2020-2%2018%200%2024%202%2036%2013%2020%2021%2025%2046%2029%20138l2%2026h10a267%20267%200%200168%2014l-6-26A607%20607%200%2000218%2071c-10-10-15-15-18-15-2%200-6%203-11%209m47%20129c-14%208-26%2015-26%2017%200%203%2018%205%2024%202%205-3%209-10%209-18%200-5%200-5-7-1m-82%201l1%205c1%2011%209%2018%2020%2017%207-1%2013-3%2013-5s-32-19-34-17'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"large":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAIFAQME/8QAFAEBAAAAAAAAAAAAAAAAAAAAAP/aAAwDAQACEAMQAAABvOTVgtERIAH/xAAaEAEBAQEAAwAAAAAAAAAAAAACAQMEABAS/9oACAEBAAEFAmoDjs0/Oq1a9kUzN+j7/8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAwEBPwEf/8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAgEBPwEf/8QAHhAAAgEDBQAAAAAAAAAAAAAAAQIAAxESECAxMlH/2gAIAQEABj8CLHgTGqmBPXSlTANsrmKyXLK0B92f/8QAHhABAAECBwAAAAAAAAAAAAAAAREAIRAgMUFhcdH/2gAIAQEAAT8hUmKFDbjke4JaIOG01Fthsd0YugnJ/9oADAMBAAIAAwAAABDzzzz/xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAEDAQE/EB//xAAUEQEAAAAAAAAAAAAAAAAAAAAg/9oACAECAQE/EB//xAAfEAEBAAEDBQEAAAAAAAAAAAABETEAQWEQICFxgZH/2gAIAQEAAT8QhmFXf0c6oSU1s8jwz0W5QpAeFf1+Gp7aimCmBvvoV0CRyUvZ/9k=","aspectRatio":1,"src":"/static/4f53b0980dc97328dd1294bbc374fd0e/442ab/spaceghost.jpg","srcSet":"/static/4f53b0980dc97328dd1294bbc374fd0e/a2637/spaceghost.jpg 82w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/15203/spaceghost.jpg 164w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/442ab/spaceghost.jpg 305w","srcWebp":"/static/4f53b0980dc97328dd1294bbc374fd0e/85828/spaceghost.webp","srcSetWebp":"/static/4f53b0980dc97328dd1294bbc374fd0e/2d087/spaceghost.webp 82w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/29d87/spaceghost.webp 164w,\n/static/4f53b0980dc97328dd1294bbc374fd0e/85828/spaceghost.webp 305w","sizes":"(max-width: 305px) 100vw, 305px","tracedSVG":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='400'%20height='400'%20viewBox='0%200%20400%20400'%20preserveAspectRatio='none'%3e%3cpath%20d='M189%2065A519%20519%200%200065%20299c-5%2020-5%2018%203%2015%208-4%2039-10%2057-12%2011-1%2010%200%2010-11%200-29%206-103%2010-121%204-21%2016-36%2033-43%206-2%208-2%2020-2%2018%200%2024%202%2036%2013%2020%2021%2025%2046%2029%20138l2%2026h10a267%20267%200%200168%2014l-6-26A607%20607%200%2000218%2071c-10-10-15-15-18-15-2%200-6%203-11%209m47%20129c-14%208-26%2015-26%2017%200%203%2018%205%2024%202%205-3%209-10%209-18%200-5%200-5-7-1m-82%201l1%205c1%2011%209%2018%2020%2017%207-1%2013-3%2013-5s-32-19-34-17'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"}}}],"basePath":"/","tech":["TS","JS"],"category":"Post","slug":"/how-browsers-read-html-render-and-apply-styles-the-sequence-and-developer-best-practices","id":"61fa597a-8957-56d5-9c77-a33a0581d31b","title":"How Browsers Read HTML, Render, and Apply Styles, The Sequence and Developer Best Practices","appDescription":null,"mailchimp":false,"next":[{"id":"b56bbab0-103a-5aae-8b92-f235683de9d4","slug":"/langchain-langgraph-and-agentic-ai-patterns","secret":false,"title":"LangChain, LangGraph, and Agentic AI Patterns","author":"Luke Celitan","date":"June 30th, 2025","dateForSEO":"2025-06-30T00:00:00.000Z","timeToRead":6,"excerpt":"A guide to LangChain and LangGraph","subscription":true,"body":"var _excluded = [\"components\"];\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n/* @jsxRuntime classic */\n/* @jsx mdx */\n\nvar _frontmatter = {\n  \"title\": \"LangChain, LangGraph, and Agentic AI Patterns\",\n  \"excerpt\": \"A guide to LangChain and LangGraph\",\n  \"date\": \"2025-06-30T00:00:00.000Z\",\n  \"hero\": \"cover.png\",\n  \"author\": \"Luke Celitan\",\n  \"category\": \"Post\",\n  \"tech\": [\"TS\", \"JS\"]\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n    props = _objectWithoutProperties(_ref, _excluded);\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"h2\", {\n    \"id\": \"langchain-langgraph-and-agentic-ai-patterns\"\n  }, \"LangChain, LangGraph, and Agentic AI Patterns\"), mdx(\"h3\", {\n    \"id\": \"introduction\"\n  }, \"Introduction\"), mdx(\"p\", null, \"The world of AI is rapidly evolving, and with the rise of large language models (LLMs), the need for robust, flexible, and controllable agentic systems has never been greater. Two of the most exciting frameworks in this space are \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"LangChain\"), \" and \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"LangGraph\"), \". These libraries empower developers to build advanced, agentic AI applications that can reason, plan, use tools, collaborate, and even reflect on their own actions.\"), mdx(\"p\", null, \"In this post, I\\u2019ll take you on a comprehensive journey through LangChain and LangGraph, exploring their architectures, the agentic AI patterns they enable, and how to use them in practice. We\\u2019ll cover everything from the basics to advanced multi-agent workflows, with plenty of code, diagrams, best practices, and real-world use cases. Whether you\\u2019re building a knowledge assistant, a data analysis pipeline, or a fully autonomous agentic system, this guide will serve as your definitive technical reference.\"), mdx(\"h2\", {\n    \"id\": \"langchain-overview\"\n  }, \"LangChain Overview\"), mdx(\"h3\", {\n    \"id\": \"what-is-langchain\"\n  }, \"What is LangChain?\"), mdx(\"p\", null, \"LangChain is a powerful open-source framework designed to make it easy to build applications with LLMs. It provides abstractions for chains, agents, tools, memory, and more, allowing you to compose complex workflows that leverage the reasoning and generative capabilities of modern language models.\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Key Concepts:\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Chains:\"), \" Sequences of calls (to LLMs, APIs, or other functions) that form a deterministic workflow.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Agents:\"), \" Systems that use an LLM to decide their own control flow, enabling dynamic, tool-using, and autonomous behaviors.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Tools:\"), \" External functions or APIs that agents can call (e.g., web search, calculators, databases).\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Memory:\"), \" Mechanisms for storing and recalling information across interactions (short-term, long-term, or custom).\")), mdx(\"p\", null, \"LangChain is available in both Python and TypeScript/JavaScript, and is widely used for building chatbots, RAG systems, tool-using agents, and more.\"), mdx(\"h3\", {\n    \"id\": \"chains-vs-agents\"\n  }, \"Chains vs. Agents\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Chains\"), \" are like scripts: they execute a fixed sequence of steps every time.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Agents\"), \" are like autonomous workers: they use an LLM to decide what to do next, which tool to use, or when to stop.\")), mdx(\"p\", null, \"LangChain\\u2019s agent abstractions make it easy to build systems that can reason, use tools, and adapt to new tasks.\"), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"langgraph-overview\"\n  }, \"LangGraph Overview\"), mdx(\"h3\", {\n    \"id\": \"what-is-langgraph\"\n  }, \"What is LangGraph?\"), mdx(\"p\", null, \"LangGraph is a next-generation framework for building \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"graph-based agentic workflows\"), \". While LangChain introduced the world to chains and agents, LangGraph takes things further by letting you define your application as a \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"graph of nodes and edges\"), \", where each node is a function (often an LLM call or tool) and edges define the control flow.\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Why LangGraph?\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Controllability:\"), \" Explicitly define the flow of your application as a graph.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Persistence:\"), \" Built-in support for checkpointing, state management, and time travel.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Streaming:\"), \" First-class support for streaming outputs and events.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Debugging:\"), \" Visualize and debug your agentic workflows with LangGraph Studio.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Modularity:\"), \" Compose complex systems from reusable subgraphs and nodes.\")), mdx(\"p\", null, \"LangGraph is especially powerful for building advanced agentic systems: multi-agent collaboration, self-reflective RAG, planning and execution, human-in-the-loop, and more.\"), mdx(\"h3\", {\n    \"id\": \"core-concepts\"\n  }, \"Core Concepts\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"State:\"), \" A shared data structure representing the current snapshot of your application (e.g., messages, memory, documents).\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Nodes:\"), \" Functions that perform work (LLM calls, tool invocations, grading, etc.).\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Edges:\"), \" Define which node(s) to execute next, based on the current state (can be conditional or fixed).\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Reducers:\"), \" Functions that specify how updates from nodes are applied to the state.\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Example: Minimal LangGraph Workflow (TypeScript)\")), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-typescript\"\n  }, \"import { StateGraph, Annotation, START, END } from \\\"@langchain/langgraph\\\";\\n\\nconst State = Annotation.Root({\\n  input: Annotation<string>,\\n  output: Annotation<string>,\\n});\\n\\nconst nodeA = async (state: typeof State.State) => {\\n  return { output: `Hello, ${state.input}!` };\\n};\\n\\nconst graph = new StateGraph(State)\\n  .addNode(\\\"nodeA\\\", nodeA)\\n  .addEdge(START, \\\"nodeA\\\")\\n  .addEdge(\\\"nodeA\\\", END)\\n  .compile();\\n\\nawait graph.invoke({ input: \\\"World\\\" }); // { output: \\\"Hello, World!\\\" }\\n\")), mdx(\"p\", null, \"LangGraph\\u2019s explicit graph structure makes it easy to build, debug, and extend complex agentic workflows.\"), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"agentic-ai-patterns\"\n  }, \"Agentic AI Patterns\"), mdx(\"h3\", {\n    \"id\": \"what-is-an-agent-in-ai\"\n  }, \"What is an Agent in AI?\"), mdx(\"p\", null, \"An \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"agent\"), \" is a system that uses an LLM to decide the control flow of an application. Unlike a chain (which always runs the same steps), an agent can choose which tools to use, when to stop, and how to adapt to new situations. This autonomy enables more flexible, powerful, and intelligent applications.\"), mdx(\"h3\", {\n    \"id\": \"why-agentic-patterns\"\n  }, \"Why Agentic Patterns?\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Dynamic Control Flow:\"), \" Agents can make decisions, branch, and adapt.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Tool Use:\"), \" Agents can call external APIs, search engines, databases, and more.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Collaboration:\"), \" Multiple agents can work together, each specializing in different tasks.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Reflection:\"), \" Agents can grade, critique, and improve their own outputs.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Human-in-the-Loop:\"), \" Agents can pause for human feedback or approval.\")), mdx(\"h3\", {\n    \"id\": \"common-agentic-patterns\"\n  }, \"Common Agentic Patterns\"), mdx(\"h4\", {\n    \"id\": \"1-react-reasoning-and-acting\"\n  }, \"1. ReAct (Reasoning and Acting)\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"The agent alternates between reasoning (LLM) and acting (tool use).\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Example: \\u201CTo answer this, I need to search the web. \", \"[calls search tool]\", \" Now, based on the results\\u2026\\u201D\")), mdx(\"h4\", {\n    \"id\": \"2-plan-and-execute\"\n  }, \"2. Plan-and-Execute\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"The agent first plans a sequence of steps, then executes them (possibly using tools).\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Example: \\u201CPlan: 1) Find the winner of the 2023 Australian Open. 2) Find their hometown.\\u201D\")), mdx(\"h4\", {\n    \"id\": \"3-tool-using-agents\"\n  }, \"3. Tool-Using Agents\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"The agent decides which tool to use at each step (search, calculator, database, etc.).\")), mdx(\"h4\", {\n    \"id\": \"4-router-agents\"\n  }, \"4. Router Agents\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"The agent routes tasks to specialized sub-agents or workflows.\")), mdx(\"h4\", {\n    \"id\": \"5-multi-agent-collaboration\"\n  }, \"5. Multi-Agent Collaboration\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Multiple agents (or agent types) work together, often in a supervisor/worker or divide-and-conquer pattern.\")), mdx(\"h4\", {\n    \"id\": \"6-reflection-and-self-correction-crag-self-rag\"\n  }, \"6. Reflection and Self-Correction (CRAG, Self-RAG)\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"The agent grades or critiques its own outputs, possibly re-running steps if needed.\")), mdx(\"h4\", {\n    \"id\": \"7-human-in-the-loop\"\n  }, \"7. Human-in-the-Loop\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"The agent pauses for human input, approval, or correction at key steps.\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Diagram: Agentic Patterns\")), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\"\n  }, \"[User] -> [Agent] -> [Tool/LLM] -> [Reflection/Grader] -> [Output]\\n                   |-> [Sub-Agent/Worker]\\n                   |-> [Human-in-the-Loop]\\n\")), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"practical-usage-langchain-and-langgraph-in-practice\"\n  }, \"Practical Usage: LangChain and LangGraph in Practice\"), mdx(\"p\", null, \"Let\\u2019s dive into how to use these frameworks to build real-world agentic AI systems. I\\u2019ll walk through several patterns, with code and explanations.\"), mdx(\"h3\", {\n    \"id\": \"1-retrieval-augmented-generation-rag-with-langgraph\"\n  }, \"1. Retrieval-Augmented Generation (RAG) with LangGraph\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"RAG\"), \" is a foundational pattern for knowledge assistants: retrieve relevant documents, then generate an answer grounded in those documents.\"), mdx(\"h4\", {\n    \"id\": \"step-by-step-building-a-rag-agent-in-langgraph\"\n  }, \"Step-by-Step: Building a RAG Agent in LangGraph\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Load Documents:\"), \" Use loaders (e.g., CheerioWebBaseLoader) to fetch and parse web pages.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Split Documents:\"), \" Use text splitters to chunk documents for retrieval.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Vector Store:\"), \" Embed and index chunks for similarity search.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Retriever:\"), \" Query the vector store for relevant chunks.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Agent State:\"), \" Track messages, retrieved docs, and conversation history.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Nodes:\"), \" Define functions for retrieval, grading, rewriting, and generation.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Edges:\"), \" Control flow: retrieve -> grade -> generate or rewrite -> \\u2026\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Example: Minimal RAG Graph (TypeScript)\")), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-typescript\"\n  }, \"import { CheerioWebBaseLoader } from \\\"@langchain/community/document_loaders/web/cheerio\\\";\\nimport { RecursiveCharacterTextSplitter } from \\\"@langchain/textsplitters\\\";\\nimport { MemoryVectorStore } from \\\"langchain/vectorstores/memory\\\";\\nimport { OpenAIEmbeddings } from \\\"@langchain/openai\\\";\\nimport { StateGraph, Annotation, START, END } from \\\"@langchain/langgraph\\\";\\n\\n// 1. Load and split documents\\nconst urls = [\\\"https://lilianweng.github.io/posts/2023-06-23-agent/\\\"];\\nconst docs = await Promise.all(urls.map(url => new CheerioWebBaseLoader(url).load()));\\nconst docsList = docs.flat();\\nconst textSplitter = new RecursiveCharacterTextSplitter({ chunkSize: 500, chunkOverlap: 50 });\\nconst docSplits = await textSplitter.splitDocuments(docsList);\\n\\n// 2. Create vector store and retriever\\nconst vectorStore = await MemoryVectorStore.fromDocuments(docSplits, new OpenAIEmbeddings());\\nconst retriever = vectorStore.asRetriever();\\n\\n// 3. Define state and nodes\\nconst GraphState = Annotation.Root({\\n  question: Annotation<string>(),\\n  documents: Annotation<any[]>({ reducer: (x, y) => y ?? x ?? [] }),\\n  answer: Annotation<string>(),\\n});\\n\\nconst retrieve = async (state) => ({ documents: await retriever.invoke(state.question) });\\nconst generate = async (state) => ({ answer: `Answer based on: ${state.documents.map(d => d.pageContent).join(\\\" \\\")}` });\\n\\n// 4. Build the graph\\nconst workflow = new StateGraph(GraphState)\\n  .addNode(\\\"retrieve\\\", retrieve)\\n  .addNode(\\\"generate\\\", generate)\\n  .addEdge(START, \\\"retrieve\\\")\\n  .addEdge(\\\"retrieve\\\", \\\"generate\\\")\\n  .addEdge(\\\"generate\\\", END)\\n  .compile();\\n\\nconst result = await workflow.invoke({ question: \\\"What are agentic patterns?\\\" });\\nconsole.log(result.answer);\\n\")), mdx(\"h4\", {\n    \"id\": \"advanced-corrective-rag-crag-self-rag\"\n  }, \"Advanced: Corrective RAG (CRAG), Self-RAG\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"CRAG:\"), \" Grade retrieved docs for relevance; if not relevant, rewrite query or use web search.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Self-RAG:\"), \" Reflect on the answer; if not grounded or useful, re-run steps.\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Key Nodes:\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"gradeDocuments\"), \": LLM grades each doc for relevance.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"transformQuery\"), \": LLM rewrites the query for better retrieval.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"webSearch\"), \": Fallback to web search if retrieval fails.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"generateGenerationVDocumentsGrade\"), \": Grade if answer is grounded in docs.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"generateGenerationVQuestionGrade\"), \": Grade if answer is useful for the question.\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Edge Logic:\"), \" Use conditional edges to decide next steps based on grades.\"), mdx(\"h3\", {\n    \"id\": \"2-multi-agent-collaboration\"\n  }, \"2. Multi-Agent Collaboration\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Pattern:\"), \" Divide-and-conquer with specialized agents (e.g., Researcher + Chart Generator).\"), mdx(\"h4\", {\n    \"id\": \"example-researcher--chart-generator\"\n  }, \"Example: Researcher + Chart Generator\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Researcher Agent:\"), \" Uses web search to gather data.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Chart Generator Agent:\"), \" Uses D3.js (via a tool) to generate charts from data.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"State:\"), \" Tracks messages and sender.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Edge Logic:\"), \" Route between agents based on task completion.\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Code Sketch:\")), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-typescript\"\n  }, \"import { StateGraph, Annotation, START, END } from \\\"@langchain/langgraph\\\";\\n// ... (define agents, tools, and nodes as in the context)\\n\\nconst AgentState = Annotation.Root({\\n  messages: Annotation<any[]>({ reducer: (x, y) => x.concat(y) }),\\n  sender: Annotation<string>({ reducer: (x, y) => y ?? x ?? \\\"user\\\" }),\\n});\\n\\n// Define nodes for Researcher, ChartGenerator, and tool calls\\n// ...\\n\\nconst workflow = new StateGraph(AgentState)\\n  .addNode(\\\"Researcher\\\", researchNode)\\n  .addNode(\\\"ChartGenerator\\\", chartNode)\\n  .addNode(\\\"call_tool\\\", toolNode)\\n  // ... (add conditional edges for routing)\\n  .addEdge(START, \\\"Researcher\\\")\\n  .compile();\\n\")), mdx(\"h4\", {\n    \"id\": \"advanced-hierarchical-agent-teams\"\n  }, \"Advanced: Hierarchical Agent Teams\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Compose subgraphs for teams (e.g., research team, writing team).\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use a supervisor agent to delegate tasks.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Enables scalable, modular multi-agent systems.\")), mdx(\"h3\", {\n    \"id\": \"3-planning-and-reasoning-patterns\"\n  }, \"3. Planning and Reasoning Patterns\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Pattern:\"), \" ReWOO (plan, execute, solve)\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Planner Node:\"), \" LLM generates a plan (sequence of tool calls).\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Tool Executor Node:\"), \" Executes each step, with variable substitution.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Solver Node:\"), \" LLM generates the final answer based on evidence.\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Code Sketch:\")), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-typescript\"\n  }, \"// ... (define state, planner, tool executor, solver as in context)\\nconst workflow = new StateGraph(GraphState)\\n  .addNode(\\\"plan\\\", getPlan)\\n  .addNode(\\\"tool\\\", toolExecution)\\n  .addNode(\\\"solve\\\", solve)\\n  .addEdge(START, \\\"plan\\\")\\n  .addEdge(\\\"plan\\\", \\\"tool\\\")\\n  .addConditionalEdges(\\\"tool\\\", routeFn)\\n  .addEdge(\\\"solve\\\", END)\\n  .compile();\\n\")), mdx(\"h3\", {\n    \"id\": \"4-human-in-the-loop-and-evaluation\"\n  }, \"4. Human-in-the-Loop and Evaluation\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Pattern:\"), \" Interrupts, breakpoints, simulation\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Simulated User:\"), \" LLM acts as a user for chatbot evaluation.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Chatbot Node:\"), \" LLM acts as the bot.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Edge Logic:\"), \" Continue or end based on conversation length or special tokens.\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Code Sketch:\")), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-typescript\"\n  }, \"// ... (define simulatedUserNode, chatBotNode, shouldContinue)\\nconst workflow = new StateGraph(MessagesAnnotation)\\n  .addNode('user', simulatedUserNode)\\n  .addNode('chatbot', chatBotNode)\\n  .addEdge('chatbot', 'user')\\n  .addConditionalEdges('user', shouldContinue, { [END]: END, continue: 'chatbot' })\\n  .addEdge(START, 'chatbot')\\n  .compile();\\n\")), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"advanced-concepts-and-best-practices\"\n  }, \"Advanced Concepts and Best Practices\"), mdx(\"h3\", {\n    \"id\": \"memory-in-agentic-systems\"\n  }, \"Memory in Agentic Systems\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Short-term memory:\"), \" In-context (conversation history)\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Long-term memory:\"), \" External vector stores, databases\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Sensory memory:\"), \" Embeddings for raw inputs (text, images)\")), mdx(\"h3\", {\n    \"id\": \"state-management-and-reducers\"\n  }, \"State Management and Reducers\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use reducers to control how state updates are applied (e.g., append, overwrite, merge).\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"For message histories, use \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"messagesStateReducer\"), \" for robust handling.\")), mdx(\"h3\", {\n    \"id\": \"persistence-checkpointing-and-time-travel\"\n  }, \"Persistence, Checkpointing, and Time Travel\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use built-in checkpointers to save and resume graph state.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Enables human-in-the-loop, debugging, and fault-tolerance.\")), mdx(\"h3\", {\n    \"id\": \"streaming-debugging-and-visualization\"\n  }, \"Streaming, Debugging, and Visualization\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Stream outputs and events for responsive UX.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use LangGraph Studio for graph visualization and step-by-step debugging.\")), mdx(\"h3\", {\n    \"id\": \"subgraphs-and-modularity\"\n  }, \"Subgraphs and Modularity\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Compose complex systems from reusable subgraphs.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Enables hierarchical agent teams and scalable architectures.\")), mdx(\"h3\", {\n    \"id\": \"performance-considerations\"\n  }, \"Performance Considerations\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Minimize unnecessary LLM/tool calls.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use conditional edges to avoid redundant steps.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Profile and monitor token usage and latency.\")), mdx(\"h3\", {\n    \"id\": \"troubleshooting\"\n  }, \"Troubleshooting\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use graph visualization to debug control flow.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Add logging to nodes for step-by-step tracing.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Handle edge cases (e.g., empty retrieval, tool failures) with fallback logic.\")), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"real-world-use-cases\"\n  }, \"Real-World Use Cases\"), mdx(\"h3\", {\n    \"id\": \"knowledge-assistants\"\n  }, \"Knowledge Assistants\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"RAG, CRAG, Self-RAG for document Q&A, research, and summarization.\")), mdx(\"h3\", {\n    \"id\": \"data-analysis-and-visualization\"\n  }, \"Data Analysis and Visualization\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Multi-agent workflows for data gathering, analysis, and chart generation.\")), mdx(\"h3\", {\n    \"id\": \"automated-research-and-report-generation\"\n  }, \"Automated Research and Report Generation\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Planning, tool use, and multi-agent collaboration for end-to-end research pipelines.\")), mdx(\"h3\", {\n    \"id\": \"customer-support-bots\"\n  }, \"Customer Support Bots\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Simulation and evaluation with human-in-the-loop for robust, user-friendly bots.\")), mdx(\"h3\", {\n    \"id\": \"workflow-automation\"\n  }, \"Workflow Automation\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Planning, execution, and tool use for automating business processes and decision-making.\")), mdx(\"hr\", null), mdx(\"video\", {\n    width: \"1150px\",\n    height: \"100%\",\n    autoPlay: true,\n    muted: true,\n    style: {\n      margin: 'auto'\n    }\n  }, mdx(\"source\", {\n    src: \"/28477cffc362798cb08bb544d106d89c/intro.mp4\",\n    type: \"video/mp4\"\n  }), \"Your browser does not support the video tag\"), mdx(\"h2\", {\n    \"id\": \"conclusion\"\n  }, \"Conclusion\"), mdx(\"p\", null, \"LangChain and LangGraph represent the cutting edge of agentic AI development. LangChain makes it easy to build chains and agents, while LangGraph empowers you to design, debug, and deploy complex, controllable agentic workflows as graphs. By mastering these frameworks and the agentic patterns they enable, you can build AI systems that are not only powerful and flexible, but also reliable, debuggable, and ready for real-world deployment.\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"When to use which?\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use \", mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"LangChain\"), \" for simple chains, basic agents, and rapid prototyping.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use \", mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"LangGraph\"), \" for advanced agentic systems: multi-agent, self-reflective, human-in-the-loop, or production-grade workflows.\")), mdx(\"p\", null, \"The future of AI is agentic, and with LangChain and LangGraph, you have the tools to build it. Happy hacking!\"));\n}\n;\nMDXContent.isMDXComponent = true;","tech":["TS","JS"],"category":"Post","appDescription":null,"hero":{"full":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsSAAALEgHS3X78AAAD70lEQVQ4y31U7U/TVxT+/QNGk+2TH8xQM6JfXIDyMoEhMQpMlAWjvBRJxMz4sklcpEUZW2gpDAHHoBj7QcGs8kEcSyQQspIwwCXMtlAobLy1/f36Agj/w7NzDm2pW7IPT+5z7z157nPPOfcqGxsb2Hr3DuFIBFowiGAotDsSQsR5HgyGZK7FoAWhapogoKrvQXE6nXD85oDX60U4HKZgDRE6JH5AFHtiWhyq+r6gyoL1RiO+KClBW1sbtrd3sLy8gomJCSwuLokoB7KjuEgCdkU0EVKjXLFYLMjLy0NjYyNevx7G8PAw7t9/gNraWgmKsGggIALskEX8NOdDQnSjmDM16lhhsrq2BofDgRZLC+qN9SgsLERBQQFmZmawsLCAza0tyaXP55MDeM6iU1NTAt4Tp1pUkINWV1dx/cvrSE1JRVbWp8I7OzpRU1ODly8HMTj4Ci6XG6Ojo3KTvr4+vLC/oNwvxp3HBQMBVQricIzL1W1PbBgbG0Npaam4vXOnFhO/T+Kt04WrV6+hqOhzPOvrpxv8KXlmDXYsV96rmIrNzS0qzDY2Njel0svLy3j69Bl+GfoVfxPv7u5BcfF55H6Wh/7+59JunK619XVw+8UdqlFRKT+dFAPnhl2Mj4+jvb0DVVVXUFGpR0FhEQn2y4E2mw2mJpOkQNomsQ0S28Lv90vyR0ZGoCeRixcv4dLlMmRmZiE/Px8mkwlWq5VyOwizuVnybrfbSVDV4hVKdMrNvLKyAvvPdty4cRMXLpRAl56O7OwcDAwMYGhoCF1dXbA0W8S5TqdDQ8O3LLjXlPEmjTp8TtdiF2/e/IHJySlyO4qlpb+wvbMDt9uNunt1JFaFEyc+EcH2hw+hJOZMjeaQ3/D09DRe0XU8Ho+scRdwoThmnYrA46POR0hLTYMuTYfvqDtm3bNQQhQkoMrGeJi4j69NPEKVDPK75nfOIM7zWJxrbg6z8/OIUL4ZSq9ej96KCljLy/BYX4nHVXri5cJ5vYf47lyPnrLLsHKsrJeht7ICtupqPKm+QmvlAuXrDz5Ec0YGzJSD1pwc4a3Z2Wg4dgwPkpNpPV3WLVTFH3Jz0XLyJMxUHMNHSbi1bx9uHziA2/v34ysaGUrd4cPoOncOPxYVoZt+nebMTLSdOoWOM2fQefas7P10vhjtp0+j4fhxGCjekJSEe4cO4e7Bg/iGcDcBivHjZLTk5KKVfhxTegaa6PTvU1IEZhK3UJs0kUvmhiNHUEdibIK58ehRGP4FZckzDy+90QWClx6/lyolIL7gcmH+rVNG3l+a84DjeVyMYXYO3gQoKjWwyt9PkEG/BoP7kP+9/4GPWum/8OMfvLW0/tBH62QAAAAASUVORK5CYII=","aspectRatio":1,"src":"/static/8d0121465a537b8fbe67dfe613c29ab7/a1946/cover.png","srcSet":"/static/8d0121465a537b8fbe67dfe613c29ab7/5b37e/cover.png 236w,\n/static/8d0121465a537b8fbe67dfe613c29ab7/49058/cover.png 472w,\n/static/8d0121465a537b8fbe67dfe613c29ab7/a1946/cover.png 944w,\n/static/8d0121465a537b8fbe67dfe613c29ab7/6050d/cover.png 1200w","srcWebp":"/static/8d0121465a537b8fbe67dfe613c29ab7/99fbb/cover.webp","srcSetWebp":"/static/8d0121465a537b8fbe67dfe613c29ab7/77392/cover.webp 236w,\n/static/8d0121465a537b8fbe67dfe613c29ab7/1f177/cover.webp 472w,\n/static/8d0121465a537b8fbe67dfe613c29ab7/99fbb/cover.webp 944w,\n/static/8d0121465a537b8fbe67dfe613c29ab7/9000d/cover.webp 1200w","sizes":"(max-width: 944px) 100vw, 944px","tracedSVG":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='400'%20height='400'%20viewBox='0%200%20400%20400'%20preserveAspectRatio='none'%3e%3cpath%20d='M21%2032l-3%201-6%204c-5%204-6%205-6%202%200-2-3-6-5-6l1%202c2%203%203%204%200%206-2%202-3%207%200%207%202-1%202-1%201%206%200%2011%204%2019%2013%2024%205%202%2013%204%2013%202h3l3-1c0-2%204-1%208%202s9%203%2011%200%203-2%202%201-1%204%203%205%206-1%207-5l1-4c0-2%200-2-2-1l-2%202c0%202-1%201-3-1l-4-3c-1-1-2-2-1-3%200-3%203-1%204%202%201%202%202%203%203%202l1-7-1%201c0%202-5-1-8-4s-3-6-2-6c1-1%200-12-2-17-2-4-8-9-14-11H21m0%203h-3l-1%201-1%203c-1%200-2%202-1%203l-3%203-2%201h8c2%201%205%200%205-2h1c0%202%200%202%203%201%201-2%202-2%202-1h1c1-1%200-2-1-3s-1-1%202-1%204-1%203-4l-1-1-1%203v1l-7-4h-4m92%2018v1l-1%201c-2%201-2%201%200%203h3l1%202v6c1%202%201%202-1%203-2%200-2%200-1%201s1%203-1%203v-1l-2-1c-3%200-3-3%200-3%203-1%204-3%202-3l-3-2-3-1%201%202c2%203%202%204-1%203-1%200-3%202-3%205%200%201-1%202-1%200l-2-1h-2v3h-1c0-3-2-2-3%201s-1%203%202%204c3%200%204%201%202%202h-2c-1-2-2-1-2%203l-1%203v-1l-1-1h-2c-2%202-2%204-1%204l1%202h-1c-1-2-4-1-6%202s-2%203-3%201c-2-1-2-2%200-2v-5c-1-4-3-6-3-3h-7l-1%201c-1%200-1-4%201-6l1-2c0-2-2%200-4%202v6l2%205%202%202%201-1h5l-1%203c-2-1-1%201%201%202v2h-3l-1-1c1%200%200-2-2-3l-3-2-2%203c-2%202-4%202-4-2l-1-1-1%203h-2l-1%201%203%201h2l2%201%202%201-1%201c-3-1-2%201%200%203%202%201%202%202%201%203l-2-1-2-3-1-2c0-1-1-2-2-1-3%200-3%200-2%201v5c-2%202%2010%2020%2012%2018l1%201v1h2l1%201v1l1%201c1-1%202%200%202%201l2%201h1c0%201%207%203%208%202%200-1%205%200%207%202h2c0-2%202-3%202-2v2c2%201%208%200%206-1h-4l2-2h10c2%200%203%200%202-1l2-1%201-2%201-2%204-1c5-1%2013%202%2015%206%204%209%2016%2014%2027%2010%208-3%207-3%206%201-3%204-5%2016-4%2017l1-1%202-1v-1l1-1h3c0-1%201-2%203-2%202%201%2011-5%2011-6l-4%201-4%202c0-1%201-2%203-2l4-3%202-2v2h2c2-1%203-3%200-3v-2l2-3c0-2%204-6%204-5h4v-1c0-2-1-2-2-1h-1l1-1v-1l3-3c3-2%204-1%202%201v1l3-3%204-3%202-2c0-1-1-2-2-1l-1-1%203-1%202-1v-1l1-1c1-1%201-1-1-1-3%200-7%204-6%206%201%201%200%201-1%201l-3%202-2%201%202-3c3-3%205-7%203-7l-3%203c-1%202-3%203-3%202v2h-1c-1-1-2-1-3%201h-2l2-2-1-2v-1c1%201%202%200%203-1l1-2h2v-2c-2-2-10%203-16%209l-5%205v-5c0-9-5-18-12-21-6-2-13-3-15-2-1%201-1%201%201%201l2%202h1c2-2%203-1%202%201l1%202%201%201v1l1%201h-1c-2-1-3%200-1%202l-2%202-4%204h-2c1-1%200-2-1-2l-1%201c1%201-2%202-6%202a235%20235%200%2000-7-2h2c2%200%201-4-1-6h-2c-1%201-1%201-1-1l2-3c2-1%203-9%202-9v-3c2-7-2-18-9-25l-5-5c-1-2-2-3-3-2l-3-1c-1-1-3-2-4-1l-2-1c1-2-2-2-2-1m198%2046c-6%201-7%204-3%204l3%203v4h-1v2c-1-1-3%205-2%206%202%201%2011-17%209-19h-6m-20%203l-18%2012-4%204-4-3c-7-6-10-6-12-1l-2%203-1%204-3%202v1h2l-1%201-2%202-3%204c-2%201-3%203-2%203l-1%201v1l-1%201c-1-1-1%200-1%201l-2%203-1%203c1%201%200%201-1%201-3%200-6%204-5%205l-2%203c-3%201-6%205-6%207v1l-2-1-2-1%201%202%201%202-2-1-4%202c-2%201-3%203-2%203l-1%201c-2%200-7%203-6%204l-4%201-1%201-1%202-2%201h-1l-2%201v3l-1%201c-1-1-5%200-7%202l-3%201h-6c0%202-2%202-2%201-1-3-3-2-3%200-1%202%202%209%203%2010v3c-2%202-1%203%201%201h1l-7%208a126%20126%200%2000-11%2011c0-2-3-1-8%205-10%2011-12%2015-11%2016s1%201%206-6c1-2%203-3%203-2l1-1v-1h1c2%200%201%201-2%205-5%207-4%2011%202%2011%206-1%2022-10%2021-11%200-2-1-1-7%201-7%204-11%205-13%204-2%200-2-3%200-4l1-1%204-7%203-7c1-1%2016-17%2017-16l-4%205c-6%206-11%2013-10%2014l-1%201h-1v1l-1%202-1%201-2%201%201%201%201%201c1%203%205%202%2012-1l4-2%2013-8%201-1c0%201%202%200%202-2l2-2%203%202%205%203c3%200%203%200%201%202v1l2-1h7c21%205%2042-1%2057-14%205-4%2010-7%209-4-1%201%203%202%205%201h1c0%202%203%203%209%204%203%201%206%200%204-1l-1-2h1c2%202%202%202%205%201%204-2%2012-2%2012%200s6%206%2010%206c5%200%2014%203%2012%204l-8%201c-5%201-6%202-4%202l5%201h4l4%202h-2l-2%201-1%201-1-1h-5l-3-1-4%201h-2l-3-3c-1-5-8-9-11-6-1%202-3%2011-1%2010%201-1%204%204%203%206l-3%203-3%201%202%203c11%2019%2031%2027%2053%2023%2012-2%2029-13%2028-18v-2c2%200%206-5%205-6v-1c2%200%203%202%203%204%202%205%2012%2011%2012%207l-4-3c-4-2-6-4-3-5%201-1%201-4-1-4-1%201-1%200-1-2%200-1%203-1%207%201l2-1-5-3-4-3v-4l1-2v-19l-6-14-1-1-7-11a58%2058%200%2000-50-11c-12%204-19%2011-12%2011v1c-2%201%200%201%204%201l7-1v-1l1%201%201%201h4a61%2061%200%200013%203c6%200%2020%206%2021%207%201%202%200%202-3%201l-26-1a163%20163%200%2001-27%200h-4l-5-4c-4-3-6-3-10-2-1%201-3%200-4-1-2-2-2-2-1-9l1-13-1-6%208-9%208-10v-1c2%201%204-1%203-2l-5%203-4%203h-1l-1%202v1l-5%205-1%201h-4l1-2v-1c-2%200-3-2%200-2l1-2h-1c-3%202-2%200%201-4%204-5%207-11%206-11l-5%207-6%206c-1%200-6-10-5-11%201-2%2013-8%2014-7l2%201v-2c1-2%202-1%202%201s2%204%204%203v-2c-1-1-1-3%201-3l1%201%203-2%201-4h-2l-1-2c-2%200-20%207-21%209h-1l-1%201c1%200-4%204-6%204s13-11%2025-18l2-2-9%204-9%205c0-1%201-2%2010-7%205-3%206-4%204-4-1-1-3%200-5%201m0%2082c-1%201%200%201%202%201%203%200%206%203%204%206l-1-1c0-1-1-2-4-1l-3%202c0%201%204%204%206%204l3%202c0%202%201%202%202%200l2-4c3-3%202-6-2-8-3-2-9-3-9-1m56%205c-3%202-14%202-16%201h-22l-1%201-1%201c0%202%205%203%2011%203%207%200%2015%202%2011%203h11l7-2%203-1-3-1-3-1%203-2%204-3-4%201m-174%2022l-2%205-1%204-1-1c1-3%200-2-3%200-2%203-1%205%201%204%201-1%201%200%201%201l1%202v-1l1-1c1%201%201%200%201-1%200-2%200-2%201-1%200%203%203%202%2011-2s8-4%203-8c-4-5-5-5-7-2-1%202-4%202-3-1%201-2-1-1-3%202M0%20324v37h401v-75H0v38m273-19l-1%203c1%201%200%203-1%205-2%204%200%207%208%207%205-1%206-1%204-3v-5l-1%202c0%202-1%201-5-2-4-4-3-6%201-6l2-1c-1-2-6-1-7%200m-213%205c-4%203-1%2011%204%2010%201-1%202%200%202%201s-3%202-5%201l-2%201h8l1-8v-6l-3-1c-3%200-4%201-5%202m126%200c-3%204-1%2011%204%2010h3c0%202-3%203-5%203h-2l3%201c5%200%206-2%206-10v-6h-4l-5%202m51%206l1%208%201-2c0-2%201-3%203-3%205%201%207-4%205-8-1-2-2-3-6-3h-4v8M36%20334c-4%203-1%2011%204%2010%201-1%202%200%202%201s-3%202-5%201l-2%201h8l1-8v-6l-3-1c-3%200-4%201-5%202'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"regular":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsSAAALEgHS3X78AAAD70lEQVQ4y31U7U/TVxT+/QNGk+2TH8xQM6JfXIDyMoEhMQpMlAWjvBRJxMz4sklcpEUZW2gpDAHHoBj7QcGs8kEcSyQQspIwwCXMtlAobLy1/f36Agj/w7NzDm2pW7IPT+5z7z157nPPOfcqGxsb2Hr3DuFIBFowiGAotDsSQsR5HgyGZK7FoAWhapogoKrvQXE6nXD85oDX60U4HKZgDRE6JH5AFHtiWhyq+r6gyoL1RiO+KClBW1sbtrd3sLy8gomJCSwuLokoB7KjuEgCdkU0EVKjXLFYLMjLy0NjYyNevx7G8PAw7t9/gNraWgmKsGggIALskEX8NOdDQnSjmDM16lhhsrq2BofDgRZLC+qN9SgsLERBQQFmZmawsLCAza0tyaXP55MDeM6iU1NTAt4Tp1pUkINWV1dx/cvrSE1JRVbWp8I7OzpRU1ODly8HMTj4Ci6XG6Ojo3KTvr4+vLC/oNwvxp3HBQMBVQricIzL1W1PbBgbG0Npaam4vXOnFhO/T+Kt04WrV6+hqOhzPOvrpxv8KXlmDXYsV96rmIrNzS0qzDY2Njel0svLy3j69Bl+GfoVfxPv7u5BcfF55H6Wh/7+59JunK619XVw+8UdqlFRKT+dFAPnhl2Mj4+jvb0DVVVXUFGpR0FhEQn2y4E2mw2mJpOkQNomsQ0S28Lv90vyR0ZGoCeRixcv4dLlMmRmZiE/Px8mkwlWq5VyOwizuVnybrfbSVDV4hVKdMrNvLKyAvvPdty4cRMXLpRAl56O7OwcDAwMYGhoCF1dXbA0W8S5TqdDQ8O3LLjXlPEmjTp8TtdiF2/e/IHJySlyO4qlpb+wvbMDt9uNunt1JFaFEyc+EcH2hw+hJOZMjeaQ3/D09DRe0XU8Ho+scRdwoThmnYrA46POR0hLTYMuTYfvqDtm3bNQQhQkoMrGeJi4j69NPEKVDPK75nfOIM7zWJxrbg6z8/OIUL4ZSq9ej96KCljLy/BYX4nHVXri5cJ5vYf47lyPnrLLsHKsrJeht7ICtupqPKm+QmvlAuXrDz5Ec0YGzJSD1pwc4a3Z2Wg4dgwPkpNpPV3WLVTFH3Jz0XLyJMxUHMNHSbi1bx9uHziA2/v34ysaGUrd4cPoOncOPxYVoZt+nebMTLSdOoWOM2fQefas7P10vhjtp0+j4fhxGCjekJSEe4cO4e7Bg/iGcDcBivHjZLTk5KKVfhxTegaa6PTvU1IEZhK3UJs0kUvmhiNHUEdibIK58ehRGP4FZckzDy+90QWClx6/lyolIL7gcmH+rVNG3l+a84DjeVyMYXYO3gQoKjWwyt9PkEG/BoP7kP+9/4GPWum/8OMfvLW0/tBH62QAAAAASUVORK5CYII=","aspectRatio":1,"src":"/static/8d0121465a537b8fbe67dfe613c29ab7/3ddd4/cover.png","srcSet":"/static/8d0121465a537b8fbe67dfe613c29ab7/078a8/cover.png 163w,\n/static/8d0121465a537b8fbe67dfe613c29ab7/e56da/cover.png 327w,\n/static/8d0121465a537b8fbe67dfe613c29ab7/3ddd4/cover.png 653w,\n/static/8d0121465a537b8fbe67dfe613c29ab7/c5cc7/cover.png 980w,\n/static/8d0121465a537b8fbe67dfe613c29ab7/6050d/cover.png 1200w","srcWebp":"/static/8d0121465a537b8fbe67dfe613c29ab7/0acdf/cover.webp","srcSetWebp":"/static/8d0121465a537b8fbe67dfe613c29ab7/ac59e/cover.webp 163w,\n/static/8d0121465a537b8fbe67dfe613c29ab7/7660b/cover.webp 327w,\n/static/8d0121465a537b8fbe67dfe613c29ab7/0acdf/cover.webp 653w,\n/static/8d0121465a537b8fbe67dfe613c29ab7/75470/cover.webp 980w,\n/static/8d0121465a537b8fbe67dfe613c29ab7/9000d/cover.webp 1200w","sizes":"(max-width: 653px) 100vw, 653px","tracedSVG":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='400'%20height='400'%20viewBox='0%200%20400%20400'%20preserveAspectRatio='none'%3e%3cpath%20d='M21%2032l-3%201-6%204c-5%204-6%205-6%202%200-2-3-6-5-6l1%202c2%203%203%204%200%206-2%202-3%207%200%207%202-1%202-1%201%206%200%2011%204%2019%2013%2024%205%202%2013%204%2013%202h3l3-1c0-2%204-1%208%202s9%203%2011%200%203-2%202%201-1%204%203%205%206-1%207-5l1-4c0-2%200-2-2-1l-2%202c0%202-1%201-3-1l-4-3c-1-1-2-2-1-3%200-3%203-1%204%202%201%202%202%203%203%202l1-7-1%201c0%202-5-1-8-4s-3-6-2-6c1-1%200-12-2-17-2-4-8-9-14-11H21m0%203h-3l-1%201-1%203c-1%200-2%202-1%203l-3%203-2%201h8c2%201%205%200%205-2h1c0%202%200%202%203%201%201-2%202-2%202-1h1c1-1%200-2-1-3s-1-1%202-1%204-1%203-4l-1-1-1%203v1l-7-4h-4m92%2018v1l-1%201c-2%201-2%201%200%203h3l1%202v6c1%202%201%202-1%203-2%200-2%200-1%201s1%203-1%203v-1l-2-1c-3%200-3-3%200-3%203-1%204-3%202-3l-3-2-3-1%201%202c2%203%202%204-1%203-1%200-3%202-3%205%200%201-1%202-1%200l-2-1h-2v3h-1c0-3-2-2-3%201s-1%203%202%204c3%200%204%201%202%202h-2c-1-2-2-1-2%203l-1%203v-1l-1-1h-2c-2%202-2%204-1%204l1%202h-1c-1-2-4-1-6%202s-2%203-3%201c-2-1-2-2%200-2v-5c-1-4-3-6-3-3h-7l-1%201c-1%200-1-4%201-6l1-2c0-2-2%200-4%202v6l2%205%202%202%201-1h5l-1%203c-2-1-1%201%201%202v2h-3l-1-1c1%200%200-2-2-3l-3-2-2%203c-2%202-4%202-4-2l-1-1-1%203h-2l-1%201%203%201h2l2%201%202%201-1%201c-3-1-2%201%200%203%202%201%202%202%201%203l-2-1-2-3-1-2c0-1-1-2-2-1-3%200-3%200-2%201v5c-2%202%2010%2020%2012%2018l1%201v1h2l1%201v1l1%201c1-1%202%200%202%201l2%201h1c0%201%207%203%208%202%200-1%205%200%207%202h2c0-2%202-3%202-2v2c2%201%208%200%206-1h-4l2-2h10c2%200%203%200%202-1l2-1%201-2%201-2%204-1c5-1%2013%202%2015%206%204%209%2016%2014%2027%2010%208-3%207-3%206%201-3%204-5%2016-4%2017l1-1%202-1v-1l1-1h3c0-1%201-2%203-2%202%201%2011-5%2011-6l-4%201-4%202c0-1%201-2%203-2l4-3%202-2v2h2c2-1%203-3%200-3v-2l2-3c0-2%204-6%204-5h4v-1c0-2-1-2-2-1h-1l1-1v-1l3-3c3-2%204-1%202%201v1l3-3%204-3%202-2c0-1-1-2-2-1l-1-1%203-1%202-1v-1l1-1c1-1%201-1-1-1-3%200-7%204-6%206%201%201%200%201-1%201l-3%202-2%201%202-3c3-3%205-7%203-7l-3%203c-1%202-3%203-3%202v2h-1c-1-1-2-1-3%201h-2l2-2-1-2v-1c1%201%202%200%203-1l1-2h2v-2c-2-2-10%203-16%209l-5%205v-5c0-9-5-18-12-21-6-2-13-3-15-2-1%201-1%201%201%201l2%202h1c2-2%203-1%202%201l1%202%201%201v1l1%201h-1c-2-1-3%200-1%202l-2%202-4%204h-2c1-1%200-2-1-2l-1%201c1%201-2%202-6%202a235%20235%200%2000-7-2h2c2%200%201-4-1-6h-2c-1%201-1%201-1-1l2-3c2-1%203-9%202-9v-3c2-7-2-18-9-25l-5-5c-1-2-2-3-3-2l-3-1c-1-1-3-2-4-1l-2-1c1-2-2-2-2-1m198%2046c-6%201-7%204-3%204l3%203v4h-1v2c-1-1-3%205-2%206%202%201%2011-17%209-19h-6m-20%203l-18%2012-4%204-4-3c-7-6-10-6-12-1l-2%203-1%204-3%202v1h2l-1%201-2%202-3%204c-2%201-3%203-2%203l-1%201v1l-1%201c-1-1-1%200-1%201l-2%203-1%203c1%201%200%201-1%201-3%200-6%204-5%205l-2%203c-3%201-6%205-6%207v1l-2-1-2-1%201%202%201%202-2-1-4%202c-2%201-3%203-2%203l-1%201c-2%200-7%203-6%204l-4%201-1%201-1%202-2%201h-1l-2%201v3l-1%201c-1-1-5%200-7%202l-3%201h-6c0%202-2%202-2%201-1-3-3-2-3%200-1%202%202%209%203%2010v3c-2%202-1%203%201%201h1l-7%208a126%20126%200%2000-11%2011c0-2-3-1-8%205-10%2011-12%2015-11%2016s1%201%206-6c1-2%203-3%203-2l1-1v-1h1c2%200%201%201-2%205-5%207-4%2011%202%2011%206-1%2022-10%2021-11%200-2-1-1-7%201-7%204-11%205-13%204-2%200-2-3%200-4l1-1%204-7%203-7c1-1%2016-17%2017-16l-4%205c-6%206-11%2013-10%2014l-1%201h-1v1l-1%202-1%201-2%201%201%201%201%201c1%203%205%202%2012-1l4-2%2013-8%201-1c0%201%202%200%202-2l2-2%203%202%205%203c3%200%203%200%201%202v1l2-1h7c21%205%2042-1%2057-14%205-4%2010-7%209-4-1%201%203%202%205%201h1c0%202%203%203%209%204%203%201%206%200%204-1l-1-2h1c2%202%202%202%205%201%204-2%2012-2%2012%200s6%206%2010%206c5%200%2014%203%2012%204l-8%201c-5%201-6%202-4%202l5%201h4l4%202h-2l-2%201-1%201-1-1h-5l-3-1-4%201h-2l-3-3c-1-5-8-9-11-6-1%202-3%2011-1%2010%201-1%204%204%203%206l-3%203-3%201%202%203c11%2019%2031%2027%2053%2023%2012-2%2029-13%2028-18v-2c2%200%206-5%205-6v-1c2%200%203%202%203%204%202%205%2012%2011%2012%207l-4-3c-4-2-6-4-3-5%201-1%201-4-1-4-1%201-1%200-1-2%200-1%203-1%207%201l2-1-5-3-4-3v-4l1-2v-19l-6-14-1-1-7-11a58%2058%200%2000-50-11c-12%204-19%2011-12%2011v1c-2%201%200%201%204%201l7-1v-1l1%201%201%201h4a61%2061%200%200013%203c6%200%2020%206%2021%207%201%202%200%202-3%201l-26-1a163%20163%200%2001-27%200h-4l-5-4c-4-3-6-3-10-2-1%201-3%200-4-1-2-2-2-2-1-9l1-13-1-6%208-9%208-10v-1c2%201%204-1%203-2l-5%203-4%203h-1l-1%202v1l-5%205-1%201h-4l1-2v-1c-2%200-3-2%200-2l1-2h-1c-3%202-2%200%201-4%204-5%207-11%206-11l-5%207-6%206c-1%200-6-10-5-11%201-2%2013-8%2014-7l2%201v-2c1-2%202-1%202%201s2%204%204%203v-2c-1-1-1-3%201-3l1%201%203-2%201-4h-2l-1-2c-2%200-20%207-21%209h-1l-1%201c1%200-4%204-6%204s13-11%2025-18l2-2-9%204-9%205c0-1%201-2%2010-7%205-3%206-4%204-4-1-1-3%200-5%201m0%2082c-1%201%200%201%202%201%203%200%206%203%204%206l-1-1c0-1-1-2-4-1l-3%202c0%201%204%204%206%204l3%202c0%202%201%202%202%200l2-4c3-3%202-6-2-8-3-2-9-3-9-1m56%205c-3%202-14%202-16%201h-22l-1%201-1%201c0%202%205%203%2011%203%207%200%2015%202%2011%203h11l7-2%203-1-3-1-3-1%203-2%204-3-4%201m-174%2022l-2%205-1%204-1-1c1-3%200-2-3%200-2%203-1%205%201%204%201-1%201%200%201%201l1%202v-1l1-1c1%201%201%200%201-1%200-2%200-2%201-1%200%203%203%202%2011-2s8-4%203-8c-4-5-5-5-7-2-1%202-4%202-3-1%201-2-1-1-3%202M0%20324v37h401v-75H0v38m273-19l-1%203c1%201%200%203-1%205-2%204%200%207%208%207%205-1%206-1%204-3v-5l-1%202c0%202-1%201-5-2-4-4-3-6%201-6l2-1c-1-2-6-1-7%200m-213%205c-4%203-1%2011%204%2010%201-1%202%200%202%201s-3%202-5%201l-2%201h8l1-8v-6l-3-1c-3%200-4%201-5%202m126%200c-3%204-1%2011%204%2010h3c0%202-3%203-5%203h-2l3%201c5%200%206-2%206-10v-6h-4l-5%202m51%206l1%208%201-2c0-2%201-3%203-3%205%201%207-4%205-8-1-2-2-3-6-3h-4v8M36%20334c-4%203-1%2011%204%2010%201-1%202%200%202%201s-3%202-5%201l-2%201h8l1-8v-6l-3-1c-3%200-4%201-5%202'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"narrow":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsSAAALEgHS3X78AAAD70lEQVQ4y31U7U/TVxT+/QNGk+2TH8xQM6JfXIDyMoEhMQpMlAWjvBRJxMz4sklcpEUZW2gpDAHHoBj7QcGs8kEcSyQQspIwwCXMtlAobLy1/f36Agj/w7NzDm2pW7IPT+5z7z157nPPOfcqGxsb2Hr3DuFIBFowiGAotDsSQsR5HgyGZK7FoAWhapogoKrvQXE6nXD85oDX60U4HKZgDRE6JH5AFHtiWhyq+r6gyoL1RiO+KClBW1sbtrd3sLy8gomJCSwuLokoB7KjuEgCdkU0EVKjXLFYLMjLy0NjYyNevx7G8PAw7t9/gNraWgmKsGggIALskEX8NOdDQnSjmDM16lhhsrq2BofDgRZLC+qN9SgsLERBQQFmZmawsLCAza0tyaXP55MDeM6iU1NTAt4Tp1pUkINWV1dx/cvrSE1JRVbWp8I7OzpRU1ODly8HMTj4Ci6XG6Ojo3KTvr4+vLC/oNwvxp3HBQMBVQricIzL1W1PbBgbG0Npaam4vXOnFhO/T+Kt04WrV6+hqOhzPOvrpxv8KXlmDXYsV96rmIrNzS0qzDY2Njel0svLy3j69Bl+GfoVfxPv7u5BcfF55H6Wh/7+59JunK619XVw+8UdqlFRKT+dFAPnhl2Mj4+jvb0DVVVXUFGpR0FhEQn2y4E2mw2mJpOkQNomsQ0S28Lv90vyR0ZGoCeRixcv4dLlMmRmZiE/Px8mkwlWq5VyOwizuVnybrfbSVDV4hVKdMrNvLKyAvvPdty4cRMXLpRAl56O7OwcDAwMYGhoCF1dXbA0W8S5TqdDQ8O3LLjXlPEmjTp8TtdiF2/e/IHJySlyO4qlpb+wvbMDt9uNunt1JFaFEyc+EcH2hw+hJOZMjeaQ3/D09DRe0XU8Ho+scRdwoThmnYrA46POR0hLTYMuTYfvqDtm3bNQQhQkoMrGeJi4j69NPEKVDPK75nfOIM7zWJxrbg6z8/OIUL4ZSq9ej96KCljLy/BYX4nHVXri5cJ5vYf47lyPnrLLsHKsrJeht7ICtupqPKm+QmvlAuXrDz5Ec0YGzJSD1pwc4a3Z2Wg4dgwPkpNpPV3WLVTFH3Jz0XLyJMxUHMNHSbi1bx9uHziA2/v34ysaGUrd4cPoOncOPxYVoZt+nebMTLSdOoWOM2fQefas7P10vhjtp0+j4fhxGCjekJSEe4cO4e7Bg/iGcDcBivHjZLTk5KKVfhxTegaa6PTvU1IEZhK3UJs0kUvmhiNHUEdibIK58ehRGP4FZckzDy+90QWClx6/lyolIL7gcmH+rVNG3l+a84DjeVyMYXYO3gQoKjWwyt9PkEG/BoP7kP+9/4GPWum/8OMfvLW0/tBH62QAAAAASUVORK5CYII=","aspectRatio":1,"src":"/static/8d0121465a537b8fbe67dfe613c29ab7/502b1/cover.png","srcSet":"/static/8d0121465a537b8fbe67dfe613c29ab7/f2e6d/cover.png 114w,\n/static/8d0121465a537b8fbe67dfe613c29ab7/4ddba/cover.png 229w,\n/static/8d0121465a537b8fbe67dfe613c29ab7/502b1/cover.png 457w,\n/static/8d0121465a537b8fbe67dfe613c29ab7/7ddc2/cover.png 686w,\n/static/8d0121465a537b8fbe67dfe613c29ab7/435bf/cover.png 914w,\n/static/8d0121465a537b8fbe67dfe613c29ab7/6050d/cover.png 1200w","srcWebp":"/static/8d0121465a537b8fbe67dfe613c29ab7/15384/cover.webp","srcSetWebp":"/static/8d0121465a537b8fbe67dfe613c29ab7/31fce/cover.webp 114w,\n/static/8d0121465a537b8fbe67dfe613c29ab7/e3e25/cover.webp 229w,\n/static/8d0121465a537b8fbe67dfe613c29ab7/15384/cover.webp 457w,\n/static/8d0121465a537b8fbe67dfe613c29ab7/0258d/cover.webp 686w,\n/static/8d0121465a537b8fbe67dfe613c29ab7/64ea2/cover.webp 914w,\n/static/8d0121465a537b8fbe67dfe613c29ab7/9000d/cover.webp 1200w","sizes":"(max-width: 457px) 100vw, 457px","tracedSVG":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='400'%20height='400'%20viewBox='0%200%20400%20400'%20preserveAspectRatio='none'%3e%3cpath%20d='M21%2032l-3%201-6%204c-5%204-6%205-6%202%200-2-3-6-5-6l1%202c2%203%203%204%200%206-2%202-3%207%200%207%202-1%202-1%201%206%200%2011%204%2019%2013%2024%205%202%2013%204%2013%202h3l3-1c0-2%204-1%208%202s9%203%2011%200%203-2%202%201-1%204%203%205%206-1%207-5l1-4c0-2%200-2-2-1l-2%202c0%202-1%201-3-1l-4-3c-1-1-2-2-1-3%200-3%203-1%204%202%201%202%202%203%203%202l1-7-1%201c0%202-5-1-8-4s-3-6-2-6c1-1%200-12-2-17-2-4-8-9-14-11H21m0%203h-3l-1%201-1%203c-1%200-2%202-1%203l-3%203-2%201h8c2%201%205%200%205-2h1c0%202%200%202%203%201%201-2%202-2%202-1h1c1-1%200-2-1-3s-1-1%202-1%204-1%203-4l-1-1-1%203v1l-7-4h-4m92%2018v1l-1%201c-2%201-2%201%200%203h3l1%202v6c1%202%201%202-1%203-2%200-2%200-1%201s1%203-1%203v-1l-2-1c-3%200-3-3%200-3%203-1%204-3%202-3l-3-2-3-1%201%202c2%203%202%204-1%203-1%200-3%202-3%205%200%201-1%202-1%200l-2-1h-2v3h-1c0-3-2-2-3%201s-1%203%202%204c3%200%204%201%202%202h-2c-1-2-2-1-2%203l-1%203v-1l-1-1h-2c-2%202-2%204-1%204l1%202h-1c-1-2-4-1-6%202s-2%203-3%201c-2-1-2-2%200-2v-5c-1-4-3-6-3-3h-7l-1%201c-1%200-1-4%201-6l1-2c0-2-2%200-4%202v6l2%205%202%202%201-1h5l-1%203c-2-1-1%201%201%202v2h-3l-1-1c1%200%200-2-2-3l-3-2-2%203c-2%202-4%202-4-2l-1-1-1%203h-2l-1%201%203%201h2l2%201%202%201-1%201c-3-1-2%201%200%203%202%201%202%202%201%203l-2-1-2-3-1-2c0-1-1-2-2-1-3%200-3%200-2%201v5c-2%202%2010%2020%2012%2018l1%201v1h2l1%201v1l1%201c1-1%202%200%202%201l2%201h1c0%201%207%203%208%202%200-1%205%200%207%202h2c0-2%202-3%202-2v2c2%201%208%200%206-1h-4l2-2h10c2%200%203%200%202-1l2-1%201-2%201-2%204-1c5-1%2013%202%2015%206%204%209%2016%2014%2027%2010%208-3%207-3%206%201-3%204-5%2016-4%2017l1-1%202-1v-1l1-1h3c0-1%201-2%203-2%202%201%2011-5%2011-6l-4%201-4%202c0-1%201-2%203-2l4-3%202-2v2h2c2-1%203-3%200-3v-2l2-3c0-2%204-6%204-5h4v-1c0-2-1-2-2-1h-1l1-1v-1l3-3c3-2%204-1%202%201v1l3-3%204-3%202-2c0-1-1-2-2-1l-1-1%203-1%202-1v-1l1-1c1-1%201-1-1-1-3%200-7%204-6%206%201%201%200%201-1%201l-3%202-2%201%202-3c3-3%205-7%203-7l-3%203c-1%202-3%203-3%202v2h-1c-1-1-2-1-3%201h-2l2-2-1-2v-1c1%201%202%200%203-1l1-2h2v-2c-2-2-10%203-16%209l-5%205v-5c0-9-5-18-12-21-6-2-13-3-15-2-1%201-1%201%201%201l2%202h1c2-2%203-1%202%201l1%202%201%201v1l1%201h-1c-2-1-3%200-1%202l-2%202-4%204h-2c1-1%200-2-1-2l-1%201c1%201-2%202-6%202a235%20235%200%2000-7-2h2c2%200%201-4-1-6h-2c-1%201-1%201-1-1l2-3c2-1%203-9%202-9v-3c2-7-2-18-9-25l-5-5c-1-2-2-3-3-2l-3-1c-1-1-3-2-4-1l-2-1c1-2-2-2-2-1m198%2046c-6%201-7%204-3%204l3%203v4h-1v2c-1-1-3%205-2%206%202%201%2011-17%209-19h-6m-20%203l-18%2012-4%204-4-3c-7-6-10-6-12-1l-2%203-1%204-3%202v1h2l-1%201-2%202-3%204c-2%201-3%203-2%203l-1%201v1l-1%201c-1-1-1%200-1%201l-2%203-1%203c1%201%200%201-1%201-3%200-6%204-5%205l-2%203c-3%201-6%205-6%207v1l-2-1-2-1%201%202%201%202-2-1-4%202c-2%201-3%203-2%203l-1%201c-2%200-7%203-6%204l-4%201-1%201-1%202-2%201h-1l-2%201v3l-1%201c-1-1-5%200-7%202l-3%201h-6c0%202-2%202-2%201-1-3-3-2-3%200-1%202%202%209%203%2010v3c-2%202-1%203%201%201h1l-7%208a126%20126%200%2000-11%2011c0-2-3-1-8%205-10%2011-12%2015-11%2016s1%201%206-6c1-2%203-3%203-2l1-1v-1h1c2%200%201%201-2%205-5%207-4%2011%202%2011%206-1%2022-10%2021-11%200-2-1-1-7%201-7%204-11%205-13%204-2%200-2-3%200-4l1-1%204-7%203-7c1-1%2016-17%2017-16l-4%205c-6%206-11%2013-10%2014l-1%201h-1v1l-1%202-1%201-2%201%201%201%201%201c1%203%205%202%2012-1l4-2%2013-8%201-1c0%201%202%200%202-2l2-2%203%202%205%203c3%200%203%200%201%202v1l2-1h7c21%205%2042-1%2057-14%205-4%2010-7%209-4-1%201%203%202%205%201h1c0%202%203%203%209%204%203%201%206%200%204-1l-1-2h1c2%202%202%202%205%201%204-2%2012-2%2012%200s6%206%2010%206c5%200%2014%203%2012%204l-8%201c-5%201-6%202-4%202l5%201h4l4%202h-2l-2%201-1%201-1-1h-5l-3-1-4%201h-2l-3-3c-1-5-8-9-11-6-1%202-3%2011-1%2010%201-1%204%204%203%206l-3%203-3%201%202%203c11%2019%2031%2027%2053%2023%2012-2%2029-13%2028-18v-2c2%200%206-5%205-6v-1c2%200%203%202%203%204%202%205%2012%2011%2012%207l-4-3c-4-2-6-4-3-5%201-1%201-4-1-4-1%201-1%200-1-2%200-1%203-1%207%201l2-1-5-3-4-3v-4l1-2v-19l-6-14-1-1-7-11a58%2058%200%2000-50-11c-12%204-19%2011-12%2011v1c-2%201%200%201%204%201l7-1v-1l1%201%201%201h4a61%2061%200%200013%203c6%200%2020%206%2021%207%201%202%200%202-3%201l-26-1a163%20163%200%2001-27%200h-4l-5-4c-4-3-6-3-10-2-1%201-3%200-4-1-2-2-2-2-1-9l1-13-1-6%208-9%208-10v-1c2%201%204-1%203-2l-5%203-4%203h-1l-1%202v1l-5%205-1%201h-4l1-2v-1c-2%200-3-2%200-2l1-2h-1c-3%202-2%200%201-4%204-5%207-11%206-11l-5%207-6%206c-1%200-6-10-5-11%201-2%2013-8%2014-7l2%201v-2c1-2%202-1%202%201s2%204%204%203v-2c-1-1-1-3%201-3l1%201%203-2%201-4h-2l-1-2c-2%200-20%207-21%209h-1l-1%201c1%200-4%204-6%204s13-11%2025-18l2-2-9%204-9%205c0-1%201-2%2010-7%205-3%206-4%204-4-1-1-3%200-5%201m0%2082c-1%201%200%201%202%201%203%200%206%203%204%206l-1-1c0-1-1-2-4-1l-3%202c0%201%204%204%206%204l3%202c0%202%201%202%202%200l2-4c3-3%202-6-2-8-3-2-9-3-9-1m56%205c-3%202-14%202-16%201h-22l-1%201-1%201c0%202%205%203%2011%203%207%200%2015%202%2011%203h11l7-2%203-1-3-1-3-1%203-2%204-3-4%201m-174%2022l-2%205-1%204-1-1c1-3%200-2-3%200-2%203-1%205%201%204%201-1%201%200%201%201l1%202v-1l1-1c1%201%201%200%201-1%200-2%200-2%201-1%200%203%203%202%2011-2s8-4%203-8c-4-5-5-5-7-2-1%202-4%202-3-1%201-2-1-1-3%202M0%20324v37h401v-75H0v38m273-19l-1%203c1%201%200%203-1%205-2%204%200%207%208%207%205-1%206-1%204-3v-5l-1%202c0%202-1%201-5-2-4-4-3-6%201-6l2-1c-1-2-6-1-7%200m-213%205c-4%203-1%2011%204%2010%201-1%202%200%202%201s-3%202-5%201l-2%201h8l1-8v-6l-3-1c-3%200-4%201-5%202m126%200c-3%204-1%2011%204%2010h3c0%202-3%203-5%203h-2l3%201c5%200%206-2%206-10v-6h-4l-5%202m51%206l1%208%201-2c0-2%201-3%203-3%205%201%207-4%205-8-1-2-2-3-6-3h-4v8M36%20334c-4%203-1%2011%204%2010%201-1%202%200%202%201s-3%202-5%201l-2%201h8l1-8v-6l-3-1c-3%200-4%201-5%202'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"seo":{"src":"/static/8d0121465a537b8fbe67dfe613c29ab7/6050d/cover.png"}}},{"id":"a40c3f4d-6dd1-5d6a-acd0-074c684dceb3","slug":"/react-server-components-and-the-future-of-full-stack-react","secret":false,"title":"React Server Components and the Future of Full-Stack React","author":"Luke Celitan","date":"June 29th, 2025","dateForSEO":"2025-06-29T00:00:00.000Z","timeToRead":6,"excerpt":"A comprehensive deep-dive into React Server Components, streaming SSR, selective hydration, performance, migration strategies, best practices for data fetching, and building production-ready apps with Next.js 14+.","subscription":true,"body":"var _excluded = [\"components\"];\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n/* @jsxRuntime classic */\n/* @jsx mdx */\n\nvar _frontmatter = {\n  \"title\": \"React Server Components and the Future of Full-Stack React\",\n  \"excerpt\": \"A comprehensive deep-dive into React Server Components, streaming SSR, selective hydration, performance, migration strategies, best practices for data fetching, and building production-ready apps with Next.js 14+.\",\n  \"date\": \"2025-06-29T00:00:00.000Z\",\n  \"hero\": \"react.png\",\n  \"author\": \"Luke Celitan\",\n  \"category\": \"Post\",\n  \"tech\": [\"ReactIcon\", \"Nodejs\", \"TS\"]\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n    props = _objectWithoutProperties(_ref, _excluded);\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"h1\", {\n    \"id\": \"react-server-components-and-the-future-of-full-stack-react\"\n  }, \"React Server Components and the Future of Full-Stack React\"), mdx(\"h2\", {\n    \"id\": \"introduction\"\n  }, \"Introduction\"), mdx(\"p\", null, \"The React ecosystem has always been at the forefront of web innovation, from pioneering client-side rendering (CSR) to enabling server-side rendering (SSR) and static site generation (SSG). But as web applications grow in complexity and user expectations for speed and interactivity soar, traditional rendering models start to show their limitations. Enter React Server Components (RSC)\\u2014a paradigm shift that promises to redefine how we build, ship, and scale full-stack React applications.\"), mdx(\"p\", null, \"In this deep-dive, I\\u2019ll walk you through the architecture of React Server Components, the mechanics of streaming SSR and selective hydration, performance implications, migration strategies, best practices for data fetching, and how to build production-ready applications with Next.js 14+. We\\u2019ll explore real-world code, performance metrics, and advanced concepts, all while keeping an eye on the future of full-stack React.\"), mdx(\"h2\", {\n    \"id\": \"react-rendering-models-a-brief-history\"\n  }, \"React Rendering Models: A Brief History\"), mdx(\"p\", null, \"Before we dive into RSC, let\\u2019s set the stage with a quick overview of React\\u2019s rendering models:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Client-Side Rendering (CSR):\"), \" The browser downloads a JavaScript bundle and renders everything on the client. Fast interactivity, but slow initial load and SEO challenges.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Server-Side Rendering (SSR):\"), \" The server renders HTML for each request, improving initial load and SEO, but often at the cost of slower interactivity and heavier server load.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Static Site Generation (SSG):\"), \" HTML is pre-rendered at build time, offering fast loads and great SEO, but limited to content that doesn\\u2019t change frequently.\")), mdx(\"p\", null, \"Each model has trade-offs. The React team\\u2019s goal with RSC is to combine the best of all worlds: minimal JavaScript shipped to the client, fast initial loads, seamless interactivity, and a first-class developer experience.\"), mdx(\"h2\", {\n    \"id\": \"the-motivation-for-react-server-components\"\n  }, \"The Motivation for React Server Components\"), mdx(\"p\", null, \"Why do we need Server Components? The answer lies in the ever-increasing complexity of web apps and the demand for both performance and maintainability. Traditional SSR and SSG approaches still require shipping large JavaScript bundles to the client, even for non-interactive UI. RSC allows us to:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Reduce bundle size\"), \" by keeping non-interactive logic on the server (20-30% smaller on average)\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Fetch data closer to the source\"), \" (database, APIs) without exposing secrets\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Progressively enhance\"), \" the UI, ensuring core functionality works even without JavaScript\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Stream content\"), \" to the browser for faster Time to First Byte (TTFB)\")), mdx(\"p\", null, \"With Next.js 14+ embracing RSC as a first-class citizen, the future of full-stack React is here.\"), mdx(\"h2\", {\n    \"id\": \"react-server-components-architecture\"\n  }, \"React Server Components Architecture\"), mdx(\"h3\", {\n    \"id\": \"what-are-server-components\"\n  }, \"What Are Server Components?\"), mdx(\"p\", null, \"Server Components are React components that run exclusively on the server. They can fetch data, access server-side resources, and return serialized UI to the client. Unlike traditional SSR, Server Components never ship their logic or dependencies to the browser\\u2014only the rendered result.\"), mdx(\"h4\", {\n    \"id\": \"server-vs-client-components\"\n  }, \"Server vs. Client Components\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Server Components:\"), \" Run on the server, can access databases, secrets, and APIs. Never included in the client bundle.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Client Components:\"), \" Run in the browser, handle interactivity, and can use browser APIs. Marked with \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"'use client'\"), \" at the top of the file.\")), mdx(\"p\", null, \"This separation is enforced by the \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"boundary pattern\"), \"\\u2014a clear demarcation between server and client logic.\"), mdx(\"h4\", {\n    \"id\": \"the-boundary-pattern\"\n  }, \"The Boundary Pattern\"), mdx(\"p\", null, \"A Server Component can render Client Components, but not vice versa. This ensures that sensitive logic and data fetching stay on the server, while interactivity is handled on the client.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-tsx\"\n  }, \"// app/components/UserProfile.server.tsx\\nimport { getUserFromDB } from '@/lib/db';\\nimport UserAvatar from './UserAvatar'; // Client Component\\n\\nexport default async function UserProfile({ userId }: { userId: string }) {\\n  const user = await getUserFromDB(userId);\\n  return (\\n    <div>\\n      <h2>{user.name}</h2>\\n      <UserAvatar user={user} />\\n    </div>\\n  );\\n}\\n\")), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-tsx\"\n  }, \"// app/components/UserAvatar.tsx\\n'use client';\\n\\nexport default function UserAvatar({ user }) {\\n  return <img src={user.avatarUrl} alt={user.name} />;\\n}\\n\")), mdx(\"h4\", {\n    \"id\": \"the-data-cascade-pattern\"\n  }, \"The Data Cascade Pattern\"), mdx(\"p\", null, \"Server Components fetch data as close to the source as possible, reducing network hops and improving security. This is known as the \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"data cascade pattern\"), \"\\u2014data flows from the server down to the client, never the other way around.\"), mdx(\"h4\", {\n    \"id\": \"progressive-enhancement\"\n  }, \"Progressive Enhancement\"), mdx(\"p\", null, \"Because Server Components render to HTML on the server, your app\\u2019s core functionality works even if JavaScript fails to load. This is a huge win for accessibility and resilience.\"), mdx(\"h3\", {\n    \"id\": \"minimal-server-component-example\"\n  }, \"Minimal Server Component Example\"), mdx(\"p\", null, \"Here\\u2019s a simple Server Component that fetches data from a database:\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-tsx\"\n  }, \"// app/components/PostsList.server.tsx\\nimport { getPosts } from '@/lib/db';\\n\\nexport default async function PostsList() {\\n  const posts = await getPosts();\\n  return (\\n    <ul>\\n      {posts.map(post => (\\n        <li key={post.id}>{post.title}</li>\\n      ))}\\n    </ul>\\n  );\\n}\\n\")), mdx(\"h2\", {\n    \"id\": \"streaming-ssr-and-selective-hydration\"\n  }, \"Streaming SSR and Selective Hydration\"), mdx(\"h3\", {\n    \"id\": \"how-streaming-ssr-works\"\n  }, \"How Streaming SSR Works\"), mdx(\"p\", null, \"React 18+ and Next.js 14+ introduce \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"streaming SSR\"), \"\\u2014the ability to send HTML to the browser as soon as it\\u2019s ready, rather than waiting for the entire page to render. This dramatically improves TTFB (by 40-60% in benchmarks) and enables progressive rendering.\"), mdx(\"h4\", {\n    \"id\": \"suspense-boundaries-for-streaming\"\n  }, \"Suspense Boundaries for Streaming\"), mdx(\"p\", null, \"React\\u2019s \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"<Suspense>\"), \" component lets you define loading boundaries. When a Server Component is waiting for data, React streams the rest of the page and fills in the Suspense boundary when data arrives.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-tsx\"\n  }, \"// app/page.tsx\\nimport PostsList from './components/PostsList.server';\\nimport { Suspense } from 'react';\\n\\nexport default function HomePage() {\\n  return (\\n    <main>\\n      <h1>Welcome!</h1>\\n      <Suspense fallback={<div>Loading posts...</div>}>\\n        <PostsList />\\n      </Suspense>\\n    </main>\\n  );\\n}\\n\")), mdx(\"h3\", {\n    \"id\": \"selective-hydration\"\n  }, \"Selective Hydration\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Selective hydration\"), \" means React only hydrates (activates) the parts of the page that need interactivity. This reduces JavaScript execution time by up to 50% compared to hydrating the entire page.\"), mdx(\"h4\", {\n    \"id\": \"example-selective-hydration-in-practice\"\n  }, \"Example: Selective Hydration in Practice\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-tsx\"\n  }, \"// app/components/InteractiveButton.tsx\\n'use client';\\n\\nexport default function InteractiveButton() {\\n  const [count, setCount] = useState(0);\\n  return <button onClick={() => setCount(count + 1)}>Clicked {count} times</button>;\\n}\\n\\n// Used inside a Server Component\\nimport InteractiveButton from './InteractiveButton';\\n\\nexport default function SomeServerComponent() {\\n  return (\\n    <div>\\n      <h2>Server-rendered content</h2>\\n      <InteractiveButton /> {/* Only this part is hydrated! */}\\n    </div>\\n  );\\n}\\n\")), mdx(\"h2\", {\n    \"id\": \"performance-implications\"\n  }, \"Performance Implications\"), mdx(\"h3\", {\n    \"id\": \"key-metrics\"\n  }, \"Key Metrics\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Bundle size reduction:\"), \" 20-30% smaller client bundles\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"TTFB:\"), \" 40-60% faster with streaming SSR\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"JavaScript execution time:\"), \" Up to 50% less due to selective hydration\")), mdx(\"h3\", {\n    \"id\": \"how-rsc-impacts-performance\"\n  }, \"How RSC Impacts Performance\"), mdx(\"p\", null, \"By moving non-interactive logic to the server, you ship less JavaScript, reduce parse/execute time, and improve both initial load and runtime performance. Data fetching on the server is faster and more secure, and streaming SSR ensures users see content sooner.\"), mdx(\"h3\", {\n    \"id\": \"caching-strategies\"\n  }, \"Caching Strategies\"), mdx(\"p\", null, \"Server-rendered components can be cached at multiple levels:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Database/query caching:\"), \" Cache expensive queries on the server\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Edge caching:\"), \" Use CDN or edge functions to cache rendered HTML\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Component-level caching:\"), \" Next.js 14+ supports \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"revalidate\"), \" and \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"cache\"), \" options for granular control\")), mdx(\"h4\", {\n    \"id\": \"example-caching-a-server-component\"\n  }, \"Example: Caching a Server Component\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-tsx\"\n  }, \"// app/components/ExpensiveData.server.tsx\\nimport { cache } from 'react';\\n\\nconst getExpensiveData = cache(async () => {\\n  // Expensive DB call\\n});\\n\\nexport default async function ExpensiveData() {\\n  const data = await getExpensiveData();\\n  return <div>{data.value}</div>;\\n}\\n\")), mdx(\"h3\", {\n    \"id\": \"monitoring-and-debugging\"\n  }, \"Monitoring and Debugging\"), mdx(\"p\", null, \"Monitoring performance across server and client boundaries is crucial. Next.js provides built-in analytics, and you can add custom logging for deeper insights.\"), mdx(\"h4\", {\n    \"id\": \"example-custom-performance-logging\"\n  }, \"Example: Custom Performance Logging\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-tsx\"\n  }, \"// app/api/log-performance.ts\\nexport async function logPerformance(metric: string, value: number) {\\n  // Send to your logging backend\\n}\\n\\n// Usage in a Server Component\\nimport { logPerformance } from '@/app/api/log-performance';\\n\\nawait logPerformance('db_query_time', queryTime);\\n\")), mdx(\"h2\", {\n    \"id\": \"migration-strategies-from-traditional-react-apps\"\n  }, \"Migration Strategies from Traditional React Apps\"), mdx(\"h3\", {\n    \"id\": \"analyzing-components-for-migration\"\n  }, \"Analyzing Components for Migration\"), mdx(\"p\", null, \"Not all components should become Server Components. Start by identifying:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Pure UI components\"), \" with no interactivity \\u2192 Server Components\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Data-fetching components\"), \" \\u2192 Server Components\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Interactive components\"), \" (forms, buttons) \\u2192 Client Components\")), mdx(\"h3\", {\n    \"id\": \"handling-state-management\"\n  }, \"Handling State Management\"), mdx(\"p\", null, \"Libraries like Redux or Zustand must be used within Client Components. Use the boundary pattern to isolate stateful logic.\"), mdx(\"h4\", {\n    \"id\": \"example-client-boundary-for-state-management\"\n  }, \"Example: Client Boundary for State Management\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-tsx\"\n  }, \"// app/components/Counter.tsx\\n'use client';\\nimport { useSelector, useDispatch } from 'react-redux';\\n\\nexport default function Counter() {\\n  // Redux logic here\\n}\\n\")), mdx(\"h3\", {\n    \"id\": \"dealing-with-third-party-libraries\"\n  }, \"Dealing with Third-Party Libraries\"), mdx(\"p\", null, \"Some libraries (e.g., those that access the DOM or window) are not compatible with Server Components. Wrap them in Client Components.\"), mdx(\"h3\", {\n    \"id\": \"step-by-step-migration-plan\"\n  }, \"Step-by-Step Migration Plan\"), mdx(\"ol\", null, mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Audit your codebase:\"), \" Identify which components can move to the server\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Refactor data fetching:\"), \" Move API/database calls to Server Components\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Isolate interactivity:\"), \" Mark interactive components with \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"'use client'\")), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Test boundaries:\"), \" Ensure data flows correctly from server to client\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Monitor performance:\"), \" Use metrics to validate improvements\")), mdx(\"h4\", {\n    \"id\": \"example-refactoring-a-traditional-component\"\n  }, \"Example: Refactoring a Traditional Component\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Before:\")), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-tsx\"\n  }, \"// Old: Client-side data fetching\\nimport { useEffect, useState } from 'react';\\n\\nexport default function Posts() {\\n  const [posts, setPosts] = useState([]);\\n  useEffect(() => {\\n    fetch('/api/posts').then(res => res.json()).then(setPosts);\\n  }, []);\\n  return <ul>{posts.map(p => <li key={p.id}>{p.title}</li>)}</ul>;\\n}\\n\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"After:\")), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-tsx\"\n  }, \"// New: Server Component\\nimport { getPosts } from '@/lib/db';\\n\\nexport default async function Posts() {\\n  const posts = await getPosts();\\n  return <ul>{posts.map(p => <li key={p.id}>{p.title}</li>)}</ul>;\\n}\\n\")), mdx(\"h2\", {\n    \"id\": \"best-practices-for-data-fetching\"\n  }, \"Best Practices for Data Fetching\"), mdx(\"h3\", {\n    \"id\": \"server-vs-client-data-fetching\"\n  }, \"Server vs. Client Data Fetching\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Server Components:\"), \" Fetch data directly from the database or API. Never expose secrets or credentials to the client.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Client Components:\"), \" Fetch data only when interactivity or real-time updates are needed.\")), mdx(\"h3\", {\n    \"id\": \"using-the-data-cascade-pattern\"\n  }, \"Using the Data Cascade Pattern\"), mdx(\"p\", null, \"Let data flow from the server down to the client. Avoid fetching data in Client Components if it can be fetched on the server.\"), mdx(\"h3\", {\n    \"id\": \"error-boundaries-for-robust-data-fetching\"\n  }, \"Error Boundaries for Robust Data Fetching\"), mdx(\"p\", null, \"Use error boundaries to catch and handle errors gracefully at both server and client boundaries.\"), mdx(\"h4\", {\n    \"id\": \"example-error-handling-in-server-components\"\n  }, \"Example: Error Handling in Server Components\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-tsx\"\n  }, \"// app/components/ErrorBoundary.tsx\\n'use client';\\nimport { ErrorBoundary } from 'react-error-boundary';\\n\\nexport default function MyErrorBoundary({ children }) {\\n  return (\\n    <ErrorBoundary fallback={<div>Something went wrong.</div>}>\\n      {children}\\n    </ErrorBoundary>\\n  );\\n}\\n\")), mdx(\"h3\", {\n    \"id\": \"security-considerations\"\n  }, \"Security Considerations\"), mdx(\"p\", null, \"Never leak secrets or sensitive data to the client. Always keep authentication and authorization logic on the server.\"), mdx(\"h4\", {\n    \"id\": \"example-secure-data-fetching\"\n  }, \"Example: Secure Data Fetching\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-tsx\"\n  }, \"// app/components/AdminPanel.server.tsx\\nimport { getAdminData } from '@/lib/secure-db';\\n\\nexport default async function AdminPanel({ userId }) {\\n  const data = await getAdminData(userId); // Only runs on the server\\n  return <div>{data.secretInfo}</div>;\\n}\\n\")), mdx(\"h2\", {\n    \"id\": \"building-production-ready-apps-with-nextjs-14\"\n  }, \"Building Production-Ready Apps with Next.js 14+\"), mdx(\"h3\", {\n    \"id\": \"nextjs-14-features-supporting-rsc\"\n  }, \"Next.js 14+ Features Supporting RSC\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"App directory:\"), \" Enables file-based routing with Server and Client Components\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Streaming:\"), \" Out-of-the-box support for streaming SSR\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Granular caching:\"), \" Control over revalidation and cache lifetimes\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Edge and serverless deployment:\"), \" Deploy at the edge for global performance\")), mdx(\"h3\", {\n    \"id\": \"caching-incremental-adoption-and-deployment\"\n  }, \"Caching, Incremental Adoption, and Deployment\"), mdx(\"p\", null, \"Adopt RSC incrementally\\u2014migrate a few pages or components at a time. Use Next.js\\u2019s caching primitives to optimize performance.\"), mdx(\"h4\", {\n    \"id\": \"example-nextjs-14-app-structure\"\n  }, \"Example: Next.js 14+ App Structure\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\"\n  }, \"/app\\n  /page.tsx           // Server Component (default)\\n  /layout.tsx         // Server Component\\n  /components\\n    /NavBar.tsx       // Server Component\\n    /LoginButton.tsx  // Client Component ('use client')\\n\")), mdx(\"h4\", {\n    \"id\": \"example-caching-and-error-boundaries\"\n  }, \"Example: Caching and Error Boundaries\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-tsx\"\n  }, \"// app/components/CachedData.server.tsx\\nimport { cache } from 'react';\\n\\nconst getData = cache(async () => { /* ... */ });\\n\\nexport default async function CachedData() {\\n  try {\\n    const data = await getData();\\n    return <div>{data.value}</div>;\\n  } catch (e) {\\n    return <div>Error loading data.</div>;\\n  }\\n}\\n\")), mdx(\"h3\", {\n    \"id\": \"monitoring-logging-and-debugging\"\n  }, \"Monitoring, Logging, and Debugging\"), mdx(\"p\", null, \"Use Next.js analytics, custom logging, and error boundaries to monitor production issues across server and client boundaries.\"), mdx(\"h3\", {\n    \"id\": \"real-world-case-study-example-app-structure\"\n  }, \"Real-World Case Study: Example App Structure\"), mdx(\"p\", null, \"Imagine a SaaS dashboard:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Server Components:\"), \" Fetch and render user data, analytics, reports\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Client Components:\"), \" Handle charts, forms, and real-time updates\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Streaming:\"), \" Stream dashboard widgets as data loads\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Caching:\"), \" Cache expensive analytics queries\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Error boundaries:\"), \" Isolate failures to individual widgets\")), mdx(\"h2\", {\n    \"id\": \"advanced-concepts-and-future-outlook\"\n  }, \"Advanced Concepts and Future Outlook\"), mdx(\"h3\", {\n    \"id\": \"edge-rendering-and-serverless-deployment\"\n  }, \"Edge Rendering and Serverless Deployment\"), mdx(\"p\", null, \"With RSC, you can deploy your app to edge runtimes (e.g., Vercel Edge Functions), bringing your UI closer to users for ultra-low latency.\"), mdx(\"h3\", {\n    \"id\": \"integration-with-other-frameworks-and-apis\"\n  }, \"Integration with Other Frameworks and APIs\"), mdx(\"p\", null, \"RSC is framework-agnostic at its core. You can integrate with REST, GraphQL, or even legacy APIs, as long as data fetching happens on the server.\"), mdx(\"h3\", {\n    \"id\": \"the-evolving-react-ecosystem\"\n  }, \"The Evolving React Ecosystem\"), mdx(\"p\", null, \"Expect more libraries and tools to embrace RSC, with improved developer tooling, debugging, and performance monitoring. The boundary between server and client will become even more seamless.\"), mdx(\"h2\", {\n    \"id\": \"troubleshooting-and-common-pitfalls\"\n  }, \"Troubleshooting and Common Pitfalls\"), mdx(\"h3\", {\n    \"id\": \"debugging-serverclient-boundary-issues\"\n  }, \"Debugging Server/Client Boundary Issues\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Hydration mismatches:\"), \" Ensure server and client render the same initial markup\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Unsupported libraries:\"), \" Wrap DOM-dependent libraries in Client Components\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Data leaks:\"), \" Never pass sensitive data from server to client unintentionally\")), mdx(\"h3\", {\n    \"id\": \"handling-hydration-mismatches\"\n  }, \"Handling Hydration Mismatches\"), mdx(\"p\", null, \"If you see hydration warnings, check that your Server Components don\\u2019t use browser-only APIs or non-deterministic data.\"), mdx(\"h3\", {\n    \"id\": \"dealing-with-unsupported-libraries\"\n  }, \"Dealing with Unsupported Libraries\"), mdx(\"p\", null, \"If a library doesn\\u2019t support SSR or RSC, isolate it in a Client Component and lazy-load if possible.\"), mdx(\"h2\", {\n    \"id\": \"conclusion\"\n  }, \"Conclusion\"), mdx(\"p\", null, \"React Server Components represent a major leap forward for full-stack React development. By moving non-interactive logic to the server, embracing streaming SSR, and adopting selective hydration, you can build faster, more secure, and more maintainable applications. Next.js 14+ makes this future accessible today, with robust support for RSC, streaming, and edge deployment.\"), mdx(\"p\", null, \"Migrating to RSC requires careful planning, but the performance and developer experience gains are well worth the effort. As the React ecosystem evolves, expect even more powerful abstractions and tools to emerge\\u2014making full-stack React development more productive and enjoyable than ever.\"), mdx(\"p\", null, \"Ready to take the plunge? Start experimenting with Server Components in your Next.js 14+ app, and join the next wave of web innovation!\"));\n}\n;\nMDXContent.isMDXComponent = true;","tech":["ReactIcon","Nodejs","TS"],"category":"Post","appDescription":null,"hero":{"full":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsSAAALEgHS3X78AAAD80lEQVQ4y3WTa0yTZxTH3yVgogtjyjI0NVxliuIEHXPrJxLcJgui+0Ky6Bg3QVKKg0LLuBRKpTVhiCZsFEEyI1NcwAUGIbKQLCHOxbDEoJmYIIuGywoLbUFkUNrf3r60QJ2c5LzP857L//mfc55HcDqdOAFpdbJOPXZwOBzS3iOO1VjnmroxBNcH98968QS6xDY7y9LSEpOTk9J+eXlZVIfkn59/4RXvBfg/hm7fwsIChUVFKBQKGk2N3Lr1k2SfmZnBYrWu5ItVuERweAF6s3W4g8xmMzKZjM1btvBWQABxcXE8ePCQifEJHg0PMyEyZ6OSna844KGYXFxcTHx8PFlZWbS2/sDQ0BA1NTUEBQXR3d0jxblasSFDl9MlAwMDZGZkUl9fT1dXFz09PTQ0NHA04Sg+vr4SW6vNtsZwI0C73S7tTSYTIaGhBIeESGXLZDt5Z/dutu/YQXR0DAaDYbU9GwK6nJ7+ucRoNCIIAlu3bWVfVBRvBwYil8tpa7spMv+Wp0+freat6yFeg/AMIzc3lwt1ddRdvEhnZyft7e2kpqai1+vR6XSUlZaJV8r+iqGsA5uamkKtVrMrIgLfTZs4efIUtbW1ZGRk8F5sLImJiSQnJ/PRkSO0tLR4l/zyFVlcXKS62sAb/v74+flx/PgJlEqlOAAfqezEY8cYHBwUJ9tNb2+v++U41i62Y91EXczS0tKkyRXkF5CQkMDdu7+LAH8QGbmX9PR0Ojo6sMxYGBsbZ/6F+5U41p6g4HpCLpmemkZdpKawsJCRkRGezz3n+vUbEpNnYtNV4gHDw4+l2OysbELDwsRr9PPK/bMvr4CKKngG0NffR/+v/V7vOSUtheCwYJI+S6Lu0gXGJscku1an5bD8ML23e3lZhKYvr9CceoXvM65yQ9FG46nLXP6iCZO4KqPzUBzI5ePNn/DVoXy++7yBq6evUZP0jeQzfnpejG+iKaVZzGmWVuHM67lUxugpidSiCtJQskeLJryU4ogyyvfo0McYqZHXoXv3HKWRFZLv613lVEUbUMk0pL+WRaZvDpk+ZyQVzgaqqJafR/++gbKoSioP6qUDqg5Voz2gQxstgn5olPxVsdWiGjj3gVG0V5EfWIRyW76kijfPSioUhhSLiVWU7q0QGWipEMHK9+tQhWtQh5eIwCsHle7XrsZVHhTZ7tNy2j+HnAAledsLUO3UUCBTI9j+mcNqtmEzz2KbmsUyacU+t0znj11UaCq41tRK580uHt1/vOL/28qibYn+nn7ysvMwXWrkz/vDLNj+xTY9uzbl9TI+MYZ52sy9wXv0/XKbO7/dYX5h3ivGYrMw+tcoT0afsGhfWrX/B0P/4UFQzLU/AAAAAElFTkSuQmCC","aspectRatio":1,"src":"/static/7a5e4b3bb1f6af2388a2ec91d4706e25/a1946/react.png","srcSet":"/static/7a5e4b3bb1f6af2388a2ec91d4706e25/5b37e/react.png 236w,\n/static/7a5e4b3bb1f6af2388a2ec91d4706e25/49058/react.png 472w,\n/static/7a5e4b3bb1f6af2388a2ec91d4706e25/a1946/react.png 944w,\n/static/7a5e4b3bb1f6af2388a2ec91d4706e25/6050d/react.png 1200w","srcWebp":"/static/7a5e4b3bb1f6af2388a2ec91d4706e25/99fbb/react.webp","srcSetWebp":"/static/7a5e4b3bb1f6af2388a2ec91d4706e25/77392/react.webp 236w,\n/static/7a5e4b3bb1f6af2388a2ec91d4706e25/1f177/react.webp 472w,\n/static/7a5e4b3bb1f6af2388a2ec91d4706e25/99fbb/react.webp 944w,\n/static/7a5e4b3bb1f6af2388a2ec91d4706e25/9000d/react.webp 1200w","sizes":"(max-width: 944px) 100vw, 944px","tracedSVG":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='400'%20height='400'%20viewBox='0%200%20400%20400'%20preserveAspectRatio='none'%3e%3cpath%20d='M189%2021l5%2025%206%2024-3%203c-3%204-2%208%202%208l4%203c1%203%203%204%205%203h1l3%201%2013%204-5%203c-7%205-7%206-7%204%201-2-2-4-10-5l-4-1c0-3-4-3-8-1-5%202-5%205-1%204l4-2h1l7%203%206%201-7%203-6%202-8-2-7-1-3%204c-3%203-7%2015-7%2019v8l2%207c0%201%201%202%203%202%206%202%207%201%207-2%201-4%202-3%203%201l1%205%202%203v1l1%202%203%203c1%200%202%201%202%204l4%208%202%205h-3l-5%203c-2%201-2%201-6-5s-6-7-11-3c-3%203-4%203-6%202h-4c-1%202-1%202%201%202h3l-2%202c-3%202-6%202-4-1v-1l-2%202-1%202-3%201-3%202-5%203c-3%202-5%203-6%202l-2%201c1%201%200%202-2%202l-2-1-1-1-1%202c1%201%200%201-2%201-7%200-8%200-6%201%201%201%201%201-1%201l-2%201c1%201-4%205-6%205-1-1-7%202-7%203%200%204%205%205%209%202%202-3%202-3%203-1v2c-6%204-13%2011-11%2011%201%201%202%200%205-2l4-2-18%2016c-14%209-15%209-22%205-7-5-11-2-4%204%204%204%204%203-5%2012-4%204-8%207-7%208h-2c1%200%200%202-2%203l-1%203%201-1%2025-18-7%207-13%2010-14%2010c-1%201-2%201-3-1h-3c-1%201%206%2010%208%2010l13-8a199%20199%200%200126-18h4c2-1%203-1%206%201h4c2-1%201-6%200-7-2%200-1-2%201-2l1-1%202-1%207-5c5-4%206-4%206-2l1%203%205%206c8%207%2010%207%2016%203%203-3%204-4%205-2h3l2-1c2%200%205-4%205-6-1-2%200-3%203-6l6-6c1-2%201-2%201%200-1%201%200%202%201%202l1-1c0-2%201-2%203-2s3%200%202-1c-5-2-5-8%200-11l1-3c0-2%202-1%202%202s1%204%203%204%203-1%205-6l4-6-1%203c-3%207-1%2020%204%2022v3l-2%202h1c1-2%202%202%201%206l-1%207c0%203%201%201%203-8l1-3c3%200%2014%2016%2014%2020l1%202c1-1%202%205%201%2010%200%204%203%207%204%204%201-2%202-3%204-3%201%200%202-1%201-8-2-15-2-16-1-16l1-2c0-1%200-2-1-1-2%200-2%200%200-4%201-4%201-5%203-4h1c0-1%200-2-1-1l-1-1c0-2%203-2%203-1%202%204%208%206%2016%205h8c1%200%201-1-1-8-2-9-1-17%203-17l1%201c-1%201%201%203%202%202v-6l-2-7%202%205c2%207%203%208%205%206v-4l-1-5c0-2%201%200%202%203l1%205%209-4h3l1-3v-3l1%202c1%203%203%204%204%202v-6c-3-8-3-8%202-7l6-1c2-2%203%200%201%201l-3%202c-3-2-5%201-2%203l1%203%201%204%204%207h1v1l5%201c6-1%207-1%2012-4%202-2%205-4%204-5h1l4-1%206-1c4%200%204%200%208-6%205-9%205-12%200-6-4%205-6%204-7-4%200-4%200-5%201-4l3-2c2-2%202-2%203%200%201%201%201%201%201-2l2-5%201-4%201-2%203-4%203-4%201-2c-2-6-14-12-19-10-2%201-2%201%202%201%209%200%206%204-3%204-6%201-7%200-6-1l3-1%202-1-2-1c-4%201-4%200%201-2%205-3%207-7%205-8s-1-2%202-2%203%200%203%204c-1%202-1%203%201%204%204%203%208%203%207%201%200-3-3-8-4-7s-4-3-3-4%200-2-5-3c-4-1-6-5-2-5%202%200%202%200%201-3l-1-3c2-1%203%202%203%205l2%204%201-2c-2-7-3-7%204-11%206-4%209-7%205-5-1%200-2-1-1-5l1-10c0-8%201-9%203-4%203%206%205%207%206%204v-3l-1-3c0-3-9-14-12-14-4-1-4%200%200%203%201%202%203%204%202%205l1%201h-7c-4-1-6-1-10%201l-4%201h-1v3h-1l-2%203-6%206-23%2014-3%201-4%201c-4%201-6-3-6-20%200-10%201-14%206-17l2-3c-1-1%200-2%201-2l-2-3-3-4-4-3-3-1v-8c2-19%202-24%201-21l-2%2014a279%20279%200%2001-1%2013l-5-1%202-1c6%200-3-7-17-13-17-9-26-8-36%201-4%203-4%203-2%204%201%201%201%201-1%201h-1l-1%201v1h-1c-1-1-6%209-6%2013%200%205-2-1-6-21l-5-20h-1m34%2017c-3%200-5%202-4%203l-1%201c-1-1-3%200-4%201v2l1-1c2-2%2011-2%2014%200%203%201%203%201%202%202v1c2-1%202-1%202%201-1%200-1%201%200%200l1%205h1c1-1%201-1%201%201h1c1-1%201-1%201%201%200%203%202%204%203%201%201-2%201-2%201%200l1-1%201-1%201%201c1%200%202%200%201%202%200%202%200%202%201%201l2-1%202%202%202%202c1%201%201%200%201-1%200-9-7-20-16-22h-15m74%2037c-6%202-8%2012-4%2017%206%205%2015%200%2015-9%200-6-6-10-11-8m-31%2015a58%2058%200%2001-21%205l-8%202-16%204-10%202-1%201-2%201-2%201%201%201v1h-2c0%203%200%204-3%204h-2l2-3%201-2a120%20120%200%2000-20%2019l2-1c4-3%2030-11%2035-10%202%201%2010%200%2019-2l21-3c9-1%2010-2%2010-10l2-9h-1l-4-1h-1m2%2021v2l-2-1-2-1-2%201%2012%2019c3%201%200-15-3-16l-1-1-1-3-1-2v2m38%2022l-2%205c-2%205-2%205%200%205s1%2010-2%2014c-2%203-7%205-11%204s-4-1-3%202c0%201%201%202%202%201%203-2%206%202%206%208%200%203%200%204%202%204v2l2-1%203-1c4%201%206%200%204-2-2-1-2-2%200-4l1-4c-1-1%201-5%202-5h1l1-3v-4l1-4c2-3%202-4%201-5l-1-3c1-2%200-4-2-6l-3-2-1-1h-1m13%2017l-3%203-2%204-2%204%203-1%204-1%206%203%205%204%202-5%201-6v-2c4-2-8-5-14-3m-76%2011c-12%202-13%202-13%205l-2%202c-17%204-21%204-21%202%200-1-2-1-6%201l-7%203c-4%201-4%205%200%2013%203%205%203%206%206%206l3-1c-1-1%200-2%204-3%2013-3%2026-5%2027-4%201%202%208-1%2015-8%208-9%209-9%2017-6a160%20160%200%200021%207c2%200%202%200%200-4s-7-7-9-5l-1-1-7-3-6-3-3-2h-6l-1-1-11%202m-111%2066l-3%204%204%205c4%204%206%205%207%204h4l2-1-2-2-2-4-2-3-3-4-1-2-4%203m149%2014c-6%201-11%203-11%204l-1%205c0%203%200%203-1%201l-2-3c-1%200-1%201%201%204%201%206%201%208-1%205l-1-5c0-2-2-1-2%202%200%202%200%202-2-1l-2-3c-2%203%208%2022%2011%2021v1c-2%202-2%202-1%206l2%206v2h-47v-2l-3-5-3-3%203-4%203-5c0-1-2%200-3%202-5%207-12%2014-12%2011l-1-3v1l-2%201c-1%200-2%200-1%201l-1%201-1-4c0-3-1-5-3-7-4-4-5-4-12-4-3%200-5-1-5-2l-2-3-3-4c-1-3-3-4-7-5-7-3-8-2-6%202l1%203c-1%201-5%200-7-1-2-2-7-5-11-6-2-1-2-1-2%203l-1%208a173%20173%200%2000-4%2024l-71%201H0v37l1%2038h126l2%204%207%207c5%203%206%205%203%205l-2%201-3%202c-3%200-3%200-1%201%205%201%209%202%208%203h13c2%200%202-1%202-2-1-3%205-3%207%200l3%202%201%201%202%203c1%201%205%200%208-4l3-1c4%201%204%200-1-2-3-2-3-2-1-2l6%201c4%202%203%201-1-2s-6-4-9-3l-1-1c0-2-13%201-16%204-2%202-4%201-4-2%201-2%201-4%203-4%201-1%200-1-2-1-4%201-6%200-6-4l-1-3c-1%200-2-1-1-2%200-1%2058-2%2058%200l-4%202-3%202%203%201c3%201%205%200%203-1-1-1-1-1%201-2l2-2c-3-2%2084-1%2088%201%202%201%203%201%202%202l-2%201-2%202%201%202%201%203%201%203v1c-1%201-1%201%201%201v1l-1%202c2%202%205%202%207%200l3-2%202-1h14l15-1c1-2%203%201%205%205s3%204%202%200l-1-5-3-4-3-2c0-2-3-1-3%201h-2l-4-1-3-1%202-1%202-1h-1l-1-1-1-2-3-1c-1-2%200-2%207-2%207-1%2010-1%207%201l-3%203c-1%203%200%204%205%202l-1-1c-1-1%200-1%203-1%209%200%209%200%209-2l-1-3h26c23%200%2026%200%2026-2l1-37v-36h-42c-41%200-49%200-46-2%201-1%201-2-1-5-3-10-3-10-1-19%201-7%201-10-2-16-2-5-4-6-4-2l-2%204c-2%201-2%201-4-1l-8-8-10%204m17%2017c-1%200-1%203%201%2010l2%209v2c2%202%202%204-1%205-2%202-2%202%203%202s6%200%206-2c-2-4-4-17-3-18v-2l-2-1-2-2c0-4-1-5-4-3M20%20311l1%207%201-3c0-2%200-3%202-3l3%203%203%203-1-3v-4c3-4%200-8-6-8h-3v8m170-3v14l1-2c0-1%201-2%203-2%207-1%206-11%200-11l-4%201m59%2022v14l1-3c0-4%203-4%206%200s4%203%201%200v-11h-8'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"regular":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsSAAALEgHS3X78AAAD80lEQVQ4y3WTa0yTZxTH3yVgogtjyjI0NVxliuIEHXPrJxLcJgui+0Ky6Bg3QVKKg0LLuBRKpTVhiCZsFEEyI1NcwAUGIbKQLCHOxbDEoJmYIIuGywoLbUFkUNrf3r60QJ2c5LzP857L//mfc55HcDqdOAFpdbJOPXZwOBzS3iOO1VjnmroxBNcH98968QS6xDY7y9LSEpOTk9J+eXlZVIfkn59/4RXvBfg/hm7fwsIChUVFKBQKGk2N3Lr1k2SfmZnBYrWu5ItVuERweAF6s3W4g8xmMzKZjM1btvBWQABxcXE8ePCQifEJHg0PMyEyZ6OSna844KGYXFxcTHx8PFlZWbS2/sDQ0BA1NTUEBQXR3d0jxblasSFDl9MlAwMDZGZkUl9fT1dXFz09PTQ0NHA04Sg+vr4SW6vNtsZwI0C73S7tTSYTIaGhBIeESGXLZDt5Z/dutu/YQXR0DAaDYbU9GwK6nJ7+ucRoNCIIAlu3bWVfVBRvBwYil8tpa7spMv+Wp0+freat6yFeg/AMIzc3lwt1ddRdvEhnZyft7e2kpqai1+vR6XSUlZaJV8r+iqGsA5uamkKtVrMrIgLfTZs4efIUtbW1ZGRk8F5sLImJiSQnJ/PRkSO0tLR4l/zyFVlcXKS62sAb/v74+flx/PgJlEqlOAAfqezEY8cYHBwUJ9tNb2+v++U41i62Y91EXczS0tKkyRXkF5CQkMDdu7+LAH8QGbmX9PR0Ojo6sMxYGBsbZ/6F+5U41p6g4HpCLpmemkZdpKawsJCRkRGezz3n+vUbEpNnYtNV4gHDw4+l2OysbELDwsRr9PPK/bMvr4CKKngG0NffR/+v/V7vOSUtheCwYJI+S6Lu0gXGJscku1an5bD8ML23e3lZhKYvr9CceoXvM65yQ9FG46nLXP6iCZO4KqPzUBzI5ePNn/DVoXy++7yBq6evUZP0jeQzfnpejG+iKaVZzGmWVuHM67lUxugpidSiCtJQskeLJryU4ogyyvfo0McYqZHXoXv3HKWRFZLv613lVEUbUMk0pL+WRaZvDpk+ZyQVzgaqqJafR/++gbKoSioP6qUDqg5Voz2gQxstgn5olPxVsdWiGjj3gVG0V5EfWIRyW76kijfPSioUhhSLiVWU7q0QGWipEMHK9+tQhWtQh5eIwCsHle7XrsZVHhTZ7tNy2j+HnAAledsLUO3UUCBTI9j+mcNqtmEzz2KbmsUyacU+t0znj11UaCq41tRK580uHt1/vOL/28qibYn+nn7ysvMwXWrkz/vDLNj+xTY9uzbl9TI+MYZ52sy9wXv0/XKbO7/dYX5h3ivGYrMw+tcoT0afsGhfWrX/B0P/4UFQzLU/AAAAAElFTkSuQmCC","aspectRatio":1,"src":"/static/7a5e4b3bb1f6af2388a2ec91d4706e25/3ddd4/react.png","srcSet":"/static/7a5e4b3bb1f6af2388a2ec91d4706e25/078a8/react.png 163w,\n/static/7a5e4b3bb1f6af2388a2ec91d4706e25/e56da/react.png 327w,\n/static/7a5e4b3bb1f6af2388a2ec91d4706e25/3ddd4/react.png 653w,\n/static/7a5e4b3bb1f6af2388a2ec91d4706e25/c5cc7/react.png 980w,\n/static/7a5e4b3bb1f6af2388a2ec91d4706e25/6050d/react.png 1200w","srcWebp":"/static/7a5e4b3bb1f6af2388a2ec91d4706e25/0acdf/react.webp","srcSetWebp":"/static/7a5e4b3bb1f6af2388a2ec91d4706e25/ac59e/react.webp 163w,\n/static/7a5e4b3bb1f6af2388a2ec91d4706e25/7660b/react.webp 327w,\n/static/7a5e4b3bb1f6af2388a2ec91d4706e25/0acdf/react.webp 653w,\n/static/7a5e4b3bb1f6af2388a2ec91d4706e25/75470/react.webp 980w,\n/static/7a5e4b3bb1f6af2388a2ec91d4706e25/9000d/react.webp 1200w","sizes":"(max-width: 653px) 100vw, 653px","tracedSVG":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='400'%20height='400'%20viewBox='0%200%20400%20400'%20preserveAspectRatio='none'%3e%3cpath%20d='M189%2021l5%2025%206%2024-3%203c-3%204-2%208%202%208l4%203c1%203%203%204%205%203h1l3%201%2013%204-5%203c-7%205-7%206-7%204%201-2-2-4-10-5l-4-1c0-3-4-3-8-1-5%202-5%205-1%204l4-2h1l7%203%206%201-7%203-6%202-8-2-7-1-3%204c-3%203-7%2015-7%2019v8l2%207c0%201%201%202%203%202%206%202%207%201%207-2%201-4%202-3%203%201l1%205%202%203v1l1%202%203%203c1%200%202%201%202%204l4%208%202%205h-3l-5%203c-2%201-2%201-6-5s-6-7-11-3c-3%203-4%203-6%202h-4c-1%202-1%202%201%202h3l-2%202c-3%202-6%202-4-1v-1l-2%202-1%202-3%201-3%202-5%203c-3%202-5%203-6%202l-2%201c1%201%200%202-2%202l-2-1-1-1-1%202c1%201%200%201-2%201-7%200-8%200-6%201%201%201%201%201-1%201l-2%201c1%201-4%205-6%205-1-1-7%202-7%203%200%204%205%205%209%202%202-3%202-3%203-1v2c-6%204-13%2011-11%2011%201%201%202%200%205-2l4-2-18%2016c-14%209-15%209-22%205-7-5-11-2-4%204%204%204%204%203-5%2012-4%204-8%207-7%208h-2c1%200%200%202-2%203l-1%203%201-1%2025-18-7%207-13%2010-14%2010c-1%201-2%201-3-1h-3c-1%201%206%2010%208%2010l13-8a199%20199%200%200126-18h4c2-1%203-1%206%201h4c2-1%201-6%200-7-2%200-1-2%201-2l1-1%202-1%207-5c5-4%206-4%206-2l1%203%205%206c8%207%2010%207%2016%203%203-3%204-4%205-2h3l2-1c2%200%205-4%205-6-1-2%200-3%203-6l6-6c1-2%201-2%201%200-1%201%200%202%201%202l1-1c0-2%201-2%203-2s3%200%202-1c-5-2-5-8%200-11l1-3c0-2%202-1%202%202s1%204%203%204%203-1%205-6l4-6-1%203c-3%207-1%2020%204%2022v3l-2%202h1c1-2%202%202%201%206l-1%207c0%203%201%201%203-8l1-3c3%200%2014%2016%2014%2020l1%202c1-1%202%205%201%2010%200%204%203%207%204%204%201-2%202-3%204-3%201%200%202-1%201-8-2-15-2-16-1-16l1-2c0-1%200-2-1-1-2%200-2%200%200-4%201-4%201-5%203-4h1c0-1%200-2-1-1l-1-1c0-2%203-2%203-1%202%204%208%206%2016%205h8c1%200%201-1-1-8-2-9-1-17%203-17l1%201c-1%201%201%203%202%202v-6l-2-7%202%205c2%207%203%208%205%206v-4l-1-5c0-2%201%200%202%203l1%205%209-4h3l1-3v-3l1%202c1%203%203%204%204%202v-6c-3-8-3-8%202-7l6-1c2-2%203%200%201%201l-3%202c-3-2-5%201-2%203l1%203%201%204%204%207h1v1l5%201c6-1%207-1%2012-4%202-2%205-4%204-5h1l4-1%206-1c4%200%204%200%208-6%205-9%205-12%200-6-4%205-6%204-7-4%200-4%200-5%201-4l3-2c2-2%202-2%203%200%201%201%201%201%201-2l2-5%201-4%201-2%203-4%203-4%201-2c-2-6-14-12-19-10-2%201-2%201%202%201%209%200%206%204-3%204-6%201-7%200-6-1l3-1%202-1-2-1c-4%201-4%200%201-2%205-3%207-7%205-8s-1-2%202-2%203%200%203%204c-1%202-1%203%201%204%204%203%208%203%207%201%200-3-3-8-4-7s-4-3-3-4%200-2-5-3c-4-1-6-5-2-5%202%200%202%200%201-3l-1-3c2-1%203%202%203%205l2%204%201-2c-2-7-3-7%204-11%206-4%209-7%205-5-1%200-2-1-1-5l1-10c0-8%201-9%203-4%203%206%205%207%206%204v-3l-1-3c0-3-9-14-12-14-4-1-4%200%200%203%201%202%203%204%202%205l1%201h-7c-4-1-6-1-10%201l-4%201h-1v3h-1l-2%203-6%206-23%2014-3%201-4%201c-4%201-6-3-6-20%200-10%201-14%206-17l2-3c-1-1%200-2%201-2l-2-3-3-4-4-3-3-1v-8c2-19%202-24%201-21l-2%2014a279%20279%200%2001-1%2013l-5-1%202-1c6%200-3-7-17-13-17-9-26-8-36%201-4%203-4%203-2%204%201%201%201%201-1%201h-1l-1%201v1h-1c-1-1-6%209-6%2013%200%205-2-1-6-21l-5-20h-1m34%2017c-3%200-5%202-4%203l-1%201c-1-1-3%200-4%201v2l1-1c2-2%2011-2%2014%200%203%201%203%201%202%202v1c2-1%202-1%202%201-1%200-1%201%200%200l1%205h1c1-1%201-1%201%201h1c1-1%201-1%201%201%200%203%202%204%203%201%201-2%201-2%201%200l1-1%201-1%201%201c1%200%202%200%201%202%200%202%200%202%201%201l2-1%202%202%202%202c1%201%201%200%201-1%200-9-7-20-16-22h-15m74%2037c-6%202-8%2012-4%2017%206%205%2015%200%2015-9%200-6-6-10-11-8m-31%2015a58%2058%200%2001-21%205l-8%202-16%204-10%202-1%201-2%201-2%201%201%201v1h-2c0%203%200%204-3%204h-2l2-3%201-2a120%20120%200%2000-20%2019l2-1c4-3%2030-11%2035-10%202%201%2010%200%2019-2l21-3c9-1%2010-2%2010-10l2-9h-1l-4-1h-1m2%2021v2l-2-1-2-1-2%201%2012%2019c3%201%200-15-3-16l-1-1-1-3-1-2v2m38%2022l-2%205c-2%205-2%205%200%205s1%2010-2%2014c-2%203-7%205-11%204s-4-1-3%202c0%201%201%202%202%201%203-2%206%202%206%208%200%203%200%204%202%204v2l2-1%203-1c4%201%206%200%204-2-2-1-2-2%200-4l1-4c-1-1%201-5%202-5h1l1-3v-4l1-4c2-3%202-4%201-5l-1-3c1-2%200-4-2-6l-3-2-1-1h-1m13%2017l-3%203-2%204-2%204%203-1%204-1%206%203%205%204%202-5%201-6v-2c4-2-8-5-14-3m-76%2011c-12%202-13%202-13%205l-2%202c-17%204-21%204-21%202%200-1-2-1-6%201l-7%203c-4%201-4%205%200%2013%203%205%203%206%206%206l3-1c-1-1%200-2%204-3%2013-3%2026-5%2027-4%201%202%208-1%2015-8%208-9%209-9%2017-6a160%20160%200%200021%207c2%200%202%200%200-4s-7-7-9-5l-1-1-7-3-6-3-3-2h-6l-1-1-11%202m-111%2066l-3%204%204%205c4%204%206%205%207%204h4l2-1-2-2-2-4-2-3-3-4-1-2-4%203m149%2014c-6%201-11%203-11%204l-1%205c0%203%200%203-1%201l-2-3c-1%200-1%201%201%204%201%206%201%208-1%205l-1-5c0-2-2-1-2%202%200%202%200%202-2-1l-2-3c-2%203%208%2022%2011%2021v1c-2%202-2%202-1%206l2%206v2h-47v-2l-3-5-3-3%203-4%203-5c0-1-2%200-3%202-5%207-12%2014-12%2011l-1-3v1l-2%201c-1%200-2%200-1%201l-1%201-1-4c0-3-1-5-3-7-4-4-5-4-12-4-3%200-5-1-5-2l-2-3-3-4c-1-3-3-4-7-5-7-3-8-2-6%202l1%203c-1%201-5%200-7-1-2-2-7-5-11-6-2-1-2-1-2%203l-1%208a173%20173%200%2000-4%2024l-71%201H0v37l1%2038h126l2%204%207%207c5%203%206%205%203%205l-2%201-3%202c-3%200-3%200-1%201%205%201%209%202%208%203h13c2%200%202-1%202-2-1-3%205-3%207%200l3%202%201%201%202%203c1%201%205%200%208-4l3-1c4%201%204%200-1-2-3-2-3-2-1-2l6%201c4%202%203%201-1-2s-6-4-9-3l-1-1c0-2-13%201-16%204-2%202-4%201-4-2%201-2%201-4%203-4%201-1%200-1-2-1-4%201-6%200-6-4l-1-3c-1%200-2-1-1-2%200-1%2058-2%2058%200l-4%202-3%202%203%201c3%201%205%200%203-1-1-1-1-1%201-2l2-2c-3-2%2084-1%2088%201%202%201%203%201%202%202l-2%201-2%202%201%202%201%203%201%203v1c-1%201-1%201%201%201v1l-1%202c2%202%205%202%207%200l3-2%202-1h14l15-1c1-2%203%201%205%205s3%204%202%200l-1-5-3-4-3-2c0-2-3-1-3%201h-2l-4-1-3-1%202-1%202-1h-1l-1-1-1-2-3-1c-1-2%200-2%207-2%207-1%2010-1%207%201l-3%203c-1%203%200%204%205%202l-1-1c-1-1%200-1%203-1%209%200%209%200%209-2l-1-3h26c23%200%2026%200%2026-2l1-37v-36h-42c-41%200-49%200-46-2%201-1%201-2-1-5-3-10-3-10-1-19%201-7%201-10-2-16-2-5-4-6-4-2l-2%204c-2%201-2%201-4-1l-8-8-10%204m17%2017c-1%200-1%203%201%2010l2%209v2c2%202%202%204-1%205-2%202-2%202%203%202s6%200%206-2c-2-4-4-17-3-18v-2l-2-1-2-2c0-4-1-5-4-3M20%20311l1%207%201-3c0-2%200-3%202-3l3%203%203%203-1-3v-4c3-4%200-8-6-8h-3v8m170-3v14l1-2c0-1%201-2%203-2%207-1%206-11%200-11l-4%201m59%2022v14l1-3c0-4%203-4%206%200s4%203%201%200v-11h-8'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"narrow":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsSAAALEgHS3X78AAAD80lEQVQ4y3WTa0yTZxTH3yVgogtjyjI0NVxliuIEHXPrJxLcJgui+0Ky6Bg3QVKKg0LLuBRKpTVhiCZsFEEyI1NcwAUGIbKQLCHOxbDEoJmYIIuGywoLbUFkUNrf3r60QJ2c5LzP857L//mfc55HcDqdOAFpdbJOPXZwOBzS3iOO1VjnmroxBNcH98968QS6xDY7y9LSEpOTk9J+eXlZVIfkn59/4RXvBfg/hm7fwsIChUVFKBQKGk2N3Lr1k2SfmZnBYrWu5ItVuERweAF6s3W4g8xmMzKZjM1btvBWQABxcXE8ePCQifEJHg0PMyEyZ6OSna844KGYXFxcTHx8PFlZWbS2/sDQ0BA1NTUEBQXR3d0jxblasSFDl9MlAwMDZGZkUl9fT1dXFz09PTQ0NHA04Sg+vr4SW6vNtsZwI0C73S7tTSYTIaGhBIeESGXLZDt5Z/dutu/YQXR0DAaDYbU9GwK6nJ7+ucRoNCIIAlu3bWVfVBRvBwYil8tpa7spMv+Wp0+freat6yFeg/AMIzc3lwt1ddRdvEhnZyft7e2kpqai1+vR6XSUlZaJV8r+iqGsA5uamkKtVrMrIgLfTZs4efIUtbW1ZGRk8F5sLImJiSQnJ/PRkSO0tLR4l/zyFVlcXKS62sAb/v74+flx/PgJlEqlOAAfqezEY8cYHBwUJ9tNb2+v++U41i62Y91EXczS0tKkyRXkF5CQkMDdu7+LAH8QGbmX9PR0Ojo6sMxYGBsbZ/6F+5U41p6g4HpCLpmemkZdpKawsJCRkRGezz3n+vUbEpNnYtNV4gHDw4+l2OysbELDwsRr9PPK/bMvr4CKKngG0NffR/+v/V7vOSUtheCwYJI+S6Lu0gXGJscku1an5bD8ML23e3lZhKYvr9CceoXvM65yQ9FG46nLXP6iCZO4KqPzUBzI5ePNn/DVoXy++7yBq6evUZP0jeQzfnpejG+iKaVZzGmWVuHM67lUxugpidSiCtJQskeLJryU4ogyyvfo0McYqZHXoXv3HKWRFZLv613lVEUbUMk0pL+WRaZvDpk+ZyQVzgaqqJafR/++gbKoSioP6qUDqg5Voz2gQxstgn5olPxVsdWiGjj3gVG0V5EfWIRyW76kijfPSioUhhSLiVWU7q0QGWipEMHK9+tQhWtQh5eIwCsHle7XrsZVHhTZ7tNy2j+HnAAledsLUO3UUCBTI9j+mcNqtmEzz2KbmsUyacU+t0znj11UaCq41tRK580uHt1/vOL/28qibYn+nn7ysvMwXWrkz/vDLNj+xTY9uzbl9TI+MYZ52sy9wXv0/XKbO7/dYX5h3ivGYrMw+tcoT0afsGhfWrX/B0P/4UFQzLU/AAAAAElFTkSuQmCC","aspectRatio":1,"src":"/static/7a5e4b3bb1f6af2388a2ec91d4706e25/502b1/react.png","srcSet":"/static/7a5e4b3bb1f6af2388a2ec91d4706e25/f2e6d/react.png 114w,\n/static/7a5e4b3bb1f6af2388a2ec91d4706e25/4ddba/react.png 229w,\n/static/7a5e4b3bb1f6af2388a2ec91d4706e25/502b1/react.png 457w,\n/static/7a5e4b3bb1f6af2388a2ec91d4706e25/7ddc2/react.png 686w,\n/static/7a5e4b3bb1f6af2388a2ec91d4706e25/435bf/react.png 914w,\n/static/7a5e4b3bb1f6af2388a2ec91d4706e25/6050d/react.png 1200w","srcWebp":"/static/7a5e4b3bb1f6af2388a2ec91d4706e25/15384/react.webp","srcSetWebp":"/static/7a5e4b3bb1f6af2388a2ec91d4706e25/31fce/react.webp 114w,\n/static/7a5e4b3bb1f6af2388a2ec91d4706e25/e3e25/react.webp 229w,\n/static/7a5e4b3bb1f6af2388a2ec91d4706e25/15384/react.webp 457w,\n/static/7a5e4b3bb1f6af2388a2ec91d4706e25/0258d/react.webp 686w,\n/static/7a5e4b3bb1f6af2388a2ec91d4706e25/64ea2/react.webp 914w,\n/static/7a5e4b3bb1f6af2388a2ec91d4706e25/9000d/react.webp 1200w","sizes":"(max-width: 457px) 100vw, 457px","tracedSVG":"data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='400'%20height='400'%20viewBox='0%200%20400%20400'%20preserveAspectRatio='none'%3e%3cpath%20d='M189%2021l5%2025%206%2024-3%203c-3%204-2%208%202%208l4%203c1%203%203%204%205%203h1l3%201%2013%204-5%203c-7%205-7%206-7%204%201-2-2-4-10-5l-4-1c0-3-4-3-8-1-5%202-5%205-1%204l4-2h1l7%203%206%201-7%203-6%202-8-2-7-1-3%204c-3%203-7%2015-7%2019v8l2%207c0%201%201%202%203%202%206%202%207%201%207-2%201-4%202-3%203%201l1%205%202%203v1l1%202%203%203c1%200%202%201%202%204l4%208%202%205h-3l-5%203c-2%201-2%201-6-5s-6-7-11-3c-3%203-4%203-6%202h-4c-1%202-1%202%201%202h3l-2%202c-3%202-6%202-4-1v-1l-2%202-1%202-3%201-3%202-5%203c-3%202-5%203-6%202l-2%201c1%201%200%202-2%202l-2-1-1-1-1%202c1%201%200%201-2%201-7%200-8%200-6%201%201%201%201%201-1%201l-2%201c1%201-4%205-6%205-1-1-7%202-7%203%200%204%205%205%209%202%202-3%202-3%203-1v2c-6%204-13%2011-11%2011%201%201%202%200%205-2l4-2-18%2016c-14%209-15%209-22%205-7-5-11-2-4%204%204%204%204%203-5%2012-4%204-8%207-7%208h-2c1%200%200%202-2%203l-1%203%201-1%2025-18-7%207-13%2010-14%2010c-1%201-2%201-3-1h-3c-1%201%206%2010%208%2010l13-8a199%20199%200%200126-18h4c2-1%203-1%206%201h4c2-1%201-6%200-7-2%200-1-2%201-2l1-1%202-1%207-5c5-4%206-4%206-2l1%203%205%206c8%207%2010%207%2016%203%203-3%204-4%205-2h3l2-1c2%200%205-4%205-6-1-2%200-3%203-6l6-6c1-2%201-2%201%200-1%201%200%202%201%202l1-1c0-2%201-2%203-2s3%200%202-1c-5-2-5-8%200-11l1-3c0-2%202-1%202%202s1%204%203%204%203-1%205-6l4-6-1%203c-3%207-1%2020%204%2022v3l-2%202h1c1-2%202%202%201%206l-1%207c0%203%201%201%203-8l1-3c3%200%2014%2016%2014%2020l1%202c1-1%202%205%201%2010%200%204%203%207%204%204%201-2%202-3%204-3%201%200%202-1%201-8-2-15-2-16-1-16l1-2c0-1%200-2-1-1-2%200-2%200%200-4%201-4%201-5%203-4h1c0-1%200-2-1-1l-1-1c0-2%203-2%203-1%202%204%208%206%2016%205h8c1%200%201-1-1-8-2-9-1-17%203-17l1%201c-1%201%201%203%202%202v-6l-2-7%202%205c2%207%203%208%205%206v-4l-1-5c0-2%201%200%202%203l1%205%209-4h3l1-3v-3l1%202c1%203%203%204%204%202v-6c-3-8-3-8%202-7l6-1c2-2%203%200%201%201l-3%202c-3-2-5%201-2%203l1%203%201%204%204%207h1v1l5%201c6-1%207-1%2012-4%202-2%205-4%204-5h1l4-1%206-1c4%200%204%200%208-6%205-9%205-12%200-6-4%205-6%204-7-4%200-4%200-5%201-4l3-2c2-2%202-2%203%200%201%201%201%201%201-2l2-5%201-4%201-2%203-4%203-4%201-2c-2-6-14-12-19-10-2%201-2%201%202%201%209%200%206%204-3%204-6%201-7%200-6-1l3-1%202-1-2-1c-4%201-4%200%201-2%205-3%207-7%205-8s-1-2%202-2%203%200%203%204c-1%202-1%203%201%204%204%203%208%203%207%201%200-3-3-8-4-7s-4-3-3-4%200-2-5-3c-4-1-6-5-2-5%202%200%202%200%201-3l-1-3c2-1%203%202%203%205l2%204%201-2c-2-7-3-7%204-11%206-4%209-7%205-5-1%200-2-1-1-5l1-10c0-8%201-9%203-4%203%206%205%207%206%204v-3l-1-3c0-3-9-14-12-14-4-1-4%200%200%203%201%202%203%204%202%205l1%201h-7c-4-1-6-1-10%201l-4%201h-1v3h-1l-2%203-6%206-23%2014-3%201-4%201c-4%201-6-3-6-20%200-10%201-14%206-17l2-3c-1-1%200-2%201-2l-2-3-3-4-4-3-3-1v-8c2-19%202-24%201-21l-2%2014a279%20279%200%2001-1%2013l-5-1%202-1c6%200-3-7-17-13-17-9-26-8-36%201-4%203-4%203-2%204%201%201%201%201-1%201h-1l-1%201v1h-1c-1-1-6%209-6%2013%200%205-2-1-6-21l-5-20h-1m34%2017c-3%200-5%202-4%203l-1%201c-1-1-3%200-4%201v2l1-1c2-2%2011-2%2014%200%203%201%203%201%202%202v1c2-1%202-1%202%201-1%200-1%201%200%200l1%205h1c1-1%201-1%201%201h1c1-1%201-1%201%201%200%203%202%204%203%201%201-2%201-2%201%200l1-1%201-1%201%201c1%200%202%200%201%202%200%202%200%202%201%201l2-1%202%202%202%202c1%201%201%200%201-1%200-9-7-20-16-22h-15m74%2037c-6%202-8%2012-4%2017%206%205%2015%200%2015-9%200-6-6-10-11-8m-31%2015a58%2058%200%2001-21%205l-8%202-16%204-10%202-1%201-2%201-2%201%201%201v1h-2c0%203%200%204-3%204h-2l2-3%201-2a120%20120%200%2000-20%2019l2-1c4-3%2030-11%2035-10%202%201%2010%200%2019-2l21-3c9-1%2010-2%2010-10l2-9h-1l-4-1h-1m2%2021v2l-2-1-2-1-2%201%2012%2019c3%201%200-15-3-16l-1-1-1-3-1-2v2m38%2022l-2%205c-2%205-2%205%200%205s1%2010-2%2014c-2%203-7%205-11%204s-4-1-3%202c0%201%201%202%202%201%203-2%206%202%206%208%200%203%200%204%202%204v2l2-1%203-1c4%201%206%200%204-2-2-1-2-2%200-4l1-4c-1-1%201-5%202-5h1l1-3v-4l1-4c2-3%202-4%201-5l-1-3c1-2%200-4-2-6l-3-2-1-1h-1m13%2017l-3%203-2%204-2%204%203-1%204-1%206%203%205%204%202-5%201-6v-2c4-2-8-5-14-3m-76%2011c-12%202-13%202-13%205l-2%202c-17%204-21%204-21%202%200-1-2-1-6%201l-7%203c-4%201-4%205%200%2013%203%205%203%206%206%206l3-1c-1-1%200-2%204-3%2013-3%2026-5%2027-4%201%202%208-1%2015-8%208-9%209-9%2017-6a160%20160%200%200021%207c2%200%202%200%200-4s-7-7-9-5l-1-1-7-3-6-3-3-2h-6l-1-1-11%202m-111%2066l-3%204%204%205c4%204%206%205%207%204h4l2-1-2-2-2-4-2-3-3-4-1-2-4%203m149%2014c-6%201-11%203-11%204l-1%205c0%203%200%203-1%201l-2-3c-1%200-1%201%201%204%201%206%201%208-1%205l-1-5c0-2-2-1-2%202%200%202%200%202-2-1l-2-3c-2%203%208%2022%2011%2021v1c-2%202-2%202-1%206l2%206v2h-47v-2l-3-5-3-3%203-4%203-5c0-1-2%200-3%202-5%207-12%2014-12%2011l-1-3v1l-2%201c-1%200-2%200-1%201l-1%201-1-4c0-3-1-5-3-7-4-4-5-4-12-4-3%200-5-1-5-2l-2-3-3-4c-1-3-3-4-7-5-7-3-8-2-6%202l1%203c-1%201-5%200-7-1-2-2-7-5-11-6-2-1-2-1-2%203l-1%208a173%20173%200%2000-4%2024l-71%201H0v37l1%2038h126l2%204%207%207c5%203%206%205%203%205l-2%201-3%202c-3%200-3%200-1%201%205%201%209%202%208%203h13c2%200%202-1%202-2-1-3%205-3%207%200l3%202%201%201%202%203c1%201%205%200%208-4l3-1c4%201%204%200-1-2-3-2-3-2-1-2l6%201c4%202%203%201-1-2s-6-4-9-3l-1-1c0-2-13%201-16%204-2%202-4%201-4-2%201-2%201-4%203-4%201-1%200-1-2-1-4%201-6%200-6-4l-1-3c-1%200-2-1-1-2%200-1%2058-2%2058%200l-4%202-3%202%203%201c3%201%205%200%203-1-1-1-1-1%201-2l2-2c-3-2%2084-1%2088%201%202%201%203%201%202%202l-2%201-2%202%201%202%201%203%201%203v1c-1%201-1%201%201%201v1l-1%202c2%202%205%202%207%200l3-2%202-1h14l15-1c1-2%203%201%205%205s3%204%202%200l-1-5-3-4-3-2c0-2-3-1-3%201h-2l-4-1-3-1%202-1%202-1h-1l-1-1-1-2-3-1c-1-2%200-2%207-2%207-1%2010-1%207%201l-3%203c-1%203%200%204%205%202l-1-1c-1-1%200-1%203-1%209%200%209%200%209-2l-1-3h26c23%200%2026%200%2026-2l1-37v-36h-42c-41%200-49%200-46-2%201-1%201-2-1-5-3-10-3-10-1-19%201-7%201-10-2-16-2-5-4-6-4-2l-2%204c-2%201-2%201-4-1l-8-8-10%204m17%2017c-1%200-1%203%201%2010l2%209v2c2%202%202%204-1%205-2%202-2%202%203%202s6%200%206-2c-2-4-4-17-3-18v-2l-2-1-2-2c0-4-1-5-4-3M20%20311l1%207%201-3c0-2%200-3%202-3l3%203%203%203-1-3v-4c3-4%200-8-6-8h-3v8m170-3v14l1-2c0-1%201-2%203-2%207-1%206-11%200-11l-4%201m59%2022v14l1-3c0-4%203-4%206%200s4%203%201%200v-11h-8'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"seo":{"src":"/static/7a5e4b3bb1f6af2388a2ec91d4706e25/6050d/react.png"}}}]}},"staticQueryHashes":["1609575157","2068910035","2361467917","2361467917","3838421970","500183989","5650841"]}