{"componentChunkName":"component---gatsby-theme-spaceout-src-templates-article-template-tsx","path":"/the-definitive-guide-to-video-optimization-and-delivery-in-web-applications","result":{"pageContext":{"article":{"id":"ef1f89b3-4985-550f-9f1b-b00f91e8fcec","slug":"/the-definitive-guide-to-video-optimization-and-delivery-in-web-applications","secret":false,"title":"The Definitive Guide to Video Optimization and Delivery in Web Applications","author":"Luke Celitan","date":"July 3rd, 2025","dateForSEO":"2025-07-03T00:00:00.000Z","timeToRead":5,"excerpt":"A comprehensive deep-dive into optimizing, storing, and delivering video for web applications, including FFmpeg best practices, advanced streaming, storage strategies, CDN integration, troubleshooting, and real-world use cases.","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\": \"The Definitive Guide to Video Optimization and Delivery in Web Applications\",\n  \"excerpt\": \"A comprehensive deep-dive into optimizing, storing, and delivering video for web applications, including FFmpeg best practices, advanced streaming, storage strategies, CDN integration, troubleshooting, and real-world use cases.\",\n  \"date\": \"2025-07-03T00:00:00.000Z\",\n  \"hero\": \"videoCover.png\",\n  \"author\": \"Luke Celitan\",\n  \"category\": \"Post\",\n  \"tech\": [\"TS\", \"JS\", \"Nodejs\"]\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\": \"the-definitive-guide-to-video-optimization-and-delivery-in-web-applications\"\n  }, \"The Definitive Guide to Video Optimization and Delivery in Web Applications\"), mdx(\"h2\", {\n    \"id\": \"introduction\"\n  }, \"Introduction\"), mdx(\"p\", null, \"Video is now a cornerstone of modern web applications, powering everything from marketing landing pages to SaaS platforms, e-learning, and social media. But delivering a seamless video experience is a complex technical challenge: you must balance quality, performance, compatibility, storage, and cost. In this guide, I\\u2019ll walk you through the full lifecycle of video in web apps\\u2014from encoding and optimization (with FFmpeg) to storage, delivery, playback, monitoring, and troubleshooting. Whether you\\u2019re building a video-heavy product or just want to improve your site\\u2019s performance, this is your definitive technical reference.\"), mdx(\"h2\", {\n    \"id\": \"why-video-optimization-matters\"\n  }, \"Why Video Optimization Matters\"), mdx(\"h3\", {\n    \"id\": \"the-rise-of-video-in-web-apps\"\n  }, \"The Rise of Video in Web Apps\"), mdx(\"p\", null, \"Video content is everywhere\\u2014product demos, tutorials, webinars, user-generated content, and more. But unoptimized video can cripple your user experience:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Slow load times\"), \" frustrate users and increase bounce rates.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"High bandwidth usage\"), \" drives up hosting costs and can throttle mobile users.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Playback issues\"), \" (buffering, stuttering) hurt engagement and retention.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Poor SEO\"), \": Slow pages and broken video playback can tank your search rankings.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Device compatibility\"), \": Not all browsers and devices support every format or codec.\")), mdx(\"h3\", {\n    \"id\": \"key-challenges\"\n  }, \"Key Challenges\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Performance\"), \": Fast startup, smooth playback, minimal buffering.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Compatibility\"), \": Support for all major browsers and devices.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Storage\"), \": Efficient, scalable, and cost-effective storage solutions.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Delivery\"), \": Global reach, caching, and adaptive streaming.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Monitoring\"), \": Analytics to track and improve video performance.\")), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"video-codecs-formats-and-choosing-the-right-settings\"\n  }, \"Video Codecs, Formats, and Choosing the Right Settings\"), mdx(\"h3\", {\n    \"id\": \"common-codecs-and-formats\"\n  }, \"Common Codecs and Formats\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"H.264 (AVC)\"), \": The web\\u2019s workhorse\\u2014widely supported, efficient, and compatible with most browsers and devices.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"VP9\"), \": Open-source, better compression than H.264, supported in Chrome/Firefox/Edge.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"AV1\"), \": The future\\u2014superior compression, but limited hardware/browser support (as of 2024).\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"HEVC (H.265)\"), \": Great for high-res, but licensing and browser support are issues.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Audio\"), \": AAC (most common), Opus (for WebRTC), MP3 (legacy).\")), mdx(\"h3\", {\n    \"id\": \"choosing-resolution-bitrate-and-codec\"\n  }, \"Choosing Resolution, Bitrate, and Codec\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Resolution\"), \": 720p (1280x720) is a good baseline for web; 1080p for premium content; 480p for mobile/low-bandwidth.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Bitrate\"), \": Lower bitrates reduce file size but can hurt quality. Aim for 1-2 Mbps for 720p, 2-4 Mbps for 1080p.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Codec\"), \": H.264 for maximum compatibility; VP9/AV1 for advanced use cases.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Audio\"), \": 128 kbps AAC is a solid default.\")), mdx(\"h3\", {\n    \"id\": \"example-codec-compatibility-table\"\n  }, \"Example: Codec Compatibility Table\"), mdx(\"table\", null, mdx(\"thead\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"thead\"\n  }, mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Codec\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Chrome\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Firefox\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Safari\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Edge\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Mobile\"))), mdx(\"tbody\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"H.264\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"\\u2705\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"\\u2705\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"\\u2705\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"\\u2705\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"\\u2705\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"VP9\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"\\u2705\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"\\u2705\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"\\u274C\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"\\u2705\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Partial\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"AV1\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"\\u2705\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"\\u2705\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"\\u274C\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"\\u2705\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Partial\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"HEVC\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"\\u274C\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"\\u274C\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"\\u2705\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"\\u274C\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Partial\")))), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"ffmpeg-optimization-examples\"\n  }, \"FFmpeg Optimization Examples\"), mdx(\"p\", null, \"Optimizing video for web playback is essential. FFmpeg is the industry-standard tool for video encoding, transcoding, and optimization. Here are the most effective FFmpeg workflows for web video:\"), mdx(\"h3\", {\n    \"id\": \"1-basic-video-optimization\"\n  }, \"1. Basic Video Optimization\"), mdx(\"p\", null, \"Reduce resolution and bitrate for faster loading and lower bandwidth:\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-bash\"\n  }, \"ffmpeg -i input_video.mp4 \\\\\\n  -vf \\\"scale=1280:-2\\\" \\\\\\n  -c:v libx264 -crf 23 \\\\\\n  -preset medium \\\\\\n  -c:a aac -b:a 128k \\\\\\n  output.mp4\\n\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Breakdown:\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"-vf \\\"scale=1280:-2\\\"\"), \": Scales width to 1280px, keeps aspect ratio.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"-c:v libx264\"), \": H.264 codec for video.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"-crf 23\"), \": Quality/file size trade-off (lower is higher quality).\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"-preset medium\"), \": Encoding speed vs. compression.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"-c:a aac -b:a 128k\"), \": AAC audio at 128 kbps.\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"When to use:\"), \" For most web videos, this produces a good balance of quality and size.\"), mdx(\"h3\", {\n    \"id\": \"2-fast-start-optimization-moov-atom\"\n  }, \"2. Fast Start Optimization (MOOV Atom)\"), mdx(\"p\", null, \"Move the MOOV atom to the beginning for instant playback:\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-bash\"\n  }, \"ffmpeg -i input_video.mp4 \\\\\\n  -movflags faststart \\\\\\n  -c copy \\\\\\n  output.mp4\\n\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Breakdown:\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"-movflags faststart\"), \": Moves MOOV atom for fast streaming.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"-c copy\"), \": No re-encoding; just optimizes file structure.\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"When to use:\"), \" Always for web playback\\u2014enables instant start in browsers.\"), mdx(\"h3\", {\n    \"id\": \"3-two-pass-encoding-for-quality-and-file-size\"\n  }, \"3. Two-Pass Encoding for Quality and File Size\"), mdx(\"p\", null, \"Get better quality at smaller sizes:\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-bash\"\n  }, \"ffmpeg -i input_video.mp4 \\\\\\n  -c:v libx264 -b:v 1M -pass 1 -an -f null /dev/null && \\\\\\nffmpeg -i input_video.mp4 \\\\\\n  -c:v libx264 -b:v 1M -pass 2 \\\\\\n  -c:a aac -b:a 128k \\\\\\n  output.mp4\\n\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Breakdown:\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"First pass analyzes video; second pass encodes optimally.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"-b:v 1M\"), \": Target video bitrate (1 Mbps).\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"When to use:\"), \" For premium content, or when you need the best quality-to-size ratio.\"), mdx(\"h3\", {\n    \"id\": \"4-keyframe-optimization-for-web-seeking\"\n  }, \"4. Keyframe Optimization for Web Seeking\"), mdx(\"p\", null, \"Improve seeking accuracy in web players:\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-bash\"\n  }, \"ffmpeg -i input_video.mp4 \\\\\\n  -c:v libx264 -crf 23 \\\\\\n  -g 30 -keyint_min 30 \\\\\\n  -c:a aac -b:a 128k \\\\\\n  output.mp4\\n\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Breakdown:\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"-g 30 -keyint_min 30\"), \": Keyframe every 30 frames (about 1 per second at 30fps).\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"When to use:\"), \" For videos where users will seek frequently (tutorials, demos).\"), mdx(\"h3\", {\n    \"id\": \"5-adaptive-bitrate-streaming-hlsdash\"\n  }, \"5. Adaptive Bitrate Streaming (HLS/DASH)\"), mdx(\"p\", null, \"Create multiple renditions for responsive playback:\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-bash\"\n  }, \"# Example: HLS renditions\\nffmpeg -i input_video.mp4 \\\\\\n  -map 0:v -map 0:a \\\\\\n  -b:v:0 300k -s:v:0 426x240 \\\\\\n  -b:v:1 800k -s:v:1 640x360 \\\\\\n  -b:v:2 1400k -s:v:2 1280x720 \\\\\\n  -c:v libx264 -c:a aac \\\\\\n  -f hls \\\\\\n  -hls_time 4 -hls_playlist_type vod \\\\\\n  -hls_segment_filename \\\"output_%v_%03d.ts\\\" \\\\\\n  output.m3u8\\n\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Breakdown:\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Multiple bitrates/resolutions for adaptive streaming.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"output.m3u8\"), \": HLS manifest file for web players.\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"When to use:\"), \" For scalable, responsive video delivery (Netflix, YouTube style).\"), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"storage-and-delivery-best-practices\"\n  }, \"Storage and Delivery Best Practices\"), mdx(\"h3\", {\n    \"id\": \"where-to-store-videos\"\n  }, \"Where to Store Videos\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Cloud Storage\"), \": AWS S3, Google Cloud Storage, Azure Blob Storage.\", mdx(\"ul\", {\n    parentName: \"li\"\n  }, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Pros\"), \": Scalable, reliable, integrates with CDNs.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Cons\"), \": Cost, egress fees, latency (if not paired with CDN).\"))), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"CDN Integration\"), \": Cloudflare, Akamai, Fastly, AWS CloudFront.\", mdx(\"ul\", {\n    parentName: \"li\"\n  }, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Pros\"), \": Global caching, fast delivery, DDoS protection.\"))), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Self-Hosting\"), \": On-premises or VPS.\", mdx(\"ul\", {\n    parentName: \"li\"\n  }, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Pros\"), \": Full control, no egress fees.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Cons\"), \": Maintenance, scaling, security.\")))), mdx(\"h3\", {\n    \"id\": \"folder-structure-and-naming-conventions\"\n  }, \"Folder Structure and Naming Conventions\"), mdx(\"p\", null, \"Organize for scalability and automation:\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\"\n  }, \"/videos/\\n  /2024/\\n    /06/\\n      /projectA/\\n        video1_720p.mp4\\n        video1_1080p.mp4\\n        video1_hls.m3u8\\n      /projectB/\\n        ...\\n\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use date/project-based folders for easy lifecycle management.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Name files with resolution/bitrate for clarity.\")), mdx(\"h3\", {\n    \"id\": \"object-storage-vs-block-storage\"\n  }, \"Object Storage vs. Block Storage\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Object Storage (S3, GCS, Azure Blob)\"), \": Best for large, unstructured files; supports versioning, lifecycle policies.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Block Storage\"), \": Not recommended for video\\u2014better for databases, VMs.\")), mdx(\"h3\", {\n    \"id\": \"versioning-and-lifecycle-management\"\n  }, \"Versioning and Lifecycle Management\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Enable versioning to prevent accidental overwrites.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use lifecycle policies to auto-delete old/unused videos.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Tag assets for easy search and management.\")), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"serving-videos-efficiently\"\n  }, \"Serving Videos Efficiently\"), mdx(\"h3\", {\n    \"id\": \"using-cdns-for-global-delivery\"\n  }, \"Using CDNs for Global Delivery\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Why CDNs?\"), \": Reduce latency, cache content near users, handle traffic spikes.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"How to Integrate\"), \": Point your storage bucket as the CDN origin; set up cache rules for video files.\")), mdx(\"h3\", {\n    \"id\": \"http-streaming-protocols\"\n  }, \"HTTP Streaming Protocols\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"HLS (HTTP Live Streaming)\"), \": Apple\\u2019s protocol, works everywhere except some older Android browsers.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"DASH (Dynamic Adaptive Streaming over HTTP)\"), \": Open standard, supported in most modern browsers.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Progressive Download\"), \": Simple, but no adaptive bitrate.\")), mdx(\"h3\", {\n    \"id\": \"setting-correct-http-headers\"\n  }, \"Setting Correct HTTP Headers\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"CORS\"), \": Allow cross-origin requests for video playback.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Cache-Control\"), \": Set long cache times for static video files.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Range Requests\"), \": Enable partial downloads for seeking.\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Example: S3 Bucket CORS Policy\")), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-json\"\n  }, \"[\\n  {\\n    \\\"AllowedHeaders\\\": [\\\"*\\\"],\\n    \\\"AllowedMethods\\\": [\\\"GET\\\"],\\n    \\\"AllowedOrigins\\\": [\\\"*\\\"]\\n  }\\n]\\n\")), mdx(\"h3\", {\n    \"id\": \"integrating-with-web-video-players\"\n  }, \"Integrating with Web Video Players\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Video.js\"), \": Popular, extensible, supports HLS/DASH.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"hls.js\"), \": JavaScript library for HLS playback in browsers.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Shaka Player\"), \": Advanced DASH/HLS support.\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Example: Video.js Setup\")), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-html\"\n  }, \"<video id=\\\"my-video\\\" class=\\\"video-js\\\" controls preload=\\\"auto\\\" width=\\\"640\\\" height=\\\"360\\\">\\n  <source src=\\\"https://cdn.example.com/output.m3u8\\\" type=\\\"application/x-mpegURL\\\">\\n</video>\\n<script src=\\\"https://vjs.zencdn.net/7.20.3/video.js\\\"></script>\\n\")), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"advanced-optimization-techniques\"\n  }, \"Advanced Optimization Techniques\"), mdx(\"h3\", {\n    \"id\": \"adaptive-bitrate-streaming-generating-multiple-renditions\"\n  }, \"Adaptive Bitrate Streaming: Generating Multiple Renditions\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use FFmpeg to create multiple resolutions/bitrates.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Generate manifest files (\", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \".m3u8\"), \" for HLS, \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \".mpd\"), \" for DASH).\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Integrate with players that auto-select the best stream.\")), mdx(\"h3\", {\n    \"id\": \"two-pass-encoding-and-its-benefits\"\n  }, \"Two-Pass Encoding and Its Benefits\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"First pass analyzes, second pass encodes for optimal quality.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use for premium content or when bandwidth is expensive.\")), mdx(\"h3\", {\n    \"id\": \"keyframe-interval-tuning-for-web-seeking\"\n  }, \"Keyframe Interval Tuning for Web Seeking\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Shorter intervals = better seeking, but larger files.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Tune based on content type (tutorials vs. movies).\")), mdx(\"h3\", {\n    \"id\": \"audio-optimization\"\n  }, \"Audio Optimization\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use AAC for compatibility.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"128 kbps stereo for most content; 64 kbps mono for voice-only.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Normalize audio levels for consistent playback.\")), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"performance-monitoring-and-analytics\"\n  }, \"Performance Monitoring and Analytics\"), mdx(\"h3\", {\n    \"id\": \"measuring-video-performance\"\n  }, \"Measuring Video Performance\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Startup Time\"), \": How fast does playback begin?\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Buffering Events\"), \": Frequency and duration.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Playback Errors\"), \": Failed loads, codec issues.\")), mdx(\"h3\", {\n    \"id\": \"analytics-tools\"\n  }, \"Analytics Tools\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Mux Data\"), \": Deep video analytics (startup time, rebuffering, engagement).\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Google Analytics\"), \": Track video events (play, pause, seek).\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Custom Logging\"), \": Use player events to log performance.\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Example: Video.js Event Logging\")), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-js\"\n  }, \"var player = videojs('my-video');\\nplayer.on('error', function() {\\n  // Log error to analytics\\n});\\nplayer.on('waiting', function() {\\n  // Log buffering event\\n});\\n\")), mdx(\"h3\", {\n    \"id\": \"lighthouse-and-core-web-vitals-impact\"\n  }, \"Lighthouse and Core Web Vitals Impact\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Fast video startup improves Largest Contentful Paint (LCP).\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Optimized video reduces Total Blocking Time (TBT).\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use Lighthouse to audit video performance.\")), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"best-practices-and-common-pitfalls\"\n  }, \"Best Practices and Common Pitfalls\"), mdx(\"h3\", {\n    \"id\": \"balancing-quality-and-file-size\"\n  }, \"Balancing Quality and File Size\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Test different CRF/bitrate settings to find the sweet spot.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use adaptive streaming for diverse audiences.\")), mdx(\"h3\", {\n    \"id\": \"testing-across-devices-and-browsers\"\n  }, \"Testing Across Devices and Browsers\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Always test on Chrome, Firefox, Safari, Edge, iOS, Android.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use BrowserStack or Sauce Labs for automated cross-browser testing.\")), mdx(\"h3\", {\n    \"id\": \"handling-different-content-types\"\n  }, \"Handling Different Content Types\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Animation\"), \": Lower bitrate, fewer artifacts.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Live-Action\"), \": Higher bitrate, more keyframes.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Screen Recordings\"), \": Tune for sharp text.\")), mdx(\"h3\", {\n    \"id\": \"accessibility-considerations\"\n  }, \"Accessibility Considerations\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Add captions/subtitles (WebVTT, SRT).\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Provide transcripts for search and accessibility.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use ARIA roles for custom video controls.\")), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"real-world-use-cases-and-case-studies\"\n  }, \"Real-World Use Cases and Case Studies\"), mdx(\"h3\", {\n    \"id\": \"case-study-1-optimizing-a-video-heavy-landing-page\"\n  }, \"Case Study 1: Optimizing a Video-Heavy Landing Page\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Used FFmpeg to create 720p/1080p HLS renditions.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Stored videos in S3, delivered via CloudFront CDN.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Integrated Video.js for adaptive playback.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Result: 40% faster load times, 30% lower bandwidth costs, improved SEO.\")), mdx(\"h3\", {\n    \"id\": \"case-study-2-scalable-video-delivery-pipeline-for-saas\"\n  }, \"Case Study 2: Scalable Video Delivery Pipeline for SaaS\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Automated FFmpeg encoding via CI/CD pipeline.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Used S3 versioning and lifecycle policies.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Monitored performance with Mux Data.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Result: Seamless video uploads, instant playback, robust analytics.\")), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"troubleshooting-and-faq\"\n  }, \"Troubleshooting and FAQ\"), mdx(\"h3\", {\n    \"id\": \"common-encoding-errors\"\n  }, \"Common Encoding Errors\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Codec not supported\"), \": Check browser compatibility; re-encode with H.264/AAC.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"File too large\"), \": Lower bitrate/CRF, use two-pass encoding.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Playback stutters\"), \": Check CDN cache, optimize keyframes.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"No audio\"), \": Ensure AAC codec, check audio bitrate.\")), mdx(\"h3\", {\n    \"id\": \"debugging-playback-issues\"\n  }, \"Debugging Playback Issues\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use browser dev tools to inspect network requests.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Check CORS and range request headers.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Test with multiple players (Video.js, hls.js).\")), mdx(\"h3\", {\n    \"id\": \"storage-and-delivery-bottlenecks\"\n  }, \"Storage and Delivery Bottlenecks\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Monitor CDN cache hit rates.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use lifecycle policies to clean up old assets.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Scale storage buckets for high traffic.\")), mdx(\"hr\", null), mdx(\"h2\", {\n    \"id\": \"conclusion-and-further-resources\"\n  }, \"Conclusion and Further Resources\"), mdx(\"p\", null, \"Optimizing, storing, and delivering video for web applications is a multi-faceted technical challenge\\u2014but with the right tools and best practices, you can deliver a world-class experience. Use FFmpeg for encoding, cloud storage and CDNs for delivery, and modern web players for playback. Monitor performance, test across devices, and always keep accessibility in mind.\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Further Reading:\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://ffmpeg.org/documentation.html\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"FFmpeg Documentation\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://docs.aws.amazon.com/AmazonS3/latest/userguide/HostingVideos.html\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"AWS S3 Video Hosting Guide\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://docs.mux.com/docs/video\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"Mux Video API\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://docs.videojs.com/\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"Video.js Documentation\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://web.dev/video/\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"Google Web Fundamentals: Video\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://web.dev/lighthouse-performance/\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"Lighthouse Performance Audits\"))), mdx(\"hr\", null), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Author:\"), \" Luke Celitan\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Category:\"), \" Post\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Tech:\"), \" Video, FFmpeg, Web, CDN, AWS, S3, HLS, DASH, JavaScript\"));\n}\n;\nMDXContent.isMDXComponent = true;","tech":["TS","JS","Nodejs"],"category":"Post","appDescription":null,"hero":{"full":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsSAAALEgHS3X78AAAEGklEQVQ4y2VU60/TVxj+JTgcOD4QHC6FySIMF/jALRVNpikKctGwMbMEDUMHswO2Ti4CTsgcDOYEN3CSWHAGhohYLBcprJa72JZauZdLgQIFZ5b9E8/ec3oD1+TNOc/vvOc5z3mf91SwLL3E6o6YgIVilYfru8XswmzdhR1z2yjsIDJvJ3qD8H+HuEhXFo3ONcGmyLHJdbojmY1ry5NOgvWVKds6YUa0ZDJg0TSONXu+4NzoINqmgmHzwguYZrSccGFWhynjCCdiawzPz+icmOUIjo3bVa0vT3FVTM2EYRg93W1YXjBiZnIMGnUnNH91Ym5qjHImOOEyHbpm3y+4auMqrG1jF+421OHatasoLs5H2Y8lePjgHqnVYWSoD89H1TzXNK3dIUhwKbONi3N6dCpbceNGBWprqtBQfxvXfy5Hbq4MZ86koF5+C5trs5ib1mGUiNW9j7FBN3F4ILxp++hQL2prq9HU1ADtmIZ/Hxnuwx35bWRkXkDh5TyMP+/nuZPGUTzpekS11NuNY6bYDWD1Yo7dIrL8glzUkLp2RQs6SK2cyCoqyyCT5SA7W4qW5rukcoYIn0GlUkLd1wHr6rSjbWymsMKODKqoXpeRmvo50tPPQSrNwPnzaUhLO8uJSkqKcfZcKup+r4aFFD1Vd6Ors41UtkE/9pRfXXCoe2kYguJhE228iG9ypMjMSEcOzfPyZJB9m4WC/EsoLspHyqfJnNA0a4CqRwnFo2ZS/Afa2xqxRbV1vpQNkqx7pkbW15mQXvwSRUV5+P5KAcrLSnGFXC65Wogv0lLxWUoyP1ivG6KrdvISNd6Tk5njvI7CCns6/PnYrq5U3EcmFT8n6yt8J8vmapMSTyLuhAQJ8bEoLszF4IAKAwO96CGFcnkduqjOTBBrcGFrfQ6blhlsrc9yySZqB2X7fdT8eh3V1Do3qypQWHAJVb/8hJY/G9CveQKddhCjw2p0dynQ+qAR5vkX+Ns6z9tJSEqIxSfJiTiVFIfTFEcOi7ma+LgYHPv4CI/jMUeRGH8CyacT+FosRYzkGA5Hi3GU1k8lxiLh5HEeAv1w4EAg9u8PgL//+wgLC+M4MDAIQUFBEIn8EBDwAQ4e/Ijwh9i37z34+PjwuVgshq+vLyNxhZubGyIjIxEdHY2oqCiEh4dzzObBwcEIDQ3l3yIiIiCRSHDokJhwGEJCQuDh8TbY/h2E7+zZAz8/Eanz56eJRCLCfnx8d+9e/s3b2xvuu3cTgQcPT09PeHl5Ydeut+Du7k7YwxkC679xbT+FBgZdPwx8bhsZHhnsQXdHK5ob5fjtZiUqy0vxQ2kR6u/Uop/+eXTU0Eb9IPXxMA/BapmGlVy20lNyjuQWc8xqd585+M+rRfz72ozXmwt2vIRXGyZnniP+A6N5aZFmTZfeAAAAAElFTkSuQmCC","aspectRatio":1,"src":"/static/8225dfbb906deda73afc1c2bda83682c/a1946/videoCover.png","srcSet":"/static/8225dfbb906deda73afc1c2bda83682c/5b37e/videoCover.png 236w,\n/static/8225dfbb906deda73afc1c2bda83682c/49058/videoCover.png 472w,\n/static/8225dfbb906deda73afc1c2bda83682c/a1946/videoCover.png 944w,\n/static/8225dfbb906deda73afc1c2bda83682c/6050d/videoCover.png 1200w","srcWebp":"/static/8225dfbb906deda73afc1c2bda83682c/99fbb/videoCover.webp","srcSetWebp":"/static/8225dfbb906deda73afc1c2bda83682c/77392/videoCover.webp 236w,\n/static/8225dfbb906deda73afc1c2bda83682c/1f177/videoCover.webp 472w,\n/static/8225dfbb906deda73afc1c2bda83682c/99fbb/videoCover.webp 944w,\n/static/8225dfbb906deda73afc1c2bda83682c/9000d/videoCover.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='M192%2081c0%201%200%202-2%202l-2%202-1%202-1%203c1%202%200%201-2-1-3-4-6-3-7%200l1%203h10l9%201v-3l-2-6c0-3-3-7-3-3m-10%2022l7%201%2012%202%205%202-6-1c-13-1-35-1-36%201l-4%202-1%201h-1l-1%201-7%203-9%203-4%201h-4l-1%201h-1v1l-1%201h-1l-1%201h-1l-1%201-3%201h2c3%200%203%200-3%203l-10%207-4%203c0-2-3%204-4%2011-2%207-3%209-4%209l-4%208c-4%2012-4%208%201-9l1-9h-1l-1%202c-1-1-2%201-2%203%201%202-2%204-3%203-1-2-6%209-5%2012l-1%204c-1%201-1%201-1-1%200-4-2%200-4%2010-2%208-4%2041-2%2036%201-1%201-1%201%202l2%208%202%2011%201%201v1l1%201c1-1%206%205%206%207l4%206%204%206%201%201h2c-1%201%208%206%209%206%202%200%207%201%206%202l5%202c5%202%205%202%201%202l-12-4c-10-5-12-5-5-1%2020%2012%2065%2017%2098%2010%2039-8%2060-28%2066-62%203-19%200-55-7-71-3-6-3-5-1%203%205%2015%208%2046%206%2061-1%208-4%2019-5%2019l2-8c2-10%202-42%200-53-4-15-9-26-17-37-4-5-5-7-2-5%201%201%201%201%200%200v-1l3%201c1-1-10-9-17-13-8-4-16-6-13-4%202%202%201%201-8-1l-15-3-11-2-3%201m147%2013l-2%206c0%203%200%203-1%201s-1-2-1%200l2%204c2%202%203%205%201%205l-1%202-1-1-1-2-1%202c-1%202-1%202-3%200h-2l2%203c5%205%209%2011%208%2011-1%201%200%201%201%202%205%202%207-1%203-6l-1-5c1-1%200-4-1-7-2-3-2-5-1-10%200-5%200-8-1-5m-174%2018c-17%202-36%207-37%2010-2%204%201%2010%205%2010h3l3%203c3%201%203%202%202%203-2%201-3%203-1%202%201-1%205%202%204%203v5c0%202%201%202%203%202l2%202%203%201%201%201%202%201%202%204%201%203%201-2c-1-3-1-3%204-3%205-1%205-1%205%202%201%202%201%202%208-1%205-3%2011-4%209-2l2%201%201-3c1-5%205-6%207-1%200%202%203%203%203%200l3-1c2%200%202%200%202-3%200-4%201-5%202-3v-1l1-1%201-1%202-1c1%201%202%200%202-1-1-1%200-1%201-2%202%200%202-1%201-1-1-1%201-5%203-5v-1h1l1-1v-1c1-1%200-11-1-12-4-5-35-8-52-6m204%2056c1%201%200%203-1%205l-1%206-1%204v4l2%206c0%206%203%208%205%207%203-2%203-9%201-9-1-1%200-1%202-1%203%200%204%200%203-2l1-2c4%202%203-6-1-8l-4-6c-1-2-2-4-4-4h-2m-26%2012c-1%203-1%203-4%203-2%200-3%200-3-2s0-2-1%201c-2%203-1%208%200%209v2c2%201%203%200%202-3%200-2%200-2%201-1s2%202%201%203l1%202c2%201%202%204-1%206l1-4-3-1c-2%200-2%201-2%203l-1%203c-1%201%201%202%203%201l-1%202c-2%202-2%207%200%208v1c-1%201%200%205%202%205l1%202%201%203c2%201%204%200%205-5%200-5%206-12%2010-12l2-1c0-2-3-2-6%200-3%201-4%201-5-1-1-1-1-1-1%201h-1c-2-2-1-5%201-5v-1c-2-2-2-3-2-12v-7m-126%208a362%20362%200%2001-87-1c-8%200%209%203%2032%205l8%201c2%201%2038%200%2042-1s9-4%208-5l-3%201m11%2013c-4%204-4%205-12%205l-3%202c-1%203-18%204-25%201h-5l-2-1%206-1h6l-5-1c-3-1-7-2-8-1l-3-1h-1c0%201%201%202%203%202%202%201%202%201%201%202-1%202-14%203-14%201v-3c3-1%200-2-6-2h-5c1-1-3-1-11-1s-13%200-11%201l26%202c1%200%202%200%201%201l1%201%201%201h-14c-7-2-26-2-24%200%201%201%2014%202%2019%201l4%201c3%203%2067%203%2075%201l4-3%201-2v-2l1-1c1%201%205-6%204-7l-4%204m131%2019v1l-1%201h-1l-2%201c-3%201-5%204-3%207%201%202%201%202-1%202v-1l-2%201c-1%201-2%203-1%204l-1%201c-2-1-5%203-4%205%201%201%200%201-1%203-2%200-3%202-2%202l-1%201c-1-1-1-1%200%200l-2%204c-2%202-2%203%200%204v1c-1%200-2%200-1%201l-1%201h-1c1%201-3%204-4%203l-1%201c1%201-32%201-104%201H110v-2c0-2-1-3-4-3-2%200-3%200-1%201%202%200%205%203%204%204l-2-1-4-1-6-2c-1-2-6-2-11-2-2%200-2%200%201%201%205%203%205%205-1%205-4%200-5%200-5-2h-1v1l-40%201H0v75h84a1901%201901%200%2001104%203%202003%202003%200%200169%207h3l1-1v-4c1%200%202%201%202%205l1%203h-7c0%202%2011%201%2024-3a387%20387%200%2001119-11l1-37v-37h-74l8-10a87%2087%200%200017-27c2%200%200-7-1-8l-2%201m-196%2012c8%200%2010%201%206%202l-4%201%205%201c5%201%206%202%206%203-1%201%200%201%201%201l-3%201-10%201a498%20498%200%20004%202l6%201%207-4c8-5%208-7%200-7l-6-1c-1-2-3-2-9-2s-7%200-3%201m88%204c-8%205-16%209-23%2010-14%204-21%206-16%206l-4%201c-8%202-11%201-8-1l3-2h-6a718%20718%200%2001-34%204h5l-5%201c-6%201%2014%202%2024%202%2025-2%2026-2%2037-6l10-2%202-1%208-6%2012-8c0-1-1-1-5%202m-20%2046c0%202%200%202-2%201-4-1-8%205-5%2010%201%202%202%202%205%202h4v-8l-1-8-1%203m-152%206v7h4c6%200%208-2%208-7%200-6-2-8-8-8h-4v8m188-3c-4%204-2%2010%203%2010%203%200%205-2%205-6%200-5-5-8-8-4m66%200c-5%205%201%2013%207%209%202-1%202-7%200-9-3-3-4-3-7%200M25%20326c-6%204-4%2014%203%2015%205%200%207-2%207-8s-5-9-10-7m187%208v7h5c5%200%208-3%208-7%200-5-3-8-8-8h-5v8m-187-5c-5%206%202%2014%206%209%202-1%203-8%201-10s-6-1-7%201m108%202c-4%204-2%2010%203%2010%206%200%208-8%203-11-3-1-4-1-6%201'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"regular":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsSAAALEgHS3X78AAAEGklEQVQ4y2VU60/TVxj+JTgcOD4QHC6FySIMF/jALRVNpikKctGwMbMEDUMHswO2Ti4CTsgcDOYEN3CSWHAGhohYLBcprJa72JZauZdLgQIFZ5b9E8/ec3oD1+TNOc/vvOc5z3mf91SwLL3E6o6YgIVilYfru8XswmzdhR1z2yjsIDJvJ3qD8H+HuEhXFo3ONcGmyLHJdbojmY1ry5NOgvWVKds6YUa0ZDJg0TSONXu+4NzoINqmgmHzwguYZrSccGFWhynjCCdiawzPz+icmOUIjo3bVa0vT3FVTM2EYRg93W1YXjBiZnIMGnUnNH91Ym5qjHImOOEyHbpm3y+4auMqrG1jF+421OHatasoLs5H2Y8lePjgHqnVYWSoD89H1TzXNK3dIUhwKbONi3N6dCpbceNGBWprqtBQfxvXfy5Hbq4MZ86koF5+C5trs5ib1mGUiNW9j7FBN3F4ILxp++hQL2prq9HU1ADtmIZ/Hxnuwx35bWRkXkDh5TyMP+/nuZPGUTzpekS11NuNY6bYDWD1Yo7dIrL8glzUkLp2RQs6SK2cyCoqyyCT5SA7W4qW5rukcoYIn0GlUkLd1wHr6rSjbWymsMKODKqoXpeRmvo50tPPQSrNwPnzaUhLO8uJSkqKcfZcKup+r4aFFD1Vd6Ors41UtkE/9pRfXXCoe2kYguJhE228iG9ypMjMSEcOzfPyZJB9m4WC/EsoLspHyqfJnNA0a4CqRwnFo2ZS/Afa2xqxRbV1vpQNkqx7pkbW15mQXvwSRUV5+P5KAcrLSnGFXC65Wogv0lLxWUoyP1ivG6KrdvISNd6Tk5njvI7CCns6/PnYrq5U3EcmFT8n6yt8J8vmapMSTyLuhAQJ8bEoLszF4IAKAwO96CGFcnkduqjOTBBrcGFrfQ6blhlsrc9yySZqB2X7fdT8eh3V1Do3qypQWHAJVb/8hJY/G9CveQKddhCjw2p0dynQ+qAR5vkX+Ns6z9tJSEqIxSfJiTiVFIfTFEcOi7ma+LgYHPv4CI/jMUeRGH8CyacT+FosRYzkGA5Hi3GU1k8lxiLh5HEeAv1w4EAg9u8PgL//+wgLC+M4MDAIQUFBEIn8EBDwAQ4e/Ijwh9i37z34+PjwuVgshq+vLyNxhZubGyIjIxEdHY2oqCiEh4dzzObBwcEIDQ3l3yIiIiCRSHDokJhwGEJCQuDh8TbY/h2E7+zZAz8/Eanz56eJRCLCfnx8d+9e/s3b2xvuu3cTgQcPT09PeHl5Ydeut+Du7k7YwxkC679xbT+FBgZdPwx8bhsZHhnsQXdHK5ob5fjtZiUqy0vxQ2kR6u/Uop/+eXTU0Eb9IPXxMA/BapmGlVy20lNyjuQWc8xqd585+M+rRfz72ozXmwt2vIRXGyZnniP+A6N5aZFmTZfeAAAAAElFTkSuQmCC","aspectRatio":1,"src":"/static/8225dfbb906deda73afc1c2bda83682c/3ddd4/videoCover.png","srcSet":"/static/8225dfbb906deda73afc1c2bda83682c/078a8/videoCover.png 163w,\n/static/8225dfbb906deda73afc1c2bda83682c/e56da/videoCover.png 327w,\n/static/8225dfbb906deda73afc1c2bda83682c/3ddd4/videoCover.png 653w,\n/static/8225dfbb906deda73afc1c2bda83682c/c5cc7/videoCover.png 980w,\n/static/8225dfbb906deda73afc1c2bda83682c/6050d/videoCover.png 1200w","srcWebp":"/static/8225dfbb906deda73afc1c2bda83682c/0acdf/videoCover.webp","srcSetWebp":"/static/8225dfbb906deda73afc1c2bda83682c/ac59e/videoCover.webp 163w,\n/static/8225dfbb906deda73afc1c2bda83682c/7660b/videoCover.webp 327w,\n/static/8225dfbb906deda73afc1c2bda83682c/0acdf/videoCover.webp 653w,\n/static/8225dfbb906deda73afc1c2bda83682c/75470/videoCover.webp 980w,\n/static/8225dfbb906deda73afc1c2bda83682c/9000d/videoCover.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='M192%2081c0%201%200%202-2%202l-2%202-1%202-1%203c1%202%200%201-2-1-3-4-6-3-7%200l1%203h10l9%201v-3l-2-6c0-3-3-7-3-3m-10%2022l7%201%2012%202%205%202-6-1c-13-1-35-1-36%201l-4%202-1%201h-1l-1%201-7%203-9%203-4%201h-4l-1%201h-1v1l-1%201h-1l-1%201h-1l-1%201-3%201h2c3%200%203%200-3%203l-10%207-4%203c0-2-3%204-4%2011-2%207-3%209-4%209l-4%208c-4%2012-4%208%201-9l1-9h-1l-1%202c-1-1-2%201-2%203%201%202-2%204-3%203-1-2-6%209-5%2012l-1%204c-1%201-1%201-1-1%200-4-2%200-4%2010-2%208-4%2041-2%2036%201-1%201-1%201%202l2%208%202%2011%201%201v1l1%201c1-1%206%205%206%207l4%206%204%206%201%201h2c-1%201%208%206%209%206%202%200%207%201%206%202l5%202c5%202%205%202%201%202l-12-4c-10-5-12-5-5-1%2020%2012%2065%2017%2098%2010%2039-8%2060-28%2066-62%203-19%200-55-7-71-3-6-3-5-1%203%205%2015%208%2046%206%2061-1%208-4%2019-5%2019l2-8c2-10%202-42%200-53-4-15-9-26-17-37-4-5-5-7-2-5%201%201%201%201%200%200v-1l3%201c1-1-10-9-17-13-8-4-16-6-13-4%202%202%201%201-8-1l-15-3-11-2-3%201m147%2013l-2%206c0%203%200%203-1%201s-1-2-1%200l2%204c2%202%203%205%201%205l-1%202-1-1-1-2-1%202c-1%202-1%202-3%200h-2l2%203c5%205%209%2011%208%2011-1%201%200%201%201%202%205%202%207-1%203-6l-1-5c1-1%200-4-1-7-2-3-2-5-1-10%200-5%200-8-1-5m-174%2018c-17%202-36%207-37%2010-2%204%201%2010%205%2010h3l3%203c3%201%203%202%202%203-2%201-3%203-1%202%201-1%205%202%204%203v5c0%202%201%202%203%202l2%202%203%201%201%201%202%201%202%204%201%203%201-2c-1-3-1-3%204-3%205-1%205-1%205%202%201%202%201%202%208-1%205-3%2011-4%209-2l2%201%201-3c1-5%205-6%207-1%200%202%203%203%203%200l3-1c2%200%202%200%202-3%200-4%201-5%202-3v-1l1-1%201-1%202-1c1%201%202%200%202-1-1-1%200-1%201-2%202%200%202-1%201-1-1-1%201-5%203-5v-1h1l1-1v-1c1-1%200-11-1-12-4-5-35-8-52-6m204%2056c1%201%200%203-1%205l-1%206-1%204v4l2%206c0%206%203%208%205%207%203-2%203-9%201-9-1-1%200-1%202-1%203%200%204%200%203-2l1-2c4%202%203-6-1-8l-4-6c-1-2-2-4-4-4h-2m-26%2012c-1%203-1%203-4%203-2%200-3%200-3-2s0-2-1%201c-2%203-1%208%200%209v2c2%201%203%200%202-3%200-2%200-2%201-1s2%202%201%203l1%202c2%201%202%204-1%206l1-4-3-1c-2%200-2%201-2%203l-1%203c-1%201%201%202%203%201l-1%202c-2%202-2%207%200%208v1c-1%201%200%205%202%205l1%202%201%203c2%201%204%200%205-5%200-5%206-12%2010-12l2-1c0-2-3-2-6%200-3%201-4%201-5-1-1-1-1-1-1%201h-1c-2-2-1-5%201-5v-1c-2-2-2-3-2-12v-7m-126%208a362%20362%200%2001-87-1c-8%200%209%203%2032%205l8%201c2%201%2038%200%2042-1s9-4%208-5l-3%201m11%2013c-4%204-4%205-12%205l-3%202c-1%203-18%204-25%201h-5l-2-1%206-1h6l-5-1c-3-1-7-2-8-1l-3-1h-1c0%201%201%202%203%202%202%201%202%201%201%202-1%202-14%203-14%201v-3c3-1%200-2-6-2h-5c1-1-3-1-11-1s-13%200-11%201l26%202c1%200%202%200%201%201l1%201%201%201h-14c-7-2-26-2-24%200%201%201%2014%202%2019%201l4%201c3%203%2067%203%2075%201l4-3%201-2v-2l1-1c1%201%205-6%204-7l-4%204m131%2019v1l-1%201h-1l-2%201c-3%201-5%204-3%207%201%202%201%202-1%202v-1l-2%201c-1%201-2%203-1%204l-1%201c-2-1-5%203-4%205%201%201%200%201-1%203-2%200-3%202-2%202l-1%201c-1-1-1-1%200%200l-2%204c-2%202-2%203%200%204v1c-1%200-2%200-1%201l-1%201h-1c1%201-3%204-4%203l-1%201c1%201-32%201-104%201H110v-2c0-2-1-3-4-3-2%200-3%200-1%201%202%200%205%203%204%204l-2-1-4-1-6-2c-1-2-6-2-11-2-2%200-2%200%201%201%205%203%205%205-1%205-4%200-5%200-5-2h-1v1l-40%201H0v75h84a1901%201901%200%2001104%203%202003%202003%200%200169%207h3l1-1v-4c1%200%202%201%202%205l1%203h-7c0%202%2011%201%2024-3a387%20387%200%2001119-11l1-37v-37h-74l8-10a87%2087%200%200017-27c2%200%200-7-1-8l-2%201m-196%2012c8%200%2010%201%206%202l-4%201%205%201c5%201%206%202%206%203-1%201%200%201%201%201l-3%201-10%201a498%20498%200%20004%202l6%201%207-4c8-5%208-7%200-7l-6-1c-1-2-3-2-9-2s-7%200-3%201m88%204c-8%205-16%209-23%2010-14%204-21%206-16%206l-4%201c-8%202-11%201-8-1l3-2h-6a718%20718%200%2001-34%204h5l-5%201c-6%201%2014%202%2024%202%2025-2%2026-2%2037-6l10-2%202-1%208-6%2012-8c0-1-1-1-5%202m-20%2046c0%202%200%202-2%201-4-1-8%205-5%2010%201%202%202%202%205%202h4v-8l-1-8-1%203m-152%206v7h4c6%200%208-2%208-7%200-6-2-8-8-8h-4v8m188-3c-4%204-2%2010%203%2010%203%200%205-2%205-6%200-5-5-8-8-4m66%200c-5%205%201%2013%207%209%202-1%202-7%200-9-3-3-4-3-7%200M25%20326c-6%204-4%2014%203%2015%205%200%207-2%207-8s-5-9-10-7m187%208v7h5c5%200%208-3%208-7%200-5-3-8-8-8h-5v8m-187-5c-5%206%202%2014%206%209%202-1%203-8%201-10s-6-1-7%201m108%202c-4%204-2%2010%203%2010%206%200%208-8%203-11-3-1-4-1-6%201'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"narrow":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsSAAALEgHS3X78AAAEGklEQVQ4y2VU60/TVxj+JTgcOD4QHC6FySIMF/jALRVNpikKctGwMbMEDUMHswO2Ti4CTsgcDOYEN3CSWHAGhohYLBcprJa72JZauZdLgQIFZ5b9E8/ec3oD1+TNOc/vvOc5z3mf91SwLL3E6o6YgIVilYfru8XswmzdhR1z2yjsIDJvJ3qD8H+HuEhXFo3ONcGmyLHJdbojmY1ry5NOgvWVKds6YUa0ZDJg0TSONXu+4NzoINqmgmHzwguYZrSccGFWhynjCCdiawzPz+icmOUIjo3bVa0vT3FVTM2EYRg93W1YXjBiZnIMGnUnNH91Ym5qjHImOOEyHbpm3y+4auMqrG1jF+421OHatasoLs5H2Y8lePjgHqnVYWSoD89H1TzXNK3dIUhwKbONi3N6dCpbceNGBWprqtBQfxvXfy5Hbq4MZ86koF5+C5trs5ib1mGUiNW9j7FBN3F4ILxp++hQL2prq9HU1ADtmIZ/Hxnuwx35bWRkXkDh5TyMP+/nuZPGUTzpekS11NuNY6bYDWD1Yo7dIrL8glzUkLp2RQs6SK2cyCoqyyCT5SA7W4qW5rukcoYIn0GlUkLd1wHr6rSjbWymsMKODKqoXpeRmvo50tPPQSrNwPnzaUhLO8uJSkqKcfZcKup+r4aFFD1Vd6Ors41UtkE/9pRfXXCoe2kYguJhE228iG9ypMjMSEcOzfPyZJB9m4WC/EsoLspHyqfJnNA0a4CqRwnFo2ZS/Afa2xqxRbV1vpQNkqx7pkbW15mQXvwSRUV5+P5KAcrLSnGFXC65Wogv0lLxWUoyP1ivG6KrdvISNd6Tk5njvI7CCns6/PnYrq5U3EcmFT8n6yt8J8vmapMSTyLuhAQJ8bEoLszF4IAKAwO96CGFcnkduqjOTBBrcGFrfQ6blhlsrc9yySZqB2X7fdT8eh3V1Do3qypQWHAJVb/8hJY/G9CveQKddhCjw2p0dynQ+qAR5vkX+Ns6z9tJSEqIxSfJiTiVFIfTFEcOi7ma+LgYHPv4CI/jMUeRGH8CyacT+FosRYzkGA5Hi3GU1k8lxiLh5HEeAv1w4EAg9u8PgL//+wgLC+M4MDAIQUFBEIn8EBDwAQ4e/Ijwh9i37z34+PjwuVgshq+vLyNxhZubGyIjIxEdHY2oqCiEh4dzzObBwcEIDQ3l3yIiIiCRSHDokJhwGEJCQuDh8TbY/h2E7+zZAz8/Eanz56eJRCLCfnx8d+9e/s3b2xvuu3cTgQcPT09PeHl5Ydeut+Du7k7YwxkC679xbT+FBgZdPwx8bhsZHhnsQXdHK5ob5fjtZiUqy0vxQ2kR6u/Uop/+eXTU0Eb9IPXxMA/BapmGlVy20lNyjuQWc8xqd585+M+rRfz72ozXmwt2vIRXGyZnniP+A6N5aZFmTZfeAAAAAElFTkSuQmCC","aspectRatio":1,"src":"/static/8225dfbb906deda73afc1c2bda83682c/502b1/videoCover.png","srcSet":"/static/8225dfbb906deda73afc1c2bda83682c/f2e6d/videoCover.png 114w,\n/static/8225dfbb906deda73afc1c2bda83682c/4ddba/videoCover.png 229w,\n/static/8225dfbb906deda73afc1c2bda83682c/502b1/videoCover.png 457w,\n/static/8225dfbb906deda73afc1c2bda83682c/7ddc2/videoCover.png 686w,\n/static/8225dfbb906deda73afc1c2bda83682c/435bf/videoCover.png 914w,\n/static/8225dfbb906deda73afc1c2bda83682c/6050d/videoCover.png 1200w","srcWebp":"/static/8225dfbb906deda73afc1c2bda83682c/15384/videoCover.webp","srcSetWebp":"/static/8225dfbb906deda73afc1c2bda83682c/31fce/videoCover.webp 114w,\n/static/8225dfbb906deda73afc1c2bda83682c/e3e25/videoCover.webp 229w,\n/static/8225dfbb906deda73afc1c2bda83682c/15384/videoCover.webp 457w,\n/static/8225dfbb906deda73afc1c2bda83682c/0258d/videoCover.webp 686w,\n/static/8225dfbb906deda73afc1c2bda83682c/64ea2/videoCover.webp 914w,\n/static/8225dfbb906deda73afc1c2bda83682c/9000d/videoCover.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='M192%2081c0%201%200%202-2%202l-2%202-1%202-1%203c1%202%200%201-2-1-3-4-6-3-7%200l1%203h10l9%201v-3l-2-6c0-3-3-7-3-3m-10%2022l7%201%2012%202%205%202-6-1c-13-1-35-1-36%201l-4%202-1%201h-1l-1%201-7%203-9%203-4%201h-4l-1%201h-1v1l-1%201h-1l-1%201h-1l-1%201-3%201h2c3%200%203%200-3%203l-10%207-4%203c0-2-3%204-4%2011-2%207-3%209-4%209l-4%208c-4%2012-4%208%201-9l1-9h-1l-1%202c-1-1-2%201-2%203%201%202-2%204-3%203-1-2-6%209-5%2012l-1%204c-1%201-1%201-1-1%200-4-2%200-4%2010-2%208-4%2041-2%2036%201-1%201-1%201%202l2%208%202%2011%201%201v1l1%201c1-1%206%205%206%207l4%206%204%206%201%201h2c-1%201%208%206%209%206%202%200%207%201%206%202l5%202c5%202%205%202%201%202l-12-4c-10-5-12-5-5-1%2020%2012%2065%2017%2098%2010%2039-8%2060-28%2066-62%203-19%200-55-7-71-3-6-3-5-1%203%205%2015%208%2046%206%2061-1%208-4%2019-5%2019l2-8c2-10%202-42%200-53-4-15-9-26-17-37-4-5-5-7-2-5%201%201%201%201%200%200v-1l3%201c1-1-10-9-17-13-8-4-16-6-13-4%202%202%201%201-8-1l-15-3-11-2-3%201m147%2013l-2%206c0%203%200%203-1%201s-1-2-1%200l2%204c2%202%203%205%201%205l-1%202-1-1-1-2-1%202c-1%202-1%202-3%200h-2l2%203c5%205%209%2011%208%2011-1%201%200%201%201%202%205%202%207-1%203-6l-1-5c1-1%200-4-1-7-2-3-2-5-1-10%200-5%200-8-1-5m-174%2018c-17%202-36%207-37%2010-2%204%201%2010%205%2010h3l3%203c3%201%203%202%202%203-2%201-3%203-1%202%201-1%205%202%204%203v5c0%202%201%202%203%202l2%202%203%201%201%201%202%201%202%204%201%203%201-2c-1-3-1-3%204-3%205-1%205-1%205%202%201%202%201%202%208-1%205-3%2011-4%209-2l2%201%201-3c1-5%205-6%207-1%200%202%203%203%203%200l3-1c2%200%202%200%202-3%200-4%201-5%202-3v-1l1-1%201-1%202-1c1%201%202%200%202-1-1-1%200-1%201-2%202%200%202-1%201-1-1-1%201-5%203-5v-1h1l1-1v-1c1-1%200-11-1-12-4-5-35-8-52-6m204%2056c1%201%200%203-1%205l-1%206-1%204v4l2%206c0%206%203%208%205%207%203-2%203-9%201-9-1-1%200-1%202-1%203%200%204%200%203-2l1-2c4%202%203-6-1-8l-4-6c-1-2-2-4-4-4h-2m-26%2012c-1%203-1%203-4%203-2%200-3%200-3-2s0-2-1%201c-2%203-1%208%200%209v2c2%201%203%200%202-3%200-2%200-2%201-1s2%202%201%203l1%202c2%201%202%204-1%206l1-4-3-1c-2%200-2%201-2%203l-1%203c-1%201%201%202%203%201l-1%202c-2%202-2%207%200%208v1c-1%201%200%205%202%205l1%202%201%203c2%201%204%200%205-5%200-5%206-12%2010-12l2-1c0-2-3-2-6%200-3%201-4%201-5-1-1-1-1-1-1%201h-1c-2-2-1-5%201-5v-1c-2-2-2-3-2-12v-7m-126%208a362%20362%200%2001-87-1c-8%200%209%203%2032%205l8%201c2%201%2038%200%2042-1s9-4%208-5l-3%201m11%2013c-4%204-4%205-12%205l-3%202c-1%203-18%204-25%201h-5l-2-1%206-1h6l-5-1c-3-1-7-2-8-1l-3-1h-1c0%201%201%202%203%202%202%201%202%201%201%202-1%202-14%203-14%201v-3c3-1%200-2-6-2h-5c1-1-3-1-11-1s-13%200-11%201l26%202c1%200%202%200%201%201l1%201%201%201h-14c-7-2-26-2-24%200%201%201%2014%202%2019%201l4%201c3%203%2067%203%2075%201l4-3%201-2v-2l1-1c1%201%205-6%204-7l-4%204m131%2019v1l-1%201h-1l-2%201c-3%201-5%204-3%207%201%202%201%202-1%202v-1l-2%201c-1%201-2%203-1%204l-1%201c-2-1-5%203-4%205%201%201%200%201-1%203-2%200-3%202-2%202l-1%201c-1-1-1-1%200%200l-2%204c-2%202-2%203%200%204v1c-1%200-2%200-1%201l-1%201h-1c1%201-3%204-4%203l-1%201c1%201-32%201-104%201H110v-2c0-2-1-3-4-3-2%200-3%200-1%201%202%200%205%203%204%204l-2-1-4-1-6-2c-1-2-6-2-11-2-2%200-2%200%201%201%205%203%205%205-1%205-4%200-5%200-5-2h-1v1l-40%201H0v75h84a1901%201901%200%2001104%203%202003%202003%200%200169%207h3l1-1v-4c1%200%202%201%202%205l1%203h-7c0%202%2011%201%2024-3a387%20387%200%2001119-11l1-37v-37h-74l8-10a87%2087%200%200017-27c2%200%200-7-1-8l-2%201m-196%2012c8%200%2010%201%206%202l-4%201%205%201c5%201%206%202%206%203-1%201%200%201%201%201l-3%201-10%201a498%20498%200%20004%202l6%201%207-4c8-5%208-7%200-7l-6-1c-1-2-3-2-9-2s-7%200-3%201m88%204c-8%205-16%209-23%2010-14%204-21%206-16%206l-4%201c-8%202-11%201-8-1l3-2h-6a718%20718%200%2001-34%204h5l-5%201c-6%201%2014%202%2024%202%2025-2%2026-2%2037-6l10-2%202-1%208-6%2012-8c0-1-1-1-5%202m-20%2046c0%202%200%202-2%201-4-1-8%205-5%2010%201%202%202%202%205%202h4v-8l-1-8-1%203m-152%206v7h4c6%200%208-2%208-7%200-6-2-8-8-8h-4v8m188-3c-4%204-2%2010%203%2010%203%200%205-2%205-6%200-5-5-8-8-4m66%200c-5%205%201%2013%207%209%202-1%202-7%200-9-3-3-4-3-7%200M25%20326c-6%204-4%2014%203%2015%205%200%207-2%207-8s-5-9-10-7m187%208v7h5c5%200%208-3%208-7%200-5-3-8-8-8h-5v8m-187-5c-5%206%202%2014%206%209%202-1%203-8%201-10s-6-1-7%201m108%202c-4%204-2%2010%203%2010%206%200%208-8%203-11-3-1-4-1-6%201'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"seo":{"src":"/static/8225dfbb906deda73afc1c2bda83682c/6050d/videoCover.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","Nodejs"],"category":"Post","slug":"/the-definitive-guide-to-video-optimization-and-delivery-in-web-applications","id":"ef1f89b3-4985-550f-9f1b-b00f91e8fcec","title":"The Definitive Guide to Video Optimization and Delivery in Web Applications","appDescription":null,"mailchimp":false,"next":[{"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"}}},{"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"}}}]}},"staticQueryHashes":["1609575157","2068910035","2361467917","2361467917","3838421970","500183989","5650841"]}