(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[6103,0],{4137:function(e,t,a){"use strict";a.d(t,{Zo:function(){return m},kt:function(){return p}});var r=a(7294);function n(e,t,a){return t in e?Object.defineProperty(e,t,{value:a,enumerable:!0,configurable:!0,writable:!0}):e[t]=a,e}function l(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),a.push.apply(a,r)}return a}function o(e){for(var t=1;t<arguments.length;t++){var a=null!=arguments[t]?arguments[t]:{};t%2?l(Object(a),!0).forEach((function(t){n(e,t,a[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(a)):l(Object(a)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(a,t))}))}return e}function i(e,t){if(null==e)return{};var a,r,n=function(e,t){if(null==e)return{};var a,r,n={},l=Object.keys(e);for(r=0;r<l.length;r++)a=l[r],t.indexOf(a)>=0||(n[a]=e[a]);return n}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(r=0;r<l.length;r++)a=l[r],t.indexOf(a)>=0||Object.prototype.propertyIsEnumerable.call(e,a)&&(n[a]=e[a])}return n}var c=r.createContext({}),s=function(e){var t=r.useContext(c),a=t;return e&&(a="function"==typeof e?e(t):o(o({},t),e)),a},m=function(e){var t=s(e.components);return r.createElement(c.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var a=e.components,n=e.mdxType,l=e.originalType,c=e.parentName,m=i(e,["components","mdxType","originalType","parentName"]),d=s(a),p=n,f=d["".concat(c,".").concat(p)]||d[p]||u[p]||l;return a?r.createElement(f,o(o({ref:t},m),{},{components:a})):r.createElement(f,o({ref:t},m))}));function p(e,t){var a=arguments,n=t&&t.mdxType;if("string"==typeof e||n){var l=a.length,o=new Array(l);o[0]=d;var i={};for(var c in t)hasOwnProperty.call(t,c)&&(i[c]=t[c]);i.originalType=e,i.mdxType="string"==typeof e?e:n,o[1]=i;for(var s=2;s<l;s++)o[s]=a[s];return r.createElement.apply(null,o)}return r.createElement.apply(null,a)}d.displayName="MDXCreateElement"},2903:function(e,t,a){"use strict";a.d(t,{Z:function(){return v}});var r=a(7294),n=a(6010),l=a(4137),o=a(7130),i=a(2511),c=a(2433),s=a(5386),m=a(4175),u=a(7680),d="blogPostTitle_GeHD",p="blogPostData_291c",f="blogPostDetailsFull_3kfx";var v=function(e){var t,a,v,g=(a=(0,c.c2)().selectMessage,function(e){var t=Math.ceil(e);return a(t,(0,o.I)({id:"theme.blog.post.readingTime.plurals",description:'Pluralized label for "{readingTime} min read". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One min read|{readingTime} min read"},{readingTime:t}))}),h=e.children,E=e.frontMatter,b=e.metadata,_=e.truncated,N=e.isBlogPostPage,y=void 0!==N&&N,Z=b.date,k=b.formattedDate,w=b.permalink,O=b.tags,T=b.readingTime,P=b.title,x=b.editUrl,I=E.author,L=E.image,C=E.keywords,j=E.author_url||E.authorURL,M=E.author_title||E.authorTitle,A=E.author_image_url||E.authorImageURL;return r.createElement(r.Fragment,null,r.createElement(m.Z,{keywords:C,image:L}),r.createElement("article",{className:y?void 0:"margin-bottom--xl"},(v=y?"h1":"h2",r.createElement("header",null,r.createElement(v,{className:d},y?P:r.createElement(i.Z,{to:w},P)),r.createElement("div",{className:(0,n.Z)(p,"margin-vert--md")},r.createElement("time",{dateTime:Z},k),T&&r.createElement(r.Fragment,null," \xb7 ",g(T))),r.createElement("div",{className:"avatar margin-vert--md"},A&&r.createElement(i.Z,{className:"avatar__photo-link avatar__photo",href:j},r.createElement("img",{src:A,alt:I})),r.createElement("div",{className:"avatar__intro"},I&&r.createElement(r.Fragment,null,r.createElement("div",{className:"avatar__name"},r.createElement(i.Z,{href:j},I)),r.createElement("small",{className:"avatar__subtitle"},M)))))),r.createElement("div",{className:"markdown"},r.createElement(l.Zo,{components:s.Z},h)),(O.length>0||_)&&r.createElement("footer",{className:(0,n.Z)("row docusaurus-mt-lg",(t={},t[f]=y,t))},O.length>0&&r.createElement("div",{className:"col"},r.createElement("b",null,r.createElement(o.Z,{id:"theme.tags.tagsListLabel",description:"The label alongside a tag list"},"Tags:")),O.map((function(e){var t=e.label,a=e.permalink;return r.createElement(i.Z,{key:a,className:"margin-horiz--sm",to:a},t)}))),y&&x&&r.createElement("div",{className:"col margin-top--sm"},r.createElement(u.Z,{editUrl:x})),!y&&_&&r.createElement("div",{className:"col text--right"},r.createElement(i.Z,{to:b.permalink,"aria-label":"Read more about "+P},r.createElement("b",null,r.createElement(o.Z,{id:"theme.blog.post.readMore",description:"The label used in blog post item excerpts to link to full blog posts"},"Read More")))))))}},3322:function(e,t,a){"use strict";a.r(t),a.d(t,{default:function(){return d}});var r=a(7294),n=a(6265),l=a(2903),o=a(7130),i=a(2511);var c=function(e){var t=e.nextItem,a=e.prevItem;return r.createElement("nav",{className:"pagination-nav docusaurus-mt-lg","aria-label":(0,o.I)({id:"theme.blog.post.paginator.navAriaLabel",message:"Blog post page navigation",description:"The ARIA label for the blog posts pagination"})},r.createElement("div",{className:"pagination-nav__item"},a&&r.createElement(i.Z,{className:"pagination-nav__link",to:a.permalink},r.createElement("div",{className:"pagination-nav__sublabel"},r.createElement(o.Z,{id:"theme.blog.post.paginator.newerPost",description:"The blog post button label to navigate to the newer/previous post"},"Newer Post")),r.createElement("div",{className:"pagination-nav__label"},"\xab ",a.title))),r.createElement("div",{className:"pagination-nav__item pagination-nav__item--next"},t&&r.createElement(i.Z,{className:"pagination-nav__link",to:t.permalink},r.createElement("div",{className:"pagination-nav__sublabel"},r.createElement(o.Z,{id:"theme.blog.post.paginator.olderPost",description:"The blog post button label to navigate to the older/next post"},"Older Post")),r.createElement("div",{className:"pagination-nav__label"},t.title," \xbb"))))},s=a(4112),m=a(5389),u=a(2433);var d=function(e){var t=e.content,a=e.sidebar,o=t.frontMatter,i=t.metadata,d=i.title,p=i.description,f=i.nextItem,v=i.prevItem,g=o.hide_table_of_contents;return r.createElement(n.Z,{title:d,description:p,wrapperClassName:u.kM.wrapper.blogPages,pageClassName:u.kM.page.blogPostPage},t&&r.createElement("div",{className:"container margin-vert--lg"},r.createElement("div",{className:"row"},r.createElement("aside",{className:"col col--3"},r.createElement(s.Z,{sidebar:a})),r.createElement("main",{className:"col col--7"},r.createElement(l.Z,{frontMatter:o,metadata:i,isBlogPostPage:!0},r.createElement(t,null)),(f||v)&&r.createElement(c,{nextItem:f,prevItem:v})),!g&&t.toc&&r.createElement("div",{className:"col col--2"},r.createElement(m.Z,{toc:t.toc})))))}},4112:function(e,t,a){"use strict";a.d(t,{Z:function(){return p}});var r=a(7294),n=a(6010),l=a(2511),o="sidebar_2ahu",i="sidebarItemTitle_2hhb",c="sidebarItemList_2xAf",s="sidebarItem_2UVv",m="sidebarItemLink_1RT6",u="sidebarItemLinkActive_12pM",d=a(7130);function p(e){var t=e.sidebar;return 0===t.items.length?null:r.createElement("nav",{className:(0,n.Z)(o,"thin-scrollbar"),"aria-label":(0,d.I)({id:"theme.blog.sidebar.navAriaLabel",message:"Blog recent posts navigation",description:"The ARIA label for recent posts in the blog sidebar"})},r.createElement("div",{className:(0,n.Z)(i,"margin-bottom--md")},t.title),r.createElement("ul",{className:c},t.items.map((function(e){return r.createElement("li",{key:e.permalink,className:s},r.createElement(l.Z,{isNavLink:!0,to:e.permalink,className:m,activeClassName:u},e.title))}))))}},7680:function(e,t,a){"use strict";a.d(t,{Z:function(){return u}});var r=a(7294),n=a(7130),l=a(2122),o=a(9756),i=a(6010),c="iconEdit_2_ui",s=["className"],m=function(e){var t=e.className,a=(0,o.Z)(e,s);return r.createElement("svg",(0,l.Z)({fill:"currentColor",height:"20",width:"20",viewBox:"0 0 40 40",className:(0,i.Z)(c,t),"aria-hidden":"true"},a),r.createElement("g",null,r.createElement("path",{d:"m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"})))};function u(e){var t=e.editUrl;return r.createElement("a",{href:t,target:"_blank",rel:"noreferrer noopener"},r.createElement(m,null),r.createElement(n.Z,{id:"theme.common.editThisPage",description:"The link label to edit the current page"},"Edit this page"))}},5386:function(e,t,a){"use strict";var r=a(7294),n=a(2511),l=a(2210),o=a(5607),i={code:function(e){var t=e.children;return(0,r.isValidElement)(t)?t:t.includes("\n")?r.createElement(l.Z,e):r.createElement("code",e)},a:function(e){return r.createElement(n.Z,e)},pre:function(e){var t,a=e.children;return(0,r.isValidElement)(null==a||null==(t=a.props)?void 0:t.children)?null==a?void 0:a.props.children:r.createElement(l.Z,(0,r.isValidElement)(a)?null==a?void 0:a.props:{children:a})},h1:(0,o.Z)("h1"),h2:(0,o.Z)("h2"),h3:(0,o.Z)("h3"),h4:(0,o.Z)("h4"),h5:(0,o.Z)("h5"),h6:(0,o.Z)("h6")};t.Z=i},5389:function(e,t,a){"use strict";a.d(t,{Z:function(){return s}});var r=a(7294),n=a(6010);var l=function(e,t,a){var n=(0,r.useState)(void 0),l=n[0],o=n[1];(0,r.useEffect)((function(){function r(){var r=function(){var e=Array.from(document.getElementsByClassName("anchor")),t=e.find((function(e){return e.getBoundingClientRect().top>=a}));if(t){if(t.getBoundingClientRect().top>=a){var r=e[e.indexOf(t)-1];return null!=r?r:t}return t}return e[e.length-1]}();if(r)for(var n=0,i=!1,c=document.getElementsByClassName(e);n<c.length&&!i;){var s=c[n],m=s.href,u=decodeURIComponent(m.substring(m.indexOf("#")+1));r.id===u&&(l&&l.classList.remove(t),s.classList.add(t),o(s),i=!0),n+=1}}return document.addEventListener("scroll",r),document.addEventListener("resize",r),r(),function(){document.removeEventListener("scroll",r),document.removeEventListener("resize",r)}}))},o="tableOfContents_35-E",i="table-of-contents__link";function c(e){var t=e.toc,a=e.isChild;return t.length?r.createElement("ul",{className:a?"":"table-of-contents table-of-contents__left-border"},t.map((function(e){return r.createElement("li",{key:e.id},r.createElement("a",{href:"#"+e.id,className:i,dangerouslySetInnerHTML:{__html:e.value}}),r.createElement(c,{isChild:!0,toc:e.children}))}))):null}var s=function(e){var t=e.toc;return l(i,"table-of-contents__link--active",100),r.createElement("div",{className:(0,n.Z)(o,"thin-scrollbar")},r.createElement(c,{toc:t}))}},283:function(e,t,a){"use strict";a.d(t,{Z:function(){return g}});var r=a(2122),n=a(9756),l=a(7294),o=a(6010),i=a(2511),c=a(2433),s=a(9524),m="footerLogoLink_qW4Z",u="footerCopyright_2yvt",d=a(4087),p=["to","href","label","prependBaseUrlToHref"];function f(e){var t=e.to,a=e.href,o=e.label,c=e.prependBaseUrlToHref,m=(0,n.Z)(e,p),u=(0,s.Z)(t),d=(0,s.Z)(a,{forcePrependBaseUrl:!0});return l.createElement(i.Z,(0,r.Z)({className:"footer__link-item"},a?{href:c?d:a}:{to:u},m),o)}var v=function(e){var t=e.sources,a=e.alt;return l.createElement(d.Z,{className:"footer__logo",alt:a,sources:t})};var g=function(){var e=(0,c.LU)().footer,t=e||{},a=t.copyright,r=t.links,n=void 0===r?[]:r,d=t.logo,p=void 0===d?{}:d,g={light:(0,s.Z)(p.src),dark:(0,s.Z)(p.srcDark||p.src)};return e?l.createElement("footer",{className:(0,o.Z)("footer",{"footer--dark":"dark"===e.style})},l.createElement("div",{className:"container"},n&&n.length>0&&l.createElement("div",{className:"row footer__links"},n.map((function(e,t){return l.createElement("div",{key:t,className:"col footer__col"},null!=e.title?l.createElement("h4",{className:"footer__title"},e.title):null,null!=e.items&&Array.isArray(e.items)&&e.items.length>0?l.createElement("ul",{className:"footer__items"},e.items.map((function(e,t){return e.html?l.createElement("li",{key:t,className:"footer__item",dangerouslySetInnerHTML:{__html:e.html}}):l.createElement("li",{key:e.href||e.to,className:"footer__item"},l.createElement(f,e))}))):null)}))),(p||a)&&l.createElement("div",{className:"footer__bottom text--center"},p&&(p.src||p.srcDark)&&l.createElement("div",{className:"margin-bottom--sm"},p.href?l.createElement(i.Z,{href:p.href,className:m},l.createElement(v,{alt:p.alt,sources:g})):l.createElement(v,{alt:p.alt,sources:g})),a?l.createElement("div",{className:u,dangerouslySetInnerHTML:{__html:a}}):null))):null}}}]);