/*! For license information please see a7629950cb7a18c7593baf47d0acfe798f1cddc4-2745402a1facfb7fde52.js.LICENSE.txt */
(window.webpackJsonp=window.webpackJsonp||[]).push([[2],{"0pJf":function(t,e){t.exports={isExternalUrl:function(t){return new RegExp("^((https?:)?//)","i").test(t)}}},"0xIW":function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n("q1tI");e.default=function(t){r.useEffect(t,[])}},"6R+2":function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n("mrSG"),o=n("q1tI"),i=n("9+Sh"),a=r.__importDefault(n("eM9k"));e.default=function(){var t=a.default({x:i.isClient?window.pageXOffset:0,y:i.isClient?window.pageYOffset:0}),e=t[0],n=t[1];return o.useEffect((function(){var t=function(){n({x:window.pageXOffset,y:window.pageYOffset})};return window.addEventListener("scroll",t,{capture:!1,passive:!0}),function(){window.removeEventListener("scroll",t)}}),[]),e}},"8+s/":function(t,e,n){"use strict";function r(t){return t&&"object"==typeof t&&"default"in t?t.default:t}var o=n("q1tI"),i=r(o),a=r(n("Gytx"));function c(t,e,n){return e in t?Object.defineProperty(t,e,{value:n,enumerable:!0,configurable:!0,writable:!0}):t[e]=n,t}var u=!("undefined"==typeof window||!window.document||!window.document.createElement);t.exports=function(t,e,n){if("function"!=typeof t)throw new Error("Expected reducePropsToState to be a function.");if("function"!=typeof e)throw new Error("Expected handleStateChangeOnClient to be a function.");if(void 0!==n&&"function"!=typeof n)throw new Error("Expected mapStateOnServer to either be undefined or a function.");return function(r){if("function"!=typeof r)throw new Error("Expected WrappedComponent to be a React component.");var l,s=[];function f(){l=t(s.map((function(t){return t.props}))),d.canUseDOM?e(l):n&&(l=n(l))}var d=function(t){var e,n;function o(){return t.apply(this,arguments)||this}n=t,(e=o).prototype=Object.create(n.prototype),e.prototype.constructor=e,e.__proto__=n,o.peek=function(){return l},o.rewind=function(){if(o.canUseDOM)throw new Error("You may only call rewind() on the server. Call peek() to read the current state.");var t=l;return l=void 0,s=[],t};var c=o.prototype;return c.shouldComponentUpdate=function(t){return!a(t,this.props)},c.componentWillMount=function(){s.push(this),f()},c.componentDidUpdate=function(){f()},c.componentWillUnmount=function(){var t=s.indexOf(this);s.splice(t,1),f()},c.render=function(){return i.createElement(r,this.props)},o}(o.Component);return c(d,"displayName","SideEffect("+function(t){return t.displayName||t.name||"Component"}(r)+")"),c(d,"canUseDOM",u),d}}},"9+Sh":function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.isDeepEqual=e.off=e.on=e.isClient=void 0;var r=n("mrSG").__importDefault(n("nkPT"));e.isClient="object"==typeof window,e.on=function(t){for(var e=[],n=1;n<arguments.length;n++)e[n-1]=arguments[n];return t.addEventListener.apply(t,e)},e.off=function(t){for(var e=[],n=1;n<arguments.length;n++)e[n-1]=arguments[n];return t.removeEventListener.apply(t,e)},e.isDeepEqual=r.default},AArq:function(t,e,n){t.exports=n.p+"static/logo-f730a0b8e533f2d4da7bd901d2b7ab80.png"},Emr8:function(t,e){function n(t,e){return("/"+t+"/"+e).replace(/\/\/+/g,"/")}function r(t){return new RegExp("^((https?:)?//)","i").test(t)}t.exports={resolveLink:function(t,e){return r(t)?t:n(e,t)},normalizeBasePath:n,isExternalUrl:r}},Gytx:function(t,e){t.exports=function(t,e,n,r){var o=n?n.call(r,t,e):void 0;if(void 0!==o)return!!o;if(t===e)return!0;if("object"!=typeof t||!t||"object"!=typeof e||!e)return!1;var i=Object.keys(t),a=Object.keys(e);if(i.length!==a.length)return!1;for(var c=Object.prototype.hasOwnProperty.bind(e),u=0;u<i.length;u++){var l=i[u];if(!c(l))return!1;var s=t[l],f=e[l];if(!1===(o=n?n.call(r,s,f,l):void 0)||void 0===o&&s!==f)return!1}return!0}},Lnxd:function(t,e,n){"use strict";n.d(e,"a",(function(){return u}));var r=n("q1tI"),o={color:void 0,size:void 0,className:void 0,style:void 0,attr:void 0},i=r.createContext&&r.createContext(o),a=function(){return(a=Object.assign||function(t){for(var e,n=1,r=arguments.length;n<r;n++)for(var o in e=arguments[n])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t}).apply(this,arguments)},c=function(t,e){var n={};for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&e.indexOf(r)<0&&(n[r]=t[r]);if(null!=t&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(t);o<r.length;o++)e.indexOf(r[o])<0&&(n[r[o]]=t[r[o]])}return n};function u(t){return function(e){return r.createElement(l,a({attr:a({},t.attr)},e),function t(e){return e&&e.map((function(e,n){return r.createElement(e.tag,a({key:n},e.attr),t(e.child))}))}(t.child))}}function l(t){var e=function(e){var n,o=t.size||e.size||"1em";e.className&&(n=e.className),t.className&&(n=(n?n+" ":"")+t.className);var i=t.attr,u=t.title,l=c(t,["attr","title"]);return r.createElement("svg",a({stroke:"currentColor",fill:"currentColor",strokeWidth:"0"},e.attr,i,l,{className:n,style:a({color:t.color||e.color},e.style,t.style),height:o,width:o,xmlns:"http://www.w3.org/2000/svg"}),u&&r.createElement("title",null,u),t.children)};return void 0!==i?r.createElement(i.Consumer,null,(function(t){return e(t)})):e(o)}},"T/ZZ":function(t,e,n){var r,o,i;i=function(){function t(t){var e=[];if(0===t.length)return"";if("string"!=typeof t[0])throw new TypeError("Url must be a string. Received "+t[0]);if(t[0].match(/^[^/:]+:\/*$/)&&t.length>1){var n=t.shift();t[0]=n+t[0]}t[0].match(/^file:\/\/\//)?t[0]=t[0].replace(/^([^/:]+):\/*/,"$1:///"):t[0]=t[0].replace(/^([^/:]+):\/*/,"$1://");for(var r=0;r<t.length;r++){var o=t[r];if("string"!=typeof o)throw new TypeError("Url must be a string. Received "+o);""!==o&&(r>0&&(o=o.replace(/^[\/]+/,"")),o=r<t.length-1?o.replace(/[\/]+$/,""):o.replace(/[\/]+$/,"/"),e.push(o))}var i=e.join("/"),a=(i=i.replace(/\/(\?|&|#[^!])/g,"$1")).split("?");return i=a.shift()+(a.length>0?"?":"")+a.join("&")}return function(){return t("object"==typeof arguments[0]?arguments[0]:[].slice.call(arguments))}},t.exports?t.exports=i():void 0===(o="function"==typeof(r=i)?r.call(e,n,e,t):r)||(t.exports=o)},TJpk:function(t,e,n){e.__esModule=!0,e.Helmet=void 0;var r=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(t[r]=n[r])}return t},o=function(){function t(t,e){for(var n=0;n<e.length;n++){var r=e[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(t,r.key,r)}}return function(e,n,r){return n&&t(e.prototype,n),r&&t(e,r),e}}(),i=f(n("q1tI")),a=f(n("17x9")),c=f(n("8+s/")),u=f(n("bmMU")),l=n("v1p5"),s=n("hFT/");function f(t){return t&&t.__esModule?t:{default:t}}function d(t,e){var n={};for(var r in t)e.indexOf(r)>=0||Object.prototype.hasOwnProperty.call(t,r)&&(n[r]=t[r]);return n}function p(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function m(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}var h,b,T,y=(0,c.default)(l.reducePropsToState,l.handleClientStateChange,l.mapStateOnServer)((function(){return null})),g=(h=y,T=b=function(t){function e(){return p(this,e),m(this,t.apply(this,arguments))}return function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}(e,t),e.prototype.shouldComponentUpdate=function(t){return!(0,u.default)(this.props,t)},e.prototype.mapNestedChildrenToProps=function(t,e){if(!e)return null;switch(t.type){case s.TAG_NAMES.SCRIPT:case s.TAG_NAMES.NOSCRIPT:return{innerHTML:e};case s.TAG_NAMES.STYLE:return{cssText:e}}throw new Error("<"+t.type+" /> elements are self-closing and can not contain children. Refer to our API for more information.")},e.prototype.flattenArrayTypeChildren=function(t){var e,n=t.child,o=t.arrayTypeChildren,i=t.newChildProps,a=t.nestedChildren;return r({},o,((e={})[n.type]=[].concat(o[n.type]||[],[r({},i,this.mapNestedChildrenToProps(n,a))]),e))},e.prototype.mapObjectTypeChildren=function(t){var e,n,o=t.child,i=t.newProps,a=t.newChildProps,c=t.nestedChildren;switch(o.type){case s.TAG_NAMES.TITLE:return r({},i,((e={})[o.type]=c,e.titleAttributes=r({},a),e));case s.TAG_NAMES.BODY:return r({},i,{bodyAttributes:r({},a)});case s.TAG_NAMES.HTML:return r({},i,{htmlAttributes:r({},a)})}return r({},i,((n={})[o.type]=r({},a),n))},e.prototype.mapArrayTypeChildrenToProps=function(t,e){var n=r({},e);return Object.keys(t).forEach((function(e){var o;n=r({},n,((o={})[e]=t[e],o))})),n},e.prototype.warnOnInvalidChildren=function(t,e){return!0},e.prototype.mapChildrenToProps=function(t,e){var n=this,r={};return i.default.Children.forEach(t,(function(t){if(t&&t.props){var o=t.props,i=o.children,a=d(o,["children"]),c=(0,l.convertReactPropstoHtmlAttributes)(a);switch(n.warnOnInvalidChildren(t,i),t.type){case s.TAG_NAMES.LINK:case s.TAG_NAMES.META:case s.TAG_NAMES.NOSCRIPT:case s.TAG_NAMES.SCRIPT:case s.TAG_NAMES.STYLE:r=n.flattenArrayTypeChildren({child:t,arrayTypeChildren:r,newChildProps:c,nestedChildren:i});break;default:e=n.mapObjectTypeChildren({child:t,newProps:e,newChildProps:c,nestedChildren:i})}}})),e=this.mapArrayTypeChildrenToProps(r,e)},e.prototype.render=function(){var t=this.props,e=t.children,n=d(t,["children"]),o=r({},n);return e&&(o=this.mapChildrenToProps(e,o)),i.default.createElement(h,o)},o(e,null,[{key:"canUseDOM",set:function(t){h.canUseDOM=t}}]),e}(i.default.Component),b.propTypes={base:a.default.object,bodyAttributes:a.default.object,children:a.default.oneOfType([a.default.arrayOf(a.default.node),a.default.node]),defaultTitle:a.default.string,defer:a.default.bool,encodeSpecialCharacters:a.default.bool,htmlAttributes:a.default.object,link:a.default.arrayOf(a.default.object),meta:a.default.arrayOf(a.default.object),noscript:a.default.arrayOf(a.default.object),onChangeClientState:a.default.func,script:a.default.arrayOf(a.default.object),style:a.default.arrayOf(a.default.object),title:a.default.string,titleAttributes:a.default.object,titleTemplate:a.default.string},b.defaultProps={defer:!0,encodeSpecialCharacters:!0},b.peek=h.peek,b.rewind=function(){var t=h.rewind();return t||(t=(0,l.mapStateOnServer)({baseTag:[],bodyAttributes:{},encodeSpecialCharacters:!0,htmlAttributes:{},linkTags:[],metaTags:[],noscriptTags:[],scriptTags:[],styleTags:[],title:"",titleAttributes:{}})),t},T);g.renderStatic=g.rewind,e.Helmet=g,e.default=g},bmMU:function(t,e,n){"use strict";var r=Array.isArray,o=Object.keys,i=Object.prototype.hasOwnProperty,a="undefined"!=typeof Element;t.exports=function(t,e){try{return function t(e,n){if(e===n)return!0;if(e&&n&&"object"==typeof e&&"object"==typeof n){var c,u,l,s=r(e),f=r(n);if(s&&f){if((u=e.length)!=n.length)return!1;for(c=u;0!=c--;)if(!t(e[c],n[c]))return!1;return!0}if(s!=f)return!1;var d=e instanceof Date,p=n instanceof Date;if(d!=p)return!1;if(d&&p)return e.getTime()==n.getTime();var m=e instanceof RegExp,h=n instanceof RegExp;if(m!=h)return!1;if(m&&h)return e.toString()==n.toString();var b=o(e);if((u=b.length)!==o(n).length)return!1;for(c=u;0!=c--;)if(!i.call(n,b[c]))return!1;if(a&&e instanceof Element&&n instanceof Element)return e===n;for(c=u;0!=c--;)if(!("_owner"===(l=b[c])&&e.$$typeof||t(e[l],n[l])))return!1;return!0}return e!=e&&n!=n}(t,e)}catch(n){if(n.message&&n.message.match(/stack|recursion/i)||-2146828260===n.number)return console.warn("Warning: react-fast-compare does not handle circular references.",n.name,n.message),!1;throw n}}},dcqB:function(t,e,n){"use strict";n.d(e,"a",(function(){return l}));n("q1tI");var r=n("TJpk"),o=n.n(r),i=n("T/ZZ"),a=n.n(i),c=n("Wbzz"),u=n("qKvR");function l(t){var e=t.description,n=t.title,r=t.slug,i=t.image,l=t.children,s=Object(c.useStaticQuery)("2501019404").site.siteMetadata,f=s.siteTitle,d=s.siteTitleShort,p=s.siteUrl,m=s.defaultTitle,h=s.siteImage,b=s.siteDescription,T=s.siteLanguage,y=s.siteAuthor,g=s.siteIcon,E=n?n+" | "+f:m,v=a()(p,r),O=a()(p,i||h),A=e||b,w=[{"@context":"http://schema.org","@type":"WebSite",url:v,name:n,alternateName:d}];return Object(u.d)(o.a,{htmlAttributes:{lang:T},title:E},g&&Object(u.d)("link",{rel:"icon",href:g}),Object(u.d)("meta",{name:"description",content:A}),Object(u.d)("meta",{name:"image",content:O}),Object(u.d)("meta",{httpEquiv:"x-ua-compatible",content:"IE=edge,chrome=1"}),Object(u.d)("meta",{name:"MobileOptimized",content:"320"}),Object(u.d)("meta",{name:"HandheldFriendly",content:"True"}),Object(u.d)("meta",{name:"google",content:"notranslate"}),Object(u.d)("meta",{name:"referrer",content:"no-referrer-when-downgrade"}),Object(u.d)("meta",{property:"og:url",content:v}),Object(u.d)("meta",{property:"og:type",content:"website"}),Object(u.d)("meta",{property:"og:title",content:E}),Object(u.d)("meta",{property:"og:description",content:A}),Object(u.d)("meta",{property:"og:locale",content:T}),Object(u.d)("meta",{property:"og:site_name",content:f}),Object(u.d)("meta",{property:"og:image",content:O}),Object(u.d)("meta",{property:"og:image:secure_url",content:O}),Object(u.d)("meta",{property:"og:image:alt",content:"Banner"}),Object(u.d)("meta",{property:"og:image:type",content:"image/png"}),Object(u.d)("meta",{property:"og:image:width",content:"1200"}),Object(u.d)("meta",{property:"og:image:height",content:"630"}),Object(u.d)("meta",{name:"twitter:card",content:"summary_large_image"}),Object(u.d)("meta",{name:"twitter:title",content:E}),Object(u.d)("meta",{name:"twitter:site",content:y}),Object(u.d)("meta",{name:"twitter:creator",content:y}),Object(u.d)("meta",{name:"twitter:image",content:O}),Object(u.d)("meta",{name:"twitter:image:src",content:O}),Object(u.d)("meta",{name:"twitter:image:alt",content:"Banner"}),Object(u.d)("meta",{name:"twitter:image:width",content:"1200"}),Object(u.d)("meta",{name:"twitter:image:height",content:"630"}),Object(u.d)("script",{type:"application/ld+json"},JSON.stringify(w)),l)}l.defaultProps={title:"",description:"",slug:"",image:"",children:""}},eM9k:function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n("mrSG"),o=n("q1tI"),i=r.__importDefault(n("n5OK"));e.default=function(t){var e=o.useRef(0),n=o.useState(t),r=n[0],a=n[1],c=o.useCallback((function(t){cancelAnimationFrame(e.current),e.current=requestAnimationFrame((function(){a(t)}))}),[]);return i.default((function(){cancelAnimationFrame(e.current)})),[r,c]}},"hFT/":function(t,e){e.__esModule=!0;e.ATTRIBUTE_NAMES={BODY:"bodyAttributes",HTML:"htmlAttributes",TITLE:"titleAttributes"};var n=e.TAG_NAMES={BASE:"base",BODY:"body",HEAD:"head",HTML:"html",LINK:"link",META:"meta",NOSCRIPT:"noscript",SCRIPT:"script",STYLE:"style",TITLE:"title"},r=(e.VALID_TAG_NAMES=Object.keys(n).map((function(t){return n[t]})),e.TAG_PROPERTIES={CHARSET:"charset",CSS_TEXT:"cssText",HREF:"href",HTTPEQUIV:"http-equiv",INNER_HTML:"innerHTML",ITEM_PROP:"itemprop",NAME:"name",PROPERTY:"property",REL:"rel",SRC:"src"},e.REACT_TAG_MAP={accesskey:"accessKey",charset:"charSet",class:"className",contenteditable:"contentEditable",contextmenu:"contextMenu","http-equiv":"httpEquiv",itemprop:"itemProp",tabindex:"tabIndex"});e.HELMET_PROPS={DEFAULT_TITLE:"defaultTitle",DEFER:"defer",ENCODE_SPECIAL_CHARACTERS:"encodeSpecialCharacters",ON_CHANGE_CLIENT_STATE:"onChangeClientState",TITLE_TEMPLATE:"titleTemplate"},e.HTML_TAG_MAP=Object.keys(r).reduce((function(t,e){return t[r[e]]=e,t}),{}),e.SELF_CLOSING_TAGS=[n.NOSCRIPT,n.SCRIPT,n.STYLE],e.HELMET_ATTRIBUTE="data-react-helmet"},mrSG:function(t,e,n){"use strict";n.r(e),n.d(e,"__extends",(function(){return o})),n.d(e,"__assign",(function(){return i})),n.d(e,"__rest",(function(){return a})),n.d(e,"__decorate",(function(){return c})),n.d(e,"__param",(function(){return u})),n.d(e,"__metadata",(function(){return l})),n.d(e,"__awaiter",(function(){return s})),n.d(e,"__generator",(function(){return f})),n.d(e,"__createBinding",(function(){return d})),n.d(e,"__exportStar",(function(){return p})),n.d(e,"__values",(function(){return m})),n.d(e,"__read",(function(){return h})),n.d(e,"__spread",(function(){return b})),n.d(e,"__spreadArrays",(function(){return T})),n.d(e,"__await",(function(){return y})),n.d(e,"__asyncGenerator",(function(){return g})),n.d(e,"__asyncDelegator",(function(){return E})),n.d(e,"__asyncValues",(function(){return v})),n.d(e,"__makeTemplateObject",(function(){return O})),n.d(e,"__importStar",(function(){return w})),n.d(e,"__importDefault",(function(){return _})),n.d(e,"__classPrivateFieldGet",(function(){return S})),n.d(e,"__classPrivateFieldSet",(function(){return j}));var r=function(t,e){return(r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n])})(t,e)};function o(t,e){function n(){this.constructor=t}r(t,e),t.prototype=null===e?Object.create(e):(n.prototype=e.prototype,new n)}var i=function(){return(i=Object.assign||function(t){for(var e,n=1,r=arguments.length;n<r;n++)for(var o in e=arguments[n])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t}).apply(this,arguments)};function a(t,e){var n={};for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&e.indexOf(r)<0&&(n[r]=t[r]);if(null!=t&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(t);o<r.length;o++)e.indexOf(r[o])<0&&Object.prototype.propertyIsEnumerable.call(t,r[o])&&(n[r[o]]=t[r[o]])}return n}function c(t,e,n,r){var o,i=arguments.length,a=i<3?e:null===r?r=Object.getOwnPropertyDescriptor(e,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(t,e,n,r);else for(var c=t.length-1;c>=0;c--)(o=t[c])&&(a=(i<3?o(a):i>3?o(e,n,a):o(e,n))||a);return i>3&&a&&Object.defineProperty(e,n,a),a}function u(t,e){return function(n,r){e(n,r,t)}}function l(t,e){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(t,e)}function s(t,e,n,r){return new(n||(n=Promise))((function(o,i){function a(t){try{u(r.next(t))}catch(e){i(e)}}function c(t){try{u(r.throw(t))}catch(e){i(e)}}function u(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(a,c)}u((r=r.apply(t,e||[])).next())}))}function f(t,e){var n,r,o,i,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:c(0),throw:c(1),return:c(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function c(i){return function(c){return function(i){if(n)throw new TypeError("Generator is already executing.");for(;a;)try{if(n=1,r&&(o=2&i[0]?r.return:i[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,i[1])).done)return o;switch(r=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return a.label++,{value:i[1],done:!1};case 5:a.label++,r=i[1],i=[0];continue;case 7:i=a.ops.pop(),a.trys.pop();continue;default:if(!(o=a.trys,(o=o.length>0&&o[o.length-1])||6!==i[0]&&2!==i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]<o[3])){a.label=i[1];break}if(6===i[0]&&a.label<o[1]){a.label=o[1],o=i;break}if(o&&a.label<o[2]){a.label=o[2],a.ops.push(i);break}o[2]&&a.ops.pop(),a.trys.pop();continue}i=e.call(t,a)}catch(c){i=[6,c],r=0}finally{n=o=0}if(5&i[0])throw i[1];return{value:i[0]?i[1]:void 0,done:!0}}([i,c])}}}var d=Object.create?function(t,e,n,r){void 0===r&&(r=n),Object.defineProperty(t,r,{enumerable:!0,get:function(){return e[n]}})}:function(t,e,n,r){void 0===r&&(r=n),t[r]=e[n]};function p(t,e){for(var n in t)"default"===n||Object.prototype.hasOwnProperty.call(e,n)||d(e,t,n)}function m(t){var e="function"==typeof Symbol&&Symbol.iterator,n=e&&t[e],r=0;if(n)return n.call(t);if(t&&"number"==typeof t.length)return{next:function(){return t&&r>=t.length&&(t=void 0),{value:t&&t[r++],done:!t}}};throw new TypeError(e?"Object is not iterable.":"Symbol.iterator is not defined.")}function h(t,e){var n="function"==typeof Symbol&&t[Symbol.iterator];if(!n)return t;var r,o,i=n.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(r=i.next()).done;)a.push(r.value)}catch(c){o={error:c}}finally{try{r&&!r.done&&(n=i.return)&&n.call(i)}finally{if(o)throw o.error}}return a}function b(){for(var t=[],e=0;e<arguments.length;e++)t=t.concat(h(arguments[e]));return t}function T(){for(var t=0,e=0,n=arguments.length;e<n;e++)t+=arguments[e].length;var r=Array(t),o=0;for(e=0;e<n;e++)for(var i=arguments[e],a=0,c=i.length;a<c;a++,o++)r[o]=i[a];return r}function y(t){return this instanceof y?(this.v=t,this):new y(t)}function g(t,e,n){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var r,o=n.apply(t,e||[]),i=[];return r={},a("next"),a("throw"),a("return"),r[Symbol.asyncIterator]=function(){return this},r;function a(t){o[t]&&(r[t]=function(e){return new Promise((function(n,r){i.push([t,e,n,r])>1||c(t,e)}))})}function c(t,e){try{(n=o[t](e)).value instanceof y?Promise.resolve(n.value.v).then(u,l):s(i[0][2],n)}catch(r){s(i[0][3],r)}var n}function u(t){c("next",t)}function l(t){c("throw",t)}function s(t,e){t(e),i.shift(),i.length&&c(i[0][0],i[0][1])}}function E(t){var e,n;return e={},r("next"),r("throw",(function(t){throw t})),r("return"),e[Symbol.iterator]=function(){return this},e;function r(r,o){e[r]=t[r]?function(e){return(n=!n)?{value:y(t[r](e)),done:"return"===r}:o?o(e):e}:o}}function v(t){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var e,n=t[Symbol.asyncIterator];return n?n.call(t):(t=m(t),e={},r("next"),r("throw"),r("return"),e[Symbol.asyncIterator]=function(){return this},e);function r(n){e[n]=t[n]&&function(e){return new Promise((function(r,o){(function(t,e,n,r){Promise.resolve(r).then((function(e){t({value:e,done:n})}),e)})(r,o,(e=t[n](e)).done,e.value)}))}}}function O(t,e){return Object.defineProperty?Object.defineProperty(t,"raw",{value:e}):t.raw=e,t}var A=Object.create?function(t,e){Object.defineProperty(t,"default",{enumerable:!0,value:e})}:function(t,e){t.default=e};function w(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var n in t)"default"!==n&&Object.prototype.hasOwnProperty.call(t,n)&&d(e,t,n);return A(e,t),e}function _(t){return t&&t.__esModule?t:{default:t}}function S(t,e){if(!e.has(t))throw new TypeError("attempted to get private field on non-instance");return e.get(t)}function j(t,e,n){if(!e.has(t))throw new TypeError("attempted to set private field on non-instance");return e.set(t,n),n}},n5OK:function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n("mrSG"),o=n("q1tI"),i=r.__importDefault(n("0xIW"));e.default=function(t){var e=o.useRef(t);e.current=t,i.default((function(){return function(){return e.current()}}))}},nkPT:function(t,e,n){"use strict";t.exports=function t(e,n){if(e===n)return!0;if(e&&n&&"object"==typeof e&&"object"==typeof n){if(e.constructor!==n.constructor)return!1;var r,o,i;if(Array.isArray(e)){if((r=e.length)!=n.length)return!1;for(o=r;0!=o--;)if(!t(e[o],n[o]))return!1;return!0}if(e.constructor===RegExp)return e.source===n.source&&e.flags===n.flags;if(e.valueOf!==Object.prototype.valueOf)return e.valueOf()===n.valueOf();if(e.toString!==Object.prototype.toString)return e.toString()===n.toString();if((r=(i=Object.keys(e)).length)!==Object.keys(n).length)return!1;for(o=r;0!=o--;)if(!Object.prototype.hasOwnProperty.call(n,i[o]))return!1;for(o=r;0!=o--;){var a=i[o];if(("_owner"!==a||!e.$$typeof)&&!t(e[a],n[a]))return!1}return!0}return e!=e&&n!=n}},pW3x:function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n("mrSG"),o=n("q1tI"),i=r.__importDefault(n("eM9k")),a=n("9+Sh");e.default=function(t,e){void 0===t&&(t=1/0),void 0===e&&(e=1/0);var n=i.default({width:a.isClient?window.innerWidth:t,height:a.isClient?window.innerHeight:e}),r=n[0],c=n[1];return o.useEffect((function(){if(a.isClient){var t=function(){c({width:window.innerWidth,height:window.innerHeight})};return window.addEventListener("resize",t),function(){window.removeEventListener("resize",t)}}}),[]),r}},tnhK:function(t,e,n){"use strict";n.d(e,"a",(function(){return F}));var r=n("q1tI"),o=n.n(r),i=n("qKvR"),a=n("wLTh"),c=n("6R+2"),u=n.n(c),l=n("pW3x"),s=n.n(l),f=n("wTIg"),d=Object(f.a)("div",{target:"e10o0eax0"})({name:"15t48j3",styles:"position:sticky;top:0;order:2;padding-top:72px;max-height:calc(100vh - 72px);overflow-y:auto;width:100%;max-width:200px;@media (max-width:1200px){position:relative;top:auto;order:0;max-width:100%;margin-left:0;padding-top:0;}"}),p=Object(f.a)("div",{target:"e10o0eax1"})({name:"157u13d",styles:"h2{text-transform:uppercase;font-size:14px;font-weight:bold;letter-spacing:0.142em;margin-top:0rem;border:none;margin:0 0 16px 0;}nav ul{padding-left:0;margin-bottom:0;list-style:none;li{margin-bottom:12px;line-height:1.1;a{font-size:14px;font-weight:400;text-decoration:none;transition:all 0.2s;&:hover{text-decoration:underline;}}}}@media (max-width:1200px){margin:0 0 24px 0;padding-bottom:16px;border-bottom:1px solid rgba(120,117,122,0.2);}"});function m(t){var e=t.headings,n=t.disableTOC,o=t.contentRef,c=u()().y,l=Object(a.b)(),f=s()(),m=f.width,h=f.height,b=Object(r.useState)([]),T=b[0],y=b[1],g=m<=1200;Object(r.useEffect)((function(){if(!g||n){var t,e=null===(t=o.current)||void 0===t?void 0:t.querySelectorAll("h2, h3");y(e&&Array.from(e).map((function(t){var e=t.querySelector("a");return e?{id:t.id,offset:t.offsetTop+e.offsetTop}:{}})).filter(Boolean))}}),[m,h,o,g,n]);var E=Object(r.useMemo)((function(){if(!g||n){var t=c+h/2;if(T)for(var e=T.length-1;e>=0;e-=1){var r=T[e],o=r.id;if(t>=r.offset)return o}}}),[T,h,c,g,n]);return n?Object(i.d)(d,null):Object(i.d)(d,null,Object(i.d)(p,null,Object(i.d)("h2",null,"On this page"),Object(i.d)("nav",null,Object(i.d)("ul",null,e.filter((function(t){return 2===t.depth||3===t.depth})).map((function(t){var e=t.value.toString().toLowerCase().trim().replace(/\s/g,"-").replace(/[^\w\-\u00b4\u00C0-\u00C3\u00c7\u00C9-\u00CA\u00CD\u00D3-\u00D5\u00DA\u00E0-\u00E3\u00E7\u00E9-\u00EA\u00ED\u00F3-\u00F5\u00FA]+/g,"");return Object(i.d)("li",{key:t.value,style:{marginLeft:3===t.depth?"8px":null}},Object(i.d)("a",{href:"#"+e,style:{color:E===e?l.colors.primary:l.colors.text}},t.value))}))))))}m.defaultProps={headings:null};var h=n("Wbzz"),b=n("Emr8");var T=Object(f.a)("aside",{target:"e1wh78ri0"})("width:100%;overflow-y:auto;display:flex;justify-content:space-between;align-items:center;flex-direction:column;position:sticky;top:0;padding-top:36px;transition:transform 0.5s;height:calc(100vh - 1px);nav{width:100%;padding-top:24px;align-self:flex-start;flex:1;}@media (max-width:780px){max-width:75%;min-width:auto;z-index:1001;position:fixed;top:0;bottom:0;left:0;padding-top:32px;background:",(function(t){return t.theme.colors.background}),";transform:translate3d( ",(function(t){return t.isMenuOpen?"0":"-100%"}),",0,0 );}"),y=Object(f.a)("div",{target:"e1wh78ri1"})({name:"2yrou",styles:"width:100%;a{width:100%;padding-left:30px;display:flex;justify-content:flex-start;align-items:center;}"}),g=Object(f.a)("ul",{target:"e1wh78ri2"})({name:"mbmci8",styles:"list-style:none;width:100%;padding-left:0;display:flex;justify-content:flex-start;align-items:center;flex-direction:column;"}),E=Object(f.a)("li",{target:"e1wh78ri3"})("padding-left:30px;width:100%;text-transform:uppercase;font-size:14px;font-weight:bold;margin-top:20px;color:",(function(t){return t.theme.colors.title}),";letter-spacing:0.142em;"),v=Object(f.a)("li",{target:"e1wh78ri4"})("font-size:15px;width:100%;transition:all 200ms ease-in-out;padding:0 20px;cursor:pointer;a,span{display:block;font-size:15px;color:",(function(t){return t.theme.colors.text}),";background-color:",(function(t){return t.theme.colors.background}),";padding:4px 10px;margin:4px 0;border-radius:4px;font-weight:normal;text-decoration:none;width:100%;height:100%;display:flex;justify-content:flex-start;align-items:center;cursor:pointer;margin:0 auto;transition:all 0.2s ease;svg{width:20px;height:20px;margin-right:10px;}&:not(.active-link):hover{color:",(function(t){return t.theme.colors.primary}),";}&.active-link{color:",(function(t){return t.theme.colors.primary}),";background-color:",(function(t){return t.theme.colors.shape}),";}@media (max-width:780px){&.active-link{background:",(function(t){return t.theme.colors.shape}),";}}}"),O=Object(f.a)(g,{target:"e1wh78ri5"})({name:"1lo7kqu",styles:"margin:5px 0 0 0;"}),A=n("0pJf"),w=n("Tgqd");function _(t){var e=t.link,n=t.label;return Object(i.d)("a",{href:e,rel:"noopener noreferrer"},n,Object(i.d)(w.a,{style:{width:"16px",height:"16px",marginLeft:"10px"}}))}function S(t){var e=t.link,n=t.label;return Object(i.d)(h.Link,{to:e,activeClassName:"active-link"},n)}var j=n("AArq"),x=n.n(j);function P(t){return Object(i.d)("img",{src:x.a,alt:"Logo",width:"90px",height:"80px"})}function R(t){var e=t.children,n=t.text;return Object(i.d)(o.a.Fragment,null,Object(i.d)(E,null,n),Object(i.d)(O,null,e))}function M(t){var e=t.isMenuOpen,n=Object(h.useStaticQuery)("2328931024").site.siteMetadata.basePath,r=function(){var t=Object(h.useStaticQuery)("1954253342"),e=t.site.siteMetadata.basePath,n=t.allSidebarItems.edges;return e?n.map((function(t){var n=t.node,r=n.label,o=n.link,i=n.items,a=n.id;return Array.isArray(i)&&(i=i.map((function(t){return{label:t.label,link:Object(b.resolveLink)(t.link,e)}}))),{node:{id:a,label:r,items:i,link:Object(b.resolveLink)(o,e)}}})):n}();function o(t,e){return Object(A.isExternalUrl)(t)?Object(i.d)(_,{link:t,label:e}):Object(i.d)(S,{link:t,label:e})}return Object(i.d)(T,{isMenuOpen:e},Object(i.d)(y,null,Object(i.d)(h.Link,{to:n,"aria-label":"Go to home page"},Object(i.d)(P,{"aria-hidden":"true"}))),Object(i.d)("nav",null,Object(i.d)(g,null,r.map((function(t){var e=t.node,n=e.label,r=e.link,a=e.items,c=e.id;if(Array.isArray(a)){var u=a.map((function(t){return Object(i.d)(v,{key:t.link},o(t.link,t.label))}));return Object(i.d)(R,{key:c,text:n},u)}return Object(i.d)(v,{key:c},o(r,n))})))))}var C=n("tjd4"),I=Object(f.a)("header",{target:"esnpb7p0"})({name:"9q3p0l",styles:"display:flex;justify-content:flex-start;align-items:center;height:40px;margin-bottom:24px;h2{margin:0;border:none;padding:0;font-size:18px;@media (max-width:359px){font-size:14px;}}button{border:none;background:none;cursor:pointer;margin-right:16px;display:flex;justify-content:flex-start;align-items:center;}@media (min-width:780px){display:none;}"});function L(t){var e=t.handleMenuOpen,n=Object(h.useStaticQuery)("973074209").site.siteMetadata.siteTitle;return Object(i.d)(I,null,Object(i.d)("button",{"aria-label":"Open sidebar",type:"button",onClick:e},Object(i.d)(C.a,{size:23,"aria-hidden":"true"})),Object(i.d)("h2",null,n))}var N=n("wx14"),k=n("zLVn");function G(t){var e=t.isMenuOpen,n=Object(k.a)(t,["isMenuOpen"]);return Object(i.d)("div",Object(N.a)({css:Object(i.c)("::after{content:'';position:fixed;width:100%;height:100%;left:0;right:0;bottom:0;background-color:rgba(0,0,0,0.8);z-index:999;display:",e?"block":"none",";}"),"aria-label":"Close menu"},n))}G.defaultProps={isMenuOpen:!1};var H=Object(f.a)("div",{target:"eees1d50"})({name:"1i3ij69",styles:"width:100%;max-width:1400px;margin:0 auto;padding:0 24px;display:grid;grid-template-columns:280px calc(100% - 320px);grid-auto-flow:row;grid-gap:40px;@media (max-width:780px){padding:24px;grid-template-columns:100%;}"}),D=Object(f.a)("main",{target:"eees1d51"})({name:"19vacph",styles:"height:100%;padding-top:36px;width:100%;display:flex;justify-content:flex-start;position:relative;@media (max-width:1200px){flex-direction:column;}@media (max-width:780px){padding-top:0;}"}),U=Object(f.a)("div",{target:"eees1d52"})({name:"1ehkd4h",styles:"width:100%;max-width:calc(75% - 64px);padding-right:64px;@media (max-width:1200px){max-width:100%;padding-right:0;order:3;}"}),B={name:"enx1eb",styles:"display:none;@media (max-width:1200px){display:block;}"},q={name:"1n3b8my",styles:"@media (max-width:1200px){display:none;}"};function F(t){var e=t.children,n=t.disableTableOfContents,a=t.title,c=t.headings,u=Object(r.useRef)(null),l=Object(r.useState)(!1),s=l[0],f=l[1],d=!0===n||!c||0===c.length;function p(){f(!s)}return Object(i.d)(o.a.Fragment,null,Object(i.d)(G,{isMenuOpen:s,onClick:p}),Object(i.d)(H,null,Object(i.d)(M,{isMenuOpen:s}),Object(i.d)(D,null,Object(i.d)(L,{handleMenuOpen:p}),a&&Object(i.d)("h1",{css:B},a),Object(i.d)(U,{ref:u},a&&Object(i.d)("h1",{css:q},a),e),Object(i.d)(m,{headings:c,disableTOC:d,contentRef:u}))))}F.defaultProps={disableTableOfContents:!1,title:"",headings:null}},v1p5:function(t,e,n){(function(t){e.__esModule=!0,e.warn=e.requestAnimationFrame=e.reducePropsToState=e.mapStateOnServer=e.handleClientStateChange=e.convertReactPropstoHtmlAttributes=void 0;var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},o=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(t[r]=n[r])}return t},i=u(n("q1tI")),a=u(n("YVoz")),c=n("hFT/");function u(t){return t&&t.__esModule?t:{default:t}}var l,s=function(t){var e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return!1===e?String(t):String(t).replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#x27;")},f=function(t){var e=b(t,c.TAG_NAMES.TITLE),n=b(t,c.HELMET_PROPS.TITLE_TEMPLATE);if(n&&e)return n.replace(/%s/g,(function(){return e}));var r=b(t,c.HELMET_PROPS.DEFAULT_TITLE);return e||r||void 0},d=function(t){return b(t,c.HELMET_PROPS.ON_CHANGE_CLIENT_STATE)||function(){}},p=function(t,e){return e.filter((function(e){return void 0!==e[t]})).map((function(e){return e[t]})).reduce((function(t,e){return o({},t,e)}),{})},m=function(t,e){return e.filter((function(t){return void 0!==t[c.TAG_NAMES.BASE]})).map((function(t){return t[c.TAG_NAMES.BASE]})).reverse().reduce((function(e,n){if(!e.length)for(var r=Object.keys(n),o=0;o<r.length;o++){var i=r[o].toLowerCase();if(-1!==t.indexOf(i)&&n[i])return e.concat(n)}return e}),[])},h=function(t,e,n){var o={};return n.filter((function(e){return!!Array.isArray(e[t])||(void 0!==e[t]&&v("Helmet: "+t+' should be of type "Array". Instead found type "'+r(e[t])+'"'),!1)})).map((function(e){return e[t]})).reverse().reduce((function(t,n){var r={};n.filter((function(t){for(var n=void 0,i=Object.keys(t),a=0;a<i.length;a++){var u=i[a],l=u.toLowerCase();-1===e.indexOf(l)||n===c.TAG_PROPERTIES.REL&&"canonical"===t[n].toLowerCase()||l===c.TAG_PROPERTIES.REL&&"stylesheet"===t[l].toLowerCase()||(n=l),-1===e.indexOf(u)||u!==c.TAG_PROPERTIES.INNER_HTML&&u!==c.TAG_PROPERTIES.CSS_TEXT&&u!==c.TAG_PROPERTIES.ITEM_PROP||(n=u)}if(!n||!t[n])return!1;var s=t[n].toLowerCase();return o[n]||(o[n]={}),r[n]||(r[n]={}),!o[n][s]&&(r[n][s]=!0,!0)})).reverse().forEach((function(e){return t.push(e)}));for(var i=Object.keys(r),u=0;u<i.length;u++){var l=i[u],s=(0,a.default)({},o[l],r[l]);o[l]=s}return t}),[]).reverse()},b=function(t,e){for(var n=t.length-1;n>=0;n--){var r=t[n];if(r.hasOwnProperty(e))return r[e]}return null},T=(l=Date.now(),function(t){var e=Date.now();e-l>16?(l=e,t(e)):setTimeout((function(){T(t)}),0)}),y=function(t){return clearTimeout(t)},g="undefined"!=typeof window?window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||T:t.requestAnimationFrame||T,E="undefined"!=typeof window?window.cancelAnimationFrame||window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||y:t.cancelAnimationFrame||y,v=function(t){return console&&"function"==typeof console.warn&&console.warn(t)},O=null,A=function(t,e){var n=t.baseTag,r=t.bodyAttributes,o=t.htmlAttributes,i=t.linkTags,a=t.metaTags,u=t.noscriptTags,l=t.onChangeClientState,s=t.scriptTags,f=t.styleTags,d=t.title,p=t.titleAttributes;S(c.TAG_NAMES.BODY,r),S(c.TAG_NAMES.HTML,o),_(d,p);var m={baseTag:j(c.TAG_NAMES.BASE,n),linkTags:j(c.TAG_NAMES.LINK,i),metaTags:j(c.TAG_NAMES.META,a),noscriptTags:j(c.TAG_NAMES.NOSCRIPT,u),scriptTags:j(c.TAG_NAMES.SCRIPT,s),styleTags:j(c.TAG_NAMES.STYLE,f)},h={},b={};Object.keys(m).forEach((function(t){var e=m[t],n=e.newTags,r=e.oldTags;n.length&&(h[t]=n),r.length&&(b[t]=m[t].oldTags)})),e&&e(),l(t,h,b)},w=function(t){return Array.isArray(t)?t.join(""):t},_=function(t,e){void 0!==t&&document.title!==t&&(document.title=w(t)),S(c.TAG_NAMES.TITLE,e)},S=function(t,e){var n=document.getElementsByTagName(t)[0];if(n){for(var r=n.getAttribute(c.HELMET_ATTRIBUTE),o=r?r.split(","):[],i=[].concat(o),a=Object.keys(e),u=0;u<a.length;u++){var l=a[u],s=e[l]||"";n.getAttribute(l)!==s&&n.setAttribute(l,s),-1===o.indexOf(l)&&o.push(l);var f=i.indexOf(l);-1!==f&&i.splice(f,1)}for(var d=i.length-1;d>=0;d--)n.removeAttribute(i[d]);o.length===i.length?n.removeAttribute(c.HELMET_ATTRIBUTE):n.getAttribute(c.HELMET_ATTRIBUTE)!==a.join(",")&&n.setAttribute(c.HELMET_ATTRIBUTE,a.join(","))}},j=function(t,e){var n=document.head||document.querySelector(c.TAG_NAMES.HEAD),r=n.querySelectorAll(t+"["+c.HELMET_ATTRIBUTE+"]"),o=Array.prototype.slice.call(r),i=[],a=void 0;return e&&e.length&&e.forEach((function(e){var n=document.createElement(t);for(var r in e)if(e.hasOwnProperty(r))if(r===c.TAG_PROPERTIES.INNER_HTML)n.innerHTML=e.innerHTML;else if(r===c.TAG_PROPERTIES.CSS_TEXT)n.styleSheet?n.styleSheet.cssText=e.cssText:n.appendChild(document.createTextNode(e.cssText));else{var u=void 0===e[r]?"":e[r];n.setAttribute(r,u)}n.setAttribute(c.HELMET_ATTRIBUTE,"true"),o.some((function(t,e){return a=e,n.isEqualNode(t)}))?o.splice(a,1):i.push(n)})),o.forEach((function(t){return t.parentNode.removeChild(t)})),i.forEach((function(t){return n.appendChild(t)})),{oldTags:o,newTags:i}},x=function(t){return Object.keys(t).reduce((function(e,n){var r=void 0!==t[n]?n+'="'+t[n]+'"':""+n;return e?e+" "+r:r}),"")},P=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return Object.keys(t).reduce((function(e,n){return e[c.REACT_TAG_MAP[n]||n]=t[n],e}),e)},R=function(t,e,n){switch(t){case c.TAG_NAMES.TITLE:return{toComponent:function(){return t=e.title,n=e.titleAttributes,(r={key:t})[c.HELMET_ATTRIBUTE]=!0,o=P(n,r),[i.default.createElement(c.TAG_NAMES.TITLE,o,t)];var t,n,r,o},toString:function(){return function(t,e,n,r){var o=x(n),i=w(e);return o?"<"+t+" "+c.HELMET_ATTRIBUTE+'="true" '+o+">"+s(i,r)+"</"+t+">":"<"+t+" "+c.HELMET_ATTRIBUTE+'="true">'+s(i,r)+"</"+t+">"}(t,e.title,e.titleAttributes,n)}};case c.ATTRIBUTE_NAMES.BODY:case c.ATTRIBUTE_NAMES.HTML:return{toComponent:function(){return P(e)},toString:function(){return x(e)}};default:return{toComponent:function(){return function(t,e){return e.map((function(e,n){var r,o=((r={key:n})[c.HELMET_ATTRIBUTE]=!0,r);return Object.keys(e).forEach((function(t){var n=c.REACT_TAG_MAP[t]||t;if(n===c.TAG_PROPERTIES.INNER_HTML||n===c.TAG_PROPERTIES.CSS_TEXT){var r=e.innerHTML||e.cssText;o.dangerouslySetInnerHTML={__html:r}}else o[n]=e[t]})),i.default.createElement(t,o)}))}(t,e)},toString:function(){return function(t,e,n){return e.reduce((function(e,r){var o=Object.keys(r).filter((function(t){return!(t===c.TAG_PROPERTIES.INNER_HTML||t===c.TAG_PROPERTIES.CSS_TEXT)})).reduce((function(t,e){var o=void 0===r[e]?e:e+'="'+s(r[e],n)+'"';return t?t+" "+o:o}),""),i=r.innerHTML||r.cssText||"",a=-1===c.SELF_CLOSING_TAGS.indexOf(t);return e+"<"+t+" "+c.HELMET_ATTRIBUTE+'="true" '+o+(a?"/>":">"+i+"</"+t+">")}),"")}(t,e,n)}}}};e.convertReactPropstoHtmlAttributes=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return Object.keys(t).reduce((function(e,n){return e[c.HTML_TAG_MAP[n]||n]=t[n],e}),e)},e.handleClientStateChange=function(t){O&&E(O),t.defer?O=g((function(){A(t,(function(){O=null}))})):(A(t),O=null)},e.mapStateOnServer=function(t){var e=t.baseTag,n=t.bodyAttributes,r=t.encode,o=t.htmlAttributes,i=t.linkTags,a=t.metaTags,u=t.noscriptTags,l=t.scriptTags,s=t.styleTags,f=t.title,d=void 0===f?"":f,p=t.titleAttributes;return{base:R(c.TAG_NAMES.BASE,e,r),bodyAttributes:R(c.ATTRIBUTE_NAMES.BODY,n,r),htmlAttributes:R(c.ATTRIBUTE_NAMES.HTML,o,r),link:R(c.TAG_NAMES.LINK,i,r),meta:R(c.TAG_NAMES.META,a,r),noscript:R(c.TAG_NAMES.NOSCRIPT,u,r),script:R(c.TAG_NAMES.SCRIPT,l,r),style:R(c.TAG_NAMES.STYLE,s,r),title:R(c.TAG_NAMES.TITLE,{title:d,titleAttributes:p},r)}},e.reducePropsToState=function(t){return{baseTag:m([c.TAG_PROPERTIES.HREF],t),bodyAttributes:p(c.ATTRIBUTE_NAMES.BODY,t),defer:b(t,c.HELMET_PROPS.DEFER),encode:b(t,c.HELMET_PROPS.ENCODE_SPECIAL_CHARACTERS),htmlAttributes:p(c.ATTRIBUTE_NAMES.HTML,t),linkTags:h(c.TAG_NAMES.LINK,[c.TAG_PROPERTIES.REL,c.TAG_PROPERTIES.HREF],t),metaTags:h(c.TAG_NAMES.META,[c.TAG_PROPERTIES.NAME,c.TAG_PROPERTIES.CHARSET,c.TAG_PROPERTIES.HTTPEQUIV,c.TAG_PROPERTIES.PROPERTY,c.TAG_PROPERTIES.ITEM_PROP],t),noscriptTags:h(c.TAG_NAMES.NOSCRIPT,[c.TAG_PROPERTIES.INNER_HTML],t),onChangeClientState:d(t),scriptTags:h(c.TAG_NAMES.SCRIPT,[c.TAG_PROPERTIES.SRC,c.TAG_PROPERTIES.INNER_HTML],t),styleTags:h(c.TAG_NAMES.STYLE,[c.TAG_PROPERTIES.CSS_TEXT],t),title:f(t),titleAttributes:p(c.ATTRIBUTE_NAMES.TITLE,t)}},e.requestAnimationFrame=g,e.warn=v}).call(this,n("yLpj"))}}]);
//# sourceMappingURL=a7629950cb7a18c7593baf47d0acfe798f1cddc4-2745402a1facfb7fde52.js.map