{"componentChunkName":"component---gatsby-theme-spaceout-src-templates-articles-template-tsx","path":"/page/3","result":{"pageContext":{"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":"/","skip":12,"limit":12,"group":[{"id":"bb165c56-4e9e-55de-a594-ca23a30a8a69","slug":"/mastering-agile-estimation","secret":false,"title":"Mastering Agile Estimation","author":"Luke Celitan","date":"March 14th, 2025","dateForSEO":"2025-03-14T00:00:00.000Z","timeToRead":4,"excerpt":"A Deep Dive into Scrum Poker estimation method","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\": \"Mastering Agile Estimation\",\n  \"excerpt\": \"A Deep Dive into Scrum Poker estimation method\",\n  \"date\": \"2025-03-14T00:00:00.000Z\",\n  \"hero\": \"scrumpoker.jpg\",\n  \"author\": \"Luke Celitan\",\n  \"appDescription\": \"Estimation app for agile teams\",\n  \"category\": \"Project\",\n  \"tech\": [\"Rust\", \"Astro\", \"Actix\", \"ReactIcon\", \"TS\"]\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n    props = _objectWithoutProperties(_ref, _excluded);\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"h2\", {\n    \"id\": \"a-deep-dive-into-scrum-poker-estimation-method\"\n  }, \"A Deep Dive into Scrum Poker estimation method\"), mdx(\"h3\", {\n    \"id\": \"introduction\"\n  }, \"Introduction\"), mdx(\"p\", null, \"Hey there, fellow Agile practitioners! I\\u2019m an engineering manager who\\u2019s\\nconstantly juggling the demands of development teams and business stakeholders.\\nOne of my key responsibilities is providing accurate estimates to the\\n\\u201Cbusiness\\u201D - you know, those folks who always want to know \\u201Chow long will it\\ntake?\\u201D and \\u201Chow much will it cost?\\u201D\"), mdx(\"p\", null, \"Here\\u2019s the thing: I never make these estimates alone. It\\u2019s always a team effort,\\nand for good reason. That\\u2019s where Scrum Poker comes in - it\\u2019s been my go-to\\nmethod for validating how much time and work a project really needs. Let me walk\\nyou through how I use this powerful technique and introduce you to my\\nopen-source app that\\u2019s making the process even smoother.\"), mdx(\"h3\", {\n    \"id\": \"1-understanding-scrum-poker\"\n  }, \"1. Understanding Scrum Poker\"), mdx(\"p\", null, \"Scrum Poker, also known as Planning Poker, is a consensus-based estimation\\ntechnique that I\\u2019ve found invaluable in my role. It\\u2019s not just about throwing\\nnumbers around; it\\u2019s about fostering collaboration, reducing bias, and tackling\\ncomplex tasks with confidence.\"), mdx(\"p\", null, \"Why is it crucial? Simple:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"It enhances sprint planning accuracy\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"It improves team communication\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"It boosts overall project predictability\")), mdx(\"p\", null, \"By tapping into the team\\u2019s collective expertise, we\\u2019re able to overcome\\nindividual biases and get a more holistic view of the work ahead.\"), mdx(\"p\", null, \"For a deeper understanding, check out\\n\", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://www.mountaingoatsoftware.com/agile/planning-poker\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"Mike Cohn\\u2019s original concept\"), \" -\\nhe\\u2019s the brains behind this brilliant idea.\"), mdx(\"h3\", {\n    \"id\": \"2-the-benefits-of-scrum-poker\"\n  }, \"2. The Benefits of Scrum Poker\"), mdx(\"p\", null, \"Let me break down why Scrum Poker is my MVP of estimation techniques:\"), mdx(\"h4\", {\n    \"id\": \"promoting-team-collaboration-and-consensus\"\n  }, \"Promoting Team Collaboration and Consensus\"), mdx(\"p\", null, \"It\\u2019s like a team-building exercise disguised as work. Everyone gets a say,\\nfostering a sense of shared ownership and responsibility. This open dialogue\\noften uncovers hidden insights and concerns.\"), mdx(\"h4\", {\n    \"id\": \"reducing-bias-and-improving-accuracy\"\n  }, \"Reducing Bias and Improving Accuracy\"), mdx(\"p\", null, \"By revealing estimates simultaneously, we kick the anchoring bias to the curb.\\nNo more piggybacking on the tech lead\\u2019s estimate - this approach promotes\\nindependent thinking and often leads to more accurate estimations.\"), mdx(\"h4\", {\n    \"id\": \"handling-complex-or-uncertain-tasks\"\n  }, \"Handling Complex or Uncertain Tasks\"), mdx(\"p\", null, \"Got a story that\\u2019s as clear as mud? Perfect. Scrum Poker thrives on uncertainty.\\nThe discussions arising from differing estimates often uncover hidden\\ncomplexities or risks, leading to more realistic planning.\"), mdx(\"p\", null, \"For more on these benefits, check out\\n\", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://www.agilealliance.org/glossary/planning-poker/\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"Agile Alliance\\u2019s deep dive into Planning Poker\"), \".\"), mdx(\"h3\", {\n    \"id\": \"3-my-approach-to-scrum-poker-sessions\"\n  }, \"3. My Approach to Scrum Poker Sessions\"), mdx(\"p\", null, \"Here\\u2019s how I run my Scrum Poker sessions:\"), mdx(\"h4\", {\n    \"id\": \"preparation-phase\"\n  }, \"Preparation Phase:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"I use a custom deck with values: 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 40, 100.\\nThese represent hours needed to complete a task.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"We align on what each value means in terms of effort and complexity.\")), mdx(\"h4\", {\n    \"id\": \"estimation-process\"\n  }, \"Estimation Process:\"), mdx(\"ol\", null, mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"I present a user story to the team.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Team members silently select their estimate.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Everyone reveals their cards simultaneously.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"We discuss estimates, focusing on outliers.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Re-estimate if necessary, aiming for consensus.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Record the final estimate and move to the next item.\")), mdx(\"p\", null, \"This process helps me validate the time and work needed for each client request,\\nensuring I\\u2019m providing accurate estimates to the business.\"), mdx(\"h3\", {\n    \"id\": \"4-best-practices-and-common-pitfalls\"\n  }, \"4. Best Practices and Common Pitfalls\"), mdx(\"h4\", {\n    \"id\": \"effective-facilitation-tips\"\n  }, \"Effective Facilitation Tips:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Keep discussions time-boxed to maintain momentum.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Encourage participation from all team members, especially the quiet ones.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use a reference story to calibrate the team\\u2019s understanding of story points.\")), mdx(\"h4\", {\n    \"id\": \"handling-outliers-and-disagreements\"\n  }, \"Handling Outliers and Disagreements:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Focus on understanding the reasoning behind divergent estimates.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Avoid averaging; instead, work towards a shared understanding.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Consider breaking down stories that consistently lead to wide estimation\\nranges.\")), mdx(\"h4\", {\n    \"id\": \"potential-challenges-and-solutions\"\n  }, \"Potential Challenges and Solutions:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Dominant personalities influencing estimates: Use silent voting and enforce\\nequal speaking time.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Estimation fatigue: Take regular breaks and limit session duration.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Lack of domain knowledge: Involve subject matter experts or defer estimation\\nwhen necessary.\")), mdx(\"h3\", {\n    \"id\": \"5-digital-implementation-my-open-source-scrum-poker-project\"\n  }, \"5. Digital Implementation: My Open-Source Scrum Poker Project\"), mdx(\"p\", null, mdx(\"span\", {\n    parentName: \"p\",\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"3840px\"\n    }\n  }, \"\\n      \", mdx(\"span\", {\n    parentName: \"span\",\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"52.6%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsTAAALEwEAmpwYAAABkUlEQVQoz52SS0vDQBSF+4PFjWhrVVQQ6hMsiBtBXYitgis3bkRxI/4CER9tkmoDNc1kMjNpUtrjvVNbERQfA4cLc+755k4mubXiEZbzh6QKStP7KM1vozS3jcVCGQtTm1jID7RoVR5pqVjG+uweVvJVrBYqWJ85xmqxihx+XH38fnWR08pAxRpSxoiEhAgF2u0QwWuAiPYSajO2FZBKISRPiAgykohjBc4bnSBNMwRBG7k0TdHpdGCMgdaamggcRYgp7D/VcLuzD2djC271BK3nZ2ijocjj/iRhUIosy9Dr9Wzua6AQMN0Md+cXuBqfxMvuAS7HJvB4fYOk27U9fwJKKa0pSYrAMV1XU4g91p8nHAGp8r5KjK3/BrIRiQFQBgGC+wfEYUjf9QPIvd8C2RgC7UQUUBTUnQSR48I/PYN8acKkdPA7iIcY1k/AocEg3vA8D47joE7i6tLLeq0W3EYDrutan9VsNm2G8zwUA0O6xWhClqDXrdVqAxCFR6rX4VFtEHQo3/c/Xbnf79P/28YbfVgwSfQTLK0AAAAASUVORK5CYII=')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  }), \"\\n  \", mdx(\"picture\", {\n    parentName: \"span\"\n  }, \"\\n          \", mdx(\"source\", {\n    parentName: \"picture\",\n    \"srcSet\": [\"/static/f3743b18200fabb5aad38ed8147b5b27/a3bc4/scrumpoker-1.webp 2500w\", \"/static/f3743b18200fabb5aad38ed8147b5b27/e3ad8/scrumpoker-1.webp 3840w\"],\n    \"sizes\": \"(max-width: 3840px) 100vw, 3840px\",\n    \"type\": \"image/webp\"\n  }), \"\\n          \", mdx(\"source\", {\n    parentName: \"picture\",\n    \"srcSet\": [\"/static/f3743b18200fabb5aad38ed8147b5b27/412e4/scrumpoker-1.png 2500w\", \"/static/f3743b18200fabb5aad38ed8147b5b27/353b0/scrumpoker-1.png 3840w\"],\n    \"sizes\": \"(max-width: 3840px) 100vw, 3840px\",\n    \"type\": \"image/png\"\n  }), \"\\n          \", mdx(\"img\", {\n    parentName: \"picture\",\n    \"className\": \"gatsby-resp-image-image\",\n    \"src\": \"/static/f3743b18200fabb5aad38ed8147b5b27/353b0/scrumpoker-1.png\",\n    \"alt\": \"Scrum Poker app main screen\",\n    \"title\": \"Scrum Poker app main screen\",\n    \"loading\": \"lazy\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    }\n  }), \"\\n        \"), \"\\n    \"), \"\\n\", mdx(\"span\", {\n    parentName: \"p\",\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"3840px\"\n    }\n  }, \"\\n      \", mdx(\"span\", {\n    parentName: \"span\",\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"54.68000000000001%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsTAAALEwEAmpwYAAABrklEQVQoz5WSzSuEcRDHnz/NYffZQg7S1paDtCcHFxdulOLEQSm5KXHgQNIeJCdKuVCUskK7ep5nH8/z/J63fV6/fjP2QSQcvjXTzHxmmhmlWq2iXq+jVquhUqm8S1XVnj7bKsqlEkpfpKpl9PcPoDw4DEXXdXieB8dxWLZtw7IsmKbJovhds4l7qWbznn2KkyifctrtFvSOifOHGEqe50iSBFEUIQxDBEHADVzXZXmekBBNykRHFgnXlzk+53a7Xa7NsgzEAXIoBKIAJfi+zzAhBGzZ3RU2bh4dPOsGnNtp3F1MoKs3ILyMG1HzAhzHMeIkhULG1+mEoMlcaHKqsclDLC4dYHV5HqPjC3i43kcY5RwvYFRPk6bpL8D2cwfqyBamZrYxO7eGvqEN3F41EMXZ/4Bv+xNy4RZ29q5wfHKJ06N17G6uQH86gx8m8P8LpAvSLrM0lIqQxg6Qvsg9U9zjff8JSIkEJNjbGzkwjA5eLGk7PsM8vv4HlBg/Aot3ISBfW/5l8ZOaprEoj2r4sr364n2+AYMgfH9a8skmsGEYaLVaDCzehHyqI1gBfAWArhgpkvPffgAAAABJRU5ErkJggg==')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  }), \"\\n  \", mdx(\"picture\", {\n    parentName: \"span\"\n  }, \"\\n          \", mdx(\"source\", {\n    parentName: \"picture\",\n    \"srcSet\": [\"/static/7b459940b13a67bbd34c5d779d5204c4/a3bc4/scrumpoker-2.webp 2500w\", \"/static/7b459940b13a67bbd34c5d779d5204c4/e3ad8/scrumpoker-2.webp 3840w\"],\n    \"sizes\": \"(max-width: 3840px) 100vw, 3840px\",\n    \"type\": \"image/webp\"\n  }), \"\\n          \", mdx(\"source\", {\n    parentName: \"picture\",\n    \"srcSet\": [\"/static/7b459940b13a67bbd34c5d779d5204c4/412e4/scrumpoker-2.png 2500w\", \"/static/7b459940b13a67bbd34c5d779d5204c4/353b0/scrumpoker-2.png 3840w\"],\n    \"sizes\": \"(max-width: 3840px) 100vw, 3840px\",\n    \"type\": \"image/png\"\n  }), \"\\n          \", mdx(\"img\", {\n    parentName: \"picture\",\n    \"className\": \"gatsby-resp-image-image\",\n    \"src\": \"/static/7b459940b13a67bbd34c5d779d5204c4/353b0/scrumpoker-2.png\",\n    \"alt\": \"Scrum Poker app room screen\",\n    \"title\": \"Scrum Poker app room screen\",\n    \"loading\": \"lazy\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    }\n  }), \"\\n        \"), \"\\n    \"), \"\\n\", mdx(\"span\", {\n    parentName: \"p\",\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"3840px\"\n    }\n  }, \"\\n      \", mdx(\"span\", {\n    parentName: \"span\",\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"52.6%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAAAsTAAALEwEAmpwYAAABiklEQVQoz32SSU/DMBCF+78REi2QVtANxAHxHzhyQULckRAXkNoeadlKYsd2Vmd5zKRYKhQa6cnbzDdvHLfG41OMRieN+v0hPK+HbreHQxq93hl6R+fY6xzjoNNGp72P9reOvC6GFD8YjNAnjU/O4B16aGHbF98iCS6BegJd/RdkkUQCaW4hI4NWHMeIogjGGCilEEoJIULIYAEz3cXH4w7s4gLP7zVEECAMw0Za6ybP/1xi8faKt8kMs+sbtPI8R5ZlSJIEDGew1jGUnKMQT0AK5PKe3GYoyIEhCIM4Pk3TVTzJCIn5ZLoN+AL7cYVKPiBfXsMSODOqOV8Hcm5OKusais7+AWpqP0Tk3yFe3lD1GTljN3oDyPnWWlRVBUVXsQWoqGJGsoioXaNXsK1AytkAcjADWUYrGlXjls9cjJtzHmsDyJXWgxnGa3bjXPu+34jXZVnCGSmKopkzUNIL+eGQK3EAF+AkBrli7mnxOYv3AnpGDl7TTxFC/A10d8V7rn3n/ne7rmUH/AIoOTbJqMMlAwAAAABJRU5ErkJggg==')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  }), \"\\n  \", mdx(\"picture\", {\n    parentName: \"span\"\n  }, \"\\n          \", mdx(\"source\", {\n    parentName: \"picture\",\n    \"srcSet\": [\"/static/e557c216b492ad51fe373498cab599c2/a3bc4/scrumpoker-3.webp 2500w\", \"/static/e557c216b492ad51fe373498cab599c2/e3ad8/scrumpoker-3.webp 3840w\"],\n    \"sizes\": \"(max-width: 3840px) 100vw, 3840px\",\n    \"type\": \"image/webp\"\n  }), \"\\n          \", mdx(\"source\", {\n    parentName: \"picture\",\n    \"srcSet\": [\"/static/e557c216b492ad51fe373498cab599c2/412e4/scrumpoker-3.png 2500w\", \"/static/e557c216b492ad51fe373498cab599c2/353b0/scrumpoker-3.png 3840w\"],\n    \"sizes\": \"(max-width: 3840px) 100vw, 3840px\",\n    \"type\": \"image/png\"\n  }), \"\\n          \", mdx(\"img\", {\n    parentName: \"picture\",\n    \"className\": \"gatsby-resp-image-image\",\n    \"src\": \"/static/e557c216b492ad51fe373498cab599c2/353b0/scrumpoker-3.png\",\n    \"alt\": \"Scrum Poker app room screen  card revealed \",\n    \"title\": \"Scrum Poker app room screen  card revealed \",\n    \"loading\": \"lazy\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    }\n  }), \"\\n        \"), \"\\n    \")), mdx(\"p\", null, \"To facilitate remote estimations, I\\u2019ve developed an open-source Scrum Poker\\napplication that bridges the gap between traditional methods and modern,\\ndistributed teams.\"), mdx(\"h4\", {\n    \"id\": \"key-features\"\n  }, \"Key Features:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Real-time WebSocket communication for instant updates\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Create custom estimation rooms\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Invite team members via simple links\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Unlimited estimation questions per room\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Ad-free and open-source experience\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Cross-device compatibility\")), mdx(\"h4\", {\n    \"id\": \"why-my-app-is-perfect-for-scrum-poker\"\n  }, \"Why My App is Perfect for Scrum Poker:\"), mdx(\"ol\", null, mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Remote-Friendly\"), \": Brings distributed teams together in a virtual\\nestimation space.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Real-time Collaboration\"), \": WebSocket technology ensures everyone\\u2019s in sync.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Flexibility\"), \": Create rooms on the fly for impromptu estimation sessions.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Transparency\"), \": Simultaneous result viewing maintains Scrum Poker\\nprinciples.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Ease of Use\"), \": No physical cards needed - just click and estimate.\")), mdx(\"h4\", {\n    \"id\": \"tech-stack\"\n  }, \"Tech Stack:\"), mdx(\"p\", null, \"Built on the AstroX template, my app combines Rust\\u2019s Actix framework with\\nAstro\\u2019s frontend capabilities, delivering a powerhouse of performance and\\nusability.\"), mdx(\"p\", null, \"Check out the demo at\\n\", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://scrum-poker.spaceout.pl\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"scrum-poker.spaceout.pl\"), \".\"), mdx(\"p\", null, \"For developers looking to contribute or self-host:\"), mdx(\"ol\", null, mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Ensure you have Rust (rustc > 1.74) and Node.js (> 18.14) installed.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Clone the project from my\\n\", mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://github.com/yourusername/scrum-poker-app\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"GitHub repo\"), \".\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Run \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"cargo run\"), \" and follow the interactive CLI for setup.\")), mdx(\"h3\", {\n    \"id\": \"wrapping-up\"\n  }, \"Wrapping Up\"), mdx(\"p\", null, \"As an engineering manager, I\\u2019ve found Scrum Poker to be an invaluable tool for\\nproviding accurate estimates to the business. Whether used with physical cards\\nor my digital app, it remains a cornerstone of effective Agile estimation. It\\u2019s\\nabout more than just numbers - it\\u2019s about fostering collaboration, leveraging\\ncollective wisdom, and continuously improving our estimation skills.\"), mdx(\"p\", null, \"Remember, the key principles remain constant:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Always estimate as a team, never alone\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Encourage open discussion\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Respect diverse perspectives\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Aim for consensus, not compromise\")), mdx(\"p\", null, \"By combining time-tested Scrum Poker methods with modern technology, we\\u2019re\\nsetting the stage for more accurate, efficient, and enjoyable estimation\\nsessions. Give my app a try, and let\\u2019s make those sprint plannings smoother than\\never!\"), mdx(\"p\", null, \"Happy estimating, folks!\"), mdx(\"hr\", null), mdx(\"p\", null, \"Sources:\"), mdx(\"ol\", null, mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://www.mountaingoatsoftware.com/agile/planning-poker\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"Mountain Goat Software - Planning Poker\")), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://www.atlassian.com/agile/project-management/estimation\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"Atlassian - Agile Estimation\")), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://www.scrum.org/resources/blog/what-planning-poker\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"Scrum.org - What is Planning Poker?\")), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://www.agilealliance.org/glossary/planning-poker/\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"Agile Alliance - Planning Poker\")), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://scrum-poker.spaceout.pl\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"Scrum Poker App Demo\"))));\n}\n;\nMDXContent.isMDXComponent = true;","tech":["Rust","Astro","Actix","ReactIcon","TS"],"category":"Project","appDescription":"Estimation app for agile teams","hero":{"full":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAMEAf/EABUBAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAHJWdJeIjXMXKD/xAAbEAADAAMBAQAAAAAAAAAAAAAAAQIDERITIv/aAAgBAQABBQKEV9ndI62doetzjn0zSpR//8QAFxEAAwEAAAAAAAAAAAAAAAAAAAESUf/aAAgBAwEBPwGWSymU9P/EABYRAQEBAAAAAAAAAAAAAAAAAAAREP/aAAgBAgEBPwFcj//EABwQAAICAgMAAAAAAAAAAAAAAAABECERYQIxUf/aAAgBAQAGPwLcYLeNDs7OK9RUf//EAB0QAAIDAAIDAAAAAAAAAAAAAAERACExQVFhcYH/2gAIAQEAAT8hBovyyIVaNMJjFqsgaCgOAjgFDrPMP3OoUU003AxFa2fJ/9oADAMBAAIAAwAAABBv/wCC/8QAFhEBAQEAAAAAAAAAAAAAAAAAAGEB/9oACAEDAQE/EI6jqurn/8QAFxEBAQEBAAAAAAAAAAAAAAAAABEBUf/aAAgBAgEBPxC4hMRx/8QAHhAAAgICAgMAAAAAAAAAAAAAAREAITFxQVFhofD/2gAIAQEAAT8QEIEgpBlxqN0YsKH24VdjFoAq84XqMgjFBFUwR35hREGcqNe45qpPlQwHtIMWtxi6T//Z","aspectRatio":1,"src":"/static/e1b0c4b179faa72db32da6b7efb166c0/58fe7/scrumpoker.jpg","srcSet":"/static/e1b0c4b179faa72db32da6b7efb166c0/e0f30/scrumpoker.jpg 236w,\n/static/e1b0c4b179faa72db32da6b7efb166c0/86afd/scrumpoker.jpg 472w,\n/static/e1b0c4b179faa72db32da6b7efb166c0/58fe7/scrumpoker.jpg 944w,\n/static/e1b0c4b179faa72db32da6b7efb166c0/0ff54/scrumpoker.jpg 1200w","srcWebp":"/static/e1b0c4b179faa72db32da6b7efb166c0/99fbb/scrumpoker.webp","srcSetWebp":"/static/e1b0c4b179faa72db32da6b7efb166c0/77392/scrumpoker.webp 236w,\n/static/e1b0c4b179faa72db32da6b7efb166c0/1f177/scrumpoker.webp 472w,\n/static/e1b0c4b179faa72db32da6b7efb166c0/99fbb/scrumpoker.webp 944w,\n/static/e1b0c4b179faa72db32da6b7efb166c0/9000d/scrumpoker.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%2076a387%20387%200%20003%2074c-1-4%202-3%203%200v3l-1%202c0%202%200%202%201%201l2-1%203%202%201%201c-1%201%200%204%202%204l2%202%202%202%204%201v1l1%201h-1c-2-1-2-1-2%201l1%202v2c-1%202%200%205%201%203%201-1%201-1%201%201v2h3l22-11a4484%204484%200%200141-25l-2-2v-2l2%202c2%202%202%202%204%201%203-1%206%200%204%201v1c2-1%204%201%202%201-1%201-1%201%201%201%201%200%202%200%202%203%201%209%201%2011%203%2011%203-2%201%202-3%203-2%201-3%202-2%203l-1%202v-1c0-1-1-1-4%201-5%202-6%203-5%204s1%201-1%201h-1l-1%202v-1l-1-1-1%202h-1c-2%200-2%200-1%201s1%201-1%202c-3%201-4%201-2-1%202%200%202-1%201-1v-5l-2%203c-2%203-2%203-5-3l-3-4%202%206%202%206%201%201%201%201-2%201v-1l-1-1-1%202c1%201%200%201-1%201h-1l-1%202v-1h-3c-2%201-2%201-1%202s1%201-1%202h-2l1-1-1-2h-1c1%201-1%203-6%205-5%203-6%204-5%205v1c-3-1-9%202-7%203v1c-1%200-1%201%201%206l-1%201-2%201h-1v-2c-2%200-2%200-1-1v-1l-2-1-2-1-2%202h-2v1c1%201%201%201-1%201h-1c1%201-12%209-15%208l-1%201h-1l-1%201v1c-1%200-3-1-3-3-1-1-1-2-2-1v5l1%202v3c-1%200-2-1-2-3l-2-5-2-3c-1-5-2-2-2%206l1%208%201%201h2l3-2%202-1c1-1%201-1%201%201l-3%204c-3%202-3%202-1%202%203%200%203%201%201%203-2%201-4%200-4-2%201-1%201-1-1-1l-2%201a2685%202685%200%20000%20154v13h5l5-1h2c1%201%202-1%202-3l2-4c1-2%202-4%201-5v-3c2-1%200-4-1-3-2%200-4-4-2-5%201-1%200-4-1-5v-2c-1%200-1-1%201-3s2-2%203%200c0%202%205%202%207-1%202-2%203-2%202%202%200%203%200%203%201%202s1-1%201%201v2l1-2c1-2%201-2%201%200%200%201%200%202%201%201%202%200%205%202%205%203l3%204%203%203%202-2c2-2%203-4%202-5%200-1%202-2%203%200%200%202%203-3%203-5l-3-1c-3%200-6-2-6-3%200-2%204-2%206%200h2l1%201-1%201c2-1%205%201%204%202l2%203v3l4%201c2%200%203-1%203-2h2c1%201%202%202%203%201%202%200%202%200%201%202v4c1%202%200%203-3%201-2-1-3-1-3%201v2l-1%201-1%201%202%201c3%200%204%202%202%204-3%201-2%202%200%202%202-1%202-1%202%201l-1%202-2%202c-1%201%200%201%206%201l6-1h5c1%202%206-1%207-4l4-3v1l-1%204v3h7l7-1c-1-2%201-5%206-8l3-3-1-1h3l-1-1%201-2c2-2%202-2%201-3s-2-2-1-3l-1-1c-2%201-2%201-2-1%201-1%200-1-1-1-2%201-2-4%201-6l1-3%201-2%201-2c1-2%203-2%206-1h1l18%201h2a495%20495%200%200187%201l2%203%201%203%201%204%201%203v5c2%201%2010%200%2012-2%203-2%205%200%203%203-2%202-2%202%200%202%202%201%202%201%201%202s-1%201%201%201c2%201%202%201%202%205-1%205-1%206-4%203l-2-1-1%202c-2%201-2%204%200%204l1-1h1c0%202%205%201%205%200h2l72%201h72v-14c0-7%200-13-1-12-1%202-1%202-2%201l-1-3-1-1v-6l-1-2c-1-1-1-1%201-2%203-2%204-1%204%204a3201%203201%200%20000-159l1-103V0h-21l4%204c12%2010%2016%2030%209%2044-2%204-5%204-8%201%200-2-2-3-2-2l-4-3-9-7-2-1c-1-2-18-9-19-8l-4-2h-5l-2-1c1-1-3-2-6-1h-3c0-2-1-2-1-1h-3l-2-1c-2%202-1-3%201-8l7-9%205-5h-17l-17%201h-16v2l1%201c-1%201-7-2-7-3l-7-1c-8%200-10%201-6%203%202%200%202%200%201%201-2%201-3%200-5-2-2-3-4-2-2%201%202%202-2%205-6%204-4-2-5-4-2-4l4-2c2-1-1-1-27-1-27%200-34%201-31%202h2c2%200%202%200%201%202v4l-1%201h-2l-2%201c-1-1-2%200-2%201l-2%201%201%201c1%201%202%201%201%202-2%200-1%202%201%202l3-3c1-1%202-2%204-1%202%200%203%200%203-2l3-2c2-1%202%200%202%203l-1%204-1%202%203%201c2%200%204%200%207%203%202%202%203%203%204%202h2c1%201%202%202%203%201%202%200%201%201-1%203-1%201-1%201%201%201s5%202%205%203l-2%201%202%202c2%201%203%202%203%204l3%206c3%204%204%206%201%206l-1%201%203%201%204%201h4c3-1%203-1%204%202%202%203%200%208-3%206h-4%201c2%200%206%205%206%208%200%202-1%203-2%201-1-1-1%200-1%201%200%202-1%203-3%204s-3%203-2%203c0%201-1%202-3%202l-3%202-1%201c-1-1-8%204-9%205l-2%201-3%201c-2%202-6%200-5-2l-1-1v3l-1%203v2c-3-1-5%200-3%201%201%201%201%201-1%201h-1c1%201%201%201-1%202h-2l-1-1-1%202h-1c-2%200-5%202-4%203h-2v1c1%201%201%201-1%201h-1v2l5%201c3-1%204%200%204%207%200%205%201%206%202%206%202%200%203%200%203%202s0%202-1%201c-1-3-3%201-3%206%200%203%201%204%204%206%204%203%205%207%202%208v-1l-2-2-2%201c0%203-3%203-5%202v-2c2%200%202-1%202-9-2-23-2-23-5-23l-2%201%201%201h1c0%203-3%202-4-1%200-2-1-3-2-3h-4c-2%200-2%200-1%201v1c-3-1-5%200-3%201%201%201%201%201-1%201h-1c1%201%201%201-1%202h-2l-1-1-1%202h-1c-2%200-2%200-1%201s1%201-1%201h-1c1%201%201%201-1%202h-2l-5%201-2%203c1%201%201%201-1%201h-1l-1%202v-1l-1-1-1%202h-1c-2%200-2%200-1%201s1%201-1%201h-1c1%200%201%201-1%202-2%202-3%200-4-7v-5l-1%205c-1%207-1%207-12%2014l-9%205-12%201c-12%200-16-1-16-4h2c1%202%203%202%2013%201h11l9-6%2010-7c0-2%200-2-3%200l-6%203-3%203-1%201-3%201c-4%202-23%203-25%201l6-1c1%200%202%200%201-1l1-1%201%201h1l2-1%202-1%202-2c3%200%209-4%2010-7l2-4%201-2c0-2%200-2-2-1-3%203-8%205-11%205h-3l3-1%205-2v-1c-2%200-2%200%201-2s5-4%205-6c0-3-2-2-2%201-1%203-1%203-3%202l-1-1-1%202h-7v-1l-2-2c1-2%202-4%202-2s1%203%202%201l-1-4-2-7c0-2%200-2-2-1l-2-1%202-1v-1l2-2h-4c-5%200-6%200-4-1l2-2%202-1h3l1-2%202-4v-1l2-6%201-2c0-3-2-2-3%201l-1%201c0-3%201-5%203-5l1-1c1-1%201%200%201%202%200%205%201%206%204%2010%203%203%204%204%204%209v5l1%204%202%206%201%203c-1%201%200%202%202%201h4l-2%202a1067%201067%200%200145-24c16-9%2016-8%2010-8-4%201-5%201-7-1h-3c-1%202-1%202-3%201v-1l1-1h-1c-2%201-4%200-2-2l-1-1-1%201-2%203v-1l-1-3-1-2v-5c-2-4-2-4-4-2-1%202-2%202-2%201-1-2-3%200-2%204l-1%203v2c0%202-1%203-4%201-2-2-4-2-4%200h-2c-2-1-1-2%201-4l3-3h-3l-3-2-1-1-2%201c0%202-2%201-4-1s-2-2-3%200c-2%201-2%201-3-2s-1-3-3-1c-1%201-1%201-2-1l-4-9h-2c-1%200-1-1%201-2v-1h-2l1-1%201-2c-1-3-5-5-6-3l-2%201-1%201v1c-2%200-2-2-1-3%202%200%202-4%200-5l-1%202c1%201%200%202-2%203-4%202-4%203%200%202h3l-3%201c-3%202-5%202-4-1l-1-1v-4l2-3%203-1h-3l-2-1v-4c0-2%201-3%202-3l1-2c1-1%200-1-1-1-4%200-5%200-3-1l-1-2h-1l-1%202-2%201c-1%201-6%200-6-2l1-2%203-2c2-2%204-2%204-1h3c2%200%203%201%204%203%202%205%203%206%206%205%202-1%203%200%205%202s3%202%205%202h7c2-1%204%200%202%201v1l3-1v-4l-1-4-1-2v-1l-1-1%201-2%201-1-1-1c-2%200-2-2-1-4h10l2-2c4%200%205-2%203-4-2-1-1-4%201-3l1-1h5l1%202-1%201%202%201%203%201c1%201%201%200%201-2%200-5%200-6%203-4%201%201%202%201%203-1%201-1-1-1-15-1-16%200-17%200-16%202%201%201%201%201-1%202l-2%202h-4c-1-1-1-1%201-3%204-2%204-3%201-3-1%200-2%200-1%201l-1%201-3%201-2%202-3-2-3-3H0v76m0%201c0%2047%201%2057%201%2024%200-46%200-52%202-51l1-1-1-1c-3%200-3-30-1-32v-2L1%207%200%2077m325-36c-2%200-1%203%201%203l2%201%203%203%205%202c2%201%202%201%202-1l2%201c2%203%206%203%208%200l3-2%201-1-1-1c-3%201-8-1-8-3l-2-1-1%202c1%202-5%201-8-1-2-2-5-3-7-2M122%2052c-1%201-2%204-1%207%200%202%200%203-1%202%200-2-2-1-2%201l-1%201c-2%200-1%202%202%203%202%201%203%201%208-2l5-3c0-2-3-3-4-2l-3%201c-2%201-2%201-1-1V49l-2%203M53%2062l-9%206-3%203%202%202h3c1-1%201-1%201%201h1l1-1v1c0%202%202%204%204%203v1c0%202-1%202-4%200l-2-1%203%203c1%201%202%202%201%203l1%201h1v4l1%202%201-3c0-1%200-2%201-1%202%200%201-1-1-3-1-1-1-1%201-2s2-1%201-3c0-2%200-2%201-1l1-2c-1-4%200-4%201%200%201%202%201%202%202%201l-2-4v-2l1%201h1l1-2c0-3%200-5%201-3h1l3-1v1l-1%203-1%204c-1%201%200%202%201%204%202%201%203%203%201%203h-3l-3%201%202%202c2%202%202%203%200%204h-2l-1%201%201%201%201%201h-1c-1-1-5%202-4%203h1l2-1-1%203v2c1%201%201%201%202-1%201-3%206-8%207-7v-1c-1-1-1-1%200%200l1-1v-1c2%202%202-1%200-2l-1-2%203%201c0%202%204%201%207-1h8c8%202%2010%203%203%202-7%200-11%200-16%204-6%204-8%206-6%208v2l-1%202c1%202%203%201%203%200-1-3%201-2%206%204l4%205c-2-1-3%201%200%201h2c-2-2%201-1%204%202l1%203c-3-1-3%200-1%201l3%201%205%203c5%204%205%205%202%2011l1%202%202-3c0-2%201-3%202-3v-2h2l4-1c1-3%200-7-2-7l-2%201v2c0%203-1%204-2%203l-1-5c0-2%200-3-2-4-3-2-1-4%202-3%202%200%202%200%201-2-2-2-4-3-6-1-1%201-2%200-5-2l-4-3%205-2c4-2%204-2%205-1l2%202%201%201c1%202%202%203%204%203%204%200%206-2%203-2l-3-2v-2l1-1%201-1c4%200%204-1%201-4l-9-8h-1l-1-1c1-1%200-2-1-4l-2-2%207-4c9-4%209-4%205-7l-3-2-8%204c-8%204-12%205-9%201%202-1%200-3-1-1-1%201-3%200-6-2-5-5-6-5-10-4h-3l2-1%202-1h-1l-3-1c-1-3-5-2-11%201m259%2030l-2%202h-4c-2%200-2%202%201%204%202%202%202%202%203%201h1c1%202%200%205-1%203l-2-1v1l-1%201h-1c0%201%202%203%204%203s2%200%200%203l-2%203%202%201%202%202%201%201h1l-1%202h-2c1-2%200-3-2-2s-2%201-1%202c2%201%201%202-3%204-5%202-5%203-3%204l1%202-4-2-4-2h-1l-3-1c-4%201-3%203%201%203%201-1%202%200%203%201s2%202%203%201l2%201-1%201c-2%200-1%203%201%205l3%205%201%202v2c0%201%202%202%203%200h1c1%202%201%203-1%202-2%200-2%200-1%202l1%203v1l1%201%202-1-1-1c-1%200-1-1%201-1%202-2%203-2%203%200h3c3-2%204-3%201-3l-1-1v-5l3-7c1-3%202-5%201-7s-1-2-4%200h-3c-1-1%205-4%208-4v2h1c1-2%205%207%205%2011%200%203%202%205%205%204l1-6c-1-6-1-6%201-5l1%201c0-1%200-2%201-1l1-4c0-3%200-3%201-1%202%206%200%2014-3%2012-1-1-1-1-1%201%201%204-6%208-8%204%200-2-2-3-3-3l-1%202h-2c-2%200-3%201%200%203h2l1-1h2v2h-1v1h-2v1l-4%204c-6%204-6%204-6%201-1-2-1-2-1%200l-1%203c-2%200%200%201%203%202l2-1c0-2%204%203%204%205s-4%206-10%208c-4%202-9%202-13%201-3-2-3-2-6%201l-4%201-2-1%201%202-5%205c-6%204-7%205-6%203l-1-2-1%202c1%201%200%202-1%203-3%202-2%203%201%203%208-2%209-2%208%201l1%203%201-1h1v3l1%202%201%201%201%201h-1l-2%201%202%201%201%202h2c4-3%204-2%203%201%200%203%202%206%204%204%201-4%205%200%204%203v4l-4%201-2%202-1%201-2%201%202%201%201-1h3l2-1c0-3%202-2%204%200l4%202%202%201c0%202%201%202%203%201h1c0%202-1%202-3%202l-1%201c-1%201%201%204%203%204l1%201c1%201%201%200%201-1-1-2%201-2%205%202l2%201%201%201c1%201%201%201%204-1%202-3%203-3%204-2h4c1-1%202%200%203%202l1%202h-4l-2%201-3%202c-4%202-2%206%201%204l2%201-3%201c-2%200-4%202-2%202v1l-1%202-2%201h-1c3%200%202%203-1%204-4%202-2%203%203%203l4-1v8l-1%207c-1%207-1%207%201%205%202-1%202-1%202%203v3l-2-2-3-1%202%203%201%202h-5c-3%202-2%203%201%202%203%200%203%200%202%201l1%201h2l15%201c15%200%2016%200%2018-2s2-3%201-3c-3-1-2-3%200-3s5-2%204-3l1-2%201-1h-1l-1-2%201-4%202-1%201%204%202%201v2l-2%202c1%201%2021-18%2021-21%200-2-8-9-12-10-2-1-3%200-29%2023l-13%2012-3-2-3-1v-10c0-9%201-13%204-13%201%200%205-5%204-6l1-1c1%201%201%200%201-2s0-3%202-5c3-2%204-6%202-6v-1l1-2%205-1c6%200%206-1%200-4l-6-3h-2c-2%200-2%200-1-2l-1-3-1%201-1%202c-3%201-6-1-4-4h5c-1-1%200-1%201-1%202%200%201-5-2-8v-2c2-1%203-3%201-3-3%200-5%200-3-1s2-1%201-3v-1l3%201h3l-3-1-2-1%202-2c2-1%202-1%201-2l-2-3h-1l-2%202%201-2c2-2%203-3%201-3-2-1-2-1-2%201h-1c-2%200-3%201-2%203l-1%201c-2-1-2-5-1-6l1%201h2l1-3v-1l1%201%201%201v-11c1-3%200-5-1-4-2%201-2%200-1-6v-8l-4%203c-5%204-5%205-5%203l1-2c2%200%204-3%204-4l2-1c2%200%203%201%203%202h3l-1-2-2-1%203-1%204-12v-10l-4-14-2-3v-2c1-1%201-1-1-1l-1-2-1-1h-1c-1%201-4%200-4-1h1l1-1%201-1v-1l-1-1-1-2-1%202c0%202%200%202-1%201v-2l-2-1v-3h1c1%201%201%201%201-1l-1-2h-2c-1-1-2-1-3%201l-2%203v-3l-1-2c-3-1-5%201-5%203h-3v-2l1-1-1-1-1%201M29%20104l-8%205h-2l2%203c3%203%204%204%205%203l6-6c-2%200-2-3%201-4%203-2%207-1%205%201h3c2-1%202-2-1-4l-2-3-9%205m245-1l-5%205-2%201-1%201h-1l-1%201c-2-1-4%200-3%201l-1%201h-1l-2%202-1%201c1%201%201%208-1%208-2%201-2%201-2%203h3l-1%203h-2l-2%202v11c-2%202-2%202%200%202v7l4-2%204-2-4%204a244%20244%200%2000-18%2011l-4-2c-5-3-6-3-13%202-5%203-6%204-7%202l-3-1v4c-2%202%200%205%201%203%202-1%203%200%202%202v2l1%201v1c1%201%201%201-1%201h-1c1%201-3%203-6%203v2c-1%201%200%201%201%201%204%200%209-4%209-6v-3l1%201c0%201%203%202%204%201s3%200%206%203c2%202%205%203%207%203%203%200%203%201%203%206h4c2%200%203%200%202%201-1%203%203%205%204%202%202-1%202-1%202%203%200%202%200%203-1%201l-1-1c-2%200-1%207%201%208%203%203%200%202-4-1-3-2-4-4-3-5l-1-2-1%201c1%201%200%202-1%202l-1-1-9-9c-8-7-9-7-11-6l-5%203a1094%201094%200%20018-1l13%2011-1%201-1%202h-2l-1%201v1c-1-1-6%201-7%203l-4-2-4-3-3%202c-2%203-2%203-5%201l-4-4-6-4-2-2-1-1-1%201c0%201-3%202-4%201h-2v1l2%201-4%201c-4%200-2-3%205-8%204-3%205-4%204-6l1-2c1-1%201%200%201%201%200%202%200%202%201%201%202-1%202-1%200-3l-1-4-3-4c-4-3-5-6-3-8l-6-7c-7-6-7-6-10-4-2%201-2%201-5-1l-4-4c0-2-2-4-4-6l-3-5-1-2c-2%200-2%201-1%202l-1%202c-1-1-21%2010-20%2012h-1l-1%201%202%201c1-3%208%206%208%2010%201%203%204%2010%205%208l5%205c3%202%206%206%209%207l10%209c5%206%206%206%205%209-1%202-1%203%204%208l6%205%203%203%202%202v-3l2%201c0%202%203%202%205%201l5-1c2%201%202%201%200%202l-2%202h3l-2%203c-2%201-2%203-2%204v4l-1%201-2%203c0%204%200%204%201%203%203-2%203-1%202%202l-1%203h-1l-1%201v1l-1%201%203-1c2-2%203-4%204-12l2-11%2010%208c4%205%209%208%209%208l1%202c0%202%200%202%201%201%202-1%202-1%202%201l2%201%201%201v2c-2%202-1%203%201%201%203-2%203-7%201-5v-2h-3l1-2h4a153%20153%200%200021%2020%202598%202598%200%200036%2029c5%200%206%200%207-2s1-2%203-1c2%202%207-1%206-4l2-2v-3l1-3h1l-1-2v-7l-1-2c-1-1-1-1-1%202v3l-5-4c-4-3-5-5-5-7h-1c0%202%200%202-2%200s-2-5%201-3h1l-9-10c-9-7-9-7-13-6-4%200-4%200-10-5l-9-7-2-4%201-2%201-3%201-1%201-1h1v8l5-4%205-4%202%202%202%202-1-3c-2-2-2-2-1-3l2-2h-1l-1-1c1-1-1-1-4%201-5%202-4%201%200-3l5-3-3-2-7-6c-4-3-8-3-5%200%202%202%202%204%201%204l-2-1-3-1c-3%201-3%200-3-3%200-2%201-3%202-3%202-1%202-2%202-4l1-1%201%201%203-1c4-3%206-4%206-1l1%201v-3c-1-1%202-3%207-6%208-5%208-5%208-9l1-4v3l1%203%206-4%208-4v-1l1-1%201-1-1-8v-3l1-1-2-1h-2l1-1%201-1h-3c0-1-1-2-2-1v-1c3-2%202-3%200-2-3%202-3%201-1-1v-3h-3c1-3-3-3-6%200h-4c1%201-1%203-4%205-6%202-6%202-8%201-3-2-3-2-2-5v-4c0-1%201-2%203-1%203%200%203%200%202%201l-1%201h2l3-3h2l1%201c2%200%203-2%204-4l4-6%205-3%202-1h1l1%201v2l-1%201c1%201%209-3%209-4l-2-1%201-1%201-2v-1l1-9-1%201v1l-1-1-4-1h-3c0-1-6-1-7%201l-1-1-2-1-2%201h-7m-119%2056l-6%203%204%203c4%202%205%203%209%201%201-1%203-2%204-1%203%200%203-2%200-4l-4-4c0-2-1-2-7%202m172%207l-1%203v2c0%202-1%203-3%202l-1%201v3l-1%202-1-1v4l-1%205-3%203-3%202h5c-1%201%200%202%201%203%201%202-1%204-4%203l1%201%201%203%202%202c4%201%204%202%201%201-4%200-5%201-3%203%201%201%202%202%201%203h1c2-2%201%201-3%204-3%203-4%204-3%206l1%203%204%201c4%202%208%202%209%200h2l1%201v-4l-2%201c-2%202-3%201-3-4%201-4%201-5-1-5-1-1-1-1%201-1s4-2%202-2v-5c-1-2-1-3%201-3h4c1%200%202%200%201-2l-1-1-1-1c-1-1%200-3%203-5l2-4-5%204-4%203%201-8c1-2%200-13-1-14v-2c2-1%203-10%201-10l-1%203M1%20178c0%2011%200%2012%202%2012%203%201%205%200%203-1-1-1%200-2%204-4l5-3h2v-1c-1-1-1-1%201-1h1l-1-1-3-5c-3-3-4-5-3-6H9c-2%202-3%202-3%201l-1-2v2H4l-1-1-1-1c-1-1-1%203-1%2011m109%201l1%203c2%201%202%202%201%202l2%205%204%202c0-2%201-2%204-2l4%201%201%201v-1c0-1%201-2%203-2%204%200%205-1%205-3-1-2-2-2-9-2-8%201-8%201-11-3-3-3-4-4-5-1m31%201l-3%203%203%202a243%20243%200%200116%2014l3-3%203-2-3%201-4%202-4-4c-4-3-5-5-3-5%204%201%204%200%202-3s-4-4-6-1c-2%202-3%201-2-1l2-1v-4l-1-1-3%203m3%2023l3%204%203%203-5%203c-5%203-7%206-3%204l1%201-1%201c-1-1-1%200%200%200%200%202%200%202-1%201-2%200-2%201%200%203h2c0-1%206%203%206%205l-9%207c-1-2-10-2-10-1l5%201c6%200%206-1-14%2012l-19%2013H90l1-1-4-7-6-6c-1%201-4-2-6-5l-5-6-3%202c-2%201-3%203-2%204h1l2%203c0%202%201%203%202%203v-3l1%202v2l2%202%209%2014%201%201-1%201-3%201-3%202c-2%200-10%206-9%207l-1%201v1h-1c-1-1-2%200-4%202-3%203-4%204-1%204%201-1%202%200%202%201l7%201c7%200%207%200%206-2l-1-4c0-2%201-1%203%202%203%205%206%205%207%201l2-3v-1c0-2%205-7%206-7l3%203%202%203v2c-1%201-1%201%201%201%203-1%204-1%208%202s15%204%2019%201h4v-1l-2-3h1c1%201%202%202%203%201v1h1l1%201v1l2-1h1l1-2h-1l-2%201c-2%200%203-4%204-4v2l1%201%202-1%201-1%201-1h1l1-1h3v-2c2%200%2011-7%2011-8%200-2%200-2-3-1l-3%202%205-5%206-3%202%202c0%202%201%202%201%201v-2c-2-2-2-2%201-4%203-3%203-3%203%201%201%202%201%202%201-1v-4l2%203c1%205%201%205-1%205v1h2l1%201v1h1v1h1v1h2l1%201v1l1%201v1h1l3%201c2%200%202%200%200%202-1%201-2%202-1%204%201%203-1%203-5-2l-4-3c-1%200%201%203%204%205l5%205%209-7c6-3%209-7%209-7l-1-2-2-1c-4%201-5-1-2-2%202-1%202-1%201-2v-1c3%201%205%200%203-1v-1c3%201%202-3-1-5l-3-5c0-2%200-2-1-1v3c1%202-1%206-3%206l-2-1-1-2h-2c-3%201-4%200-5-4v-1h1l-1-2v-1c2%200-2-13-5-16v-1l-1-1v-1c3-2-1-1-4%201-3%201-4%202-5%201v-1a339%20339%200%20018-6l-1-2c-3-3-3-5-1-5v-1l-4%201c-3%202-5%202-3%200%203-2%202-3%200-3-2-1-2%200-2%201v3c1%201%201%202-1%203-2%202-2%201-7-4l-6-5-4-4-4-2m-109%204l-1%201-15%209%207%2012%2010%2015c2%204%202%204%204%203a435%20435%200%200112-9c-2%201-2%200-2-1%200-2%202-3%202%200h4c1-1-3-8-6-11l-7-10c-6-9-8-12-8-9m66%20112c-4%204%200%2011%204%209l2%201-4%202c-4%200-4%202%200%202s6-2%206-9c0-5%200-6-2-6-4-1-4-1-6%201m31%200c-4%204%200%2011%204%209l2%201-4%202c-4%200-4%202%200%202s6-2%206-9c0-5%200-6-2-6-4-1-4-1-6%201m121%2047c3%204%206%206%207%206%202%200%205-3%209-6l6-5h-28l6%205'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"regular":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAMEAf/EABUBAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAHJWdJeIjXMXKD/xAAbEAADAAMBAQAAAAAAAAAAAAAAAQIDERITIv/aAAgBAQABBQKEV9ndI62doetzjn0zSpR//8QAFxEAAwEAAAAAAAAAAAAAAAAAAAESUf/aAAgBAwEBPwGWSymU9P/EABYRAQEBAAAAAAAAAAAAAAAAAAAREP/aAAgBAgEBPwFcj//EABwQAAICAgMAAAAAAAAAAAAAAAABECERYQIxUf/aAAgBAQAGPwLcYLeNDs7OK9RUf//EAB0QAAIDAAIDAAAAAAAAAAAAAAERACExQVFhcYH/2gAIAQEAAT8hBovyyIVaNMJjFqsgaCgOAjgFDrPMP3OoUU003AxFa2fJ/9oADAMBAAIAAwAAABBv/wCC/8QAFhEBAQEAAAAAAAAAAAAAAAAAAGEB/9oACAEDAQE/EI6jqurn/8QAFxEBAQEBAAAAAAAAAAAAAAAAABEBUf/aAAgBAgEBPxC4hMRx/8QAHhAAAgICAgMAAAAAAAAAAAAAAREAITFxQVFhofD/2gAIAQEAAT8QEIEgpBlxqN0YsKH24VdjFoAq84XqMgjFBFUwR35hREGcqNe45qpPlQwHtIMWtxi6T//Z","aspectRatio":1,"src":"/static/e1b0c4b179faa72db32da6b7efb166c0/1dc0b/scrumpoker.jpg","srcSet":"/static/e1b0c4b179faa72db32da6b7efb166c0/3a5ce/scrumpoker.jpg 163w,\n/static/e1b0c4b179faa72db32da6b7efb166c0/05730/scrumpoker.jpg 327w,\n/static/e1b0c4b179faa72db32da6b7efb166c0/1dc0b/scrumpoker.jpg 653w,\n/static/e1b0c4b179faa72db32da6b7efb166c0/f72c7/scrumpoker.jpg 980w,\n/static/e1b0c4b179faa72db32da6b7efb166c0/0ff54/scrumpoker.jpg 1200w","srcWebp":"/static/e1b0c4b179faa72db32da6b7efb166c0/0acdf/scrumpoker.webp","srcSetWebp":"/static/e1b0c4b179faa72db32da6b7efb166c0/ac59e/scrumpoker.webp 163w,\n/static/e1b0c4b179faa72db32da6b7efb166c0/7660b/scrumpoker.webp 327w,\n/static/e1b0c4b179faa72db32da6b7efb166c0/0acdf/scrumpoker.webp 653w,\n/static/e1b0c4b179faa72db32da6b7efb166c0/75470/scrumpoker.webp 980w,\n/static/e1b0c4b179faa72db32da6b7efb166c0/9000d/scrumpoker.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%2076a387%20387%200%20003%2074c-1-4%202-3%203%200v3l-1%202c0%202%200%202%201%201l2-1%203%202%201%201c-1%201%200%204%202%204l2%202%202%202%204%201v1l1%201h-1c-2-1-2-1-2%201l1%202v2c-1%202%200%205%201%203%201-1%201-1%201%201v2h3l22-11a4484%204484%200%200141-25l-2-2v-2l2%202c2%202%202%202%204%201%203-1%206%200%204%201v1c2-1%204%201%202%201-1%201-1%201%201%201%201%200%202%200%202%203%201%209%201%2011%203%2011%203-2%201%202-3%203-2%201-3%202-2%203l-1%202v-1c0-1-1-1-4%201-5%202-6%203-5%204s1%201-1%201h-1l-1%202v-1l-1-1-1%202h-1c-2%200-2%200-1%201s1%201-1%202c-3%201-4%201-2-1%202%200%202-1%201-1v-5l-2%203c-2%203-2%203-5-3l-3-4%202%206%202%206%201%201%201%201-2%201v-1l-1-1-1%202c1%201%200%201-1%201h-1l-1%202v-1h-3c-2%201-2%201-1%202s1%201-1%202h-2l1-1-1-2h-1c1%201-1%203-6%205-5%203-6%204-5%205v1c-3-1-9%202-7%203v1c-1%200-1%201%201%206l-1%201-2%201h-1v-2c-2%200-2%200-1-1v-1l-2-1-2-1-2%202h-2v1c1%201%201%201-1%201h-1c1%201-12%209-15%208l-1%201h-1l-1%201v1c-1%200-3-1-3-3-1-1-1-2-2-1v5l1%202v3c-1%200-2-1-2-3l-2-5-2-3c-1-5-2-2-2%206l1%208%201%201h2l3-2%202-1c1-1%201-1%201%201l-3%204c-3%202-3%202-1%202%203%200%203%201%201%203-2%201-4%200-4-2%201-1%201-1-1-1l-2%201a2685%202685%200%20000%20154v13h5l5-1h2c1%201%202-1%202-3l2-4c1-2%202-4%201-5v-3c2-1%200-4-1-3-2%200-4-4-2-5%201-1%200-4-1-5v-2c-1%200-1-1%201-3s2-2%203%200c0%202%205%202%207-1%202-2%203-2%202%202%200%203%200%203%201%202s1-1%201%201v2l1-2c1-2%201-2%201%200%200%201%200%202%201%201%202%200%205%202%205%203l3%204%203%203%202-2c2-2%203-4%202-5%200-1%202-2%203%200%200%202%203-3%203-5l-3-1c-3%200-6-2-6-3%200-2%204-2%206%200h2l1%201-1%201c2-1%205%201%204%202l2%203v3l4%201c2%200%203-1%203-2h2c1%201%202%202%203%201%202%200%202%200%201%202v4c1%202%200%203-3%201-2-1-3-1-3%201v2l-1%201-1%201%202%201c3%200%204%202%202%204-3%201-2%202%200%202%202-1%202-1%202%201l-1%202-2%202c-1%201%200%201%206%201l6-1h5c1%202%206-1%207-4l4-3v1l-1%204v3h7l7-1c-1-2%201-5%206-8l3-3-1-1h3l-1-1%201-2c2-2%202-2%201-3s-2-2-1-3l-1-1c-2%201-2%201-2-1%201-1%200-1-1-1-2%201-2-4%201-6l1-3%201-2%201-2c1-2%203-2%206-1h1l18%201h2a495%20495%200%200187%201l2%203%201%203%201%204%201%203v5c2%201%2010%200%2012-2%203-2%205%200%203%203-2%202-2%202%200%202%202%201%202%201%201%202s-1%201%201%201c2%201%202%201%202%205-1%205-1%206-4%203l-2-1-1%202c-2%201-2%204%200%204l1-1h1c0%202%205%201%205%200h2l72%201h72v-14c0-7%200-13-1-12-1%202-1%202-2%201l-1-3-1-1v-6l-1-2c-1-1-1-1%201-2%203-2%204-1%204%204a3201%203201%200%20000-159l1-103V0h-21l4%204c12%2010%2016%2030%209%2044-2%204-5%204-8%201%200-2-2-3-2-2l-4-3-9-7-2-1c-1-2-18-9-19-8l-4-2h-5l-2-1c1-1-3-2-6-1h-3c0-2-1-2-1-1h-3l-2-1c-2%202-1-3%201-8l7-9%205-5h-17l-17%201h-16v2l1%201c-1%201-7-2-7-3l-7-1c-8%200-10%201-6%203%202%200%202%200%201%201-2%201-3%200-5-2-2-3-4-2-2%201%202%202-2%205-6%204-4-2-5-4-2-4l4-2c2-1-1-1-27-1-27%200-34%201-31%202h2c2%200%202%200%201%202v4l-1%201h-2l-2%201c-1-1-2%200-2%201l-2%201%201%201c1%201%202%201%201%202-2%200-1%202%201%202l3-3c1-1%202-2%204-1%202%200%203%200%203-2l3-2c2-1%202%200%202%203l-1%204-1%202%203%201c2%200%204%200%207%203%202%202%203%203%204%202h2c1%201%202%202%203%201%202%200%201%201-1%203-1%201-1%201%201%201s5%202%205%203l-2%201%202%202c2%201%203%202%203%204l3%206c3%204%204%206%201%206l-1%201%203%201%204%201h4c3-1%203-1%204%202%202%203%200%208-3%206h-4%201c2%200%206%205%206%208%200%202-1%203-2%201-1-1-1%200-1%201%200%202-1%203-3%204s-3%203-2%203c0%201-1%202-3%202l-3%202-1%201c-1-1-8%204-9%205l-2%201-3%201c-2%202-6%200-5-2l-1-1v3l-1%203v2c-3-1-5%200-3%201%201%201%201%201-1%201h-1c1%201%201%201-1%202h-2l-1-1-1%202h-1c-2%200-5%202-4%203h-2v1c1%201%201%201-1%201h-1v2l5%201c3-1%204%200%204%207%200%205%201%206%202%206%202%200%203%200%203%202s0%202-1%201c-1-3-3%201-3%206%200%203%201%204%204%206%204%203%205%207%202%208v-1l-2-2-2%201c0%203-3%203-5%202v-2c2%200%202-1%202-9-2-23-2-23-5-23l-2%201%201%201h1c0%203-3%202-4-1%200-2-1-3-2-3h-4c-2%200-2%200-1%201v1c-3-1-5%200-3%201%201%201%201%201-1%201h-1c1%201%201%201-1%202h-2l-1-1-1%202h-1c-2%200-2%200-1%201s1%201-1%201h-1c1%201%201%201-1%202h-2l-5%201-2%203c1%201%201%201-1%201h-1l-1%202v-1l-1-1-1%202h-1c-2%200-2%200-1%201s1%201-1%201h-1c1%200%201%201-1%202-2%202-3%200-4-7v-5l-1%205c-1%207-1%207-12%2014l-9%205-12%201c-12%200-16-1-16-4h2c1%202%203%202%2013%201h11l9-6%2010-7c0-2%200-2-3%200l-6%203-3%203-1%201-3%201c-4%202-23%203-25%201l6-1c1%200%202%200%201-1l1-1%201%201h1l2-1%202-1%202-2c3%200%209-4%2010-7l2-4%201-2c0-2%200-2-2-1-3%203-8%205-11%205h-3l3-1%205-2v-1c-2%200-2%200%201-2s5-4%205-6c0-3-2-2-2%201-1%203-1%203-3%202l-1-1-1%202h-7v-1l-2-2c1-2%202-4%202-2s1%203%202%201l-1-4-2-7c0-2%200-2-2-1l-2-1%202-1v-1l2-2h-4c-5%200-6%200-4-1l2-2%202-1h3l1-2%202-4v-1l2-6%201-2c0-3-2-2-3%201l-1%201c0-3%201-5%203-5l1-1c1-1%201%200%201%202%200%205%201%206%204%2010%203%203%204%204%204%209v5l1%204%202%206%201%203c-1%201%200%202%202%201h4l-2%202a1067%201067%200%200145-24c16-9%2016-8%2010-8-4%201-5%201-7-1h-3c-1%202-1%202-3%201v-1l1-1h-1c-2%201-4%200-2-2l-1-1-1%201-2%203v-1l-1-3-1-2v-5c-2-4-2-4-4-2-1%202-2%202-2%201-1-2-3%200-2%204l-1%203v2c0%202-1%203-4%201-2-2-4-2-4%200h-2c-2-1-1-2%201-4l3-3h-3l-3-2-1-1-2%201c0%202-2%201-4-1s-2-2-3%200c-2%201-2%201-3-2s-1-3-3-1c-1%201-1%201-2-1l-4-9h-2c-1%200-1-1%201-2v-1h-2l1-1%201-2c-1-3-5-5-6-3l-2%201-1%201v1c-2%200-2-2-1-3%202%200%202-4%200-5l-1%202c1%201%200%202-2%203-4%202-4%203%200%202h3l-3%201c-3%202-5%202-4-1l-1-1v-4l2-3%203-1h-3l-2-1v-4c0-2%201-3%202-3l1-2c1-1%200-1-1-1-4%200-5%200-3-1l-1-2h-1l-1%202-2%201c-1%201-6%200-6-2l1-2%203-2c2-2%204-2%204-1h3c2%200%203%201%204%203%202%205%203%206%206%205%202-1%203%200%205%202s3%202%205%202h7c2-1%204%200%202%201v1l3-1v-4l-1-4-1-2v-1l-1-1%201-2%201-1-1-1c-2%200-2-2-1-4h10l2-2c4%200%205-2%203-4-2-1-1-4%201-3l1-1h5l1%202-1%201%202%201%203%201c1%201%201%200%201-2%200-5%200-6%203-4%201%201%202%201%203-1%201-1-1-1-15-1-16%200-17%200-16%202%201%201%201%201-1%202l-2%202h-4c-1-1-1-1%201-3%204-2%204-3%201-3-1%200-2%200-1%201l-1%201-3%201-2%202-3-2-3-3H0v76m0%201c0%2047%201%2057%201%2024%200-46%200-52%202-51l1-1-1-1c-3%200-3-30-1-32v-2L1%207%200%2077m325-36c-2%200-1%203%201%203l2%201%203%203%205%202c2%201%202%201%202-1l2%201c2%203%206%203%208%200l3-2%201-1-1-1c-3%201-8-1-8-3l-2-1-1%202c1%202-5%201-8-1-2-2-5-3-7-2M122%2052c-1%201-2%204-1%207%200%202%200%203-1%202%200-2-2-1-2%201l-1%201c-2%200-1%202%202%203%202%201%203%201%208-2l5-3c0-2-3-3-4-2l-3%201c-2%201-2%201-1-1V49l-2%203M53%2062l-9%206-3%203%202%202h3c1-1%201-1%201%201h1l1-1v1c0%202%202%204%204%203v1c0%202-1%202-4%200l-2-1%203%203c1%201%202%202%201%203l1%201h1v4l1%202%201-3c0-1%200-2%201-1%202%200%201-1-1-3-1-1-1-1%201-2s2-1%201-3c0-2%200-2%201-1l1-2c-1-4%200-4%201%200%201%202%201%202%202%201l-2-4v-2l1%201h1l1-2c0-3%200-5%201-3h1l3-1v1l-1%203-1%204c-1%201%200%202%201%204%202%201%203%203%201%203h-3l-3%201%202%202c2%202%202%203%200%204h-2l-1%201%201%201%201%201h-1c-1-1-5%202-4%203h1l2-1-1%203v2c1%201%201%201%202-1%201-3%206-8%207-7v-1c-1-1-1-1%200%200l1-1v-1c2%202%202-1%200-2l-1-2%203%201c0%202%204%201%207-1h8c8%202%2010%203%203%202-7%200-11%200-16%204-6%204-8%206-6%208v2l-1%202c1%202%203%201%203%200-1-3%201-2%206%204l4%205c-2-1-3%201%200%201h2c-2-2%201-1%204%202l1%203c-3-1-3%200-1%201l3%201%205%203c5%204%205%205%202%2011l1%202%202-3c0-2%201-3%202-3v-2h2l4-1c1-3%200-7-2-7l-2%201v2c0%203-1%204-2%203l-1-5c0-2%200-3-2-4-3-2-1-4%202-3%202%200%202%200%201-2-2-2-4-3-6-1-1%201-2%200-5-2l-4-3%205-2c4-2%204-2%205-1l2%202%201%201c1%202%202%203%204%203%204%200%206-2%203-2l-3-2v-2l1-1%201-1c4%200%204-1%201-4l-9-8h-1l-1-1c1-1%200-2-1-4l-2-2%207-4c9-4%209-4%205-7l-3-2-8%204c-8%204-12%205-9%201%202-1%200-3-1-1-1%201-3%200-6-2-5-5-6-5-10-4h-3l2-1%202-1h-1l-3-1c-1-3-5-2-11%201m259%2030l-2%202h-4c-2%200-2%202%201%204%202%202%202%202%203%201h1c1%202%200%205-1%203l-2-1v1l-1%201h-1c0%201%202%203%204%203s2%200%200%203l-2%203%202%201%202%202%201%201h1l-1%202h-2c1-2%200-3-2-2s-2%201-1%202c2%201%201%202-3%204-5%202-5%203-3%204l1%202-4-2-4-2h-1l-3-1c-4%201-3%203%201%203%201-1%202%200%203%201s2%202%203%201l2%201-1%201c-2%200-1%203%201%205l3%205%201%202v2c0%201%202%202%203%200h1c1%202%201%203-1%202-2%200-2%200-1%202l1%203v1l1%201%202-1-1-1c-1%200-1-1%201-1%202-2%203-2%203%200h3c3-2%204-3%201-3l-1-1v-5l3-7c1-3%202-5%201-7s-1-2-4%200h-3c-1-1%205-4%208-4v2h1c1-2%205%207%205%2011%200%203%202%205%205%204l1-6c-1-6-1-6%201-5l1%201c0-1%200-2%201-1l1-4c0-3%200-3%201-1%202%206%200%2014-3%2012-1-1-1-1-1%201%201%204-6%208-8%204%200-2-2-3-3-3l-1%202h-2c-2%200-3%201%200%203h2l1-1h2v2h-1v1h-2v1l-4%204c-6%204-6%204-6%201-1-2-1-2-1%200l-1%203c-2%200%200%201%203%202l2-1c0-2%204%203%204%205s-4%206-10%208c-4%202-9%202-13%201-3-2-3-2-6%201l-4%201-2-1%201%202-5%205c-6%204-7%205-6%203l-1-2-1%202c1%201%200%202-1%203-3%202-2%203%201%203%208-2%209-2%208%201l1%203%201-1h1v3l1%202%201%201%201%201h-1l-2%201%202%201%201%202h2c4-3%204-2%203%201%200%203%202%206%204%204%201-4%205%200%204%203v4l-4%201-2%202-1%201-2%201%202%201%201-1h3l2-1c0-3%202-2%204%200l4%202%202%201c0%202%201%202%203%201h1c0%202-1%202-3%202l-1%201c-1%201%201%204%203%204l1%201c1%201%201%200%201-1-1-2%201-2%205%202l2%201%201%201c1%201%201%201%204-1%202-3%203-3%204-2h4c1-1%202%200%203%202l1%202h-4l-2%201-3%202c-4%202-2%206%201%204l2%201-3%201c-2%200-4%202-2%202v1l-1%202-2%201h-1c3%200%202%203-1%204-4%202-2%203%203%203l4-1v8l-1%207c-1%207-1%207%201%205%202-1%202-1%202%203v3l-2-2-3-1%202%203%201%202h-5c-3%202-2%203%201%202%203%200%203%200%202%201l1%201h2l15%201c15%200%2016%200%2018-2s2-3%201-3c-3-1-2-3%200-3s5-2%204-3l1-2%201-1h-1l-1-2%201-4%202-1%201%204%202%201v2l-2%202c1%201%2021-18%2021-21%200-2-8-9-12-10-2-1-3%200-29%2023l-13%2012-3-2-3-1v-10c0-9%201-13%204-13%201%200%205-5%204-6l1-1c1%201%201%200%201-2s0-3%202-5c3-2%204-6%202-6v-1l1-2%205-1c6%200%206-1%200-4l-6-3h-2c-2%200-2%200-1-2l-1-3-1%201-1%202c-3%201-6-1-4-4h5c-1-1%200-1%201-1%202%200%201-5-2-8v-2c2-1%203-3%201-3-3%200-5%200-3-1s2-1%201-3v-1l3%201h3l-3-1-2-1%202-2c2-1%202-1%201-2l-2-3h-1l-2%202%201-2c2-2%203-3%201-3-2-1-2-1-2%201h-1c-2%200-3%201-2%203l-1%201c-2-1-2-5-1-6l1%201h2l1-3v-1l1%201%201%201v-11c1-3%200-5-1-4-2%201-2%200-1-6v-8l-4%203c-5%204-5%205-5%203l1-2c2%200%204-3%204-4l2-1c2%200%203%201%203%202h3l-1-2-2-1%203-1%204-12v-10l-4-14-2-3v-2c1-1%201-1-1-1l-1-2-1-1h-1c-1%201-4%200-4-1h1l1-1%201-1v-1l-1-1-1-2-1%202c0%202%200%202-1%201v-2l-2-1v-3h1c1%201%201%201%201-1l-1-2h-2c-1-1-2-1-3%201l-2%203v-3l-1-2c-3-1-5%201-5%203h-3v-2l1-1-1-1-1%201M29%20104l-8%205h-2l2%203c3%203%204%204%205%203l6-6c-2%200-2-3%201-4%203-2%207-1%205%201h3c2-1%202-2-1-4l-2-3-9%205m245-1l-5%205-2%201-1%201h-1l-1%201c-2-1-4%200-3%201l-1%201h-1l-2%202-1%201c1%201%201%208-1%208-2%201-2%201-2%203h3l-1%203h-2l-2%202v11c-2%202-2%202%200%202v7l4-2%204-2-4%204a244%20244%200%2000-18%2011l-4-2c-5-3-6-3-13%202-5%203-6%204-7%202l-3-1v4c-2%202%200%205%201%203%202-1%203%200%202%202v2l1%201v1c1%201%201%201-1%201h-1c1%201-3%203-6%203v2c-1%201%200%201%201%201%204%200%209-4%209-6v-3l1%201c0%201%203%202%204%201s3%200%206%203c2%202%205%203%207%203%203%200%203%201%203%206h4c2%200%203%200%202%201-1%203%203%205%204%202%202-1%202-1%202%203%200%202%200%203-1%201l-1-1c-2%200-1%207%201%208%203%203%200%202-4-1-3-2-4-4-3-5l-1-2-1%201c1%201%200%202-1%202l-1-1-9-9c-8-7-9-7-11-6l-5%203a1094%201094%200%20018-1l13%2011-1%201-1%202h-2l-1%201v1c-1-1-6%201-7%203l-4-2-4-3-3%202c-2%203-2%203-5%201l-4-4-6-4-2-2-1-1-1%201c0%201-3%202-4%201h-2v1l2%201-4%201c-4%200-2-3%205-8%204-3%205-4%204-6l1-2c1-1%201%200%201%201%200%202%200%202%201%201%202-1%202-1%200-3l-1-4-3-4c-4-3-5-6-3-8l-6-7c-7-6-7-6-10-4-2%201-2%201-5-1l-4-4c0-2-2-4-4-6l-3-5-1-2c-2%200-2%201-1%202l-1%202c-1-1-21%2010-20%2012h-1l-1%201%202%201c1-3%208%206%208%2010%201%203%204%2010%205%208l5%205c3%202%206%206%209%207l10%209c5%206%206%206%205%209-1%202-1%203%204%208l6%205%203%203%202%202v-3l2%201c0%202%203%202%205%201l5-1c2%201%202%201%200%202l-2%202h3l-2%203c-2%201-2%203-2%204v4l-1%201-2%203c0%204%200%204%201%203%203-2%203-1%202%202l-1%203h-1l-1%201v1l-1%201%203-1c2-2%203-4%204-12l2-11%2010%208c4%205%209%208%209%208l1%202c0%202%200%202%201%201%202-1%202-1%202%201l2%201%201%201v2c-2%202-1%203%201%201%203-2%203-7%201-5v-2h-3l1-2h4a153%20153%200%200021%2020%202598%202598%200%200036%2029c5%200%206%200%207-2s1-2%203-1c2%202%207-1%206-4l2-2v-3l1-3h1l-1-2v-7l-1-2c-1-1-1-1-1%202v3l-5-4c-4-3-5-5-5-7h-1c0%202%200%202-2%200s-2-5%201-3h1l-9-10c-9-7-9-7-13-6-4%200-4%200-10-5l-9-7-2-4%201-2%201-3%201-1%201-1h1v8l5-4%205-4%202%202%202%202-1-3c-2-2-2-2-1-3l2-2h-1l-1-1c1-1-1-1-4%201-5%202-4%201%200-3l5-3-3-2-7-6c-4-3-8-3-5%200%202%202%202%204%201%204l-2-1-3-1c-3%201-3%200-3-3%200-2%201-3%202-3%202-1%202-2%202-4l1-1%201%201%203-1c4-3%206-4%206-1l1%201v-3c-1-1%202-3%207-6%208-5%208-5%208-9l1-4v3l1%203%206-4%208-4v-1l1-1%201-1-1-8v-3l1-1-2-1h-2l1-1%201-1h-3c0-1-1-2-2-1v-1c3-2%202-3%200-2-3%202-3%201-1-1v-3h-3c1-3-3-3-6%200h-4c1%201-1%203-4%205-6%202-6%202-8%201-3-2-3-2-2-5v-4c0-1%201-2%203-1%203%200%203%200%202%201l-1%201h2l3-3h2l1%201c2%200%203-2%204-4l4-6%205-3%202-1h1l1%201v2l-1%201c1%201%209-3%209-4l-2-1%201-1%201-2v-1l1-9-1%201v1l-1-1-4-1h-3c0-1-6-1-7%201l-1-1-2-1-2%201h-7m-119%2056l-6%203%204%203c4%202%205%203%209%201%201-1%203-2%204-1%203%200%203-2%200-4l-4-4c0-2-1-2-7%202m172%207l-1%203v2c0%202-1%203-3%202l-1%201v3l-1%202-1-1v4l-1%205-3%203-3%202h5c-1%201%200%202%201%203%201%202-1%204-4%203l1%201%201%203%202%202c4%201%204%202%201%201-4%200-5%201-3%203%201%201%202%202%201%203h1c2-2%201%201-3%204-3%203-4%204-3%206l1%203%204%201c4%202%208%202%209%200h2l1%201v-4l-2%201c-2%202-3%201-3-4%201-4%201-5-1-5-1-1-1-1%201-1s4-2%202-2v-5c-1-2-1-3%201-3h4c1%200%202%200%201-2l-1-1-1-1c-1-1%200-3%203-5l2-4-5%204-4%203%201-8c1-2%200-13-1-14v-2c2-1%203-10%201-10l-1%203M1%20178c0%2011%200%2012%202%2012%203%201%205%200%203-1-1-1%200-2%204-4l5-3h2v-1c-1-1-1-1%201-1h1l-1-1-3-5c-3-3-4-5-3-6H9c-2%202-3%202-3%201l-1-2v2H4l-1-1-1-1c-1-1-1%203-1%2011m109%201l1%203c2%201%202%202%201%202l2%205%204%202c0-2%201-2%204-2l4%201%201%201v-1c0-1%201-2%203-2%204%200%205-1%205-3-1-2-2-2-9-2-8%201-8%201-11-3-3-3-4-4-5-1m31%201l-3%203%203%202a243%20243%200%200116%2014l3-3%203-2-3%201-4%202-4-4c-4-3-5-5-3-5%204%201%204%200%202-3s-4-4-6-1c-2%202-3%201-2-1l2-1v-4l-1-1-3%203m3%2023l3%204%203%203-5%203c-5%203-7%206-3%204l1%201-1%201c-1-1-1%200%200%200%200%202%200%202-1%201-2%200-2%201%200%203h2c0-1%206%203%206%205l-9%207c-1-2-10-2-10-1l5%201c6%200%206-1-14%2012l-19%2013H90l1-1-4-7-6-6c-1%201-4-2-6-5l-5-6-3%202c-2%201-3%203-2%204h1l2%203c0%202%201%203%202%203v-3l1%202v2l2%202%209%2014%201%201-1%201-3%201-3%202c-2%200-10%206-9%207l-1%201v1h-1c-1-1-2%200-4%202-3%203-4%204-1%204%201-1%202%200%202%201l7%201c7%200%207%200%206-2l-1-4c0-2%201-1%203%202%203%205%206%205%207%201l2-3v-1c0-2%205-7%206-7l3%203%202%203v2c-1%201-1%201%201%201%203-1%204-1%208%202s15%204%2019%201h4v-1l-2-3h1c1%201%202%202%203%201v1h1l1%201v1l2-1h1l1-2h-1l-2%201c-2%200%203-4%204-4v2l1%201%202-1%201-1%201-1h1l1-1h3v-2c2%200%2011-7%2011-8%200-2%200-2-3-1l-3%202%205-5%206-3%202%202c0%202%201%202%201%201v-2c-2-2-2-2%201-4%203-3%203-3%203%201%201%202%201%202%201-1v-4l2%203c1%205%201%205-1%205v1h2l1%201v1h1v1h1v1h2l1%201v1l1%201v1h1l3%201c2%200%202%200%200%202-1%201-2%202-1%204%201%203-1%203-5-2l-4-3c-1%200%201%203%204%205l5%205%209-7c6-3%209-7%209-7l-1-2-2-1c-4%201-5-1-2-2%202-1%202-1%201-2v-1c3%201%205%200%203-1v-1c3%201%202-3-1-5l-3-5c0-2%200-2-1-1v3c1%202-1%206-3%206l-2-1-1-2h-2c-3%201-4%200-5-4v-1h1l-1-2v-1c2%200-2-13-5-16v-1l-1-1v-1c3-2-1-1-4%201-3%201-4%202-5%201v-1a339%20339%200%20018-6l-1-2c-3-3-3-5-1-5v-1l-4%201c-3%202-5%202-3%200%203-2%202-3%200-3-2-1-2%200-2%201v3c1%201%201%202-1%203-2%202-2%201-7-4l-6-5-4-4-4-2m-109%204l-1%201-15%209%207%2012%2010%2015c2%204%202%204%204%203a435%20435%200%200112-9c-2%201-2%200-2-1%200-2%202-3%202%200h4c1-1-3-8-6-11l-7-10c-6-9-8-12-8-9m66%20112c-4%204%200%2011%204%209l2%201-4%202c-4%200-4%202%200%202s6-2%206-9c0-5%200-6-2-6-4-1-4-1-6%201m31%200c-4%204%200%2011%204%209l2%201-4%202c-4%200-4%202%200%202s6-2%206-9c0-5%200-6-2-6-4-1-4-1-6%201m121%2047c3%204%206%206%207%206%202%200%205-3%209-6l6-5h-28l6%205'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"narrow":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAMEAf/EABUBAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAHJWdJeIjXMXKD/xAAbEAADAAMBAQAAAAAAAAAAAAAAAQIDERITIv/aAAgBAQABBQKEV9ndI62doetzjn0zSpR//8QAFxEAAwEAAAAAAAAAAAAAAAAAAAESUf/aAAgBAwEBPwGWSymU9P/EABYRAQEBAAAAAAAAAAAAAAAAAAAREP/aAAgBAgEBPwFcj//EABwQAAICAgMAAAAAAAAAAAAAAAABECERYQIxUf/aAAgBAQAGPwLcYLeNDs7OK9RUf//EAB0QAAIDAAIDAAAAAAAAAAAAAAERACExQVFhcYH/2gAIAQEAAT8hBovyyIVaNMJjFqsgaCgOAjgFDrPMP3OoUU003AxFa2fJ/9oADAMBAAIAAwAAABBv/wCC/8QAFhEBAQEAAAAAAAAAAAAAAAAAAGEB/9oACAEDAQE/EI6jqurn/8QAFxEBAQEBAAAAAAAAAAAAAAAAABEBUf/aAAgBAgEBPxC4hMRx/8QAHhAAAgICAgMAAAAAAAAAAAAAAREAITFxQVFhofD/2gAIAQEAAT8QEIEgpBlxqN0YsKH24VdjFoAq84XqMgjFBFUwR35hREGcqNe45qpPlQwHtIMWtxi6T//Z","aspectRatio":1,"src":"/static/e1b0c4b179faa72db32da6b7efb166c0/eaa58/scrumpoker.jpg","srcSet":"/static/e1b0c4b179faa72db32da6b7efb166c0/5a3ee/scrumpoker.jpg 114w,\n/static/e1b0c4b179faa72db32da6b7efb166c0/41f8f/scrumpoker.jpg 229w,\n/static/e1b0c4b179faa72db32da6b7efb166c0/eaa58/scrumpoker.jpg 457w,\n/static/e1b0c4b179faa72db32da6b7efb166c0/c309b/scrumpoker.jpg 686w,\n/static/e1b0c4b179faa72db32da6b7efb166c0/e3008/scrumpoker.jpg 914w,\n/static/e1b0c4b179faa72db32da6b7efb166c0/0ff54/scrumpoker.jpg 1200w","srcWebp":"/static/e1b0c4b179faa72db32da6b7efb166c0/15384/scrumpoker.webp","srcSetWebp":"/static/e1b0c4b179faa72db32da6b7efb166c0/31fce/scrumpoker.webp 114w,\n/static/e1b0c4b179faa72db32da6b7efb166c0/e3e25/scrumpoker.webp 229w,\n/static/e1b0c4b179faa72db32da6b7efb166c0/15384/scrumpoker.webp 457w,\n/static/e1b0c4b179faa72db32da6b7efb166c0/0258d/scrumpoker.webp 686w,\n/static/e1b0c4b179faa72db32da6b7efb166c0/64ea2/scrumpoker.webp 914w,\n/static/e1b0c4b179faa72db32da6b7efb166c0/9000d/scrumpoker.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%2076a387%20387%200%20003%2074c-1-4%202-3%203%200v3l-1%202c0%202%200%202%201%201l2-1%203%202%201%201c-1%201%200%204%202%204l2%202%202%202%204%201v1l1%201h-1c-2-1-2-1-2%201l1%202v2c-1%202%200%205%201%203%201-1%201-1%201%201v2h3l22-11a4484%204484%200%200141-25l-2-2v-2l2%202c2%202%202%202%204%201%203-1%206%200%204%201v1c2-1%204%201%202%201-1%201-1%201%201%201%201%200%202%200%202%203%201%209%201%2011%203%2011%203-2%201%202-3%203-2%201-3%202-2%203l-1%202v-1c0-1-1-1-4%201-5%202-6%203-5%204s1%201-1%201h-1l-1%202v-1l-1-1-1%202h-1c-2%200-2%200-1%201s1%201-1%202c-3%201-4%201-2-1%202%200%202-1%201-1v-5l-2%203c-2%203-2%203-5-3l-3-4%202%206%202%206%201%201%201%201-2%201v-1l-1-1-1%202c1%201%200%201-1%201h-1l-1%202v-1h-3c-2%201-2%201-1%202s1%201-1%202h-2l1-1-1-2h-1c1%201-1%203-6%205-5%203-6%204-5%205v1c-3-1-9%202-7%203v1c-1%200-1%201%201%206l-1%201-2%201h-1v-2c-2%200-2%200-1-1v-1l-2-1-2-1-2%202h-2v1c1%201%201%201-1%201h-1c1%201-12%209-15%208l-1%201h-1l-1%201v1c-1%200-3-1-3-3-1-1-1-2-2-1v5l1%202v3c-1%200-2-1-2-3l-2-5-2-3c-1-5-2-2-2%206l1%208%201%201h2l3-2%202-1c1-1%201-1%201%201l-3%204c-3%202-3%202-1%202%203%200%203%201%201%203-2%201-4%200-4-2%201-1%201-1-1-1l-2%201a2685%202685%200%20000%20154v13h5l5-1h2c1%201%202-1%202-3l2-4c1-2%202-4%201-5v-3c2-1%200-4-1-3-2%200-4-4-2-5%201-1%200-4-1-5v-2c-1%200-1-1%201-3s2-2%203%200c0%202%205%202%207-1%202-2%203-2%202%202%200%203%200%203%201%202s1-1%201%201v2l1-2c1-2%201-2%201%200%200%201%200%202%201%201%202%200%205%202%205%203l3%204%203%203%202-2c2-2%203-4%202-5%200-1%202-2%203%200%200%202%203-3%203-5l-3-1c-3%200-6-2-6-3%200-2%204-2%206%200h2l1%201-1%201c2-1%205%201%204%202l2%203v3l4%201c2%200%203-1%203-2h2c1%201%202%202%203%201%202%200%202%200%201%202v4c1%202%200%203-3%201-2-1-3-1-3%201v2l-1%201-1%201%202%201c3%200%204%202%202%204-3%201-2%202%200%202%202-1%202-1%202%201l-1%202-2%202c-1%201%200%201%206%201l6-1h5c1%202%206-1%207-4l4-3v1l-1%204v3h7l7-1c-1-2%201-5%206-8l3-3-1-1h3l-1-1%201-2c2-2%202-2%201-3s-2-2-1-3l-1-1c-2%201-2%201-2-1%201-1%200-1-1-1-2%201-2-4%201-6l1-3%201-2%201-2c1-2%203-2%206-1h1l18%201h2a495%20495%200%200187%201l2%203%201%203%201%204%201%203v5c2%201%2010%200%2012-2%203-2%205%200%203%203-2%202-2%202%200%202%202%201%202%201%201%202s-1%201%201%201c2%201%202%201%202%205-1%205-1%206-4%203l-2-1-1%202c-2%201-2%204%200%204l1-1h1c0%202%205%201%205%200h2l72%201h72v-14c0-7%200-13-1-12-1%202-1%202-2%201l-1-3-1-1v-6l-1-2c-1-1-1-1%201-2%203-2%204-1%204%204a3201%203201%200%20000-159l1-103V0h-21l4%204c12%2010%2016%2030%209%2044-2%204-5%204-8%201%200-2-2-3-2-2l-4-3-9-7-2-1c-1-2-18-9-19-8l-4-2h-5l-2-1c1-1-3-2-6-1h-3c0-2-1-2-1-1h-3l-2-1c-2%202-1-3%201-8l7-9%205-5h-17l-17%201h-16v2l1%201c-1%201-7-2-7-3l-7-1c-8%200-10%201-6%203%202%200%202%200%201%201-2%201-3%200-5-2-2-3-4-2-2%201%202%202-2%205-6%204-4-2-5-4-2-4l4-2c2-1-1-1-27-1-27%200-34%201-31%202h2c2%200%202%200%201%202v4l-1%201h-2l-2%201c-1-1-2%200-2%201l-2%201%201%201c1%201%202%201%201%202-2%200-1%202%201%202l3-3c1-1%202-2%204-1%202%200%203%200%203-2l3-2c2-1%202%200%202%203l-1%204-1%202%203%201c2%200%204%200%207%203%202%202%203%203%204%202h2c1%201%202%202%203%201%202%200%201%201-1%203-1%201-1%201%201%201s5%202%205%203l-2%201%202%202c2%201%203%202%203%204l3%206c3%204%204%206%201%206l-1%201%203%201%204%201h4c3-1%203-1%204%202%202%203%200%208-3%206h-4%201c2%200%206%205%206%208%200%202-1%203-2%201-1-1-1%200-1%201%200%202-1%203-3%204s-3%203-2%203c0%201-1%202-3%202l-3%202-1%201c-1-1-8%204-9%205l-2%201-3%201c-2%202-6%200-5-2l-1-1v3l-1%203v2c-3-1-5%200-3%201%201%201%201%201-1%201h-1c1%201%201%201-1%202h-2l-1-1-1%202h-1c-2%200-5%202-4%203h-2v1c1%201%201%201-1%201h-1v2l5%201c3-1%204%200%204%207%200%205%201%206%202%206%202%200%203%200%203%202s0%202-1%201c-1-3-3%201-3%206%200%203%201%204%204%206%204%203%205%207%202%208v-1l-2-2-2%201c0%203-3%203-5%202v-2c2%200%202-1%202-9-2-23-2-23-5-23l-2%201%201%201h1c0%203-3%202-4-1%200-2-1-3-2-3h-4c-2%200-2%200-1%201v1c-3-1-5%200-3%201%201%201%201%201-1%201h-1c1%201%201%201-1%202h-2l-1-1-1%202h-1c-2%200-2%200-1%201s1%201-1%201h-1c1%201%201%201-1%202h-2l-5%201-2%203c1%201%201%201-1%201h-1l-1%202v-1l-1-1-1%202h-1c-2%200-2%200-1%201s1%201-1%201h-1c1%200%201%201-1%202-2%202-3%200-4-7v-5l-1%205c-1%207-1%207-12%2014l-9%205-12%201c-12%200-16-1-16-4h2c1%202%203%202%2013%201h11l9-6%2010-7c0-2%200-2-3%200l-6%203-3%203-1%201-3%201c-4%202-23%203-25%201l6-1c1%200%202%200%201-1l1-1%201%201h1l2-1%202-1%202-2c3%200%209-4%2010-7l2-4%201-2c0-2%200-2-2-1-3%203-8%205-11%205h-3l3-1%205-2v-1c-2%200-2%200%201-2s5-4%205-6c0-3-2-2-2%201-1%203-1%203-3%202l-1-1-1%202h-7v-1l-2-2c1-2%202-4%202-2s1%203%202%201l-1-4-2-7c0-2%200-2-2-1l-2-1%202-1v-1l2-2h-4c-5%200-6%200-4-1l2-2%202-1h3l1-2%202-4v-1l2-6%201-2c0-3-2-2-3%201l-1%201c0-3%201-5%203-5l1-1c1-1%201%200%201%202%200%205%201%206%204%2010%203%203%204%204%204%209v5l1%204%202%206%201%203c-1%201%200%202%202%201h4l-2%202a1067%201067%200%200145-24c16-9%2016-8%2010-8-4%201-5%201-7-1h-3c-1%202-1%202-3%201v-1l1-1h-1c-2%201-4%200-2-2l-1-1-1%201-2%203v-1l-1-3-1-2v-5c-2-4-2-4-4-2-1%202-2%202-2%201-1-2-3%200-2%204l-1%203v2c0%202-1%203-4%201-2-2-4-2-4%200h-2c-2-1-1-2%201-4l3-3h-3l-3-2-1-1-2%201c0%202-2%201-4-1s-2-2-3%200c-2%201-2%201-3-2s-1-3-3-1c-1%201-1%201-2-1l-4-9h-2c-1%200-1-1%201-2v-1h-2l1-1%201-2c-1-3-5-5-6-3l-2%201-1%201v1c-2%200-2-2-1-3%202%200%202-4%200-5l-1%202c1%201%200%202-2%203-4%202-4%203%200%202h3l-3%201c-3%202-5%202-4-1l-1-1v-4l2-3%203-1h-3l-2-1v-4c0-2%201-3%202-3l1-2c1-1%200-1-1-1-4%200-5%200-3-1l-1-2h-1l-1%202-2%201c-1%201-6%200-6-2l1-2%203-2c2-2%204-2%204-1h3c2%200%203%201%204%203%202%205%203%206%206%205%202-1%203%200%205%202s3%202%205%202h7c2-1%204%200%202%201v1l3-1v-4l-1-4-1-2v-1l-1-1%201-2%201-1-1-1c-2%200-2-2-1-4h10l2-2c4%200%205-2%203-4-2-1-1-4%201-3l1-1h5l1%202-1%201%202%201%203%201c1%201%201%200%201-2%200-5%200-6%203-4%201%201%202%201%203-1%201-1-1-1-15-1-16%200-17%200-16%202%201%201%201%201-1%202l-2%202h-4c-1-1-1-1%201-3%204-2%204-3%201-3-1%200-2%200-1%201l-1%201-3%201-2%202-3-2-3-3H0v76m0%201c0%2047%201%2057%201%2024%200-46%200-52%202-51l1-1-1-1c-3%200-3-30-1-32v-2L1%207%200%2077m325-36c-2%200-1%203%201%203l2%201%203%203%205%202c2%201%202%201%202-1l2%201c2%203%206%203%208%200l3-2%201-1-1-1c-3%201-8-1-8-3l-2-1-1%202c1%202-5%201-8-1-2-2-5-3-7-2M122%2052c-1%201-2%204-1%207%200%202%200%203-1%202%200-2-2-1-2%201l-1%201c-2%200-1%202%202%203%202%201%203%201%208-2l5-3c0-2-3-3-4-2l-3%201c-2%201-2%201-1-1V49l-2%203M53%2062l-9%206-3%203%202%202h3c1-1%201-1%201%201h1l1-1v1c0%202%202%204%204%203v1c0%202-1%202-4%200l-2-1%203%203c1%201%202%202%201%203l1%201h1v4l1%202%201-3c0-1%200-2%201-1%202%200%201-1-1-3-1-1-1-1%201-2s2-1%201-3c0-2%200-2%201-1l1-2c-1-4%200-4%201%200%201%202%201%202%202%201l-2-4v-2l1%201h1l1-2c0-3%200-5%201-3h1l3-1v1l-1%203-1%204c-1%201%200%202%201%204%202%201%203%203%201%203h-3l-3%201%202%202c2%202%202%203%200%204h-2l-1%201%201%201%201%201h-1c-1-1-5%202-4%203h1l2-1-1%203v2c1%201%201%201%202-1%201-3%206-8%207-7v-1c-1-1-1-1%200%200l1-1v-1c2%202%202-1%200-2l-1-2%203%201c0%202%204%201%207-1h8c8%202%2010%203%203%202-7%200-11%200-16%204-6%204-8%206-6%208v2l-1%202c1%202%203%201%203%200-1-3%201-2%206%204l4%205c-2-1-3%201%200%201h2c-2-2%201-1%204%202l1%203c-3-1-3%200-1%201l3%201%205%203c5%204%205%205%202%2011l1%202%202-3c0-2%201-3%202-3v-2h2l4-1c1-3%200-7-2-7l-2%201v2c0%203-1%204-2%203l-1-5c0-2%200-3-2-4-3-2-1-4%202-3%202%200%202%200%201-2-2-2-4-3-6-1-1%201-2%200-5-2l-4-3%205-2c4-2%204-2%205-1l2%202%201%201c1%202%202%203%204%203%204%200%206-2%203-2l-3-2v-2l1-1%201-1c4%200%204-1%201-4l-9-8h-1l-1-1c1-1%200-2-1-4l-2-2%207-4c9-4%209-4%205-7l-3-2-8%204c-8%204-12%205-9%201%202-1%200-3-1-1-1%201-3%200-6-2-5-5-6-5-10-4h-3l2-1%202-1h-1l-3-1c-1-3-5-2-11%201m259%2030l-2%202h-4c-2%200-2%202%201%204%202%202%202%202%203%201h1c1%202%200%205-1%203l-2-1v1l-1%201h-1c0%201%202%203%204%203s2%200%200%203l-2%203%202%201%202%202%201%201h1l-1%202h-2c1-2%200-3-2-2s-2%201-1%202c2%201%201%202-3%204-5%202-5%203-3%204l1%202-4-2-4-2h-1l-3-1c-4%201-3%203%201%203%201-1%202%200%203%201s2%202%203%201l2%201-1%201c-2%200-1%203%201%205l3%205%201%202v2c0%201%202%202%203%200h1c1%202%201%203-1%202-2%200-2%200-1%202l1%203v1l1%201%202-1-1-1c-1%200-1-1%201-1%202-2%203-2%203%200h3c3-2%204-3%201-3l-1-1v-5l3-7c1-3%202-5%201-7s-1-2-4%200h-3c-1-1%205-4%208-4v2h1c1-2%205%207%205%2011%200%203%202%205%205%204l1-6c-1-6-1-6%201-5l1%201c0-1%200-2%201-1l1-4c0-3%200-3%201-1%202%206%200%2014-3%2012-1-1-1-1-1%201%201%204-6%208-8%204%200-2-2-3-3-3l-1%202h-2c-2%200-3%201%200%203h2l1-1h2v2h-1v1h-2v1l-4%204c-6%204-6%204-6%201-1-2-1-2-1%200l-1%203c-2%200%200%201%203%202l2-1c0-2%204%203%204%205s-4%206-10%208c-4%202-9%202-13%201-3-2-3-2-6%201l-4%201-2-1%201%202-5%205c-6%204-7%205-6%203l-1-2-1%202c1%201%200%202-1%203-3%202-2%203%201%203%208-2%209-2%208%201l1%203%201-1h1v3l1%202%201%201%201%201h-1l-2%201%202%201%201%202h2c4-3%204-2%203%201%200%203%202%206%204%204%201-4%205%200%204%203v4l-4%201-2%202-1%201-2%201%202%201%201-1h3l2-1c0-3%202-2%204%200l4%202%202%201c0%202%201%202%203%201h1c0%202-1%202-3%202l-1%201c-1%201%201%204%203%204l1%201c1%201%201%200%201-1-1-2%201-2%205%202l2%201%201%201c1%201%201%201%204-1%202-3%203-3%204-2h4c1-1%202%200%203%202l1%202h-4l-2%201-3%202c-4%202-2%206%201%204l2%201-3%201c-2%200-4%202-2%202v1l-1%202-2%201h-1c3%200%202%203-1%204-4%202-2%203%203%203l4-1v8l-1%207c-1%207-1%207%201%205%202-1%202-1%202%203v3l-2-2-3-1%202%203%201%202h-5c-3%202-2%203%201%202%203%200%203%200%202%201l1%201h2l15%201c15%200%2016%200%2018-2s2-3%201-3c-3-1-2-3%200-3s5-2%204-3l1-2%201-1h-1l-1-2%201-4%202-1%201%204%202%201v2l-2%202c1%201%2021-18%2021-21%200-2-8-9-12-10-2-1-3%200-29%2023l-13%2012-3-2-3-1v-10c0-9%201-13%204-13%201%200%205-5%204-6l1-1c1%201%201%200%201-2s0-3%202-5c3-2%204-6%202-6v-1l1-2%205-1c6%200%206-1%200-4l-6-3h-2c-2%200-2%200-1-2l-1-3-1%201-1%202c-3%201-6-1-4-4h5c-1-1%200-1%201-1%202%200%201-5-2-8v-2c2-1%203-3%201-3-3%200-5%200-3-1s2-1%201-3v-1l3%201h3l-3-1-2-1%202-2c2-1%202-1%201-2l-2-3h-1l-2%202%201-2c2-2%203-3%201-3-2-1-2-1-2%201h-1c-2%200-3%201-2%203l-1%201c-2-1-2-5-1-6l1%201h2l1-3v-1l1%201%201%201v-11c1-3%200-5-1-4-2%201-2%200-1-6v-8l-4%203c-5%204-5%205-5%203l1-2c2%200%204-3%204-4l2-1c2%200%203%201%203%202h3l-1-2-2-1%203-1%204-12v-10l-4-14-2-3v-2c1-1%201-1-1-1l-1-2-1-1h-1c-1%201-4%200-4-1h1l1-1%201-1v-1l-1-1-1-2-1%202c0%202%200%202-1%201v-2l-2-1v-3h1c1%201%201%201%201-1l-1-2h-2c-1-1-2-1-3%201l-2%203v-3l-1-2c-3-1-5%201-5%203h-3v-2l1-1-1-1-1%201M29%20104l-8%205h-2l2%203c3%203%204%204%205%203l6-6c-2%200-2-3%201-4%203-2%207-1%205%201h3c2-1%202-2-1-4l-2-3-9%205m245-1l-5%205-2%201-1%201h-1l-1%201c-2-1-4%200-3%201l-1%201h-1l-2%202-1%201c1%201%201%208-1%208-2%201-2%201-2%203h3l-1%203h-2l-2%202v11c-2%202-2%202%200%202v7l4-2%204-2-4%204a244%20244%200%2000-18%2011l-4-2c-5-3-6-3-13%202-5%203-6%204-7%202l-3-1v4c-2%202%200%205%201%203%202-1%203%200%202%202v2l1%201v1c1%201%201%201-1%201h-1c1%201-3%203-6%203v2c-1%201%200%201%201%201%204%200%209-4%209-6v-3l1%201c0%201%203%202%204%201s3%200%206%203c2%202%205%203%207%203%203%200%203%201%203%206h4c2%200%203%200%202%201-1%203%203%205%204%202%202-1%202-1%202%203%200%202%200%203-1%201l-1-1c-2%200-1%207%201%208%203%203%200%202-4-1-3-2-4-4-3-5l-1-2-1%201c1%201%200%202-1%202l-1-1-9-9c-8-7-9-7-11-6l-5%203a1094%201094%200%20018-1l13%2011-1%201-1%202h-2l-1%201v1c-1-1-6%201-7%203l-4-2-4-3-3%202c-2%203-2%203-5%201l-4-4-6-4-2-2-1-1-1%201c0%201-3%202-4%201h-2v1l2%201-4%201c-4%200-2-3%205-8%204-3%205-4%204-6l1-2c1-1%201%200%201%201%200%202%200%202%201%201%202-1%202-1%200-3l-1-4-3-4c-4-3-5-6-3-8l-6-7c-7-6-7-6-10-4-2%201-2%201-5-1l-4-4c0-2-2-4-4-6l-3-5-1-2c-2%200-2%201-1%202l-1%202c-1-1-21%2010-20%2012h-1l-1%201%202%201c1-3%208%206%208%2010%201%203%204%2010%205%208l5%205c3%202%206%206%209%207l10%209c5%206%206%206%205%209-1%202-1%203%204%208l6%205%203%203%202%202v-3l2%201c0%202%203%202%205%201l5-1c2%201%202%201%200%202l-2%202h3l-2%203c-2%201-2%203-2%204v4l-1%201-2%203c0%204%200%204%201%203%203-2%203-1%202%202l-1%203h-1l-1%201v1l-1%201%203-1c2-2%203-4%204-12l2-11%2010%208c4%205%209%208%209%208l1%202c0%202%200%202%201%201%202-1%202-1%202%201l2%201%201%201v2c-2%202-1%203%201%201%203-2%203-7%201-5v-2h-3l1-2h4a153%20153%200%200021%2020%202598%202598%200%200036%2029c5%200%206%200%207-2s1-2%203-1c2%202%207-1%206-4l2-2v-3l1-3h1l-1-2v-7l-1-2c-1-1-1-1-1%202v3l-5-4c-4-3-5-5-5-7h-1c0%202%200%202-2%200s-2-5%201-3h1l-9-10c-9-7-9-7-13-6-4%200-4%200-10-5l-9-7-2-4%201-2%201-3%201-1%201-1h1v8l5-4%205-4%202%202%202%202-1-3c-2-2-2-2-1-3l2-2h-1l-1-1c1-1-1-1-4%201-5%202-4%201%200-3l5-3-3-2-7-6c-4-3-8-3-5%200%202%202%202%204%201%204l-2-1-3-1c-3%201-3%200-3-3%200-2%201-3%202-3%202-1%202-2%202-4l1-1%201%201%203-1c4-3%206-4%206-1l1%201v-3c-1-1%202-3%207-6%208-5%208-5%208-9l1-4v3l1%203%206-4%208-4v-1l1-1%201-1-1-8v-3l1-1-2-1h-2l1-1%201-1h-3c0-1-1-2-2-1v-1c3-2%202-3%200-2-3%202-3%201-1-1v-3h-3c1-3-3-3-6%200h-4c1%201-1%203-4%205-6%202-6%202-8%201-3-2-3-2-2-5v-4c0-1%201-2%203-1%203%200%203%200%202%201l-1%201h2l3-3h2l1%201c2%200%203-2%204-4l4-6%205-3%202-1h1l1%201v2l-1%201c1%201%209-3%209-4l-2-1%201-1%201-2v-1l1-9-1%201v1l-1-1-4-1h-3c0-1-6-1-7%201l-1-1-2-1-2%201h-7m-119%2056l-6%203%204%203c4%202%205%203%209%201%201-1%203-2%204-1%203%200%203-2%200-4l-4-4c0-2-1-2-7%202m172%207l-1%203v2c0%202-1%203-3%202l-1%201v3l-1%202-1-1v4l-1%205-3%203-3%202h5c-1%201%200%202%201%203%201%202-1%204-4%203l1%201%201%203%202%202c4%201%204%202%201%201-4%200-5%201-3%203%201%201%202%202%201%203h1c2-2%201%201-3%204-3%203-4%204-3%206l1%203%204%201c4%202%208%202%209%200h2l1%201v-4l-2%201c-2%202-3%201-3-4%201-4%201-5-1-5-1-1-1-1%201-1s4-2%202-2v-5c-1-2-1-3%201-3h4c1%200%202%200%201-2l-1-1-1-1c-1-1%200-3%203-5l2-4-5%204-4%203%201-8c1-2%200-13-1-14v-2c2-1%203-10%201-10l-1%203M1%20178c0%2011%200%2012%202%2012%203%201%205%200%203-1-1-1%200-2%204-4l5-3h2v-1c-1-1-1-1%201-1h1l-1-1-3-5c-3-3-4-5-3-6H9c-2%202-3%202-3%201l-1-2v2H4l-1-1-1-1c-1-1-1%203-1%2011m109%201l1%203c2%201%202%202%201%202l2%205%204%202c0-2%201-2%204-2l4%201%201%201v-1c0-1%201-2%203-2%204%200%205-1%205-3-1-2-2-2-9-2-8%201-8%201-11-3-3-3-4-4-5-1m31%201l-3%203%203%202a243%20243%200%200116%2014l3-3%203-2-3%201-4%202-4-4c-4-3-5-5-3-5%204%201%204%200%202-3s-4-4-6-1c-2%202-3%201-2-1l2-1v-4l-1-1-3%203m3%2023l3%204%203%203-5%203c-5%203-7%206-3%204l1%201-1%201c-1-1-1%200%200%200%200%202%200%202-1%201-2%200-2%201%200%203h2c0-1%206%203%206%205l-9%207c-1-2-10-2-10-1l5%201c6%200%206-1-14%2012l-19%2013H90l1-1-4-7-6-6c-1%201-4-2-6-5l-5-6-3%202c-2%201-3%203-2%204h1l2%203c0%202%201%203%202%203v-3l1%202v2l2%202%209%2014%201%201-1%201-3%201-3%202c-2%200-10%206-9%207l-1%201v1h-1c-1-1-2%200-4%202-3%203-4%204-1%204%201-1%202%200%202%201l7%201c7%200%207%200%206-2l-1-4c0-2%201-1%203%202%203%205%206%205%207%201l2-3v-1c0-2%205-7%206-7l3%203%202%203v2c-1%201-1%201%201%201%203-1%204-1%208%202s15%204%2019%201h4v-1l-2-3h1c1%201%202%202%203%201v1h1l1%201v1l2-1h1l1-2h-1l-2%201c-2%200%203-4%204-4v2l1%201%202-1%201-1%201-1h1l1-1h3v-2c2%200%2011-7%2011-8%200-2%200-2-3-1l-3%202%205-5%206-3%202%202c0%202%201%202%201%201v-2c-2-2-2-2%201-4%203-3%203-3%203%201%201%202%201%202%201-1v-4l2%203c1%205%201%205-1%205v1h2l1%201v1h1v1h1v1h2l1%201v1l1%201v1h1l3%201c2%200%202%200%200%202-1%201-2%202-1%204%201%203-1%203-5-2l-4-3c-1%200%201%203%204%205l5%205%209-7c6-3%209-7%209-7l-1-2-2-1c-4%201-5-1-2-2%202-1%202-1%201-2v-1c3%201%205%200%203-1v-1c3%201%202-3-1-5l-3-5c0-2%200-2-1-1v3c1%202-1%206-3%206l-2-1-1-2h-2c-3%201-4%200-5-4v-1h1l-1-2v-1c2%200-2-13-5-16v-1l-1-1v-1c3-2-1-1-4%201-3%201-4%202-5%201v-1a339%20339%200%20018-6l-1-2c-3-3-3-5-1-5v-1l-4%201c-3%202-5%202-3%200%203-2%202-3%200-3-2-1-2%200-2%201v3c1%201%201%202-1%203-2%202-2%201-7-4l-6-5-4-4-4-2m-109%204l-1%201-15%209%207%2012%2010%2015c2%204%202%204%204%203a435%20435%200%200112-9c-2%201-2%200-2-1%200-2%202-3%202%200h4c1-1-3-8-6-11l-7-10c-6-9-8-12-8-9m66%20112c-4%204%200%2011%204%209l2%201-4%202c-4%200-4%202%200%202s6-2%206-9c0-5%200-6-2-6-4-1-4-1-6%201m31%200c-4%204%200%2011%204%209l2%201-4%202c-4%200-4%202%200%202s6-2%206-9c0-5%200-6-2-6-4-1-4-1-6%201m121%2047c3%204%206%206%207%206%202%200%205-3%209-6l6-5h-28l6%205'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"seo":{"src":"/static/e1b0c4b179faa72db32da6b7efb166c0/0ff54/scrumpoker.jpg"}}},{"id":"def77ef4-19fa-52e0-aeee-70b25b5d28ca","slug":"/flipper-postman-esp32s2","secret":false,"title":"Flipper postman esp32s2","author":"Luke Celitan","date":"November 10th, 2024","dateForSEO":"2024-11-10T00:00:00.000Z","timeToRead":4,"excerpt":"Custom flash software for Flipper Dev Board exposing the WIFI and HTTP methods via serial (UART) that can be picked up by the flipper zero device for building web enabled applications.","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\": \"Flipper postman esp32s2\",\n  \"excerpt\": \"Custom flash software for Flipper Dev Board exposing the WIFI and HTTP methods via serial (UART) that can be picked up by the flipper zero device for building web enabled applications.\",\n  \"date\": \"2024-11-10T00:00:00.000Z\",\n  \"hero\": \"foldersCover.jpg\",\n  \"author\": \"Luke Celitan\",\n  \"appDescription\": \"Productivity\",\n  \"category\": \"Project\",\n  \"tech\": [\"C\"]\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\": \"project-overview\"\n  }, \"Project Overview\"), mdx(\"p\", null, \"Hey there, fellow tinkerers and security enthusiasts! SpaceGhost here, and I\\u2019ve got an exciting project to share with you. My recent adventures with Flipper device programming have led me down another fascinating rabbit hole. This time, I\\u2019ve embarked on a mission to bring network capabilities to the Flipper Zero by developing custom firmware for the official ESP32 chip board.\"), mdx(\"p\", null, mdx(\"span\", {\n    parentName: \"p\",\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"1280px\"\n    }\n  }, \"\\n      \", mdx(\"span\", {\n    parentName: \"span\",\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"42.578125%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/webp;base64,UklGRl4AAABXRUJQVlA4IFIAAACQAwCdASoUAAkAPtFUo0uoJKMhsAgBABoJZwDImB7A9pIx27MAAP72EzwBsBK2dDkVYXITtKAnRPgPfbSEjF0SSWKtnbbnyTLVuY2NsFHQ4gAA')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  }), \"\\n  \", mdx(\"picture\", {\n    parentName: \"span\"\n  }, \"\\n          \", mdx(\"source\", {\n    parentName: \"picture\",\n    \"srcSet\": [\"/static/92290f2c14160787412489f9ff0a712d/4b075/schematics.webp 1280w\"],\n    \"sizes\": \"(max-width: 1280px) 100vw, 1280px\",\n    \"type\": \"image/webp\"\n  }), \"\\n          \", mdx(\"source\", {\n    parentName: \"picture\",\n    \"srcSet\": [\"/static/92290f2c14160787412489f9ff0a712d/4b075/schematics.webp 1280w\"],\n    \"sizes\": \"(max-width: 1280px) 100vw, 1280px\",\n    \"type\": \"image/webp\"\n  }), \"\\n          \", mdx(\"img\", {\n    parentName: \"picture\",\n    \"className\": \"gatsby-resp-image-image\",\n    \"src\": \"/static/92290f2c14160787412489f9ff0a712d/4b075/schematics.webp\",\n    \"alt\": \"Flipper Dev Board\",\n    \"title\": \"Flipper Dev Board\",\n    \"loading\": \"lazy\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    }\n  }), \"\\n        \"), \"\\n    \"), \"\\n\", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"Image source: \", mdx(\"a\", {\n    parentName: \"em\",\n    \"href\": \"https://docs.flipper.net/development/hardware/wifi-developer-board/schematics\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"https://docs.flipper.net/development/hardware/wifi-developer-board/schematics\"))), mdx(\"h2\", {\n    \"id\": \"the-power-of-esp32\"\n  }, \"The Power of ESP32\"), mdx(\"p\", null, \"Before we dive into the project details, let\\u2019s take a moment to appreciate the ESP32 chip. Developed by Espressif Systems, this little powerhouse has become a favorite in the IoT and embedded systems world. Here\\u2019s a quick rundown of its impressive capabilities:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Dual-core processor running at up to 240 MHz\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Wi-Fi and Bluetooth connectivity\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Robust security features\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"A plethora of peripherals and interfaces\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Low power modes for energy-efficient operation\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Extensive development support\")), mdx(\"p\", null, \"With these features, the ESP32 is perfectly suited for our goal of enhancing the Flipper Zero\\u2019s capabilities.\"), mdx(\"h2\", {\n    \"id\": \"project-flipper-postman-esp32-s2\"\n  }, \"Project: Flipper Postman ESP32-S2\"), mdx(\"p\", null, \"Our project, which I\\u2019ve dubbed \\u201CFlipper Postman ESP32-S2,\\u201D aims to create custom flash software for the Flipper Dev Board. This software exposes WiFi and HTTP methods via serial (UART), allowing the Flipper Zero to pick them up and build web-enabled applications.\"), mdx(\"h3\", {\n    \"id\": \"key-features\"\n  }, \"Key Features\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"WiFi network management (connect, disconnect, list networks)\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"HTTP requests (GET, POST, PATCH, STREAM)\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Custom HTTP request builder\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"UDP communication\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"LED indicators for various states\")), mdx(\"h3\", {\n    \"id\": \"how-it-works\"\n  }, \"How It Works\"), mdx(\"p\", null, \"The custom firmware acts as a bridge between the Flipper Zero and the internet. Here\\u2019s a simplified workflow:\"), mdx(\"ol\", null, mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Flash the custom firmware onto the ESP32-S2 board.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Connect the board to the Flipper Zero.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Use UART commands to control WiFi connections and make HTTP requests.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"The ESP32-S2 handles the network operations and returns the results to the Flipper Zero.\")), mdx(\"p\", null, \"This setup essentially turns your Flipper Zero into a pocket-sized web client, opening up a world of possibilities for security testing, IoT experimentation, and more.\"), mdx(\"h2\", {\n    \"id\": \"potential-applications\"\n  }, \"Potential Applications\"), mdx(\"p\", null, \"With this new capability, we can explore several exciting avenues:\"), mdx(\"ol\", null, mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"p\", {\n    parentName: \"li\"\n  }, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"WiFi Penetration Testing\"), \": Create portable tools for network scanning, deauthentication attacks, and security audits.\")), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"p\", {\n    parentName: \"li\"\n  }, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"IoT Device Emulation\"), \": Simulate various IoT devices to test network security or set up honeypots.\")), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"p\", {\n    parentName: \"li\"\n  }, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Remote Control and Monitoring\"), \": Implement web interfaces or mobile apps to control your Flipper Zero remotely.\")), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"p\", {\n    parentName: \"li\"\n  }, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Mesh Networking\"), \": Develop networks of multiple Flipper devices for distributed tasks or long-range communication.\")), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"p\", {\n    parentName: \"li\"\n  }, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Signal Processing and SDR\"), \": Implement basic software-defined radio functionalities or create spectrum analyzers.\")), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"p\", {\n    parentName: \"li\"\n  }, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Network Protocol Analysis\"), \": Build portable packet sniffers, protocol analyzers, and debugging tools.\")), mdx(\"li\", {\n    parentName: \"ol\"\n  }, mdx(\"p\", {\n    parentName: \"li\"\n  }, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Environmental Sensing\"), \": Integrate various sensors for portable weather stations or environmental monitoring.\"))), mdx(\"h2\", {\n    \"id\": \"project-information\"\n  }, \"Project Information\"), mdx(\"p\", null, mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://github.com/MassivDash/flipper-postman-esp32s2\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"Github repo\")), mdx(\"p\", null, \"Custom flash software for Flipper Dev Board exposing the WIFI and HTTP methods via serial (UART) that can be picked up by the flipper zero device for building web enabled applications.\"), mdx(\"h2\", {\n    \"id\": \"features\"\n  }, \"Features\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Connect / Disonnect to WiFi networks\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"List available WiFi networks\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Make HTTP GET, POST, PATCH and STREAM requests\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Custom HTTP request builder with all the methods GET, POST, HEAD, DELETE, PATCH, PUT, attach custom headers (Authorization), show and hide response headers\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Stream serial responses for large payloads.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"UDP communication, send commands and messages over the network via UDP packets\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"LED indicators for different states\")), mdx(\"h2\", {\n    \"id\": \"udp--network-communication\"\n  }, \"UDP / Network communication\"), mdx(\"p\", null, \"After you establish wifi the board listens to UDP packets you can use mobile apps (with TCP/UDP) or use cmd line tools like \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"echo -n \\\"GET https://api.spacexdata.com/v3/rockets\\\" | nc -u 192.168.0.115 1234\"), \".\"), mdx(\"p\", null, \"The board will transmit the local port and into the serial\"), mdx(\"p\", null, \"You can also send custom messages to the flipper, type MESSAGE: {your text} for transmitting whatever you want to your flipper device.\"), mdx(\"h2\", {\n    \"id\": \"flipper-zero-uart-terminal\"\n  }, \"Flipper Zero Uart Terminal\"), mdx(\"p\", null, \"You can use the \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://github.com/cool4uma/UART_Terminal\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"https://github.com/cool4uma/UART_Terminal\"), \" to communicate directly with the board. You don\\u2019t have to write \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"https://\"), \" it will be auto added by the board.\"), mdx(\"p\", null, mdx(\"img\", {\n    parentName: \"p\",\n    \"src\": \"/af0d09d1c03730a10a6c6f5d9351680d/flipper-uart-terminal.gif\",\n    \"alt\": \"Flipper UART Terminal\"\n  })), mdx(\"h2\", {\n    \"id\": \"arduino-ide-serial-monitor\"\n  }, \"Arduino Ide Serial Monitor\"), mdx(\"p\", null, \"Communication via usb to flipperzero (GPIO->USB-UART Bridge) with Arduino Ide Serial Monitor\"), mdx(\"p\", null, mdx(\"img\", {\n    parentName: \"p\",\n    \"src\": \"/5c5f39e655c45932a093b9de52a5fc6c/flipper-board-serial-monitor.gif\",\n    \"alt\": \"Arduino Ide SerialMonitor\"\n  })), mdx(\"h2\", {\n    \"id\": \"installation-build-from-source\"\n  }, \"Installation (Build from source)\"), mdx(\"ol\", {\n    \"start\": 0\n  }, mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Git clone the project\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Install \", mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://www.arduino.cc/en/software\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"Arduino IDE\")), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Arduino IDE -> Settings (Preferences)\")), mdx(\"p\", null, \"Copy and paste the \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json\")), mdx(\"ol\", {\n    \"start\": 3\n  }, mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Wait for installation\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Arduino IDE -> Tools -> Board -> Board Manager -> look for \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"esp32 by Expressif systems\"), \" and install\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Arduino IDE -> Tools -> Manage Libraries -> find ArduinoJSON package and install\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Arduino IDE -> Select Board -> choose esp32s2 dev board\")), mdx(\"p\", null, mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://github.com/cool4uma/UART_Terminal\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"UART Terminal Application\"), \". You can also connect flipper to your computer via usb cable then enter GPIO and enable the UART-USB Bridge to communicate directly to board via Arduino IDE Serial Monitor or \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://wiki.emacinc.com/wiki/Getting_Started_With_Minicom\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"minicom\"), \" cmd line program\"), mdx(\"ol\", {\n    \"start\": 7\n  }, mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Set the SSID and password for the WiFi connection using the \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"SET_SSID\"), \" and \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"SET_PASSWORD\"), \" commands.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Activate the WiFi connection using the \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"ACTIVATE_WIFI\"), \" command.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Use the \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"GET\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"POST\"), \", or \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"GET_STREAM\"), \" commands to make HTTP requests.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Build custom HTTP requests using the \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"BUILD_HTTP_*\"), \" commands.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Execute custom HTTP requests using the \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"EXECUTE_HTTP_CALL\"), \" command.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Use the \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"?\"), \" or \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"HELP\"), \" commands to print help information.\")), mdx(\"h2\", {\n    \"id\": \"serial-api-documentation\"\n  }, \"SERIAL API Documentation\"), mdx(\"p\", null, \"This section provides detailed information about the available commands, their descriptions, arguments, responses, and response types. It also includes the possible serial responses that the receiver can expect.\"), mdx(\"h3\", {\n    \"id\": \"commands\"\n  }, \"Commands\"), mdx(\"table\", null, mdx(\"thead\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"thead\"\n  }, mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Command\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Description\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Arguments\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Response Type\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Response Description\"))), mdx(\"tbody\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"VERSION\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Get board version\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"None\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Text\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"VERSION: <version>\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"WIFI_CONNECT <SSID> <password>\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Connect to a WiFi network\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"<SSID> <password>\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Text\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"WIFI_SSID: <SSID><br>WIFI_PASSWORD: <password><br>WIFI_CONNECT: Connecting to WiFi...\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"WIFI_SET_SSID <ssid>\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Set the SSID for WiFi connection\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"<ssid>\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Text\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"WIFI_SSID: <ssid>\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"WIFI_SET_PASSWORD <password>\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Set the password for WiFi connection\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"<password>\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Text\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"WIFI_PASSWORD: <password>\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"WIFI_ACTIVATE\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Activate the WiFi connection\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"None\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Text\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"WIFI_CONNECT: Connecting to WiFi...\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"WIFI_DEACTIVATE\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Disconnect from the WiFi network\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"None\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Text\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"WIFI_DISCONNECT: Wifi disconnected\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"WIFI_LIST\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"List available WiFi networks\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"None\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Text\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"WIFI_LIST: <list>\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"WIFI_STATUS\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Show WiFi status\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"None\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Text\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"WIFI_STATUS: CONNECTED\"), \" or \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"WIFI_STATUS: DISCONNECTED\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"WIFI_GET_ACTIVE_SSID\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Get the name of the connected SSID\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"None\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Text\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"WIFI_GET_ACTIVE_SSID: <ssid>\"), \" or \", mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"WIFI_GET_ACTIVE_SSID: Not connected\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"WIFI_GET_LOCAL_IP\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Get the local IP address\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"None\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Text\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"<ip_address>\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"GET <url>\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Make an HTTP GET request\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"<url>\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Text\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"GET: <url><br>STATUS: <number><br>RESPONSE:<br><response><br>RESPONSE_END\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"GET_STREAM <url>\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Make an HTTP GET request and stream the response\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"<url>\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Stream\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"GET_STREAM: <url><br>STATUS: <number><br>STREAM: <br><streamed data><br>STREAM_END\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"FILE_STREAM <url>\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Direct stream, no messages\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"<url>\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Text\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"<stream>\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"POST <url> <json_payload>\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Make an HTTP POST request with JSON payload\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"<url> <json_payload>\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Text\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"POST: <url><br>Payload: <json_payload><br>STATUS: <number><br>RESPONSE:<br><response><br>RESPONSE_END\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"POST_STREAM <url> <json_payload>\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Make an HTTP POST request and stream the response\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"<url> <json_payload>\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Stream\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"POST_STREAM: <url><br>STATUS: <number><br>STREAM: <br><streamed data><br>STREAM_END\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"BUILD_HTTP_METHOD <method>\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Set the HTTP method for custom request\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"<method>\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Text\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"HTTP_SET_METHOD: <method>\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"BUILD_HTTP_URL <url>\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Set the URL for custom HTTP request\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"<url>\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Text\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"HTTP_URL: <url>\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"BUILD_HTTP_HEADER <key:value>\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Add a header to custom HTTP request\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"<key:value>\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Text\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"HTTP_ADD_HEADER: <key:value>\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"BUILD_HTTP_PAYLOAD <payload>\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Set the payload for custom HTTP request\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"<payload>\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Text\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"HTTP_SET_PAYLOAD: <payload>\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"REMOVE_HTTP_HEADER <key>\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Remove a header from custom HTTP request\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"<key>\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Text\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"HTTP_REMOVE_HEADER: <key>\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"RESET_HTTP_CONFIG\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Reset custom HTTP request configuration\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"None\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Text\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"HTTP_CONFIG_RESET: All configurations reset\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"BUILD_HTTP_SHOW_RESPONSE_HEADERS <true/false>\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Show or hide HTTP response headers\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"<true/false>\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Text\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"HTTP_BUILDER_SHOW_RESPONSE_HEADERS: <true/false>\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"BUILD_HTTP_IMPLEMENTATION <STREAM/CALL>\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Set HTTP implementation type\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"<STREAM/CALL>\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Text\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"HTTP_SET_IMPLEMENTATION: <STREAM/CALL>\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"EXECUTE_HTTP_CALL\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Execute the custom HTTP request\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"None\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Text/Stream\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Depends on implementation type\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"BUILD_HTTP_SHOW_CONFIG\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Show current HTTP configuration\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"None\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Text\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"HTTP_BUILDER_CONFIG: <current configuration>\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"MESSAGE_UDP <message> <remoteIP> <remotePort>\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Send UDP message\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"<message> <remoteIP> <remotePort>\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Text\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"UDP message sent: <message><br>To IP: <remoteIP>, Port: <remotePort>\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"?\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Print help information\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"None\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Text\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"Available Commands: <list of commands>\"))), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"HELP\")), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Print help information\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"None\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Text\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, mdx(\"inlineCode\", {\n    parentName: \"td\"\n  }, \"Available Commands: <list of commands>\"))))), mdx(\"h4\", {\n    \"id\": \"sending-commands\"\n  }, \"Sending Commands\"), mdx(\"p\", null, \"To set the SSID for the WiFi connection:\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-plaintext\"\n  }, \"SET_SSID MyWiFiNetwork\\n\")), mdx(\"p\", null, \"To make an HTTP GET request:\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-plaintext\"\n  }, \"GET https://api.example.com/data\\n\")), mdx(\"p\", null, \"To make an HTTP GET request and stream the response:\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-plaintext\"\n  }, \"GET_STREAM https://api.example.com/data\\n\")), mdx(\"p\", null, \"To make an HTTP POST request with a JSON payload:\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-plaintext\"\n  }, \"POST https://api.example.com/data {\\\"key\\\":\\\"value\\\"}\\n\")), mdx(\"h2\", {\n    \"id\": \"http-builder\"\n  }, \"HTTP Builder\"), mdx(\"p\", null, \"The firmware holds a http config you can manipulate and then execute the call.\\nCheck the flags in the table above.\"), mdx(\"h4\", {\n    \"id\": \"show-response-headers\"\n  }, \"Show response headers\"), mdx(\"p\", null, \"HTTP builder if set for showing headers will only transmit the headers from this list \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"\\\"Content-Type\\\", \\\"Content-Length\\\", \\\"Connection\\\",\\n                                \\\"Date\\\", \\\"Server\\\"\")), mdx(\"h4\", {\n    \"id\": \"simple-build-call\"\n  }, \"Simple Build call\"), mdx(\"p\", null, \"BUILD_HTTP_METHOD HEAD\\nBUILD_HTTP_URL \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://api.com/\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"https://api.com/\"), \"\\nEXECUTE_HTTP_CALL\"), mdx(\"h4\", {\n    \"id\": \"receiving-responses\"\n  }, \"Receiving Responses\"), mdx(\"p\", null, \"When you send a \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"GET_STREAM\"), \" command, you will receive the following responses:\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-plaintext\"\n  }, \"GET_STREAM request to: https://api.example.com/data\\nSTREAM:\\n<streamed data>\\nSTREAM_END\\n\")), mdx(\"p\", null, \"When you list available WiFi networks:\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-plaintext\"\n  }, \"WIFI_LIST: Available WiFi networks: <list>\\n\")), mdx(\"h2\", {\n    \"id\": \"notes\"\n  }, \"Notes\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"The firmware currently follow strict redirects (\", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"HTTPC_STRICT_FOLLOW_REDIRECTS\"), \" - strict RFC2616, only requests using GET or HEAD methods will be redirected (using the same method), since the RFC requires end-user confirmation in other cases.)\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Website crawls will print html only on smaller websites.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"You should be able to stream files and images to flipper via stream (untested)\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Simple get call will make a head call first and determine the possible size of the content, that will not always be possible, if the content length is unknown, firmware will choose safer stream method\")), mdx(\"h2\", {\n    \"id\": \"esp32-links\"\n  }, \"ESP32 links\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://randomnerdtutorials.com/installing-the-esp32-board-in-arduino-ide-windows-instructions/\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"ESP32 Arduino Setup \")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://docs.espressif.com/projects/esp-idf/en/v4.3/esp32s2/api-guides/tools/idf-tools.html\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"ESP-IDF\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://www.espressif.com/sites/default/files/documentation/esp32-s2_datasheet_en.pdf\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"ESP32S2 Specs\"))), mdx(\"p\", null, \"Author: SpaceGhost @ spaceout.pl\"));\n}\n;\nMDXContent.isMDXComponent = true;","tech":["C"],"category":"Project","appDescription":"Productivity","hero":{"full":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAQFA//EABUBAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAHKrn6kgNKgWQH/xAAaEAACAwEBAAAAAAAAAAAAAAABAgADEhEE/9oACAEBAAEFAkCknzrmFeSlsNyBRpq1WMoB/8QAFhEBAQEAAAAAAAAAAAAAAAAAABEQ/9oACAEDAQE/AUyv/8QAFhEBAQEAAAAAAAAAAAAAAAAAABEB/9oACAECAQE/AYirr//EAB4QAAEDBAMAAAAAAAAAAAAAAAABETECAxASIkGh/9oACAEBAAY/AuSshtbq2bpSRpyzEekH/8QAGxABAQEBAQADAAAAAAAAAAAAAREAIVFBcaH/2gAIAQEAAT8h/I5cxqQrycgSB5goPDxPnPRsNfm8u+3Qpd9WlTP/2gAMAwEAAgADAAAAEN/wAv/EABcRAAMBAAAAAAAAAAAAAAAAAAABEVH/2gAIAQMBAT8QjwrCso//xAAXEQADAQAAAAAAAAAAAAAAAAAAEVFh/9oACAECAQE/EGg0Gpof/8QAHhABAQACAgIDAAAAAAAAAAAAAREAMSFxQVFhkfD/2gAIAQEAAT8Qi+nsvxiOZBCE2JubmcU1CoPD6yZoSJg8OBx2rH6xqyD1kFVafhwajbyJ1zi0M7c//9k=","aspectRatio":1,"src":"/static/6025f105ff999e2f85121bab83df7fd7/58fe7/foldersCover.jpg","srcSet":"/static/6025f105ff999e2f85121bab83df7fd7/e0f30/foldersCover.jpg 236w,\n/static/6025f105ff999e2f85121bab83df7fd7/86afd/foldersCover.jpg 472w,\n/static/6025f105ff999e2f85121bab83df7fd7/58fe7/foldersCover.jpg 944w,\n/static/6025f105ff999e2f85121bab83df7fd7/0ff54/foldersCover.jpg 1200w","srcWebp":"/static/6025f105ff999e2f85121bab83df7fd7/99fbb/foldersCover.webp","srcSetWebp":"/static/6025f105ff999e2f85121bab83df7fd7/77392/foldersCover.webp 236w,\n/static/6025f105ff999e2f85121bab83df7fd7/1f177/foldersCover.webp 472w,\n/static/6025f105ff999e2f85121bab83df7fd7/99fbb/foldersCover.webp 944w,\n/static/6025f105ff999e2f85121bab83df7fd7/9000d/foldersCover.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%20200v200h52a241%20241%200%200064-2h2l1-2%205-4c6-3%206-5-1-5l-4-1h-3c-3%202-7%202-7%200l3-2%204-2c1-2-9%200-12%202l-5%203c-3%200-8%205-6%205l4-2%203-1%202%201c2%201%201%201-2%202-9%203-12%203-14%201l-4-1h-5l-2%201c-1-1-10%201-13%203l-4%202c-1-1%202-4%207-5l4-2h-8l-10%201c-2%201-5%202-7%201-4%200-5-1-2-1l4-1c0-1-12-1-23%201l-14%201-7%201-1-6v-6h12a732%20732%200%200126%204c0%202%200%202%201%201s9-3%209-1h4l7%201c1%201%200%201-5%201l-7-1h-6l3%201%2014%201c11%201%2015%201%2012-1-1-1%201-1%204-1%208%200%207-1%200-1l-6%201-2%201-3-1%201-1%203-1-1-1h-1l-3-1-14-2c-10-2-10-2-3-1l16%201a231%20231%200%200054-1c11%200%2012-1%203-3-7-2-12-2-41-2l-8-1-6-2c-3-1-3-1-1-2l1-1c-10%200-46-6-47-8h15c14%200%2018%200%2031%203%2016%203%2034%205%2034%203l-7-1-12-2-10-1c-10-1-11-1-4-2a76%2076%200%200126%201c1-1%2033-2%2035-1%201%200%201%201-1%201l18%201c18%200%2046%203%2048%204l-1%206c-3%206-3%206%201%206s10-2%2010-3h-1c-2%200-2%200-1-3%201-4%202-4%205-4s4%201%203%202h3c2%200%203%200%206%204l4%204%201-4%202-4v-1c-1-1-1-1%201-3l2-2h-2c-2-1-2-1%200-1l5-2c3-3%2010-3%2013%200l4%202h1c-1%202%205%200%208-2s5-2%2053-2a1733%201733%200%200158%203c-2%201-2%201%200%201l3-1c1-1%206-2%2017-2%2014%200%2015%200%2015%202%200%203-8%204-23%202-3-1-5%200-7%201l-7%204-4%202-3%201h-2l3%201%203%201h-8c0-3-30-2-34%200h16a433%20433%200%2000-50%207c-13%200-11%201%209%203%207%201%207%201%202%201l-12-1c-7-1-7%200-1%202a346%20346%200%200079-1%20547%20547%200%200024-1l4%201-6%201a421%20421%200%2000-40%203h-11l5%202%2017%201%2012%201c1%201%2021%204%2029%204l6%201V0H0v200m0%201c0%20110%200%20199%201%20198%200-2%201-2%206-2l8-1H1v-17h4c3%200%203%200%201-1l-2-1c2%200%201-2-1-2l-2-1%202-1c18%204%2025%204%2011%200l-6-2%205%201%2010%202%209%201%2010%201%2019%201c7-3-15-7-28-5l-12-1-7-2%206%201a15090%2015090%200%2000-14-4l-5-1v-84l2%202%202%203h38l-6-7c-11-11-21-24-28-35l-8-12V116c0-63-1-25-1%2085M131%2039l-3%201%203%202c3%203%203%207%202%2010-3%204%204%205%208%200%207-7-1-18-10-13m162%208c-12%206-8%2023%205%2023l7-1c1-2%201-2-2-2-4%200-5-2-6-7%200-6%202-10%205-11%202-1%202-1%200-2h-9M167%2069c-37%206-69%2024-90%2051-6%208-6%208%201%202l6-4%201-1%201-1%203-1%204-1%201-1c-1-1-1-1%200%200l2-1%203-1c1%201%203%200%206-1%204-3%206-2%202%201-5%203-4%204%202%201%205-2%207-2%207%201h2c3-1%204-1%202%202-1%201-1%201%202%201a509%20509%200%200119-3c-2%201-2%201%203%201l2%202%203-1c1-1%202%200%205%202l3%202%201-1c3%201%209-1%208-2h-9l-4-2%204-2c6-3%2015-3%2012-1s-2%203%200%202h2l2%201%203%201h2c2%200%203-2%201-2l-1-2%202%201h2c2%200%202%200%202%202l-2%201-2%202c0%203%203%204%205%202l1-1%201%201v1l1-1h2c2%202%205%202%203%200l1-1%201%201%203%203%202%201-6%203c-3-1-6%200-6%201l1%201h3c2%201%203%202%203%206l-1%206%201%202%201%201a321%20321%200%20002-17c1%200%203%205%203%208%200%202%200%202%202%201v3c-2%202%200%206%202%205l2%201c1%201%201%201%201-1s0-3-1-2c-2%201-3-2-1-5s0-7-3-7l-2-3-1-6v-1c1-2%202-1%202%201l1-1c2-4%207-6%209-3%201%202-3%206-6%206-2%200-2%200-1%201h3c2%200%202%200%201%201s-2%202-3%201l-2%201%201%202%203%201c0%202%200%202%201%201h2l-1%203%201%202c1%201%203%200%202-2h2c1%201%201%201%201-1-1-1%200-2%201-2h1l1%201h1l-1%202-1%201-1%201c-2%201-1%203%201%202l1-2c0-1%201-1%201%201%201%202%201%202%202%201l1-2v2h1v-3h-2c-1-2%203-7%206-7%205-1%204%205%200%207-2%201-2%201%201%201%203%201%205%204%203%204v2l3%201v5c0%204%200%205%201%204s1-1%202%201c0%202%200%202%201%201s1-1%201%201h2l1%202%202%203c1%202%201%202%201%200l2-2c2%200%203%202%201%202v2l1%202%201%201v1c-1%202-1%206%201%206v-4h1l2-1c2%200%202%200%201-1-1%200-2-1-1-2%201-3%203%201%202%205%200%203%200%203%202%202%203%200%203%200%202%202l1%202%201%202-2%202c-3%200-3%200-2%201%202%202%206%203%206%201l1-1%203-2h2l2%201h2v1l-1%201v7l-2%202-1%202v1l-2%201c-2%200-2%200-1%201l1%202h-1l-1%202%201%201h1l-1%201v3l2%205v5c0%202%200%202-2%201v-3c2%200%201-2-1-1-2%200-3%200-3-6l-4-9-1-3c0-4-4-9-6-9s-4-3-8-8h-1l5%209%203%204h1v-1l1-1c1%200%203%204%202%205l-1-1c0-1-2%200-2%202l1%201c1-1%203%202%202%203l2%202c2%201%204%203%203%205v3l2%201-1%202h-1l1%201%201%202%201%201%207%206v4l-3%202c-2%202-2%202%200%202%201%201%202%200%202-1l2-1c2%200%203-3%201-5-3-2-2-4%200-4%202-1%206%203%204%204v1l1%203v2l1%203v2h2l1%201c-3%204-2%209%201%208%202%200%202-1%201-2v-4c1-3%201-4-1-7a321%20321%200%2001-4-8l-4-9h1c0-1-1-2-3-2-1%200-2%200-1-1v-7l1-6c1-1%202-2%201-3%200-2%200-2%201-1%202%202%205%203%204%201l1-2h1l2%201c2-1%203%200%201%201l-2%202%202%202%201%201-1%201-2%201%201%201c2%200%201%204-2%205-2%200-2%200-1%201v2l-1%202%201%202c3-1%205%201%204%204l1%203%201-1h1l1-1v-1c3%200%206%204%206%207l1%202h1c0%202-3%202-4%200l-1-2c-2%200-3-2-2-3%201-2%200-3-2-1s-1%206%201%206c1%200%202%202%200%202-1%201-1%205%201%205v4l-1%202-2%203v2c2%200%202%201%201%203v8l-3%2013c-1%203-1%203%201%203l1-1v-3c2-3%202-3%202-12l3-9c2-1%202%201%201%203l-2%203v3c-1%202%200%205%203%205l-1%204c-1%202-2%204-1%205h-1l-1%201c1%201%200%202-1%203l-1%204-1%203h-2l-1-2-1-2c0-4-1-4-4%200l-3%202h-1c-1%200-2%201-1%202v3h2l2-3%202-3h2l-1%203-2%202%201%201c2-1%201%200-1%202l-4%201-2%201%2011%201h11l2-3A135%20135%200%2000167%2069m189%2017c-11%204-18%2017-15%2027%202%209%2011%2017%2019%2017%203%200%203%200%201-2-6-5-7-18-2-29%204-8%204-9%207-11l2-2h-12m-72%2090c-4%205-1%2011%204%209%204%200%205-2%205-5%201-6-5-8-9-4M94%20322l1%208h3c3%201%206-2%206-5%200-5-2-7-6-7-2%201-2%201-2-1l-1-3-1%208m51-7l-1%202c0%202%200%202-2%202-2-1-6%202-6%206%200%203%204%206%206%205h3l1-8c0-8%200-9-1-7m125%207l1%208%201-3c0-3%200-3%203-3s7-3%207-5-4-5-8-5h-4v8m-222-3c-2%200-2%201-2%208l1%208%201-3c0-2%200-2%202-2%202%201%206-2%206-5s-3-7-5-7l-3%201m13%200h-3c-1%200-2%2014%200%2016l1-3c0-2%200-2%202-2%204%201%206-1%206-5%200-5-3-8-6-6m47%201c-4%203-1%2011%203%2011%202%200%205-4%205-6%200-6-5-9-8-5m263%2054l-19%203-18%203-3%201%203%201c3%201%201%201-8%201a229%20229%200%2000-22%201c-3%200-3%200%202%201h13l13-1h21a406%20406%200%200125-4h-21c-3-1%2016-2%2023-2%207%201%2020%200%2020-1l-3-1c-10%201-18%200-17-1%200-1-8-2-9-1m-225%2012l-4%201-4%202-5%201c-4%201-12%206-11%207l1%202c-1%201%200%201%202%201%203%200%204-1%207-3l5-4c2-1%202-1%201-2v-1l2%201c1%201%209-3%209-4l-3-1m83%202l3%203%206%203%206%203%204%201-6-1-13-2-5-2c-4%200-2%202%203%205%204%202%205%202%2027%202h24l-5-2-15-4a750%20750%200%2001-29-6m19%202a263%20263%200%200030%208l24%202h19l-9-2-18-2c-9%200-13-1-29-5l-17-1'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"regular":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAQFA//EABUBAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAHKrn6kgNKgWQH/xAAaEAACAwEBAAAAAAAAAAAAAAABAgADEhEE/9oACAEBAAEFAkCknzrmFeSlsNyBRpq1WMoB/8QAFhEBAQEAAAAAAAAAAAAAAAAAABEQ/9oACAEDAQE/AUyv/8QAFhEBAQEAAAAAAAAAAAAAAAAAABEB/9oACAECAQE/AYirr//EAB4QAAEDBAMAAAAAAAAAAAAAAAABETECAxASIkGh/9oACAEBAAY/AuSshtbq2bpSRpyzEekH/8QAGxABAQEBAQADAAAAAAAAAAAAAREAIVFBcaH/2gAIAQEAAT8h/I5cxqQrycgSB5goPDxPnPRsNfm8u+3Qpd9WlTP/2gAMAwEAAgADAAAAEN/wAv/EABcRAAMBAAAAAAAAAAAAAAAAAAABEVH/2gAIAQMBAT8QjwrCso//xAAXEQADAQAAAAAAAAAAAAAAAAAAEVFh/9oACAECAQE/EGg0Gpof/8QAHhABAQACAgIDAAAAAAAAAAAAAREAMSFxQVFhkfD/2gAIAQEAAT8Qi+nsvxiOZBCE2JubmcU1CoPD6yZoSJg8OBx2rH6xqyD1kFVafhwajbyJ1zi0M7c//9k=","aspectRatio":1,"src":"/static/6025f105ff999e2f85121bab83df7fd7/1dc0b/foldersCover.jpg","srcSet":"/static/6025f105ff999e2f85121bab83df7fd7/3a5ce/foldersCover.jpg 163w,\n/static/6025f105ff999e2f85121bab83df7fd7/05730/foldersCover.jpg 327w,\n/static/6025f105ff999e2f85121bab83df7fd7/1dc0b/foldersCover.jpg 653w,\n/static/6025f105ff999e2f85121bab83df7fd7/f72c7/foldersCover.jpg 980w,\n/static/6025f105ff999e2f85121bab83df7fd7/0ff54/foldersCover.jpg 1200w","srcWebp":"/static/6025f105ff999e2f85121bab83df7fd7/0acdf/foldersCover.webp","srcSetWebp":"/static/6025f105ff999e2f85121bab83df7fd7/ac59e/foldersCover.webp 163w,\n/static/6025f105ff999e2f85121bab83df7fd7/7660b/foldersCover.webp 327w,\n/static/6025f105ff999e2f85121bab83df7fd7/0acdf/foldersCover.webp 653w,\n/static/6025f105ff999e2f85121bab83df7fd7/75470/foldersCover.webp 980w,\n/static/6025f105ff999e2f85121bab83df7fd7/9000d/foldersCover.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%20200v200h52a241%20241%200%200064-2h2l1-2%205-4c6-3%206-5-1-5l-4-1h-3c-3%202-7%202-7%200l3-2%204-2c1-2-9%200-12%202l-5%203c-3%200-8%205-6%205l4-2%203-1%202%201c2%201%201%201-2%202-9%203-12%203-14%201l-4-1h-5l-2%201c-1-1-10%201-13%203l-4%202c-1-1%202-4%207-5l4-2h-8l-10%201c-2%201-5%202-7%201-4%200-5-1-2-1l4-1c0-1-12-1-23%201l-14%201-7%201-1-6v-6h12a732%20732%200%200126%204c0%202%200%202%201%201s9-3%209-1h4l7%201c1%201%200%201-5%201l-7-1h-6l3%201%2014%201c11%201%2015%201%2012-1-1-1%201-1%204-1%208%200%207-1%200-1l-6%201-2%201-3-1%201-1%203-1-1-1h-1l-3-1-14-2c-10-2-10-2-3-1l16%201a231%20231%200%200054-1c11%200%2012-1%203-3-7-2-12-2-41-2l-8-1-6-2c-3-1-3-1-1-2l1-1c-10%200-46-6-47-8h15c14%200%2018%200%2031%203%2016%203%2034%205%2034%203l-7-1-12-2-10-1c-10-1-11-1-4-2a76%2076%200%200126%201c1-1%2033-2%2035-1%201%200%201%201-1%201l18%201c18%200%2046%203%2048%204l-1%206c-3%206-3%206%201%206s10-2%2010-3h-1c-2%200-2%200-1-3%201-4%202-4%205-4s4%201%203%202h3c2%200%203%200%206%204l4%204%201-4%202-4v-1c-1-1-1-1%201-3l2-2h-2c-2-1-2-1%200-1l5-2c3-3%2010-3%2013%200l4%202h1c-1%202%205%200%208-2s5-2%2053-2a1733%201733%200%200158%203c-2%201-2%201%200%201l3-1c1-1%206-2%2017-2%2014%200%2015%200%2015%202%200%203-8%204-23%202-3-1-5%200-7%201l-7%204-4%202-3%201h-2l3%201%203%201h-8c0-3-30-2-34%200h16a433%20433%200%2000-50%207c-13%200-11%201%209%203%207%201%207%201%202%201l-12-1c-7-1-7%200-1%202a346%20346%200%200079-1%20547%20547%200%200024-1l4%201-6%201a421%20421%200%2000-40%203h-11l5%202%2017%201%2012%201c1%201%2021%204%2029%204l6%201V0H0v200m0%201c0%20110%200%20199%201%20198%200-2%201-2%206-2l8-1H1v-17h4c3%200%203%200%201-1l-2-1c2%200%201-2-1-2l-2-1%202-1c18%204%2025%204%2011%200l-6-2%205%201%2010%202%209%201%2010%201%2019%201c7-3-15-7-28-5l-12-1-7-2%206%201a15090%2015090%200%2000-14-4l-5-1v-84l2%202%202%203h38l-6-7c-11-11-21-24-28-35l-8-12V116c0-63-1-25-1%2085M131%2039l-3%201%203%202c3%203%203%207%202%2010-3%204%204%205%208%200%207-7-1-18-10-13m162%208c-12%206-8%2023%205%2023l7-1c1-2%201-2-2-2-4%200-5-2-6-7%200-6%202-10%205-11%202-1%202-1%200-2h-9M167%2069c-37%206-69%2024-90%2051-6%208-6%208%201%202l6-4%201-1%201-1%203-1%204-1%201-1c-1-1-1-1%200%200l2-1%203-1c1%201%203%200%206-1%204-3%206-2%202%201-5%203-4%204%202%201%205-2%207-2%207%201h2c3-1%204-1%202%202-1%201-1%201%202%201a509%20509%200%200119-3c-2%201-2%201%203%201l2%202%203-1c1-1%202%200%205%202l3%202%201-1c3%201%209-1%208-2h-9l-4-2%204-2c6-3%2015-3%2012-1s-2%203%200%202h2l2%201%203%201h2c2%200%203-2%201-2l-1-2%202%201h2c2%200%202%200%202%202l-2%201-2%202c0%203%203%204%205%202l1-1%201%201v1l1-1h2c2%202%205%202%203%200l1-1%201%201%203%203%202%201-6%203c-3-1-6%200-6%201l1%201h3c2%201%203%202%203%206l-1%206%201%202%201%201a321%20321%200%20002-17c1%200%203%205%203%208%200%202%200%202%202%201v3c-2%202%200%206%202%205l2%201c1%201%201%201%201-1s0-3-1-2c-2%201-3-2-1-5s0-7-3-7l-2-3-1-6v-1c1-2%202-1%202%201l1-1c2-4%207-6%209-3%201%202-3%206-6%206-2%200-2%200-1%201h3c2%200%202%200%201%201s-2%202-3%201l-2%201%201%202%203%201c0%202%200%202%201%201h2l-1%203%201%202c1%201%203%200%202-2h2c1%201%201%201%201-1-1-1%200-2%201-2h1l1%201h1l-1%202-1%201-1%201c-2%201-1%203%201%202l1-2c0-1%201-1%201%201%201%202%201%202%202%201l1-2v2h1v-3h-2c-1-2%203-7%206-7%205-1%204%205%200%207-2%201-2%201%201%201%203%201%205%204%203%204v2l3%201v5c0%204%200%205%201%204s1-1%202%201c0%202%200%202%201%201s1-1%201%201h2l1%202%202%203c1%202%201%202%201%200l2-2c2%200%203%202%201%202v2l1%202%201%201v1c-1%202-1%206%201%206v-4h1l2-1c2%200%202%200%201-1-1%200-2-1-1-2%201-3%203%201%202%205%200%203%200%203%202%202%203%200%203%200%202%202l1%202%201%202-2%202c-3%200-3%200-2%201%202%202%206%203%206%201l1-1%203-2h2l2%201h2v1l-1%201v7l-2%202-1%202v1l-2%201c-2%200-2%200-1%201l1%202h-1l-1%202%201%201h1l-1%201v3l2%205v5c0%202%200%202-2%201v-3c2%200%201-2-1-1-2%200-3%200-3-6l-4-9-1-3c0-4-4-9-6-9s-4-3-8-8h-1l5%209%203%204h1v-1l1-1c1%200%203%204%202%205l-1-1c0-1-2%200-2%202l1%201c1-1%203%202%202%203l2%202c2%201%204%203%203%205v3l2%201-1%202h-1l1%201%201%202%201%201%207%206v4l-3%202c-2%202-2%202%200%202%201%201%202%200%202-1l2-1c2%200%203-3%201-5-3-2-2-4%200-4%202-1%206%203%204%204v1l1%203v2l1%203v2h2l1%201c-3%204-2%209%201%208%202%200%202-1%201-2v-4c1-3%201-4-1-7a321%20321%200%2001-4-8l-4-9h1c0-1-1-2-3-2-1%200-2%200-1-1v-7l1-6c1-1%202-2%201-3%200-2%200-2%201-1%202%202%205%203%204%201l1-2h1l2%201c2-1%203%200%201%201l-2%202%202%202%201%201-1%201-2%201%201%201c2%200%201%204-2%205-2%200-2%200-1%201v2l-1%202%201%202c3-1%205%201%204%204l1%203%201-1h1l1-1v-1c3%200%206%204%206%207l1%202h1c0%202-3%202-4%200l-1-2c-2%200-3-2-2-3%201-2%200-3-2-1s-1%206%201%206c1%200%202%202%200%202-1%201-1%205%201%205v4l-1%202-2%203v2c2%200%202%201%201%203v8l-3%2013c-1%203-1%203%201%203l1-1v-3c2-3%202-3%202-12l3-9c2-1%202%201%201%203l-2%203v3c-1%202%200%205%203%205l-1%204c-1%202-2%204-1%205h-1l-1%201c1%201%200%202-1%203l-1%204-1%203h-2l-1-2-1-2c0-4-1-4-4%200l-3%202h-1c-1%200-2%201-1%202v3h2l2-3%202-3h2l-1%203-2%202%201%201c2-1%201%200-1%202l-4%201-2%201%2011%201h11l2-3A135%20135%200%2000167%2069m189%2017c-11%204-18%2017-15%2027%202%209%2011%2017%2019%2017%203%200%203%200%201-2-6-5-7-18-2-29%204-8%204-9%207-11l2-2h-12m-72%2090c-4%205-1%2011%204%209%204%200%205-2%205-5%201-6-5-8-9-4M94%20322l1%208h3c3%201%206-2%206-5%200-5-2-7-6-7-2%201-2%201-2-1l-1-3-1%208m51-7l-1%202c0%202%200%202-2%202-2-1-6%202-6%206%200%203%204%206%206%205h3l1-8c0-8%200-9-1-7m125%207l1%208%201-3c0-3%200-3%203-3s7-3%207-5-4-5-8-5h-4v8m-222-3c-2%200-2%201-2%208l1%208%201-3c0-2%200-2%202-2%202%201%206-2%206-5s-3-7-5-7l-3%201m13%200h-3c-1%200-2%2014%200%2016l1-3c0-2%200-2%202-2%204%201%206-1%206-5%200-5-3-8-6-6m47%201c-4%203-1%2011%203%2011%202%200%205-4%205-6%200-6-5-9-8-5m263%2054l-19%203-18%203-3%201%203%201c3%201%201%201-8%201a229%20229%200%2000-22%201c-3%200-3%200%202%201h13l13-1h21a406%20406%200%200125-4h-21c-3-1%2016-2%2023-2%207%201%2020%200%2020-1l-3-1c-10%201-18%200-17-1%200-1-8-2-9-1m-225%2012l-4%201-4%202-5%201c-4%201-12%206-11%207l1%202c-1%201%200%201%202%201%203%200%204-1%207-3l5-4c2-1%202-1%201-2v-1l2%201c1%201%209-3%209-4l-3-1m83%202l3%203%206%203%206%203%204%201-6-1-13-2-5-2c-4%200-2%202%203%205%204%202%205%202%2027%202h24l-5-2-15-4a750%20750%200%2001-29-6m19%202a263%20263%200%200030%208l24%202h19l-9-2-18-2c-9%200-13-1-29-5l-17-1'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"narrow":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAQFA//EABUBAQEAAAAAAAAAAAAAAAAAAAAB/9oADAMBAAIQAxAAAAHKrn6kgNKgWQH/xAAaEAACAwEBAAAAAAAAAAAAAAABAgADEhEE/9oACAEBAAEFAkCknzrmFeSlsNyBRpq1WMoB/8QAFhEBAQEAAAAAAAAAAAAAAAAAABEQ/9oACAEDAQE/AUyv/8QAFhEBAQEAAAAAAAAAAAAAAAAAABEB/9oACAECAQE/AYirr//EAB4QAAEDBAMAAAAAAAAAAAAAAAABETECAxASIkGh/9oACAEBAAY/AuSshtbq2bpSRpyzEekH/8QAGxABAQEBAQADAAAAAAAAAAAAAREAIVFBcaH/2gAIAQEAAT8h/I5cxqQrycgSB5goPDxPnPRsNfm8u+3Qpd9WlTP/2gAMAwEAAgADAAAAEN/wAv/EABcRAAMBAAAAAAAAAAAAAAAAAAABEVH/2gAIAQMBAT8QjwrCso//xAAXEQADAQAAAAAAAAAAAAAAAAAAEVFh/9oACAECAQE/EGg0Gpof/8QAHhABAQACAgIDAAAAAAAAAAAAAREAMSFxQVFhkfD/2gAIAQEAAT8Qi+nsvxiOZBCE2JubmcU1CoPD6yZoSJg8OBx2rH6xqyD1kFVafhwajbyJ1zi0M7c//9k=","aspectRatio":1,"src":"/static/6025f105ff999e2f85121bab83df7fd7/eaa58/foldersCover.jpg","srcSet":"/static/6025f105ff999e2f85121bab83df7fd7/5a3ee/foldersCover.jpg 114w,\n/static/6025f105ff999e2f85121bab83df7fd7/41f8f/foldersCover.jpg 229w,\n/static/6025f105ff999e2f85121bab83df7fd7/eaa58/foldersCover.jpg 457w,\n/static/6025f105ff999e2f85121bab83df7fd7/c309b/foldersCover.jpg 686w,\n/static/6025f105ff999e2f85121bab83df7fd7/e3008/foldersCover.jpg 914w,\n/static/6025f105ff999e2f85121bab83df7fd7/0ff54/foldersCover.jpg 1200w","srcWebp":"/static/6025f105ff999e2f85121bab83df7fd7/15384/foldersCover.webp","srcSetWebp":"/static/6025f105ff999e2f85121bab83df7fd7/31fce/foldersCover.webp 114w,\n/static/6025f105ff999e2f85121bab83df7fd7/e3e25/foldersCover.webp 229w,\n/static/6025f105ff999e2f85121bab83df7fd7/15384/foldersCover.webp 457w,\n/static/6025f105ff999e2f85121bab83df7fd7/0258d/foldersCover.webp 686w,\n/static/6025f105ff999e2f85121bab83df7fd7/64ea2/foldersCover.webp 914w,\n/static/6025f105ff999e2f85121bab83df7fd7/9000d/foldersCover.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%20200v200h52a241%20241%200%200064-2h2l1-2%205-4c6-3%206-5-1-5l-4-1h-3c-3%202-7%202-7%200l3-2%204-2c1-2-9%200-12%202l-5%203c-3%200-8%205-6%205l4-2%203-1%202%201c2%201%201%201-2%202-9%203-12%203-14%201l-4-1h-5l-2%201c-1-1-10%201-13%203l-4%202c-1-1%202-4%207-5l4-2h-8l-10%201c-2%201-5%202-7%201-4%200-5-1-2-1l4-1c0-1-12-1-23%201l-14%201-7%201-1-6v-6h12a732%20732%200%200126%204c0%202%200%202%201%201s9-3%209-1h4l7%201c1%201%200%201-5%201l-7-1h-6l3%201%2014%201c11%201%2015%201%2012-1-1-1%201-1%204-1%208%200%207-1%200-1l-6%201-2%201-3-1%201-1%203-1-1-1h-1l-3-1-14-2c-10-2-10-2-3-1l16%201a231%20231%200%200054-1c11%200%2012-1%203-3-7-2-12-2-41-2l-8-1-6-2c-3-1-3-1-1-2l1-1c-10%200-46-6-47-8h15c14%200%2018%200%2031%203%2016%203%2034%205%2034%203l-7-1-12-2-10-1c-10-1-11-1-4-2a76%2076%200%200126%201c1-1%2033-2%2035-1%201%200%201%201-1%201l18%201c18%200%2046%203%2048%204l-1%206c-3%206-3%206%201%206s10-2%2010-3h-1c-2%200-2%200-1-3%201-4%202-4%205-4s4%201%203%202h3c2%200%203%200%206%204l4%204%201-4%202-4v-1c-1-1-1-1%201-3l2-2h-2c-2-1-2-1%200-1l5-2c3-3%2010-3%2013%200l4%202h1c-1%202%205%200%208-2s5-2%2053-2a1733%201733%200%200158%203c-2%201-2%201%200%201l3-1c1-1%206-2%2017-2%2014%200%2015%200%2015%202%200%203-8%204-23%202-3-1-5%200-7%201l-7%204-4%202-3%201h-2l3%201%203%201h-8c0-3-30-2-34%200h16a433%20433%200%2000-50%207c-13%200-11%201%209%203%207%201%207%201%202%201l-12-1c-7-1-7%200-1%202a346%20346%200%200079-1%20547%20547%200%200024-1l4%201-6%201a421%20421%200%2000-40%203h-11l5%202%2017%201%2012%201c1%201%2021%204%2029%204l6%201V0H0v200m0%201c0%20110%200%20199%201%20198%200-2%201-2%206-2l8-1H1v-17h4c3%200%203%200%201-1l-2-1c2%200%201-2-1-2l-2-1%202-1c18%204%2025%204%2011%200l-6-2%205%201%2010%202%209%201%2010%201%2019%201c7-3-15-7-28-5l-12-1-7-2%206%201a15090%2015090%200%2000-14-4l-5-1v-84l2%202%202%203h38l-6-7c-11-11-21-24-28-35l-8-12V116c0-63-1-25-1%2085M131%2039l-3%201%203%202c3%203%203%207%202%2010-3%204%204%205%208%200%207-7-1-18-10-13m162%208c-12%206-8%2023%205%2023l7-1c1-2%201-2-2-2-4%200-5-2-6-7%200-6%202-10%205-11%202-1%202-1%200-2h-9M167%2069c-37%206-69%2024-90%2051-6%208-6%208%201%202l6-4%201-1%201-1%203-1%204-1%201-1c-1-1-1-1%200%200l2-1%203-1c1%201%203%200%206-1%204-3%206-2%202%201-5%203-4%204%202%201%205-2%207-2%207%201h2c3-1%204-1%202%202-1%201-1%201%202%201a509%20509%200%200119-3c-2%201-2%201%203%201l2%202%203-1c1-1%202%200%205%202l3%202%201-1c3%201%209-1%208-2h-9l-4-2%204-2c6-3%2015-3%2012-1s-2%203%200%202h2l2%201%203%201h2c2%200%203-2%201-2l-1-2%202%201h2c2%200%202%200%202%202l-2%201-2%202c0%203%203%204%205%202l1-1%201%201v1l1-1h2c2%202%205%202%203%200l1-1%201%201%203%203%202%201-6%203c-3-1-6%200-6%201l1%201h3c2%201%203%202%203%206l-1%206%201%202%201%201a321%20321%200%20002-17c1%200%203%205%203%208%200%202%200%202%202%201v3c-2%202%200%206%202%205l2%201c1%201%201%201%201-1s0-3-1-2c-2%201-3-2-1-5s0-7-3-7l-2-3-1-6v-1c1-2%202-1%202%201l1-1c2-4%207-6%209-3%201%202-3%206-6%206-2%200-2%200-1%201h3c2%200%202%200%201%201s-2%202-3%201l-2%201%201%202%203%201c0%202%200%202%201%201h2l-1%203%201%202c1%201%203%200%202-2h2c1%201%201%201%201-1-1-1%200-2%201-2h1l1%201h1l-1%202-1%201-1%201c-2%201-1%203%201%202l1-2c0-1%201-1%201%201%201%202%201%202%202%201l1-2v2h1v-3h-2c-1-2%203-7%206-7%205-1%204%205%200%207-2%201-2%201%201%201%203%201%205%204%203%204v2l3%201v5c0%204%200%205%201%204s1-1%202%201c0%202%200%202%201%201s1-1%201%201h2l1%202%202%203c1%202%201%202%201%200l2-2c2%200%203%202%201%202v2l1%202%201%201v1c-1%202-1%206%201%206v-4h1l2-1c2%200%202%200%201-1-1%200-2-1-1-2%201-3%203%201%202%205%200%203%200%203%202%202%203%200%203%200%202%202l1%202%201%202-2%202c-3%200-3%200-2%201%202%202%206%203%206%201l1-1%203-2h2l2%201h2v1l-1%201v7l-2%202-1%202v1l-2%201c-2%200-2%200-1%201l1%202h-1l-1%202%201%201h1l-1%201v3l2%205v5c0%202%200%202-2%201v-3c2%200%201-2-1-1-2%200-3%200-3-6l-4-9-1-3c0-4-4-9-6-9s-4-3-8-8h-1l5%209%203%204h1v-1l1-1c1%200%203%204%202%205l-1-1c0-1-2%200-2%202l1%201c1-1%203%202%202%203l2%202c2%201%204%203%203%205v3l2%201-1%202h-1l1%201%201%202%201%201%207%206v4l-3%202c-2%202-2%202%200%202%201%201%202%200%202-1l2-1c2%200%203-3%201-5-3-2-2-4%200-4%202-1%206%203%204%204v1l1%203v2l1%203v2h2l1%201c-3%204-2%209%201%208%202%200%202-1%201-2v-4c1-3%201-4-1-7a321%20321%200%2001-4-8l-4-9h1c0-1-1-2-3-2-1%200-2%200-1-1v-7l1-6c1-1%202-2%201-3%200-2%200-2%201-1%202%202%205%203%204%201l1-2h1l2%201c2-1%203%200%201%201l-2%202%202%202%201%201-1%201-2%201%201%201c2%200%201%204-2%205-2%200-2%200-1%201v2l-1%202%201%202c3-1%205%201%204%204l1%203%201-1h1l1-1v-1c3%200%206%204%206%207l1%202h1c0%202-3%202-4%200l-1-2c-2%200-3-2-2-3%201-2%200-3-2-1s-1%206%201%206c1%200%202%202%200%202-1%201-1%205%201%205v4l-1%202-2%203v2c2%200%202%201%201%203v8l-3%2013c-1%203-1%203%201%203l1-1v-3c2-3%202-3%202-12l3-9c2-1%202%201%201%203l-2%203v3c-1%202%200%205%203%205l-1%204c-1%202-2%204-1%205h-1l-1%201c1%201%200%202-1%203l-1%204-1%203h-2l-1-2-1-2c0-4-1-4-4%200l-3%202h-1c-1%200-2%201-1%202v3h2l2-3%202-3h2l-1%203-2%202%201%201c2-1%201%200-1%202l-4%201-2%201%2011%201h11l2-3A135%20135%200%2000167%2069m189%2017c-11%204-18%2017-15%2027%202%209%2011%2017%2019%2017%203%200%203%200%201-2-6-5-7-18-2-29%204-8%204-9%207-11l2-2h-12m-72%2090c-4%205-1%2011%204%209%204%200%205-2%205-5%201-6-5-8-9-4M94%20322l1%208h3c3%201%206-2%206-5%200-5-2-7-6-7-2%201-2%201-2-1l-1-3-1%208m51-7l-1%202c0%202%200%202-2%202-2-1-6%202-6%206%200%203%204%206%206%205h3l1-8c0-8%200-9-1-7m125%207l1%208%201-3c0-3%200-3%203-3s7-3%207-5-4-5-8-5h-4v8m-222-3c-2%200-2%201-2%208l1%208%201-3c0-2%200-2%202-2%202%201%206-2%206-5s-3-7-5-7l-3%201m13%200h-3c-1%200-2%2014%200%2016l1-3c0-2%200-2%202-2%204%201%206-1%206-5%200-5-3-8-6-6m47%201c-4%203-1%2011%203%2011%202%200%205-4%205-6%200-6-5-9-8-5m263%2054l-19%203-18%203-3%201%203%201c3%201%201%201-8%201a229%20229%200%2000-22%201c-3%200-3%200%202%201h13l13-1h21a406%20406%200%200125-4h-21c-3-1%2016-2%2023-2%207%201%2020%200%2020-1l-3-1c-10%201-18%200-17-1%200-1-8-2-9-1m-225%2012l-4%201-4%202-5%201c-4%201-12%206-11%207l1%202c-1%201%200%201%202%201%203%200%204-1%207-3l5-4c2-1%202-1%201-2v-1l2%201c1%201%209-3%209-4l-3-1m83%202l3%203%206%203%206%203%204%201-6-1-13-2-5-2c-4%200-2%202%203%205%204%202%205%202%2027%202h24l-5-2-15-4a750%20750%200%2001-29-6m19%202a263%20263%200%200030%208l24%202h19l-9-2-18-2c-9%200-13-1-29-5l-17-1'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"seo":{"src":"/static/6025f105ff999e2f85121bab83df7fd7/0ff54/foldersCover.jpg"}}},{"id":"9ea83f87-b55b-5eb0-b267-2d3874723c40","slug":"/flipper-time-tracker","secret":false,"title":"Flipper Time Tracker","author":"Luke Celitan","date":"June 6th, 2024","dateForSEO":"2024-06-06T00:00:00.000Z","timeToRead":2,"excerpt":"Time tracking app for Flipperzero","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\": \"Flipper Time Tracker\",\n  \"excerpt\": \"Time tracking app for Flipperzero\",\n  \"date\": \"2024-06-06T00:00:00.000Z\",\n  \"hero\": \"foldersCover.jpg\",\n  \"author\": \"Luke Celitan\",\n  \"appDescription\": \"Productivity\",\n  \"category\": \"Project\",\n  \"tech\": [\"C\"]\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\": \"introduction\"\n  }, \"Introduction\"), mdx(\"p\", null, \"As a security and app developer enthusiast, I\\u2019ve been using Flipper Zero for\\nsome time now. For those who don\\u2019t know, Flipper Zero is a versatile multitool\\ndevice designed for hardware and RF enthusiasts, security researchers, and\\nhobbyists. It\\u2019s a portable gadget that can interact with various digital systems\\nand wireless protocols.\"), mdx(\"p\", null, \"Flipper Zero has a range of capabilities, including reading and emulating RFID\\ncards, interacting with NFC devices, transmitting and receiving radio signals,\\nand communicating with infrared devices. It features a compact design with a\\nmonochrome display, navigation buttons, and an SD card slot for expandable\\nstorage. The device runs on open-source firmware, which is one of its most\\nexciting aspects.\"), mdx(\"p\", null, \"The cool thing about Flipper Zero is that you can write custom applications for\\nit, which is exactly what I\\u2019ve been trying to do. Recently, Flipper allowed Rust\\nlanguage execution, and I jumped into the possibility of writing an application\\nin Rust for Flipper. However, I faced some challenges. The unsafe clusters and\\nthe way Rust is built made it difficult for me to write the apps the way I\\nwanted.\"), mdx(\"p\", null, \"That\\u2019s why I decided to implement the same idea directly in C programming\\nlanguage, often referred to as the father of all languages. These endeavors\\nended up with the creation of Flipper Time Tracker.\"), mdx(\"p\", null, \"Flipper Time Tracker is an application for the Flipper Zero device that allows\\nthe user to track multiple tasks simultaneously. The application uses a CSV file\\nto store and handle task data, which can be easily exported to Excel or similar\\nsoftware for further analysis. This approach also allows for tracking task time\\nin the background or even when the device is switched off!\"), mdx(\"p\", null, mdx(\"img\", {\n    parentName: \"p\",\n    \"src\": \"/e3f31c665b039830cb91370036978638/demo.gif\",\n    \"alt\": \"Demo\"\n  })), mdx(\"h2\", {\n    \"id\": \"features\"\n  }, \"Features\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"track multiple tasks at the same\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"start / stop the task at will, resume tracking when needed.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"mark task as complete\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"edit task details (name, description, price per hour)\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"quick continue last used task\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"task running with timer counter view\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"you can download your csv file from \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"apps_data/trackerflipx/data.csv\"))), mdx(\"p\", null, \"This project showcases the potential of Flipper Zero as a platform for custom\\napplication development. The active community of developers and users who create\\nand share applications and modifications for Flipper Zero has been a great\\nsource of inspiration and support throughout this project. It\\u2019s exciting to see\\nhow this compact device can be transformed into a practical tool for time\\nmanagement and productivity.\"), mdx(\"p\", null, \"Checkout this\\n\", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://github.com/MassivDash/flipper-tracker/blob/main/docs/development.md\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"document\"), \"\\non how to prepare your environment and development for Flipper Zero device.\"), mdx(\"h2\", {\n    \"id\": \"installation\"\n  }, \"Installation\"), mdx(\"p\", null, \"To install the Flipper Time Tracker on your Flipper Zero device, you can use the\\nofficial Flipper Zero App store or download the .fap file directly from the\\n\", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://github.com/MassivDash/flipper-tracker/releases/tag/v1.0.3\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"github release page\")));\n}\n;\nMDXContent.isMDXComponent = true;","tech":["C"],"category":"Project","appDescription":"Productivity","hero":{"full":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAQDAv/EABYBAQEBAAAAAAAAAAAAAAAAAAABAv/aAAwDAQACEAMQAAABjno4zcVA3vJYgf/EABwQAAICAgMAAAAAAAAAAAAAAAECAAMQExESIv/aAAgBAQABBQKtgyYNbGanmsxnIXgdLfL/AP/EABYRAAMAAAAAAAAAAAAAAAAAAAABEv/aAAgBAwEBPwGWSymUz//EABgRAAMBAQAAAAAAAAAAAAAAAAASUQEC/9oACAECAQE/AWyjZRcgvMP/xAAcEAAABgMAAAAAAAAAAAAAAAAAAQIQETEhQWH/2gAIAQEABj8CUhV2T05dExoYMf/EABsQAQACAwEBAAAAAAAAAAAAAAEAESExQWGx/9oACAEBAAE/IUCpNr8nU7MswJQ9h2rHu4VgWRuOIhuOVssgoT//2gAMAwEAAgADAAAAEBTQPv/EABYRAQEBAAAAAAAAAAAAAAAAAABhAf/aAAgBAwEBPxCKKquv/8QAFhEBAQEAAAAAAAAAAAAAAAAAAGGR/9oACAECAQE/EJtTJkmP/8QAIBABAAICAgEFAAAAAAAAAAAAAREhADFBYVFxgZGh4f/aAAgBAQABPxAIneNz7jWWKmHmojrAOQX0wZqZREeCOTESGFJ2/GFqAuy8UEkWW4kNfODkJ8xtDpwbrQKr6z//2Q==","aspectRatio":1,"src":"/static/eaed1349ae375d7d26cff434c9b9f2c2/58fe7/foldersCover.jpg","srcSet":"/static/eaed1349ae375d7d26cff434c9b9f2c2/e0f30/foldersCover.jpg 236w,\n/static/eaed1349ae375d7d26cff434c9b9f2c2/86afd/foldersCover.jpg 472w,\n/static/eaed1349ae375d7d26cff434c9b9f2c2/58fe7/foldersCover.jpg 944w,\n/static/eaed1349ae375d7d26cff434c9b9f2c2/0ff54/foldersCover.jpg 1200w","srcWebp":"/static/eaed1349ae375d7d26cff434c9b9f2c2/99fbb/foldersCover.webp","srcSetWebp":"/static/eaed1349ae375d7d26cff434c9b9f2c2/77392/foldersCover.webp 236w,\n/static/eaed1349ae375d7d26cff434c9b9f2c2/1f177/foldersCover.webp 472w,\n/static/eaed1349ae375d7d26cff434c9b9f2c2/99fbb/foldersCover.webp 944w,\n/static/eaed1349ae375d7d26cff434c9b9f2c2/9000d/foldersCover.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%203c0%202%200%203%202%203v1c-3%202-2%204%200%203%202%200%202-1%202-4-1-3%201-3%204%201%201%201%201%201-1%201H5l2%201%202%204c0%202%200%202-1%201-2-3-3-2-2%200%200%203-3%205-5%204l1%202c2%202%202%203%202%206-1%203-2%205-2%203l-1-1c-2%202-1%20188%200%20188%201-1%203%200%204%201l2%203v-4c0-3%201-3%201-2%200%203%202%206%203%205%202%200%203%203%205%208%200%203%200%203-2%202l-3-4c0-2-1-2-1-1-2%205-2%2011-1%2014l2%203v-3c0-4%202-4%203%200l2%206%201%204%202%204c2%200%204%207%202%209l1%201c3%200%205%208%202%209l-2-5c0-2%200-2-1-1h-5l2-1c3-1%202-5-3-9l-2-3v-2l-1-2-2-1-2-2c0-2%201-3%203-1h1c0-2-3-3-6-2H3c-2-1-3%200-2%202v1l-1%2020%201%2020%202-1h2c2%203%204%202%203-1-2-3%200-3%204%200%203%204%205%204%203%200-3-4-2-4%201-2l3%203c0%201%203%202%2010%202%2010%200%2014%200%2013-2l1-1v-1l1-1%203%201v1c0%202%203%201%204%200s2-1%203%203l2-1h19l3-1%202%201%202%201v-3h8l1-1c0-1%201-2%205-1%205%201%207%201%203-1l-2-1%202-1c3-1%201-3-3-3s-6-2-2-4c2-2%202-2%205-1%202%202%202%202%202-1s0-3%201-1c0%203%200%203%201%202s1-1%202%202l3%203c2%200%205%204%204%207-2%203-1%204%203%204%203%200%204-1%202-2l-1-3-2-3-2-3h3c2%202%207%202%207%201l3%201c3%201%203%201%203%205l-1%204h8c10%200%2010%200%208-6l-1-4v-10l-2%202-1%202-1-2v-5c1-1%200-2-1-3-3-1%200-3%203-2l3-1%203-1c3%200%203%202-1%202-2%200-2%200%200%201l2%201-1%201c-1%200-2%201-2%206l1%206%201%202%201%202v-2l2-1h2l1-1%202-2c1-2%200-3-1-1-2%202-3%201-2-1v-3l1-1%201-1v-1h1l1%201v-2c0-3%202-3%203-1%202%202%202%202%203%201%202-2%203-1%204%201l1%202%201%201c1%202%201%202%202%201l2%203c2%205%205%205%204%200%200-2%200-3%201-1l1%203c1%201%200%203-1%202l-1%202%202%202c2%201%202%201%201-1s-1-2%203-1l4%201%202%201c2%201%205%201%207-2l2-2v1c-1%202-1%202%202%202%202%201%202%201-1%201l-3%201-1%201c-1%201%200%201%201%201%203%200%204%202%202%202l-2%201-4-1h-2l-6%201-5%201%2011%201c10%200%2011%200%2011-2s1-2%203-1c1%201%201%201-1%202-1%201%203%201%2017%201l16-1-7-2-4-1c-1%201-7-1-6-2l-1-3c-2-2%201-2%203%201l3%201v-1c-2-1-1-2%203-2l5-2%202%201v1c2%201%206-2%206-4v-3c0-2%200-2%201%201l1%203%201-3%201-3%201%205%203%206v-3c-2-1-1-3%201-3%202-1%203%200%201%202v1l2-1%203-2c4%200%204%200%202%203s-1%204%201%204l2-1%201-3%204-6%203-7%202-6c1-5%206-14%207-14v6l-1%201h3l1%202c-2%209-2%2010%201%204l4-6a58%2058%200%2001-10%2021l-1%203c0%203%200%203-1%201h-2l1%202c1%200%201%205-1%208%200%201%200%202%202%201%201%200%202-1%201-2-1-2%202-4%206-4%203%200%203%200%202-1v-1l3-1v2c-1%202-1%202%201%202h3c0%201%207-5%207-7l1-1v2l1%203c1%201%204-5%204-7l1-2c2-1%202-1%202%201v2c2%200%201%205-1%208-2%202%203%201%205-1l2-2-1%202c-1%205%205%204%2011-1%205-6%205-6%205-3l3-2%203-4v2c-1%201%200%201%203%201v3l-2-1h-1c-1%203-1%203%201%202v1c0%201-1%202-2%201l-1%201-1%201v-2c0-2%200-2-1-1l-1%201-2%203v3l1-1%202-2c2%200%202%200%201%203s0%203%203%200c2-2%204-1%202%202v1l3-3c1-3%202-3%202%200l-1%203h13l12-1-3-1-4-2c-1-1-1-1%203-1%203%201%204%200%204-1l1-1%201-3c0-3%201-4%203-4s2%200%201%201l-3%208v1l-1%202c0%202%200%202%201%201%201-2%201-2%202-1%200%202%203%203%205%201l1-1%201%201c-1%201%200%201%202%201l4-1%202-2%201%202%203%201c2%200%202%200%201-1-2-1-1-1%206-1%204%200%205%200%203-1l-2-2c1-1%200-1-2-1-3%200-3%200-2-3%202-3%202-3%205-3l3-1a300%20300%200%20002-4l1%207c0%2015%201%208%201-12l-1-20v3l-1%201c-2%200-2%200-1%202%202%202%202%203%200%204%200%200-2%201-2%203l-2%201%202-5v-3c-2%201-1-1%202-5s3-4%201-4c-2%201-3%200-1-5%202-3%202-3%202-1v-8l-1-11v-1c2%200%202-4%202-107V0H259a1505%201505%200%2000-145%202c1-2-1-2-15-2L83%201h1c3%200%204%202%201%203l-2%202h-2l3%203%201-1c0-2%201-2%204%200l5%201c3%200%206%206%204%207v2l-1%201c-4-1-4%203%200%204%202%201%202%201%201%202s-1%201%202%202l4%201%208%205c6%203%209%206%206%207h-3l-2-2c-3-1-3-1-2%201l-3%201-4%202-3%201-1%201%202%201%208%202%203%203%203%202c2-1%206%202%206%205%201%201%201%202%202%201%203-2%2011%201%2013%206l3%204v2c-1%200-4-3-4-6l-3-2-2-1c-1-2-3-1-3%201s-3%201-4-1-1-2-3%201l-2%204-1%202%202-1h1l-2%202v3l2%203%203%203c3%201%203%201%202%204s-1%203%201%203l1%202h-6c-1%201-1%201%204%204l1%202%202%202%203%201%202%201%202%201c2%202%202%202%200%202-2%201%203%206%207%206s5%203%202%206l-1%202%204%203%203%203h-3c-1%201-3%200-4-2-2-2-2-2-4-1l-2%201-1%201%203%203%206%203%204%202c3%200%205%202%205%204s-1%202-3%201l-2%201%204%202c4%200%206%202%205%203l3%203c2%201%203%201%202%202l2%203%203-1%205%205%202%202v1c-2%202%201%204%203%203%202%200%202%200%203%202%200%201%201%202%204%202l4%202c0%205-31-8-49-19l-9-6-4%204c-6%205-7%204-2-2l3-4-12-12C86%2093%2065%2054%2060%2013%2058-2%2059%200%2049%200c-7%200-9%201-9%202v1l-1%202c-1%203-3%203-4%200l-4-3-3-1C28-1%205%200%203%201H2L1%200%200%203m264%2049c-4%202-7%206-8%2010%200%203-1%204-3%205l-4%204c-2%202-2%202%200%202l6-1c3-2%203-2%205%200%203%204%209%206%2013%204l4-2h-4c-5%200-11-5-8-7%201-1%201-1-2-1-3-1-3-1-2-2l2-3c0-6%209-10%2015-7l4%202v-1l-5-3c-4-2-8-3-13%200M163%2089l-1%201-1%201c0%202-8%209-10%209s-2%200-1%201l2%203%206%202%202%201%201%201%201-2%201-2%203-2%204-2v-1c-2-2-3-6-2-6%202%200%200-4-2-5s-3-1-3%201m121%2031l-1%204c-1%201-1%201%201%201%201%200%202%200%201%201-1%200-1%201%201%202v5h1a117087%20117087%200%20004%207v-6a74%2074%200%2001-2-12l-1-4c0-3-4-1-4%202m113%2013l-6%2010c-6%208-12%2024-11%2032l-1%203c-3%200-4%204-4%207%201%203%200%204-1%206-2%201-3%204-4%206%200%202%200%202%201%201h1c0%203%202%202%203-1l2-5v2l1%201v2l-1%204c0%202%200%201%201-1l3-5v-2c-2%200-2-3-1-7v-3c-1-1-1-4%201-4s4%203%203%206c-2%205-2%208-1%208l3-10%204-11c2-3-1-3-4%200l-2%202v-3l1-5c1-1%201-1%201%201v2l2-3c0-3%200-3%201-1%201%201%201%201%202-1v-3l2-6%203-12c0-4%202-8%203-10l1-4-3%204M30%20153l1%202%201%202c2%200%201%205%200%205-2%200%200%205%202%207%202%201%201%202-3%201-1%200%200%203%202%203l1%202h-1c-2-1-2-1-2%201%200%205%207%204%207%200%201-3%201-5-2-5v-1l1-6c0-5%200-6-2-9l-5-3v1m158%2015c-6%206-1%2017%208%2017%204%200%209-3%209-5h-2c-4%204-10%201-9-5%201-4-4-10-6-7m-142%205c-2%202%205%206%2023%2014%2010%204%2014%206%2015%208l2%203%201-1c-1-1%201-2%203-1l12%205c11%203%2016%204%207%200-22-8-32-12-31-14%200-1%2011%202%2010%204l4%201%204%201%204%202h5l-3-2-7-3%2028%209h-6l6%202c7%202%2015%208%2011%208s3%202%2010%202c14%202-1-7-37-21-10-4-12-5-8-7%205-2%2010-1%2014%203s4%202%201-3c-7-8-21-9-28-3-2%202-2%202-9-1-15-5-30-8-31-6m-22%2011l2%202c3%203%203%204%200%203-2%200-2%200-1%201l1%206c1%205%200%206-3%204-1-1-1-1-1%201v3c-2-2-1%202%202%205l3%204h-1c-2-3-2%200%200%204l2%206%201%201c1%200%202-1%201-4%200-4%200-4%202-4s2%201%202%204l1%203c1%201%201%201%201-1%200-4%202-2%203%202v15c-1%201%200%202%201%203%203%201%203%201%203-2%200-5%201-8%202-6%201%201%201%200%201-2%200-3%200-3%201-2l2%202%203%201c2%203%203%201%203-2l1-3v-2l-1-2c0-2%200-2-1-1-1%203-5-1-6-6l-1-4v4c1%205-1%209-2%206-1-1-1%200-1%201l-1%203-3-14c0-5-1-8-2-9v-10c0-9%200-9-4-10l-2%201h-3c-1-2-5-3-5-1m228%204l-2%201-2%201c0%201-1%202-2%201l-3%202-3%202-4%202c-7%205-10%206-14%205-5%200-5%202-1%203h3l-2%203-2%203-2%203-1%204h2l2-1c3-1%204-4%202-5-1-1-1-1%201-1l3%202c0%202%201%201%205-2l3-2-3-2-1-1c2%200%202%200%200-1v-2l3%202v1l1%201%203%201v-1l-1-1a61%2061%200%200116-16c4-3%204-3%202-3l-3%201m117%2017l-2%206-2%206-2%2010%201%204c1-2%201-2%202-1l-1%203v13l1-2c0-1%201-1%202%201%201%203%201%207-1%207v-2l-1-2c-3%201-4%2011-1%2011l1-2c0-3%203-4%203-2l1%203%201-3%203-8-2%203c-1%203-2%202-2-3l1-5c1%200%203-4%203-8l1-3%201-3v-12l1-10-3%203c-4%203-4%205-1%209%202%203%202%204%201%207-1%204-3%206-4%203v-5c1-3%201-5-1-6-2-3-1-9%202-12l1-2-3%202M61%20223l2%205c2%202%202%203%202%206l1%203v-5l1%202%202%204c-1%201%200%203%201%204s1%201%201-2c0-4%200-4%201-1l1%201%205-3%201%202v-6l-2-2c-2%200-7-3-7-5l-1%201c-1%202-1%202-3-2-4-5-5-5-5-2m240%206l-3%202h-8l-7%201%204%201c4%200%205%201%2012%209l6%203h4l-4-2c-3-2-4-4-2-4l-4-2c-7-3-6-3%202-2%209%201%2010%201%205-1-4-3-4-3-2-3h4l2-1c-1-1-5-2-9-1m-194%2013v4l-1%201c-2%201-2%201-1%202l2%205c0%204%203%209%205%208h1l-2%202-2%201-2%201h-2l2%202c1%202%202%202%203%201h2l3-1%204-2%202-1v-2l-1-1-2-2c-2%200-4-5-4-9%200-2-1-4-3-5l-3-5c-1-2-1-2-1%201m18%205c0%204%200%205-1%204h-1l1%202v3c1%200%201%201-1%203v3c2-1%205-2%207-1s1%204%200%203c-3%200-2%201%200%204%202%202%202%203%201%204l-1%203%202-1c1-2%202-11%201-12v-3c0-2%200-3-1-2-1%202-5-5-6-11l-1-5v6m-89-4c-1%204-1%205%201%207v-2c0-3%201-5%203-3%201%202%204%2011%204%2015%201%202%202%203%204%203v-7l-1-6c0-3%200-4-2-5l-9-2M15%20361l-4%201%201%201-1%201h-1l-1%201-1-1c0-3-1-2-3%201-1%202-1%202%203%202h4c1%201%202%202%205%201l7%201h9c5-1%207%200%207%203h3v-2c0-2%200-2%203-2h4l3-1%205-2c1-1%204-1%205%201l1%201%201-1%201-2%202-1-1%202c-1%201-1%202%201%203%202%202%203%201%202-1%200-2%200-2%201-1l3%201%202%201%202%201v-2c-1-1-1-1%201-1%203%202%202%200-2-2s-4-2%202-1l5%201%206-1v-1h-2l-1-1H74l-2%201-2%201c0%202%200%202-1%200l-1-2-22-1a162%20162%200%2000-24%201l-2-1-5%201m130%200v2l-2%202-3%203c0%204-1%204-3-1l-2-3v4c1%203%201%204-1%203l-2%202c0%202%200%202-1%200h-2c-1%201%200%202%201%202v2l-3%201h-7c-5-5-35%202-33%207%201%201%200%201-3%201-2%200-3%200-2%201%202%200%202%201%202%204%200%204%200%204%201%202%201-3%203-3%204-1l-1%202h-1l2%201%201%202h-2c-2-1-7%201-7%203h15c13%200%2015%200%2014-1l-1-4v-2l-1-3c0-2%202-3%202%200l5%203c5%201%207%203%203%203l-2%201%202%201c3%200%204%200%202%201h22c0%202%205%201%209-1l5-3c2%200%206-2%205-3-2-1-1-2%204-3%203%200%204-1%204-2l3-1%203%201%202%201c2%201%203-1%201-2h2l3-1c-1-1%204-5%206-5%203%200%206-3%204-3-2-1-8%201-8%202l-3%201-4-1h-2v-1c2-1%203-2%204-1l3-1-2-2c-2%200-2-2%201-2l2-1-3-1-2%201c0%202-2%201-5-2s-6-4-4-1v4l-1%201c0-2-3-6-5-6l-1-1%202-1c2%200%203%200%202-2s-3-3-2%200l-2-1c-2-2-3-2-10-2l-8%201m198%200c-2%200-2%200-1%202%201%203%200%206-2%205l-2%201h-7c0%204%2012%203%2018-1h3c1%202%200%206-3%206v3c1%201%200%201-1%201-4%201-3%204%200%203%203%200%203%200%202%203-1%202-1%202%203%200%202%200%204-2%203-2-1-2%201-5%203-6%201%200%202-1%202-3l1-2%201%206%201%202v1c-2%200-2%200-1%202h3l4-3%207-1c3-2%204-2%206%200s3%207%201%207l-1-1-1-2-1%202%202%202%201%201h-5c-1-1-1-1-1%201l2%203%202%204c0%202%202%203%205%203l-1-1c-1-2-1-2%201-2l2%202%203%201c2%200%202%200%201-1-2-1-2-1%200-1l4%201c4%203%204%203%204-8l-1-20v-9h-18l-18%201h-21M1%20387v13h8l7-1%201-2%201%201c0%202%201%202%206%202s5%200%204-1l-2-3c0-3-1-5-2-4-1%200-2-1-2-4l-2-7%201-2%202%201v5c1%204%204%205%203%201%200-3%200-3%204-3%203%201%205%200%202-1l-2-3c-1-2%202-1%204%201h2c0-2-1-3-4-3l-5-2-2-1v3c-2%200-5%200-9%202-2%201-3%202-2%205v4l-1-3-3-6c-2-6-3-5-3%201%200%205%200%205-2%203-1-1-2-2%200-3%201-2%200-3-2-2H2v-3c-1-1-1%204-1%2012m49-9l1%203v5c1%201-1%203-6%206-1%201-1%201%204%201l5%201%201%202%201-1%201-2c2%200%202%200%201%202s1%203%203%202c3-2%205-1%205%201%200%203%2014%203%2015%200%200-3-3-6-5-6l1%202c3%202%203%205%200%203s-6-2-6%200l-2%201c-3%200-2-2%202-3l2-1-3-3c-2-2-4-4-5-3l-2-2v-2l2-2h-6l-3-2-2-2c-1-2-3-3-4%200m249%200l-1%201c-1-1-2%202%200%203l1%202v11c-1%203%200%205%201%205l1-2%201-2h2v2c0%202%201%202%2011%202l10-1c0-2-1-4-3-4l-4-5-3-4c0%202-2%201-4-3s-2-4-2%201c0%203%200%202-2%200-5-7-10-10-8-6m-47%2016c-7%201-13%203-13%205a99%2099%200%200030%200v-1l-5-3-4-1h-8'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"regular":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAQDAv/EABYBAQEBAAAAAAAAAAAAAAAAAAABAv/aAAwDAQACEAMQAAABjno4zcVA3vJYgf/EABwQAAICAgMAAAAAAAAAAAAAAAECAAMQExESIv/aAAgBAQABBQKtgyYNbGanmsxnIXgdLfL/AP/EABYRAAMAAAAAAAAAAAAAAAAAAAABEv/aAAgBAwEBPwGWSymUz//EABgRAAMBAQAAAAAAAAAAAAAAAAASUQEC/9oACAECAQE/AWyjZRcgvMP/xAAcEAAABgMAAAAAAAAAAAAAAAAAAQIQETEhQWH/2gAIAQEABj8CUhV2T05dExoYMf/EABsQAQACAwEBAAAAAAAAAAAAAAEAESExQWGx/9oACAEBAAE/IUCpNr8nU7MswJQ9h2rHu4VgWRuOIhuOVssgoT//2gAMAwEAAgADAAAAEBTQPv/EABYRAQEBAAAAAAAAAAAAAAAAAABhAf/aAAgBAwEBPxCKKquv/8QAFhEBAQEAAAAAAAAAAAAAAAAAAGGR/9oACAECAQE/EJtTJkmP/8QAIBABAAICAgEFAAAAAAAAAAAAAREhADFBYVFxgZGh4f/aAAgBAQABPxAIneNz7jWWKmHmojrAOQX0wZqZREeCOTESGFJ2/GFqAuy8UEkWW4kNfODkJ8xtDpwbrQKr6z//2Q==","aspectRatio":1,"src":"/static/eaed1349ae375d7d26cff434c9b9f2c2/1dc0b/foldersCover.jpg","srcSet":"/static/eaed1349ae375d7d26cff434c9b9f2c2/3a5ce/foldersCover.jpg 163w,\n/static/eaed1349ae375d7d26cff434c9b9f2c2/05730/foldersCover.jpg 327w,\n/static/eaed1349ae375d7d26cff434c9b9f2c2/1dc0b/foldersCover.jpg 653w,\n/static/eaed1349ae375d7d26cff434c9b9f2c2/f72c7/foldersCover.jpg 980w,\n/static/eaed1349ae375d7d26cff434c9b9f2c2/0ff54/foldersCover.jpg 1200w","srcWebp":"/static/eaed1349ae375d7d26cff434c9b9f2c2/0acdf/foldersCover.webp","srcSetWebp":"/static/eaed1349ae375d7d26cff434c9b9f2c2/ac59e/foldersCover.webp 163w,\n/static/eaed1349ae375d7d26cff434c9b9f2c2/7660b/foldersCover.webp 327w,\n/static/eaed1349ae375d7d26cff434c9b9f2c2/0acdf/foldersCover.webp 653w,\n/static/eaed1349ae375d7d26cff434c9b9f2c2/75470/foldersCover.webp 980w,\n/static/eaed1349ae375d7d26cff434c9b9f2c2/9000d/foldersCover.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%203c0%202%200%203%202%203v1c-3%202-2%204%200%203%202%200%202-1%202-4-1-3%201-3%204%201%201%201%201%201-1%201H5l2%201%202%204c0%202%200%202-1%201-2-3-3-2-2%200%200%203-3%205-5%204l1%202c2%202%202%203%202%206-1%203-2%205-2%203l-1-1c-2%202-1%20188%200%20188%201-1%203%200%204%201l2%203v-4c0-3%201-3%201-2%200%203%202%206%203%205%202%200%203%203%205%208%200%203%200%203-2%202l-3-4c0-2-1-2-1-1-2%205-2%2011-1%2014l2%203v-3c0-4%202-4%203%200l2%206%201%204%202%204c2%200%204%207%202%209l1%201c3%200%205%208%202%209l-2-5c0-2%200-2-1-1h-5l2-1c3-1%202-5-3-9l-2-3v-2l-1-2-2-1-2-2c0-2%201-3%203-1h1c0-2-3-3-6-2H3c-2-1-3%200-2%202v1l-1%2020%201%2020%202-1h2c2%203%204%202%203-1-2-3%200-3%204%200%203%204%205%204%203%200-3-4-2-4%201-2l3%203c0%201%203%202%2010%202%2010%200%2014%200%2013-2l1-1v-1l1-1%203%201v1c0%202%203%201%204%200s2-1%203%203l2-1h19l3-1%202%201%202%201v-3h8l1-1c0-1%201-2%205-1%205%201%207%201%203-1l-2-1%202-1c3-1%201-3-3-3s-6-2-2-4c2-2%202-2%205-1%202%202%202%202%202-1s0-3%201-1c0%203%200%203%201%202s1-1%202%202l3%203c2%200%205%204%204%207-2%203-1%204%203%204%203%200%204-1%202-2l-1-3-2-3-2-3h3c2%202%207%202%207%201l3%201c3%201%203%201%203%205l-1%204h8c10%200%2010%200%208-6l-1-4v-10l-2%202-1%202-1-2v-5c1-1%200-2-1-3-3-1%200-3%203-2l3-1%203-1c3%200%203%202-1%202-2%200-2%200%200%201l2%201-1%201c-1%200-2%201-2%206l1%206%201%202%201%202v-2l2-1h2l1-1%202-2c1-2%200-3-1-1-2%202-3%201-2-1v-3l1-1%201-1v-1h1l1%201v-2c0-3%202-3%203-1%202%202%202%202%203%201%202-2%203-1%204%201l1%202%201%201c1%202%201%202%202%201l2%203c2%205%205%205%204%200%200-2%200-3%201-1l1%203c1%201%200%203-1%202l-1%202%202%202c2%201%202%201%201-1s-1-2%203-1l4%201%202%201c2%201%205%201%207-2l2-2v1c-1%202-1%202%202%202%202%201%202%201-1%201l-3%201-1%201c-1%201%200%201%201%201%203%200%204%202%202%202l-2%201-4-1h-2l-6%201-5%201%2011%201c10%200%2011%200%2011-2s1-2%203-1c1%201%201%201-1%202-1%201%203%201%2017%201l16-1-7-2-4-1c-1%201-7-1-6-2l-1-3c-2-2%201-2%203%201l3%201v-1c-2-1-1-2%203-2l5-2%202%201v1c2%201%206-2%206-4v-3c0-2%200-2%201%201l1%203%201-3%201-3%201%205%203%206v-3c-2-1-1-3%201-3%202-1%203%200%201%202v1l2-1%203-2c4%200%204%200%202%203s-1%204%201%204l2-1%201-3%204-6%203-7%202-6c1-5%206-14%207-14v6l-1%201h3l1%202c-2%209-2%2010%201%204l4-6a58%2058%200%2001-10%2021l-1%203c0%203%200%203-1%201h-2l1%202c1%200%201%205-1%208%200%201%200%202%202%201%201%200%202-1%201-2-1-2%202-4%206-4%203%200%203%200%202-1v-1l3-1v2c-1%202-1%202%201%202h3c0%201%207-5%207-7l1-1v2l1%203c1%201%204-5%204-7l1-2c2-1%202-1%202%201v2c2%200%201%205-1%208-2%202%203%201%205-1l2-2-1%202c-1%205%205%204%2011-1%205-6%205-6%205-3l3-2%203-4v2c-1%201%200%201%203%201v3l-2-1h-1c-1%203-1%203%201%202v1c0%201-1%202-2%201l-1%201-1%201v-2c0-2%200-2-1-1l-1%201-2%203v3l1-1%202-2c2%200%202%200%201%203s0%203%203%200c2-2%204-1%202%202v1l3-3c1-3%202-3%202%200l-1%203h13l12-1-3-1-4-2c-1-1-1-1%203-1%203%201%204%200%204-1l1-1%201-3c0-3%201-4%203-4s2%200%201%201l-3%208v1l-1%202c0%202%200%202%201%201%201-2%201-2%202-1%200%202%203%203%205%201l1-1%201%201c-1%201%200%201%202%201l4-1%202-2%201%202%203%201c2%200%202%200%201-1-2-1-1-1%206-1%204%200%205%200%203-1l-2-2c1-1%200-1-2-1-3%200-3%200-2-3%202-3%202-3%205-3l3-1a300%20300%200%20002-4l1%207c0%2015%201%208%201-12l-1-20v3l-1%201c-2%200-2%200-1%202%202%202%202%203%200%204%200%200-2%201-2%203l-2%201%202-5v-3c-2%201-1-1%202-5s3-4%201-4c-2%201-3%200-1-5%202-3%202-3%202-1v-8l-1-11v-1c2%200%202-4%202-107V0H259a1505%201505%200%2000-145%202c1-2-1-2-15-2L83%201h1c3%200%204%202%201%203l-2%202h-2l3%203%201-1c0-2%201-2%204%200l5%201c3%200%206%206%204%207v2l-1%201c-4-1-4%203%200%204%202%201%202%201%201%202s-1%201%202%202l4%201%208%205c6%203%209%206%206%207h-3l-2-2c-3-1-3-1-2%201l-3%201-4%202-3%201-1%201%202%201%208%202%203%203%203%202c2-1%206%202%206%205%201%201%201%202%202%201%203-2%2011%201%2013%206l3%204v2c-1%200-4-3-4-6l-3-2-2-1c-1-2-3-1-3%201s-3%201-4-1-1-2-3%201l-2%204-1%202%202-1h1l-2%202v3l2%203%203%203c3%201%203%201%202%204s-1%203%201%203l1%202h-6c-1%201-1%201%204%204l1%202%202%202%203%201%202%201%202%201c2%202%202%202%200%202-2%201%203%206%207%206s5%203%202%206l-1%202%204%203%203%203h-3c-1%201-3%200-4-2-2-2-2-2-4-1l-2%201-1%201%203%203%206%203%204%202c3%200%205%202%205%204s-1%202-3%201l-2%201%204%202c4%200%206%202%205%203l3%203c2%201%203%201%202%202l2%203%203-1%205%205%202%202v1c-2%202%201%204%203%203%202%200%202%200%203%202%200%201%201%202%204%202l4%202c0%205-31-8-49-19l-9-6-4%204c-6%205-7%204-2-2l3-4-12-12C86%2093%2065%2054%2060%2013%2058-2%2059%200%2049%200c-7%200-9%201-9%202v1l-1%202c-1%203-3%203-4%200l-4-3-3-1C28-1%205%200%203%201H2L1%200%200%203m264%2049c-4%202-7%206-8%2010%200%203-1%204-3%205l-4%204c-2%202-2%202%200%202l6-1c3-2%203-2%205%200%203%204%209%206%2013%204l4-2h-4c-5%200-11-5-8-7%201-1%201-1-2-1-3-1-3-1-2-2l2-3c0-6%209-10%2015-7l4%202v-1l-5-3c-4-2-8-3-13%200M163%2089l-1%201-1%201c0%202-8%209-10%209s-2%200-1%201l2%203%206%202%202%201%201%201%201-2%201-2%203-2%204-2v-1c-2-2-3-6-2-6%202%200%200-4-2-5s-3-1-3%201m121%2031l-1%204c-1%201-1%201%201%201%201%200%202%200%201%201-1%200-1%201%201%202v5h1a117087%20117087%200%20004%207v-6a74%2074%200%2001-2-12l-1-4c0-3-4-1-4%202m113%2013l-6%2010c-6%208-12%2024-11%2032l-1%203c-3%200-4%204-4%207%201%203%200%204-1%206-2%201-3%204-4%206%200%202%200%202%201%201h1c0%203%202%202%203-1l2-5v2l1%201v2l-1%204c0%202%200%201%201-1l3-5v-2c-2%200-2-3-1-7v-3c-1-1-1-4%201-4s4%203%203%206c-2%205-2%208-1%208l3-10%204-11c2-3-1-3-4%200l-2%202v-3l1-5c1-1%201-1%201%201v2l2-3c0-3%200-3%201-1%201%201%201%201%202-1v-3l2-6%203-12c0-4%202-8%203-10l1-4-3%204M30%20153l1%202%201%202c2%200%201%205%200%205-2%200%200%205%202%207%202%201%201%202-3%201-1%200%200%203%202%203l1%202h-1c-2-1-2-1-2%201%200%205%207%204%207%200%201-3%201-5-2-5v-1l1-6c0-5%200-6-2-9l-5-3v1m158%2015c-6%206-1%2017%208%2017%204%200%209-3%209-5h-2c-4%204-10%201-9-5%201-4-4-10-6-7m-142%205c-2%202%205%206%2023%2014%2010%204%2014%206%2015%208l2%203%201-1c-1-1%201-2%203-1l12%205c11%203%2016%204%207%200-22-8-32-12-31-14%200-1%2011%202%2010%204l4%201%204%201%204%202h5l-3-2-7-3%2028%209h-6l6%202c7%202%2015%208%2011%208s3%202%2010%202c14%202-1-7-37-21-10-4-12-5-8-7%205-2%2010-1%2014%203s4%202%201-3c-7-8-21-9-28-3-2%202-2%202-9-1-15-5-30-8-31-6m-22%2011l2%202c3%203%203%204%200%203-2%200-2%200-1%201l1%206c1%205%200%206-3%204-1-1-1-1-1%201v3c-2-2-1%202%202%205l3%204h-1c-2-3-2%200%200%204l2%206%201%201c1%200%202-1%201-4%200-4%200-4%202-4s2%201%202%204l1%203c1%201%201%201%201-1%200-4%202-2%203%202v15c-1%201%200%202%201%203%203%201%203%201%203-2%200-5%201-8%202-6%201%201%201%200%201-2%200-3%200-3%201-2l2%202%203%201c2%203%203%201%203-2l1-3v-2l-1-2c0-2%200-2-1-1-1%203-5-1-6-6l-1-4v4c1%205-1%209-2%206-1-1-1%200-1%201l-1%203-3-14c0-5-1-8-2-9v-10c0-9%200-9-4-10l-2%201h-3c-1-2-5-3-5-1m228%204l-2%201-2%201c0%201-1%202-2%201l-3%202-3%202-4%202c-7%205-10%206-14%205-5%200-5%202-1%203h3l-2%203-2%203-2%203-1%204h2l2-1c3-1%204-4%202-5-1-1-1-1%201-1l3%202c0%202%201%201%205-2l3-2-3-2-1-1c2%200%202%200%200-1v-2l3%202v1l1%201%203%201v-1l-1-1a61%2061%200%200116-16c4-3%204-3%202-3l-3%201m117%2017l-2%206-2%206-2%2010%201%204c1-2%201-2%202-1l-1%203v13l1-2c0-1%201-1%202%201%201%203%201%207-1%207v-2l-1-2c-3%201-4%2011-1%2011l1-2c0-3%203-4%203-2l1%203%201-3%203-8-2%203c-1%203-2%202-2-3l1-5c1%200%203-4%203-8l1-3%201-3v-12l1-10-3%203c-4%203-4%205-1%209%202%203%202%204%201%207-1%204-3%206-4%203v-5c1-3%201-5-1-6-2-3-1-9%202-12l1-2-3%202M61%20223l2%205c2%202%202%203%202%206l1%203v-5l1%202%202%204c-1%201%200%203%201%204s1%201%201-2c0-4%200-4%201-1l1%201%205-3%201%202v-6l-2-2c-2%200-7-3-7-5l-1%201c-1%202-1%202-3-2-4-5-5-5-5-2m240%206l-3%202h-8l-7%201%204%201c4%200%205%201%2012%209l6%203h4l-4-2c-3-2-4-4-2-4l-4-2c-7-3-6-3%202-2%209%201%2010%201%205-1-4-3-4-3-2-3h4l2-1c-1-1-5-2-9-1m-194%2013v4l-1%201c-2%201-2%201-1%202l2%205c0%204%203%209%205%208h1l-2%202-2%201-2%201h-2l2%202c1%202%202%202%203%201h2l3-1%204-2%202-1v-2l-1-1-2-2c-2%200-4-5-4-9%200-2-1-4-3-5l-3-5c-1-2-1-2-1%201m18%205c0%204%200%205-1%204h-1l1%202v3c1%200%201%201-1%203v3c2-1%205-2%207-1s1%204%200%203c-3%200-2%201%200%204%202%202%202%203%201%204l-1%203%202-1c1-2%202-11%201-12v-3c0-2%200-3-1-2-1%202-5-5-6-11l-1-5v6m-89-4c-1%204-1%205%201%207v-2c0-3%201-5%203-3%201%202%204%2011%204%2015%201%202%202%203%204%203v-7l-1-6c0-3%200-4-2-5l-9-2M15%20361l-4%201%201%201-1%201h-1l-1%201-1-1c0-3-1-2-3%201-1%202-1%202%203%202h4c1%201%202%202%205%201l7%201h9c5-1%207%200%207%203h3v-2c0-2%200-2%203-2h4l3-1%205-2c1-1%204-1%205%201l1%201%201-1%201-2%202-1-1%202c-1%201-1%202%201%203%202%202%203%201%202-1%200-2%200-2%201-1l3%201%202%201%202%201v-2c-1-1-1-1%201-1%203%202%202%200-2-2s-4-2%202-1l5%201%206-1v-1h-2l-1-1H74l-2%201-2%201c0%202%200%202-1%200l-1-2-22-1a162%20162%200%2000-24%201l-2-1-5%201m130%200v2l-2%202-3%203c0%204-1%204-3-1l-2-3v4c1%203%201%204-1%203l-2%202c0%202%200%202-1%200h-2c-1%201%200%202%201%202v2l-3%201h-7c-5-5-35%202-33%207%201%201%200%201-3%201-2%200-3%200-2%201%202%200%202%201%202%204%200%204%200%204%201%202%201-3%203-3%204-1l-1%202h-1l2%201%201%202h-2c-2-1-7%201-7%203h15c13%200%2015%200%2014-1l-1-4v-2l-1-3c0-2%202-3%202%200l5%203c5%201%207%203%203%203l-2%201%202%201c3%200%204%200%202%201h22c0%202%205%201%209-1l5-3c2%200%206-2%205-3-2-1-1-2%204-3%203%200%204-1%204-2l3-1%203%201%202%201c2%201%203-1%201-2h2l3-1c-1-1%204-5%206-5%203%200%206-3%204-3-2-1-8%201-8%202l-3%201-4-1h-2v-1c2-1%203-2%204-1l3-1-2-2c-2%200-2-2%201-2l2-1-3-1-2%201c0%202-2%201-5-2s-6-4-4-1v4l-1%201c0-2-3-6-5-6l-1-1%202-1c2%200%203%200%202-2s-3-3-2%200l-2-1c-2-2-3-2-10-2l-8%201m198%200c-2%200-2%200-1%202%201%203%200%206-2%205l-2%201h-7c0%204%2012%203%2018-1h3c1%202%200%206-3%206v3c1%201%200%201-1%201-4%201-3%204%200%203%203%200%203%200%202%203-1%202-1%202%203%200%202%200%204-2%203-2-1-2%201-5%203-6%201%200%202-1%202-3l1-2%201%206%201%202v1c-2%200-2%200-1%202h3l4-3%207-1c3-2%204-2%206%200s3%207%201%207l-1-1-1-2-1%202%202%202%201%201h-5c-1-1-1-1-1%201l2%203%202%204c0%202%202%203%205%203l-1-1c-1-2-1-2%201-2l2%202%203%201c2%200%202%200%201-1-2-1-2-1%200-1l4%201c4%203%204%203%204-8l-1-20v-9h-18l-18%201h-21M1%20387v13h8l7-1%201-2%201%201c0%202%201%202%206%202s5%200%204-1l-2-3c0-3-1-5-2-4-1%200-2-1-2-4l-2-7%201-2%202%201v5c1%204%204%205%203%201%200-3%200-3%204-3%203%201%205%200%202-1l-2-3c-1-2%202-1%204%201h2c0-2-1-3-4-3l-5-2-2-1v3c-2%200-5%200-9%202-2%201-3%202-2%205v4l-1-3-3-6c-2-6-3-5-3%201%200%205%200%205-2%203-1-1-2-2%200-3%201-2%200-3-2-2H2v-3c-1-1-1%204-1%2012m49-9l1%203v5c1%201-1%203-6%206-1%201-1%201%204%201l5%201%201%202%201-1%201-2c2%200%202%200%201%202s1%203%203%202c3-2%205-1%205%201%200%203%2014%203%2015%200%200-3-3-6-5-6l1%202c3%202%203%205%200%203s-6-2-6%200l-2%201c-3%200-2-2%202-3l2-1-3-3c-2-2-4-4-5-3l-2-2v-2l2-2h-6l-3-2-2-2c-1-2-3-3-4%200m249%200l-1%201c-1-1-2%202%200%203l1%202v11c-1%203%200%205%201%205l1-2%201-2h2v2c0%202%201%202%2011%202l10-1c0-2-1-4-3-4l-4-5-3-4c0%202-2%201-4-3s-2-4-2%201c0%203%200%202-2%200-5-7-10-10-8-6m-47%2016c-7%201-13%203-13%205a99%2099%200%200030%200v-1l-5-3-4-1h-8'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"narrow":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAFwABAQEBAAAAAAAAAAAAAAAAAAQDAv/EABYBAQEBAAAAAAAAAAAAAAAAAAABAv/aAAwDAQACEAMQAAABjno4zcVA3vJYgf/EABwQAAICAgMAAAAAAAAAAAAAAAECAAMQExESIv/aAAgBAQABBQKtgyYNbGanmsxnIXgdLfL/AP/EABYRAAMAAAAAAAAAAAAAAAAAAAABEv/aAAgBAwEBPwGWSymUz//EABgRAAMBAQAAAAAAAAAAAAAAAAASUQEC/9oACAECAQE/AWyjZRcgvMP/xAAcEAAABgMAAAAAAAAAAAAAAAAAAQIQETEhQWH/2gAIAQEABj8CUhV2T05dExoYMf/EABsQAQACAwEBAAAAAAAAAAAAAAEAESExQWGx/9oACAEBAAE/IUCpNr8nU7MswJQ9h2rHu4VgWRuOIhuOVssgoT//2gAMAwEAAgADAAAAEBTQPv/EABYRAQEBAAAAAAAAAAAAAAAAAABhAf/aAAgBAwEBPxCKKquv/8QAFhEBAQEAAAAAAAAAAAAAAAAAAGGR/9oACAECAQE/EJtTJkmP/8QAIBABAAICAgEFAAAAAAAAAAAAAREhADFBYVFxgZGh4f/aAAgBAQABPxAIneNz7jWWKmHmojrAOQX0wZqZREeCOTESGFJ2/GFqAuy8UEkWW4kNfODkJ8xtDpwbrQKr6z//2Q==","aspectRatio":1,"src":"/static/eaed1349ae375d7d26cff434c9b9f2c2/eaa58/foldersCover.jpg","srcSet":"/static/eaed1349ae375d7d26cff434c9b9f2c2/5a3ee/foldersCover.jpg 114w,\n/static/eaed1349ae375d7d26cff434c9b9f2c2/41f8f/foldersCover.jpg 229w,\n/static/eaed1349ae375d7d26cff434c9b9f2c2/eaa58/foldersCover.jpg 457w,\n/static/eaed1349ae375d7d26cff434c9b9f2c2/c309b/foldersCover.jpg 686w,\n/static/eaed1349ae375d7d26cff434c9b9f2c2/e3008/foldersCover.jpg 914w,\n/static/eaed1349ae375d7d26cff434c9b9f2c2/0ff54/foldersCover.jpg 1200w","srcWebp":"/static/eaed1349ae375d7d26cff434c9b9f2c2/15384/foldersCover.webp","srcSetWebp":"/static/eaed1349ae375d7d26cff434c9b9f2c2/31fce/foldersCover.webp 114w,\n/static/eaed1349ae375d7d26cff434c9b9f2c2/e3e25/foldersCover.webp 229w,\n/static/eaed1349ae375d7d26cff434c9b9f2c2/15384/foldersCover.webp 457w,\n/static/eaed1349ae375d7d26cff434c9b9f2c2/0258d/foldersCover.webp 686w,\n/static/eaed1349ae375d7d26cff434c9b9f2c2/64ea2/foldersCover.webp 914w,\n/static/eaed1349ae375d7d26cff434c9b9f2c2/9000d/foldersCover.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%203c0%202%200%203%202%203v1c-3%202-2%204%200%203%202%200%202-1%202-4-1-3%201-3%204%201%201%201%201%201-1%201H5l2%201%202%204c0%202%200%202-1%201-2-3-3-2-2%200%200%203-3%205-5%204l1%202c2%202%202%203%202%206-1%203-2%205-2%203l-1-1c-2%202-1%20188%200%20188%201-1%203%200%204%201l2%203v-4c0-3%201-3%201-2%200%203%202%206%203%205%202%200%203%203%205%208%200%203%200%203-2%202l-3-4c0-2-1-2-1-1-2%205-2%2011-1%2014l2%203v-3c0-4%202-4%203%200l2%206%201%204%202%204c2%200%204%207%202%209l1%201c3%200%205%208%202%209l-2-5c0-2%200-2-1-1h-5l2-1c3-1%202-5-3-9l-2-3v-2l-1-2-2-1-2-2c0-2%201-3%203-1h1c0-2-3-3-6-2H3c-2-1-3%200-2%202v1l-1%2020%201%2020%202-1h2c2%203%204%202%203-1-2-3%200-3%204%200%203%204%205%204%203%200-3-4-2-4%201-2l3%203c0%201%203%202%2010%202%2010%200%2014%200%2013-2l1-1v-1l1-1%203%201v1c0%202%203%201%204%200s2-1%203%203l2-1h19l3-1%202%201%202%201v-3h8l1-1c0-1%201-2%205-1%205%201%207%201%203-1l-2-1%202-1c3-1%201-3-3-3s-6-2-2-4c2-2%202-2%205-1%202%202%202%202%202-1s0-3%201-1c0%203%200%203%201%202s1-1%202%202l3%203c2%200%205%204%204%207-2%203-1%204%203%204%203%200%204-1%202-2l-1-3-2-3-2-3h3c2%202%207%202%207%201l3%201c3%201%203%201%203%205l-1%204h8c10%200%2010%200%208-6l-1-4v-10l-2%202-1%202-1-2v-5c1-1%200-2-1-3-3-1%200-3%203-2l3-1%203-1c3%200%203%202-1%202-2%200-2%200%200%201l2%201-1%201c-1%200-2%201-2%206l1%206%201%202%201%202v-2l2-1h2l1-1%202-2c1-2%200-3-1-1-2%202-3%201-2-1v-3l1-1%201-1v-1h1l1%201v-2c0-3%202-3%203-1%202%202%202%202%203%201%202-2%203-1%204%201l1%202%201%201c1%202%201%202%202%201l2%203c2%205%205%205%204%200%200-2%200-3%201-1l1%203c1%201%200%203-1%202l-1%202%202%202c2%201%202%201%201-1s-1-2%203-1l4%201%202%201c2%201%205%201%207-2l2-2v1c-1%202-1%202%202%202%202%201%202%201-1%201l-3%201-1%201c-1%201%200%201%201%201%203%200%204%202%202%202l-2%201-4-1h-2l-6%201-5%201%2011%201c10%200%2011%200%2011-2s1-2%203-1c1%201%201%201-1%202-1%201%203%201%2017%201l16-1-7-2-4-1c-1%201-7-1-6-2l-1-3c-2-2%201-2%203%201l3%201v-1c-2-1-1-2%203-2l5-2%202%201v1c2%201%206-2%206-4v-3c0-2%200-2%201%201l1%203%201-3%201-3%201%205%203%206v-3c-2-1-1-3%201-3%202-1%203%200%201%202v1l2-1%203-2c4%200%204%200%202%203s-1%204%201%204l2-1%201-3%204-6%203-7%202-6c1-5%206-14%207-14v6l-1%201h3l1%202c-2%209-2%2010%201%204l4-6a58%2058%200%2001-10%2021l-1%203c0%203%200%203-1%201h-2l1%202c1%200%201%205-1%208%200%201%200%202%202%201%201%200%202-1%201-2-1-2%202-4%206-4%203%200%203%200%202-1v-1l3-1v2c-1%202-1%202%201%202h3c0%201%207-5%207-7l1-1v2l1%203c1%201%204-5%204-7l1-2c2-1%202-1%202%201v2c2%200%201%205-1%208-2%202%203%201%205-1l2-2-1%202c-1%205%205%204%2011-1%205-6%205-6%205-3l3-2%203-4v2c-1%201%200%201%203%201v3l-2-1h-1c-1%203-1%203%201%202v1c0%201-1%202-2%201l-1%201-1%201v-2c0-2%200-2-1-1l-1%201-2%203v3l1-1%202-2c2%200%202%200%201%203s0%203%203%200c2-2%204-1%202%202v1l3-3c1-3%202-3%202%200l-1%203h13l12-1-3-1-4-2c-1-1-1-1%203-1%203%201%204%200%204-1l1-1%201-3c0-3%201-4%203-4s2%200%201%201l-3%208v1l-1%202c0%202%200%202%201%201%201-2%201-2%202-1%200%202%203%203%205%201l1-1%201%201c-1%201%200%201%202%201l4-1%202-2%201%202%203%201c2%200%202%200%201-1-2-1-1-1%206-1%204%200%205%200%203-1l-2-2c1-1%200-1-2-1-3%200-3%200-2-3%202-3%202-3%205-3l3-1a300%20300%200%20002-4l1%207c0%2015%201%208%201-12l-1-20v3l-1%201c-2%200-2%200-1%202%202%202%202%203%200%204%200%200-2%201-2%203l-2%201%202-5v-3c-2%201-1-1%202-5s3-4%201-4c-2%201-3%200-1-5%202-3%202-3%202-1v-8l-1-11v-1c2%200%202-4%202-107V0H259a1505%201505%200%2000-145%202c1-2-1-2-15-2L83%201h1c3%200%204%202%201%203l-2%202h-2l3%203%201-1c0-2%201-2%204%200l5%201c3%200%206%206%204%207v2l-1%201c-4-1-4%203%200%204%202%201%202%201%201%202s-1%201%202%202l4%201%208%205c6%203%209%206%206%207h-3l-2-2c-3-1-3-1-2%201l-3%201-4%202-3%201-1%201%202%201%208%202%203%203%203%202c2-1%206%202%206%205%201%201%201%202%202%201%203-2%2011%201%2013%206l3%204v2c-1%200-4-3-4-6l-3-2-2-1c-1-2-3-1-3%201s-3%201-4-1-1-2-3%201l-2%204-1%202%202-1h1l-2%202v3l2%203%203%203c3%201%203%201%202%204s-1%203%201%203l1%202h-6c-1%201-1%201%204%204l1%202%202%202%203%201%202%201%202%201c2%202%202%202%200%202-2%201%203%206%207%206s5%203%202%206l-1%202%204%203%203%203h-3c-1%201-3%200-4-2-2-2-2-2-4-1l-2%201-1%201%203%203%206%203%204%202c3%200%205%202%205%204s-1%202-3%201l-2%201%204%202c4%200%206%202%205%203l3%203c2%201%203%201%202%202l2%203%203-1%205%205%202%202v1c-2%202%201%204%203%203%202%200%202%200%203%202%200%201%201%202%204%202l4%202c0%205-31-8-49-19l-9-6-4%204c-6%205-7%204-2-2l3-4-12-12C86%2093%2065%2054%2060%2013%2058-2%2059%200%2049%200c-7%200-9%201-9%202v1l-1%202c-1%203-3%203-4%200l-4-3-3-1C28-1%205%200%203%201H2L1%200%200%203m264%2049c-4%202-7%206-8%2010%200%203-1%204-3%205l-4%204c-2%202-2%202%200%202l6-1c3-2%203-2%205%200%203%204%209%206%2013%204l4-2h-4c-5%200-11-5-8-7%201-1%201-1-2-1-3-1-3-1-2-2l2-3c0-6%209-10%2015-7l4%202v-1l-5-3c-4-2-8-3-13%200M163%2089l-1%201-1%201c0%202-8%209-10%209s-2%200-1%201l2%203%206%202%202%201%201%201%201-2%201-2%203-2%204-2v-1c-2-2-3-6-2-6%202%200%200-4-2-5s-3-1-3%201m121%2031l-1%204c-1%201-1%201%201%201%201%200%202%200%201%201-1%200-1%201%201%202v5h1a117087%20117087%200%20004%207v-6a74%2074%200%2001-2-12l-1-4c0-3-4-1-4%202m113%2013l-6%2010c-6%208-12%2024-11%2032l-1%203c-3%200-4%204-4%207%201%203%200%204-1%206-2%201-3%204-4%206%200%202%200%202%201%201h1c0%203%202%202%203-1l2-5v2l1%201v2l-1%204c0%202%200%201%201-1l3-5v-2c-2%200-2-3-1-7v-3c-1-1-1-4%201-4s4%203%203%206c-2%205-2%208-1%208l3-10%204-11c2-3-1-3-4%200l-2%202v-3l1-5c1-1%201-1%201%201v2l2-3c0-3%200-3%201-1%201%201%201%201%202-1v-3l2-6%203-12c0-4%202-8%203-10l1-4-3%204M30%20153l1%202%201%202c2%200%201%205%200%205-2%200%200%205%202%207%202%201%201%202-3%201-1%200%200%203%202%203l1%202h-1c-2-1-2-1-2%201%200%205%207%204%207%200%201-3%201-5-2-5v-1l1-6c0-5%200-6-2-9l-5-3v1m158%2015c-6%206-1%2017%208%2017%204%200%209-3%209-5h-2c-4%204-10%201-9-5%201-4-4-10-6-7m-142%205c-2%202%205%206%2023%2014%2010%204%2014%206%2015%208l2%203%201-1c-1-1%201-2%203-1l12%205c11%203%2016%204%207%200-22-8-32-12-31-14%200-1%2011%202%2010%204l4%201%204%201%204%202h5l-3-2-7-3%2028%209h-6l6%202c7%202%2015%208%2011%208s3%202%2010%202c14%202-1-7-37-21-10-4-12-5-8-7%205-2%2010-1%2014%203s4%202%201-3c-7-8-21-9-28-3-2%202-2%202-9-1-15-5-30-8-31-6m-22%2011l2%202c3%203%203%204%200%203-2%200-2%200-1%201l1%206c1%205%200%206-3%204-1-1-1-1-1%201v3c-2-2-1%202%202%205l3%204h-1c-2-3-2%200%200%204l2%206%201%201c1%200%202-1%201-4%200-4%200-4%202-4s2%201%202%204l1%203c1%201%201%201%201-1%200-4%202-2%203%202v15c-1%201%200%202%201%203%203%201%203%201%203-2%200-5%201-8%202-6%201%201%201%200%201-2%200-3%200-3%201-2l2%202%203%201c2%203%203%201%203-2l1-3v-2l-1-2c0-2%200-2-1-1-1%203-5-1-6-6l-1-4v4c1%205-1%209-2%206-1-1-1%200-1%201l-1%203-3-14c0-5-1-8-2-9v-10c0-9%200-9-4-10l-2%201h-3c-1-2-5-3-5-1m228%204l-2%201-2%201c0%201-1%202-2%201l-3%202-3%202-4%202c-7%205-10%206-14%205-5%200-5%202-1%203h3l-2%203-2%203-2%203-1%204h2l2-1c3-1%204-4%202-5-1-1-1-1%201-1l3%202c0%202%201%201%205-2l3-2-3-2-1-1c2%200%202%200%200-1v-2l3%202v1l1%201%203%201v-1l-1-1a61%2061%200%200116-16c4-3%204-3%202-3l-3%201m117%2017l-2%206-2%206-2%2010%201%204c1-2%201-2%202-1l-1%203v13l1-2c0-1%201-1%202%201%201%203%201%207-1%207v-2l-1-2c-3%201-4%2011-1%2011l1-2c0-3%203-4%203-2l1%203%201-3%203-8-2%203c-1%203-2%202-2-3l1-5c1%200%203-4%203-8l1-3%201-3v-12l1-10-3%203c-4%203-4%205-1%209%202%203%202%204%201%207-1%204-3%206-4%203v-5c1-3%201-5-1-6-2-3-1-9%202-12l1-2-3%202M61%20223l2%205c2%202%202%203%202%206l1%203v-5l1%202%202%204c-1%201%200%203%201%204s1%201%201-2c0-4%200-4%201-1l1%201%205-3%201%202v-6l-2-2c-2%200-7-3-7-5l-1%201c-1%202-1%202-3-2-4-5-5-5-5-2m240%206l-3%202h-8l-7%201%204%201c4%200%205%201%2012%209l6%203h4l-4-2c-3-2-4-4-2-4l-4-2c-7-3-6-3%202-2%209%201%2010%201%205-1-4-3-4-3-2-3h4l2-1c-1-1-5-2-9-1m-194%2013v4l-1%201c-2%201-2%201-1%202l2%205c0%204%203%209%205%208h1l-2%202-2%201-2%201h-2l2%202c1%202%202%202%203%201h2l3-1%204-2%202-1v-2l-1-1-2-2c-2%200-4-5-4-9%200-2-1-4-3-5l-3-5c-1-2-1-2-1%201m18%205c0%204%200%205-1%204h-1l1%202v3c1%200%201%201-1%203v3c2-1%205-2%207-1s1%204%200%203c-3%200-2%201%200%204%202%202%202%203%201%204l-1%203%202-1c1-2%202-11%201-12v-3c0-2%200-3-1-2-1%202-5-5-6-11l-1-5v6m-89-4c-1%204-1%205%201%207v-2c0-3%201-5%203-3%201%202%204%2011%204%2015%201%202%202%203%204%203v-7l-1-6c0-3%200-4-2-5l-9-2M15%20361l-4%201%201%201-1%201h-1l-1%201-1-1c0-3-1-2-3%201-1%202-1%202%203%202h4c1%201%202%202%205%201l7%201h9c5-1%207%200%207%203h3v-2c0-2%200-2%203-2h4l3-1%205-2c1-1%204-1%205%201l1%201%201-1%201-2%202-1-1%202c-1%201-1%202%201%203%202%202%203%201%202-1%200-2%200-2%201-1l3%201%202%201%202%201v-2c-1-1-1-1%201-1%203%202%202%200-2-2s-4-2%202-1l5%201%206-1v-1h-2l-1-1H74l-2%201-2%201c0%202%200%202-1%200l-1-2-22-1a162%20162%200%2000-24%201l-2-1-5%201m130%200v2l-2%202-3%203c0%204-1%204-3-1l-2-3v4c1%203%201%204-1%203l-2%202c0%202%200%202-1%200h-2c-1%201%200%202%201%202v2l-3%201h-7c-5-5-35%202-33%207%201%201%200%201-3%201-2%200-3%200-2%201%202%200%202%201%202%204%200%204%200%204%201%202%201-3%203-3%204-1l-1%202h-1l2%201%201%202h-2c-2-1-7%201-7%203h15c13%200%2015%200%2014-1l-1-4v-2l-1-3c0-2%202-3%202%200l5%203c5%201%207%203%203%203l-2%201%202%201c3%200%204%200%202%201h22c0%202%205%201%209-1l5-3c2%200%206-2%205-3-2-1-1-2%204-3%203%200%204-1%204-2l3-1%203%201%202%201c2%201%203-1%201-2h2l3-1c-1-1%204-5%206-5%203%200%206-3%204-3-2-1-8%201-8%202l-3%201-4-1h-2v-1c2-1%203-2%204-1l3-1-2-2c-2%200-2-2%201-2l2-1-3-1-2%201c0%202-2%201-5-2s-6-4-4-1v4l-1%201c0-2-3-6-5-6l-1-1%202-1c2%200%203%200%202-2s-3-3-2%200l-2-1c-2-2-3-2-10-2l-8%201m198%200c-2%200-2%200-1%202%201%203%200%206-2%205l-2%201h-7c0%204%2012%203%2018-1h3c1%202%200%206-3%206v3c1%201%200%201-1%201-4%201-3%204%200%203%203%200%203%200%202%203-1%202-1%202%203%200%202%200%204-2%203-2-1-2%201-5%203-6%201%200%202-1%202-3l1-2%201%206%201%202v1c-2%200-2%200-1%202h3l4-3%207-1c3-2%204-2%206%200s3%207%201%207l-1-1-1-2-1%202%202%202%201%201h-5c-1-1-1-1-1%201l2%203%202%204c0%202%202%203%205%203l-1-1c-1-2-1-2%201-2l2%202%203%201c2%200%202%200%201-1-2-1-2-1%200-1l4%201c4%203%204%203%204-8l-1-20v-9h-18l-18%201h-21M1%20387v13h8l7-1%201-2%201%201c0%202%201%202%206%202s5%200%204-1l-2-3c0-3-1-5-2-4-1%200-2-1-2-4l-2-7%201-2%202%201v5c1%204%204%205%203%201%200-3%200-3%204-3%203%201%205%200%202-1l-2-3c-1-2%202-1%204%201h2c0-2-1-3-4-3l-5-2-2-1v3c-2%200-5%200-9%202-2%201-3%202-2%205v4l-1-3-3-6c-2-6-3-5-3%201%200%205%200%205-2%203-1-1-2-2%200-3%201-2%200-3-2-2H2v-3c-1-1-1%204-1%2012m49-9l1%203v5c1%201-1%203-6%206-1%201-1%201%204%201l5%201%201%202%201-1%201-2c2%200%202%200%201%202s1%203%203%202c3-2%205-1%205%201%200%203%2014%203%2015%200%200-3-3-6-5-6l1%202c3%202%203%205%200%203s-6-2-6%200l-2%201c-3%200-2-2%202-3l2-1-3-3c-2-2-4-4-5-3l-2-2v-2l2-2h-6l-3-2-2-2c-1-2-3-3-4%200m249%200l-1%201c-1-1-2%202%200%203l1%202v11c-1%203%200%205%201%205l1-2%201-2h2v2c0%202%201%202%2011%202l10-1c0-2-1-4-3-4l-4-5-3-4c0%202-2%201-4-3s-2-4-2%201c0%203%200%202-2%200-5-7-10-10-8-6m-47%2016c-7%201-13%203-13%205a99%2099%200%200030%200v-1l-5-3-4-1h-8'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"seo":{"src":"/static/eaed1349ae375d7d26cff434c9b9f2c2/0ff54/foldersCover.jpg"}}},{"id":"ea25109b-23d1-53da-86ff-d9c58a1ea842","slug":"/folders-files-and-everything-in-between","secret":false,"title":"Folders, Files and everything in between","author":"Luke Celitan","date":"June 6th, 2024","dateForSEO":"2024-06-06T00:00:00.000Z","timeToRead":5,"excerpt":"Folders, Files, and the Mayhem That Comes With It","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\": \"Folders, Files and everything in between\",\n  \"excerpt\": \"Folders, Files, and the Mayhem That Comes With It\",\n  \"date\": \"2024-06-06T00:00:00.000Z\",\n  \"hero\": \"foldersCover.jpg\",\n  \"author\": \"Luke Celitan\",\n  \"appDescription\": \"Architecture\",\n  \"category\": \"Post\",\n  \"tech\": [\"TS\", \"Nodejs\", \"Nextjs\", \"ReactIcon\"]\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\": \"folders-files-and-the-mayhem-that-comes-with-it\"\n  }, \"Folders, Files, and the Mayhem That Comes With It\"), mdx(\"p\", null, \"Let\\u2019s dive into the fascinating world of project structure and its impact on\\nDeveloper Experience (DX). We\\u2019ll explore how folder organization affects a\\nproject\\u2019s long-term maintainability and scalability.\"), mdx(\"p\", null, \"Buckle up\\u2014this journey might change how you think about your code\\u2019s\\narchitecture! A Developer\\u2019s Perspective As software developers, we\\u2019re constantly\\nwrestling with intricate systems, complex algorithms, and elaborate code.\"), mdx(\"p\", null, \"The complexity of our codebases doesn\\u2019t just impact our productivity\\u2014it\\u2019s a key\\nfactor in the reliability and maintainability of our software. Folders and files\\nare the building blocks of any project, but how do we measure their impact on\\ncomplexity? Is a project with more folders and files inherently more complex? Or\\ncould proper refactoring, testing, and documentation actually make a larger\\nproject less complex?\"), mdx(\"p\", null, \"These are the questions we\\u2019ll be pondering as we search for that elusive \\u201Cmagic\\nratio\\u201D of folders, files, and code that could give us insights into a project\\u2019s\\noverall complexity.\"), mdx(\"h3\", {\n    \"id\": \"the-folder-labyrinth-a-case-study-of-nextjs\"\n  }, \"The Folder Labyrinth: A Case Study of Next.js\"), mdx(\"p\", null, \"Before we embark on our quest for the perfect project structure, let\\u2019s take a\\npeek at one of the most complex open-source projects out there: Next.js. Brace\\nyourself for some mind-bending numbers:\"), mdx(\"table\", null, mdx(\"thead\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"thead\"\n  }, mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"codelines\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"All Characters\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Folders\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Files\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Deepest Level\"))), mdx(\"tbody\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"1675551\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"84344594\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"7513\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"16360\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"13\")))), mdx(TreeChart, {\n    folder: nextjs,\n    mdxType: \"TreeChart\"\n  }), mdx(\"p\", null, \"Take a moment to let those figures sink in. Can you imagine navigating through\\n7,513 folders spread across 13 levels of depth? It\\u2019s enough to make even the\\nmost seasoned developer\\u2019s head spin! Next.js serves as a prime example of how\\noverwhelming a project structure can become. At first glance, it\\u2019s clear that\\nmaking meaningful contributions to this behemoth requires a highly dedicated\\ndeveloper. This monorepo encompasses various technologies like Rust and\\nTypeScript, and includes example pages, tests, mysterious experimental folders,\\nplugins, errors, and much more. Despite its incredibly complex structure,\\nNext.js remains a widely popular and well-maintained open-source project. Or\\ndoes it? The sheer amount of code-digging and setup required before contributing\\ngot me thinking: How can proper structure and documentation make a project more\\naccessible and less intimidating? Next.js will serve as our benchmark for\\ncomplexity. But before we dive into our own complexity metric, let\\u2019s explore\\nsome existing methods for calculating project complexity.\"), mdx(\"h3\", {\n    \"id\": \"cyclomatic-complexity-and-the-halstead-volume-metric\"\n  }, \"Cyclomatic Complexity and the Halstead Volume Metric\"), mdx(\"p\", null, \"When searching for code complexity formulas, two metrics often pop up:\\nCyclomatic Complexity and the Halstead Volume Metric. Let\\u2019s break these down\\nbefore we continue our journey.\"), mdx(\"h3\", {\n    \"id\": \"cyclomatic-complexity-unraveling-code-paths\"\n  }, \"Cyclomatic Complexity: Unraveling Code Paths\"), mdx(\"p\", null, \"Introduced by Thomas McCabe in 1976, Cyclomatic Complexity quantifies the number\\nof linearly independent paths through a program\\u2019s source code. Imagine your code\\nas a labyrinth, with each decision point (like an if statement or a loop)\\ncreating a branching path. The more branches, the more complex the code. The\\nformula for Cyclomatic Complexity is:\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-math\"\n  }, \"M = E - N + 2P\\n\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"(M) represents the cyclomatic complexity.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"(E) is the number of edges (control flow paths) in the control graph.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"(N) is the number of nodes (decision points) in the graph.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"(P) is the number of connected components (usually 1 for a single program).\")), mdx(\"h3\", {\n    \"id\": \"thresholds-and-interpretation\"\n  }, \"Thresholds and Interpretation:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"A higher cyclomatic complexity indicates greater code complexity.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Common thresholds:\", mdx(\"ul\", {\n    parentName: \"li\"\n  }, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"1-10: Simple code.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"11-20: Moderately complex code.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"21+: Complex code that needs attention.\")))), mdx(\"p\", null, \"Higher complexity can lead to bugs, maintenance challenges, and reduced code\\nquality. But remember, this metric focuses solely on control flow, not on other\\naspects of code complexity.\"), mdx(\"h3\", {\n    \"id\": \"the-halstead-volume-metric-measuring-code-vocabulary\"\n  }, \"The Halstead Volume Metric: Measuring Code Vocabulary\"), mdx(\"p\", null, \"Proposed by Maurice Howard Halstead in 1977, the Halstead Volume Metric takes a\\ndifferent approach. It analyzes code structure and vocabulary, considering both\\noperators and operands. The formula for the Halstead Volume Metric is:\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-math\"\n  }, \"V = N * log2(n)\\n\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"(V) represents the volume.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"(N) is the program length (sum of operators and operands).\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"(n) is the total number of unique operators and operands.\")), mdx(\"p\", null, \"Unlike Cyclomatic Complexity, which focuses on control flow, the Halstead metric\\nconsiders the richness of the code\\u2019s vocabulary. It reflects how challenging it\\nis to understand the code due to its unique constructs.\"), mdx(\"h3\", {\n    \"id\": \"a-new-metric-\"\n  }, \"A new metric ?\"), mdx(\"p\", null, \"While commercial tools like SonarQube, Codacy, and Jellyfish provide code\\nquality and complexity metrics, I was looking for a simple metric that could be\\napplied to any software project, regardless of language or framework. Unable to\\nfind existing packages that provided a single meaningful metric for project\\ncomplexity, I decided to create my own.\"), mdx(\"h3\", {\n    \"id\": \"celitans-complexity-measurement-ccm\"\n  }, \"Celitan\\u2019s Complexity Measurement (CCM):\"), mdx(\"p\", null, \"After much consideration, I\\u2019ve developed a new metric called Celitan\\u2019s\\nComplexity Measurement (CCM). Here\\u2019s the formula:\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-math\"\n  }, \"CCM = [(0.2 * F/D) + (0.2 * L/400) + (0.2 * C/4000) + (0.1 * T)] * [1 + log(F + D + 1)]\\n\")), mdx(\"p\", null, \"Where:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"F = Number of files\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"D = Number of directories\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"L = Total lines of code\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"C = Total characters\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"T = Tree depth (deepest level of the project structure)\")), mdx(\"p\", null, \"Let\\u2019s break down each component:\"), mdx(\"ol\", null, mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"File to Directory Ratio (0.2 \", \"*\", \" F/D): Measures the distribution of files\\nacross directories. A higher ratio indicates more files per directory,\\npotentially increasing complexity.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Normalized Lines (0.2 \", \"*\", \" L/400): Normalizes the total lines of code against\\nan arbitrary maximum of 400 lines per file, contributing to complexity based\\non overall code volume.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Normalized Characters (0.2 \", \"*\", \" C/4000): Similar to normalized lines, this\\nfactor considers the total character count, normalized against an arbitrary\\nmaximum of 4000 characters per file.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Tree Depth (0.1 \", \"*\", \" T): Accounts for the depth of the project structure.\\nDeeper structures are considered more complex, but with less weight than\\nother factors.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Scale Factor \", \"[1 + log(F + D + 1)]\", \": This logarithmic scale factor increases\\nthe complexity measurement as the total number of files and directories\\ngrows, but at a decreasing rate.\")), mdx(\"p\", null, \"The formula combines these elements to produce a single complexity score. The\\nbase complexity is calculated as a weighted sum of the first four factors, then\\nmultiplied by the scale factor to account for overall project size. To give you\\nan idea of how this metric scales, here\\u2019s a table showing complexity scores for\\nprojects of varying sizes:\"), mdx(\"table\", null, mdx(\"thead\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"thead\"\n  }, mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Project\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Files\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Directories\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Total Lines\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Total Chars\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Tree Depth\"), mdx(\"th\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"Complexity\"))), mdx(\"tbody\", {\n    parentName: \"table\"\n  }, mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"A\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"2\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"1\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"69\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"644\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"1\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"1\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"B\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"5\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"2\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"100\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"1000\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"2\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"3\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"C\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"10\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"3\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"500\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"5000\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"3\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"7\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"D\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"20\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"5\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"1000\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"10000\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"4\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"12\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"E\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"50\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"10\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"5000\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"50000\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"5\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"45\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"F\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"100\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"15\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"10000\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"100000\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"6\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"93\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"G\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"200\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"20\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"20000\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"200000\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"7\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"199\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"H\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"500\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"30\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"50000\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"500000\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"8\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"544\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"I\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"1000\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"50\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"100000\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"1000000\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"9\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"1157\")), mdx(\"tr\", {\n    parentName: \"tbody\"\n  }, mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"J\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"2000\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"100\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"200000\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"2000000\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"10\"), mdx(\"td\", {\n    parentName: \"tr\",\n    \"align\": null\n  }, \"2467\")))), mdx(\"p\", null, \"The metric is calibrated so that a basic \\u201CHello World\\u201D project in Express.js has\\na complexity of 1, serving as our baseline. For reference, that project has one\\nfolder, 2 files (index.js and package.json), 39 lines of code, 644 characters,\\nand a tree depth of 1.\"), mdx(\"h3\", {\n    \"id\": \"visualizing-the-complexity-curve\"\n  }, \"Visualizing the Complexity Curve\"), mdx(\"p\", null, \"If we plot these values, we can see how the complexity score grows with the size\\nof the project. The growth isn\\u2019t linear\\u2014it increases more rapidly as projects\\nbecome larger and more intricate. This reflects the real-world experience that\\nmanaging very large projects becomes exponentially more challenging.\"), mdx(LineChartComplexity, {\n    data: complexityGraphData,\n    mdxType: \"LineChartComplexity\"\n  }), mdx(\"h3\", {\n    \"id\": \"complexity-in-practice\"\n  }, \"Complexity in Practice\"), mdx(\"p\", null, \"To truly measure the effectiveness of our Celitan\\u2019s Complexity Measurement\\n(CCM), we need to put it to the test in real-world scenarios. Applying the\\nformula to various starter projects across different frameworks and languages\\nwill give us a more concrete understanding of its performance. This practical\\napproach will allow us to see if the CCM accurately reflects the perceived\\ncomplexity of these projects from a developer\\u2019s perspective.\"), mdx(\"h4\", {\n    \"id\": \"the-popular-starter-projects-from-the-biggest-frontend-frameworks\"\n  }, \"The popular starter projects from the biggest frontend frameworks\"), mdx(\"div\", {\n    style: {\n      \"height\": \"25px\"\n    }\n  }), mdx(ComplexityChart, {\n    data: complexityScoresStarters.projects,\n    labelKey: true,\n    mdxType: \"ComplexityChart\"\n  }), mdx(\"p\", null, \"You can check the folder structre of those projects below, select from the\\ndropdown to see the folder structure of the project.\"), mdx(TreeChartChanger, {\n    folders: [angularStarter, reactStarter, svelteStarter, nestStarter, vueStarter],\n    mdxType: \"TreeChartChanger\"\n  }), mdx(\"h4\", {\n    \"id\": \"complexity-scores-on-the-projects-from-the-biggest-frontend-frameworks\"\n  }, \"Complexity scores on the projects from the biggest frontend frameworks\"), mdx(\"div\", {\n    style: {\n      \"height\": \"25px\"\n    }\n  }), mdx(ComplexityChart, {\n    data: complexityScores.projects,\n    labelKey: true,\n    mdxType: \"ComplexityChart\"\n  }), mdx(TreeChartChanger, {\n    folders: [angular, react, svelte, nest, vue, nextjs],\n    mdxType: \"TreeChartChanger\"\n  }), mdx(\"blockquote\", null, mdx(\"p\", {\n    parentName: \"blockquote\"\n  }, \"Next.js project ended up with +2 mil complexlity score, is it justified ?\")), mdx(\"blockquote\", null, mdx(\"p\", {\n    parentName: \"blockquote\"\n  }, \"Do the results align with your intuition and experience?\")), mdx(\"h3\", {\n    \"id\": \"feedback-and-refinement\"\n  }, \"Feedback and Refinement\"), mdx(\"p\", null, \"By comparing the formula\\u2019s output with the collective wisdom of developers, we\\ncan fine-tune the metric, adjust its parameters if necessary, and ultimately\\ncreate a more robust and reliable measure of project complexity. This iterative\\nprocess of testing, gathering feedback, and refining will be key to developing a\\ntruly useful complexity measurement tool for the development community.\"), mdx(\"p\", null, \"Any thoughts on the results ? Let me know at \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"mailto:luke@spaceout.pl\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"luke@spaceout.pl\")), mdx(\"h3\", {\n    \"id\": \"implementation\"\n  }, \"Implementation\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-typescript\"\n  }, \"interface ProjectStructure {\\n  files: number;\\n  directories: number;\\n  totalLines: number;\\n  totalChars: number;\\n  treeDepth: number;\\n}\\n\\nfunction calculateComplexity(project: ProjectStructure): number {\\n  const { files, directories, totalLines, totalChars, treeDepth } = project;\\n\\n  const fileToDirectoryRatio = files / directories;\\n  const normalizedLines = totalLines / 400; // 400 lines = max lines per file (arbitary, can be adjustable)\\n  const normalizedChars = totalChars / 4000; // 4000 chars = max chars per file (arbitary, can be adjustable)\\n\\n  const baseComplexity =\\n    fileToDirectoryRatio * 0.2 +\\n    normalizedLines * 0.2 +\\n    normalizedChars * 0.2 +\\n    deepestLevel * 0.1;\\n\\n  const scaleFactor = 1 + Math.log(files + directories + 1);\\n  return baseComplexity * scaleFactor;\\n}\\n\")), mdx(\"p\", null, \"Whole project is published on npm as project-analyzer, published to npm\\n\", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://www.npmjs.com/package/project-analyzer\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"https://www.npmjs.com/package/project-analyzer\"), \",\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-bash\"\n  }, \"npm i -g project-analyzer\\n\")), mdx(\"p\", null, \"you can also find the source for the project on\\n\", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://github.com/MassivDash/ProjectAnalyzer\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"https://github.com/MassivDash/ProjectAnalyzer\")), mdx(\"h3\", {\n    \"id\": \"practical-applications\"\n  }, \"Practical Applications\"), mdx(\"p\", null, \"This formula is highly customizable. You can adjust the normalization factors\\nand weights to better suit your specific project types or development practices.\\nFor instance, if your projects tend to have deeper folder structures, you might\\nincrease the weight of the tree depth factor. Some potential applications of\\nthis complexity metric include:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Estimating development time and resources for new projects\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Identifying overly complex parts of a system that might need refactoring\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Comparing different solutions or architectures for the same problem\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Tracking project complexity over time to ensure it doesn\\u2019t grow uncontrollably\")), mdx(\"h3\", {\n    \"id\": \"conclusion\"\n  }, \"Conclusion\"), mdx(\"p\", null, \"Quantifying project complexity isn\\u2019t an exact science, but having a consistent,\\ncustomizable method can provide valuable insights. This formula offers a\\nstarting point for teams to measure and discuss project complexity in a more\\nobjective manner.\"), mdx(\"p\", null, \"Remember, the goal isn\\u2019t to achieve the lowest complexity score possible, but to\\nunderstand your projects better and make informed decisions about architecture,\\nrefactoring, and resource allocation.\"));\n}\n;\nMDXContent.isMDXComponent = true;","tech":["TS","Nodejs","Nextjs","ReactIcon"],"category":"Post","appDescription":"Architecture","hero":{"full":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAMFAgT/xAAVAQEBAAAAAAAAAAAAAAAAAAAAAf/aAAwDAQACEAMQAAAB8c9HPKICPZZpCX//xAAaEAEBAQEAAwAAAAAAAAAAAAABAgADEhQh/9oACAEBAAEFAoHovzR3qQrn6ziTeToVsiU//8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAwEBPwEf/8QAFhEBAQEAAAAAAAAAAAAAAAAAABEB/9oACAECAQE/AYirr//EABwQAAICAwEBAAAAAAAAAAAAAAABAhEQITESQf/aAAgBAQAGPwK9+S/uIxUqeNs6JWcP/8QAGxAAAgMBAQEAAAAAAAAAAAAAAREAITFBEKH/2gAIAQEAAT8hPQcNfJchxsXWDbsREi7b2IQQr5FMPMdBImPB+p//2gAMAwEAAgADAAAAEPjnQv/EABYRAAMAAAAAAAAAAAAAAAAAAAABEf/aAAgBAwEBPxCoqIiI/8QAFxEAAwEAAAAAAAAAAAAAAAAAABFRYf/aAAgBAgEBPxBoNBqaH//EABsQAQEBAQEBAQEAAAAAAAAAAAERACExcUFR/9oACAEBAAE/ELAk8BFOF+6Tc+QIHzJElVUdPwBID12zOsxxDxN+i/5NPxb0lB3Hqny1v//Z","aspectRatio":1,"src":"/static/ca172036b2d78c49ceae0cdeb5723e5b/58fe7/foldersCover.jpg","srcSet":"/static/ca172036b2d78c49ceae0cdeb5723e5b/e0f30/foldersCover.jpg 236w,\n/static/ca172036b2d78c49ceae0cdeb5723e5b/86afd/foldersCover.jpg 472w,\n/static/ca172036b2d78c49ceae0cdeb5723e5b/58fe7/foldersCover.jpg 944w,\n/static/ca172036b2d78c49ceae0cdeb5723e5b/0ff54/foldersCover.jpg 1200w","srcWebp":"/static/ca172036b2d78c49ceae0cdeb5723e5b/99fbb/foldersCover.webp","srcSetWebp":"/static/ca172036b2d78c49ceae0cdeb5723e5b/77392/foldersCover.webp 236w,\n/static/ca172036b2d78c49ceae0cdeb5723e5b/1f177/foldersCover.webp 472w,\n/static/ca172036b2d78c49ceae0cdeb5723e5b/99fbb/foldersCover.webp 944w,\n/static/ca172036b2d78c49ceae0cdeb5723e5b/9000d/foldersCover.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='M12%202c7%203%207%203%200%203H8l8%202c2%200%202%201%202%202v2l3%201%201-1v-1c2-1%205%201%205%203l4%201%203-1%201-1%201-1c-1-1%200-2%201-2%201-1%201%201-1%207-1%203-1%203%201%203h1v-2l2-5%203-5-1%204v5h4l1%202%201%202-1%203v-1l-1-2-1-1c-1-2-4%200-4%203%200%202%200%202-4%201-3-1-3-2-1-2h-1l-7-1h-4c-1%202-2-1-1-3%201-3-7-7-9-4-1%201-2%202-1%200l-3-2c-3-1-4-1-3%201l-1%202-2%202c-1%202-1%202-1%200s-3-4-3-2l1%201v1l-1%208c0%205%200%206%201%204v16l1-2%201-5v1c0%201%201%202%203%202l3%202-2%201H5l1%201%202%201c1%200%202-1%202-3%201-1%201-2%202-1l2%201c1%201%201%201-1%201-3%200-3%203%200%203%202%201%202%200%203-1%200-2%200-2%202%200s2%203%200%203v1l-1%201-4%2011%205%201c7%201%209%203%204%203l-4-1-8-1c0%201%209%204%2013%204l3%201-2%201h-3l-1%201-1-1c1%200-6-3-7-2l-5-2c-7-2-7-2-7%206%200%205%200%206%202%207%202%200%203%204%201%204l-1-1c0-3-2-2-2%200s0%203%202%203c1-1%203%200%206%201l4%201-5-1H3c1%201%2018%205%2020%204l3%202c2%202-4%201-13-1-3-1-6-2-7-1H2c-6%200%200%203%208%203l1%201%202%201%201%201h-4c-3-1-3-1-3%201v2l-2-3c0-1-1-2-3-2-2-1-2-1-2%205l1%207v1L0%20253v147h289v-3l2-2v-1h-2c-2%202-1-1%201-6l2-5c-1-1%203-6%204-6l2%202c2%203%201%209-1%208-1-1-1%200-1%201l-1%202h-1v3c0%201%200%202%201%201l3-1c2%200%203%200%203-2%200-4%204-5%204-1%200%202%200%202%201%200l3-2c1%200%201%201-1%205l-1%204v1l-1%201h13c0%202%205%201%205-1h1c0%202%205%203%205%201h1l13%201h12v-3c0-5%200-5-4-12l-4-7-4%201c-5%200-8-4-6-11v-6l-10%201h-3l-1-1h-1l23-2c7%201%207%201%209%203%201%203%203%204%203%202l-1-1-1-3h1l4%201c3-1%204%200%204%205%200%202%200%202%201%201l1-4v-3h19c2%200%203%200%204%202s1%202%201%200c1-1%201-1%201%201l1%205c2%200%202-1%201-3-1-5-1-5%201-5l1%201v1l1-1%201-1v4l1%204%201%202c0%202-1%202-8%202-14%200-14%200-13%202h4c4-1%207%200%2011%206l3%207%201%201c1%200%202%202%202%205l1%205a11128%2011128%200%2000-1-292c0%202-1%203-4%202l-3-1%203-3%204-2%201-6c0-4%200-6-1-5%200%203-2%202-2-1l1-1c3%200%202-11-1-15s-2-5%201-1l2%202v-7l-1-6v4l-1%202v1l-3-1-3-3%202-2%201-2-2%201c-2%202-2%201-5-2l-3-5-1-1c-1%201-1%201%200%200l-2-3c-3-2-2-3%202-2%201%201%202%201%202-1l1-1c1%201%203-2%202-3h-1l-1%201h-1l-1%201h-1l-3%201c-2%201-2%200-2-1v-1h-2c-1-1%207-5%208-4l1-2c1-2%200-1-7%202-8%205-8%204-8-11l-1-10-1-10c0-11%201-12%201-1l1%207%206-7%201-1v3c2%200%203-3%202-4-2-1-2-1%200-5l2-3h-22l1%204-1%203-1-1h-1c-1%202%200%203%202%203s3%202%200%203v3c1%202%200%207-1%206v5c0%205%200%205-2%204-2-2-11-2-20%200h-4v-3l2-4-1-4c-2%200-3%203-2%207v5h-5l-3%201-4-1c0-2%203-3%204-2l1%201v-1l-1-3c0-2-3-4-4-3l1%202c3%201%202%202-1%202s-3%200-2%201%201%201-2%201c-2%200-3%200-3-2s1-2%204-1h3l-2-2c-2-2-2-3-2-5l-1%201h-3c0-2-1-2-3-1l-3%201c-2%200-3%201-4%205l-1%203-1%202c-1%203-1%203-1-2l-1-9c0-1%200-2%202-2%202-1%202-2%202-8l-1-8-8%208v1c-2%201-4-8-3-9l1%201h1c2-1%200-2-4-2-5%200-5%200-1%207a67%2067%200%20014%2010c1%202%201%202%201%200l1-3v-1l-1-1c0-2%204-1%205%202s1%203-2%203-3%203-1%2010%203%2011%201%2010l-2-7c-1-5-2-5-2-3v4l-1%203c-1%203-1%203-1-2%200-16-1-22-3-18h-3l-2-1h2l2-1h1l-2-6-3-5-46-1a553%20553%200%2000-49%201l-49-1C95%200%2089%200%2089%202v1l-1-1c0-2-1-2-5-2-5%200-6%200-7%203%200%202-2%203-2%203-2%200-2%200%200-2%203-3%202-4-8-4l-9%201%203%202h9l1-1%201%202-1%201-2%205-5%204h-1l-5%201c-4-1-4-1-2-4%201-1%202-2%204-1h4l-4-1c-4-2-5-2-7%200%200%202-1%202-2%200l-2-2h4c0-1-4-2-5-1V3c1-4%200-4-2-1l-1%203V2c1-2%200-2-4-2l-5%201h-1L20%200H7l5%202m292%205l1%208%209%201c2%200%203%200%203-2l-1-1c-2%201-1-2%202-5l1-4V3l2-1h1l-5-2-4%201v1l-2-1c0-1-2%200-2%202l2%201c1-1%202%200%202%201%201%202-1%204-3%203V7l1-2-2%201-1-2V1c1-1%200-1-1-1h-3v7m40-1l-2%202c-3%200-3%202%200%208%204%207%204%207%205%206h3c3%202%2010%201%207-1v-3l-1-1c-1%201-3-1-5-5-2-3-2-3%200-3l1-1h-4c-2%200-3%200-3-2h-1M159%2041v3c-1%202-1%202%202%203%204%201%205%201%202%201s-3%200-1%201h8l5-1%206-1c6%201%204%200-6-3-12-4-16-5-16-3M4%2047l-1%202v-1l-1-1c-1%200-2%203-2%209s0%206%203%206l2-1v-2h5c1%202%202%201%203-4l1-7-2%202-1%201v-2l-1-1-1%201H6l-1-1v-1H4m140%203l-1%201h-1l-2%203v2c2%200%201%202-7%209l-10%2010-1%2011v12l13-9%2012-9V67c0-12%200-13%202-14l2-2h-1l-1%201-4%202c-3%202-4%202-2-1l2-3h-1m0%2035a117%20117%200%2001-21%2015l2%204c1%203%201%203%201%201v-3l1-1v15l-2%203-4%202c-2%202-3%202-4%201l-1-1-1%201c1%201%200%202-2%203-3%202-3%202-5%201l-1-1v2c2%201%201%201-8%207l-8%204h-2c-2-1-5%201-3%203l-1-1-1%201c1%201%200%203-2%204l-9%207-5%204v-13c0-14%200-14%202-15s2-1%200-1c-4%200-8%207-8%2014l1%206%201%207v7l-7%207-7%207v-6c1-6%200-6-3-3-3%202-3%204-3%209s0%206-4%2012c-9%2014-16%2031-18%2045%200%205-1%206-3%207-3%202-3%202-1%202h3c0%202-1%202-3%202-3%200-4%200-4%202l3%201%203%201h-2l-3%201h2l1%203c0%202%200%203%201%202%200-3%203-2%203%200%202%205%201%206-3%206l-3%201h4c4%200%205%201%203%202-1%201%203%207%2010%2017l6%207h91l-1-4c0-4%200-5%202-5v-1l-2-1-1-1-4-8c0-2%200-2%202%200l2%204%204%202-2-2-1-5c1-2%201-2%203%202%203%206%204%209%202%207-3-2-2-1%202%206l3%206h16c14%200%2015%200%2015-2l-13-31h-11a806%20806%200%2001-18%204c-3%203-4%203-4-4v-5l-1%205-1%206-1-4-2-5-8-1c-4%200-4%200%202-1%205-1%205-2%203-2l-3-1-2-3c-2-2-1-14%202-14v1c-2%202-1%203%201%202%203-3%207-2%2010%204%202%204%202%208%200%206l-1%201%201%202%201%201-1%201h-1l1%202%201-1%201-1c1%201%202-8%202-13-1-2-1-3%201-4%204-1%206%200%208%203%201%202%201%202%201%200l-3-5c-2-3-3-3-3-2%200%202%200%203-4%203-4%201-4%201-5-2l-2-3v-2h-2v-1l-1-1v-2c-1%200-1-1%201-2l2-1%201-1c0-1%201-1%201%201%202%202%202%201%201-2-1-2-1-2%201-2s3%200%203-2l1-3%201-1-1-1c-1%201-1-1-1-4v-6l-1%208c0%203%200%204-2%205-3%201-3%201-3-1l2-2v-2l-1-1c-1%201-1%200-1-2l1-3%201-2-1-2-1-4c0-5%201-5%202%200%201%202%201%201%201-1%200-5-2-8-3-7l-1%202-2%208c-2%205-2%205%200%205%203%201%202%208%200%2011-2%201-2%201-2-1%200-1%200-2-1-1l-1-5c0-6-3-13-3-8l-3%203c-6%203-6%203-3-13l1-7%207-3c5-3%206-3%205-6l1-3c2-2%203-1%203%201l-2%207-1%201c-2-2-6%201-7%204-2%203-2%203-2%201s0-2-1%201c-1%204%200%206%201%203%201-1%201-1%201%201s1%203%203%201c3-3%209-6%2010-5l1-1%2010-6-2%204c-3%203-2%203%202%201%204-1%209-3%207-1l1%203c2%202%203%203%203%201%200-3%205-8%2010-10l5-4-4%201-6%202c-2-1-5%201-4%203v1l-2-2-2-2v1l-2%201c-4%200-4-1%200-3l8-5-4%201c-5%203-8%204-8%203l7-4%207-3v-20a32260%2032260%200%2001-2-34l-2%201h-1v-1l-1-1h-1l-2%203v1c3-1%203%203%200%205-2%202-2%202-3%200l-1-2-2-1c-2%200-5%204-3%204l1%203v3l1-3c2-3%202-3%203-2%201%200%201%201-1%202l-2%206-1%203-1%201h3l-1%202v2l-1%202-1%201%201%201v8c0%202-1%203-2%202h-1l1%202c2-1%202%201%202%205-1%202-1%203-2%202h-1c0%202-6%206-6%205h-2l-4%201%202-6v-9c-1-3-1-3%202-5l2-3%201-1%201%204c-1%203%200%205%201%206h1l1-2v-1c-2-2-2-3%200-5v-2l-1%201c-1%201-1-1-1-3%200-4%201-6%203-10%202-3%202-4%201-4-3%200-4-3-2-4l2-2-2%201c-1%201-2%200-2-6v-7l1-1%201%201v1l1-1c-1-1%200-2%201-1v-1c-2-1-2-1%202-1%202-1%202%200%202%204l1%204v-7c0-4%200-5%201-4l1-1c-1%200%200-2%202-3l3-1-2%202-2%202%202-1c3%200%203%205%200%208-3%202-2%203%201%201s8-7%207-8l-3%202-2%202v-4l2-7c2-3%200-3-4-1m54%202c-4%202-6%203-4%203s0%202-3%202v-2c-3%200-5%202-2%202v1h-8l3%201v3c1%201%200%202-1%203-4%202-1%201%205-1%202-1%205-2%206-1%202%200%202%200%201-1h1c2%200%202%200%201-1-2-1%202-3%204-1l1-1v-1l4%204%203%206c3%202%205%205%205%206h-2v2l-1%201%203-1c3%200%203-2%202-3s0-1%201-2h3c-3%202-3%202-1%202h2c1-1%201%200%201%202l1%203V99h4c5%201%2012-1%2012-2%200-2-4-6-8-8-1-1-4%200-13%203-10%203-11%203-13%202v-2l5-2c2-1%202-1%200-1l-4%202c-2%200-2-1-2-4v-3l-6%203m-41%205l-3%202v8l1%203c0%202%200%202%203%202l2%201v1l3-1c1-2%202-1%202%201l-2%204c-3%201-4%206-2%206l1-1h3c2%201%203%201%204-1%202-2%203-9%201-9l-1%203-1%202-2-1h1l1-2c0-3-2-4-5-4-3-1-3-2-1-2%203-1%203-13%201-13l-2%201c-2%202-3%201-2-1%200-3%200-3-2%201m50%2015l-2%201h-2l-10%204c-7%202-10%204-9%204%201%201%201%201-1%201h-1c1%201%201%201-1%201-2%201-3%204-1%204l1-1h2c2%200%202%200%201-1l-1-1h2l2%201v-1c-1%200%200-2%202-2v1h4l3-2%201-1c2%202%2013-2%2013-4l-3-1h-2l4-2c3-1%203-1%201-1h-3m15%2020l-1%205a77%2077%200%2000-14%205h2l2%201c3-1%203-1%203%204%200%207%201%208%205%207l4-1v-7c0-4%200-6%202-6l1-4c0-3%200-4-1-3-1%200-2-1-2-3-1-3-1-2-1%202m-29%2084c-2%202-3%203-5%203-3%200-3%200-3%203l3%204v2l-1%202h16l-8%201-10%202h7l6%201-5%201-7%201%2022-1c16-1%2016-1%2016-4h-1c-1%202-23%204-23%202l9-1%2011-2c4-1%205-4%202-4-2%200-2%200-1%201l1%202-2-1h-1l-7%201%203-1c2-1%201-1-2-1-4%200-4%200-3%202v1c-1%200-2%200-1-1l-9-1h-8l2-1c0-3-1-6-3-6l1-1h4v-5c0-3%200-3-3%201m-33%207l-5%202v7c0%207%200%207%202%207h12v-9c0-9%201-9-9-7m78%2014a153%20153%200%2000-18%202c-2%200-1%202%201%203h1c0-1%202%200%203%202%203%203%204%204%206%203h3l-3%201c-2%202-2%202%207%202a354%20354%200%200126-2c1-1%202-2%203-1l-4-7c-4-6-3-6-25-3m33%2046c2%201%200%202-4%201-3%200-2%201%203%204%206%203%206%203%2018%203h13l-6-4-7-4h-5l-2%201c-3-2-12-2-10-1M57%20317c0%202%200%202-3%202-2%200-3%201-4%203-2%205%201%208%206%207h3v-8l-1-7-1%203m170%200l-2%202c-2%200-3%202-4%204l-1%204-1-4c-2-4-2-4-6-4h-4v6l1%205%201-5c0-4%203-6%205-4%203%204%203%209%202%2010-2%202-2%203-1%203%202%200%204-4%206-10%202-5%203-5%204%201l1%204h4l-1-1c-3%200-2-6%200-8v-1l-2-1-1-2-1%201m36%203l-1%207c1%207%201%208%207%207%204-1%203-5-2-6-3%200-4-2-1-2%202%200%203-2%204-5%201-2%200-2-3-2l-4%201m49%2044l-1%203h-2c-5-1-5-1-6%203%200%203%200%203%202%203s2%200%202%204c-1%204%200%205%203%203%202-2%201-1-1%203l-1%204c1%200%203-1%203-3l3-2%201-1c1-1%204%200%203%202l2%201v-2c2%201%202%200%202-1%200-2%201-2%203-2%203%200%204%201%203%205%200%201%201%201%202-1s2-2%202-1h1l2-1c2%200%203%200%202-2l-1-2h-4l-4-1h-11a145%20145%200%20000-6l5-6-2-1-1%201c1%201-3%202-4%201l1-1%203-2c1-1%201-1-2-1-2%200-3%201-5%203m56%2011c0%2011%200%2011%204%2018l4%207-1-3-1-4%203%203c1%204%204%206%202%202l1-1c2%202%200-3-2-5l-2-2-3-8-4-12c-1-6-1-5-1%205'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"regular":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAMFAgT/xAAVAQEBAAAAAAAAAAAAAAAAAAAAAf/aAAwDAQACEAMQAAAB8c9HPKICPZZpCX//xAAaEAEBAQEAAwAAAAAAAAAAAAABAgADEhQh/9oACAEBAAEFAoHovzR3qQrn6ziTeToVsiU//8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAwEBPwEf/8QAFhEBAQEAAAAAAAAAAAAAAAAAABEB/9oACAECAQE/AYirr//EABwQAAICAwEBAAAAAAAAAAAAAAABAhEQITESQf/aAAgBAQAGPwK9+S/uIxUqeNs6JWcP/8QAGxAAAgMBAQEAAAAAAAAAAAAAAREAITFBEKH/2gAIAQEAAT8hPQcNfJchxsXWDbsREi7b2IQQr5FMPMdBImPB+p//2gAMAwEAAgADAAAAEPjnQv/EABYRAAMAAAAAAAAAAAAAAAAAAAABEf/aAAgBAwEBPxCoqIiI/8QAFxEAAwEAAAAAAAAAAAAAAAAAABFRYf/aAAgBAgEBPxBoNBqaH//EABsQAQEBAQEBAQEAAAAAAAAAAAERACExcUFR/9oACAEBAAE/ELAk8BFOF+6Tc+QIHzJElVUdPwBID12zOsxxDxN+i/5NPxb0lB3Hqny1v//Z","aspectRatio":1,"src":"/static/ca172036b2d78c49ceae0cdeb5723e5b/1dc0b/foldersCover.jpg","srcSet":"/static/ca172036b2d78c49ceae0cdeb5723e5b/3a5ce/foldersCover.jpg 163w,\n/static/ca172036b2d78c49ceae0cdeb5723e5b/05730/foldersCover.jpg 327w,\n/static/ca172036b2d78c49ceae0cdeb5723e5b/1dc0b/foldersCover.jpg 653w,\n/static/ca172036b2d78c49ceae0cdeb5723e5b/f72c7/foldersCover.jpg 980w,\n/static/ca172036b2d78c49ceae0cdeb5723e5b/0ff54/foldersCover.jpg 1200w","srcWebp":"/static/ca172036b2d78c49ceae0cdeb5723e5b/0acdf/foldersCover.webp","srcSetWebp":"/static/ca172036b2d78c49ceae0cdeb5723e5b/ac59e/foldersCover.webp 163w,\n/static/ca172036b2d78c49ceae0cdeb5723e5b/7660b/foldersCover.webp 327w,\n/static/ca172036b2d78c49ceae0cdeb5723e5b/0acdf/foldersCover.webp 653w,\n/static/ca172036b2d78c49ceae0cdeb5723e5b/75470/foldersCover.webp 980w,\n/static/ca172036b2d78c49ceae0cdeb5723e5b/9000d/foldersCover.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='M12%202c7%203%207%203%200%203H8l8%202c2%200%202%201%202%202v2l3%201%201-1v-1c2-1%205%201%205%203l4%201%203-1%201-1%201-1c-1-1%200-2%201-2%201-1%201%201-1%207-1%203-1%203%201%203h1v-2l2-5%203-5-1%204v5h4l1%202%201%202-1%203v-1l-1-2-1-1c-1-2-4%200-4%203%200%202%200%202-4%201-3-1-3-2-1-2h-1l-7-1h-4c-1%202-2-1-1-3%201-3-7-7-9-4-1%201-2%202-1%200l-3-2c-3-1-4-1-3%201l-1%202-2%202c-1%202-1%202-1%200s-3-4-3-2l1%201v1l-1%208c0%205%200%206%201%204v16l1-2%201-5v1c0%201%201%202%203%202l3%202-2%201H5l1%201%202%201c1%200%202-1%202-3%201-1%201-2%202-1l2%201c1%201%201%201-1%201-3%200-3%203%200%203%202%201%202%200%203-1%200-2%200-2%202%200s2%203%200%203v1l-1%201-4%2011%205%201c7%201%209%203%204%203l-4-1-8-1c0%201%209%204%2013%204l3%201-2%201h-3l-1%201-1-1c1%200-6-3-7-2l-5-2c-7-2-7-2-7%206%200%205%200%206%202%207%202%200%203%204%201%204l-1-1c0-3-2-2-2%200s0%203%202%203c1-1%203%200%206%201l4%201-5-1H3c1%201%2018%205%2020%204l3%202c2%202-4%201-13-1-3-1-6-2-7-1H2c-6%200%200%203%208%203l1%201%202%201%201%201h-4c-3-1-3-1-3%201v2l-2-3c0-1-1-2-3-2-2-1-2-1-2%205l1%207v1L0%20253v147h289v-3l2-2v-1h-2c-2%202-1-1%201-6l2-5c-1-1%203-6%204-6l2%202c2%203%201%209-1%208-1-1-1%200-1%201l-1%202h-1v3c0%201%200%202%201%201l3-1c2%200%203%200%203-2%200-4%204-5%204-1%200%202%200%202%201%200l3-2c1%200%201%201-1%205l-1%204v1l-1%201h13c0%202%205%201%205-1h1c0%202%205%203%205%201h1l13%201h12v-3c0-5%200-5-4-12l-4-7-4%201c-5%200-8-4-6-11v-6l-10%201h-3l-1-1h-1l23-2c7%201%207%201%209%203%201%203%203%204%203%202l-1-1-1-3h1l4%201c3-1%204%200%204%205%200%202%200%202%201%201l1-4v-3h19c2%200%203%200%204%202s1%202%201%200c1-1%201-1%201%201l1%205c2%200%202-1%201-3-1-5-1-5%201-5l1%201v1l1-1%201-1v4l1%204%201%202c0%202-1%202-8%202-14%200-14%200-13%202h4c4-1%207%200%2011%206l3%207%201%201c1%200%202%202%202%205l1%205a11128%2011128%200%2000-1-292c0%202-1%203-4%202l-3-1%203-3%204-2%201-6c0-4%200-6-1-5%200%203-2%202-2-1l1-1c3%200%202-11-1-15s-2-5%201-1l2%202v-7l-1-6v4l-1%202v1l-3-1-3-3%202-2%201-2-2%201c-2%202-2%201-5-2l-3-5-1-1c-1%201-1%201%200%200l-2-3c-3-2-2-3%202-2%201%201%202%201%202-1l1-1c1%201%203-2%202-3h-1l-1%201h-1l-1%201h-1l-3%201c-2%201-2%200-2-1v-1h-2c-1-1%207-5%208-4l1-2c1-2%200-1-7%202-8%205-8%204-8-11l-1-10-1-10c0-11%201-12%201-1l1%207%206-7%201-1v3c2%200%203-3%202-4-2-1-2-1%200-5l2-3h-22l1%204-1%203-1-1h-1c-1%202%200%203%202%203s3%202%200%203v3c1%202%200%207-1%206v5c0%205%200%205-2%204-2-2-11-2-20%200h-4v-3l2-4-1-4c-2%200-3%203-2%207v5h-5l-3%201-4-1c0-2%203-3%204-2l1%201v-1l-1-3c0-2-3-4-4-3l1%202c3%201%202%202-1%202s-3%200-2%201%201%201-2%201c-2%200-3%200-3-2s1-2%204-1h3l-2-2c-2-2-2-3-2-5l-1%201h-3c0-2-1-2-3-1l-3%201c-2%200-3%201-4%205l-1%203-1%202c-1%203-1%203-1-2l-1-9c0-1%200-2%202-2%202-1%202-2%202-8l-1-8-8%208v1c-2%201-4-8-3-9l1%201h1c2-1%200-2-4-2-5%200-5%200-1%207a67%2067%200%20014%2010c1%202%201%202%201%200l1-3v-1l-1-1c0-2%204-1%205%202s1%203-2%203-3%203-1%2010%203%2011%201%2010l-2-7c-1-5-2-5-2-3v4l-1%203c-1%203-1%203-1-2%200-16-1-22-3-18h-3l-2-1h2l2-1h1l-2-6-3-5-46-1a553%20553%200%2000-49%201l-49-1C95%200%2089%200%2089%202v1l-1-1c0-2-1-2-5-2-5%200-6%200-7%203%200%202-2%203-2%203-2%200-2%200%200-2%203-3%202-4-8-4l-9%201%203%202h9l1-1%201%202-1%201-2%205-5%204h-1l-5%201c-4-1-4-1-2-4%201-1%202-2%204-1h4l-4-1c-4-2-5-2-7%200%200%202-1%202-2%200l-2-2h4c0-1-4-2-5-1V3c1-4%200-4-2-1l-1%203V2c1-2%200-2-4-2l-5%201h-1L20%200H7l5%202m292%205l1%208%209%201c2%200%203%200%203-2l-1-1c-2%201-1-2%202-5l1-4V3l2-1h1l-5-2-4%201v1l-2-1c0-1-2%200-2%202l2%201c1-1%202%200%202%201%201%202-1%204-3%203V7l1-2-2%201-1-2V1c1-1%200-1-1-1h-3v7m40-1l-2%202c-3%200-3%202%200%208%204%207%204%207%205%206h3c3%202%2010%201%207-1v-3l-1-1c-1%201-3-1-5-5-2-3-2-3%200-3l1-1h-4c-2%200-3%200-3-2h-1M159%2041v3c-1%202-1%202%202%203%204%201%205%201%202%201s-3%200-1%201h8l5-1%206-1c6%201%204%200-6-3-12-4-16-5-16-3M4%2047l-1%202v-1l-1-1c-1%200-2%203-2%209s0%206%203%206l2-1v-2h5c1%202%202%201%203-4l1-7-2%202-1%201v-2l-1-1-1%201H6l-1-1v-1H4m140%203l-1%201h-1l-2%203v2c2%200%201%202-7%209l-10%2010-1%2011v12l13-9%2012-9V67c0-12%200-13%202-14l2-2h-1l-1%201-4%202c-3%202-4%202-2-1l2-3h-1m0%2035a117%20117%200%2001-21%2015l2%204c1%203%201%203%201%201v-3l1-1v15l-2%203-4%202c-2%202-3%202-4%201l-1-1-1%201c1%201%200%202-2%203-3%202-3%202-5%201l-1-1v2c2%201%201%201-8%207l-8%204h-2c-2-1-5%201-3%203l-1-1-1%201c1%201%200%203-2%204l-9%207-5%204v-13c0-14%200-14%202-15s2-1%200-1c-4%200-8%207-8%2014l1%206%201%207v7l-7%207-7%207v-6c1-6%200-6-3-3-3%202-3%204-3%209s0%206-4%2012c-9%2014-16%2031-18%2045%200%205-1%206-3%207-3%202-3%202-1%202h3c0%202-1%202-3%202-3%200-4%200-4%202l3%201%203%201h-2l-3%201h2l1%203c0%202%200%203%201%202%200-3%203-2%203%200%202%205%201%206-3%206l-3%201h4c4%200%205%201%203%202-1%201%203%207%2010%2017l6%207h91l-1-4c0-4%200-5%202-5v-1l-2-1-1-1-4-8c0-2%200-2%202%200l2%204%204%202-2-2-1-5c1-2%201-2%203%202%203%206%204%209%202%207-3-2-2-1%202%206l3%206h16c14%200%2015%200%2015-2l-13-31h-11a806%20806%200%2001-18%204c-3%203-4%203-4-4v-5l-1%205-1%206-1-4-2-5-8-1c-4%200-4%200%202-1%205-1%205-2%203-2l-3-1-2-3c-2-2-1-14%202-14v1c-2%202-1%203%201%202%203-3%207-2%2010%204%202%204%202%208%200%206l-1%201%201%202%201%201-1%201h-1l1%202%201-1%201-1c1%201%202-8%202-13-1-2-1-3%201-4%204-1%206%200%208%203%201%202%201%202%201%200l-3-5c-2-3-3-3-3-2%200%202%200%203-4%203-4%201-4%201-5-2l-2-3v-2h-2v-1l-1-1v-2c-1%200-1-1%201-2l2-1%201-1c0-1%201-1%201%201%202%202%202%201%201-2-1-2-1-2%201-2s3%200%203-2l1-3%201-1-1-1c-1%201-1-1-1-4v-6l-1%208c0%203%200%204-2%205-3%201-3%201-3-1l2-2v-2l-1-1c-1%201-1%200-1-2l1-3%201-2-1-2-1-4c0-5%201-5%202%200%201%202%201%201%201-1%200-5-2-8-3-7l-1%202-2%208c-2%205-2%205%200%205%203%201%202%208%200%2011-2%201-2%201-2-1%200-1%200-2-1-1l-1-5c0-6-3-13-3-8l-3%203c-6%203-6%203-3-13l1-7%207-3c5-3%206-3%205-6l1-3c2-2%203-1%203%201l-2%207-1%201c-2-2-6%201-7%204-2%203-2%203-2%201s0-2-1%201c-1%204%200%206%201%203%201-1%201-1%201%201s1%203%203%201c3-3%209-6%2010-5l1-1%2010-6-2%204c-3%203-2%203%202%201%204-1%209-3%207-1l1%203c2%202%203%203%203%201%200-3%205-8%2010-10l5-4-4%201-6%202c-2-1-5%201-4%203v1l-2-2-2-2v1l-2%201c-4%200-4-1%200-3l8-5-4%201c-5%203-8%204-8%203l7-4%207-3v-20a32260%2032260%200%2001-2-34l-2%201h-1v-1l-1-1h-1l-2%203v1c3-1%203%203%200%205-2%202-2%202-3%200l-1-2-2-1c-2%200-5%204-3%204l1%203v3l1-3c2-3%202-3%203-2%201%200%201%201-1%202l-2%206-1%203-1%201h3l-1%202v2l-1%202-1%201%201%201v8c0%202-1%203-2%202h-1l1%202c2-1%202%201%202%205-1%202-1%203-2%202h-1c0%202-6%206-6%205h-2l-4%201%202-6v-9c-1-3-1-3%202-5l2-3%201-1%201%204c-1%203%200%205%201%206h1l1-2v-1c-2-2-2-3%200-5v-2l-1%201c-1%201-1-1-1-3%200-4%201-6%203-10%202-3%202-4%201-4-3%200-4-3-2-4l2-2-2%201c-1%201-2%200-2-6v-7l1-1%201%201v1l1-1c-1-1%200-2%201-1v-1c-2-1-2-1%202-1%202-1%202%200%202%204l1%204v-7c0-4%200-5%201-4l1-1c-1%200%200-2%202-3l3-1-2%202-2%202%202-1c3%200%203%205%200%208-3%202-2%203%201%201s8-7%207-8l-3%202-2%202v-4l2-7c2-3%200-3-4-1m54%202c-4%202-6%203-4%203s0%202-3%202v-2c-3%200-5%202-2%202v1h-8l3%201v3c1%201%200%202-1%203-4%202-1%201%205-1%202-1%205-2%206-1%202%200%202%200%201-1h1c2%200%202%200%201-1-2-1%202-3%204-1l1-1v-1l4%204%203%206c3%202%205%205%205%206h-2v2l-1%201%203-1c3%200%203-2%202-3s0-1%201-2h3c-3%202-3%202-1%202h2c1-1%201%200%201%202l1%203V99h4c5%201%2012-1%2012-2%200-2-4-6-8-8-1-1-4%200-13%203-10%203-11%203-13%202v-2l5-2c2-1%202-1%200-1l-4%202c-2%200-2-1-2-4v-3l-6%203m-41%205l-3%202v8l1%203c0%202%200%202%203%202l2%201v1l3-1c1-2%202-1%202%201l-2%204c-3%201-4%206-2%206l1-1h3c2%201%203%201%204-1%202-2%203-9%201-9l-1%203-1%202-2-1h1l1-2c0-3-2-4-5-4-3-1-3-2-1-2%203-1%203-13%201-13l-2%201c-2%202-3%201-2-1%200-3%200-3-2%201m50%2015l-2%201h-2l-10%204c-7%202-10%204-9%204%201%201%201%201-1%201h-1c1%201%201%201-1%201-2%201-3%204-1%204l1-1h2c2%200%202%200%201-1l-1-1h2l2%201v-1c-1%200%200-2%202-2v1h4l3-2%201-1c2%202%2013-2%2013-4l-3-1h-2l4-2c3-1%203-1%201-1h-3m15%2020l-1%205a77%2077%200%2000-14%205h2l2%201c3-1%203-1%203%204%200%207%201%208%205%207l4-1v-7c0-4%200-6%202-6l1-4c0-3%200-4-1-3-1%200-2-1-2-3-1-3-1-2-1%202m-29%2084c-2%202-3%203-5%203-3%200-3%200-3%203l3%204v2l-1%202h16l-8%201-10%202h7l6%201-5%201-7%201%2022-1c16-1%2016-1%2016-4h-1c-1%202-23%204-23%202l9-1%2011-2c4-1%205-4%202-4-2%200-2%200-1%201l1%202-2-1h-1l-7%201%203-1c2-1%201-1-2-1-4%200-4%200-3%202v1c-1%200-2%200-1-1l-9-1h-8l2-1c0-3-1-6-3-6l1-1h4v-5c0-3%200-3-3%201m-33%207l-5%202v7c0%207%200%207%202%207h12v-9c0-9%201-9-9-7m78%2014a153%20153%200%2000-18%202c-2%200-1%202%201%203h1c0-1%202%200%203%202%203%203%204%204%206%203h3l-3%201c-2%202-2%202%207%202a354%20354%200%200126-2c1-1%202-2%203-1l-4-7c-4-6-3-6-25-3m33%2046c2%201%200%202-4%201-3%200-2%201%203%204%206%203%206%203%2018%203h13l-6-4-7-4h-5l-2%201c-3-2-12-2-10-1M57%20317c0%202%200%202-3%202-2%200-3%201-4%203-2%205%201%208%206%207h3v-8l-1-7-1%203m170%200l-2%202c-2%200-3%202-4%204l-1%204-1-4c-2-4-2-4-6-4h-4v6l1%205%201-5c0-4%203-6%205-4%203%204%203%209%202%2010-2%202-2%203-1%203%202%200%204-4%206-10%202-5%203-5%204%201l1%204h4l-1-1c-3%200-2-6%200-8v-1l-2-1-1-2-1%201m36%203l-1%207c1%207%201%208%207%207%204-1%203-5-2-6-3%200-4-2-1-2%202%200%203-2%204-5%201-2%200-2-3-2l-4%201m49%2044l-1%203h-2c-5-1-5-1-6%203%200%203%200%203%202%203s2%200%202%204c-1%204%200%205%203%203%202-2%201-1-1%203l-1%204c1%200%203-1%203-3l3-2%201-1c1-1%204%200%203%202l2%201v-2c2%201%202%200%202-1%200-2%201-2%203-2%203%200%204%201%203%205%200%201%201%201%202-1s2-2%202-1h1l2-1c2%200%203%200%202-2l-1-2h-4l-4-1h-11a145%20145%200%20000-6l5-6-2-1-1%201c1%201-3%202-4%201l1-1%203-2c1-1%201-1-2-1-2%200-3%201-5%203m56%2011c0%2011%200%2011%204%2018l4%207-1-3-1-4%203%203c1%204%204%206%202%202l1-1c2%202%200-3-2-5l-2-2-3-8-4-12c-1-6-1-5-1%205'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"narrow":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAMFAgT/xAAVAQEBAAAAAAAAAAAAAAAAAAAAAf/aAAwDAQACEAMQAAAB8c9HPKICPZZpCX//xAAaEAEBAQEAAwAAAAAAAAAAAAABAgADEhQh/9oACAEBAAEFAoHovzR3qQrn6ziTeToVsiU//8QAFBEBAAAAAAAAAAAAAAAAAAAAIP/aAAgBAwEBPwEf/8QAFhEBAQEAAAAAAAAAAAAAAAAAABEB/9oACAECAQE/AYirr//EABwQAAICAwEBAAAAAAAAAAAAAAABAhEQITESQf/aAAgBAQAGPwK9+S/uIxUqeNs6JWcP/8QAGxAAAgMBAQEAAAAAAAAAAAAAAREAITFBEKH/2gAIAQEAAT8hPQcNfJchxsXWDbsREi7b2IQQr5FMPMdBImPB+p//2gAMAwEAAgADAAAAEPjnQv/EABYRAAMAAAAAAAAAAAAAAAAAAAABEf/aAAgBAwEBPxCoqIiI/8QAFxEAAwEAAAAAAAAAAAAAAAAAABFRYf/aAAgBAgEBPxBoNBqaH//EABsQAQEBAQEBAQEAAAAAAAAAAAERACExcUFR/9oACAEBAAE/ELAk8BFOF+6Tc+QIHzJElVUdPwBID12zOsxxDxN+i/5NPxb0lB3Hqny1v//Z","aspectRatio":1,"src":"/static/ca172036b2d78c49ceae0cdeb5723e5b/eaa58/foldersCover.jpg","srcSet":"/static/ca172036b2d78c49ceae0cdeb5723e5b/5a3ee/foldersCover.jpg 114w,\n/static/ca172036b2d78c49ceae0cdeb5723e5b/41f8f/foldersCover.jpg 229w,\n/static/ca172036b2d78c49ceae0cdeb5723e5b/eaa58/foldersCover.jpg 457w,\n/static/ca172036b2d78c49ceae0cdeb5723e5b/c309b/foldersCover.jpg 686w,\n/static/ca172036b2d78c49ceae0cdeb5723e5b/e3008/foldersCover.jpg 914w,\n/static/ca172036b2d78c49ceae0cdeb5723e5b/0ff54/foldersCover.jpg 1200w","srcWebp":"/static/ca172036b2d78c49ceae0cdeb5723e5b/15384/foldersCover.webp","srcSetWebp":"/static/ca172036b2d78c49ceae0cdeb5723e5b/31fce/foldersCover.webp 114w,\n/static/ca172036b2d78c49ceae0cdeb5723e5b/e3e25/foldersCover.webp 229w,\n/static/ca172036b2d78c49ceae0cdeb5723e5b/15384/foldersCover.webp 457w,\n/static/ca172036b2d78c49ceae0cdeb5723e5b/0258d/foldersCover.webp 686w,\n/static/ca172036b2d78c49ceae0cdeb5723e5b/64ea2/foldersCover.webp 914w,\n/static/ca172036b2d78c49ceae0cdeb5723e5b/9000d/foldersCover.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='M12%202c7%203%207%203%200%203H8l8%202c2%200%202%201%202%202v2l3%201%201-1v-1c2-1%205%201%205%203l4%201%203-1%201-1%201-1c-1-1%200-2%201-2%201-1%201%201-1%207-1%203-1%203%201%203h1v-2l2-5%203-5-1%204v5h4l1%202%201%202-1%203v-1l-1-2-1-1c-1-2-4%200-4%203%200%202%200%202-4%201-3-1-3-2-1-2h-1l-7-1h-4c-1%202-2-1-1-3%201-3-7-7-9-4-1%201-2%202-1%200l-3-2c-3-1-4-1-3%201l-1%202-2%202c-1%202-1%202-1%200s-3-4-3-2l1%201v1l-1%208c0%205%200%206%201%204v16l1-2%201-5v1c0%201%201%202%203%202l3%202-2%201H5l1%201%202%201c1%200%202-1%202-3%201-1%201-2%202-1l2%201c1%201%201%201-1%201-3%200-3%203%200%203%202%201%202%200%203-1%200-2%200-2%202%200s2%203%200%203v1l-1%201-4%2011%205%201c7%201%209%203%204%203l-4-1-8-1c0%201%209%204%2013%204l3%201-2%201h-3l-1%201-1-1c1%200-6-3-7-2l-5-2c-7-2-7-2-7%206%200%205%200%206%202%207%202%200%203%204%201%204l-1-1c0-3-2-2-2%200s0%203%202%203c1-1%203%200%206%201l4%201-5-1H3c1%201%2018%205%2020%204l3%202c2%202-4%201-13-1-3-1-6-2-7-1H2c-6%200%200%203%208%203l1%201%202%201%201%201h-4c-3-1-3-1-3%201v2l-2-3c0-1-1-2-3-2-2-1-2-1-2%205l1%207v1L0%20253v147h289v-3l2-2v-1h-2c-2%202-1-1%201-6l2-5c-1-1%203-6%204-6l2%202c2%203%201%209-1%208-1-1-1%200-1%201l-1%202h-1v3c0%201%200%202%201%201l3-1c2%200%203%200%203-2%200-4%204-5%204-1%200%202%200%202%201%200l3-2c1%200%201%201-1%205l-1%204v1l-1%201h13c0%202%205%201%205-1h1c0%202%205%203%205%201h1l13%201h12v-3c0-5%200-5-4-12l-4-7-4%201c-5%200-8-4-6-11v-6l-10%201h-3l-1-1h-1l23-2c7%201%207%201%209%203%201%203%203%204%203%202l-1-1-1-3h1l4%201c3-1%204%200%204%205%200%202%200%202%201%201l1-4v-3h19c2%200%203%200%204%202s1%202%201%200c1-1%201-1%201%201l1%205c2%200%202-1%201-3-1-5-1-5%201-5l1%201v1l1-1%201-1v4l1%204%201%202c0%202-1%202-8%202-14%200-14%200-13%202h4c4-1%207%200%2011%206l3%207%201%201c1%200%202%202%202%205l1%205a11128%2011128%200%2000-1-292c0%202-1%203-4%202l-3-1%203-3%204-2%201-6c0-4%200-6-1-5%200%203-2%202-2-1l1-1c3%200%202-11-1-15s-2-5%201-1l2%202v-7l-1-6v4l-1%202v1l-3-1-3-3%202-2%201-2-2%201c-2%202-2%201-5-2l-3-5-1-1c-1%201-1%201%200%200l-2-3c-3-2-2-3%202-2%201%201%202%201%202-1l1-1c1%201%203-2%202-3h-1l-1%201h-1l-1%201h-1l-3%201c-2%201-2%200-2-1v-1h-2c-1-1%207-5%208-4l1-2c1-2%200-1-7%202-8%205-8%204-8-11l-1-10-1-10c0-11%201-12%201-1l1%207%206-7%201-1v3c2%200%203-3%202-4-2-1-2-1%200-5l2-3h-22l1%204-1%203-1-1h-1c-1%202%200%203%202%203s3%202%200%203v3c1%202%200%207-1%206v5c0%205%200%205-2%204-2-2-11-2-20%200h-4v-3l2-4-1-4c-2%200-3%203-2%207v5h-5l-3%201-4-1c0-2%203-3%204-2l1%201v-1l-1-3c0-2-3-4-4-3l1%202c3%201%202%202-1%202s-3%200-2%201%201%201-2%201c-2%200-3%200-3-2s1-2%204-1h3l-2-2c-2-2-2-3-2-5l-1%201h-3c0-2-1-2-3-1l-3%201c-2%200-3%201-4%205l-1%203-1%202c-1%203-1%203-1-2l-1-9c0-1%200-2%202-2%202-1%202-2%202-8l-1-8-8%208v1c-2%201-4-8-3-9l1%201h1c2-1%200-2-4-2-5%200-5%200-1%207a67%2067%200%20014%2010c1%202%201%202%201%200l1-3v-1l-1-1c0-2%204-1%205%202s1%203-2%203-3%203-1%2010%203%2011%201%2010l-2-7c-1-5-2-5-2-3v4l-1%203c-1%203-1%203-1-2%200-16-1-22-3-18h-3l-2-1h2l2-1h1l-2-6-3-5-46-1a553%20553%200%2000-49%201l-49-1C95%200%2089%200%2089%202v1l-1-1c0-2-1-2-5-2-5%200-6%200-7%203%200%202-2%203-2%203-2%200-2%200%200-2%203-3%202-4-8-4l-9%201%203%202h9l1-1%201%202-1%201-2%205-5%204h-1l-5%201c-4-1-4-1-2-4%201-1%202-2%204-1h4l-4-1c-4-2-5-2-7%200%200%202-1%202-2%200l-2-2h4c0-1-4-2-5-1V3c1-4%200-4-2-1l-1%203V2c1-2%200-2-4-2l-5%201h-1L20%200H7l5%202m292%205l1%208%209%201c2%200%203%200%203-2l-1-1c-2%201-1-2%202-5l1-4V3l2-1h1l-5-2-4%201v1l-2-1c0-1-2%200-2%202l2%201c1-1%202%200%202%201%201%202-1%204-3%203V7l1-2-2%201-1-2V1c1-1%200-1-1-1h-3v7m40-1l-2%202c-3%200-3%202%200%208%204%207%204%207%205%206h3c3%202%2010%201%207-1v-3l-1-1c-1%201-3-1-5-5-2-3-2-3%200-3l1-1h-4c-2%200-3%200-3-2h-1M159%2041v3c-1%202-1%202%202%203%204%201%205%201%202%201s-3%200-1%201h8l5-1%206-1c6%201%204%200-6-3-12-4-16-5-16-3M4%2047l-1%202v-1l-1-1c-1%200-2%203-2%209s0%206%203%206l2-1v-2h5c1%202%202%201%203-4l1-7-2%202-1%201v-2l-1-1-1%201H6l-1-1v-1H4m140%203l-1%201h-1l-2%203v2c2%200%201%202-7%209l-10%2010-1%2011v12l13-9%2012-9V67c0-12%200-13%202-14l2-2h-1l-1%201-4%202c-3%202-4%202-2-1l2-3h-1m0%2035a117%20117%200%2001-21%2015l2%204c1%203%201%203%201%201v-3l1-1v15l-2%203-4%202c-2%202-3%202-4%201l-1-1-1%201c1%201%200%202-2%203-3%202-3%202-5%201l-1-1v2c2%201%201%201-8%207l-8%204h-2c-2-1-5%201-3%203l-1-1-1%201c1%201%200%203-2%204l-9%207-5%204v-13c0-14%200-14%202-15s2-1%200-1c-4%200-8%207-8%2014l1%206%201%207v7l-7%207-7%207v-6c1-6%200-6-3-3-3%202-3%204-3%209s0%206-4%2012c-9%2014-16%2031-18%2045%200%205-1%206-3%207-3%202-3%202-1%202h3c0%202-1%202-3%202-3%200-4%200-4%202l3%201%203%201h-2l-3%201h2l1%203c0%202%200%203%201%202%200-3%203-2%203%200%202%205%201%206-3%206l-3%201h4c4%200%205%201%203%202-1%201%203%207%2010%2017l6%207h91l-1-4c0-4%200-5%202-5v-1l-2-1-1-1-4-8c0-2%200-2%202%200l2%204%204%202-2-2-1-5c1-2%201-2%203%202%203%206%204%209%202%207-3-2-2-1%202%206l3%206h16c14%200%2015%200%2015-2l-13-31h-11a806%20806%200%2001-18%204c-3%203-4%203-4-4v-5l-1%205-1%206-1-4-2-5-8-1c-4%200-4%200%202-1%205-1%205-2%203-2l-3-1-2-3c-2-2-1-14%202-14v1c-2%202-1%203%201%202%203-3%207-2%2010%204%202%204%202%208%200%206l-1%201%201%202%201%201-1%201h-1l1%202%201-1%201-1c1%201%202-8%202-13-1-2-1-3%201-4%204-1%206%200%208%203%201%202%201%202%201%200l-3-5c-2-3-3-3-3-2%200%202%200%203-4%203-4%201-4%201-5-2l-2-3v-2h-2v-1l-1-1v-2c-1%200-1-1%201-2l2-1%201-1c0-1%201-1%201%201%202%202%202%201%201-2-1-2-1-2%201-2s3%200%203-2l1-3%201-1-1-1c-1%201-1-1-1-4v-6l-1%208c0%203%200%204-2%205-3%201-3%201-3-1l2-2v-2l-1-1c-1%201-1%200-1-2l1-3%201-2-1-2-1-4c0-5%201-5%202%200%201%202%201%201%201-1%200-5-2-8-3-7l-1%202-2%208c-2%205-2%205%200%205%203%201%202%208%200%2011-2%201-2%201-2-1%200-1%200-2-1-1l-1-5c0-6-3-13-3-8l-3%203c-6%203-6%203-3-13l1-7%207-3c5-3%206-3%205-6l1-3c2-2%203-1%203%201l-2%207-1%201c-2-2-6%201-7%204-2%203-2%203-2%201s0-2-1%201c-1%204%200%206%201%203%201-1%201-1%201%201s1%203%203%201c3-3%209-6%2010-5l1-1%2010-6-2%204c-3%203-2%203%202%201%204-1%209-3%207-1l1%203c2%202%203%203%203%201%200-3%205-8%2010-10l5-4-4%201-6%202c-2-1-5%201-4%203v1l-2-2-2-2v1l-2%201c-4%200-4-1%200-3l8-5-4%201c-5%203-8%204-8%203l7-4%207-3v-20a32260%2032260%200%2001-2-34l-2%201h-1v-1l-1-1h-1l-2%203v1c3-1%203%203%200%205-2%202-2%202-3%200l-1-2-2-1c-2%200-5%204-3%204l1%203v3l1-3c2-3%202-3%203-2%201%200%201%201-1%202l-2%206-1%203-1%201h3l-1%202v2l-1%202-1%201%201%201v8c0%202-1%203-2%202h-1l1%202c2-1%202%201%202%205-1%202-1%203-2%202h-1c0%202-6%206-6%205h-2l-4%201%202-6v-9c-1-3-1-3%202-5l2-3%201-1%201%204c-1%203%200%205%201%206h1l1-2v-1c-2-2-2-3%200-5v-2l-1%201c-1%201-1-1-1-3%200-4%201-6%203-10%202-3%202-4%201-4-3%200-4-3-2-4l2-2-2%201c-1%201-2%200-2-6v-7l1-1%201%201v1l1-1c-1-1%200-2%201-1v-1c-2-1-2-1%202-1%202-1%202%200%202%204l1%204v-7c0-4%200-5%201-4l1-1c-1%200%200-2%202-3l3-1-2%202-2%202%202-1c3%200%203%205%200%208-3%202-2%203%201%201s8-7%207-8l-3%202-2%202v-4l2-7c2-3%200-3-4-1m54%202c-4%202-6%203-4%203s0%202-3%202v-2c-3%200-5%202-2%202v1h-8l3%201v3c1%201%200%202-1%203-4%202-1%201%205-1%202-1%205-2%206-1%202%200%202%200%201-1h1c2%200%202%200%201-1-2-1%202-3%204-1l1-1v-1l4%204%203%206c3%202%205%205%205%206h-2v2l-1%201%203-1c3%200%203-2%202-3s0-1%201-2h3c-3%202-3%202-1%202h2c1-1%201%200%201%202l1%203V99h4c5%201%2012-1%2012-2%200-2-4-6-8-8-1-1-4%200-13%203-10%203-11%203-13%202v-2l5-2c2-1%202-1%200-1l-4%202c-2%200-2-1-2-4v-3l-6%203m-41%205l-3%202v8l1%203c0%202%200%202%203%202l2%201v1l3-1c1-2%202-1%202%201l-2%204c-3%201-4%206-2%206l1-1h3c2%201%203%201%204-1%202-2%203-9%201-9l-1%203-1%202-2-1h1l1-2c0-3-2-4-5-4-3-1-3-2-1-2%203-1%203-13%201-13l-2%201c-2%202-3%201-2-1%200-3%200-3-2%201m50%2015l-2%201h-2l-10%204c-7%202-10%204-9%204%201%201%201%201-1%201h-1c1%201%201%201-1%201-2%201-3%204-1%204l1-1h2c2%200%202%200%201-1l-1-1h2l2%201v-1c-1%200%200-2%202-2v1h4l3-2%201-1c2%202%2013-2%2013-4l-3-1h-2l4-2c3-1%203-1%201-1h-3m15%2020l-1%205a77%2077%200%2000-14%205h2l2%201c3-1%203-1%203%204%200%207%201%208%205%207l4-1v-7c0-4%200-6%202-6l1-4c0-3%200-4-1-3-1%200-2-1-2-3-1-3-1-2-1%202m-29%2084c-2%202-3%203-5%203-3%200-3%200-3%203l3%204v2l-1%202h16l-8%201-10%202h7l6%201-5%201-7%201%2022-1c16-1%2016-1%2016-4h-1c-1%202-23%204-23%202l9-1%2011-2c4-1%205-4%202-4-2%200-2%200-1%201l1%202-2-1h-1l-7%201%203-1c2-1%201-1-2-1-4%200-4%200-3%202v1c-1%200-2%200-1-1l-9-1h-8l2-1c0-3-1-6-3-6l1-1h4v-5c0-3%200-3-3%201m-33%207l-5%202v7c0%207%200%207%202%207h12v-9c0-9%201-9-9-7m78%2014a153%20153%200%2000-18%202c-2%200-1%202%201%203h1c0-1%202%200%203%202%203%203%204%204%206%203h3l-3%201c-2%202-2%202%207%202a354%20354%200%200126-2c1-1%202-2%203-1l-4-7c-4-6-3-6-25-3m33%2046c2%201%200%202-4%201-3%200-2%201%203%204%206%203%206%203%2018%203h13l-6-4-7-4h-5l-2%201c-3-2-12-2-10-1M57%20317c0%202%200%202-3%202-2%200-3%201-4%203-2%205%201%208%206%207h3v-8l-1-7-1%203m170%200l-2%202c-2%200-3%202-4%204l-1%204-1-4c-2-4-2-4-6-4h-4v6l1%205%201-5c0-4%203-6%205-4%203%204%203%209%202%2010-2%202-2%203-1%203%202%200%204-4%206-10%202-5%203-5%204%201l1%204h4l-1-1c-3%200-2-6%200-8v-1l-2-1-1-2-1%201m36%203l-1%207c1%207%201%208%207%207%204-1%203-5-2-6-3%200-4-2-1-2%202%200%203-2%204-5%201-2%200-2-3-2l-4%201m49%2044l-1%203h-2c-5-1-5-1-6%203%200%203%200%203%202%203s2%200%202%204c-1%204%200%205%203%203%202-2%201-1-1%203l-1%204c1%200%203-1%203-3l3-2%201-1c1-1%204%200%203%202l2%201v-2c2%201%202%200%202-1%200-2%201-2%203-2%203%200%204%201%203%205%200%201%201%201%202-1s2-2%202-1h1l2-1c2%200%203%200%202-2l-1-2h-4l-4-1h-11a145%20145%200%20000-6l5-6-2-1-1%201c1%201-3%202-4%201l1-1%203-2c1-1%201-1-2-1-2%200-3%201-5%203m56%2011c0%2011%200%2011%204%2018l4%207-1-3-1-4%203%203c1%204%204%206%202%202l1-1c2%202%200-3-2-5l-2-2-3-8-4-12c-1-6-1-5-1%205'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"seo":{"src":"/static/ca172036b2d78c49ceae0cdeb5723e5b/0ff54/foldersCover.jpg"}}},{"id":"29268019-a0db-5d6e-adc8-85b3a994ee4f","slug":"/azure-functions-with-typescript","secret":false,"title":"Azure Functions with typescript","author":"Luke Celitan","date":"April 4th, 2024","dateForSEO":"2024-04-04T00:00:00.000Z","timeToRead":4,"excerpt":"A quick rundown on how to create an Azure Function using typescript","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\": \"Azure Functions with typescript\",\n  \"excerpt\": \"A quick rundown on how to create an Azure Function using typescript\",\n  \"date\": \"2024-04-04T00:00:00.000Z\",\n  \"hero\": \"cover.png\",\n  \"author\": \"Luke Celitan\",\n  \"appDescription\": \"Serverless\",\n  \"category\": \"Post\",\n  \"tech\": [\"TS\", \"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\": \"azure-functions-with-typescript\"\n  }, \"Azure Functions with typescript\"), mdx(\"h2\", {\n    \"id\": \"introduction\"\n  }, \"Introduction\"), mdx(\"p\", null, \"The so-called \\u201CServerless\\u201D technology was introduced by AWS with their Lambda\\nservice, and Azure quickly followed suit with their own rendition, Azure\\nFunctions. Azure Functions is an excellent way to run small pieces of code in\\nthe cloud without having to worry about the underlying infrastructure. Here is a\\nquick guide on how to create Azure Functions using TypeScript.\"), mdx(\"h2\", {\n    \"id\": \"azure-functions-v4\"\n  }, \"Azure Functions v4\"), mdx(\"p\", null, \"Azure Functions v4 is the latest version of Azure Functions. In addition to many\\nlanguages supported by Azure Functions including C#, JavaScript, Java, Python,\\nand PowerShell, Azure Functions v4 has added support for TypeScript.\"), mdx(\"p\", null, \"The almost native support for TypeScript in Azure Functions v4 is a great\\naddition, as it\\u2019s included in the development runtime, CLI commands, and\\ntemplates. In the JavaScript version, users have to add those cumbersome binding\\nJSONs, but this isn\\u2019t necessary in the TypeScript version. Unfortunately, the\\nunderlying Func engine (Azure Core Tools) does not support custom path aliases\\n(@utils) in the tsconfig.json, a feature beloved by TypeScript developers.\"), mdx(\"h2\", {\n    \"id\": \"the-serverless-use-cases\"\n  }, \"The Serverless use cases\"), mdx(\"p\", null, \"Back in the day, when serverless was starting to gain serious hype, dreams of\\nautomatic upscaling went wild. Despite Azure Functions clearly defining its\\npurpose, some people started using them as a replacement for traditional web\\nservers. It became quickly evident that the costs for functions were higher than\\ncontainers or VMs.\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Azure Functions are exceptional for small pieces of code that are triggered by\\nevents.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"They\\u2019re also an excellent solution for moving interfaces and functions that\\nare significant bottlenecks for the main application.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"They can circumvent current limitations of the main application by creating a\\nnew function that performs tasks incompatible with the main server, or when\\nchanges to the system are costly or risky.\")), mdx(\"h2\", {\n    \"id\": \"development\"\n  }, \"Development\"), mdx(\"p\", null, \"We are obviously working with Node.js here, making the development fairly\\nstraightforward. The func CLI tool, part of the\\n\", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://www.npmjs.com/package/azure-functions-core-tools\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"Azure Core Tools\"), \", is\\nused to create the functions.\"), mdx(\"p\", null, \"The actual SDK package is\\n\", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://www.npmjs.com/package/@azure/functions\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"@azure/functions\"), \", which is\\nused to create the functions and handle requests.\"), mdx(\"p\", null, \"The Node.js \\u201Cprogramming model\\u201D should not be confused with the Azure Functions\\n\\u201Cruntime\\u201D. The programming model defines how you author your code and is\\nspecific to JavaScript/TypeScript. The runtime defines the underlying behavior\\nof Azure Functions and is shared across all languages. The programming model\\nversion is tied firmly to the version of the @azure/functions npm package, and\\nis versioned independently from the runtime.\"), mdx(\"p\", null, \"Unfortunately, both the runtime and the programming model are on \\u201C4\\u201D as their\\nlatest major version, but this is purely coincidental. You cannot mix the v3 and\\nv4 programming models in the same function app. As soon as you register one v4\\nfunction in your app, any v3 functions registered in function.json files are\\nignored.\"), mdx(\"h2\", {\n    \"id\": \"chart-to-image-function\"\n  }, \"Chart to image function\"), mdx(\"p\", null, \"My Azure Function example/template is an HTTP trigger function that creates a\\nPNG based on the node-canvas package given specific request parameters.\"), mdx(\"p\", null, \"Recently, I was tasked with proving a concept for a chart to image conversion.\\nMy main application\\u2019s current stack was having a hard time accepting\\nCanvas-node, known for its difficult installation\", \"*\", \". Azure Function seemed like\\nan elegant solution for this problem.\"), mdx(\"p\", null, \"*\", \"This is a subjective opinion based on the node-canvas issues on the GitHub\\nrepo.\"), mdx(\"p\", null, \"As usual, I added much-needed development tools such as ESLint, Prettier, Husky,\\nand Commitlint for proper code quality maintenance. Additionally, I added the\\nVitest test for unit and integration testing.\"), mdx(\"p\", null, \"You can see a full github repo example\\n\", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://github.com/MassivDash/chart2img\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"here\")), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-ts\"\n  }, \"import {\\n  app,\\n  HttpRequest,\\n  HttpResponseInit,\\n  InvocationContext,\\n} from '@azure/functions';\\n\\nimport { extractColors, createCanvas } from '../utils';\\nimport { barChartOptions } from '../charts';\\nimport { Chart, ChartConfiguration, ChartItem, Plugin } from 'chart.js/auto';\\n\\nexport async function barChart(\\n  request: HttpRequest,\\n  context: InvocationContext,\\n): Promise<HttpResponseInit> {\\n  try {\\n    context.log(`Http function processed request for url \\\"${request.url}\\\"`);\\n\\n    const { canvas, ctx } = createCanvas(400, 400);\\n\\n    const plugin: Plugin = {\\n      id: 'customCanvasBackgroundColor',\\n      beforeDraw: (chart, _args, options) => {\\n        const { ctx } = chart;\\n        ctx.save();\\n        ctx.globalCompositeOperation = 'destination-over';\\n        ctx.fillStyle = options.color || '#99ffff';\\n        ctx.fillRect(0, 0, chart.width, chart.height);\\n        ctx.restore();\\n      },\\n    };\\n\\n    const plugins = [plugin];\\n\\n    const labels = request.query.get('labels')?.split(',');\\n    const dataValues = request.query.get('data')?.split(',').map(Number);\\n\\n    if (\\n      !labels ||\\n      labels.length === 0 ||\\n      !dataValues ||\\n      dataValues.length === 0\\n    ) {\\n      throw new Error('Unable to create');\\n    }\\n\\n    const backgroundColorsRaw = request.query.get('backgroundColors');\\n    const borderColorsRaw = request.query.get('borderColors');\\n\\n    const backgroundColors = extractColors(backgroundColorsRaw);\\n    const borderColors = extractColors(borderColorsRaw);\\n    const data = {\\n      labels: labels,\\n      datasets: [\\n        {\\n          label: 'My First Dataset',\\n          data: dataValues,\\n          backgroundColor: backgroundColors,\\n          borderColor: borderColors,\\n          borderWidth: 1,\\n        },\\n      ],\\n    };\\n\\n    const chartConfig = {\\n      type: 'bar',\\n      data: data,\\n      options: barChartOptions,\\n      plugins,\\n    };\\n\\n    new Chart(ctx as unknown as ChartItem, chartConfig as ChartConfiguration);\\n\\n    const pngBuffer = canvas.toBuffer('image/png');\\n\\n    // Set the headers and send the PNG buffer in the response\\n    request.headers.set('Content-Type', 'image/png');\\n    request.headers.set('Content-Length', pngBuffer.length.toString());\\n    return {\\n      status: 200,\\n      body: pngBuffer,\\n      headers: request.headers,\\n    };\\n  } catch (error) {\\n    context.log(error);\\n    return {\\n      status: 500,\\n      body: 'Internal server error',\\n    };\\n  }\\n}\\n\\napp.http('barChart', {\\n  methods: ['GET', 'POST'],\\n  authLevel: 'anonymous',\\n  handler: barChart,\\n});\\n\")), mdx(\"p\", null, \"This function expects almost all data to come in the query parameters, and it\\ndynamically creates the bar chart image. When calling the function, labels,\\ndata, background, and border colors must be supplied.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-bash\"\n  }, \"https://spacechart.azurewebsites.net/api/barChart?labels=SpaceGhost,Moltar,Metallus,Transit,Zorak,The%20Creature%20King,Blip&data=100,59,80,81,56,55,40&backgroundColors=rgba(255,%2099,%20132,%200.2),rgba(255,%20159,%2064,%200.2),rgba(255,%20205,%2086,%200.2),rgba(75,%20192,%20192,%200.2),rgba(54,%20162,%20235,%200.2),rgba(153,%20102,%20255,%200.2),rgba(201,%20203,%20207,%200.2)&borderColors=rgb(255,%2099,%20132),rgb(255,%20159,%2064),rgb(255,%20205,%2086),rgb(75,%20192,%20192),rgb(54,%20162,%20235),rgb(153,%20102,%20255),rgb(201,%20203,%20207)\\n\")), mdx(\"p\", null, \"The final result is a simple bar chart image that can be downloaded or used in\\napplications, emails, or other mediums that might work better with images.\"), mdx(\"p\", null, mdx(\"span\", {\n    parentName: \"p\",\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"400px\"\n    }\n  }, \"\\n      \", mdx(\"span\", {\n    parentName: \"span\",\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"100%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsTAAALEwEAmpwYAAACWElEQVQ4y41U2XLiMBDk//8uhN0Hx2RrcQDfNvg+NL09sp1gh0qtqK5uCak1mpG1ExFsm9QtUNaQGf+jpSD6ATs1aNsWURRZJEmC0QsA14McPyBkzCzux3NNhnOCxPlkOI6jNe373sIEKXAKIF4IIeNjYvFm7c1a+eRP/b9XSF5g93hkY4w1N3dOzv5yAnfNTkDuWRayjpuCprqOMKOBGLHQ9dZwMc3zHGEYwsRHwN9D/FfIdQ8EB8viH4DrC0z6B0sYRtfPP2toi7ApjKkTJpxHIUxxpQ4sax9kU6eMaOTCgSYDlqA+I9SmucuyDLfbjQuY7OoNpnJhSpf6aFn7k3a4gQO5/+bcs432m6Hm7n6/EwVAQ9AQNECpfJzZnbXyO+Hwivhrw2dHztoaYVMhIsK6/OJ6PabI2gZTfTYRKutx9S665D2P/0rs05Scz5x9av3/Jc3gcO63HD5CB6OmwbmqcSHOVYVLPbOOUV+pfWUibprnhkthGk7w8gFOMuKNcJIBbjrx2zxWdw8p2gSzMqx1xzjGMetwoMGvpMch7tZMZM2oTvYOqsnKEE9adjMIYx49UR7JMrEdEwyDsYbL17Uy1Lun0Mj0YYjjCLE3IuDtCI5iEb5/aZ+3Z+x/MByGweau67rPxyGPDJILkF4EydmQQZa5T8OfItwedypMy3w2NqcVK6taecn1YvLU8LEo+rUEQYCyLHEvSvvVKIpZP97ZrV6w+6q+rKLs+fp2Xc93spt1ZyNYNn4MYjFTvdvuuDy22vRO6rG1VYx6GddnbjFSray10ML+A1NaEFAZa1RoAAAAAElFTkSuQmCC')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  }), \"\\n  \", mdx(\"picture\", {\n    parentName: \"span\"\n  }, \"\\n          \", mdx(\"source\", {\n    parentName: \"picture\",\n    \"srcSet\": [\"/static/b37843f27eae334b70c2e5221186402c/28a80/barChart.webp 400w\"],\n    \"sizes\": \"(max-width: 400px) 100vw, 400px\",\n    \"type\": \"image/webp\"\n  }), \"\\n          \", mdx(\"source\", {\n    parentName: \"picture\",\n    \"srcSet\": [\"/static/b37843f27eae334b70c2e5221186402c/a3397/barChart.png 400w\"],\n    \"sizes\": \"(max-width: 400px) 100vw, 400px\",\n    \"type\": \"image/png\"\n  }), \"\\n          \", mdx(\"img\", {\n    parentName: \"picture\",\n    \"className\": \"gatsby-resp-image-image\",\n    \"src\": \"/static/b37843f27eae334b70c2e5221186402c/a3397/barChart.png\",\n    \"alt\": \"Space chart\",\n    \"title\": \"Space chart\",\n    \"loading\": \"lazy\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    }\n  }), \"\\n        \"), \"\\n    \")), mdx(\"h2\", {\n    \"id\": \"conclusion\"\n  }, \"Conclusion\"), mdx(\"p\", null, \"In summary, serverless functions like Azure Functions have surfaced as\\ninnovative solutions that offer a different perspective to addressing common\\nproblems in scaling and software compatibility. As showcased by the example\\nabove, serverless functions can tackle specific tasks that might not be feasible\\nor efficient within a primary application\\u2019s context.\"), mdx(\"p\", null, \"The advent of AWS\\u2019s Lambda service marked the beginning of a new era of\\nserverless computing, and the technology was soon embraced by Azure in the form\\nof Azure Functions. This new technology was appealing as it allowed small code\\npieces to be executed in the cloud without worrying about managing the\\nunderlying infrastructure. Whatever Azure lacks in first-mover advantage, it\\ntries to compensate with new features and support for a wide array of languages,\\nnotably recently introducing TypeScript support.\"), mdx(\"p\", null, \"However, serverless computing comes with its unique challenges and\\nmisconceptions. Despite their seemingly endless benefits, Azure Functions or its\\nequivalents are not the ultimate solution to every problem\\u2014they cannot and\\nshould not replace traditional web servers entirely. It\\u2019s crucial to understand\\nthat even though serverless functions can auto-scale, their costs can exceed\\nthose of containers or VMs, which can be surprising and detrimental for\\nuncritical adopters.\"), mdx(\"p\", null, \"Instead, serverless functions excel when applied to small tasks, driven by\\nevents. They also function well when moving interfaces and tasks that weigh\\nheavily on the primary application, allowing for improved overall performance.\\nThey can also serve as a perfect solution to address compatibility issues,\\ncircumventing limitations present within the primary application by offering a\\nplatform to build functions that can carry out tasks that the main server is\\nincompatible with.\"), mdx(\"p\", null, \"To conclude, serverless functions, along with exciting emerging technological\\nadvances in the industry, should be seen as beneficial tools within a\\ndeveloper\\u2019s toolbox. However, like any tool, their adoption should be based on\\nneeds, feasibility, and context. A careful understanding of their use cases,\\ncosts, advantages, and disadvantages is mandatory for making an informed choice\\nabout when and how to use Azure Functions or any serverless technology. It is\\nessential to remember that advancements in technology inevitably come with their\\nown set of challenges, and serverless functions are no exception. Therefore,\\nthey should be approached with caution, critical evaluation, and a readiness to\\nadapt and learn.\"));\n}\n;\nMDXContent.isMDXComponent = true;","tech":["TS","Nodejs"],"category":"Post","appDescription":"Serverless","hero":{"full":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsSAAALEgHS3X78AAAEVElEQVQ4y21UayycaRT+/vvjl19sm25T20VLd5edJsW4zpjBYLTGaK0q47LubRO6iYhqyLIJVkRco4KgWja7tu7XBnEnEloV9/v9Fgl59j2vzsRu9ktOzve973mf9znnPOcT5ubmsLi4iKWlJSwvL2N1dRVra2vY2tri67OzsygqKkJ6ejoGBgYwNjaGw8NDbG9v8xiyzc1NnQmXAVdWVjgYGW2S7+npQVNTEzo6OlBTUwOFQsHBd3d3sbOzw+O0oBsbGxDm5+c54GV2tLG3t4fR0VG0t7dzluPj4ygvL4dMJoOenh7i4+NxcHCgA9SCCgsLCzp2BEgbBEoXEKuuri40NzejtbUVxcXFsLa2hpGREaysrDA5OYn9/f1/gQpadgRIzGZmZlBbW4uqqirU19ejt7cXg4ODGBkZgVKphCAI0NfXh6GhIerq6nB8fKyr+f8CEuPGxkZu+fn5yMzMhEqlgkajgZmZGQc0MDCASCRCW1sb6Dk6OtI1SZeytoa0QcDkiUFqaioCAwMhkUgQFBQES0tLDmhhYQE/Pz/ExcVhaGiI15MD/rcpBKa9gNKurKyEv78/Z2ZsbAw7OzskJiYiNzcXCQkJiIqK4nFUSyLBAS+zXF9f5zdRCciT5vr7+xETEwNTU1Pk5OTwuPPzc5yenuLs7AwnJydcQjqGBEhGTMkmJib4Nz3EmjRHHW1oaOBMSFLampHXlomao0uZAGhhamqK1ywiIgKlpaVcEqTBkJAQDkqZaGtM7AmULqXMyAtEXws4PT3Np0IsFsPJyQnZ2dm8MQUFBejq7ubgdIiM0iwrK0NFRcUFOwZIWMIbpjkS72c2DX19fXy0HBwc8Pf79ygsLORSoe5SGUpKSpCUlMQvoAkKDQ2FWq1GXl4ehoeHMceyFZ4/e4YKNlKtLc3oZ4De3kp8w7oZHhaGWNYIicSZMc3Cu7dvERUZCVe5HA+ZXH7LyEBMdDRsbW0glUqQlZWJstevIUhUAXD118AnNAaq8Dg8CImGmY0zTO45wlrhA2VwBHzCYkFxtp4q7p2/nPnO0RW3bCWQ+j6Gd3Ak1BFPIdwQu+KO7D7MnD1hLlXittQLlgo17no9gvmX9VsSL/zgpoKluy/bV+KO/AHMXbx5HMVct5HhaxsXXLOWQqBgWUAYPIKjuLf3fQKXn0L5u5NfMOxUgXB+pIE8IJx7t8Cfeaz8cTg3kYca3zq446a9G4zFcghfWYlx5Ud7XBE54OpdR9y0Y2kwViaOCs7Y3EUJE3bAgjExZWvfu/rghq2Mn7nNyFy/J8E1do6yFHk+ZDV0kcHL+z4Unl54lZqGto5ONLW04kNvH/748y+k/ZqB2KfP4e7hCYr99HkWmVm/40mwBuWVVejo7EZefgE704aCopKLnwOJe35+junoQrSfPn7kMmhpaWGzXIFO9l+sq3uHIiajeqbLVykpqK6uxi8vXqCZ6TYtLRXJyclIefkS/wA8nocLH7tgqAAAAABJRU5ErkJggg==","aspectRatio":1,"src":"/static/96cc0c73a4e35c7fe3e8d7299b488a0e/a1946/cover.png","srcSet":"/static/96cc0c73a4e35c7fe3e8d7299b488a0e/5b37e/cover.png 236w,\n/static/96cc0c73a4e35c7fe3e8d7299b488a0e/49058/cover.png 472w,\n/static/96cc0c73a4e35c7fe3e8d7299b488a0e/a1946/cover.png 944w,\n/static/96cc0c73a4e35c7fe3e8d7299b488a0e/6050d/cover.png 1200w","srcWebp":"/static/96cc0c73a4e35c7fe3e8d7299b488a0e/99fbb/cover.webp","srcSetWebp":"/static/96cc0c73a4e35c7fe3e8d7299b488a0e/77392/cover.webp 236w,\n/static/96cc0c73a4e35c7fe3e8d7299b488a0e/1f177/cover.webp 472w,\n/static/96cc0c73a4e35c7fe3e8d7299b488a0e/99fbb/cover.webp 944w,\n/static/96cc0c73a4e35c7fe3e8d7299b488a0e/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='M197%201l-1%202-1%201c-2%200-2%200-2%202l-2%204-1%201v3l-3-1c-1-1-1-1-1%201l-1%203c-2%201%201%203%206%204%204%202%205%202%206%200l3-1v-1l2-3h3l4%202c3%200%204%200%203-1%200-2%201-2%204-2l4%201-4%201c-2%200-2%200-1%201h5l2-1c-2%200%200-2%203-2%205%200%2013%205%2012%207v3l-2%201c-4%201-4%203%202%204l3%202h-3l-1%201%203%201c4-1%204%201%200%204l-2%203h-4c-4%200-4%200-2%201%203%201%203%203%200%202l-3%201v1l1%201c-1%201%200%201%202%201l6%203%204%203%201%201c0%202-11%202-12%201h-4l-4%201c-3%201-2%201%2011%203l17%205%203%201h-3c-3%200-3%200-1%201%203%202-3%202-12%201h-12l9%203c8%200%207%201%200%201l-10%201%201%201%202%201h5c2%201%202%201%200%201s-3%201%200%203c1%201%201%201-1%201-4%200-6%202-3%202h3l-2%202c-2%201-3%203-3%205l-1%202c-2-1-1%200%201%202v2c-2%200-2%203%200%205%202%201-2%202-11%201-7%200-7%200-6%201l3%202c2%200%202%201%203%203%200%202%200%202-2%202l-2-1%201-1-1-1c-1%200-2%200-1%201l-3%201-8-1-13-3h-9l-8-1-10-2c-3%200-8-4-8-6h-1l-1-1v-3h2c4%201%203-2-2-4-6-3-6-3-6%200s0%203-6%202c-4%200-5%200-4%201l6%201c3%200%204%200%204%202l4%2017h7l-2-3-1-2c1%201%203%200%204-1%202-1%206%200%206%202%200%201%202%202%2010%203h4c1%201%205%203%206%202l1%204c0%204%202%206%2010%208l3%201-3%201c-4%202-7%201-28-5-19-6-18-5-16-4l31%2010c12%203%2012%203%2014%201s3-3%203%200l-2%201-1%202%207%201%202%201-3%201h-3v1l20%204a1141%201141%200%200080%2013c4%202%205%202%206%201v-1l-1-1%203%201c4%201%2040%202%2047%201%204-1%208-4%208-6l-6-7%201%202c5%206%201%2010-10%2011-3%200-4%200-3-1%2012-2%2015-4%2011-9l-1-3v-1h-2c-2%200-2%200-1-1h-1c-2%200-2%200-1-1v-1h-1l-1-1h-1l-1-1h-2c1-1-21-9-22-8l-1-1-2-2-2-4c-1-1-1-1-1%201v4l-10-3%201-7c2-6%202-11%202-19%201-15%200-18-3-18l-16-3%209%201c10%201%2011%200%201-2l-6-1%206%201c8%200%208%201%201-14a85%2085%200%2000-72-45c-8%200-11-1-11-5h-2l-1-1V4c2-2%201-3-3-4-1%200-2%201-2%204%200%204-1%205-5%204h-4V1m-27%2071c-1%202%201%204%202%202%202-1%2012%200%2031%206l9%201%206%201%203%201c3%200-2-3-6-4-15-4-22-5-22-4h-5l-6-2-5-2h-5c-1-1-2-1-2%201m-49%2010l-7%203c-2%200-3%204-2%204l18%201-1-4-1-2c0%202%200%202-3%200l-3-2h-1m94%2036l-1%208c0%203%202%203%203%200%200-1%201-2%203-1l13-2h-4c-5%200-7-1-7-5%200-2%201-3%206-3l6-1h-7l-9-2c-3%200-3%200-3%206m-61%209c2%205%204%207%205%206%201-2%2019%205%2031%2011l7%204h-16v-1h-3l-5-1v1l-1-1c-1-2-6-3-6-2l19%2015%204%203c-1%200-1%202%201%204%201%201%201%201%202-1%200-2%200-2%205-1l3%202v9c0%205%200%206%201%204l1-9v-4l8%202%209%202v4c0%203%200%204-2%204v1c1%201%201%201-1%201l-7%201c-7%201-3%203%207%203%204%200%204%200%204%204s2%204%203%200c0-3%201-3%203-3%206%200%2016-1%2018-3%201-1%201-1-1-1l-2-1-3-1c-4%200-4-9-1-9a97%2097%200%200043-20l-18-3a935%20935%200%2001-108-20m141%203v4l1%202c0%202%201%202%207%202l6-1v-1c2-2-2-5-9-8-2-1-3%200-5%202m-82%205a552%20552%200%200075%2012h2l-2-1-4-2h-4l-15-2a1049%201049%200%2001-52-7m-59%202c-2%200-2%201-1%201v3l1%201h-2v1c2%202%202%202%200%202v1c2%202%201%203-2%204s-4%203-1%204c4%202%209%201%2012-2%207-7%201-19-7-15m-33%2051v4l-1%202c-2%200-2%201-2%203s0%203%202%203l1%202-1%202-2%201c-2%200-7-7-7-10h-1l-1%203c0%203%200%203%201%202s1-1%202%201l-1%204v4c-2%200-2-3-1-5%202-2%201-2-3-1-4%200-5%204-3%206l2%202-4-2c-2-2-2-2-4-1-3%201-3%204%200%203v1l-1%206%201%205c0%202%201%204%203%205l2%204%201%202c1%200%201%2010-1%2010l-1%203-1%204-1%204-1%205c-1%201%200%202%201%203%201%202%201%202-1%202s-3-1-3-6l1-7c2-2%200-8-3-11-4-4-4-6%200-7l2-3c-1-2-3-3-3-1l-2%202-2%202c-1%201-5%202-5%200%200-1-1-1-1%201-1%202-2%205-2%2011l-1%206c-2%205%200%2019%202%2018h7l-3%201c-1%200-2%200-1%201l-3%201-3%201h-3l-4%201H57l3%201%204%201h2l3-1v1c-2%201%203%201%209-1%202%200%202%200%201%201-2%202-2%202%201%202l3-1h2l2-1h-1l-1-1c0-1%203-3%205-3v1l-2%203c-1%202%200%202%208%202l4%201-1%201v2l-1%202-49%201H0v90h12l21%202c10%201%2015%201%2037-3h4l-5-3-5-2%207%201c19%201%2031%200%2020-3l-23-7h5a832%20832%200%200087%200c32%200%2036%200%2032%201l-11%202c-7%202-9%202-10%201h-1c-1%202-1%202%204%204l4%201-4%201c-2%202-4%202-7%202h-4l-2-1h-4l-2%201h-3l-3-1c0-1-3-1-4%201l-1%202%203%201%209%202c8%202%2013%203%2013%201-1-1%200-1%206-1l8%201%206%201%2011%201h10c0%202%2019%205%2041%206l15%201v12h6c6%200%207-1%207-7l1-5%201-3v-4c2-4%203-6%203-11%200-4%200-4%204-4%203-1%204%200%205%204l3%205%201%203%203%203%201%201v4c-1%207-2%2011-4%2010-3-1-6%200-5%202h4l3%201h2c2%201%2013%201%2012-1v-9c0-5-1-7-2-8v-2l-4-8-4-9c1-1%2023-2%2025%200%201%200%201%201-1%201-3%203%2019%206%2030%204%207-1%206-1-2-2-9-2-5-2%209-2%209%200%2013%200%2011-1-5-1-5-2%200-2l15%201h10v6c0%204%200%205-2%205v-1c1-1%201-1-1-1l-2%201-4%201c-4%200-5%200-4%201%200%202-5%205-10%205l-7%202-8%201h-4l2%202c0%201-18%204-29%204l-11%201%202%201h4c2%201-3%202-7%201l-3%201%201%201%201%201c-1%201%200%202%202%202a133%20133%200%200033-1l-3%204c-4%201-1%202%206%202l6-1h7l18%201h13v-7l-10%201h-28l11-9a323%20323%200%200021-4c-1-1%200-1%202-3l4-2%201-46v-44h-40l-40-1%2028-1c17%200%2027%200%2025-1l-10-1-7-1%201-2c0-1%201-2%202-1l1-1-2-1h-1l-1%201c-4%200-2-3%203-4%204-1%205-2%203-8-3-7-3-12-1-12l1-1-2-1c-3%200-5-2-3-3s0-10-3-11v1c1%200%201%203-1%205l-1%203c0%204%200%205-3%205l-3%202h3c2%200%202%200%202%205%200%204%200%205-2%205l-2%202c-1%202-2%201-1-2l-1-5c-1-1-2-2-1-4l-1-3c-2%200-2-1-2-10l-1-12c-1-1-1%202-1%2011%200%208%200%2012-1%2011l-2%201c0%201-1%202-2%201-2%200-3%201%200%203%202%202%201%203-1%203s-3-1-3-2h-1l-1-1v-3l2-6c1-5%201-6-2-8l-2-4-1-1v-2c0-3-2-5-8-6-2-1-3-1-2%201l-1%201c-1-1-1%200-1%201h-4c-4%200-4%205-1%208%203%202%203%202%201%202-2%201-2%202-2%206l1%204h1l-1%202h-3l-2%201c-4-1-4%204-1%205%206%202%209%200%209-6l1-2c1%200%205%203%203%203s-4%203-3%206v9c-1%206-1%206-4%206s-4-1-2-3c1-1%200-3-1-2l-1-1-1-1-1%204c1%203%201%203-2%202h-4l-1-9-1-9c-1-1-2-2-1-4%200-3-3-7-5-5%200%201-1%202-3%202l-1%202-3%205c-2%202-2%204%201%204l1%202%201%201%201%203%201%204c3%200-2%205-5%206l-4%201h-2l-2-2-1-2c-2%200-3-5-3-13l-2-4-2-4c0-2-2-3-2-3-2%200-2-1-1-3l-1-2h-1l-7-1-1%203-2%201h-1l-1-1v5c2%203%201%203-4%209l-2%202-2-2c-1-1-2-3-1-4l-1-3-2%201h-1l-4%202c-1%201-2%202-3%201v-2c1-1%201-2-1-3l-2-2-2%202-2%201%201-2%201-1c-1-1%200-1%201-1l2-1h-1l-2-1c0-2-2-3-4-1h-2c0-2-2-1-1%201l1%202v2l-1%205%202%2010c2%208%202%208-5%208-4%200-5%201-5%202%200%202%200%202%202%201h5l4%201%205%201%204%202%206%201c1%201%201%201-1%201h-17l-8-2c-5-2-7-7-5-11%202-2-1-6-3-5l-2-1c-2-1-4%207-2%209%202%201%200%202-4%201-3-1-3-1-1-13l3-7c1%201%203%203%202%204l1%201c2-1%201-10-1-16-2-3-3-5-2-6%201-2%200-7-2-6l-2-1c0-2-3-1-3%201l-2%202c-1%200-2-1-1-2h-1c-3%204-3%206%201%205%203-1%203-1%203%201s-2%203-2%201h-5v1l-1%201-3-3c-2-3-4-4-5-2v2h-1l-1%202-2%204v-3l2-5c1-2%201-2-1-2-3-1-4%200-2%201l-1%204c-1%203-1%203-2%201s-1-2-2%202c-1%203-2%205-4%205h-3c0-2%202-3%204-3l1-2%201-3%201-4-4%203-2%202c-1-1-1%200-1%201l-1%202c-2%200-6%207-6%209l-1%201c-2%200-3%203-1%205l1%205c0%204%200%204-2%204-5%200-9%205-5%208%201%202%201%202%204%200%203-1%206-2%2014-1%206%200%206%201%200%202-4%200-6%201-4%202l-4%201-9%201h-5v-1l1-1c-1-1%200-1%201-1l1-1-3-1c-2%200-4-4-3-6h-1c-4%200-7-1-5-2v-4l-1-1-1-2-1-5v-2c-1-2%200-6%203-6%205-2%204-10-1-12h-2l2-1h5l1-2%203-1c1%200%201%201-1%202l-2%203%203-2c4-3%2013-1%2013%203%200%202%202%201%203-1%201-3%203-5%206-5s3%200%202-1c-2-1-2-1%200-1%201%200%202%200%201-1v-1l-2-1c-1%201-3%200-5-1l-2-2%204-3%207-2c2%200%203-2%202-4%200-2-2-2-4%200-1%202-9%202-13%200-3-2-4-2-4-1h-1c-2%200-3%200-2%202h-2l-3-1-1-1v-1l-1%201-1%201-2-2h-3l1-1-2-2c-3-1-4-2-3-3%201-3%201-17-1-17l-1%202m85%2015l-1%202-2%202-3%204-1%202c-5%204-3%208%204%2010%209%203%2017-8%2012-17-2-5-6-6-9-3M19%20245l-1%203c-1%202-1%202-3-1l-1-1v6c-1%201-1%200-1-1l-4%207-4%203-1%202c2%202-1%207-3%206-1-1-1-1-1%203v4h5c4%200%204%200%203-1l-1-3-1-2v-2c0-3%201-3%203-2%203%200%201%2013-1%2016l-2%202h2c5%200%209%200%2011-2l17-1h19c4-1%203-1-6-1l-16-1H20l2-1%203-1h-4c-4%201-5%200-2-2l1-2-2-1c0-1%201-2%203-2%206%200%208-2%207-5l-2-4c-2-2-3-9-3-12s-1-6-3-6l-1%202m32%2015c-2%200-4%206-3%207l-1%203h-2c-1-2-1-2-3-1h-3l-2%202%202%201h3l-3%201-2%201%202%201%207-2%205-1%202-1c2%200%203%200%202-3v-6c-1-2-1-3-4-2m343%207c-3%202-5%202-6%201-2-2-5-1-4%201l-10%204-11%204h25l7-2c-2-1-2-1%201-3%202-1%204-2%204-4s0-2-6-1m-219%202l-4%201c-5%201-5%201-2%202l3%202c0%202%203%203%2010%203%202%200%203%200%202%201l-4%201-14%204c-4%200-5-2-2-2s-2-2-6-2c-3%200-2%202%201%203%203%200%203%200%201%201s-2%201%201%201%203%200%202%201%2012%201%2034%201c33%200%2036-1%2019-3l-4-1c1-1%200-1-2-1-5%200-12-2-9-2%202%200%200-2-3-2-5%200-16-3-15-4%202-2%200-4-4-4h-4m71%209c-10%200-13%201-8%202h13c3-1%204-1%202%201l-2%203c0%202%203%202%2029%202%2029%200%2030%200%2027-4-1-2-3-2-10-1-15%202-37%202-35%200l4-1c3-1%203-1-1-1l-5-1-3-1-11%201m11%2042c-2%200-2%201-2%207l1%207%201-2%202-2c5%200%207-4%205-9-2-2-2-2-7-1m-54%2041l-3%203h-3l3%201%203%201-5%201c-3%201-5%203-5%204l-2%202c-3%200-1%202%202%201%203%200%205-2%203-2-3%200%208-3%2014-3h4l-1%201%2011-6-15-2-5-1h-1m47%200c-17%200-20%201-17%204%202%202%202%203%202%207l-1%205%205%201a293%20293%200%200027%205v-1l1%203%201%203%201-3%202-4%201-3v-2l-1-3-2-2h4c3-1%204-3%202-2l-2-1-1-1-6-5-16-1m-88%2031c-3%202-6%203-4%201l-1-1-2%201c-1%201%200%201%201%201v1l-3%201-2%201c-2%202-2%203-1%203l2-1%204-1%203-1-3%201c-3%202-3%202%206%202h9l-1-3-4-8-4%203'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"regular":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsSAAALEgHS3X78AAAEVElEQVQ4y21UayycaRT+/vvjl19sm25T20VLd5edJsW4zpjBYLTGaK0q47LubRO6iYhqyLIJVkRco4KgWja7tu7XBnEnEloV9/v9Fgl59j2vzsRu9ktOzve973mf9znnPOcT5ubmsLi4iKWlJSwvL2N1dRVra2vY2tri67OzsygqKkJ6ejoGBgYwNjaGw8NDbG9v8xiyzc1NnQmXAVdWVjgYGW2S7+npQVNTEzo6OlBTUwOFQsHBd3d3sbOzw+O0oBsbGxDm5+c54GV2tLG3t4fR0VG0t7dzluPj4ygvL4dMJoOenh7i4+NxcHCgA9SCCgsLCzp2BEgbBEoXEKuuri40NzejtbUVxcXFsLa2hpGREaysrDA5OYn9/f1/gQpadgRIzGZmZlBbW4uqqirU19ejt7cXg4ODGBkZgVKphCAI0NfXh6GhIerq6nB8fKyr+f8CEuPGxkZu+fn5yMzMhEqlgkajgZmZGQc0MDCASCRCW1sb6Dk6OtI1SZeytoa0QcDkiUFqaioCAwMhkUgQFBQES0tLDmhhYQE/Pz/ExcVhaGiI15MD/rcpBKa9gNKurKyEv78/Z2ZsbAw7OzskJiYiNzcXCQkJiIqK4nFUSyLBAS+zXF9f5zdRCciT5vr7+xETEwNTU1Pk5OTwuPPzc5yenuLs7AwnJydcQjqGBEhGTMkmJib4Nz3EmjRHHW1oaOBMSFLampHXlomao0uZAGhhamqK1ywiIgKlpaVcEqTBkJAQDkqZaGtM7AmULqXMyAtEXws4PT3Np0IsFsPJyQnZ2dm8MQUFBejq7ubgdIiM0iwrK0NFRcUFOwZIWMIbpjkS72c2DX19fXy0HBwc8Pf79ygsLORSoe5SGUpKSpCUlMQvoAkKDQ2FWq1GXl4ehoeHMceyFZ4/e4YKNlKtLc3oZ4De3kp8w7oZHhaGWNYIicSZMc3Cu7dvERUZCVe5HA+ZXH7LyEBMdDRsbW0glUqQlZWJstevIUhUAXD118AnNAaq8Dg8CImGmY0zTO45wlrhA2VwBHzCYkFxtp4q7p2/nPnO0RW3bCWQ+j6Gd3Ak1BFPIdwQu+KO7D7MnD1hLlXittQLlgo17no9gvmX9VsSL/zgpoKluy/bV+KO/AHMXbx5HMVct5HhaxsXXLOWQqBgWUAYPIKjuLf3fQKXn0L5u5NfMOxUgXB+pIE8IJx7t8Cfeaz8cTg3kYca3zq446a9G4zFcghfWYlx5Ud7XBE54OpdR9y0Y2kwViaOCs7Y3EUJE3bAgjExZWvfu/rghq2Mn7nNyFy/J8E1do6yFHk+ZDV0kcHL+z4Unl54lZqGto5ONLW04kNvH/748y+k/ZqB2KfP4e7hCYr99HkWmVm/40mwBuWVVejo7EZefgE704aCopKLnwOJe35+junoQrSfPn7kMmhpaWGzXIFO9l+sq3uHIiajeqbLVykpqK6uxi8vXqCZ6TYtLRXJyclIefkS/wA8nocLH7tgqAAAAABJRU5ErkJggg==","aspectRatio":1,"src":"/static/96cc0c73a4e35c7fe3e8d7299b488a0e/3ddd4/cover.png","srcSet":"/static/96cc0c73a4e35c7fe3e8d7299b488a0e/078a8/cover.png 163w,\n/static/96cc0c73a4e35c7fe3e8d7299b488a0e/e56da/cover.png 327w,\n/static/96cc0c73a4e35c7fe3e8d7299b488a0e/3ddd4/cover.png 653w,\n/static/96cc0c73a4e35c7fe3e8d7299b488a0e/c5cc7/cover.png 980w,\n/static/96cc0c73a4e35c7fe3e8d7299b488a0e/6050d/cover.png 1200w","srcWebp":"/static/96cc0c73a4e35c7fe3e8d7299b488a0e/0acdf/cover.webp","srcSetWebp":"/static/96cc0c73a4e35c7fe3e8d7299b488a0e/ac59e/cover.webp 163w,\n/static/96cc0c73a4e35c7fe3e8d7299b488a0e/7660b/cover.webp 327w,\n/static/96cc0c73a4e35c7fe3e8d7299b488a0e/0acdf/cover.webp 653w,\n/static/96cc0c73a4e35c7fe3e8d7299b488a0e/75470/cover.webp 980w,\n/static/96cc0c73a4e35c7fe3e8d7299b488a0e/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='M197%201l-1%202-1%201c-2%200-2%200-2%202l-2%204-1%201v3l-3-1c-1-1-1-1-1%201l-1%203c-2%201%201%203%206%204%204%202%205%202%206%200l3-1v-1l2-3h3l4%202c3%200%204%200%203-1%200-2%201-2%204-2l4%201-4%201c-2%200-2%200-1%201h5l2-1c-2%200%200-2%203-2%205%200%2013%205%2012%207v3l-2%201c-4%201-4%203%202%204l3%202h-3l-1%201%203%201c4-1%204%201%200%204l-2%203h-4c-4%200-4%200-2%201%203%201%203%203%200%202l-3%201v1l1%201c-1%201%200%201%202%201l6%203%204%203%201%201c0%202-11%202-12%201h-4l-4%201c-3%201-2%201%2011%203l17%205%203%201h-3c-3%200-3%200-1%201%203%202-3%202-12%201h-12l9%203c8%200%207%201%200%201l-10%201%201%201%202%201h5c2%201%202%201%200%201s-3%201%200%203c1%201%201%201-1%201-4%200-6%202-3%202h3l-2%202c-2%201-3%203-3%205l-1%202c-2-1-1%200%201%202v2c-2%200-2%203%200%205%202%201-2%202-11%201-7%200-7%200-6%201l3%202c2%200%202%201%203%203%200%202%200%202-2%202l-2-1%201-1-1-1c-1%200-2%200-1%201l-3%201-8-1-13-3h-9l-8-1-10-2c-3%200-8-4-8-6h-1l-1-1v-3h2c4%201%203-2-2-4-6-3-6-3-6%200s0%203-6%202c-4%200-5%200-4%201l6%201c3%200%204%200%204%202l4%2017h7l-2-3-1-2c1%201%203%200%204-1%202-1%206%200%206%202%200%201%202%202%2010%203h4c1%201%205%203%206%202l1%204c0%204%202%206%2010%208l3%201-3%201c-4%202-7%201-28-5-19-6-18-5-16-4l31%2010c12%203%2012%203%2014%201s3-3%203%200l-2%201-1%202%207%201%202%201-3%201h-3v1l20%204a1141%201141%200%200080%2013c4%202%205%202%206%201v-1l-1-1%203%201c4%201%2040%202%2047%201%204-1%208-4%208-6l-6-7%201%202c5%206%201%2010-10%2011-3%200-4%200-3-1%2012-2%2015-4%2011-9l-1-3v-1h-2c-2%200-2%200-1-1h-1c-2%200-2%200-1-1v-1h-1l-1-1h-1l-1-1h-2c1-1-21-9-22-8l-1-1-2-2-2-4c-1-1-1-1-1%201v4l-10-3%201-7c2-6%202-11%202-19%201-15%200-18-3-18l-16-3%209%201c10%201%2011%200%201-2l-6-1%206%201c8%200%208%201%201-14a85%2085%200%2000-72-45c-8%200-11-1-11-5h-2l-1-1V4c2-2%201-3-3-4-1%200-2%201-2%204%200%204-1%205-5%204h-4V1m-27%2071c-1%202%201%204%202%202%202-1%2012%200%2031%206l9%201%206%201%203%201c3%200-2-3-6-4-15-4-22-5-22-4h-5l-6-2-5-2h-5c-1-1-2-1-2%201m-49%2010l-7%203c-2%200-3%204-2%204l18%201-1-4-1-2c0%202%200%202-3%200l-3-2h-1m94%2036l-1%208c0%203%202%203%203%200%200-1%201-2%203-1l13-2h-4c-5%200-7-1-7-5%200-2%201-3%206-3l6-1h-7l-9-2c-3%200-3%200-3%206m-61%209c2%205%204%207%205%206%201-2%2019%205%2031%2011l7%204h-16v-1h-3l-5-1v1l-1-1c-1-2-6-3-6-2l19%2015%204%203c-1%200-1%202%201%204%201%201%201%201%202-1%200-2%200-2%205-1l3%202v9c0%205%200%206%201%204l1-9v-4l8%202%209%202v4c0%203%200%204-2%204v1c1%201%201%201-1%201l-7%201c-7%201-3%203%207%203%204%200%204%200%204%204s2%204%203%200c0-3%201-3%203-3%206%200%2016-1%2018-3%201-1%201-1-1-1l-2-1-3-1c-4%200-4-9-1-9a97%2097%200%200043-20l-18-3a935%20935%200%2001-108-20m141%203v4l1%202c0%202%201%202%207%202l6-1v-1c2-2-2-5-9-8-2-1-3%200-5%202m-82%205a552%20552%200%200075%2012h2l-2-1-4-2h-4l-15-2a1049%201049%200%2001-52-7m-59%202c-2%200-2%201-1%201v3l1%201h-2v1c2%202%202%202%200%202v1c2%202%201%203-2%204s-4%203-1%204c4%202%209%201%2012-2%207-7%201-19-7-15m-33%2051v4l-1%202c-2%200-2%201-2%203s0%203%202%203l1%202-1%202-2%201c-2%200-7-7-7-10h-1l-1%203c0%203%200%203%201%202s1-1%202%201l-1%204v4c-2%200-2-3-1-5%202-2%201-2-3-1-4%200-5%204-3%206l2%202-4-2c-2-2-2-2-4-1-3%201-3%204%200%203v1l-1%206%201%205c0%202%201%204%203%205l2%204%201%202c1%200%201%2010-1%2010l-1%203-1%204-1%204-1%205c-1%201%200%202%201%203%201%202%201%202-1%202s-3-1-3-6l1-7c2-2%200-8-3-11-4-4-4-6%200-7l2-3c-1-2-3-3-3-1l-2%202-2%202c-1%201-5%202-5%200%200-1-1-1-1%201-1%202-2%205-2%2011l-1%206c-2%205%200%2019%202%2018h7l-3%201c-1%200-2%200-1%201l-3%201-3%201h-3l-4%201H57l3%201%204%201h2l3-1v1c-2%201%203%201%209-1%202%200%202%200%201%201-2%202-2%202%201%202l3-1h2l2-1h-1l-1-1c0-1%203-3%205-3v1l-2%203c-1%202%200%202%208%202l4%201-1%201v2l-1%202-49%201H0v90h12l21%202c10%201%2015%201%2037-3h4l-5-3-5-2%207%201c19%201%2031%200%2020-3l-23-7h5a832%20832%200%200087%200c32%200%2036%200%2032%201l-11%202c-7%202-9%202-10%201h-1c-1%202-1%202%204%204l4%201-4%201c-2%202-4%202-7%202h-4l-2-1h-4l-2%201h-3l-3-1c0-1-3-1-4%201l-1%202%203%201%209%202c8%202%2013%203%2013%201-1-1%200-1%206-1l8%201%206%201%2011%201h10c0%202%2019%205%2041%206l15%201v12h6c6%200%207-1%207-7l1-5%201-3v-4c2-4%203-6%203-11%200-4%200-4%204-4%203-1%204%200%205%204l3%205%201%203%203%203%201%201v4c-1%207-2%2011-4%2010-3-1-6%200-5%202h4l3%201h2c2%201%2013%201%2012-1v-9c0-5-1-7-2-8v-2l-4-8-4-9c1-1%2023-2%2025%200%201%200%201%201-1%201-3%203%2019%206%2030%204%207-1%206-1-2-2-9-2-5-2%209-2%209%200%2013%200%2011-1-5-1-5-2%200-2l15%201h10v6c0%204%200%205-2%205v-1c1-1%201-1-1-1l-2%201-4%201c-4%200-5%200-4%201%200%202-5%205-10%205l-7%202-8%201h-4l2%202c0%201-18%204-29%204l-11%201%202%201h4c2%201-3%202-7%201l-3%201%201%201%201%201c-1%201%200%202%202%202a133%20133%200%200033-1l-3%204c-4%201-1%202%206%202l6-1h7l18%201h13v-7l-10%201h-28l11-9a323%20323%200%200021-4c-1-1%200-1%202-3l4-2%201-46v-44h-40l-40-1%2028-1c17%200%2027%200%2025-1l-10-1-7-1%201-2c0-1%201-2%202-1l1-1-2-1h-1l-1%201c-4%200-2-3%203-4%204-1%205-2%203-8-3-7-3-12-1-12l1-1-2-1c-3%200-5-2-3-3s0-10-3-11v1c1%200%201%203-1%205l-1%203c0%204%200%205-3%205l-3%202h3c2%200%202%200%202%205%200%204%200%205-2%205l-2%202c-1%202-2%201-1-2l-1-5c-1-1-2-2-1-4l-1-3c-2%200-2-1-2-10l-1-12c-1-1-1%202-1%2011%200%208%200%2012-1%2011l-2%201c0%201-1%202-2%201-2%200-3%201%200%203%202%202%201%203-1%203s-3-1-3-2h-1l-1-1v-3l2-6c1-5%201-6-2-8l-2-4-1-1v-2c0-3-2-5-8-6-2-1-3-1-2%201l-1%201c-1-1-1%200-1%201h-4c-4%200-4%205-1%208%203%202%203%202%201%202-2%201-2%202-2%206l1%204h1l-1%202h-3l-2%201c-4-1-4%204-1%205%206%202%209%200%209-6l1-2c1%200%205%203%203%203s-4%203-3%206v9c-1%206-1%206-4%206s-4-1-2-3c1-1%200-3-1-2l-1-1-1-1-1%204c1%203%201%203-2%202h-4l-1-9-1-9c-1-1-2-2-1-4%200-3-3-7-5-5%200%201-1%202-3%202l-1%202-3%205c-2%202-2%204%201%204l1%202%201%201%201%203%201%204c3%200-2%205-5%206l-4%201h-2l-2-2-1-2c-2%200-3-5-3-13l-2-4-2-4c0-2-2-3-2-3-2%200-2-1-1-3l-1-2h-1l-7-1-1%203-2%201h-1l-1-1v5c2%203%201%203-4%209l-2%202-2-2c-1-1-2-3-1-4l-1-3-2%201h-1l-4%202c-1%201-2%202-3%201v-2c1-1%201-2-1-3l-2-2-2%202-2%201%201-2%201-1c-1-1%200-1%201-1l2-1h-1l-2-1c0-2-2-3-4-1h-2c0-2-2-1-1%201l1%202v2l-1%205%202%2010c2%208%202%208-5%208-4%200-5%201-5%202%200%202%200%202%202%201h5l4%201%205%201%204%202%206%201c1%201%201%201-1%201h-17l-8-2c-5-2-7-7-5-11%202-2-1-6-3-5l-2-1c-2-1-4%207-2%209%202%201%200%202-4%201-3-1-3-1-1-13l3-7c1%201%203%203%202%204l1%201c2-1%201-10-1-16-2-3-3-5-2-6%201-2%200-7-2-6l-2-1c0-2-3-1-3%201l-2%202c-1%200-2-1-1-2h-1c-3%204-3%206%201%205%203-1%203-1%203%201s-2%203-2%201h-5v1l-1%201-3-3c-2-3-4-4-5-2v2h-1l-1%202-2%204v-3l2-5c1-2%201-2-1-2-3-1-4%200-2%201l-1%204c-1%203-1%203-2%201s-1-2-2%202c-1%203-2%205-4%205h-3c0-2%202-3%204-3l1-2%201-3%201-4-4%203-2%202c-1-1-1%200-1%201l-1%202c-2%200-6%207-6%209l-1%201c-2%200-3%203-1%205l1%205c0%204%200%204-2%204-5%200-9%205-5%208%201%202%201%202%204%200%203-1%206-2%2014-1%206%200%206%201%200%202-4%200-6%201-4%202l-4%201-9%201h-5v-1l1-1c-1-1%200-1%201-1l1-1-3-1c-2%200-4-4-3-6h-1c-4%200-7-1-5-2v-4l-1-1-1-2-1-5v-2c-1-2%200-6%203-6%205-2%204-10-1-12h-2l2-1h5l1-2%203-1c1%200%201%201-1%202l-2%203%203-2c4-3%2013-1%2013%203%200%202%202%201%203-1%201-3%203-5%206-5s3%200%202-1c-2-1-2-1%200-1%201%200%202%200%201-1v-1l-2-1c-1%201-3%200-5-1l-2-2%204-3%207-2c2%200%203-2%202-4%200-2-2-2-4%200-1%202-9%202-13%200-3-2-4-2-4-1h-1c-2%200-3%200-2%202h-2l-3-1-1-1v-1l-1%201-1%201-2-2h-3l1-1-2-2c-3-1-4-2-3-3%201-3%201-17-1-17l-1%202m85%2015l-1%202-2%202-3%204-1%202c-5%204-3%208%204%2010%209%203%2017-8%2012-17-2-5-6-6-9-3M19%20245l-1%203c-1%202-1%202-3-1l-1-1v6c-1%201-1%200-1-1l-4%207-4%203-1%202c2%202-1%207-3%206-1-1-1-1-1%203v4h5c4%200%204%200%203-1l-1-3-1-2v-2c0-3%201-3%203-2%203%200%201%2013-1%2016l-2%202h2c5%200%209%200%2011-2l17-1h19c4-1%203-1-6-1l-16-1H20l2-1%203-1h-4c-4%201-5%200-2-2l1-2-2-1c0-1%201-2%203-2%206%200%208-2%207-5l-2-4c-2-2-3-9-3-12s-1-6-3-6l-1%202m32%2015c-2%200-4%206-3%207l-1%203h-2c-1-2-1-2-3-1h-3l-2%202%202%201h3l-3%201-2%201%202%201%207-2%205-1%202-1c2%200%203%200%202-3v-6c-1-2-1-3-4-2m343%207c-3%202-5%202-6%201-2-2-5-1-4%201l-10%204-11%204h25l7-2c-2-1-2-1%201-3%202-1%204-2%204-4s0-2-6-1m-219%202l-4%201c-5%201-5%201-2%202l3%202c0%202%203%203%2010%203%202%200%203%200%202%201l-4%201-14%204c-4%200-5-2-2-2s-2-2-6-2c-3%200-2%202%201%203%203%200%203%200%201%201s-2%201%201%201%203%200%202%201%2012%201%2034%201c33%200%2036-1%2019-3l-4-1c1-1%200-1-2-1-5%200-12-2-9-2%202%200%200-2-3-2-5%200-16-3-15-4%202-2%200-4-4-4h-4m71%209c-10%200-13%201-8%202h13c3-1%204-1%202%201l-2%203c0%202%203%202%2029%202%2029%200%2030%200%2027-4-1-2-3-2-10-1-15%202-37%202-35%200l4-1c3-1%203-1-1-1l-5-1-3-1-11%201m11%2042c-2%200-2%201-2%207l1%207%201-2%202-2c5%200%207-4%205-9-2-2-2-2-7-1m-54%2041l-3%203h-3l3%201%203%201-5%201c-3%201-5%203-5%204l-2%202c-3%200-1%202%202%201%203%200%205-2%203-2-3%200%208-3%2014-3h4l-1%201%2011-6-15-2-5-1h-1m47%200c-17%200-20%201-17%204%202%202%202%203%202%207l-1%205%205%201a293%20293%200%200027%205v-1l1%203%201%203%201-3%202-4%201-3v-2l-1-3-2-2h4c3-1%204-3%202-2l-2-1-1-1-6-5-16-1m-88%2031c-3%202-6%203-4%201l-1-1-2%201c-1%201%200%201%201%201v1l-3%201-2%201c-2%202-2%203-1%203l2-1%204-1%203-1-3%201c-3%202-3%202%206%202h9l-1-3-4-8-4%203'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"narrow":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsSAAALEgHS3X78AAAEVElEQVQ4y21UayycaRT+/vvjl19sm25T20VLd5edJsW4zpjBYLTGaK0q47LubRO6iYhqyLIJVkRco4KgWja7tu7XBnEnEloV9/v9Fgl59j2vzsRu9ktOzve973mf9znnPOcT5ubmsLi4iKWlJSwvL2N1dRVra2vY2tri67OzsygqKkJ6ejoGBgYwNjaGw8NDbG9v8xiyzc1NnQmXAVdWVjgYGW2S7+npQVNTEzo6OlBTUwOFQsHBd3d3sbOzw+O0oBsbGxDm5+c54GV2tLG3t4fR0VG0t7dzluPj4ygvL4dMJoOenh7i4+NxcHCgA9SCCgsLCzp2BEgbBEoXEKuuri40NzejtbUVxcXFsLa2hpGREaysrDA5OYn9/f1/gQpadgRIzGZmZlBbW4uqqirU19ejt7cXg4ODGBkZgVKphCAI0NfXh6GhIerq6nB8fKyr+f8CEuPGxkZu+fn5yMzMhEqlgkajgZmZGQc0MDCASCRCW1sb6Dk6OtI1SZeytoa0QcDkiUFqaioCAwMhkUgQFBQES0tLDmhhYQE/Pz/ExcVhaGiI15MD/rcpBKa9gNKurKyEv78/Z2ZsbAw7OzskJiYiNzcXCQkJiIqK4nFUSyLBAS+zXF9f5zdRCciT5vr7+xETEwNTU1Pk5OTwuPPzc5yenuLs7AwnJydcQjqGBEhGTMkmJib4Nz3EmjRHHW1oaOBMSFLampHXlomao0uZAGhhamqK1ywiIgKlpaVcEqTBkJAQDkqZaGtM7AmULqXMyAtEXws4PT3Np0IsFsPJyQnZ2dm8MQUFBejq7ubgdIiM0iwrK0NFRcUFOwZIWMIbpjkS72c2DX19fXy0HBwc8Pf79ygsLORSoe5SGUpKSpCUlMQvoAkKDQ2FWq1GXl4ehoeHMceyFZ4/e4YKNlKtLc3oZ4De3kp8w7oZHhaGWNYIicSZMc3Cu7dvERUZCVe5HA+ZXH7LyEBMdDRsbW0glUqQlZWJstevIUhUAXD118AnNAaq8Dg8CImGmY0zTO45wlrhA2VwBHzCYkFxtp4q7p2/nPnO0RW3bCWQ+j6Gd3Ak1BFPIdwQu+KO7D7MnD1hLlXittQLlgo17no9gvmX9VsSL/zgpoKluy/bV+KO/AHMXbx5HMVct5HhaxsXXLOWQqBgWUAYPIKjuLf3fQKXn0L5u5NfMOxUgXB+pIE8IJx7t8Cfeaz8cTg3kYca3zq446a9G4zFcghfWYlx5Ud7XBE54OpdR9y0Y2kwViaOCs7Y3EUJE3bAgjExZWvfu/rghq2Mn7nNyFy/J8E1do6yFHk+ZDV0kcHL+z4Unl54lZqGto5ONLW04kNvH/748y+k/ZqB2KfP4e7hCYr99HkWmVm/40mwBuWVVejo7EZefgE704aCopKLnwOJe35+junoQrSfPn7kMmhpaWGzXIFO9l+sq3uHIiajeqbLVykpqK6uxi8vXqCZ6TYtLRXJyclIefkS/wA8nocLH7tgqAAAAABJRU5ErkJggg==","aspectRatio":1,"src":"/static/96cc0c73a4e35c7fe3e8d7299b488a0e/502b1/cover.png","srcSet":"/static/96cc0c73a4e35c7fe3e8d7299b488a0e/f2e6d/cover.png 114w,\n/static/96cc0c73a4e35c7fe3e8d7299b488a0e/4ddba/cover.png 229w,\n/static/96cc0c73a4e35c7fe3e8d7299b488a0e/502b1/cover.png 457w,\n/static/96cc0c73a4e35c7fe3e8d7299b488a0e/7ddc2/cover.png 686w,\n/static/96cc0c73a4e35c7fe3e8d7299b488a0e/435bf/cover.png 914w,\n/static/96cc0c73a4e35c7fe3e8d7299b488a0e/6050d/cover.png 1200w","srcWebp":"/static/96cc0c73a4e35c7fe3e8d7299b488a0e/15384/cover.webp","srcSetWebp":"/static/96cc0c73a4e35c7fe3e8d7299b488a0e/31fce/cover.webp 114w,\n/static/96cc0c73a4e35c7fe3e8d7299b488a0e/e3e25/cover.webp 229w,\n/static/96cc0c73a4e35c7fe3e8d7299b488a0e/15384/cover.webp 457w,\n/static/96cc0c73a4e35c7fe3e8d7299b488a0e/0258d/cover.webp 686w,\n/static/96cc0c73a4e35c7fe3e8d7299b488a0e/64ea2/cover.webp 914w,\n/static/96cc0c73a4e35c7fe3e8d7299b488a0e/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='M197%201l-1%202-1%201c-2%200-2%200-2%202l-2%204-1%201v3l-3-1c-1-1-1-1-1%201l-1%203c-2%201%201%203%206%204%204%202%205%202%206%200l3-1v-1l2-3h3l4%202c3%200%204%200%203-1%200-2%201-2%204-2l4%201-4%201c-2%200-2%200-1%201h5l2-1c-2%200%200-2%203-2%205%200%2013%205%2012%207v3l-2%201c-4%201-4%203%202%204l3%202h-3l-1%201%203%201c4-1%204%201%200%204l-2%203h-4c-4%200-4%200-2%201%203%201%203%203%200%202l-3%201v1l1%201c-1%201%200%201%202%201l6%203%204%203%201%201c0%202-11%202-12%201h-4l-4%201c-3%201-2%201%2011%203l17%205%203%201h-3c-3%200-3%200-1%201%203%202-3%202-12%201h-12l9%203c8%200%207%201%200%201l-10%201%201%201%202%201h5c2%201%202%201%200%201s-3%201%200%203c1%201%201%201-1%201-4%200-6%202-3%202h3l-2%202c-2%201-3%203-3%205l-1%202c-2-1-1%200%201%202v2c-2%200-2%203%200%205%202%201-2%202-11%201-7%200-7%200-6%201l3%202c2%200%202%201%203%203%200%202%200%202-2%202l-2-1%201-1-1-1c-1%200-2%200-1%201l-3%201-8-1-13-3h-9l-8-1-10-2c-3%200-8-4-8-6h-1l-1-1v-3h2c4%201%203-2-2-4-6-3-6-3-6%200s0%203-6%202c-4%200-5%200-4%201l6%201c3%200%204%200%204%202l4%2017h7l-2-3-1-2c1%201%203%200%204-1%202-1%206%200%206%202%200%201%202%202%2010%203h4c1%201%205%203%206%202l1%204c0%204%202%206%2010%208l3%201-3%201c-4%202-7%201-28-5-19-6-18-5-16-4l31%2010c12%203%2012%203%2014%201s3-3%203%200l-2%201-1%202%207%201%202%201-3%201h-3v1l20%204a1141%201141%200%200080%2013c4%202%205%202%206%201v-1l-1-1%203%201c4%201%2040%202%2047%201%204-1%208-4%208-6l-6-7%201%202c5%206%201%2010-10%2011-3%200-4%200-3-1%2012-2%2015-4%2011-9l-1-3v-1h-2c-2%200-2%200-1-1h-1c-2%200-2%200-1-1v-1h-1l-1-1h-1l-1-1h-2c1-1-21-9-22-8l-1-1-2-2-2-4c-1-1-1-1-1%201v4l-10-3%201-7c2-6%202-11%202-19%201-15%200-18-3-18l-16-3%209%201c10%201%2011%200%201-2l-6-1%206%201c8%200%208%201%201-14a85%2085%200%2000-72-45c-8%200-11-1-11-5h-2l-1-1V4c2-2%201-3-3-4-1%200-2%201-2%204%200%204-1%205-5%204h-4V1m-27%2071c-1%202%201%204%202%202%202-1%2012%200%2031%206l9%201%206%201%203%201c3%200-2-3-6-4-15-4-22-5-22-4h-5l-6-2-5-2h-5c-1-1-2-1-2%201m-49%2010l-7%203c-2%200-3%204-2%204l18%201-1-4-1-2c0%202%200%202-3%200l-3-2h-1m94%2036l-1%208c0%203%202%203%203%200%200-1%201-2%203-1l13-2h-4c-5%200-7-1-7-5%200-2%201-3%206-3l6-1h-7l-9-2c-3%200-3%200-3%206m-61%209c2%205%204%207%205%206%201-2%2019%205%2031%2011l7%204h-16v-1h-3l-5-1v1l-1-1c-1-2-6-3-6-2l19%2015%204%203c-1%200-1%202%201%204%201%201%201%201%202-1%200-2%200-2%205-1l3%202v9c0%205%200%206%201%204l1-9v-4l8%202%209%202v4c0%203%200%204-2%204v1c1%201%201%201-1%201l-7%201c-7%201-3%203%207%203%204%200%204%200%204%204s2%204%203%200c0-3%201-3%203-3%206%200%2016-1%2018-3%201-1%201-1-1-1l-2-1-3-1c-4%200-4-9-1-9a97%2097%200%200043-20l-18-3a935%20935%200%2001-108-20m141%203v4l1%202c0%202%201%202%207%202l6-1v-1c2-2-2-5-9-8-2-1-3%200-5%202m-82%205a552%20552%200%200075%2012h2l-2-1-4-2h-4l-15-2a1049%201049%200%2001-52-7m-59%202c-2%200-2%201-1%201v3l1%201h-2v1c2%202%202%202%200%202v1c2%202%201%203-2%204s-4%203-1%204c4%202%209%201%2012-2%207-7%201-19-7-15m-33%2051v4l-1%202c-2%200-2%201-2%203s0%203%202%203l1%202-1%202-2%201c-2%200-7-7-7-10h-1l-1%203c0%203%200%203%201%202s1-1%202%201l-1%204v4c-2%200-2-3-1-5%202-2%201-2-3-1-4%200-5%204-3%206l2%202-4-2c-2-2-2-2-4-1-3%201-3%204%200%203v1l-1%206%201%205c0%202%201%204%203%205l2%204%201%202c1%200%201%2010-1%2010l-1%203-1%204-1%204-1%205c-1%201%200%202%201%203%201%202%201%202-1%202s-3-1-3-6l1-7c2-2%200-8-3-11-4-4-4-6%200-7l2-3c-1-2-3-3-3-1l-2%202-2%202c-1%201-5%202-5%200%200-1-1-1-1%201-1%202-2%205-2%2011l-1%206c-2%205%200%2019%202%2018h7l-3%201c-1%200-2%200-1%201l-3%201-3%201h-3l-4%201H57l3%201%204%201h2l3-1v1c-2%201%203%201%209-1%202%200%202%200%201%201-2%202-2%202%201%202l3-1h2l2-1h-1l-1-1c0-1%203-3%205-3v1l-2%203c-1%202%200%202%208%202l4%201-1%201v2l-1%202-49%201H0v90h12l21%202c10%201%2015%201%2037-3h4l-5-3-5-2%207%201c19%201%2031%200%2020-3l-23-7h5a832%20832%200%200087%200c32%200%2036%200%2032%201l-11%202c-7%202-9%202-10%201h-1c-1%202-1%202%204%204l4%201-4%201c-2%202-4%202-7%202h-4l-2-1h-4l-2%201h-3l-3-1c0-1-3-1-4%201l-1%202%203%201%209%202c8%202%2013%203%2013%201-1-1%200-1%206-1l8%201%206%201%2011%201h10c0%202%2019%205%2041%206l15%201v12h6c6%200%207-1%207-7l1-5%201-3v-4c2-4%203-6%203-11%200-4%200-4%204-4%203-1%204%200%205%204l3%205%201%203%203%203%201%201v4c-1%207-2%2011-4%2010-3-1-6%200-5%202h4l3%201h2c2%201%2013%201%2012-1v-9c0-5-1-7-2-8v-2l-4-8-4-9c1-1%2023-2%2025%200%201%200%201%201-1%201-3%203%2019%206%2030%204%207-1%206-1-2-2-9-2-5-2%209-2%209%200%2013%200%2011-1-5-1-5-2%200-2l15%201h10v6c0%204%200%205-2%205v-1c1-1%201-1-1-1l-2%201-4%201c-4%200-5%200-4%201%200%202-5%205-10%205l-7%202-8%201h-4l2%202c0%201-18%204-29%204l-11%201%202%201h4c2%201-3%202-7%201l-3%201%201%201%201%201c-1%201%200%202%202%202a133%20133%200%200033-1l-3%204c-4%201-1%202%206%202l6-1h7l18%201h13v-7l-10%201h-28l11-9a323%20323%200%200021-4c-1-1%200-1%202-3l4-2%201-46v-44h-40l-40-1%2028-1c17%200%2027%200%2025-1l-10-1-7-1%201-2c0-1%201-2%202-1l1-1-2-1h-1l-1%201c-4%200-2-3%203-4%204-1%205-2%203-8-3-7-3-12-1-12l1-1-2-1c-3%200-5-2-3-3s0-10-3-11v1c1%200%201%203-1%205l-1%203c0%204%200%205-3%205l-3%202h3c2%200%202%200%202%205%200%204%200%205-2%205l-2%202c-1%202-2%201-1-2l-1-5c-1-1-2-2-1-4l-1-3c-2%200-2-1-2-10l-1-12c-1-1-1%202-1%2011%200%208%200%2012-1%2011l-2%201c0%201-1%202-2%201-2%200-3%201%200%203%202%202%201%203-1%203s-3-1-3-2h-1l-1-1v-3l2-6c1-5%201-6-2-8l-2-4-1-1v-2c0-3-2-5-8-6-2-1-3-1-2%201l-1%201c-1-1-1%200-1%201h-4c-4%200-4%205-1%208%203%202%203%202%201%202-2%201-2%202-2%206l1%204h1l-1%202h-3l-2%201c-4-1-4%204-1%205%206%202%209%200%209-6l1-2c1%200%205%203%203%203s-4%203-3%206v9c-1%206-1%206-4%206s-4-1-2-3c1-1%200-3-1-2l-1-1-1-1-1%204c1%203%201%203-2%202h-4l-1-9-1-9c-1-1-2-2-1-4%200-3-3-7-5-5%200%201-1%202-3%202l-1%202-3%205c-2%202-2%204%201%204l1%202%201%201%201%203%201%204c3%200-2%205-5%206l-4%201h-2l-2-2-1-2c-2%200-3-5-3-13l-2-4-2-4c0-2-2-3-2-3-2%200-2-1-1-3l-1-2h-1l-7-1-1%203-2%201h-1l-1-1v5c2%203%201%203-4%209l-2%202-2-2c-1-1-2-3-1-4l-1-3-2%201h-1l-4%202c-1%201-2%202-3%201v-2c1-1%201-2-1-3l-2-2-2%202-2%201%201-2%201-1c-1-1%200-1%201-1l2-1h-1l-2-1c0-2-2-3-4-1h-2c0-2-2-1-1%201l1%202v2l-1%205%202%2010c2%208%202%208-5%208-4%200-5%201-5%202%200%202%200%202%202%201h5l4%201%205%201%204%202%206%201c1%201%201%201-1%201h-17l-8-2c-5-2-7-7-5-11%202-2-1-6-3-5l-2-1c-2-1-4%207-2%209%202%201%200%202-4%201-3-1-3-1-1-13l3-7c1%201%203%203%202%204l1%201c2-1%201-10-1-16-2-3-3-5-2-6%201-2%200-7-2-6l-2-1c0-2-3-1-3%201l-2%202c-1%200-2-1-1-2h-1c-3%204-3%206%201%205%203-1%203-1%203%201s-2%203-2%201h-5v1l-1%201-3-3c-2-3-4-4-5-2v2h-1l-1%202-2%204v-3l2-5c1-2%201-2-1-2-3-1-4%200-2%201l-1%204c-1%203-1%203-2%201s-1-2-2%202c-1%203-2%205-4%205h-3c0-2%202-3%204-3l1-2%201-3%201-4-4%203-2%202c-1-1-1%200-1%201l-1%202c-2%200-6%207-6%209l-1%201c-2%200-3%203-1%205l1%205c0%204%200%204-2%204-5%200-9%205-5%208%201%202%201%202%204%200%203-1%206-2%2014-1%206%200%206%201%200%202-4%200-6%201-4%202l-4%201-9%201h-5v-1l1-1c-1-1%200-1%201-1l1-1-3-1c-2%200-4-4-3-6h-1c-4%200-7-1-5-2v-4l-1-1-1-2-1-5v-2c-1-2%200-6%203-6%205-2%204-10-1-12h-2l2-1h5l1-2%203-1c1%200%201%201-1%202l-2%203%203-2c4-3%2013-1%2013%203%200%202%202%201%203-1%201-3%203-5%206-5s3%200%202-1c-2-1-2-1%200-1%201%200%202%200%201-1v-1l-2-1c-1%201-3%200-5-1l-2-2%204-3%207-2c2%200%203-2%202-4%200-2-2-2-4%200-1%202-9%202-13%200-3-2-4-2-4-1h-1c-2%200-3%200-2%202h-2l-3-1-1-1v-1l-1%201-1%201-2-2h-3l1-1-2-2c-3-1-4-2-3-3%201-3%201-17-1-17l-1%202m85%2015l-1%202-2%202-3%204-1%202c-5%204-3%208%204%2010%209%203%2017-8%2012-17-2-5-6-6-9-3M19%20245l-1%203c-1%202-1%202-3-1l-1-1v6c-1%201-1%200-1-1l-4%207-4%203-1%202c2%202-1%207-3%206-1-1-1-1-1%203v4h5c4%200%204%200%203-1l-1-3-1-2v-2c0-3%201-3%203-2%203%200%201%2013-1%2016l-2%202h2c5%200%209%200%2011-2l17-1h19c4-1%203-1-6-1l-16-1H20l2-1%203-1h-4c-4%201-5%200-2-2l1-2-2-1c0-1%201-2%203-2%206%200%208-2%207-5l-2-4c-2-2-3-9-3-12s-1-6-3-6l-1%202m32%2015c-2%200-4%206-3%207l-1%203h-2c-1-2-1-2-3-1h-3l-2%202%202%201h3l-3%201-2%201%202%201%207-2%205-1%202-1c2%200%203%200%202-3v-6c-1-2-1-3-4-2m343%207c-3%202-5%202-6%201-2-2-5-1-4%201l-10%204-11%204h25l7-2c-2-1-2-1%201-3%202-1%204-2%204-4s0-2-6-1m-219%202l-4%201c-5%201-5%201-2%202l3%202c0%202%203%203%2010%203%202%200%203%200%202%201l-4%201-14%204c-4%200-5-2-2-2s-2-2-6-2c-3%200-2%202%201%203%203%200%203%200%201%201s-2%201%201%201%203%200%202%201%2012%201%2034%201c33%200%2036-1%2019-3l-4-1c1-1%200-1-2-1-5%200-12-2-9-2%202%200%200-2-3-2-5%200-16-3-15-4%202-2%200-4-4-4h-4m71%209c-10%200-13%201-8%202h13c3-1%204-1%202%201l-2%203c0%202%203%202%2029%202%2029%200%2030%200%2027-4-1-2-3-2-10-1-15%202-37%202-35%200l4-1c3-1%203-1-1-1l-5-1-3-1-11%201m11%2042c-2%200-2%201-2%207l1%207%201-2%202-2c5%200%207-4%205-9-2-2-2-2-7-1m-54%2041l-3%203h-3l3%201%203%201-5%201c-3%201-5%203-5%204l-2%202c-3%200-1%202%202%201%203%200%205-2%203-2-3%200%208-3%2014-3h4l-1%201%2011-6-15-2-5-1h-1m47%200c-17%200-20%201-17%204%202%202%202%203%202%207l-1%205%205%201a293%20293%200%200027%205v-1l1%203%201%203%201-3%202-4%201-3v-2l-1-3-2-2h4c3-1%204-3%202-2l-2-1-1-1-6-5-16-1m-88%2031c-3%202-6%203-4%201l-1-1-2%201c-1%201%200%201%201%201v1l-3%201-2%201c-2%202-2%203-1%203l2-1%204-1%203-1-3%201c-3%202-3%202%206%202h9l-1-3-4-8-4%203'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"seo":{"src":"/static/96cc0c73a4e35c7fe3e8d7299b488a0e/6050d/cover.png"}}},{"id":"62d54027-c7c6-590e-8a64-c664a30230e3","slug":"/static-race","secret":false,"title":"Static race","author":"Luke Celitan","date":"March 22nd, 2024","dateForSEO":"2024-03-22T00:00:00.000Z","timeToRead":5,"excerpt":"A static serve race between nginx, actix, express and restify","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\": \"Static race\",\n  \"excerpt\": \"A static serve race between nginx, actix, express and restify\",\n  \"date\": \"2024-03-22T00:00:00.000Z\",\n  \"hero\": \"cover2.png\",\n  \"author\": \"Luke Celitan\",\n  \"appDescription\": \"Sever Analysis\",\n  \"category\": \"Post\",\n  \"tech\": [\"Rust\", \"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\": \"static-race-who-will-become-the-static-king-\"\n  }, \"Static race, who will become the static king ?\"), mdx(\"p\", null, \"In the world of web development, the choice of server framework can\\nsignificantly impact the performance and efficiency of a website. In the most\\nreal life scenarios you will need an instance to serve static assets to the\\nclient whatever application you are building. Html, css, jss, images and others\\nstatic assets are the backbone of any frontend.\"), mdx(\"p\", null, \"Static serving is the most cheapest and most reliable way to deliver content on\\nthe intrent so far. Until you start moving your assetes to CDN providers, most\\nlikely you will decide the serve the static files localy.\"), mdx(\"p\", null, \"I decided to create a simple test to find out which serving option is the most\\nperformant on my own.\"), mdx(\"p\", null, \"Today, we\\u2019re diving into a comparative analysis of four different server\\nframeworks: Actix, Express, Nginx, and Restify. The focus of this comparison is\\non the average wait times for a browser to download resources from the server,\\nincluding HTML and images.\"), mdx(\"blockquote\", null, mdx(\"p\", {\n    parentName: \"blockquote\"\n  }, \"The data presented in the data analysis reflects the results from 2000 calls\\nper each server requesting a simple HTML site with a single 12.7MB image.\")), mdx(\"p\", null, \"This metric is crucial as it gives us insight into the responsiveness of each\\nserver framework under load. Additionally, the \\u2018HTML + Image Stack\\u2019 represents\\nthe total time needed to stream the website to the client, including all\\nresources, with 1000 calls each.\"), mdx(\"h2\", {\n    \"id\": \"test-methodology\"\n  }, \"Test Methodology\"), mdx(\"p\", null, \"The test was straightforward: open a static website consisting of a simple HTML\\npage (200kb) and a single image (12.7mb) and download it fully to the client\\nbrowser.\"), mdx(\"p\", null, \"All applications are running on the same machine, boasting 2GB of RAM and SSD\\nstorage, and were tested sequentially to ensure fairness. Each application has a\\nSSL let\\u2019s encrypt certificate and is located in the same region (Warsaw).\"), mdx(\"p\", null, \"The links for reference\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://nginxtest.spaceout.pl/\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"https://nginxtest.spaceout.pl/\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://expresstest.spaceout.pl/\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"https://expresstest.spaceout.pl/\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://astrox.spaceout.pl/rustTest\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"https://astrox.spaceout.pl/rustTest\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"https://restifytest.spaceout.pl/\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"https://restifytest.spaceout.pl/\"))), mdx(\"p\", null, \"All application were created with minimal reproduction except for rust based\\nactix, astro x website is a another rust based project, I am working on, i has\\nsome more middlewares but still serves as a static server as well.\"), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Html markup used in the test\")), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-html\"\n  }, \"<!DOCTYPE html>\\n<html>\\n  <head>\\n    <title>Express Static Files Test</title>\\n  </head>\\n  <body>\\n    <h1>Nginx Static Files Test</h1>\\n    <img src=\\\"./webdev2.png\\\" alt=\\\"Web Development Image\\\" />\\n  </body>\\n</html>\\n\")), mdx(\"p\", null, mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"Test Picture\")), mdx(\"p\", null, \"This is the test picture we will be stressing my hosting with. Here obviously\\noptimized, but in the test the upscaled 12.7MB version was used. Definetly\\nchosen in order to get some bigger diffrences in how framework utilize bigger\\ni/o operations.\"), mdx(\"p\", null, mdx(\"span\", {\n    parentName: \"p\",\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"4096px\"\n    }\n  }, \"\\n      \", mdx(\"span\", {\n    parentName: \"span\",\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"100%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAIAAAAC64paAAAACXBIWXMAAAsTAAALEwEAmpwYAAAEwUlEQVQ4yz2PW0xTBxzGz6ZS0GkQ2tJSaoFKgSrrDeg5nF5OS9vT09N7T0+hN6CtQikVSstlUBSi4AWncdFtAg5BLhFxbsa5ZZtzmT44H4zJsi1zOrdByyRuLmYPe3N1S5b88j39f1++P5A6K0udlacnlekpZWpSuTqhTJ9D/md1EklN/cukMjWlWHn3JemJTMpX3pEB6en6XybVjyfV6VldahZdnUHTF/QvmcOeLOB/LpvWFgzpOcP6omFtHkvN6lMzaGpGtzKtTZ/XAusXzWuLppV54/qy9en7jrVLjj+uun6/1vjkA/LRguPj4+jKZddvHzZ8d8H+6xKxtkw8uUysLppX5oyrcziQWrKtX214es3zw6Lrm/mGZ1+03jpj/Oho/d93YpfGHah09+3z/kfXwwNNhq/PB57dbHuw7H28RD6cMf34ngG4f0r1YNb2/PPg0kHr0XbTi9XT+yNGDw6++OvSvU/HtJKKn++eev7w3HiE/OnG2PNvjx8K49eP4N9PGe+9bQBuHZF/OSq/NoYfCevGI4b7nx1sD+pDPu29m6en3+qDaoVTJ3o+WTjUGzJdmei9e2XoZASbT2J3ThtvnzICXx1TT/dquv1YvMXYE8D2eBROJ+yxSZtNCKHT+u1mu1btN6OtLu1wxD4eJ+JNsElbHW9S3jhhAhaSaNyv8eHSfY3qoFXhtcncXsTvRnAEtmjgqM9I4hq/Dbfr4HgLFg/gZgxSK8SoUnRxxACciaMxtypgBq2oLORQO3QSmXyXUQ8ioDTmRS+MNuvlUlAk9JrVjQbIhYEKSCAVV8pqKs8N4hlZPxZGLRoQgkA1LLHraxGVQCbmmpUCs7r2ZIL0m2GpgJ8I2Ee7HCGyXq+BzXqlA6udHbEDBK48HMGaLfIKHq+IWUDaZd7meo8FElYUCfncBqNiKKzz4mLSIH+zv9Hj0IBKuB5VNROKqaQN6Aw6R9tMCZ+2EZe2O2VOizTUoh/qINhMelVFCa6SuAxQ7x7LQJvlWI/Lqof4VbsE1aIQiUwMOIBYkOxwIISmusuvHe+0BEhZh9/gxKDiInrmyahPP9pNdgfw/lbb2ZGWJptcIqmqrhH6LIo+rwbA1fDWLVvKigsbcfBw1O41IS4c7mu1Rp1IyCZn0PJAAY9dSIPEwiCB+SwwAgm0aojQy0Q8NsDbwdqwcROvhOU1Qj6DvLyUS6fmZYbsNdZRc7cCr27YlEXZnpubk7O5lM0gdTUqsApFasrKShARD2Ax6BlZzC/xGuvarCoOk7oxi7KTzUg4ERzanXGzs7M352RvysraS6psKjFYxdVCglwa7bUtmwGsTlxXVV7GYXDZBWFrvVVRTaFQcrdtrSwuLOcwt+duK6Buz1SUFjEORQlReTHI5+rqRNRCFoueD8Di1w1wdQW3hMkoYNBpO3ewKks5lSVsAHiFW1QgLGMXM6k52dk1u3baVBJOIY1Fp1Lz8/Jp1BwKBQh3xYKRaDDcvrcj6mhoUCAIn19Jp9OYDAanmMMsZOXlU2nUfKFE7HK73X4/4fE43W4rQVgIAuhJ7u87MNx3YCSTicFkd/9AV/8brfv2hTu74gODieRQfDDZ1tkVjsV6hv67HO7df6AnmUwMDvwD/xuxW/BgrjoAAAAASUVORK5CYII=')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  }), \"\\n  \", mdx(\"picture\", {\n    parentName: \"span\"\n  }, \"\\n          \", mdx(\"source\", {\n    parentName: \"picture\",\n    \"srcSet\": [\"/static/ed94921b7dc3ff52596570b15cc5ba1f/a3bc4/webdev2.webp 2500w\", \"/static/ed94921b7dc3ff52596570b15cc5ba1f/0b20a/webdev2.webp 4096w\"],\n    \"sizes\": \"(max-width: 4096px) 100vw, 4096px\",\n    \"type\": \"image/webp\"\n  }), \"\\n          \", mdx(\"source\", {\n    parentName: \"picture\",\n    \"srcSet\": [\"/static/ed94921b7dc3ff52596570b15cc5ba1f/412e4/webdev2.png 2500w\", \"/static/ed94921b7dc3ff52596570b15cc5ba1f/120cf/webdev2.png 4096w\"],\n    \"sizes\": \"(max-width: 4096px) 100vw, 4096px\",\n    \"type\": \"image/png\"\n  }), \"\\n          \", mdx(\"img\", {\n    parentName: \"picture\",\n    \"className\": \"gatsby-resp-image-image\",\n    \"src\": \"/static/ed94921b7dc3ff52596570b15cc5ba1f/120cf/webdev2.png\",\n    \"alt\": \"Web Dev Commandos\",\n    \"title\": \"Web Dev Commandos\",\n    \"loading\": \"lazy\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    }\n  }), \"\\n        \"), \"\\n    \")), mdx(\"h3\", {\n    \"id\": \"the-test\"\n  }, \"The Test\"), mdx(\"p\", null, \"A simple simulation of a desepearte user clicking refresh 1000 times and waiting\\neach time before the images finshes to load, created using playwright e2e\\nframework\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-js\"\n  }, \"import { chromium, Browser, Page } from 'playwright';\\nimport { test } from '@playwright/test';\\nimport { PlaywrightHar } from 'playwright-har';\\n\\ntest('should reload page 1000 times and generate HAR file', async () => {\\n  test.setTimeout(1200000000);\\n  const browser = await chromium.launch();\\n  const context = await browser.newContext({\\n    extraHTTPHeaders: {\\n      'Cache-Control': 'no-cache, no-store, must-revalidate',\\n    },\\n    recordHar: { path: './hars/nginx.har' },\\n  });\\n  const page = await context.newPage();\\n\\n  const playwrightHar = new PlaywrightHar(page);\\n  await playwrightHar.start();\\n\\n  await page.goto('https:/nginxtest.spaceout.pl');\\n  await page.waitForLoadState('networkidle');\\n  await page.waitForFunction(() => {\\n    const images = Array.from(document.querySelectorAll('img'));\\n    return images.every((img) => img.complete);\\n  });\\n\\n  const reloads = Array.from({ length: 1000 });\\n  for await (const _ of reloads) {\\n    await page.reload();\\n    await page.waitForFunction(() => {\\n      const images = Array.from(document.querySelectorAll('img'));\\n      return images.every((img) => img.complete);\\n    });\\n    await page.waitForLoadState('networkidle');\\n  }\\n\\n  await playwrightHar.stop('./hars/nginx.har');\\n  await browser.close();\\n});\\n\")), mdx(\"h2\", {\n    \"id\": \"data-analysis\"\n  }, \"Data Analysis\"), mdx(\"h3\", {\n    \"id\": \"fastest-and-slowest-runs\"\n  }, \"Fastest and slowest runs\"), mdx(MinMaxServerChart, {\n    html: minMaxHtml.sort(function (a, b) {\n      return a.min - b.min;\n    }),\n    image: minMaxImage.sort(function (a, b) {\n      return a.min - b.min;\n    }),\n    mdxType: \"MinMaxServerChart\"\n  }), mdx(\"p\", null, \"Actix, a server framework written in Rust, has been turning heads with its\\nimpressive HTML return times. It clocked in at a blistering 34.154ms, showcasing\\nthe efficiency of Rust\\u2019s design for concurrent web services. Nginx, the stalwart\\nof high-performance web servers, is hot on Actix\\u2019s heels with a return time of\\n34.349ms. This close competition highlights the advancements in web server\\ntechnology and the fine margins that separate the top performers.\"), mdx(\"p\", null, \"When it comes to handling larger files, Nginx takes the lead. It served a 12.7MB\\nfile in just 596.061ms, edging out Actix, which completed the task in 612.17ms.\\nThis demonstrates Nginx\\u2019s robustness and its ability to handle a mix of tasks\\nwithout breaking a sweat.\"), mdx(\"p\", null, \"Node.js-based solutions, while versatile and popular, show significantly higher\\nmaximum scores in these benchmarks. The Express framework, for instance, has\\ngained notoriety for being slower in HTML delivery. Similarly, Restify leads the\\npack in the image serving category, albeit on the slower end of the spectrum.\"), mdx(\"h3\", {\n    \"id\": \"average-serving-time\"\n  }, \"Average serving time\"), mdx(\"p\", null, \"Avarage wait times for a browser to download the resource from the server. \\u201CAll\\u201D\\ncolumn represents all 2000 calls for html and one 12.7mb image.\"), mdx(\"p\", null, \"The html + image stack represents the total time needed to stream the website\\nthe client with all resources, 1000 calls each.\"), mdx(AvgServerChart, {\n    data: avg.sort(function (a, b) {\n      return a.all - b.all;\n    }),\n    mdxType: \"AvgServerChart\"\n  }), mdx(\"p\", null, \"On an avarage \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"the fastest serving framework is the rust based actix server,\\nwith an avarage serving time of 559.72ms (0.55s)\"), \", it is also a winner in the\\nthe html (45.48ms) and image category (972.60ms).\"), mdx(\"h3\", {\n    \"id\": \"in-details-comparison\"\n  }, \"In details comparison.\"), mdx(\"p\", null, \"The min, avg, max analysis suggests that the Actix is the most preformant\\nframework. I have prepared the funnel and scatter charts to help anlayse the\\noverall spread and stability of each framework.\"), mdx(\"h4\", {\n    \"id\": \"actix-httpsactixrs\"\n  }, \"Actix (\", mdx(\"a\", {\n    parentName: \"h4\",\n    \"href\": \"https://actix.rs/\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"https://actix.rs/\"), \")\"), mdx(\"p\", null, \"Actix is a powerful, pragmatic, and extremely fast web framework for Rust. It is\\nbuilt on the Actor Model, which allows applications to be written as a group of\\nindependently executing but cooperating \\u201CActors\\u201D that communicate via messages.\\nThis model offers high performance and scalability through its asynchronous\\nprogramming model and lightweight design\"), mdx(\"blockquote\", null, mdx(\"p\", {\n    parentName: \"blockquote\"\n  }, \"Actix is the average request time category winner, with solid numbers to back\\nit up, for 1000 requests most of them were delivered better than the\\ncompetition in both html and image file\")), mdx(\"p\", null, \"The scatter graph indicates solid and consistent content delivery, overall it\\nlooks like the most stable way to server static content on the web.\"), mdx(\"div\", {\n    className: \"chartGridHolder\"\n  }, mdx(FunnelTime, {\n    data: actixData,\n    mdxType: \"FunnelTime\"\n  }), mdx(ScatterChart, {\n    data: actixData,\n    fill: '#d83e09',\n    mdxType: \"ScatterChart\"\n  })), mdx(\"h4\", {\n    \"id\": \"nginx-httpswwwnginxcom\"\n  }, \"Nginx (\", mdx(\"a\", {\n    parentName: \"h4\",\n    \"href\": \"https://www.nginx.com/\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"https://www.nginx.com/\"), \")\"), mdx(\"p\", null, \"Nginx, pronounced as \\u201Cengine-x\\u201D, is a versatile web server that has gained\\npopularity for its high performance, stability, and low resource usage.\\nInitially released in 2004 by Russian developer Igor Sysoev, Nginx was designed\\nto address the C10k problem, which is the challenge of handling ten thousand\\nconcurrent connections. Over the years, it has evolved to serve a variety of\\nroles including a reverse proxy, load balancer, mail proxy, and HTTP cache.\"), mdx(\"blockquote\", null, mdx(\"p\", {\n    parentName: \"blockquote\"\n  }, \"Nginx is the fastest responder in this test, will overall solid scores.\\nDefinetly a good choice if possible, the data indicates it provides stable and\\nconsistent delivery. On avarage he was still 17.67%\", \"*\", \" behind Actix framework,\\nmaking it second best choice for serving static content\")), mdx(\"div\", {\n    className: \"chartGridHolder\"\n  }, mdx(FunnelTime, {\n    data: nginxData,\n    mdxType: \"FunnelTime\"\n  }), mdx(ScatterChart, {\n    data: nginxData,\n    fill: '#fe5218',\n    mdxType: \"ScatterChart\"\n  })), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\"\n  }, \"* slower % calculation\\n\\nDifference = Score - Base = 599 ms - 509.040587 ms = 89.959413 ms\\nPercentage slower = (Difference / Base) * 100 = (89.959413 ms / 509.040587 ms) * 100 \\u2248 17.67 %\\n\")), mdx(\"h4\", {\n    \"id\": \"express\"\n  }, \"Express\"), mdx(\"p\", null, \"Express.js, often referred to simply as Express, is the most popular backend web\\napplication framework for Node.js. Renowned for its minimalist and unopinionated\\napproach, it offers a robust set of features for web and mobile applications.\"), mdx(\"blockquote\", null, mdx(\"p\", {\n    parentName: \"blockquote\"\n  }, \"Express times are much more hectic and spread out than the nginx and actix,\\nwith a 25.65% slower times than rust based actix.\")), mdx(\"div\", {\n    className: \"chartGridHolder\"\n  }, mdx(FunnelTime, {\n    data: expressData,\n    mdxType: \"FunnelTime\"\n  }), mdx(ScatterChart, {\n    data: expressData,\n    fill: '#ff6c3d',\n    mdxType: \"ScatterChart\"\n  })), mdx(\"h4\", {\n    \"id\": \"restify-httpsrestifycom\"\n  }, \"Restify (\", mdx(\"a\", {\n    parentName: \"h4\",\n    \"href\": \"https://restify.com/\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"https://restify.com/\"), \")\"), mdx(\"p\", null, \"Restify.js is a Node.js web service framework designed for building efficient\\nand scalable RESTful web services. It is optimized for introspection and\\nperformance, making it a suitable choice for production use at scale. Restify.js\\nfocuses on providing a semantically correct implementation of REST, adhering\\nclosely to HTTP and REST specifications, which is reflected in its support for\\nRFC standards throughout its codebase and documentation.\"), mdx(\"blockquote\", null, mdx(\"p\", {\n    parentName: \"blockquote\"\n  }, \"The last runner on the list is restify which is 27.16% slower than actix. He\\nreally tried to beat express but in the end express image and average delivery\\nwas 1.51% slower than express\")), mdx(\"div\", {\n    className: \"chartGridHolder\"\n  }, mdx(FunnelTime, {\n    data: restifyData,\n    mdxType: \"FunnelTime\"\n  }), mdx(ScatterChart, {\n    data: restifyData,\n    fill: '#ff6c3d',\n    mdxType: \"ScatterChart\"\n  })), mdx(\"h3\", {\n    \"id\": \"final-thoughts\"\n  }, \"Final thoughts\"), mdx(\"p\", null, \"It looks like the best choice for serving static files is the Actix framework,\\nbut I would not be quiting on nginx just yet. Ngnix is still a great option\\nespecially with its build in features like load balancers, reverse proxy and\\nothers. If you are not building a rust based application the Nginx is the way to\\ngo.\"), mdx(\"p\", null, \"Node frameworks showed significantly weaker scores than the \\u201Cnative\\u201D drivers,\\nthis was especially seen on the large image transfers. In my opinion if the\\nperformance is what you are looking for the you should try to use underlying\\nservices for serving static content.\"), mdx(\"p\", null, \"The raw test data can be accessed at \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://github.com/MassivDash/staticRace\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"https://github.com/MassivDash/staticRace\")));\n}\n;\nMDXContent.isMDXComponent = true;","tech":["Rust","Nodejs"],"category":"Post","appDescription":"Sever Analysis","hero":{"full":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsSAAALEgHS3X78AAAEcklEQVQ4y21V+0+bVRjuv0BGyKD3q7SFQoECZcBKC1RaGu5k3MM9boAoYUEGrpbbSgQkwEQ3mFwyjMMIGIhhCwEdQX+BgCLhMi4rMf4Xj+c90OgSf3hy3nO+r8/7vO/7fKcChUIBtVqN8PBwxMbGIikpCVarFfn5+cjMzER2djZKS0tQUV7O44KCAv6MYpfLBafDyd/Ly8tFWVkZBHK5HDKZDBqNBgaDAVFRUTCbzZw4MTERNpsN6enpSElJgcViQVpaGt9TUnqWlZXFyPLQ0NCAwYEBCKRSKSQSCUipVqvlpDExMYiOjubwqyZyWhMSEviZ0WjkCVpaWjA0NIS5uTmsra1BQGR+qFQqTqrT6aDX6zk5tYJAZ7SPj49HOSufFJPKvr4+zM/PY3t7m4MrFIvFEIlEvHRSqlQqeV+pDUREhKSG2uFwONDf34/Z2VksLCxgZ2cHPp8PBwcHHAIiEwqFHBRTAuorKQ4MDER3dzf29vYwOTmJkZERXh6p6+rqwtbWFjY3N3F2doaTk5MrQlJGRH5i2t+4cYM3mkiSk5NRVFTEe/TL69dYXV1FW1sbh9PpRGNjI5aWlnB+fs4TC/xkpMhfNpVMvWxtbeVNJ9KcnBzY7Xa0t7djfHycW4XaMjU1hY6ODqysrODw8PBqKEQSFBTEbbC4uIjHY49RWVnJS6tia11dHZ8wTba5uZknKi0t5S3p7e3F8vIyH8zp6em/UyaVpIxUDA4O4tXLl9zEZF7yHk2XkhIZqaJk9fX1PJHb7eYlHx0dXRH6p0yrf7K5ubmoqa7mkyRSMq7H40FGRgbrWwNP0NnZyXtbWFjI1/39/f/YhiE4OJhnLi+vQEBAAGprazE6Osr7NvzFMCYmJjipyWRiVQxhZmYGx2y6f7LpUlUkQiBjFlGrNczIYbClpsLD7FBUXIzqmhrcvXcPxSUlaGxqgtfbjzJm6CdPnmKQWaeJna2vb2BqepopbmJfUhJuM68KVHIp3lPJYTZFo+OT+/hp+Ue4Ox+g+E4BNn9ex8baK/ww/x2qKsrw9fgY6murkOmww2ZJRkZ6KowGPSLCdLDeTkK2y8kI66chrnoG3YfzeP/z3+Aa3sadp4cIvfscqb0bqHn+Fo6BXxFzfxERH30Pel9ZNwVF7TdQ1DyD5oNZ6Bu/RXjzCxg/fgGBwnuJW1/+DfPYX9D2n0HrPYXe+wZKrw9CzymCOg8R8tkbSHouOOSPLiH3XoF+S3tZnw9SBnkPs42i+xjp4xfImfTBMnYB+1dvkTV5Ce2jEyi6T6DqZeQ9FB+/A3nX0TWuY3am9LBPT+n+HaKOXQgf7ELy6R7ELKa9nMXyh2x9uAfF/4B+9y7+gMa9C4HBdAs6YxyHNjIWKl0kFKEGSNVhECq0ECt1kGrCIVbpGPSQqPXseQR/Nyw6AZFxyTAlWmG22GGxuyAI04VCG6qBWsWuLTm7vmTsyxGzS0IYDFFIMIQhN68QfBPi6zOJKAQK5o5QDfvrYBM2RrJ7Ms6ENJsV/wBuwUQ2oclRXAAAAABJRU5ErkJggg==","aspectRatio":1,"src":"/static/8419c26418bf950f0604335b2cb7b494/a1946/cover2.png","srcSet":"/static/8419c26418bf950f0604335b2cb7b494/5b37e/cover2.png 236w,\n/static/8419c26418bf950f0604335b2cb7b494/49058/cover2.png 472w,\n/static/8419c26418bf950f0604335b2cb7b494/a1946/cover2.png 944w,\n/static/8419c26418bf950f0604335b2cb7b494/6050d/cover2.png 1200w","srcWebp":"/static/8419c26418bf950f0604335b2cb7b494/99fbb/cover2.webp","srcSetWebp":"/static/8419c26418bf950f0604335b2cb7b494/77392/cover2.webp 236w,\n/static/8419c26418bf950f0604335b2cb7b494/1f177/cover2.webp 472w,\n/static/8419c26418bf950f0604335b2cb7b494/99fbb/cover2.webp 944w,\n/static/8419c26418bf950f0604335b2cb7b494/9000d/cover2.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%20143v143h17l16-1h1l11%201h9l3-5c3-4%203-4%201-4s-2%200%200-3l4-3%201-1%207-8%206-7v-1l2-1c1%201%203-2%202-3-1-2%202-1%203%201%203%202%207%204%207%202l3-1c3%200%203%200%202-1l-1-2-1-1-2%201c-2%203-3%201-1-2l4-10%201-1v2h1l5-2h3l-2-2c-1-2-2-2-4-1-2%202-5%200-3-3v-9c-1-1-1-1%201-2h1v5c0%203%200%204%203%201h3l4%201c4-1%207%202%205%204l-4%208-5%207-1%203%202%2010c1%207%203%2010%2013%2019s10%209%2023%209h11l-4-5-4-5c-1%200-12-11-10-11l-3-2c-1-2-3-3-3-2l-1-1%201-5%201-2%203-4c2-4%204-5%204-2s1%203%202%204%201%201%201-1%200-2%201%200l2%202c2%201%202-2%200-6-1-2%200-3%201-3v1c0%202%209%2012%2015%2016%207%204%2011%204%2021-1l8-4%203%203c2%202%203%203%204%201s5%200%205%203l1%201v1c-2%202-2%202%201%205%205%203%205%208%202%209l-2%201-1%201h-1l-1%201h-2l-3%203-3%202h11c10%200%2019-2%2010-2-3%200-4%200-3-1%202%200%200-2-2-2l-2-1c0-2%204-3%206-3%203%201%208-3%209-5l1-3v-1l-3-3-1-2-2%202-4%202c-1-1-1-1%201-2%203-2%203-3-1-3l-3%201%203-1%203-2h-3l-5-1c-2-1-2-1%200-2%204-2%204-3-1-2h-4l2-1c4-2%204-3%201-3-2%201-2%201%200-1%201-1%201-1-2-1-9%202-9%202-5%200l3-3-2%201h-3c-1%200-1-1%201-1l2-2-4%201h-5c-1-1-1-1%201-2s2-1-1-1-5-3-2-3l-1-1c-2-1-2-1%200-1s3-1%200-3c-1-2-1-2%204-2l9%201c3%202%203%202%203%200%200-3-1-3-7-4-10-2-11-2-10-3h1l1-1-1-1v-6l4%202c2%203%2010%204%2010%201a3333%203333%200%20005-3c2-1%202-1%201%202s2%2013%205%2015l1%203c-1%204%205%208%2015%2011h7c1%200%202%202%202%208%201%207%205%2012%209%2012l3%201%201%201%201-2%201-3%201-9-1%202-1%202-1-1c1-1%200-2-1-2v-12c-1-3%200-6%201-6l1-3c0-3-3-5-7-7-3-1-3-1-2%202l-1%202v6l-4-3%202-1v-1c-3-1-7%203-5%204v1h-2c0%202%200%202-1%201l-3-1c-2%201-7-1-6-2l-1-1c-2%200-6-6-6-8s-1-3-3-3c-3-1-2-1%203-2%201-1%202-3%200-3l-4-2-3-3%204-1c9-1%2020%202%2019%205%200%204%202%202%202-2l6-13%202%201c1%202%202%202%202%201h1l1%202%203%206%202%205c0%203%203%208%205%208l5%205c3%204%2013%2011%2018%2012%202%201%203%205%201%208l-1%203c1%201%200%206-1%206v-1l-4-1c-4%200-5%201-6%203%200%203%200%203-2%203l-3%201-1%201-3%201-8%204c-3%200-12%204-12%205l-1%201h-3l-6%202c-13%205-14%205%2015%205a215%20215%200%200030-1c-1%201%2015%201%2042%201a373%20373%200%200045-1l22%201h22V143c0-79%200-142-1-141%200%202-1%203-5%205a1500%201500%200%2000-6%201l1-2-2%202c-2%202-3%201-2-1l1-1c1%200%206-4%205-5h-18l-2%201h-1c1-2%200-2-4-2s-5%200-4%201v3h-3l1-1c3-2-4-2-30-3l-27%201h-1l-22-1h-20l-4%205c-4%205-5%204-2-1l3-4h-14a69%2069%200%2000-18%201h-3l-3%202-8%203c-5%203-8%204-4%201s1-2-5%202c-7%203-9%204-8%202s0-2-2%200l-3%201c-1-1%202-4%208-8l5-4a714%20714%200%2000-63%201L70%200H0v143M395%2017c-5%208-4%207-7%206h-2l-1%201c0-1-3%201-3%204-1%201-2%202-3%201v1l-1%203-2%202-1%201-2%202h-2l-2%201c-2%203-5%204-4%201h-2c-3%202-4%202-4%201%200-2%200-2-1-1h-5v-2c-1-1-1-2%201-3l2-3%203-2c1-1%202-1%201-2-2%200-8%203-6%204l1%201c-4%200-7%201-7%202l-1%201-1%201v4l-2%202-3%202-2%203-2%205c1%204-1%206-3%205-1-1-2-1-2%202l-2%202v-3l-1-2h-2v-2c-1%200-1-7%201-7l1-3c0-1%201-3%204-4l4-3c0-2-2-1-7%202-5%202-7%201-2-2l2-2c-2-1-7%201-12%205-4%203-4%204%201%202%203-2%206-2%206%201%200%201-6%2013-8%2014v4l4-3c4-4%204-3%204%202%200%203%200%203%203%203%203-1%202%200-3%203l-4%204-1%201c0-1-5%201-9%204l-8%206-4-2h-9c-4%201-5%201-10-2-11-6-23%201-28%2015v7l2%205c0%204%200%204-5%208-6%203-8%204-6%201l1-2%202-2c3-1%205-4%204-4v-3l-1-2v-2h-6c-2%201-2%202-5%202-2%200-2%200-1%202%201%201%201%201-1%201h-1l-1%204v3l1%202-1%201v1h-1l-2-4c1-1%200-2-1-2l-5-6c-5-8-8-8-22-2-6%202-6%202-11%201-7-3-12-2-18%200-8%204-11%2010-6%2014%201%201%201%201-2%202h-2l3%202%209%201%205%201%206%202c7%200%2014%206%2013%2010%200%202%200%202-1%201s-1%200-1%203l-1%207%201%202%202-1%202-1v2c0%202%200%202%202%200l2-3%201-3%203-4c0-4%203-9%204-9l-1%204c-2%203-4%2013-2%2010l3-1c2%200%202-1%202-3v-2l1%202%201%203v-3c1-2%201-2%202-1l2%201c1-1%201%200%201%201l2-1c1-2%201-2%201%202l-1%204%201-3%202-3v3c0%203%200%203%202%202%202-3%202-2%202%201-1%203%200%203%2010%204l9%203c5%202%205%201%205-2l1-3v4c0%204%200%204%202%204l1%201%201%201v1l2%201%201%201c1%202%204%202%205%201h1l-1%202c-2%202-2%203%200%203l2-1c1-1%202-1%203%202%203%202%203%203%201%204s-3%200-2-2h-1l-1-1c1-2-1-1-2%201-2%201-2%204-1%205l1-1%202-1v1l1%201c2-1%205%200%204%201l2%201-1%202-2%202%202%201h4c3-1%207%201%205%203h1c2-2%201%201-1%202s-2%202-1%202v1c-1%201%200%201%201%201%202%201%203%201%202%202l1%201%201%201%201%201c2%200%202%200%201%201v2l2-1%202%201c2%204%202%203%201-1-3-5-2-6%201-3s3%201-2-4l-5-5c-2%200-2-1-2-3l-1-5-2-9c0-10-2-14-5-13-3%200-4-1-3-6%200-4%202-6%202-2l1%202%201-1c-1-1%204-3%205-2l1-1h2l2-1%201-3%201%201v2l1-2v-6l-1-5v-2l-1-4v-1l2%202%201%203v-3l2-2%201%201c-1%202%201%204%203%205%202%200%202-1%201-2v-8l1%202%202%204%201%203v-4l-1-4v-2l1-2h1l2%201c2-2%203-1%202%202l1%203%201-1v-3l1%201%204%202c3%201%207%202%209%204%206%204%209%205%209%203l1-2v3c-1%202-1%202%201%202h1l1%201h1l1%201h1l1%201%201-1h1l-2%204-2%202h1c2-2%203-1%203%201%201%202%202%202%203%202l5%201v3c0%201%201%202%203%202%203%200%203%200%202-1v-1c2%200%203%202%203%204l-1%201-2-1h-1l-1%201-1%201v1l4%201c2%200%203%200%202%201h-3l-4%201c-1%201-1%201%201%201l7%201c3%202%203%202%202%203-2%201-1%202%201%201%202%200%200%2010-2%2011l-2%201c-1%202-3%200-3-3l-3-5-2-2v3l-1%204c-1%200-3-4-3-10%200-4%200-5-4-9l-4-5-11-13c-2-1-7%200-6%202l-2%204-1-3c0-3%200-3-4-3-3%200-4%200-4%202v2h2c1-1%201-1%202%201s0%203-6%202c-2%200-3%200-2%201%202%202%2013%201%2018-2l2-1a111%20111%200%2001-6%2013l3%202c1%201%201%201-1%201l-5%203c-4%203-4%205-1%203%204-2%205-2%203%200v1l2-1%201-1v3c0%202%201%203%203%203l1%201-3%203c-3%202-3%202-1%202h4l3%201-2%202-2%202h2c2%200%202%200%201%201l-2%201h9c3-2%203-2%203%200l2%201c2%200%204%202%202%203l-2%201h2l1%201-3%202c-3%200-4%202-1%202h5c-2-2-2-2%200-2s2%201%202%203%200%203-1%202c-3-1-3%202%200%204%203%203%204%206%201%208-2%201-1%205%202%204h3l2-4c0-5%201-6%201-3l3%203c2%201%202%201%201-2v-2l2%202%203%206c1%203%201%203%202%201%201-1%201%200%201%204%200%2010-7%2012-13%203-2-3-3-4-4-2-3%204-10%205-14%203l-9-9-6-12-2-2c0-1-2-4-5-6-4-4-4-4-5-2l-2%206-4%2010v5c2%202%202%205%202%208-1%204-1%204%201%203%201-2%201-2%202-1%200%202%201%202%202-1%202-3%202-3%202-1l-1%203v2c1%201%201%201-1%201-3-1-6%202-4%205v2c-1%201-1%201-1-1l-1-2-2-1h-3c-4%202-8%201-14-3-3-1-5-3-5-4l-2-4c-3-4-3-7-3-16%200-7%200-7-7-15l-3-5c0-3-1-2-2%201%200%205-2%2010-3%209-1%200-2-1-1-2l-2-3-1-3-2-4c-3-4-3-6-2-10%201-3%201-3-3-5-4-1-5-1-4%201v2l-1-2c0-1-8-1-9%201h-1c0-2-3-1-4%201-2%203-1%204%207%204%204%201%206%201%209-1%204-2%206-1%202%202-1%202-3%205-3%209l-2%201-2%202c-1%202-1%202%202%203%202%200%202%201%201%202v1l1%201c0%202%202%203%204%202%201-1%201-1%201%201v4c-2%200-2%202-2%202l-3%204-2%202%205-1c3%200%204%200%202%201s-2%201%202%201l6%203c3%202%203%201%203-5l1-6c2%200%2010%2023%2010%2031l1%202%202-8v-1c2%200%203%203%203%209%201%205%201%206%203%204%201-1%201-1%201%201-2%204-2%205-1%205l2%201c0%202%202%201%203-1v-5c-3-4-2-6%200-3%202%202%203%208%202%208-1%201%201%2013%202%2013%202%200%202-4%201-6v-1c3%200%203%206%200%208-1%201-1%204%201%204l1%201h-2l-3%201h-2l-4-1-2-1h-4c-2%202%203%205%205%204%204-1%201%202-6%206-10%204-8%205%201%201%206-3%209-4%2011-3%201%200%202%200%201-1%200-2%201-3%208-4h6l7-1h3l-2%201-1%201h-4c-2%201-2%201%201%201%202%200%202%200%201%201h-6l-1%201h-4c-1%201-1%201%201%202%201%202%201%202-3%204-6%203-2%202%206-1l9-4%207-4%206-3%201-1h2l6-1%2010-2%201%201v-1c0-2%201-4%208-6l7-2c1%202%203%200%203-3l12-6%2024-14-17%209-18%208c-2-3%2010-11%2025-19l10-4v-99a644%20644%200%20000-105c-1-1-2%200-5%205m-41%2041h-3l-1%202c0%202%200%202-1%201-1-2-1-2-1%201l-4%202-3-1-1-1-1%201v3c-1%201-1%201%202%201l2%201h3c1-1%202%200%204%202%202%203%203%203%205%202l2-2-1-1-2-3c-1-3-1-4%201-5%201%200%202-2%201-3h-2m-93%2032c-5%202-8%205-8%207s0%202%201%201c1-2%201-2%201%201l1%205c1%202%201%202%201%200l1-2%201%202v5h-1l2%202%201%202c-1%201%201%204%203%206%203%204%204%205%208%204%205%200%2012-4%2010-5-1-1-1-1%201-1l3-9c0-2%201-3%202-3%202-1%202-1%201-2-1%200-3-2-3-5-2-4-3-6-6-6v1h-5c-2%200-2-2%200-2l1-1h-15m0%2033l-5%209-1%201c-2%200-2%202-1%204%202%203%205%203%204%200l1-2v2h1c1-1%202%201%201%203l2%202%206%204%203%204%203-3%202-3-2-4-2-4h2c2%200%203%201%203%202l3%204c2%202%202%202%203%201v-4c-1-2-2-2-2-1h-2c-2-2-2-3%201-3%202-1%204-2%204-4%201-2%201-2-2-1-7%201-8%201-8%203-2%203-4%203-3%200l-1-1-1%203c0%202%200%202-1%201h-2c0%202-2%203-2%201l-1%201c-1%201-1%201-1-1l-3-3-2-2c0-2%205-6%206-6%202%200%202-1%201-3s-2-2-4%200m-123%205c-5%202-8%205-10%208-1%204-1%204%201%203l1%201%205%201h6l6%202c3%200%204%200%203%202h1v1l1%203v-2h2l3%202v2l-2%205c0%204-3%209-7%2010l-3%202%203%201c3%202%203%202%206%200l4-1c2%201%205%200%205-2s0-2-1-1c-2%201-2%201-2-1l1-2%202-3c1-2%201-2%201%200s0%202%202%201l2-2%201-6v3l1%202%201%202%201-1c2-2%203-2%203%201l2%202%205%205h-5l-1-1c0%201-1%202-2%201-1%200-2-1-1-3%200-3%200-3-1%201-2%204-1%207%200%206l1%201-1%201c-1%200%200%204%203%206%202%202%205%202%203-1l-1-10%201%205c1%205%201%205%204%204%201-1%201-1-1-2l-2-4v-3l3%202c2%202%203%202%203%201v-2c-2-2-2-2%201-2l2-2v-3c2-1%202-2%200-3-2-2-1-3%202-1h2l-1-1h1l4-1-2-1h-1l2-2%201-1%201-3-3%202c-3%203-10%206-10%204l-2-1c-2%200-2%200-1%201%202%200%205%205%203%205l-2-2-2-2%201%202c0%202%200%202-3-1-2-2-3-3-3-1l-1-2c-1-3-2-6-4-7-4-5-7-10-7-12s0-2-1%200c-1%203-1%201-1-3%200-3%200-3-1-2-2%201-3%201-6-1-4-2-12-3-16%200m65%2029c-2%200-4%202-5%203%200%202-2%203-2%203l1%202%202%201%201%201h1c1-2%200-2-1-2-2%200-2%200-1-1v-2l2-1v1c-1%201-1%201%201%201h3l-2%201v1h2c0-1%202%200%203%202l3%203-1-5c-1-8-3-10-7-8m-104%205l-4%201h-5c-5-1-10%200-15%205-4%204-5%208-2%207l3%201%204%203%205%201%203%201c4%200%209%205%208%209%200%202%200%202%201%201%203-3%204-1%201%202l-2%204c0%202%204-2%205-4l1-2c1%201%202-1%204-2%202-3%203-3%203%202%200%202%200%203%201%202l5%202%202%201c2%200%202%200%201%201-2%202-2%202%200%202l1%202%203%202c3%202%204%203%203%204-2%201%201%202%207%201%204%200%205%200%204%201s-1%201%201%201%202-1%202-4l1-3v-1l-2-2h1c0%202%202%201%202-1l-4-5c-4-4-4-6%200-2%206%205%208%206%208%204h1c2%201%201-2-1-4s-3-3-2-5l-1-2-1-1v-2l-1-1c1-2-1-4-14-12l-11-8h-7l-9%201m59%2030l-2%205-2%2013-2%2015c1%204%200%206-4%203v-1c1%201%202%200%202-4%200-5-4-7-7-4v5c-2%203-2%203%200%203l5%202c2%202%203%203%204%202h6l4%201h-5c-4%200-7%202-2%202%202%200%202%200-1%202l-2%201%205-1%204-1-2%202-3%201%203-1a627%20627%200%20007%200v3l-2%201h5c0%202-6%204-9%204l-4%201%202%201%201%201h2l2-2h7l-1%201c-1%200-4%207-3%209%200%203%203%201%204-4l1-4v10l1-6c0-4%201-4%201-2l1%204%201-5v-3l1%206c0%203%200%203%201%202l1-5v-2l1%203h1l-1-6c-3-8-1-27%203-31l1-6c0-4%200-4%201-3h2v-2l-1-2c1%200%200-3-2-5-2-4-3-4-3-3l1%203v6l-4%201c-4%202-6%201-6-4%201-3%201-3-2-5-4-1-5-1-3%201v2c-3%202-6%200-7-4h-1m50%2010c-1%200%200%202%202%202l2%202-4%201c-5%201-7%202-7%204s0%202-1%201c0-2-1-2-2-2l-3%201v2l2%201c1-1%201%200%201%201l2%202%201-2%202-3%2011-1h12l-1-1h-2l-1-1v-2l1-1h2c1-2%200-3-4-4-2-1-2-1-1%201%202%203%201%205-1%203-3-4-10-6-11-4m-99%2045l-2%202h2c1-1%202%200%202%201l-1%201v3c-1%201%200%201%202%201%201%200%202%200%201%201-1%200-1%201%201%202l1%201-1%201-2%202-2%202%203-1h2v1l2-1%201-13c1-5-5-7-9-3m290%20103v10h-18a20965%2020965%200%2001-87%201%203134%203134%200%2000-174%200l-60-1H0v5l1%206v1l-1%2014v14h96a1046%201046%200%200098-1%204136%204136%200%2000206-1c1%201%201-2%201-28-1-27-2-40-2-20'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"regular":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsSAAALEgHS3X78AAAEcklEQVQ4y21V+0+bVRjuv0BGyKD3q7SFQoECZcBKC1RaGu5k3MM9boAoYUEGrpbbSgQkwEQ3mFwyjMMIGIhhCwEdQX+BgCLhMi4rMf4Xj+c90OgSf3hy3nO+r8/7vO/7fKcChUIBtVqN8PBwxMbGIikpCVarFfn5+cjMzER2djZKS0tQUV7O44KCAv6MYpfLBafDyd/Ly8tFWVkZBHK5HDKZDBqNBgaDAVFRUTCbzZw4MTERNpsN6enpSElJgcViQVpaGt9TUnqWlZXFyPLQ0NCAwYEBCKRSKSQSCUipVqvlpDExMYiOjubwqyZyWhMSEviZ0WjkCVpaWjA0NIS5uTmsra1BQGR+qFQqTqrT6aDX6zk5tYJAZ7SPj49HOSufFJPKvr4+zM/PY3t7m4MrFIvFEIlEvHRSqlQqeV+pDUREhKSG2uFwONDf34/Z2VksLCxgZ2cHPp8PBwcHHAIiEwqFHBRTAuorKQ4MDER3dzf29vYwOTmJkZERXh6p6+rqwtbWFjY3N3F2doaTk5MrQlJGRH5i2t+4cYM3mkiSk5NRVFTEe/TL69dYXV1FW1sbh9PpRGNjI5aWlnB+fs4TC/xkpMhfNpVMvWxtbeVNJ9KcnBzY7Xa0t7djfHycW4XaMjU1hY6ODqysrODw8PBqKEQSFBTEbbC4uIjHY49RWVnJS6tia11dHZ8wTba5uZknKi0t5S3p7e3F8vIyH8zp6em/UyaVpIxUDA4O4tXLl9zEZF7yHk2XkhIZqaJk9fX1PJHb7eYlHx0dXRH6p0yrf7K5ubmoqa7mkyRSMq7H40FGRgbrWwNP0NnZyXtbWFjI1/39/f/YhiE4OJhnLi+vQEBAAGprazE6Osr7NvzFMCYmJjipyWRiVQxhZmYGx2y6f7LpUlUkQiBjFlGrNczIYbClpsLD7FBUXIzqmhrcvXcPxSUlaGxqgtfbjzJm6CdPnmKQWaeJna2vb2BqepopbmJfUhJuM68KVHIp3lPJYTZFo+OT+/hp+Ue4Ox+g+E4BNn9ex8baK/ww/x2qKsrw9fgY6murkOmww2ZJRkZ6KowGPSLCdLDeTkK2y8kI66chrnoG3YfzeP/z3+Aa3sadp4cIvfscqb0bqHn+Fo6BXxFzfxERH30Pel9ZNwVF7TdQ1DyD5oNZ6Bu/RXjzCxg/fgGBwnuJW1/+DfPYX9D2n0HrPYXe+wZKrw9CzymCOg8R8tkbSHouOOSPLiH3XoF+S3tZnw9SBnkPs42i+xjp4xfImfTBMnYB+1dvkTV5Ce2jEyi6T6DqZeQ9FB+/A3nX0TWuY3am9LBPT+n+HaKOXQgf7ELy6R7ELKa9nMXyh2x9uAfF/4B+9y7+gMa9C4HBdAs6YxyHNjIWKl0kFKEGSNVhECq0ECt1kGrCIVbpGPSQqPXseQR/Nyw6AZFxyTAlWmG22GGxuyAI04VCG6qBWsWuLTm7vmTsyxGzS0IYDFFIMIQhN68QfBPi6zOJKAQK5o5QDfvrYBM2RrJ7Ms6ENJsV/wBuwUQ2oclRXAAAAABJRU5ErkJggg==","aspectRatio":1,"src":"/static/8419c26418bf950f0604335b2cb7b494/3ddd4/cover2.png","srcSet":"/static/8419c26418bf950f0604335b2cb7b494/078a8/cover2.png 163w,\n/static/8419c26418bf950f0604335b2cb7b494/e56da/cover2.png 327w,\n/static/8419c26418bf950f0604335b2cb7b494/3ddd4/cover2.png 653w,\n/static/8419c26418bf950f0604335b2cb7b494/c5cc7/cover2.png 980w,\n/static/8419c26418bf950f0604335b2cb7b494/6050d/cover2.png 1200w","srcWebp":"/static/8419c26418bf950f0604335b2cb7b494/0acdf/cover2.webp","srcSetWebp":"/static/8419c26418bf950f0604335b2cb7b494/ac59e/cover2.webp 163w,\n/static/8419c26418bf950f0604335b2cb7b494/7660b/cover2.webp 327w,\n/static/8419c26418bf950f0604335b2cb7b494/0acdf/cover2.webp 653w,\n/static/8419c26418bf950f0604335b2cb7b494/75470/cover2.webp 980w,\n/static/8419c26418bf950f0604335b2cb7b494/9000d/cover2.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%20143v143h17l16-1h1l11%201h9l3-5c3-4%203-4%201-4s-2%200%200-3l4-3%201-1%207-8%206-7v-1l2-1c1%201%203-2%202-3-1-2%202-1%203%201%203%202%207%204%207%202l3-1c3%200%203%200%202-1l-1-2-1-1-2%201c-2%203-3%201-1-2l4-10%201-1v2h1l5-2h3l-2-2c-1-2-2-2-4-1-2%202-5%200-3-3v-9c-1-1-1-1%201-2h1v5c0%203%200%204%203%201h3l4%201c4-1%207%202%205%204l-4%208-5%207-1%203%202%2010c1%207%203%2010%2013%2019s10%209%2023%209h11l-4-5-4-5c-1%200-12-11-10-11l-3-2c-1-2-3-3-3-2l-1-1%201-5%201-2%203-4c2-4%204-5%204-2s1%203%202%204%201%201%201-1%200-2%201%200l2%202c2%201%202-2%200-6-1-2%200-3%201-3v1c0%202%209%2012%2015%2016%207%204%2011%204%2021-1l8-4%203%203c2%202%203%203%204%201s5%200%205%203l1%201v1c-2%202-2%202%201%205%205%203%205%208%202%209l-2%201-1%201h-1l-1%201h-2l-3%203-3%202h11c10%200%2019-2%2010-2-3%200-4%200-3-1%202%200%200-2-2-2l-2-1c0-2%204-3%206-3%203%201%208-3%209-5l1-3v-1l-3-3-1-2-2%202-4%202c-1-1-1-1%201-2%203-2%203-3-1-3l-3%201%203-1%203-2h-3l-5-1c-2-1-2-1%200-2%204-2%204-3-1-2h-4l2-1c4-2%204-3%201-3-2%201-2%201%200-1%201-1%201-1-2-1-9%202-9%202-5%200l3-3-2%201h-3c-1%200-1-1%201-1l2-2-4%201h-5c-1-1-1-1%201-2s2-1-1-1-5-3-2-3l-1-1c-2-1-2-1%200-1s3-1%200-3c-1-2-1-2%204-2l9%201c3%202%203%202%203%200%200-3-1-3-7-4-10-2-11-2-10-3h1l1-1-1-1v-6l4%202c2%203%2010%204%2010%201a3333%203333%200%20005-3c2-1%202-1%201%202s2%2013%205%2015l1%203c-1%204%205%208%2015%2011h7c1%200%202%202%202%208%201%207%205%2012%209%2012l3%201%201%201%201-2%201-3%201-9-1%202-1%202-1-1c1-1%200-2-1-2v-12c-1-3%200-6%201-6l1-3c0-3-3-5-7-7-3-1-3-1-2%202l-1%202v6l-4-3%202-1v-1c-3-1-7%203-5%204v1h-2c0%202%200%202-1%201l-3-1c-2%201-7-1-6-2l-1-1c-2%200-6-6-6-8s-1-3-3-3c-3-1-2-1%203-2%201-1%202-3%200-3l-4-2-3-3%204-1c9-1%2020%202%2019%205%200%204%202%202%202-2l6-13%202%201c1%202%202%202%202%201h1l1%202%203%206%202%205c0%203%203%208%205%208l5%205c3%204%2013%2011%2018%2012%202%201%203%205%201%208l-1%203c1%201%200%206-1%206v-1l-4-1c-4%200-5%201-6%203%200%203%200%203-2%203l-3%201-1%201-3%201-8%204c-3%200-12%204-12%205l-1%201h-3l-6%202c-13%205-14%205%2015%205a215%20215%200%200030-1c-1%201%2015%201%2042%201a373%20373%200%200045-1l22%201h22V143c0-79%200-142-1-141%200%202-1%203-5%205a1500%201500%200%2000-6%201l1-2-2%202c-2%202-3%201-2-1l1-1c1%200%206-4%205-5h-18l-2%201h-1c1-2%200-2-4-2s-5%200-4%201v3h-3l1-1c3-2-4-2-30-3l-27%201h-1l-22-1h-20l-4%205c-4%205-5%204-2-1l3-4h-14a69%2069%200%2000-18%201h-3l-3%202-8%203c-5%203-8%204-4%201s1-2-5%202c-7%203-9%204-8%202s0-2-2%200l-3%201c-1-1%202-4%208-8l5-4a714%20714%200%2000-63%201L70%200H0v143M395%2017c-5%208-4%207-7%206h-2l-1%201c0-1-3%201-3%204-1%201-2%202-3%201v1l-1%203-2%202-1%201-2%202h-2l-2%201c-2%203-5%204-4%201h-2c-3%202-4%202-4%201%200-2%200-2-1-1h-5v-2c-1-1-1-2%201-3l2-3%203-2c1-1%202-1%201-2-2%200-8%203-6%204l1%201c-4%200-7%201-7%202l-1%201-1%201v4l-2%202-3%202-2%203-2%205c1%204-1%206-3%205-1-1-2-1-2%202l-2%202v-3l-1-2h-2v-2c-1%200-1-7%201-7l1-3c0-1%201-3%204-4l4-3c0-2-2-1-7%202-5%202-7%201-2-2l2-2c-2-1-7%201-12%205-4%203-4%204%201%202%203-2%206-2%206%201%200%201-6%2013-8%2014v4l4-3c4-4%204-3%204%202%200%203%200%203%203%203%203-1%202%200-3%203l-4%204-1%201c0-1-5%201-9%204l-8%206-4-2h-9c-4%201-5%201-10-2-11-6-23%201-28%2015v7l2%205c0%204%200%204-5%208-6%203-8%204-6%201l1-2%202-2c3-1%205-4%204-4v-3l-1-2v-2h-6c-2%201-2%202-5%202-2%200-2%200-1%202%201%201%201%201-1%201h-1l-1%204v3l1%202-1%201v1h-1l-2-4c1-1%200-2-1-2l-5-6c-5-8-8-8-22-2-6%202-6%202-11%201-7-3-12-2-18%200-8%204-11%2010-6%2014%201%201%201%201-2%202h-2l3%202%209%201%205%201%206%202c7%200%2014%206%2013%2010%200%202%200%202-1%201s-1%200-1%203l-1%207%201%202%202-1%202-1v2c0%202%200%202%202%200l2-3%201-3%203-4c0-4%203-9%204-9l-1%204c-2%203-4%2013-2%2010l3-1c2%200%202-1%202-3v-2l1%202%201%203v-3c1-2%201-2%202-1l2%201c1-1%201%200%201%201l2-1c1-2%201-2%201%202l-1%204%201-3%202-3v3c0%203%200%203%202%202%202-3%202-2%202%201-1%203%200%203%2010%204l9%203c5%202%205%201%205-2l1-3v4c0%204%200%204%202%204l1%201%201%201v1l2%201%201%201c1%202%204%202%205%201h1l-1%202c-2%202-2%203%200%203l2-1c1-1%202-1%203%202%203%202%203%203%201%204s-3%200-2-2h-1l-1-1c1-2-1-1-2%201-2%201-2%204-1%205l1-1%202-1v1l1%201c2-1%205%200%204%201l2%201-1%202-2%202%202%201h4c3-1%207%201%205%203h1c2-2%201%201-1%202s-2%202-1%202v1c-1%201%200%201%201%201%202%201%203%201%202%202l1%201%201%201%201%201c2%200%202%200%201%201v2l2-1%202%201c2%204%202%203%201-1-3-5-2-6%201-3s3%201-2-4l-5-5c-2%200-2-1-2-3l-1-5-2-9c0-10-2-14-5-13-3%200-4-1-3-6%200-4%202-6%202-2l1%202%201-1c-1-1%204-3%205-2l1-1h2l2-1%201-3%201%201v2l1-2v-6l-1-5v-2l-1-4v-1l2%202%201%203v-3l2-2%201%201c-1%202%201%204%203%205%202%200%202-1%201-2v-8l1%202%202%204%201%203v-4l-1-4v-2l1-2h1l2%201c2-2%203-1%202%202l1%203%201-1v-3l1%201%204%202c3%201%207%202%209%204%206%204%209%205%209%203l1-2v3c-1%202-1%202%201%202h1l1%201h1l1%201h1l1%201%201-1h1l-2%204-2%202h1c2-2%203-1%203%201%201%202%202%202%203%202l5%201v3c0%201%201%202%203%202%203%200%203%200%202-1v-1c2%200%203%202%203%204l-1%201-2-1h-1l-1%201-1%201v1l4%201c2%200%203%200%202%201h-3l-4%201c-1%201-1%201%201%201l7%201c3%202%203%202%202%203-2%201-1%202%201%201%202%200%200%2010-2%2011l-2%201c-1%202-3%200-3-3l-3-5-2-2v3l-1%204c-1%200-3-4-3-10%200-4%200-5-4-9l-4-5-11-13c-2-1-7%200-6%202l-2%204-1-3c0-3%200-3-4-3-3%200-4%200-4%202v2h2c1-1%201-1%202%201s0%203-6%202c-2%200-3%200-2%201%202%202%2013%201%2018-2l2-1a111%20111%200%2001-6%2013l3%202c1%201%201%201-1%201l-5%203c-4%203-4%205-1%203%204-2%205-2%203%200v1l2-1%201-1v3c0%202%201%203%203%203l1%201-3%203c-3%202-3%202-1%202h4l3%201-2%202-2%202h2c2%200%202%200%201%201l-2%201h9c3-2%203-2%203%200l2%201c2%200%204%202%202%203l-2%201h2l1%201-3%202c-3%200-4%202-1%202h5c-2-2-2-2%200-2s2%201%202%203%200%203-1%202c-3-1-3%202%200%204%203%203%204%206%201%208-2%201-1%205%202%204h3l2-4c0-5%201-6%201-3l3%203c2%201%202%201%201-2v-2l2%202%203%206c1%203%201%203%202%201%201-1%201%200%201%204%200%2010-7%2012-13%203-2-3-3-4-4-2-3%204-10%205-14%203l-9-9-6-12-2-2c0-1-2-4-5-6-4-4-4-4-5-2l-2%206-4%2010v5c2%202%202%205%202%208-1%204-1%204%201%203%201-2%201-2%202-1%200%202%201%202%202-1%202-3%202-3%202-1l-1%203v2c1%201%201%201-1%201-3-1-6%202-4%205v2c-1%201-1%201-1-1l-1-2-2-1h-3c-4%202-8%201-14-3-3-1-5-3-5-4l-2-4c-3-4-3-7-3-16%200-7%200-7-7-15l-3-5c0-3-1-2-2%201%200%205-2%2010-3%209-1%200-2-1-1-2l-2-3-1-3-2-4c-3-4-3-6-2-10%201-3%201-3-3-5-4-1-5-1-4%201v2l-1-2c0-1-8-1-9%201h-1c0-2-3-1-4%201-2%203-1%204%207%204%204%201%206%201%209-1%204-2%206-1%202%202-1%202-3%205-3%209l-2%201-2%202c-1%202-1%202%202%203%202%200%202%201%201%202v1l1%201c0%202%202%203%204%202%201-1%201-1%201%201v4c-2%200-2%202-2%202l-3%204-2%202%205-1c3%200%204%200%202%201s-2%201%202%201l6%203c3%202%203%201%203-5l1-6c2%200%2010%2023%2010%2031l1%202%202-8v-1c2%200%203%203%203%209%201%205%201%206%203%204%201-1%201-1%201%201-2%204-2%205-1%205l2%201c0%202%202%201%203-1v-5c-3-4-2-6%200-3%202%202%203%208%202%208-1%201%201%2013%202%2013%202%200%202-4%201-6v-1c3%200%203%206%200%208-1%201-1%204%201%204l1%201h-2l-3%201h-2l-4-1-2-1h-4c-2%202%203%205%205%204%204-1%201%202-6%206-10%204-8%205%201%201%206-3%209-4%2011-3%201%200%202%200%201-1%200-2%201-3%208-4h6l7-1h3l-2%201-1%201h-4c-2%201-2%201%201%201%202%200%202%200%201%201h-6l-1%201h-4c-1%201-1%201%201%202%201%202%201%202-3%204-6%203-2%202%206-1l9-4%207-4%206-3%201-1h2l6-1%2010-2%201%201v-1c0-2%201-4%208-6l7-2c1%202%203%200%203-3l12-6%2024-14-17%209-18%208c-2-3%2010-11%2025-19l10-4v-99a644%20644%200%20000-105c-1-1-2%200-5%205m-41%2041h-3l-1%202c0%202%200%202-1%201-1-2-1-2-1%201l-4%202-3-1-1-1-1%201v3c-1%201-1%201%202%201l2%201h3c1-1%202%200%204%202%202%203%203%203%205%202l2-2-1-1-2-3c-1-3-1-4%201-5%201%200%202-2%201-3h-2m-93%2032c-5%202-8%205-8%207s0%202%201%201c1-2%201-2%201%201l1%205c1%202%201%202%201%200l1-2%201%202v5h-1l2%202%201%202c-1%201%201%204%203%206%203%204%204%205%208%204%205%200%2012-4%2010-5-1-1-1-1%201-1l3-9c0-2%201-3%202-3%202-1%202-1%201-2-1%200-3-2-3-5-2-4-3-6-6-6v1h-5c-2%200-2-2%200-2l1-1h-15m0%2033l-5%209-1%201c-2%200-2%202-1%204%202%203%205%203%204%200l1-2v2h1c1-1%202%201%201%203l2%202%206%204%203%204%203-3%202-3-2-4-2-4h2c2%200%203%201%203%202l3%204c2%202%202%202%203%201v-4c-1-2-2-2-2-1h-2c-2-2-2-3%201-3%202-1%204-2%204-4%201-2%201-2-2-1-7%201-8%201-8%203-2%203-4%203-3%200l-1-1-1%203c0%202%200%202-1%201h-2c0%202-2%203-2%201l-1%201c-1%201-1%201-1-1l-3-3-2-2c0-2%205-6%206-6%202%200%202-1%201-3s-2-2-4%200m-123%205c-5%202-8%205-10%208-1%204-1%204%201%203l1%201%205%201h6l6%202c3%200%204%200%203%202h1v1l1%203v-2h2l3%202v2l-2%205c0%204-3%209-7%2010l-3%202%203%201c3%202%203%202%206%200l4-1c2%201%205%200%205-2s0-2-1-1c-2%201-2%201-2-1l1-2%202-3c1-2%201-2%201%200s0%202%202%201l2-2%201-6v3l1%202%201%202%201-1c2-2%203-2%203%201l2%202%205%205h-5l-1-1c0%201-1%202-2%201-1%200-2-1-1-3%200-3%200-3-1%201-2%204-1%207%200%206l1%201-1%201c-1%200%200%204%203%206%202%202%205%202%203-1l-1-10%201%205c1%205%201%205%204%204%201-1%201-1-1-2l-2-4v-3l3%202c2%202%203%202%203%201v-2c-2-2-2-2%201-2l2-2v-3c2-1%202-2%200-3-2-2-1-3%202-1h2l-1-1h1l4-1-2-1h-1l2-2%201-1%201-3-3%202c-3%203-10%206-10%204l-2-1c-2%200-2%200-1%201%202%200%205%205%203%205l-2-2-2-2%201%202c0%202%200%202-3-1-2-2-3-3-3-1l-1-2c-1-3-2-6-4-7-4-5-7-10-7-12s0-2-1%200c-1%203-1%201-1-3%200-3%200-3-1-2-2%201-3%201-6-1-4-2-12-3-16%200m65%2029c-2%200-4%202-5%203%200%202-2%203-2%203l1%202%202%201%201%201h1c1-2%200-2-1-2-2%200-2%200-1-1v-2l2-1v1c-1%201-1%201%201%201h3l-2%201v1h2c0-1%202%200%203%202l3%203-1-5c-1-8-3-10-7-8m-104%205l-4%201h-5c-5-1-10%200-15%205-4%204-5%208-2%207l3%201%204%203%205%201%203%201c4%200%209%205%208%209%200%202%200%202%201%201%203-3%204-1%201%202l-2%204c0%202%204-2%205-4l1-2c1%201%202-1%204-2%202-3%203-3%203%202%200%202%200%203%201%202l5%202%202%201c2%200%202%200%201%201-2%202-2%202%200%202l1%202%203%202c3%202%204%203%203%204-2%201%201%202%207%201%204%200%205%200%204%201s-1%201%201%201%202-1%202-4l1-3v-1l-2-2h1c0%202%202%201%202-1l-4-5c-4-4-4-6%200-2%206%205%208%206%208%204h1c2%201%201-2-1-4s-3-3-2-5l-1-2-1-1v-2l-1-1c1-2-1-4-14-12l-11-8h-7l-9%201m59%2030l-2%205-2%2013-2%2015c1%204%200%206-4%203v-1c1%201%202%200%202-4%200-5-4-7-7-4v5c-2%203-2%203%200%203l5%202c2%202%203%203%204%202h6l4%201h-5c-4%200-7%202-2%202%202%200%202%200-1%202l-2%201%205-1%204-1-2%202-3%201%203-1a627%20627%200%20007%200v3l-2%201h5c0%202-6%204-9%204l-4%201%202%201%201%201h2l2-2h7l-1%201c-1%200-4%207-3%209%200%203%203%201%204-4l1-4v10l1-6c0-4%201-4%201-2l1%204%201-5v-3l1%206c0%203%200%203%201%202l1-5v-2l1%203h1l-1-6c-3-8-1-27%203-31l1-6c0-4%200-4%201-3h2v-2l-1-2c1%200%200-3-2-5-2-4-3-4-3-3l1%203v6l-4%201c-4%202-6%201-6-4%201-3%201-3-2-5-4-1-5-1-3%201v2c-3%202-6%200-7-4h-1m50%2010c-1%200%200%202%202%202l2%202-4%201c-5%201-7%202-7%204s0%202-1%201c0-2-1-2-2-2l-3%201v2l2%201c1-1%201%200%201%201l2%202%201-2%202-3%2011-1h12l-1-1h-2l-1-1v-2l1-1h2c1-2%200-3-4-4-2-1-2-1-1%201%202%203%201%205-1%203-3-4-10-6-11-4m-99%2045l-2%202h2c1-1%202%200%202%201l-1%201v3c-1%201%200%201%202%201%201%200%202%200%201%201-1%200-1%201%201%202l1%201-1%201-2%202-2%202%203-1h2v1l2-1%201-13c1-5-5-7-9-3m290%20103v10h-18a20965%2020965%200%2001-87%201%203134%203134%200%2000-174%200l-60-1H0v5l1%206v1l-1%2014v14h96a1046%201046%200%200098-1%204136%204136%200%2000206-1c1%201%201-2%201-28-1-27-2-40-2-20'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"narrow":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsSAAALEgHS3X78AAAEcklEQVQ4y21V+0+bVRjuv0BGyKD3q7SFQoECZcBKC1RaGu5k3MM9boAoYUEGrpbbSgQkwEQ3mFwyjMMIGIhhCwEdQX+BgCLhMi4rMf4Xj+c90OgSf3hy3nO+r8/7vO/7fKcChUIBtVqN8PBwxMbGIikpCVarFfn5+cjMzER2djZKS0tQUV7O44KCAv6MYpfLBafDyd/Ly8tFWVkZBHK5HDKZDBqNBgaDAVFRUTCbzZw4MTERNpsN6enpSElJgcViQVpaGt9TUnqWlZXFyPLQ0NCAwYEBCKRSKSQSCUipVqvlpDExMYiOjubwqyZyWhMSEviZ0WjkCVpaWjA0NIS5uTmsra1BQGR+qFQqTqrT6aDX6zk5tYJAZ7SPj49HOSufFJPKvr4+zM/PY3t7m4MrFIvFEIlEvHRSqlQqeV+pDUREhKSG2uFwONDf34/Z2VksLCxgZ2cHPp8PBwcHHAIiEwqFHBRTAuorKQ4MDER3dzf29vYwOTmJkZERXh6p6+rqwtbWFjY3N3F2doaTk5MrQlJGRH5i2t+4cYM3mkiSk5NRVFTEe/TL69dYXV1FW1sbh9PpRGNjI5aWlnB+fs4TC/xkpMhfNpVMvWxtbeVNJ9KcnBzY7Xa0t7djfHycW4XaMjU1hY6ODqysrODw8PBqKEQSFBTEbbC4uIjHY49RWVnJS6tia11dHZ8wTba5uZknKi0t5S3p7e3F8vIyH8zp6em/UyaVpIxUDA4O4tXLl9zEZF7yHk2XkhIZqaJk9fX1PJHb7eYlHx0dXRH6p0yrf7K5ubmoqa7mkyRSMq7H40FGRgbrWwNP0NnZyXtbWFjI1/39/f/YhiE4OJhnLi+vQEBAAGprazE6Osr7NvzFMCYmJjipyWRiVQxhZmYGx2y6f7LpUlUkQiBjFlGrNczIYbClpsLD7FBUXIzqmhrcvXcPxSUlaGxqgtfbjzJm6CdPnmKQWaeJna2vb2BqepopbmJfUhJuM68KVHIp3lPJYTZFo+OT+/hp+Ue4Ox+g+E4BNn9ex8baK/ww/x2qKsrw9fgY6murkOmww2ZJRkZ6KowGPSLCdLDeTkK2y8kI66chrnoG3YfzeP/z3+Aa3sadp4cIvfscqb0bqHn+Fo6BXxFzfxERH30Pel9ZNwVF7TdQ1DyD5oNZ6Bu/RXjzCxg/fgGBwnuJW1/+DfPYX9D2n0HrPYXe+wZKrw9CzymCOg8R8tkbSHouOOSPLiH3XoF+S3tZnw9SBnkPs42i+xjp4xfImfTBMnYB+1dvkTV5Ce2jEyi6T6DqZeQ9FB+/A3nX0TWuY3am9LBPT+n+HaKOXQgf7ELy6R7ELKa9nMXyh2x9uAfF/4B+9y7+gMa9C4HBdAs6YxyHNjIWKl0kFKEGSNVhECq0ECt1kGrCIVbpGPSQqPXseQR/Nyw6AZFxyTAlWmG22GGxuyAI04VCG6qBWsWuLTm7vmTsyxGzS0IYDFFIMIQhN68QfBPi6zOJKAQK5o5QDfvrYBM2RrJ7Ms6ENJsV/wBuwUQ2oclRXAAAAABJRU5ErkJggg==","aspectRatio":1,"src":"/static/8419c26418bf950f0604335b2cb7b494/502b1/cover2.png","srcSet":"/static/8419c26418bf950f0604335b2cb7b494/f2e6d/cover2.png 114w,\n/static/8419c26418bf950f0604335b2cb7b494/4ddba/cover2.png 229w,\n/static/8419c26418bf950f0604335b2cb7b494/502b1/cover2.png 457w,\n/static/8419c26418bf950f0604335b2cb7b494/7ddc2/cover2.png 686w,\n/static/8419c26418bf950f0604335b2cb7b494/435bf/cover2.png 914w,\n/static/8419c26418bf950f0604335b2cb7b494/6050d/cover2.png 1200w","srcWebp":"/static/8419c26418bf950f0604335b2cb7b494/15384/cover2.webp","srcSetWebp":"/static/8419c26418bf950f0604335b2cb7b494/31fce/cover2.webp 114w,\n/static/8419c26418bf950f0604335b2cb7b494/e3e25/cover2.webp 229w,\n/static/8419c26418bf950f0604335b2cb7b494/15384/cover2.webp 457w,\n/static/8419c26418bf950f0604335b2cb7b494/0258d/cover2.webp 686w,\n/static/8419c26418bf950f0604335b2cb7b494/64ea2/cover2.webp 914w,\n/static/8419c26418bf950f0604335b2cb7b494/9000d/cover2.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%20143v143h17l16-1h1l11%201h9l3-5c3-4%203-4%201-4s-2%200%200-3l4-3%201-1%207-8%206-7v-1l2-1c1%201%203-2%202-3-1-2%202-1%203%201%203%202%207%204%207%202l3-1c3%200%203%200%202-1l-1-2-1-1-2%201c-2%203-3%201-1-2l4-10%201-1v2h1l5-2h3l-2-2c-1-2-2-2-4-1-2%202-5%200-3-3v-9c-1-1-1-1%201-2h1v5c0%203%200%204%203%201h3l4%201c4-1%207%202%205%204l-4%208-5%207-1%203%202%2010c1%207%203%2010%2013%2019s10%209%2023%209h11l-4-5-4-5c-1%200-12-11-10-11l-3-2c-1-2-3-3-3-2l-1-1%201-5%201-2%203-4c2-4%204-5%204-2s1%203%202%204%201%201%201-1%200-2%201%200l2%202c2%201%202-2%200-6-1-2%200-3%201-3v1c0%202%209%2012%2015%2016%207%204%2011%204%2021-1l8-4%203%203c2%202%203%203%204%201s5%200%205%203l1%201v1c-2%202-2%202%201%205%205%203%205%208%202%209l-2%201-1%201h-1l-1%201h-2l-3%203-3%202h11c10%200%2019-2%2010-2-3%200-4%200-3-1%202%200%200-2-2-2l-2-1c0-2%204-3%206-3%203%201%208-3%209-5l1-3v-1l-3-3-1-2-2%202-4%202c-1-1-1-1%201-2%203-2%203-3-1-3l-3%201%203-1%203-2h-3l-5-1c-2-1-2-1%200-2%204-2%204-3-1-2h-4l2-1c4-2%204-3%201-3-2%201-2%201%200-1%201-1%201-1-2-1-9%202-9%202-5%200l3-3-2%201h-3c-1%200-1-1%201-1l2-2-4%201h-5c-1-1-1-1%201-2s2-1-1-1-5-3-2-3l-1-1c-2-1-2-1%200-1s3-1%200-3c-1-2-1-2%204-2l9%201c3%202%203%202%203%200%200-3-1-3-7-4-10-2-11-2-10-3h1l1-1-1-1v-6l4%202c2%203%2010%204%2010%201a3333%203333%200%20005-3c2-1%202-1%201%202s2%2013%205%2015l1%203c-1%204%205%208%2015%2011h7c1%200%202%202%202%208%201%207%205%2012%209%2012l3%201%201%201%201-2%201-3%201-9-1%202-1%202-1-1c1-1%200-2-1-2v-12c-1-3%200-6%201-6l1-3c0-3-3-5-7-7-3-1-3-1-2%202l-1%202v6l-4-3%202-1v-1c-3-1-7%203-5%204v1h-2c0%202%200%202-1%201l-3-1c-2%201-7-1-6-2l-1-1c-2%200-6-6-6-8s-1-3-3-3c-3-1-2-1%203-2%201-1%202-3%200-3l-4-2-3-3%204-1c9-1%2020%202%2019%205%200%204%202%202%202-2l6-13%202%201c1%202%202%202%202%201h1l1%202%203%206%202%205c0%203%203%208%205%208l5%205c3%204%2013%2011%2018%2012%202%201%203%205%201%208l-1%203c1%201%200%206-1%206v-1l-4-1c-4%200-5%201-6%203%200%203%200%203-2%203l-3%201-1%201-3%201-8%204c-3%200-12%204-12%205l-1%201h-3l-6%202c-13%205-14%205%2015%205a215%20215%200%200030-1c-1%201%2015%201%2042%201a373%20373%200%200045-1l22%201h22V143c0-79%200-142-1-141%200%202-1%203-5%205a1500%201500%200%2000-6%201l1-2-2%202c-2%202-3%201-2-1l1-1c1%200%206-4%205-5h-18l-2%201h-1c1-2%200-2-4-2s-5%200-4%201v3h-3l1-1c3-2-4-2-30-3l-27%201h-1l-22-1h-20l-4%205c-4%205-5%204-2-1l3-4h-14a69%2069%200%2000-18%201h-3l-3%202-8%203c-5%203-8%204-4%201s1-2-5%202c-7%203-9%204-8%202s0-2-2%200l-3%201c-1-1%202-4%208-8l5-4a714%20714%200%2000-63%201L70%200H0v143M395%2017c-5%208-4%207-7%206h-2l-1%201c0-1-3%201-3%204-1%201-2%202-3%201v1l-1%203-2%202-1%201-2%202h-2l-2%201c-2%203-5%204-4%201h-2c-3%202-4%202-4%201%200-2%200-2-1-1h-5v-2c-1-1-1-2%201-3l2-3%203-2c1-1%202-1%201-2-2%200-8%203-6%204l1%201c-4%200-7%201-7%202l-1%201-1%201v4l-2%202-3%202-2%203-2%205c1%204-1%206-3%205-1-1-2-1-2%202l-2%202v-3l-1-2h-2v-2c-1%200-1-7%201-7l1-3c0-1%201-3%204-4l4-3c0-2-2-1-7%202-5%202-7%201-2-2l2-2c-2-1-7%201-12%205-4%203-4%204%201%202%203-2%206-2%206%201%200%201-6%2013-8%2014v4l4-3c4-4%204-3%204%202%200%203%200%203%203%203%203-1%202%200-3%203l-4%204-1%201c0-1-5%201-9%204l-8%206-4-2h-9c-4%201-5%201-10-2-11-6-23%201-28%2015v7l2%205c0%204%200%204-5%208-6%203-8%204-6%201l1-2%202-2c3-1%205-4%204-4v-3l-1-2v-2h-6c-2%201-2%202-5%202-2%200-2%200-1%202%201%201%201%201-1%201h-1l-1%204v3l1%202-1%201v1h-1l-2-4c1-1%200-2-1-2l-5-6c-5-8-8-8-22-2-6%202-6%202-11%201-7-3-12-2-18%200-8%204-11%2010-6%2014%201%201%201%201-2%202h-2l3%202%209%201%205%201%206%202c7%200%2014%206%2013%2010%200%202%200%202-1%201s-1%200-1%203l-1%207%201%202%202-1%202-1v2c0%202%200%202%202%200l2-3%201-3%203-4c0-4%203-9%204-9l-1%204c-2%203-4%2013-2%2010l3-1c2%200%202-1%202-3v-2l1%202%201%203v-3c1-2%201-2%202-1l2%201c1-1%201%200%201%201l2-1c1-2%201-2%201%202l-1%204%201-3%202-3v3c0%203%200%203%202%202%202-3%202-2%202%201-1%203%200%203%2010%204l9%203c5%202%205%201%205-2l1-3v4c0%204%200%204%202%204l1%201%201%201v1l2%201%201%201c1%202%204%202%205%201h1l-1%202c-2%202-2%203%200%203l2-1c1-1%202-1%203%202%203%202%203%203%201%204s-3%200-2-2h-1l-1-1c1-2-1-1-2%201-2%201-2%204-1%205l1-1%202-1v1l1%201c2-1%205%200%204%201l2%201-1%202-2%202%202%201h4c3-1%207%201%205%203h1c2-2%201%201-1%202s-2%202-1%202v1c-1%201%200%201%201%201%202%201%203%201%202%202l1%201%201%201%201%201c2%200%202%200%201%201v2l2-1%202%201c2%204%202%203%201-1-3-5-2-6%201-3s3%201-2-4l-5-5c-2%200-2-1-2-3l-1-5-2-9c0-10-2-14-5-13-3%200-4-1-3-6%200-4%202-6%202-2l1%202%201-1c-1-1%204-3%205-2l1-1h2l2-1%201-3%201%201v2l1-2v-6l-1-5v-2l-1-4v-1l2%202%201%203v-3l2-2%201%201c-1%202%201%204%203%205%202%200%202-1%201-2v-8l1%202%202%204%201%203v-4l-1-4v-2l1-2h1l2%201c2-2%203-1%202%202l1%203%201-1v-3l1%201%204%202c3%201%207%202%209%204%206%204%209%205%209%203l1-2v3c-1%202-1%202%201%202h1l1%201h1l1%201h1l1%201%201-1h1l-2%204-2%202h1c2-2%203-1%203%201%201%202%202%202%203%202l5%201v3c0%201%201%202%203%202%203%200%203%200%202-1v-1c2%200%203%202%203%204l-1%201-2-1h-1l-1%201-1%201v1l4%201c2%200%203%200%202%201h-3l-4%201c-1%201-1%201%201%201l7%201c3%202%203%202%202%203-2%201-1%202%201%201%202%200%200%2010-2%2011l-2%201c-1%202-3%200-3-3l-3-5-2-2v3l-1%204c-1%200-3-4-3-10%200-4%200-5-4-9l-4-5-11-13c-2-1-7%200-6%202l-2%204-1-3c0-3%200-3-4-3-3%200-4%200-4%202v2h2c1-1%201-1%202%201s0%203-6%202c-2%200-3%200-2%201%202%202%2013%201%2018-2l2-1a111%20111%200%2001-6%2013l3%202c1%201%201%201-1%201l-5%203c-4%203-4%205-1%203%204-2%205-2%203%200v1l2-1%201-1v3c0%202%201%203%203%203l1%201-3%203c-3%202-3%202-1%202h4l3%201-2%202-2%202h2c2%200%202%200%201%201l-2%201h9c3-2%203-2%203%200l2%201c2%200%204%202%202%203l-2%201h2l1%201-3%202c-3%200-4%202-1%202h5c-2-2-2-2%200-2s2%201%202%203%200%203-1%202c-3-1-3%202%200%204%203%203%204%206%201%208-2%201-1%205%202%204h3l2-4c0-5%201-6%201-3l3%203c2%201%202%201%201-2v-2l2%202%203%206c1%203%201%203%202%201%201-1%201%200%201%204%200%2010-7%2012-13%203-2-3-3-4-4-2-3%204-10%205-14%203l-9-9-6-12-2-2c0-1-2-4-5-6-4-4-4-4-5-2l-2%206-4%2010v5c2%202%202%205%202%208-1%204-1%204%201%203%201-2%201-2%202-1%200%202%201%202%202-1%202-3%202-3%202-1l-1%203v2c1%201%201%201-1%201-3-1-6%202-4%205v2c-1%201-1%201-1-1l-1-2-2-1h-3c-4%202-8%201-14-3-3-1-5-3-5-4l-2-4c-3-4-3-7-3-16%200-7%200-7-7-15l-3-5c0-3-1-2-2%201%200%205-2%2010-3%209-1%200-2-1-1-2l-2-3-1-3-2-4c-3-4-3-6-2-10%201-3%201-3-3-5-4-1-5-1-4%201v2l-1-2c0-1-8-1-9%201h-1c0-2-3-1-4%201-2%203-1%204%207%204%204%201%206%201%209-1%204-2%206-1%202%202-1%202-3%205-3%209l-2%201-2%202c-1%202-1%202%202%203%202%200%202%201%201%202v1l1%201c0%202%202%203%204%202%201-1%201-1%201%201v4c-2%200-2%202-2%202l-3%204-2%202%205-1c3%200%204%200%202%201s-2%201%202%201l6%203c3%202%203%201%203-5l1-6c2%200%2010%2023%2010%2031l1%202%202-8v-1c2%200%203%203%203%209%201%205%201%206%203%204%201-1%201-1%201%201-2%204-2%205-1%205l2%201c0%202%202%201%203-1v-5c-3-4-2-6%200-3%202%202%203%208%202%208-1%201%201%2013%202%2013%202%200%202-4%201-6v-1c3%200%203%206%200%208-1%201-1%204%201%204l1%201h-2l-3%201h-2l-4-1-2-1h-4c-2%202%203%205%205%204%204-1%201%202-6%206-10%204-8%205%201%201%206-3%209-4%2011-3%201%200%202%200%201-1%200-2%201-3%208-4h6l7-1h3l-2%201-1%201h-4c-2%201-2%201%201%201%202%200%202%200%201%201h-6l-1%201h-4c-1%201-1%201%201%202%201%202%201%202-3%204-6%203-2%202%206-1l9-4%207-4%206-3%201-1h2l6-1%2010-2%201%201v-1c0-2%201-4%208-6l7-2c1%202%203%200%203-3l12-6%2024-14-17%209-18%208c-2-3%2010-11%2025-19l10-4v-99a644%20644%200%20000-105c-1-1-2%200-5%205m-41%2041h-3l-1%202c0%202%200%202-1%201-1-2-1-2-1%201l-4%202-3-1-1-1-1%201v3c-1%201-1%201%202%201l2%201h3c1-1%202%200%204%202%202%203%203%203%205%202l2-2-1-1-2-3c-1-3-1-4%201-5%201%200%202-2%201-3h-2m-93%2032c-5%202-8%205-8%207s0%202%201%201c1-2%201-2%201%201l1%205c1%202%201%202%201%200l1-2%201%202v5h-1l2%202%201%202c-1%201%201%204%203%206%203%204%204%205%208%204%205%200%2012-4%2010-5-1-1-1-1%201-1l3-9c0-2%201-3%202-3%202-1%202-1%201-2-1%200-3-2-3-5-2-4-3-6-6-6v1h-5c-2%200-2-2%200-2l1-1h-15m0%2033l-5%209-1%201c-2%200-2%202-1%204%202%203%205%203%204%200l1-2v2h1c1-1%202%201%201%203l2%202%206%204%203%204%203-3%202-3-2-4-2-4h2c2%200%203%201%203%202l3%204c2%202%202%202%203%201v-4c-1-2-2-2-2-1h-2c-2-2-2-3%201-3%202-1%204-2%204-4%201-2%201-2-2-1-7%201-8%201-8%203-2%203-4%203-3%200l-1-1-1%203c0%202%200%202-1%201h-2c0%202-2%203-2%201l-1%201c-1%201-1%201-1-1l-3-3-2-2c0-2%205-6%206-6%202%200%202-1%201-3s-2-2-4%200m-123%205c-5%202-8%205-10%208-1%204-1%204%201%203l1%201%205%201h6l6%202c3%200%204%200%203%202h1v1l1%203v-2h2l3%202v2l-2%205c0%204-3%209-7%2010l-3%202%203%201c3%202%203%202%206%200l4-1c2%201%205%200%205-2s0-2-1-1c-2%201-2%201-2-1l1-2%202-3c1-2%201-2%201%200s0%202%202%201l2-2%201-6v3l1%202%201%202%201-1c2-2%203-2%203%201l2%202%205%205h-5l-1-1c0%201-1%202-2%201-1%200-2-1-1-3%200-3%200-3-1%201-2%204-1%207%200%206l1%201-1%201c-1%200%200%204%203%206%202%202%205%202%203-1l-1-10%201%205c1%205%201%205%204%204%201-1%201-1-1-2l-2-4v-3l3%202c2%202%203%202%203%201v-2c-2-2-2-2%201-2l2-2v-3c2-1%202-2%200-3-2-2-1-3%202-1h2l-1-1h1l4-1-2-1h-1l2-2%201-1%201-3-3%202c-3%203-10%206-10%204l-2-1c-2%200-2%200-1%201%202%200%205%205%203%205l-2-2-2-2%201%202c0%202%200%202-3-1-2-2-3-3-3-1l-1-2c-1-3-2-6-4-7-4-5-7-10-7-12s0-2-1%200c-1%203-1%201-1-3%200-3%200-3-1-2-2%201-3%201-6-1-4-2-12-3-16%200m65%2029c-2%200-4%202-5%203%200%202-2%203-2%203l1%202%202%201%201%201h1c1-2%200-2-1-2-2%200-2%200-1-1v-2l2-1v1c-1%201-1%201%201%201h3l-2%201v1h2c0-1%202%200%203%202l3%203-1-5c-1-8-3-10-7-8m-104%205l-4%201h-5c-5-1-10%200-15%205-4%204-5%208-2%207l3%201%204%203%205%201%203%201c4%200%209%205%208%209%200%202%200%202%201%201%203-3%204-1%201%202l-2%204c0%202%204-2%205-4l1-2c1%201%202-1%204-2%202-3%203-3%203%202%200%202%200%203%201%202l5%202%202%201c2%200%202%200%201%201-2%202-2%202%200%202l1%202%203%202c3%202%204%203%203%204-2%201%201%202%207%201%204%200%205%200%204%201s-1%201%201%201%202-1%202-4l1-3v-1l-2-2h1c0%202%202%201%202-1l-4-5c-4-4-4-6%200-2%206%205%208%206%208%204h1c2%201%201-2-1-4s-3-3-2-5l-1-2-1-1v-2l-1-1c1-2-1-4-14-12l-11-8h-7l-9%201m59%2030l-2%205-2%2013-2%2015c1%204%200%206-4%203v-1c1%201%202%200%202-4%200-5-4-7-7-4v5c-2%203-2%203%200%203l5%202c2%202%203%203%204%202h6l4%201h-5c-4%200-7%202-2%202%202%200%202%200-1%202l-2%201%205-1%204-1-2%202-3%201%203-1a627%20627%200%20007%200v3l-2%201h5c0%202-6%204-9%204l-4%201%202%201%201%201h2l2-2h7l-1%201c-1%200-4%207-3%209%200%203%203%201%204-4l1-4v10l1-6c0-4%201-4%201-2l1%204%201-5v-3l1%206c0%203%200%203%201%202l1-5v-2l1%203h1l-1-6c-3-8-1-27%203-31l1-6c0-4%200-4%201-3h2v-2l-1-2c1%200%200-3-2-5-2-4-3-4-3-3l1%203v6l-4%201c-4%202-6%201-6-4%201-3%201-3-2-5-4-1-5-1-3%201v2c-3%202-6%200-7-4h-1m50%2010c-1%200%200%202%202%202l2%202-4%201c-5%201-7%202-7%204s0%202-1%201c0-2-1-2-2-2l-3%201v2l2%201c1-1%201%200%201%201l2%202%201-2%202-3%2011-1h12l-1-1h-2l-1-1v-2l1-1h2c1-2%200-3-4-4-2-1-2-1-1%201%202%203%201%205-1%203-3-4-10-6-11-4m-99%2045l-2%202h2c1-1%202%200%202%201l-1%201v3c-1%201%200%201%202%201%201%200%202%200%201%201-1%200-1%201%201%202l1%201-1%201-2%202-2%202%203-1h2v1l2-1%201-13c1-5-5-7-9-3m290%20103v10h-18a20965%2020965%200%2001-87%201%203134%203134%200%2000-174%200l-60-1H0v5l1%206v1l-1%2014v14h96a1046%201046%200%200098-1%204136%204136%200%2000206-1c1%201%201-2%201-28-1-27-2-40-2-20'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"seo":{"src":"/static/8419c26418bf950f0604335b2cb7b494/6050d/cover2.png"}}},{"id":"384d3fab-354b-5d56-87c6-5156b53e3e99","slug":"/importance-of-design-system","secret":false,"title":"Importance of design system","author":"Luke Celitan","date":"December 12th, 2022","dateForSEO":"2022-12-12T00:00:00.000Z","timeToRead":3,"excerpt":"Why You Need A Design System, And How To Create One","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\": \"Importance of design system\",\n  \"author\": \"Luke Celitan\",\n  \"date\": \"2022-12-12T00:00:00.000Z\",\n  \"hero\": \"./designSystem1.jpg\",\n  \"excerpt\": \"Why You Need A Design System, And How To Create One\",\n  \"category\": \"Post\",\n  \"tech\": [\"TS\", \"Nodejs\", \"ReactIcon\", \"Rust\"]\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\": \"what-is-a-design-system\"\n  }, \"What is a Design System?\"), mdx(\"p\", null, \"A design system is a collection of reusable components and guidelines for\\ndesigning and building digital products. It can be used to create a consistent\\nuser experience across multiple devices and platforms, and to streamline the\\ndesign and development process. Design systems often include style guides, UI\\nkits, code libraries, and other resources that developers and designers can use\\nto create consistent, cohesive user experiences. When used correctly, design\\nsystems can help teams work more efficiently, improve the quality of their work,\\nand ship better products faster.\"), mdx(\"h2\", {\n    \"id\": \"why-is-it-important-to-have-a-design-system\"\n  }, \"Why is it important to have a design system?\"), mdx(\"p\", null, \"A design system is a collection of reusable components and guidelines for design\\nand development. It can be used by a team of designers and developers to build\\ndigital products, such as websites and applications, in a consistent and\\ncohesive way. There are many benefits to having a design system, such as:\\n-Improved efficiency: A design system enables team members to work more\\nefficiently by reusing common components instead of starting from scratch each\\ntime. -Reduced errors and inconsistencies: By following the same design rules\\nand using the same components, mistakes and inconsistencies are reduced. -Faster\\nturnaround times: Using a design system can help speed up the development\\nprocess as team members are familiar with the components and how they fit\\ntogether. -Increased satisfaction: When designers and developers have a greater\\ndegree of control over the end product, they are usually more satisfied with\\ntheir work. This leads to improved morale and motivation within the team.\"), mdx(\"h2\", {\n    \"id\": \"what-are-the-different-types-of-design-systems\"\n  }, \"What are the different types of design systems?\"), mdx(\"p\", null, \"There are many different types of design systems, but they all share some\\ncommonalities. A design system is a set of reusable components and guidelines\\nthat can be used to build digital products. Design systems can help create\\nconsistency and coherence across a product, and make it easier to scale and\\nmaintain a product over time. The most common type of design system is a\\ncomponent library. A component library is a collection of UI components that can\\nbe reused in different contexts. Component libraries can be static (e.g.\\nBootstrap) or dynamic (e.g. React). Another type of design system is a style\\nguide. A style guide is a set of rules and guidelines for how to use the\\ncomponents in a component library. Style guides can be used to enforce\\nconsistency across a team, or across an entire organization. Other types of\\ndesign systems include pattern libraries and front-end frameworks. Pattern\\nlibraries are collections of UI patterns that can be reused in different\\ncontexts. Front-end frameworks are sets of code that can be used to build web\\napplications. Front-end frameworks often come with their own component libraries\\nand style guides.\"), mdx(\"h2\", {\n    \"id\": \"how-do-i-know-if-i-need-a-design-system\"\n  }, \"How do I know if I need a design system?\"), mdx(\"p\", null, \"If you\\u2019re not sure whether you need a design system, ask yourself the following\\nquestions: - Do you have a lot of different products or platforms that need to\\nbe designed? - Do you find yourself constantly reinventing the wheel when it\\ncomes to design? - Are your designers wasting time on creating assets that could\\nbe reused? - Do you have trouble maintaining consistency across your designs? If\\nyou answered yes to any of these questions, then it\\u2019s likely that a design\\nsystem would be beneficial for your organization. A design system can help to\\nstreamline your design process, improve efficiency, and create consistency\\nacross your products.\"), mdx(\"p\", null, mdx(\"span\", {\n    parentName: \"p\",\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"1024px\"\n    }\n  }, \"\\n      \", mdx(\"span\", {\n    parentName: \"span\",\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"100%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAIAAAAC64paAAAACXBIWXMAAAsTAAALEwEAmpwYAAADpElEQVQ4y5VUWW/cVBT2L+KJPwBv8ILEDwBVzUuLFAoPBKkVEggolRgQDeoCgQZVrUSStqKTVEmhTdIlmSwzWWbixLPZ49iO17Gv17vaXDcRFMQLn45lSz7nu+ee850j5C/AGMv/P4TjV8HB8iJnOaWM0qLkyxnlzzH1ieX/PEPgHhwTt1dVzUWkABFKMuKDFEQQEwoRySChhDMSzktx+f0XhYAwTTK6vHb421KgHiHgwECLxep682l/rlZsS5QzNntku0s3u/QoLGiZ4nEauZBmxPSIG7Bq1Yp35bs/zl8ZX6hU5r8af/LpeP3i9caNe7uinGkWbQ9Q//cWfvgUHpqkKHLKhDilXYN4Hip0y9lSzp4eb/ddK0Kq4hhWGA7B5NTOhcvWzWo+9QDK7WBoAFcyUs3mVRJAQkSFOA5iMa437A/OTSbrLVrbhj0jRmUdp+akS19sXL4RfD9NeibTosJpqnlXZmVwTFoyMRxMSL74YP/cyBV6p5pXruaLq4YUH3bo/KPOyOjtU6PTP91xJbXYEqFsEcxvztPmJ0sqaXWx2GNrs90Px341ND/S3dQGWUTAEJtWJra8mfviwjNT0bFm49VdFMY8PBeGIRlYpDKZvXUGvfdl+tGlx1EEHUBtD3kB5i7NdvjzzOC7H+qLK2ZngAf9UOxkME5zQgQ/IqpDP67Er7yRjJzPTo0tjV7YOF/RL07EN6f958vu9kE8u6TefyzrVuL4LJl5VKxvsbLaVAhiyu8wcRef/Yx+c6tY+MN+893lV99uvHbau/Vtx57dbB9E1rBwQW77xAXU3DsyD5wgJFyFAs9ePCqcZ81iasa/t7wr4jOftF5/p/7+mCj+UrPn6keyb7por4clFfV11NVxbTc1bMx1KYQJPdCotSKlG6LX97zDqDqtXPu6Wa2sdK7O709vAJChFO51ELdWD+kGBCHOIMOYB3ORqFC5VpWrm0ov3KoNNclLNC9eahw8FHee67aTRSGyPayoUDOg5yKYkRzjUmFRSjoa8XQwlN0nNe/z61JdKvugO8RNi7ZeNPZBZxCmuPD7+tpqF2JeZsoQLvscZ2XBHJ/6IdVcZm8rw4Yc9+3U9IdW0lWxC0ia0RSyCJQpvDyUAkTUA1QxSVsjokqULVNfVw53DE0aKmra1bgKqOFRyydhynA5l39HC3xIEeJTSfiERAkBMA9QEcAiyPIgpSChvJdcwvxvhighJ+vh5U3CXiyOEvl/2onPv/EnyS4vAU5+UKMAAAAASUVORK5CYII=')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  }), \"\\n  \", mdx(\"picture\", {\n    parentName: \"span\"\n  }, \"\\n          \", mdx(\"source\", {\n    parentName: \"picture\",\n    \"srcSet\": [\"/static/75751e1afed5261f6013a18327da63a8/53334/designSystem.webp 1024w\"],\n    \"sizes\": \"(max-width: 1024px) 100vw, 1024px\",\n    \"type\": \"image/webp\"\n  }), \"\\n          \", mdx(\"source\", {\n    parentName: \"picture\",\n    \"srcSet\": [\"/static/75751e1afed5261f6013a18327da63a8/658fc/designSystem.png 1024w\"],\n    \"sizes\": \"(max-width: 1024px) 100vw, 1024px\",\n    \"type\": \"image/png\"\n  }), \"\\n          \", mdx(\"img\", {\n    parentName: \"picture\",\n    \"className\": \"gatsby-resp-image-image\",\n    \"src\": \"/static/75751e1afed5261f6013a18327da63a8/658fc/designSystem.png\",\n    \"alt\": \"design system\",\n    \"title\": \"design system\",\n    \"loading\": \"lazy\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    }\n  }), \"\\n        \"), \"\\n    \")), mdx(\"h2\", {\n    \"id\": \"how-do-i-create-and-maintain-a-design-system-when-we-have-so-many-internal-products\"\n  }, \"How do I create and maintain a design system when we have so many internal products?\"), mdx(\"p\", null, \"Design systems are a great way to ensure consistency, usability and\\naccessibility across your products. But they can also be challenging to create\\nand maintain, especially when you have a large and diverse portfolio of internal\\nproducts. How do you balance the needs of different teams, stakeholders and\\nusers? How do you keep your design system up to date and relevant? How do you\\navoid duplication, fragmentation and confusion?\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Define the scope and purpose of your design system\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Involve your users and stakeholders from the start\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Establish a clear governance and ownership model\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Document and communicate your design system effectively\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Use tools and platforms that support collaboration and automation\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Iterate and evolve your design system over time\")));\n}\n;\nMDXContent.isMDXComponent = true;","tech":["TS","Nodejs","ReactIcon","Rust"],"category":"Post","appDescription":null,"hero":{"full":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAIEBQH/xAAWAQEBAQAAAAAAAAAAAAAAAAAAAQL/2gAMAwEAAhADEAAAAdCFOvNbrORdiHQf/8QAGhAAAgMBAQAAAAAAAAAAAAAAAgMAARQREv/aAAgBAQABBQJjLAiYVWBehM+QjuIMKXnXM65nVP/EABYRAAMAAAAAAAAAAAAAAAAAAAABEv/aAAgBAwEBPwGWSymUz//EABYRAQEBAAAAAAAAAAAAAAAAAAAREP/aAAgBAgEBPwHIj//EAB8QAAECBgMAAAAAAAAAAAAAAAACEQMQISIxoTJh4f/aAAgBAQAGPwLw6HGhrteV6qmNmNnE/8QAHBAAAwADAQEBAAAAAAAAAAAAAAERITFBYZHw/9oACAEBAAE/IUxcb2wnXDIn4Grqp30csjT4+GjLOw9f0ZnWfg/Rn//aAAwDAQACAAMAAAAQMMcB/8QAFhEAAwAAAAAAAAAAAAAAAAAAAAFh/9oACAEDAQE/EIsiyrKs/8QAFxEAAwEAAAAAAAAAAAAAAAAAABFRAf/aAAgBAgEBPxB5R5RIJD//xAAgEAEAAgICAQUAAAAAAAAAAAABABEhMUFR0WFxgfDx/9oACAEBAAE/EHamsgr5MUd4jaRC8ijw+0BFtprs3LAwio2WtruUgJKWOX5CgDiBdHGz0mjg+m5aoXCVEKPP5n//2Q==","aspectRatio":1,"src":"/static/60f53bc1df34e9dd797daa54291216ad/58fe7/designSystem1.jpg","srcSet":"/static/60f53bc1df34e9dd797daa54291216ad/e0f30/designSystem1.jpg 236w,\n/static/60f53bc1df34e9dd797daa54291216ad/86afd/designSystem1.jpg 472w,\n/static/60f53bc1df34e9dd797daa54291216ad/58fe7/designSystem1.jpg 944w,\n/static/60f53bc1df34e9dd797daa54291216ad/0ff54/designSystem1.jpg 1200w","srcWebp":"/static/60f53bc1df34e9dd797daa54291216ad/99fbb/designSystem1.webp","srcSetWebp":"/static/60f53bc1df34e9dd797daa54291216ad/77392/designSystem1.webp 236w,\n/static/60f53bc1df34e9dd797daa54291216ad/1f177/designSystem1.webp 472w,\n/static/60f53bc1df34e9dd797daa54291216ad/99fbb/designSystem1.webp 944w,\n/static/60f53bc1df34e9dd797daa54291216ad/9000d/designSystem1.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='M232%2048h-3c-2%200-2%200%200%201v2l-2-1h-7c-6%200-6%200-4%201%205%202%204%204-1%203l-7%201c-2%201-1%201%205%201%204%200%206%200%204%201s-2%201%202%201h6l5-1c2%200%202%200%201%202l-1%202%202-1c1-2%206-4%2012-5s16-5%2015-6l-7-1-5%201c2%201%202%201-1%202-4%201-6%201-2-1%202-1%202-1%200-1-1%200-2%200-1-1l-5-1-6%201M36%2052c-3%202-5%206-5%2011%200%203%200%203%201%202%202-2%202-2%203%201l4%207%202%203%203-2c9-9%202-28-8-22m211%206c-12%205-15%2028-6%2038l4%203h8c12-2%2018-8%2016-18l1-5c2-2-1-11-5-15-6-5-11-6-18-3m-123%203c0%203%200%204-1%203s-1%200-1%205c0%204%200%205%201%204%200-2%202-3%202-1%200%203-3%2011-4%2011v-2c2-4%201-4-1%200-3%204-5%202-3-2l1-3c-1%200-2%201-2%203l-2%201c0-4-3-4-4%201l-3%203-1%201-1%201c-4%201-4%201%200-2%204-5%207-13%204-14-7-1-7-1-7-5%200-2%200-3%201-2s4%201%204-1l-4-1-5%201%202%201c2%200%201%205-1%205s-2%200-1%201c3%200%202%202%200%205-3%203-4%203-3-1l1-6c0-2%200-3-1-1%200%202-1%202-2%202l-5-1c-3%200-3%200-3-4%200-3%200-3-1%200%200%203%200%203-5%203h-5l4%201c4%201%206%202%204%203-1%201-5%202-7%201l-1%201-4%201h-4c-1-2-1-2-4%200-2%201-3%200-3-4%200-2%200-2-2%200-1%202-1%203-2%202h-2l-3-1c-1-1-2%200-3%202l-6%206-3%202%205%201%2010%201h2c-3%201%205%202%2013%202%204%200%204%200%204%202-1%202%201%204%205%204l2%201-3%201h-3l-2%201c-3%200-4%202-1%202%202%200%202%200-1%202l-3%201h3l5%201h1c-1-2%202-3%206-2%202%201%203%203%201%205v1l2-2%205-2%206-1%207-2c2%200%203-1%203-2h1c0%202%202%203%2011%204%209%200%2011%202%202%202h-6l3%204c3%204%204%205%207%205s3%200%201-1l-2-1h2l3%201%202%201v-2c2-1%200-4-4-4l-3-1h3l4-1%201-1c2%202%206%200%206-3%201-4%202-4%2019-8%202%200%202%200%201-2l-2-3c-1-1-1%200-1%202s0%203-1%202h-10v-3c0-3%200-3%203-3l4-2%204-2c2%200%202%200%200-1-3-1-3-1%202-1l6-1h4c3%200%207-3%205-5l-1%201c-1%202-2%202-6%202-2%200-4%200-3%201l-4%201-10%201c-4%200-5%200-4-1l6-1c4-1%204-1-2-1-5%200-6%200-9%203l-5%203-4%203c-3%203-6%204-4%201%203-8%204-20%200-25v3m201%207h-6l-6%201c-2%200-1%207%201%207l1%202-1%202c-2%200-2%202-2%2011v12l1-11c0-11%200-11%203-12%203-2%204-1%202%201l-1%204c0%203%200%203%203%203h3l-3-1-2-1%202-1c2-1%202-1%203%201%202%203%203%206%202%207v1l-2%201c-3%200-2%203%202%208l3%203-1-6v-7h3c2%200%202%200%201%201s-2%202-1%2010v3l3-3%203-5%202-2%201-2%201-2%202-1c2-2%202-12%201-15v-1l-1-3-3-4h-7c-5%200-6%200-3-1l4-1h-4l-4%201m-98%2013c-6%201-6%201-6%208v7h-4l-5-1v-3l1-2c0-2-2-3-2%200-1%201-1%200-1-2v-4h5c3-1%205-1%204-2-2-1-29%204-29%206l1%201%201%202c1%201%201%201%201-1s1-3%206-4c10-2%209-2%2010%204a32%2032%200%20003%2012l-7-1-2-1%201%202c1%202%201%202-2%202s-3%200-2-1l1-2-2%201h-1c-1-1%200-2%204-2%204-1%204-1%204-4-1-5-2-5-8-4-5%200-5%200-6%204v5l-1%201h-2l1%201v1c-1%200-2-1-2-3s0-2-6-2l-5%201v-6c0-6-1-6-3-6s-2%200-2%206l-1%208c-3%203%208%2014%2012%2013l3%201-2%201h4l1-1c-3%200-2-2%201-2%203-1%203%200%202%201%200%201%200%202%202%201l3-5%201-4%206-2a17833%2017833%200%200034-5h3l-2-3-5-6c-1-3-1-3-2-1%200%203%200%203-4%202h-4l-2-5c0-3%202-5%207-5l4-1-1-1-5%201m24%2020l-5%202h-2l-3%201-7%201h-3c3%200%204%200%204%202%200%201%200%202%201%201l1%201%202%202c2%201%203%201%202%202-2%201-1%202%202%202l5%202%202%201c1-1-2-4-5-4l-2-1c1-1%203-2%209-2%207%200%207%200%202%201l-3%201c3%200%203%200%201%201h-2l2%204c2%203%203%204%206%205%205%201%209%203%2011%207l2%202c0-2%204-1%204%201l-2%201c-2-1-2%200-2%202s0%203-2%203l-4%201-1-1v-1l-1%202%204%201%205-1%201-2c0-2%201-3%203%200%202%201%202%201%206-2l4-4h-4c-4%200-5%200-4-4%200-3%204-3%204%200%200%202%201%203%202%203%202%201%202%200%202-2%200-3-3-5-7-5h-2l4-2c2%200%203-1%203-2%201-1%201-1%202%201v2l3-2c3-2%204-2%2014-1l29%204c2%200%205%206%205%2010%200%202%200%202%204%202%203%200%203%200%203-3s0-3%201-2l5%202%203%203c0%201%200%202%201%201v-6h5c4%200%205%201%206%202v-2c0-3-1-6-3-7-3-3-3-4%201-4l6-2a1141%201141%200%2001-103-18l-15%201m-115%208v3l-6-1-9-1c-4%200-4%200-4%202%200%204%208%206%2011%203h1c1%202-1%202-24%201l-18-2-1%203c1%204%201%204%2022%205%2010%201%2011%201%2010-1l1-2c1-1%201%200%201%201%200%203%202%204%2015%204l7%201v-4c0-3-1-3-2-3-2%200-2%200-1-1l1-3%201-2%201%202%202%202c3-1%204%201%201%202-2%200-2%201-2%204l1%203%201-3c0-4%202-4%202%200%201%204%206%204%206%200s-8-13-12-13l-5-2v2m148%200v1l9%201c30%205%2066%208%2059%205a1467%201467%200%2000-68-7m-231%205c-19%205-24%206-23%207%202%200%202%201%202%203-1%202-1%202%204%201%209-1%209-1%2010-5%200-4%202-4%202%200l1%203%201-1%202-2c2%200%202%200%201%201s-1%201%202%201l17-2h13v-3c0-3%200-3-5-3-13-2-20-2-27%200m3%2010l-24%204c-4%200%204%202%2010%202l10%201h15c12%200%2013%200%2012%202%200%201%200%202%202%203%203%200%204%202%202%202l-5%204c-3%202-4%204-3%204l2-1h1c-1%201%2010%204%2022%204l11%202%203-1%202-1%2014%201%2015%201%201%201v1c1%202%201%202-2%203-4%201-5%201-1%201l4-1h1c3%202%203%201%201-1-2-3-2-4%201-2l1%202%201%201c1-1%204%202%204%204l-2%203-2%201-6%201c-6%200-8%201-6%205h1c0-2%206-3%2016-1%204%200%204%200%202%201s-2%201-1%202l3-1h1l1%201v-13l1-12-3%202h-3v-2c3%201%206-2%205-5%200-4-2-5-4-2-3%202-6%202-7%200%200-2%200-2%202-2%201%201%203%200%205-1l2-2-2-1c-2-2-4-2-11%200-14%202-14%202-14-2l-1-4h6c3%200%205%200%204-1a916%20916%200%2000-87-3m240%207c0%208%200%209%202%209h4c6%202%2013%202%2012%201-2-1-3-3%200-3%201%201%201%200%201-4v-4l1%204%201%205v-5c0-3%201-4%203-6%203-3%203-4-8-4l-13-2h-3v9m-56-6c-2%201-2%205-2%2043v43h7v-42c0-39%200-42-2-44h-3m6%2043v45h-16l-12-1c5%200%205%200%205-3%200-2%200-3-2-3s-2%200%201-4l3-5h-1c-1%201-1%201-1-1l1-4c0-2%201-1%201%201l1%204v-4c0-6%201-9%203-9l1-1-3-1c-4%200-4%200-4%203%200%206-2%2014-4%2017s-2%202-1-2l3-7c0-5%200-5-2-5l-2%201%202%201%201%202-1%204-4%201h-4v-7c0-7%201-9%204-6s5%203%206%201c2-3%201-3-4-3s-6%200-6-7c0-3%200-3%204-3l4-1-5-1-5-1c-1-1-1-1-1%201%201%203-3%204-4%201v-3l-1-1c-3%200-4-2-2-4%202-1%202-2%202-3-1%200-2%200-3%202h-4l-16-1c-2%200-2%201-2%202%201%201%200%202-1%202-1%201-1%201%201%201l2%201%208%201c9-1%2010-1%2012%202%203%204%202%204-3%203h-12c-6%200-6%200-6-2%200-1%200-2-1-1-1%200-1%208%201%2022l-1%2012c0%204%200%205%203%207%2010%209%2015%2015%2011%2017l-1%202-2%204-4%203h-1c0-1-5%200-7%202h-2l-1-1c0-2-2-3-4-2l-1-3c0-2%200-3-1-1-3%2014-17%2031-27%2033-3%200-3%200-3-4%200-8%200-8%208-8h7l-7-1-6-1h5l8-2%202-2-2-3-1-4%201-2%202-4c2-3%202-3%205-2%202%202%203%202%203%201l-2-1c-2-1-2-1%200-3l2-1h8l-4-1h-3v-23l-1-25v-2h-10c-9%200-10%200-10%202h17c2%201%200%201-5%201-7%200-8%200-8%202%200%203%202%204%208%203l5-1%201-2c1-1%201%201%201%204v6h-8c-7%200-8%200-8-2%200-1-1-2-5-2l-4-1%201%205c0%204-1%206-2%203h-10l3-1c3%201%203%200%203-3s0-3-3-3l-4-2c-1-2-1-2-1%202l-1%208v5h-10c-10%200-12-1-10-5v-3l4-1%204%201c0%202%201%200%202-2l-1-3-1%202-4%201-4-1-1-1-1%204c0%207-2%2015-5%2018l-3%202%201-3v-1l1-1%201-1-14-1c-14%200-14%200-12%202l2%201c2-1%202%203%201%207s-1%204-6%204l-6-1-2%203c-2%203-2%203-3%202%200-2%200-2-1-1s-1%200-1-2l1-3-2%203-2%204%201-4v-3l-2%202c-1%203-1%203-2%202-1-2-1-2-2%200-3%208-10%2013-17%2013l-4%201%2023%204%2011%202c3%202%2012%203%2018%203%204%200%204%200%207%206l4%207-16%201a99%2099%200%2000-22%202c-2%200-2%200%200%203v6c-1%201%200%201%202%201l4%201%202%201%206%202h8l13-2c10%200%2010%200%2011-3s1-3-6-3c-5%200-6%200-6%202%200%201%200%203-2%203h-2v-4c1-4%202-4%206-4%207%200%2013%202%2013%204l-2%204c0%202%205%204%2011%203%203-1%206-1%209%201%204%201%2010%201%2018-1%202%200%202%200%201%201l-4%201c-2%200-2%200%201%201l4%203c2%201%202%201%202-6l1-8%201%203c0%204%202%208%205%208l1%201-3%201-4%201h8l39%202c-3%202-43%204-45%202l-2-2v2c1%201%201%201-3%201s-5%200-7-4c-3-4-4-5-4-2l-2%201-2%201h4l2%201v1l1%201-6%201c-5%200-6%200-7-3-3-4-7-7-8-5-2%201-2%202%201%204l2%204h-3c-2%200-4-1-8-5-2-3-6-5-7-5s-1%201%203%205l6%205H0v37l1%2038h46a733%20733%200%200145%203l4%201c3%200%203%200%202-1h9c6%202%206%203%201%203h-4l2%201h10c2-2%202-2-4-3l-6-3c1-1%2011%202%2013%204l4%201c2-1%202-1-1-2l-7-3c-8-1-1-1%2035-1a36539%2036539%200%200046%202c-5%200-5%202%200%203%204%200%204%200%202%201l-3%201h3c3%201%205%205%202%205v1l1%201c0%203%200%203%201%201l2-3c0-2%203-3%203-1l2%201h7l-3-2c-5-1-4-2%201-3h17c0%201-6%203-10%203-3%200-3%201-3%203%200%204%200%205%202%203%200-2%201-2%201-1l2%201%202-2h1c1%202%205%202%205%201-1-1%200-3%201-3v-2c-1%200-1-1%201-2%201-2%202-2%203-1l6%203c4%200%204%200%202%201h-6c-4-1-5-1-3%201l5%201c5%200%2019-3%2017-4-3%200-5-2-3-2l1-1%202-2h-3c-13%201-23-1-14-3l7-1a832%20832%200%200166%202c1-2%203-2%2044-2%2038%200%2043%200%2043-2l1-37v-36h-53l2-3%206-10%204-6h14c1%201%202%201%202-1l3-3c4-2%206-2-18-1a31425%2031425%200%2001-111%208l-11%201c-3%201%204%201%2030-1a451%20451%200%2001-79-2h-1l-3%201h-2l2-1%203-1h-3c-2%200-2%200-1-1l4-1c1%201%201%200%201-2s0-3%201-2l1%202v3h22a335%20335%200%200064-2l19-1%201-17v-16l-51%201-52-1v-3l1-2v5h37l-17-1-17-1%203-1c3%201%203%201%203-2l1-2v5l15-1c12%200%2015%200%2016%202%200%201%209%201%209-1l11-2a1274%201274%200%200023%202l1-1c1-2%205-2%205%200%200%203%202%200%203-4%201-3%201-4%201-1l-1%204%205-1h4l-1-6c0-6%201-6%201%201l1%205h7l11%202%203%202h-4l-10%201h-7v33h9a3693%203693%200%200161-5l7-2%201-1c3%200%200-2-5-3l-6-2%203-10%203-11h-24l-27-1c-4-2-5-4-3-4l3%201h1l28-1c27%200%2034-1%2032-3-2-4%205-9%2012-8h2c1-2%200-2-3-2l-4-2v-3h-1l-1-1-1-1c-2-1-1-3%201-3%201-1%200-1-2-1h-5a402%20402%200%2000-56-2c-3%200-4%200-3-2%200-2%201-2%205-2%203%200%204%200%204-2h1c0%203%202%202%202%200%201-3%203-2%204%201%200%202%201%202%208%202h7v-8l1-7v15h12v-14l1%207v7h3c2%200%203%200%203-3%201-4%203-5%206-5l4-2c2-2%202-2-2-3-2-1-1-1%201-1%204%200%206%202%203%204-1%202-1%202%202%202s3%200%203-2c-1-1%200-2%201-3%202-1%202-2%200-3-1-1-22-3-37-3h-6l6%201%2015%201%2011%201h-7a430%20430%200%2000-26-2c0-2-24-4-45-4l-9-1h17c20%200%2020%200%2024-3l4-2v3c0%202%200%203%202%203l7%201c4%200%208-2%208-5l2-1c2%200%202%200%201%201v5l1-2%201-2v5h20c1%202%203%201%203-1l-1-3%201-2c1-2%202-2%204%201%203%203%203%203%200%203-2-1-3%200-3%201%200%202%201%202%204%202%204%200%204-2%201-6-1-1-2-3-1-4l-1-1-2-1-2%202c-1%201-1%200-1-2%200-4-1-5-7-6-2-1-3-1-3%201-1%201%200%202%202%202%202%201%201%201-2%201l-5%202c-2%202-5%202-5%201l2-2c5-1%201-2-10-2l-14-2-1%201c1%201%200%202-1%202l-1-1c0-1-1-2-3-2-4%200-6-2-2-2%205%200%202-2-4-2-6-1-6-1-5-3s2-2%202%200c1%201%205%202%205%200s-2-3-8-4a320%20320%200%2001-13%200l-3%201c-1%200-2%200-1-1l-3-1h-4l-2%201c0%202%202%203%2015%204l10%201-3%201-14-2c-9%200-11-1-11-2s-2%201-3%205c-2%205-2%2017-1%2019l18%201%2017%201-18-1h-17v16l1%2015%201%202-1%201-1%205-1%207a527%20527%200%20010-81c1-5-1-5-6-1-6%205-16%206-23%200-5-3-5-3-5%203l1%205h6c11%200%2016%201%2016%203l2%201h-12c-15%200-17-1-15-4s1-12%200-12c-1-1-2%200-2%202l-1-3-1-9-1%2043m91-24c0%205%200%207-2%207h-1v-4c-2-5-5-3-4%203%201%204%202%205%2014%205%207%201%207%201%206-1l-1-3c-7%200-7%200-1-1l7-1h-6c-4%200-6%200-4-1h8c7%200%2010%203%207%207-1%202-1%202%202%202s3%200%202-1l-1-4c0-3%203-2%204%201%201%202%201%202%201-1l1-4v-4l-1-3h-2l-3-1-4-1c-10%200-17%200-16-1s1-1-2-1h-4v7m-54%201c0%205%200%206-2%208s-2%203-2%208c0%206%200%207-1%206l-3%201c0%201-1%202-3%202h-2v12c1%2012%201%2012-2%2014-2%202-2%203-2%208v7h4c4%200%204%200%204-4%200-2%200-3%201-2%201%204%202-1%202-15v-17c-2-2-1-4%201-4l1%2024%201%2024v-61l3-2c2-2%202-3%202-7-1-7-3-8-2-2m-31%208l-1%205v4h9l13%201h4v-4c0-5-2-6-12-6-5%200-5%200-2%201%204%200%204%200%204%204%200%203%200%203-1%201%200-3-1-4-6-4-4%200-6-1-7-2h-1M23%20163c-8%204-13%2015-13%2030v5c0-9%202-8%202%201%201%2010%203%2017%206%2023%202%204%205%207%205%205l-5-10c-2-2-3-13-2-16%201-4%202-4%206%200%203%203%204%205%2010%2018%204%2010%206%2011%2010%207%206-6%207-13%207-28%201-15-1-20-6-28-5-9-12-11-20-7m271%2022h-1c-3%200-4%202-4%205l1%204h30v-3c0-3%200-3-2-2l-13-1c-9%200-10%200-10-2v-2l-1%201m-1%2020c4%202%206%204%206%207v1l1-4v-3h9l9%201h1l5-1%205%201h5l3-1%203%201v1l2-1c0-2%2013-1%2013%200h2l5-1h5l-17-1a3780%203780%200%2001-57%200m-32%207c0%201-3%202-3%200l-3-1-3%201v1c4%200%202%203-1%203l11%201%2015-1c0-4-1-5-8-4l-6-1v-1l-2%202m-111%2063v5h19c14%200%2017%200%2012-1-14-2-18-2-19-1l-3%201c-2%200-2%200-2-4%200-5%200-5-2-5s-3%201-3%202c0%202%200%202-1%200s-1-1-1%203m48-1l-1%201-1%202v2l-1%201h-1l-2%203-4%202c-2%201%206%202%208%200h1l17%201c20%200%2019-2-1-2l-12-1h-5c0-1%202-3%204-3v-4l-1-4-1%202m-14%2046l-1%207c1%207%201%208%207%207%204-1%203-5-2-6-3%200-4-2-1-2%202%200%203-2%204-5%201-2%200-2-2-2l-5%201'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"regular":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAIEBQH/xAAWAQEBAQAAAAAAAAAAAAAAAAAAAQL/2gAMAwEAAhADEAAAAdCFOvNbrORdiHQf/8QAGhAAAgMBAQAAAAAAAAAAAAAAAgMAARQREv/aAAgBAQABBQJjLAiYVWBehM+QjuIMKXnXM65nVP/EABYRAAMAAAAAAAAAAAAAAAAAAAABEv/aAAgBAwEBPwGWSymUz//EABYRAQEBAAAAAAAAAAAAAAAAAAAREP/aAAgBAgEBPwHIj//EAB8QAAECBgMAAAAAAAAAAAAAAAACEQMQISIxoTJh4f/aAAgBAQAGPwLw6HGhrteV6qmNmNnE/8QAHBAAAwADAQEBAAAAAAAAAAAAAAERITFBYZHw/9oACAEBAAE/IUxcb2wnXDIn4Grqp30csjT4+GjLOw9f0ZnWfg/Rn//aAAwDAQACAAMAAAAQMMcB/8QAFhEAAwAAAAAAAAAAAAAAAAAAAAFh/9oACAEDAQE/EIsiyrKs/8QAFxEAAwEAAAAAAAAAAAAAAAAAABFRAf/aAAgBAgEBPxB5R5RIJD//xAAgEAEAAgICAQUAAAAAAAAAAAABABEhMUFR0WFxgfDx/9oACAEBAAE/EHamsgr5MUd4jaRC8ijw+0BFtprs3LAwio2WtruUgJKWOX5CgDiBdHGz0mjg+m5aoXCVEKPP5n//2Q==","aspectRatio":1,"src":"/static/60f53bc1df34e9dd797daa54291216ad/1dc0b/designSystem1.jpg","srcSet":"/static/60f53bc1df34e9dd797daa54291216ad/3a5ce/designSystem1.jpg 163w,\n/static/60f53bc1df34e9dd797daa54291216ad/05730/designSystem1.jpg 327w,\n/static/60f53bc1df34e9dd797daa54291216ad/1dc0b/designSystem1.jpg 653w,\n/static/60f53bc1df34e9dd797daa54291216ad/f72c7/designSystem1.jpg 980w,\n/static/60f53bc1df34e9dd797daa54291216ad/0ff54/designSystem1.jpg 1200w","srcWebp":"/static/60f53bc1df34e9dd797daa54291216ad/0acdf/designSystem1.webp","srcSetWebp":"/static/60f53bc1df34e9dd797daa54291216ad/ac59e/designSystem1.webp 163w,\n/static/60f53bc1df34e9dd797daa54291216ad/7660b/designSystem1.webp 327w,\n/static/60f53bc1df34e9dd797daa54291216ad/0acdf/designSystem1.webp 653w,\n/static/60f53bc1df34e9dd797daa54291216ad/75470/designSystem1.webp 980w,\n/static/60f53bc1df34e9dd797daa54291216ad/9000d/designSystem1.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='M232%2048h-3c-2%200-2%200%200%201v2l-2-1h-7c-6%200-6%200-4%201%205%202%204%204-1%203l-7%201c-2%201-1%201%205%201%204%200%206%200%204%201s-2%201%202%201h6l5-1c2%200%202%200%201%202l-1%202%202-1c1-2%206-4%2012-5s16-5%2015-6l-7-1-5%201c2%201%202%201-1%202-4%201-6%201-2-1%202-1%202-1%200-1-1%200-2%200-1-1l-5-1-6%201M36%2052c-3%202-5%206-5%2011%200%203%200%203%201%202%202-2%202-2%203%201l4%207%202%203%203-2c9-9%202-28-8-22m211%206c-12%205-15%2028-6%2038l4%203h8c12-2%2018-8%2016-18l1-5c2-2-1-11-5-15-6-5-11-6-18-3m-123%203c0%203%200%204-1%203s-1%200-1%205c0%204%200%205%201%204%200-2%202-3%202-1%200%203-3%2011-4%2011v-2c2-4%201-4-1%200-3%204-5%202-3-2l1-3c-1%200-2%201-2%203l-2%201c0-4-3-4-4%201l-3%203-1%201-1%201c-4%201-4%201%200-2%204-5%207-13%204-14-7-1-7-1-7-5%200-2%200-3%201-2s4%201%204-1l-4-1-5%201%202%201c2%200%201%205-1%205s-2%200-1%201c3%200%202%202%200%205-3%203-4%203-3-1l1-6c0-2%200-3-1-1%200%202-1%202-2%202l-5-1c-3%200-3%200-3-4%200-3%200-3-1%200%200%203%200%203-5%203h-5l4%201c4%201%206%202%204%203-1%201-5%202-7%201l-1%201-4%201h-4c-1-2-1-2-4%200-2%201-3%200-3-4%200-2%200-2-2%200-1%202-1%203-2%202h-2l-3-1c-1-1-2%200-3%202l-6%206-3%202%205%201%2010%201h2c-3%201%205%202%2013%202%204%200%204%200%204%202-1%202%201%204%205%204l2%201-3%201h-3l-2%201c-3%200-4%202-1%202%202%200%202%200-1%202l-3%201h3l5%201h1c-1-2%202-3%206-2%202%201%203%203%201%205v1l2-2%205-2%206-1%207-2c2%200%203-1%203-2h1c0%202%202%203%2011%204%209%200%2011%202%202%202h-6l3%204c3%204%204%205%207%205s3%200%201-1l-2-1h2l3%201%202%201v-2c2-1%200-4-4-4l-3-1h3l4-1%201-1c2%202%206%200%206-3%201-4%202-4%2019-8%202%200%202%200%201-2l-2-3c-1-1-1%200-1%202s0%203-1%202h-10v-3c0-3%200-3%203-3l4-2%204-2c2%200%202%200%200-1-3-1-3-1%202-1l6-1h4c3%200%207-3%205-5l-1%201c-1%202-2%202-6%202-2%200-4%200-3%201l-4%201-10%201c-4%200-5%200-4-1l6-1c4-1%204-1-2-1-5%200-6%200-9%203l-5%203-4%203c-3%203-6%204-4%201%203-8%204-20%200-25v3m201%207h-6l-6%201c-2%200-1%207%201%207l1%202-1%202c-2%200-2%202-2%2011v12l1-11c0-11%200-11%203-12%203-2%204-1%202%201l-1%204c0%203%200%203%203%203h3l-3-1-2-1%202-1c2-1%202-1%203%201%202%203%203%206%202%207v1l-2%201c-3%200-2%203%202%208l3%203-1-6v-7h3c2%200%202%200%201%201s-2%202-1%2010v3l3-3%203-5%202-2%201-2%201-2%202-1c2-2%202-12%201-15v-1l-1-3-3-4h-7c-5%200-6%200-3-1l4-1h-4l-4%201m-98%2013c-6%201-6%201-6%208v7h-4l-5-1v-3l1-2c0-2-2-3-2%200-1%201-1%200-1-2v-4h5c3-1%205-1%204-2-2-1-29%204-29%206l1%201%201%202c1%201%201%201%201-1s1-3%206-4c10-2%209-2%2010%204a32%2032%200%20003%2012l-7-1-2-1%201%202c1%202%201%202-2%202s-3%200-2-1l1-2-2%201h-1c-1-1%200-2%204-2%204-1%204-1%204-4-1-5-2-5-8-4-5%200-5%200-6%204v5l-1%201h-2l1%201v1c-1%200-2-1-2-3s0-2-6-2l-5%201v-6c0-6-1-6-3-6s-2%200-2%206l-1%208c-3%203%208%2014%2012%2013l3%201-2%201h4l1-1c-3%200-2-2%201-2%203-1%203%200%202%201%200%201%200%202%202%201l3-5%201-4%206-2a17833%2017833%200%200034-5h3l-2-3-5-6c-1-3-1-3-2-1%200%203%200%203-4%202h-4l-2-5c0-3%202-5%207-5l4-1-1-1-5%201m24%2020l-5%202h-2l-3%201-7%201h-3c3%200%204%200%204%202%200%201%200%202%201%201l1%201%202%202c2%201%203%201%202%202-2%201-1%202%202%202l5%202%202%201c1-1-2-4-5-4l-2-1c1-1%203-2%209-2%207%200%207%200%202%201l-3%201c3%200%203%200%201%201h-2l2%204c2%203%203%204%206%205%205%201%209%203%2011%207l2%202c0-2%204-1%204%201l-2%201c-2-1-2%200-2%202s0%203-2%203l-4%201-1-1v-1l-1%202%204%201%205-1%201-2c0-2%201-3%203%200%202%201%202%201%206-2l4-4h-4c-4%200-5%200-4-4%200-3%204-3%204%200%200%202%201%203%202%203%202%201%202%200%202-2%200-3-3-5-7-5h-2l4-2c2%200%203-1%203-2%201-1%201-1%202%201v2l3-2c3-2%204-2%2014-1l29%204c2%200%205%206%205%2010%200%202%200%202%204%202%203%200%203%200%203-3s0-3%201-2l5%202%203%203c0%201%200%202%201%201v-6h5c4%200%205%201%206%202v-2c0-3-1-6-3-7-3-3-3-4%201-4l6-2a1141%201141%200%2001-103-18l-15%201m-115%208v3l-6-1-9-1c-4%200-4%200-4%202%200%204%208%206%2011%203h1c1%202-1%202-24%201l-18-2-1%203c1%204%201%204%2022%205%2010%201%2011%201%2010-1l1-2c1-1%201%200%201%201%200%203%202%204%2015%204l7%201v-4c0-3-1-3-2-3-2%200-2%200-1-1l1-3%201-2%201%202%202%202c3-1%204%201%201%202-2%200-2%201-2%204l1%203%201-3c0-4%202-4%202%200%201%204%206%204%206%200s-8-13-12-13l-5-2v2m148%200v1l9%201c30%205%2066%208%2059%205a1467%201467%200%2000-68-7m-231%205c-19%205-24%206-23%207%202%200%202%201%202%203-1%202-1%202%204%201%209-1%209-1%2010-5%200-4%202-4%202%200l1%203%201-1%202-2c2%200%202%200%201%201s-1%201%202%201l17-2h13v-3c0-3%200-3-5-3-13-2-20-2-27%200m3%2010l-24%204c-4%200%204%202%2010%202l10%201h15c12%200%2013%200%2012%202%200%201%200%202%202%203%203%200%204%202%202%202l-5%204c-3%202-4%204-3%204l2-1h1c-1%201%2010%204%2022%204l11%202%203-1%202-1%2014%201%2015%201%201%201v1c1%202%201%202-2%203-4%201-5%201-1%201l4-1h1c3%202%203%201%201-1-2-3-2-4%201-2l1%202%201%201c1-1%204%202%204%204l-2%203-2%201-6%201c-6%200-8%201-6%205h1c0-2%206-3%2016-1%204%200%204%200%202%201s-2%201-1%202l3-1h1l1%201v-13l1-12-3%202h-3v-2c3%201%206-2%205-5%200-4-2-5-4-2-3%202-6%202-7%200%200-2%200-2%202-2%201%201%203%200%205-1l2-2-2-1c-2-2-4-2-11%200-14%202-14%202-14-2l-1-4h6c3%200%205%200%204-1a916%20916%200%2000-87-3m240%207c0%208%200%209%202%209h4c6%202%2013%202%2012%201-2-1-3-3%200-3%201%201%201%200%201-4v-4l1%204%201%205v-5c0-3%201-4%203-6%203-3%203-4-8-4l-13-2h-3v9m-56-6c-2%201-2%205-2%2043v43h7v-42c0-39%200-42-2-44h-3m6%2043v45h-16l-12-1c5%200%205%200%205-3%200-2%200-3-2-3s-2%200%201-4l3-5h-1c-1%201-1%201-1-1l1-4c0-2%201-1%201%201l1%204v-4c0-6%201-9%203-9l1-1-3-1c-4%200-4%200-4%203%200%206-2%2014-4%2017s-2%202-1-2l3-7c0-5%200-5-2-5l-2%201%202%201%201%202-1%204-4%201h-4v-7c0-7%201-9%204-6s5%203%206%201c2-3%201-3-4-3s-6%200-6-7c0-3%200-3%204-3l4-1-5-1-5-1c-1-1-1-1-1%201%201%203-3%204-4%201v-3l-1-1c-3%200-4-2-2-4%202-1%202-2%202-3-1%200-2%200-3%202h-4l-16-1c-2%200-2%201-2%202%201%201%200%202-1%202-1%201-1%201%201%201l2%201%208%201c9-1%2010-1%2012%202%203%204%202%204-3%203h-12c-6%200-6%200-6-2%200-1%200-2-1-1-1%200-1%208%201%2022l-1%2012c0%204%200%205%203%207%2010%209%2015%2015%2011%2017l-1%202-2%204-4%203h-1c0-1-5%200-7%202h-2l-1-1c0-2-2-3-4-2l-1-3c0-2%200-3-1-1-3%2014-17%2031-27%2033-3%200-3%200-3-4%200-8%200-8%208-8h7l-7-1-6-1h5l8-2%202-2-2-3-1-4%201-2%202-4c2-3%202-3%205-2%202%202%203%202%203%201l-2-1c-2-1-2-1%200-3l2-1h8l-4-1h-3v-23l-1-25v-2h-10c-9%200-10%200-10%202h17c2%201%200%201-5%201-7%200-8%200-8%202%200%203%202%204%208%203l5-1%201-2c1-1%201%201%201%204v6h-8c-7%200-8%200-8-2%200-1-1-2-5-2l-4-1%201%205c0%204-1%206-2%203h-10l3-1c3%201%203%200%203-3s0-3-3-3l-4-2c-1-2-1-2-1%202l-1%208v5h-10c-10%200-12-1-10-5v-3l4-1%204%201c0%202%201%200%202-2l-1-3-1%202-4%201-4-1-1-1-1%204c0%207-2%2015-5%2018l-3%202%201-3v-1l1-1%201-1-14-1c-14%200-14%200-12%202l2%201c2-1%202%203%201%207s-1%204-6%204l-6-1-2%203c-2%203-2%203-3%202%200-2%200-2-1-1s-1%200-1-2l1-3-2%203-2%204%201-4v-3l-2%202c-1%203-1%203-2%202-1-2-1-2-2%200-3%208-10%2013-17%2013l-4%201%2023%204%2011%202c3%202%2012%203%2018%203%204%200%204%200%207%206l4%207-16%201a99%2099%200%2000-22%202c-2%200-2%200%200%203v6c-1%201%200%201%202%201l4%201%202%201%206%202h8l13-2c10%200%2010%200%2011-3s1-3-6-3c-5%200-6%200-6%202%200%201%200%203-2%203h-2v-4c1-4%202-4%206-4%207%200%2013%202%2013%204l-2%204c0%202%205%204%2011%203%203-1%206-1%209%201%204%201%2010%201%2018-1%202%200%202%200%201%201l-4%201c-2%200-2%200%201%201l4%203c2%201%202%201%202-6l1-8%201%203c0%204%202%208%205%208l1%201-3%201-4%201h8l39%202c-3%202-43%204-45%202l-2-2v2c1%201%201%201-3%201s-5%200-7-4c-3-4-4-5-4-2l-2%201-2%201h4l2%201v1l1%201-6%201c-5%200-6%200-7-3-3-4-7-7-8-5-2%201-2%202%201%204l2%204h-3c-2%200-4-1-8-5-2-3-6-5-7-5s-1%201%203%205l6%205H0v37l1%2038h46a733%20733%200%200145%203l4%201c3%200%203%200%202-1h9c6%202%206%203%201%203h-4l2%201h10c2-2%202-2-4-3l-6-3c1-1%2011%202%2013%204l4%201c2-1%202-1-1-2l-7-3c-8-1-1-1%2035-1a36539%2036539%200%200046%202c-5%200-5%202%200%203%204%200%204%200%202%201l-3%201h3c3%201%205%205%202%205v1l1%201c0%203%200%203%201%201l2-3c0-2%203-3%203-1l2%201h7l-3-2c-5-1-4-2%201-3h17c0%201-6%203-10%203-3%200-3%201-3%203%200%204%200%205%202%203%200-2%201-2%201-1l2%201%202-2h1c1%202%205%202%205%201-1-1%200-3%201-3v-2c-1%200-1-1%201-2%201-2%202-2%203-1l6%203c4%200%204%200%202%201h-6c-4-1-5-1-3%201l5%201c5%200%2019-3%2017-4-3%200-5-2-3-2l1-1%202-2h-3c-13%201-23-1-14-3l7-1a832%20832%200%200166%202c1-2%203-2%2044-2%2038%200%2043%200%2043-2l1-37v-36h-53l2-3%206-10%204-6h14c1%201%202%201%202-1l3-3c4-2%206-2-18-1a31425%2031425%200%2001-111%208l-11%201c-3%201%204%201%2030-1a451%20451%200%2001-79-2h-1l-3%201h-2l2-1%203-1h-3c-2%200-2%200-1-1l4-1c1%201%201%200%201-2s0-3%201-2l1%202v3h22a335%20335%200%200064-2l19-1%201-17v-16l-51%201-52-1v-3l1-2v5h37l-17-1-17-1%203-1c3%201%203%201%203-2l1-2v5l15-1c12%200%2015%200%2016%202%200%201%209%201%209-1l11-2a1274%201274%200%200023%202l1-1c1-2%205-2%205%200%200%203%202%200%203-4%201-3%201-4%201-1l-1%204%205-1h4l-1-6c0-6%201-6%201%201l1%205h7l11%202%203%202h-4l-10%201h-7v33h9a3693%203693%200%200161-5l7-2%201-1c3%200%200-2-5-3l-6-2%203-10%203-11h-24l-27-1c-4-2-5-4-3-4l3%201h1l28-1c27%200%2034-1%2032-3-2-4%205-9%2012-8h2c1-2%200-2-3-2l-4-2v-3h-1l-1-1-1-1c-2-1-1-3%201-3%201-1%200-1-2-1h-5a402%20402%200%2000-56-2c-3%200-4%200-3-2%200-2%201-2%205-2%203%200%204%200%204-2h1c0%203%202%202%202%200%201-3%203-2%204%201%200%202%201%202%208%202h7v-8l1-7v15h12v-14l1%207v7h3c2%200%203%200%203-3%201-4%203-5%206-5l4-2c2-2%202-2-2-3-2-1-1-1%201-1%204%200%206%202%203%204-1%202-1%202%202%202s3%200%203-2c-1-1%200-2%201-3%202-1%202-2%200-3-1-1-22-3-37-3h-6l6%201%2015%201%2011%201h-7a430%20430%200%2000-26-2c0-2-24-4-45-4l-9-1h17c20%200%2020%200%2024-3l4-2v3c0%202%200%203%202%203l7%201c4%200%208-2%208-5l2-1c2%200%202%200%201%201v5l1-2%201-2v5h20c1%202%203%201%203-1l-1-3%201-2c1-2%202-2%204%201%203%203%203%203%200%203-2-1-3%200-3%201%200%202%201%202%204%202%204%200%204-2%201-6-1-1-2-3-1-4l-1-1-2-1-2%202c-1%201-1%200-1-2%200-4-1-5-7-6-2-1-3-1-3%201-1%201%200%202%202%202%202%201%201%201-2%201l-5%202c-2%202-5%202-5%201l2-2c5-1%201-2-10-2l-14-2-1%201c1%201%200%202-1%202l-1-1c0-1-1-2-3-2-4%200-6-2-2-2%205%200%202-2-4-2-6-1-6-1-5-3s2-2%202%200c1%201%205%202%205%200s-2-3-8-4a320%20320%200%2001-13%200l-3%201c-1%200-2%200-1-1l-3-1h-4l-2%201c0%202%202%203%2015%204l10%201-3%201-14-2c-9%200-11-1-11-2s-2%201-3%205c-2%205-2%2017-1%2019l18%201%2017%201-18-1h-17v16l1%2015%201%202-1%201-1%205-1%207a527%20527%200%20010-81c1-5-1-5-6-1-6%205-16%206-23%200-5-3-5-3-5%203l1%205h6c11%200%2016%201%2016%203l2%201h-12c-15%200-17-1-15-4s1-12%200-12c-1-1-2%200-2%202l-1-3-1-9-1%2043m91-24c0%205%200%207-2%207h-1v-4c-2-5-5-3-4%203%201%204%202%205%2014%205%207%201%207%201%206-1l-1-3c-7%200-7%200-1-1l7-1h-6c-4%200-6%200-4-1h8c7%200%2010%203%207%207-1%202-1%202%202%202s3%200%202-1l-1-4c0-3%203-2%204%201%201%202%201%202%201-1l1-4v-4l-1-3h-2l-3-1-4-1c-10%200-17%200-16-1s1-1-2-1h-4v7m-54%201c0%205%200%206-2%208s-2%203-2%208c0%206%200%207-1%206l-3%201c0%201-1%202-3%202h-2v12c1%2012%201%2012-2%2014-2%202-2%203-2%208v7h4c4%200%204%200%204-4%200-2%200-3%201-2%201%204%202-1%202-15v-17c-2-2-1-4%201-4l1%2024%201%2024v-61l3-2c2-2%202-3%202-7-1-7-3-8-2-2m-31%208l-1%205v4h9l13%201h4v-4c0-5-2-6-12-6-5%200-5%200-2%201%204%200%204%200%204%204%200%203%200%203-1%201%200-3-1-4-6-4-4%200-6-1-7-2h-1M23%20163c-8%204-13%2015-13%2030v5c0-9%202-8%202%201%201%2010%203%2017%206%2023%202%204%205%207%205%205l-5-10c-2-2-3-13-2-16%201-4%202-4%206%200%203%203%204%205%2010%2018%204%2010%206%2011%2010%207%206-6%207-13%207-28%201-15-1-20-6-28-5-9-12-11-20-7m271%2022h-1c-3%200-4%202-4%205l1%204h30v-3c0-3%200-3-2-2l-13-1c-9%200-10%200-10-2v-2l-1%201m-1%2020c4%202%206%204%206%207v1l1-4v-3h9l9%201h1l5-1%205%201h5l3-1%203%201v1l2-1c0-2%2013-1%2013%200h2l5-1h5l-17-1a3780%203780%200%2001-57%200m-32%207c0%201-3%202-3%200l-3-1-3%201v1c4%200%202%203-1%203l11%201%2015-1c0-4-1-5-8-4l-6-1v-1l-2%202m-111%2063v5h19c14%200%2017%200%2012-1-14-2-18-2-19-1l-3%201c-2%200-2%200-2-4%200-5%200-5-2-5s-3%201-3%202c0%202%200%202-1%200s-1-1-1%203m48-1l-1%201-1%202v2l-1%201h-1l-2%203-4%202c-2%201%206%202%208%200h1l17%201c20%200%2019-2-1-2l-12-1h-5c0-1%202-3%204-3v-4l-1-4-1%202m-14%2046l-1%207c1%207%201%208%207%207%204-1%203-5-2-6-3%200-4-2-1-2%202%200%203-2%204-5%201-2%200-2-2-2l-5%201'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"narrow":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGAABAAMBAAAAAAAAAAAAAAAAAAIEBQH/xAAWAQEBAQAAAAAAAAAAAAAAAAAAAQL/2gAMAwEAAhADEAAAAdCFOvNbrORdiHQf/8QAGhAAAgMBAQAAAAAAAAAAAAAAAgMAARQREv/aAAgBAQABBQJjLAiYVWBehM+QjuIMKXnXM65nVP/EABYRAAMAAAAAAAAAAAAAAAAAAAABEv/aAAgBAwEBPwGWSymUz//EABYRAQEBAAAAAAAAAAAAAAAAAAAREP/aAAgBAgEBPwHIj//EAB8QAAECBgMAAAAAAAAAAAAAAAACEQMQISIxoTJh4f/aAAgBAQAGPwLw6HGhrteV6qmNmNnE/8QAHBAAAwADAQEBAAAAAAAAAAAAAAERITFBYZHw/9oACAEBAAE/IUxcb2wnXDIn4Grqp30csjT4+GjLOw9f0ZnWfg/Rn//aAAwDAQACAAMAAAAQMMcB/8QAFhEAAwAAAAAAAAAAAAAAAAAAAAFh/9oACAEDAQE/EIsiyrKs/8QAFxEAAwEAAAAAAAAAAAAAAAAAABFRAf/aAAgBAgEBPxB5R5RIJD//xAAgEAEAAgICAQUAAAAAAAAAAAABABEhMUFR0WFxgfDx/9oACAEBAAE/EHamsgr5MUd4jaRC8ijw+0BFtprs3LAwio2WtruUgJKWOX5CgDiBdHGz0mjg+m5aoXCVEKPP5n//2Q==","aspectRatio":1,"src":"/static/60f53bc1df34e9dd797daa54291216ad/eaa58/designSystem1.jpg","srcSet":"/static/60f53bc1df34e9dd797daa54291216ad/5a3ee/designSystem1.jpg 114w,\n/static/60f53bc1df34e9dd797daa54291216ad/41f8f/designSystem1.jpg 229w,\n/static/60f53bc1df34e9dd797daa54291216ad/eaa58/designSystem1.jpg 457w,\n/static/60f53bc1df34e9dd797daa54291216ad/c309b/designSystem1.jpg 686w,\n/static/60f53bc1df34e9dd797daa54291216ad/e3008/designSystem1.jpg 914w,\n/static/60f53bc1df34e9dd797daa54291216ad/0ff54/designSystem1.jpg 1200w","srcWebp":"/static/60f53bc1df34e9dd797daa54291216ad/15384/designSystem1.webp","srcSetWebp":"/static/60f53bc1df34e9dd797daa54291216ad/31fce/designSystem1.webp 114w,\n/static/60f53bc1df34e9dd797daa54291216ad/e3e25/designSystem1.webp 229w,\n/static/60f53bc1df34e9dd797daa54291216ad/15384/designSystem1.webp 457w,\n/static/60f53bc1df34e9dd797daa54291216ad/0258d/designSystem1.webp 686w,\n/static/60f53bc1df34e9dd797daa54291216ad/64ea2/designSystem1.webp 914w,\n/static/60f53bc1df34e9dd797daa54291216ad/9000d/designSystem1.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='M232%2048h-3c-2%200-2%200%200%201v2l-2-1h-7c-6%200-6%200-4%201%205%202%204%204-1%203l-7%201c-2%201-1%201%205%201%204%200%206%200%204%201s-2%201%202%201h6l5-1c2%200%202%200%201%202l-1%202%202-1c1-2%206-4%2012-5s16-5%2015-6l-7-1-5%201c2%201%202%201-1%202-4%201-6%201-2-1%202-1%202-1%200-1-1%200-2%200-1-1l-5-1-6%201M36%2052c-3%202-5%206-5%2011%200%203%200%203%201%202%202-2%202-2%203%201l4%207%202%203%203-2c9-9%202-28-8-22m211%206c-12%205-15%2028-6%2038l4%203h8c12-2%2018-8%2016-18l1-5c2-2-1-11-5-15-6-5-11-6-18-3m-123%203c0%203%200%204-1%203s-1%200-1%205c0%204%200%205%201%204%200-2%202-3%202-1%200%203-3%2011-4%2011v-2c2-4%201-4-1%200-3%204-5%202-3-2l1-3c-1%200-2%201-2%203l-2%201c0-4-3-4-4%201l-3%203-1%201-1%201c-4%201-4%201%200-2%204-5%207-13%204-14-7-1-7-1-7-5%200-2%200-3%201-2s4%201%204-1l-4-1-5%201%202%201c2%200%201%205-1%205s-2%200-1%201c3%200%202%202%200%205-3%203-4%203-3-1l1-6c0-2%200-3-1-1%200%202-1%202-2%202l-5-1c-3%200-3%200-3-4%200-3%200-3-1%200%200%203%200%203-5%203h-5l4%201c4%201%206%202%204%203-1%201-5%202-7%201l-1%201-4%201h-4c-1-2-1-2-4%200-2%201-3%200-3-4%200-2%200-2-2%200-1%202-1%203-2%202h-2l-3-1c-1-1-2%200-3%202l-6%206-3%202%205%201%2010%201h2c-3%201%205%202%2013%202%204%200%204%200%204%202-1%202%201%204%205%204l2%201-3%201h-3l-2%201c-3%200-4%202-1%202%202%200%202%200-1%202l-3%201h3l5%201h1c-1-2%202-3%206-2%202%201%203%203%201%205v1l2-2%205-2%206-1%207-2c2%200%203-1%203-2h1c0%202%202%203%2011%204%209%200%2011%202%202%202h-6l3%204c3%204%204%205%207%205s3%200%201-1l-2-1h2l3%201%202%201v-2c2-1%200-4-4-4l-3-1h3l4-1%201-1c2%202%206%200%206-3%201-4%202-4%2019-8%202%200%202%200%201-2l-2-3c-1-1-1%200-1%202s0%203-1%202h-10v-3c0-3%200-3%203-3l4-2%204-2c2%200%202%200%200-1-3-1-3-1%202-1l6-1h4c3%200%207-3%205-5l-1%201c-1%202-2%202-6%202-2%200-4%200-3%201l-4%201-10%201c-4%200-5%200-4-1l6-1c4-1%204-1-2-1-5%200-6%200-9%203l-5%203-4%203c-3%203-6%204-4%201%203-8%204-20%200-25v3m201%207h-6l-6%201c-2%200-1%207%201%207l1%202-1%202c-2%200-2%202-2%2011v12l1-11c0-11%200-11%203-12%203-2%204-1%202%201l-1%204c0%203%200%203%203%203h3l-3-1-2-1%202-1c2-1%202-1%203%201%202%203%203%206%202%207v1l-2%201c-3%200-2%203%202%208l3%203-1-6v-7h3c2%200%202%200%201%201s-2%202-1%2010v3l3-3%203-5%202-2%201-2%201-2%202-1c2-2%202-12%201-15v-1l-1-3-3-4h-7c-5%200-6%200-3-1l4-1h-4l-4%201m-98%2013c-6%201-6%201-6%208v7h-4l-5-1v-3l1-2c0-2-2-3-2%200-1%201-1%200-1-2v-4h5c3-1%205-1%204-2-2-1-29%204-29%206l1%201%201%202c1%201%201%201%201-1s1-3%206-4c10-2%209-2%2010%204a32%2032%200%20003%2012l-7-1-2-1%201%202c1%202%201%202-2%202s-3%200-2-1l1-2-2%201h-1c-1-1%200-2%204-2%204-1%204-1%204-4-1-5-2-5-8-4-5%200-5%200-6%204v5l-1%201h-2l1%201v1c-1%200-2-1-2-3s0-2-6-2l-5%201v-6c0-6-1-6-3-6s-2%200-2%206l-1%208c-3%203%208%2014%2012%2013l3%201-2%201h4l1-1c-3%200-2-2%201-2%203-1%203%200%202%201%200%201%200%202%202%201l3-5%201-4%206-2a17833%2017833%200%200034-5h3l-2-3-5-6c-1-3-1-3-2-1%200%203%200%203-4%202h-4l-2-5c0-3%202-5%207-5l4-1-1-1-5%201m24%2020l-5%202h-2l-3%201-7%201h-3c3%200%204%200%204%202%200%201%200%202%201%201l1%201%202%202c2%201%203%201%202%202-2%201-1%202%202%202l5%202%202%201c1-1-2-4-5-4l-2-1c1-1%203-2%209-2%207%200%207%200%202%201l-3%201c3%200%203%200%201%201h-2l2%204c2%203%203%204%206%205%205%201%209%203%2011%207l2%202c0-2%204-1%204%201l-2%201c-2-1-2%200-2%202s0%203-2%203l-4%201-1-1v-1l-1%202%204%201%205-1%201-2c0-2%201-3%203%200%202%201%202%201%206-2l4-4h-4c-4%200-5%200-4-4%200-3%204-3%204%200%200%202%201%203%202%203%202%201%202%200%202-2%200-3-3-5-7-5h-2l4-2c2%200%203-1%203-2%201-1%201-1%202%201v2l3-2c3-2%204-2%2014-1l29%204c2%200%205%206%205%2010%200%202%200%202%204%202%203%200%203%200%203-3s0-3%201-2l5%202%203%203c0%201%200%202%201%201v-6h5c4%200%205%201%206%202v-2c0-3-1-6-3-7-3-3-3-4%201-4l6-2a1141%201141%200%2001-103-18l-15%201m-115%208v3l-6-1-9-1c-4%200-4%200-4%202%200%204%208%206%2011%203h1c1%202-1%202-24%201l-18-2-1%203c1%204%201%204%2022%205%2010%201%2011%201%2010-1l1-2c1-1%201%200%201%201%200%203%202%204%2015%204l7%201v-4c0-3-1-3-2-3-2%200-2%200-1-1l1-3%201-2%201%202%202%202c3-1%204%201%201%202-2%200-2%201-2%204l1%203%201-3c0-4%202-4%202%200%201%204%206%204%206%200s-8-13-12-13l-5-2v2m148%200v1l9%201c30%205%2066%208%2059%205a1467%201467%200%2000-68-7m-231%205c-19%205-24%206-23%207%202%200%202%201%202%203-1%202-1%202%204%201%209-1%209-1%2010-5%200-4%202-4%202%200l1%203%201-1%202-2c2%200%202%200%201%201s-1%201%202%201l17-2h13v-3c0-3%200-3-5-3-13-2-20-2-27%200m3%2010l-24%204c-4%200%204%202%2010%202l10%201h15c12%200%2013%200%2012%202%200%201%200%202%202%203%203%200%204%202%202%202l-5%204c-3%202-4%204-3%204l2-1h1c-1%201%2010%204%2022%204l11%202%203-1%202-1%2014%201%2015%201%201%201v1c1%202%201%202-2%203-4%201-5%201-1%201l4-1h1c3%202%203%201%201-1-2-3-2-4%201-2l1%202%201%201c1-1%204%202%204%204l-2%203-2%201-6%201c-6%200-8%201-6%205h1c0-2%206-3%2016-1%204%200%204%200%202%201s-2%201-1%202l3-1h1l1%201v-13l1-12-3%202h-3v-2c3%201%206-2%205-5%200-4-2-5-4-2-3%202-6%202-7%200%200-2%200-2%202-2%201%201%203%200%205-1l2-2-2-1c-2-2-4-2-11%200-14%202-14%202-14-2l-1-4h6c3%200%205%200%204-1a916%20916%200%2000-87-3m240%207c0%208%200%209%202%209h4c6%202%2013%202%2012%201-2-1-3-3%200-3%201%201%201%200%201-4v-4l1%204%201%205v-5c0-3%201-4%203-6%203-3%203-4-8-4l-13-2h-3v9m-56-6c-2%201-2%205-2%2043v43h7v-42c0-39%200-42-2-44h-3m6%2043v45h-16l-12-1c5%200%205%200%205-3%200-2%200-3-2-3s-2%200%201-4l3-5h-1c-1%201-1%201-1-1l1-4c0-2%201-1%201%201l1%204v-4c0-6%201-9%203-9l1-1-3-1c-4%200-4%200-4%203%200%206-2%2014-4%2017s-2%202-1-2l3-7c0-5%200-5-2-5l-2%201%202%201%201%202-1%204-4%201h-4v-7c0-7%201-9%204-6s5%203%206%201c2-3%201-3-4-3s-6%200-6-7c0-3%200-3%204-3l4-1-5-1-5-1c-1-1-1-1-1%201%201%203-3%204-4%201v-3l-1-1c-3%200-4-2-2-4%202-1%202-2%202-3-1%200-2%200-3%202h-4l-16-1c-2%200-2%201-2%202%201%201%200%202-1%202-1%201-1%201%201%201l2%201%208%201c9-1%2010-1%2012%202%203%204%202%204-3%203h-12c-6%200-6%200-6-2%200-1%200-2-1-1-1%200-1%208%201%2022l-1%2012c0%204%200%205%203%207%2010%209%2015%2015%2011%2017l-1%202-2%204-4%203h-1c0-1-5%200-7%202h-2l-1-1c0-2-2-3-4-2l-1-3c0-2%200-3-1-1-3%2014-17%2031-27%2033-3%200-3%200-3-4%200-8%200-8%208-8h7l-7-1-6-1h5l8-2%202-2-2-3-1-4%201-2%202-4c2-3%202-3%205-2%202%202%203%202%203%201l-2-1c-2-1-2-1%200-3l2-1h8l-4-1h-3v-23l-1-25v-2h-10c-9%200-10%200-10%202h17c2%201%200%201-5%201-7%200-8%200-8%202%200%203%202%204%208%203l5-1%201-2c1-1%201%201%201%204v6h-8c-7%200-8%200-8-2%200-1-1-2-5-2l-4-1%201%205c0%204-1%206-2%203h-10l3-1c3%201%203%200%203-3s0-3-3-3l-4-2c-1-2-1-2-1%202l-1%208v5h-10c-10%200-12-1-10-5v-3l4-1%204%201c0%202%201%200%202-2l-1-3-1%202-4%201-4-1-1-1-1%204c0%207-2%2015-5%2018l-3%202%201-3v-1l1-1%201-1-14-1c-14%200-14%200-12%202l2%201c2-1%202%203%201%207s-1%204-6%204l-6-1-2%203c-2%203-2%203-3%202%200-2%200-2-1-1s-1%200-1-2l1-3-2%203-2%204%201-4v-3l-2%202c-1%203-1%203-2%202-1-2-1-2-2%200-3%208-10%2013-17%2013l-4%201%2023%204%2011%202c3%202%2012%203%2018%203%204%200%204%200%207%206l4%207-16%201a99%2099%200%2000-22%202c-2%200-2%200%200%203v6c-1%201%200%201%202%201l4%201%202%201%206%202h8l13-2c10%200%2010%200%2011-3s1-3-6-3c-5%200-6%200-6%202%200%201%200%203-2%203h-2v-4c1-4%202-4%206-4%207%200%2013%202%2013%204l-2%204c0%202%205%204%2011%203%203-1%206-1%209%201%204%201%2010%201%2018-1%202%200%202%200%201%201l-4%201c-2%200-2%200%201%201l4%203c2%201%202%201%202-6l1-8%201%203c0%204%202%208%205%208l1%201-3%201-4%201h8l39%202c-3%202-43%204-45%202l-2-2v2c1%201%201%201-3%201s-5%200-7-4c-3-4-4-5-4-2l-2%201-2%201h4l2%201v1l1%201-6%201c-5%200-6%200-7-3-3-4-7-7-8-5-2%201-2%202%201%204l2%204h-3c-2%200-4-1-8-5-2-3-6-5-7-5s-1%201%203%205l6%205H0v37l1%2038h46a733%20733%200%200145%203l4%201c3%200%203%200%202-1h9c6%202%206%203%201%203h-4l2%201h10c2-2%202-2-4-3l-6-3c1-1%2011%202%2013%204l4%201c2-1%202-1-1-2l-7-3c-8-1-1-1%2035-1a36539%2036539%200%200046%202c-5%200-5%202%200%203%204%200%204%200%202%201l-3%201h3c3%201%205%205%202%205v1l1%201c0%203%200%203%201%201l2-3c0-2%203-3%203-1l2%201h7l-3-2c-5-1-4-2%201-3h17c0%201-6%203-10%203-3%200-3%201-3%203%200%204%200%205%202%203%200-2%201-2%201-1l2%201%202-2h1c1%202%205%202%205%201-1-1%200-3%201-3v-2c-1%200-1-1%201-2%201-2%202-2%203-1l6%203c4%200%204%200%202%201h-6c-4-1-5-1-3%201l5%201c5%200%2019-3%2017-4-3%200-5-2-3-2l1-1%202-2h-3c-13%201-23-1-14-3l7-1a832%20832%200%200166%202c1-2%203-2%2044-2%2038%200%2043%200%2043-2l1-37v-36h-53l2-3%206-10%204-6h14c1%201%202%201%202-1l3-3c4-2%206-2-18-1a31425%2031425%200%2001-111%208l-11%201c-3%201%204%201%2030-1a451%20451%200%2001-79-2h-1l-3%201h-2l2-1%203-1h-3c-2%200-2%200-1-1l4-1c1%201%201%200%201-2s0-3%201-2l1%202v3h22a335%20335%200%200064-2l19-1%201-17v-16l-51%201-52-1v-3l1-2v5h37l-17-1-17-1%203-1c3%201%203%201%203-2l1-2v5l15-1c12%200%2015%200%2016%202%200%201%209%201%209-1l11-2a1274%201274%200%200023%202l1-1c1-2%205-2%205%200%200%203%202%200%203-4%201-3%201-4%201-1l-1%204%205-1h4l-1-6c0-6%201-6%201%201l1%205h7l11%202%203%202h-4l-10%201h-7v33h9a3693%203693%200%200161-5l7-2%201-1c3%200%200-2-5-3l-6-2%203-10%203-11h-24l-27-1c-4-2-5-4-3-4l3%201h1l28-1c27%200%2034-1%2032-3-2-4%205-9%2012-8h2c1-2%200-2-3-2l-4-2v-3h-1l-1-1-1-1c-2-1-1-3%201-3%201-1%200-1-2-1h-5a402%20402%200%2000-56-2c-3%200-4%200-3-2%200-2%201-2%205-2%203%200%204%200%204-2h1c0%203%202%202%202%200%201-3%203-2%204%201%200%202%201%202%208%202h7v-8l1-7v15h12v-14l1%207v7h3c2%200%203%200%203-3%201-4%203-5%206-5l4-2c2-2%202-2-2-3-2-1-1-1%201-1%204%200%206%202%203%204-1%202-1%202%202%202s3%200%203-2c-1-1%200-2%201-3%202-1%202-2%200-3-1-1-22-3-37-3h-6l6%201%2015%201%2011%201h-7a430%20430%200%2000-26-2c0-2-24-4-45-4l-9-1h17c20%200%2020%200%2024-3l4-2v3c0%202%200%203%202%203l7%201c4%200%208-2%208-5l2-1c2%200%202%200%201%201v5l1-2%201-2v5h20c1%202%203%201%203-1l-1-3%201-2c1-2%202-2%204%201%203%203%203%203%200%203-2-1-3%200-3%201%200%202%201%202%204%202%204%200%204-2%201-6-1-1-2-3-1-4l-1-1-2-1-2%202c-1%201-1%200-1-2%200-4-1-5-7-6-2-1-3-1-3%201-1%201%200%202%202%202%202%201%201%201-2%201l-5%202c-2%202-5%202-5%201l2-2c5-1%201-2-10-2l-14-2-1%201c1%201%200%202-1%202l-1-1c0-1-1-2-3-2-4%200-6-2-2-2%205%200%202-2-4-2-6-1-6-1-5-3s2-2%202%200c1%201%205%202%205%200s-2-3-8-4a320%20320%200%2001-13%200l-3%201c-1%200-2%200-1-1l-3-1h-4l-2%201c0%202%202%203%2015%204l10%201-3%201-14-2c-9%200-11-1-11-2s-2%201-3%205c-2%205-2%2017-1%2019l18%201%2017%201-18-1h-17v16l1%2015%201%202-1%201-1%205-1%207a527%20527%200%20010-81c1-5-1-5-6-1-6%205-16%206-23%200-5-3-5-3-5%203l1%205h6c11%200%2016%201%2016%203l2%201h-12c-15%200-17-1-15-4s1-12%200-12c-1-1-2%200-2%202l-1-3-1-9-1%2043m91-24c0%205%200%207-2%207h-1v-4c-2-5-5-3-4%203%201%204%202%205%2014%205%207%201%207%201%206-1l-1-3c-7%200-7%200-1-1l7-1h-6c-4%200-6%200-4-1h8c7%200%2010%203%207%207-1%202-1%202%202%202s3%200%202-1l-1-4c0-3%203-2%204%201%201%202%201%202%201-1l1-4v-4l-1-3h-2l-3-1-4-1c-10%200-17%200-16-1s1-1-2-1h-4v7m-54%201c0%205%200%206-2%208s-2%203-2%208c0%206%200%207-1%206l-3%201c0%201-1%202-3%202h-2v12c1%2012%201%2012-2%2014-2%202-2%203-2%208v7h4c4%200%204%200%204-4%200-2%200-3%201-2%201%204%202-1%202-15v-17c-2-2-1-4%201-4l1%2024%201%2024v-61l3-2c2-2%202-3%202-7-1-7-3-8-2-2m-31%208l-1%205v4h9l13%201h4v-4c0-5-2-6-12-6-5%200-5%200-2%201%204%200%204%200%204%204%200%203%200%203-1%201%200-3-1-4-6-4-4%200-6-1-7-2h-1M23%20163c-8%204-13%2015-13%2030v5c0-9%202-8%202%201%201%2010%203%2017%206%2023%202%204%205%207%205%205l-5-10c-2-2-3-13-2-16%201-4%202-4%206%200%203%203%204%205%2010%2018%204%2010%206%2011%2010%207%206-6%207-13%207-28%201-15-1-20-6-28-5-9-12-11-20-7m271%2022h-1c-3%200-4%202-4%205l1%204h30v-3c0-3%200-3-2-2l-13-1c-9%200-10%200-10-2v-2l-1%201m-1%2020c4%202%206%204%206%207v1l1-4v-3h9l9%201h1l5-1%205%201h5l3-1%203%201v1l2-1c0-2%2013-1%2013%200h2l5-1h5l-17-1a3780%203780%200%2001-57%200m-32%207c0%201-3%202-3%200l-3-1-3%201v1c4%200%202%203-1%203l11%201%2015-1c0-4-1-5-8-4l-6-1v-1l-2%202m-111%2063v5h19c14%200%2017%200%2012-1-14-2-18-2-19-1l-3%201c-2%200-2%200-2-4%200-5%200-5-2-5s-3%201-3%202c0%202%200%202-1%200s-1-1-1%203m48-1l-1%201-1%202v2l-1%201h-1l-2%203-4%202c-2%201%206%202%208%200h1l17%201c20%200%2019-2-1-2l-12-1h-5c0-1%202-3%204-3v-4l-1-4-1%202m-14%2046l-1%207c1%207%201%208%207%207%204-1%203-5-2-6-3%200-4-2-1-2%202%200%203-2%204-5%201-2%200-2-2-2l-5%201'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"seo":{"src":"/static/60f53bc1df34e9dd797daa54291216ad/0ff54/designSystem1.jpg"}}},{"id":"19207872-c4ca-5f5d-8ea1-af504359cb67","slug":"/clean-architecture-common-pitfalls","secret":false,"title":"Clean Architecture - common pitfalls","author":"Luke Celitan","date":"November 1st, 2022","dateForSEO":"2022-11-01T00:00:00.000Z","timeToRead":5,"excerpt":"How To Avoid The Pitfalls Of Not Applying Clean Architecture In Software","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\": \"Clean Architecture - common pitfalls\",\n  \"author\": \"Luke Celitan\",\n  \"date\": \"2022-11-01T00:00:00.000Z\",\n  \"hero\": \"./cleancode.jpg\",\n  \"excerpt\": \"How To Avoid The Pitfalls Of Not Applying Clean Architecture In Software\",\n  \"category\": \"Post\",\n  \"tech\": [\"Rust\", \"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\": \"how-to-avoid-the-pitfalls-of-not-applying-clean-architecture-in-software\"\n  }, \"How To Avoid The Pitfalls Of Not Applying Clean Architecture In Software\"), mdx(\"p\", null, \"The software that we design and implement has to be reliable, maintainable and\\nscalable. If a software is not designed with these qualities in mind, it can\\nturn into a mess. This article discusses the importance of practicing clean code\\nand architecture in order to avoid the pitfalls of not applying them\"), mdx(\"h2\", {\n    \"id\": \"clean-code-and-clean-architecture\"\n  }, \"Clean code and clean architecture\"), mdx(\"p\", null, \"When it comes to software development, clean code and clean architecture are two\\nof the most important concepts to keep in mind. Unfortunately, they are often\\noverlooked or not applied properly, which can lead to a number of problems down\\nthe line. Clean code is all about making your code easy to read, understand, and\\nmaintain. It should be well-organized and free of any unnecessary clutter. This\\nmakes it simpler and faster to make changes when needed, and also helps prevent\\nerrors from creeping in. Meanwhile, clean architecture is all about designing\\nyour software in a way that keeps the different parts loosely coupled and easily\\ninterchangeable. This makes your code more robust and easier to scale as your\\nneeds change over time. Unfortunately, both of these concepts are often ignored\\nor misunderstood. As a result, many software projects end up being needlessly\\ncomplex and difficult to maintain. If you want to avoid these pitfalls, be sure\\nto keep clean code and clean architecture in mind from the very start of your\\nproject.\"), mdx(\"p\", null, \"When in need of good architecture patterns look out for existing platforms and\\nsolutions. Open source projects that survived the harsh reality of software\\nengineering will be a great source for anyone who is looking for good patterns.\\nWith time and experience a software engineer will be able to tell apart the\\nanti-patterns and patterns one should follow.\"), mdx(\"p\", null, mdx(\"span\", {\n    parentName: \"p\",\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"1024px\"\n    }\n  }, \"\\n      \", mdx(\"span\", {\n    parentName: \"span\",\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"100%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAIAAAAC64paAAAACXBIWXMAAAsTAAALEwEAmpwYAAADXklEQVQ4y12T+VMScRTA/dPKpp8aO6xsJqVrprxmUrwQj1FBKURKCUVUBDtEnVLyyAJNRc28EFzzChi1yQiUc1nYu7dgKH7nze77vn2fd32/m0JRxH8haYqkOCGSjQRJEgxNMQyV/IlISWg0TYKgaIgk8bMeOBFB0eBf1x94nuNPYYKI7mxvbm1uRCJY3AKufr83HEZxIrq99WP802icT0TnYNiwLI2FUeuaZWnpezDgB49oFDs+PvJ6j6MRzON2rSwvCsvLVleXWZaFNCcwlArhvd4jHI/s7mwvfl+A7cHBHiRZWV4a6NdruzuHBt83SiXp6dedTnsSnOjW7XZNTpgQm9VmXRsZ/ghkZ4dao+kqLHx6j5fFy8oEI5BnJ8JlhsIO9vd+/dpfXFwA8vP4J33vu9c9OrGoDsJhGIogNigHyPPTBpPVapE+l0yYjDMzU2YQ8zQ852bNBsOgUtGs1XQ5HEnVJmXGsJDVujb80aBStclkjZKGekVLi0LRLBQKcnKewJzm52YpkjhHnvTs8x0vfJvPy81OvXihtJgvqqu5k5FxM/1GTXUl6Pfv81yuQ5ZlEt2eHhXUEwoFpyYnW17KS4r5G+vrToe9qqpCWC7Q6TQCQcnlS6nabg240RTF0DTL0AwDb05P4fYsGwwGBj+8f/f2DYKsI+s2gBvqxW2tyuqqysLCgmtX01ZXV8ANx3EMw448Hia2uMwOu10ub8rLyxEISkWiWunzZ/Vicbuq9UVTY2bm3fz8PAixu7MTCAZQFDVPT/X36cPhMIAcHAgEjEajRNLQ1dkxPfV1bGxU+UoBadtVbaWlxWUlRfNz5iOP22a19PX1VldXVFUKnU5nDI51ABrE7lC3a7o637zWqdWqnh5tk0xaWSEs4hfAzG7fusnjZT56+KC2tiY7+7FWp+VgJvangIYgSIcaDks50N/nsP/cQGyfx0flctkLeROfX9AolcIpwiUzmb5A2aFQCObPwfHM8PesWSwv5dC+zDD0obiIn5uTfTXtCkwLhofjUQDCKOrxuA8Pf4N/bGAMwwkHh/1+PwxvdGTYZDLq9b0VQoFYLDIMDYIRJ4g4EF9wbOwpHOPjCz7AkZAEEcEwv8/ndrvjWMIzoZ+BYxH/R2FiAjeCPunrjFtC/gHqYNgYh/Z68gAAAABJRU5ErkJggg==')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  }), \"\\n  \", mdx(\"picture\", {\n    parentName: \"span\"\n  }, \"\\n          \", mdx(\"source\", {\n    parentName: \"picture\",\n    \"srcSet\": [\"/static/e0a2b089269e7989df033fa027c06cd9/53334/blueprint2.webp 1024w\"],\n    \"sizes\": \"(max-width: 1024px) 100vw, 1024px\",\n    \"type\": \"image/webp\"\n  }), \"\\n          \", mdx(\"source\", {\n    parentName: \"picture\",\n    \"srcSet\": [\"/static/e0a2b089269e7989df033fa027c06cd9/658fc/blueprint2.png 1024w\"],\n    \"sizes\": \"(max-width: 1024px) 100vw, 1024px\",\n    \"type\": \"image/png\"\n  }), \"\\n          \", mdx(\"img\", {\n    parentName: \"picture\",\n    \"className\": \"gatsby-resp-image-image\",\n    \"src\": \"/static/e0a2b089269e7989df033fa027c06cd9/658fc/blueprint2.png\",\n    \"alt\": \"Blueprint for clean code\",\n    \"title\": \"Blueprint for clean code\",\n    \"loading\": \"lazy\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    }\n  }), \"\\n        \"), \"\\n    \")), mdx(\"h2\", {\n    \"id\": \"what-does-clean-code-look-like\"\n  }, \"What does clean code look like?\"), mdx(\"p\", null, \"When it comes to clean code, there are a few key things to keep in mind. First\\nand foremost, clean code is readable and easy to understand. It is well-\\norganized and well-documented, so that anyone who needs to can easily find and\\nuse the information they need. Clean code is also consistent in style and\\nformatting. This makes it easier to read and understand, as well as more likely\\nto be error-free. In addition, clean code is modular \\u2013 it is organized into\\nsmall, self-contained units that can be easily reused. Finally, clean code is\\ntestable. This means that it can be verified that the code does what it is\\nsupposed to do, and that any changes made will not break existing functionality.\\nBy following these guidelines, you can ensure that your code is clean, readable,\\nand maintainable \\u2013 all of which are essential for any software project.\"), mdx(\"h2\", {\n    \"id\": \"clean-code-essentials\"\n  }, \"Clean code essentials:\"), mdx(\"h3\", {\n    \"id\": \"security\"\n  }, \"Security\"), mdx(\"p\", null, \"The best present any software architect can do for himself is to start the\\ndesign from security first perspective. Making a proper threat modeling will\\nhelp in establishing the correct patterns and services needed to complete the\\nproject.\"), mdx(\"p\", null, \"These days security first approach in my opinion is the only way to write a\\nprofessional software. Even if your code or project is squeaky clean but you did\\nnot plan or execute any kind of security strategy, you may end up loosing\\nreputation or feel wrath of your client when their application gets DDOS\\u2019ed or\\ndata breached.\"), mdx(\"p\", null, \"For more info om threat modeling and running your project in the DevSecOps\\nmethodology please checkout his \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://spaceout.pl/dev-sec-ops\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"link\")), mdx(\"h3\", {\n    \"id\": \"documentation\"\n  }, \"Documentation\"), mdx(\"p\", null, \"This sometimes can be the most overlooked part of the project, however it will\\nbe the most important thing in keeping it truly alive. Proper documentation\\nshould include\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"How to install the project\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"How to start the application in dev mode\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"How to build the project (production mode)\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"What is the delivery scenario (CI/CD, Release strategy and naming conventions)\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Architecture and Services used in Software (Servers, DB\\u2019s, Caches, Blobs, 3rd\\nparty)\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Where to get the secret keys (Vaults, People, \\u2026)\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"How to monitor the software (Logs, AppInsights, Trackers \\u2026)\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"coding and contributions standards (Style, Commits, Tests, Coverage)\")), mdx(\"h2\", {\n    \"id\": \"common-pitfalls\"\n  }, \"Common pitfalls\"), mdx(\"h3\", {\n    \"id\": \"we-do-not-need-to-think-about-the-structure-or-clean-code-at-the-beginning-of-the-project\"\n  }, \"We do not need to think about the structure or clean code at the beginning of the project\"), mdx(\"p\", null, \"There are many potential problems that can arise from not having a clean\\narchitecture or clean code in your software project. Some of the more common\\nones include:\"), mdx(\"ol\", null, mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"Increased complexity and confusion: Without a well-defined architecture, your\\ncode can quickly become complex and difficult to understand. This can lead to\\nconfusion and errors when making changes or adding new features.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"decreased flexibility: A messy codebase can be very inflexible, making it\\nhard to make changes or add new functionality without breaking existing code.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"increased maintenance costs: Dirty code is often more difficult and\\ntime-consuming to maintain, leading to higher costs over time.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"decreased reliability: Code that is poorly organized and written in a hurry\\nis often less reliable and may contain more bugs. This can lead to unexpected\\nbehavior and crashes, which can be very frustrating for users.\"), mdx(\"li\", {\n    parentName: \"ol\"\n  }, \"decreased quality: In general, lower-quality code is simply not as good as\\nwell-crafted code. This can impact the overall quality of your project and\\nmake it less likely to meet users\\u2019 needs and expectations.\")), mdx(\"p\", null, \"Not following the rules outlined before will result in a typical scenario where\\nyour development velocity will drop exponentially, leaving your project manager\\nor client frustrated. In this case the development team primary goal is to\\ndeliver features, not thinking about the structure of the project, not giving\\nthe team or developer the time needed to implement proper testing or refactoring\\nwhat was already written. The usual management response to this situation is add\\nmore man power to the development team in hopes that additional team mates will\\nbring the velocity back up to where it was at the beginning of the project.\\nHowever adding more people to a late project will make it even latter.\"), mdx(\"p\", null, \"It is important to understand that the business does not understand this, nor\\ncare, however it is up the development team to establish the speed and proper\\ntimetable. The conversation about the proposed velocity with business side will\\nbe a difficult one, but it will always be a part of the development cycle.\"), mdx(\"h3\", {\n    \"id\": \"no-need-to-deploy-straight-away-we-will-think-about-the-cicd-later-on\"\n  }, \"No need to deploy straight away, we will think about the CI/CD later on\"), mdx(\"p\", null, \"Not establishing proper git flow, automatic code delivery to an online\\nenvironment, will result in a classic \\u201CIt works on my computer\\u201D - \\u201Cbut are we\\ngoing to give your computer to the client ?\\u201D Developers tend to have fast\\nmachines with loads of ram, pushing straight to online instances should be a\\nnatural step in order to catch these differences. Calls and functions that work\\nnormally on your computer can suddenly be too much for a small server or online\\ncloud instance. We also have to think about differences in Operating Systems,\\nnetwork speed and other external factors.\"), mdx(\"p\", null, \"Make yourself a favour and make sure to test major pushes straight on the online\\nenvironment.\"), mdx(\"p\", null, \"This will also help with any kind of more advanced patterns like microservices,\\none must be careful not fall into a trap of creating applications that are easy\\nto develop but hard to deploy\"), mdx(\"h3\", {\n    \"id\": \"clean-architecture-does-not-impact-on-how-the-system-works\"\n  }, \"Clean architecture does not impact on how the system works\"), mdx(\"p\", null, \"This is another misconception among developers, true software architects will\\ntake into consideration what are the business costs of running a project. Clean\\narchitecture keeps the system lean, unnecessary code or bad arch will have\\nimpact on system performance, ram and cpu usage. Upgrading servers or instances\\nso your application works as it should can result in additional frictions with\\nyour client, or can even result in client dropping the project if the estimated\\nserver costs are met with huge real costs of sustaining an application.\"), mdx(\"h2\", {\n    \"id\": \"conclusion\"\n  }, \"Conclusion\"), mdx(\"p\", null, \"If you\\u2019re not careful, it\\u2019s easy to fall into the trap of not applying clean\\narchitecture in your software development projects. However, by following the\\ntips outlined in this article, you can avoid these pitfalls and create cleaner,\\nmore maintainable code. By adhering to the principles of clean architecture, you\\ncan make your code easier to understand, reuse, and modify \\u2013 which will save you\\ntime and money in the long run.\"), mdx(\"p\", null, \"Clean arch tries to minimize costs of adding features, fixing bugs, it will\\ndirect the developer in where solution should be added, and what is the most\\nimportant it should protect the system from implementing a bug that cannot be\\nfixed.\"));\n}\n;\nMDXContent.isMDXComponent = true;","tech":["Rust","Nodejs"],"category":"Post","appDescription":null,"hero":{"full":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAQFAgb/xAAWAQEBAQAAAAAAAAAAAAAAAAAAAgH/2gAMAwEAAhADEAAAAdCVFNeiTjL4CkN//8QAGhAAAQUBAAAAAAAAAAAAAAAAAgABAwQRE//aAAgBAQABBQKxLxBrLbityRyB0Il3iTi2YijDf//EABYRAAMAAAAAAAAAAAAAAAAAAAABEv/aAAgBAwEBPwGWSymUz//EABYRAQEBAAAAAAAAAAAAAAAAAAAREP/aAAgBAgEBPwFcj//EAB4QAAIBAwUAAAAAAAAAAAAAAAABAhARISIxMmFx/9oACAEBAAY/AvSGmSvRKOWWawcqPo2P/8QAHRAAAgMAAgMAAAAAAAAAAAAAAREAITFBYXGBof/aAAgBAQABPyFRbb2oVx0iRxENm4QBZ0DBGMU04BBAa6i0hiid8RQBuj3uBV+5/9oADAMBAAIAAwAAABDAAHz/xAAWEQADAAAAAAAAAAAAAAAAAAAAAWH/2gAIAQMBAT8QiyLKsqz/xAAXEQEBAQEAAAAAAAAAAAAAAAAAEQFR/9oACAECAQE/ELiExHH/xAAfEAEBAAICAQUAAAAAAAAAAAABEQAhMdFBUWFxobH/2gAIAQEAAT8QkaUQC8FMFAUBIpnh4zmtuxGExFlEQept84GTW02DqE9u8GBAgV1kPIaC3HT7cTKqhq3X8x0AHy7z/9k=","aspectRatio":1,"src":"/static/7d4a98470ec7e64e3cbb19681c7c7fab/58fe7/cleancode.jpg","srcSet":"/static/7d4a98470ec7e64e3cbb19681c7c7fab/e0f30/cleancode.jpg 236w,\n/static/7d4a98470ec7e64e3cbb19681c7c7fab/86afd/cleancode.jpg 472w,\n/static/7d4a98470ec7e64e3cbb19681c7c7fab/58fe7/cleancode.jpg 944w,\n/static/7d4a98470ec7e64e3cbb19681c7c7fab/0ff54/cleancode.jpg 1200w","srcWebp":"/static/7d4a98470ec7e64e3cbb19681c7c7fab/99fbb/cleancode.webp","srcSetWebp":"/static/7d4a98470ec7e64e3cbb19681c7c7fab/77392/cleancode.webp 236w,\n/static/7d4a98470ec7e64e3cbb19681c7c7fab/1f177/cleancode.webp 472w,\n/static/7d4a98470ec7e64e3cbb19681c7c7fab/99fbb/cleancode.webp 944w,\n/static/7d4a98470ec7e64e3cbb19681c7c7fab/9000d/cleancode.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='M232%203c-3%203%205%207%2013%206%205%200%209%202%2012%206%203%205%204%205%201%205-2%200-2%205%200%208%202%202%202%202%201%203-2%201%202%203%204%203l3%201v-4c-3-6-1-7%204-2%204%204%207%208%204%207h-1c-1%201%2011%2013%2012%2012l-1-2-2-3c1-1%2010%208%2014%2014l4%205-3-7c-4-6-5-7-2-4h2c0-2-4-5-5-4l-2-1-8-10c-5-5-6-6-4-6l3%201-3-3c-4-5-6-6-9-6s-7-4-9-8c-3-6-25-15-28-11m150%2027a456%20456%200%2001-32%2027c6-7%203-5-4%202-8%208-10%2011-6%2012h4a127%20127%200%200021-23c1%201%201%201%200%200%200-2%203-4%205-3v-2c0%201%206-4%2011-11%2013-13%2013-14%201-2m-251%202a171%20171%200%2000-13%2024l-1%203h-3l-1%201%201%201c2-2%201%201-1%202l-2%202-1%204-1%203-2-3-1-3v3c0%204%203%2011%207%2016%204%204%2010%206%2019%206h5l2-6%204-10c4-6%204-6%200-8-3-1-5%200-4%204l-7%209%203-5c3-6%202-10-2-9-2%200-2%200%200-1l4-2c2%201%203%200%201-4l-3-7-1-4c-1%200-2-3-1-5%201-1%201-4-1-4v-2l2-8-3%203m133%2025c0%204%203%2010%205%2010l1-2v-1l2%205c0%202%204%206%207%206%202%200%200-7-3-11s-3-4-3-1c1%203-5-3-8-8l-2-2%201%204m39-1c3%206%202%209-2%207l1%203c2%205%202%2010-1%2010h-2l-3-1c-3%200-9-3-9-4l-1-1-1%204c0%204%201%204%204%205%204%201%206%203%204%203-1%200-2%201-1%202%200%201%200%202-1%201h-1l-1-2c1-2%201-2-5-2h-11c-8-2-8-2-12-1s-4%202-2%209c0%202%203%203%204%201h15c13%200%2013%200%2014-2%200-2%200-2%201%200%204%204%2014-11%2014-20%200-6-1-12-3-13-1-1-1-1-1%201m-111%205v7h21v-5h-10l-10%201v-5c-1-3-1-3-1%202M44%2057l3%203%202%204c0%203%209%2011%2012%2011%204-2%204-5%200-10l-5-4%203%204c4%204%201%204-4-1l-11-7m105%2016c-2%201-6%209-7%2015l-1%203h6c6-1%207-2%205-4s-1-3%201-10c1-2-2-5-4-4m-42%208l2%204%201%203c-1%201-1%200-2-1-2-5-4-3-5%205-1%203-1%203%201%203l1%202%202-1%202-2v2l-1%204c-1%201-2%209%200%208%201%200%201%204-1%208l-3%2012c-1%2014-2%2012-2-3v-13c-2-1-3%201-3%206v4l-1-4-1-15c0-9%200-11-1-10l-3%202c-3-1-4%201-4%2015l-2%2015-2%2016c-1%2018-3%2019-5%204%200-11-2-9-2%203%200%209%200%2010-2%2010s-3%203-1%206c1%203%203%202%203%200%200-4%202%201%203%208%201%205%201%205%201-5v-10l2%201c3%201%203%202%201%202s-3%202-1%202l1%201v2c1%200%202%204%202%2010l1%205v-3l1%203%202%2012c1%2011%202%2012%207%2010s6-1%205%207c0%204%200%206%201%205%201-2%201-2%201%200v3c-2%201%205%2011%2012%2015%201%201%201%201-1%202-2%200-3%201-3%202l-1%201c-2-2-2%206%200%2013l-1%202-2-5-1-4-9%2018c-2%205-6%2012-6%2010-1-1-20%207-22%209h-2c1-2-2-1-6%203l-7%203H0v37a372%20372%200%20002%2039c0-2%208-1%209%201%202%204%203%206%201%204-2-1-2-1-1%202l2%2012%201%2013-3-7c-4-12-7-17-9-15%200%201-1%201-1-1-1-1-1%205-1%2012%200%2017%200%2017%205%2017h4l-4-10c-4-13-4-15-3-15l1%201%204%2013%204%2011h9l8-1%202-2h6c3-1%203-1%202%201s-1%202%205%202h7v-3a1465%201465%200%20001-35l12-1c13%200%2013%200%2014%207v6l1%2014%201%2012h27l-1-5v-7l-1-19%207%205%204%204%203%202c0%204%204%204%207%202%204-3%205-2%202%201-4%205-4%2014%201%2013%201-1%202-1%202%201s1%203%2016%203c8%200%2014%200%2013-1-2%200-4-9-3-9v-3c1-2%201-2-3-2-6%201-6%200%200-1%204-1%207%200%207%201l-1%201-1%201v2c1%200%203%208%202%209l1%201h2l2%201%201-1%202-2c1-1%201%200%201%201l1%202%204-12%201-4c1-1%201-1%201%201%200%203%200%203%201%201%201-1%202-3%201-5l1-4c4-2%204%200%204%2012v12l1-11%201-11v21h21l-1-8-1-8%201%202%201%203%201-2-1-21h2v-2h-3c-1%201-1%201-1-1%200-1%201-2%203-2%203%200%203%200%203%204s0%204%202%203v-5c1-3%2011-3%2011%200l1%203c3%200%204-4%201-4-1-1%204-1%2010-1l10%201v3c0%202-1%203-5%203-6%202-9%201-9-3%200-2%200-3-1-2l-1%206c0%205%200%205-3%205-5%200-7-1-7-7%201-7-2-3-2%205l-3%2011c-1%204-1%204-2%202s-1-2-1%201c0%202%201%203%204%205l5%206%201%202c0-1%201-2%203-2s2%200%202%202v1l1-1h1l4%201h4v-11l1-11h5c4%200%206%202%202%202-2%200-2%200%200%201l1%201c-1%200-2%200-1%201l-1%202c0%201-1%201-1-1l-2-4-1%208-1%2010c0%202%200%202%2011%202%2013%200%2013%200%2012-5l3-3%202-6%201-4v-16c1-1%201-1%201%201v2l5-3%205-4%205-1c4%200%204%200%205%205a689%20689%200%20001%2024v10h29v-14l-2-19v-6h84l1-38v-37h-44l3-3c3-3%206-4%2010-4l5-1c1-1%201-1-2-1-5%200-10%202-15%205-6%204-14%206-12%203l-1-1-1%201-15%201h-15l1-10%201-18c2-11%200-19-5-24l-1-2%201-1c0-2%202-3%204-2h1l1-2v-6l-1-6c1-1-1-2-1%200v9h-3%201v-2c-2-3-6-4-6-2h-7c-6%201-6%201-6%204s0%203%201%201l2-2v2l-2%205c-1-1-2%200-2%201%200%202-1%203-2%203-2%200-2%200-1-1%202-2%204-11%202-11l-1%202h-1c0-2-5-4-10-7-8-4-8-5-5-5l4%201%208%204c5%203%206%203%2011%202l6-1-2-2c-1-2-1-2%201-2h3c1%200%205-7%205-10l5-1c6%201%206%201%209-8%203-7%203-14%201-12-2%201-3-9-3-30a386%20386%200%2000-1-17c-2%205-4%204-4-2%200-11-1-3-2%2013%200%2013-1%2018-2%2019-2%203-3%201-4-8-2-10-3-12-8-10l-3%202v-7l-1-8%204-6c6-5%206-6%203-13-8-16-18-17-95-17a531%20531%200%2001-54-1c0%201-16%203-18%202-1-1%200-1%202-1h3l-3-1-3-1h2l3-1c0-1-22-2-23-1h-3c-2-1-2-1-1-2%202-1%201-1-2-1l-3-2%201-1v-1c-1-4-4-9-4-7m92%2051c-4%202-16%2012-16%2014h2l-2%204-2%204%207-6c15-16%2021-15%2042%205%2013%2013%2017%2016%2028%2020%2010%204%2020%203%2027-4%204-4%202-4-3%200-8%206-15%205-29-1-10-5-14-8-12-8l-4-5c-3-3-5-5-4-6h-1l-1-1c2-2-13-16-17-16h-15m-3%2016c-5%203-8%206-18%2018-4%206-7%208-9%208-5%202-5%203-3%2013l3%2010%206%201c6%201%206%201%209-3l4-5a265%20265%200%20002-10l1%206c-1%202%200%203%202%200l2-1%202-1%2010-1c10%200%2011%201%2021%2013l8%209v2l1%201c4-2%209-2%2011-1s2%201-1%201c-5%200-9%202-13%207s-4%205%201%207c3%201%203%201%206-2%204-4%209-6%2012-6%204%201%204%200%201-4-2-3-3-4-2-5%201-2%203-2%202%200l2%203c3%201%203%201%203-1%200-1%200-2%201-1l1-5c0-3%200-4-1-2s-1%200-3-8c0-7-2-10-6-13l-2-3c0-2-1-2-8-3-3-1-5-2-9-7-15-18-18-20-27-20l-9%203m134%2013l-1%2023%205-12c1-4%200-12-1-12l-2-4c0-3-1-2-1%205m-70-4c-2%200-2%201-2%202%201%203-1%203-6%201-9-4-7-1%203%205%208%204%2018%205%2024%202%202-1%203-2%202-3v-1c1-2-10-6-13-4-1%201-1%200-1-1%200-2-1-2-7-1m32%2016l-4%203-2%201c-1-1-3%200-5%203l-3%204%208%202c11%203%209%204-5%201-3%200-4%201-1%202%201%201%200%201-1%201-5%200-3%201%204%203h7l1-1c2%201%202%200%204-2l1-3-1%204c0%203%200%204%201%203%202%200%203-4%202-5v-3c2-4%202-9%201-10l-1-2c0-2-1-2-6-1m11%209c-2%203-6%2016-6%2024l-1%205%202-3%202-2v3c1%202%201%202%201-3l2-4%201-2c1-4%203-2%202%203%200%203%200%204%201%203%201-2%203-15%201-13v3l-2%201c-2%201-3%200-3-1l1-2%202-1v-1l-1-3c1-2%201-2%201%200%200%203%202%203%202%200%200-4-1-5-3-3v-2c0-5%200-5-2-2m-89%2023c0%209-2%208-2-1%200-4%200-5-2-5s-2%201-2%207c0%205%200%206-2%206l-2-1%201-1%201-5-1-6c-2%200-2%201-2%207v7l-1-7-1-7v8c0%205%200%208%201%207l7-1%206%201h1v-3l-1-8-1-6v8m54%209l-6%202h-5l2%202%203%202-3-1c-3-1-3-1-2%201v1l-4-2v3l-1-1-2-1v2l4%206c1%203%201%203%202%201s1-2%202%200l1%202v-2c0-2%200-2%201-1h5l6-1c7-1%207-1%203-8-5-6-6-6-6-5m-101%2011h-1l-1%201-1%201-1-1c1-2-2-1-4%202-2%202-2%202%200%202l3%201c1%201%200%201-3%201h-5l2%201%203%201c0%201-1%202-3%201-1%200-2%200-1%201%204%203%203%204-2%204l-6-1%201-2%204-1-4-1c-5%200-7%202-7%208v4l2-2c3-4%2010-4%209%200h2c1-2%202-2%206%205%202%203%204%206%203%207h3v-2l-1-2c0-3-3-8-5-11-3-2-2-3%201-1l4%204c2%203%202%203%202%201s0-2%202-2c1%201%202%200%203-3%200-2%202-3%203-4l2-1-2-5c-2%200-2%200-1-2%202-3-5-7-7-4m111%2031c-8%206-11%209-9%209%203%200-2%202-7%203-5%200-6%201-6%203%200%204%203%204%2015%200%2010-3%2012-4%2018-9%204-3%205-6%202-6a953%20953%200%2001-13%200M15%20363c-1%202%201%204%205%204h4l14%201c2%200%203%200%204-3l2-3-9-1c-9%200-12%200-10%202%201%201%201%201-1%201s-3%200-2-1c2-1%201-2-3-2l-4%202m126%204l3%206%205-1h5l-2%202c-3%204-3%204%206%204l8%201c1%202%200%204-2%204s-1%202%201%202v1c-2%200-2%201-2%202l1%204c0%202%207%201%208-2%202-4%201-5-1-5-4%200-3-2%201-3s5-2%204-7c-1-2-1-2-2%200l-4%201h-2c-1%201-1%201-1-1s1-3%203-2c3%202%203-1%201-2l-6-2c-3%200-3%200-1-1%202%200%202-1%200-3l-3-2-1-1-1-1c-2%200-2%201%200%204%203%204%202%205-5%205h-7c-1%201-3%200-3-2h3l-1-3v-3c1-1%200-1-2-1l-3%201h-1l-1-1%202%206m113-2c-1%203-1%203%201%203s2%201%202%204v5h8v-6c0-7%200-7-3-9-6-2-7-1-8%203M15%20387c1%204%201%204%205%203%204-2%207-2%207%201l5%202h6l1-4c1-4%201-5-4-3s-5%202-8%200l-5-1h-5c-2-1-2-1-2%202'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"regular":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAQFAgb/xAAWAQEBAQAAAAAAAAAAAAAAAAAAAgH/2gAMAwEAAhADEAAAAdCVFNeiTjL4CkN//8QAGhAAAQUBAAAAAAAAAAAAAAAAAgABAwQRE//aAAgBAQABBQKxLxBrLbityRyB0Il3iTi2YijDf//EABYRAAMAAAAAAAAAAAAAAAAAAAABEv/aAAgBAwEBPwGWSymUz//EABYRAQEBAAAAAAAAAAAAAAAAAAAREP/aAAgBAgEBPwFcj//EAB4QAAIBAwUAAAAAAAAAAAAAAAABAhARISIxMmFx/9oACAEBAAY/AvSGmSvRKOWWawcqPo2P/8QAHRAAAgMAAgMAAAAAAAAAAAAAAREAITFBYXGBof/aAAgBAQABPyFRbb2oVx0iRxENm4QBZ0DBGMU04BBAa6i0hiid8RQBuj3uBV+5/9oADAMBAAIAAwAAABDAAHz/xAAWEQADAAAAAAAAAAAAAAAAAAAAAWH/2gAIAQMBAT8QiyLKsqz/xAAXEQEBAQEAAAAAAAAAAAAAAAAAEQFR/9oACAECAQE/ELiExHH/xAAfEAEBAAICAQUAAAAAAAAAAAABEQAhMdFBUWFxobH/2gAIAQEAAT8QkaUQC8FMFAUBIpnh4zmtuxGExFlEQept84GTW02DqE9u8GBAgV1kPIaC3HT7cTKqhq3X8x0AHy7z/9k=","aspectRatio":1,"src":"/static/7d4a98470ec7e64e3cbb19681c7c7fab/1dc0b/cleancode.jpg","srcSet":"/static/7d4a98470ec7e64e3cbb19681c7c7fab/3a5ce/cleancode.jpg 163w,\n/static/7d4a98470ec7e64e3cbb19681c7c7fab/05730/cleancode.jpg 327w,\n/static/7d4a98470ec7e64e3cbb19681c7c7fab/1dc0b/cleancode.jpg 653w,\n/static/7d4a98470ec7e64e3cbb19681c7c7fab/f72c7/cleancode.jpg 980w,\n/static/7d4a98470ec7e64e3cbb19681c7c7fab/0ff54/cleancode.jpg 1200w","srcWebp":"/static/7d4a98470ec7e64e3cbb19681c7c7fab/0acdf/cleancode.webp","srcSetWebp":"/static/7d4a98470ec7e64e3cbb19681c7c7fab/ac59e/cleancode.webp 163w,\n/static/7d4a98470ec7e64e3cbb19681c7c7fab/7660b/cleancode.webp 327w,\n/static/7d4a98470ec7e64e3cbb19681c7c7fab/0acdf/cleancode.webp 653w,\n/static/7d4a98470ec7e64e3cbb19681c7c7fab/75470/cleancode.webp 980w,\n/static/7d4a98470ec7e64e3cbb19681c7c7fab/9000d/cleancode.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='M232%203c-3%203%205%207%2013%206%205%200%209%202%2012%206%203%205%204%205%201%205-2%200-2%205%200%208%202%202%202%202%201%203-2%201%202%203%204%203l3%201v-4c-3-6-1-7%204-2%204%204%207%208%204%207h-1c-1%201%2011%2013%2012%2012l-1-2-2-3c1-1%2010%208%2014%2014l4%205-3-7c-4-6-5-7-2-4h2c0-2-4-5-5-4l-2-1-8-10c-5-5-6-6-4-6l3%201-3-3c-4-5-6-6-9-6s-7-4-9-8c-3-6-25-15-28-11m150%2027a456%20456%200%2001-32%2027c6-7%203-5-4%202-8%208-10%2011-6%2012h4a127%20127%200%200021-23c1%201%201%201%200%200%200-2%203-4%205-3v-2c0%201%206-4%2011-11%2013-13%2013-14%201-2m-251%202a171%20171%200%2000-13%2024l-1%203h-3l-1%201%201%201c2-2%201%201-1%202l-2%202-1%204-1%203-2-3-1-3v3c0%204%203%2011%207%2016%204%204%2010%206%2019%206h5l2-6%204-10c4-6%204-6%200-8-3-1-5%200-4%204l-7%209%203-5c3-6%202-10-2-9-2%200-2%200%200-1l4-2c2%201%203%200%201-4l-3-7-1-4c-1%200-2-3-1-5%201-1%201-4-1-4v-2l2-8-3%203m133%2025c0%204%203%2010%205%2010l1-2v-1l2%205c0%202%204%206%207%206%202%200%200-7-3-11s-3-4-3-1c1%203-5-3-8-8l-2-2%201%204m39-1c3%206%202%209-2%207l1%203c2%205%202%2010-1%2010h-2l-3-1c-3%200-9-3-9-4l-1-1-1%204c0%204%201%204%204%205%204%201%206%203%204%203-1%200-2%201-1%202%200%201%200%202-1%201h-1l-1-2c1-2%201-2-5-2h-11c-8-2-8-2-12-1s-4%202-2%209c0%202%203%203%204%201h15c13%200%2013%200%2014-2%200-2%200-2%201%200%204%204%2014-11%2014-20%200-6-1-12-3-13-1-1-1-1-1%201m-111%205v7h21v-5h-10l-10%201v-5c-1-3-1-3-1%202M44%2057l3%203%202%204c0%203%209%2011%2012%2011%204-2%204-5%200-10l-5-4%203%204c4%204%201%204-4-1l-11-7m105%2016c-2%201-6%209-7%2015l-1%203h6c6-1%207-2%205-4s-1-3%201-10c1-2-2-5-4-4m-42%208l2%204%201%203c-1%201-1%200-2-1-2-5-4-3-5%205-1%203-1%203%201%203l1%202%202-1%202-2v2l-1%204c-1%201-2%209%200%208%201%200%201%204-1%208l-3%2012c-1%2014-2%2012-2-3v-13c-2-1-3%201-3%206v4l-1-4-1-15c0-9%200-11-1-10l-3%202c-3-1-4%201-4%2015l-2%2015-2%2016c-1%2018-3%2019-5%204%200-11-2-9-2%203%200%209%200%2010-2%2010s-3%203-1%206c1%203%203%202%203%200%200-4%202%201%203%208%201%205%201%205%201-5v-10l2%201c3%201%203%202%201%202s-3%202-1%202l1%201v2c1%200%202%204%202%2010l1%205v-3l1%203%202%2012c1%2011%202%2012%207%2010s6-1%205%207c0%204%200%206%201%205%201-2%201-2%201%200v3c-2%201%205%2011%2012%2015%201%201%201%201-1%202-2%200-3%201-3%202l-1%201c-2-2-2%206%200%2013l-1%202-2-5-1-4-9%2018c-2%205-6%2012-6%2010-1-1-20%207-22%209h-2c1-2-2-1-6%203l-7%203H0v37a372%20372%200%20002%2039c0-2%208-1%209%201%202%204%203%206%201%204-2-1-2-1-1%202l2%2012%201%2013-3-7c-4-12-7-17-9-15%200%201-1%201-1-1-1-1-1%205-1%2012%200%2017%200%2017%205%2017h4l-4-10c-4-13-4-15-3-15l1%201%204%2013%204%2011h9l8-1%202-2h6c3-1%203-1%202%201s-1%202%205%202h7v-3a1465%201465%200%20001-35l12-1c13%200%2013%200%2014%207v6l1%2014%201%2012h27l-1-5v-7l-1-19%207%205%204%204%203%202c0%204%204%204%207%202%204-3%205-2%202%201-4%205-4%2014%201%2013%201-1%202-1%202%201s1%203%2016%203c8%200%2014%200%2013-1-2%200-4-9-3-9v-3c1-2%201-2-3-2-6%201-6%200%200-1%204-1%207%200%207%201l-1%201-1%201v2c1%200%203%208%202%209l1%201h2l2%201%201-1%202-2c1-1%201%200%201%201l1%202%204-12%201-4c1-1%201-1%201%201%200%203%200%203%201%201%201-1%202-3%201-5l1-4c4-2%204%200%204%2012v12l1-11%201-11v21h21l-1-8-1-8%201%202%201%203%201-2-1-21h2v-2h-3c-1%201-1%201-1-1%200-1%201-2%203-2%203%200%203%200%203%204s0%204%202%203v-5c1-3%2011-3%2011%200l1%203c3%200%204-4%201-4-1-1%204-1%2010-1l10%201v3c0%202-1%203-5%203-6%202-9%201-9-3%200-2%200-3-1-2l-1%206c0%205%200%205-3%205-5%200-7-1-7-7%201-7-2-3-2%205l-3%2011c-1%204-1%204-2%202s-1-2-1%201c0%202%201%203%204%205l5%206%201%202c0-1%201-2%203-2s2%200%202%202v1l1-1h1l4%201h4v-11l1-11h5c4%200%206%202%202%202-2%200-2%200%200%201l1%201c-1%200-2%200-1%201l-1%202c0%201-1%201-1-1l-2-4-1%208-1%2010c0%202%200%202%2011%202%2013%200%2013%200%2012-5l3-3%202-6%201-4v-16c1-1%201-1%201%201v2l5-3%205-4%205-1c4%200%204%200%205%205a689%20689%200%20001%2024v10h29v-14l-2-19v-6h84l1-38v-37h-44l3-3c3-3%206-4%2010-4l5-1c1-1%201-1-2-1-5%200-10%202-15%205-6%204-14%206-12%203l-1-1-1%201-15%201h-15l1-10%201-18c2-11%200-19-5-24l-1-2%201-1c0-2%202-3%204-2h1l1-2v-6l-1-6c1-1-1-2-1%200v9h-3%201v-2c-2-3-6-4-6-2h-7c-6%201-6%201-6%204s0%203%201%201l2-2v2l-2%205c-1-1-2%200-2%201%200%202-1%203-2%203-2%200-2%200-1-1%202-2%204-11%202-11l-1%202h-1c0-2-5-4-10-7-8-4-8-5-5-5l4%201%208%204c5%203%206%203%2011%202l6-1-2-2c-1-2-1-2%201-2h3c1%200%205-7%205-10l5-1c6%201%206%201%209-8%203-7%203-14%201-12-2%201-3-9-3-30a386%20386%200%2000-1-17c-2%205-4%204-4-2%200-11-1-3-2%2013%200%2013-1%2018-2%2019-2%203-3%201-4-8-2-10-3-12-8-10l-3%202v-7l-1-8%204-6c6-5%206-6%203-13-8-16-18-17-95-17a531%20531%200%2001-54-1c0%201-16%203-18%202-1-1%200-1%202-1h3l-3-1-3-1h2l3-1c0-1-22-2-23-1h-3c-2-1-2-1-1-2%202-1%201-1-2-1l-3-2%201-1v-1c-1-4-4-9-4-7m92%2051c-4%202-16%2012-16%2014h2l-2%204-2%204%207-6c15-16%2021-15%2042%205%2013%2013%2017%2016%2028%2020%2010%204%2020%203%2027-4%204-4%202-4-3%200-8%206-15%205-29-1-10-5-14-8-12-8l-4-5c-3-3-5-5-4-6h-1l-1-1c2-2-13-16-17-16h-15m-3%2016c-5%203-8%206-18%2018-4%206-7%208-9%208-5%202-5%203-3%2013l3%2010%206%201c6%201%206%201%209-3l4-5a265%20265%200%20002-10l1%206c-1%202%200%203%202%200l2-1%202-1%2010-1c10%200%2011%201%2021%2013l8%209v2l1%201c4-2%209-2%2011-1s2%201-1%201c-5%200-9%202-13%207s-4%205%201%207c3%201%203%201%206-2%204-4%209-6%2012-6%204%201%204%200%201-4-2-3-3-4-2-5%201-2%203-2%202%200l2%203c3%201%203%201%203-1%200-1%200-2%201-1l1-5c0-3%200-4-1-2s-1%200-3-8c0-7-2-10-6-13l-2-3c0-2-1-2-8-3-3-1-5-2-9-7-15-18-18-20-27-20l-9%203m134%2013l-1%2023%205-12c1-4%200-12-1-12l-2-4c0-3-1-2-1%205m-70-4c-2%200-2%201-2%202%201%203-1%203-6%201-9-4-7-1%203%205%208%204%2018%205%2024%202%202-1%203-2%202-3v-1c1-2-10-6-13-4-1%201-1%200-1-1%200-2-1-2-7-1m32%2016l-4%203-2%201c-1-1-3%200-5%203l-3%204%208%202c11%203%209%204-5%201-3%200-4%201-1%202%201%201%200%201-1%201-5%200-3%201%204%203h7l1-1c2%201%202%200%204-2l1-3-1%204c0%203%200%204%201%203%202%200%203-4%202-5v-3c2-4%202-9%201-10l-1-2c0-2-1-2-6-1m11%209c-2%203-6%2016-6%2024l-1%205%202-3%202-2v3c1%202%201%202%201-3l2-4%201-2c1-4%203-2%202%203%200%203%200%204%201%203%201-2%203-15%201-13v3l-2%201c-2%201-3%200-3-1l1-2%202-1v-1l-1-3c1-2%201-2%201%200%200%203%202%203%202%200%200-4-1-5-3-3v-2c0-5%200-5-2-2m-89%2023c0%209-2%208-2-1%200-4%200-5-2-5s-2%201-2%207c0%205%200%206-2%206l-2-1%201-1%201-5-1-6c-2%200-2%201-2%207v7l-1-7-1-7v8c0%205%200%208%201%207l7-1%206%201h1v-3l-1-8-1-6v8m54%209l-6%202h-5l2%202%203%202-3-1c-3-1-3-1-2%201v1l-4-2v3l-1-1-2-1v2l4%206c1%203%201%203%202%201s1-2%202%200l1%202v-2c0-2%200-2%201-1h5l6-1c7-1%207-1%203-8-5-6-6-6-6-5m-101%2011h-1l-1%201-1%201-1-1c1-2-2-1-4%202-2%202-2%202%200%202l3%201c1%201%200%201-3%201h-5l2%201%203%201c0%201-1%202-3%201-1%200-2%200-1%201%204%203%203%204-2%204l-6-1%201-2%204-1-4-1c-5%200-7%202-7%208v4l2-2c3-4%2010-4%209%200h2c1-2%202-2%206%205%202%203%204%206%203%207h3v-2l-1-2c0-3-3-8-5-11-3-2-2-3%201-1l4%204c2%203%202%203%202%201s0-2%202-2c1%201%202%200%203-3%200-2%202-3%203-4l2-1-2-5c-2%200-2%200-1-2%202-3-5-7-7-4m111%2031c-8%206-11%209-9%209%203%200-2%202-7%203-5%200-6%201-6%203%200%204%203%204%2015%200%2010-3%2012-4%2018-9%204-3%205-6%202-6a953%20953%200%2001-13%200M15%20363c-1%202%201%204%205%204h4l14%201c2%200%203%200%204-3l2-3-9-1c-9%200-12%200-10%202%201%201%201%201-1%201s-3%200-2-1c2-1%201-2-3-2l-4%202m126%204l3%206%205-1h5l-2%202c-3%204-3%204%206%204l8%201c1%202%200%204-2%204s-1%202%201%202v1c-2%200-2%201-2%202l1%204c0%202%207%201%208-2%202-4%201-5-1-5-4%200-3-2%201-3s5-2%204-7c-1-2-1-2-2%200l-4%201h-2c-1%201-1%201-1-1s1-3%203-2c3%202%203-1%201-2l-6-2c-3%200-3%200-1-1%202%200%202-1%200-3l-3-2-1-1-1-1c-2%200-2%201%200%204%203%204%202%205-5%205h-7c-1%201-3%200-3-2h3l-1-3v-3c1-1%200-1-2-1l-3%201h-1l-1-1%202%206m113-2c-1%203-1%203%201%203s2%201%202%204v5h8v-6c0-7%200-7-3-9-6-2-7-1-8%203M15%20387c1%204%201%204%205%203%204-2%207-2%207%201l5%202h6l1-4c1-4%201-5-4-3s-5%202-8%200l-5-1h-5c-2-1-2-1-2%202'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"narrow":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAAAAQFAgb/xAAWAQEBAQAAAAAAAAAAAAAAAAAAAgH/2gAMAwEAAhADEAAAAdCVFNeiTjL4CkN//8QAGhAAAQUBAAAAAAAAAAAAAAAAAgABAwQRE//aAAgBAQABBQKxLxBrLbityRyB0Il3iTi2YijDf//EABYRAAMAAAAAAAAAAAAAAAAAAAABEv/aAAgBAwEBPwGWSymUz//EABYRAQEBAAAAAAAAAAAAAAAAAAAREP/aAAgBAgEBPwFcj//EAB4QAAIBAwUAAAAAAAAAAAAAAAABAhARISIxMmFx/9oACAEBAAY/AvSGmSvRKOWWawcqPo2P/8QAHRAAAgMAAgMAAAAAAAAAAAAAAREAITFBYXGBof/aAAgBAQABPyFRbb2oVx0iRxENm4QBZ0DBGMU04BBAa6i0hiid8RQBuj3uBV+5/9oADAMBAAIAAwAAABDAAHz/xAAWEQADAAAAAAAAAAAAAAAAAAAAAWH/2gAIAQMBAT8QiyLKsqz/xAAXEQEBAQEAAAAAAAAAAAAAAAAAEQFR/9oACAECAQE/ELiExHH/xAAfEAEBAAICAQUAAAAAAAAAAAABEQAhMdFBUWFxobH/2gAIAQEAAT8QkaUQC8FMFAUBIpnh4zmtuxGExFlEQept84GTW02DqE9u8GBAgV1kPIaC3HT7cTKqhq3X8x0AHy7z/9k=","aspectRatio":1,"src":"/static/7d4a98470ec7e64e3cbb19681c7c7fab/eaa58/cleancode.jpg","srcSet":"/static/7d4a98470ec7e64e3cbb19681c7c7fab/5a3ee/cleancode.jpg 114w,\n/static/7d4a98470ec7e64e3cbb19681c7c7fab/41f8f/cleancode.jpg 229w,\n/static/7d4a98470ec7e64e3cbb19681c7c7fab/eaa58/cleancode.jpg 457w,\n/static/7d4a98470ec7e64e3cbb19681c7c7fab/c309b/cleancode.jpg 686w,\n/static/7d4a98470ec7e64e3cbb19681c7c7fab/e3008/cleancode.jpg 914w,\n/static/7d4a98470ec7e64e3cbb19681c7c7fab/0ff54/cleancode.jpg 1200w","srcWebp":"/static/7d4a98470ec7e64e3cbb19681c7c7fab/15384/cleancode.webp","srcSetWebp":"/static/7d4a98470ec7e64e3cbb19681c7c7fab/31fce/cleancode.webp 114w,\n/static/7d4a98470ec7e64e3cbb19681c7c7fab/e3e25/cleancode.webp 229w,\n/static/7d4a98470ec7e64e3cbb19681c7c7fab/15384/cleancode.webp 457w,\n/static/7d4a98470ec7e64e3cbb19681c7c7fab/0258d/cleancode.webp 686w,\n/static/7d4a98470ec7e64e3cbb19681c7c7fab/64ea2/cleancode.webp 914w,\n/static/7d4a98470ec7e64e3cbb19681c7c7fab/9000d/cleancode.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='M232%203c-3%203%205%207%2013%206%205%200%209%202%2012%206%203%205%204%205%201%205-2%200-2%205%200%208%202%202%202%202%201%203-2%201%202%203%204%203l3%201v-4c-3-6-1-7%204-2%204%204%207%208%204%207h-1c-1%201%2011%2013%2012%2012l-1-2-2-3c1-1%2010%208%2014%2014l4%205-3-7c-4-6-5-7-2-4h2c0-2-4-5-5-4l-2-1-8-10c-5-5-6-6-4-6l3%201-3-3c-4-5-6-6-9-6s-7-4-9-8c-3-6-25-15-28-11m150%2027a456%20456%200%2001-32%2027c6-7%203-5-4%202-8%208-10%2011-6%2012h4a127%20127%200%200021-23c1%201%201%201%200%200%200-2%203-4%205-3v-2c0%201%206-4%2011-11%2013-13%2013-14%201-2m-251%202a171%20171%200%2000-13%2024l-1%203h-3l-1%201%201%201c2-2%201%201-1%202l-2%202-1%204-1%203-2-3-1-3v3c0%204%203%2011%207%2016%204%204%2010%206%2019%206h5l2-6%204-10c4-6%204-6%200-8-3-1-5%200-4%204l-7%209%203-5c3-6%202-10-2-9-2%200-2%200%200-1l4-2c2%201%203%200%201-4l-3-7-1-4c-1%200-2-3-1-5%201-1%201-4-1-4v-2l2-8-3%203m133%2025c0%204%203%2010%205%2010l1-2v-1l2%205c0%202%204%206%207%206%202%200%200-7-3-11s-3-4-3-1c1%203-5-3-8-8l-2-2%201%204m39-1c3%206%202%209-2%207l1%203c2%205%202%2010-1%2010h-2l-3-1c-3%200-9-3-9-4l-1-1-1%204c0%204%201%204%204%205%204%201%206%203%204%203-1%200-2%201-1%202%200%201%200%202-1%201h-1l-1-2c1-2%201-2-5-2h-11c-8-2-8-2-12-1s-4%202-2%209c0%202%203%203%204%201h15c13%200%2013%200%2014-2%200-2%200-2%201%200%204%204%2014-11%2014-20%200-6-1-12-3-13-1-1-1-1-1%201m-111%205v7h21v-5h-10l-10%201v-5c-1-3-1-3-1%202M44%2057l3%203%202%204c0%203%209%2011%2012%2011%204-2%204-5%200-10l-5-4%203%204c4%204%201%204-4-1l-11-7m105%2016c-2%201-6%209-7%2015l-1%203h6c6-1%207-2%205-4s-1-3%201-10c1-2-2-5-4-4m-42%208l2%204%201%203c-1%201-1%200-2-1-2-5-4-3-5%205-1%203-1%203%201%203l1%202%202-1%202-2v2l-1%204c-1%201-2%209%200%208%201%200%201%204-1%208l-3%2012c-1%2014-2%2012-2-3v-13c-2-1-3%201-3%206v4l-1-4-1-15c0-9%200-11-1-10l-3%202c-3-1-4%201-4%2015l-2%2015-2%2016c-1%2018-3%2019-5%204%200-11-2-9-2%203%200%209%200%2010-2%2010s-3%203-1%206c1%203%203%202%203%200%200-4%202%201%203%208%201%205%201%205%201-5v-10l2%201c3%201%203%202%201%202s-3%202-1%202l1%201v2c1%200%202%204%202%2010l1%205v-3l1%203%202%2012c1%2011%202%2012%207%2010s6-1%205%207c0%204%200%206%201%205%201-2%201-2%201%200v3c-2%201%205%2011%2012%2015%201%201%201%201-1%202-2%200-3%201-3%202l-1%201c-2-2-2%206%200%2013l-1%202-2-5-1-4-9%2018c-2%205-6%2012-6%2010-1-1-20%207-22%209h-2c1-2-2-1-6%203l-7%203H0v37a372%20372%200%20002%2039c0-2%208-1%209%201%202%204%203%206%201%204-2-1-2-1-1%202l2%2012%201%2013-3-7c-4-12-7-17-9-15%200%201-1%201-1-1-1-1-1%205-1%2012%200%2017%200%2017%205%2017h4l-4-10c-4-13-4-15-3-15l1%201%204%2013%204%2011h9l8-1%202-2h6c3-1%203-1%202%201s-1%202%205%202h7v-3a1465%201465%200%20001-35l12-1c13%200%2013%200%2014%207v6l1%2014%201%2012h27l-1-5v-7l-1-19%207%205%204%204%203%202c0%204%204%204%207%202%204-3%205-2%202%201-4%205-4%2014%201%2013%201-1%202-1%202%201s1%203%2016%203c8%200%2014%200%2013-1-2%200-4-9-3-9v-3c1-2%201-2-3-2-6%201-6%200%200-1%204-1%207%200%207%201l-1%201-1%201v2c1%200%203%208%202%209l1%201h2l2%201%201-1%202-2c1-1%201%200%201%201l1%202%204-12%201-4c1-1%201-1%201%201%200%203%200%203%201%201%201-1%202-3%201-5l1-4c4-2%204%200%204%2012v12l1-11%201-11v21h21l-1-8-1-8%201%202%201%203%201-2-1-21h2v-2h-3c-1%201-1%201-1-1%200-1%201-2%203-2%203%200%203%200%203%204s0%204%202%203v-5c1-3%2011-3%2011%200l1%203c3%200%204-4%201-4-1-1%204-1%2010-1l10%201v3c0%202-1%203-5%203-6%202-9%201-9-3%200-2%200-3-1-2l-1%206c0%205%200%205-3%205-5%200-7-1-7-7%201-7-2-3-2%205l-3%2011c-1%204-1%204-2%202s-1-2-1%201c0%202%201%203%204%205l5%206%201%202c0-1%201-2%203-2s2%200%202%202v1l1-1h1l4%201h4v-11l1-11h5c4%200%206%202%202%202-2%200-2%200%200%201l1%201c-1%200-2%200-1%201l-1%202c0%201-1%201-1-1l-2-4-1%208-1%2010c0%202%200%202%2011%202%2013%200%2013%200%2012-5l3-3%202-6%201-4v-16c1-1%201-1%201%201v2l5-3%205-4%205-1c4%200%204%200%205%205a689%20689%200%20001%2024v10h29v-14l-2-19v-6h84l1-38v-37h-44l3-3c3-3%206-4%2010-4l5-1c1-1%201-1-2-1-5%200-10%202-15%205-6%204-14%206-12%203l-1-1-1%201-15%201h-15l1-10%201-18c2-11%200-19-5-24l-1-2%201-1c0-2%202-3%204-2h1l1-2v-6l-1-6c1-1-1-2-1%200v9h-3%201v-2c-2-3-6-4-6-2h-7c-6%201-6%201-6%204s0%203%201%201l2-2v2l-2%205c-1-1-2%200-2%201%200%202-1%203-2%203-2%200-2%200-1-1%202-2%204-11%202-11l-1%202h-1c0-2-5-4-10-7-8-4-8-5-5-5l4%201%208%204c5%203%206%203%2011%202l6-1-2-2c-1-2-1-2%201-2h3c1%200%205-7%205-10l5-1c6%201%206%201%209-8%203-7%203-14%201-12-2%201-3-9-3-30a386%20386%200%2000-1-17c-2%205-4%204-4-2%200-11-1-3-2%2013%200%2013-1%2018-2%2019-2%203-3%201-4-8-2-10-3-12-8-10l-3%202v-7l-1-8%204-6c6-5%206-6%203-13-8-16-18-17-95-17a531%20531%200%2001-54-1c0%201-16%203-18%202-1-1%200-1%202-1h3l-3-1-3-1h2l3-1c0-1-22-2-23-1h-3c-2-1-2-1-1-2%202-1%201-1-2-1l-3-2%201-1v-1c-1-4-4-9-4-7m92%2051c-4%202-16%2012-16%2014h2l-2%204-2%204%207-6c15-16%2021-15%2042%205%2013%2013%2017%2016%2028%2020%2010%204%2020%203%2027-4%204-4%202-4-3%200-8%206-15%205-29-1-10-5-14-8-12-8l-4-5c-3-3-5-5-4-6h-1l-1-1c2-2-13-16-17-16h-15m-3%2016c-5%203-8%206-18%2018-4%206-7%208-9%208-5%202-5%203-3%2013l3%2010%206%201c6%201%206%201%209-3l4-5a265%20265%200%20002-10l1%206c-1%202%200%203%202%200l2-1%202-1%2010-1c10%200%2011%201%2021%2013l8%209v2l1%201c4-2%209-2%2011-1s2%201-1%201c-5%200-9%202-13%207s-4%205%201%207c3%201%203%201%206-2%204-4%209-6%2012-6%204%201%204%200%201-4-2-3-3-4-2-5%201-2%203-2%202%200l2%203c3%201%203%201%203-1%200-1%200-2%201-1l1-5c0-3%200-4-1-2s-1%200-3-8c0-7-2-10-6-13l-2-3c0-2-1-2-8-3-3-1-5-2-9-7-15-18-18-20-27-20l-9%203m134%2013l-1%2023%205-12c1-4%200-12-1-12l-2-4c0-3-1-2-1%205m-70-4c-2%200-2%201-2%202%201%203-1%203-6%201-9-4-7-1%203%205%208%204%2018%205%2024%202%202-1%203-2%202-3v-1c1-2-10-6-13-4-1%201-1%200-1-1%200-2-1-2-7-1m32%2016l-4%203-2%201c-1-1-3%200-5%203l-3%204%208%202c11%203%209%204-5%201-3%200-4%201-1%202%201%201%200%201-1%201-5%200-3%201%204%203h7l1-1c2%201%202%200%204-2l1-3-1%204c0%203%200%204%201%203%202%200%203-4%202-5v-3c2-4%202-9%201-10l-1-2c0-2-1-2-6-1m11%209c-2%203-6%2016-6%2024l-1%205%202-3%202-2v3c1%202%201%202%201-3l2-4%201-2c1-4%203-2%202%203%200%203%200%204%201%203%201-2%203-15%201-13v3l-2%201c-2%201-3%200-3-1l1-2%202-1v-1l-1-3c1-2%201-2%201%200%200%203%202%203%202%200%200-4-1-5-3-3v-2c0-5%200-5-2-2m-89%2023c0%209-2%208-2-1%200-4%200-5-2-5s-2%201-2%207c0%205%200%206-2%206l-2-1%201-1%201-5-1-6c-2%200-2%201-2%207v7l-1-7-1-7v8c0%205%200%208%201%207l7-1%206%201h1v-3l-1-8-1-6v8m54%209l-6%202h-5l2%202%203%202-3-1c-3-1-3-1-2%201v1l-4-2v3l-1-1-2-1v2l4%206c1%203%201%203%202%201s1-2%202%200l1%202v-2c0-2%200-2%201-1h5l6-1c7-1%207-1%203-8-5-6-6-6-6-5m-101%2011h-1l-1%201-1%201-1-1c1-2-2-1-4%202-2%202-2%202%200%202l3%201c1%201%200%201-3%201h-5l2%201%203%201c0%201-1%202-3%201-1%200-2%200-1%201%204%203%203%204-2%204l-6-1%201-2%204-1-4-1c-5%200-7%202-7%208v4l2-2c3-4%2010-4%209%200h2c1-2%202-2%206%205%202%203%204%206%203%207h3v-2l-1-2c0-3-3-8-5-11-3-2-2-3%201-1l4%204c2%203%202%203%202%201s0-2%202-2c1%201%202%200%203-3%200-2%202-3%203-4l2-1-2-5c-2%200-2%200-1-2%202-3-5-7-7-4m111%2031c-8%206-11%209-9%209%203%200-2%202-7%203-5%200-6%201-6%203%200%204%203%204%2015%200%2010-3%2012-4%2018-9%204-3%205-6%202-6a953%20953%200%2001-13%200M15%20363c-1%202%201%204%205%204h4l14%201c2%200%203%200%204-3l2-3-9-1c-9%200-12%200-10%202%201%201%201%201-1%201s-3%200-2-1c2-1%201-2-3-2l-4%202m126%204l3%206%205-1h5l-2%202c-3%204-3%204%206%204l8%201c1%202%200%204-2%204s-1%202%201%202v1c-2%200-2%201-2%202l1%204c0%202%207%201%208-2%202-4%201-5-1-5-4%200-3-2%201-3s5-2%204-7c-1-2-1-2-2%200l-4%201h-2c-1%201-1%201-1-1s1-3%203-2c3%202%203-1%201-2l-6-2c-3%200-3%200-1-1%202%200%202-1%200-3l-3-2-1-1-1-1c-2%200-2%201%200%204%203%204%202%205-5%205h-7c-1%201-3%200-3-2h3l-1-3v-3c1-1%200-1-2-1l-3%201h-1l-1-1%202%206m113-2c-1%203-1%203%201%203s2%201%202%204v5h8v-6c0-7%200-7-3-9-6-2-7-1-8%203M15%20387c1%204%201%204%205%203%204-2%207-2%207%201l5%202h6l1-4c1-4%201-5-4-3s-5%202-8%200l-5-1h-5c-2-1-2-1-2%202'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"seo":{"src":"/static/7d4a98470ec7e64e3cbb19681c7c7fab/0ff54/cleancode.jpg"}}},{"id":"fc731126-1fb1-5bd0-9b45-e17990fd8299","slug":"/s3-manager","secret":false,"title":"S3 Manager","author":"Luke Celitan","date":"April 27th, 2022","dateForSEO":"2022-04-27T00:00:00.000Z","timeToRead":2,"excerpt":"GUI for managing and browsking S3 buckets","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\": \"S3 Manager\",\n  \"excerpt\": \"GUI for managing and browsking S3 buckets\",\n  \"date\": \"2022-04-27T00:00:00.000Z\",\n  \"hero\": \"s3ManagerCover.png\",\n  \"author\": \"Luke Celitan\",\n  \"appDescription\": \"AWS S3 GUI\",\n  \"category\": \"Project\",\n  \"tech\": [\"Svelte\", \"Rust\", \"TS\", \"Tailwind\"]\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\": \"s3-manager\"\n  }, \"S3 Manager\"), mdx(\"p\", null, \"Hi everyone, I\\u2019m excited to share with you a project I\\u2019ve been working on for\\nthe last few months. It\\u2019s a graphical user interface to aws s3 service, which\\nlets you easily manage your buckets, files and permissions. I have wrote it\\nusing Rust lang in the backend and svelte for a frontend, and I want to tell you\\nhow fun it was working with rust backend.\"), mdx(\"p\", null, \"Rust is a systems programming language that focuses on performance, reliability\\nand concurrency. It has a powerful type system, memory safety guarantees and a\\nrich ecosystem of libraries and tools. Rust also has some unique features that\\nmake it a great choice for backend development, such as:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Ownership and borrowing: Rust uses these concepts to manage memory and\\nresources without a garbage collector, avoiding runtime overhead and memory\\nleaks.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Traits and generics: Rust allows you to define abstract interfaces and\\nimplement them for different types, enabling code reuse and polymorphism.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Async/await: Rust supports asynchronous programming with a built-in syntax\\nthat makes it easy to write concurrent code that is readable and efficient.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Error handling: Rust has a robust and expressive way of dealing with errors,\\nusing the Result and Option types and the ? operator.\")), mdx(\"p\", null, \"Using Rust for the backend of my GUI project was a rewarding experience. I\\nlearned a lot about the language and its features, and I enjoyed the challenge\\nof writing fast and reliable code. I also used some awesome crates that made my\\nlife easier, such as:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Tokio: A runtime for writing async applications with Rust.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Rusoto: A AWS SDK for Rust.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Warp: A web framework that provides a simple and elegant way to create RESTful\\nAPIs.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Sveltekit: A framework for building web applications with Svelte, a reactive\\nfrontend framework that compiles to vanilla JavaScript.\")), mdx(\"p\", null, \"The result is a GUI application that is easy to use, responsive and\\ncross-platform. You can download it from my GitHub repository (link below) and\\ntry it out yourself. I hope you find it useful and fun to use. If you have any\\nfeedback or suggestions, please let me know in the comments. Thanks for reading!\"), mdx(\"h2\", {\n    \"id\": \"lightmode-ui-overview\"\n  }, \"LightMode UI overview\"), mdx(\"p\", null, mdx(\"span\", {\n    parentName: \"p\",\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"2840px\"\n    }\n  }, \"\\n      \", mdx(\"span\", {\n    parentName: \"span\",\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"64.84%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAABYlAAAWJQFJUiTwAAAC0ElEQVQ4y32Ry09UdxTHr7ow7UZd+QeYCpi47MqNCxc2bdOkaqJR4yMx7nVlF6YbawGl2AoYoqD4QIQ4ghCh0lCVRwpKhZkLjKMzMA9mmAfDPO69c2fu8OmBCz5qdPHJ99zvOb+Tc85VXnx9E+eRm/gu3sHT95JxNcz4vzM4xwOoriBTkyGczz24R14zrfoJTPoJOX2EnruZHXUTGJxgpteFu3UU11kHyj9lTfjbX2KQQyuAsQgiH2CKl+djf5Wl3OSNJ7hONKI8Kb3OdKdKbuE1+sNfMLrLMXsq3vG4ivzfNeT7ajD7LmP+eWElV2nTdY7cyG3Uqg7U4w0oji23mGqfQEu8kobn0Xt+Q+++iLZKTzVa72Wbx3+IV/VeTuKucrThZtTKB6jHpGHjZgfjbS70xSyGmUcvgmbZq5uySm6JxRX4H0uetbgcqxXS8Og1lEsbunjRMoVZSGDMulkIe9GiPqzULMX0Z8iEKSb9FONeCnoU168OnIevolRu6GC09RWF4jz6rIfk3IzcUx5ko1iZuU8j+UIySCHuI2/EcZ5zMHZAJjy1/hEjbV4ZOo0W8ZKKBdGT0lCLY32SmJDASoex5gMUcvOM/SyD7bmOcnxdL8/uTUvDJIbfSVbWNqMeivM+igmvTfzNO1Y9yVtSZ4UnKGSCjP7UyfDuZpSDax7xtC0IC/Knq79Hr9uLUbdHEK0VrT+A0XgMo+GozZV9tr9cJ/GlbzHazzB8uof+HQ9Rdq1toa/NIxPqGLEAZjqKsRCRO87ZpOQ7HRdiNuLZRDBSokmpySUYODnEX18Noexcd5uOJie6HDnyxk0kGCQdi8ot596SFTIrZOMrcTxGJhIiE5ohk4rQ+6NK65cemXDjXb7b0sQP2+v5pux3dpfVsL/kPoe2dnGopHNZT2zt5mzpU86XDFJXNkDdtn5qRWtL+qkvfUbDtkEaNrlp/MLPf3bLcqcXG4ABAAAAAElFTkSuQmCC')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  }), \"\\n  \", mdx(\"picture\", {\n    parentName: \"span\"\n  }, \"\\n          \", mdx(\"source\", {\n    parentName: \"picture\",\n    \"srcSet\": [\"/static/73c74f337af4d7a25cd2f343437b5458/a3bc4/lightFiles.webp 2500w\", \"/static/73c74f337af4d7a25cd2f343437b5458/46158/lightFiles.webp 2840w\"],\n    \"sizes\": \"(max-width: 2840px) 100vw, 2840px\",\n    \"type\": \"image/webp\"\n  }), \"\\n          \", mdx(\"source\", {\n    parentName: \"picture\",\n    \"srcSet\": [\"/static/73c74f337af4d7a25cd2f343437b5458/412e4/lightFiles.png 2500w\", \"/static/73c74f337af4d7a25cd2f343437b5458/40555/lightFiles.png 2840w\"],\n    \"sizes\": \"(max-width: 2840px) 100vw, 2840px\",\n    \"type\": \"image/png\"\n  }), \"\\n          \", mdx(\"img\", {\n    parentName: \"picture\",\n    \"className\": \"gatsby-resp-image-image\",\n    \"src\": \"/static/73c74f337af4d7a25cd2f343437b5458/40555/lightFiles.png\",\n    \"alt\": \"LightMode\",\n    \"title\": \"LightMode\",\n    \"loading\": \"lazy\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    }\n  }), \"\\n        \"), \"\\n    \"), \" \", mdx(\"span\", {\n    parentName: \"p\",\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"2798px\"\n    }\n  }, \"\\n      \", mdx(\"span\", {\n    parentName: \"span\",\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"66.19999999999999%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAABYlAAAWJQFJUiTwAAADr0lEQVQ4yzWTfUzUBRjH759K22rk2txaL1pKwHnUMDzerixIk04FTSTjLd6EoPHq1CBS0CsV5C2naagh4AEmgZDdWAYIp0PeOTi4k5c7uBIQKOLl7jj69OuPnu277/Zsz2ff59keUbvrNTSfV2H4rhp9UzcajQlNl4G+HiNajZHB/jEGukbQdwwxqhllTGtgXDOCqUOHqXOQ8VYthsZ+dDXd9J2oRdQmKcWk6mcRM3MLZhbMFhYtFpb/sWFdWcaybMVsNWNetgiyYrEtY7bZBP3vNpZYYfSXTjTRVxA1byrBqBpi6fEAKONYqUzCUhqL9Xo8VCZAzWGo+xJ+zhA8HW4mCRL6VYJXJQsz0dB5jdGbAjD0IqKf7JUYVHpG9G0URO6i6UwMv/96Cf0NBdXHIyjNjKUoLQJF5E6+PxpGhSKBnPgossKDOR0XzbGg/RTnZzN2oxVNyCVEP7xwi4e1wi0mRriefRz1qVC6K8/RUnSMc6czcXTZwkaxMxJXDza+sRl5YBTbAjORvBPHlm2JOEojiErNw1TeQm+wACxcc5uBujG0A13UHApgMMuJtoR1mAqDuFVwDKnUFWexAzJPT+S+20lIPERg+Ane909BvjcVD1kYyWm5jCvV9BwQVj67po7B2yYeah9wYZ8rBoUL0ydfYSLdicbcL3hdLMHBfqMAluLi7MQnQZ8SHHMGb79k5AFH8HovmuT0fMbK1HQFCAlTnlahVU2i7X/AkXcdUIa4oI53ZOjom7QXJLLZ3RN3NzekguztN7DTbz/BB7Px8U9lu38Sbm8LCdNzMRTfo233ZUSRT9yhR/WY9va7vLR6LeFSMRmyZ2iKceD+2Wiksq14yWQ4OYlZ/+p65LsD+Cg4k60fJuHlHYW9g5y41G8YudzKfZ8SRCFP1tNe+4jh0QFOpqRR9PVXKGL8yQn1oK1MQV5+AXnZp4j/LIbAgH1kZBzn2/OVnMm5SlLKaXx3RKPIuYj+fDtNblWIdjz1I3erR4AFZh+NMTNhxLY0zZ+jfUxq7qFWN9LQUE9nZyvNLQ309naxODfNzOQ41sVZ5mcn+Wtxkr6cfupfa0bks6ocVbmOhSkjU0YTM39MMT05x2zFBRpi97DOXc6Gtz5gk2wP9m67SMsq5L8y/23GOi981LyV5RUzbYeHqVytE4B2Svw2VLBXUoZcXIyvuISPHe8Q9nI9B56vwtuuBvmztRx87jdS7NTkvthBsUTPFbGOq046SgRXSnRcWzvM5VVG/gXyNs+3VamzyAAAAABJRU5ErkJggg==')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  }), \"\\n  \", mdx(\"picture\", {\n    parentName: \"span\"\n  }, \"\\n          \", mdx(\"source\", {\n    parentName: \"picture\",\n    \"srcSet\": [\"/static/1f39b5c6ac740589d5b7bc8b6c0548fe/a3bc4/lightImg.webp 2500w\", \"/static/1f39b5c6ac740589d5b7bc8b6c0548fe/0030e/lightImg.webp 2798w\"],\n    \"sizes\": \"(max-width: 2798px) 100vw, 2798px\",\n    \"type\": \"image/webp\"\n  }), \"\\n          \", mdx(\"source\", {\n    parentName: \"picture\",\n    \"srcSet\": [\"/static/1f39b5c6ac740589d5b7bc8b6c0548fe/412e4/lightImg.png 2500w\", \"/static/1f39b5c6ac740589d5b7bc8b6c0548fe/92245/lightImg.png 2798w\"],\n    \"sizes\": \"(max-width: 2798px) 100vw, 2798px\",\n    \"type\": \"image/png\"\n  }), \"\\n          \", mdx(\"img\", {\n    parentName: \"picture\",\n    \"className\": \"gatsby-resp-image-image\",\n    \"src\": \"/static/1f39b5c6ac740589d5b7bc8b6c0548fe/92245/lightImg.png\",\n    \"alt\": \"LightMode\",\n    \"title\": \"LightMode\",\n    \"loading\": \"lazy\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    }\n  }), \"\\n        \"), \"\\n    \")), mdx(UI, {\n    colors: ['#1F2937', '#52525b', '#F9FAFB', '#FFEDD5', '#FFF7ED'],\n    primeFontFamily: 'Roboto',\n    secondaryFontFamily: 'Audiowide',\n    background: '#FFF7ED',\n    textColor: \"#1F2937\",\n    h1: {\n      fontFamily: 'Roboto',\n      fontWeight: '700',\n      fontSize: '40px',\n      textTransform: 'uppercase',\n      color: '#1F2937'\n    },\n    h2: {\n      fontSize: '35px',\n      fontWeight: '700',\n      fontFamily: 'Roboto'\n    },\n    body: {\n      fontFamily: 'Roboto',\n      color: '#1F2937',\n      fontSize: '18px',\n      lineHeight: 1.7\n    },\n    mdxType: \"UI\"\n  }), mdx(\"h2\", {\n    \"id\": \"dark-mode-ui-overview\"\n  }, \"Dark Mode UI overview\"), mdx(\"p\", null, mdx(\"span\", {\n    parentName: \"p\",\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"2920px\"\n    }\n  }, \"\\n      \", mdx(\"span\", {\n    parentName: \"span\",\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"65.2%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAANCAYAAACpUE5eAAAACXBIWXMAABYlAAAWJQFJUiTwAAADeElEQVQ4y0WR20/bZRyHG6GkvzE5hFNbaKEttPRI++v5RGmhtIVBKZsBPLAZ5hgzMMHCTqVsFNguHDBBZFmWELPbRf8AvZnuRhY1RhONJoaLmZho9D94/AkXXjz5fN/vxfO+bz6ysYYSE8oC05oZch27hPSfElY/IaR8QrDxEwL1BwTrHxOseyTlIwIN+/gbdvE3PiDUuEWgroS3ZhVv5TYuYR3Z6H8H9SgqnYV6XYRaiSZTgpq2MFXa4DE1bSEpA8fzq9qQRPCYKmk+rfWjVAVxn7qDS1FCNli9jKU+S3NbO7cSBm70aMmHVOTDapZ7dRSS7RTSZlYGbcdzsa+VlWTbSUos92kxarqwKYqIwhqyiLCIVZ3DandQyth4OhPj650Zvtx4nftZK3tTcXYudFMa6eLhxTgbOS/FAT+r2bC0i1Ic9GFu8/8v9FbMYmwawBmM8fBuiS82pvjus8c8P1hn/Ow5VO1W7J4gZjGExRfG4BnBkZjHEZ/DlbiKPTqNpq0Pp6JwIhTLp9HVpWg1unl6fZJf1h0cvmfgj/23KUyN02Fsx+NyEA2HyQ5l6E1NkB69RmY0T3pojr70JXSGE6FbKJ0IW2v70eitfDQW5teSm7/WNPxTEll/Y4jGZg1Ohx2/z4dXtBPqGWVgrEDq7OKxNJG5LAmTiIpbknAVmUX+FqqqGHVqI/NxBwfjXTybMXFUDLB9vh9dp52I9Dq3243BoJO+n2FwbIXkyALx9BVi/RfR6Xsl2Q08QhGZsXwCZXWU2qZ2bM2dTHeLrCUb+SbvYv+dXsRgN6l0CpfLiSg68YSGOfNagcFzS3QnpojGz0sX9eGVyvUKN5HpykZoqgpTrTRh6/Djs4oEOzSM+7RMZiJYXN10SYV0WkTsdhGjLSYVlJP2w+hNSfSdvbS0RAicyuNTXEOmKotRc9qJxuDk9sYDVu5+yOLqJsuz8+SiPZgjZ3D0ZDGGBrDEhslOzrC+/TE3N7ZYWv2A0tYeHn8Wr3wOj+J9ZGpJWCV0YdK5+OrzZ7x4/oLDw5/4YfMOC1YD5S0+tOYkFmeODnOW4sIOf/78N799+5Kj73/n6MeXjA9cxfvKZRyKd5E1lUdoKAtK+GiQe6iTu1FW9NBSkaZFnpIyg75imLRiniuK+ywJe+SFXeaETS4J93iz8jbZyuuEhFlM8gv8C9FI4Hm3W9PDAAAAAElFTkSuQmCC')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  }), \"\\n  \", mdx(\"picture\", {\n    parentName: \"span\"\n  }, \"\\n          \", mdx(\"source\", {\n    parentName: \"picture\",\n    \"srcSet\": [\"/static/c16fac002607f92a68caa474d8814ea9/a3bc4/darkImg.webp 2500w\", \"/static/c16fac002607f92a68caa474d8814ea9/5694a/darkImg.webp 2920w\"],\n    \"sizes\": \"(max-width: 2920px) 100vw, 2920px\",\n    \"type\": \"image/webp\"\n  }), \"\\n          \", mdx(\"source\", {\n    parentName: \"picture\",\n    \"srcSet\": [\"/static/c16fac002607f92a68caa474d8814ea9/412e4/darkImg.png 2500w\", \"/static/c16fac002607f92a68caa474d8814ea9/5be2d/darkImg.png 2920w\"],\n    \"sizes\": \"(max-width: 2920px) 100vw, 2920px\",\n    \"type\": \"image/png\"\n  }), \"\\n          \", mdx(\"img\", {\n    parentName: \"picture\",\n    \"className\": \"gatsby-resp-image-image\",\n    \"src\": \"/static/c16fac002607f92a68caa474d8814ea9/5be2d/darkImg.png\",\n    \"alt\": \"DarkMode\",\n    \"title\": \"DarkMode\",\n    \"loading\": \"lazy\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    }\n  }), \"\\n        \"), \"\\n    \"), \" \", mdx(\"span\", {\n    parentName: \"p\",\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"2732px\"\n    }\n  }, \"\\n      \", mdx(\"span\", {\n    parentName: \"span\",\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"70%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAYAAAAvxDzwAAAACXBIWXMAABYlAAAWJQFJUiTwAAADBUlEQVQ4y32TWU8bZxSGx2AwQwPE2wTwLJ7xggF7PNjjZYxxqAPBAaKoSkqK3Uq5oGqkSq3UNV1kp1ilraIuUqUoiiIVqkq5yX98+nmJyE178ej9znmPXp1ZPuk95ZRO7HM+Mj5mJ3VBzXjJ5vLfeNfOqUb/ohp5gRd5jhd+RnVA5Cnl6J+C36gqvwrvFyqh7ykvnOHO/o50GPqGhOES1TcIWVuEEg3eUqtc0caoFeZ1j7nBOVYW9WV/pB6zWgEjcgdX/glpP/gVilqk6WQ4O1ihdytDt5Wm1xLngd5apXuYozfEHvq9sd8VPG5l+HbPxFneIx84Q6rPfYqe2uJ2JcuTVpzedozTpjZG5XTXpC9C+yKoLwJOd+Jv+Br9pk63uUgxNggUGxbkh6hGhbBZYkbz8ClFJhddpOjGiIiDFM4Lfc3r/kgnFDGrZFkKHlCSxYb29AOW9AqpZI5S6TpubQ/HbZJaq5JcrZAc6JsMeoKEIL3u4ZRukLLLmMohpRkRmJt6QCxexUw65Jw664VtMSzqFTGUqfwP5eHcurONte4OA8vyj0jZwAdcjdpoZo58oUGu+DYZewtruEX1P7GG23us5a9jZV0sEViR+0jJwF3mI1mWjRxWvkncuYmSrhM0qwQtb6Rm5RLrsh9O1tCyNwilyxjRAzz5MVJaBE4HbW47SV4dW1wcpbi4Z3F+d4DJ+f0VLjr5MTbn76ZG/YEv5v4R8y/u6dSNXfEOu0ja9E1mQ1nctRwntTRHeY12wRwTp120aLtJOm5qhKg7wusURtp2TI4KKvnFXbHhd0jXpmrMR1dRTAcl02BePIos/nxZK44pMKNuMK3aTAkmtZzAxj+o9TxXEmX8RhY9skNDfiQC/ZsszNmo4sOsJTxWxPVLqpck1DqrWpOa/g7b+hEt/f0hO/oxTeM+u8ljauYdcdc71OXPxD85uYky4RH2lbgqbbAgOUR9DZYmWiz5WiwLVN8+1YkPOZl8wpf+ZzzyP+cL/1M+8f/Bif9n2oEf2J/9mmLgIf8CjOHDk7qWKZ0AAAAASUVORK5CYII=')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  }), \"\\n  \", mdx(\"picture\", {\n    parentName: \"span\"\n  }, \"\\n          \", mdx(\"source\", {\n    parentName: \"picture\",\n    \"srcSet\": [\"/static/355626eec6bd9de3a88a60da8c7f8c8c/a3bc4/darkFiles.webp 2500w\", \"/static/355626eec6bd9de3a88a60da8c7f8c8c/57c94/darkFiles.webp 2732w\"],\n    \"sizes\": \"(max-width: 2732px) 100vw, 2732px\",\n    \"type\": \"image/webp\"\n  }), \"\\n          \", mdx(\"source\", {\n    parentName: \"picture\",\n    \"srcSet\": [\"/static/355626eec6bd9de3a88a60da8c7f8c8c/412e4/darkFiles.png 2500w\", \"/static/355626eec6bd9de3a88a60da8c7f8c8c/f2f36/darkFiles.png 2732w\"],\n    \"sizes\": \"(max-width: 2732px) 100vw, 2732px\",\n    \"type\": \"image/png\"\n  }), \"\\n          \", mdx(\"img\", {\n    parentName: \"picture\",\n    \"className\": \"gatsby-resp-image-image\",\n    \"src\": \"/static/355626eec6bd9de3a88a60da8c7f8c8c/f2f36/darkFiles.png\",\n    \"alt\": \"DarkMode\",\n    \"title\": \"DarkMode\",\n    \"loading\": \"lazy\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    }\n  }), \"\\n        \"), \"\\n    \")), mdx(UI, {\n    colors: ['#1E293B', '#0F172A', '#FFEDD5', '#FFF7ED', '#F9FAFB', '#FFF'],\n    primeFontFamily: 'Roboto',\n    secondaryFontFamily: 'Audiowide',\n    background: '#1E293B',\n    textColor: \"#FFF\",\n    h1: {\n      fontFamily: 'Roboto',\n      fontWeight: '700',\n      fontSize: '40px',\n      textTransform: 'uppercase',\n      color: '#fff'\n    },\n    h2: {\n      fontSize: '35px',\n      fontWeight: '700',\n      fontFamily: 'Roboto'\n    },\n    body: {\n      fontFamily: 'Roboto',\n      color: '#fff',\n      fontSize: '18px',\n      lineHeight: 1.7\n    },\n    mdxType: \"UI\"\n  }), mdx(\"h2\", {\n    \"id\": \"installation-files\"\n  }, \"Installation files\"), mdx(\"p\", null, mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://github.com/MassivDash/S3_Manager/releases\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"releases\")), mdx(\"h2\", {\n    \"id\": \"features\"\n  }, \"Features\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Dark and light mode dependant on system preferences\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Files, Pictures, Movies and buckets gallery (grid style)\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Optimized for looking through the pictures / movies, lazy loading, images and\\nmovies streamed dritecly from the bucket, are loaded with presigned urls.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Adjustable grid gallery\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Simple name search\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"folders filtering in movies and images pages\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Tagging of assets\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Folder creation\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Multi file upload (drop files)\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Galleries remember scroll positions while navigating the app.\")), mdx(\"h3\", {\n    \"id\": \"aws-account\"\n  }, \"AWS Account\"), mdx(\"p\", null, \"In order to use the application you need aws account with s3 service activated.\\nS3 app uses standard aws config files used for aws cli connection\\n\", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"info here\"), \".\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\"\n  }, \"~/.aws/credentials\\n\")), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\"\n  }, \"[default]\\naws_access_key_id=AKIAIOSFODNN7EXAMPLE\\naws_secret_access_key=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY\\n\")), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\"\n  }, \"~/.aws/config\\n\")), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\"\n  }, \"[default]\\nregion=us-west-2\\noutput=json\\n\")), mdx(\"h3\", {\n    \"id\": \"alternate-s3-endpoint\"\n  }, \"Alternate s3 endpoint\"), mdx(\"p\", null, \"Set env vars \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"S3_CUSTOM_ENDPOINT\"), \" to \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"true\"), \" or \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"1\"), \" at your machine to alter the\\ns3 default endpoints Set the alternative endpoint url with\\n\", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"S3_CUSTOM_ENDPOINT_URL\"), \" env\"), mdx(\"p\", null, \"Rust lang (cargo) and node.js (npm or yarn) and tauri-cli instalations are\\nneeded to run / build the project from source\"), mdx(\"p\", null, \"This application is based on \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://tauri.app/\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"tauri.app\"), \", RUST lang in the\\nbackend (core of the app and frontend things are handled by svelte + vite + ts\\ncombo.\"), mdx(\"p\", null, \"Simple division: Rust manages the data and the calls, front end displays the\\ndata.\"), mdx(\"h2\", {\n    \"id\": \"github-info\"\n  }, \"Github info\"), mdx(\"p\", null, mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://github.com/MassivDash/S3_Manager\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"https://github.com/MassivDash/S3_Manager\")), mdx(\"p\", null, \"Don\\u2019t forget to \\u2B50 the project if you found it helpful.\"));\n}\n;\nMDXContent.isMDXComponent = true;","tech":["Svelte","Rust","TS","Tailwind"],"category":"Project","appDescription":"AWS S3 GUI","hero":{"full":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsSAAALEgHS3X78AAAEGklEQVQ4y4VT+0+bVRjuf2BM1OmccRujBGd0CzBMdEAUURHdHOp+GGBEhJEtbi7RNQ4cRqNGN1xkGgXb0nvXLKy0hV0EQQesK1CuExjrECalQC9AaQuMr4/vOV0ZRtGTPN97znu+85z38hyRIAhgCAthAtlwGFHfCpYZlrFMYDbiu7Om+Wq/6B+H10KUiDA2+gcmJpwIBoNEdpsTRsEJWVTRsRJxOBIxI7q9tMTXCwsLuD40iHabFW2tLXA6x/mZ5VXRiphjiQ54vR6EQqEVsigx27vpcGBsbBT9fb3o6bbj4oXzMJuMfO73++9ezgiXFhcxOenCLTowfH0Ic3NzPBJG5PP50NluQ3PTL7BdtXLCOkstDh4oxlt5Oai3mOD1eOB2TyNE6bMhmp2dwQSFHrFO9PX2YOSmg1IQiHwW3V2duGq9AmW1DHLZTyg/8RVOEq60tcI9PY3ZmRl02TvgHI+kLxqmmvT39cDlclFkIZzRa9HQ8DPfDAQCPEqfz8vr9fu1fvq3jyJy82aMjDigUlbj49ISzM/PRwhZDVgqvb3dMNUaUV9fx9dddjs6OtoxODjACf8+wrBa23D06Ad4t+AdpKWmQK1WRQjZh9XM5ZrA5d9+xZHDh9Da0gLHjWGYjTUw0yUGvQ4ymZSi10NRLYdE8iEynk9HSspOVHx7CsX7i9DY2BAhZO3GKtmwTg8NDPD0pJU/4svPP4NGpeD2VPlJHCjej9SUZ5CXuw97XtvFG1RVVYlFau6KDqNgg9XsEslCIZdCQilp1UpotSoqQSdvGMvCYjahrOw4knck4cj7h/DD96e50HmEqwm9Xi8velvLZZJKI+/+9NQUtBo1CvLfRmFBPsklF7FbYiCOjUVpyTHYOzvo5YxyrapVSiK8kzKzk1THqclJLFJNfSR0JlwryYNJ5psTX8NYcxbFRYUUWQJ2v5rFazs4cA1e0uEXVJLkpMRIU4IkYicR+al+UyRUG93qnvGhllIrOV6Ksk8/gYK6aKO0G5ubUGsxQ65UoOK70zCcNaCddLgvNweSYx9B1HS4CBcKc3Audw+MBEv+XujffBk1edlQ7M5A+c4EVGWmQf36S4RMVGamouFgPqyS9yDflQ5p1rPQvJGJiueegm5vFkTymPugT9gCQ3I8ziSJodu2GYZEMVRxD0Idez/08euhiVtH8wc42Fy+6V5IH70HGvE6vlbRf7r4h7gVqZ/YiJr0HTj34tMwvZKGuuwXYMnOgHZ7DFRbN0D9+CPcKh97GCoCt7SO+u761/O5SJsYJ2i2bRI0TzJsFOgCWm8WNNtjBAXNZVs3CEry65PiBF2i+H8hClA3gySXAGGBHrr7z1vw01v108Mf6ulG8/k6jDtu8L2Ah/3r4fZfQXusy/1rIfwfe2vhL/Kc+noaqXyIAAAAAElFTkSuQmCC","aspectRatio":1,"src":"/static/7e76a640f9382dc8a36ea033c8346b68/a1946/s3ManagerCover.png","srcSet":"/static/7e76a640f9382dc8a36ea033c8346b68/5b37e/s3ManagerCover.png 236w,\n/static/7e76a640f9382dc8a36ea033c8346b68/49058/s3ManagerCover.png 472w,\n/static/7e76a640f9382dc8a36ea033c8346b68/a1946/s3ManagerCover.png 944w,\n/static/7e76a640f9382dc8a36ea033c8346b68/6050d/s3ManagerCover.png 1200w","srcWebp":"/static/7e76a640f9382dc8a36ea033c8346b68/99fbb/s3ManagerCover.webp","srcSetWebp":"/static/7e76a640f9382dc8a36ea033c8346b68/77392/s3ManagerCover.webp 236w,\n/static/7e76a640f9382dc8a36ea033c8346b68/1f177/s3ManagerCover.webp 472w,\n/static/7e76a640f9382dc8a36ea033c8346b68/99fbb/s3ManagerCover.webp 944w,\n/static/7e76a640f9382dc8a36ea033c8346b68/9000d/s3ManagerCover.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='M283%2069c-3%202-4%203-4%205s0%202-1%201c0-3-1-2-11%204-6%203-8%205-8%206%200%202%200%202%202%202v2c0%202%200%202%202%201l2-3h3l2-1c0%201-2%203-5%204-3%202-6%204-6%206l-3%203c-2%201-2%201-2-2%201-3-1-4-4-1-3%202-2%203%200%203h2l-2%203-2%202h1l3-1%202-1%204-2c3-2%203-2%2014%202l11%203%201-9%201-9%201%209%201%2010%207-3%206-3c2%200%204-3%205-5l-2-2c-1%200-3-2-1-3s-1-9-4-9l-1-1-3-1h-2l-5-3c-8-3-8-3-3-6%204-2%205-3%203-3l-4%202m-93%2024c1%201%201%201-1%201h-4l2%201%203%201-3%201c-2%200-2%200-1%201h3c4-1%205-1%205%202%201%203%205%207%2010%208%201%201%202%201%202-2%201-3%201-4%204-3l4%203c2%202%202%202-2%204-3%201-4%202-3%204h4c0-3%202-3%202%200%201%203%200%203-2%202l-3%201h4c3%200%204%200%203%201-2%200-1%202%201%202%205%200%207%201%207%203l1%202h1l2%201%201-2-1-2c-3%201-3-1-1-3%204-5%2015-4%2015%201l-1%202h-2l-2%201h-2l2%201c4%202%2024-2%2029-5l3-1c3-1%203-1%202-2h1c2%200%202%200%201-1v-1h2l1%201v-4c-1-1-2-2-3-1-1%200-12-3-15-6-3-1-5-1-4%201l-3%202-4%202c-1%203-6%204-10%202h2l4-1-6-1h-6l1-1h-2c-3%200-3%200-1-1h-2c-3%200-3%200-1-1h-1c-3%200-3%200-2-1v-1l-2-2-3-3v1l-2%203h1l2%201v1h-1v7l-1-2-1-3v-1l-1-1-2-3c0-2-1-2-3-1-3%200-3%200-2-1s1-1-1-1h-2c-3%200-3%200-2-1s1-1-1-1h-3c-3%200-3%200-1-1h-2c-2%200-3%200-2-1%202-1%202-1-1-2h-4m-87%2023l-2%203c-2%202-3%209-2%209%201%201-2%203-7%205-6%203-8%204-7%205h5c2-1%204-1%2014%202l12%204-4-4c-6-6-7-9-7-18l-1-8-1%202m258%202l-8%207-6%203a307%20307%200%2001-33%2018c-21%2012-40%2019-59%2021l-7%201%202%201%2013-1%208-1c9-1%2018-4%2024-7l6-2-5%204c-17%207-38%2011-63%2011-18%200-24%200-43-4l-4%201%201%202%201%2010c0%208%200%2010-2%2011v1c2%200%204-2%203-5l1-3%201%202c-1%202%200%203%201%203l1-3%201-3c1-1%201-1%201%201l2%202c2-1%204-2%202-2l-1-2h1l3%201%203-1-3%202-2%202h2l4-1%201-3c1-3%201-3%201%202%200%203%200%205%201%204h2v2l-1%203c0%202%208%201%2014-1l4-1c2%203%204%200%204-6%200-4%200-5%201-3%200%203%200%203%205%203l9%201c2%200%203%200%203%204l1%206v2c-1%202-1%207%201%208%202%200%203-3%201-4v-1l2%201%201%201c3%200%204%200%204%202l1%201%201-1%202-1-1-2c-3-1-3-1%202-1h4c-2-1-2-1%200-1l3-1h1l1-2v1l1%201%201-2h2v2c-1%201-2%201%2014%201%2014%200%2016%201%2010%204-7%204-12%206-14%205l-1%201c1%201-12%205-25%208-14%202-45%202-60-1-14-2-23-5-23-6h3l4%201-3-2c-4-1-4-2-5-4l1-3%201%201%204%201c4-1%205%200%203%202l-1%201%206%202-2-1c-2-1-2-1-1-3%201-3%201-3-3-3a374%20374%200%2001-9-1l-5%205c-3%201-4%204-4%206%201%201-4%205-10%208l-4%204%204-2%206-2h1c0-1%208-4%2012-4%206-1%2021%2014%2024%2025%201%202%201%202-1%201s-3-1-6%203c-5%205-7%206-8%203s-2-2-1%201c0%203%200%203-4%205-3%202-4%202-5%200-5-5-7-5-4%200%202%204%201%204-4%207s-9%203-5%200c2%200%202-1%200-2-1-1-1-1-1%201s0%202-1%201l-1-1-1-2v-1l-3-4c-3-5-7-9-7-7l2%202c1%201%202%203%200%203v1l-6-6-10-9-3-3h-1c0%201-1%201-3-1-5-2-4%200%201%203%2012%206%2024%2020%2026%2030l1%205%204-2%206-4a183%20183%200%200131-15c1%202-39%2025-43%2025h-2l2%201%202%204v3h-28c-25%200-27%200-25-2%202%200%203-1%203-2l-6%203-14%201-12-1-1-1-1%201-6%201-3-1c1-1%201-1-1-1-3-1-5%200-3%201%201%201-5%201-13%201H0v75h69a1061%201061%200%200197%203l-1%203v2l4-2c3-2%204-4%204-5l1-1%201%202h1v-1l1-1%203%201-1%201-3%203-7%204-3%204v3l19-11%208-5h208v-75h-6c-6%200-6%200-4-1v-2l-2%202-4%201h-2l3-2c8-7%2017-21%2013-23v-1l1-13c0-14%200-15-6-17-3-1-12%200-10%202v3l-1-2-2-1-1%202-1%202v2h-3v1c1%201-2%205-4%203l-1%201v1l-1-1-2%201c-1%201-2%203-1%205l-1%205-1%203-1-3c-1-2-1-2-2%202v6l-1%201c-2-2-2%2014%200%2020%202%203%202%203-1%203l-3-1h-1l-2%201-2-1-3-2-3-1-6-3h3l2-1-2-1v-1c1%200%202-1%201-2l-1-4c0-4%200-3-1%201-1%203-2%203-8%201-2%200-2%200%200%201%201%202%201%202-2%202l-4-1%205%202c2%202%205%203%205%202l1%201h-5c-2-1-2%200%201%202%204%204%203%205-3%205-4%200-5%200-6-2-1-1-2-2-3-1-1%200-1%201%201%202l1%201c-3%200-5-1-4-3v-1h-1c0%202-2%202-5%200h1l2-1-1-2h-2v-1h2c1-1%202%200%203%201%200%202%205%201%205-1%201-1%201-1%201%201s4%204%204%202l1-2-1-2-2-1-2-1h-7l-3-3-4-2-2-2-1-2h-1c0%202-2%203-2%201v-4c-1-3%200-4%201-1l2%201%202%201c1%202%204%201%204-1l-2-1-2-2c0-1%201-1%206%201%204%201%204%201%206-1v-7c-1%200-2%201-1%202%200%201-1%201-5-1-10-4-12-4-8%203%202%204%201%205-2%202-1-1-2-3-1-5%200-1%200-2-1-1l-1%202c-2%200-1-3%201-5%203-3%207-11%206-13h2c-1-1%200-3%202-4%203-4%204-7%203-9s-1-10%201-14c1-4%203-6%2022-16l14-10v-3l4-3c19-12%2020-27%203-38l-4-5-2-4c-1-1%200-2%204-6%203-2%204-4%203-5-1%200-1-1%201-3%202-4%201-3-3%201M63%20148c0%203%204%2014%207%2017%203%204%205%205%2011%208%206%202%208%203%207%204v1l2-1h11l4-5%203-7v-1a12889%2012889%200%2001-45-16m88%205c-1%203%200%204%201%202l2-1%203%202v1l5%202a46%2046%200%200110%202l5%203h2l3%201h3c2-1%202-3-1-3l-17-5c-15-5-16-6-16-4m18%2020l-2%201c-2%200-2%200-2%2012l-1%2013c-2%201-3%200-1-1l1-2h-1l-1-3%201-5v-1l-2%201c-1%201-1%201-1-3l-1-7c0-3%200-3-1-1l-2%202c-1%200-3%203-2%204l3-1c2-1%202-1%202%203%200%202-1%203-3%204l-3%202-1-2c0-5%200-5-2-5-2%201-3%201-3-1s-1-2-2%200l-1%201c3-1%202%201-1%202-1%201-2%201-1%202l3-1c1-1%201-1%201%205-1%205%200%206%201%204h1l1-1h6c2%200%202%200%201%201l-4%202-3%202-8%205c-6%203-10%207-6%206h1c-2%202-3%202-10-1-15-6-18-7-17-8%200-2-2-3-4-2v1l1%202c0%201%201%202%205%203l4%202%202%201-1%202-2%206c0%202-1%203-3%204-3%202-5%205-3%204l4-2%201%201c-2%202%203%202%208%200%208-3%209-4%207-5%200-1-2-1-5%201-6%204-7%204-8-1l1-4%201%204c0%204%201%204%203%200%201-4%201-4-1-4v-1l1-2c0-2%201-2%206%200%204%202%205%202%204%205v4l3-1c2-2%204-2%205-1h8c2%200%204%200%206-2l4-2%201-3c0-1%201-3%205-5l5-3v-7c0-6%200-7%201-6l1%202c-2%201-1%203%201%202h2l-2%204c-2%204-2%204%200%204l4-2%202-1%202-2c4-1%206-3%205-9l1-8v-1l-1-3c-1-3-4-6-4-4h-5c-1-1-1%200-1%203%200%204-2%206-2%202%200-3-2-7-2-5m167%2031c-10%206-12%208-12%2013l-1%206v3l1%202v7h3l2-4%204-4c0-2%200-2-4-1-4%203-4%201-1-3s5-5%209-4h8l5-2h5l2%202h9c1-1%200-3-3-4l-2-3c0-3%200-4-2-5s-3-2-3-4c-1-3-1-3-1%200s0%204-2%204c-4-2-6-2-8-1h-1l1-2c2%200%201-5%200-5l-9%205m-98%2032l2%201c2%200%202%201%202%2010v10l-3-1c-5%200-6-5-1-5l4-1h-4c-2%200-3%200-3-2l-2-2-2%201c0%202-1%202-6%200-9-3-8-4-8%2017v21c-1%201%201%201%208%201%208%200%2011-2%203-2l6-1%2019-2%208-1c-1%201-2%202-1%203v3h46v-8c0-7%200-7-2-6l-9-2-6-2c-1%206-3%2010-8%2012-5%203-10%201-5-2h3v1l2-1-1-1v-2c2-1%202-7%201-7l-4%202h-6c-2-1-22%205-24%207s-5%203-5%200l-2-1h-1v-1l-2-1c0-3%205-2%207%200h1l1-2v-2l1-1%201%201c-2%202%201%202%206%201%204-1%207-3%204-3l5-3c7-4%208-5%202-5l-10-1c-6%200-7%200-9%202l-2%202v-13l1-13%203-1-5-1-5%201m-35%2013l3%203c4%202%204%202%201%204-2%201-2%202-2%2015v15l1-14c0-10%201-14%202-15l1%201%201%201c2-2%203%200%202%202l-2%201-1%2011%201%208%202-4v7c2%200%205-8%203-8v-8l-1-4-2%201%201-2c4-3%202-10-4-14-4-3-6-3-6%200m-15%2025l-3%203%203-1h3v5c0%205%200%205%203%205l4-2%201-2%201-4c0-4%200-5-3-6-5-2-6-1-9%202'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"regular":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsSAAALEgHS3X78AAAEGklEQVQ4y4VT+0+bVRjuf2BM1OmccRujBGd0CzBMdEAUURHdHOp+GGBEhJEtbi7RNQ4cRqNGN1xkGgXb0nvXLKy0hV0EQQesK1CuExjrECalQC9AaQuMr4/vOV0ZRtGTPN97znu+85z38hyRIAhgCAthAtlwGFHfCpYZlrFMYDbiu7Om+Wq/6B+H10KUiDA2+gcmJpwIBoNEdpsTRsEJWVTRsRJxOBIxI7q9tMTXCwsLuD40iHabFW2tLXA6x/mZ5VXRiphjiQ54vR6EQqEVsigx27vpcGBsbBT9fb3o6bbj4oXzMJuMfO73++9ezgiXFhcxOenCLTowfH0Ic3NzPBJG5PP50NluQ3PTL7BdtXLCOkstDh4oxlt5Oai3mOD1eOB2TyNE6bMhmp2dwQSFHrFO9PX2YOSmg1IQiHwW3V2duGq9AmW1DHLZTyg/8RVOEq60tcI9PY3ZmRl02TvgHI+kLxqmmvT39cDlclFkIZzRa9HQ8DPfDAQCPEqfz8vr9fu1fvq3jyJy82aMjDigUlbj49ISzM/PRwhZDVgqvb3dMNUaUV9fx9dddjs6OtoxODjACf8+wrBa23D06Ad4t+AdpKWmQK1WRQjZh9XM5ZrA5d9+xZHDh9Da0gLHjWGYjTUw0yUGvQ4ymZSi10NRLYdE8iEynk9HSspOVHx7CsX7i9DY2BAhZO3GKtmwTg8NDPD0pJU/4svPP4NGpeD2VPlJHCjej9SUZ5CXuw97XtvFG1RVVYlFau6KDqNgg9XsEslCIZdCQilp1UpotSoqQSdvGMvCYjahrOw4knck4cj7h/DD96e50HmEqwm9Xi8velvLZZJKI+/+9NQUtBo1CvLfRmFBPsklF7FbYiCOjUVpyTHYOzvo5YxyrapVSiK8kzKzk1THqclJLFJNfSR0JlwryYNJ5psTX8NYcxbFRYUUWQJ2v5rFazs4cA1e0uEXVJLkpMRIU4IkYicR+al+UyRUG93qnvGhllIrOV6Ksk8/gYK6aKO0G5ubUGsxQ65UoOK70zCcNaCddLgvNweSYx9B1HS4CBcKc3Audw+MBEv+XujffBk1edlQ7M5A+c4EVGWmQf36S4RMVGamouFgPqyS9yDflQ5p1rPQvJGJiueegm5vFkTymPugT9gCQ3I8ziSJodu2GYZEMVRxD0Idez/08euhiVtH8wc42Fy+6V5IH70HGvE6vlbRf7r4h7gVqZ/YiJr0HTj34tMwvZKGuuwXYMnOgHZ7DFRbN0D9+CPcKh97GCoCt7SO+u761/O5SJsYJ2i2bRI0TzJsFOgCWm8WNNtjBAXNZVs3CEry65PiBF2i+H8hClA3gySXAGGBHrr7z1vw01v108Mf6ulG8/k6jDtu8L2Ah/3r4fZfQXusy/1rIfwfe2vhL/Kc+noaqXyIAAAAAElFTkSuQmCC","aspectRatio":1,"src":"/static/7e76a640f9382dc8a36ea033c8346b68/3ddd4/s3ManagerCover.png","srcSet":"/static/7e76a640f9382dc8a36ea033c8346b68/078a8/s3ManagerCover.png 163w,\n/static/7e76a640f9382dc8a36ea033c8346b68/e56da/s3ManagerCover.png 327w,\n/static/7e76a640f9382dc8a36ea033c8346b68/3ddd4/s3ManagerCover.png 653w,\n/static/7e76a640f9382dc8a36ea033c8346b68/c5cc7/s3ManagerCover.png 980w,\n/static/7e76a640f9382dc8a36ea033c8346b68/6050d/s3ManagerCover.png 1200w","srcWebp":"/static/7e76a640f9382dc8a36ea033c8346b68/0acdf/s3ManagerCover.webp","srcSetWebp":"/static/7e76a640f9382dc8a36ea033c8346b68/ac59e/s3ManagerCover.webp 163w,\n/static/7e76a640f9382dc8a36ea033c8346b68/7660b/s3ManagerCover.webp 327w,\n/static/7e76a640f9382dc8a36ea033c8346b68/0acdf/s3ManagerCover.webp 653w,\n/static/7e76a640f9382dc8a36ea033c8346b68/75470/s3ManagerCover.webp 980w,\n/static/7e76a640f9382dc8a36ea033c8346b68/9000d/s3ManagerCover.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='M283%2069c-3%202-4%203-4%205s0%202-1%201c0-3-1-2-11%204-6%203-8%205-8%206%200%202%200%202%202%202v2c0%202%200%202%202%201l2-3h3l2-1c0%201-2%203-5%204-3%202-6%204-6%206l-3%203c-2%201-2%201-2-2%201-3-1-4-4-1-3%202-2%203%200%203h2l-2%203-2%202h1l3-1%202-1%204-2c3-2%203-2%2014%202l11%203%201-9%201-9%201%209%201%2010%207-3%206-3c2%200%204-3%205-5l-2-2c-1%200-3-2-1-3s-1-9-4-9l-1-1-3-1h-2l-5-3c-8-3-8-3-3-6%204-2%205-3%203-3l-4%202m-93%2024c1%201%201%201-1%201h-4l2%201%203%201-3%201c-2%200-2%200-1%201h3c4-1%205-1%205%202%201%203%205%207%2010%208%201%201%202%201%202-2%201-3%201-4%204-3l4%203c2%202%202%202-2%204-3%201-4%202-3%204h4c0-3%202-3%202%200%201%203%200%203-2%202l-3%201h4c3%200%204%200%203%201-2%200-1%202%201%202%205%200%207%201%207%203l1%202h1l2%201%201-2-1-2c-3%201-3-1-1-3%204-5%2015-4%2015%201l-1%202h-2l-2%201h-2l2%201c4%202%2024-2%2029-5l3-1c3-1%203-1%202-2h1c2%200%202%200%201-1v-1h2l1%201v-4c-1-1-2-2-3-1-1%200-12-3-15-6-3-1-5-1-4%201l-3%202-4%202c-1%203-6%204-10%202h2l4-1-6-1h-6l1-1h-2c-3%200-3%200-1-1h-2c-3%200-3%200-1-1h-1c-3%200-3%200-2-1v-1l-2-2-3-3v1l-2%203h1l2%201v1h-1v7l-1-2-1-3v-1l-1-1-2-3c0-2-1-2-3-1-3%200-3%200-2-1s1-1-1-1h-2c-3%200-3%200-2-1s1-1-1-1h-3c-3%200-3%200-1-1h-2c-2%200-3%200-2-1%202-1%202-1-1-2h-4m-87%2023l-2%203c-2%202-3%209-2%209%201%201-2%203-7%205-6%203-8%204-7%205h5c2-1%204-1%2014%202l12%204-4-4c-6-6-7-9-7-18l-1-8-1%202m258%202l-8%207-6%203a307%20307%200%2001-33%2018c-21%2012-40%2019-59%2021l-7%201%202%201%2013-1%208-1c9-1%2018-4%2024-7l6-2-5%204c-17%207-38%2011-63%2011-18%200-24%200-43-4l-4%201%201%202%201%2010c0%208%200%2010-2%2011v1c2%200%204-2%203-5l1-3%201%202c-1%202%200%203%201%203l1-3%201-3c1-1%201-1%201%201l2%202c2-1%204-2%202-2l-1-2h1l3%201%203-1-3%202-2%202h2l4-1%201-3c1-3%201-3%201%202%200%203%200%205%201%204h2v2l-1%203c0%202%208%201%2014-1l4-1c2%203%204%200%204-6%200-4%200-5%201-3%200%203%200%203%205%203l9%201c2%200%203%200%203%204l1%206v2c-1%202-1%207%201%208%202%200%203-3%201-4v-1l2%201%201%201c3%200%204%200%204%202l1%201%201-1%202-1-1-2c-3-1-3-1%202-1h4c-2-1-2-1%200-1l3-1h1l1-2v1l1%201%201-2h2v2c-1%201-2%201%2014%201%2014%200%2016%201%2010%204-7%204-12%206-14%205l-1%201c1%201-12%205-25%208-14%202-45%202-60-1-14-2-23-5-23-6h3l4%201-3-2c-4-1-4-2-5-4l1-3%201%201%204%201c4-1%205%200%203%202l-1%201%206%202-2-1c-2-1-2-1-1-3%201-3%201-3-3-3a374%20374%200%2001-9-1l-5%205c-3%201-4%204-4%206%201%201-4%205-10%208l-4%204%204-2%206-2h1c0-1%208-4%2012-4%206-1%2021%2014%2024%2025%201%202%201%202-1%201s-3-1-6%203c-5%205-7%206-8%203s-2-2-1%201c0%203%200%203-4%205-3%202-4%202-5%200-5-5-7-5-4%200%202%204%201%204-4%207s-9%203-5%200c2%200%202-1%200-2-1-1-1-1-1%201s0%202-1%201l-1-1-1-2v-1l-3-4c-3-5-7-9-7-7l2%202c1%201%202%203%200%203v1l-6-6-10-9-3-3h-1c0%201-1%201-3-1-5-2-4%200%201%203%2012%206%2024%2020%2026%2030l1%205%204-2%206-4a183%20183%200%200131-15c1%202-39%2025-43%2025h-2l2%201%202%204v3h-28c-25%200-27%200-25-2%202%200%203-1%203-2l-6%203-14%201-12-1-1-1-1%201-6%201-3-1c1-1%201-1-1-1-3-1-5%200-3%201%201%201-5%201-13%201H0v75h69a1061%201061%200%200197%203l-1%203v2l4-2c3-2%204-4%204-5l1-1%201%202h1v-1l1-1%203%201-1%201-3%203-7%204-3%204v3l19-11%208-5h208v-75h-6c-6%200-6%200-4-1v-2l-2%202-4%201h-2l3-2c8-7%2017-21%2013-23v-1l1-13c0-14%200-15-6-17-3-1-12%200-10%202v3l-1-2-2-1-1%202-1%202v2h-3v1c1%201-2%205-4%203l-1%201v1l-1-1-2%201c-1%201-2%203-1%205l-1%205-1%203-1-3c-1-2-1-2-2%202v6l-1%201c-2-2-2%2014%200%2020%202%203%202%203-1%203l-3-1h-1l-2%201-2-1-3-2-3-1-6-3h3l2-1-2-1v-1c1%200%202-1%201-2l-1-4c0-4%200-3-1%201-1%203-2%203-8%201-2%200-2%200%200%201%201%202%201%202-2%202l-4-1%205%202c2%202%205%203%205%202l1%201h-5c-2-1-2%200%201%202%204%204%203%205-3%205-4%200-5%200-6-2-1-1-2-2-3-1-1%200-1%201%201%202l1%201c-3%200-5-1-4-3v-1h-1c0%202-2%202-5%200h1l2-1-1-2h-2v-1h2c1-1%202%200%203%201%200%202%205%201%205-1%201-1%201-1%201%201s4%204%204%202l1-2-1-2-2-1-2-1h-7l-3-3-4-2-2-2-1-2h-1c0%202-2%203-2%201v-4c-1-3%200-4%201-1l2%201%202%201c1%202%204%201%204-1l-2-1-2-2c0-1%201-1%206%201%204%201%204%201%206-1v-7c-1%200-2%201-1%202%200%201-1%201-5-1-10-4-12-4-8%203%202%204%201%205-2%202-1-1-2-3-1-5%200-1%200-2-1-1l-1%202c-2%200-1-3%201-5%203-3%207-11%206-13h2c-1-1%200-3%202-4%203-4%204-7%203-9s-1-10%201-14c1-4%203-6%2022-16l14-10v-3l4-3c19-12%2020-27%203-38l-4-5-2-4c-1-1%200-2%204-6%203-2%204-4%203-5-1%200-1-1%201-3%202-4%201-3-3%201M63%20148c0%203%204%2014%207%2017%203%204%205%205%2011%208%206%202%208%203%207%204v1l2-1h11l4-5%203-7v-1a12889%2012889%200%2001-45-16m88%205c-1%203%200%204%201%202l2-1%203%202v1l5%202a46%2046%200%200110%202l5%203h2l3%201h3c2-1%202-3-1-3l-17-5c-15-5-16-6-16-4m18%2020l-2%201c-2%200-2%200-2%2012l-1%2013c-2%201-3%200-1-1l1-2h-1l-1-3%201-5v-1l-2%201c-1%201-1%201-1-3l-1-7c0-3%200-3-1-1l-2%202c-1%200-3%203-2%204l3-1c2-1%202-1%202%203%200%202-1%203-3%204l-3%202-1-2c0-5%200-5-2-5-2%201-3%201-3-1s-1-2-2%200l-1%201c3-1%202%201-1%202-1%201-2%201-1%202l3-1c1-1%201-1%201%205-1%205%200%206%201%204h1l1-1h6c2%200%202%200%201%201l-4%202-3%202-8%205c-6%203-10%207-6%206h1c-2%202-3%202-10-1-15-6-18-7-17-8%200-2-2-3-4-2v1l1%202c0%201%201%202%205%203l4%202%202%201-1%202-2%206c0%202-1%203-3%204-3%202-5%205-3%204l4-2%201%201c-2%202%203%202%208%200%208-3%209-4%207-5%200-1-2-1-5%201-6%204-7%204-8-1l1-4%201%204c0%204%201%204%203%200%201-4%201-4-1-4v-1l1-2c0-2%201-2%206%200%204%202%205%202%204%205v4l3-1c2-2%204-2%205-1h8c2%200%204%200%206-2l4-2%201-3c0-1%201-3%205-5l5-3v-7c0-6%200-7%201-6l1%202c-2%201-1%203%201%202h2l-2%204c-2%204-2%204%200%204l4-2%202-1%202-2c4-1%206-3%205-9l1-8v-1l-1-3c-1-3-4-6-4-4h-5c-1-1-1%200-1%203%200%204-2%206-2%202%200-3-2-7-2-5m167%2031c-10%206-12%208-12%2013l-1%206v3l1%202v7h3l2-4%204-4c0-2%200-2-4-1-4%203-4%201-1-3s5-5%209-4h8l5-2h5l2%202h9c1-1%200-3-3-4l-2-3c0-3%200-4-2-5s-3-2-3-4c-1-3-1-3-1%200s0%204-2%204c-4-2-6-2-8-1h-1l1-2c2%200%201-5%200-5l-9%205m-98%2032l2%201c2%200%202%201%202%2010v10l-3-1c-5%200-6-5-1-5l4-1h-4c-2%200-3%200-3-2l-2-2-2%201c0%202-1%202-6%200-9-3-8-4-8%2017v21c-1%201%201%201%208%201%208%200%2011-2%203-2l6-1%2019-2%208-1c-1%201-2%202-1%203v3h46v-8c0-7%200-7-2-6l-9-2-6-2c-1%206-3%2010-8%2012-5%203-10%201-5-2h3v1l2-1-1-1v-2c2-1%202-7%201-7l-4%202h-6c-2-1-22%205-24%207s-5%203-5%200l-2-1h-1v-1l-2-1c0-3%205-2%207%200h1l1-2v-2l1-1%201%201c-2%202%201%202%206%201%204-1%207-3%204-3l5-3c7-4%208-5%202-5l-10-1c-6%200-7%200-9%202l-2%202v-13l1-13%203-1-5-1-5%201m-35%2013l3%203c4%202%204%202%201%204-2%201-2%202-2%2015v15l1-14c0-10%201-14%202-15l1%201%201%201c2-2%203%200%202%202l-2%201-1%2011%201%208%202-4v7c2%200%205-8%203-8v-8l-1-4-2%201%201-2c4-3%202-10-4-14-4-3-6-3-6%200m-15%2025l-3%203%203-1h3v5c0%205%200%205%203%205l4-2%201-2%201-4c0-4%200-5-3-6-5-2-6-1-9%202'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"narrow":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAAsSAAALEgHS3X78AAAEGklEQVQ4y4VT+0+bVRjuf2BM1OmccRujBGd0CzBMdEAUURHdHOp+GGBEhJEtbi7RNQ4cRqNGN1xkGgXb0nvXLKy0hV0EQQesK1CuExjrECalQC9AaQuMr4/vOV0ZRtGTPN97znu+85z38hyRIAhgCAthAtlwGFHfCpYZlrFMYDbiu7Om+Wq/6B+H10KUiDA2+gcmJpwIBoNEdpsTRsEJWVTRsRJxOBIxI7q9tMTXCwsLuD40iHabFW2tLXA6x/mZ5VXRiphjiQ54vR6EQqEVsigx27vpcGBsbBT9fb3o6bbj4oXzMJuMfO73++9ezgiXFhcxOenCLTowfH0Ic3NzPBJG5PP50NluQ3PTL7BdtXLCOkstDh4oxlt5Oai3mOD1eOB2TyNE6bMhmp2dwQSFHrFO9PX2YOSmg1IQiHwW3V2duGq9AmW1DHLZTyg/8RVOEq60tcI9PY3ZmRl02TvgHI+kLxqmmvT39cDlclFkIZzRa9HQ8DPfDAQCPEqfz8vr9fu1fvq3jyJy82aMjDigUlbj49ISzM/PRwhZDVgqvb3dMNUaUV9fx9dddjs6OtoxODjACf8+wrBa23D06Ad4t+AdpKWmQK1WRQjZh9XM5ZrA5d9+xZHDh9Da0gLHjWGYjTUw0yUGvQ4ymZSi10NRLYdE8iEynk9HSspOVHx7CsX7i9DY2BAhZO3GKtmwTg8NDPD0pJU/4svPP4NGpeD2VPlJHCjej9SUZ5CXuw97XtvFG1RVVYlFau6KDqNgg9XsEslCIZdCQilp1UpotSoqQSdvGMvCYjahrOw4knck4cj7h/DD96e50HmEqwm9Xi8velvLZZJKI+/+9NQUtBo1CvLfRmFBPsklF7FbYiCOjUVpyTHYOzvo5YxyrapVSiK8kzKzk1THqclJLFJNfSR0JlwryYNJ5psTX8NYcxbFRYUUWQJ2v5rFazs4cA1e0uEXVJLkpMRIU4IkYicR+al+UyRUG93qnvGhllIrOV6Ksk8/gYK6aKO0G5ubUGsxQ65UoOK70zCcNaCddLgvNweSYx9B1HS4CBcKc3Audw+MBEv+XujffBk1edlQ7M5A+c4EVGWmQf36S4RMVGamouFgPqyS9yDflQ5p1rPQvJGJiueegm5vFkTymPugT9gCQ3I8ziSJodu2GYZEMVRxD0Idez/08euhiVtH8wc42Fy+6V5IH70HGvE6vlbRf7r4h7gVqZ/YiJr0HTj34tMwvZKGuuwXYMnOgHZ7DFRbN0D9+CPcKh97GCoCt7SO+u761/O5SJsYJ2i2bRI0TzJsFOgCWm8WNNtjBAXNZVs3CEry65PiBF2i+H8hClA3gySXAGGBHrr7z1vw01v108Mf6ulG8/k6jDtu8L2Ah/3r4fZfQXusy/1rIfwfe2vhL/Kc+noaqXyIAAAAAElFTkSuQmCC","aspectRatio":1,"src":"/static/7e76a640f9382dc8a36ea033c8346b68/502b1/s3ManagerCover.png","srcSet":"/static/7e76a640f9382dc8a36ea033c8346b68/f2e6d/s3ManagerCover.png 114w,\n/static/7e76a640f9382dc8a36ea033c8346b68/4ddba/s3ManagerCover.png 229w,\n/static/7e76a640f9382dc8a36ea033c8346b68/502b1/s3ManagerCover.png 457w,\n/static/7e76a640f9382dc8a36ea033c8346b68/7ddc2/s3ManagerCover.png 686w,\n/static/7e76a640f9382dc8a36ea033c8346b68/435bf/s3ManagerCover.png 914w,\n/static/7e76a640f9382dc8a36ea033c8346b68/6050d/s3ManagerCover.png 1200w","srcWebp":"/static/7e76a640f9382dc8a36ea033c8346b68/15384/s3ManagerCover.webp","srcSetWebp":"/static/7e76a640f9382dc8a36ea033c8346b68/31fce/s3ManagerCover.webp 114w,\n/static/7e76a640f9382dc8a36ea033c8346b68/e3e25/s3ManagerCover.webp 229w,\n/static/7e76a640f9382dc8a36ea033c8346b68/15384/s3ManagerCover.webp 457w,\n/static/7e76a640f9382dc8a36ea033c8346b68/0258d/s3ManagerCover.webp 686w,\n/static/7e76a640f9382dc8a36ea033c8346b68/64ea2/s3ManagerCover.webp 914w,\n/static/7e76a640f9382dc8a36ea033c8346b68/9000d/s3ManagerCover.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='M283%2069c-3%202-4%203-4%205s0%202-1%201c0-3-1-2-11%204-6%203-8%205-8%206%200%202%200%202%202%202v2c0%202%200%202%202%201l2-3h3l2-1c0%201-2%203-5%204-3%202-6%204-6%206l-3%203c-2%201-2%201-2-2%201-3-1-4-4-1-3%202-2%203%200%203h2l-2%203-2%202h1l3-1%202-1%204-2c3-2%203-2%2014%202l11%203%201-9%201-9%201%209%201%2010%207-3%206-3c2%200%204-3%205-5l-2-2c-1%200-3-2-1-3s-1-9-4-9l-1-1-3-1h-2l-5-3c-8-3-8-3-3-6%204-2%205-3%203-3l-4%202m-93%2024c1%201%201%201-1%201h-4l2%201%203%201-3%201c-2%200-2%200-1%201h3c4-1%205-1%205%202%201%203%205%207%2010%208%201%201%202%201%202-2%201-3%201-4%204-3l4%203c2%202%202%202-2%204-3%201-4%202-3%204h4c0-3%202-3%202%200%201%203%200%203-2%202l-3%201h4c3%200%204%200%203%201-2%200-1%202%201%202%205%200%207%201%207%203l1%202h1l2%201%201-2-1-2c-3%201-3-1-1-3%204-5%2015-4%2015%201l-1%202h-2l-2%201h-2l2%201c4%202%2024-2%2029-5l3-1c3-1%203-1%202-2h1c2%200%202%200%201-1v-1h2l1%201v-4c-1-1-2-2-3-1-1%200-12-3-15-6-3-1-5-1-4%201l-3%202-4%202c-1%203-6%204-10%202h2l4-1-6-1h-6l1-1h-2c-3%200-3%200-1-1h-2c-3%200-3%200-1-1h-1c-3%200-3%200-2-1v-1l-2-2-3-3v1l-2%203h1l2%201v1h-1v7l-1-2-1-3v-1l-1-1-2-3c0-2-1-2-3-1-3%200-3%200-2-1s1-1-1-1h-2c-3%200-3%200-2-1s1-1-1-1h-3c-3%200-3%200-1-1h-2c-2%200-3%200-2-1%202-1%202-1-1-2h-4m-87%2023l-2%203c-2%202-3%209-2%209%201%201-2%203-7%205-6%203-8%204-7%205h5c2-1%204-1%2014%202l12%204-4-4c-6-6-7-9-7-18l-1-8-1%202m258%202l-8%207-6%203a307%20307%200%2001-33%2018c-21%2012-40%2019-59%2021l-7%201%202%201%2013-1%208-1c9-1%2018-4%2024-7l6-2-5%204c-17%207-38%2011-63%2011-18%200-24%200-43-4l-4%201%201%202%201%2010c0%208%200%2010-2%2011v1c2%200%204-2%203-5l1-3%201%202c-1%202%200%203%201%203l1-3%201-3c1-1%201-1%201%201l2%202c2-1%204-2%202-2l-1-2h1l3%201%203-1-3%202-2%202h2l4-1%201-3c1-3%201-3%201%202%200%203%200%205%201%204h2v2l-1%203c0%202%208%201%2014-1l4-1c2%203%204%200%204-6%200-4%200-5%201-3%200%203%200%203%205%203l9%201c2%200%203%200%203%204l1%206v2c-1%202-1%207%201%208%202%200%203-3%201-4v-1l2%201%201%201c3%200%204%200%204%202l1%201%201-1%202-1-1-2c-3-1-3-1%202-1h4c-2-1-2-1%200-1l3-1h1l1-2v1l1%201%201-2h2v2c-1%201-2%201%2014%201%2014%200%2016%201%2010%204-7%204-12%206-14%205l-1%201c1%201-12%205-25%208-14%202-45%202-60-1-14-2-23-5-23-6h3l4%201-3-2c-4-1-4-2-5-4l1-3%201%201%204%201c4-1%205%200%203%202l-1%201%206%202-2-1c-2-1-2-1-1-3%201-3%201-3-3-3a374%20374%200%2001-9-1l-5%205c-3%201-4%204-4%206%201%201-4%205-10%208l-4%204%204-2%206-2h1c0-1%208-4%2012-4%206-1%2021%2014%2024%2025%201%202%201%202-1%201s-3-1-6%203c-5%205-7%206-8%203s-2-2-1%201c0%203%200%203-4%205-3%202-4%202-5%200-5-5-7-5-4%200%202%204%201%204-4%207s-9%203-5%200c2%200%202-1%200-2-1-1-1-1-1%201s0%202-1%201l-1-1-1-2v-1l-3-4c-3-5-7-9-7-7l2%202c1%201%202%203%200%203v1l-6-6-10-9-3-3h-1c0%201-1%201-3-1-5-2-4%200%201%203%2012%206%2024%2020%2026%2030l1%205%204-2%206-4a183%20183%200%200131-15c1%202-39%2025-43%2025h-2l2%201%202%204v3h-28c-25%200-27%200-25-2%202%200%203-1%203-2l-6%203-14%201-12-1-1-1-1%201-6%201-3-1c1-1%201-1-1-1-3-1-5%200-3%201%201%201-5%201-13%201H0v75h69a1061%201061%200%200197%203l-1%203v2l4-2c3-2%204-4%204-5l1-1%201%202h1v-1l1-1%203%201-1%201-3%203-7%204-3%204v3l19-11%208-5h208v-75h-6c-6%200-6%200-4-1v-2l-2%202-4%201h-2l3-2c8-7%2017-21%2013-23v-1l1-13c0-14%200-15-6-17-3-1-12%200-10%202v3l-1-2-2-1-1%202-1%202v2h-3v1c1%201-2%205-4%203l-1%201v1l-1-1-2%201c-1%201-2%203-1%205l-1%205-1%203-1-3c-1-2-1-2-2%202v6l-1%201c-2-2-2%2014%200%2020%202%203%202%203-1%203l-3-1h-1l-2%201-2-1-3-2-3-1-6-3h3l2-1-2-1v-1c1%200%202-1%201-2l-1-4c0-4%200-3-1%201-1%203-2%203-8%201-2%200-2%200%200%201%201%202%201%202-2%202l-4-1%205%202c2%202%205%203%205%202l1%201h-5c-2-1-2%200%201%202%204%204%203%205-3%205-4%200-5%200-6-2-1-1-2-2-3-1-1%200-1%201%201%202l1%201c-3%200-5-1-4-3v-1h-1c0%202-2%202-5%200h1l2-1-1-2h-2v-1h2c1-1%202%200%203%201%200%202%205%201%205-1%201-1%201-1%201%201s4%204%204%202l1-2-1-2-2-1-2-1h-7l-3-3-4-2-2-2-1-2h-1c0%202-2%203-2%201v-4c-1-3%200-4%201-1l2%201%202%201c1%202%204%201%204-1l-2-1-2-2c0-1%201-1%206%201%204%201%204%201%206-1v-7c-1%200-2%201-1%202%200%201-1%201-5-1-10-4-12-4-8%203%202%204%201%205-2%202-1-1-2-3-1-5%200-1%200-2-1-1l-1%202c-2%200-1-3%201-5%203-3%207-11%206-13h2c-1-1%200-3%202-4%203-4%204-7%203-9s-1-10%201-14c1-4%203-6%2022-16l14-10v-3l4-3c19-12%2020-27%203-38l-4-5-2-4c-1-1%200-2%204-6%203-2%204-4%203-5-1%200-1-1%201-3%202-4%201-3-3%201M63%20148c0%203%204%2014%207%2017%203%204%205%205%2011%208%206%202%208%203%207%204v1l2-1h11l4-5%203-7v-1a12889%2012889%200%2001-45-16m88%205c-1%203%200%204%201%202l2-1%203%202v1l5%202a46%2046%200%200110%202l5%203h2l3%201h3c2-1%202-3-1-3l-17-5c-15-5-16-6-16-4m18%2020l-2%201c-2%200-2%200-2%2012l-1%2013c-2%201-3%200-1-1l1-2h-1l-1-3%201-5v-1l-2%201c-1%201-1%201-1-3l-1-7c0-3%200-3-1-1l-2%202c-1%200-3%203-2%204l3-1c2-1%202-1%202%203%200%202-1%203-3%204l-3%202-1-2c0-5%200-5-2-5-2%201-3%201-3-1s-1-2-2%200l-1%201c3-1%202%201-1%202-1%201-2%201-1%202l3-1c1-1%201-1%201%205-1%205%200%206%201%204h1l1-1h6c2%200%202%200%201%201l-4%202-3%202-8%205c-6%203-10%207-6%206h1c-2%202-3%202-10-1-15-6-18-7-17-8%200-2-2-3-4-2v1l1%202c0%201%201%202%205%203l4%202%202%201-1%202-2%206c0%202-1%203-3%204-3%202-5%205-3%204l4-2%201%201c-2%202%203%202%208%200%208-3%209-4%207-5%200-1-2-1-5%201-6%204-7%204-8-1l1-4%201%204c0%204%201%204%203%200%201-4%201-4-1-4v-1l1-2c0-2%201-2%206%200%204%202%205%202%204%205v4l3-1c2-2%204-2%205-1h8c2%200%204%200%206-2l4-2%201-3c0-1%201-3%205-5l5-3v-7c0-6%200-7%201-6l1%202c-2%201-1%203%201%202h2l-2%204c-2%204-2%204%200%204l4-2%202-1%202-2c4-1%206-3%205-9l1-8v-1l-1-3c-1-3-4-6-4-4h-5c-1-1-1%200-1%203%200%204-2%206-2%202%200-3-2-7-2-5m167%2031c-10%206-12%208-12%2013l-1%206v3l1%202v7h3l2-4%204-4c0-2%200-2-4-1-4%203-4%201-1-3s5-5%209-4h8l5-2h5l2%202h9c1-1%200-3-3-4l-2-3c0-3%200-4-2-5s-3-2-3-4c-1-3-1-3-1%200s0%204-2%204c-4-2-6-2-8-1h-1l1-2c2%200%201-5%200-5l-9%205m-98%2032l2%201c2%200%202%201%202%2010v10l-3-1c-5%200-6-5-1-5l4-1h-4c-2%200-3%200-3-2l-2-2-2%201c0%202-1%202-6%200-9-3-8-4-8%2017v21c-1%201%201%201%208%201%208%200%2011-2%203-2l6-1%2019-2%208-1c-1%201-2%202-1%203v3h46v-8c0-7%200-7-2-6l-9-2-6-2c-1%206-3%2010-8%2012-5%203-10%201-5-2h3v1l2-1-1-1v-2c2-1%202-7%201-7l-4%202h-6c-2-1-22%205-24%207s-5%203-5%200l-2-1h-1v-1l-2-1c0-3%205-2%207%200h1l1-2v-2l1-1%201%201c-2%202%201%202%206%201%204-1%207-3%204-3l5-3c7-4%208-5%202-5l-10-1c-6%200-7%200-9%202l-2%202v-13l1-13%203-1-5-1-5%201m-35%2013l3%203c4%202%204%202%201%204-2%201-2%202-2%2015v15l1-14c0-10%201-14%202-15l1%201%201%201c2-2%203%200%202%202l-2%201-1%2011%201%208%202-4v7c2%200%205-8%203-8v-8l-1-4-2%201%201-2c4-3%202-10-4-14-4-3-6-3-6%200m-15%2025l-3%203%203-1h3v5c0%205%200%205%203%205l4-2%201-2%201-4c0-4%200-5-3-6-5-2-6-1-9%202'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"seo":{"src":"/static/7e76a640f9382dc8a36ea033c8346b68/6050d/s3ManagerCover.png"}}},{"id":"171956d6-d153-5990-8c33-fff8c43dd99d","slug":"/eba-spot","secret":false,"title":"Łeba spot","author":"Luke Celitan","date":"April 27th, 2022","dateForSEO":"2022-04-27T00:00:00.000Z","timeToRead":2,"excerpt":"Seaside bed and breakfast","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\": \"Łeba spot\",\n  \"excerpt\": \"Seaside bed and breakfast\",\n  \"date\": \"2022-04-27T00:00:00.000Z\",\n  \"hero\": \"lebaspot.png\",\n  \"author\": \"Luke Celitan\",\n  \"appDescription\": \"Room reservation\",\n  \"category\": \"Project\",\n  \"tech\": [\"ReactIcon\", \"Nextjs\", \"TS\", \"Tailwind\", \"Postgre\"]\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\": \"uxui\"\n  }, \"Ux/Ui\"), mdx(\"p\", null, \"This website has started out as a custom wordpress theme and wp installation,\\nhowever as the seasons went by, I have decided to move the project to the\\nnext.js installation. It seemed as the right combintion between static pages and\\ndynamic pages that require connection to various 3rd party APIs (like\\nbooking.com). The obvious business requirements was creating a room reservation\\nsystem that will not allow overbooking, double booking and a responsive admin\\npanel so the owners can have control over their reservations whenever they want.\\nThe website also had to contain diffrent languages versions, in order to widen\\nthe audience of this mini hotel. The seo was a also a big factor in this build.\"), mdx(\"p\", null, \"The design changed over the years, but in the end I have decieded upon a subtle\\nelegant look in shades of black, grey and white. Lato (Sans Serif, did you know\\n? \\u201CLato\\u201D means summer in polish) and Cormorant (Serif) fonts are being utilized\\nas the main duo of typography set up. Thankfully owners could come up with Hotel\\npictures that mathed the tone of the website.\"), mdx(\"p\", null, mdx(\"span\", {\n    parentName: \"p\",\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"3576px\"\n    }\n  }, \"\\n      \", mdx(\"span\", {\n    parentName: \"span\",\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"56.56%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAALCAYAAAB/Ca1DAAAACXBIWXMAABYlAAAWJQFJUiTwAAACaklEQVQoz2WSW09TQRSFz7/y0Uef9MVfoNHEmGA0Xkm8BBVJbEjAkEZAYsRLEcGAmqpYykVoK6W0BVooaaUXLbSlBXs75/T2OXNAAT3Jyuy9Z9Y+a+0ZRdM0CoUC1Wp1H5XKLkRcEetByFq5XDY4+XweXfDD32MEQxEquo4iC5o4IBO1JFaR66pm5LqqUq/VaNTqNOoHYNRqf2MaDQPynCKVlEslanvKagKySV3kMjYIgvgfZIO9+M8PZKyU99RVKvruKpXpmmHP2DOs6vuWBXRNp1Qs7Z6VucHZhVIsqRTKOpou5lWtUZX2wJhVvlBEFWRVjKAs7KtiHHWhQs5d14UboUqOTLozbAumktmI82sjRCwcYNE7z4LbhePrJNmtDNuZFMl4lFTyB7lslqxALpelWCzgdLrw+BZZjcXx+JfwBVYJR+Mok1YLCc8AQ09a6etspf3udY4dPcKcy4F95CWW7nbsH97gdjlxOR1MfrGS/Jng5InjNDXfwmy1cfXBQ1puNmMZHEIZftHNcNcl7l87Q09HK/1mE5fPn8bv9fDu9VP6ukzYRgewfbZin5jAPTNOejNJx50L9PSaeT7lps3Uxvvee1htDpTgso+5WTuhgJd7t29wpeksF8+dEgqdyD2/Z47o2gqPu8w86ujkbX8P+Z1t7OMf8S6vMPJpimZTLy3dozwbFQ0L4sn4Q8uEY+vMTE8zaHnF4MAAqc1NMltpZr9NEYlFmRHqpmxjrC750MQlLQSXCK6HSGdyOBdWGJvx4loIiIbiJiORNWKJGP9+uZ0c0WSCVCZ9qC5vdiuXwz3vZH0teGjvNxiUE09nBZK0AAAAAElFTkSuQmCC')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  }), \"\\n  \", mdx(\"picture\", {\n    parentName: \"span\"\n  }, \"\\n          \", mdx(\"source\", {\n    parentName: \"picture\",\n    \"srcSet\": [\"/static/a48dcfd942cb7d49bf8d250a154e4fbb/a3bc4/ui1.webp 2500w\", \"/static/a48dcfd942cb7d49bf8d250a154e4fbb/2cf9d/ui1.webp 3576w\"],\n    \"sizes\": \"(max-width: 3576px) 100vw, 3576px\",\n    \"type\": \"image/webp\"\n  }), \"\\n          \", mdx(\"source\", {\n    parentName: \"picture\",\n    \"srcSet\": [\"/static/a48dcfd942cb7d49bf8d250a154e4fbb/412e4/ui1.png 2500w\", \"/static/a48dcfd942cb7d49bf8d250a154e4fbb/4ead0/ui1.png 3576w\"],\n    \"sizes\": \"(max-width: 3576px) 100vw, 3576px\",\n    \"type\": \"image/png\"\n  }), \"\\n          \", mdx(\"img\", {\n    parentName: \"picture\",\n    \"className\": \"gatsby-resp-image-image\",\n    \"src\": \"/static/a48dcfd942cb7d49bf8d250a154e4fbb/4ead0/ui1.png\",\n    \"alt\": \"Website screen\",\n    \"title\": \"Website screen\",\n    \"loading\": \"lazy\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    }\n  }), \"\\n        \"), \"\\n    \")), mdx(UI, {\n    colors: ['#0c0c0c', '#52525b', '#d4d4d8', '#fbfbfb', '#aaa5a5'],\n    primeFontFamily: 'Lato',\n    secondaryFontFamily: 'Cormorant',\n    background: '#FFF',\n    textColor: \"#0c0c0c\",\n    h1: {\n      fontFamily: 'Cormorant',\n      fontWeight: '700',\n      fontSize: '40px',\n      textTransform: 'uppercase',\n      color: '#0c0c0c'\n    },\n    h2: {\n      fontSize: '35px',\n      fontWeight: '700',\n      fontFamily: 'Lato'\n    },\n    body: {\n      fontFamily: 'Lato',\n      color: '#0c0c0c',\n      fontSize: '18px',\n      lineHeight: 1.7\n    },\n    mdxType: \"UI\"\n  }), mdx(\"p\", null, \"I have also decided to inlude current wheater api call so the user can see what\\nhe is actually missing. A fine detail that hopefully users can appreciate. I\\nthink it ties in nicley with the navbar and language picker, making a less\\nborking but yest standard navbar.\"), mdx(\"p\", null, mdx(\"span\", {\n    parentName: \"p\",\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"3542px\"\n    }\n  }, \"\\n      \", mdx(\"span\", {\n    parentName: \"span\",\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"4.760000000000001%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAABCAYAAADeko4lAAAACXBIWXMAABYlAAAWJQFJUiTwAAAALklEQVQI12P4+vXr/1+/fv3/+fMnnMbFRqc/f/7yH6T/3fv3/0+du/z/65ev/wFbjU2G7VESWwAAAABJRU5ErkJggg==')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  }), \"\\n  \", mdx(\"picture\", {\n    parentName: \"span\"\n  }, \"\\n          \", mdx(\"source\", {\n    parentName: \"picture\",\n    \"srcSet\": [\"/static/fb5a56c9ab36d963f39263fc543b2f86/a3bc4/ui2.webp 2500w\", \"/static/fb5a56c9ab36d963f39263fc543b2f86/88240/ui2.webp 3542w\"],\n    \"sizes\": \"(max-width: 3542px) 100vw, 3542px\",\n    \"type\": \"image/webp\"\n  }), \"\\n          \", mdx(\"source\", {\n    parentName: \"picture\",\n    \"srcSet\": [\"/static/fb5a56c9ab36d963f39263fc543b2f86/412e4/ui2.png 2500w\", \"/static/fb5a56c9ab36d963f39263fc543b2f86/c81b9/ui2.png 3542w\"],\n    \"sizes\": \"(max-width: 3542px) 100vw, 3542px\",\n    \"type\": \"image/png\"\n  }), \"\\n          \", mdx(\"img\", {\n    parentName: \"picture\",\n    \"className\": \"gatsby-resp-image-image\",\n    \"src\": \"/static/fb5a56c9ab36d963f39263fc543b2f86/c81b9/ui2.png\",\n    \"alt\": \"Nav Bar\",\n    \"title\": \"Nav Bar\",\n    \"loading\": \"lazy\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    }\n  }), \"\\n        \"), \"\\n    \")), mdx(\"p\", null, \"Other non standard but very important elements were the searchbar with filters\\nand reservation calendar picker. The search back was constructed as sticky\\nelement that show it self on scroll back, optimising user room reservation\\nsearch for the user. A custom calendar picker had also to be constructed bin\\norder to show hafl booked days.\"), mdx(\"h2\", {\n    \"id\": \"developent-nextjs-postgres-tailwindcss\"\n  }, \"Developent: next.js, postgres, tailwindcss\"), mdx(\"p\", null, \"Next.js is a framework that allows you to create a single page application. It\\nis a lot more flexible than wordpress that helped me tie custom business rules\\nwith mentioned 3rd api intergartions. For this next.js dynamic and api\\ncapabielities were used, the next.js helps on this end a lot, providing also the\\nin-house image optimalizastions features on the server side.\"), mdx(\"p\", null, \"I have used the postgres database as the main backend database. Its a solid\\nchoice for verstile and scalable sql data storage.\"), mdx(\"p\", null, \"On this project I have used the React and tailwindcss framework to create a\\nresponsive customer website and admin panel. I became quite fond of the\\ntailwindcss framework as it is a great tool for quickly building responisve\\ndesigns and achive great performance on css performance and overall bundle.\\nDefinately a framework I plan to keep on using.\"), mdx(\"p\", null, \"Overall next.js is a great React framework for building a single page\\napplications, however it is not without it faults. Rapid developement of next.js\\ncan bring troubles as core upgrades bring often many breaking changes and other\\nbugs to already established instance.\"), mdx(\"h2\", {\n    \"id\": \"lebaspotcompl-is-a-bed-and-breakfast-property-located-by-the-polish-bałtyk-sea\"\n  }, \"Lebaspot.com.pl is a bed and breakfast property located by the polish ba\\u0142tyk sea.\"), mdx(\"p\", null, \"\\uD83D\\uDC49 \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://lebaspot.com.pl\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"https://lebaspot.com.pl\")));\n}\n;\nMDXContent.isMDXComponent = true;","tech":["ReactIcon","Nextjs","TS","Tailwind","Postgre"],"category":"Project","appDescription":"Room reservation","hero":{"full":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAD6UlEQVQ4y32U61ObVRDG8zfVVlvAcgu3EAh3Ag2QECAQLiEkIRJCIBAu4V7H9oPOVMZxHJXpDGpn/AwtiG3VcVQ6A2IbIpfxG3IL4fLznIS0EVvfmefdPXues+/unndXEQ6HOT4+Rsp4vM4Wv/emfUU84U24zPm/M4qweIVCodfiMjkUurwOvZQxXXF6eop8znn1xPTz83POzs4ETpE8KSNrab+A5MS4JycnKFafPWN8wMf00DC3h0cicsI3yFiflw8/uMvsl3N8PfeAB998y+zsHPfvf8VnM5/wxcwMn9/7mE8/usf46DR3J6f5fXUNxdL8Apnv3ECTnEphmpL85DTU76aSk5BEa30TLqeHwf4RRofH8fT4cFo7sRjqcJmbsdebInpVsRZtrobH3y2j+H5xibyUNMpyVFTk5lORp6E0Jx+z3sT4sJ8+dw/+QT+jIxNC92KpM+G2tNNvs9NjseJsahZOjTRoK/jpyRMUy48WyUlKpigjC60qj6qCErT5JXS5uhnyD9Ln9TI0OMnAwBjmWhPm6lrcLa14rVa6W9pwNjRgN9Rg1ZXzy9PH0QhVSSnCYXbEmbG8ivbGNiamprjz/p1Iqj1945hNVm4VlGE31jJpb6DTUEVdWSU1hUW0aQvxt1Sy/uuPKBbn5ylQZmDS1eAwt+JxuPCJ1Dyd3bzX7sAinJuMzWiy8tFmZzHSXsm4o5bSDCXlIhNNpppCkZ27voznK8Lh0sKCKKialhoDXW0d+D29jHo8eLv78Li8uB1ujMWlFKUrqVLnYK0qpkNE2ayvw2KyUK01YDM14m6uYeXnH1A8FTdTV1pOZ2MLjmYrg+5+hnt9TIhLmPJPMNQ7RJuukvISA7fqfejNIzRaxnC6bos6T9Fk7qXT0oXPYWN15TdZw0WKMzLRF5WiTlWSq8ylwWjDqKvH1W4Tl6DHVKElT1XMlRsaEtJ0ZBe2UlBuR1Nmo7Laia6ikZS3rrL86KFM+SFpb18XdcyiQp1H4tXr3LxyDW1xNVpNKYaiQrqtNqwtHaQrhcOb+aRl60hX1XItsYiULD2q7BKyEhOQf4zi791d1tfWCAY22N7cIvjiBRsCUg88D/BnMMjW1jY7O3+xLRDYCLK+/gcbG1tsBLfFWpwRth3BOTo6iu/laF9GgejTs4jt3x0ev47buehn6Ssyvi5PFtnkEpIgERtXMVs4HN3f399nc3OTQCDArsg0Or4EOUaUkyQWZXTKRHEkPnh4eEj4pcPoMN3b2xPlECmLskg94vBVmv91FH9YflTK0wu7zEquZZQHBwcRXZ6P1DBGjsdJXDSy2PFph4SUjmJBSF4smH8AuRThzksWgcgAAAAASUVORK5CYII=","aspectRatio":1,"src":"/static/55348f15dd0ce417928f7ed656ebfb8f/a1946/lebaspot.png","srcSet":"/static/55348f15dd0ce417928f7ed656ebfb8f/5b37e/lebaspot.png 236w,\n/static/55348f15dd0ce417928f7ed656ebfb8f/49058/lebaspot.png 472w,\n/static/55348f15dd0ce417928f7ed656ebfb8f/a1946/lebaspot.png 944w,\n/static/55348f15dd0ce417928f7ed656ebfb8f/030f1/lebaspot.png 1416w,\n/static/55348f15dd0ce417928f7ed656ebfb8f/75927/lebaspot.png 1888w,\n/static/55348f15dd0ce417928f7ed656ebfb8f/b8151/lebaspot.png 3200w","srcWebp":"/static/55348f15dd0ce417928f7ed656ebfb8f/99fbb/lebaspot.webp","srcSetWebp":"/static/55348f15dd0ce417928f7ed656ebfb8f/77392/lebaspot.webp 236w,\n/static/55348f15dd0ce417928f7ed656ebfb8f/1f177/lebaspot.webp 472w,\n/static/55348f15dd0ce417928f7ed656ebfb8f/99fbb/lebaspot.webp 944w,\n/static/55348f15dd0ce417928f7ed656ebfb8f/4a492/lebaspot.webp 1416w,\n/static/55348f15dd0ce417928f7ed656ebfb8f/b0b8f/lebaspot.webp 1888w,\n/static/55348f15dd0ce417928f7ed656ebfb8f/dae32/lebaspot.webp 3200w","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='M15%20184v98h370V86H15v98'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"regular":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAD6UlEQVQ4y32U61ObVRDG8zfVVlvAcgu3EAh3Ag2QECAQLiEkIRJCIBAu4V7H9oPOVMZxHJXpDGpn/AwtiG3VcVQ6A2IbIpfxG3IL4fLznIS0EVvfmefdPXues+/unndXEQ6HOT4+Rsp4vM4Wv/emfUU84U24zPm/M4qweIVCodfiMjkUurwOvZQxXXF6eop8znn1xPTz83POzs4ETpE8KSNrab+A5MS4JycnKFafPWN8wMf00DC3h0cicsI3yFiflw8/uMvsl3N8PfeAB998y+zsHPfvf8VnM5/wxcwMn9/7mE8/usf46DR3J6f5fXUNxdL8Apnv3ECTnEphmpL85DTU76aSk5BEa30TLqeHwf4RRofH8fT4cFo7sRjqcJmbsdebInpVsRZtrobH3y2j+H5xibyUNMpyVFTk5lORp6E0Jx+z3sT4sJ8+dw/+QT+jIxNC92KpM+G2tNNvs9NjseJsahZOjTRoK/jpyRMUy48WyUlKpigjC60qj6qCErT5JXS5uhnyD9Ln9TI0OMnAwBjmWhPm6lrcLa14rVa6W9pwNjRgN9Rg1ZXzy9PH0QhVSSnCYXbEmbG8ivbGNiamprjz/p1Iqj1945hNVm4VlGE31jJpb6DTUEVdWSU1hUW0aQvxt1Sy/uuPKBbn5ylQZmDS1eAwt+JxuPCJ1Dyd3bzX7sAinJuMzWiy8tFmZzHSXsm4o5bSDCXlIhNNpppCkZ27voznK8Lh0sKCKKialhoDXW0d+D29jHo8eLv78Li8uB1ujMWlFKUrqVLnYK0qpkNE2ayvw2KyUK01YDM14m6uYeXnH1A8FTdTV1pOZ2MLjmYrg+5+hnt9TIhLmPJPMNQ7RJuukvISA7fqfejNIzRaxnC6bos6T9Fk7qXT0oXPYWN15TdZw0WKMzLRF5WiTlWSq8ylwWjDqKvH1W4Tl6DHVKElT1XMlRsaEtJ0ZBe2UlBuR1Nmo7Laia6ikZS3rrL86KFM+SFpb18XdcyiQp1H4tXr3LxyDW1xNVpNKYaiQrqtNqwtHaQrhcOb+aRl60hX1XItsYiULD2q7BKyEhOQf4zi791d1tfWCAY22N7cIvjiBRsCUg88D/BnMMjW1jY7O3+xLRDYCLK+/gcbG1tsBLfFWpwRth3BOTo6iu/laF9GgejTs4jt3x0ev47buehn6Ssyvi5PFtnkEpIgERtXMVs4HN3f399nc3OTQCDArsg0Or4EOUaUkyQWZXTKRHEkPnh4eEj4pcPoMN3b2xPlECmLskg94vBVmv91FH9YflTK0wu7zEquZZQHBwcRXZ6P1DBGjsdJXDSy2PFph4SUjmJBSF4smH8AuRThzksWgcgAAAAASUVORK5CYII=","aspectRatio":1,"src":"/static/55348f15dd0ce417928f7ed656ebfb8f/3ddd4/lebaspot.png","srcSet":"/static/55348f15dd0ce417928f7ed656ebfb8f/078a8/lebaspot.png 163w,\n/static/55348f15dd0ce417928f7ed656ebfb8f/e56da/lebaspot.png 327w,\n/static/55348f15dd0ce417928f7ed656ebfb8f/3ddd4/lebaspot.png 653w,\n/static/55348f15dd0ce417928f7ed656ebfb8f/c5cc7/lebaspot.png 980w,\n/static/55348f15dd0ce417928f7ed656ebfb8f/eebd2/lebaspot.png 1306w,\n/static/55348f15dd0ce417928f7ed656ebfb8f/b8151/lebaspot.png 3200w","srcWebp":"/static/55348f15dd0ce417928f7ed656ebfb8f/0acdf/lebaspot.webp","srcSetWebp":"/static/55348f15dd0ce417928f7ed656ebfb8f/ac59e/lebaspot.webp 163w,\n/static/55348f15dd0ce417928f7ed656ebfb8f/7660b/lebaspot.webp 327w,\n/static/55348f15dd0ce417928f7ed656ebfb8f/0acdf/lebaspot.webp 653w,\n/static/55348f15dd0ce417928f7ed656ebfb8f/75470/lebaspot.webp 980w,\n/static/55348f15dd0ce417928f7ed656ebfb8f/68d47/lebaspot.webp 1306w,\n/static/55348f15dd0ce417928f7ed656ebfb8f/dae32/lebaspot.webp 3200w","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='M15%20184v98h370V86H15v98'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"narrow":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAD6UlEQVQ4y32U61ObVRDG8zfVVlvAcgu3EAh3Ag2QECAQLiEkIRJCIBAu4V7H9oPOVMZxHJXpDGpn/AwtiG3VcVQ6A2IbIpfxG3IL4fLznIS0EVvfmefdPXues+/unndXEQ6HOT4+Rsp4vM4Wv/emfUU84U24zPm/M4qweIVCodfiMjkUurwOvZQxXXF6eop8znn1xPTz83POzs4ETpE8KSNrab+A5MS4JycnKFafPWN8wMf00DC3h0cicsI3yFiflw8/uMvsl3N8PfeAB998y+zsHPfvf8VnM5/wxcwMn9/7mE8/usf46DR3J6f5fXUNxdL8Apnv3ECTnEphmpL85DTU76aSk5BEa30TLqeHwf4RRofH8fT4cFo7sRjqcJmbsdebInpVsRZtrobH3y2j+H5xibyUNMpyVFTk5lORp6E0Jx+z3sT4sJ8+dw/+QT+jIxNC92KpM+G2tNNvs9NjseJsahZOjTRoK/jpyRMUy48WyUlKpigjC60qj6qCErT5JXS5uhnyD9Ln9TI0OMnAwBjmWhPm6lrcLa14rVa6W9pwNjRgN9Rg1ZXzy9PH0QhVSSnCYXbEmbG8ivbGNiamprjz/p1Iqj1945hNVm4VlGE31jJpb6DTUEVdWSU1hUW0aQvxt1Sy/uuPKBbn5ylQZmDS1eAwt+JxuPCJ1Dyd3bzX7sAinJuMzWiy8tFmZzHSXsm4o5bSDCXlIhNNpppCkZ27voznK8Lh0sKCKKialhoDXW0d+D29jHo8eLv78Li8uB1ujMWlFKUrqVLnYK0qpkNE2ayvw2KyUK01YDM14m6uYeXnH1A8FTdTV1pOZ2MLjmYrg+5+hnt9TIhLmPJPMNQ7RJuukvISA7fqfejNIzRaxnC6bos6T9Fk7qXT0oXPYWN15TdZw0WKMzLRF5WiTlWSq8ylwWjDqKvH1W4Tl6DHVKElT1XMlRsaEtJ0ZBe2UlBuR1Nmo7Laia6ikZS3rrL86KFM+SFpb18XdcyiQp1H4tXr3LxyDW1xNVpNKYaiQrqtNqwtHaQrhcOb+aRl60hX1XItsYiULD2q7BKyEhOQf4zi791d1tfWCAY22N7cIvjiBRsCUg88D/BnMMjW1jY7O3+xLRDYCLK+/gcbG1tsBLfFWpwRth3BOTo6iu/laF9GgejTs4jt3x0ev47buehn6Ssyvi5PFtnkEpIgERtXMVs4HN3f399nc3OTQCDArsg0Or4EOUaUkyQWZXTKRHEkPnh4eEj4pcPoMN3b2xPlECmLskg94vBVmv91FH9YflTK0wu7zEquZZQHBwcRXZ6P1DBGjsdJXDSy2PFph4SUjmJBSF4smH8AuRThzksWgcgAAAAASUVORK5CYII=","aspectRatio":1,"src":"/static/55348f15dd0ce417928f7ed656ebfb8f/502b1/lebaspot.png","srcSet":"/static/55348f15dd0ce417928f7ed656ebfb8f/f2e6d/lebaspot.png 114w,\n/static/55348f15dd0ce417928f7ed656ebfb8f/4ddba/lebaspot.png 229w,\n/static/55348f15dd0ce417928f7ed656ebfb8f/502b1/lebaspot.png 457w,\n/static/55348f15dd0ce417928f7ed656ebfb8f/7ddc2/lebaspot.png 686w,\n/static/55348f15dd0ce417928f7ed656ebfb8f/435bf/lebaspot.png 914w,\n/static/55348f15dd0ce417928f7ed656ebfb8f/b8151/lebaspot.png 3200w","srcWebp":"/static/55348f15dd0ce417928f7ed656ebfb8f/15384/lebaspot.webp","srcSetWebp":"/static/55348f15dd0ce417928f7ed656ebfb8f/31fce/lebaspot.webp 114w,\n/static/55348f15dd0ce417928f7ed656ebfb8f/e3e25/lebaspot.webp 229w,\n/static/55348f15dd0ce417928f7ed656ebfb8f/15384/lebaspot.webp 457w,\n/static/55348f15dd0ce417928f7ed656ebfb8f/0258d/lebaspot.webp 686w,\n/static/55348f15dd0ce417928f7ed656ebfb8f/64ea2/lebaspot.webp 914w,\n/static/55348f15dd0ce417928f7ed656ebfb8f/dae32/lebaspot.webp 3200w","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='M15%20184v98h370V86H15v98'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"seo":{"src":"/static/55348f15dd0ce417928f7ed656ebfb8f/6050d/lebaspot.png"}}},{"id":"e581c596-4e2a-5188-8646-6c6b8ca3221a","slug":"/dev-sec-ops","secret":false,"title":"Dev Sec Ops","author":"Luke Celitan","date":"November 1st, 2021","dateForSEO":"2021-11-01T00:00:00.000Z","timeToRead":2,"excerpt":"Secuirty First !","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\": \"Dev Sec Ops\",\n  \"author\": \"Luke Celitan\",\n  \"date\": \"2021-11-01T00:00:00.000Z\",\n  \"hero\": \"./devsecops1.jpg\",\n  \"excerpt\": \"Secuirty First !\",\n  \"category\": \"Post\",\n  \"tech\": [\"TS\", \"Nodejs\", \"ReactIcon\", \"Rust\"]\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\": \"dev-sec-ops\"\n  }, \"Dev Sec Ops\"), mdx(\"h2\", {\n    \"id\": \"introduction\"\n  }, \"Introduction\"), mdx(\"p\", null, \"Around the year 2010 the Software Engineering had been transfomred by the\\ninvention of \", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://en.wikipedia.org/wiki/DevOps\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"DevOps methology\"), \". Its main\\nfocus was to bring the Developers (Dev) and server Admins (Ops) to close\\ncooperation in order to ensure that software products get a quick a steady\\nrelease.\"), mdx(\"p\", null, \"DevOps changed the landscape of software creation by providing tools to automate\\nCI/CD pipelines, terraforming or maintaining server and network instances as a\\ncode, procedures and protocols for automating unit and e2e testing. It also gave\\nus the role of DevOps Engineer, a fairly new position in the IT world, that\\nfocuses on the tasks mentioned above.\"), mdx(\"h2\", {\n    \"id\": \"enter-devsecops\"\n  }, \"Enter DevSecOps\"), mdx(\"p\", null, \"Small and big businesses have adopted quickly the DevOps methodology. In 2022\\nDevOps Engineers are essential IT personnel in delivering products / local\\nsoftware instances to its online environments. As these practices became\\nstandard, businesses have switched their focus from delivering fast to trying to\\ndelivering fast but secure software.\"), mdx(\"p\", null, \"Cyber crime is on the steady rise, data breaches, ransomware, phishing, supply\\nattacks, \\u201Cevil competition\\u201D ddos attacks, social engineering attacks, the list\\ngoes on and on. For more stats about cyber crime you can\\n\", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://www.comparitech.com/vpn/cybersecurity-cyber-crime-statistics-facts-trends/\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"read this article\"), \".\"), mdx(\"p\", null, \"In the past security teams were mostly reactive and not involved in the\\ndevelopment phase. Security specialists would focus on audits, reports and scans\\non already made electronic products, then they would go back to dev teams or\\nproduct owners for remediation actions. This approach can be very problematic,\\nfeatures or functions based on insecure solutions need time to be rewritten or\\nadjusted, sometimes already paid and delivered products need now additional work\\nin order to comply with security standards.\"), mdx(\"p\", null, \"DevSecOps tries to remediate this problem, by involving the Security team in the\\ndevelopment process. Sometimes this is refereed to as \\u201Cshifting left\\u201D in the\\nindustry. This move tries to shift the responsibility of secure coding into the\\ndeveloper domain by providing necessary tools and procedures to the DevOps\\ncycle.\"), mdx(\"p\", null, mdx(\"span\", {\n    parentName: \"p\",\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"3450px\"\n    }\n  }, \"\\n      \", mdx(\"span\", {\n    parentName: \"span\",\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"69.72%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAOCAIAAACgpqunAAAACXBIWXMAAAsTAAALEwEAmpwYAAACNUlEQVQoz6WT32vTUBTHAyL64F8wRAR/PFREQUFkCIJDcPiwvYgwUIQyK7iBok8ymaAgMpkwFGEodYqiQxCcA0Vx2Ao6V0s3bJf+MGvSm/5Imx/NbZOb5OZ602g3pg8Dz8vNOTfffM/93BOG/EcwoCi9m5mNfknMfI5/+DT3MRLTYZNuuO4axJZt12RNVuuKWhfLqlhWqHDlG8ghDYvgf32L8Re3ZfQTqPHFIoQNmmLs10i2aLxPaHoTezUaLqZ+dF0tVrW6IPDJdJ4HFezY2C8qymI2DwDglgSOL3K8WJFkwzSXxW39o4i6bzCyN/jq3uSs10sZ9U/UO0dQ8KmdrzmEYNvBy227rSO2Ku6DKFl3pnrwYiRw6uX63QPnr9wNXEhuChVOh5vbhu2uMaJ7fgT/AcCkgJ0UEG6pj4ySjksWZSarevDy6Pb9PTtPhqcSBkHayBuN6TNffzfSLMvmCj4UJrMkzs1nQKmKjEZfmOy54aTySgbo3bfAju7rW3YdffxiGjXh8MNvzLHptzGJ5z0oYqnaNEyGAphPZlJZoVISpxbw5qvkwG0SuGZsPFsbmmC7es9t6Dh86Hhoa2eoZ3AcUYgYm8iyfdoCKMcX0myW1xsGzaM50v+cDEziaNqiKe3/5tiTE8GhO/efQQjbXH+f2TCRqumw4U2VDyInQg7IhFhOKy9L8tfYDxMh+mxT1hivHpKVQd0UDbavBJSkJMtluYJUVVUNUqe2ObPGf8Abrb8m9BetIuRKL3suIwAAAABJRU5ErkJggg==')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  }), \"\\n  \", mdx(\"picture\", {\n    parentName: \"span\"\n  }, \"\\n          \", mdx(\"source\", {\n    parentName: \"picture\",\n    \"srcSet\": [\"/static/28350f5a7365b0b3fd54cfb4fe820bdd/a3bc4/devsecops-diagram.webp 2500w\", \"/static/28350f5a7365b0b3fd54cfb4fe820bdd/99740/devsecops-diagram.webp 3450w\"],\n    \"sizes\": \"(max-width: 3450px) 100vw, 3450px\",\n    \"type\": \"image/webp\"\n  }), \"\\n          \", mdx(\"source\", {\n    parentName: \"picture\",\n    \"srcSet\": [\"/static/28350f5a7365b0b3fd54cfb4fe820bdd/412e4/devsecops-diagram.png 2500w\", \"/static/28350f5a7365b0b3fd54cfb4fe820bdd/d4b36/devsecops-diagram.png 3450w\"],\n    \"sizes\": \"(max-width: 3450px) 100vw, 3450px\",\n    \"type\": \"image/png\"\n  }), \"\\n          \", mdx(\"img\", {\n    parentName: \"picture\",\n    \"className\": \"gatsby-resp-image-image\",\n    \"src\": \"/static/28350f5a7365b0b3fd54cfb4fe820bdd/d4b36/devsecops-diagram.png\",\n    \"alt\": \"Dev Sec Ops methodology\",\n    \"title\": \"Dev Sec Ops methodology\",\n    \"loading\": \"lazy\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    }\n  }), \"\\n        \"), \"\\n    \"), \" \", mdx(\"em\", {\n    parentName: \"p\"\n  }, \"source:\\n\", mdx(\"a\", {\n    parentName: \"em\",\n    \"href\": \"https://www.atlassian.com/pl/devops/devops-tools/devsecops-tools\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"https://www.atlassian.com/pl/devops/devops-tools/devsecops-tools\"))), mdx(\"h2\", {\n    \"id\": \"devsecops-owasp-model\"\n  }, \"DevSecOps OWASP model\"), mdx(\"p\", null, \"In my current position (Dec, 2022) as web application architect and team leader,\\nI have adopted the the DevSecOps model proposed by the OWASP organization\\n\", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://github.com/OWASP/DevSecOpsGuideline\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"https://github.com/OWASP/DevSecOpsGuideline\")), mdx(\"p\", null, \"The DevSecOps model helps in producing:\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"automation to create short feedback loops to developers\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"breaking down the silos between development, security, and operations\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"breaking down security work into small pieces to create flow\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"making decisions based on threat intelligence from operations\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"establishing a culture of security experimentation and learning\")), mdx(\"h2\", {\n    \"id\": \"threat-modeling\"\n  }, \"Threat Modeling\"), mdx(\"p\", null, \"The first step in running a successful DevSecOps model is to do a threat\\nanalysis on the planned developed software. What are the essential points of\\nyour application that need to be protected ? This mental exercise will help you\\ndetermine on which aspects of your software you need to focus on. It will also\\nhelp you plan any remediation steps or procedures that need to be developed in\\norder to minimize damage when things go sideways.\"), mdx(\"p\", null, \"In my opinion it will always look better if some security procedures and\\nemergency plans fail, them have no plans at all.\"), mdx(\"p\", null, \"The most common sensitive points are:\"), mdx(\"h3\", {\n    \"id\": \"data-breach--data-corruption\"\n  }, \"Data breach / Data corruption\"), mdx(\"p\", null, \"Customer or business data deemed sensitive need extra application security\\nfocus. Protecting users data like credit cards, home addresses, emails and\\npasswords are imperative from a business and reputation point of view. Who in\\nthe right state of mind would like to share their private information with an\\namateur or insecure application.\"), mdx(\"p\", null, \"Another huge risk these days in terms of data and system protection is\\nransomware. All systems should have proper back up plans, paying up ransom so\\nthe system can continue to operate\"));\n}\n;\nMDXContent.isMDXComponent = true;","tech":["TS","Nodejs","ReactIcon","Rust"],"category":"Post","appDescription":null,"hero":{"full":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAMEAQIF/8QAFQEBAQAAAAAAAAAAAAAAAAAAAQD/2gAMAwEAAhADEAAAAeRLfwMqIOlcaqK//8QAHBAAAgICAwAAAAAAAAAAAAAAAQIAAxESEyEi/9oACAEBAAEFAijKaqTYSKUgbILTkxK+zf4O7T//xAAWEQADAAAAAAAAAAAAAAAAAAAAARL/2gAIAQMBAT8BlksplM//xAAWEQEBAQAAAAAAAAAAAAAAAAARABD/2gAIAQIBAT8BcIv/xAAfEAACAQQCAwAAAAAAAAAAAAAAARECITFhEyJBUXH/2gAIAQEABj8CuheKfZHGn9O0TsytF4q2NMsZP//EABsQAQADAQEBAQAAAAAAAAAAAAEAESFBURAx/9oACAEBAAE/IXgons6aOwnWl3TBNu9xqUQcch+ISAbgImnOp8n/2gAMAwEAAgADAAAAEDcoAv/EABYRAQEBAAAAAAAAAAAAAAAAAABhAf/aAAgBAwEBPxCOoq6rr//EABcRAAMBAAAAAAAAAAAAAAAAAAARUQH/2gAIAQIBAT8QSjyiQSH/xAAfEAEAAwACAQUAAAAAAAAAAAABABEhMUGhUWFxkfD/2gAIAQEAAT8QIMipjCPV4XYBzR3DxQconzNow2G17Z4lxF51X+oAsjUUX4ho0LC30GWlpg54Z+wT/9k=","aspectRatio":1,"src":"/static/f56e51cac14719be4f33b4f802a1de49/58fe7/devsecops1.jpg","srcSet":"/static/f56e51cac14719be4f33b4f802a1de49/e0f30/devsecops1.jpg 236w,\n/static/f56e51cac14719be4f33b4f802a1de49/86afd/devsecops1.jpg 472w,\n/static/f56e51cac14719be4f33b4f802a1de49/58fe7/devsecops1.jpg 944w,\n/static/f56e51cac14719be4f33b4f802a1de49/0ff54/devsecops1.jpg 1200w","srcWebp":"/static/f56e51cac14719be4f33b4f802a1de49/99fbb/devsecops1.webp","srcSetWebp":"/static/f56e51cac14719be4f33b4f802a1de49/77392/devsecops1.webp 236w,\n/static/f56e51cac14719be4f33b4f802a1de49/1f177/devsecops1.webp 472w,\n/static/f56e51cac14719be4f33b4f802a1de49/99fbb/devsecops1.webp 944w,\n/static/f56e51cac14719be4f33b4f802a1de49/9000d/devsecops1.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%2062v63h3c3%201%204%201%204-12v-11l1-2v-2c2%200%202%202%202%2015v15l10%205%2021%2012c6%206%2010%207%2010%206%200-2%202-1%202%202s7%2011%207%208l1-7v-5l-3-1c-3-1-4-1-4-4s0-4-3-4-3-2%200-2c2%200%203-1%203-4%200-4%200-5%203-5l4%201c1%201%201%200%201-2%200-3-2-6-4-5l-2%203-1%202c-2%200-1-5%201-6%201-2%203-2%205-2%203%201%203%201%203-3v-3c2%200%202%2010%200%2011l-1%203c0%202%200%202%201%201l2-2%202%201v12l-1%209-1-4-1%201c1%204-1%206-2%202-1-1-1%203-1%209%200%208%200%209%201%202%200-8%200-9%203-7%202%202%202%203%202%2011%200%2011%200%2015%203%2016%203%200%203%200%203-12%201-15%202-15%203%200v12h3l12%202%2010%201h10l9-1v-2c-2-1-2-2-1-6l1-5v-7l-2-2h2v-2c-2-2-3-4%200-2%201%201%201%201%201-1l-1-2v-2l-1-6c-1-3-1-3%201-3%201%200%202-1%202-3l-1-2-1-1c-1-1-2-2-7-2-6-1-6-1-2-6l3-4%2010%202%2014%201%204%201-4%204-5%203c-2-2-3%201-3%207%201%205%201%205%202%203s1-2%201%200v14h-1c-2-2-3%200-3%208%200%207%201%208%202%207%203-1%206-1%2021%201l15%202%206-3c6-3%2014-4%2019-1%201%200%203-2%205-7%204-8%2014-21%2017-22l5-3%2010-4%209-5%202-3h-2l-37-8c-1%200%201-3%205-6l4-3%2019%204%2020%205c2%200%202%200%202-3l1-2v3l2%203%201-3c0-2%200-3%201-2l1%203v2c2%200%202-1%202-3l1-3%201%202c0%202%201%202%204%200s6-2%2011-1c3%200%204%202%201%202l-3%201%202%201c2-1%202%200%202%205l2%202c2%201%202%201%202-1%200-5%203-16%208-25a147%20147%200%2001108-76l1%2030v31l-3%201a247%20247%200%2000-32%209c-2%200-2%200-1%202v1c-1%200-2%200-1-1l-2-1-3%201v2c1%201%200%202-2%201l-1%201h-2l-2%201v1l-5%202c-4%202-4%202-2%202h3l2-1%203-2c1%200%203%205%201%206v3c0%203-18%2011-19%208l-2-2-1%201c3%204-8%209-11%206-2-1-2-1-2%201%201%202%200%202-4%204l-3%203%209-4%203-1%2012-5%202-1%2010-3%209-2%201-2-1-3-1-6c0-4%201-4%203-5l7-2h6l1%201v-1l2-2c3-1%205-1%205%202l1%201v-2l1-3%201%202c-1%202%200%202%202%202%201%200%202%200%201-2l-1-1-1-1%2011-3c2%200%200%204-2%204l-1%201v2l-1%201h-1l-3%202c-2%200-2%200%200%201l-9%204-12%204v6l1-3c1-2%205-5%208-4h1l9-2c2%201%201%203-2%204l-3%201%208-1%207-1c-1%200-5%2012-4%2013l-4%202c-5%201-6%203-6%2012l-1%203-4%203c-2%203-4%204-9%205-6%201-7%202-7%203l-1%204c-3%203-1%203%207%200l5-1h-5c-7%201-4-1%204-2%206-1%207-1%206-3l1-2c3%202%201%205-3%206l-4%201h5c3%200%204%200%203%201h-3v2l-1%202v-1l-1-1-2%202c0%203%200%203-1%200s-2-3-5-2l-3%203-2%204c-1%201-1%201%205%201h5l-1%201v1c-2%201-2%201-1%202l-4%202c-8%202-10%203-8%205%203%202%2028-3%2029-6%201-2%202-2%209-4%205%200%205-2%205%2039v35h-14v7l-1%207c-1%200-2-10-1-25%200-8%200-8-2-7h-4c0-1%201-2%203-2h3v-13h-5a454%20454%200%2000-13%200c-1-2%200-3%2010-3h5l-1%201c4%202%204%201%204-3v-4l-10%201-11%201-1%2025-1%2020c-1-4-1-4-1%203l1%207h6l7%201h-8l-9-1c-1-1-1%200-1%204%200%208%201%208%2014%207l10%201v1c2%200%202%201%202%203%200%203%200%203-2%202h-1c1%202%200%202-2%202s-3%200-2%201l2%201-2%201c-1-1-2%200-2%201-1%202-3%203-3%200l-1%201v2l-14%201c-14%200-15%200-15-2h-1c-1%202-3%202-10%202-10%200-10%200-7-5%202-3%202-3%203-1s1%202%203%200l2-4%202-3%201-1h-4l-1%202c-3%200-6%203-8%208l-1%204h-11l-19-2c-11-1-16-1-9%201%204%201%203%201-8%201l-13-1-11-3-1-1h-5c0%201%204%203%2010%204%205%201%204%201-6%201l-15-1h-4l-9%201c-10%200-10-1-1-2%209%200%207-1-2-1-7%200-8%200-8%202v1l-1-1-11-1-59%202H87l1-2c0-3%200-3-3-3s-3%200-2%203l1%202h-9c-5%200-9%200-8-1s3-18%201-18l-1%204c-1%203-1%204-4%204-2%200-3%200-3-2-1-1-1-1-1%201s1%202%203%202%203%200%202%201l1%203c1%201%201%201-3%201h-5v-30H39v31l6-1%2014%201%208%201-4%201-15%202H37v-34h-3c-2%200-2%200-1-1l4-1h2l-1-1-1-34v-34l-4%201c-3%202-4%202-4%201%201-2-3-3-5-2-1%202-2%2024-1%2026v3c0%203-1%203-5%202-12-1-11%200-11-7%200-5%200-6-1-3l-1%202-3-2c-2-1-2%200-2%2079v80l3-1c3%200%203%201%200%202l-3%201v37h6c7%200%209-1%209-3%200-3%204-5%207-4l8%201h6l-3-2-3-1h3c5%201%2011%200%2014-3%204-3%204-1%200%203-2%203-8%206-11%206l-4%202c-2%201%201%201%2027%201h29l1-3%204-3h3l-3-1c-2-2-3-2-3%200h-2c-1-3%202-4%206-2%202%202%204%202%209%202h7l-1-2-1-6v-4l1%204%201%203c0-3%202%201%202%205%200%205%201%207%207%207h4l-5-7a3545%203545%200%2000-22-32l30-1%2030%201%206%204c5%205%208%206%206%202l2-1%209-2%204-1-12%201c-2%200-3%200-2-1s16-4%2017-2h14l10-1%206%204%206%206%201%201%2013%209c0%201-8%203-36%208-14%203-16%204-16%205l2%203c2%200%202%200%201%201-2%201-2%201%201%201l5%201%204%201c3%200%203%200%202-1v-2l2%202c1%201%2028%202%2028%200%200-1-3-2-7-1-6%201-7%201-7-3%200-1%200-2-1-1%200%203-1%202-5-1-3-4-3-4-1-4%204-1%205-1%206%202%201%202%201%202%206%202%205-1%205-1%208%202l3%204%206%201h6l-2-2c-3-4%200-4%205-1l4%203h151l-1-137V125l-4%201h-3l4-2h4V0H0v62m243%2077c-5%206-8%2017-6%2025l1%204v-5c0-5%202-5%203-1%201%208%203%2012%204%2012l1%201c-1%201%202%205%204%205l3-3c8-8%207-29%200-38-4-4-6-4-10%200m42%202l-3%203v1h1l1%201-1%201-1%207-1%207-1-4c0-2%200-3-4-3h-5c-1%200-2%202-2%207l-3%2013c-4%207-4%206%201%206%204-1%204%200%201%204-3%202-4%202-9%202-16%200-20-2-24-11l-2-2-1%202c-2-1-3%200-2%204%202%206%202%207%205%209%202%201%201%201-3%202l-8%202c-2%200-2%200%200%202s2%202%209%201l12-2c3%200%203%200%203-3%200-5%202-5%202-1v4h6l2-1%201%201%205%201h7l2%201%201%201h3l2%201-1%201c-1%200-1%201%201%201%201%201%201%201-1%201l-2-1h-36l17%202%2021%202c5%200%205%200%205-2s-1-3-2-3l1-1%201-1v-3l-1-2c1-1%200-1-2-1l-3-1h4c3%200%203%201%203%202l1%202%201-1v-1l1%202%201%201-1%201-2%201h2c2%200%202%200%202%202v1l1%201%202%203c3%202%201%203-3%201-2-1-4%200-5%201l-5%201v-1l-18-2-22-1%206%201c5%200%206%200%203%201l-4%201%205%205%205%205v-4l1-4c1-1%201%209%201%2028l1%2038%201%204h-7l-5%201a1508%201508%200%200124%204c4%200%204%200%204-3%200-2-1-3-2-3l-2-1h2c2%200%203-6%201-6l-4-1-1%206v6l-1-7v-6l7%201h7v-53h-7c-5%200-6%200-4-1h-5c-4%200-4%200-4%204%200%205%203%2012%207%2018l3%204%204%204c2%201%203%205%201%205s-1%202%201%202c1%201%201%201-1%201-1%201-2%200-2-1%200-2-3%202-3%205%200%201%200%202-1%201-1-2-3-1-3%203l-1%204-2-3-1-3v3c0%202%200%202-1%201-1-2-1-1-1%204a901%20901%200%2001-1-54c-1-3%200-3%209-4a462%20462%200%200130%200l-1%202-19%203c8%200%208-1%208%2029v27h3c10%202%2011%202%2015-2%205-5%209-6%2029-7%2019-1%2019-1%2018-7%200-4%200-4-5-4l-10-1h5l10-1-5-1h-7l6-1h6v-34l-6-2-15-6-11-4a504%20504%200%200011-4l4-1h-5l-4%201-6%201-6%201c-2%200-2%200-1-1l5-2%204-1h4l18-3%2021-3h14c1%202%200%203-3%203l-2%201-6%201-9%201c-1%201%200%201%205%201a975%20975%200%2000-6%204l-1%201%2019-1h6v-8c0-7%200-8-2-8a480%20480%200%2001-45%207%202717%202717%200%2001-38%204c0-3%201-4%205-4%203%200%203-1-1-5-8-9-14-20-15-30v-16l-1%203M1%20143l3%203c24%205%2054%2021%2061%2032l3%203c0-8-22-24-44-32l-23-6m83%205c-3%200-4%202-3%205%200%202%200%202-1%201h-1l3%205%203%203%202-2%202-1c1%201%203-2%203-5%200-1%200-2%201-1l1-1-1-1-4-2-3-2-2%201m-83%202c0%201%201%202%203%202l4%201%2012%204c15%205%2025%2010%2030%2016%203%203%205%205%204%206h2c-1%201%202%207%204%207%201%201%201%201-1%201-2%201-2%200-4-2%200-2-3-4-5-6-11-6-49-17-49-13l4%201%205%202%203%201c5%200%2024%206%2028%208a84%2084%200%200117%2012c1%201%201%201-1%201l-16-4-2%201%204%201%204%202c1%201-4%203-6%202s-2%200-2%2010v11l3%201%207%205%203%203v-4c0-5%202-15%205-21v-4l1-1%203%203c1%202%201%202%201%200l1-2v-1l-3-2c-1-3-1-3%203-4%202-1%203-1%203%201v4c1%202%202-3%201-7-3-11-27-25-52-32l-14-3m162%2047c-5%203-7%2012-3%2012v1l-2%201h2v1l-2%201h1l1%201v1a516%20516%200%200012%203l2%202v-2c0-2%200-2%201-1h1c0-3-6-9-8-7h-3v-1l1-3c0-3%200-4-2-4s-1-3%202-4c3-2%201-2-3-1m30%201l-5%201%204%201c2-1%203%200%203%201l7%201c6%200%206%200%200%201-4%201-6%203-3%203%201%200%202%201%201%202l-2%201c-2%200-4%202-2%203l7%201c4%200%204%200%202%201l-3%201%202%201c2%201%202%201%201%202v1c1%200%203%206%203%2013l-1%204c0-4-7-4-8%200-1%202%200%202%203%202l4%201-5%201c-5-1-7%200-7%203%200%202%201%202%205%202h6l-5%201c-5%200-6%200-6%202h3c1-1%201-1%201%201s-1%202-4%202c-4-1-5%200-2%202h4c4%200%203%203-1%203l-4%201h9v-3c1-4%201-4%204-3v1l-2%202%202%201%201%201%201%202v2c-1%201-1%203%201%203v-1c-1-2%203-2%209-1l3%201-3%201h1l2%202%202%202-1%201c-2%201-2%201%200%201%204%200%206-5%202-6h3l5-1c1-2%204-2%204-1l-1%202h-2v4l-1%201%202%201%201-1v-1c1-1%201%200%201%201l-2%202%203%201c5%202%207%201%207-2-1-1%200-2%201-2l1%204c0%202%200%203%202%203l1-6c0-4%200-5-1-4-3%202-6%200-5-2%201-3%206-3%206%200h1c2-2%203-1%202%201%200%202%200%202%202%202s2%200%202-25c0-13%200-24-1-23%200%202-1%202-4-1-4-4-4-4-10-4-11%200-22-4-31-11l-7-4-8%201m-130%209c0%207-1%2013-3%2013l-1-3-1%206c0%209%200%2010%203%2015l3%206c0%206%207%203%2011-4%203-6%205-12%203-13-1-1-1%200-1%203%200%206-9%2014-9%207%200-2%200-2-1%201-2%205-3%204-3-3v-8c-1%200%205-4%208-4%202%200%202%200%201-1l-2-1-3%201h-3l1-1%201-1-1-2v-1c1%200%201-2-1-4-1-2-1-2%201-2v-2l-1-1-1-1v-4l-1-2v6m86%203c-3%203-5%2010-5%2018-1%2016%206%2029%2010%2019%201-3%202-4%203-2l-4%207c-2%201%201%202%203%201v-1c-1-1%200-1%202-1l4%201c1%201%203%200%203-1s-1-2-3-2l-1-2v-3c-2-1-8-2-8%200l-2%201c-4%200-5-4-6-13%200-7%201-15%203-15l1-1%203-1c3%200%204-1%204-3%200-3-3-4-7-2m-38%202c-4%200-4%204%200%204l4%201c2%200%202%200%202-2%200-4%202%202%202%208v4c-1-3-1-3-1-1l-1%206c0%203%200%203%201%202h1l1%201%201-1%202-3%201-3-2-1-1-11c-1-5-2-5-10-4m66%2016l-1%208-1%203v-3l-1-3c-2%200-2%202-2%206l-2%201-1%201c0%201%203%200%205-2h1c0%202-2%204-5%204-1%200-2%201-2%203v3l1%205v5l1-3c0-2%201-3%203-4l3-1h-6l2-2c3-4%206-14%206-21l-1-5v5m123-3c-1%202-1%203%201%205l4%207%203%203%203%201c1%201%200%202-5%202-8%200-7%201%202%201%208%200%2012-1%208-3l-2-1c-3%200-2-1%201-1l3-1-6-1c-5%201-5%201-4-1%202-1%200-6-4-11-3-3-3-3-4%200M39%20238v11h19c0-1-3-8-8-15-4-7-5-8-8-8l-3%201v11m291-11l-2%201-3%201%203%201c2%200%203%201%201%204%200%201-1%202-3%202-3%200-4%201-4%202-1%202-1%202%201%202l7%201-5%201c-3%200-3%200-3%202%200%203%200%203%205%203%202%200%204%200%203-1l-2-1c-4%200-1-1%204-2%206%200%207-1%207-3h-1c-1%202-7%202-7%200l-2-1c-1%200-1-1%201-2%203-1%203-1%202-2s-1-1%201-1%203-3%201-4c-3-1-2-3%200-3%202-1%202-1-1-1l-3%201M94%20241l1%207c0%204%200%204%203%204l3-2c0-2-1-2-3-1-1%201-1%201-1-3%200-5%201-5%203-5s3%200%203%205v6h7c9%200%2010-1%209-3-1-1-1-2%201-3l1-4c0-2%200-2%201%201l1%202%201%202v4l2-1%203-2c2%200%202%200%201%201-3%200-2%202%200%203l2-1c-1-2%202-4%206-4%205%200%206%200%204-5l-1-3h-24c-23%200-24%200-23%202m194%2031c-1%205-1%206%201%206l1%201h-2l-1%201%205%203c4%201%204%201%204-1l2-4-2-2-1-2h2c1%201%204%200%203-1l-12-1M16%20316v8c0%205%201%206%203%206%207%201%2011-8%206-13-2-2-8-3-9-1m67%201c-3%203-3%207%200%2010%204%205%2010%202%2010-4%200-7-6-10-10-6m15%202c-2%200-2%201-2%208l1%207%201-2c0-2%200-3%201-2%205%201%209-9%204-11l-2-1-3%201m-41%2042l6%2014c6%2012%209%2015%209%2010%200-2%203-1%205%203l3%205%202%204%201%201%201-1h1l1-4-4-8-4-9-2-5c-1-4-1-4%202-4%202%200%203%200%203-2h-4c-3%200-4%200-3-1l5-1c4%200%208-1%206-2H57m75%202c-10%202-9%201-9%2010%200%206%200%208%202%208l1-1%202-2%201%202v2l2-3%202-4%201-4%202-6c2-3%202-3-4-2m76%207c1%205%206%2010%2010%2010l2-1v-4c0-2-1-3-5-6-7-5-7-5-7%201m-20%201h-12c1%202-2%203-3%201-2-1-4-2-4%200%200%201%2017%2014%2019%2014v-2c-3-2-1-3%201%200h8c7-1%208-2%206-4-3-2-2-5%200-5s2%200-2-3l-4-3-9%202m-35%201l-6%201c-4%200-4%200-4%203%201%203%200%203-3-1-5-7-6%200-1%2017l2%208h12l-7-8c-9-10-10-12-8-13l4%201c2%202%206%202%207%200l-1-2c-2-1%201-3%205-4l4-2h-4'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"regular":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAMEAQIF/8QAFQEBAQAAAAAAAAAAAAAAAAAAAQD/2gAMAwEAAhADEAAAAeRLfwMqIOlcaqK//8QAHBAAAgICAwAAAAAAAAAAAAAAAQIAAxESEyEi/9oACAEBAAEFAijKaqTYSKUgbILTkxK+zf4O7T//xAAWEQADAAAAAAAAAAAAAAAAAAAAARL/2gAIAQMBAT8BlksplM//xAAWEQEBAQAAAAAAAAAAAAAAAAARABD/2gAIAQIBAT8BcIv/xAAfEAACAQQCAwAAAAAAAAAAAAAAARECITFhEyJBUXH/2gAIAQEABj8CuheKfZHGn9O0TsytF4q2NMsZP//EABsQAQADAQEBAQAAAAAAAAAAAAEAESFBURAx/9oACAEBAAE/IXgons6aOwnWl3TBNu9xqUQcch+ISAbgImnOp8n/2gAMAwEAAgADAAAAEDcoAv/EABYRAQEBAAAAAAAAAAAAAAAAAABhAf/aAAgBAwEBPxCOoq6rr//EABcRAAMBAAAAAAAAAAAAAAAAAAARUQH/2gAIAQIBAT8QSjyiQSH/xAAfEAEAAwACAQUAAAAAAAAAAAABABEhMUGhUWFxkfD/2gAIAQEAAT8QIMipjCPV4XYBzR3DxQconzNow2G17Z4lxF51X+oAsjUUX4ho0LC30GWlpg54Z+wT/9k=","aspectRatio":1,"src":"/static/f56e51cac14719be4f33b4f802a1de49/1dc0b/devsecops1.jpg","srcSet":"/static/f56e51cac14719be4f33b4f802a1de49/3a5ce/devsecops1.jpg 163w,\n/static/f56e51cac14719be4f33b4f802a1de49/05730/devsecops1.jpg 327w,\n/static/f56e51cac14719be4f33b4f802a1de49/1dc0b/devsecops1.jpg 653w,\n/static/f56e51cac14719be4f33b4f802a1de49/f72c7/devsecops1.jpg 980w,\n/static/f56e51cac14719be4f33b4f802a1de49/0ff54/devsecops1.jpg 1200w","srcWebp":"/static/f56e51cac14719be4f33b4f802a1de49/0acdf/devsecops1.webp","srcSetWebp":"/static/f56e51cac14719be4f33b4f802a1de49/ac59e/devsecops1.webp 163w,\n/static/f56e51cac14719be4f33b4f802a1de49/7660b/devsecops1.webp 327w,\n/static/f56e51cac14719be4f33b4f802a1de49/0acdf/devsecops1.webp 653w,\n/static/f56e51cac14719be4f33b4f802a1de49/75470/devsecops1.webp 980w,\n/static/f56e51cac14719be4f33b4f802a1de49/9000d/devsecops1.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%2062v63h3c3%201%204%201%204-12v-11l1-2v-2c2%200%202%202%202%2015v15l10%205%2021%2012c6%206%2010%207%2010%206%200-2%202-1%202%202s7%2011%207%208l1-7v-5l-3-1c-3-1-4-1-4-4s0-4-3-4-3-2%200-2c2%200%203-1%203-4%200-4%200-5%203-5l4%201c1%201%201%200%201-2%200-3-2-6-4-5l-2%203-1%202c-2%200-1-5%201-6%201-2%203-2%205-2%203%201%203%201%203-3v-3c2%200%202%2010%200%2011l-1%203c0%202%200%202%201%201l2-2%202%201v12l-1%209-1-4-1%201c1%204-1%206-2%202-1-1-1%203-1%209%200%208%200%209%201%202%200-8%200-9%203-7%202%202%202%203%202%2011%200%2011%200%2015%203%2016%203%200%203%200%203-12%201-15%202-15%203%200v12h3l12%202%2010%201h10l9-1v-2c-2-1-2-2-1-6l1-5v-7l-2-2h2v-2c-2-2-3-4%200-2%201%201%201%201%201-1l-1-2v-2l-1-6c-1-3-1-3%201-3%201%200%202-1%202-3l-1-2-1-1c-1-1-2-2-7-2-6-1-6-1-2-6l3-4%2010%202%2014%201%204%201-4%204-5%203c-2-2-3%201-3%207%201%205%201%205%202%203s1-2%201%200v14h-1c-2-2-3%200-3%208%200%207%201%208%202%207%203-1%206-1%2021%201l15%202%206-3c6-3%2014-4%2019-1%201%200%203-2%205-7%204-8%2014-21%2017-22l5-3%2010-4%209-5%202-3h-2l-37-8c-1%200%201-3%205-6l4-3%2019%204%2020%205c2%200%202%200%202-3l1-2v3l2%203%201-3c0-2%200-3%201-2l1%203v2c2%200%202-1%202-3l1-3%201%202c0%202%201%202%204%200s6-2%2011-1c3%200%204%202%201%202l-3%201%202%201c2-1%202%200%202%205l2%202c2%201%202%201%202-1%200-5%203-16%208-25a147%20147%200%2001108-76l1%2030v31l-3%201a247%20247%200%2000-32%209c-2%200-2%200-1%202v1c-1%200-2%200-1-1l-2-1-3%201v2c1%201%200%202-2%201l-1%201h-2l-2%201v1l-5%202c-4%202-4%202-2%202h3l2-1%203-2c1%200%203%205%201%206v3c0%203-18%2011-19%208l-2-2-1%201c3%204-8%209-11%206-2-1-2-1-2%201%201%202%200%202-4%204l-3%203%209-4%203-1%2012-5%202-1%2010-3%209-2%201-2-1-3-1-6c0-4%201-4%203-5l7-2h6l1%201v-1l2-2c3-1%205-1%205%202l1%201v-2l1-3%201%202c-1%202%200%202%202%202%201%200%202%200%201-2l-1-1-1-1%2011-3c2%200%200%204-2%204l-1%201v2l-1%201h-1l-3%202c-2%200-2%200%200%201l-9%204-12%204v6l1-3c1-2%205-5%208-4h1l9-2c2%201%201%203-2%204l-3%201%208-1%207-1c-1%200-5%2012-4%2013l-4%202c-5%201-6%203-6%2012l-1%203-4%203c-2%203-4%204-9%205-6%201-7%202-7%203l-1%204c-3%203-1%203%207%200l5-1h-5c-7%201-4-1%204-2%206-1%207-1%206-3l1-2c3%202%201%205-3%206l-4%201h5c3%200%204%200%203%201h-3v2l-1%202v-1l-1-1-2%202c0%203%200%203-1%200s-2-3-5-2l-3%203-2%204c-1%201-1%201%205%201h5l-1%201v1c-2%201-2%201-1%202l-4%202c-8%202-10%203-8%205%203%202%2028-3%2029-6%201-2%202-2%209-4%205%200%205-2%205%2039v35h-14v7l-1%207c-1%200-2-10-1-25%200-8%200-8-2-7h-4c0-1%201-2%203-2h3v-13h-5a454%20454%200%2000-13%200c-1-2%200-3%2010-3h5l-1%201c4%202%204%201%204-3v-4l-10%201-11%201-1%2025-1%2020c-1-4-1-4-1%203l1%207h6l7%201h-8l-9-1c-1-1-1%200-1%204%200%208%201%208%2014%207l10%201v1c2%200%202%201%202%203%200%203%200%203-2%202h-1c1%202%200%202-2%202s-3%200-2%201l2%201-2%201c-1-1-2%200-2%201-1%202-3%203-3%200l-1%201v2l-14%201c-14%200-15%200-15-2h-1c-1%202-3%202-10%202-10%200-10%200-7-5%202-3%202-3%203-1s1%202%203%200l2-4%202-3%201-1h-4l-1%202c-3%200-6%203-8%208l-1%204h-11l-19-2c-11-1-16-1-9%201%204%201%203%201-8%201l-13-1-11-3-1-1h-5c0%201%204%203%2010%204%205%201%204%201-6%201l-15-1h-4l-9%201c-10%200-10-1-1-2%209%200%207-1-2-1-7%200-8%200-8%202v1l-1-1-11-1-59%202H87l1-2c0-3%200-3-3-3s-3%200-2%203l1%202h-9c-5%200-9%200-8-1s3-18%201-18l-1%204c-1%203-1%204-4%204-2%200-3%200-3-2-1-1-1-1-1%201s1%202%203%202%203%200%202%201l1%203c1%201%201%201-3%201h-5v-30H39v31l6-1%2014%201%208%201-4%201-15%202H37v-34h-3c-2%200-2%200-1-1l4-1h2l-1-1-1-34v-34l-4%201c-3%202-4%202-4%201%201-2-3-3-5-2-1%202-2%2024-1%2026v3c0%203-1%203-5%202-12-1-11%200-11-7%200-5%200-6-1-3l-1%202-3-2c-2-1-2%200-2%2079v80l3-1c3%200%203%201%200%202l-3%201v37h6c7%200%209-1%209-3%200-3%204-5%207-4l8%201h6l-3-2-3-1h3c5%201%2011%200%2014-3%204-3%204-1%200%203-2%203-8%206-11%206l-4%202c-2%201%201%201%2027%201h29l1-3%204-3h3l-3-1c-2-2-3-2-3%200h-2c-1-3%202-4%206-2%202%202%204%202%209%202h7l-1-2-1-6v-4l1%204%201%203c0-3%202%201%202%205%200%205%201%207%207%207h4l-5-7a3545%203545%200%2000-22-32l30-1%2030%201%206%204c5%205%208%206%206%202l2-1%209-2%204-1-12%201c-2%200-3%200-2-1s16-4%2017-2h14l10-1%206%204%206%206%201%201%2013%209c0%201-8%203-36%208-14%203-16%204-16%205l2%203c2%200%202%200%201%201-2%201-2%201%201%201l5%201%204%201c3%200%203%200%202-1v-2l2%202c1%201%2028%202%2028%200%200-1-3-2-7-1-6%201-7%201-7-3%200-1%200-2-1-1%200%203-1%202-5-1-3-4-3-4-1-4%204-1%205-1%206%202%201%202%201%202%206%202%205-1%205-1%208%202l3%204%206%201h6l-2-2c-3-4%200-4%205-1l4%203h151l-1-137V125l-4%201h-3l4-2h4V0H0v62m243%2077c-5%206-8%2017-6%2025l1%204v-5c0-5%202-5%203-1%201%208%203%2012%204%2012l1%201c-1%201%202%205%204%205l3-3c8-8%207-29%200-38-4-4-6-4-10%200m42%202l-3%203v1h1l1%201-1%201-1%207-1%207-1-4c0-2%200-3-4-3h-5c-1%200-2%202-2%207l-3%2013c-4%207-4%206%201%206%204-1%204%200%201%204-3%202-4%202-9%202-16%200-20-2-24-11l-2-2-1%202c-2-1-3%200-2%204%202%206%202%207%205%209%202%201%201%201-3%202l-8%202c-2%200-2%200%200%202s2%202%209%201l12-2c3%200%203%200%203-3%200-5%202-5%202-1v4h6l2-1%201%201%205%201h7l2%201%201%201h3l2%201-1%201c-1%200-1%201%201%201%201%201%201%201-1%201l-2-1h-36l17%202%2021%202c5%200%205%200%205-2s-1-3-2-3l1-1%201-1v-3l-1-2c1-1%200-1-2-1l-3-1h4c3%200%203%201%203%202l1%202%201-1v-1l1%202%201%201-1%201-2%201h2c2%200%202%200%202%202v1l1%201%202%203c3%202%201%203-3%201-2-1-4%200-5%201l-5%201v-1l-18-2-22-1%206%201c5%200%206%200%203%201l-4%201%205%205%205%205v-4l1-4c1-1%201%209%201%2028l1%2038%201%204h-7l-5%201a1508%201508%200%200124%204c4%200%204%200%204-3%200-2-1-3-2-3l-2-1h2c2%200%203-6%201-6l-4-1-1%206v6l-1-7v-6l7%201h7v-53h-7c-5%200-6%200-4-1h-5c-4%200-4%200-4%204%200%205%203%2012%207%2018l3%204%204%204c2%201%203%205%201%205s-1%202%201%202c1%201%201%201-1%201-1%201-2%200-2-1%200-2-3%202-3%205%200%201%200%202-1%201-1-2-3-1-3%203l-1%204-2-3-1-3v3c0%202%200%202-1%201-1-2-1-1-1%204a901%20901%200%2001-1-54c-1-3%200-3%209-4a462%20462%200%200130%200l-1%202-19%203c8%200%208-1%208%2029v27h3c10%202%2011%202%2015-2%205-5%209-6%2029-7%2019-1%2019-1%2018-7%200-4%200-4-5-4l-10-1h5l10-1-5-1h-7l6-1h6v-34l-6-2-15-6-11-4a504%20504%200%200011-4l4-1h-5l-4%201-6%201-6%201c-2%200-2%200-1-1l5-2%204-1h4l18-3%2021-3h14c1%202%200%203-3%203l-2%201-6%201-9%201c-1%201%200%201%205%201a975%20975%200%2000-6%204l-1%201%2019-1h6v-8c0-7%200-8-2-8a480%20480%200%2001-45%207%202717%202717%200%2001-38%204c0-3%201-4%205-4%203%200%203-1-1-5-8-9-14-20-15-30v-16l-1%203M1%20143l3%203c24%205%2054%2021%2061%2032l3%203c0-8-22-24-44-32l-23-6m83%205c-3%200-4%202-3%205%200%202%200%202-1%201h-1l3%205%203%203%202-2%202-1c1%201%203-2%203-5%200-1%200-2%201-1l1-1-1-1-4-2-3-2-2%201m-83%202c0%201%201%202%203%202l4%201%2012%204c15%205%2025%2010%2030%2016%203%203%205%205%204%206h2c-1%201%202%207%204%207%201%201%201%201-1%201-2%201-2%200-4-2%200-2-3-4-5-6-11-6-49-17-49-13l4%201%205%202%203%201c5%200%2024%206%2028%208a84%2084%200%200117%2012c1%201%201%201-1%201l-16-4-2%201%204%201%204%202c1%201-4%203-6%202s-2%200-2%2010v11l3%201%207%205%203%203v-4c0-5%202-15%205-21v-4l1-1%203%203c1%202%201%202%201%200l1-2v-1l-3-2c-1-3-1-3%203-4%202-1%203-1%203%201v4c1%202%202-3%201-7-3-11-27-25-52-32l-14-3m162%2047c-5%203-7%2012-3%2012v1l-2%201h2v1l-2%201h1l1%201v1a516%20516%200%200012%203l2%202v-2c0-2%200-2%201-1h1c0-3-6-9-8-7h-3v-1l1-3c0-3%200-4-2-4s-1-3%202-4c3-2%201-2-3-1m30%201l-5%201%204%201c2-1%203%200%203%201l7%201c6%200%206%200%200%201-4%201-6%203-3%203%201%200%202%201%201%202l-2%201c-2%200-4%202-2%203l7%201c4%200%204%200%202%201l-3%201%202%201c2%201%202%201%201%202v1c1%200%203%206%203%2013l-1%204c0-4-7-4-8%200-1%202%200%202%203%202l4%201-5%201c-5-1-7%200-7%203%200%202%201%202%205%202h6l-5%201c-5%200-6%200-6%202h3c1-1%201-1%201%201s-1%202-4%202c-4-1-5%200-2%202h4c4%200%203%203-1%203l-4%201h9v-3c1-4%201-4%204-3v1l-2%202%202%201%201%201%201%202v2c-1%201-1%203%201%203v-1c-1-2%203-2%209-1l3%201-3%201h1l2%202%202%202-1%201c-2%201-2%201%200%201%204%200%206-5%202-6h3l5-1c1-2%204-2%204-1l-1%202h-2v4l-1%201%202%201%201-1v-1c1-1%201%200%201%201l-2%202%203%201c5%202%207%201%207-2-1-1%200-2%201-2l1%204c0%202%200%203%202%203l1-6c0-4%200-5-1-4-3%202-6%200-5-2%201-3%206-3%206%200h1c2-2%203-1%202%201%200%202%200%202%202%202s2%200%202-25c0-13%200-24-1-23%200%202-1%202-4-1-4-4-4-4-10-4-11%200-22-4-31-11l-7-4-8%201m-130%209c0%207-1%2013-3%2013l-1-3-1%206c0%209%200%2010%203%2015l3%206c0%206%207%203%2011-4%203-6%205-12%203-13-1-1-1%200-1%203%200%206-9%2014-9%207%200-2%200-2-1%201-2%205-3%204-3-3v-8c-1%200%205-4%208-4%202%200%202%200%201-1l-2-1-3%201h-3l1-1%201-1-1-2v-1c1%200%201-2-1-4-1-2-1-2%201-2v-2l-1-1-1-1v-4l-1-2v6m86%203c-3%203-5%2010-5%2018-1%2016%206%2029%2010%2019%201-3%202-4%203-2l-4%207c-2%201%201%202%203%201v-1c-1-1%200-1%202-1l4%201c1%201%203%200%203-1s-1-2-3-2l-1-2v-3c-2-1-8-2-8%200l-2%201c-4%200-5-4-6-13%200-7%201-15%203-15l1-1%203-1c3%200%204-1%204-3%200-3-3-4-7-2m-38%202c-4%200-4%204%200%204l4%201c2%200%202%200%202-2%200-4%202%202%202%208v4c-1-3-1-3-1-1l-1%206c0%203%200%203%201%202h1l1%201%201-1%202-3%201-3-2-1-1-11c-1-5-2-5-10-4m66%2016l-1%208-1%203v-3l-1-3c-2%200-2%202-2%206l-2%201-1%201c0%201%203%200%205-2h1c0%202-2%204-5%204-1%200-2%201-2%203v3l1%205v5l1-3c0-2%201-3%203-4l3-1h-6l2-2c3-4%206-14%206-21l-1-5v5m123-3c-1%202-1%203%201%205l4%207%203%203%203%201c1%201%200%202-5%202-8%200-7%201%202%201%208%200%2012-1%208-3l-2-1c-3%200-2-1%201-1l3-1-6-1c-5%201-5%201-4-1%202-1%200-6-4-11-3-3-3-3-4%200M39%20238v11h19c0-1-3-8-8-15-4-7-5-8-8-8l-3%201v11m291-11l-2%201-3%201%203%201c2%200%203%201%201%204%200%201-1%202-3%202-3%200-4%201-4%202-1%202-1%202%201%202l7%201-5%201c-3%200-3%200-3%202%200%203%200%203%205%203%202%200%204%200%203-1l-2-1c-4%200-1-1%204-2%206%200%207-1%207-3h-1c-1%202-7%202-7%200l-2-1c-1%200-1-1%201-2%203-1%203-1%202-2s-1-1%201-1%203-3%201-4c-3-1-2-3%200-3%202-1%202-1-1-1l-3%201M94%20241l1%207c0%204%200%204%203%204l3-2c0-2-1-2-3-1-1%201-1%201-1-3%200-5%201-5%203-5s3%200%203%205v6h7c9%200%2010-1%209-3-1-1-1-2%201-3l1-4c0-2%200-2%201%201l1%202%201%202v4l2-1%203-2c2%200%202%200%201%201-3%200-2%202%200%203l2-1c-1-2%202-4%206-4%205%200%206%200%204-5l-1-3h-24c-23%200-24%200-23%202m194%2031c-1%205-1%206%201%206l1%201h-2l-1%201%205%203c4%201%204%201%204-1l2-4-2-2-1-2h2c1%201%204%200%203-1l-12-1M16%20316v8c0%205%201%206%203%206%207%201%2011-8%206-13-2-2-8-3-9-1m67%201c-3%203-3%207%200%2010%204%205%2010%202%2010-4%200-7-6-10-10-6m15%202c-2%200-2%201-2%208l1%207%201-2c0-2%200-3%201-2%205%201%209-9%204-11l-2-1-3%201m-41%2042l6%2014c6%2012%209%2015%209%2010%200-2%203-1%205%203l3%205%202%204%201%201%201-1h1l1-4-4-8-4-9-2-5c-1-4-1-4%202-4%202%200%203%200%203-2h-4c-3%200-4%200-3-1l5-1c4%200%208-1%206-2H57m75%202c-10%202-9%201-9%2010%200%206%200%208%202%208l1-1%202-2%201%202v2l2-3%202-4%201-4%202-6c2-3%202-3-4-2m76%207c1%205%206%2010%2010%2010l2-1v-4c0-2-1-3-5-6-7-5-7-5-7%201m-20%201h-12c1%202-2%203-3%201-2-1-4-2-4%200%200%201%2017%2014%2019%2014v-2c-3-2-1-3%201%200h8c7-1%208-2%206-4-3-2-2-5%200-5s2%200-2-3l-4-3-9%202m-35%201l-6%201c-4%200-4%200-4%203%201%203%200%203-3-1-5-7-6%200-1%2017l2%208h12l-7-8c-9-10-10-12-8-13l4%201c2%202%206%202%207%200l-1-2c-2-1%201-3%205-4l4-2h-4'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"narrow":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAMEAQIF/8QAFQEBAQAAAAAAAAAAAAAAAAAAAQD/2gAMAwEAAhADEAAAAeRLfwMqIOlcaqK//8QAHBAAAgICAwAAAAAAAAAAAAAAAQIAAxESEyEi/9oACAEBAAEFAijKaqTYSKUgbILTkxK+zf4O7T//xAAWEQADAAAAAAAAAAAAAAAAAAAAARL/2gAIAQMBAT8BlksplM//xAAWEQEBAQAAAAAAAAAAAAAAAAARABD/2gAIAQIBAT8BcIv/xAAfEAACAQQCAwAAAAAAAAAAAAAAARECITFhEyJBUXH/2gAIAQEABj8CuheKfZHGn9O0TsytF4q2NMsZP//EABsQAQADAQEBAQAAAAAAAAAAAAEAESFBURAx/9oACAEBAAE/IXgons6aOwnWl3TBNu9xqUQcch+ISAbgImnOp8n/2gAMAwEAAgADAAAAEDcoAv/EABYRAQEBAAAAAAAAAAAAAAAAAABhAf/aAAgBAwEBPxCOoq6rr//EABcRAAMBAAAAAAAAAAAAAAAAAAARUQH/2gAIAQIBAT8QSjyiQSH/xAAfEAEAAwACAQUAAAAAAAAAAAABABEhMUGhUWFxkfD/2gAIAQEAAT8QIMipjCPV4XYBzR3DxQconzNow2G17Z4lxF51X+oAsjUUX4ho0LC30GWlpg54Z+wT/9k=","aspectRatio":1,"src":"/static/f56e51cac14719be4f33b4f802a1de49/eaa58/devsecops1.jpg","srcSet":"/static/f56e51cac14719be4f33b4f802a1de49/5a3ee/devsecops1.jpg 114w,\n/static/f56e51cac14719be4f33b4f802a1de49/41f8f/devsecops1.jpg 229w,\n/static/f56e51cac14719be4f33b4f802a1de49/eaa58/devsecops1.jpg 457w,\n/static/f56e51cac14719be4f33b4f802a1de49/c309b/devsecops1.jpg 686w,\n/static/f56e51cac14719be4f33b4f802a1de49/e3008/devsecops1.jpg 914w,\n/static/f56e51cac14719be4f33b4f802a1de49/0ff54/devsecops1.jpg 1200w","srcWebp":"/static/f56e51cac14719be4f33b4f802a1de49/15384/devsecops1.webp","srcSetWebp":"/static/f56e51cac14719be4f33b4f802a1de49/31fce/devsecops1.webp 114w,\n/static/f56e51cac14719be4f33b4f802a1de49/e3e25/devsecops1.webp 229w,\n/static/f56e51cac14719be4f33b4f802a1de49/15384/devsecops1.webp 457w,\n/static/f56e51cac14719be4f33b4f802a1de49/0258d/devsecops1.webp 686w,\n/static/f56e51cac14719be4f33b4f802a1de49/64ea2/devsecops1.webp 914w,\n/static/f56e51cac14719be4f33b4f802a1de49/9000d/devsecops1.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%2062v63h3c3%201%204%201%204-12v-11l1-2v-2c2%200%202%202%202%2015v15l10%205%2021%2012c6%206%2010%207%2010%206%200-2%202-1%202%202s7%2011%207%208l1-7v-5l-3-1c-3-1-4-1-4-4s0-4-3-4-3-2%200-2c2%200%203-1%203-4%200-4%200-5%203-5l4%201c1%201%201%200%201-2%200-3-2-6-4-5l-2%203-1%202c-2%200-1-5%201-6%201-2%203-2%205-2%203%201%203%201%203-3v-3c2%200%202%2010%200%2011l-1%203c0%202%200%202%201%201l2-2%202%201v12l-1%209-1-4-1%201c1%204-1%206-2%202-1-1-1%203-1%209%200%208%200%209%201%202%200-8%200-9%203-7%202%202%202%203%202%2011%200%2011%200%2015%203%2016%203%200%203%200%203-12%201-15%202-15%203%200v12h3l12%202%2010%201h10l9-1v-2c-2-1-2-2-1-6l1-5v-7l-2-2h2v-2c-2-2-3-4%200-2%201%201%201%201%201-1l-1-2v-2l-1-6c-1-3-1-3%201-3%201%200%202-1%202-3l-1-2-1-1c-1-1-2-2-7-2-6-1-6-1-2-6l3-4%2010%202%2014%201%204%201-4%204-5%203c-2-2-3%201-3%207%201%205%201%205%202%203s1-2%201%200v14h-1c-2-2-3%200-3%208%200%207%201%208%202%207%203-1%206-1%2021%201l15%202%206-3c6-3%2014-4%2019-1%201%200%203-2%205-7%204-8%2014-21%2017-22l5-3%2010-4%209-5%202-3h-2l-37-8c-1%200%201-3%205-6l4-3%2019%204%2020%205c2%200%202%200%202-3l1-2v3l2%203%201-3c0-2%200-3%201-2l1%203v2c2%200%202-1%202-3l1-3%201%202c0%202%201%202%204%200s6-2%2011-1c3%200%204%202%201%202l-3%201%202%201c2-1%202%200%202%205l2%202c2%201%202%201%202-1%200-5%203-16%208-25a147%20147%200%2001108-76l1%2030v31l-3%201a247%20247%200%2000-32%209c-2%200-2%200-1%202v1c-1%200-2%200-1-1l-2-1-3%201v2c1%201%200%202-2%201l-1%201h-2l-2%201v1l-5%202c-4%202-4%202-2%202h3l2-1%203-2c1%200%203%205%201%206v3c0%203-18%2011-19%208l-2-2-1%201c3%204-8%209-11%206-2-1-2-1-2%201%201%202%200%202-4%204l-3%203%209-4%203-1%2012-5%202-1%2010-3%209-2%201-2-1-3-1-6c0-4%201-4%203-5l7-2h6l1%201v-1l2-2c3-1%205-1%205%202l1%201v-2l1-3%201%202c-1%202%200%202%202%202%201%200%202%200%201-2l-1-1-1-1%2011-3c2%200%200%204-2%204l-1%201v2l-1%201h-1l-3%202c-2%200-2%200%200%201l-9%204-12%204v6l1-3c1-2%205-5%208-4h1l9-2c2%201%201%203-2%204l-3%201%208-1%207-1c-1%200-5%2012-4%2013l-4%202c-5%201-6%203-6%2012l-1%203-4%203c-2%203-4%204-9%205-6%201-7%202-7%203l-1%204c-3%203-1%203%207%200l5-1h-5c-7%201-4-1%204-2%206-1%207-1%206-3l1-2c3%202%201%205-3%206l-4%201h5c3%200%204%200%203%201h-3v2l-1%202v-1l-1-1-2%202c0%203%200%203-1%200s-2-3-5-2l-3%203-2%204c-1%201-1%201%205%201h5l-1%201v1c-2%201-2%201-1%202l-4%202c-8%202-10%203-8%205%203%202%2028-3%2029-6%201-2%202-2%209-4%205%200%205-2%205%2039v35h-14v7l-1%207c-1%200-2-10-1-25%200-8%200-8-2-7h-4c0-1%201-2%203-2h3v-13h-5a454%20454%200%2000-13%200c-1-2%200-3%2010-3h5l-1%201c4%202%204%201%204-3v-4l-10%201-11%201-1%2025-1%2020c-1-4-1-4-1%203l1%207h6l7%201h-8l-9-1c-1-1-1%200-1%204%200%208%201%208%2014%207l10%201v1c2%200%202%201%202%203%200%203%200%203-2%202h-1c1%202%200%202-2%202s-3%200-2%201l2%201-2%201c-1-1-2%200-2%201-1%202-3%203-3%200l-1%201v2l-14%201c-14%200-15%200-15-2h-1c-1%202-3%202-10%202-10%200-10%200-7-5%202-3%202-3%203-1s1%202%203%200l2-4%202-3%201-1h-4l-1%202c-3%200-6%203-8%208l-1%204h-11l-19-2c-11-1-16-1-9%201%204%201%203%201-8%201l-13-1-11-3-1-1h-5c0%201%204%203%2010%204%205%201%204%201-6%201l-15-1h-4l-9%201c-10%200-10-1-1-2%209%200%207-1-2-1-7%200-8%200-8%202v1l-1-1-11-1-59%202H87l1-2c0-3%200-3-3-3s-3%200-2%203l1%202h-9c-5%200-9%200-8-1s3-18%201-18l-1%204c-1%203-1%204-4%204-2%200-3%200-3-2-1-1-1-1-1%201s1%202%203%202%203%200%202%201l1%203c1%201%201%201-3%201h-5v-30H39v31l6-1%2014%201%208%201-4%201-15%202H37v-34h-3c-2%200-2%200-1-1l4-1h2l-1-1-1-34v-34l-4%201c-3%202-4%202-4%201%201-2-3-3-5-2-1%202-2%2024-1%2026v3c0%203-1%203-5%202-12-1-11%200-11-7%200-5%200-6-1-3l-1%202-3-2c-2-1-2%200-2%2079v80l3-1c3%200%203%201%200%202l-3%201v37h6c7%200%209-1%209-3%200-3%204-5%207-4l8%201h6l-3-2-3-1h3c5%201%2011%200%2014-3%204-3%204-1%200%203-2%203-8%206-11%206l-4%202c-2%201%201%201%2027%201h29l1-3%204-3h3l-3-1c-2-2-3-2-3%200h-2c-1-3%202-4%206-2%202%202%204%202%209%202h7l-1-2-1-6v-4l1%204%201%203c0-3%202%201%202%205%200%205%201%207%207%207h4l-5-7a3545%203545%200%2000-22-32l30-1%2030%201%206%204c5%205%208%206%206%202l2-1%209-2%204-1-12%201c-2%200-3%200-2-1s16-4%2017-2h14l10-1%206%204%206%206%201%201%2013%209c0%201-8%203-36%208-14%203-16%204-16%205l2%203c2%200%202%200%201%201-2%201-2%201%201%201l5%201%204%201c3%200%203%200%202-1v-2l2%202c1%201%2028%202%2028%200%200-1-3-2-7-1-6%201-7%201-7-3%200-1%200-2-1-1%200%203-1%202-5-1-3-4-3-4-1-4%204-1%205-1%206%202%201%202%201%202%206%202%205-1%205-1%208%202l3%204%206%201h6l-2-2c-3-4%200-4%205-1l4%203h151l-1-137V125l-4%201h-3l4-2h4V0H0v62m243%2077c-5%206-8%2017-6%2025l1%204v-5c0-5%202-5%203-1%201%208%203%2012%204%2012l1%201c-1%201%202%205%204%205l3-3c8-8%207-29%200-38-4-4-6-4-10%200m42%202l-3%203v1h1l1%201-1%201-1%207-1%207-1-4c0-2%200-3-4-3h-5c-1%200-2%202-2%207l-3%2013c-4%207-4%206%201%206%204-1%204%200%201%204-3%202-4%202-9%202-16%200-20-2-24-11l-2-2-1%202c-2-1-3%200-2%204%202%206%202%207%205%209%202%201%201%201-3%202l-8%202c-2%200-2%200%200%202s2%202%209%201l12-2c3%200%203%200%203-3%200-5%202-5%202-1v4h6l2-1%201%201%205%201h7l2%201%201%201h3l2%201-1%201c-1%200-1%201%201%201%201%201%201%201-1%201l-2-1h-36l17%202%2021%202c5%200%205%200%205-2s-1-3-2-3l1-1%201-1v-3l-1-2c1-1%200-1-2-1l-3-1h4c3%200%203%201%203%202l1%202%201-1v-1l1%202%201%201-1%201-2%201h2c2%200%202%200%202%202v1l1%201%202%203c3%202%201%203-3%201-2-1-4%200-5%201l-5%201v-1l-18-2-22-1%206%201c5%200%206%200%203%201l-4%201%205%205%205%205v-4l1-4c1-1%201%209%201%2028l1%2038%201%204h-7l-5%201a1508%201508%200%200124%204c4%200%204%200%204-3%200-2-1-3-2-3l-2-1h2c2%200%203-6%201-6l-4-1-1%206v6l-1-7v-6l7%201h7v-53h-7c-5%200-6%200-4-1h-5c-4%200-4%200-4%204%200%205%203%2012%207%2018l3%204%204%204c2%201%203%205%201%205s-1%202%201%202c1%201%201%201-1%201-1%201-2%200-2-1%200-2-3%202-3%205%200%201%200%202-1%201-1-2-3-1-3%203l-1%204-2-3-1-3v3c0%202%200%202-1%201-1-2-1-1-1%204a901%20901%200%2001-1-54c-1-3%200-3%209-4a462%20462%200%200130%200l-1%202-19%203c8%200%208-1%208%2029v27h3c10%202%2011%202%2015-2%205-5%209-6%2029-7%2019-1%2019-1%2018-7%200-4%200-4-5-4l-10-1h5l10-1-5-1h-7l6-1h6v-34l-6-2-15-6-11-4a504%20504%200%200011-4l4-1h-5l-4%201-6%201-6%201c-2%200-2%200-1-1l5-2%204-1h4l18-3%2021-3h14c1%202%200%203-3%203l-2%201-6%201-9%201c-1%201%200%201%205%201a975%20975%200%2000-6%204l-1%201%2019-1h6v-8c0-7%200-8-2-8a480%20480%200%2001-45%207%202717%202717%200%2001-38%204c0-3%201-4%205-4%203%200%203-1-1-5-8-9-14-20-15-30v-16l-1%203M1%20143l3%203c24%205%2054%2021%2061%2032l3%203c0-8-22-24-44-32l-23-6m83%205c-3%200-4%202-3%205%200%202%200%202-1%201h-1l3%205%203%203%202-2%202-1c1%201%203-2%203-5%200-1%200-2%201-1l1-1-1-1-4-2-3-2-2%201m-83%202c0%201%201%202%203%202l4%201%2012%204c15%205%2025%2010%2030%2016%203%203%205%205%204%206h2c-1%201%202%207%204%207%201%201%201%201-1%201-2%201-2%200-4-2%200-2-3-4-5-6-11-6-49-17-49-13l4%201%205%202%203%201c5%200%2024%206%2028%208a84%2084%200%200117%2012c1%201%201%201-1%201l-16-4-2%201%204%201%204%202c1%201-4%203-6%202s-2%200-2%2010v11l3%201%207%205%203%203v-4c0-5%202-15%205-21v-4l1-1%203%203c1%202%201%202%201%200l1-2v-1l-3-2c-1-3-1-3%203-4%202-1%203-1%203%201v4c1%202%202-3%201-7-3-11-27-25-52-32l-14-3m162%2047c-5%203-7%2012-3%2012v1l-2%201h2v1l-2%201h1l1%201v1a516%20516%200%200012%203l2%202v-2c0-2%200-2%201-1h1c0-3-6-9-8-7h-3v-1l1-3c0-3%200-4-2-4s-1-3%202-4c3-2%201-2-3-1m30%201l-5%201%204%201c2-1%203%200%203%201l7%201c6%200%206%200%200%201-4%201-6%203-3%203%201%200%202%201%201%202l-2%201c-2%200-4%202-2%203l7%201c4%200%204%200%202%201l-3%201%202%201c2%201%202%201%201%202v1c1%200%203%206%203%2013l-1%204c0-4-7-4-8%200-1%202%200%202%203%202l4%201-5%201c-5-1-7%200-7%203%200%202%201%202%205%202h6l-5%201c-5%200-6%200-6%202h3c1-1%201-1%201%201s-1%202-4%202c-4-1-5%200-2%202h4c4%200%203%203-1%203l-4%201h9v-3c1-4%201-4%204-3v1l-2%202%202%201%201%201%201%202v2c-1%201-1%203%201%203v-1c-1-2%203-2%209-1l3%201-3%201h1l2%202%202%202-1%201c-2%201-2%201%200%201%204%200%206-5%202-6h3l5-1c1-2%204-2%204-1l-1%202h-2v4l-1%201%202%201%201-1v-1c1-1%201%200%201%201l-2%202%203%201c5%202%207%201%207-2-1-1%200-2%201-2l1%204c0%202%200%203%202%203l1-6c0-4%200-5-1-4-3%202-6%200-5-2%201-3%206-3%206%200h1c2-2%203-1%202%201%200%202%200%202%202%202s2%200%202-25c0-13%200-24-1-23%200%202-1%202-4-1-4-4-4-4-10-4-11%200-22-4-31-11l-7-4-8%201m-130%209c0%207-1%2013-3%2013l-1-3-1%206c0%209%200%2010%203%2015l3%206c0%206%207%203%2011-4%203-6%205-12%203-13-1-1-1%200-1%203%200%206-9%2014-9%207%200-2%200-2-1%201-2%205-3%204-3-3v-8c-1%200%205-4%208-4%202%200%202%200%201-1l-2-1-3%201h-3l1-1%201-1-1-2v-1c1%200%201-2-1-4-1-2-1-2%201-2v-2l-1-1-1-1v-4l-1-2v6m86%203c-3%203-5%2010-5%2018-1%2016%206%2029%2010%2019%201-3%202-4%203-2l-4%207c-2%201%201%202%203%201v-1c-1-1%200-1%202-1l4%201c1%201%203%200%203-1s-1-2-3-2l-1-2v-3c-2-1-8-2-8%200l-2%201c-4%200-5-4-6-13%200-7%201-15%203-15l1-1%203-1c3%200%204-1%204-3%200-3-3-4-7-2m-38%202c-4%200-4%204%200%204l4%201c2%200%202%200%202-2%200-4%202%202%202%208v4c-1-3-1-3-1-1l-1%206c0%203%200%203%201%202h1l1%201%201-1%202-3%201-3-2-1-1-11c-1-5-2-5-10-4m66%2016l-1%208-1%203v-3l-1-3c-2%200-2%202-2%206l-2%201-1%201c0%201%203%200%205-2h1c0%202-2%204-5%204-1%200-2%201-2%203v3l1%205v5l1-3c0-2%201-3%203-4l3-1h-6l2-2c3-4%206-14%206-21l-1-5v5m123-3c-1%202-1%203%201%205l4%207%203%203%203%201c1%201%200%202-5%202-8%200-7%201%202%201%208%200%2012-1%208-3l-2-1c-3%200-2-1%201-1l3-1-6-1c-5%201-5%201-4-1%202-1%200-6-4-11-3-3-3-3-4%200M39%20238v11h19c0-1-3-8-8-15-4-7-5-8-8-8l-3%201v11m291-11l-2%201-3%201%203%201c2%200%203%201%201%204%200%201-1%202-3%202-3%200-4%201-4%202-1%202-1%202%201%202l7%201-5%201c-3%200-3%200-3%202%200%203%200%203%205%203%202%200%204%200%203-1l-2-1c-4%200-1-1%204-2%206%200%207-1%207-3h-1c-1%202-7%202-7%200l-2-1c-1%200-1-1%201-2%203-1%203-1%202-2s-1-1%201-1%203-3%201-4c-3-1-2-3%200-3%202-1%202-1-1-1l-3%201M94%20241l1%207c0%204%200%204%203%204l3-2c0-2-1-2-3-1-1%201-1%201-1-3%200-5%201-5%203-5s3%200%203%205v6h7c9%200%2010-1%209-3-1-1-1-2%201-3l1-4c0-2%200-2%201%201l1%202%201%202v4l2-1%203-2c2%200%202%200%201%201-3%200-2%202%200%203l2-1c-1-2%202-4%206-4%205%200%206%200%204-5l-1-3h-24c-23%200-24%200-23%202m194%2031c-1%205-1%206%201%206l1%201h-2l-1%201%205%203c4%201%204%201%204-1l2-4-2-2-1-2h2c1%201%204%200%203-1l-12-1M16%20316v8c0%205%201%206%203%206%207%201%2011-8%206-13-2-2-8-3-9-1m67%201c-3%203-3%207%200%2010%204%205%2010%202%2010-4%200-7-6-10-10-6m15%202c-2%200-2%201-2%208l1%207%201-2c0-2%200-3%201-2%205%201%209-9%204-11l-2-1-3%201m-41%2042l6%2014c6%2012%209%2015%209%2010%200-2%203-1%205%203l3%205%202%204%201%201%201-1h1l1-4-4-8-4-9-2-5c-1-4-1-4%202-4%202%200%203%200%203-2h-4c-3%200-4%200-3-1l5-1c4%200%208-1%206-2H57m75%202c-10%202-9%201-9%2010%200%206%200%208%202%208l1-1%202-2%201%202v2l2-3%202-4%201-4%202-6c2-3%202-3-4-2m76%207c1%205%206%2010%2010%2010l2-1v-4c0-2-1-3-5-6-7-5-7-5-7%201m-20%201h-12c1%202-2%203-3%201-2-1-4-2-4%200%200%201%2017%2014%2019%2014v-2c-3-2-1-3%201%200h8c7-1%208-2%206-4-3-2-2-5%200-5s2%200-2-3l-4-3-9%202m-35%201l-6%201c-4%200-4%200-4%203%201%203%200%203-3-1-5-7-6%200-1%2017l2%208h12l-7-8c-9-10-10-12-8-13l4%201c2%202%206%202%207%200l-1-2c-2-1%201-3%205-4l4-2h-4'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"seo":{"src":"/static/f56e51cac14719be4f33b4f802a1de49/0ff54/devsecops1.jpg"}}},{"id":"79f1f069-bbdb-5962-9786-3a737da58129","slug":"/esbuild-react-typescript-template","secret":false,"title":"Esbuild react typescript template","author":"Luke Celitan","date":"November 1st, 2021","dateForSEO":"2021-11-01T00:00:00.000Z","timeToRead":2,"excerpt":"Esbuild template with typescript, react, and tailwindcss","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\": \"Esbuild react typescript template\",\n  \"author\": \"Luke Celitan\",\n  \"date\": \"2021-11-01T00:00:00.000Z\",\n  \"hero\": \"./esbuildcover1.jpg\",\n  \"excerpt\": \"Esbuild template with typescript, react, and tailwindcss\",\n  \"category\": \"Project\",\n  \"tech\": [\"ReactIcon\", \"Tailwind\", \"TS\"]\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n    props = _objectWithoutProperties(_ref, _excluded);\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"div\", {\n    \"style\": {\n      \"display\": \"flex\",\n      \"justifyContent\": \"flex-start\",\n      \"gap\": \"10px\",\n      \"width\": \"100%\",\n      \"margin\": \"auto\",\n      \"maxWidth\": \"1150px\"\n    }\n  }, \"\\n  \", mdx(\"a\", {\n    parentName: \"div\",\n    \"href\": \"https://github.com/MassivDash/typescript-react-express-esbuild/\",\n    \"target\": \"_blank\"\n  }, \"\\n    \", mdx(\"img\", {\n    parentName: \"a\",\n    \"alt\": \"Version\",\n    \"src\": \"https://img.shields.io/badge/version-0.0.1-red.svg?cacheSeconds=2592000\"\n  }), \"\\n  \"), \"\\n  \", mdx(\"a\", {\n    parentName: \"div\",\n    \"href\": \"#\",\n    \"target\": \"_blank\"\n  }, \"\\n    \", mdx(\"img\", {\n    parentName: \"a\",\n    \"alt\": \"License: MIT\",\n    \"src\": \"https://img.shields.io/badge/License-MIT-yellow.svg\"\n  }), \"\\n  \"), \"\\n  \", mdx(\"a\", {\n    parentName: \"div\",\n    \"href\": \"https://twitter.com/spaceoutPL\",\n    \"target\": \"_blank\"\n  }, \"\\n    \", mdx(\"img\", {\n    parentName: \"a\",\n    \"alt\": \"Twitter: spaceoutPL\",\n    \"src\": \"https://img.shields.io/twitter/follow/spaceoutPL.svg?style=social\"\n  }), \"\\n  \")), mdx(\"h1\", {\n    \"id\": \"esbuild-template-with-typescript-react-and-tailwindcss\"\n  }, \"Esbuild template with typescript, react, and tailwindcss\"), mdx(\"h2\", {\n    \"id\": \"introduction\"\n  }, \"Introduction\"), mdx(\"p\", null, \"I\\u2019ve have been working with webpack for a very long time now, I am still using\\nthis solution for any proffesional (job) projects in my current employment, the\\nfine grain control it gives its a very fundmanetal for web development process.\"), mdx(\"p\", null, \"That being said, webpack with each iteration, with each new feature, niche bug\\nfix is becoming slower and slower. You can definetly see this in large\\nmonolithic projects using typescript. Some time ago I have come across a\\n\", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://esbuild.github.io/\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"esbuild bundler\"), \", the author promises to make\\nwebpack and other bundlers obsolete but is true ?\"), mdx(\"p\", null, \"In reality esbuild is way faster than webpack, but less stable and less\\ndeveloped ecosystem around the bundler. It\\u2019s biggest tradeoff and source of\\nspeed is dropping the es5 support, it only supports bundeling with es6 therefore\\ntargeting the modern browsers.\"), mdx(\"p\", null, mdx(\"span\", {\n    parentName: \"p\",\n    \"className\": \"gatsby-resp-image-wrapper\",\n    \"style\": {\n      \"position\": \"relative\",\n      \"display\": \"block\",\n      \"marginLeft\": \"auto\",\n      \"marginRight\": \"auto\",\n      \"maxWidth\": \"2092px\"\n    }\n  }, \"\\n      \", mdx(\"span\", {\n    parentName: \"span\",\n    \"className\": \"gatsby-resp-image-background-image\",\n    \"style\": {\n      \"paddingBottom\": \"90.05736137667304%\",\n      \"position\": \"relative\",\n      \"bottom\": \"0\",\n      \"left\": \"0\",\n      \"backgroundImage\": \"url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAASCAYAAABb0P4QAAAACXBIWXMAABYlAAAWJQFJUiTwAAACpUlEQVQ4y31US27bQAzVCVugSHuULrtp0Qv0HD1AgRRF993EvziKFUu2JFuOJOv/n3khR5ZiO0AJPJBDDTmP5Gg0z9vjUV/CXBswVjosc41eJKTs3gBX9iUEtDDwsDGX2Fo66Qc420ccQxdVeaQNRQ+UPciWIr8AlC6UhqihSSkhhETXCQiyWZqW1z3Pqm4RxRmSNEdR1ngVroBx7gG0sx1omhZJ7KMuI/pKwbJCmUeIQg9xdECeheQriUAfPCaSfXLOro0LCNhuCOfxJ+TTO8INhPEBMD+ecANYnyCN9yjXnxHvbtHmC1RVNSZkXDHsiB31rjGA2qCAB7Kf0BV6b7drNNmS+vBARFdo8o1q1TlTrW1b1HVNyRqw3bQCVUP5GO1Jn1DVvaZzaR8TkBjiWbNoURTBsixst1ulXdche4ONZZJtw3FsbDcWNie4tF4/GTgcPKRpAo4/Ho/IsqxnKE9jGjRvCIKAGi8QhiF836fgg7IZtm2r7/v9HnEc41q0iymRDIEd3RtOVpalajwzSJJEVcKaWfH383h5PmVmNDBkRhzAeghgVnyI53mKWZqmyvcm4TXloigUQ240sxokz3MVwMkG1pz0TckcxNT5tKEMBpfFPgazZt+gh32s+ftut6MBuupQjZt8d3eH5XKJ2WyGxWKB+/sF5vMZradk34/QdZ38c0wmE0ynUxWzWq1gGAZM01Qt0fj+cQnMNMtSsivkBZWTFer/jWOugAflKyRJhDA42XE03r9hqBc95Ftf5DFEy9eBXxlKnno4eDaegxRZ3uF/Ii//ZeDZT+AYt+icL8D+Ozr3K+B9A/wfqINfNJm/kMkfdNFv0rQv/TcO5uLavDqYZdO/b/SqdE0G0fXvXlv5EA29Nl2EhmzZHgnJ+DgMOV4AWVZkeQX2uPUAAAAASUVORK5CYII=')\",\n      \"backgroundSize\": \"cover\",\n      \"display\": \"block\"\n    }\n  }), \"\\n  \", mdx(\"picture\", {\n    parentName: \"span\"\n  }, \"\\n          \", mdx(\"source\", {\n    parentName: \"picture\",\n    \"srcSet\": [\"/static/37a21f47130422c48ab4a92eff362cc4/9c780/esbuildbenchmark.webp 2092w\"],\n    \"sizes\": \"(max-width: 2092px) 100vw, 2092px\",\n    \"type\": \"image/webp\"\n  }), \"\\n          \", mdx(\"source\", {\n    parentName: \"picture\",\n    \"srcSet\": [\"/static/37a21f47130422c48ab4a92eff362cc4/ffbc1/esbuildbenchmark.png 2092w\"],\n    \"sizes\": \"(max-width: 2092px) 100vw, 2092px\",\n    \"type\": \"image/png\"\n  }), \"\\n          \", mdx(\"img\", {\n    parentName: \"picture\",\n    \"className\": \"gatsby-resp-image-image\",\n    \"src\": \"/static/37a21f47130422c48ab4a92eff362cc4/ffbc1/esbuildbenchmark.png\",\n    \"alt\": \"esbuild_benchmark\",\n    \"title\": \"esbuild_benchmark\",\n    \"loading\": \"lazy\",\n    \"style\": {\n      \"width\": \"100%\",\n      \"height\": \"100%\",\n      \"margin\": \"0\",\n      \"verticalAlign\": \"middle\",\n      \"position\": \"absolute\",\n      \"top\": \"0\",\n      \"left\": \"0\"\n    }\n  }), \"\\n        \"), \"\\n    \")), mdx(\"p\", null, \"While constructing this template I have challanged myself to fully recrate the\\nstandard webpack development cycle, with linters, typescript and hot module\\nreloading. The hot module replacement was the main deal breaker for me, esbuild\\ncan rebuild the entire package fast, but there is no out of the box solution for\\nhot relead, the devloper is forced to hit the refresh button on each file\\nchange. Since that is a big no go, in my opinion, the hot module replacement is\\nthe most important feature of the bundler setup. With pure esbuild (and not\\nwanting anything from the webpack family), I was forced to look for some other\\nsolutions, unfortunately there are not many projects like this as\\nwebpack-dev-server seems to be a primary solution for this problem.\"), mdx(\"p\", null, \"The truth is that the webpack ecosytem and stableness far outweighs the speed of\\nesbuild. Hopefully with time the esbuild ecosystem will rise enough to provide\\nthe standard of DX that all the developers have currently with other more\\nproffesional open source bundlers or frameworks.\"), mdx(\"p\", null, \"You can get more info on esbuild\\n\", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://esbuild.github.io/faq/#why-is-esbuild-fast\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"here\")), mdx(\"h2\", {\n    \"id\": \"starter-kit\"\n  }, \"Starter kit\"), mdx(\"p\", null, \"React and Node.js template with esbuild, typescript, jest, testing libary,\\ntailwind React and Node.js and Typescript with only esbuild packages, starter is\\nstill experimental however fully functional. Since i opted to drop all webpack\\nand webpack family related packages the process of hooking up some kind of live\\nreload proved to be the most difficult to achieve. Project uses \\u201Cservor\\u201D\\npackage, it has a longer booting time than webpack-dev-server\"), mdx(\"p\", null, \"includes\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Server (express)\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Static React app with live reload\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Tailwind css (postCSS, Autoprefixer)\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Jest / react testing library\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Typescript\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"Eslint, husky,\")), mdx(\"h2\", {\n    \"id\": \"🤝-contributing\"\n  }, \"\\uD83E\\uDD1D Contributing\"), mdx(\"p\", null, \"Contributions, issues and feature requests are welcome!\", mdx(\"br\", null), \"Feel free to check\\nin out on\\n\", mdx(\"a\", {\n    parentName: \"p\",\n    \"href\": \"https://github.com/MassivDash/typescript-react-express-esbuild/\",\n    \"target\": \"_blank\",\n    \"rel\": \"noreferrer\"\n  }, \"github\"), \".\"), mdx(\"h2\", {\n    \"id\": \"show-your-support\"\n  }, \"Show your support\"), mdx(\"p\", null, \"Give a \\u2B50\\uFE0F if this project helped you!\"));\n}\n;\nMDXContent.isMDXComponent = true;","tech":["ReactIcon","Tailwind","TS"],"category":"Project","appDescription":null,"hero":{"full":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAQFAQID/8QAFQEBAQAAAAAAAAAAAAAAAAAAAAH/2gAMAwEAAhADEAAAAb2JxiS3aKNwuAf/xAAaEAACAwEBAAAAAAAAAAAAAAACAwABEhQR/9oACAEBAAEFAruaOjAtgxoekV6ByQHnVOdU5lT/xAAWEQADAAAAAAAAAAAAAAAAAAAAARL/2gAIAQMBAT8BlksplM//xAAVEQEBAAAAAAAAAAAAAAAAAAAAEf/aAAgBAgEBPwFUR//EACAQAAIBAwQDAAAAAAAAAAAAAAABAhExMgMSIaEiQWH/2gAIAQEABj8CG2/GlhSXs3QnyVWovooqdjHsx7MT/8QAHRABAAMAAQUAAAAAAAAAAAAAAQARIfAxQYGhsf/aAAgBAQABPyGnDWVJ0TU2GEQF7G+A3R8nd1yz19QKNRyKcinGs//aAAwDAQACAAMAAAAQZP8APP/EABYRAAMAAAAAAAAAAAAAAAAAAAABYf/aAAgBAwEBPxCLIsqyrP/EABcRAAMBAAAAAAAAAAAAAAAAAAARUQH/2gAIAQIBAT8QeUSiQSH/xAAgEAEAAgEEAgMAAAAAAAAAAAABABFhITFB8FGhscHR/9oACAEBAAE/ECaFHHiVIwN11rq8SnoIbiBblK3Dxdr1EKoIaNOUftGfCoUb+JmdMzI6ZnZ+0//Z","aspectRatio":1,"src":"/static/995b0ed79c4a49daa3eb65b62fa586ec/58fe7/esbuildcover1.jpg","srcSet":"/static/995b0ed79c4a49daa3eb65b62fa586ec/e0f30/esbuildcover1.jpg 236w,\n/static/995b0ed79c4a49daa3eb65b62fa586ec/86afd/esbuildcover1.jpg 472w,\n/static/995b0ed79c4a49daa3eb65b62fa586ec/58fe7/esbuildcover1.jpg 944w,\n/static/995b0ed79c4a49daa3eb65b62fa586ec/0ff54/esbuildcover1.jpg 1200w","srcWebp":"/static/995b0ed79c4a49daa3eb65b62fa586ec/99fbb/esbuildcover1.webp","srcSetWebp":"/static/995b0ed79c4a49daa3eb65b62fa586ec/77392/esbuildcover1.webp 236w,\n/static/995b0ed79c4a49daa3eb65b62fa586ec/1f177/esbuildcover1.webp 472w,\n/static/995b0ed79c4a49daa3eb65b62fa586ec/99fbb/esbuildcover1.webp 944w,\n/static/995b0ed79c4a49daa3eb65b62fa586ec/9000d/esbuildcover1.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='M234%2040l-7%203c-5%201-6%203-5%205v1l-1%201%202%201%201-3c-1-2%200-3%201-3%204-1%205-1%205%202v4l-8%201-11%203c-6%202-10%202-11%201h-1l-2%202-2-2c-1-1-1-1-1%201%200%203-4%203-6%200-1-1-1-1-1%201v4c-2%201-1%202%202%202%205%200%206%201%203%203l-4%203c-1%201-1%201%201%201s3%201%203%203c1%203-2%206-4%205-1-1-5%203-4%203h2c2-1%202-1%204%201%203%204%202%209-3%207-2%200-2%200-2%202v3l-1%204-1%204c-1%200-2-2-2-5%200-4%200-5-2-5s-2%200-1%201c3%200%203%208%200%208h-2l-2-1c-3%200-3%202%200%202%202%201%202%201-1%201a93%2093%200%2000-11%201l-4%201%204-1%207-2%202-1h-3c-2%200-3%200-3-2h-1c0%203-7%203-7%200l-1%201c-1%201-1%201-1-1%200-6-1-8-3-7-3%204%200%209%205%2010%202%201%202%201%200%201-4%200-10%204-6%204l2-1c1-2%203-2%203%200l2%201h2l5%201%206-1%202-1h2c4%200%2021-2%2027-4l7-2c8-1%2012-1%2015-3a159%20159%200%200130-5l4-1c2%200%202%200%201-1-2-2-1-11%201-12l1-1c-2%200-2%200-1-1%203-2%2013-4%2022-4%206%200%207-1%207-2%200-2-2-3-2-1l-1%201-1-3v-4l-1-3c-1-4-3-2-3%203l-1%205-1-3c1-3%201-4-1-4l-1-1%201-1v-2c0-2%200-3%202-3l-1-1h-8c-3%200-4%200-3-1s-4-4-8-4l-1-1h-3l-1-1-1-1c-3%201-3%200-3-3v-4l-1%208v8l-1-8v-7l-4%201c-3%200-4%200-3-1%200-2-6-2-8%200m-34%2033c-1%200-2%201-2%203l-1%203-1%201c0%202%207%201%2012-1l4-4c0-3-4-3-12-2m9%207l-6%202c-6%201-10%204-8%206s1%204-1%204h-2c0%202%201%202%203%202%204%200%204-1%204-4%201-4%206-8%208-6l-1%202h-3c-3%201-2%206%200%206s2%200%202-2c-1-2%200-3%202-1%201%201%201%201%201-1h1c1%202%203-3%203-6l-3-2m98%2016v14l-1%2012v2c2%201%201%2026-1%2027v1c2%201%203%2029%201%2029v1l1%208c0%205%200%207-1%206l-9-1a635%20635%200%2001-36%202l-7%201v-11c0-11%202-24%204-29%201-1%202-2%205-2l5-1v-38h-5l-21%204c-1%201%200%2029%201%2029l1-1h1c1%202%202%202%202%201h3l1%201%201%201v1h2l1-1%205-1c1%201%200%201-2%202l-3%201-3%201h-3l2%201v12c-1%202-1%202-4-3l-3-8c0-1-6-2-14-1-15%202-14%202-13%200%201-3%204-4%208-4%205%200%208-1%207-3l-4-1c-12%202-14%202-14%201s2-2%209-2h9v-7h-4l-11%201-6%201v8l1%209v10h-6c-8%200-8%200-7%207v6h6l7%201v4l1%204%201%202h-1l-4-1-16%202-48%202c-19%202-24%202-25-1-2-3-12-3-13%201-1%202-2%203-4%203a7567%207567%200%2000-12-2l-2-2-2-1c-1-2-14-1-15%200-2%202-6%201-8-1l-10-17-2-4v11c-1-2-1-1-1%202l-1%201c-2%200-1%202%201%208l3%206-3%201-2%201h3c4%200%208%206%205%207-1%201%201%201%203%201h5l-4%201c-6%201-6%202-1%202%203-1%205-1%207%201l6%201%2016%204%207%201%205%201c1%203%204%202%209-3l5-4h1c1-2%206-1%207%201%202%201%2013%201%2014-1%201-1%201-1%202%201h15l5-1c5-2%208-3%207-1l1%201h4c4-3%206-3%205%200h2l6-3c4%200%204%200%203%202-1%203%200%203%209%203%207%200%208-1%2012-3%204-3%206-4%206-1l-1%201v1c1%201-5%2010-7%2010v1c2%201%203%205%202%206l-1%201h1c1-1%203%201%206%207l5%208h8l14%201c4%200%205%200%205-2l2-2v9l-1-2v-3l-1%201h-24c-4-1-5%200-5%201l-1%203v1l1%202-1%201h-1l1%201v5c-2%201-3%201-3-1h-3v1c2%202-16%201-19%200h-3l-2%201h-4l-1%201%202%201%201%201h1l-1%201v1l9%203c8%203%2028%204%2028%202-1-2%203-4%207-5%204%200%205%200%207%203l3%201-1-1v-3c3%201%205%200%205-2%200-1%201-2%203-2l3-2-1-1h-1l2-1%202-1h-7l-7-1c-1-1%201-1%205-1l7-1c0-3%206-2%209%201%202%203%202%204-1%203l-1%201c0%201%204%203%205%202l2%202c1%203%202%203%205%203l6%202c5%203%2017%203%2021%200l8-2c8%200%209%200%209-2%200-1%201-2%203-2%203%200%204-3%204-11%200-4%200-6-6-14l-6-9v-1c0-2%200-2-3-2-5%200-2-1%207-1l8-1%201%203c2%205%205%205%207%202s5-5%208-6c3%200%204-1%204-2%200-2%200-3%205-3%206%200%208-2%203-2l-30-2-4-7%201-1c1%200%202-1%202-3l1-3h4c2%200%202%200%202%206-1%207-2%207%2015%208%2012%201%2012%201%2013-5l2-4v-2c4%201%204-3%204-26%200-16-1-23-2-24l-1-3c0-2-1-2-3-3l-5-2h-1l-1%202-1-1%201-2%201-4%201-4%201-1%202-5%206-18%201-2-1-3-2-4-1-1v1l-1%201-1-1-2-1c-2%201-14-1-17-3h-3c0%201-17-3-19-5h-1m-119%2012l-5%209%201%205%201%205-1%202c-2%200-1%202%201%201%208-1%208-1%208%201l1%202%201-11%201-11%202-3c0-2-9-1-10%200M65%20138c-7%206-8%2010-8%2016-1%207%201%208%202%202%200-3%201-4%203-5l2-1h-2c-2%200-2%200%200-3%203-5%203-5%205-2l3%203c2%200%202%200%202-4l-2-4v-3c3-4-1-4-5%201m53%2020c0%205%200%206-2%206-1%200-2%201-1%203%200%203%200%203-3%203-9%202-14%202-14%201l4-1%203-1c0-2-1-2-4-2-4%201-4%201-4%203s-5%203-17%203c-5%200-6%200-6-2l1-2h2l1-1c0-1-3%200-4%202l-3%201c-2%201-2%201%200%201l2%201h-5c-1-2%200-4%203-4%202%200%202%200%202-3%200-4-2-5-10-3-4%200-4%200-3%203v6l1%203%202%202%202%201c2%200%201%203-1%204-2%200-2%201-1%203h3c2-3%203-2%202%202%200%203%200%204%202%204%203%201%203%200%203-2s0-2%201%200c0%201%201%202%202%200%201-1%201-1-1-2-3-3%202-4%207-2l6%201c4%200%204%200%204-3%200-4%201-4%2014-6h9c3-1%205-6%205-15l-1-10-1%206m155%2015l-1%208-1%208h5c5%200%205-1%205-10v-7h-4l-4%201m-32%202h-5c-4%200-4%200-1%201s-1%201-11%201c-5%201-7%204-3%204%202%200%202%200%200%201s0%201%205%201c9%200%2015-1%2015-2v-6m-98%2051l-1%205%201%201h-3c0%202-2%202-15%202-8%200-13%200-12-1%205%200%206-3%202-3l-4%201-2%202c-1%202%200%202%2015%202h17v5c0%205-1%206-3%206l-3-1c-1-2-3-2-5-2l-3%201v4l-1%205v2c1%202%200%205-1%205l-4%201-2%203-1-2-2-2-1%201-5%201a77%2077%200%2000-13%201H83c-2%201-1%201%204%201%209%201%209%201%209%204v3h7c5%200%208%200%2011%202l12%202c7%200%208%200%2012-3%205-4%2011-4%2015-1l2%201c-2-4-2-8-1-8l1%203%201%202%201-2%202-2%206-4c3-4%204-5%204-8v-4l7%204c7%203%207%203%209%202l3-2%201-11c0-9%200-11-1-10h-27l2-1c2%200%204-2%204-3%200-2-6-1-6%201-1%203-9%205-14%204-3%200-3%200-2-2v-1c-2%201-2%201-2-1l1-2h3c1-1%201-1-1-1h-3m55%2016h-3v8c0%2011%200%2011%207%2011h5v-4c0-8%200-12-2-14l-3-2-4%201M92%20253v1l1%203c0%202%200%202%208%202h7v-8h-7c-5%200-8%201-9%202M0%20324v37h401v-75H0v38'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"regular":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAQFAQID/8QAFQEBAQAAAAAAAAAAAAAAAAAAAAH/2gAMAwEAAhADEAAAAb2JxiS3aKNwuAf/xAAaEAACAwEBAAAAAAAAAAAAAAACAwABEhQR/9oACAEBAAEFAruaOjAtgxoekV6ByQHnVOdU5lT/xAAWEQADAAAAAAAAAAAAAAAAAAAAARL/2gAIAQMBAT8BlksplM//xAAVEQEBAAAAAAAAAAAAAAAAAAAAEf/aAAgBAgEBPwFUR//EACAQAAIBAwQDAAAAAAAAAAAAAAABAhExMgMSIaEiQWH/2gAIAQEABj8CG2/GlhSXs3QnyVWovooqdjHsx7MT/8QAHRABAAMAAQUAAAAAAAAAAAAAAQARIfAxQYGhsf/aAAgBAQABPyGnDWVJ0TU2GEQF7G+A3R8nd1yz19QKNRyKcinGs//aAAwDAQACAAMAAAAQZP8APP/EABYRAAMAAAAAAAAAAAAAAAAAAAABYf/aAAgBAwEBPxCLIsqyrP/EABcRAAMBAAAAAAAAAAAAAAAAAAARUQH/2gAIAQIBAT8QeUSiQSH/xAAgEAEAAgEEAgMAAAAAAAAAAAABABFhITFB8FGhscHR/9oACAEBAAE/ECaFHHiVIwN11rq8SnoIbiBblK3Dxdr1EKoIaNOUftGfCoUb+JmdMzI6ZnZ+0//Z","aspectRatio":1,"src":"/static/995b0ed79c4a49daa3eb65b62fa586ec/1dc0b/esbuildcover1.jpg","srcSet":"/static/995b0ed79c4a49daa3eb65b62fa586ec/3a5ce/esbuildcover1.jpg 163w,\n/static/995b0ed79c4a49daa3eb65b62fa586ec/05730/esbuildcover1.jpg 327w,\n/static/995b0ed79c4a49daa3eb65b62fa586ec/1dc0b/esbuildcover1.jpg 653w,\n/static/995b0ed79c4a49daa3eb65b62fa586ec/f72c7/esbuildcover1.jpg 980w,\n/static/995b0ed79c4a49daa3eb65b62fa586ec/0ff54/esbuildcover1.jpg 1200w","srcWebp":"/static/995b0ed79c4a49daa3eb65b62fa586ec/0acdf/esbuildcover1.webp","srcSetWebp":"/static/995b0ed79c4a49daa3eb65b62fa586ec/ac59e/esbuildcover1.webp 163w,\n/static/995b0ed79c4a49daa3eb65b62fa586ec/7660b/esbuildcover1.webp 327w,\n/static/995b0ed79c4a49daa3eb65b62fa586ec/0acdf/esbuildcover1.webp 653w,\n/static/995b0ed79c4a49daa3eb65b62fa586ec/75470/esbuildcover1.webp 980w,\n/static/995b0ed79c4a49daa3eb65b62fa586ec/9000d/esbuildcover1.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='M234%2040l-7%203c-5%201-6%203-5%205v1l-1%201%202%201%201-3c-1-2%200-3%201-3%204-1%205-1%205%202v4l-8%201-11%203c-6%202-10%202-11%201h-1l-2%202-2-2c-1-1-1-1-1%201%200%203-4%203-6%200-1-1-1-1-1%201v4c-2%201-1%202%202%202%205%200%206%201%203%203l-4%203c-1%201-1%201%201%201s3%201%203%203c1%203-2%206-4%205-1-1-5%203-4%203h2c2-1%202-1%204%201%203%204%202%209-3%207-2%200-2%200-2%202v3l-1%204-1%204c-1%200-2-2-2-5%200-4%200-5-2-5s-2%200-1%201c3%200%203%208%200%208h-2l-2-1c-3%200-3%202%200%202%202%201%202%201-1%201a93%2093%200%2000-11%201l-4%201%204-1%207-2%202-1h-3c-2%200-3%200-3-2h-1c0%203-7%203-7%200l-1%201c-1%201-1%201-1-1%200-6-1-8-3-7-3%204%200%209%205%2010%202%201%202%201%200%201-4%200-10%204-6%204l2-1c1-2%203-2%203%200l2%201h2l5%201%206-1%202-1h2c4%200%2021-2%2027-4l7-2c8-1%2012-1%2015-3a159%20159%200%200130-5l4-1c2%200%202%200%201-1-2-2-1-11%201-12l1-1c-2%200-2%200-1-1%203-2%2013-4%2022-4%206%200%207-1%207-2%200-2-2-3-2-1l-1%201-1-3v-4l-1-3c-1-4-3-2-3%203l-1%205-1-3c1-3%201-4-1-4l-1-1%201-1v-2c0-2%200-3%202-3l-1-1h-8c-3%200-4%200-3-1s-4-4-8-4l-1-1h-3l-1-1-1-1c-3%201-3%200-3-3v-4l-1%208v8l-1-8v-7l-4%201c-3%200-4%200-3-1%200-2-6-2-8%200m-34%2033c-1%200-2%201-2%203l-1%203-1%201c0%202%207%201%2012-1l4-4c0-3-4-3-12-2m9%207l-6%202c-6%201-10%204-8%206s1%204-1%204h-2c0%202%201%202%203%202%204%200%204-1%204-4%201-4%206-8%208-6l-1%202h-3c-3%201-2%206%200%206s2%200%202-2c-1-2%200-3%202-1%201%201%201%201%201-1h1c1%202%203-3%203-6l-3-2m98%2016v14l-1%2012v2c2%201%201%2026-1%2027v1c2%201%203%2029%201%2029v1l1%208c0%205%200%207-1%206l-9-1a635%20635%200%2001-36%202l-7%201v-11c0-11%202-24%204-29%201-1%202-2%205-2l5-1v-38h-5l-21%204c-1%201%200%2029%201%2029l1-1h1c1%202%202%202%202%201h3l1%201%201%201v1h2l1-1%205-1c1%201%200%201-2%202l-3%201-3%201h-3l2%201v12c-1%202-1%202-4-3l-3-8c0-1-6-2-14-1-15%202-14%202-13%200%201-3%204-4%208-4%205%200%208-1%207-3l-4-1c-12%202-14%202-14%201s2-2%209-2h9v-7h-4l-11%201-6%201v8l1%209v10h-6c-8%200-8%200-7%207v6h6l7%201v4l1%204%201%202h-1l-4-1-16%202-48%202c-19%202-24%202-25-1-2-3-12-3-13%201-1%202-2%203-4%203a7567%207567%200%2000-12-2l-2-2-2-1c-1-2-14-1-15%200-2%202-6%201-8-1l-10-17-2-4v11c-1-2-1-1-1%202l-1%201c-2%200-1%202%201%208l3%206-3%201-2%201h3c4%200%208%206%205%207-1%201%201%201%203%201h5l-4%201c-6%201-6%202-1%202%203-1%205-1%207%201l6%201%2016%204%207%201%205%201c1%203%204%202%209-3l5-4h1c1-2%206-1%207%201%202%201%2013%201%2014-1%201-1%201-1%202%201h15l5-1c5-2%208-3%207-1l1%201h4c4-3%206-3%205%200h2l6-3c4%200%204%200%203%202-1%203%200%203%209%203%207%200%208-1%2012-3%204-3%206-4%206-1l-1%201v1c1%201-5%2010-7%2010v1c2%201%203%205%202%206l-1%201h1c1-1%203%201%206%207l5%208h8l14%201c4%200%205%200%205-2l2-2v9l-1-2v-3l-1%201h-24c-4-1-5%200-5%201l-1%203v1l1%202-1%201h-1l1%201v5c-2%201-3%201-3-1h-3v1c2%202-16%201-19%200h-3l-2%201h-4l-1%201%202%201%201%201h1l-1%201v1l9%203c8%203%2028%204%2028%202-1-2%203-4%207-5%204%200%205%200%207%203l3%201-1-1v-3c3%201%205%200%205-2%200-1%201-2%203-2l3-2-1-1h-1l2-1%202-1h-7l-7-1c-1-1%201-1%205-1l7-1c0-3%206-2%209%201%202%203%202%204-1%203l-1%201c0%201%204%203%205%202l2%202c1%203%202%203%205%203l6%202c5%203%2017%203%2021%200l8-2c8%200%209%200%209-2%200-1%201-2%203-2%203%200%204-3%204-11%200-4%200-6-6-14l-6-9v-1c0-2%200-2-3-2-5%200-2-1%207-1l8-1%201%203c2%205%205%205%207%202s5-5%208-6c3%200%204-1%204-2%200-2%200-3%205-3%206%200%208-2%203-2l-30-2-4-7%201-1c1%200%202-1%202-3l1-3h4c2%200%202%200%202%206-1%207-2%207%2015%208%2012%201%2012%201%2013-5l2-4v-2c4%201%204-3%204-26%200-16-1-23-2-24l-1-3c0-2-1-2-3-3l-5-2h-1l-1%202-1-1%201-2%201-4%201-4%201-1%202-5%206-18%201-2-1-3-2-4-1-1v1l-1%201-1-1-2-1c-2%201-14-1-17-3h-3c0%201-17-3-19-5h-1m-119%2012l-5%209%201%205%201%205-1%202c-2%200-1%202%201%201%208-1%208-1%208%201l1%202%201-11%201-11%202-3c0-2-9-1-10%200M65%20138c-7%206-8%2010-8%2016-1%207%201%208%202%202%200-3%201-4%203-5l2-1h-2c-2%200-2%200%200-3%203-5%203-5%205-2l3%203c2%200%202%200%202-4l-2-4v-3c3-4-1-4-5%201m53%2020c0%205%200%206-2%206-1%200-2%201-1%203%200%203%200%203-3%203-9%202-14%202-14%201l4-1%203-1c0-2-1-2-4-2-4%201-4%201-4%203s-5%203-17%203c-5%200-6%200-6-2l1-2h2l1-1c0-1-3%200-4%202l-3%201c-2%201-2%201%200%201l2%201h-5c-1-2%200-4%203-4%202%200%202%200%202-3%200-4-2-5-10-3-4%200-4%200-3%203v6l1%203%202%202%202%201c2%200%201%203-1%204-2%200-2%201-1%203h3c2-3%203-2%202%202%200%203%200%204%202%204%203%201%203%200%203-2s0-2%201%200c0%201%201%202%202%200%201-1%201-1-1-2-3-3%202-4%207-2l6%201c4%200%204%200%204-3%200-4%201-4%2014-6h9c3-1%205-6%205-15l-1-10-1%206m155%2015l-1%208-1%208h5c5%200%205-1%205-10v-7h-4l-4%201m-32%202h-5c-4%200-4%200-1%201s-1%201-11%201c-5%201-7%204-3%204%202%200%202%200%200%201s0%201%205%201c9%200%2015-1%2015-2v-6m-98%2051l-1%205%201%201h-3c0%202-2%202-15%202-8%200-13%200-12-1%205%200%206-3%202-3l-4%201-2%202c-1%202%200%202%2015%202h17v5c0%205-1%206-3%206l-3-1c-1-2-3-2-5-2l-3%201v4l-1%205v2c1%202%200%205-1%205l-4%201-2%203-1-2-2-2-1%201-5%201a77%2077%200%2000-13%201H83c-2%201-1%201%204%201%209%201%209%201%209%204v3h7c5%200%208%200%2011%202l12%202c7%200%208%200%2012-3%205-4%2011-4%2015-1l2%201c-2-4-2-8-1-8l1%203%201%202%201-2%202-2%206-4c3-4%204-5%204-8v-4l7%204c7%203%207%203%209%202l3-2%201-11c0-9%200-11-1-10h-27l2-1c2%200%204-2%204-3%200-2-6-1-6%201-1%203-9%205-14%204-3%200-3%200-2-2v-1c-2%201-2%201-2-1l1-2h3c1-1%201-1-1-1h-3m55%2016h-3v8c0%2011%200%2011%207%2011h5v-4c0-8%200-12-2-14l-3-2-4%201M92%20253v1l1%203c0%202%200%202%208%202h7v-8h-7c-5%200-8%201-9%202M0%20324v37h401v-75H0v38'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"narrow":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAAUABQDASIAAhEBAxEB/8QAGQABAAIDAAAAAAAAAAAAAAAAAAQFAQID/8QAFQEBAQAAAAAAAAAAAAAAAAAAAAH/2gAMAwEAAhADEAAAAb2JxiS3aKNwuAf/xAAaEAACAwEBAAAAAAAAAAAAAAACAwABEhQR/9oACAEBAAEFAruaOjAtgxoekV6ByQHnVOdU5lT/xAAWEQADAAAAAAAAAAAAAAAAAAAAARL/2gAIAQMBAT8BlksplM//xAAVEQEBAAAAAAAAAAAAAAAAAAAAEf/aAAgBAgEBPwFUR//EACAQAAIBAwQDAAAAAAAAAAAAAAABAhExMgMSIaEiQWH/2gAIAQEABj8CG2/GlhSXs3QnyVWovooqdjHsx7MT/8QAHRABAAMAAQUAAAAAAAAAAAAAAQARIfAxQYGhsf/aAAgBAQABPyGnDWVJ0TU2GEQF7G+A3R8nd1yz19QKNRyKcinGs//aAAwDAQACAAMAAAAQZP8APP/EABYRAAMAAAAAAAAAAAAAAAAAAAABYf/aAAgBAwEBPxCLIsqyrP/EABcRAAMBAAAAAAAAAAAAAAAAAAARUQH/2gAIAQIBAT8QeUSiQSH/xAAgEAEAAgEEAgMAAAAAAAAAAAABABFhITFB8FGhscHR/9oACAEBAAE/ECaFHHiVIwN11rq8SnoIbiBblK3Dxdr1EKoIaNOUftGfCoUb+JmdMzI6ZnZ+0//Z","aspectRatio":1,"src":"/static/995b0ed79c4a49daa3eb65b62fa586ec/eaa58/esbuildcover1.jpg","srcSet":"/static/995b0ed79c4a49daa3eb65b62fa586ec/5a3ee/esbuildcover1.jpg 114w,\n/static/995b0ed79c4a49daa3eb65b62fa586ec/41f8f/esbuildcover1.jpg 229w,\n/static/995b0ed79c4a49daa3eb65b62fa586ec/eaa58/esbuildcover1.jpg 457w,\n/static/995b0ed79c4a49daa3eb65b62fa586ec/c309b/esbuildcover1.jpg 686w,\n/static/995b0ed79c4a49daa3eb65b62fa586ec/e3008/esbuildcover1.jpg 914w,\n/static/995b0ed79c4a49daa3eb65b62fa586ec/0ff54/esbuildcover1.jpg 1200w","srcWebp":"/static/995b0ed79c4a49daa3eb65b62fa586ec/15384/esbuildcover1.webp","srcSetWebp":"/static/995b0ed79c4a49daa3eb65b62fa586ec/31fce/esbuildcover1.webp 114w,\n/static/995b0ed79c4a49daa3eb65b62fa586ec/e3e25/esbuildcover1.webp 229w,\n/static/995b0ed79c4a49daa3eb65b62fa586ec/15384/esbuildcover1.webp 457w,\n/static/995b0ed79c4a49daa3eb65b62fa586ec/0258d/esbuildcover1.webp 686w,\n/static/995b0ed79c4a49daa3eb65b62fa586ec/64ea2/esbuildcover1.webp 914w,\n/static/995b0ed79c4a49daa3eb65b62fa586ec/9000d/esbuildcover1.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='M234%2040l-7%203c-5%201-6%203-5%205v1l-1%201%202%201%201-3c-1-2%200-3%201-3%204-1%205-1%205%202v4l-8%201-11%203c-6%202-10%202-11%201h-1l-2%202-2-2c-1-1-1-1-1%201%200%203-4%203-6%200-1-1-1-1-1%201v4c-2%201-1%202%202%202%205%200%206%201%203%203l-4%203c-1%201-1%201%201%201s3%201%203%203c1%203-2%206-4%205-1-1-5%203-4%203h2c2-1%202-1%204%201%203%204%202%209-3%207-2%200-2%200-2%202v3l-1%204-1%204c-1%200-2-2-2-5%200-4%200-5-2-5s-2%200-1%201c3%200%203%208%200%208h-2l-2-1c-3%200-3%202%200%202%202%201%202%201-1%201a93%2093%200%2000-11%201l-4%201%204-1%207-2%202-1h-3c-2%200-3%200-3-2h-1c0%203-7%203-7%200l-1%201c-1%201-1%201-1-1%200-6-1-8-3-7-3%204%200%209%205%2010%202%201%202%201%200%201-4%200-10%204-6%204l2-1c1-2%203-2%203%200l2%201h2l5%201%206-1%202-1h2c4%200%2021-2%2027-4l7-2c8-1%2012-1%2015-3a159%20159%200%200130-5l4-1c2%200%202%200%201-1-2-2-1-11%201-12l1-1c-2%200-2%200-1-1%203-2%2013-4%2022-4%206%200%207-1%207-2%200-2-2-3-2-1l-1%201-1-3v-4l-1-3c-1-4-3-2-3%203l-1%205-1-3c1-3%201-4-1-4l-1-1%201-1v-2c0-2%200-3%202-3l-1-1h-8c-3%200-4%200-3-1s-4-4-8-4l-1-1h-3l-1-1-1-1c-3%201-3%200-3-3v-4l-1%208v8l-1-8v-7l-4%201c-3%200-4%200-3-1%200-2-6-2-8%200m-34%2033c-1%200-2%201-2%203l-1%203-1%201c0%202%207%201%2012-1l4-4c0-3-4-3-12-2m9%207l-6%202c-6%201-10%204-8%206s1%204-1%204h-2c0%202%201%202%203%202%204%200%204-1%204-4%201-4%206-8%208-6l-1%202h-3c-3%201-2%206%200%206s2%200%202-2c-1-2%200-3%202-1%201%201%201%201%201-1h1c1%202%203-3%203-6l-3-2m98%2016v14l-1%2012v2c2%201%201%2026-1%2027v1c2%201%203%2029%201%2029v1l1%208c0%205%200%207-1%206l-9-1a635%20635%200%2001-36%202l-7%201v-11c0-11%202-24%204-29%201-1%202-2%205-2l5-1v-38h-5l-21%204c-1%201%200%2029%201%2029l1-1h1c1%202%202%202%202%201h3l1%201%201%201v1h2l1-1%205-1c1%201%200%201-2%202l-3%201-3%201h-3l2%201v12c-1%202-1%202-4-3l-3-8c0-1-6-2-14-1-15%202-14%202-13%200%201-3%204-4%208-4%205%200%208-1%207-3l-4-1c-12%202-14%202-14%201s2-2%209-2h9v-7h-4l-11%201-6%201v8l1%209v10h-6c-8%200-8%200-7%207v6h6l7%201v4l1%204%201%202h-1l-4-1-16%202-48%202c-19%202-24%202-25-1-2-3-12-3-13%201-1%202-2%203-4%203a7567%207567%200%2000-12-2l-2-2-2-1c-1-2-14-1-15%200-2%202-6%201-8-1l-10-17-2-4v11c-1-2-1-1-1%202l-1%201c-2%200-1%202%201%208l3%206-3%201-2%201h3c4%200%208%206%205%207-1%201%201%201%203%201h5l-4%201c-6%201-6%202-1%202%203-1%205-1%207%201l6%201%2016%204%207%201%205%201c1%203%204%202%209-3l5-4h1c1-2%206-1%207%201%202%201%2013%201%2014-1%201-1%201-1%202%201h15l5-1c5-2%208-3%207-1l1%201h4c4-3%206-3%205%200h2l6-3c4%200%204%200%203%202-1%203%200%203%209%203%207%200%208-1%2012-3%204-3%206-4%206-1l-1%201v1c1%201-5%2010-7%2010v1c2%201%203%205%202%206l-1%201h1c1-1%203%201%206%207l5%208h8l14%201c4%200%205%200%205-2l2-2v9l-1-2v-3l-1%201h-24c-4-1-5%200-5%201l-1%203v1l1%202-1%201h-1l1%201v5c-2%201-3%201-3-1h-3v1c2%202-16%201-19%200h-3l-2%201h-4l-1%201%202%201%201%201h1l-1%201v1l9%203c8%203%2028%204%2028%202-1-2%203-4%207-5%204%200%205%200%207%203l3%201-1-1v-3c3%201%205%200%205-2%200-1%201-2%203-2l3-2-1-1h-1l2-1%202-1h-7l-7-1c-1-1%201-1%205-1l7-1c0-3%206-2%209%201%202%203%202%204-1%203l-1%201c0%201%204%203%205%202l2%202c1%203%202%203%205%203l6%202c5%203%2017%203%2021%200l8-2c8%200%209%200%209-2%200-1%201-2%203-2%203%200%204-3%204-11%200-4%200-6-6-14l-6-9v-1c0-2%200-2-3-2-5%200-2-1%207-1l8-1%201%203c2%205%205%205%207%202s5-5%208-6c3%200%204-1%204-2%200-2%200-3%205-3%206%200%208-2%203-2l-30-2-4-7%201-1c1%200%202-1%202-3l1-3h4c2%200%202%200%202%206-1%207-2%207%2015%208%2012%201%2012%201%2013-5l2-4v-2c4%201%204-3%204-26%200-16-1-23-2-24l-1-3c0-2-1-2-3-3l-5-2h-1l-1%202-1-1%201-2%201-4%201-4%201-1%202-5%206-18%201-2-1-3-2-4-1-1v1l-1%201-1-1-2-1c-2%201-14-1-17-3h-3c0%201-17-3-19-5h-1m-119%2012l-5%209%201%205%201%205-1%202c-2%200-1%202%201%201%208-1%208-1%208%201l1%202%201-11%201-11%202-3c0-2-9-1-10%200M65%20138c-7%206-8%2010-8%2016-1%207%201%208%202%202%200-3%201-4%203-5l2-1h-2c-2%200-2%200%200-3%203-5%203-5%205-2l3%203c2%200%202%200%202-4l-2-4v-3c3-4-1-4-5%201m53%2020c0%205%200%206-2%206-1%200-2%201-1%203%200%203%200%203-3%203-9%202-14%202-14%201l4-1%203-1c0-2-1-2-4-2-4%201-4%201-4%203s-5%203-17%203c-5%200-6%200-6-2l1-2h2l1-1c0-1-3%200-4%202l-3%201c-2%201-2%201%200%201l2%201h-5c-1-2%200-4%203-4%202%200%202%200%202-3%200-4-2-5-10-3-4%200-4%200-3%203v6l1%203%202%202%202%201c2%200%201%203-1%204-2%200-2%201-1%203h3c2-3%203-2%202%202%200%203%200%204%202%204%203%201%203%200%203-2s0-2%201%200c0%201%201%202%202%200%201-1%201-1-1-2-3-3%202-4%207-2l6%201c4%200%204%200%204-3%200-4%201-4%2014-6h9c3-1%205-6%205-15l-1-10-1%206m155%2015l-1%208-1%208h5c5%200%205-1%205-10v-7h-4l-4%201m-32%202h-5c-4%200-4%200-1%201s-1%201-11%201c-5%201-7%204-3%204%202%200%202%200%200%201s0%201%205%201c9%200%2015-1%2015-2v-6m-98%2051l-1%205%201%201h-3c0%202-2%202-15%202-8%200-13%200-12-1%205%200%206-3%202-3l-4%201-2%202c-1%202%200%202%2015%202h17v5c0%205-1%206-3%206l-3-1c-1-2-3-2-5-2l-3%201v4l-1%205v2c1%202%200%205-1%205l-4%201-2%203-1-2-2-2-1%201-5%201a77%2077%200%2000-13%201H83c-2%201-1%201%204%201%209%201%209%201%209%204v3h7c5%200%208%200%2011%202l12%202c7%200%208%200%2012-3%205-4%2011-4%2015-1l2%201c-2-4-2-8-1-8l1%203%201%202%201-2%202-2%206-4c3-4%204-5%204-8v-4l7%204c7%203%207%203%209%202l3-2%201-11c0-9%200-11-1-10h-27l2-1c2%200%204-2%204-3%200-2-6-1-6%201-1%203-9%205-14%204-3%200-3%200-2-2v-1c-2%201-2%201-2-1l1-2h3c1-1%201-1-1-1h-3m55%2016h-3v8c0%2011%200%2011%207%2011h5v-4c0-8%200-12-2-14l-3-2-4%201M92%20253v1l1%203c0%202%200%202%208%202h7v-8h-7c-5%200-8%201-9%202M0%20324v37h401v-75H0v38'%20fill='%23fafafa'%20fill-rule='evenodd'/%3e%3c/svg%3e"},"seo":{"src":"/static/995b0ed79c4a49daa3eb65b62fa586ec/0ff54/esbuildcover1.jpg"}}}],"pathPrefix":"/","first":false,"last":false,"index":3,"pageCount":5,"additionalContext":{"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":"/","skip":12,"limit":12}}},"staticQueryHashes":["217812709","2361467917","3838421970","500183989","5650841"]}