"use strict";(self.webpackChunkwebsite=self.webpackChunkwebsite||[]).push([[4029],{4137:function(e,t,r){r.d(t,{Zo:function(){return m},kt:function(){return f}});var n=r(7294);function a(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function l(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),r.push.apply(r,n)}return r}function i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?l(Object(r),!0).forEach((function(t){a(e,t,r[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):l(Object(r)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))}))}return e}function c(e,t){if(null==e)return{};var r,n,a=function(e,t){if(null==e)return{};var r,n,a={},l=Object.keys(e);for(n=0;n<l.length;n++)r=l[n],t.indexOf(r)>=0||(a[r]=e[r]);return a}(e,t);if(Object.getOwnPropertySymbols){var l=Object.getOwnPropertySymbols(e);for(n=0;n<l.length;n++)r=l[n],t.indexOf(r)>=0||Object.prototype.propertyIsEnumerable.call(e,r)&&(a[r]=e[r])}return a}var o=n.createContext({}),s=function(e){var t=n.useContext(o),r=t;return e&&(r="function"==typeof e?e(t):i(i({},t),e)),r},m=function(e){var t=s(e.components);return n.createElement(o.Provider,{value:t},e.children)},u={inlineCode:"code",wrapper:function(e){var t=e.children;return n.createElement(n.Fragment,{},t)}},d=n.forwardRef((function(e,t){var r=e.components,a=e.mdxType,l=e.originalType,o=e.parentName,m=c(e,["components","mdxType","originalType","parentName"]),d=s(r),f=a,p=d["".concat(o,".").concat(f)]||d[f]||u[f]||l;return r?n.createElement(p,i(i({ref:t},m),{},{components:r})):n.createElement(p,i({ref:t},m))}));function f(e,t){var r=arguments,a=t&&t.mdxType;if("string"==typeof e||a){var l=r.length,i=new Array(l);i[0]=d;var c={};for(var o in t)hasOwnProperty.call(t,o)&&(c[o]=t[o]);c.originalType=e,c.mdxType="string"==typeof e?e:a,i[1]=c;for(var s=2;s<l;s++)i[s]=r[s];return n.createElement.apply(null,i)}return n.createElement.apply(null,r)}d.displayName="MDXCreateElement"},2896:function(e,t,r){r.d(t,{Z:function(){return E}});var n=r(3366),a=r(7294),l=r(6010),i=r(2051),c=r(2511),o="sidebar_2ahu",s="sidebarItemTitle_2hhb",m="sidebarItemList_2xAf",u="sidebarItem_2UVv",d="sidebarItemLink_1RT6",f="sidebarItemLinkActive_12pM",p=r(7130);function g(e){var t=e.sidebar;return 0===t.items.length?null:a.createElement("nav",{className:(0,l.Z)(o,"thin-scrollbar"),"aria-label":(0,p.I)({id:"theme.blog.sidebar.navAriaLabel",message:"Blog recent posts navigation",description:"The ARIA label for recent posts in the blog sidebar"})},a.createElement("div",{className:(0,l.Z)(s,"margin-bottom--md")},t.title),a.createElement("ul",{className:m},t.items.map((function(e){return a.createElement("li",{key:e.permalink,className:u},a.createElement(c.Z,{isNavLink:!0,to:e.permalink,className:d,activeClassName:f},e.title))}))))}var v=r(5389),h=["sidebar","toc","children"];var E=function(e){var t=e.sidebar,r=e.toc,c=e.children,o=(0,n.Z)(e,h),s=t&&t.items.length>0;return a.createElement(i.Z,o,a.createElement("div",{className:"container margin-vert--lg"},a.createElement("div",{className:"row"},s&&a.createElement("aside",{className:"col col--3"},a.createElement(g,{sidebar:t})),a.createElement("main",{className:(0,l.Z)("col",{"col--7":s,"col--9 col--offset-1":!s}),itemScope:!0,itemType:"http://schema.org/Blog"},c),r&&a.createElement("div",{className:"col col--2"},a.createElement(v.Z,{toc:r})))))}},8786:function(e,t,r){r.d(t,{Z:function(){return y}});var n=r(7294),a=r(6010),l=r(4137),i=r(7130),c=r(2511),o=r(9524),s=r(5653),m=r(3006),u=r(7680),d="blogPostTitle_GeHD",f="blogPostData_291c",p="blogPostDetailsFull_3kfx",g=r(5433),v="image_1yU8";var h=function(e){var t=e.author,r=t.name,a=t.title,l=t.url,i=t.imageURL;return n.createElement("div",{className:"avatar margin-bottom--sm"},i&&n.createElement(c.Z,{className:"avatar__photo-link avatar__photo",href:l},n.createElement("img",{className:v,src:i,alt:r})),r&&n.createElement("div",{className:"avatar__intro",itemProp:"author",itemScope:!0,itemType:"https://schema.org/Person"},n.createElement("div",{className:"avatar__name"},n.createElement(c.Z,{href:l,itemProp:"url"},n.createElement("span",{itemProp:"name"},r))),a&&n.createElement("small",{className:"avatar__subtitle",itemProp:"description"},a)))},E="authorCol_1R69";function b(e){var t=e.authors,r=e.assets;return 0===t.length?n.createElement(n.Fragment,null):n.createElement("div",{className:"row margin-top--md margin-bottom--sm"},t.map((function(e,t){var l;return n.createElement("div",{className:(0,a.Z)("col col--6",E),key:t},n.createElement(h,{author:Object.assign({},e,{imageURL:null!=(l=r.authorsImageUrls[t])?l:e.imageURL})}))})))}var y=function(e){var t,r,v,h,E=(v=(0,s.c2)().selectMessage,function(e){var t=Math.ceil(e);return v(t,(0,i.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}))}),y=(0,o.C)().withBaseUrl,Z=e.children,N=e.frontMatter,_=e.assets,O=e.metadata,T=e.truncated,P=e.isBlogPostPage,k=void 0!==P&&P,w=O.date,C=O.formattedDate,x=O.permalink,j=O.tags,L=O.readingTime,R=O.title,U=O.editUrl,A=O.authors,I=null!=(t=_.image)?t:N.image;return n.createElement("article",{className:k?void 0:"margin-bottom--xl",itemProp:"blogPost",itemScope:!0,itemType:"http://schema.org/BlogPosting"},(h=k?"h1":"h2",n.createElement("header",null,n.createElement(h,{className:d,itemProp:"headline"},k?R:n.createElement(c.Z,{itemProp:"url",to:x},R)),n.createElement("div",{className:(0,a.Z)(f,"margin-vert--md")},n.createElement("time",{dateTime:w,itemProp:"datePublished"},C),void 0!==L&&n.createElement(n.Fragment,null," \xb7 ",E(L))),n.createElement(b,{authors:A,assets:_}))),I&&n.createElement("meta",{itemProp:"image",content:y(I,{absolute:!0})}),n.createElement("div",{className:"markdown",itemProp:"articleBody"},n.createElement(l.Zo,{components:m.Z},Z)),(j.length>0||T)&&n.createElement("footer",{className:(0,a.Z)("row docusaurus-mt-lg",(r={},r[p]=k,r))},j.length>0&&n.createElement("div",{className:(0,a.Z)("col",{"col--9":!k})},n.createElement(g.Z,{tags:j})),k&&U&&n.createElement("div",{className:"col margin-top--sm"},n.createElement(u.Z,{editUrl:U})),!k&&T&&n.createElement("div",{className:"col col--3 text--right"},n.createElement(c.Z,{to:O.permalink,"aria-label":"Read more about "+R},n.createElement("b",null,n.createElement(i.Z,{id:"theme.blog.post.readMore",description:"The label used in blog post item excerpts to link to full blog posts"},"Read More"))))))}},7680:function(e,t,r){r.d(t,{Z:function(){return u}});var n=r(7294),a=r(7130),l=r(7462),i=r(3366),c=r(6010),o="iconEdit_2_ui",s=["className"],m=function(e){var t=e.className,r=(0,i.Z)(e,s);return n.createElement("svg",(0,l.Z)({fill:"currentColor",height:"20",width:"20",viewBox:"0 0 40 40",className:(0,c.Z)(o,t),"aria-hidden":"true"},r),n.createElement("g",null,n.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 n.createElement("a",{href:t,target:"_blank",rel:"noreferrer noopener"},n.createElement(m,null),n.createElement(a.Z,{id:"theme.common.editThisPage",description:"The link label to edit the current page"},"Edit this page"))}},3006:function(e,t,r){r.d(t,{Z:function(){return g}});var n=r(7462),a=r(3366),l=r(7294),i=r(9584),c=r(2511),o=r(3522),s=r(5607),m=r(6010),u=r(5653),d="details_1VDD";function f(e){var t=Object.assign({},e);return l.createElement(u.PO,(0,n.Z)({},t,{className:(0,m.Z)("alert alert--info",d,t.className)}))}var p=["mdxType","originalType"];var g={head:function(e){var t=l.Children.map(e.children,(function(e){return function(e){var t,r;if(null!=e&&null!=(t=e.props)&&t.mdxType&&null!=e&&null!=(r=e.props)&&r.originalType){var n=e.props,i=(n.mdxType,n.originalType,(0,a.Z)(n,p));return l.createElement(e.props.originalType,i)}return e}(e)}));return l.createElement(i.Z,e,t)},code:function(e){var t=e.children;return(0,l.isValidElement)(t)?t:t.includes("\n")?l.createElement(o.Z,e):l.createElement("code",e)},a:function(e){return l.createElement(c.Z,e)},pre:function(e){var t,r=e.children;return(0,l.isValidElement)(r)&&(0,l.isValidElement)(null==r||null==(t=r.props)?void 0:t.children)?null==r?void 0:r.props.children:l.createElement(o.Z,(0,l.isValidElement)(r)?null==r?void 0:r.props:Object.assign({},e))},details:function(e){var t=l.Children.toArray(e.children),r=t.find((function(e){var t;return"summary"===(null==e||null==(t=e.props)?void 0:t.mdxType)})),a=l.createElement(l.Fragment,null,t.filter((function(e){return e!==r})));return l.createElement(f,(0,n.Z)({},e,{summary:r}),a)},h1:(0,s.Z)("h1"),h2:(0,s.Z)("h2"),h3:(0,s.Z)("h3"),h4:(0,s.Z)("h4"),h5:(0,s.Z)("h5"),h6:(0,s.Z)("h6")}},5389:function(e,t,r){r.d(t,{r:function(){return f},Z:function(){return p}});var n=r(7294),a=r(6010),l=r(5653);function i(e){var t=e.getBoundingClientRect();return t.top===t.bottom?i(e.parentNode):t}function c(e){var t,r=e.anchorTopOffset,n=Array.from(document.querySelectorAll(".anchor.anchor__h2, .anchor.anchor__h3")),a=n.find((function(e){return i(e).top>=r}));return a?function(e){return e.top>0&&e.bottom<window.innerHeight/2}(i(a))?a:null!=(t=n[n.indexOf(a)-1])?t:null:n[n.length-1]}function o(){var e=(0,n.useRef)(0),t=(0,l.LU)().navbar.hideOnScroll;return(0,n.useEffect)((function(){e.current=t?0:document.querySelector(".navbar").clientHeight}),[t]),e}var s=function(e){var t=(0,n.useRef)(void 0),r=o();(0,n.useEffect)((function(){var n=e.linkClassName,a=e.linkActiveClassName;function l(){var e=function(e){return Array.from(document.getElementsByClassName(e))}(n),l=c({anchorTopOffset:r.current}),i=e.find((function(e){return l&&l.id===function(e){return decodeURIComponent(e.href.substring(e.href.indexOf("#")+1))}(e)}));e.forEach((function(e){!function(e,r){if(r){var n;t.current&&t.current!==e&&(null==(n=t.current)||n.classList.remove(a)),e.classList.add(a),t.current=e}else e.classList.remove(a)}(e,e===i)}))}return document.addEventListener("scroll",l),document.addEventListener("resize",l),l(),function(){document.removeEventListener("scroll",l),document.removeEventListener("resize",l)}}),[e,r])},m="tableOfContents_35-E",u="table-of-contents__link",d={linkClassName:u,linkActiveClassName:"table-of-contents__link--active"};function f(e){var t=e.toc,r=e.isChild;return t.length?n.createElement("ul",{className:r?"":"table-of-contents table-of-contents__left-border"},t.map((function(e){return n.createElement("li",{key:e.id},n.createElement("a",{href:"#"+e.id,className:u,dangerouslySetInnerHTML:{__html:e.value}}),n.createElement(f,{isChild:!0,toc:e.children}))}))):null}var p=function(e){var t=e.toc;return s(d),n.createElement("div",{className:(0,a.Z)(m,"thin-scrollbar")},n.createElement(f,{toc:t}))}},2724:function(e,t,r){r.d(t,{Z:function(){return s}});var n=r(7294),a=r(6010),l=r(2511),i="tag_1Okp",c="tagRegular_3MiF",o="tagWithCount_1HU1";var s=function(e){var t,r=e.permalink,s=e.name,m=e.count;return n.createElement(l.Z,{href:r,className:(0,a.Z)(i,(t={},t[c]=!m,t[o]=m,t))},s,m&&n.createElement("span",null,m))}},5433:function(e,t,r){r.d(t,{Z:function(){return s}});var n=r(7294),a=r(6010),l=r(7130),i=r(2724),c="tags_2ga9",o="tag_11ep";function s(e){var t=e.tags;return n.createElement(n.Fragment,null,n.createElement("b",null,n.createElement(l.Z,{id:"theme.tags.tagsListLabel",description:"The label alongside a tag list"},"Tags:")),n.createElement("ul",{className:(0,a.Z)(c,"padding--none","margin-left--sm")},t.map((function(e){var t=e.label,r=e.permalink;return n.createElement("li",{key:r,className:o},n.createElement(i.Z,{name:t,permalink:r}))}))))}}}]);