diff --git a/133dca110fad53aa1997b630637bbac3134a2d14-6028021e9289a0d8bda6.js b/133dca110fad53aa1997b630637bbac3134a2d14-6028021e9289a0d8bda6.js new file mode 100644 index 00000000..a30b96f2 --- /dev/null +++ b/133dca110fad53aa1997b630637bbac3134a2d14-6028021e9289a0d8bda6.js @@ -0,0 +1,3 @@ +/*! For license information please see 133dca110fad53aa1997b630637bbac3134a2d14-6028021e9289a0d8bda6.js.LICENSE.txt */ +(window.webpackJsonp=window.webpackJsonp||[]).push([[0],{"+6XX":function(t,e,n){var r=n("y1pI");t.exports=function(t){return r(this.__data__,t)>-1}},"+K+b":function(t,e,n){var r=n("JHRd");t.exports=function(t){var e=new t.constructor(t.byteLength);return new r(e).set(new r(t)),e}},"+Qka":function(t,e,n){var r=n("fmRc"),o=n("t2Dn"),i=n("cq/+"),a=n("T1AV"),u=n("GoyQ"),c=n("mTTR"),f=n("itsj");t.exports=function t(e,n,s,l,p){e!==n&&i(n,(function(i,c){if(p||(p=new r),u(i))a(e,n,c,s,t,l,p);else{var h=l?l(f(e,c),i,c+"",e,n,p):void 0;void 0===h&&(h=i),o(e,c,h)}}),c)}},"+c4W":function(t,e,n){var r=n("711d"),o=n("4/ic"),i=n("9ggG"),a=n("9Nap");t.exports=function(t){return i(t)?r(a(t)):o(t)}},"+iFO":function(t,e,n){var r=n("dTAl"),o=n("LcsW"),i=n("6sVZ");t.exports=function(t){return"function"!=typeof t.constructor||i(t)?{}:r(o(t))}},"/9aa":function(t,e,n){var r=n("NykK"),o=n("ExA7");t.exports=function(t){return"symbol"==typeof t||o(t)&&"[object Symbol]"==r(t)}},"03A+":function(t,e,n){var r=n("JTzB"),o=n("ExA7"),i=Object.prototype,a=i.hasOwnProperty,u=i.propertyIsEnumerable,c=r(function(){return arguments}())?r:function(t){return o(t)&&a.call(t,"callee")&&!u.call(t,"callee")};t.exports=c},"0Cz8":function(t,e,n){var r=n("Xi7e"),o=n("ebwN"),i=n("e4Nc");t.exports=function(t,e){var n=this.__data__;if(n instanceof r){var a=n.__data__;if(!o||a.length<199)return a.push([t,e]),this.size=++n.size,this;n=this.__data__=new i(a)}return n.set(t,e),this.size=n.size,this}},"0ycA":function(t,e){t.exports=function(){return[]}},"1hJj":function(t,e,n){var r=n("e4Nc"),o=n("ftKO"),i=n("3A9y");function a(t){var e=-1,n=null==t?0:t.length;for(this.__data__=new r;++e0){if(++e>=800)return arguments[0]}else e=0;return t.apply(void 0,arguments)}}},"9Nap":function(t,e,n){var r=n("/9aa");t.exports=function(t){if("string"==typeof t||r(t))return t;var e=t+"";return"0"==e&&1/t==-1/0?"-0":e}},"9ggG":function(t,e,n){var r=n("Z0cm"),o=n("/9aa"),i=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,a=/^\w*$/;t.exports=function(t,e){if(r(t))return!1;var n=typeof t;return!("number"!=n&&"symbol"!=n&&"boolean"!=n&&null!=t&&!o(t))||(a.test(t)||!i.test(t)||null!=e&&t in Object(e))}},A90E:function(t,e,n){var r=n("6sVZ"),o=n("V6Ve"),i=Object.prototype.hasOwnProperty;t.exports=function(t){if(!r(t))return o(t);var e=[];for(var n in Object(t))i.call(t,n)&&"constructor"!=n&&e.push(n);return e}},AP2z:function(t,e,n){var r=n("nmnc"),o=Object.prototype,i=o.hasOwnProperty,a=o.toString,u=r?r.toStringTag:void 0;t.exports=function(t){var e=i.call(t,u),n=t[u];try{t[u]=void 0;var r=!0}catch(c){}var o=a.call(t);return r&&(e?t[u]=n:delete t[u]),o}},B2PW:function(t,e,n){var r=n("TGkP"),o=function(t){return r(t)[0]};t.exports=function(t){return null==t&&(t=t),function(e,n,i,a){null==i&&(i=t),null==a&&(a=i);var u=function(t){return r(t)[1]}(e);if(u===n)return e;var c=o(e);if("px"!==u)if("em"===u)c=o(e)*o(i);else if("rem"===u)c=o(e)*o(t);else{if("ex"!==u)return e;c=o(e)*o(i)*2}var f=c;if("px"!==n)if("em"===n)f=c/o(a);else if("rem"===n)f=c/o(t);else{if("ex"!==n)return e;f=c/o(a)/2}return parseFloat(f.toFixed(5))+n}}},B8du:function(t,e){t.exports=function(){return!1}},CH3K:function(t,e){t.exports=function(t,e){for(var n=-1,r=e.length,o=t.length;++n1?n[i-1]:void 0,u=i>2?n[2]:void 0;for(a=t.length>3&&"function"==typeof a?(i--,a):void 0,u&&o(n[0],n[1],u)&&(a=i<3?void 0:a,i=1),e=Object(e);++rol,li>ul":{marginLeft:e(1.25)},a:{color:"#4078c0",textDecoration:"none"},"a:hover,a:active":{textDecoration:"underline"},blockquote:{borderLeft:"4px solid "+(0,i.default)(87),color:(0,i.default)(47),marginTop:0,marginRight:0,marginLeft:0,paddingLeft:"calc("+e(.5)+" - 1px)"}}}};e.default=a},NKxu:function(t,e,n){var r=n("lSCD"),o=n("E2jh"),i=n("GoyQ"),a=n("3Fdi"),u=/^\[object .+?Constructor\]$/,c=Function.prototype,f=Object.prototype,s=c.toString,l=f.hasOwnProperty,p=RegExp("^"+s.call(l).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");t.exports=function(t){return!(!i(t)||o(t))&&(r(t)?p:u).test(a(t))}},Npjl:function(t,e){t.exports=function(t,e){return null==t?void 0:t[e]}},NykK:function(t,e,n){var r=n("nmnc"),o=n("AP2z"),i=n("KfNM"),a=r?r.toStringTag:void 0;t.exports=function(t){return null==t?void 0===t?"[object Undefined]":"[object Null]":a&&a in Object(t)?o(t):i(t)}},O0oS:function(t,e,n){var r=n("Cwc5"),o=function(){try{var t=r(Object,"defineProperty");return t({},"",{}),t}catch(e){}}();t.exports=o},O7RO:function(t,e,n){var r=n("CMye"),o=n("7GkX");t.exports=function(t){for(var e=o(t),n=e.length;n--;){var i=e[n],a=t[i];e[n]=[i,a,r(a)]}return e}},"Of+w":function(t,e,n){var r=n("Cwc5")(n("Kz5y"),"WeakMap");t.exports=r},Q1l4:function(t,e){t.exports=function(t,e){var n=-1,r=t.length;for(e||(e=Array(r));++n100&&(t=100),t<0&&(t=0);var o=0;if(0!==e){o=19.92978+-.3651759*t+.001737214*Math.pow(t,2)}var i=0;return r?(i=t/100,t="100%,"):(i=(100-t)/100,t="0%,"),"hsla("+e+","+o+"%,"+t+i+")"}},adU4:function(t,e,n){var r=n("y1pI"),o=Array.prototype.splice;t.exports=function(t){var e=this.__data__,n=r(e,t);return!(n<0)&&(n==e.length-1?e.pop():o.call(e,n,1),--this.size,!0)}},asDA:function(t,e){t.exports=function(t,e,n,r){var o=-1,i=null==t?0:t.length;for(r&&i&&(n=t[++o]);++o ol","li > ul"],{marginLeft:t.rhythm(1),marginBottom:"calc("+n+" / 2)",marginTop:"calc("+n+" / 2)"}),r=E(r,["blockquote *:last-child","li *:last-child","p *:last-child"],{marginBottom:0}),r=E(r,["li > p"],{marginBottom:"calc("+n+" / 2)"}),r=E(r,["code","kbd","pre","samp"],L({},t.adjustFontSizeTo("85%"))),(r=E(r,["abbr","acronym"],{borderBottom:"1px dotted "+w.default(50),cursor:"help"}))["abbr[title]"]={borderBottom:"1px dotted "+w.default(50),cursor:"help",textDecoration:"none"},r=E(r,["table"],L({},t.adjustFontSizeTo(e.baseFontSize),{borderCollapse:"collapse",width:"100%"})),r=E(r,["thead"],{textAlign:"left"}),r=E(r,["td,th"],{textAlign:"left",borderBottom:"1px solid "+w.default(88),fontFeatureSettings:'"tnum"',MozFontFeatureSettings:'"tnum"',msFontFeatureSettings:'"tnum"',WebkitFontFeatureSettings:'"tnum"',paddingLeft:t.rhythm(2/3),paddingRight:t.rhythm(2/3),paddingTop:t.rhythm(.5),paddingBottom:"calc("+t.rhythm(.5)+" - 1px)"}),r=E(r,"th:first-child,td:first-child",{paddingLeft:0}),r=E(r,"th:last-child,td:last-child",{paddingRight:0}),r=E(r,["h1","h2","h3","h4","h5","h6"],{color:e.headerColor,fontFamily:e.headerFontFamily.map(P).join(","),fontWeight:e.headerWeight,textRendering:"optimizeLegibility"});var i=t.scale(1),a=t.scale(.6),u=t.scale(.4),c=t.scale(0),f=t.scale(-.2),s=t.scale(-.3);return S.default([i,a,u,c,f,s],(function(t,n){r=_.default(r,"h"+(n+1)+".fontSize",t.fontSize),r=_.default(r,"h"+(n+1)+".lineHeight",e.headerLineHeight)})),F.default(e.plugins)&&(r=M.default(e.plugins,(function(n,r){return A.default(n,r(t,e,n))}),r)),e.overrideStyles&&O.default(e.overrideStyles)&&(r=A.default(r,e.overrideStyles(t,e,r))),e.overrideThemeStyles&&O.default(e.overrideThemeStyles)&&(r=A.default(r,e.overrideThemeStyles(t,e,r))),r}(n,e)},toString:function(){return Z(0,e,this.toJSON())},injectStyles:function(){if("undefined"!=typeof document)if(document.getElementById("typography.js"))document.getElementById("typography.js").innerHTML=this.toString();else{var t=document.createElement("style");t.id="typography.js",t.innerHTML=this.toString();var e=document.head;e.firstChild?e.insertBefore(t,e.firstChild):e.appendChild(t)}}})}},mTTR:function(t,e,n){var r=n("b80T"),o=n("QcOe"),i=n("MMmD");t.exports=function(t){return i(t)?r(t,!0):o(t)}},mc0g:function(t,e){t.exports=function(t){return function(e,n,r){for(var o=-1,i=Object(e),a=r(e),u=a.length;u--;){var c=a[t?u:++o];if(!1===n(i[c],c,i))break}return e}}},mdPL:function(t,e,n){(function(t){var r=n("WFqU"),o=e&&!e.nodeType&&e,i=o&&"object"==typeof t&&t&&!t.nodeType&&t,a=i&&i.exports===o&&r.process,u=function(){try{var t=i&&i.require&&i.require("util").types;return t||a&&a.binding&&a.binding("util")}catch(e){}}();t.exports=u}).call(this,n("YuTi")(t))},"mv/X":function(t,e,n){var r=n("ljhN"),o=n("MMmD"),i=n("wJg7"),a=n("GoyQ");t.exports=function(t,e,n){if(!a(n))return!1;var u=typeof e;return!!("number"==u?o(n)&&i(e,n.length):"string"==u&&e in n)&&r(n[e],t)}},mwIZ:function(t,e,n){var r=n("ZWtO");t.exports=function(t,e,n){var o=null==t?void 0:r(t,e);return void 0===o?n:o}},nmnc:function(t,e,n){var r=n("Kz5y").Symbol;t.exports=r},or5M:function(t,e,n){var r=n("1hJj"),o=n("QoRX"),i=n("xYSL");t.exports=function(t,e,n,a,u,c){var f=1&n,s=t.length,l=e.length;if(s!=l&&!(f&&l>s))return!1;var p=c.get(t),h=c.get(e);if(p&&h)return p==e&&h==t;var d=-1,v=!0,b=2&n?new r:void 0;for(c.set(t,e),c.set(e,t);++d-1&&t%1==0&&t<=9007199254740991}},t2Dn:function(t,e,n){var r=n("hypo"),o=n("ljhN");t.exports=function(t,e,n){(void 0!==n&&!o(t[e],n)||void 0===n&&!(e in t))&&r(t,e,n)}},tMB7:function(t,e,n){var r=n("y1pI");t.exports=function(t){var e=this.__data__,n=r(e,t);return n<0?void 0:e[n][1]}},tadb:function(t,e,n){var r=n("Cwc5")(n("Kz5y"),"DataView");t.exports=r},u8Dt:function(t,e,n){var r=n("YESw"),o=Object.prototype.hasOwnProperty;t.exports=function(t){var e=this.__data__;if(r){var n=e[t];return"__lodash_hash_undefined__"===n?void 0:n}return o.call(e,t)?e[t]:void 0}},"ut/Y":function(t,e,n){var r=n("ZCpW"),o=n("GDhZ"),i=n("zZ0H"),a=n("Z0cm"),u=n("+c4W");t.exports=function(t){return"function"==typeof t?t:null==t?i:"object"==typeof t?a(t)?o(t[0],t[1]):r(t):u(t)}},"wF/u":function(t,e,n){var r=n("e5cp"),o=n("ExA7");t.exports=function t(e,n,i,a,u){return e===n||(null==e||null==n||!o(e)&&!o(n)?e!=e&&n!=n:r(e,n,i,a,t,u))}},wJg7:function(t,e){var n=/^(?:0|[1-9]\d*)$/;t.exports=function(t,e){var r=typeof t;return!!(e=null==e?9007199254740991:e)&&("number"==r||"symbol"!=r&&n.test(t))&&t>-1&&t%1==0&&t -1;\n}\n\nmodule.exports = listCacheHas;\n","var Uint8Array = require('./_Uint8Array');\n\n/**\n * Creates a clone of `arrayBuffer`.\n *\n * @private\n * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n * @returns {ArrayBuffer} Returns the cloned array buffer.\n */\nfunction cloneArrayBuffer(arrayBuffer) {\n var result = new arrayBuffer.constructor(arrayBuffer.byteLength);\n new Uint8Array(result).set(new Uint8Array(arrayBuffer));\n return result;\n}\n\nmodule.exports = cloneArrayBuffer;\n","var Stack = require('./_Stack'),\n assignMergeValue = require('./_assignMergeValue'),\n baseFor = require('./_baseFor'),\n baseMergeDeep = require('./_baseMergeDeep'),\n isObject = require('./isObject'),\n keysIn = require('./keysIn'),\n safeGet = require('./_safeGet');\n\n/**\n * The base implementation of `_.merge` without support for multiple sources.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {number} srcIndex The index of `source`.\n * @param {Function} [customizer] The function to customize merged values.\n * @param {Object} [stack] Tracks traversed source values and their merged\n * counterparts.\n */\nfunction baseMerge(object, source, srcIndex, customizer, stack) {\n if (object === source) {\n return;\n }\n baseFor(source, function(srcValue, key) {\n stack || (stack = new Stack);\n if (isObject(srcValue)) {\n baseMergeDeep(object, source, key, srcIndex, baseMerge, customizer, stack);\n }\n else {\n var newValue = customizer\n ? customizer(safeGet(object, key), srcValue, (key + ''), object, source, stack)\n : undefined;\n\n if (newValue === undefined) {\n newValue = srcValue;\n }\n assignMergeValue(object, key, newValue);\n }\n }, keysIn);\n}\n\nmodule.exports = baseMerge;\n","var baseProperty = require('./_baseProperty'),\n basePropertyDeep = require('./_basePropertyDeep'),\n isKey = require('./_isKey'),\n toKey = require('./_toKey');\n\n/**\n * Creates a function that returns the value at `path` of a given object.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n * @example\n *\n * var objects = [\n * { 'a': { 'b': 2 } },\n * { 'a': { 'b': 1 } }\n * ];\n *\n * _.map(objects, _.property('a.b'));\n * // => [2, 1]\n *\n * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');\n * // => [1, 2]\n */\nfunction property(path) {\n return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);\n}\n\nmodule.exports = property;\n","var baseCreate = require('./_baseCreate'),\n getPrototype = require('./_getPrototype'),\n isPrototype = require('./_isPrototype');\n\n/**\n * Initializes an object clone.\n *\n * @private\n * @param {Object} object The object to clone.\n * @returns {Object} Returns the initialized clone.\n */\nfunction initCloneObject(object) {\n return (typeof object.constructor == 'function' && !isPrototype(object))\n ? baseCreate(getPrototype(object))\n : {};\n}\n\nmodule.exports = initCloneObject;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nmodule.exports = isSymbol;\n","var baseIsArguments = require('./_baseIsArguments'),\n isObjectLike = require('./isObjectLike');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n * else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n !propertyIsEnumerable.call(value, 'callee');\n};\n\nmodule.exports = isArguments;\n","var ListCache = require('./_ListCache'),\n Map = require('./_Map'),\n MapCache = require('./_MapCache');\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\nfunction stackSet(key, value) {\n var data = this.__data__;\n if (data instanceof ListCache) {\n var pairs = data.__data__;\n if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n pairs.push([key, value]);\n this.size = ++data.size;\n return this;\n }\n data = this.__data__ = new MapCache(pairs);\n }\n data.set(key, value);\n this.size = data.size;\n return this;\n}\n\nmodule.exports = stackSet;\n","/**\n * This method returns a new empty array.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {Array} Returns the new empty array.\n * @example\n *\n * var arrays = _.times(2, _.stubArray);\n *\n * console.log(arrays);\n * // => [[], []]\n *\n * console.log(arrays[0] === arrays[1]);\n * // => false\n */\nfunction stubArray() {\n return [];\n}\n\nmodule.exports = stubArray;\n","var MapCache = require('./_MapCache'),\n setCacheAdd = require('./_setCacheAdd'),\n setCacheHas = require('./_setCacheHas');\n\n/**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\nfunction SetCache(values) {\n var index = -1,\n length = values == null ? 0 : values.length;\n\n this.__data__ = new MapCache;\n while (++index < length) {\n this.add(values[index]);\n }\n}\n\n// Add methods to `SetCache`.\nSetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\nSetCache.prototype.has = setCacheHas;\n\nmodule.exports = SetCache;\n","var root = require('./_root');\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\nmodule.exports = coreJsData;\n","/**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */\nfunction setCacheHas(value) {\n return this.__data__.has(value);\n}\n\nmodule.exports = setCacheHas;\n","/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n if (func != null) {\n try {\n return funcToString.call(func);\n } catch (e) {}\n try {\n return (func + '');\n } catch (e) {}\n }\n return '';\n}\n\nmodule.exports = toSource;\n","var isArrayLike = require('./isArrayLike'),\n isObjectLike = require('./isObjectLike');\n\n/**\n * This method is like `_.isArrayLike` except that it also checks if `value`\n * is an object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array-like object,\n * else `false`.\n * @example\n *\n * _.isArrayLikeObject([1, 2, 3]);\n * // => true\n *\n * _.isArrayLikeObject(document.body.children);\n * // => true\n *\n * _.isArrayLikeObject('abc');\n * // => false\n *\n * _.isArrayLikeObject(_.noop);\n * // => false\n */\nfunction isArrayLikeObject(value) {\n return isObjectLike(value) && isArrayLike(value);\n}\n\nmodule.exports = isArrayLikeObject;\n","var baseGet = require('./_baseGet');\n\n/**\n * A specialized version of `baseProperty` which supports deep paths.\n *\n * @private\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction basePropertyDeep(path) {\n return function(object) {\n return baseGet(object, path);\n };\n}\n\nmodule.exports = basePropertyDeep;\n","var MapCache = require('./_MapCache');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\nfunction memoize(func, resolver) {\n if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var memoized = function() {\n var args = arguments,\n key = resolver ? resolver.apply(this, args) : args[0],\n cache = memoized.cache;\n\n if (cache.has(key)) {\n return cache.get(key);\n }\n var result = func.apply(this, args);\n memoized.cache = cache.set(key, result) || cache;\n return result;\n };\n memoized.cache = new (memoize.Cache || MapCache);\n return memoized;\n}\n\n// Expose `MapCache`.\nmemoize.Cache = MapCache;\n\nmodule.exports = memoize;\n","var hashClear = require('./_hashClear'),\n hashDelete = require('./_hashDelete'),\n hashGet = require('./_hashGet'),\n hashHas = require('./_hashHas'),\n hashSet = require('./_hashSet');\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\nmodule.exports = Hash;\n","var baseGetTag = require('./_baseGetTag'),\n isArray = require('./isArray'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar stringTag = '[object String]';\n\n/**\n * Checks if `value` is classified as a `String` primitive or object.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a string, else `false`.\n * @example\n *\n * _.isString('abc');\n * // => true\n *\n * _.isString(1);\n * // => false\n */\nfunction isString(value) {\n return typeof value == 'string' ||\n (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);\n}\n\nmodule.exports = isString;\n","var castPath = require('./_castPath'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray'),\n isIndex = require('./_isIndex'),\n isLength = require('./isLength'),\n toKey = require('./_toKey');\n\n/**\n * Checks if `path` exists on `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @param {Function} hasFunc The function to check properties.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n */\nfunction hasPath(object, path, hasFunc) {\n path = castPath(path, object);\n\n var index = -1,\n length = path.length,\n result = false;\n\n while (++index < length) {\n var key = toKey(path[index]);\n if (!(result = object != null && hasFunc(object, key))) {\n break;\n }\n object = object[key];\n }\n if (result || ++index != length) {\n return result;\n }\n length = object == null ? 0 : object.length;\n return !!length && isLength(length) && isIndex(key, length) &&\n (isArray(object) || isArguments(object));\n}\n\nmodule.exports = hasPath;\n","var isArray = require('./isArray'),\n isKey = require('./_isKey'),\n stringToPath = require('./_stringToPath'),\n toString = require('./toString');\n\n/**\n * Casts `value` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {Object} [object] The object to query keys on.\n * @returns {Array} Returns the cast property path array.\n */\nfunction castPath(value, object) {\n if (isArray(value)) {\n return value;\n }\n return isKey(value, object) ? [value] : stringToPath(toString(value));\n}\n\nmodule.exports = castPath;\n","var root = require('./_root');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined,\n allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined;\n\n/**\n * Creates a clone of `buffer`.\n *\n * @private\n * @param {Buffer} buffer The buffer to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Buffer} Returns the cloned buffer.\n */\nfunction cloneBuffer(buffer, isDeep) {\n if (isDeep) {\n return buffer.slice();\n }\n var length = buffer.length,\n result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);\n\n buffer.copy(result);\n return result;\n}\n\nmodule.exports = cloneBuffer;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n var Ctor = value && value.constructor,\n proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n return value === proto;\n}\n\nmodule.exports = isPrototype;\n","/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction baseProperty(key) {\n return function(object) {\n return object == null ? undefined : object[key];\n };\n}\n\nmodule.exports = baseProperty;\n","var ListCache = require('./_ListCache');\n\n/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\nfunction stackClear() {\n this.__data__ = new ListCache;\n this.size = 0;\n}\n\nmodule.exports = stackClear;\n","var arrayLikeKeys = require('./_arrayLikeKeys'),\n baseKeys = require('./_baseKeys'),\n isArrayLike = require('./isArrayLike');\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys(object) {\n return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n}\n\nmodule.exports = keys;\n","/**\n * This function is like\n * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * except that it includes inherited enumerable properties.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction nativeKeysIn(object) {\n var result = [];\n if (object != null) {\n for (var key in Object(object)) {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = nativeKeysIn;\n","/**\n * Converts `map` to its key-value pairs.\n *\n * @private\n * @param {Object} map The map to convert.\n * @returns {Array} Returns the key-value pairs.\n */\nfunction mapToArray(map) {\n var index = -1,\n result = Array(map.size);\n\n map.forEach(function(value, key) {\n result[++index] = [key, value];\n });\n return result;\n}\n\nmodule.exports = mapToArray;\n","/** Used to detect hot functions by number of calls within a span of milliseconds. */\nvar HOT_COUNT = 800,\n HOT_SPAN = 16;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeNow = Date.now;\n\n/**\n * Creates a function that'll short out and invoke `identity` instead\n * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n * milliseconds.\n *\n * @private\n * @param {Function} func The function to restrict.\n * @returns {Function} Returns the new shortable function.\n */\nfunction shortOut(func) {\n var count = 0,\n lastCalled = 0;\n\n return function() {\n var stamp = nativeNow(),\n remaining = HOT_SPAN - (stamp - lastCalled);\n\n lastCalled = stamp;\n if (remaining > 0) {\n if (++count >= HOT_COUNT) {\n return arguments[0];\n }\n } else {\n count = 0;\n }\n return func.apply(undefined, arguments);\n };\n}\n\nmodule.exports = shortOut;\n","var isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\nfunction toKey(value) {\n if (typeof value == 'string' || isSymbol(value)) {\n return value;\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = toKey;\n","var isArray = require('./isArray'),\n isSymbol = require('./isSymbol');\n\n/** Used to match property names within property paths. */\nvar reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n reIsPlainProp = /^\\w*$/;\n\n/**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\nfunction isKey(value, object) {\n if (isArray(value)) {\n return false;\n }\n var type = typeof value;\n if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n value == null || isSymbol(value)) {\n return true;\n }\n return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n (object != null && value in Object(object));\n}\n\nmodule.exports = isKey;\n","var isPrototype = require('./_isPrototype'),\n nativeKeys = require('./_nativeKeys');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n if (!isPrototype(object)) {\n return nativeKeys(object);\n }\n var result = [];\n for (var key in Object(object)) {\n if (hasOwnProperty.call(object, key) && key != 'constructor') {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = baseKeys;\n","var Symbol = require('./_Symbol');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n var isOwn = hasOwnProperty.call(value, symToStringTag),\n tag = value[symToStringTag];\n\n try {\n value[symToStringTag] = undefined;\n var unmasked = true;\n } catch (e) {}\n\n var result = nativeObjectToString.call(value);\n if (unmasked) {\n if (isOwn) {\n value[symToStringTag] = tag;\n } else {\n delete value[symToStringTag];\n }\n }\n return result;\n}\n\nmodule.exports = getRawTag;\n","var e = require(\"parse-unit\"),\n r = function r(_r) {\n return e(_r)[0];\n };\nmodule.exports = function (n) {\n return null == n && (n = n), function (u, i, t, f) {\n null == t && (t = n), null == f && (f = t);\n var l = function (r) {\n return e(r)[1];\n }(u);\n if (l === i) return u;\n var o = r(u);\n if (\"px\" !== l) if (\"em\" === l) o = r(u) * r(t);else if (\"rem\" === l) o = r(u) * r(n);else {\n if (\"ex\" !== l) return u;\n o = r(u) * r(t) * 2;\n }\n var a = o;\n if (\"px\" !== i) if (\"em\" === i) a = o / r(f);else if (\"rem\" === i) a = o / r(n);else {\n if (\"ex\" !== i) return u;\n a = o / r(f) / 2;\n }\n return parseFloat(a.toFixed(5)) + i;\n };\n};","/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n return false;\n}\n\nmodule.exports = stubFalse;\n","/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n var index = -1,\n length = values.length,\n offset = array.length;\n\n while (++index < length) {\n array[offset + index] = values[index];\n }\n return array;\n}\n\nmodule.exports = arrayPush;\n","var isObject = require('./isObject');\n\n/**\n * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` if suitable for strict\n * equality comparisons, else `false`.\n */\nfunction isStrictComparable(value) {\n return value === value && !isObject(value);\n}\n\nmodule.exports = isStrictComparable;\n","var baseIsNative = require('./_baseIsNative'),\n getValue = require('./_getValue');\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n var value = getValue(object, key);\n return baseIsNative(value) ? value : undefined;\n}\n\nmodule.exports = getNative;\n","var baseSet = require('./_baseSet');\n\n/**\n * Sets the value at `path` of `object`. If a portion of `path` doesn't exist,\n * it's created. Arrays are created for missing index properties while objects\n * are created for all other missing properties. Use `_.setWith` to customize\n * `path` creation.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.set(object, 'a[0].b.c', 4);\n * console.log(object.a[0].b.c);\n * // => 4\n *\n * _.set(object, ['x', '0', 'y', 'z'], 5);\n * console.log(object.x[0].y.z);\n * // => 5\n */\nfunction set(object, path, value) {\n return object == null ? object : baseSet(object, path, value);\n}\n\nmodule.exports = set;\n","var root = require('./_root'),\n stubFalse = require('./stubFalse');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;\n\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\nmodule.exports = isBuffer;\n","var coreJsData = require('./_coreJsData');\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n return !!maskSrcKey && (maskSrcKey in func);\n}\n\nmodule.exports = isMasked;\n","var identity = require('./identity'),\n overRest = require('./_overRest'),\n setToString = require('./_setToString');\n\n/**\n * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @returns {Function} Returns the new function.\n */\nfunction baseRest(func, start) {\n return setToString(overRest(func, start, identity), func + '');\n}\n\nmodule.exports = baseRest;\n","/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n var type = typeof value;\n return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n ? (value !== '__proto__')\n : (value === null);\n}\n\nmodule.exports = isKeyable;\n","var identity = require('./identity');\n\n/**\n * Casts `value` to `identity` if it's not a function.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {Function} Returns cast function.\n */\nfunction castFunction(value) {\n return typeof value == 'function' ? value : identity;\n}\n\nmodule.exports = castFunction;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n","var assignValue = require('./_assignValue'),\n castPath = require('./_castPath'),\n isIndex = require('./_isIndex'),\n isObject = require('./isObject'),\n toKey = require('./_toKey');\n\n/**\n * The base implementation of `_.set`.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {*} value The value to set.\n * @param {Function} [customizer] The function to customize path creation.\n * @returns {Object} Returns `object`.\n */\nfunction baseSet(object, path, value, customizer) {\n if (!isObject(object)) {\n return object;\n }\n path = castPath(path, object);\n\n var index = -1,\n length = path.length,\n lastIndex = length - 1,\n nested = object;\n\n while (nested != null && ++index < length) {\n var key = toKey(path[index]),\n newValue = value;\n\n if (key === '__proto__' || key === 'constructor' || key === 'prototype') {\n return object;\n }\n\n if (index != lastIndex) {\n var objValue = nested[key];\n newValue = customizer ? customizer(objValue, key, nested) : undefined;\n if (newValue === undefined) {\n newValue = isObject(objValue)\n ? objValue\n : (isIndex(path[index + 1]) ? [] : {});\n }\n }\n assignValue(nested, key, newValue);\n nested = nested[key];\n }\n return object;\n}\n\nmodule.exports = baseSet;\n","var baseIsEqual = require('./_baseIsEqual'),\n get = require('./get'),\n hasIn = require('./hasIn'),\n isKey = require('./_isKey'),\n isStrictComparable = require('./_isStrictComparable'),\n matchesStrictComparable = require('./_matchesStrictComparable'),\n toKey = require('./_toKey');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\n *\n * @private\n * @param {string} path The path of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatchesProperty(path, srcValue) {\n if (isKey(path) && isStrictComparable(srcValue)) {\n return matchesStrictComparable(toKey(path), srcValue);\n }\n return function(object) {\n var objValue = get(object, path);\n return (objValue === undefined && objValue === srcValue)\n ? hasIn(object, path)\n : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);\n };\n}\n\nmodule.exports = baseMatchesProperty;\n","var memoizeCapped = require('./_memoizeCapped');\n\n/** Used to match property names within property paths. */\nvar rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n/** Used to match backslashes in property paths. */\nvar reEscapeChar = /\\\\(\\\\)?/g;\n\n/**\n * Converts `string` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\nvar stringToPath = memoizeCapped(function(string) {\n var result = [];\n if (string.charCodeAt(0) === 46 /* . */) {\n result.push('');\n }\n string.replace(rePropName, function(match, number, quote, subString) {\n result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n });\n return result;\n});\n\nmodule.exports = stringToPath;\n","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return value != null && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n","var getMapData = require('./_getMapData');\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n var data = getMapData(this, key),\n size = data.size;\n\n data.set(key, value);\n this.size += data.size == size ? 0 : 1;\n return this;\n}\n\nmodule.exports = mapCacheSet;\n","var Symbol = require('./_Symbol'),\n Uint8Array = require('./_Uint8Array'),\n eq = require('./eq'),\n equalArrays = require('./_equalArrays'),\n mapToArray = require('./_mapToArray'),\n setToArray = require('./_setToArray');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n symbolTag = '[object Symbol]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]';\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * A specialized version of `baseIsEqualDeep` for comparing objects of\n * the same `toStringTag`.\n *\n * **Note:** This function only supports comparing values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {string} tag The `toStringTag` of the objects to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n switch (tag) {\n case dataViewTag:\n if ((object.byteLength != other.byteLength) ||\n (object.byteOffset != other.byteOffset)) {\n return false;\n }\n object = object.buffer;\n other = other.buffer;\n\n case arrayBufferTag:\n if ((object.byteLength != other.byteLength) ||\n !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n return false;\n }\n return true;\n\n case boolTag:\n case dateTag:\n case numberTag:\n // Coerce booleans to `1` or `0` and dates to milliseconds.\n // Invalid dates are coerced to `NaN`.\n return eq(+object, +other);\n\n case errorTag:\n return object.name == other.name && object.message == other.message;\n\n case regexpTag:\n case stringTag:\n // Coerce regexes to strings and treat strings, primitives and objects,\n // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n // for more details.\n return object == (other + '');\n\n case mapTag:\n var convert = mapToArray;\n\n case setTag:\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n convert || (convert = setToArray);\n\n if (object.size != other.size && !isPartial) {\n return false;\n }\n // Assume cyclic values are equal.\n var stacked = stack.get(object);\n if (stacked) {\n return stacked == other;\n }\n bitmask |= COMPARE_UNORDERED_FLAG;\n\n // Recursively compare objects (susceptible to call stack limits).\n stack.set(object, other);\n var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n stack['delete'](object);\n return result;\n\n case symbolTag:\n if (symbolValueOf) {\n return symbolValueOf.call(object) == symbolValueOf.call(other);\n }\n }\n return false;\n}\n\nmodule.exports = equalByTag;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Promise = getNative(root, 'Promise');\n\nmodule.exports = Promise;\n","/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n var result = this.has(key) && delete this.__data__[key];\n this.size -= result ? 1 : 0;\n return result;\n}\n\nmodule.exports = hashDelete;\n","var memoize = require('./memoize');\n\n/** Used as the maximum memoize cache size. */\nvar MAX_MEMOIZE_SIZE = 500;\n\n/**\n * A specialized version of `_.memoize` which clears the memoized function's\n * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n *\n * @private\n * @param {Function} func The function to have its output memoized.\n * @returns {Function} Returns the new memoized function.\n */\nfunction memoizeCapped(func) {\n var result = memoize(func, function(key) {\n if (cache.size === MAX_MEMOIZE_SIZE) {\n cache.clear();\n }\n return key;\n });\n\n var cache = result.cache;\n return result;\n}\n\nmodule.exports = memoizeCapped;\n","/**\n * A specialized version of `matchesProperty` for source values suitable\n * for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction matchesStrictComparable(key, srcValue) {\n return function(object) {\n if (object == null) {\n return false;\n }\n return object[key] === srcValue &&\n (srcValue !== undefined || (key in Object(object)));\n };\n}\n\nmodule.exports = matchesStrictComparable;\n","var apply = require('./_apply');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * A specialized version of `baseRest` which transforms the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @param {number} [start=func.length-1] The start position of the rest parameter.\n * @param {Function} transform The rest array transform.\n * @returns {Function} Returns the new function.\n */\nfunction overRest(func, start, transform) {\n start = nativeMax(start === undefined ? (func.length - 1) : start, 0);\n return function() {\n var args = arguments,\n index = -1,\n length = nativeMax(args.length - start, 0),\n array = Array(length);\n\n while (++index < length) {\n array[index] = args[start + index];\n }\n index = -1;\n var otherArgs = Array(start + 1);\n while (++index < start) {\n otherArgs[index] = args[index];\n }\n otherArgs[start] = transform(array);\n return apply(func, this, otherArgs);\n };\n}\n\nmodule.exports = overRest;\n","var baseFor = require('./_baseFor'),\n keys = require('./keys');\n\n/**\n * The base implementation of `_.forOwn` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */\nfunction baseForOwn(object, iteratee) {\n return object && baseFor(object, iteratee, keys);\n}\n\nmodule.exports = baseForOwn;\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Uint8Array = root.Uint8Array;\n\nmodule.exports = Uint8Array;\n","var getMapData = require('./_getMapData');\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n return getMapData(this, key).get(key);\n}\n\nmodule.exports = mapCacheGet;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n var data = this.__data__;\n this.size += this.has(key) ? 0 : 1;\n data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n return this;\n}\n\nmodule.exports = hashSet;\n","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]';\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\nmodule.exports = baseIsArguments;\n","/**\n * The base implementation of `_.hasIn` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\nfunction baseHasIn(object, key) {\n return object != null && key in Object(object);\n}\n\nmodule.exports = baseHasIn;\n","/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n this.__data__ = [];\n this.size = 0;\n}\n\nmodule.exports = listCacheClear;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n","/**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction stackDelete(key) {\n var data = this.__data__,\n result = data['delete'](key);\n\n this.size = data.size;\n return result;\n}\n\nmodule.exports = stackDelete;\n","/**\n * A specialized version of `_.filter` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction arrayFilter(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (predicate(value, index, array)) {\n result[resIndex++] = value;\n }\n }\n return result;\n}\n\nmodule.exports = arrayFilter;\n","var overArg = require('./_overArg');\n\n/** Built-in value references. */\nvar getPrototype = overArg(Object.getPrototypeOf, Object);\n\nmodule.exports = getPrototype;\n","var baseRest = require('./_baseRest'),\n isIterateeCall = require('./_isIterateeCall');\n\n/**\n * Creates a function like `_.assign`.\n *\n * @private\n * @param {Function} assigner The function to assign values.\n * @returns {Function} Returns the new assigner function.\n */\nfunction createAssigner(assigner) {\n return baseRest(function(object, sources) {\n var index = -1,\n length = sources.length,\n customizer = length > 1 ? sources[length - 1] : undefined,\n guard = length > 2 ? sources[2] : undefined;\n\n customizer = (assigner.length > 3 && typeof customizer == 'function')\n ? (length--, customizer)\n : undefined;\n\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n customizer = length < 3 ? undefined : customizer;\n length = 1;\n }\n object = Object(object);\n while (++index < length) {\n var source = sources[index];\n if (source) {\n assigner(object, source, index, customizer);\n }\n }\n return object;\n });\n}\n\nmodule.exports = createAssigner;\n","var isFunction = require('./isFunction'),\n isLength = require('./isLength');\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n return value != null && isLength(value.length) && !isFunction(value);\n}\n\nmodule.exports = isArrayLike;\n","var baseAssignValue = require('./_baseAssignValue'),\n eq = require('./eq');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Assigns `value` to `key` of `object` if the existing value is not equivalent\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignValue(object, key, value) {\n var objValue = object[key];\n if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n}\n\nmodule.exports = assignValue;\n","var arrayFilter = require('./_arrayFilter'),\n stubArray = require('./stubArray');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n if (object == null) {\n return [];\n }\n object = Object(object);\n return arrayFilter(nativeGetSymbols(object), function(symbol) {\n return propertyIsEnumerable.call(object, symbol);\n });\n};\n\nmodule.exports = getSymbols;\n","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar _grayPercentage = require(\"gray-percentage\");\nvar _grayPercentage2 = _interopRequireDefault(_grayPercentage);\nfunction _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : {\n default: obj\n };\n}\nvar theme = {\n title: \"GitHub\",\n baseFontSize: \"16px\",\n baseLineHeight: 1.625,\n headerFontFamily: [\"-apple-system\", \"BlinkMacSystemFont\", \"Segoe UI\", \"Roboto\", \"Helvetica\", \"Arial\", \"sans-serif\", \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\"],\n bodyFontFamily: [\"-apple-system\", \"BlinkMacSystemFont\", \"Segoe UI\", \"Roboto\", \"Helvetica\", \"Arial\", \"sans-serif\", \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\"],\n scaleRatio: 2,\n bodyColor: \"hsla(0,0%,0%,0.8)\",\n headerWeight: 600,\n bodyWeight: \"normal\",\n boldWeight: 600,\n // Github has all block elements use 1/2 rhythm not a full rhythm.\n blockMarginBottom: 1 / 2,\n overrideStyles: function overrideStyles(_ref) {\n var rhythm = _ref.rhythm;\n return {\n h1: {\n borderBottom: \"1px solid \" + (0, _grayPercentage2.default)(93),\n paddingBottom: \"calc(\" + rhythm(1 / 4) + \" - 1px)\",\n marginBottom: rhythm(3 / 4),\n marginTop: rhythm(1.5)\n },\n h2: {\n borderBottom: \"1px solid \" + (0, _grayPercentage2.default)(93),\n paddingBottom: \"calc(\" + rhythm(1 / 4) + \" - 1px)\",\n marginBottom: rhythm(1 / 4),\n marginTop: rhythm(1)\n },\n h6: {\n color: (0, _grayPercentage2.default)(47)\n },\n \"h3,h4,h5,h6\": {\n marginBottom: rhythm(1 / 2),\n marginTop: rhythm(1)\n },\n \"ol,ul\": {\n marginLeft: rhythm(1.25)\n },\n // children ol, ul\n \"li>ol,li>ul\": {\n marginLeft: rhythm(1.25)\n },\n a: {\n color: \"#4078c0\",\n textDecoration: \"none\"\n },\n \"a:hover,a:active\": {\n textDecoration: \"underline\"\n },\n blockquote: {\n borderLeft: \"4px solid \" + (0, _grayPercentage2.default)(87),\n color: (0, _grayPercentage2.default)(47),\n marginTop: 0,\n marginRight: 0,\n marginLeft: 0,\n paddingLeft: \"calc(\" + rhythm(1 / 2) + \" - 1px)\"\n }\n };\n }\n};\nexports.default = theme;","var isFunction = require('./isFunction'),\n isMasked = require('./_isMasked'),\n isObject = require('./isObject'),\n toSource = require('./_toSource');\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n * else `false`.\n */\nfunction baseIsNative(value) {\n if (!isObject(value) || isMasked(value)) {\n return false;\n }\n var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n return pattern.test(toSource(value));\n}\n\nmodule.exports = baseIsNative;\n","/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n return object == null ? undefined : object[key];\n}\n\nmodule.exports = getValue;\n","var Symbol = require('./_Symbol'),\n getRawTag = require('./_getRawTag'),\n objectToString = require('./_objectToString');\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n if (value == null) {\n return value === undefined ? undefinedTag : nullTag;\n }\n return (symToStringTag && symToStringTag in Object(value))\n ? getRawTag(value)\n : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n","var getNative = require('./_getNative');\n\nvar defineProperty = (function() {\n try {\n var func = getNative(Object, 'defineProperty');\n func({}, '', {});\n return func;\n } catch (e) {}\n}());\n\nmodule.exports = defineProperty;\n","var isStrictComparable = require('./_isStrictComparable'),\n keys = require('./keys');\n\n/**\n * Gets the property names, values, and compare flags of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the match data of `object`.\n */\nfunction getMatchData(object) {\n var result = keys(object),\n length = result.length;\n\n while (length--) {\n var key = result[length],\n value = object[key];\n\n result[length] = [key, value, isStrictComparable(value)];\n }\n return result;\n}\n\nmodule.exports = getMatchData;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar WeakMap = getNative(root, 'WeakMap');\n\nmodule.exports = WeakMap;\n","/**\n * Copies the values of `source` to `array`.\n *\n * @private\n * @param {Array} source The array to copy values from.\n * @param {Array} [array=[]] The array to copy values to.\n * @returns {Array} Returns `array`.\n */\nfunction copyArray(source, array) {\n var index = -1,\n length = source.length;\n\n array || (array = Array(length));\n while (++index < length) {\n array[index] = source[index];\n }\n return array;\n}\n\nmodule.exports = copyArray;\n","var isObject = require('./isObject'),\n isPrototype = require('./_isPrototype'),\n nativeKeysIn = require('./_nativeKeysIn');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeysIn(object) {\n if (!isObject(object)) {\n return nativeKeysIn(object);\n }\n var isProto = isPrototype(object),\n result = [];\n\n for (var key in object) {\n if (!(key == 'constructor' && (isProto || !hasOwnProperty.call(object, key)))) {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = baseKeysIn;\n","var isKeyable = require('./_isKeyable');\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n var data = map.__data__;\n return isKeyable(key)\n ? data[typeof key == 'string' ? 'string' : 'hash']\n : data.map;\n}\n\nmodule.exports = getMapData;\n","var baseMerge = require('./_baseMerge'),\n createAssigner = require('./_createAssigner');\n\n/**\n * This method is like `_.assign` except that it recursively merges own and\n * inherited enumerable string keyed properties of source objects into the\n * destination object. Source properties that resolve to `undefined` are\n * skipped if a destination value exists. Array and plain object properties\n * are merged recursively. Other objects and value types are overridden by\n * assignment. Source objects are applied from left to right. Subsequent\n * sources overwrite property assignments of previous sources.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @memberOf _\n * @since 0.5.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @example\n *\n * var object = {\n * 'a': [{ 'b': 2 }, { 'd': 4 }]\n * };\n *\n * var other = {\n * 'a': [{ 'c': 3 }, { 'e': 5 }]\n * };\n *\n * _.merge(object, other);\n * // => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] }\n */\nvar merge = createAssigner(function(object, source, srcIndex) {\n baseMerge(object, source, srcIndex);\n});\n\nmodule.exports = merge;\n","/**\n * A specialized version of `_.some` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n */\nfunction arraySome(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (predicate(array[index], index, array)) {\n return true;\n }\n }\n return false;\n}\n\nmodule.exports = arraySome;\n","var DataView = require('./_DataView'),\n Map = require('./_Map'),\n Promise = require('./_Promise'),\n Set = require('./_Set'),\n WeakMap = require('./_WeakMap'),\n baseGetTag = require('./_baseGetTag'),\n toSource = require('./_toSource');\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]',\n objectTag = '[object Object]',\n promiseTag = '[object Promise]',\n setTag = '[object Set]',\n weakMapTag = '[object WeakMap]';\n\nvar dataViewTag = '[object DataView]';\n\n/** Used to detect maps, sets, and weakmaps. */\nvar dataViewCtorString = toSource(DataView),\n mapCtorString = toSource(Map),\n promiseCtorString = toSource(Promise),\n setCtorString = toSource(Set),\n weakMapCtorString = toSource(WeakMap);\n\n/**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nvar getTag = baseGetTag;\n\n// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\nif ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n (Map && getTag(new Map) != mapTag) ||\n (Promise && getTag(Promise.resolve()) != promiseTag) ||\n (Set && getTag(new Set) != setTag) ||\n (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n getTag = function(value) {\n var result = baseGetTag(value),\n Ctor = result == objectTag ? value.constructor : undefined,\n ctorString = Ctor ? toSource(Ctor) : '';\n\n if (ctorString) {\n switch (ctorString) {\n case dataViewCtorString: return dataViewTag;\n case mapCtorString: return mapTag;\n case promiseCtorString: return promiseTag;\n case setCtorString: return setTag;\n case weakMapCtorString: return weakMapTag;\n }\n }\n return result;\n };\n}\n\nmodule.exports = getTag;\n","var baseForOwn = require('./_baseForOwn'),\n createBaseEach = require('./_createBaseEach');\n\n/**\n * The base implementation of `_.forEach` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n */\nvar baseEach = createBaseEach(baseForOwn);\n\nmodule.exports = baseEach;\n","var nativeCreate = require('./_nativeCreate');\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n this.__data__ = nativeCreate ? nativeCreate(null) : {};\n this.size = 0;\n}\n\nmodule.exports = hashClear;\n","var assignMergeValue = require('./_assignMergeValue'),\n cloneBuffer = require('./_cloneBuffer'),\n cloneTypedArray = require('./_cloneTypedArray'),\n copyArray = require('./_copyArray'),\n initCloneObject = require('./_initCloneObject'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray'),\n isArrayLikeObject = require('./isArrayLikeObject'),\n isBuffer = require('./isBuffer'),\n isFunction = require('./isFunction'),\n isObject = require('./isObject'),\n isPlainObject = require('./isPlainObject'),\n isTypedArray = require('./isTypedArray'),\n safeGet = require('./_safeGet'),\n toPlainObject = require('./toPlainObject');\n\n/**\n * A specialized version of `baseMerge` for arrays and objects which performs\n * deep merges and tracks traversed objects enabling objects with circular\n * references to be merged.\n *\n * @private\n * @param {Object} object The destination object.\n * @param {Object} source The source object.\n * @param {string} key The key of the value to merge.\n * @param {number} srcIndex The index of `source`.\n * @param {Function} mergeFunc The function to merge values.\n * @param {Function} [customizer] The function to customize assigned values.\n * @param {Object} [stack] Tracks traversed source values and their merged\n * counterparts.\n */\nfunction baseMergeDeep(object, source, key, srcIndex, mergeFunc, customizer, stack) {\n var objValue = safeGet(object, key),\n srcValue = safeGet(source, key),\n stacked = stack.get(srcValue);\n\n if (stacked) {\n assignMergeValue(object, key, stacked);\n return;\n }\n var newValue = customizer\n ? customizer(objValue, srcValue, (key + ''), object, source, stack)\n : undefined;\n\n var isCommon = newValue === undefined;\n\n if (isCommon) {\n var isArr = isArray(srcValue),\n isBuff = !isArr && isBuffer(srcValue),\n isTyped = !isArr && !isBuff && isTypedArray(srcValue);\n\n newValue = srcValue;\n if (isArr || isBuff || isTyped) {\n if (isArray(objValue)) {\n newValue = objValue;\n }\n else if (isArrayLikeObject(objValue)) {\n newValue = copyArray(objValue);\n }\n else if (isBuff) {\n isCommon = false;\n newValue = cloneBuffer(srcValue, true);\n }\n else if (isTyped) {\n isCommon = false;\n newValue = cloneTypedArray(srcValue, true);\n }\n else {\n newValue = [];\n }\n }\n else if (isPlainObject(srcValue) || isArguments(srcValue)) {\n newValue = objValue;\n if (isArguments(objValue)) {\n newValue = toPlainObject(objValue);\n }\n else if (!isObject(objValue) || isFunction(objValue)) {\n newValue = initCloneObject(srcValue);\n }\n }\n else {\n isCommon = false;\n }\n }\n if (isCommon) {\n // Recursively merge objects and arrays (susceptible to call stack limits).\n stack.set(srcValue, newValue);\n mergeFunc(newValue, srcValue, srcIndex, customizer, stack);\n stack['delete'](srcValue);\n }\n assignMergeValue(object, key, newValue);\n}\n\nmodule.exports = baseMergeDeep;\n","module.exports = function parseUnit(str, out) {\n if (!out) out = [0, ''];\n str = String(str);\n var num = parseFloat(str, 10);\n out[0] = num;\n out[1] = str.match(/[\\d.\\-\\+]*\\s*(.*)/)[1] || '';\n return out;\n};","var baseGetTag = require('./_baseGetTag'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar numberTag = '[object Number]';\n\n/**\n * Checks if `value` is classified as a `Number` primitive or object.\n *\n * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are\n * classified as numbers, use the `_.isFinite` method.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a number, else `false`.\n * @example\n *\n * _.isNumber(3);\n * // => true\n *\n * _.isNumber(Number.MIN_VALUE);\n * // => true\n *\n * _.isNumber(Infinity);\n * // => true\n *\n * _.isNumber('3');\n * // => false\n */\nfunction isNumber(value) {\n return typeof value == 'number' ||\n (isObjectLike(value) && baseGetTag(value) == numberTag);\n}\n\nmodule.exports = isNumber;\n","/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n var index = -1,\n result = Array(n);\n\n while (++index < n) {\n result[index] = iteratee(index);\n }\n return result;\n}\n\nmodule.exports = baseTimes;\n","var overArg = require('./_overArg');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeKeys = overArg(Object.keys, Object);\n\nmodule.exports = nativeKeys;\n","/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n return this.__data__.has(key);\n}\n\nmodule.exports = stackHas;\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n","/**\n * The base implementation of `_.reduce` and `_.reduceRight`, without support\n * for iteratee shorthands, which iterates over `collection` using `eachFunc`.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} accumulator The initial value.\n * @param {boolean} initAccum Specify using the first or last element of\n * `collection` as the initial value.\n * @param {Function} eachFunc The function to iterate over `collection`.\n * @returns {*} Returns the accumulated value.\n */\nfunction baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {\n eachFunc(collection, function(value, index, collection) {\n accumulator = initAccum\n ? (initAccum = false, value)\n : iteratee(accumulator, value, index, collection);\n });\n return accumulator;\n}\n\nmodule.exports = baseReduce;\n","export const HOME_TITLE = 'Home'\n","export const CATEGORY_TYPE = {\n ALL: 'All',\n}\n\nexport const THEME = {\n LIGHT: 'light',\n DARK: 'dark',\n}\n","export const KOREAN = 'ko'\nexport const ENGLISH = 'en'\n","// Generated by CoffeeScript 1.9.1\nvar isNumber, ratios;\nisNumber = require('lodash.isnumber');\nratios = {\n \"minor second\": 16 / 15,\n \"major second\": 9 / 8,\n \"minor third\": 6 / 5,\n \"major third\": 4 / 3,\n \"diminished fourth\": Math.sqrt(2),\n \"perfect fifth\": 3 / 2,\n \"minor sixth\": 8 / 5,\n \"golden\": 1.61803398875,\n \"phi\": 1.61803398875,\n \"major sixth\": 5 / 3,\n \"minor seventh\": 16 / 9,\n \"major seventh\": 15 / 8,\n \"octave\": 2,\n \"major tenth\": 5 / 2,\n \"major eleventh\": 8 / 3,\n \"major twelfth\": 3,\n \"double octave\": 4\n};\nmodule.exports = function (value, ratio) {\n var r;\n if (value == null) {\n value = 0;\n }\n if (ratio == null) {\n ratio = \"golden\";\n }\n if (isNumber(ratio)) {\n r = ratio;\n } else if (ratios[ratio] != null) {\n r = ratios[ratio];\n } else {\n r = ratios['golden'];\n }\n return Math.pow(r, value);\n};","var listCacheClear = require('./_listCacheClear'),\n listCacheDelete = require('./_listCacheDelete'),\n listCacheGet = require('./_listCacheGet'),\n listCacheHas = require('./_listCacheHas'),\n listCacheSet = require('./_listCacheSet');\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\nmodule.exports = ListCache;\n","var getNative = require('./_getNative');\n\n/* Built-in method references that are verified to be native. */\nvar nativeCreate = getNative(Object, 'create');\n\nmodule.exports = nativeCreate;\n","var baseGetTag = require('./_baseGetTag'),\n getPrototype = require('./_getPrototype'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to infer the `Object` constructor. */\nvar objectCtorString = funcToString.call(Object);\n\n/**\n * Checks if `value` is a plain object, that is, an object created by the\n * `Object` constructor or one with a `[[Prototype]]` of `null`.\n *\n * @static\n * @memberOf _\n * @since 0.8.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * _.isPlainObject(new Foo);\n * // => false\n *\n * _.isPlainObject([1, 2, 3]);\n * // => false\n *\n * _.isPlainObject({ 'x': 0, 'y': 0 });\n * // => true\n *\n * _.isPlainObject(Object.create(null));\n * // => true\n */\nfunction isPlainObject(value) {\n if (!isObjectLike(value) || baseGetTag(value) != objectTag) {\n return false;\n }\n var proto = getPrototype(value);\n if (proto === null) {\n return true;\n }\n var Ctor = hasOwnProperty.call(proto, 'constructor') && proto.constructor;\n return typeof Ctor == 'function' && Ctor instanceof Ctor &&\n funcToString.call(Ctor) == objectCtorString;\n}\n\nmodule.exports = isPlainObject;\n","module.exports = function(module) {\n\tif (!module.webpackPolyfill) {\n\t\tmodule.deprecate = function() {};\n\t\tmodule.paths = [];\n\t\t// module.parent = undefined by default\n\t\tif (!module.children) module.children = [];\n\t\tObject.defineProperty(module, \"loaded\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.l;\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(module, \"id\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.i;\n\t\t\t}\n\t\t});\n\t\tmodule.webpackPolyfill = 1;\n\t}\n\treturn module;\n};\n","/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nmodule.exports = isArray;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n ++this.size;\n data.push([key, value]);\n } else {\n data[index][1] = value;\n }\n return this;\n}\n\nmodule.exports = listCacheSet;\n","/**\n * lodash 3.0.3 (Custom Build) \n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright 2012-2016 The Dojo Foundation \n * Based on Underscore.js 1.8.3 \n * Copyright 2009-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n * Available under MIT license \n */\n\n/** `Object#toString` result references. */\nvar numberTag = '[object Number]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is classified as a `Number` primitive or object.\n *\n * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are classified\n * as numbers, use the `_.isFinite` method.\n *\n * @static\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`.\n * @example\n *\n * _.isNumber(3);\n * // => true\n *\n * _.isNumber(Number.MIN_VALUE);\n * // => true\n *\n * _.isNumber(Infinity);\n * // => true\n *\n * _.isNumber('3');\n * // => false\n */\nfunction isNumber(value) {\n return typeof value == 'number' || isObjectLike(value) && objectToString.call(value) == numberTag;\n}\nmodule.exports = isNumber;","var baseIsMatch = require('./_baseIsMatch'),\n getMatchData = require('./_getMatchData'),\n matchesStrictComparable = require('./_matchesStrictComparable');\n\n/**\n * The base implementation of `_.matches` which doesn't clone `source`.\n *\n * @private\n * @param {Object} source The object of property values to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatches(source) {\n var matchData = getMatchData(source);\n if (matchData.length == 1 && matchData[0][2]) {\n return matchesStrictComparable(matchData[0][0], matchData[0][1]);\n }\n return function(object) {\n return object === source || baseIsMatch(object, source, matchData);\n };\n}\n\nmodule.exports = baseMatches;\n","var castPath = require('./_castPath'),\n toKey = require('./_toKey');\n\n/**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\nfunction baseGet(object, path) {\n path = castPath(path, object);\n\n var index = 0,\n length = path.length;\n\n while (object != null && index < length) {\n object = object[toKey(path[index++])];\n }\n return (index && index == length) ? object : undefined;\n}\n\nmodule.exports = baseGet;\n","function isNumeric(n) {\n return !isNaN(parseFloat(n)) && isFinite(n);\n}\nmodule.exports = function (lightness, hue, darkBackground) {\n if (typeof hue === \"undefined\") {\n hue = 0;\n }\n if (typeof darkBackground === \"undefined\") {\n darkBackground = false;\n }\n\n // Convert named hues into numeric lightness value.\n if (hue === \"cool\") {\n hue = 237;\n } else if (hue === \"slate\") {\n hue = 122;\n } else if (hue === \"warm\") {\n hue = 69;\n }\n if (!isNumeric(hue)) {\n throw new Error(\"Hue is not a number\");\n }\n if (!isNumeric(lightness)) {\n throw new Error(\"Lightness is not a number\");\n }\n if (lightness > 100) {\n lightness = 100;\n }\n if (lightness < 0) {\n lightness = 0;\n }\n var saturation = 0;\n if (hue !== 0) {\n var a = 19.92978;\n var b = -0.3651759;\n var c = 0.001737214;\n saturation = a + b * lightness + c * Math.pow(lightness, 2);\n }\n var opacity = 0;\n if (darkBackground) {\n opacity = lightness / 100;\n lightness = '100%,';\n } else {\n opacity = (100 - lightness) / 100;\n lightness = '0%,';\n }\n return \"hsla(\" + hue + \",\" + saturation + \"%,\" + lightness + opacity + \")\";\n};","var assocIndexOf = require('./_assocIndexOf');\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n if (index < 0) {\n return false;\n }\n var lastIndex = data.length - 1;\n if (index == lastIndex) {\n data.pop();\n } else {\n splice.call(data, index, 1);\n }\n --this.size;\n return true;\n}\n\nmodule.exports = listCacheDelete;\n","/**\n * A specialized version of `_.reduce` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @param {boolean} [initAccum] Specify using the first element of `array` as\n * the initial value.\n * @returns {*} Returns the accumulated value.\n */\nfunction arrayReduce(array, iteratee, accumulator, initAccum) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n if (initAccum && length) {\n accumulator = array[++index];\n }\n while (++index < length) {\n accumulator = iteratee(accumulator, array[index], index, array);\n }\n return accumulator;\n}\n\nmodule.exports = arrayReduce;\n","var baseTimes = require('./_baseTimes'),\n isArguments = require('./isArguments'),\n isArray = require('./isArray'),\n isBuffer = require('./isBuffer'),\n isIndex = require('./_isIndex'),\n isTypedArray = require('./isTypedArray');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n var isArr = isArray(value),\n isArg = !isArr && isArguments(value),\n isBuff = !isArr && !isArg && isBuffer(value),\n isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n skipIndexes = isArr || isArg || isBuff || isType,\n result = skipIndexes ? baseTimes(value.length, String) : [],\n length = result.length;\n\n for (var key in value) {\n if ((inherited || hasOwnProperty.call(value, key)) &&\n !(skipIndexes && (\n // Safari 9 has enumerable `arguments.length` in strict mode.\n key == 'length' ||\n // Node.js 0.10 has enumerable non-index properties on buffers.\n (isBuff && (key == 'offset' || key == 'parent')) ||\n // PhantomJS 2 has enumerable non-index properties on typed arrays.\n (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n // Skip index properties.\n isIndex(key, length)\n ))) {\n result.push(key);\n }\n }\n return result;\n}\n\nmodule.exports = arrayLikeKeys;\n","var arrayEach = require('./_arrayEach'),\n baseEach = require('./_baseEach'),\n castFunction = require('./_castFunction'),\n isArray = require('./isArray');\n\n/**\n * Iterates over elements of `collection` and invokes `iteratee` for each element.\n * The iteratee is invoked with three arguments: (value, index|key, collection).\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * **Note:** As with other \"Collections\" methods, objects with a \"length\"\n * property are iterated like arrays. To avoid this behavior use `_.forIn`\n * or `_.forOwn` for object iteration.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @alias each\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n * @see _.forEachRight\n * @example\n *\n * _.forEach([1, 2], function(value) {\n * console.log(value);\n * });\n * // => Logs `1` then `2`.\n *\n * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {\n * console.log(key);\n * });\n * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n */\nfunction forEach(collection, iteratee) {\n var func = isArray(collection) ? arrayEach : baseEach;\n return func(collection, castFunction(iteratee));\n}\n\nmodule.exports = forEach;\n","var baseIsTypedArray = require('./_baseIsTypedArray'),\n baseUnary = require('./_baseUnary'),\n nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\nmodule.exports = isTypedArray;\n","var createBaseFor = require('./_createBaseFor');\n\n/**\n * The base implementation of `baseForOwn` which iterates over `object`\n * properties returned by `keysFunc` and invokes `iteratee` for each property.\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\nvar baseFor = createBaseFor();\n\nmodule.exports = baseFor;\n","/**\n * Creates a function that returns `value`.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {*} value The value to return from the new function.\n * @returns {Function} Returns the new constant function.\n * @example\n *\n * var objects = _.times(2, _.constant({ 'a': 1 }));\n *\n * console.log(objects);\n * // => [{ 'a': 1 }, { 'a': 1 }]\n *\n * console.log(objects[0] === objects[1]);\n * // => true\n */\nfunction constant(value) {\n return function() {\n return value;\n };\n}\n\nmodule.exports = constant;\n","var baseGetTag = require('./_baseGetTag'),\n isLength = require('./isLength'),\n isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n boolTag = '[object Boolean]',\n dateTag = '[object Date]',\n errorTag = '[object Error]',\n funcTag = '[object Function]',\n mapTag = '[object Map]',\n numberTag = '[object Number]',\n objectTag = '[object Object]',\n regexpTag = '[object RegExp]',\n setTag = '[object Set]',\n stringTag = '[object String]',\n weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n dataViewTag = '[object DataView]',\n float32Tag = '[object Float32Array]',\n float64Tag = '[object Float64Array]',\n int8Tag = '[object Int8Array]',\n int16Tag = '[object Int16Array]',\n int32Tag = '[object Int32Array]',\n uint8Tag = '[object Uint8Array]',\n uint8ClampedTag = '[object Uint8ClampedArray]',\n uint16Tag = '[object Uint16Array]',\n uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n return isObjectLike(value) &&\n isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n}\n\nmodule.exports = baseIsTypedArray;\n","var isObject = require('./isObject');\n\n/** Built-in value references. */\nvar objectCreate = Object.create;\n\n/**\n * The base implementation of `_.create` without support for assigning\n * properties to the created object.\n *\n * @private\n * @param {Object} proto The object to inherit from.\n * @returns {Object} Returns the new object.\n */\nvar baseCreate = (function() {\n function object() {}\n return function(proto) {\n if (!isObject(proto)) {\n return {};\n }\n if (objectCreate) {\n return objectCreate(proto);\n }\n object.prototype = proto;\n var result = new object;\n object.prototype = undefined;\n return result;\n };\n}());\n\nmodule.exports = baseCreate;\n","var baseToString = require('./_baseToString');\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n return value == null ? '' : baseToString(value);\n}\n\nmodule.exports = toString;\n","var mapCacheClear = require('./_mapCacheClear'),\n mapCacheDelete = require('./_mapCacheDelete'),\n mapCacheGet = require('./_mapCacheGet'),\n mapCacheHas = require('./_mapCacheHas'),\n mapCacheSet = require('./_mapCacheSet');\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n var index = -1,\n length = entries == null ? 0 : entries.length;\n\n this.clear();\n while (++index < length) {\n var entry = entries[index];\n this.set(entry[0], entry[1]);\n }\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\nmodule.exports = MapCache;\n","var Stack = require('./_Stack'),\n equalArrays = require('./_equalArrays'),\n equalByTag = require('./_equalByTag'),\n equalObjects = require('./_equalObjects'),\n getTag = require('./_getTag'),\n isArray = require('./isArray'),\n isBuffer = require('./isBuffer'),\n isTypedArray = require('./isTypedArray');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n arrayTag = '[object Array]',\n objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqual` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n var objIsArr = isArray(object),\n othIsArr = isArray(other),\n objTag = objIsArr ? arrayTag : getTag(object),\n othTag = othIsArr ? arrayTag : getTag(other);\n\n objTag = objTag == argsTag ? objectTag : objTag;\n othTag = othTag == argsTag ? objectTag : othTag;\n\n var objIsObj = objTag == objectTag,\n othIsObj = othTag == objectTag,\n isSameTag = objTag == othTag;\n\n if (isSameTag && isBuffer(object)) {\n if (!isBuffer(other)) {\n return false;\n }\n objIsArr = true;\n objIsObj = false;\n }\n if (isSameTag && !objIsObj) {\n stack || (stack = new Stack);\n return (objIsArr || isTypedArray(object))\n ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n }\n if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n if (objIsWrapped || othIsWrapped) {\n var objUnwrapped = objIsWrapped ? object.value() : object,\n othUnwrapped = othIsWrapped ? other.value() : other;\n\n stack || (stack = new Stack);\n return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n }\n }\n if (!isSameTag) {\n return false;\n }\n stack || (stack = new Stack);\n return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n}\n\nmodule.exports = baseIsEqualDeep;\n","/**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length,\n result = Array(length);\n\n while (++index < length) {\n result[index] = iteratee(array[index], index, array);\n }\n return result;\n}\n\nmodule.exports = arrayMap;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map');\n\nmodule.exports = Map;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n var data = this.__data__;\n return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\nmodule.exports = hashHas;\n","var Hash = require('./_Hash'),\n ListCache = require('./_ListCache'),\n Map = require('./_Map');\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n this.size = 0;\n this.__data__ = {\n 'hash': new Hash,\n 'map': new (Map || ListCache),\n 'string': new Hash\n };\n}\n\nmodule.exports = mapCacheClear;\n","var arrayPush = require('./_arrayPush'),\n isArray = require('./isArray');\n\n/**\n * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @param {Function} symbolsFunc The function to get the symbols of `object`.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction baseGetAllKeys(object, keysFunc, symbolsFunc) {\n var result = keysFunc(object);\n return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n}\n\nmodule.exports = baseGetAllKeys;\n","var ListCache = require('./_ListCache'),\n stackClear = require('./_stackClear'),\n stackDelete = require('./_stackDelete'),\n stackGet = require('./_stackGet'),\n stackHas = require('./_stackHas'),\n stackSet = require('./_stackSet');\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n var data = this.__data__ = new ListCache(entries);\n this.size = data.size;\n}\n\n// Add methods to `Stack`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\nmodule.exports = Stack;\n","/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\nfunction setCacheAdd(value) {\n this.__data__.set(value, HASH_UNDEFINED);\n return this;\n}\n\nmodule.exports = setCacheAdd;\n","/**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n return this.__data__.get(key);\n}\n\nmodule.exports = stackGet;\n","/**\n * A specialized version of `_.forEach` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns `array`.\n */\nfunction arrayEach(array, iteratee) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (iteratee(array[index], index, array) === false) {\n break;\n }\n }\n return array;\n}\n\nmodule.exports = arrayEach;\n","/**\n * A faster alternative to `Function#apply`, this function invokes `func`\n * with the `this` binding of `thisArg` and the arguments of `args`.\n *\n * @private\n * @param {Function} func The function to invoke.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} args The arguments to invoke `func` with.\n * @returns {*} Returns the result of `func`.\n */\nfunction apply(func, thisArg, args) {\n switch (args.length) {\n case 0: return func.call(thisArg);\n case 1: return func.call(thisArg, args[0]);\n case 2: return func.call(thisArg, args[0], args[1]);\n case 3: return func.call(thisArg, args[0], args[1], args[2]);\n }\n return func.apply(thisArg, args);\n}\n\nmodule.exports = apply;\n","var baseHasIn = require('./_baseHasIn'),\n hasPath = require('./_hasPath');\n\n/**\n * Checks if `path` is a direct or inherited property of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.hasIn(object, 'a');\n * // => true\n *\n * _.hasIn(object, 'a.b');\n * // => true\n *\n * _.hasIn(object, ['a', 'b']);\n * // => true\n *\n * _.hasIn(object, 'b');\n * // => false\n */\nfunction hasIn(object, path) {\n return object != null && hasPath(object, path, baseHasIn);\n}\n\nmodule.exports = hasIn;\n","var defineProperty = require('./_defineProperty');\n\n/**\n * The base implementation of `assignValue` and `assignMergeValue` without\n * value checks.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction baseAssignValue(object, key, value) {\n if (key == '__proto__' && defineProperty) {\n defineProperty(object, key, {\n 'configurable': true,\n 'enumerable': true,\n 'value': value,\n 'writable': true\n });\n } else {\n object[key] = value;\n }\n}\n\nmodule.exports = baseAssignValue;\n","/**\n * Gets the value at `key`, unless `key` is \"__proto__\" or \"constructor\".\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction safeGet(object, key) {\n if (key === 'constructor' && typeof object[key] === 'function') {\n return;\n }\n\n if (key == '__proto__') {\n return;\n }\n\n return object[key];\n}\n\nmodule.exports = safeGet;\n","var copyObject = require('./_copyObject'),\n keysIn = require('./keysIn');\n\n/**\n * Converts `value` to a plain object flattening inherited enumerable string\n * keyed properties of `value` to own properties of the plain object.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {Object} Returns the converted plain object.\n * @example\n *\n * function Foo() {\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.assign({ 'a': 1 }, new Foo);\n * // => { 'a': 1, 'b': 2 }\n *\n * _.assign({ 'a': 1 }, _.toPlainObject(new Foo));\n * // => { 'a': 1, 'b': 2, 'c': 3 }\n */\nfunction toPlainObject(value) {\n return copyObject(value, keysIn(value));\n}\n\nmodule.exports = toPlainObject;\n","var assignValue = require('./_assignValue'),\n baseAssignValue = require('./_baseAssignValue');\n\n/**\n * Copies properties of `source` to `object`.\n *\n * @private\n * @param {Object} source The object to copy properties from.\n * @param {Array} props The property identifiers to copy.\n * @param {Object} [object={}] The object to copy properties to.\n * @param {Function} [customizer] The function to customize copied values.\n * @returns {Object} Returns `object`.\n */\nfunction copyObject(source, props, object, customizer) {\n var isNew = !object;\n object || (object = {});\n\n var index = -1,\n length = props.length;\n\n while (++index < length) {\n var key = props[index];\n\n var newValue = customizer\n ? customizer(object[key], source[key], key, object, source)\n : undefined;\n\n if (newValue === undefined) {\n newValue = source[key];\n }\n if (isNew) {\n baseAssignValue(object, key, newValue);\n } else {\n assignValue(object, key, newValue);\n }\n }\n return object;\n}\n\nmodule.exports = copyObject;\n","var getMapData = require('./_getMapData');\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n var result = getMapData(this, key)['delete'](key);\n this.size -= result ? 1 : 0;\n return result;\n}\n\nmodule.exports = mapCacheDelete;\n","'use strict';\n\nmodule.exports = function (str, sep) {\n if (typeof str !== 'string') {\n throw new TypeError('Expected a string');\n }\n sep = typeof sep === 'undefined' ? '_' : sep;\n return str.replace(/([a-z\\d])([A-Z])/g, '$1' + sep + '$2').replace(/([A-Z]+)([A-Z][a-z\\d]+)/g, '$1' + sep + '$2').toLowerCase();\n};","/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n return function(arg) {\n return func(transform(arg));\n };\n}\n\nmodule.exports = overArg;\n","var e = require(\"convert-css-length\"),\n n = require(\"parse-unit\"),\n t = function t(e) {\n return n(e)[1];\n },\n i = function i(e) {\n return n(e)[0];\n },\n r = {\n baseFontSize: \"16px\",\n baseLineHeight: 1.5,\n rhythmUnit: \"rem\",\n defaultRhythmBorderWidth: \"1px\",\n defaultRhythmBorderStyle: \"solid\",\n roundToNearestHalfLine: !0,\n minLinePadding: \"2px\"\n },\n a = function a(n, t) {\n var r,\n a = e(t.baseFontSize),\n o = i(a(n, \"px\")),\n s = i(t.baseLineHeightInPx),\n u = i(a(t.minLinePadding, \"px\"));\n return (r = t.roundToNearestHalfLine ? Math.ceil(2 * o / s) / 2 : Math.ceil(o / s)) * s - o < 2 * u && (r += t.roundToNearestHalfLine ? .5 : 1), r;\n },\n o = function o(n) {\n var r = e(n.baseFontSize);\n return function (e, a, o) {\n null == e && (e = 1), null == a && (a = n.baseFontSize), null == o && (o = 0);\n var s = e * i(n.baseLineHeightInPx) - o + \"px\",\n u = r(s, n.rhythmUnit, a);\n return \"px\" === t(u) && (u = Math.floor(i(u)) + t(u)), parseFloat(i(u).toFixed(5)) + t(u);\n };\n };\nmodule.exports = function (n) {\n var s = JSON.parse(JSON.stringify(r)),\n u = Object.assign({}, s, n),\n h = e(u.baseFontSize);\n if (t(u.baseLineHeight)) {\n i(h(u.baseFontSize, \"px\"));\n u.baseLineHeightInPx = h(u.baseLineHeight, \"px\");\n } else u.baseLineHeightInPx = i(u.baseFontSize) * u.baseLineHeight + \"px\";\n return {\n rhythm: o(u),\n establishBaseline: function establishBaseline() {\n return function (n) {\n e(n.baseFontSize);\n return {\n fontSize: i(n.baseFontSize) / 16 * 100 + \"%\",\n lineHeight: n.baseLineHeight.toString()\n };\n }(u);\n },\n linesForFontSize: function linesForFontSize(e) {\n return a(e, u);\n },\n adjustFontSizeTo: function adjustFontSizeTo(n, r, s) {\n return null == r && (r = \"auto\"), function (n, r, s, u) {\n null == s && (s = u.baseFontSize), \"%\" === t(n) && (n = i(u.baseFontSize) * (i(n) / 100) + \"px\");\n var h = e(u.baseFontSize);\n n = h(n, \"px\", s = h(s, \"px\"));\n var l = o(u);\n return \"auto\" === r && (r = a(n, u)), {\n fontSize: h(n, u.rhythmUnit, s),\n lineHeight: l(r, s)\n };\n }(n, r, s, u);\n }\n };\n};","var isArrayLike = require('./isArrayLike');\n\n/**\n * Creates a `baseEach` or `baseEachRight` function.\n *\n * @private\n * @param {Function} eachFunc The function to iterate over a collection.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseEach(eachFunc, fromRight) {\n return function(collection, iteratee) {\n if (collection == null) {\n return collection;\n }\n if (!isArrayLike(collection)) {\n return eachFunc(collection, iteratee);\n }\n var length = collection.length,\n index = fromRight ? length : -1,\n iterable = Object(collection);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (iteratee(iterable[index], index, iterable) === false) {\n break;\n }\n }\n return collection;\n };\n}\n\nmodule.exports = createBaseEach;\n","var baseGetTag = require('./_baseGetTag'),\n isObject = require('./isObject');\n\n/** `Object#toString` result references. */\nvar asyncTag = '[object AsyncFunction]',\n funcTag = '[object Function]',\n genTag = '[object GeneratorFunction]',\n proxyTag = '[object Proxy]';\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n if (!isObject(value)) {\n return false;\n }\n // The use of `Object#toString` avoids issues with the `typeof` operator\n // in Safari 9 which returns 'object' for typed arrays and other constructors.\n var tag = baseGetTag(value);\n return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nmodule.exports = isFunction;\n","/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n return value === other || (value !== value && other !== other);\n}\n\nmodule.exports = eq;\n","var Stack = require('./_Stack'),\n baseIsEqual = require('./_baseIsEqual');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * The base implementation of `_.isMatch` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @param {Array} matchData The property names, values, and compare flags to match.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n */\nfunction baseIsMatch(object, source, matchData, customizer) {\n var index = matchData.length,\n length = index,\n noCustomizer = !customizer;\n\n if (object == null) {\n return !length;\n }\n object = Object(object);\n while (index--) {\n var data = matchData[index];\n if ((noCustomizer && data[2])\n ? data[1] !== object[data[0]]\n : !(data[0] in object)\n ) {\n return false;\n }\n }\n while (++index < length) {\n data = matchData[index];\n var key = data[0],\n objValue = object[key],\n srcValue = data[1];\n\n if (noCustomizer && data[2]) {\n if (objValue === undefined && !(key in object)) {\n return false;\n }\n } else {\n var stack = new Stack;\n if (customizer) {\n var result = customizer(objValue, srcValue, key, object, source, stack);\n }\n if (!(result === undefined\n ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)\n : result\n )) {\n return false;\n }\n }\n }\n return true;\n}\n\nmodule.exports = baseIsMatch;\n","var e = require(\"object-assign\"),\n t = require(\"compass-vertical-rhythm\"),\n i = require(\"modularscale\"),\n o = require(\"gray-percentage\"),\n r = require(\"lodash/set\"),\n n = require(\"lodash/forEach\"),\n a = require(\"lodash/isNumber\"),\n l = require(\"lodash/isString\"),\n d = require(\"lodash/isFunction\"),\n u = require(\"lodash/isArray\"),\n s = require(\"lodash/merge\"),\n h = require(\"lodash/reduce\"),\n g = require(\"typography-normalize\"),\n c = require(\"decamelize\"),\n f = require(\"lodash/isObject\");\nfunction m(e) {\n return e && \"object\" == typeof e && \"default\" in e ? e : {\n default: e\n };\n}\nvar p = m(e),\n y = m(t),\n b = m(i),\n S = m(o),\n F = m(r),\n v = m(n),\n B = m(a),\n k = m(l),\n x = m(d),\n z = m(u),\n q = m(s),\n j = m(h),\n L = m(g),\n W = m(c),\n T = m(f);\nfunction M() {\n return (M = Object.assign || function (e) {\n for (var t = 1; t < arguments.length; t++) {\n var i = arguments[t];\n for (var o in i) Object.prototype.hasOwnProperty.call(i, o) && (e[o] = i[o]);\n }\n return e;\n }).apply(this, arguments);\n}\nvar C = function C(e, t, i) {\n var o;\n return void 0 === e && (e = {}), o = z.default(t) ? t : [t], v.default(o, function (t) {\n v.default(i, function (i, o) {\n F.default(e, t + \".\" + o, i);\n });\n }), e;\n },\n O = [\"inherit\", \"default\", \"serif\", \"sans-serif\", \"monospace\", \"fantasy\", \"cursive\", \"-apple-system\"],\n R = function R(e) {\n return -1 !== O.indexOf(e) ? e : \"'\" + e + \"'\";\n },\n H = function e(t) {\n return j.default(t, function (t, i, o) {\n return t += o + \"{\", v.default(i, function (i, o) {\n if (T.default(i)) {\n var r = {};\n r[o] = i, t += e(r);\n } else {\n var n = W.default(o, \"-\") + \":\" + i + \";\";\n [\"Webkit\", \"ms\", \"Moz\", \"O\"].forEach(function (e) {\n o.slice(0, e.length) === e && (n = \"-\" + n);\n }), t += n;\n }\n }), t += \"}\";\n }, \"\");\n },\n N = function N(e, t, i) {\n var o = H(i);\n return t.includeNormalize && (o = \"\" + L.default + o), o;\n };\nmodule.exports = function (e) {\n var t = p.default({}, {\n baseFontSize: \"16px\",\n baseLineHeight: 1.45,\n headerLineHeight: 1.1,\n scaleRatio: 2,\n googleFonts: [],\n headerFontFamily: [\"-apple-system\", \"BlinkMacSystemFont\", \"Segoe UI\", \"Roboto\", \"Oxygen\", \"Ubuntu\", \"Cantarell\", \"Fira Sans\", \"Droid Sans\", \"Helvetica Neue\", \"sans-serif\"],\n bodyFontFamily: [\"georgia\", \"serif\"],\n headerColor: \"inherit\",\n bodyColor: \"hsla(0,0%,0%,0.8)\",\n headerWeight: \"bold\",\n bodyWeight: \"normal\",\n boldWeight: \"bold\",\n includeNormalize: !0,\n blockMarginBottom: 1\n }, e),\n i = y.default(t);\n return i.scale = function (e) {\n var o = parseInt(t.baseFontSize, 10),\n r = b.default(e, t.scaleRatio) * o + \"px\";\n return i.adjustFontSizeTo(r);\n }, M({\n options: t\n }, i, {\n createStyles: function createStyles() {\n return this.toString();\n },\n toJSON: function toJSON() {\n return function (e, t) {\n var i,\n o = {},\n r = e.establishBaseline();\n o = C(o, \"html\", {\n font: r.fontSize + \"/\" + r.lineHeight + \" \" + t.bodyFontFamily.map(R).join(\",\"),\n boxSizing: \"border-box\",\n overflowY: \"scroll\"\n }), o = C(o, [\"*\", \"*:before\", \"*:after\"], {\n boxSizing: \"inherit\"\n }), o = C(o, \"body\", {\n color: t.bodyColor,\n fontFamily: t.bodyFontFamily.map(R).join(\",\"),\n fontWeight: t.bodyWeight,\n wordWrap: \"break-word\",\n fontKerning: \"normal\",\n MozFontFeatureSettings: '\"kern\", \"liga\", \"clig\", \"calt\"',\n msFontFeatureSettings: '\"kern\", \"liga\", \"clig\", \"calt\"',\n WebkitFontFeatureSettings: '\"kern\", \"liga\", \"clig\", \"calt\"',\n fontFeatureSettings: '\"kern\", \"liga\", \"clig\", \"calt\"'\n }), o = C(o, \"img\", {\n maxWidth: \"100%\"\n }), i = B.default(t.blockMarginBottom) ? e.rhythm(t.blockMarginBottom) : k.default(t.blockMarginBottom) ? t.blockMarginBottom : e.rhythm(1), o = C(o, [\"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\", \"hgroup\", \"ul\", \"ol\", \"dl\", \"dd\", \"p\", \"figure\", \"pre\", \"table\", \"fieldset\", \"blockquote\", \"form\", \"noscript\", \"iframe\", \"img\", \"hr\", \"address\"], {\n marginLeft: 0,\n marginRight: 0,\n marginTop: 0,\n paddingBottom: 0,\n paddingLeft: 0,\n paddingRight: 0,\n paddingTop: 0,\n marginBottom: i\n }), o = C(o, \"blockquote\", {\n marginRight: e.rhythm(1),\n marginBottom: i,\n marginLeft: e.rhythm(1)\n }), o = C(o, [\"b\", \"strong\", \"dt\", \"th\"], {\n fontWeight: t.boldWeight\n }), o = C(o, \"hr\", {\n background: S.default(80),\n border: \"none\",\n height: \"1px\",\n marginBottom: \"calc(\" + i + \" - 1px)\"\n }), o = C(o, [\"ol\", \"ul\"], {\n listStylePosition: \"outside\",\n listStyleImage: \"none\",\n marginLeft: e.rhythm(1)\n }), o = C(o, \"li\", {\n marginBottom: \"calc(\" + i + \" / 2)\"\n }), o = C(o, [\"ol li\", \"ul li\"], {\n paddingLeft: 0\n }), o = C(o, [\"li > ol\", \"li > ul\"], {\n marginLeft: e.rhythm(1),\n marginBottom: \"calc(\" + i + \" / 2)\",\n marginTop: \"calc(\" + i + \" / 2)\"\n }), o = C(o, [\"blockquote *:last-child\", \"li *:last-child\", \"p *:last-child\"], {\n marginBottom: 0\n }), o = C(o, [\"li > p\"], {\n marginBottom: \"calc(\" + i + \" / 2)\"\n }), o = C(o, [\"code\", \"kbd\", \"pre\", \"samp\"], M({}, e.adjustFontSizeTo(\"85%\"))), (o = C(o, [\"abbr\", \"acronym\"], {\n borderBottom: \"1px dotted \" + S.default(50),\n cursor: \"help\"\n }))[\"abbr[title]\"] = {\n borderBottom: \"1px dotted \" + S.default(50),\n cursor: \"help\",\n textDecoration: \"none\"\n }, o = C(o, [\"table\"], M({}, e.adjustFontSizeTo(t.baseFontSize), {\n borderCollapse: \"collapse\",\n width: \"100%\"\n })), o = C(o, [\"thead\"], {\n textAlign: \"left\"\n }), o = C(o, [\"td,th\"], {\n textAlign: \"left\",\n borderBottom: \"1px solid \" + S.default(88),\n fontFeatureSettings: '\"tnum\"',\n MozFontFeatureSettings: '\"tnum\"',\n msFontFeatureSettings: '\"tnum\"',\n WebkitFontFeatureSettings: '\"tnum\"',\n paddingLeft: e.rhythm(2 / 3),\n paddingRight: e.rhythm(2 / 3),\n paddingTop: e.rhythm(.5),\n paddingBottom: \"calc(\" + e.rhythm(.5) + \" - 1px)\"\n }), o = C(o, \"th:first-child,td:first-child\", {\n paddingLeft: 0\n }), o = C(o, \"th:last-child,td:last-child\", {\n paddingRight: 0\n }), o = C(o, [\"h1\", \"h2\", \"h3\", \"h4\", \"h5\", \"h6\"], {\n color: t.headerColor,\n fontFamily: t.headerFontFamily.map(R).join(\",\"),\n fontWeight: t.headerWeight,\n textRendering: \"optimizeLegibility\"\n });\n var n = e.scale(1),\n a = e.scale(.6),\n l = e.scale(.4),\n d = e.scale(0),\n u = e.scale(-.2),\n s = e.scale(-.3);\n return v.default([n, a, l, d, u, s], function (e, i) {\n o = F.default(o, \"h\" + (i + 1) + \".fontSize\", e.fontSize), o = F.default(o, \"h\" + (i + 1) + \".lineHeight\", t.headerLineHeight);\n }), z.default(t.plugins) && (o = j.default(t.plugins, function (i, o) {\n return q.default(i, o(e, t, i));\n }, o)), t.overrideStyles && x.default(t.overrideStyles) && (o = q.default(o, t.overrideStyles(e, t, o))), t.overrideThemeStyles && x.default(t.overrideThemeStyles) && (o = q.default(o, t.overrideThemeStyles(e, t, o))), o;\n }(i, t);\n },\n toString: function toString() {\n return N(0, t, this.toJSON());\n },\n injectStyles: function injectStyles() {\n if (\"undefined\" != typeof document) if (document.getElementById(\"typography.js\")) document.getElementById(\"typography.js\").innerHTML = this.toString();else {\n var e = document.createElement(\"style\");\n e.id = \"typography.js\", e.innerHTML = this.toString();\n var t = document.head;\n t.firstChild ? t.insertBefore(e, t.firstChild) : t.appendChild(e);\n }\n }\n });\n};","var arrayLikeKeys = require('./_arrayLikeKeys'),\n baseKeysIn = require('./_baseKeysIn'),\n isArrayLike = require('./isArrayLike');\n\n/**\n * Creates an array of the own and inherited enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keysIn(new Foo);\n * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n */\nfunction keysIn(object) {\n return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);\n}\n\nmodule.exports = keysIn;\n","/**\n * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseFor(fromRight) {\n return function(object, iteratee, keysFunc) {\n var index = -1,\n iterable = Object(object),\n props = keysFunc(object),\n length = props.length;\n\n while (length--) {\n var key = props[fromRight ? length : ++index];\n if (iteratee(iterable[key], key, iterable) === false) {\n break;\n }\n }\n return object;\n };\n}\n\nmodule.exports = createBaseFor;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n try {\n // Use `util.types` for Node.js 10+.\n var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n if (types) {\n return types;\n }\n\n // Legacy `process.binding('util')` for Node.js < 10.\n return freeProcess && freeProcess.binding && freeProcess.binding('util');\n } catch (e) {}\n}());\n\nmodule.exports = nodeUtil;\n","var eq = require('./eq'),\n isArrayLike = require('./isArrayLike'),\n isIndex = require('./_isIndex'),\n isObject = require('./isObject');\n\n/**\n * Checks if the given arguments are from an iteratee call.\n *\n * @private\n * @param {*} value The potential iteratee value argument.\n * @param {*} index The potential iteratee index or key argument.\n * @param {*} object The potential iteratee object argument.\n * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n * else `false`.\n */\nfunction isIterateeCall(value, index, object) {\n if (!isObject(object)) {\n return false;\n }\n var type = typeof index;\n if (type == 'number'\n ? (isArrayLike(object) && isIndex(index, object.length))\n : (type == 'string' && index in object)\n ) {\n return eq(object[index], value);\n }\n return false;\n}\n\nmodule.exports = isIterateeCall;\n","var baseGet = require('./_baseGet');\n\n/**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\nfunction get(object, path, defaultValue) {\n var result = object == null ? undefined : baseGet(object, path);\n return result === undefined ? defaultValue : result;\n}\n\nmodule.exports = get;\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n","var SetCache = require('./_SetCache'),\n arraySome = require('./_arraySome'),\n cacheHas = require('./_cacheHas');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * A specialized version of `baseIsEqualDeep` for arrays with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Array} array The array to compare.\n * @param {Array} other The other array to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `array` and `other` objects.\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n */\nfunction equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n arrLength = array.length,\n othLength = other.length;\n\n if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n return false;\n }\n // Check that cyclic values are equal.\n var arrStacked = stack.get(array);\n var othStacked = stack.get(other);\n if (arrStacked && othStacked) {\n return arrStacked == other && othStacked == array;\n }\n var index = -1,\n result = true,\n seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\n\n stack.set(array, other);\n stack.set(other, array);\n\n // Ignore non-index properties.\n while (++index < arrLength) {\n var arrValue = array[index],\n othValue = other[index];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, arrValue, index, other, array, stack)\n : customizer(arrValue, othValue, index, array, other, stack);\n }\n if (compared !== undefined) {\n if (compared) {\n continue;\n }\n result = false;\n break;\n }\n // Recursively compare arrays (susceptible to call stack limits).\n if (seen) {\n if (!arraySome(other, function(othValue, othIndex) {\n if (!cacheHas(seen, othIndex) &&\n (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n return seen.push(othIndex);\n }\n })) {\n result = false;\n break;\n }\n } else if (!(\n arrValue === othValue ||\n equalFunc(arrValue, othValue, bitmask, customizer, stack)\n )) {\n result = false;\n break;\n }\n }\n stack['delete'](array);\n stack['delete'](other);\n return result;\n}\n\nmodule.exports = equalArrays;\n","import Typography from 'typography'\nimport GitHubTheme from 'typography-theme-github'\n\nGitHubTheme.overrideThemeStyles = () => {\n return {\n a: {\n boxShadow: `none`,\n textDecoration: `none`,\n color: `#0687f0`,\n },\n 'a.gatsby-resp-image-link': {\n boxShadow: `none`,\n textDecoration: `none`,\n },\n\n 'a:hover': {\n textDecoration: `none`,\n },\n\n h1: {\n fontWeight: 800,\n lineHeight: 1.2,\n fontFamily: 'Catamaran',\n },\n\n h2: {\n fontWeight: 700,\n lineHeight: 1.2,\n marginTop: '56px',\n marginBottom: '20px',\n fontFamily: 'Catamaran',\n },\n\n ul: {\n marginBottom: '6px',\n },\n\n li: {\n marginBottom: '2px',\n },\n }\n}\n\nconst typography = new Typography(GitHubTheme)\n\n// Hot reload typography in development.\nif (process.env.NODE_ENV !== `production`) {\n typography.injectStyles()\n}\n\nexport default typography\nexport const rhythm = typography.rhythm\nexport const scale = typography.scale\n","var constant = require('./constant'),\n defineProperty = require('./_defineProperty'),\n identity = require('./identity');\n\n/**\n * The base implementation of `setToString` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar baseSetToString = !defineProperty ? identity : function(func, string) {\n return defineProperty(func, 'toString', {\n 'configurable': true,\n 'enumerable': false,\n 'value': constant(string),\n 'writable': true\n });\n};\n\nmodule.exports = baseSetToString;\n","var getMapData = require('./_getMapData');\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n return getMapData(this, key).has(key);\n}\n\nmodule.exports = mapCacheHas;\n","var baseGetAllKeys = require('./_baseGetAllKeys'),\n getSymbols = require('./_getSymbols'),\n keys = require('./keys');\n\n/**\n * Creates an array of own enumerable property names and symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeys(object) {\n return baseGetAllKeys(object, keys, getSymbols);\n}\n\nmodule.exports = getAllKeys;\n","/**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\nfunction setToArray(set) {\n var index = -1,\n result = Array(set.size);\n\n set.forEach(function(value) {\n result[++index] = value;\n });\n return result;\n}\n\nmodule.exports = setToArray;\n","/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n return function(value) {\n return func(value);\n };\n}\n\nmodule.exports = baseUnary;\n","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n/* eslint-disable */\n/*! normalize.css v4.1.1 | MIT License | github.com/necolas/normalize.css */\nexports.default = \"html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block}audio:not([controls]){display:none;height:0}progress{vertical-align:baseline}[hidden],template{display:none}a{background-color:transparent;}a:active,a:hover{outline-width:0}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:inherit;font-weight:bolder}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}svg:not(:root){overflow:hidden}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}button,input,optgroup,select,textarea{font:inherit;margin:0}optgroup{font-weight:700}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-input-placeholder{color:inherit;opacity:.54}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}\";","var getAllKeys = require('./_getAllKeys');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqualDeep` for objects with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n objProps = getAllKeys(object),\n objLength = objProps.length,\n othProps = getAllKeys(other),\n othLength = othProps.length;\n\n if (objLength != othLength && !isPartial) {\n return false;\n }\n var index = objLength;\n while (index--) {\n var key = objProps[index];\n if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n return false;\n }\n }\n // Check that cyclic values are equal.\n var objStacked = stack.get(object);\n var othStacked = stack.get(other);\n if (objStacked && othStacked) {\n return objStacked == other && othStacked == object;\n }\n var result = true;\n stack.set(object, other);\n stack.set(other, object);\n\n var skipCtor = isPartial;\n while (++index < objLength) {\n key = objProps[index];\n var objValue = object[key],\n othValue = other[key];\n\n if (customizer) {\n var compared = isPartial\n ? customizer(othValue, objValue, key, other, object, stack)\n : customizer(objValue, othValue, key, object, other, stack);\n }\n // Recursively compare objects (susceptible to call stack limits).\n if (!(compared === undefined\n ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n : compared\n )) {\n result = false;\n break;\n }\n skipCtor || (skipCtor = key == 'constructor');\n }\n if (result && !skipCtor) {\n var objCtor = object.constructor,\n othCtor = other.constructor;\n\n // Non `Object` object instances with different constructors are not equal.\n if (objCtor != othCtor &&\n ('constructor' in object && 'constructor' in other) &&\n !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n result = false;\n }\n }\n stack['delete'](object);\n stack['delete'](other);\n return result;\n}\n\nmodule.exports = equalObjects;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n return typeof value == 'number' &&\n value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\nmodule.exports = isLength;\n","var baseAssignValue = require('./_baseAssignValue'),\n eq = require('./eq');\n\n/**\n * This function is like `assignValue` except that it doesn't assign\n * `undefined` values.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction assignMergeValue(object, key, value) {\n if ((value !== undefined && !eq(object[key], value)) ||\n (value === undefined && !(key in object))) {\n baseAssignValue(object, key, value);\n }\n}\n\nmodule.exports = assignMergeValue;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n var data = this.__data__,\n index = assocIndexOf(data, key);\n\n return index < 0 ? undefined : data[index][1];\n}\n\nmodule.exports = listCacheGet;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar DataView = getNative(root, 'DataView');\n\nmodule.exports = DataView;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n var data = this.__data__;\n if (nativeCreate) {\n var result = data[key];\n return result === HASH_UNDEFINED ? undefined : result;\n }\n return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\nmodule.exports = hashGet;\n","var baseMatches = require('./_baseMatches'),\n baseMatchesProperty = require('./_baseMatchesProperty'),\n identity = require('./identity'),\n isArray = require('./isArray'),\n property = require('./property');\n\n/**\n * The base implementation of `_.iteratee`.\n *\n * @private\n * @param {*} [value=_.identity] The value to convert to an iteratee.\n * @returns {Function} Returns the iteratee.\n */\nfunction baseIteratee(value) {\n // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\n // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\n if (typeof value == 'function') {\n return value;\n }\n if (value == null) {\n return identity;\n }\n if (typeof value == 'object') {\n return isArray(value)\n ? baseMatchesProperty(value[0], value[1])\n : baseMatches(value);\n }\n return property(value);\n}\n\nmodule.exports = baseIteratee;\n","var baseIsEqualDeep = require('./_baseIsEqualDeep'),\n isObjectLike = require('./isObjectLike');\n\n/**\n * The base implementation of `_.isEqual` which supports partial comparisons\n * and tracks traversed objects.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {boolean} bitmask The bitmask flags.\n * 1 - Unordered comparison\n * 2 - Partial comparison\n * @param {Function} [customizer] The function to customize comparisons.\n * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n */\nfunction baseIsEqual(value, other, bitmask, customizer, stack) {\n if (value === other) {\n return true;\n }\n if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n return value !== value && other !== other;\n }\n return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n}\n\nmodule.exports = baseIsEqual;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n var type = typeof value;\n length = length == null ? MAX_SAFE_INTEGER : length;\n\n return !!length &&\n (type == 'number' ||\n (type != 'symbol' && reIsUint.test(value))) &&\n (value > -1 && value % 1 == 0 && value < length);\n}\n\nmodule.exports = isIndex;\n","var baseSetToString = require('./_baseSetToString'),\n shortOut = require('./_shortOut');\n\n/**\n * Sets the `toString` method of `func` to return `string`.\n *\n * @private\n * @param {Function} func The function to modify.\n * @param {Function} string The `toString` result.\n * @returns {Function} Returns `func`.\n */\nvar setToString = shortOut(baseSetToString);\n\nmodule.exports = setToString;\n","/**\n * Checks if a `cache` value for `key` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction cacheHas(cache, key) {\n return cache.has(key);\n}\n\nmodule.exports = cacheHas;\n","var arrayReduce = require('./_arrayReduce'),\n baseEach = require('./_baseEach'),\n baseIteratee = require('./_baseIteratee'),\n baseReduce = require('./_baseReduce'),\n isArray = require('./isArray');\n\n/**\n * Reduces `collection` to a value which is the accumulated result of running\n * each element in `collection` thru `iteratee`, where each successive\n * invocation is supplied the return value of the previous. If `accumulator`\n * is not given, the first element of `collection` is used as the initial\n * value. The iteratee is invoked with four arguments:\n * (accumulator, value, index|key, collection).\n *\n * Many lodash methods are guarded to work as iteratees for methods like\n * `_.reduce`, `_.reduceRight`, and `_.transform`.\n *\n * The guarded methods are:\n * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,\n * and `sortBy`\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @param {*} [accumulator] The initial value.\n * @returns {*} Returns the accumulated value.\n * @see _.reduceRight\n * @example\n *\n * _.reduce([1, 2], function(sum, n) {\n * return sum + n;\n * }, 0);\n * // => 3\n *\n * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n * (result[value] || (result[value] = [])).push(key);\n * return result;\n * }, {});\n * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)\n */\nfunction reduce(collection, iteratee, accumulator) {\n var func = isArray(collection) ? arrayReduce : baseReduce,\n initAccum = arguments.length < 3;\n\n return func(collection, baseIteratee(iteratee, 4), accumulator, initAccum, baseEach);\n}\n\nmodule.exports = reduce;\n","var eq = require('./eq');\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n var length = array.length;\n while (length--) {\n if (eq(array[length][0], key)) {\n return length;\n }\n }\n return -1;\n}\n\nmodule.exports = assocIndexOf;\n","var getNative = require('./_getNative'),\n root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Set = getNative(root, 'Set');\n\nmodule.exports = Set;\n","var cloneArrayBuffer = require('./_cloneArrayBuffer');\n\n/**\n * Creates a clone of `typedArray`.\n *\n * @private\n * @param {Object} typedArray The typed array to clone.\n * @param {boolean} [isDeep] Specify a deep clone.\n * @returns {Object} Returns the cloned typed array.\n */\nfunction cloneTypedArray(typedArray, isDeep) {\n var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;\n return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);\n}\n\nmodule.exports = cloneTypedArray;\n","/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n return value;\n}\n\nmodule.exports = identity;\n","var Symbol = require('./_Symbol'),\n arrayMap = require('./_arrayMap'),\n isArray = require('./isArray'),\n isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n // Exit early for strings to avoid a performance hit in some environments.\n if (typeof value == 'string') {\n return value;\n }\n if (isArray(value)) {\n // Recursively convert values (susceptible to call stack limits).\n return arrayMap(value, baseToString) + '';\n }\n if (isSymbol(value)) {\n return symbolToString ? symbolToString.call(value) : '';\n }\n var result = (value + '');\n return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = baseToString;\n"],"sourceRoot":""} \ No newline at end of file diff --git a/2020/07/cara-memulai-jadi-programmer/index.html b/2020/07/cara-memulai-jadi-programmer/index.html new file mode 100644 index 00000000..069f1145 --- /dev/null +++ b/2020/07/cara-memulai-jadi-programmer/index.html @@ -0,0 +1,70 @@ +Memulai Jadi Programmer | Dev Jurnal

Memulai Jadi Programmer

Untuk memulai jadi programmer, ada beberapa hal yang perlu kita cari tahu sebelumnya

+
    +
  1. Apa yang mau kita buat? Aplikasi desktop, mobile atau website? Hal itu menentukan bahasa pemrograman apa yang harus kita kuasai. Misalnya untuk pemrograman web kamu bisa memilih PHP, JavaScript atau Ruby. Atau untuk aplikasi mobile ada bahasa Java.
  2. +
  3. Pelajari konsep inti pemrograman. Setelah menentukan pilihan apa yang akan kita buat, pelajari konsep inti pemrograman dengan bahasa yang sudah dipilih. Pada dasarnya semua bahasa pemrograman memiliki konsep inti yang relatif sama. Salah satu hal yang membedakan antara bahasa satu dengan yang lainnya adalah syntax-nya. Fokus menguasai satu bahasa pemrograman dengan konsep inti yang kuat akan membuat kita lebih mudah menguasai bahasa lainnya. Konsep inti dari bahasa pemrograman yang perlu kita kuasai adalah variabel, tipe data, komentar, pengkondisian (if-else), perulangan (looping) dan fungsi (function).
  4. +
  5. Buat aplikasi sederhana. Mengetahui tentang konsep inti pemrograman tidak serta merta membuat kita bisa menjadi programer handal. Kamu harus segera membuat program pertamamu dengan apa yang kamu punya. Learning by doing, dengan membuat program kamu akan mengerti tentang algoritma atau bagaimana membuat kode bekerja menghasilkan sesuatu yang kita inginkan.
  6. +

Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2020/07/peta-jalan-web-developer/index.html b/2020/07/peta-jalan-web-developer/index.html new file mode 100644 index 00000000..d5aa6348 --- /dev/null +++ b/2020/07/peta-jalan-web-developer/index.html @@ -0,0 +1,66 @@ +Peta Jalan Web Developer | Dev Jurnal

Peta Jalan Web Developer

Sebagai seorang web developer, kita bisa melihat peta jalan di situs roadmap.sh untuk memberikan gambaran yang lebih jelas dalam melangkah di belantara hutan pemrograman web. Peta jalan ini tentu bukan rujukan mutlak, itu ditulis berdasarkan pengalaman seseorang dan dilengkapi oleh komunitas. Peta jalan itu akan membantu kita untuk menyusun urutan dan prioritas teknologi atau tools apa yang harus kita kuasai di setiap tahapannya.

+

Pertama, secara garis besar peta jalan ini dibagi sesuai tujuannya. Apakah kita memilih untuk berfokus pada front-end, back-end atau devops. Setiap peta jalan ini akan memberi tahu kita step-by-step tentang pengetahuan apa yang harus kita kuasai berdasarkan saran anggota komunitas developer yang berkontribusi di situs tersebut. Di setiap cek poinnya dicantumkan teknologi apa saja yang wajib kita kuasai dan beberapa alternatifnya yang tersedia saat ini. Dengan memanfaatkan informasi dari website tersebut kita bisa lebih terarah dalam mempelajari teknologi web.


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2020/07/pustaka-dokumentasi-lengkap/index.html b/2020/07/pustaka-dokumentasi-lengkap/index.html new file mode 100644 index 00000000..a940a51d --- /dev/null +++ b/2020/07/pustaka-dokumentasi-lengkap/index.html @@ -0,0 +1,65 @@ +Pustaka Dokumentasi Lengkap | Dev Jurnal

Pustaka Dokumentasi Lengkap

Saat kita membeli barang elektronik, pabrik menyertakan sebuah manual book sebagai petunjuk penggunaan bagi user. Hal tersebut juga berlaku untuk produk di dunia IT. Untuk bisa menggunakan sebuah produk dengan baik dan benar, produsen menyiapkan dokumentasi, sebuah panduan penggunaan untuk pengguna dalam mengoperasikan produk tersebut. Kita bisa mengunjungi website resmi masing-masing vendor untuk membaca dokumentasi. Atau kita bisa mengunjungi DevDocs, website yang menggabungkan beberapa API dokumentasi dalam antarmuka yang cepat, teratur, dan dilengkapi dengan fitur pencarian. Meskipun tampilannya tidak sebaik dokumentasi resmi, website ini akan memudahkan kita untuk browsing dokumentasi di satu tempat saja tanpa perlu membuka banyak halaman dokumentasi resmi masing-masing produk.


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2021/01/markdown-adalah/index.html b/2021/01/markdown-adalah/index.html new file mode 100644 index 00000000..63eeb6ba --- /dev/null +++ b/2021/01/markdown-adalah/index.html @@ -0,0 +1,75 @@ +Markdown adalah | Dev Jurnal

Markdown adalah

Markdown adalah bahasa markup ringan untuk memformat plain teks menggunakan editor teks biasa yang kemudian diubah menjadi HTML terstruktur. Jadi, kita bisa membuat format teks bold atau membuat list menggunakan notepad tanpa menulis tag HTML.

+

John Gruber dan Aaron Swartz membuat Markdown pada tahun 2004 setelah merasa frustrasi menulis teks yang panjang menggunakan tag HTML untuk memformat konten. Dia kemudian merancang sistem penulisan yang akan membuat dokumen berbasis web mudah ditulis dan dibaca dalam bentuk raw nya sekalipun.

+

Markdown banyak digunakan dalam halaman dokumentasi dan file readme. File markdown disimpan menggunakan ekstensi *.md. Markdown dibuat untuk bisa dibaca dan ditulis semudah mungkin seperti teks biasa. Berbeda dengan format markup lain seperti HTML yang menggunakan tag (misal <strong> untuk cetak tebal), markdown hanya menggunakan simbol-simbol sederhana. Sumber inspirasi terbesar untuk sintaks Markdown adalah format teks pada email.

+

Selain digunakan pada dokumentasi teknis, banyak orang yang merasakan manfaat markdown dibanding aplikasi pengolah kata dengan GUI. Mungkin sebagian besar pengguna pemula merasa tombol GUI lebih mudah digunakan. Sementara penulis yang lebih advance merasa terbantu dengan Markdown. Mengapa? Alasan terbesarnya adalah karena alur penulisan.

+

Ketika menggunakan aplikasi GUI, Anda harus menjeda tulisan Anda setiap beberapa menit (atau terkadang detik) dan mengoperasikan mouse untuk mengklik, mengeblok, mengklik tombol pemformatan, dan kemudian mengklik kembali ke tempat Anda tinggalkan untuk melanjutkan.Proses ini melelahkan dan membuat pekerjaan terputus ketika yang ingin Anda lakukan hanyalah mengeluarkan kata-kata dari kepala ke layar.

+

Markdown memungkinkan Anda menjaga jari-jari Anda tetap di atas keyboard saat Anda menerapkan pemformatan dengan cepat. Singkatnya: Anda tidak perlu berhenti mengetik atau memikirkan hal lain untuk menerapkan format yang diinginkan. Meskipun tampak seperti hal detail yang kecil, tetapi hal itu dapat memiliki efek yang sangat besar. Setelah Anda mulai menulis dengan Markdown, sangat sulit untuk kembali ke GUI dengan banyak tombol yang harus diklik.

+

Berikut contoh sederhana sintaks Markdown

+
The _quick_ brown fox, jumped **over** the lazy [dog](https://en.wikipedia.org/wiki/Dog)
+

Blok kode di atas akan menghasilkan teks berikut

+

The quick brown fox, jumped over the lazy dog

+

Penggunaan sintaks Markdown selengkapnya dapat dibaca di artikel Cara Menggunakan Markdown


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2021/02/cara-menggunakan-markdown-dasar/index.html b/2021/02/cara-menggunakan-markdown-dasar/index.html new file mode 100644 index 00000000..8c73886f --- /dev/null +++ b/2021/02/cara-menggunakan-markdown-dasar/index.html @@ -0,0 +1,118 @@ +Cara Menggunakan Markdown Dasar | Dev Jurnal

Cara Menggunakan Markdown Dasar

Markdown dirancang dengan tujuan mudah dibaca oleh manusia. Sebagian besar sintaksnya sederhana dan intuitif sehingga mudah dipelajari. Berikut beberapa sintaks yang mungkin sering anda gunakan dalam menulis.

+

Heading

+
# Heading 1
+## Heading 2
+### Heading 3
+

Heading pada Markdown ditulis dengan tanda pagar/hash (#). Jumlah pagar menentukan tingkat heading tersebut. Satu pagar menghasilkan h1, dua pagar menghasilkan h2 dan seterusnya sampai maksimal 6 tingkat. Pada praktiknya kita seringkali hanya menggunakan 3 tingkat saja.

+

Text

+
*italic*
+**bold**
+***bold-italic***
+[link](https://example.com)
+

Biasanya kita membutuhkan tekanan pada tulisan kita. Kita bisa menggunakan Markdown untuk membuat penekanan dengan cetak miring, cetak tebal atau cetak miring dan tebal. Markdown membuatnya cukup intuitif dengan melambangkannya sesuai jumlah tanda bintang.

+

Untuk membuat teks link, bungkus teksnya menggunakan tanda kurung siku [] lalu letakkan url setelahnya dengan membungkusnya menggunakan kurung biasa ().

+

Image

+
![alt](https://image.com/link.jpg)
+

Untuk menyematkan gambar pada Markdown caranya hampir sama dengan link, hanya saja sintaks image diawali dengan tanda seru !. Di dalam kurung siku diisi dengan alt atau teks deskriptif mengenai gambar. lalu letakkan url gambar setelahnya dengan membungkusnya menggunakan kurung biasa ().

+

List

+
* Susu
+* Roti
+    * Roti Tawar
+    * Roti selai cokelat
+* Mentega
+
+1. Merapikan taman
+2. Membersihkan dapur
+3. Memasak
+

Memformat list menggunakan HTML mungkin cukup merepotkan. Di Markdown kita bisa membuat list dengan sangat natural. Jika menginginkan bullet list, ganti tanda * pada contoh dengan - atau + lalu tanda itu akan diubah menjadi dot (titik). Kita juga bisa membuat list yang bersarang dengan menambah 4 spasi, list dengan indentasi akan otomatis menjadi child. Untuk format angka lakukan hal yang serupa, tetapi tidak menggunakan tanda bintang, gunakan saja angka biasa

+
    +
  • Susu
  • +
  • +

    Roti

    +
      +
    • Roti Tawar
    • +
    • Roti selai cokelat
    • +
    +
  • +
  • Mentega
  • +
  • +

    Merapikan taman

    +
      +
    1. Memotong rumput
    2. +
    3. Menyiram bunga
    4. +
    +
  • +
  • Membersihkan dapur
  • +
  • Memasak
  • +
+

Quotes (kutipan)

+
> "I think it is possible for ordinary people to choose to be extraordinary."
+

Kutipan pada Markdown diawali dengan tanda lebih besar dari (>). Contoh di atas akan diubah menjadi blok quote di bawah.

+
+

“I think it is possible for ordinary people to choose to be extraordinary.”

+
+

Dengan menguasai sintaks di atas, kita sudah bisa menulis konten menggunakan Markdown. Masih banyak lagi yang bisa kita lakukan dengan Markdown, baca di artikel Cara Menggunakan Markdown Lanjutan


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2021/02/cara-menggunakan-markdown-lanjutan/index.html b/2021/02/cara-menggunakan-markdown-lanjutan/index.html new file mode 100644 index 00000000..c838be86 --- /dev/null +++ b/2021/02/cara-menggunakan-markdown-lanjutan/index.html @@ -0,0 +1,100 @@ +Cara Menggunakan Markdown Lanjutan | Dev Jurnal

Cara Menggunakan Markdown Lanjutan

Ada beberapa pemformatan yang dibutuhkan oleh penulis lanjutan. Itu juga bisa membantu dalam menulis artikel blog. Berikut sintaks Markdown yang biasa digunakan dalam penulisan yang lebih advance

+

Garis Horizontal (hr)

+
---
+

Biasanya kita membutuhkan sebuah viusal untuk membuat pembatas antar section dalam sebuah artikel. Dengan Markdown kita bisa mengetikkan tiga strip yang akan menghasilkan elemen berikut

+
+

Persis seperti menggunakan elemen <hr> pada HTML

+

Code Snippet

+
Kalimat dengan `code` inline
+
+    .css-class {
+        text-decoration: bold;
+    }
+

Jika kita sering menulis dokumentasi teknis, kita mungkin sering menggunakan code snippet untuk menampilkan sintaks kodingan kita. Untuk melakukan itu gunakan tanda backtick (`) untuk membungkus kode yang hanya satu baris. Atau tekan 4 spasi untuk membuat sebuah paragrapf menjadi satu blok kode.

+

Daftar Referensi dan Judul

+
**The quick brown [fox][1], jumped over the lazy [dog][2].**
+
+[1]: https://en.wikipedia.org/wiki/Fox "Wikipedia: Fox"
+[2]: https://en.wikipedia.org/wiki/Dog "Wikipedia: Dog"
+

Penulis yang memerlukan penyematan referensi bisa menggunakan cara di atas. Angka yang dituliskan setelah text dalam kurung siku akan merujuk pada link yang ditulis dengan angka yang sama. Kata dalam kutipan setelah url adalah judul dari kutipan tersebut yang bisa juga digunakan pada link sebagai atribut title.

+
[Dog](https://en.wikipedia.org/wiki/Dog "Wikipedia: Dog")
+

Coba letakkan kursor pada link berikut Dog

+

Escaping

+
\*kata\*
+

Bagaimana jika kita ingin menuliskan secara literal sebuah *kata* namun tidak ditampilkan sebagai cetak miring? Escape karakter Markdown dengan tanda back slash () supaya tanda baca tidak dikonversi menjadi tag HTML.

+

Embedd HTML

+
<button>HTML Button</button>
+

Salah satu fitur paling keren dari Markdown adalah kita tetap bisa menulis sintaks plain HTML. Teks HTML akan dibaca sebagai tag HTML seperti biasa dan menghasilkan komponen sesuai teksnya.

+

+

Markdown Editor

+

Untuk segera menulis menggunakan Markdown kita bisa beralih dari plain text editor menggunakan Markdown editor yang akan menampilkan teks terformat yang bersumber dari teks Markdown. Untuk pengguna Windows ada beberapa alternatif

+ +

Jika ingin membaca lebih lanjut tentang panduan Markdown Anda bisa mengunjungi markdownguide.org atau baca post Markdown Cheatseet


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2021/02/cara-menggunakan-npm/index.html b/2021/02/cara-menggunakan-npm/index.html new file mode 100644 index 00000000..16e68e21 --- /dev/null +++ b/2021/02/cara-menggunakan-npm/index.html @@ -0,0 +1,73 @@ +Cara Menggunakan NPM | Dev Jurnal

Cara Menggunakan NPM

Di sisi pengguna, kita bisa menginstall paket-paket yang tersedia gratis di npm registry dengan menjalankan CLI. Jadi ada baiknya mengetahui cara menggunakan alat yang powerfull ini.

+

npm install - adalah perintah yang paling umum digunakan saat mengembangkan aplikasi JavaScript / Node.js saat ini. Secara default, npm install <package-name> akan menginstal versi terbaru dari sebuah paket dengan tanda versi ^. Instalasi npm dalam konteks lokal sebuah project adalah mengunduh paket ke folder node_modules di dalam direktori project sesuai dengan spesifikasi package.json, mengupdate versi paket (dan meregenerasi package-lock.json) di mana pun itu berdasarkan pada pencocokan versi yang ditandai dengan ^ dan ~ .

+

Kita dapat menambahkan flag global (-g) jika ingin menginstal paket dalam konteks global yang dapat digunakan di direktori manapun dalam komputer (umumnya pada paket tool CLI seperti live server misalnya). npm telah membuat penginstalan paket JavaScript begitu mudah sehingga perintah ini sering digunakan secara tidak benar. Akibatnya npm banyak menjadi lelucon programmer karena menghasilkan folder node_module dengan ukuran sangat besar.

+

Di sinilah --production flag berperan. Di bagian sebelumnya, kita membahas dependensi dan devDependency yang dimaksudkan untuk penggunaan masing-masing dalam lingkungan produksi dan pengembangan / pengujian. Dengan melampirkan --production flag ke perintah npm install, kita hanya akan menginstal paket dari dependensi, sehingga secara drastis mengurangi ukuran node_modules. Kita hanya menginstal apa yang benar-benar diperlukan agar aplikasi dapat aktif dan berjalan.

+

npm ci - jika npm install --production optimal untuk lingkungan produksi, haruskah ada perintah yang optimal untuk pengaturan pengembangan lokal dan pengujian? Gunakan npm ci. Sama seperti bagaimana jika package-lock.json belum ada dalam proyek yang dihasilkan setiap kali npm install dipanggil, npm ci menggunakan file ini untuk mengunduh versi yang tepat dari setiap paket yang menjadi dependensi proyek kita. Ini adalah cara memastikan bahwa konteks proyek kita sama persis ketika dijalankan di berbagai mesin, baik laptop kita yang digunakan untuk pengembangan atau lingkungan build CI (Continuous Integration) seperti Github Actions.

+

npm audit - Dengan banyaknya paket yang telah diterbitkan dan dapat dengan mudah diinstal, paket npm rentan terhadap penerbit paket yang buruk dengan niat jahat yang mungkin terjadi seperti dalam artikel ini. Menyadari adanya masalah pada ekosistem tersebut, organisasi npm.js memunculkan ide tentang npm audit. Mereka membuat daftar celah keamanan yang dapat diaudit oleh pengembang terhadap dependensi paket mereka menggunakan perintah npm audit. npm audit memberikan informasi kepada pengembang tentang kerentanan dan apakah ada versi dengan perbaikan untuk ditingkatkan. Sebagai contoh,

+

screenshot npm audit

+

Jika remediasi tersedia di upgrade versi non-breaking berikutnya, npm audit fix dapat digunakan untuk mengupgrade versi dependensi yang terpengaruh secara otomatis.

+

Sumber: freecodecamp.org


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2021/02/film-dokumenter-bill-gates/index.html b/2021/02/film-dokumenter-bill-gates/index.html new file mode 100644 index 00000000..d390cb62 --- /dev/null +++ b/2021/02/film-dokumenter-bill-gates/index.html @@ -0,0 +1,76 @@ +Film Dokumenter Bill Gates | Dev Jurnal

Film Dokumenter Bill Gates

Selepas menyerahkan kepemimpinan perusahaan kepada penerusnya, Bill Gates fokus pada upaya mengatasi masalah masyarakat terutama di negara-negara berkembang melalui yayasannya. Film dokumenter Netflix berjudul Inside Bill’s Brain: Decoding Bill Gates ini mengisahkan tentang visi Bill Gates untuk mewujudkan dunia yang lebih baik.

+

Membuat Toilet

+

Bill dan Melinda tergerak untuk membuat toilet setelah dia melihat betapa buruk sanitasi di negara-negara berkembang. Di banyak negara berkembang, terutama Afrika yang disorot, sanitasi menjadi masalah lingkungan yang besar yang berdampak pada kualitas hidup manusia. Diperlihatkan kondisi banyak orang masih membuang kotoran manusia di aliran sungai (bagian yang paling menjijikkan). Itu menyebabkan masalah yang lebih besar lagi seperti merebaknya diare yang bisa berakibat kematian pada anak usia dini. Katanya penyakit yang disebabkan oleh kontaminasi air membunuh lebih dari 500.000 anak balita setiap tahun.

+

Bill Gates mulai memikirkan cara untuk mengatasi masalah sanitasi ini. Menurut pengamatannya, salah satu problem terbesar yang dihadapinya adalah sistem sanitasi di kota tidak kompatibel jika diterapkan begitu saja di lingkungan negara berkembang. Sistem perpipaan yang kompleks membuatnya berbiaya tinggi. Di samping itu sistem toilet yang sudah ada memerlukan energi dari luar. Dia lalu membuat event inovasi toilet yang melibatkan universitas dan perusahaan swasta untuk menemukan toilet yang baik, bisa mencukupi energinya sendiri dan berbiaya murah. Dengan melakukan itu Bill berambisi merevolusi sistem toilet saat ini yang sudah berusia 200 tahun.

+

Ada tiga cara yang dilakukannya, pertama menghubungi insinyur teknik ternama dan memintanya membuat toilet untuk skala besar. Dia berhasil menemukan teknologinya, toilet bersih yang menghasilkan energinya sendiri dan yang paling baik, hasil dari pengolahan limbah manusia itu adalah air jernih yang bisa langsung diminum. Inovasi kedua datang dari universitas yang membuat toilet skala individu, dengan spesifikasi yang sama. Beberapa prototipe toilet yang bagus mulai muncul dari para peneliti dan inovator di universitas, tapi harganya masih di kisaran 50.000 dolar dan diangap terlalu mahal. Bill menginginkan produknya harus di bawah 500 dolar. Untuk prototipe bagus yang belum layak dari sisi biaya, dia melakukan presentasi ke Cina. Dia mencari perusahaan manufaktur yang bisa memproduksi toilet dalam jumlah besar sehingga membuat harga satuannya menjadi lebih murah. Sampai film itu dibuat, Bill telah menghabiskan 7 tahun dan 200 juta dollar untuk mewujudkan visinya tentang toilet.

+

Memberantas Polio

+

Bill melihat penyakit polio sebagai isu besar yang mempengaruhi kehidupan manusia. Dia melihat seorang anak perempuan yang kehilangan masa depannya karena terdampak polio. Penyakit ini sangat menular dan bisa berujung pada kelumpuhan. Dia berjuang keras dengan target zero case polio, artinya tidak ada lagi penderita polio di seluruh dunia. Dia mulai memproduksi vaksin dan membangun tim yang melakukan imunisasi di daerah terpencil negara-negara berkembang. Kasus yang paling sulit ditemukan di Nigeria. Masalahnya adalah ketika di satu bagian pekerjaannya tuntas, namun di bagian lain muncul kasus baru. Bill memutuskan untuk turun tangan sendiri. Lalu dia menyadari bahwa masih ada kekurangan dalam melakukan pemetaan. Dia kemudian meningkatkan kecanggihan dalam melakukan pemetaan, meningkatkan dana untuk itu menjadi dua kali lipat hingga 400 juta dolar.

+

Tidak berhenti sampai di situ, dia kembali menghadapi masalah ketika programnya ditentang oleh kelompok agama yang menganggap imunisasi sebagai upaya sterilisasi wanita. Dia kemudian turun tangan sendiri menemui pimpinan adat, agama dan budaya sampai kemudian mereka menerima gagasan vaksin polionya. Tidak selesai di situ, pemberontakan kelompok Boko Haram yang anti barat ikut menghalangi programnya. Salah satu kelompok relawan imunisasinya ditembak saat sedang berkeliling melakukan imunisasi. Polisi yang menjaga mereka juga tewas tertembak. Itu terjadi tidak hanya di Nigeria tapi juga di Afganistan. Orang-orang mulai ragu dengan ambisinya menghapus polio dari dunia. Untuk menjawab pertanyaan itu dia berbicara di forum dunia dan memaparkan bahwa dia akan terus melanjutkan pekerjaannya. Orang bilang itu tidak sepadan, tapi dia akan terus mewujudkan visinya untuk membuat dunia bebas dari polio.

+

Membuat Energi Bersih

+

Salah satu isu yang menjadi sorotan Bill Gates adalah perubahan iklim. Bill banyak membaca buku yang berkaitan dengan iklim dan dia menemukan bahwa penggunaan energi di dunia ini mulai mengkhawatirkan karena banyak menghasilkan emisi gas rumah kaca. Seperempat dari polusi itu dihasilkan oleh transportasi, kemudian peternakan, gedung-gedung dan rumah lalu sisanya sektor lain. Dia melihat sel surya dan baterai sebagai alternatif energi bersih, tapi itu tidak bisa menjadi solusi utama dalam jangka panjang karena keterbatasan baterai sebagai wadah listrik tidak akan mencukupi dengan penggunaan energi saat ini. Hal itu disebabkan karena kita harus menghadapi situasi tanpa cahaya matahari seperti malam, cuaca, musim dingin dsb.

+

Bill justru melihat nuklir sebagai solusi. Masalah energi nuklir datang dari stigma negetif bahwa energi nuklir itu berbahaya. Orang-orang punya ingatan buruk dengan reaktor nuklir seperti pada peristiwa Chernobyl dan Fukushima. Namun Bill Gates punya keyakinan lain, katanya peristiwa itu terjadi karena teknologi reaktor nuklir yang sudah usang dan kebanyakan terjadi karena human error. Dia melihat ada penyebab pada setiap peristiwa kecelakaan nuklir yang sebenarnya bisa diantisipasi dengan teknologi baru. Pandangan negatif tentang nuklir dijawab oleh Bill dengan mengumpulkan pakar-pakar nuklir terbaik. Teknologi yang berusia puluhan tahun lalu itu bisa diperbaiki untuk menjadi teknologi yang ramah lingkungan dan aman. Visinya diwujudkan dengan mendirikan perusahaan bernama Terra Power.

+

Selanjutnya dia memberi pesan pada semua orang bahwa tidak ada solusi tunggal dalam mengatasi perubahan iklim. Setiap level masyarakat bisa memiliki alternatif solusi untuk menghentikan perubahan iklim supaya tidak menghancurkan bumi. Perusahaan-perusahaan bisa mengganti energinya dengan energi bersih, mulai meninggalkan batu bara dan beralih pada energi matahari, angin atau mikrohidro. Pemerintah bisa membuat kebijakan yang pro lingkungan. Individu dalam masyarakat bisa lebih bijak dalam menggunakan energi dan mengelola limbahnya.


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2021/02/jamstack-adalah/index.html b/2021/02/jamstack-adalah/index.html new file mode 100644 index 00000000..61a17260 --- /dev/null +++ b/2021/02/jamstack-adalah/index.html @@ -0,0 +1,84 @@ +JAMStack Adalah | Dev Jurnal

JAMStack Adalah

JAMstack adalah arsitektur software yang disusun dari 3 komponen: Javascript, API, dan Markup. Arsitektur JAMStack dirancang untuk membuat website lebih cepat, lebih aman, dan lebih mudah untuk diskalakan. Prinsip inti JAMStack adalah pre-rendering dan decoupling.

+

Pre-rendering berarti halaman website (markup) yang mewakili view adalah file statis yang telah dibuild (berupa file html). Web server tidak perlu melakukan render setiap kali user melakukan request. Dengan Jamstack, front-end dibangun terlebih dahulu menjadi halaman statis beserta aset yang sudah sangat dioptimalkan selama proses build. Proses pre-rendering ini menghasilkan website yang dapat disajikan langsung dari CDN. Dengan begitu akan mengurangi biaya, kompleksitas, dan risiko server dinamis sebagai infrastruktur penting.

+

Decoupling berarti memisahkan antara sistem dengan service. Masing-masing komponen berdiri sendiri dan berkomunikasi menggunakan API. Pada praktik kebanyakan, halaman website dirender di sisi server setiap kali user melakukan request. Ini yang disebut dengan website dinamis, misalnya tampilan sebuah website (view) dirender dengan PHP atau bahasa pemrograman lainnya. Dengan metode itu kebutuhan server akan meningkat seiring dengan penambahan pengguna. Ini membuat sitem semakin besar dan kompleks.

+

Istilah “JAMStack” muncul saat Matt Biilmann dan Chris Bach membuat alur kerja pengembangan web modern di Netlify, mereka mencari istilah mudah untuk merujuk pada sebuah pendekatan arsitektural itu untuk digunakan dalam percakapan. Jamstack mencakup banyak dasar-dasar arsitektur web yang ada, sehingga mereka menciptakan istilah Jamstack untuk membantu orang-orang membicarakannya dengan lebih ringkas.

+

Dengan begitu banyak tool populer untuk membuat website statis, seperti Gatsby, Hugo, Jekyll, Eleventy, NextJS, dan masih banyak lagi, banyak pengembang web sudah terbiasa dengan alat yang dibutuhkan untuk mengembangkan Jamstack.

+

Mengapa menggunakan JAMStack

+

Arsitektur JAMStack dapat memberi beberapa kelebihan pada website dan alur kerja pengembangan. Berikut beberapa kelebihannya

+

Keamanan

+

Jamstack menghilangkan penggunaan bagian dinamis dalam infrastruktur hosting sehingga menghasilkan lebih sedikit penggunaan server dan sistem menjadi lebih sulit untuk diserang.Tampilan halaman web dan aset adalah file yang dibuat secara pre-render, ini memungkinkan hanya memberikan akses baca saja (read-only) ke hosting. Hal itu mengurangi risiko serangan lebih jauh. Sementara layanan yang sifatnya dinamis dapat disediakan oleh vendor dengan tim yang dedicated atau pihak ketiga yang sudah memiliki keamanan sistem.

+

Skala

+

Arsitektur yang populer saat ini menangani beban lalu lintas yang padat dengan menambahkan logika untuk membuat cache pada tampilan dan sumber daya yang sering diakses. Jamstack secara natural menyediakan ini. Karena halaman web dapat disajikan sepenuhnya dari CDN, tidak ada logika atau alur kerja yang rumit untuk menentukan aset apa yang dapat di-cache dan kapan. Bahkan dengan website Jamstack semuanya dapat disimpan dalam cache di CDN. Dengan begitu penerapannya bisa lebih sederhana dan kapasitas loadnya bisa lebih besar.

+

Performa

+

Kita semua tau kecepatan memuat (load) halaman berdampak pada pengalaman pengguna dan konversi. Website Jamstack menghilangkan kebutuhan untuk menghasilkan tampilan halaman di server setiap kali ada request, karena halaman telah dibuat sebelumnya (pre-rendered). Dengan semua halaman telah tersedia di CDN yang dekat dengan pengguna dan siap untuk ditayangkan, kinerja yang sangat tinggi dimungkinkan tanpa menggunakan infrastruktur yang mahal atau kompleks.

+

Pemeliharaan

+

Ketika kompleksitas hosting berkurang, berkurang pula tugas pemeliharaan. Situs yang dibuat sebelumnya (pre-rendered), disajikan langsung dari host sederhana atau langsung dari CDN sehingga tidak memerlukan tim ahli untuk memastikannya tetap bisa diakses. Pekerjaan yang berhubungan dengan tampilan halaman sudah selesai selama pembuatan, jadi website yang dihasilkan sudah stabil dan dapat dihosting tanpa server yang mungkin memerlukan patching, update, dan maintenance.

+

Portabilitas

+

Situs Jamstack bersifat pre-rendered atau sudah dibuat sebelumnya. Itu berarti kita dapat menghostingnya dari berbagai layanan hosting dan memiliki kemampuan lebih besar untuk memindahkannya ke host pilihan Anda. Kita tidak perlu memindahkan banyak sekali file, cukup source file halaman web saja. Solusi hosting statis sederhana apa pun harus dapat melayani situs Jamstack. Kita tidak lagi terkunci pada satu infrastruktur.

+

Pengalaman Pengembang

+

Jamstack adalah sebuah arsitektur, bukan alat yang spesifik. Website Jamstack dapat dibangun dengan berbagai alat. Itu tidak bergantung pada teknologi eksklusif atau framework yang eksotis dan sedikit diketahui. Sebaliknya, mereka mengembangkan alat dan konvensi yang tersedia secara luas.

+

Sumber: jamstack.org


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2021/02/markdown-cheatseet/index.html b/2021/02/markdown-cheatseet/index.html new file mode 100644 index 00000000..96fded6c --- /dev/null +++ b/2021/02/markdown-cheatseet/index.html @@ -0,0 +1,154 @@ +Markdown Cheatseet | Dev Jurnal

Markdown Cheatseet

Sintaks Dasar

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ElementSintaks
Heading# h1
## h2
### h3
Bold***bold text***
Italic*italic text*
Blockquote> blockquote
Ordered List1. First item
2. Second item
3. Third item
Unoredered List- First item
- Second item
- Third item
Code`code`
Horizontal rule---
Link[title](https://www.example.com)
Image![alt text](image.jpg)
+

Sintaks Lanjutan

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ElementSintaks
Table| Syntax | Description |
| ----------- | --------- |
| Header | Title |
| Paragraph | Text |
Fenced Code Block```
{
“firstName”: “John”,
“lastName”: “Smith”,
“age”: 25
}
```
FootnoteHere’s a sentence with a footnote. [^1]
[^1]: This is the footnote.
Heading ID### My Great Heading {#custom-id}
Definition Listterm
: definition
Strikethrough~~~ The world is flat ~~~
Task List- [x] Write the press release
- [ ] Update the website
- [ ] Contact the media

Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2021/02/npm-adalah/index.html b/2021/02/npm-adalah/index.html new file mode 100644 index 00000000..0de0b937 --- /dev/null +++ b/2021/02/npm-adalah/index.html @@ -0,0 +1,119 @@ +NPM Adalah | Dev Jurnal

NPM Adalah

NPM (Node Package Manager) adalah pengelola paket default untuk runtime JavaScript Node.js. NPM dibuat pada tahun 2009 sebagai proyek open source untuk membantu pengembang JavaScript berbagi paket modul kode dengan mudah. NPM terdiri dari dua bagian utama: di sisi kita sebagai klien menggunakan command line interface (CLI) untuk menginstall dan menerbitkan paket, dan repositori online atau disebut npm registry yang menghosting paket-paket kode open source Javascript seperti Node.JS, aplikasi web front-end, aplikasi mobile, robot, router, dan kebutuhan lain yang tak terhitung jumlahnya dari komunitas JavaScript. Banyak paket kode yang diterbitkan di NPM dengan berbagai macam fungsinya bisa mempercepat proses pengembangan web kita.

+

npm init

+

Semua dimulai dari file package.json. Setiap project JavaScript - baik itu Node.js atau aplikasi browser - dapat dicakup sebagai paket npm dengan informasi paketnya sendiri. Tugas package.json adalah mendeskripsikan proyek tersebut. Itu seperti daftar komposisi pada bungkus makanan. package.json dibuat ketika npm init dijalankan untuk menginisialisasi proyek JavaScript / Node.js. Di dalamnya terdapat informasi, diantaranya metadata dasar yang disediakan oleh pengembang:

+
    +
  • name: nama library / proyek JavaScript Anda
  • +
  • version: versi proyek Anda. Bagian ini bisa berguna sebagai sumber versi deploy.
  • +
  • description: deskripsi proyek
  • +
  • lisensi: lisensi proyek
  • +
+

npm script

+

package.json juga mendukung properti scripts yang dapat didefinisikan untuk menjalankan command line yang diinstal dalam konteks lokal sebuah proyek. Misalnya, bagian skrip dari proyek npm dapat terlihat seperti ini:

+
{
+  "scripts": {
+    "build": "tsc",
+    "format": "prettier --write ** / *. ts",
+    "format-check": "prettier --check ** / *. ts",
+    "lint": "eslint src / ** / *. ts",
+    "pack": "ncc build",
+    "test": "jest",
+    "all": "npm run build && npm run format && npm run lint && npm run pack && npm test"
+  }
+}
+

Skrip di atas memberitahu paket apa saja yang dijalankan dengan skrip perintah yang tertulis. Eslint, prettier, ncc, jest tidak harus diinstal sebagai executable global melainkan hanya lokal untuk proyek Anda di dalam folder node_modules / .bin /.

+

dependencies vs devDependecies

+

Bagian ini ditulis dalam bentuk key value object dengan nama library npm sebagai key dan versi library yang ditulis dengan format semantik sebagai value. Ini adalah contoh dari templatenya:

+
{
+  "dependencies": {
+    "@actions/core": "^1.2.3",
+    "@actions/github": "^2.1.1"
+  },
+  "devDependencies": {
+    "@types/jest": "^25.1.4",
+    "@types/node": "^13.9.0",
+    "@typescript-eslint/parser": "^2.22.0",
+    "@zeit/ncc": "^0.21.1",
+    "eslint": "^6.8.0",
+    "eslint-plugin-github": "^3.4.1",
+    "eslint-plugin-jest": "^23.8.2",
+    "jest": "^25.1.0",
+    "jest-circus": "^25.1.0",
+    "js-yaml": "^3.13.1",
+    "prettier": "^1.19.1",
+    "ts-jest": "^25.2.1",
+    "typescript": "^3.8.3"
+  }
+}
+

Dependensi ini nantinya akan diinstal ketika menjalankan perintah npm install dengan flag --save dan --save-dev. Flag tersebut dimaksudkan untuk memberi tahu dependensi akan digunakan masing-masing untuk lingkungan produksi dan pengembangan / pengujian. Kami akan menggali lebih dalam tentang pemasangan paket-paket ini di bagian selanjutnya. Selain itu penting untuk memahami kemungkinan tanda yang muncul sebelum versi semantik (baca selengkapnya tentang semantic versioning):

+
    +
  • ^: rilis minor terbaru. Misalnya, spesifikasi ^1.0.4 mungkin menginstal versi 1.3.0 jika itu adalah versi minor terbaru dalam 1 seri utama.
  • +
  • ~: rilis patch terbaru. Dengan cara yang sama seperti ^ untuk rilis minor, spesifikasi ~ 1.0.4 mungkin menginstal versi 1.0.7 jika itu adalah versi minor terbaru dalam seri 1.0 minor. +Semua versi paket yang tepat ini akan didokumentasikan dalam file package-lock.json yang dihasilkan.
  • +
+

package-lock.json

+

File ini menjelaskan versi pasti dari dependensi yang digunakan dalam proyek JavaScript npm. Jika dianalogikan seperti makanan package.json adalah label bahan dengan deskripsi secara umum, di dalam package-lock.json semua terlihat lebih detil. Dan sebagaimana makanan kita biasanya hanya membaca secara umum komposisinya, tidak perlu membaca kapan bawang dalam sebuah makanan dipanen dsb. package-lock.json tidak dimaksudkan untuk dibaca baris demi baris oleh pengembang. package-lock.json biasanya dibuat oleh perintah npm install, dan juga dibaca oleh alat NPM CLI kita untuk memastikan reproduksi lingkungan build untuk proyek dengan perintah npm ci.

+

Sumber: freecodecamp.org


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2021/03/membuat-website-jamstack/index.html b/2021/03/membuat-website-jamstack/index.html new file mode 100644 index 00000000..ca7d72e9 --- /dev/null +++ b/2021/03/membuat-website-jamstack/index.html @@ -0,0 +1,68 @@ +Membuat Website JAMStack | Dev Jurnal

Membuat Website JAMStack

Banyak tools pengembangan website yang bisa membuat website JAMStack dengan mudah. Di sisi front end kita bisa menggunakan static site generator (SSG) untuk membuat halaman statis secara pre render. Ada banyak sekali framework open source yang dikembangkan dengan berbagai macam bahasa pemrograman untuk melakukan hal ini. Masing-masing framework juga memiliki spesialisasi masing-masing. Ada yang untuk membuat blog, website dokumentasi dan ada juga yang fungsinya lebih banyak. Beberapa contoh yang populer saat ini misalnya Gatsby, Next.js, Hugo dan Jekyll.

+

Di sisi back end datanya kita bisa menggunakan headless CMS yang akan memberikan layanan API. Di beberapa SSG seperti Gatsby disediakan GraphQL untuk query. Jika tidak memerlukan adanya back end untuk mengolah banyak data, kita bisa saja tidak menggunakan CMS. SSG seperti Gatsby bisa menggunakan file markdown untuk mengisi kontennya, itu sangat cukup untuk sebuah blog atau website sederhana. Daftar lengkap tools untuk membuat website Jamstack bisa dilihat di website jamstack.org

+

Static site generator +Headless CMS


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2021/03/visi-elon-musk/index.html b/2021/03/visi-elon-musk/index.html new file mode 100644 index 00000000..603d913f --- /dev/null +++ b/2021/03/visi-elon-musk/index.html @@ -0,0 +1,78 @@ +Visi Elon Musk | Dev Jurnal

Visi Elon Musk

Elon Musk adalah tokoh bisnis, penemu dan seorang industrialis kondang. Dia mendirikan dan memimpin beberapa perusahaan teknologi sejak usia sangat muda. Dimulai dari PayPal, Tesla, SpaceX dll. Saat ini dia menjadi salah satu orang yang berada di jajaran orang terkaya di dunia. Kepiawaiannya mengelola bisnis dan menemukan teknologi-teknologi canggih didorong oleh visinya untuk masa depan.

+

Inklusi Keuangan

+

PayPal didirikan karena dia menginginkan sistem keuangan yang inklusif. Harapannya semua orang bisa melakukan transaksi keuangan dengan leluasa di internet.

+

Perubahan Iklim

+

Dia juga melihat isu perubahan iklim dapat mengancam kehidupan manusia di masa depan. Itu yang menginspirasinya mengakuisisi Tesla untuk memberikan alternatif kendaraan berenergi listrik. Selain itu dia juga membuat Solar City, model sebuah kota dengan energi matahari sebagai sumber pembangkit listriknya.

+

Transportasi Masal

+

Visinya di bidang transportasi diwujudkan dengan menginisiasi teknologi Hyperloop, sebuah sistem transportasi darat yang digerakkan dengan medan magnet di dalam sebuah terowongan. Idenya ini dibuat sebagai projek open source supaya semua orang bisa ikut mengembangkannya. Transportasi masa depan yang ideal menurut Musk bukanlah transportasi udara.

+

Bumi yang Rusak

+

Visi lain Musk adalah melihat bahwa bumi tidak akan bisa ditinggali selamanya. Dia membuat alternatif manusia untuk bepergian ke luar bumi dengan perusahaannya Space X.

+

Manusia vs Mesin

+

Musk melihat bahwa evolusi teknologi akan menyalip evolusi manusia. Di satu titik manusia tidak akan bisa menyusul kecerdasan mesin, tubuh dan otak manusia akan usang.

+

Karena itu dia mendirikan Neuralink supaya manusia bisa terhubung langsung dengan mesin. Dengan begitu manusia akan leluasa mengendalikan mesin dan itu akan menutup kekurangan manusia. Sebuah implan akan ditanam di dalam kepala, dengan itu manusia bisa mengendalikan mesin hanya dengan memikirkannya.

+

Kecerdasan Buatan

+

Musk termasuk orang yang berhati-hati dalam menghadapi teknologi kecerdasan buatan. Dia berada di sisi pimpinan bisnis yang khawatir akan dampak kecerdasan buatan pada kehidupan manusia. Gagasan Open AI lahir supaya kecerdasan buatan bersifat inklusif. Projek ini dibuat sebagai open source, tidak hanya perusahaan komersial yang bisa mengeksploitasi kecerdasan buatan.


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2021/07/film-dokumenter-vuejs/index.html b/2021/07/film-dokumenter-vuejs/index.html new file mode 100644 index 00000000..29c6023a --- /dev/null +++ b/2021/07/film-dokumenter-vuejs/index.html @@ -0,0 +1,79 @@ +Film Dokumenter Sejarah Vue JS | Dev Jurnal

Film Dokumenter Sejarah Vue JS

Dimulai dari proyek sampingan saat bekerja di Google, +hingga saat ini sering disandingkan dengan raksasa JavaScript +seperti React dan Angular.

+

Dengan bantuan Sarah Drasner, Taylor Otwell, Thorsten Lünborg, dan banyak lainnya dari komunitas Vue.js, +Evan You menceritakan kisah bagaimana dia berjuang melawan rintangan untuk menghidupkan Vuejs.

+

Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2021/07/install-laravel/index.html b/2021/07/install-laravel/index.html new file mode 100644 index 00000000..61775854 --- /dev/null +++ b/2021/07/install-laravel/index.html @@ -0,0 +1,100 @@ +Cara Install Laravel | Dev Jurnal

Cara Install Laravel

Via Composer

+

Jika di komputer sudah terinstall PHP dan Composer, kita dapat membuat proyek Laravel baru +dengan menggunakan Composer secara langsung.

+
// membuat folder projek laravel dengan nama example-app
+composer create-project laravel/laravel example-app
+
+// masuk ke folder aplikasi yang baru saja dibuat
+cd example-app
+

Setelah aplikasi dibuat, kita bisa menjalankan server pengembangan lokal Laravel (local development server) +menggunakan perintah servis Artisan CLI:

+
// jalankan server
+php artisan serve
+

Via Laravel Installer

+

Pertama instal Laravel Installer sebagai dependensi global Composer:

+
// install laravel installer sebagai dependensi global
+composer global require laravel/installer
+
+// jalankan command laravel new untuk membuat projek baru
+laravel new example-app
+
+// masuk ke folder aplikasi yang baru saja dibuat
+cd example-app
+
+// jalankan server
+php artisan serve
+

Pastikan untuk mengarahkan direktori bin vendor Composer di $PATH +sehingga perintah laravel dapat dieksekusi dapat ditemukan oleh sistem. +Jika belum, kemungkinan perintah laravel akan mengalami error laravel: command not found. +Pada sistem operasi Windows direktori umumnya ada di:

+
%USERPROFILE%\AppData\Roaming\Composer\vendor\bin

Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2021/07/javascript-truthy-dan-falsy/index.html b/2021/07/javascript-truthy-dan-falsy/index.html new file mode 100644 index 00000000..2ef0921e --- /dev/null +++ b/2021/07/javascript-truthy-dan-falsy/index.html @@ -0,0 +1,105 @@ +JavaScript Truthy dan Falsy | Dev Jurnal

JavaScript Truthy dan Falsy

Salah satu tipe data primitif dalam dalam JavaScript adalah boolean, +yaitu tipe data logis yang memiliki nilai true atau false. +JavaScript memiliki sifat type coercion atau konversi nilai secara otomatis +atau implisit dari satu tipe data ke tipe data lainnya (seperti string ke angka, objek ke boolean).

+

Oleh karena itu nilai-nilai di luar tipe data boolean +juga dapat dievaluasi sebagai nilai true atau false. +Dalam konteks boolean ada istilah truthy yaitu nilai-nilai yang dianggap true, +dan falsy yaitu nilai yang dianggap false.

+

Beberapa contoh nilai truthy adalah

+
true // boolean true
+{} // object
+[] // array
+15 // integer tidak bernilai 0
+'0' // string
+

Sementara nilai falsy adalah

+
false //boolean false
+undefined
+null
+NaN
+0 // integer 0
+"" // string kosong
+

Di JavaScript setiap nilai bisa dievaluasi nilai boolean-nya menggunakan fungsi Boolean().

+
Boolean(1) // true
+Boolean('0') // true
+Boolean(0) // false
+

Sumber bacaan:

+
    +
  1. Type Coercion
  2. +
  3. Truthy
  4. +
  5. Falsy
  6. +
  7. Boolean
  8. +

Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2021/07/laravel-routing/index.html b/2021/07/laravel-routing/index.html new file mode 100644 index 00000000..fe3bdc27 --- /dev/null +++ b/2021/07/laravel-routing/index.html @@ -0,0 +1,216 @@ +Laravel Routing | Dev Jurnal

Laravel Routing

Class Route pada Laravel menyediakan method yang sederhana +untuk mendefinisikan route dan fungsi-fungsinya tanpa file konfigurasi +yang rumit. Route yang paling dasar menerima parameter URI dan sebuah closure.

+
use Illuminate\Support\Facades\Route;
+
+Route::get('/greeting', function () {
+    return 'Hello World';
+});
+

Mengarahkan pada Controller

+

Pada kebanyakan aplikasi, kita mengarahkan URL menuju controller dan method +yang akan menangani permintaan.

+
use App\Http\Controllers\UserController;
+
+Route::get('/user', [UserController::class, 'index']);
+// Mengarahkan ke method index pada UserController
+

Merespon Request Sesuai dengan HTTP Verb

+

Router pada Laravel dapat merespon semua HTTP verb

+
Route::get($uri, $callback);
+Route::post($uri, $callback);
+Route::put($uri, $callback);
+Route::patch($uri, $callback);
+Route::delete($uri, $callback);
+Route::options($uri, $callback);
+

Jika ingin membuat route yang merespon beberapa HTTP verb sekaligus bisa menggunakan +method match, atau jika menginginkan route yang merespon semua HTTP verbs +bisa menggunakan method any:

+
Route::match(['get', 'post'], '/', function () {
+    //
+});
+
+Route::any('/', function () {
+    //
+});
+

Route untuk Resource Controller

+

Kadang kita memperlakukan setiap model data sebagai ”resource”, +dimana kita melakukan serangkaian operasi yang sama pada resource +tersebut. Misalnya kita memiliki aplikasi yang mengelola data buku dan film. +Kita akan membuat fitur create, read, update atau delete pada resource tersebut.

+

Fitur tersebut umum sekali dibuat pada aplikasi, sehingga Laravel menyediakan +resource controller, sebuah controller dengan method yang lengkap beserta +route create, read, update, and delete (“CRUD”) dalam satu baris kode saja.

+

Untuk membuat controllernya gunakan perintah php artisan dengan tambahan +--resource

+
php artisan make:controller PhotoController --resource
+

Perintah tersebut akan membuat controller baru yang di dalamnya sudah terdapat +method-method untuk masing-masing operasi CRUD. Selanjutnya cukup buat satu baris kode +yang sudah mencakup semua method pada controller resource.

+
use App\Http\Controllers\PhotoController;
+
+Route::resource('photos', PhotoController::class);
+

Satu baris route di atas akan membuat beberapa route yang akan menangani +variasi fungsi pada resource sesuai dengan HTTP verbs-nya. Jika kita memiliki +beberapa resource bisa juga digabungkan menggunakan array

+
Route::resources([
+    'photos' => PhotoController::class,
+    'posts' => PostController::class,
+]);
+

Jika sudah memiliki route di luar resource, letakkan kodenya di atas route resource. +Fungsi yang ditangani resource controller dan route yang dibuat:

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
VerbURIActionRoute Name
GET/photosindexphotos.index
GET/photos/createcreatephotos.create
POST/photosstorephotos.store
GET/photos/{photo}showphotos.show
GET/photos/{photo}/editeditphotos.edit
PUT/PATCH/photos/{photo}updatephotos.update
DELETE/photos/{photo}destroyphotos.destroy
+

Menampilkan View

+

Jika hanya ingin menampilkan halaman tertentu (view) maka tidak perlu +membuat controller method, langsung saja gunakan Route::view()

+
// Daripada memebuat controller dan method dulu
+class TextsController extends Controller
+{
+  public function about()
+  {
+    return view('texts.about');
+  }
+}
+// Kemeudian membuat route seperti ini
+Route::get('about', [PageController::class, 'action']);
+//
+//
+// Lebih singkat langsung saja
+Route::view('about', 'texts.about');
+

Method view menerima tiga argument, pertama URI, kedua nama view-nya +lalu yang ketiga data berupa array (opsional).

+
Route::view('about', 'texts.about', ['name' => 'Hari']);
+

Menambahkan Parameter dengan Fungsi route()

+

Jika ingin menambahkan parameter pada route, buat array +dengan pasangan key/value. Parameter tersebut akan +ditambahkan pada string query URL.

+
Route::get('user/{id}/profile', function ($id) {
+//
+})->name('profile');
+$url = route('profile', ['id' => 1, 'photos' => 'yes']);
+// Hasilnya: /user/1/profile?photos=yes
+

Melihat Route yang Sudah Dibuat

+

Gunakan perintah php artisan route:list untuk melihat route yang +ada pada aplikasi kita.

+
php artisan route:list

Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2021/07/normalisasi-database/index.html b/2021/07/normalisasi-database/index.html new file mode 100644 index 00000000..3e44f716 --- /dev/null +++ b/2021/07/normalisasi-database/index.html @@ -0,0 +1,95 @@ +Normalisasi Database | Dev Jurnal

Normalisasi Database

Normalisasi database adalah proses menata tabel, kolom dan relasi antar tabel +untuk menghindari redundansi data dan mencapai integritas data. +Secara sederhana prinsip yang harus dipegang adalah

+
    +
  1. Hindari redundansi (pengulangan) data
  2. +
  3. Mencapai integritas data
  4. +
  5. Meletakkan data di tabel yang tepat
  6. +
  7. Menghindari anomali create, update, delete
  8. +
+

Dalam melakukan normalisasi database akan melewati beberapa bentuk +tergantung kebutuhan. Biasanya dengan melewati 3 bentuk normal +(normal form) sudah cukup bagus.

+

Normal Pertama

+

Pada bentuk normal pertama aturannya adalah setiap kolom harus atomic. +Kita hanya boleh menyimpan satu data dalam satu kolom. Kita juga tidak +boleh membuat beberapa kolom yang merepresentasikan informasi yang sama. +Aturan yang kedua adalah harus ada satu data kunci yang mengidentifikasi +setiap baris pada tabel.

+

Normal Kedua

+

Pada bentuk normal kedua aturannya adalah semua kolom yang bukan merupakan +data kunci harus tergantung pada primary key.

+

Normal Ketiga

+

Pada bentuk normal ketiga aturannya adalah semua kolom yang bukan merupakan +kunci harus tergantung pada primary key secara transitif (tidak langsung).

+

Konten ini bersumber dari tulisan Ben Brumm dari databasestar.com


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2021/07/perbedaan-const-dan-let/index.html b/2021/07/perbedaan-const-dan-let/index.html new file mode 100644 index 00000000..b1610d9f --- /dev/null +++ b/2021/07/perbedaan-const-dan-let/index.html @@ -0,0 +1,110 @@ +Perbedaan const dan let | Dev Jurnal

Perbedaan const dan let

Sampai tahun 2015 JavaScript menggunakan var untuk mendeklarasikan variabel. +Sejak ES6 muncul const dan let digunakan untuk mendeklarasikan variabel. +Apa perbedaan keduanya? Kita bisa lihat dari karakteristik berikut:

+
    +
  1. +

    const harus diinisialisasi saat deklarasi

    +
    const a
    +

    Menyebabkan error SyntaxError: Missing initializer in const declaration. +Ketika mendeklarasikan variabel harus menginisialisasi sebuah nilai

    +
    const a = 1
    +

    Sedangkan pendeklarasian let tidak harus dengan inisialisasi nilai

    +
    let a
    +a = 1
    +
  2. +
  3. +

    const tidak dapat di-assign ulang nilainya setelah diinisialisasi

    +
    const a = 1
    +a = 2
    +

    Menyebabkan error TypeError: Assignment to constant variable, +sementara let dapat di-assign ulang nilainya

    +
    let a = 1
    +a = 2
    +
  4. +
  5. +

    const dan let tidak dapat dideklarasikan ulang

    +
    let a = 1
    +let a = 2
    +//
    +const a = 1
    +const a = 2
    +

    Menyebabkan error SyntaxError: Identifier 'a' has already been declared

    +
  6. +
+

Lalu apa faedahnya? Paling aman gunakan const, kecuali kita tahu persis akan melakukan +perubahan nilai dari variabel yang kita buat. Jika sebuah variabel tidak +bisa diubah nilainya maka itu akan mengurangi kemungkinan bug yang disebebabkan oleh +nilai variabel yang tidak sengaja berubah.


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2021/08/5-singkatan-prinsip-pemrograman/index.html b/2021/08/5-singkatan-prinsip-pemrograman/index.html new file mode 100644 index 00000000..0b940db6 --- /dev/null +++ b/2021/08/5-singkatan-prinsip-pemrograman/index.html @@ -0,0 +1,111 @@ +5 Singkatan Prinsip Pemrograman | Dev Jurnal

5 Singkatan Prinsip Pemrograman

Mengarungi industri teknologi, khususnya di bidang +pengembangan perangkat lunak, membutuhkan keterampilan +pemrograman atau menulis kode.

+

Semakin besar skala sebuah aplikasi perangkat lunak maka kode +tidak bisa asal ditulis begitu saja. Ada beberapa kaidah populer +dalam dunia pemrograman yang mungkin sering kita dengar singkatan-singkatannya.

+

KISS (Keep It Simple Stupid)

+

Tulis kode dengan sesederhana mungkin. +Jangan tergoda untuk membuat kode yang rumit. Jika sebuah kode bisa ditulis +dalam satu baris, tulislah satu baris.

+
function addNumbers(num1,num2){
+ return num1 + num2;
+}
+

Sederhana, mudah dibaca dan langsung dapat dipahami bagaimana kode tersebut bekerja. +Gunakan nama variabel yang jelas, mencerminkan nilai dalam variabel tersebut. +Gunakan library yang sudah tersedia. Bayangkan kita akan bekerja dengan kode-kode itu +lagi setelah 6 bulan tidak melihatnya, apakah kita masih bisa memahaminya? +Jagalah supaya tetap sederhana agar tidak sakit kepala.

+

DRY (Don’t Repeat Yourself)

+

Jangan mengulang penulisan kode. Perilaku +tersebut adalah kesalahan umum dalam koding yang bisa dihindari dengan beberapa +metode. Jika masih melakukan copy paste pada sebuah blok code artinya kode kita belum DRY.

+

Open/Closed

+

Terbuka untuk pengembangan, tapi tertutup untuk perubahan. +Prinsip ini mendorong kita untuk menulis kode yang dapat dikembangkan, namun sebisa mungkin +tertutup untuk modifikasi secara langsung. Prinsip ini membutuhkan keterampilan desain dan analisis +yang tinggi. Kita bisa melihat contohnya pada library/framework yang sudah matang dan berumur panjang.

+

SRP (Single Responsibility Principle)

+

Setiap class/modul memiliki satu fungsi spesifik. +Jangan menambahkan terlalu banyak tugas pada sebuah class karena itu akan meningkatkan kerumitan. +Refactor dan pecah-pecah menjadi class atau modul yang lebih kecil.

+

YAGNI (You Aren’t Going to Need It)

+

Jangan membuat kode yang tidak diperlukan saat ini. +Jangan membuat kode untuk masa depan. Selesaikan masalah saat ini lalu refactor. +Jangan memperbaiki masalah yang tidak ada.


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2021/08/buku-pemrograman-gratis-catatan-untuk-profesional/index.html b/2021/08/buku-pemrograman-gratis-catatan-untuk-profesional/index.html new file mode 100644 index 00000000..a3f2109f --- /dev/null +++ b/2021/08/buku-pemrograman-gratis-catatan-untuk-profesional/index.html @@ -0,0 +1,84 @@ +Buku Pemrograman Gratis - Seri Catatan untuk Profesional | Dev Jurnal

Buku Pemrograman Gratis - Seri Catatan untuk Profesional

Membaca adalah cara tercepat untuk menyerap informasi. Salah satu website yang +menyediakan buku pemrograman gratis adalah goalkicker.com. +Buku yang diterbitkan di situs tersebut adalah seri buku notes for profesional yang berisi +catatan-catatan penting mengenai hal-hal yang sering digunakan dalam pekerjaan.

+

Buku ini bukanlah kitab bahasa pemrograman yang membahas satu bahasa pemrograman secara lengkap. +Materi di dalam buku adalah catatan-catatan yang dikumpulkan hasil kolaborasi dari para profesional. +Sehingga bentuknya lebih seperti petunjuk mengenai fungsi-fungsi dalam bahasa pemrograman dan bagaimana cara penggunaannya.

+

Hal yang saya sukai dari buku-buku tersebut adalah penjelasan yang +diberikan sederhana dan singkat cocok untuk orang yang sudah bekerja. +Selain itu susunan bukunya juga sistematis dengan pengelompokan yang +memudahkan pembaca dalam mencari topik tertentu.


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2021/08/melihat-eksekusi-kode/index.html b/2021/08/melihat-eksekusi-kode/index.html new file mode 100644 index 00000000..1fe470b2 --- /dev/null +++ b/2021/08/melihat-eksekusi-kode/index.html @@ -0,0 +1,81 @@ +Melihat Eksekusi Kode, Langkah demi Langkah | Dev Jurnal

Melihat Eksekusi Kode, Langkah demi Langkah

Python Tutor membantu orang-orang melewati hambatan dalam belajar pemrograman yaitu: +memahami apa yang terjadi ketika komputer menjalankan sebuah kode. +Seringkali sulit untuk membayangkan bagaimana komputer bekerja sesuai +dengan kode yang kita tulis.

+

Python tutor menyajikan visualisasi langkah +demi langkah bagaimana kode dieksekusi oleh komputer. +Saat artikel ini ditulis Python Tutor mendukung bahasa +Python, Java, C, C++, JavaScript dan Ruby.


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2021/08/public-private-protected-properties-and-method/index.html b/2021/08/public-private-protected-properties-and-method/index.html new file mode 100644 index 00000000..95bf48ec --- /dev/null +++ b/2021/08/public-private-protected-properties-and-method/index.html @@ -0,0 +1,157 @@ +Property dan Method Public, Private, Protected | Dev Jurnal

Property dan Method Public, Private, Protected

Ada tiga macam tipe akses yang dapat diterapkan untuk property (variabel pada class/object) dan method (function pada class/object) pada PHP. Masing-masing tipe memberikan level akses yang berbeda terhadap property atau method dalam sebuah class/object dan digunakan untuk kasus yang berbeda dalam pemrograman berorientasi objek. Dalam PHP dikenal tipe akses public, private dan protected.

+

Public

+

Property atau method yang dideklarasikan dengan kata kunci public mengizinkan akses yang paling luas. Public berarti mengizinkan property atau method dapat diakses oleh:

+
    +
  • Class yang mendeklarasikannya
  • +
  • Sublass/class turunan (class yang melakukan extend)
  • +
  • Semua object eksternal, class atau kode yang berada diluar hirarki class yang mendeklarasikannya
  • +
+

Contoh dari akses public sebagai berikut:

+
class MyClass {
+ // Mendeklrasaikan property public
+ public $myProperty = 'test';
+ // Mendeklrasikan method public
+ public function myMethod() {
+ return $this->myProperty;
+ }
+}
+$obj = new MyClass(); //menginstance sebuah object
+echo $obj->myMethod(); //mengakses method di kelas MyClass
+// Out: test
+echo $obj->myProperty; //mengakses property di kelas MyClass
+// Out: test
+

Protected

+

Mendeklarasikan property atau method dengan kata kunci protected berarti mengizinkan untuk diakses oleh:

+
    +
  • Class yang mendeklarasikannya
  • +
  • Class turunannya (class yang melakukan extend)
  • +
+

Akses protected berarti tidak mengizinkan object, class atau kode di luar hirarki class untuk mengakses property atau method di dalam class yang mendeklrasikannya. Jika ada kode yang tidak tidak berada dalam lingkup akses tersebut mencoba mengakses property/method protected maka akan muncul pesan error. Intinya yang bisa mengakses property/method private hanya instance dari class yang mendeklarasikannya.

+

Contoh dari akses protected sebagai berikut:

+
class MyClass {
+ protected $myProperty = 'test';
+ protected function myMethod() {
+    return $this->myProperty;
+ }
+}
+// Subclass dari MyClass
+class MySubClass extends MyClass {
+ public function run() {
+    echo $this->myMethod();
+ }
+}
+$obj = new MySubClass();
+$obj->run(); // Memanggil MyClass::myMethod() dari dalam sublcass (diizinkan);
+// Out: test
+$obj->myMethod(); // Mengakses method protected dari instance subclass (tidak diizinkan)
+// Out: Fatal error: Call to protected method MyClass::myMethod() from context ''
+

Contoh di atas menunjukkan bahwa kita hanya bisa mengakses elemen protected dari dalam scope-nya sendiri. “Apa yang berada di dalam rumah hanya dapat diakses dari dalam rumah”

+

Private

+

Mendeklarasikan property/method private mengizinkan untuk dapat diakses oleh:

+
    +
  • Class yang mendeklrasikannya saja (bukan subclass)
  • +
+

Sebuah property/method private hanya dapat diakses di dalam class yang membuatnya. +Sedikit catatan, objek dengan tipe yang sama akan memiliki akses satu sama lain pada elemen private dan protected meskipun mereka bukan instance yang sama.

+
class MyClass {
+ private $myProperty = 'test';
+ private function myPrivateMethod() {
+    return $this->myProperty;
+ }
+ public function myPublicMethod() {
+    return $this->myPrivateMethod();
+ }
+ public function modifyPrivatePropertyOf(MyClass $anotherInstance) {
+    $anotherInstance->myProperty = "new value";
+ }
+}
+class MySubClass extends MyClass {
+ public function run() {
+    echo $this->myPublicMethod();
+ }
+ public function runWithPrivate() {
+    echo $this->myPrivateMethod();
+ }
+}
+$obj = new MySubClass();
+$newObj = new MySubClass();
+// Memanggil MyClass::myPublicMethod(), yang akan memanggil
+// MyClass::myPrivateMethod(); (diizinkan karena yang memanggil 
+//adalah method pada class yang mendeklrasikan)
+$obj->run();
+// Out: test
+
+$obj->modifyPrivatePropertyOf($newObj); //memodifikasi private property 
+// dari instance yang berbeda (diizinkan)
+$newObj->run();
+// Out: new value
+echo $obj->myPrivateMethod(); // mengakses method private secara langsung 
+//pada super class (tidak diizinkan)
+// Out: Fatal error: Call to private method MyClass::myPrivateMethod() from context ''
+echo $obj->runWithPrivate(); // mengakses method private 
+// dari instance subclass (juga tidak diizinkan)
+// Out: Fatal error: Call to private method MyClass::myPrivateMethod() from context 'MySubClass'

Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2021/09/mengirim-email-menggunakan-mailgun-laravel/index.html b/2021/09/mengirim-email-menggunakan-mailgun-laravel/index.html new file mode 100644 index 00000000..153149ec --- /dev/null +++ b/2021/09/mengirim-email-menggunakan-mailgun-laravel/index.html @@ -0,0 +1,96 @@ +Mengirim Email Menggunakan Mailgun pada Laravel | Dev Jurnal

Mengirim Email Menggunakan Mailgun pada Laravel

Laravel menyediakan API email yang sederhana menggunakan library SwiftMailer. +Layanan email pada Laravel dapat dikonfigurasi melalui file config/mail.php. +Salah satu penyedia layanan mailer yang tersedia adalah Mailgun. +Mailgun menyediakan driver email berbasis API yang lebih sederhana dan singkat +dibanding mengirim email menggunakan SMTP server.

+

Untuk menggunakan driver Mailgun yang berbasis API, Laravel membutuhkan +library Guzzle HTTP, install dulu dari composer package manager

+
composer require guzzlehttp/guzzle
+

Secara default, file konfigurasi config/mail.php akan mengambil nilai +dari variabel pada file .env. Maka kita akan menyimpan semua konfigurasi pada file .env.

+
// setting mail driver yang digunakan
+MAIL_DRIVER=mailgun
+// email from (email pengirim)
+MAIL_FROM=admin@apps.com
+// nama pengirim
+MAIL_FROM_NAME=Admin
+// domain mailgun kita
+MAILGUN_DOMAIN={domain-mailgun}
+// API key mailgun kita
+MAILGUN_SECRET={api-key-mailgun}
+

Domain dan API key mailgun bisa kita dapatkan setelah melakukan registrasi Mailgun. +Kita dapat melihatnya pada dashboard.

+

Petunjuk ketika mengalami error saat mengirimkan email dapat melihat referensi status code https://documentation.mailgun.com/en/latest/api-intro.html#status-codes


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2021/10/menghapus-git-branch-local-dan-remote/index.html b/2021/10/menghapus-git-branch-local-dan-remote/index.html new file mode 100644 index 00000000..0e59946e --- /dev/null +++ b/2021/10/menghapus-git-branch-local-dan-remote/index.html @@ -0,0 +1,93 @@ +Menghapus Git Branch Local dan Remote | Dev Jurnal

Menghapus Git Branch Local dan Remote

Perintah untuk menghapus branch git

+
// menghapus branch lokal
+git branch -d namaBranchLokal
+
+// menghapus branch remote
+git push origin --delete namaBranchRemote
+

Kita tidak dapat menghapus branch yang sedang aktif, untuk itu +kita harus melakukan checkout ke branch yang sedang tidak akan kita hapus. +misalnya git checkout main.

+

Perintah untuk menghapus branch lokal:

+
git branch -d <branch>
+

Opsi -d hanya akan menghapus branch yang sudah di-push dan merge dengan remote branch. +Jika ingin menghapus branch yang belum di-push, gunakan opsi -D.

+

Perintah untuk menghapus branch remote:

+
git push <remote> --delete <branch>
+

atau singkatnya:

+
git push <remote> :<branch>
+

Jika remote branch ternyata sudah dihapus akan muncul pesan error.

+
error: unable to push to unqualified destination: remoteBranchName The destination refspec neither matches an existing ref on the remote nor begins with refs/, and we are unable to guess a prefix based on the source ref. error: failed to push some refs to 'git@repository_name'
+

Sinkronkan branch lokal kita dengan branch remote

+
git fetch -p
+

Opsi -p berarti prune, branch lokal yang sudah tidak ada lagi di remote repo akan dihapus.

+

Sumber https://www.freecodecamp.org/news/how-to-delete-a-git-branch-both-locally-and-remotely/


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2021/11/menggunakan-git-stash/index.html b/2021/11/menggunakan-git-stash/index.html new file mode 100644 index 00000000..6b9e2649 --- /dev/null +++ b/2021/11/menggunakan-git-stash/index.html @@ -0,0 +1,110 @@ +Menggunakan Git Stash | Dev Jurnal

Menggunakan Git Stash

Selain working area, staging dan repository, +Git memiliki area yang disebut stash di mana kita dapat menyimpan +sementara perubahan yang kita buat tanpa melakukan commit ke repository.

+

Ini berguna dalam situasi kita sedang melakukan perubahan pada kode, +dan belum siap untuk melakukan commit, namun kita perlu berpindah ke branch lain.

+

Stash Perubahan

+

Untuk menyimpan perubahan kita ke stash, gunakan perintah

+
git stash save "pesan stash"
+

Perintah tersebut akan menyimpan perubahan dan mengembalikan (revert) working directory +ke posisi commit terakhir. Perubahan yang tersimpan di stash dapat diakses dari branch manapun +dalam satu repository.

+

Melihat Perubahan dalam Stash

+

Untuk melihat perubahan yang tersimpan dalam stash, gunakan perintah

+
git stash list
+

Perintah di atas akan mengembalikan daftar stash yang tersimpan dalam format

+
stash@{0}: NAMA-BRANCH: PESAN
+

stash@{0} adalah nama dari stash, nomor dalam kurung {0} adalah index dari stash. +Nama dan index tersebut digunakan untuk memilih stash yang akan kita terapkan.

+

Mengambil Perubahan dalam Stash

+

Untuk mengambil perubahan yang tersimpan di dalam stash ke branch yang sedang aktif, +gunakan perintah berikut

+
# terapkan perubahan dari stash ke branch aktif
+git stash apply NAMA-STASH
+
+# terapkan perubahan dan hapus file dari stash
+git stash pop NAMA-STASH
+

Ketika menerapkan perubahan dari stash ada kemungkinan terjadi konflik, +untuk menyelesaikannya sama seperti dalam kasus konflik merge.

+

Menghapus Perubahan dalam Stash

+

Untuk menghapus perubahan dari daftar stash, jika kita sudah tidak lagi membutuhkannya, +gunakan perintah berikut:

+
# menghapus stash yang dipilih
+git stash drop NAMA-STASH
+
+# menghapus semua stash
+git stash clear
+

Sumber https://www.freecodecamp.org/news/git-stash-explained/


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2022/01/menggunakan-dua-profil-git/index.html b/2022/01/menggunakan-dua-profil-git/index.html new file mode 100644 index 00000000..07b66fb7 --- /dev/null +++ b/2022/01/menggunakan-dua-profil-git/index.html @@ -0,0 +1,139 @@ +Menggunakan Dua Profil Git | Dev Jurnal

Menggunakan Dua Profil Git

Bayangkan situasi ini, kita memiliki dua akun git. Satu akun untuk repo perusahaan tempat kita bekerja +dan satunya lagi akun git pribadi. Kita akan memerlukan dua profil yang berbeda untuk mengakses masing-masing repo.

+

Tentu kita bisa mengeset konfigurasi pada masing-masing repo setiap kali kita git init/clone. +Tapi itu akan membuat kita melakukannya berkali-kali jika kita memiliki banyak repo. +Tujuan tulisan ini adalah untuk mengeset config secara global dan membuat profilnya menyesuaikan kebutuhan akses kita.

+

File Konfigurasi Git (.gitconfig)

+

Konfigurasi Git disimpan pada file .gitconfig yang biasanya tersimpan di folder home. +File ini adalah titik awal bagi Git untuk mengidentifikasi konfigurasi apa yang akan digunakan.

+

Jika kita pernah melakukan konfigurasi Git user secara global (git config –global user.name) +maka kemungkinan isi dari file .gitconfig akan terlihat seperti ini.

+
[user]
+  name = username
+  email = email@example.com
+

Artinya ketika melakukan commit di repo apapun maka profil tersebut yang akan digunakan.

+

Tujuan kita adalah memiliki dua profil berbeda yang akan di-load sesuai dengan repo kita, apakah itu repo kantor atau pribadi. +Caranya adalah dengan memisahkan repo kita menjadi beberapa direktori sesuai dengan profil yang kita inginkan, kemudian mendefinisikan file .gitconfig untuk setiap profil.

+

1 - Buat Direktori Terpisah untuk Masing-masing Repo

+

Atur repo proyek yang sedang kita kerjakan ke dalam folder terpisah. +Sebagai contoh, katakanlah ada dua profil Git yang kita miliki. +Ini adalah kasus penggunaan umum bagi kebanyakan dari kita:

+

WORK → untuk proyek terkait pekerjaan
+PERSONAL → untuk proyek pribadi (open source atau proyek sampingan)

+

2 - Edit Konfigurasi Global Git

+

Edit file .gitconfig global atau buat di direktori home jika belum ada. Jangan lupa buat backup file .gitconfig jika ingin tetap menyimpan konfigurasi lama. Setelah itu tambahkan semua direktori profil sebagai entri seperti pada contoh di bawah ini.

+
# ~/.gitconfig
+
+[includeIf "gitdir:~/personal/"]
+   path = ~/.gitconfig-personal
+[includeIf "gitdir:~/work/"]
+   path = ~/.gitconfig-work
+

Script tersebut akan membuat sebuah kondisi, jika path direktori git tempat menyimpan proyek cocok dengan salah satu path di includeIF, maka Git menggunakan file konfigurasi profil tersebut. Jika tidak, ia akan menggunakan konfigurasi default.

+

3 - Buat Konfigurasi Git untuk Masing-Masing Profil

+

Buat file .gitconfig-personal dan .gitconfig-work yang sudah kita definisikan di file .gitconfig global. Masing-masing file ini dapat berisi semua konfigurasi yang kita butuhkan, mulai dari username dan email hingga commit hook.

+
# ~/.gitconfig-work
+
+[user]
+  nama = work_user
+  email = email_kerja
+
+# ~/.gitconfig-personal
+
+[user]
+  name = personal_user
+  email = personal_email
+

Cek Perubahannya

+

Seharusnya sekarang kita sudah memiliki 3 file git config.

+
➜  ~ l | grep 'git*'  
+-rw-rw-r--  1 user   staff    116 Apr  3 12:31 .gitconfig
+-rw-rw-r--  1 user   staff     50 Mar 26 18:22 .gitconfig-personal
+-rw-rw-r--  1 user   staff     52 Mar 26 18:21 .gitconfig-work
+

Sekarang kita buat direktori work dan personal, buat repo baru atau clone repo di dalam folder tersebut. +Sebagai contoh kita akan melihat konfigurasi yang digunakan pada direktori personal.

+
$ cd ~/personal
+$ mkdir personal-test-repo
+$ cd personal-test-repo
+$ git init
+$ git config -l
+
+# script menggunakan (include) file .gitconfig personal
+# dan mengabaikan konfigurasi work
+# karena proyek berada di direktori personal
+
+includeif.gitdir:~/project/.path=~/.gitconfig-personal
+user.name=mmdmthr
+user.email=muhhari@gmail.com
+includeif.gitdir:~/dev/.path=~/.gitconfig-work
+core.repositoryformatversion=0
+core.filemode=true
+core.bare=false
+core.logallrefupdates=true
+

Seperti yang terlihat, email dan username berbeda di kedua direktori sesuai dengan path di mana git berada.

+

Sumber https://www.freecodecamp.org/news/how-to-handle-multiple-git-configurations-in-one-machine/


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2022/02/melihat-raw-query-database-eloquent-laravel/index.html b/2022/02/melihat-raw-query-database-eloquent-laravel/index.html new file mode 100644 index 00000000..e7dd7105 --- /dev/null +++ b/2022/02/melihat-raw-query-database-eloquent-laravel/index.html @@ -0,0 +1,111 @@ +Melihat Raw Query Database Eloquent Laravel | Dev Jurnal

Melihat Raw Query Database Eloquent Laravel

Ada kalanya kita perlu melakukan debuging pada query eloquent, +mungkin saat menemukan query model yang kita buat tidak menampilkan data sesuai ekspektasi. +Kita bisa melihat query apa yang dibuat saat menjalankan model eloquent.

+

Menggunakan Laravel Eloquent Method

+

Eloquent menyediakan method yang mengembalikan string query tanpa menjalankannya yaitu method toSql(). +Ini sesuai jika kita hanya ingin melihat query saja tanpa ingin mengubah data – +tetapi cara ini tidak menampilkan seluruh kueri jika kuerinya lebih kompleks atau jika memiliki subkueri.

+

Contoh Kode

+
App\User::query()
+    ->where('created_at', '<', now()->subYear())
+    ->with('assignedApps', 'courses')
+    ->orderBy('email', 'asc')
+    ->limit(5)
+    ->toSql();
+

Output

+
select * from `users` where `created_at` < ? order by `email` asc limit 5
+

Menggunakan Laravel Query Log

+

Aktifkan log query untuk menangkap query yang dijalankan, perlu diperhatikan bahwa +query log akan menangkap query yang dijalankan oleh model. Ini berarti query sudah +selesai dijalankan di database. Cara untuk mengaktifkan log dilakukan menggunakan.

+

DB::connection()->enableQueryLog();

+

Setelah itu kita dapat melihat query yang dijalankan menggunakan +kode di bawah ini

+

$queries = DB::getQueryLog();

+

jika ingin melihat query yang terakhir dieksekusi

+

$last_query = end($queries);

+

Contoh

+
public function show(Order $order){
+    // aktifkan query log
+    \DB::connection()->enableQueryLog();
+
+    // jalankan model
+    $data = $order->all();
+
+    // tangkap query
+    $queries = \DB::getQueryLog();
+    return dd($queries);
+}
+

Sumber:
+https://beyondco.de/blog/how-to-get-the-raw-sql-query-from-the-laravel-query-builder
+https://stackoverflow.com/questions/41140975/laravel-eloquent-display-query-log


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2022/03/alur-kerja-menggunakan-git/index.html b/2022/03/alur-kerja-menggunakan-git/index.html new file mode 100644 index 00000000..caab1f30 --- /dev/null +++ b/2022/03/alur-kerja-menggunakan-git/index.html @@ -0,0 +1,80 @@ +Alur Kerja Menggunakan Git | Dev Jurnal

Alur Kerja Menggunakan Git

Memahami Tiga Bagian dari Proyek Git

+

Proyek Git memiliki tiga bagian utama berikut:

+
    +
  1. Direktori git
  2. +
  3. Direktori kerja (working directory/working tree/repositori)
  4. +
  5. Area staging
  6. +
+

Direktori Git

+

Direktori Git (terletak di YOUR-PROJECT-PATH/.git/) adalah tempat Git menyimpan semua yang dibutuhkan untuk melacak proyek secara akurat. Ini termasuk metadata dan database objek yang mencakup versi terkompresi dari file proyek.

+

Direktori kerja

+

Direktori kerja adalah tempat pengguna membuat perubahan lokal pada sebuah proyek. Direktori kerja menarik file proyek dari database objek direktori Git dan menempatkannya di mesin lokal pengguna.

+

Catatan: Direktori juga dikenal sebagai Repositori atau disingkat repo. Repo di mesin lokal pengguna disebut “Repo lokal” sedangkan repo di server git (misalnya GitHub/GitLab) disebut “Remote Repo” (Repo jarak jauh).

+

Area Staging

+

Area staging adalah file (juga disebut “indeks”, “stage”, atau “cache”) yang menyimpan informasi tentang apa yang akan masuk ke commit kita berikutnya. Commit adalah saat kita memberi tahu Git untuk menyimpan perubahan tahap ini (perubahan yang sudah dimasukkan dalam staging area). Git mengambil snapshot dari file sebagaimana adanya dan secara permanen menyimpan snapshot tersebut di direktori Git.

+

Dengan tiga bagian di atas, file yang sedang kita kerjakan akan memiliki tiga jenis status yang berbeda tergantung di mana file tersebut berada pada waktu tertentu: created/modified/deleted, staged atau committed. Saat kita mulai bekerja di dalam working directory seperti membuat file baru, menghapusnya atau hanya membuat perubahan pada sebuah file di working direktori, itu semua akan dicatat oleh git (status akan berubah dengan created/modified/deleted). Selanjutnya, kita bisa memindahkan file yang kita inginkan untuk commit ke area staging (status staged). Akhirnya setelah kita merasa yakin dengan perubahan yang dibuat, kita bisa melakukan commit.

+

Sumber: The Ultimate Guide to Git Reset and Git Revert


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2022/04/membuat-template-email-di-gmail/index.html b/2022/04/membuat-template-email-di-gmail/index.html new file mode 100644 index 00000000..94a82f75 --- /dev/null +++ b/2022/04/membuat-template-email-di-gmail/index.html @@ -0,0 +1,102 @@ +Membuat Template Email di Gmail | Dev Jurnal

Membuat Template Email di Gmail

Kita mungkin pernah mengalami harus mengetik email yang sama berulang kali, dalam kasus saya mengirim email cuti. Di Gmail kita dapat menulis email satu kali, lalu menyimpan email tersebut sebagai template. Kita juga dapat menyertakan tanda tangan. Dengan begitu, kita dapat membuka template dan mengirimnya lagi hanya dengan beberapa klik. Begini cara untuk membuat template email di Gmail.

+

Catatan: Template email hanya tersedia di Gmail web. Template tidak tersedia di aplikasi seluler Gmail.

+

Mengaktifkan template

+
    +
  1. Buka Gmail.
  2. +
  3. Di pojok kanan atas, klik Setelan (icon gear) lalu Lihat semua setelan (see all settings).
  4. +
  5. Di bagian atas, klik tab Lanjutan (advanced).
  6. +
  7. Di bagian Template, pilih Aktifkan (enable).
  8. +
  9. Pada bagian bawah, klik Simpan Perubahan (save changes).
  10. +
+

Membuat template baru atau mengubah template

+

Catatan: kita dapat membuat hingga 50 template.

+
    +
  1. Buka Gmail, lalu klik Tulis (compose).
  2. +
  3. Di jendela Tulis, masukkan teks template kita.
  4. +
  5. Klik Lainnya (icon titik tiga) lalu pilih Template.
  6. +
  7. +

    Pilih salah satu opsi:

    +
      +
    • Untuk membuat template baru, klik Simpan draf sebagai template (save draft as template), lalu Simpan sebagai template baru (save as new template).
    • +
    • Untuk mengubah template yang disimpan sebelumnya, klik Simpan draf sebagai template (save draft as template), lalu di bawah Timpa Template (overwrite template) pilih template dan klik Simpan (save) untuk menimpanya.
    • +
    +
  8. +
+

Menyisipkan template

+
    +
  1. Buka Gmail, lalu klik Tulis.
  2. +
  3. Klik Lainnya (icon titik tiga) lalu pilih Template.
  4. +
  5. Untuk menyisipkan template, pada Sisipkan template (insert template), pilih template tersimpan yang ingin dimasukkan ke dalam email.
  6. +
  7. Tulis isi pesan seperti biasa dan klik Kirim.
  8. +
+

Menghapus template

+
    +
  1. Buka Gmail lalu klik Tulis.
  2. +
  3. Klik Lainnya (icon titik tiga) lalu pilih Template.
  4. +
  5. Untuk menghapus template pesan, klik Hapus template, pilih template yang ingin dihapus, lalu klik Hapus.
  6. +
+

Sumber Create email templates


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2022/05/dconf-editor/index.html b/2022/05/dconf-editor/index.html new file mode 100644 index 00000000..b3c9f6b0 --- /dev/null +++ b/2022/05/dconf-editor/index.html @@ -0,0 +1,76 @@ +Dconf Editor | Dev Jurnal

Dconf Editor

Dconf-editor memungkinkan kita untuk mengubah hampir setiap aspek lingkungan desktop GNOME. Namun kita harus berhati-hati dalam mengedit. Sebagian besar pengaturan dapat diubah dengan cepat, tanpa memerlukan konfirmasi.

+

Antar muka dconf-editor sangat sederhana, kita bisa melakukan pencarian berdasarkan kata kunci lalu akan diarahkan ke file konfigurasi yang berkaitan, dari situ kita bisa mengubah konfigurasinya langsung.

+

Berikut perintah untuk menginstall dconf-editor:

+
# update repository
+apt-get update
+
+# install dconf-editor
+apt-get install dconf-editor -y
+

Beberapa hal yang saya ubah menggunakan dconf-editor adalah melakukan pengaturan pada dash to dock dan menonaktifkan notifikasi kalender

+

Untuk mengetahui lebih lanjut mengenai dconf-editor

+

Catatan: Meskipun kita dapat melakukan reset pada perubahan yang kita buat, namun ada risiko setting yang kita buat mengakibatkan sistem bekerja tidak seperti keinginan kita, sehingga akan sulit untuk mengembalikannya ke keadaan semula.

+

Untuk alasan ini, disarankan untuk tidak bermain-main dengan dconf-editor, khususnya jika kita tidak suka menghabiskan waktu untuk melakukan trouble shooting dan memperbaiki error atau jika kita tidak terlalu familiar dengan Linux dan GNOME.


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2022/06/perbedaan-git-reset-dan-git-revert/index.html b/2022/06/perbedaan-git-reset-dan-git-revert/index.html new file mode 100644 index 00000000..8c56c7d3 --- /dev/null +++ b/2022/06/perbedaan-git-reset-dan-git-revert/index.html @@ -0,0 +1,112 @@ +Perbedaan Git Reset dan Git Revert | Dev Jurnal

Perbedaan Git Reset dan Git Revert

TL;DR

+
+

git reset membatalkan commit sebelumnya dengan cara menulis ulang riwayat commit (commit history). Sementara git revert bekerja dengan cara membuat commit baru untuk membatalkan perubahan yang dibuat oleh commit sebelumnya, tanpa mengubah riwayat commit.

+
+

Untuk memahami alur kerja git, ada baiknya membaca artikel ini

+

Git Reset

+

Perintah git reset memungkinkan kita untuk MENGATUR ULANG posisi HEAD saat ini ke keadaan tertentu. Kita dapat mengatur ulang status file tertentu atau seluruh branch. Perintah ini berguna jika perubahan yang kita buat masih berada di repo lokal dan belum melakukan push commit ke GitHub atau repositori remote lainnya.

+

Reset sebuah file atau beberapa file

+

Perintah berikut memungkinkan kita memilih potongan konten dan mengembalikan atau menghapusnya.

+
git reset (--patch | -p) [tree-ish] [--] [paths]
+

Menghapus file dari staging area (unstage)

+

Jika kita menambahkan file ke area staging dengan git add, tetapi ternyata kita tidak lagi menginginkannya menjadi bagian dari commit, kita dapat menggunakan git reset untuk menghapus file tersebut dari area staging:

+
git reset HEAD FILE-YANG-INGIN-DI-UNSTAGE
+

Perintah ini hanya menghapus file itu dari staging area, perubahan yang kita buat akan tetap ada di file.

+

Reset branch ke commit sebelumnya

+

Perintah berikut mengatur ulang HEAD branch kita saat ini ke COMMIT yang ditentukan dan memperbarui index. Ini pada dasarnya memundurkan status branch kita, lalu semua commit yang kita buat setelah itu akan menimpa commit-commit yang dibuat setelah titik reset. Jika kita menghilangkan MODE, defaultnya adalah --mixed:

+
git reset MODE COMMIT-HASH
+

Pilihan untuk MODE adalah:

+
    +
  • --soft: tidak mengatur ulang file indeks atau working tree, tetapi mengatur ulang HEAD ke commit yang diinginkan. Mengubah semua status file menjadi “Perubahan yang akan di-commit”
  • +
  • --mixed: mengatur ulang indeks tetapi bukan working tree dan memberikan laporan perubahan apa saja yang belum diperbarui
  • +
  • --hard: mengatur ulang indeks dan working tree. Setiap perubahan pada file yang direkam di working tree sejak melakukan commit akan dibatalkan.
  • +
  • --merge: mengatur ulang indeks dan memperbarui file di working tree yang berbeda antara commit dan HEAD, tetapi menyimpan yang berbeda antara indeks dan working tree
  • +
  • --keep: mengatur ulang entri indeks dan memperbarui file di working tree yang berbeda antara commit dan HEAD. Jika file yang berbeda antara commit dan HEAD memiliki perubahan lokal, reset dibatalkan
  • +
+

Catatan Penting Tentang Hard Reset

+

Berhati-hatilah saat menggunakan git reset dengan opsi --hard karena perintah ini mengatur ulang riwayat commit, area staging, dan direktori kerja kita. Jika opsi ini tidak digunakan dengan benar, dapat berisiko kehilangan file atau perubahan yang sudah kita buat.

+

Git Revert

+

Perintah git revert dan git reset sama-sama membatalkan commit sebelumnya. Tetapi jika kita telah melakukan push commit ke repositori remote, kita disarankan untuk tidak menggunakan git reset karena ia menulis ulang riwayat commit. Efek dari perubahan riwayat commit ini dapat membuat rekan kita yang masih bekerja dengan riwayat commit yang lama tidak dapat melakukan push ke repositori remote karena git mendeteksi dua riwayat commit yang berbeda.

+

Alih-alih, lebih baik menggunakan git revert, yang membatalkan perubahan yang dibuat oleh commit sebelumnya dengan membuat commit yang baru, semua tanpa mengubah riwayat commit.

+

Revert sebuah commit atau beberapa commit sekaligus

+

Perintah berikut memungkinkan kita mengembalikan perubahan dari commit atau commit sebelumnya dan membuat commit baru.

+
git revert [--[no-]edit] [-n] [-m parent-number] [-s] [-S[<keyid>]] <commit>…
+git revert --continue
+git revert --quit
+git revert --abort
+

Opsi umum:

+
  -e
+  --edit
+
    +
  • Ini adalah opsi default dan tidak perlu diatur secara eksplisit. Ini membuka editor teks default sistem kita dan memungkinkan kita mengedit pesan commit baru sebelum melakukan revert.
  • +
  • Opsi ini melakukan kebalikan dari -e, dan git revert tidak akan membuka editor teks.
  • +
  • Opsi ini mencegah git revert membatalkan commit sebelumnya dan membuat commit baru. Daripada membuat commit baru, -n akan membatalkan perubahan dari commit sebelumnya dan menambahkannya ke Indeks Staging dan Direktori Kerja.
  • +
+
--no-edit
+-n
+-no-commit
+

Sumber: The Ultimate Guide to Git Reset and Git Revert


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2022/07/cara-berkomunikasi-dalam-tim/index.html b/2022/07/cara-berkomunikasi-dalam-tim/index.html new file mode 100644 index 00000000..3602938c --- /dev/null +++ b/2022/07/cara-berkomunikasi-dalam-tim/index.html @@ -0,0 +1,72 @@ +Cara Berkomunikasi dalam Tim | Dev Jurnal

Cara Berkomunikasi dalam Tim

Sebaik apapun pemahaman kita tentang suatu masalah atau sebuah situasi, ketika kita mendiskusikannya dengan orang lain, kita harus menyesuaikan kata-kata kita sehingga mereka dapat dengan cepat memahami apa yang relevan bagi mereka:

+
    +
  1. Ketika berbicara dengan orang bisnis, bicarakan tentang dampak bisnis dari apa yang kita lakukan. Hindari menggunakan jargon yang terlalu teknis.
  2. +
  3. Saat berbicara dengan manajemen teknik, komunikasikan dampak atau tantangan teknisnya.
  4. +
  5. Saat berbicara dengan pembuat keputusan, jelaskan opsi yang tersedia serta implikasi dan risikonya, bukan detail tentang bagaimana cara kerja opsi tersebut.
  6. +
  7. Saat memberikan pembaruan status, perhatikan apa lagi yang telah terjadi dan bagaimana pembaruan yang kita buat relevan dengan tujuan proyek.
  8. +
+

Dikutip dari tulisan Addy Osmani, Software Engineering - The Soft Parts


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2022/07/contoh-api-contract/index.html b/2022/07/contoh-api-contract/index.html new file mode 100644 index 00000000..a1f0975b --- /dev/null +++ b/2022/07/contoh-api-contract/index.html @@ -0,0 +1,610 @@ +Contoh API Contract | Dev Jurnal

Contoh API Contract

Ketika membuat API, kita perlu menuliskan dokumen yang mendeskripsikan apa yang dilakukan API kita dan +bagaimana API tersebut bekerja. Dokumen tersebut biasa disebut dengan API contract. +API contract akan memudahkan pengguna ketika melakukan integrasi terhadap API kita.

+

Tidak ada bentuk baku dalam menyusun dokumen API contract. Yang terpenting dokumen tersebut memberikan informasi +yang tepat mengenai API. Kerangkanya bisa meliputi nama versi, endpoint, HTTP method, dan parameter/payload yang dapat digunakan. +Kita dapat membuat dokumen API ini dengan peralatan yang tersedia, misalnya Swagger

+

Berikut salah satu contoh dokumen API contract:

+

Users

+
    +
  • +

    User object

    +
    {
    +id: integer
    +username: string
    +email: string
    +created_at: datetime(iso 8601)
    +updated_at: datetime(iso 8601)
    +}
    +

    GET /users

    +

    Returns all users in the system.

    +
  • +
  • URL Params
    +None
  • +
  • Data Params
    +None
  • +
  • Headers
    +Content-Type: application/json
  • +
  • Success Response:
  • +
  • +

    Code: 200
    +Content:

    +
    {
    +users: [
    +       {<user_object>},
    +       {<user_object>},
    +       {<user_object>}
    +     ]
    +}
    +
  • +
+

GET /users/:id

+

Returns the specified user.

+
    +
  • URL Params
    +Required: id=[integer]
  • +
  • Data Params
    +None
  • +
  • Headers
    +Content-Type: application/json
    +Authorization: Bearer <OAuth Token>
  • +
  • Success Response:
  • +
  • Code: 200
    +Content: { <user_object> }
  • +
  • +

    Error Response:

    +
      +
    • Code: 404
      +Content: { error : "User doesn't exist" }
      +OR
    • +
    • Code: 401
      +Content: { error : error : "You are unauthorized to make this request." }
    • +
    +
  • +
+

GET /users/:id/orders

+

Returns all Orders associated with the specified user.

+
    +
  • URL Params
    +Required: id=[integer]
  • +
  • Data Params
    +None
  • +
  • Headers
    +Content-Type: application/json
    +Authorization: Bearer <OAuth Token>
  • +
  • Success Response:
  • +
  • +

    Code: 200
    +Content:

    +
    {
    +orders: [
    +       {<order_object>},
    +       {<order_object>},
    +       {<order_object>}
    +     ]
    +}
    +
  • +
  • +

    Error Response:

    +
      +
    • Code: 404
      +Content: { error : "User doesn't exist" }
      +OR
    • +
    • Code: 401
      +Content: { error : error : "You are unauthorized to make this request." }
    • +
    +
  • +
+

POST /users

+

Creates a new User and returns the new object.

+
    +
  • URL Params
    +None
  • +
  • Headers
    +Content-Type: application/json
  • +
  • +

    Data Params

    +
    {
    +username: string,
    +email: string
    +}
    +
  • +
  • Success Response:
  • +
  • Code: 200
    +Content: { <user_object> }
  • +
+

PATCH /users/:id

+

Updates fields on the specified user and returns the updated object.

+
    +
  • URL Params
    +Required: id=[integer]
  • +
  • +

    Data Params

    +
    {
    +	username: string,
    +email: string
    +}
    +
  • +
  • Headers
    +Content-Type: application/json
    +Authorization: Bearer <OAuth Token>
  • +
  • Success Response:
  • +
  • Code: 200
    +Content: { <user_object> }
  • +
  • +

    Error Response:

    +
      +
    • Code: 404
      +Content: { error : "User doesn't exist" }
      +OR
    • +
    • Code: 401
      +Content: { error : error : "You are unauthorized to make this request." }
    • +
    +
  • +
+

DELETE /users/:id

+

Deletes the specified user.

+
    +
  • URL Params
    +Required: id=[integer]
  • +
  • Data Params
    +None
  • +
  • Headers
    +Content-Type: application/json
    +Authorization: Bearer <OAuth Token>
  • +
  • +

    Success Response:

    +
      +
    • Code: 204
    • +
    +
  • +
  • +

    Error Response:

    +
      +
    • Code: 404
      +Content: { error : "User doesn't exist" }
      +OR
    • +
    • Code: 401
      +Content: { error : error : "You are unauthorized to make this request." }
    • +
    +
  • +
+

Products

+
    +
  • +

    Product object

    +
    {
    +id: integer
    +name: string
    +cost: float(2)
    +available_quantity: integer
    +created_at: datetime(iso 8601)
    +updated_at: datetime(iso 8601)
    +}
    +

    GET /products

    +

    Returns all products in the system.

    +
  • +
  • URL Params
    +None
  • +
  • Data Params
    +None
  • +
  • Headers
    +Content-Type: application/json
  • +
  • Success Response:
  • +
  • +

    Code: 200
    +Content:

    +
    {
    +products: [
    +       {<product_object>},
    +       {<product_object>},
    +       {<product_object>}
    +     ]
    +}
    +
  • +
+

GET /products/:id

+

Returns the specified product.

+
    +
  • URL Params
    +Required: id=[integer]
  • +
  • Data Params
    +None
  • +
  • Headers
    +Content-Type: application/json
    +Authorization: Bearer <OAuth Token>
  • +
  • Success Response:
  • +
  • Code: 200
    +Content: { <product_object> }
  • +
  • +

    Error Response:

    +
      +
    • Code: 404
      +Content: { error : "Product doesn't exist" }
      +OR
    • +
    • Code: 401
      +Content: { error : error : "You are unauthorized to make this request." }
    • +
    +
  • +
+

GET /products/:id/orders

+

Returns all Orders associated with the specified product.

+
    +
  • URL Params
    +Required: id=[integer]
  • +
  • Data Params
    +None
  • +
  • Headers
    +Content-Type: application/json
    +Authorization: Bearer <OAuth Token>
  • +
  • Success Response:
  • +
  • +

    Code: 200
    +Content:

    +
    {
    +orders: [
    +       {<order_object>},
    +       {<order_object>},
    +       {<order_object>}
    +     ]
    +}
    +
  • +
  • +

    Error Response:

    +
      +
    • Code: 404
      +Content: { error : "Product doesn't exist" }
      +OR
    • +
    • Code: 401
      +Content: { error : error : "You are unauthorized to make this request." }
    • +
    +
  • +
+

POST /products

+

Creates a new Product and returns the new object.

+
    +
  • URL Params
    +None
  • +
  • +

    Data Params

    +
    {
    +name: string
    +cost: float(2)
    +available_quantity: integer
    +}
    +
  • +
  • Headers
    +Content-Type: application/json
  • +
  • Success Response:
  • +
  • Code: 200
    +Content: { <product_object> }
  • +
+

PATCH /products/:id

+

Updates fields on the specified product and returns the updated object.

+
    +
  • URL Params
    +Required: id=[integer]
  • +
  • +

    Data Params

    +
    {
    +	name: string
    +cost: float(2)
    +available_quantity: integer
    +}
    +
  • +
  • Headers
    +Content-Type: application/json
    +Authorization: Bearer <OAuth Token>
  • +
  • Success Response:
  • +
  • Code: 200
    +Content: { <product_object> }
  • +
  • +

    Error Response:

    +
      +
    • Code: 404
      +Content: { error : "Product doesn't exist" }
      +OR
    • +
    • Code: 401
      +Content: { error : error : "You are unauthorized to make this request." }
    • +
    +
  • +
+

DELETE /products/:id

+

Deletes the specified product.

+
    +
  • URL Params
    +Required: id=[integer]
  • +
  • Data Params
    +None
  • +
  • Headers
    +Content-Type: application/json
    +Authorization: Bearer <OAuth Token>
  • +
  • +

    Success Response:

    +
      +
    • Code: 204
    • +
    +
  • +
  • +

    Error Response:

    +
      +
    • Code: 404
      +Content: { error : "Product doesn't exist" }
      +OR
    • +
    • Code: 401
      +Content: { error : error : "You are unauthorized to make this request." }
    • +
    +
  • +
+

Orders

+
    +
  • +

    Order object

    +
    {
    +id: integer
    +user_id: <user_id>
    +total: float(2)
    +products: [
    +          { 
    +            product: <product_id>,
    +            quantity: integer 
    +          },
    +          { 
    +            product: <product_id>,
    +            quantity: integer 
    +          },
    +          { 
    +            product: <product_id>,
    +            quantity: integer 
    +          },
    +        ]
    +created_at: datetime(iso 8601)
    +updated_at: datetime(iso 8601)
    +}
    +

    GET /orders

    +

    Returns all users in the system.

    +
  • +
  • URL Params
    +None
  • +
  • Data Params
    +None
  • +
  • Headers
    +Content-Type: application/json
  • +
  • Success Response:
  • +
  • +

    Code: 200
    +Content:

    +
    {
    +orders: [
    +       {<order_object>},
    +       {<order_object>},
    +       {<order_object>}
    +     ]
    +}
    +
  • +
+

GET /orders/:id

+

Returns the specified order.

+
    +
  • URL Params
    +Required: id=[integer]
  • +
  • Data Params
    +None
  • +
  • Headers
    +Content-Type: application/json
    +Authorization: Bearer <OAuth Token>
  • +
  • Success Response:
  • +
  • Code: 200
    +Content: { <order_object> }
  • +
  • +

    Error Response:

    +
      +
    • Code: 404
      +Content: { error : "Order doesn't exist" }
      +OR
    • +
    • Code: 401
      +Content: { error : error : "You are unauthorized to make this request." }
    • +
    +
  • +
+

GET /orders/:id/products

+

Returns all Products associated with the specified order.

+
    +
  • URL Params
    +Required: id=[integer]
  • +
  • Data Params
    +None
  • +
  • Headers
    +Content-Type: application/json
    +Authorization: Bearer <OAuth Token>
  • +
  • Success Response:
  • +
  • +

    Code: 200
    +Content:

    +
    {
    +products: [
    +       {<product_object>},
    +       {<product_object>},
    +       {<product_object>}
    +     ]
    +}
    +
  • +
  • +

    Error Response:

    +
      +
    • Code: 404
      +Content: { error : "Order doesn't exist" }
      +OR
    • +
    • Code: 401
      +Content: { error : error : "You are unauthorized to make this request." }
    • +
    +
  • +
+

GET /orders/:id/user

+

Returns all Users associated with the specified order.

+
    +
  • URL Params
    +Required: id=[integer]
  • +
  • Data Params
    +None
  • +
  • Headers
    +Content-Type: application/json
    +Authorization: Bearer <OAuth Token>
  • +
  • Success Response: { <user_object> }
  • +
  • +

    Error Response:

    +
      +
    • Code: 404
      +Content: { error : "Order doesn't exist" }
      +OR
    • +
    • Code: 401
      +Content: { error : error : "You are unauthorized to make this request." }
    • +
    +
  • +
+

POST /orders

+

Creates a new Order and returns the new object.

+
    +
  • URL Params
    +None
  • +
  • +

    Data Params

    +
    {
    +	user_id: <user_id>
    +	product: <product_id>,
    +	quantity: integer 
    +}
    +
  • +
  • Headers
    +Content-Type: application/json
  • +
  • Success Response:
  • +
  • Code: 200
    +Content: { <order_object> }
  • +
+

PATCH /orders/:id

+

Updates fields on the specified order and returns the updated object.

+
    +
  • URL Params
    +Required: id=[integer]
  • +
  • +

    Data Params

    +
    {
    +	product: <product_id>,
    +	quantity: integer 
    +}
    +
  • +
  • Headers
    +Content-Type: application/json
    +Authorization: Bearer <OAuth Token>
  • +
  • Success Response:
  • +
  • Code: 200
    +Content: { <order_object> }
  • +
  • +

    Error Response:

    +
      +
    • Code: 404
      +Content: { error : "Order doesn't exist" }
      +OR
    • +
    • Code: 401
      +Content: { error : error : "You are unauthorized to make this request." }
    • +
    +
  • +
+

DELETE /orders/:id

+

Deletes the specified order.

+
    +
  • URL Params
    +Required: id=[integer]
  • +
  • Data Params
    +None
  • +
  • Headers
    +Content-Type: application/json
    +Authorization: Bearer <OAuth Token>
  • +
  • +

    Success Response:

    +
      +
    • Code: 204
    • +
    +
  • +
  • +

    Error Response:

    +
      +
    • Code: 404
      +Content: { error : "Order doesn't exist" }
      +OR
    • +
    • Code: 401
      +Content: { error : error : "You are unauthorized to make this request." }
    • +
    +

    Sumber: https://gist.github.com/BeattieM/324063512d166122ba5c

    +
  • +

Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2022/07/php-truthy-falsy-value/index.html b/2022/07/php-truthy-falsy-value/index.html new file mode 100644 index 00000000..b67cb629 --- /dev/null +++ b/2022/07/php-truthy-falsy-value/index.html @@ -0,0 +1,95 @@ +PHP Truthy dan Falsy Value | Dev Jurnal

PHP Truthy dan Falsy Value

Saat kita menggunakan nilai non-boolean dalam konteks boolean, misalnya untuk kondisi pada pernyataan if. +PHP mengevaluasi nilai tersebut menjadi nilai boolean. Nilai-nilai berikut dievaluasi menjadi false:

+
    +
  • Kata kunci false
  • +
  • Bilangan bulat nol 0
  • +
  • Angka desimal nol 0.0 dan -0.0
  • +
  • String kosong "" dan string "0"
  • +
  • Nilai NULL
  • +
  • Array kosong, yaitu array dengan elemen nol []
  • +
+

PHP mengevaluasi nilai lain menjadi true.

+

Kita bisa melihat hasil evaluasi nilai non-boolean menjadi boolean pada PHP menggunakan cast (bool) atau (boolean)

+
<?php
+var_dump((bool) false);     // bool(false)
+var_dump((bool) 0);         // bool(false)
+var_dump((bool) 0.0);       // bool(false)
+var_dump((bool) "0");       // bool(false)
+var_dump((bool) "");        // bool(false)
+var_dump((bool) array());   // bool(false)
+var_dump((bool) 1);         // bool(true)
+var_dump((bool) -2);        // bool(true)
+var_dump((bool) "foo");     // bool(true)
+var_dump((bool) 2.3e5);     // bool(true)
+var_dump((bool) array(12)); // bool(true)
+var_dump((bool) "false");   // bool(true)
+?>
+

Referensi:
+https://www.php.net/manual/en/language.types.boolean.php


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2022/08/first-rule-dalam-testing/index.html b/2022/08/first-rule-dalam-testing/index.html new file mode 100644 index 00000000..334d178d --- /dev/null +++ b/2022/08/first-rule-dalam-testing/index.html @@ -0,0 +1,99 @@ +Aturan FIRST dalam Clean Test | Dev Jurnal

Aturan FIRST dalam Clean Test

Dalam buku Clean Code, Uncle Bob menjelaskan tentang lima aturan Clean Tests +yang membentuk akronim FIRST:

+

Fast (Cepat)

+

Tes harus cepat. Mereka harus dapat dijalankan dengan cepat. Saat pengujian berjalan lambat, +Kita tidak ingin sering menjalankannya. Jika kita tidak sering menjalankannya, +kita tidak akan menemukan masalah cukup awal untuk memperbaikinya dengan mudah. +Kita tidak akan merasa bebas untuk membersihkan kode. Akhirnya kode +akan mulai membusuk.

+

Independent (Mandiri)

+

Tes tidak boleh bergantung satu sama lain. Satu tes tidak boleh mengatur kondisi untuk tes berikutnya. +Kita harus dapat menjalankan setiap pengujian secara independen dan menjalankan pengujian +dalam urutan apa pun yang kita suka. Ketika tes bergantung satu sama lain, +maka tes pertama yang gagal menyebabkan serangkaian kegagalan ke hilir, +membuat diagnosis menjadi sulit dan menyembunyikan cacat hilir.

+

Repeatable (Dapat diulang)

+

Tes harus dapat diulang di lingkungan apa pun. Kita harus dapat menjalankan pengujian di lingkungan produksi, +di lingkungan QA, dan di laptop kita tanpa jaringan. Jika pengujian kita tidak dapat diulang di lingkungan apa pun, +maka kita akan selalu memiliki alasan mengapa mereka gagal. Kita juga tidak dapat menjalankan pengujian +saat lingkungan yang dibutuhkan tidak tersedia.

+

Self-Validating (Memvalidasi Diri)

+

Tes harus memiliki output boolean. Entah mereka lulus atau gagal. Kita tidak perlu membaca file log +untuk mengetahui apakah tes lulus. Kita tidak perlu membandingkan dua file teks yang berbeda +secara manual untuk melihat apakah tes lulus. Jika tes tidak memvalidasi sendiri, +maka kegagalan dapat menjadi subjektif dan menjalankan tes dapat memerlukan evaluasi manual yang panjang.

+

Timely (Tepat pada Waktunya)

+

Tes harus ditulis tepat pada waktunya. Unit test harus ditulis tepat sebelum menulis kode yang membuatnya lulus. +Jika kita menulis tes setelah menulis kode, maka kita mungkin merasa kode produksi sulit untuk diuji. +Lalu kita mungkin memutuskan bahwa beberapa kode produksi terlalu sulit untuk diuji. +Kita mungkin tidak mendesain kode produksi untuk dapat diuji.


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2022/08/hukum-test-driven-development/index.html b/2022/08/hukum-test-driven-development/index.html new file mode 100644 index 00000000..b2cd51ab --- /dev/null +++ b/2022/08/hukum-test-driven-development/index.html @@ -0,0 +1,107 @@ +Tiga Hukum Test Driven Development | Dev Jurnal

Tiga Hukum Test Driven Development

Hukum Pertama

+
+

Anda tidak boleh menulis kode sampai Anda telah menulis unit test yang gagal.

+
+

Artinya kita harus menulis unit tes terlebih dahulu sebelum menulis kode. +Tentu saja hasil tesnya akan gagal (failing test), karena belum ada kode yang ditulis.

+

Hukum Kedua

+
+

Anda tidak boleh menulis unit test lebih dari yang cukup untuk gagal. +Tidak berhasil mengkompilasi adalah gagal.

+
+

Pikirkan kasus yang paling sederhana, tes paling dasar yang akan membuat kode kita saat ini gagal. +Tahapan ini akan biasa disebut dengan istilah red.

+

Hukum Ketiga

+
+

Anda tidak boleh menulis kode lebih dari yang cukup untuk lulus tes yang gagal saat ini.

+
+

Kita mulai menulis kode, hanya untuk lulus dari tes yang sudah kita buat. +Kita sama sekali tidak menambahkan kode lebih dari yang diperlukan untuk membuat tes lulus. +Tahapan kode yang berhasil pada tes ini biasa disebut dengan istilah green.

+

Saat berada di tahap hijau (green), amati bahwa kode kita kadang kurang baik +(karena yang paling penting adalah lulus tes dulu). +Setelah kode berhasil lulus tes, inilah saat kita melakukan refactor, +selalu lakukan refactor ketika tes telah lulus; +ini adalah satu-satunya cara untuk memastikan bahwa kita melakukan refactor dengan benar. +Tidak perlu memikirkan kode yang rapih dan baik atau melakukan refactor jika tes masih gagal.

+

Manfaat TDD

+

Dengan menggunakan TDD, kita didorong untuk memikirkan segala macam situasi, +membuat berbagai macam test case yang kemungkinan akan dihadapi. +Kita kemudian menulis tes untuk situasi tersebut, dan dalam prosesnya, +mulai memahami masalahnya dengan lebih baik. Biasanya, proses ini menghasilkan pengetahuan +yang mendalam tentang algoritma.

+

Jika kita sudah tidak dapat lagi memikirkan tes gagal lainnya untuk ditulis, +apakah ini berarti kode kita sudah sempurna? Belum tentu, kecuali ada seperangkat aturan +yang telah ditentukan sebelumnya. TDD tidak menjamin kode tanpa bug; +metode ini hanya membantu kita menulis kode yang lebih baik +yang dapat dipahami dan dimodifikasi dengan lebih baik.

+

Terlebih lagi, jika kita menemukan bug, akan lebih mudah untuk menulis tes +yang mereproduksi bug tersebut. Dengan cara ini, kita dapat memastikan +bahwa bug tidak pernah terjadi lagi - karena kita telah mengujinya!


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2022/08/menyingkat-perintah-git-dengan-alias/index.html b/2022/08/menyingkat-perintah-git-dengan-alias/index.html new file mode 100644 index 00000000..b6b8593b --- /dev/null +++ b/2022/08/menyingkat-perintah-git-dengan-alias/index.html @@ -0,0 +1,100 @@ +Menyingkat Perintah Git dengan Alias | Dev Jurnal

Menyingkat Perintah Git dengan Alias

Dalam pekerjaan sehari-hari saya lebih suka berinteraksi dengan git melalui perintah di command line. +Paling tidak untuk perintah yang sering digunakan seperti commit, push, atau checkout. Namun semakin lama +rasanya perintah-perintah tersebut terlalu panjang untuk diketik. Karena itu saya membuat beberapa alias +untuk menulis perintah git dengan lebih singkat sehingga mempercepat pekerjaan.

+

Cara Membuat Alias

+

Alias memungkinkan kita untuk menetapkan kata kunci yang dapat memicu perintah yang lebih panjang. +Kita dapat mendefinisikan alias dalam file konfigurasi .bash_profile atau . bashrc . +Karena saya menggunakan ZSH, file konfigurasinya bernama .zshrc. +File konfigurasi tersebut biasanya berada di direktori home. Misalnya, .zshrc saya berada di /home/user/.zshrc

+

Alias pada bash ditulis seperti contoh berikut

+
alias ALIAS_NAME="ALIAS_COMMAND"
+

Nama alias bisa apa saja yang kita inginkan, asalkan belum digunakan oleh perintah lain. +Misalnya, alias di bawah ini akan membuka situs web di Chrome:

+
alias devjurnal="chrome https://devjurnal.com"
+

Jika saya mengetik devjurnal di terminal baru, URL tersebut akan terbuka di Chrome.

+

Menyingkat Perintah Git

+

Commit

+

Ini adalah perintah yang paling sering digunakan, yaitu untuk commit dan menambahkan pesan commit.

+
alias gac="git add . && git commit -m" # + pesan commit
+

Dengan alias ini, cukup mengetik alias, ditambah pesan komit yang kita inginkan.

+
gac "Pesan komit saya"
+

Pull dan Push

+

Melakukan push dan pull ke/dari remote repo adalah perintah umum lainnya.

+
alias gp="git push" # + remote & nama branch
+alias gl="git pull" # + remote & nama branch
+

Branch

+

Ini adalah alias untuk bekerja dengan branch. Membuat branch baru atau checkout ke cabang lain:

+
alias gb="git branch" # + nama branch
+alias gco="git checkout" # + nama branch
+

Referensi : https://bitsofco.de/git-aliases-for-lazy-developers/


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2022/08/search-di-vim/index.html b/2022/08/search-di-vim/index.html new file mode 100644 index 00000000..cd1aecc6 --- /dev/null +++ b/2022/08/search-di-vim/index.html @@ -0,0 +1,104 @@ +Search di Vim | Dev Jurnal

Search di Vim

Kita dapat melakukan pencarian teks di Vim menggunakan / (garis miring) +dan ? (tanda tanya) di mode normal. Tanda garis miring / untuk pencarian maju dan +untuk mencari mundur tekan ?, ketik pola pencarian lalu tekan Enter.

+

Perintah pencarian di Vim mencari pola sebagai string, +bukan keseluruhan kata. Jika, misalnya, kita mencari teks “gnu”, +pencarian akan menemukan kecocokan di mana “gnu” disematkan +dalam kata-kata yang lebih besar, seperti “cygnus” atau “magnum”.

+

Tekan n untuk mencari hasil cocok berikutnya atau +huruf besar N (shift + n) untuk mencari ke arah yang berlawanan.

+

Cari Seluruh Kata

+

Untuk mencari seluruh kata, +ketik \< untuk menandai awal kata, masukkan pola pencarian, +ketik \> untuk menandai akhir kata, dan tekan Enter untuk melakukan pencarian .

+

Misalnya, untuk mencari “gnu” kita menggunakan /\<gnu\>

+

Cari Kata dengan Cursor

+

Kita juga dapat mencari seluruh kata dengan menggerakkan kursor +ke kata dan menekan * (tanda bintang) untuk mencari maju atau # (hash) +untuk mencari mundur. Untuk menemukan kecocokan berikutnya tekan * atau # lagi.

+

Histori pencarian

+

Vim melacak semua operasi pencarian yang kita buat di sesi saat ini. +Untuk menelusuri riwayat pencarian, tekan / atau ? dan gunakan +tombol panah atas/bawah untuk menemukan operasi pencarian sebelumnya. +Untuk menjalankan pencarian, cukup tekan Enter. +Kita juga dapat mengedit pola pencarian sebelum melakukan operasi.

+

Huruf besar dan kecil

+

Secara default, hasil pencarian Vim sensitif terhadap huruf besar/kecil; +mencari “GNU” tidak akan cocok dengan “Gnu”.

+

Untuk mengabaikan jenis huruf :set ignorecase atau :set ic di baris perintah Vim. +Kita juga dapat mengatur set ignore menjadi opsi default dengan menambahkan perintah +di file ~/.vimrc kita.

+

Untuk mengubah kembali ke mode pencocokan huruf besar-kecil, ketik :set noignorecase atau :set noic.

+

Cara lain untuk memaksa mengabaikan kasus adalah dengan menambahkan \c setelah pola pencarian. +Misalnya /Linux\c melakukan pencarian set ignore. Huruf besar \C setelah pola memaksa pencarian kecocokan huruf.

+

Sumber: https://linuxize.com/post/vim-search/


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2022/09/setting-keyboard-keychron-ubuntu/index.html b/2022/09/setting-keyboard-keychron-ubuntu/index.html new file mode 100644 index 00000000..64e0d1e1 --- /dev/null +++ b/2022/09/setting-keyboard-keychron-ubuntu/index.html @@ -0,0 +1,111 @@ +Setting Keyboard Keychron K2 di Ubuntu | Dev Jurnal

Setting Keyboard Keychron K2 di Ubuntu

Mengatur Tombol Fn + F

+

Keyboard Keychron di Linux menggunakan driver hid_apple (bahkan dalam mode Windows/Android), +baik dalam mode Bluetooth maupun Kabel. Secara default, driver ini menggunakan tombol F (F1-F12) +sebagai tombol pintasan multimedia dan kita harus menekan tombol fn + untuk mendapatkan tombol F1 hingga F12 yang biasa.

+

Untuk mengubahnya, kita perlu mengubah parameter fnmode untuk modul kernel hid_apple . +Berikut beberapa dokumentasi di dalamnya, +tetapi ringkasan singkatnya dapat ditemukan di bawah:

+
    +
  • 0 = disabled: Menonaktifkan tombol fn. Menekan fn+F8 akan berperilaku seperti kita hanya menekan F8
  • +
  • 1 = fkeyslast: Tombol fungsi digunakan sebagai tombol terakhir. Menekan tombol F8 akan bertindak sebagai tombol khusus (pintasan). +Menekan fn+F8 akan berperilaku seperti F8
  • +
  • 2 = fkeysfirst: Tombol fungsi digunakan sebagai tombol pertama. Menekan tombol F8 akan berperilaku seperti F8. Menekan fn+F8 akan bertindak sebagai tombol khusus (play/pause).
  • +
+

kita dapat menetapkan nilai untuk sementara (untuk pengujian, misalnya) dengan melakukan:

+
# ubah <value> di bawah dengan nilai 0, 1 atau 2
+# contoh: echo 2 | sudo tee /sys/module/hid_apple/parameters/fnmode
+echo <value> | sudo tee /sys/module/hid_apple/parameters/fnmode
+

Uji bagaimana keyboard berperilaku setelah mengubah nilai. Pilih salah satu yang sesuai kebutuhan untuk kita. +Setelah kita menemukan nilai yang sesuai untuk kita, kita dapat membuat perubahan permanen:

+
    +
  1. Buat file /etc/modprobe.d/hid_apple.conf
  2. +
  3. Tambahkan baris ini di dalam file: options hid_apple fnmode=<value>, +ganti <value> dengan nilai yang kita inginkan pada tahap sebelumnya (0, 1 atau 2)
  4. +
  5. Simpan file
  6. +
  7. Jalankan sudo update-initramfs -u
  8. +
  9. Reboot
  10. +
+

Jika mengalami kendala dengan mode numpad: Tekan dua kali F6 atau fn + F6.

+

Aktifkan konfigurasi koneksi cepat Bluetooth:

+

Jika keyboard membutuhkan waktu terlalu lama untuk terhubung ke komputer melalui Bluetooth +(misalnya, ketika kita menekan tombol dan mengaktifkan dari mode sleep), +kita dapat mengaktifkan koneksi cepat Bluetooth. Ini biasanya membuat keyboard terhubung dalam waktu kurang dari 1 detik.

+

Beberapa pengguna melaporkan efek samping masalah pada headphone Bluetooth +seperti audio yang muncul dan ketidakstabilan, tetapi saya belum mengalami hal seperti itu.

+
    +
  1. Edit file /etc/bluetooth/main.conf
  2. +
  3. Hapus komentar konfigurasi FastConnectable dan setel ke true: FastConnectable = true
  4. +
  5. Hapus komentar ReconnectAttempts=7 (setel nilainya ke nilai apa pun yang kita inginkan)
  6. +
  7. Hapus komentar ReconnectIntervals=1, 2, 3
  8. +
+

Sumber: https://gist.github.com/andrebrait/961cefe730f4a2c41f57911e6195e444


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2022/09/stop-mysql-startup/index.html b/2022/09/stop-mysql-startup/index.html new file mode 100644 index 00000000..e0741ae5 --- /dev/null +++ b/2022/09/stop-mysql-startup/index.html @@ -0,0 +1,70 @@ +Stop MySQL dari Start Up | Dev Jurnal

Stop MySQL dari Start Up

Untuk menghentikan service MySQL supaya tidak otomatis dijalankan saat +start up, gunakan perintah berikut

+
sudo systemctl disable mysql

Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2022/09/update-go-di-ubuntu/index.html b/2022/09/update-go-di-ubuntu/index.html new file mode 100644 index 00000000..5417246a --- /dev/null +++ b/2022/09/update-go-di-ubuntu/index.html @@ -0,0 +1,93 @@ +Update Versi Go di Ubuntu | Dev Jurnal

Update Versi Go di Ubuntu

Bagaimana Cara Melakukan Update Versi Go di Ubuntu

+

1. Uninstall Go

+

Seperti yang tertulis pada halaman dokumentasi +kita harus menghapus versi Go sebelumnya yang terinstall di komputer kita +pada folder /usr/local/go. Itu bisa dilakukan dengan perintah berikut:

+
sudo rm -rf /usr/local/go
+

2. Install versi yang baru

+

Kunjungi halaman download lalu download file instalasi +yang sesuai dengan sistem komputer kita.

+

3. Ekstrak file

+

Dari folder tempat kita menyimpan file instalasi, jalankan perintah berikut

+
sudo tar -C /usr/local -xzf go1.19.linux-amd64.tar.gz
+

4. Pastikan PATH sudah tertulis

+
echo $PATH | grep "/usr/local/go/bin"
+

5. Memastikan versi telah update

+

Pastikan bahwa kita telah menginstal Go versi baru dengan membuka command prompt +dan mengetik perintah berikut

+
go version
+

Sumber:

+

Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2022/10/update-snap-store/index.html b/2022/10/update-snap-store/index.html new file mode 100644 index 00000000..55ffafa0 --- /dev/null +++ b/2022/10/update-snap-store/index.html @@ -0,0 +1,79 @@ +Update Snap Store | Dev Jurnal

Update Snap Store

Untuk melakukan update snap store

+
snap-store --quit
+
+sudo snap refresh
+

Jika aplikasi tersebut masih menjalankan proses, +perintah tersebut akan mengembalikan nilai PID. +Kita harus menghentikan prosesnya

+
kill <pid>
+

Sumber: https://askubuntu.com/questions/1412575/pending-update-of-snap-store


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2022/12/install-vscode-ubuntu/index.html b/2022/12/install-vscode-ubuntu/index.html new file mode 100644 index 00000000..253ab344 --- /dev/null +++ b/2022/12/install-vscode-ubuntu/index.html @@ -0,0 +1,91 @@ +Install VS Code di Ubuntu | Dev Jurnal

Install VS Code di Ubuntu

Berikut adalah cara menginstall VS Code di Ubuntu melalui apt package manager:

+

1. Update Repository

+

Jalankan perintah berikut untuk melakukan update repository +dan memastikan kita mendapat vscode versi terbaru

+
sudo apt update
+

2. Install Package Dependency

+

Supaya dapat berjalan dengan baik, vscode perlu menginstal dependensi paket. +Jalankan perintah berikut untuk menginstall dependensi paket:

+
sudo apt install software-properties-common apt-transport-https wget -y
+

Perintah tersebut secara otomatis menginstal semua dependensi vscode.

+

3. Tambahkan GPG Key

+

Impor kunci GPG yang disediakan oleh Microsoft untuk memverifikasi integritas paket:

+
wget -q https://packages.microsoft.com/keys/microsoft.asc -O- | sudo apt-key add -
+

4. Tambahkan Repository

+

Jalankan perintah berikut untuk menambahkan repositori Visual Studio Code ke sistem:

+
sudo add-apt-repository "deb [arch=amd64] https://packages.microsoft.com/repos/vscode stable main"
+

5. Install vscode

+

Setelah repository ditambahkan kita bisa menginstall vscode dengan menjalankan perintah berikut:

+
sudo apt install code
+

6. Verifikasi instalasi

+

Jalankan perintah berikut untuk memastikan vscode telah terinstall

+
code --version
+

Jika instalasi berhasil, output akan menunjukkan versi vscode.

+

Sumber: https://phoenixnap.com/kb/install-vscode-ubuntu


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2022/12/laravel-security/index.html b/2022/12/laravel-security/index.html new file mode 100644 index 00000000..8c57b2d5 --- /dev/null +++ b/2022/12/laravel-security/index.html @@ -0,0 +1,101 @@ +Laravel Security | Dev Jurnal

Laravel Security

Beberapa hal yang bisa kita lakukan untuk meningkatkan +keamanan website dengan Laravel

+

Fitur Login/Otentikasi

+
    +
  • Terapkan role user dan akses dengan benar
  • +
  • Terapkan penggunaan password yang kuat
  • +
  • Tampilkan pesan error secara umum, tidak perlu detil
  • +
  • Terapkan rate limiter
  • +
+

Response Header

+
    +
  • +

    Set X-Frame-Options dengan nilai DENY

    +

    X-Frame-Options dapat digunakan untuk menunjukkan apakah browser boleh atau tidak merender halaman dalam <frame>, <iframe>, <embed> atau <object>. +Ini dapat digunakan untuk menghindari serangan pembajakan klik, dengan memastikan bahwa sebuah konten tidak disematkan ke situs lain. Dengan mengeset nilainya dengan DENY, halaman dalam frame yang dimuat dari situs lain akan gagal.

    +
  • +
  • Set CORS allow origins dengan benar sesuai kebutuhan
  • +
+

Error Handling & Logging

+
    +
  • Hindari memberikan rincian terlalu detil pada pesan error. Informasi yang terlalu banyak dapat dimanfaatkan oleh penyerang.
  • +
  • Batasi informasi yang di-log, penyerang dapat mengincar file log
  • +
  • Data yang bisa di-log: id, nama fungsi, nama class
  • +
  • Data yang jangan di-log: informasi seperti email, nomor telepon, token
  • +
+

Front End

+
    +
  • Jangan ada log di console production
  • +
  • Batasi input dari user, karena ini dapat jadi celah penyerang memasukkan data
  • +
  • Hindari menggunakan hidden field untuk data yang sifatnya sensitif, ini dapat dilihat dari page source
  • +
  • Berhati-hati dalam menggunakan localStorage atau sessionStorage karena data tersimpan di sisi client
  • +
  • Jaga dependensi paket tetap update, pastikan juga library/paket yang dipakai tidak disusupi script penyerang
  • +
  • Set Referrer-Policy dengan nilai no-referrer
  • +

Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2023/01/laravel-auth-routes/index.html b/2023/01/laravel-auth-routes/index.html new file mode 100644 index 00000000..588782fe --- /dev/null +++ b/2023/01/laravel-auth-routes/index.html @@ -0,0 +1,91 @@ +Laravel Auth Routes | Dev Jurnal

Laravel Auth Routes

Laravel menyediakan helper untuk membuat route otentikasi

+
Auth::routes()
+
+// akan membuat routes
+
+// Authentication Routes...
+Route::get('login', 'Auth\LoginController@showLoginForm')->name('login');
+Route::post('login', 'Auth\LoginController@login');
+Route::post('logout', 'Auth\LoginController@logout')->name('logout');
+
+// Registration Routes...
+Route::get('register', 'Auth\RegisterController@showRegistrationForm')->name('register');
+Route::post('register', 'Auth\RegisterController@register');
+
+// Password Reset Routes...
+Route::get('password/reset', 'Auth\ForgotPasswordController@showLinkRequestForm')->name('password.request');
+Route::post('password/email', 'Auth\ForgotPasswordController@sendResetLinkEmail')->name('password.email');
+Route::get('password/reset/{token}', 'Auth\ResetPasswordController@showResetForm')->name('password.reset');
+Route::post('password/reset', 'Auth\ResetPasswordController@reset');
+

Jika tidak ingin menggunakan semua auth routes, kita bisa memasukkan konfigurasinya sebagai parameter

+
Auth::routes([
+  'register' => false, // disable registration routes...
+  'reset' => false, // disable password reset routes...
+]);
+

Referensi:
+https://sekolahkoding.com/forum/bagaimana-cara-kerja-authroutes-1534167893

+

https://stackoverflow.com/questions/29183348/how-to-disable-registration-new-users-in-laravel


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2023/01/lessons-michael-janda/index.html b/2023/01/lessons-michael-janda/index.html new file mode 100644 index 00000000..462fff3e --- /dev/null +++ b/2023/01/lessons-michael-janda/index.html @@ -0,0 +1,95 @@ +Professional Lessons from Michael Janda | Dev Jurnal

Professional Lessons from Michael Janda

Michael Janda adalah seorang freelance designer yang sering membagikan wawasan dan tip seputar pekerjaan. Ada beberapa pelajaran yang menurut saya menarik dan inilah rangkumannya:

+
    +
  • Presentasikan solusi terlebih dahulu, baru bicara tentang harga
  • +
  • Cara berpikir seperti pengusaha: kenali kelemahan kita dan didik diri sendiri untuk mengubah perilaku atau mempekerjakan orang yang lebih kuat
  • +
  • Di mana kita memulai bukanlah cerminan dari nilai kita di masa depan
  • +
  • Tingkatkan nilai kita dengan belajar memecahkan masalah yang lebih besar
  • +
  • Persaingan di puncak lebih sedikit dibanding di bawah, naiklah ke puncak
  • +
  • Tidak masalah jika kita adalah desainer/programmer terbaik di dunia, jika kita tidak dapat bekerja dengan cepat, kita akan kesulitan untuk berhasil dalam karier
  • +
  • Kecepatan produksi dan kualitas produk sama pentingnya
  • +
  • Sebagian besar ide terbaik membutuhkan ide buruk terlebih dahulu. Jangan percaya ide pertama. Terus dorong naluri kreativitas sampai kita menemukan permata
  • +
  • +

    Selesaikan masalah klien dengan menjawab pertanyaan berikut:

    +
      +
    • Persona. Siapa yang memiliki masalah?
    • +
    • Masalah. Apa masalahnya.
    • +
    • Strategi. Bagaimana kita akan memecahkan masalah?
    • +
    • Objektif. Apa yang akan dicapai dari solusi?
    • +
    • Fitur. Fitur apa yang diperlukan untuk mencapai tujuan?
    • +
    • Solusi. Seperti apa produknya dan bagaimana fungsinya?
    • +
    +
  • +
  • Buat setiap klien merasa seperti satu-satunya klien kita
  • +
  • Dalam lingkungan bisnis, selalu berusahalah jadi orang yang berpenampilan terbaik. (The One Degree Rule for Dress)
  • +
  • Jangan pernah melakukan pekerjaan tanpa dokumen. Bahkan untuk ibumu pun tidak
  • +
  • Pilih ceruk (niche) yaitu: sesuatu yang kita sukai, sesuatu yang kita kuasai, dan sesuatu yang layak secara finansial. Gunakan corong ceruk (niche funnel)
  • +
  • Bersikaplah cukup rendah hati untuk mengenali apa yang tidak kita ketahui dan cukup bangga untuk mempelajarinya
  • +
  • Kita harus bertahan cukup lama dalam permainan untuk membangun keahlian
  • +
  • Pekerjaan yang pertama mungkin adalah yang terburuk, mulailah saja dan terur lakukan perbaikan
  • +
  • Keberuntungan adalah produk sampingan dari persiapan, ketekunan, dan kesabaran
  • +
  • Kesuksesan kita adalah produk sampingan dari kesuksesan yang kita ciptakan untuk orang lain
  • +

Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2023/01/mengoptimalkan-query-database-laravel/index.html b/2023/01/mengoptimalkan-query-database-laravel/index.html new file mode 100644 index 00000000..b1143ad5 --- /dev/null +++ b/2023/01/mengoptimalkan-query-database-laravel/index.html @@ -0,0 +1,240 @@ +Mengoptimalkan Query Database di Laravel | Dev Jurnal

Mengoptimalkan Query Database di Laravel

1. Mengambil Data dalam Jumlah Besar

+

Opsi 1: Menggunakan chunk

+

Jika aplikasi perlu memproses jumlah data yang besar, +kita bisa melakukannya dengan chunk (potongan). +Fungsi chunk menjalankan query dalam potongan-potongan +berdasarkan nilai offset dan limit, ini lebih optimal +dibanding query mengambil semua data di database. +Contoh di bawah mengambil 100 record dari tabel posts, +memprosesnya, mengambil 100 record lagi, dan memprosesnya.

+
// eloquent
+$posts = Post::chunk(100, function($posts){
+    foreach ($posts as $post){
+     // Proses posts
+    }
+});
+
+// query builder
+$posts = DB::table('posts')->chunk(100, function ($posts){
+    foreach ($posts as $post){
+     // Proses posts
+    }
+});
+

Opsi 2: Menggunakan chunkById

+

Kita juga dapat menggunakan chunkById. chunkById menggunakan field id +yang merupakan integer (bilangan bulat), dan kueri menggunakan klausa where, +kueri akan jauh lebih cepat.

+
// eloquent
+$posts = Post::chunkById(100, function($posts){
+    foreach ($posts as $post){
+     // Proses posts
+    }
+});
+
+// query builder
+$posts = DB::table('posts')->chunkById(100, function ($posts){
+    foreach ($posts as $post){
+     // Proses posts
+    }
+});
+

2. Select hanya kolom yang dibutuhkan

+

Gunakan fungsi select dalam kueri untuk memilih hanya kolom tertentu +alih-alih mengambil semua kolom dalam sebuah tabel.

+
// eloquent
+$posts = Post::select(['id','title'])->find(1);
+
+// query builder
+$posts = DB::table('posts')
+            ->where('id','=',1)
+            ->select(['id','title'])
+            ->first(); 
+

3. Gunakan pluck saat membutuhkan hanya satu atau dua kolom dari database

+
// eloquent
+$posts = Post::pluck('title', 'slug');
+
+// query builder
+$posts = DB::table('posts')->pluck('title','slug');
+

Ketika kode di atas dijalankan, ia melakukan hal berikut di belakang layar.

+

Jalankan select title, slug dari kueri posts di database. +Membuat array dengan title sebagai nilai array dan slug sebagai key array. +Mengembalikan array(format array: [ slug => title, slug => title ])

+

Untuk mengakses hasilnya

+
foreach ($posts as $slug => $title){
+    // $title post
+    // $slug post
+}
+

Jika ingin mengambil hanya satu kolom

+
// eloquent
+$posts = Post::pluck('title');
+
+// query builder
+$posts = DB::table('posts')->pluck('title');
+foreach ($posts as  $title){
+    // $title post
+}
+

4. Hitung jumlah baris menggunakan kueri, bukan dari collection

+

Dengan menggunakan pendekatan ini, kita dapat langsung menghitung +jumlah total baris pada database itu sendiri.

+
// eloquent
+$posts = Post::count();
+
+// query builder
+$posts = DB::table('posts')->count();
+

5. Menggunakan with dalam relasi

+

Jika kita menggunakan relasi dalam model eloquent +maka kita harus menggunakan method with.

+
$posts = Post::with(['author'])->get();
+

Demikian pula, jika kita menggunakan hubungan bersarang maka kita dapat menggunakan ini

+
$posts = Post::with(['author.team'])->get();
+

6. Jangan memanggil relasi yang tidak perlu

+

Jangan panggil relasi jika kita yakin id relasi ada di tabel.

+

Contoh: +Untuk mendapatkan id penulis dari sebuah posting, biasanya kita lakukan

+
$post = Post::findOrFail(<post id>);
+$post->author->id;
+

Sebagai gantinya, kita bisa langsung mendapatkan id penulis dengan melakukan hal berikut.

+
$post = Post::findOrFail(<post id>);
+$post->author_id; 
+// table posts memiliki kolom author_id yang menyimpan id penulis
+

Tapi selalu lakukan pengecekan bahwa baris yang dituju ada di tabel penulis +jika direferensikan di tabel posts.

+

7. Tambahkan indeks ke kolom yang sering dikueri

+

Jika kita melakukan query dengan where di sebuah kolom. +Kita bisa menambahkan indeks ke kolom tersebut. +Kueri jauh lebih cepat saat melakukan kueri pada baris dengan kolom indeks.

+

8. Gunakan simplePaginate, bukan Paginate

+

Paginate Menghasilkan link pagination untuk semua halaman. +Sementara simplePaginate Menghasilkan hanya tautan paginasi berikutnya dan sebelumnya.

+
// Menghasilkan link pagination untuk semua halaman
+$posts = Post::paginate(20);
+
+// Menghasilkan hanya link pagination next dan previous
+$posts = Post::simplePaginate(20);
+

9. Hindari penggunaan wildcard di awal (dengan keyword LIKE)

+

Jika kita mengetahui kata kunci muncul di awal nilai kolom, +kita dapat menjalankan kueri seperti di bawah ini.

+
select * from table_name where column like keyword%
+# bukan %keyword%
+

10. Hindari penggunaan fungsi SQL pada klausa where

+

Cukup gunakan where pada kolom tanggal seperti ini

+
// Yes
+$posts = Post::where('created_at', '>=', now() )->get();
+
+// No
+$posts = Post::whereDate('created_at', '>=', now() )->get();
+

11. Hindari menambahkan terlalu banyak kolom ke sebuah tabel

+

Menambahkan terlalu banyak kolom ke tabel akan menambah sebuah record +dan akan memperlambat pemindaian tabel. Saat melakukan kueri select *, +kita akhirnya akan mengambil banyak kolom yang sebenarnya tidak diperlukan. +Dalam situasi itu pemecahan tabel akan membantu.

+

12. Pisahkan kolom dengan tipe data teks ke dalam tabelnya sendiri

+

Pertimbangkan kasus di mana kita memiliki tabel yang disebut posting +dengan kolom konten yang menyimpan konten posting blog. +Konten untuk posting blog akan sangat besar dan seringkali, +kita memerlukan data ini hanya jika seseorang melihat +posting blog tertentu.

+

Jadi, memisahkan kolom ini dari tabel posts akan secara drastis +meningkatkan performa kueri saat ada terlalu banyak postingan.

+

13. Cara yang lebih baik untuk mengambil baris terbaru dari sebuah tabel

+

Jika menggunakan id dalam bentuk integer atau nilai yang berurutan, +cara yang lebih baik untuk mengambil baris terbaru adalah seperti di bawah ini. +Dibandingkan dengan mengurutkan string (pada field date).

+
$posts = Post::latest('id')->get();
+

14. Periksa dan optimalkan kueri

+

Tidak ada satu solusi universal saat mengoptimalkan kueri di laravel. +Hanya kita yang tahu apa yang dilakukan aplikasi kita, +berapa banyak kueri yang dibuatnya, berapa banyak yang benar-benar digunakan.

+

Untuk melakukan ini, kita dapat menggunakan

+
DB::enableQueryLog();
+dd(DB::getQueryLog());
+
    +
  1. Laravel Debugbar - Laravel debugbar memiliki tab bernama database +yang akan menampilkan semua kueri yang dijalankan saat kita mengunjungi sebuah halaman. +Kunjungi semua halaman di aplikasi dan lihat kueri yang dijalankan di setiap halaman.
  2. +
  3. Clockwork - Clockwork sama dengan laravel debugbar. +Tapi alih-alih memberikan toolbar ke situs web, +itu akan menampilkan informasi debug di developer tools window +atau sebagai UI mandiri dengan mengunjungi appurl/clockwork.
  4. +
  5. Laravel Telescope - Setelah Telescope diinstal, +kita dapat mengakses dasbor dengan mengunjungi +appurl/telescope. Di dasbor telescope, buka tab kueri, dan itu akan +menampilkan semua kueri yang dijalankan oleh aplikasi.
  6. +
+

Referensi: +How to Optimize Database Queries in Laravel?


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2023/01/menjalankan-artisan-storage-link-shared-hosting/index.html b/2023/01/menjalankan-artisan-storage-link-shared-hosting/index.html new file mode 100644 index 00000000..5156480d --- /dev/null +++ b/2023/01/menjalankan-artisan-storage-link-shared-hosting/index.html @@ -0,0 +1,96 @@ +Menjalankan Perintah PHP Artisan Storage Link di Shared Hosting | Dev Jurnal

Menjalankan Perintah PHP Artisan Storage Link di Shared Hosting

Perintah php artisan storage:link dijalankan untuk membuat +symbolic link antara folder storage dengan folder public di web server. +Kita dapat menjalankan perintah tersebut +di shared hosting tanpa mengakses terminal. Caranya adalah dengan +membuat perintah tersebut dijalankan lewat route:

+
Route::get('/linkstorage', function () {
+    $targetFolder = base_path().'/storage/app/public';
+    $linkFolder = $_SERVER['DOCUMENT_ROOT'].'/storage';
+    symlink($targetFolder, $linkFolder); 
+});
+

Variabel $linkFolder disesuaikan dengan letak folder di web hosting. +Dalam kasus ini folder storage berada di dalam folder public. +Saya menemukan kasus error yang berhubungan dengan proc_open +ketika mengisi path link folder tidak sesuai.

+
the Process class relies on proc_open, which is not available on your PHP installation
+

Atau bisa juga mengupdate config filesystem di file config/filesystems.php +dengan menambahkan baris berikut pada key 'disks'

+
'links' => [
+    $_SERVER['DOCUMENT_ROOT'].'/storage' => storage_path('app/public'),
+],

Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2023/02/membuat-bootable-flashdisk-di-ubuntu-dengan-ventoy/index.html b/2023/02/membuat-bootable-flashdisk-di-ubuntu-dengan-ventoy/index.html new file mode 100644 index 00000000..6a776f1b --- /dev/null +++ b/2023/02/membuat-bootable-flashdisk-di-ubuntu-dengan-ventoy/index.html @@ -0,0 +1,126 @@ +Membuat Bootable Flashdisk Windows di Ubuntu dengan Ventoy | Dev Jurnal

Membuat Bootable Flashdisk Windows di Ubuntu dengan Ventoy

Ventoy adalah tool open source untuk membuat live USB. +Kita dapat menggunakannya untuk membuat USB multi-boot, +live USB Linux yang persisten, dan USB Windows yang bootable.

+

Langkah 1: Siapkan USB drive

+

Ventoy memformat disk USB saat membuat bootable disk. +Namun, ada kasus di mana proses pemformatan gagal melakukannya +pada disk Linux yang sudah bootable. Karena alasan ini, disarankan +untuk memformat disk USB sebelum melanjutkan lebih jauh.

+

Colokkan lalu format disk USB. Klik kanan pada disk yang terpasang +dan kemudian memilih opsi format.

+

Tidak masalah sistem file mana yang dipilih selama pemformatan. +Ini akan diformat lagi oleh Ventoy di langkah selanjutnya.

+

Setelah diformat, tetap sambungkan USB dan lanjutkan +ke langkah berikutnya untuk menginstal Ventoy.

+

Langkah 2: Download dan instal Ventoy di Linux

+

Ventoy adalah tool campuran GUI dan CLI yang dapat digunakan +pada semua distribusi Linux. Download Ventoy untuk Linux +dari halaman rilis repositori GitHub-nya. +Download Ventoy untuk Linux

+

Pilih file .tar.gz dengan nama Linux. Ini adalah file yang harus kita download. +Setelah didownload, ekstrak file tar gz. Klik kanan lalu ekstrak.

+

Masuk ke dalam folder yang telah diekstraksi, dan kita dapat melihat +beberapa skrip di dalamnya. Kita perlu menjalankan satu file bernama VentoyWeb.sh. +Buka terminal dari folder tersebut, klik kanan lalu pilih ”Open in Terminal“.

+

Gunakan perintah berikut untuk menjalankan Ventoy:

+
sudo ./VentoyWeb.sh
+

Ventoy akan menjalankan server lokal dan akan memberi kita URL +untuk membuka GUI di browser. Salin URL ini dan tempel di browser. +Ini akan membuka halaman web dengan Ventoy berjalan di dalamnya. +Jika USB sudah terpasang, Ventoy akan mengenalinya. +Jika tidak, tekan tombol refresh.

+

Langkah 3: Gunakan Ventoy untuk membuat disk USB Windows 10 yang dapat di-boot

+

Meskipun Ventoy memiliki opsi untuk membuat bootable disk +yang dapat di-boot dengan secure boot, saat ini fitur tersebut +bersifat eksperimental dan mungkin tidak berfungsi.

+

Mengingat kita akan melakukan instalasi UEFI, +sebaiknya gunakan GPT untuk skema partisi.

+

Setelah semuanya diatur, tekan tombol install. Ini akan menunjukkan +kepada kita beberapa peringatan. Jika penginstalan selesai dengan sukses, +kita akan melihat pesan sukses.

+

Catatan: Jika tidak melihat disk Ventoy terpasang setelah instalasi berhasil, +lepaskan USB lalu pasang kembali.

+

Saat kita menekan tombol instal, itu membuat dua partisi pada disk USB.

+
 VTOYEFI: Partisi kecil untuk file UEFI.
+ Ventoy: Partisi besar dan kosong dalam format ExFAT tempat kita akan menyalin file image ISO.
+

Itulah yang perlu kita lakukan. Salin file image ISO Windows 10 +ke partisi ExFAT yang lebih besar di disk USB.

+

Setelah penyalinan selesai, JANGAN TERBURU-BURU melepaskan USB dulu. +Klik opsi unmount dari pengelola file. Kemungkinan beberapa file masih ditulis +dan mungkin menampilkan pesan error.

+

Tunggu beberapa menit lagi sampai ada pesan bahwa aman untuk melepaskan disk. +Sekarang kita dapat mencabutnya dan menggunakannya di sistem mana pun yang diinginkan.

+

Referensi: https://itsfoss.com/bootable-windows-usb-linux/


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2023/02/tips-laravel-routing-part-1/index.html b/2023/02/tips-laravel-routing-part-1/index.html new file mode 100644 index 00000000..f83a6225 --- /dev/null +++ b/2023/02/tips-laravel-routing-part-1/index.html @@ -0,0 +1,151 @@ +Tips Routing Laravel - Bagian 1 | Dev Jurnal

Tips Routing Laravel - Bagian 1

Pada file routing seringkali digunakan sintaks Route::get() +dan Route::post() yang sederhana. Namun, dalam proyek yang lebih besar, +routing biasanya akan menjadi lebih rumit. Ada beberapa cara yang dapat diterapkan +untuk menangani masalah routing dalam situasi tertentu.

+

Tip 1. Route::get() SEBELUM Route::resource()

+

Ini adalah salah satu kesalahan paling umum ketika menggunakan +Resource Controller

+
Route::resource('photos', 'PhotoController');
+Route::get('photos/popular', 'PhotoController@method');
+

Rute kedua tidak akan akurat, karena itu akan dicocokkan dengan +method show() dari Route::resource() yaitu /photos/{id}. +Dalam kasus ini, “popular” akan ditetapkan sebagai parameter $id.

+

Jika ingin menambahkan rute get/post, selain Route::resource(), +letakkan SEBELUM resource. Seperti ini:

+
Route::get('photos/popular', 'PhotoController@method');
+Route::resource('photos', 'PhotoController');
+

Tip 2. Route Group di dalam Grup Lain

+

Kita mungkin semua tahu bahwa kita dapat mengelompokkan rute dengan Route::group() +dan menetapkan middlewares/prefix yang berbeda dan parameter lainnya, +seperti rute yang bersifat publik dan rute yang mengharuskan log in.

+

Tetapi bagaimana jika kita memerlukan seperangkat aturan tertentu +untuk subgrup dari grup tersebut?

+

Contoh: kita memerlukan rute publik dan rute yang diautentikasi, +tetapi di dalam grup yang diautentikasi, kita perlu memisahkan administrator +dari pengguna biasa.

+

Ini bisa kita lakukan:

+
// rute publik
+Rute::get('/', 'HomeController@index');
+
+// Pengguna harus log in - dengan middleware "auth".
+Rute::grup(['middleware' => ['auth']], function () {
+
+     // /user/XXX: Selain "auth", grup ini akan memiliki middleware "simple_users"
+     Rute::grup(['middleware' => ['simple_users'], 'prefix' => 'user'], function () {
+         Rute::resource('tugas', 'TaskController');
+     });
+
+     // /admin/XXX: Grup ini tidak akan memiliki "simple_users", tetapi akan memiliki "auth" dan "admins"
+     Route::group(['middleware' => ['admins'], 'prefix' => 'admin'], function () {
+         Route::resource('users', 'UserController');
+     });
+});
+

Tip 3. Validasi Parameter Rute – Contoh Multi-Bahasa

+

Kasus yang cukup umum adalah mengawali rute dengan bahasa lokal, +seperti fr/blog atau en/article/333. Bagaimana kita memastikan +bahwa dua huruf pertama itu tidak digunakan untuk hal lain selain bahasa?

+

Kita dapat memvalidasinya langsung di rute, dengan parameter where:

+
Route::group(['prefix' => '{locale}', 'where' => ['locale' => '[a-zA-Z]{2}']], function () {
+     Rute::get('/', 'HomeController@index');
+     Route::get('article/{id}', 'ArticleController@show');
+});
+

Bagian utama di sini adalah where => ['locale' => '[a-zA-Z]{2}'] +di mana kita menggunakan regular expression untuk mencocokkan parameter yang +hanya sesuai dengan kombinasi dua huruf.

+

Tip 4. Dynamic Subdomain Routing

+

Kita bisa lihat yang satu ini langsung dari +dokumentasi resmi Laravel. +Jika kita memiliki subdomain dinamis, misalnya subdomain yang berbeda +untuk setiap pengguna, paramater tersebut diperlukan sebagai variabel. +Laravel telah melakukannya secara otomatis. Lihat contoh:

+
Rute::domain('{account}.myapp.com')->grup(function () {
+     Rute::get('user/{id}', function ($account, $id) {
+         //
+     });
+});
+

Perhatikan bahwa {account} secara otomatis diteruskan sebagai +parameter $account di dalam semua method controller.

+

Tip 5. Route List dan Route Caching

+

Cara memeriksa rute yang ada dalam sebuah proyek. +Kita mungkin tidak tahu persis ada rute apa saja dalam sebuah aplikasi. +Bisa saja tersembunyi di dalam Route::resource(), +atau di dalam Route::group yang lebih kompleks.

+

Kita dapat memeriksa semua rute yang sebenarnya dengan perintah Artisan:

+
php artisan route:list
+

Perlu diingat, bahwa di Laravel ada route caching, +setelah ada perubahan rute, kita perlu menjalankan perintah:

+
php artisan route:clear
+

Sumber: https://blog.quickadminpanel.com/laravel-routing-8-advanced-tips-languages-apis-groups-validation/


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2023/02/tips-laravel-routing-part-2/index.html b/2023/02/tips-laravel-routing-part-2/index.html new file mode 100644 index 00000000..463b643b --- /dev/null +++ b/2023/02/tips-laravel-routing-part-2/index.html @@ -0,0 +1,189 @@ +Tips Routing Laravel - Bagian 2 | Dev Jurnal

Tips Routing Laravel - Bagian 2

Tip 6. Hati-hati dengan Binding Model Route Bahasa Non-Inggris

+

Terkadang, URL harus berisi kata-kata non-Inggris. Misalnya, +kita memiliki portal berbahasa Indonesia untuk perpustakaan +dan ingin memiliki URL /daftar-buku untuk melihat daftar buku, +dan /buku/1 untuk melihat sebuah buku, seperti Resource Controller biasa.

+

Tapi di database, semua nama harus dalam bahasa Inggris. +Dengan asumsi “magic” Laravel bisa bekerja dengan kata benda tunggal dan jamak, +kita membuat model Book lengkap dengan migrasi dan controller, dengan perintah ini:

+
php artisan make:model Book -mcr
+

Tambahan -mcr akan membuat model dan resource controller, +ini hasilnya:

+
/**
+ * Display the specified resource.
+ *
+ * @param  \App\Book  $book
+ * @return \Illuminate\Http\Response
+ */
+public function show(Book $book)
+{
+    // ...
+}
+

Tetapi dengan perintah tersebut, di route/web.php kita akan memiliki ini:

+
Route::resource('buku', 'BookController');
+

Masalahnya adalah itu tidak akan bekerja dan itu tidak akan +menimbulkan error, hanya variabel $book yang akan kosong, +dan ini seringkali membuat kita tidak mengerti mengapa itu terjadi.

+

Menurut deskripsi Resource Controller, nama variabel +harus sama dengan parameter dalam bentuk tunggal:

+
// Tidak bekerja
+public function show(Book $book)
+{
+    // ...
+}
+
+// Seharusnya
+public function show(Book $buku)
+{
+    // ...
+}
+

Dalam proyek dengan Bahasa non Inggris, tidak disarankan menggunakan +Route::resource dan Route Model Binding sama sekali. +Terlalu banyak “magic” tidak dapat diprediksi. Dalam struktur bahasa Inggris, +Laravel akan dengan mudah mengetahui bahwa book adalah bentuk tunggal dari books. +Namun, bagaimana Laravel akan “menebak” bahwa “buku” dianggap sebagai +bentuk tunggal dari “daftar buku”?

+

Tip 7. Route API – dari V1 ke V2

+

Bayangkan kita bekerja dengan proyek berbasis API +dan perlu merilis versi baru dari API ini. +Jadi endpoint versi yang lama harus tetap di api/[sesuatu], +dan untuk versi baru kita akan menggunakan api/V2/[sesuatu].

+

Seluruh logika ada di file app/Providers/RouteServiceProvider.php:

+
public function map()
+{
+    $this->mapApiRoutes();
+
+    $this->mapWebRoutes();
+
+    // ...
+}
+
+protected function mapWebRoutes()
+{
+    Route::middleware('web')
+        ->namespace($this->namespace)
+        ->group(base_path('routes/web.php'));
+}
+
+protected function mapApiRoutes()
+{
+    Route::prefix('api')
+        ->middleware('api')
+        ->namespace($this->namespace)
+        ->group(base_path('routes/api.php'));
+}
+

Kita bisa melihat, route API didaftarkan dalam fungsi terpisah dengan prefix api. +Jadi, jika kita ingin membuat grup route V2, kita dapat membuat route/api_v2.php +secara terpisah dan lakukan ini:

+
public function map()
+{
+    // ... tambahkan map api v2
+
+    $this->mapApiV2Routes();
+}
+
+// Tambahkan method baru
+protected function mapApiV2Routes()
+{
+    Route::prefix('api/V2')
+        ->middleware('api')
+        ->namespace($this->namespace)
+        ->group(base_path('routes/api_v2.php'));
+}
+

Dengan cara ini, route lama tidak akan rusak, +dan kita cukup membuat serangkaian route baru.

+

Kiat 7. Rate Limiter (Pembatasan) – Secara Global dan untuk Pengguna

+

Kita dapat membatasi beberapa URL untuk dipanggil +maksimal 60 kali per menit, dengan throttle:60,1.

+
Route::middleware('auth:api', 'throttle:60,1')->group(function () {
+    Route::get('/user', function () {
+        //
+    });
+});
+

Kita juga dapat melakukannya secara terpisah +untuk pengguna umum dan untuk pengguna yang log in.

+
// maksimal 10 request per menit untuk pengguna umum dan 60 untuk user yang terotentikasi
+Route::middleware('throttle:10|60,1')->group(function () {
+    //
+});
+

Selain itu kita bisa membatasi jumlah untuk pengguna tertentu +berdasarkan kolom users.rate_limit di database:

+
Route::middleware('auth:api', 'throttle:rate_limit,1')->group(function () {
+    Route::get('/user', function () {
+        //
+    });
+});
+

Sumber: https://blog.quickadminpanel.com/laravel-routing-8-advanced-tips-languages-apis-groups-validation/


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2023/03/sebelum-bertanya/index.html b/2023/03/sebelum-bertanya/index.html new file mode 100644 index 00000000..5c5dca2a --- /dev/null +++ b/2023/03/sebelum-bertanya/index.html @@ -0,0 +1,111 @@ +Tips Sebelum Bertanya | Dev Jurnal

Tips Sebelum Bertanya

Saat menemukan masalah (teknis) dan merasa perlu bertanya lewat chat, email +atau forum, ada baiknya kita melakukan hal-hal ini dulu:

+

1. Cari kasus yang sama/mirip di arsip forum

+

Seringkali masalah yang kita temui bukanlah kejadian yang pertama di internet, +kecuali kita sedang mendalami topik yang sangat advance. Kita bisa melihat +postingan sebelumnya yang membahas masalah yang mirip atau bahkan sama.

+

2. Cari dengan kata kunci di mesin pencari

+

Ketika mencari lewat mesin pencari, coba beberapa cara mulai dari copy paste +pesan error secara detil kemudian memperluasnya dengan kata kunci yang lebih umum. +Biasanya mesin pencari akan menunjukkan hasil pencarian berupa topik di +forum tanya jawab seperti stackoverflow dengan judul yang paling mendekati.

+

3. Baca dokumentasi resmi

+

Umumnya sebuah produk hadir dengan petunjuk penggunaan atau dokumentasi. +Ketika menemukan masalah, misalnya dalam menggunakan framework biasanya petunjuk +penggunaan dan solusi dari masalah-masalah tertentu ada dalam dokumentasi resmi.

+

4. Baca FAQ

+

FAQ merangkum banyak pertanyaan yang paling sering ditanyakan.

+

5. Baca GitHub Issues

+

Jika menggunakan kode open source, kita bisa melihat masalah-masalah yang dilaporkan +di GitHub, lalu pergi ke tab issues.

+

6. Coba lakukan langkah debugging dan bereksperimen

+

Debugging adalah proses yang mengidentifikasi masalah, +mengisolasi sumber masalah dan kemudian menentukan cara untuk mengatasinya. +Cara paling sederhana dalam bereksperimen adalah dengan mengubah-ubah +input dan melihat hasilnya di output.

+

7. Baca source code dengan lebih teliti

+

Seringkali ketika tergesa-gesa atau sudah kelelahan, kita menjadi tidak teliti dan +bisa jadi melewatkan hal-hal sederhana seperti typo misalnya. +Istirahat sejenak lalu baca lagi dengan lebih teliti.

+

8. Tanya AI (ChatGPT/GitHub Copilot)

+

Saat ini sudah mulai banyak muncul produk asisten berupa chat bot ataupun ekstensi +code editor yang memanfaatkan kecerdasan buatan. Kita bisa memanfaatkan kelebihan tersebut +untuk berdiskusi tentang masalah yang sedang kita hadapi.

+

Ketika kita mengajukan pertanyaan, tunjukkan hasil yang kita dapat +setelah melakukan hal-hal di atas. Itu akan membantu memberi petunjuk +sejauh mana kita telah berusaha mencari jawabannya. Dengan begitu kita +tidak membuang waktu orang lain untuk mencari jawabannya dari awal.

+

Selain itu kita juga akan belajar dari proses pemecahan masalah tersebut, +bukannya hanya mendapatkan jawaban akhir dari orang lain. +Itu akan bermanfaat untuk kita di masa depan, +keterampilan kita untuk memecahkan masalah secara mandiri juga akan semakin terasah.


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2023/03/unit-test-klasifikasi/index.html b/2023/03/unit-test-klasifikasi/index.html new file mode 100644 index 00000000..33a5b85e --- /dev/null +++ b/2023/03/unit-test-klasifikasi/index.html @@ -0,0 +1,141 @@ +Unit Test - Klasifikasi | Dev Jurnal

Unit Test - Klasifikasi

Sebelum membuat test case apa pun, kita perlu menentukan +nilai input dari fungsi/metode tertentu yang perlu dites. +Test case harus dirancang untuk mencakup semua kombinasi nilai masukan +dan prasyarat (precondition). Jenis input dataset untuk unit test +bisa dibagi 3.

+
    +
  1. Normal: Input berada pada nilai rentang normal (yang dapat diterima). +Sejumlah besar kode dapat dicakup hanya dengan menjalankan test case normal.
  2. +
  3. Boundary (Batas): Input berada pada atau di luar batas maksimum atau minimumnya. +Kasus tersebut lebih digunakan untuk mengidentifikasi kesalahan pada batas daripada menemukan +yang ada di pusat domain input.
  4. +
  5. Abnormal: Input tidak valid (ilegal atau tidak diharapkan) untuk menguji +penanganan dan pemulihan kesalahan.
  6. +
+

Contoh: Misalkan kita memiliki fungsi yang memvalidasi alamat email yang dimasukkan oleh pengguna. Panjang maksimum alamat email adalah 50 karakter.

+
function validate($email) {
+    if (filter_var($email, FILTER_VALIDATE_EMAIL) && strlen($email) <= 50) {
+        return true;
+    }
+    return false;
+}
+

Kita dapat menulis test case seperti di bawah ini:

+

Normal cases

+
public function test_valid_email_format_and_length()
+{
+    // Email dengan panjang 18 (kurang dari: maximum - 1)
+    $email = 'sample@framgia.com';
+    $this->assertEquals(true, validate($email));
+}
+

Boundary cases

+
public function test_valid_email_format_and_length_max_minus()
+{
+    // Email dengan panjang 49 (maximum - 1)
+    $email = 'samplesamplesamplesamplesamplesamples@framgia.com';
+    $this->assertEquals(true, validate($email));
+}
+
+public function test_valid_email_format_and_length_max()
+{
+    // Email dengan panjang 50 (nilai dama dengan maximum)
+    $email = 'samplesamplesamplesamplesamplesamplesa@framgia.com';
+    $this->assertEquals(true, validate($email));
+}
+
+public function test_valid_email_format_and_length_max_plus()
+{
+    // Email dengan panjang 51 (maximum + 1)
+    $email = 'samplesamplesamplesamplesamplesamplesam@framgia.com';
+    $this->assertEquals(false, validate($email));
+}
+

Abnormal cases

+
public function test_invalid_email_format()
+{
+    // Format email tidak valid dengan panjang normal (antara 0 ~ 50)
+    $email = 'framgia.com';
+    $this->assertEquals(false, validate($email));
+}
+
+public function test_valid_email_format_and_length_exceeded()
+{
+    // Email dengan panjang 54
+    $email = 'samplesamplesamplesamplesamplesamplesample@framgia.com';
+    $this->assertEquals(false, validate($email));
+}
+

Sumber: https://github.com/framgia/laravel-test-guideline/blob/master/en/Knowledge.md


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2023/04/apa-itu-oauth2-part-1/index.html b/2023/04/apa-itu-oauth2-part-1/index.html new file mode 100644 index 00000000..191260f2 --- /dev/null +++ b/2023/04/apa-itu-oauth2-part-1/index.html @@ -0,0 +1,83 @@ +Apa Itu OAuth2 part 1 | Dev Jurnal

Apa Itu OAuth2 part 1

OAuth 2.0 adalah protokol standar industri untuk otorisasi. OAuth 2.0 berfokus pada kesederhanaan pengembang aplikasi klien serta memberikan alur otorisasi khusus untuk aplikasi web, aplikasi desktop, ponsel, dan perangkat ruangan.

+

Roles (Peran)

+

Aplikasi Pihak Ketiga: “Client”

+

Client adalah aplikasi yang berusaha mendapatkan akses ke data pengguna. Aplikasi pihak ketiga ini perlu mendapatkan izin dari pengguna sebelum dapat mengakses sumber daya di server penyedia layanan.

+

API: “Resource Server (Server Sumber Daya)”

+

Server sumber daya adalah server API yang digunakan untuk mengakses data pengguna.

+

Authorization Server (Server Otorisasi)

+

Ini adalah server yang menyajikan antarmuka tempat pengguna dapat menyetujui atau menolak permintaan akses. Dalam implementasi yang lebih kecil, ini mungkin server yang sama dengan server API, tetapi dalam penerapan pada skala yang lebih besar, server ini sering dibangun sebagai komponen terpisah.

+

User/Pengguna: “Resource Owner (Pemilik Sumber Daya)”

+

Pemilik sumber daya adalah pengguna yang memberikan akses ke sebagian sumber daya di akunnya.

+

Contoh

+

Kita sedang mengembangkan aplikasi yang perlu mengakses data pada Google Drive pengguna. Aplikasi yang kita buat dalam kasus tersebut berperan sebagai client. Sementara pemilik akun Google Drive berperan sebagai resource owner, dia adalah pemilik sumber daya yang berhak mengizinkan atau menolak permintaan dari aplikasi kita untuk mengakses data-datanya. Sementara Google adalah penyedia layanan API sekaligus server otorisasi. Aplikasi yang kita buat hanya bisa mengakses data-data di server hanya jika diberikan izin oleh pengguna.

+

Membuat Aplikasi

+

Sebelum dapat memulai proses OAuth, kita harus mendaftarkan aplikasi client ke penyedia layanan terlebih dahulu (dalam contoh di atas Google Drive API). Saat mendaftarkan aplikasi baru, kita biasanya memberikan informasi dasar seperti nama aplikasi, situs web, logo, dll. Selain itu, kita harus mendaftarkan redirect URI yang akan digunakan untuk mengalihkan pengguna ke server web, aplikasi berbasis browser, atau aplikasi seluler.

+

Redirect URI

+

Penyedia layanan hanya akan mengarahkan pengguna ke URI terdaftar, ini untuk membantu mencegah beberapa jenis serangan. Redirect URI berupa HTTP harus disajikan melalui HTTPS. Ini membantu mencegah token dicegat dan terbaca selama proses otorisasi. Aplikasi native dapat mendaftarkan redirect URI dengan skema URL khusus untuk aplikasi tersebut, yang mungkin terlihat seperti demoapp://redirect.

+

Client ID dan Secret

+

Setelah mendaftarkan aplikasi client, kita akan menerima ID klien dan secara opsional kode rahasia klien. ID klien dianggap sebagai informasi publik, dan digunakan untuk membuat URL login, atau disertakan dalam kode Javascript di halaman. Kode rahasia klien harus dijaga kerahasiaannya. Jika aplikasi yang diterapkan tidak dapat menjaga kerahasiaan kode ini, seperti aplikasi SPA Javascript atau aplikasi native, maka kode tersebut tidak digunakan, dan idealnya layanan tidak seharusnya mengeluarkan kode rahasia untuk jenis aplikasi ini sejak awal.

+

Sumber: https://aaronparecki.com/oauth-2-simplified/


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2023/04/tips-debugging/index.html b/2023/04/tips-debugging/index.html new file mode 100644 index 00000000..22848c65 --- /dev/null +++ b/2023/04/tips-debugging/index.html @@ -0,0 +1,73 @@ +Tips Debugging | Dev Jurnal

Tips Debugging

Aktivitas debugging terkadang bisa membuat kita frustrasi. Namun, dengan mindset yang tepat kita bisa melakukan debugging dengan lebih baik tanpa stres. Ingat selalu mengenai hal-hal ini dan ada beberapa langkah praktis yang bisa kita lakukan dalam proses debugging:

+
    +
  1. Komputer adalah sesuatu yang bekerja dengan logika, selalu ada penjelasan logis pada suatu masalah yang muncul. Bahkan ketika nampaknya tidak mungkin ditemukan pada saat itu juga. Dapatkan informasi sebanyak mungkin untuk mereproduksi masalah (tangkapan layar/rekaman, langkah mendetail untuk mereproduksi masalah, mengumpulkan log dan pesan kesalahan yang relevan). Informasi dari log seperti error trace dapat membantu kita memahami di bagian mana kesalahan terjadi.
  2. +
  3. Rubber duck debugging adalah cara melakukan debugging dengan mengartikulasikan masalah dalam bahasa lisan atau tulisan. Ini seperti seolah-olah kita sedang menjelaskan sebuah masalah kepada orang lain, hal itu bisa membantu kita menggambarkan masalah dengan lebih jelas dibanding hanya memikirkannya. Kita juga bisa melakukannya dengan menulis.
  4. +
  5. Kebuntuan adalah hal yang sifatnya sementara, dengan ketekunan dan usaha, sebuah masalah pasti akan ditemukan solusinya. Jangan menyerah dengan cepat. Berhenti dan ambil waktu untuk bersantai sejenak, berjalan-jalan ke luar, minum air putih. Terkadang kebuntuan terjadi karena pikiran kita terlalu lelah dan memerlukan waktu untuk istirahat. Seringkali setelah pikiran kita segar kembali, ide-ide akan muncul dengan sendirinya.
  6. +
  7. Penting untuk mengetahui batas kemampuan kita dan tau kapan waktunya kita perlu bertanya pada orang lain yang memiliki lebih banyak pengalaman. Kita bisa mengirim chat ke senior atau berkomunikasi dengan anggota komunitas. Terkadang orang lain dapat membantu dengan melihat masalah dari perspektif lain yang bisa jadi kita luput. Ketahui kapan waktunya harus berhenti dan mulai meminta bantuan pada orang lain.
  8. +
  9. Tidak selalu perlu mengeluarkan banyak usaha untuk menyelesaikan setiap bug. Kita harus memprioritaskan bug berdasarkan potensi dampak dan kerumitan yang ditimbulkan. Fokus pada bug yang berdampak paling besar dan jangan menghabiskan waktu terlalu lama pada bug-bug yang rumit namun tidak begitu berdampak.
  10. +
+

Sumber: https://www.youtube.com/watch?v=J8uAiZJMfzQ


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2023/05/apa-itu-oauth2-part-2-aplikasi-web-server/index.html b/2023/05/apa-itu-oauth2-part-2-aplikasi-web-server/index.html new file mode 100644 index 00000000..863af3c2 --- /dev/null +++ b/2023/05/apa-itu-oauth2-part-2-aplikasi-web-server/index.html @@ -0,0 +1,124 @@ +Apa Itu OAuth2 part 2 - Aplikasi Web Server | Dev Jurnal

Apa Itu OAuth2 part 2 - Aplikasi Web Server

Langkah pertama dalam proses OAuth2 adalah mendapatkan otorisasi dari pengguna (authorization). Pada aplikasi berbasis browser (web misalnya) atau aplikasi native mobile (Android, iOS, dsb), hal ini biasanya dilakukan dengan menampilkan antarmuka yang disediakan oleh layanan kepada pengguna.

+

OAuth2 menyediakan beberapa jenis pemberian akses (grant types) untuk berbagai kasus penggunaan:

+
    +
  • Authorization Code untuk aplikasi yang berjalan di server web, aplikasi berbasis browser, dan seluler.
  • +
  • Password untuk masuk dengan nama pengguna dan kata sandi (hanya untuk aplikasi pihak pertama)
  • +
  • Client credentials untuk akses aplikasi tanpa kehadiran pengguna
  • +
  • Implicit sebelumnya direkomendasikan untuk klien tanpa client secret, tetapi telah digantikan dengan menggunakan pemberian Kode Otorisasi dengan PKCE.
  • +
+

Web Server Apps

+

Aplikasi server web adalah jenis aplikasi paling umum saat berhadapan dengan server OAuth. Aplikasi web ditulis dalam bahasa sisi server dan dijalankan di server di mana kode sumber aplikasi tidak dapat diakses secara publik. Ini berarti aplikasi dapat menggunakan client secret saat berkomunikasi dengan server otorisasi, yang dapat membantu menghindari banyak vektor serangan.

+

Authorization

+

Buat link untuk ”log in” pengguna:

+
https://authorization-server.com/auth?response_type=code&
+  client_id=CLIENT_ID&redirect_uri=REDIRECT_URI&scope=photos&state=1234zyx
+
    +
  • response_type=code - Menunjukkan bahwa server menghendaki untuk menerima kode otorisasi (auth code)
  • +
  • client_id - ID klien yang kita dapat saat pertama kali membuat aplikasi
  • +
  • redirect_uri - URI untuk mengembalikan pengguna ke aplikasi kita setelah proses otorisasi selesai
  • +
  • scope - cakupan/bagian mana dari akun pengguna yang ingin kita akses (dapat berisi satu atau beberapa)
  • +
  • state - string acak yang dibuat oleh aplikasi kita, yang akan digunakan untuk verifikasi nanti
  • +
+

Pemberian Akses oleh Pengguna

+

Pengguna melihat prompt otorisasi berupa antarmuka yang disediakan oleh penyedia layanan. Di proses ini aplikasi meminta persetujuan pengguna untuk mengakses sumber daya/data pengguna. Pengguna dapat mengizinkan atau menolak permintaan akses tersebut. Pengguna akan diminta log in terlebih dahulu jika belum.

+

auth prompt

+

+Antarmuka Pengguna untuk Prompt Otorisasi - diambil dari web aaronparecki.com +

+

Jika pengguna mengklik “izinkan”, layanan akan mengalihkan pengguna kembali ke situs kita, dan aplikasi kita akan mendapatkan kode otorisasi.

+
https://example-app.com/cb?code=AUTH_CODE_DISINI&state=1234zyx
+
    +
  • code - Server mengembalikan kode otorisasi (auth code) dalam query string
  • +
  • state - Server mengembalikan nilai state yang sama dengan yang aplikasi kita berikan pada login URL
  • +
+

Kita harus terlebih dahulu membandingkan nilai state ini untuk memastikannya sesuai dengan yang aplikasi kita buat. Kita dapat menyimpan nilai state dalam cookie atau session, dan membandingkannya saat pengguna kembali. Ini membantu memastikan titik akhir pengalihan (redirection endpoint) kita tidak dapat diakali untuk mencoba bertukar kode otorisasi arbitrer.

+

Mendapatkan Token Akses

+

Server kita perlu menukar kode otorisasi dengan token akses dengan membuat http request POST ke endpoint token server otorisasi:

+
POST https://api.authorization-server.com/token
+  grant_type=authorization_code&
+  code=AUTH_CODE_HERE&
+  redirect_uri=REDIRECT_URI&
+  client_id=CLIENT_ID&
+  client_secret=CLIENT_SECRET
+
    +
  • grant_type=authorization_code - Jenis pemberian akses untuk alur ini adalah ”authorization_code” (kode otorisasi)
  • +
  • code=AUTH_CODE_HERE - Ini adalah kode yang kita terima dalam string kueri
  • +
  • redirect_uri=REDIRECT_URI - Harus sama dengan redirect URI yang disediakan di link asli
  • +
  • client_id=CLIENT_ID - ID klien yang kita terima saat pertama kali membuat aplikasi
  • +
  • client_secret=CLIENT_SECRET - Karena permintaan ini dibuat dari kode sisi server, client secret disertakan di respons (tidak akan terlihat di browser)
  • +
+

Server membalas dengan token akses dan waktu kedaluwarsa

+
{
+  "access_token":"RsT5OjbzRn430zqMLgV3Ia",
+  "expires_in":3600
+}
+

atau jika ada kesalahan

+
{
+  "error":"invalid_request"
+}
+

Keamanan: Perhatikan bahwa penyedia layanan harus mewajibkan aplikasi untuk melakukan pendaftaran redirect URI sebelumnya. Ini untuk memastikan bahwa pengguna tidak dapat di-redirect selain menuju ke aplikasi kita.

+

Sumber: https://aaronparecki.com/oauth-2-simplified/


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2023/05/kompromi-dalam-pengembangan-perangkat-lunak/index.html b/2023/05/kompromi-dalam-pengembangan-perangkat-lunak/index.html new file mode 100644 index 00000000..d818d783 --- /dev/null +++ b/2023/05/kompromi-dalam-pengembangan-perangkat-lunak/index.html @@ -0,0 +1,75 @@ +Kompromi dalam Pengembangan Perangkat Lunak | Dev Jurnal

Kompromi dalam Pengembangan Perangkat Lunak

Sebuah tulisan singkat yang saya baca di linkedin, ditulis oleh mas Giovanni Sakti Nugraha - Software Engineering Manager & Leader, Consultant, Tech Content Creator | Livestreaming at insinyur.online (ID).

+

Dalam tulisan ini, pernyataan awal beliau adalah : “Sebagai insinyur perangkat lunak, tujuan kita adalah melakukan ”trade-off“.

+

Terjemahan dari kata ”trade-off” dalam bahasa Indonesia adalah “pengorbanan”. Istilah ini digunakan untuk menggambarkan situasi di mana seseorang harus memilih antara dua pilihan atau lebih yang memiliki keuntungan dan kerugian yang berbeda-beda, dan harus mengorbankan sesuatu untuk memperoleh sesuatu yang diinginkan.

+

Dalam konteks bisnis, trade-off juga bisa diartikan sebagai kompromi yang dibuat antara biaya dan manfaat suatu keputusan atau strategi bisnis. Berikut tulisan lengkapnya yang saya terjemahkan ke dalam Bahasa Indonesia.

+
+

“Sebagai insinyur perangkat lunak, tujuan kita adalah melakukan ”trade-off. Menyeimbangkan (kebanyakan) hal-hal berikut: latensi, throughput, keandalan, dan produktivitas.

+

Yang penting adalah benar-benar memahami hasil yang ingin kita capai dan sadar akan trade-off yang kita buat.

+

Sebaliknya, yang berbahaya adalah jika kita mengikuti salah satu sisi ekstrem (dalam menerapkan praktik engineering) secara membabi buta tanpa menyadari apa yang baru saja kita lakukan.

+

Memilih bahasa pemrograman adalah salah satu contoh keputusan yang perlu kita buat secara sadar. Contoh lainnya adalah menyimpan dan mengambil data, termasuk model data, dll.

+

Ada banyak keputusan lain yang perlu dibuat sebagai insinyur perangkat lunak saat kita melakukan pekerjaan kita, terutama dalam skala besar di mana keputusan kecil dapat memiliki dampak yang berkali-kali lipat.”

+

Sumber: Giovanni Sakti Nugraha - LinkedIn


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2023/05/menulis-acceptance-test-dengan-given-when-then/index.html b/2023/05/menulis-acceptance-test-dengan-given-when-then/index.html new file mode 100644 index 00000000..e24cb03c --- /dev/null +++ b/2023/05/menulis-acceptance-test-dengan-given-when-then/index.html @@ -0,0 +1,81 @@ +Menulis Acceptance Test dengan Formula Given-When-Then | Dev Jurnal

Menulis Acceptance Test dengan Formula Given-When-Then

Dalam pengembangan perangkat lunak, Given-When-Then merupakan sebuah formula atau template yang bertujuan untuk memandu penulisan acceptance test (pengujian penerimaan) terhadap User Story. Formula ini terdiri dari tiga bagian, yaitu:

+
    +
  • (Given) beberapa konteks atau kondisi awal
  • +
  • (When) aksi atau tindakan tertentu yang dilakukan
  • +
  • (Then) sejumlah konsekuensi yang dapat diamati (seharusnya terjadi)
  • +
+

Contoh penggunaan formula Given-When-Then:

+
    +
  • Given my bank account is in credit, and I made no withdrawals recently (saldo rekening bank saya mencukupi dan saya belum melakukan penarikan dana baru-baru ini),
  • +
  • When I attempt to withdraw an amount less than my card’s limit (saya mencoba menarik dana dalam jumlah kurang dari batas kartu saya),
  • +
  • Then a particular set of observable consequences should obtain (penarikan dana harus berhasil tanpa adanya kesalahan atau peringatan),
  • +
+

Manfaat

+

Formula Given-When-Then membantu dalam merancang acceptance test dengan lebih terstruktur dan jelas. Bagian Given memberikan konteks atau kondisi awal yang diperlukan sebelum menjalankan aksi atau tindakan. Bagian When menyatakan aksi atau tindakan yang akan diuji. Sedangkan bagian Then menyatakan hasil atau konsekuensi yang diharapkan setelah aksi dilakukan.

+

Dengan menggunakan formula ini, tim pengembang perangkat lunak dapat memastikan bahwa User Story atau cerita pengguna telah memenuhi persyaratan yang telah ditentukan. Penggunaan formula Given-When-Then juga membantu mempermudah komunikasi antara anggota tim pengembang (developer), penguji (QA), dan pemangku kepentingan lainnya, sehingga meminimalkan risiko kesalahpahaman.

+

Dalam praktiknya, formula Given-When-Then dapat digunakan secara berulang untuk menulis skenario pengujian acceptance test yang berbeda-beda, sehingga memastikan bahwa aplikasi atau sistem yang dikembangkan berperilaku sesuai dengan harapan dan kebutuhan pengguna.

+

Jadi, dengan menggunakan formula Given-When-Then, tim pengembang dapat lebih mudah menggambarkan konteks, tindakan, dan hasil yang diharapkan dalam pengujian acceptance test. Hal ini membantu memastikan kualitas dan keandalan perangkat lunak yang dikembangkan, serta meminimalisir risiko adanya bug atau kesalahan dalam sistem.


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2023/05/panduan-facility-dan-severity-dalam-syslog/index.html b/2023/05/panduan-facility-dan-severity-dalam-syslog/index.html new file mode 100644 index 00000000..106c83f2 --- /dev/null +++ b/2023/05/panduan-facility-dan-severity-dalam-syslog/index.html @@ -0,0 +1,117 @@ +Mengenal RFC 5424 - Panduan untuk Facility dan Severity dalam Syslog | Dev Jurnal

Mengenal RFC 5424 - Panduan untuk Facility dan Severity dalam Syslog

Syslog adalah protokol standar yang digunakan untuk mengirim, mengumpulkan, dan mengelola pesan log pada sistem komputer. Pesan log ini berisi informasi penting tentang kejadian dan keadaan sistem yang dapat membantu dalam pemantauan, analisis, dan pemecahan masalah.

+

Salah satu aspek penting dalam protokol syslog adalah atribut ”Facility” dan ”Severity” yang digunakan untuk memberikan informasi tentang sumber pesan dan seberapa penting pesan tersebut. Meskipun nilainya tidak normatif, namun Facility dan Severity sering digunakan dalam praktik syslog. RFC 5424 adalah dokumen yang merinci nilai-nilai ini untuk tujuan informasi.

+

Facility adalah kode numerik yang menentukan sumber pesan log. RFC 5424 memperkenalkan 24 nilai Facility yang berbeda. Nilai-nilai ini berkisar antara 0 hingga 23 dan memiliki deskripsi yang spesifik. Berikut adalah tabel yang menggambarkan nilai-nilai Facility beserta deskripsinya:

+
          Numerical             Facility
+             Code
+
+              0             kernel messages
+              1             user-level messages
+              2             mail system
+              3             system daemons
+              4             security/authorization messages
+              5             messages generated internally by syslogd
+              6             line printer subsystem
+              7             network news subsystem
+              8             UUCP subsystem
+              9             clock daemon
+             10             security/authorization messages
+             11             FTP daemon
+             12             NTP subsystem
+             13             log audit
+             14             log alert
+             15             clock daemon (note 2)
+             16             local use 0  (local0)
+             17             local use 1  (local1)
+             18             local use 2  (local2)
+             19             local use 3  (local3)
+             20             local use 4  (local4)
+             21             local use 5  (local5)
+             22             local use 6  (local6)
+             23             local use 7  (local7)
+
+              Table 1.  Syslog Message Facilities
+

Selanjutnya, Severity adalah indikator tingkat kepentingan pesan log. RFC 5424 juga menyediakan 8 nilai Severity yang berbeda, mulai dari 0 hingga 7. Setiap nilai Severity memiliki deskripsi yang menjelaskan tingkat kepentingan pesan tersebut. Berikut adalah tabel yang menggambarkan nilai-nilai Severity beserta deskripsinya:

+
           Numerical         Severity
+             Code
+
+              0       Emergency: system is unusable
+              1       Alert: action must be taken immediately
+              2       Critical: critical conditions
+              3       Error: error conditions
+              4       Warning: warning conditions
+              5       Notice: normal but significant condition
+              6       Informational: informational messages
+              7       Debug: debug-level messages
+
+              Table 2. Syslog Message Severities
+

Dalam protokol syslog, nilai Priority sebuah pesan log dihitung dengan mengalikan nilai Facility dengan 8 terlebih dahulu, kemudian menambahkannya dengan nilai numerik Severity.

+

Sebagai contoh:

+
    +
  • sebuah pesan kernel (Facility=0) dengan Severity Emergency (Severity=0) akan memiliki nilai Prioritas sebesar 0
  • +
  • sementara pesan “local use 4” (Facility=20) dengan Severity Notice (Severity=5) akan memiliki nilai Prioritas sebesar 165
  • +
+

Dalam PRI (prioritas) sebuah pesan syslog, nilai-nilai ini akan ditempatkan di antara tanda kurung sudut sebagai <0> dan <165>. Hanya pada nilai Prioritas “0” yang diikuti oleh tanda ”<” sebelumnya. Selain itu, tidak boleh menggunakan angka “0” di depan.


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2023/06/apa-itu-github-action/index.html b/2023/06/apa-itu-github-action/index.html new file mode 100644 index 00000000..445ec651 --- /dev/null +++ b/2023/06/apa-itu-github-action/index.html @@ -0,0 +1,101 @@ +Apa itu GitHub Action? | Dev Jurnal

Apa itu GitHub Action?

Dalam pengembangan perangkat lunak modern, otomatisasi dan pengaturan aliran kerja (workflow) yang efisien sangatlah penting. GitHub Action, yang disediakan oleh GitHub, adalah salah satu platform untuk mengotomatisasi proses pengembangan perangkat lunak.

+

Dalam tulisan ini, kita akan membahas tentang GitHub Action, bagaimana cara menggunakannya, dan manfaatnya dalam meningkatkan efisiensi pengembangan perangkat lunak.

+

Apa itu GitHub Action?

+

GitHub Action adalah platform otomatisasi yang disediakan oleh GitHub. Dengan menggunakan GitHub Action, Kita dapat membuat alur kerja otomatis (workflow) untuk menjalankan berbagai tugas terkait pengembangan perangkat lunak, seperti pengujian (test), pembangunan (build), dan pengiriman (deploy).

+

GitHub Action menggabungkan kekuatan dari pemicu berbasis peristiwa (event-based triggers) dengan eksekusi kode dan serangkaian aksi terstruktur, yang semuanya dapat diatur dan dikonfigurasi di dalam repositori GitHub Kita.

+

Manfaat GitHub Action

+
    +
  1. +

    Otomatisasi Proses

    +

    GitHub Action memungkinkan Kita mengotomatisasi proses pengembangan perangkat lunak. Kita dapat membuat alur kerja yang menjalankan langkah-langkah tertentu secara otomatis setiap kali ada perubahan di repositori, seperti pengujian unit (unit test), membangun aplikasi (build), atau mendeploy ke server produksi.

    +
  2. +
  3. +

    Integrasi dengan Repositori GitHub

    +

    GitHub Action sepenuhnya terintegrasi dengan repositori GitHub Kita. Kita dapat membuat dan mengelola alur kerja otomatis langsung dari repositori, memberikan visibilitas yang mudah dan mengurangi kerumitan.

    +
  4. +
  5. +

    Action Marketplace

    +

    GitHub Action memiliki Marketplace Action yang kaya dengan berbagai action yang sudah dibuat sebelumnya. Kita dapat dengan mudah menemukan dan menggunakan aksi yang sesuai dengan kebutuhan proyek Kita. Action-action ini mencakup pengujian, pembangunan, notifikasi, penerbitan ke layanan cloud, dan banyak lagi.

    +
  6. +
  7. +

    Fleksibilitas dan Kustomisasi

    +

    GitHub Action memberikan fleksibilitas tinggi dalam menentukan langkah-langkah dan aksi-aksi yang akan dieksekusi dalam alur kerja. Kita dapat menyesuaikan alur kerja sesuai kebutuhan proyek Kita dengan menambahkan atau mengubah langkah-langkah yang ada.

    +
  8. +
  9. +

    Kolaborasi Tim

    +

    GitHub Action memudahkan kolaborasi tim dalam pengembangan perangkat lunak. Semua anggota tim dapat melihat, mengelola, dan berkontribusi pada alur kerja otomatis yang ada di repositori. Hal ini memastikan konsistensi dalam pengembangan dan meningkatkan efisiensi kerja tim.

    +
  10. +
+

Cara Menggunakan GitHub Action

+

Langkah dalam menggunakan GitHub Action secara garis besar sebagai berikut

+
    +
  1. Membuat File Konfigurasi: Buat file konfigurasi untuk alur kerja otomatis (misalnya .github/*workflow*s/main.yml) di repositori GitHub Kita.
  2. +
  3. Menentukan Trigger Event: Tentukan event-trigger yang akan memicu alur kerja otomatis, seperti perubahan di repositori, pembukaan pull request, atau pembuatan tag.
  4. +
  5. Menentukan Steps: Tentukan langkah-langkah yang akan dieksekusi dalam alur kerja otomatis. Kita dapat menggunakan aksi yang ada di Marketplace atau membuat aksi kustom sesuai kebutuhan.
  6. +
  7. Menyimpan dan Mengaktifkan: Simpan file konfigurasi dan unggah ke repositori GitHub Kita. GitHub Action secara otomatis akan mengaktifkan dan menjalankan alur kerja otomatis sesuai dengan konfigurasi yang telah ditentukan.
  8. +
+

Panduan lengkap membuat CI/CD dengan GitHub Action dapat dibaca pada artikel berikut Membuat CI/CD dengan GitHub Action


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2023/06/auto-build-deploy-gatsby-site-ke-github-page-dengan-github-action/index.html b/2023/06/auto-build-deploy-gatsby-site-ke-github-page-dengan-github-action/index.html new file mode 100644 index 00000000..8ddc0ad2 --- /dev/null +++ b/2023/06/auto-build-deploy-gatsby-site-ke-github-page-dengan-github-action/index.html @@ -0,0 +1,121 @@ +Auto Build dan Deploy Gatsby Site ke GitHub Page dengan GitHub Action | Dev Jurnal

Auto Build dan Deploy Gatsby Site ke GitHub Page dengan GitHub Action

Blog yang sedang Anda baca ini dibuat dengan GatsbyJs dan dihosting di GitHub Pages. +Sebelumnya, deploy site dilakukan secara manual menggunakan perintah gatsby build setiap saya menambahkan artikel baru.

+
gatsby build --prefix-paths && gh-pages -d public
+

Auto Deploy

+

Proses ini dapat dibuat otomatis dengan memanfaatkan GitHub Actions workflow.

+
    +
  1. +

    Buat branch baru github-action

    +

    Semua perubahan file berkaitan dengan pekerjaan GitHub action akan disimpan di sini.

    +
  2. +
  3. +

    Buat Personal Access Token

    +

    Untuk dapat menggunakan workflow ini, kita juga perlu membuat Token Akses. Buka Setting (klik foto profil di pojok kanan atas) -> Developer Settings (paling bawah) -> Generate new token. Pada token classic, kita pilih scope berikut: repo, workflow, dan write: package.

    +
  4. +
  5. +

    Set access token di actions

    +

    Copy secret token. Kemudian kembali ke repositori kita: Settings -> Secrets and Variable -> Actions. Klik tombol new repository secret. Kita atur namanya ACCESS_TOKEN yang akan kita gunakan di file deploy.yml.

    +
  6. +
  7. +

    Buat file workflow

    +

    Untuk melakukan ini, kita akan membuat file bernama deploy.yml di dalam folder .github/workflows.

    +
    name: Gatsby Publish
    +
    +on:
    +  push:
    +    branches:
    +    - main
    +
    +jobs:
    +  build:
    +    runs-on: ubuntu-latest
    +    steps:
    +    - name: Checkout
    +        uses: actions/checkout@v3
    +    - name: Use Node.js
    +        uses: actions/setup-node@v3
    +        with:
    +          node-version: '16'
    +    - name: Gatsby Publish
    +        uses: enriikke/gatsby-gh-pages-action@v2
    +        with:
    +          access-token: ${{ secrets.ACCESS_TOKEN }}
    +          deploy-branch: gh-pages
    +        env:
    +          NPM_CONFIG_LEGACY_PEER_DEPS: true
    +

    Dalam file ini, kita mendefinisikan bahwa setiap kali melakukan push ke branch main, kita menjalankan job Gatsby Publish.

    +

    Saya menambahkan setup node untuk memastikan proses build menggunakan versi nodejs yang tepat. Saya juga mengeset deploy-branch: gh-pages karena itu branch yang saya gunakan untuk mempublikasikan blog. Sementara attribute env NPM_CONFIG_LEGACY_PEER_DEPS: true untuk mengantisipasi versi peer dependency yang tidak cocok (namun sebenarnya tetap bisa berfungsi).

    +
  8. +
  9. +

    Buat Pull Request dan Merge

    +

    Setelah semua siap, kita bisa mencoba script tersebut dengan cara melakukan pull request ke branch main. Github akan menampilkan status workflow di bawah tab Actions. Setiap kali kita melakukan push commit baru atau melakukan merge dari branch lain, actions akan melakukan build pada aplikasi kita.

    +
  10. +
+

Referensi: Auto-Deploy Gatsby to Github Pages


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2023/06/membuat-ci-cd-dengan-github-action/index.html b/2023/06/membuat-ci-cd-dengan-github-action/index.html new file mode 100644 index 00000000..9ff39bf5 --- /dev/null +++ b/2023/06/membuat-ci-cd-dengan-github-action/index.html @@ -0,0 +1,87 @@ +Panduan Membuat CI/CD dengan GitHub Action | Dev Jurnal

Panduan Membuat CI/CD dengan GitHub Action

Continuous Integration (CI) dan Continuous Deployment (CD) adalah praktik penting dalam pengembangan perangkat lunak modern. CI/CD memungkinkan tim pengembang untuk secara otomatis menguji (test), membangun (build), dan mendeploy perangkat lunak mereka dengan cepat dan efisien.

+

Salah satu alat yang populer untuk mengimplementasikan CI/CD adalah GitHub Action. Dalam artikel ini, kita akan membahas langkah-langkah untuk membuat CI/CD dengan GitHub Action, sehingga dapat meningkatkan kecepatan dan kualitas pengembangan perangkat lunak Kita.

+

Persiapan Repositori GitHub

+

Langkah pertama adalah mempersiapkan repositori GitHub yang akan digunakan untuk proyek Kita. Pastikan repositori sudah dibuat dan perangkat lunak yang ingin Kita bangun dan deploy sudah diunggah ke repositori tersebut.

+

Membuat File Konfigurasi CI/CD

+

Selanjutnya, buat file konfigurasi CI/CD di repositori Kita. File ini akan memberi tahu GitHub Action tentang alur kerja atau langkah-langkah yang harus dijalankan saat CI/CD berlangsung. File konfigurasi umumnya dikenal sebagai .github/workflows/main.yml. Kita dapat menggunakan teks editor favorit Kita untuk membuat file ini.

+

Menentukan Event Trigger

+

Di dalam file konfigurasi, tentukan trigger event yang akan memicu CI/CD. Misalnya, Kita dapat mengatur CI/CD untuk dijalankan setiap kali ada commit baru ke branch tertentu, ada tag baru yang dibuat, atau ada pull request dibuka. Gunakan sintaks on untuk menentukan event trigger yang sesuai dengan kebutuhan Kita.

+

Menentukan Jobs

+

Setiap workflow CI/CD terdiri dari satu atau beberapa job. Job adalah unit kerja yang terdiri dari beberapa langkah. Kita dapat menentukan satu atau lebih job di dalam file konfigurasi. Misalnya, Kita dapat memiliki job untuk menguji kode, membangun aplikasi, dan mendeploy ke lingkungan produksi.

+

Menentukan Steps

+

Di dalam setiap job, Kita perlu menentukan langkah-langkah (steps) yang harus dijalankan. Steps adalah langkah-langkah yang harus dilakukan oleh GitHub Action. Misalnya, Kita dapat menggunakan steps untuk menginstal dependensi, menjalankan skrip pengujian, atau membuat paket yang siap untuk dideploy.

+

Menentukan Actions

+

Dalam langkah-langkah Kita, Kita dapat menggunakan aksi (actions) yang telah tersedia di Marketplace GitHub atau Kita dapat membuat aksi kustom Kita sendiri. Aksi adalah unit yang dapat digunakan untuk melakukan tugas tertentu dalam CI/CD Kita.

+

Misalnya, ada aksi untuk menguji kode menggunakan framework tertentu, membangun aplikasi menggunakan alat tertentu, atau mendeploy ke layanan cloud tertentu.

+

Mengaktifkan CI/CD

+

Setelah Kita menentukan semua langkah-langkah yang diperlukan, simpan file konfigurasi dan unggah ke repositori GitHub Kita. GitHub Action secara otomatis akan mendeteksi dan mulai menjalankan CI/CD sesuai dengan konfigurasi yang telah Kita tentukan. Kita dapat melihat status CI/CD di tab “Actions” di repositori GitHub Kita.

+

Memantau dan Mengelola CI/CD

+

Setelah CI/CD diaktifkan, Kita dapat memantau dan mengelola proses CI/CD. GitHub Action akan memberikan laporan tentang langkah-langkah yang berhasil atau gagal. Jika ada kegagalan, Kita dapat melihat log untuk menemukan penyebabnya dan memperbaikinya.

+

Mengoptimalkan CI/CD

+

CI/CD adalah proses yang dapat terus ditingkatkan. Kita dapat mengoptimalkan CI/CD Kita dengan mengubah langkah-langkah, menambahkan skrip tambahan, atau menggunakan aksi yang lebih efisien. Selain itu, Kita dapat mengkonfigurasi notifikasi untuk menerima pemberitahuan tentang keberhasilan atau kegagalan CI/CD.

+

Contoh

+

Salah satu contoh CI/CD untuk melakukan auto build dan deploy website dengan Gatsby bisa dibaca pada artikel berikut Auto Build dan Deploy Gatsby Site ke GitHub Page dengan GitHub Action


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2023/06/tipe-tiket-jira/index.html b/2023/06/tipe-tiket-jira/index.html new file mode 100644 index 00000000..67e90cb6 --- /dev/null +++ b/2023/06/tipe-tiket-jira/index.html @@ -0,0 +1,91 @@ +Mengenal Tiket Jira: Epic, Story, Bug, Task, dan Subtask dalam Manajemen Proyek | Dev Jurnal

Mengenal Tiket Jira: Epic, Story, Bug, Task, dan Subtask dalam Manajemen Proyek

Dalam dunia manajemen proyek, penggunaan perangkat lunak untuk membantu mengatur pekerjaan dan mengelola tugas menjadi hal yang sangat umum. Salah satu perangkat lunak yang populer digunakan dalam manajemen proyek adalah Jira. Jira adalah alat kolaborasi yang membantu tim pengembangan perangkat lunak dalam melacak pekerjaan, mengatur tugas, dan mengelola aliran kerja proyek.

+

Dalam Jira, tiket digunakan untuk mewakili tugas-tugas yang perlu diselesaikan dalam proyek. Dalam artikel ini, kita akan menggali lebih dalam tentang jenis tiket yang umum digunakan dalam Jira, yaitu Epic, Story, Bug, Task, dan Subtask.

+

Epic

+

Epic adalah unit kerja yang besar dan kompleks yang terdiri dari beberapa story atau tugas yang lebih kecil. Epic merupakan tiket teratas dalam hierarki Jira dan digunakan untuk menggambarkan fitur atau fungsionalitas yang besar. Jenis tiket ini adalah satu-satunya yang dapat ditampilkan dalam tampilan Gantt Cart di bagian roadmap.

+

Biasanya, Epic tidak dapat diselesaikan dalam satu iterasi atau sprint, melainkan memerlukan beberapa iterasi untuk menyelesaikannya. Epic memberikan cara mudah untuk melacak kemajuan proyek atau inisiatif besar dan memastikan bahwa semua pekerjaan yang saling terkait diselaraskan dan diprioritaskan dengan benar. Epic tidak dimasukkan ke dalam backlog.

+

Contoh Epic adalah “Pengembangan Fitur Autentikasi Pengguna”.

+

Story

+

Story adalah tiket yang merepresentasikan fitur, fungsi, atau kebutuhan pengguna yang dapat diselesaikan dalam satu iterasi atau sprint. Story lebih spesifik dibandingkan dengan Epic, tetapi tetap memiliki ukuran yang cukup besar untuk dipecah menjadi tugas-tugas yang lebih kecil.

+

Biasanya, Story ditulis dalam format naratif, diungkapkan dalam beberapa kalimat pendek, dan idealnya menggunakan bahasa non-teknis yang berfokus pada kebutuhan pengguna atau pemangku kepentingan. Sintaksis dalam penulisan story dapat dibuat template yang menjawab pertanyaan siapa (who), apa (what/action) dan mengapa (why)

+
who -> As a <user> 
+what -> I want to <be able to do ABC>
+why -> So that <XYZ can be done>
+

Contoh Story adalah “Sebagai pengguna, saya ingin dapat mengunggah gambar profil saya.”

+

Bug

+

Bug adalah tiket yang digunakan untuk melacak masalah atau kesalahan dalam perangkat lunak. Bug dapat muncul saat pengembangan perangkat lunak atau dalam tahap pengujian. Tiket Bug berisi informasi tentang masalah yang ditemukan, termasuk deskripsi, langkah-langkah untuk mengulang masalah, dan prioritas. Tim pengembangan menggunakan tiket Bug untuk memperbaiki masalah dan menguji perbaikan yang diimplementasikan.

+

Contoh Bug adalah “Tombol ‘Simpan’ tidak berfungsi saat mengedit profil pengguna.”

+

Task

+

Task adalah tiket yang mewakili tugas-tugas kecil yang perlu diselesaikan untuk menyelesaikan Story atau Epic. Task dapat diberikan kepada anggota tim yang bertanggung jawab untuk menyelesaikannya.

+

Biasanya, Task lebih terperinci, bersifat teknis dan memiliki waktu pengerjaan yang lebih singkat dibandingkan dengan Story atau Epic. Dalam proyek pengembangan perangkat lunak misalnya, Task mewakili aktivitas teknis, seperti mendesain diagram, menulis kode untuk membuat fungsionalitas tertentu, menguji perangkat, atau menyiapkan kumpulan data. Task digunakan sebagai referensi commit (menggunakan ID issue Jira) dan dapat berkaitan dengan sebuah branch pada git.

+

Contoh Task adalah “Membuat halaman pengaturan profil pengguna” atau “Mengimplementasikan validasi input pada formulir pendaftaran.”

+

Subtask

+

Subtask adalah tiket yang digunakan untuk memecah Task menjadi bagian yang lebih kecil dan terpisah. Subtask membantu dalam mengorganisir pekerjaan dan membaginya ke dalam tugas-tugas yang lebih mudah dikelola.

+

Referensi:

+

Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2023/07/apa-itu-guid/index.html b/2023/07/apa-itu-guid/index.html new file mode 100644 index 00000000..74828d25 --- /dev/null +++ b/2023/07/apa-itu-guid/index.html @@ -0,0 +1,101 @@ +Memahami GUID (Globally Unique Identifier) dan Penggunaannya | Dev Jurnal

Memahami GUID (Globally Unique Identifier) dan Penggunaannya

Dalam pengembangan perangkat lunak, sering kali kita memerlukan identifier unik yang dapat membedakan setiap entitas atau objek. Salah satu caranya adalah dengan menggunakan GUID (Globally Unique Identifier). Apa itu GUID, bagaimana GUID bekerja, dan bagaimana kita dapat menggunakannya dalam pengembangan perangkat lunak.

+
    +
  1. +

    Apa itu GUID?

    +

    GUID adalah singkatan dari Globally Unique Identifier. Secara sederhana, GUID adalah sebuah nilai yang unik secara global. GUID terdiri dari angka dan huruf yang disusun dalam format tertentu. Setiap GUID dijamin unik di seluruh dunia, sehingga sangat jarang terjadi kemungkinan duplikat. GUID sering digunakan dalam berbagai konteks, seperti basis data, sistem jaringan, dan pengembangan perangkat lunak.

    +
  2. +
  3. +

    Bagaimana GUID Dibuat?

    +

    GUID dibuat menggunakan algoritma yang kompleks. GUID memiliki panjang tetap sebesar 128 bit (16 byte) dan biasanya diwakili dalam format alfanumerik yang terdiri dari 32 karakter heksadesimal yang dipisahkan oleh tanda hubung dengan susunan 8-4-4-4-12.

    +

    Proses pembuatan GUID melibatkan kombinasi waktu saat pembuatan, alamat jaringan, dan nilai acak lainnya. Hal ini memastikan keunikan GUID di seluruh dunia dan mengurangi kemungkinan duplikat yang sangat rendah.

    +
  4. +
  5. +

    Penggunaan GUID dalam Pengembangan Perangkat Lunak

    +

    GUID memiliki berbagai penggunaan yang bermanfaat dalam pengembangan perangkat lunak. Beberapa penggunaan GUID yang umum meliputi:

    +
      +
    • Identifikasi Unik: GUID digunakan untuk memberikan identifikasi unik pada entitas atau objek dalam sistem perangkat lunak. Misalnya, GUID digunakan sebagai ID unik untuk rekaman dalam basis data atau sebagai identifier unik untuk objek dalam program.
    • +
    • Replikasi Data: GUID digunakan untuk memastikan keunikan data dalam sistem yang direplikasi. Dalam situasi di mana beberapa salinan data ada di berbagai tempat, GUID memungkinkan sistem untuk mengidentifikasi dan melacak salinan yang tepat.
    • +
    • Keamanan dan Enkripsi: GUID digunakan dalam protokol keamanan dan enkripsi untuk memberikan identifikasi dan kunci yang unik. GUID dapat digunakan sebagai identitas pengguna, token otentikasi, atau kunci enkripsi yang unik.
    • +
    • Pelacakan Log dan Audit: GUID digunakan untuk melacak dan memantau aktivitas dalam sistem. Dalam log dan audit trail, GUID digunakan untuk mengidentifikasi dan melacak entitas yang terlibat dalam aktivitas tertentu.
    • +
    +
  6. +
  7. +

    Kelebihan GUID

    +
      +
    • Keunikan Global: GUID menjamin keunikan global yang tinggi, membuatnya sangat cocok untuk penggunaan di seluruh dunia.
    • +
    • Pembuatan Mandiri: GUID dapat dibuat secara mandiri tanpa perlu koordinasi dengan sistem lain. Ini memungkinkan pembuatan GUID dengan cepat dan efisien.
    • +
    • Skala yang Tinggi: GUID dapat digunakan untuk mengelola jumlah data yang sangat besar dengan kemungkinan duplikat yang hampir nol.
    • +
    +
  8. +
  9. +

    Keterbatasan GUID

    +
      +
    • Panjang: GUID memiliki panjang tetap sebesar 128 bit, yang membuatnya lebih panjang daripada identifier lainnya seperti nomor integer atau string pendek.
    • +
    • Tidak Dapat Mudah Dibaca: Representasi GUID dalam format alfanumerik tidak mudah dibaca oleh manusia. GUID lebih cocok untuk penggunaan internal dan di dalam sistem daripada untuk ditampilkan kepada pengguna.
    • +
    +
  10. +

Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2023/07/belajar-dengan-metode-feynman/index.html b/2023/07/belajar-dengan-metode-feynman/index.html new file mode 100644 index 00000000..b977ce4a --- /dev/null +++ b/2023/07/belajar-dengan-metode-feynman/index.html @@ -0,0 +1,74 @@ +Belajar Apapun dengan Metode Feynman | Dev Jurnal

Belajar Apapun dengan Metode Feynman

Teknik Feynman didasarkan pada pendekatan yang diambil oleh fisikawan terkenal, Richard Feynman, yang terkenal dengan kemampuannya dalam menjelaskan konsep-konsep yang kompleks secara sederhana dan jelas. Mari kita jelajahi langkah-langkah teknik Feynman untuk meningkatkan pemahaman kita.

+
    +
  1. Tahap pertama dalam teknik Feynman adalah melakukan penelitian tentang topik yang ingin dipelajari. Baca buku, artikel, atau sumber-sumber lain yang relevan untuk memperoleh pemahaman dasar tentang materi tersebut. Buat catatan penting selama proses penelitian ini.
  2. +
  3. Langkah selanjutnya adalah mencoba mengajarkan topik tersebut kepada seseorang, seolah-olah Kita sedang menjelaskan kepada anak berusia lima tahun. Pendekatan ini akan memaksa Kita untuk menyederhanakan konsep-konsep yang rumit menjadi bentuk yang lebih mudah dimengerti. Gunakan bahasa yang sederhana dan contoh yang konkret untuk menjelaskan ide-ide tersebut. Jika Kita mengalami kesulitan dalam menjelaskan sesuatu, itu berarti ada celah dalam pemahaman Kita yang perlu diisi.
  4. +
  5. Isilah celah-celah dalam pengetahuan Kita melalui penelitian tambahan. Identifikasi area-area yang kurang Kita mengerti sepenuhnya dan coba perbaiki pemahaman Kita tentang konsep-konsep tersebut. Gunakan sumber daya tambahan seperti video, tutorial online, atau diskusi dengan orang yang lebih ahli di bidang tersebut.
  6. +
  7. Setelah Kita memperoleh pemahaman yang lebih baik tentang topik tersebut, langkah selanjutnya adalah menyederhanakan dan meningkatkan penjelasan Kita. Ambil catatan yang Kita buat pada tahap pertama dan perbaiki serta sederhanakan penjelasan tersebut. Gunakan contoh yang lebih relevan dan ilustratif untuk mengilustrasikan konsep-konsep yang Kita pelajari. Pastikan penjelasan Kita tetap sederhana dan mudah dimengerti oleh orang lain.
  8. +
  9. Langkah terakhir dalam teknik Feynman adalah mengulangi langkah-langkah sebelumnya. Kembali ke tahap kedua dan coba ajarkan materi tersebut kepada orang lain. Dalam proses ini, Kita akan menemukan bahwa ada area-area yang masih membingungkan atau perlu diperbaiki. Ulangi siklus ini sampai Kita dapat menjelaskan topik dengan jelas dan tanpa kesulitan.
  10. +
+

Dengan menerapkan teknik Feynman, Kita akan dapat mengembangkan pemahaman yang mendalam tentang topik yang sedang Kita pelajari. Pendekatan ini membantu Kita untuk merangkum, menyederhanakan, dan mengkomunikasikan konsep-konsep dengan jelas. Selain itu, dengan mengajarkan kepada orang lain, Kita juga dapat menguji pemahaman Kita sendiri dan menemukan celah-celah dalam pengetahuan Kita.

+

Dengan mengadopsi metode ini, Kita akan memperoleh pemahaman yang lebih dalam dan memperkuat fondasi pengetahuan Kita. Terus berlatih dan jangan takut untuk menyederhanakan dan mengajarkan apa yang Kita pelajari. Blog ini juga merupakan upaya latihan dalam menyederhanakan dan mengajarkan apa yang sudah saya pelajari :)


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2023/07/install-rubygems-error-this-file-is-owned-by-your-os/index.html b/2023/07/install-rubygems-error-this-file-is-owned-by-your-os/index.html new file mode 100644 index 00000000..f56cd874 --- /dev/null +++ b/2023/07/install-rubygems-error-this-file-is-owned-by-your-os/index.html @@ -0,0 +1,89 @@ +Install Rubygems Error: This file is owned by your OS, not by rubygems upstream | Dev Jurnal

Install Rubygems Error: This file is owned by your OS, not by rubygems upstream

Saya mencoba menginstall Jekyll untuk membuat blog static di GitHub pages. Karena itu saya membutuhkan Rubygems, package manager untuk bahasa pemrograman Ruby yang digunakan untuk pengembangan aplikasi web. Ketika memulai langkah instalasi, saya menghadapi beberapa masalah. Berikut kronologinya dan langkah-langkah untuk memperbaiki masalah ini.

+
    +
  1. Pertama-tama, saya mencoba menginstall Jekyll menggunakan perintah gem install jekyll. Namun, saya mendapatkan pesan error yang mengindikasikan bahwa Ruby saya perlu diperbarui (update).
  2. +
  3. Untuk mengatasi masalah ini, saya mencoba menginstall atau memperbarui Rubygems dengan menjalankan perintah gem update --system. Sayangnya, saya mendapatkan pesan error ini: ”This file is owned by your OS, not by rubygems upstream”. Pesan ini mengindikasikan bahwa file tersebut dimiliki oleh sistem operasi (OS) saya, bukan oleh Rubygems.
  4. +
  5. +

    Setelah melakukan beberapa penelitian, saya mengetahui bahwa masalah ini terjadi karena beberapa komponen Ruby telah terinstall dengan menggunakan package manager seperti Synaptic Package Manager atau apt-get.

    +

    Dalam kasus tersebut maka hal pertama yang harus saya lakukan adalah menghapus instalasi Ruby terlebih dahulu. Perintah apt-get tampaknya tidak berhasil menghapus sesuai ekspektasi, lalu saya menghapus semua instalasi Ruby menggunakan Synaptic Package Manager.

    +
      +
    • Cari dengan kata kunci “ruby”
    • +
    • Centang item dan pilih ”completely remove installation
    • +
    +
  6. +
  7. Setelah menghapus semua instalasi Ruby yang ada, langkah selanjutnya adalah menginstall Ruby secara langsung menggunakan metode kompilasi dan pembangunan (compile & build) dari source code-nya. Kita dapat mengunduh source code Ruby dari situs resmi Ruby di https://www.ruby-lang.org. Pilih sesuai dengan sistem operasi yang kita gunakan. Saya menggunakan Ubuntu jadi saya memilih tar.gz
  8. +
  9. Setelah kita mengunduh source code Ruby, ekstrak file arsip tersebut ke direktori yang diinginkan. Kemudian, buka terminal dan arahkan ke direktori yang berisi file kode sumber Ruby yang diekstrak.
  10. +
  11. +

    Di terminal, jalankan perintah berikut untuk mengonfigurasi proses kompilasi dan instalasi Ruby:

    +
    ./configure
    +make
    +sudo make install
    +

    Perintah ./configure akan melakukan konfigurasi sesuai dengan sistem operasi kita. Setelah proses konfigurasi selesai, jalankan perintah make untuk mengompilasi kode sumber Ruby. Terakhir, jalankan perintah sudo make install untuk menginstal Ruby ke sistem kita.

    +
  12. +
  13. Setelah instalasi selesai, coba jalankan perintah ruby -v di terminal untuk memastikan bahwa Ruby telah terinstal dengan sukses dan versi yang tepat.
  14. +
  15. Sekarang, kita dapat mencoba menginstall atau memperbarui Rubygems dengan menjalankan perintah gem update --system. Kali ini, kita seharusnya tidak lagi mendapatkan pesan kesalahan ”This file is owned by your OS, not by rubygems upstream“.
  16. +
+

Setelah mengikuti langkah-langkah di atas, saya berhasil mengatasi masalah yang muncul saat menginstall Rubygems. Sekarang saya dapat melanjutkan proses instalasi Jekyll dan menggunakan Rubygems untuk membuat static web dengan lancar.


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2023/07/meningkatkan-produktivitas-dengan-chatgpt/index.html b/2023/07/meningkatkan-produktivitas-dengan-chatgpt/index.html new file mode 100644 index 00000000..64ec4b35 --- /dev/null +++ b/2023/07/meningkatkan-produktivitas-dengan-chatgpt/index.html @@ -0,0 +1,96 @@ +Meningkatkan Produktivitas Pengembangan Perangkat Lunak dengan ChatGPT | Dev Jurnal

Meningkatkan Produktivitas Pengembangan Perangkat Lunak dengan ChatGPT

ChatGPT adalah alat berbasis kecerdasan buatan (Artifical Intelligence/AI) yang sedang merevolusi cara kerja pengembang perangkat lunak. Mari kita lihat bagaimana ChatGPT dapat meningkatkan efisiensi pekerjaan sehari-hari kita dan memberikan keunggulan kompetitif. Temukan bagaimana cara memanfaatkan kekuatan ChatGPT dan tetap berada di depan dalam dunia pengembangan perangkat lunak yang terus berkembang.

+
    +
  1. +

    Membantu Memahami Kode yang Membingungkan

    +

    Salah satu cara paling umum yang digunakan oleh pengembang perangkat lunak adalah menggunakan ChatGPT untuk membantu memahami kode yang membingungkan. ChatGPT memiliki pengetahuan yang luas tentang bahasa pemrograman dan dapat menjelaskan cara kerja bagian-bagian kode tertentu dengan cara yang sederhana. Dengan bantuan ChatGPT, kita dapat memahami kode yang sedang kita kerjakan dengan lebih baik dan merasa lebih percaya diri ketika berurusan dengan kode yang kompleks.

    +
  2. +
  3. +

    Menemukan Kesalahan dan Melakukan Review Kode

    +

    ChatGPT dapat membantu kita menemukan kesalahan di dalam kode dan memberikan saran perbaikan. Ketika kita bekerja pada suatu proyek, seringkali kita menemukan bahwa sesuatu tidak berjalan seperti yang diharapkan. ChatGPT dapat melihat kode kita dan menunjukkan kesalahan atau area yang mungkin perlu diperbaiki. Ini juga dapat memberikan saran tentang cara membuat kode kita lebih baik.

    +
  4. +
  5. +

    Menerjemahkan Kode antar Bahasa Pemrograman

    +

    ChatGPT juga dapat membantu kita menerjemahkan kode dari satu bahasa pemrograman ke bahasa pemrograman lain. Ini sangat berguna jika kita mendapatkan solusi dalam satu bahasa, tetapi proyek kita menggunakan bahasa pemrograman yang berbeda. ChatGPT memiliki pengetahuan tentang banyak bahasa pemrograman, sehingga dapat membantu kita melakukan perubahan yang diperlukan. Dengan bantuan ChatGPT, kita dapat mengubah kode dari satu bahasa ke bahasa lain dengan mudah. Hal ini menghemat waktu, membantu menghindari kesalahan saat dilakukan secara manual, dan juga memperluas pengetahuan kita tentang berbagai bahasa pemrograman.

    +
  6. +
  7. +

    Pembelajaran Bahasa Pemrograman Baru

    +

    ChatGPT dapat menjadi teman belajar saat kita mempelajari bahasa pemrograman baru. Misalnya, saat kita harus menyelesaikan sebuah proyek dalam bahasa Rust yang baru bagi kita. Kita dapat bertanya kepada ChatGPT bagaimana melakukannya. ChatGPT dapat memberikan bimbingan, contoh, dan bahkan memberi potongan kode untuk membantu kita memulai mengerjakan sesuatu. Dengan mengajukan pertanyaan-pertanyaan spesifik atau meminta contoh-contoh, kita dapat belajar cara menggunakan suatu library, fungsi, atau fitur bahasa pemrograman yang masih baru bagi kita. Dengan bantuan ChatGPT, kita dapat dengan cepat memahami lebih baik bahasa pemrograman baru tersebut dan menyelesaikan proyek kita dengan efisien.

    +
  8. +
  9. +

    Menulis Unit Test

    +

    ChatGPT dapat membantu kita menulis unit test untuk kode kita. Unit test penting karena membantu memastikan kode kita berfungsi dengan benar dan perubahan yang kita lakukan tidak merusak fungsionalitas yang ada. Menulis unit test yang baik dapat menjadi tantangan dan kadang-kadang membosankan, tetapi ChatGPT dapat membantu mempermudahnya. Dengan bantuan ChatGPT, kita dapat membuat unit test komprehensif untuk kode produksi dalam dunia nyata, memastikan kode kita berfungsi dengan benar dan mempertahankan tingkat kualitas perangkat lunak yang tinggi.

    +
  10. +
  11. +

    Mengubah dan Memperbaiki Kode

    +

    ChatGPT dapat membantu kita mengubah kode yang ada untuk menambahkan lebih banyak fungsionalitas. Dengan pemahaman ChatGPT tentang bahasa pemrograman dan konsep rekayasa perangkat lunak, ia dapat membantu kita meningkatkan kode kita dengan memberikan saran perubahan atau memberikan potongan kode baru. Dengan bantuan ChatGPT, kita dapat menghemat waktu, memastikan perubahan kita diimplementasikan dengan benar, dan belajar teknik baru untuk meningkatkan kode kita.

    +
  12. +
  13. +

    Menulis Dokumentasi dan Komentar

    +

    ChatGPT dapat membantu kita menulis dokumentasi dan komentar untuk kode kita. Dokumentasi dan komentar yang ditulis dengan baik sangat penting untuk mempertahankan keberlanjutan kode kita. ChatGPT dapat membantu kita menulis komentar dan dokumentasi yang jelas, ringkas, dan informatif, bahkan untuk kode dunia nyata yang kompleks. Dengan bantuan ChatGPT, kita dapat memastikan bahwa kode kita mudah dipahami dan dipelihara, sehingga lebih mudah diakses oleh pengembang lain.

    +
  14. +
+

ChatGPT adalah alat yang mengubah permainan bagi pengembang perangkat lunak. Ia dapat membantu kita menangani pekerjaan yang kompleks, memahami bahasa pemrograman baru, dan meningkatkan kode kita dengan efisien. Dengan memanfaatkan ChatGPT, kita dapat menjadi pengembang yang lebih baik dan membuat pekerjaan kita lebih menyenangkan. Namun, sebagaimana alat-alat lain yang tercipta di dunia, fungsinya adalah untuk membantu kita. Semua keputusan yang diambil dan hasil akhirnya bergantung kepada kita sebagai penggunanya.


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2023/07/pola-arsitektur-api-populer/index.html b/2023/07/pola-arsitektur-api-populer/index.html new file mode 100644 index 00000000..db1e120b --- /dev/null +++ b/2023/07/pola-arsitektur-api-populer/index.html @@ -0,0 +1,95 @@ +6 Pola Arsitektur API yang Populer Saat Ini | Dev Jurnal

6 Pola Arsitektur API yang Populer Saat Ini

Dalam pengembangan perangkat lunak modern, API (Application Programming Interfaces) memainkan peran yang penting. Mereka bertindak sebagai jembatan, komponen inilah yang membuat perangkat lunak yang berbeda dapat saling berkomunikasi dan berinteraksi.

+

API bertanggung jawab atas pertukaran data, pemanggilan fungsi, dan integrasi keseluruhan antara sistem perangkat lunak yang berbeda. Untuk memfasilitasi operasi-operasi ini, terdapat beberapa gaya arsitektur, masing-masing dengan filosofi desain dan kasus penggunaan masing-masing.

+
    +
  1. +

    SOAP

    +

    SOAP (Simple Object Access Protocol) adalah salah satu API tertua dan matang dalam industri. Ia menggunakan XML sebagai basisnya, dan digunakan secara luas dalam layanan keuangan dan gerbang pembayaran (payment gateway) di mana keamanan dan keKitalan menjadi kunci. Namun, jika Kita bekerja pada aplikasi mobile yang ringan atau prototipe cepat, SOAP mungkin terlalu rumit karena kompleksitas dan kelengkapan fiturnya.

    +
  2. +
  3. +

    RESTful API

    +

    API RESTful (Representational State Transfer) adalah tulang punggung internet saat ini. API jenis ini sangat populer, mudah diimplementasikan, dan menggunakan metode HTTP. Kebanyakan layanan web yang kita gunakan sehari-hari, seperti Twitter atau YouTube, didukung oleh API RESTful. Namun, perlu diingat, jika Kita membutuhkan data real-time atau beroperasi dengan model data yang sangat terhubung, REST mungkin bukan pilihan terbaik.

    +
  4. +
  5. +

    GraphQL

    +

    GraphQL bukan hanya gaya arsitektur, tetapi juga bahasa kueri yang memungkinkan klien untuk meminta data tertentu sesuai kebutuhan. Ini menghindari pengambilan data yang berlebihan atau kekurangan.

    +

    Kita hanya meminta data yang Kita butuhkan secara spesifik, yang mengarah pada komunikasi jaringan yang lebih efisien dan respon yang lebih cepat. GraphQL dikembangkan oleh Facebook untuk memberikan data yang efisien dan tepat kepada miliaran pengguna, dan sekarang digunakan oleh perusahaan seperti GitHub dan Shopify.

    +

    Fleksibilitas dan efisiensinya membuatnya menjadi pilihan yang kuat untuk aplikasi dengan kebutuhan data yang kompleks. Namun, belajar GraphQL membutuhkan waktu yang cukup lama dan mungkin terlalu berlebihan untuk aplikasi yang sederhana. Selain itu, GraphQL membutuhkan pemrosesan yang lebih banyak di sisi server karena kemampuannya dalam melakukan query yang fleksibel.

    +
  6. +
  7. +

    gRPC

    +

    gRPC (Google Remote Procedure Call) adalah kerangka kerja modern yang kinerjanya tinggi dan menggunakan Protocol Buffers. Ia menjadi favorit dalam arsitektur microservice. Perusahaan seperti Netflix menggunakan gRPC untuk mengelola komunikasi antar-layanan yang besar. Namun, jika Kita berurusan dengan klien browser, gRPC mungkin menimbulkan beberapa tantangan karena dukungan browser yang terbatas.

    +
  8. +
  9. +

    WebSocket

    +

    WebSocket berkaitan dengan koneksi real-time, dua arah, dan persisten. Ini sempurna untuk aplikasi obrolan langsung (chat) dan game real-time, di mana pertukaran data dengan latensi rendah menjadi penting. Namun, jika aplikasi Kita tidak membutuhkan data real-time, menggunakan WebSocket mungkin menjadi beban yang tidak perlu.

    +
  10. +
  11. +

    Webhook

    +

    Webhook berkaitan dengan panggilan HTTP yang didorong oleh peristiwa (event based trigger) dan operasi asinkron. Misalnya, GitHub menggunakan webhook untuk memberi tahu sistem lain ketika ada commit baru. Namun, ingatlah bahwa jika Kita membutuhkan komunikasi sinkron atau respons yang segera, webhook mungkin bukan pilihan terbaik.

    +
  12. +
+

Itulah rangkuman singkat tentang gaya arsitektur API yang paling umum digunakan. Seperti yang kita lihat, tidak ada satu gaya yang cocok untuk semua kasus. Sesuaikan pendekatan Kita dengan kebutuhan proyek yang unik. Pahami kelebihan dan kekurangan masing-masing arsitektur agar mendapatkan manfaat yang optimal dengan biaya paling rendah.


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2023/07/struktur-dan-komponen-url/index.html b/2023/07/struktur-dan-komponen-url/index.html new file mode 100644 index 00000000..1239109b --- /dev/null +++ b/2023/07/struktur-dan-komponen-url/index.html @@ -0,0 +1,132 @@ +Struktur URL: Memahami Komponen-Komponennya | Dev Jurnal

Struktur URL: Memahami Komponen-Komponennya

TL;DR

+

Contoh URL

+
https://blog.devjurnal.com:8080/subscribe?utm_source=menu#nowhere
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
https://= protocol
blog.devjurnal.com= domain name
:8080= port
/subscribe= path
?= query
utm_source=menu= parameters
#nowhere= fragments
+

URL (Uniform Resource Locator) adalah alamat yang digunakan untuk mengidentifikasi dan mengakses sumber daya di internet. URL memiliki struktur yang terdiri dari beberapa komponen penting. Mari kita lihat ringkasan tentang struktur URL dan apa arti dari setiap komponennya.

+
    +
  1. +

    Protokol (Protocol)

    +

    Protokol menentukan aturan dan format komunikasi yang digunakan untuk mengakses sumber daya di internet. Dalam contoh URL di atas, protokol yang digunakan adalah ”https://”. Protokol HTTPS digunakan untuk mengakses sumber daya melalui koneksi yang aman dan terenkripsi.

    +
  2. +
  3. +

    Nama Domain (Domain Name)

    +

    Nama domain merupakan identifikasi unik untuk mengarahkan ke alamat IP yang sesuai dengan server yang menghosting sumber daya yang ingin diakses. Pada contoh URL di atas, nama domain adalah “blog.devjurnal.com”. Nama domain ini mengarahkan ke server yang menyediakan konten atau sumber daya yang ingin diakses.

    +
  4. +
  5. +

    Port

    +

    Port adalah angka yang menentukan saluran khusus melalui mana klien dapat berkomunikasi dengan server yang dituju. Pada contoh URL di atas, angka “8080” adalah nomor port yang ditentukan untuk mengakses sumber daya di server tersebut. Port ini bersifat opsional dan biasanya tidak diperlukan jika menggunakan port standar seperti 80 untuk HTTP atau 443 untuk HTTPS.

    +
  6. +
  7. +

    Path

    +

    Path adalah bagian dari URL yang menunjukkan jalur ke sumber daya yang ingin diakses di dalam server. Pada contoh URL di atas, path adalah “/subscribe”. Path ini dapat menggambarkan struktur folder dan file pada server yang mengarahkan ke sumber daya yang diminta.

    +
  8. +
  9. +

    Query

    +

    Query adalah bagian URL setelah tanda tanya (”?”) yang digunakan untuk mengirimkan data tambahan ke server. Query biasanya berisi parameter dan nilainya yang digunakan oleh server untuk menghasilkan respons yang sesuai. Pada contoh URL di atas, query adalah “utm_source=menu”. Jika ada tambahan query, akan dilanjutkan dengan simbol ”&“. Parameter ini dapat memberikan informasi tambahan kepada server, seperti sumber lalu lintas pengguna.

    +
  10. +
  11. +

    Fragmen

    +

    Fragmen adalah bagian URL yang mengacu pada bagian tertentu dari halaman atau sumber daya yang diakses. Biasanya, fragmen diwakili oleh tanda pagar (”#”) diikuti dengan teks atau nama elemen tertentu. Pada contoh URL di atas, fragmen adalah “nowhere”. Fragmen ini berguna untuk langsung mengarahkan pengguna ke bagian tertentu dari halaman yang diakses.

    +
  12. +

Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2023/08/apa-itu-datadog-apm/index.html b/2023/08/apa-itu-datadog-apm/index.html new file mode 100644 index 00000000..f3cfef99 --- /dev/null +++ b/2023/08/apa-itu-datadog-apm/index.html @@ -0,0 +1,87 @@ +Mengoptimalkan Kinerja Aplikasi dengan DataDog APM | Dev Jurnal

Mengoptimalkan Kinerja Aplikasi dengan DataDog APM

Dalam dunia pengembangan perangkat lunak, memastikan kinerja aplikasi yang optimal adalah kunci kesuksesan. Untuk mencapai hal tersebut, kita perlu memantau dan menganalisis kinerja aplikasi secara terus-menerus. Salah satu alat yang dapat membantu kita dalam hal ini adalah DataDog APM (Application Performance Monitoring). Berikut ini adalah fitur-fitur penting dari DataDog APM dan bagaimana penggunaannya dapat mengoptimalkan kinerja aplikasi kita.

+
    +
  1. +

    Pemantauan Kinerja end-to-end

    +

    DataDog APM memberikan visibilitas end-to-end terhadap kinerja aplikasi kita. Alat ini melacak setiap permintaan dan respons yang terjadi dalam aplikasi, sehingga kita dapat memahami bagaimana setiap komponen bekerja dan berinteraksi. Dengan DataDog APM, kita dapat melihat waktu respons, durasi pemanggilan ke basis data, dan latensi jaringan. Hal ini memungkinkan kita untuk mengidentifikasi fluktuasi kinerja, mengidentifikasi bottlenecks, dan mengoptimalkan performa aplikasi secara keseluruhan.

    +
  2. +
  3. +

    Pelacakan Distribusi dan Konteks Transaksi

    +

    DataDog APM memungkinkan pelacakan distribusi dan konteks transaksi dalam aplikasi kita. Dengan fitur ini, kita dapat melacak perjalanan suatu transaksi melalui berbagai layanan dan komponen aplikasi. DataDog APM juga memungkinkan kita untuk menambahkan metadata tambahan ke dalam transaksi, seperti ID pengguna atau informasi pelacakan kustom lainnya. Hal ini sangat berguna dalam menelusuri dan menganalisis masalah atau gangguan kinerja yang terjadi dalam aplikasi kita.

    +
  4. +
  5. +

    Visualisasi dan Analisis yang Kuat

    +

    DataDog APM menyediakan visualisasi yang kuat untuk membantu kita memahami kinerja aplikasi secara visual. Dashboard interaktif memungkinkan kita untuk memantau metrik dan tren kinerja secara real-time. DataDog APM juga menawarkan fitur analisis yang kuat, termasuk pemetaan tren kinerja seiring waktu, pembandingan kinerja antar versi aplikasi, dan deteksi anomali otomatis. Dengan analisis ini, kita dapat mengidentifikasi masalah kinerja, mengoptimalkan kode, dan meningkatkan pengalaman pengguna.

    +
  6. +
  7. +

    Integrasi yang Luas

    +

    DataDog APM dapat dengan mudah diintegrasikan dengan berbagai teknologi dan lingkungan. Alat ini mendukung banyak bahasa pemrograman, framework, dan teknologi yang umum digunakan dalam pengembangan aplikasi. DataDog APM juga memiliki integrasi yang kuat dengan alat-alat lain dalam ekosistem DataDog, seperti pemantauan infrastruktur, log management, dan layanan lainnya. Integrasi yang luas ini memungkinkan kita untuk mendapatkan visibilitas dan pemahaman yang komprehensif tentang kinerja aplikasi kita.

    +
  8. +
  9. +

    Pemberitahuan dan Alarm

    +

    DataDog APM memungkinkan kita untuk mengatur pemberitahuan dan alarm yang dapat memberi tahu kita tentang masalah kinerja atau gangguan yang terjadi dalam aplikasi kita. Kita dapat mengonfigurasi ambang batas tertentu untuk metrik kinerja, seperti waktu respons yang melampaui batas tertentu atau jumlah permintaan yang tinggi. Ketika ambang batas tersebut tercapai, DataDog APM akan memberi tahu kita melalui pesan atau saluran komunikasi yang kita pilih. Hal ini memungkinkan kita untuk secara proaktif menangani masalah kinerja sebelum pengguna merasakannya.

    +
  10. +

Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2023/08/cara-belajar-lebih-baik-dan-lebih-cepat-sebagai-programmer/index.html b/2023/08/cara-belajar-lebih-baik-dan-lebih-cepat-sebagai-programmer/index.html new file mode 100644 index 00000000..a3d98c43 --- /dev/null +++ b/2023/08/cara-belajar-lebih-baik-dan-lebih-cepat-sebagai-programmer/index.html @@ -0,0 +1,78 @@ +Cara Belajar Lebih Baik dan Lebih Cepat sebagai Programmer | Dev Jurnal

Cara Belajar Lebih Baik dan Lebih Cepat sebagai Programmer

Belajar keterampilan baru adalah kunci untuk tetap relevan dan berkembang dalam karier di dunia rekayasa perangkat lunak yang berkembang pesat. Bagaimana cara belajar lebih baik dan lebih cepat sebagai seorang insinyur perangkat lunak? Artikel ini akan menguraikan lima strategi utama yang memastikan pembelajaran yang berkelanjutan dan pertumbuhan pribadi, sehingga membantu Kita meningkatkan proses pembelajaran.

+

1. Dorong Rasa Ingin Tahu

+

Sebagai manusia, rasa ingin tahu adalah bagian dari sifat kita. Setiap kali Kita menemukan sesuatu yang menarik di bidang Kita, penting untuk mengenali dan mengeksplorasinya lebih dalam. Ketika Kita menemukan topik atau konsep yang memicu minat Kita, catatlah segera. Gunakan aplikasi pencatat untuk mendokumentasikan apa yang membuat Kita penasaran dan mengapa Kita tertarik padanya. Dengan mencatat rasa ingin tahu Kita, Kita menciptakan motivasi pribadi untuk mempelajari materi pelajaran lebih mendalam. Tinjau kembali catatan Kita secara berkala untuk mengingatkan diri Kita tentang topik yang ingin Kita telusuri lebih lanjut.

+

2. Mulai dengan Segera

+

Mengalahkan kemalasan dan penundaan adalah hal yang sangat penting untuk mempercepat pembelajaran Kita. Alih-alih menunggu waktu yang tepat atau sumber daya terbaik, mulailah belajar sekarang juga. Saat Kita memulai perjalanan pembelajaran dari nol, segala sumber daya sangat berharga. Jangan buang waktu mencari sumber daya terbaik; sebaliknya, pelajari saja materi yang tersedia. Penting untuk mulai membangun pengetahuan dan familiaritas Kita dengan materi pelajaran. Memulai dengan segera memungkinkan Kita mendapatkan momentum dan membuat kemajuan.

+

3. Terapkan Langsung

+

Alih-alih hanya merancang rencana dalam pikiran Kita, fokuslah pada implementasi langsung. Sangat mudah untuk terjebak dalam euforia membuat konsep dan membayangkan ide tanpa mengambil tindakan nyata. Untuk menghindari jebakan ini, siapkan lingkungan pengembangan lokal Kita dan mulailah membuat kode.

+

Entah itu mempelajari bahasa pemrograman baru, menjelajahi database, atau teknologi lainnya, terlibatlah aktif dalam implementasi praktis. Hindari terperangkap dalam siklus tutorial yang tak berujung, di mana Kita terus menggunakan tutorial tanpa menerapkan apa yang telah Kita pelajari. Pastikan bahwa ide dan pengetahuan Kita diterjemahkan ke dalam keterampilan praktis.

+

4. Perkuat Fondasi

+

Untuk memahami konsep-konsep lanjutan secara efektif, penting untuk membangun fondasi yang kuat di dasar-dasarnya. Menghabiskan lebih banyak waktu pada konsep dasar dan secara bertahap maju ke topik yang lebih lanjut memungkinkan pemahaman yang lebih mendalam. Mulai dari nol mutlak dan secara bertahap tingkatkan pengetahuan dan keterampilan Kita akan mempermudah pemahaman konsep yang kompleks. Jangan terburu-buru menjelajahi topik lanjutan tanpa pemahaman yang kuat tentang dasar-dasarnya, hal ini dapat membuat frustrasi dan seringkali membuat kita ingin menyerah. Investasikan waktu untuk membangun fondasi yang kuat, dan itu akan membuka jalan untuk pemahaman konsep tingkat lanjut yang lebih mudah.

+

5. Time Boxing

+

Hindari kebosanan atau kehilangan fokus dengan melakukan beberapa kegiatan belajar secara bersamaan. Alih-alih hanya fokus pada satu topik, pilihlah dua atau tiga bidang minat untuk dipelajari secara paralel. Jika Kita merasa bosan atau terjebak dengan satu topik, beralihlah ke topik lain untuk sementara. Dengan mendiversifikasi upaya belajar Kita, Kita akan tetap termotivasi dan membuat kemajuan di berbagai bidang. Namun, penting untuk menetapkan batasan dan batas waktu untuk setiap pengejaran. “Time boxing” memungkinkan Kita untuk mengevaluasi kemajuan Kita secara berkala dan memutuskan apakah akan melanjutkan atau mengalihkan fokus Kita.

+

Sumber: +How to learn better and faster as a software engineer?


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2023/08/cara-programmer-junior-ke-senior/index.html b/2023/08/cara-programmer-junior-ke-senior/index.html new file mode 100644 index 00000000..613e7040 --- /dev/null +++ b/2023/08/cara-programmer-junior-ke-senior/index.html @@ -0,0 +1,117 @@ +Cara Programmer Junior menjadi Senior 1 | Dev Jurnal

Cara Programmer Junior menjadi Senior 1

Memulai perjalanan sebagai programmer adalah momen yang menyenangkan. Kita mempelajari hal-hal baru dan akhirnya melihat kode Kita dipublikasikan. Namun, seiring berjalannya waktu, Kita mungkin mulai memikirkan masa depan dan mempertimbangkan bagaimana cara mempersiapkan diri untuk menjadi seorang programmer senior, serta keterampilan dan kompetensi penting yang dibutuhkan untuk mencapai tujuan tersebut.

+

Kompetensi Teknis Utama untuk Kemajuan Karir

+

Menunjukkan pemahaman yang kuat dalam bidang teknis sangat penting untuk langkah selanjutnya dalam karier Kita. Menguasai dasar-dasar pemrograman, struktur data, algoritma, dan praktik pengembangan perangkat lunak adalah hal yang sangat penting. Fokuslah pada penulisan kode yang bersih dan mudah dipelihara dengan mengikuti praktik terbaik untuk pengujian, pengoptimalan kinerja, dan skalabilitas.

+

Namun, menjadi seorang pengembang perangkat lunak yang kuat hanya akan membawa Kita sejauh ini. Untuk berhasil sebagai seorang senior engineer, rekan kerja, manajer, dan sponsor Kita juga harus mengakui kualitas pekerjaan Kita serta kemampuan Kita merancang dan mengembangkan solusi untuk masalah yang kompleks. Mencatat dan mendokumentasikan kesuksesan Kita melalui pull request dapat membantu memberikan bukti tentang pengetahuan terapan Kita (ini juga bisa dimasukkan dalam dokumen kebanggaan, yang akan dibahas nanti).

+

Hubungkan Antara Teknik dan Pendapatan di dalam Bisnis

+

Memiliki pemahaman yang kuat tentang domain bisnis Kita akan membantu Kita mengkontekstualisasikan masalah yang Kita selesaikan, memahami dampak pekerjaan Kita pada perusahaan, dan mengidentifikasi serta memilih tugas yang tepat. Konsistensi dalam memberikan pekerjaan berkualitas tinggi adalah kunci untuk menunjukkan kemampuan Kita untuk memenuhi atau bahkan melampaui harapan.

+

Jika Kita ingin naik jabatan di perusahaan, Kita memerlukan pemahaman mendalam tentang bagaimana logika teknis berinteraksi dengan logika bisnis perusahaan Kita. Dengan kata lain, bagaimana teknologi yang Kita kerjakan terkait dengan pendapatan perusahaan? Pendekatan dalam pengambilan keputusan teknik akan berbeda antara perusahaan yang bergantung pada pendapatan dari periklanan dan perusahaan yang berbasis pada model langganan. Memahami ini akan membantu Kita menentukan area di mana Kita bisa mengembangkan keterampilan Kita.

+

Tunjukkan Pemahaman Kita

+

Ada berbagai cara untuk menunjukkan pemahaman Kita tentang domain bisnis dan potensi kepemimpinan Kita. Salah satunya adalah dengan mengidentifikasi peluang untuk peningkatan secara bertahap dengan mengamati proses saat ini secara cermat dan menemukan cara untuk memperbaikinya. Kita juga dapat membuat cerita pengguna (user story), yang akan membantu menyoroti kebutuhan pengguna yang dapat menjadi landasan untuk perbaikan produk.

+

Berpartisipasi dalam mengulas kode (code review) memberikan kesempatan untuk memberikan umpan balik konstruktif kepada anggota tim Kita dan menunjukkan kemampuan Kita dalam kepemimpinan dan kerjasama yang efektif. Selain itu, Kita dapat bergabung dengan tim lain untuk mengatasi tantangan teknis dan menunjukkan kemauan Kita untuk bekerja lintas kelompok. Terakhir, manfaatkan ruang gerak di tempat yang Kita lihat dan tawarkan solusi untuk membangun kepercayaan pada produk.

+

Buat “Dokumen Kebanggaan”

+

“Dokumen kebanggaan” adalah cara untuk menunjukkan keahlian Kita dan mencatat pencapaian Kita. Dokumen ini akan sangat berharga saat menulis ulasan diri Kita, dan juga dapat dibagikan kepada pimpinan Kita ketika membahas tujuan profesional dan perkembangan menuju promosi. Dokumen ini harus mencakup:

+
    +
  1. +

    Proyek yang Sudah Diselesaikan

    +

    Cantumkan semua proyek yang pernah Kita kerjakan, termasuk teknologi yang digunakan, tujuan proyek, dan yang paling penting, hasil yang telah dicapai. Fokus pada proyek yang diselesaikan sebagai bagian dari tim atau yang memiliki dampak nyata pada kebutuhan bisnis.

    +
  2. +
  3. +

    Keterampilan Teknis

    +

    Cantumkan keterampilan teknis yang telah Kita kembangkan atau tingkatkan dari waktu ke waktu. Ini bisa termasuk bahasa pemrograman, kerangka kerja pengembangan perangkat lunak (framework), atau teknologi lainnya.

    +
  4. +
  5. +

    Pengembangan Profesional

    +

    Sertakan catatan pelatihan, kursus, dan sertifikasi yang telah Kita selesaikan untuk menunjukkan komitmen Kita terhadap pembelajaran berkelanjutan dan pertumbuhan profesional.

    +
  6. +
  7. +

    Pencapaian dan Pengakuan

    +

    Dokumentasikan setiap pencapaian atau pengakuan penting yang telah Kita raih, seperti menyelesaikan proyek lebih cepat dari jadwal atau berhasil memperbaiki bug yang rumit.

    +
  8. +
  9. +

    Umpan Balik dan Pengakuan

    +

    Rinci setiap umpan balik atau pengakuan yang telah Kita terima dari kolega atau atasan, seperti ulasan kinerja yang positif, pengakuan atas pekerjaan yang luar biasa, atau pujian atas kontribusi Kita pada tim.

    +
  10. +
  11. +

    Kontribusi Open Source

    +

    Tunjukkan kontribusi Kita pada proyek open source dan kerja sukarela lainnya, karena ini menunjukkan kesediaan Kita untuk berbagi pengetahuan dan berkolaborasi.

    +
  12. +
+

Keterampilan Komunikasi dan Kolaborasi yang Efektif

+

Keterampilan komunikasi dan kolaborasi yang efektif sangat penting bagi seorang programmer junior yang bercita-cita menjadi seorang senior. Saat Kita naik jabatan dalam karier, Kita diharapkan untuk bekerja dengan tim lintas fungsi, mengelola proyek, dan berkomunikasi tentang solusi teknis kepada pihak yang bukan ahli di bidang teknologi.

+

Kita juga perlu tahu cara berkomunikasi dengan audiens eksekutif, yang berarti Kita harus memiliki pesan yang jelas dan ringkas yang berfokus pada inti masalah. Selain itu, Kita dapat mengandalkan keterampilan Kita untuk mempengaruhi hasil teknis selama rapat. Sebagai contoh, ketika klien baru-baru ini meminta lebih banyak kontrol atas filter kata-kata kotor mereka, saya menciptakan filter kata-kata kotor yang dapat disesuaikan sehingga mereka dapat menambahkan kata-kata baru melalui array.

+

Relawan untuk Membimbing dan Bergabung dengan Karyawan Baru

+

Sebagai seorang mentor, Kita dapat membantu anggota tim baru beradaptasi dengan cepat dengan peran mereka, memberikan bimbingan dan dukungan kepada mereka, dan menciptakan lingkungan yang ramah untuk pertumbuhan dan pembelajaran pribadi. Menjadi seorang mentor menunjukkan kemampuan Kita untuk bekerja dengan baik dengan orang lain dan juga menunjukkan keterampilan komunikasi yang kuat.

+

Pada saat yang sama, Kita memerlukan dukungan sponsor dan mentor Kita sendiri untuk membantu Kita menguasai keterampilan yang kompleks, mendapatkan kesempatan pertumbuhan dalam perusahaan, dan mendapatkan visibilitas yang Kita butuhkan untuk dipromosikan. Ini sangat penting karena Kita tidak akan dapat mencapai tujuan ini sendirian.

+ +

Saat Kita maju ke peran senior, Kita harus memberikan contoh komunikasi dan kolaborasi yang efektif kepada junior. Menulis dokumentasi yang jelas dan ringkas menunjukkan dedikasi Kita untuk memastikan bahwa informasi dikomunikasikan dengan efektif dan konsisten.

+

Dokumentasi yang baik tidak hanya menambahkan lapisan keamanan teknis yang penting bagi tim, tetapi juga menghemat waktu, mencegah kesalahan, dan memberikan referensi bagi anggota tim dan pihak non-teknis. Selain itu, menulis dokumentasi juga menunjukkan bahwa Kita bersedia melakukan tugas-tugas yang mungkin kurang disukai orang lain, yang merupakan ciri dari seorang pemain tim yang baik.

+

Teruslah Belajar

+

Seperti yang mungkin sudah Kita alami, dunia teknologi berkembang dengan cepat, dan Kita harus terus belajar dan mengembangkan keterampilan untuk tetap relevan dalam industri. Untuk berhasil dalam peran senior, tunjukkan kualitas kerja berdasarkan pembelajaran tersebut yang menunjukkan kemajuan Kita menuju kepemimpinan.

+

Tetap up-to-date dengan menghadiri acara industri, terlibat dalam komunitas teknis (seperti GitHub, Stack Overflow, atau HackerNews), dan terhubung dengan sesama profesional. Di luar jaringan, komunitas ini memberikan kesempatan untuk mempromosikan pencapaian tim Kita secara eksternal, yang menunjukkan kepada kolega senior komitmen Kita terhadap arah perusahaan.

+

Terakhir, ingatlah bahwa peningkatan karier membutuhkan waktu dan dedikasi. Kita harus sabar, gigih, dan bersedia melakukan pekerjaan yang diperlukan untuk berhasil. Maju dari insinyur junior menjadi senior memerlukan keterampilan teknis, kepemimpinan, kepemilikan proyek, komunikasi yang efektif, kolaborasi, pemahaman domain bisnis, kinerja tinggi, dan pemikiran inovatif. Dan Kita sudah memiliki semua itu. Selamat berjuang dan semoga sukses dalam perjalanan menuju kesuksesan karir sebagai programmer senior!

+

Sumber: +Junior to senior: An action plan for engineering career success


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2023/08/memahami-dan-mengelola-burnout/index.html b/2023/08/memahami-dan-mengelola-burnout/index.html new file mode 100644 index 00000000..93491db9 --- /dev/null +++ b/2023/08/memahami-dan-mengelola-burnout/index.html @@ -0,0 +1,106 @@ +Memahami Burnout dan Cara Mengelolanya untuk Kesehatan Mental | Dev Jurnal

Memahami Burnout dan Cara Mengelolanya untuk Kesehatan Mental

Dalam kehidupan yang sibuk dan tuntutan pekerjaan yang tinggi, sering kali kita mengalami burnout atau kelelahan yang parah. Burnout dapat berdampak buruk pada kesehatan fisik dan mental kita. Dalam artikel ini, kita akan membahas pengalaman burnout, tahapan-tahapan yang terjadi, dan beberapa tips dan trik untuk mengelola burnout agar dapat menjaga kesehatan mental kita.

+

Tahapan Burnout

+
    +
  1. +

    Fase bulan madu

    +

    Tahap di mana kita merasa sangat antusias dan ingin menyelesaikan semua hal yang selama ini ingin kita kerjakan. Kita mengambil lebih banyak pekerjaan dan mengatakan ya dengan penuh percaya diri untuk semuanya karena optimis akan kemampuan kita.

    +
  2. +
  3. +

    Stres

    +

    Stres ini bisa terjadi karena kita mulai menyadari kurangnya waktu yang cukup untuk menyelesaikan semua pekerjaan yang kita miliki. Kita merasa cemas karena tidak bisa menyelesaikan hal-hal seperti yang kita biasa selesaikan sebelumnya, dan sekarang kita merasa kewalahan dengan banyaknya pekerjaan.

    +
  4. +
  5. +

    Stres kronis

    +

    Kondisi ini muncul ketika kita mulai menunda pekerjaan-pekerjaan yang tertinggal, akhirnya semua menjadi menumpuk dan kita merasa ragu apakah kita mampu melakukannya. Rasa yang meragukan diri sendiri menyerang, imposter syndrome, yang membuat kita bertanya-tanya apakah kita benar-benar mampu menjalani pekerjaan impian yang kita bayangkan. Mungkin saya tidak mampu melakukannya lagi.

    +
  6. +
  7. +

    Kehilangan kepercayaan diri

    +

    Ini adalah tahap yang paling umum dan mengarah pada tahap terburuk yaitu burnout. Burnout awal ini adalah yang terburuk karena kita kehilangan identitas sebagai pribadi dan lupa untuk menikmati hal-hal yang kita sukai. Hobi, teman, dan kehidupan kita sendiri terasa terputus karena kita hanya fokus pada pekerjaan. Tahap ini sangat buruk, tetapi sebenarnya setiap tahap burnout buruk. Hal ini berdampak merugikan pada kesehatan fisik dan mental kita.

    +
  8. +
  9. +

    Burnout parah

    +

    Tahap terakhir yang umum dialami orang setelah burnout adalah burnout yang parah di mana kita bangun dan merasa tidak mampu menyelesaikan hal-hal, tetapi kita berusaha untuk tetap melakukannya. Ketika tidak ada tujuan akhir yang terlihat, itulah yang terburuk.

    +
  10. +
+

Mengelola Burnout

+

Ada beberapa hal yang dapat kita lakukan ketika merasakan stres atau berada dalam tahap burnout. Salah satunya adalah mengingat bahwa kita memiliki batasan dan prioritas, dan kita sendiri juga harus menjadi prioritas. Ketika kita mengambil sebuah pekerjaan, apakah itu cara kita menjaga kesehatan diri sendiri?

+

Kita perlu mengenali dan melakukan introspeksi, apakah kita menjadi orang yang terlalu berprestasi atau begitu ingin dihargai orang lain, atau apakah ini tentang kemampuan kita dalam menghadapi beban kerja.

+

Salah satu hal yang dapat dilakukan adalah menanyakan kepada diri sendiri, jika saya mengakui bahwa saya mampu melakukannya, dan memiliki waktu untuk menyelesaikan pekerjaan ini, maka saya akan melakukannya. Tetapi jika itu tidak benar - jika saya sudah memiliki 10 pekerjaan yang tertunda, yang seharusnya saya lakukan pada siklus sebelumnya - maka saya harus menghormati diri saya sendiri dan mengatakan bahwa saya tidak dapat melakukannya saat ini.

+

Meskipun sulit untuk mengatakan tidak dan ada perasaan takut mengecewakan orang lain, namun ketika kita mulai mengatakan tidak, kita akan merasa lebih baik. Penghalang kita akan berkurang dan kita akan merasa bersyukur karena orang lain bisa memahami.

+

Kemudian kita dapat lebih sering mengatakan tidak dan dengan jujur menyampaikan kepada orang lain bahwa saat ini kita tidak dapat melakukannya, tetapi mungkin jika mereka bertanya dalam seminggu setelah satu siklus selesai, kita bisa mengambil lebih banyak pekerjaan. Jika kita belum menyelesaikan pekerjaan-pekerjaan kita, maka ini bukan tanggung jawab kita, jadi kita dapat membantu, tetapi tidak menjamin untuk dapat menyelesaikannya.

+

Tips Singkat

+

Selain itu, ada beberapa tips singkat yang dapat dilakukan untuk mengurangi burnout. Salah satunya adalah dengan memikirkan empat senyawa kimia bahagia di otak kita yang membantu kita merasa rileks secara sementara. Ini disebut dengan singkatan DOSE, yaitu dopamine, oxytocin, serotonin, dan endorphins.

+
    +
  • Dopamine adalah senyawa yang memberikan perasaan senang (bayangkan saat kita mendapat sebuah hadiah) ketika kita merasa telah mencapai sesuatu, misalnya saat kita mendapatkan pengakuan atau penghargaan. Salah satu kegiatan yang dapat dilakukan adalah menuliskan tiga hal yang memotivasi atau hal-hal yang kita syukuri.
  • +
  • Oxytocin adalah senyawa yang memberikan perasaan hangat dan nyaman ketika kita merasa dicintai atau saat kita mendapatkan pelukan.
  • +
  • Serotonin dirilis saat kita tertawa, sehingga menimbulkan perasaan lebih santai dan rileks. Kita dapat menonton video lucu hewan atau bayi yang dapat memicu tawa dan meningkatkan kadar serotonin dalam tubuh.
  • +
  • Endorphin adalah senyawa yang dapat dilepaskan dengan cepat saat kita mulai bergerak. Cukup dengan menggerakkan tangan atau kaki, kita dapat merasakan efek endorphin dan merasa sedikit lebih baik.
  • +
+

Burnout adalah masalah serius yang dapat mempengaruhi kesehatan fisik dan mental kita. Lebih parahnya lagi, kita seringkali tidak menyadarinya. Penting untuk mengenali tanda-tanda dan tahapan-tahapan burnout agar dapat mengambil langkah-langkah yang tepat untuk mengelolanya.

+

Dengan mengatur batasan, menghormati diri sendiri, dan menemukan cara untuk mengurangi stres secara sementara, kita dapat menjaga kesehatan mental dan menghindari burnout yang lebih parah. Jagalah diri Kita dan jangan ragu untuk meminta bantuan jika diperlukan. Kesehatan mental kita adalah hal yang penting dan harus menjadi prioritas.

+

Sumber: +The 5 States of Burnout - Jenny Truong, DevRel & Head of Operations at Stately


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2023/08/memahami-secure-development-lifecycle/index.html b/2023/08/memahami-secure-development-lifecycle/index.html new file mode 100644 index 00000000..a479771b --- /dev/null +++ b/2023/08/memahami-secure-development-lifecycle/index.html @@ -0,0 +1,108 @@ +Memahami Secure Development Lifecycle (SDLC) | Dev Jurnal

Memahami Secure Development Lifecycle (SDLC)

Pengembangan perangkat lunak yang aman merupakan aspek krusial dalam era di mana serangan siber semakin canggih dan beragam. Perangkat lunak yang kita kembangkan tidak hanya harus memenuhi persyaratan fungsi, namun juga harus menjaga keamanan pengguna. Secure Development Lifecycle (SDLC) adalah pendekatan yang terstruktur untuk mengintegrasikan keamanan ke dalam seluruh siklus pengembangan perangkat lunak.

+

Apa itu Secure Development Lifecycle (SDLC)?

+

Secure Development Lifecycle (SDLC) adalah pendekatan metodologis dalam pengembangan perangkat lunak yang menempatkan keamanan sebagai prioritas sepanjang seluruh siklus hidup pengembangan. Tujuannya adalah untuk mencegah, mengidentifikasi, dan mengatasi kerentanan keamanan serta cacat perangkat lunak sejak awal, daripada mengatasi masalah setelah perangkat lunak sudah diimplementasikan.

+

Mengapa Secure Development Lifecycle Penting?

+
    +
  1. Mencegah Ancaman Awal: +Dengan mengintegrasikan keamanan sejak awal, kerentanan dan celah keamanan dapat diidentifikasi dan diperbaiki sebelum produk akhir diluncurkan, mencegah kemungkinan eksploitasi.
  2. +
  3. Mengurangi Biaya Perbaikan: +Memperbaiki masalah keamanan setelah implementasi dapat menghabiskan biaya dan waktu yang signifikan. SDLC membantu mengurangi biaya ini dengan mengatasi masalah di tahap awal pengembangan.
  4. +
  5. Mempertahankan Reputasi: +Kerentanan dan serangan siber dapat merusak reputasi perusahaan. SDLC membantu membangun kepercayaan dengan menghasilkan produk yang aman dan andal.
  6. +
  7. Kepatuhan Regulasi: +Banyak industri sekarang diatur oleh standar keamanan tertentu. SDLC membantu perusahaan mematuhi regulasi ini dengan mengintegrasikan keamanan dalam pengembangan.
  8. +
+

Langkah-langkah dalam Secure Development Lifecycle:

+
    +
  1. +

    Requirements (Persyaratan)

    +

    a. Security Classification (Klasifikasi Keamanan): Ini berarti menentukan seberapa pentingnya sistem atau perangkat lunak tersebut dalam hal keamanan. Apakah itu sangat rahasia, hanya boleh diakses oleh beberapa orang, atau bisa diakses oleh siapa saja.

    +

    b. Risk Assessment (Penilaian Risiko): Ini melibatkan mengidentifikasi dan menilai potensi masalah keamanan yang mungkin muncul. Dengan cara ini, kita dapat mengerti seberapa besar kemungkinan terjadinya masalah dan seberapa buruk dampaknya.

    +

    c. Security Requirements (Persyaratan Keamanan): Ini adalah aturan dan panduan yang harus diikuti untuk menjaga keamanan sistem atau perangkat lunak. Misalnya, mungkin ada persyaratan untuk pengguna harus memasukkan kata sandi yang kuat.

    +
  2. +
  3. +

    Design (Desain)

    +

    a. Threat Modelling (Pemodelan Ancaman): Ini adalah cara untuk merencanakan bagaimana sistem atau perangkat lunak mungkin diserang oleh pihak jahat. Dengan memahami potensi serangan, kita bisa merancang perlindungan yang lebih baik.

    +

    b. Design Review (Ulasan Desain): Ini melibatkan tim melihat kembali rencana desain untuk memastikan bahwa semua langkah yang tepat telah diambil untuk menjaga keamanan. Apakah ada celah yang terlewatkan?

    +
  4. +
  5. +

    Development (Pengembangan)

    +

    a. Secure Coding Guidelines (Panduan Koding Aman): Ini adalah aturan dan panduan yang harus diikuti oleh para pengembang ketika menulis kode. Tujuannya adalah untuk memastikan bahwa kode yang ditulis tidak memiliki kerentanan yang bisa dieksploitasi oleh penyerang.

    +

    b. Secure Code Scanning (Pemindaian Kode Aman): Ini adalah proses memeriksa kode yang ditulis untuk menemukan potensi masalah keamanan. Pemindaian dilakukan secara otomatis menggunakan alat khusus.

    +
  6. +
  7. +

    Testing (Pengujian)

    +

    a. Security Testing (Pengujian Keamanan): Ini adalah serangkaian pengujian yang dilakukan pada sistem atau perangkat lunak untuk menemukan celah atau kerentanan keamanan. Tujuannya adalah untuk memastikan bahwa sistem tahan terhadap serangan.

    +

    b. Code Review (Ulasan Kode): Ini melibatkan pengembang lain yang melihat kembali kode yang ditulis oleh seseorang. Tujuannya adalah untuk menemukan masalah dan memberikan saran perbaikan.

    +
  8. +
  9. +

    Deployment (Penerapan)

    +

    a. Penetration Testing (Pengujian Penetrasi): Ini melibatkan orang yang mencoba menyerang sistem atau perangkat lunak seperti penyerang sebenarnya. Tujuannya adalah untuk melihat seberapa tahan sistem terhadap serangan nyata.

    +

    b. Security Hardening (Penguatan Keamanan): Ini adalah langkah-langkah yang diambil untuk memperkuat sistem atau perangkat lunak agar lebih tahan terhadap serangan. Ini bisa termasuk mengatur konfigurasi yang lebih aman atau menutup celah keamanan yang ditemukan selama pengujian.

    +
  10. +
+

Dalam dunia yang semakin terhubung dan rentan terhadap serangan siber, mengadopsi Secure Development Lifecycle (SDLC) menjadi suatu keharusan. Memastikan bahwa keamanan terintegrasi dalam seluruh siklus hidup pengembangan adalah kunci untuk melindungi data sensitif, menjaga reputasi perusahaan, dan mengurangi risiko terhadap serangan siber. Dengan menerapkan langkah-langkah SDLC, perusahaan dapat menghasilkan perangkat lunak yang aman, handal, dan sesuai dengan regulasi keamanan yang relevan.


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2023/08/menulis-versi-package-dependency/index.html b/2023/08/menulis-versi-package-dependency/index.html new file mode 100644 index 00000000..5ea222fe --- /dev/null +++ b/2023/08/menulis-versi-package-dependency/index.html @@ -0,0 +1,90 @@ +Menulis Versi Package Dependency dalam Pengembangan Perangkat Lunak | Dev Jurnal

Menulis Versi Package Dependency dalam Pengembangan Perangkat Lunak

Pengembangan perangkat lunak modern seringkali melibatkan penggunaan banyak paket (package) atau pustaka (library) dari sumber eksternal. Ketergantungan paket ini memungkinkan pengembang untuk memanfaatkan fungsionalitas yang sudah ada tanpa perlu membuat semuanya dari awal. Namun, dalam pengelolaan dependency paket, salah satu hal yang penting adalah menentukan versi yang sesuai.

+

Mengapa Package Version Penting?

+

Ketika kita menggunakan paket atau pustaka dari pihak ketiga, sangat penting untuk memilih versi yang sesuai dengan proyek kita. Setiap versi mungkin memiliki perbaikan bug, peningkatan performa, atau bahkan perubahan fungsionalitas yang signifikan. Memilih versi yang tepat dapat mencegah konflik dan masalah yang tidak diinginkan dalam pengembangan perangkat lunak kita.

+

Menggunakan Format Semantic Versioning (SemVer)

+

Cara umum untuk menentukan versi dependency paket adalah melalui prinsip Semantic Versioning (SemVer). SemVer terdiri dari tiga angka yang menunjukkan “MAJOR.MINOR.PATCH”. Ketiga komponen ini memiliki arti sebagai berikut:

+
    +
  1. MAJOR: Ditingkatkan ketika kita melakukan perubahan yang tidak kompatibel dengan versi sebelumnya dalam API paket.
  2. +
  3. MINOR: Ditingkatkan ketika kita menambahkan fitur baru yang kompatibel dengan versi sebelumnya (backward compatible) dalam API paket.
  4. +
  5. PATCH: Ditingkatkan ketika kita membuat perbaikan yang kompatibel dengan versi sebelumnya (backward compatible) dalam API paket.
  6. +
+

Misalnya, jika paket memiliki versi “2.1.3”, artinya versi utama adalah 2, versi minor adalah 1, dan versi patch adalah 3.

+ +

File konfigurasi proyek seperti “package.json”, “composer.json atau “requirements.txt” biasanya digunakan untuk menulis daftar dependency paket. Berikut adalah contoh bagaimana kita dapat menulis dependency dengan menggunakan format SemVer:

+

package.json:

+
{
+  "dependencies": {
+    "nama-paket": "^1.2.0"
+  }
+}
+

requirements.txt:

+
nama-paket==1.2.0
+

Pada contoh di atas, tanda ^ pada “package.json” dan tanda == pada “requirements.txt” memberi tahu sistem manajemen paket untuk menggunakan versi yang kompatibel dengan versi yang ditentukan, namun tetap memperbolehkan peningkatan versi minor atau patch.

+

Menangani Versi Secara Hati-hati

+

Saat menulis versi dependency, penting untuk mempertimbangkan seberapa kritis paket tersebut terhadap proyek kita. Jika kita membutuhkan stabilitas, mungkin lebih baik untuk menentukan versi yang spesifik. Namun, jika kita ingin memanfaatkan perbaikan dan peningkatan baru, menggunakan tanda seperti ^ atau ~ dapat membantu kita tetap mendapatkan pembaruan tanpa mengorbankan stabilitas sepenuhnya.

+

Memantau Pembaruan Paket

+

Terkadang, pembaruan paket dapat mempengaruhi kinerja atau stabilitas proyek kita. Oleh karena itu, penting untuk secara berkala memeriksa pembaruan yang tersedia untuk dependency kita dan melakukan uji coba sebelum menerapkannya dalam produksi.


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2023/08/perbaikan-berkelanjutan-dengan-sprint-retrospective/index.html b/2023/08/perbaikan-berkelanjutan-dengan-sprint-retrospective/index.html new file mode 100644 index 00000000..a4e753f5 --- /dev/null +++ b/2023/08/perbaikan-berkelanjutan-dengan-sprint-retrospective/index.html @@ -0,0 +1,87 @@ +Perbaikan Berkelanjutan dengan Sprint Retrospective | Dev Jurnal

Perbaikan Berkelanjutan dengan Sprint Retrospective

Sprint Retrospective adalah sebuah seremoni penting di akhir setiap iterasi (sprint) dalam pengembangan perangkat lunak dengan pendekatan Agile. Apa itu Sprint Retrospective, mengapa hal ini begitu penting bagi kelancaran proyek, serta bagaimana melaksanakannya dengan efektif.

+

Apa Itu Sprint Retrospective?

+

Sprint Retrospective adalah pertemuan yang dilakukan di akhir setiap sprint dalam metodologi Agile, seperti Scrum. Tujuan dari pertemuan ini adalah untuk merefleksikan sprint yang baru saja selesai dan mengidentifikasi area yang perlu ditingkatkan untuk tim. Dalam waktu yang ditentukan, tim berkolaborasi untuk mengevaluasi proses pengembangan, memperkuat hal-hal positif yang telah dicapai, dan mengidentifikasi potensi masalah atau hambatan yang dapat dihindari pada sprint berikutnya.

+

Mengapa Sprint Retrospective Begitu Penting?

+

Sprint Retrospective memiliki peran krusial dalam pengembangan perangkat lunak yang sukses. Dengan refleksi dan evaluasi secara berkala, tim dapat terus memperbaiki cara kerja mereka, meningkatkan efisiensi, dan mengurangi risiko. Beberapa manfaat dari Sprint Retrospective antara lain:

+
    +
  1. Peningkatan Proses: Tim dapat mengidentifikasi proses pengembangan yang berhasil dan mempertahankannya, serta memperbaiki proses yang kurang efektif untuk meningkatkan produktivitas.
  2. +
  3. Peningkatan Komunikasi: Pertemuan ini memberikan kesempatan bagi setiap anggota tim untuk berbicara dan menyampaikan masukan mereka, membantu meningkatkan komunikasi dan kolaborasi di antara mereka. Komunikasi ini penting, bahkan untuk sekedar menyampaikan hal-hal yang membuat anggota tim senang atau stres.
  4. +
  5. Pengenalan Perubahan: Dengan secara teratur melakukan refleksi, tim dapat mengidentifikasi masalah yang mungkin belum terdeteksi sebelumnya dan mengambil langkah-langkah perbaikan yang diperlukan.
  6. +
  7. Peningkatan Kualitas: Dengan mengidentifikasi masalah dan kesempatan untuk perbaikan, tim dapat meningkatkan kualitas produk yang dihasilkan.
  8. +
+

Bagaimana Melaksanakan Sprint Retrospective dengan Efektif?

+

Berikut adalah panduan langkah demi langkah untuk melaksanakan Sprint Retrospective yang efektif:

+
    +
  1. Persiapkan Pertemuan: Pastikan semua anggota tim tahu tentang waktu dan tempat pertemuan. Sebaiknya pilih suasana yang nyaman dan bebas dari gangguan.
  2. +
  3. Refleksi Individu: Mintalah setiap anggota tim untuk merefleksikan sprint yang baru saja berakhir secara individu. Apa yang mereka anggap berhasil? Apa yang mungkin bisa ditingkatkan? Adakah hal-hal yang mempersulit atau mempermudah pekerjaan mereka?
  4. +
  5. Diskusi Bersama: Saat pertemuan, mulailah dengan membuka sesi diskusi. Biarkan setiap anggota tim berbagi pandangan mereka tentang sprint yang lalu, termasuk hal-hal positif dan tantangan yang dihadapi.
  6. +
  7. Identifikasi Poin Penting: Bantu tim untuk mengidentifikasi pola atau tema yang muncul dari diskusi. Apa saja hal yang perlu ditingkatkan atau dipertahankan?
  8. +
  9. Tentukan Prioritas: Mintalah tim untuk menetapkan prioritas pada area perbaikan yang telah diidentifikasi. Pilihlah beberapa poin utama yang dapat diimplementasikan pada sprint berikutnya.
  10. +
  11. Buat Rencana Tindakan: Bersama-sama, buat rencana tindakan yang jelas untuk setiap poin prioritas. Pastikan tanggung jawab ditetapkan untuk masing-masing perubahan yang direncanakan.
  12. +
  13. Positif dan Apresiasi: Akhiri pertemuan dengan memberikan apresiasi atas usaha dan kerja keras setiap anggota tim. Fokus pada hal-hal positif yang telah dicapai.
  14. +
+

Tips: Biasanya pertemuan ini memerlukan alat bantu seperti retro board dengan sticky notes atau dalam kondisi pertemuan online, tim kami menggunakan alat online semacam Reetro.io.


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2023/08/review-password-manager-dashlane/index.html b/2023/08/review-password-manager-dashlane/index.html new file mode 100644 index 00000000..691cf178 --- /dev/null +++ b/2023/08/review-password-manager-dashlane/index.html @@ -0,0 +1,86 @@ +Review Password Manager - Dashlane | Dev Jurnal

Review Password Manager - Dashlane

Dashlane adalah alat manajemen kata sandi (password manager) populer yang membantu kita menyimpan dan mengelola kata sandi dengan aman. Berikut adalah beberapa kelebihan dan kekurangan menggunakan Dashlane:

+

Kelebihan:

+
    +
  1. Manajemen Kata Sandi Aman: Dashlane menyediakan brankas aman tempat kita dapat menyimpan semua kata sandi, sehingga lebih mudah untuk memiliki kata sandi yang unik dan kuat untuk setiap akun online tanpa risiko melupakannya.
  2. +
  3. Pembuatan Kata Sandi: Alat ini dapat menghasilkan kata sandi yang kuat dan acak untuk kita, memastikan bahwa akun kita terlindungi dari ancaman keamanan umum seperti serangan brute force.
  4. +
  5. Isi Otomatis dan Masuk Otomatis: Dashlane dapat secara otomatis mengisi kredensial masuk untuk situs web atau mobile app, menghemat waktu kita dan mengurangi kemungkinan salah ketik kata sandi.
  6. +
  7. Dukungan Lintas Platform: Dashlane tersedia di berbagai platform, termasuk Windows, macOS, iOS, dan Android, memudahkan untuk mengakses kata sandi kita dari berbagai perangkat.
  8. +
  9. Catatan Aman dan Dompet Digital: Selain kata sandi, Dashlane dapat menyimpan informasi sensitif lainnya dengan aman seperti detail kartu kredit, catatan aman, dan informasi pribadi.
  10. +
  11. Dukungan Autentikasi Dua Faktor (2FA): Dashlane mendukung autentikasi dua faktor, menambahkan lapisan keamanan ekstra ke akun kita.
  12. +
  13. Laporan Kesehatan Kata Sandi: Dashlane menyediakan laporan kesehatan kata sandi yang menganalisis kekuatan dan keamanan kata sandi kita, membantu kita mengidentifikasi kata sandi yang lemah atau digunakan kembali. Kita mungkin menggunakan kata sandi yang sama di beberapa situs, di mana itu adalah praktik yang tidak aman.
  14. +
  15. Masuk dengan Biometrik: pada aplikasi mobile, kita bisa membuka brankas dengan autentikasi sidik jari, namun Dashlane akan secara acak meminta input master password untuk menjaga kita tetap mengingatnya.
  16. +
+

Kekurangan:

+
    +
  1. Biaya: Kumpulan fitur lengkap Dashlane, termasuk sinkronisasi lintas perangkat, memerlukan langganan premium, yang mungkin dianggap mahal dibandingkan dengan pengelola kata sandi lainnya. Namun family plan menawarkan langganan lebih murah untuk keluarga.
  2. +
  3. Ketergantungan Konektivitas Internet: Dashlane mengandalkan koneksi internet untuk menyinkronkan kata sandi kita di seluruh perangkat, yang dapat menjadi batasan jika kita memerlukan akses ke kata sandi secara offline.
  4. +
  5. Pemulihan Kata Sandi Utama: Dashlane tidak memiliki opsi pemulihan kata sandi utama, yang berarti jika kita lupa kata sandi utama, kita mungkin kehilangan akses ke akun dan menyimpan kata sandi selamanya.
  6. +
  7. Versi Gratis Terbatas: Dashlane versi gratis memiliki batasan jumlah kata sandi yang dapat kita simpan dan jumlah perangkat yang dapat kita gunakan.
  8. +
  9. Masalah Keamanan Berbasis Cloud: Karena Dashlane menyimpan kata sandi kita di cloud, mungkin ada kekhawatiran tentang keamanan data kita, meskipun Dashlane menggunakan enkripsi yang kuat dan tindakan keamanan lainnya untuk melindungi informasi pengguna.
  10. +
  11. Lokalisasi: Saya melihat penyimpanan akun bank di antarmuka Dashlane mengikuti standar Eropa/Internasional. Penyimpanan akun bank lokal mungkin perlu penyesuaian.
  12. +
+

Sejauh ini saya tidak menemukan kesulitan berarti menggunakan Dashlane dibanding password manager lain. Dari sisi antarmuka pengguna saya pikir Dashlane relatif lebih sederhana dan intuitif. Hanya saja jika dikombinasikan dengan aplikasi otentikasinya, kadang saya mendapati itu menduplikasi akun yang sudah ada alih-aluh mengupdate akun yang sudah ada. Awalnya saya mencoba berlangganan layanan ini dengan montly plan, langsung di Play Store pembayaran dengan GoPay. Sejak bulan kemarin saya memutuskan untuk berlangganan dengan annual plan.


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2023/08/technical-debt-hutang-yang-harus-dibayar/index.html b/2023/08/technical-debt-hutang-yang-harus-dibayar/index.html new file mode 100644 index 00000000..fa97dbc4 --- /dev/null +++ b/2023/08/technical-debt-hutang-yang-harus-dibayar/index.html @@ -0,0 +1,123 @@ +Technical Debt, Hutang Teknis yang Harus Dibayar | Dev Jurnal

Technical Debt, Hutang Teknis yang Harus Dibayar

Setiap programmer berusaha sebaik mungkin untuk menulis kode yang baik dan bersih (clean) sejak awal. Tidak ada yang sengaja ingin menyusun kode yang kacau dan menyulitkan proyek. Namun, pada suatu titik, bagaimana kode yang bersih bisa berubah menjadi tidak bersih?

+

Metafora “hutang teknis” yang merujuk pada kode yang tidak bersih awalnya diusulkan oleh Ward Cunningham.

+

Bayangkan kita mendapatkan pinjaman dari bank untuk dapat membeli sesuatu lebih cepat. Kita akan membayar ekstra sebagai bunga atas pinjaman tersebut. Dengan begitu, kita tidak hanya membayar pokok pinjaman tetapi juga bunga tambahan. Terkadang, bunga yang harus kita bayar bisa begitu besar sehingga jumlahnya melebihi pendapatan kita, membuat pembayaran penuh menjadi sulit dilakukan.

+

Hal yang serupa dapat terjadi dengan kode. Mungkin kita ingin mempercepat pengembangan dengan tidak menulis tes untuk fitur baru, namun perlahan-lahan hal ini akan memperlambat kemajuan kita setiap harinya hingga akhirnya kita harus “melunasi” hutang tersebut dengan menulis tes.

+

Penyebab hutang Teknis

+
    +
  1. +

    Tekanan Bisnis

    +

    Terkadang, kondisi bisnis memaksa kita untuk meluncurkan fitur sebelum sepenuhnya selesai. Dalam situasi seperti ini, tambalan dan kode kotor mungkin muncul untuk menyembunyikan bagian proyek yang belum selesai.

    +
  2. +
  3. +

    Kurangnya Pemahaman tentang Konsekuensi hutang Teknis

    +

    Terkadang, atasan atau manajemen mungkin tidak sepenuhnya memahami bahwa hutang teknis memiliki konsekuensi, seperti melambatnya laju pengembangan karena hutang terus menumpuk. Hal ini bisa menyulitkan untuk mengalokasikan waktu untuk refactoring karena manajemen mungkin tidak memahami nilai jangka panjang dari perbaikan tersebut.

    +
  4. +
  5. +

    Kegagalan dalam Menghadapi Keterkaitan Komponen yang Ketat

    +

    Terkadang, proyek dapat menjadi seperti monolit daripada terdiri dari modul-modul individu. Dalam situasi ini, setiap perubahan pada satu bagian proyek akan mempengaruhi bagian lainnya. Tim pengembangan akan menghadapi kesulitan dalam mengisolasi pekerjaan anggota individu.

    +
  6. +
  7. +

    Kurangnya Tes

    +

    Ketidakmampuan untuk menyediakan umpan balik secara langsung dapat mendorong solusi cepat yang berisiko atau pemecahan masalah sementara. Dalam kasus terburuk, perubahan ini dapat diterapkan dan diimplementasikan langsung ke produksi tanpa pengujian sebelumnya, ini menyebabkan masalah serius.

    +
  8. +
  9. +

    Kurangnya Dokumentasi

    +

    Kurangnya dokumentasi dapat memperlambat proses integrasi anggota baru ke dalam proyek dan dapat menyebabkan masalah ketika anggota kunci meninggalkan proyek.

    +
  10. +
  11. +

    Kurangnya Interaksi Antar Anggota Tim

    +

    Jika pengetahuan tidak didistribusikan secara merata di antara seluruh tim, orang-orang akhirnya akan bekerja dengan pemahaman yang usang tentang proses dan informasi proyek. Hal ini dapat memburuk jika pengembang junior tidak mendapatkan pelatihan yang memadai dari mentor mereka.

    +
  12. +
  13. +

    Pengembangan Simultan dalam Cabang yang Berbeda

    +

    Hal ini dapat menyebabkan akumulasi hutang teknis yang semakin bertambah saat perubahan digabungkan. Semakin banyak perubahan yang dilakukan secara terpisah, semakin besar total hutang teknis.

    +
  14. +
  15. +

    Penundaan Refactoring

    +

    Persyaratan proyek (requirement) dapat berubah seiring waktu, dan pada suatu titik bisa menjadi jelas bahwa bagian dari kode sudah usang dan tidak lagi praktis. Hal ini memerlukan refactoring untuk memenuhi requirement baru. Semakin lama refactoring ditunda, semakin banyak kode yang bergantung padanya harus dikerjakan ulang di masa mendatang.

    +
  16. +
  17. +

    Kurangnya Pemantauan Kepatuhan

    +

    Ini terjadi ketika setiap anggota proyek menulis kode sesuai preferensi pribadinya tanpa peduli keseragaman kode secara keseluruhan.

    +
  18. +
  19. +

    Ketidakmampuan

    +

    Terkadang, pengembang mungkin tidak memiliki pengetahuan atau keterampilan untuk menulis kode yang baik dan bersih.

    +
  20. +
+

Mengatasi hutang Teknis

+

Untuk mengatasi hutang teknis, perlu adanya komitmen dari seluruh tim pengembangan dan manajemen untuk:

+
    +
  • Menggunakan Prinsip-Prinsip Perancangan yang Baik: Pastikan seluruh tim memahami dan mengikuti prinsip-prinsip desain yang baik agar kode tetap bersih dan mudah dipahami.
  • +
  • Mendokumentasikan Kode: Selalu berusaha untuk menyertakan dokumentasi yang jelas dan lengkap untuk memudahkan orang lain memahami kode.
  • +
  • Mengutamakan Tes: Selalu menyertakan tes yang memadai untuk setiap bagian kode yang ditulis untuk menghindari masalah di masa depan.
  • +
  • Melakukan Refactoring Secara Berkala: Selalu lakukan refactoring untuk membersihkan kode dan menghilangkan hutang teknis secara teratur.
  • +
  • Meningkatkan Kolaborasi: Pastikan seluruh anggota tim berkomunikasi dan berkolaborasi dengan baik untuk memastikan pengetahuan tentang proyek selalu terbagi dengan baik.
  • +
+

Dengan menerapkan langkah-langkah ini, tim pengembangan dapat mengurangi dan mencegah akumulasi hutang teknis, sehingga proyek dapat berjalan lebih lancar dan lebih efisien.

+

Sumber: +Refactoring Guru - Technical Debt


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2023/09/coding-bootcamp-gratis/index.html b/2023/09/coding-bootcamp-gratis/index.html new file mode 100644 index 00000000..e797169e --- /dev/null +++ b/2023/09/coding-bootcamp-gratis/index.html @@ -0,0 +1,107 @@ +Coding Bootcamp Online Gratis | Dev Jurnal

Coding Bootcamp Online Gratis

Berikut adalah daftar beberapa bootcamp coding online gratis:

+
    +
  1. +

    freeCodeCamp: adalah salah satu bootcamp coding gratis yang paling terkenal. FreeCodeCamp menawarkan kurikulum komprehensif yang mencakup pengembangan web, data science, dan banyak lagi. Siswa dapat memperoleh sertifikasi melalui freeCodeCamp.

    +

    Website: freeCodeCamp

    +
  2. +
  3. +

    The Odin Project: Berfokus pada pengembangan web, The Odin Project adalah kurikulum sumber terbuka yang mencakup HTML, CSS, JavaScript, dan banyak lagi. Ini dirancang untuk siswa mengatur kecepatan belajar sesuai kemampuan diri sendiri.

    +

    Website: The Odin Project

    +
  4. +
  5. +

    Coursera (Audit Courses): Meskipun banyak kursus Coursera memerlukan pembayaran, kita dapat mengaudit banyak kursus tersebut secara gratis. Ini memungkinkan kita untuk mengakses materi kursus dan kuliah.

    +

    Website: Coursera

    +
  6. +
  7. +

    edX (Audit Courses): Mirip dengan Coursera, edX menawarkan opsi untuk mengaudit kursus secara gratis. Kita dapat mengakses materi kursus, video, dan kuis.

    +

    Website: edX

    +
  8. +
  9. +

    Harvard’s CS50x: Harvard menawarkan kursus pengantar ilmu komputer, CS50, online gratis melalui edX. Ini mencakup berbagai bahasa dan konsep pemrograman.

    +

    Website: Harvard’s CS50x

    +
  10. +
  11. +

    MIT OpenCourseWare: Meskipun bukan bootcamp tradisional, MIT menawarkan berbagai kursus ilmu komputer dan pemrograman secara gratis melalui inisiatif OpenCourseWare.

    +

    Website: MIT OpenCourseWare

    +
  12. +
  13. +

    App Academy Open: App Academy, yang terkenal dengan bootcamp coding intensifnya, menawarkan versi online gratis dari kurikulumnya yang mencakup pengembangan web.

    +

    Website: App Academy Open

    +
  14. +
  15. +

    Launch School’s Prep Courses: Launch School menawarkan kursus persiapan gratis untuk membantu pelajar mempersiapkan diri untuk program berbayar yang lebih ekstensif. Kursus persiapan ini mencakup dasar-dasar.

    +

    Website: Launch School

    +
  16. +
  17. +

    Upskill: Upskill menawarkan program bootcamp coding gratis yang berfokus pada pengembangan web dan rekayasa perangkat lunak.

    +

    Website: Upskill

    +
  18. +
  19. +

    Lambda School’s Mini Bootcamp: Lambda School menawarkan bootcamp mini gratis yang memberikan pengenalan pengembangan web.

    +

    Website: Lambda School Mini Bootcamp

    +
  20. +

Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2023/09/masalah-n-1-orm/index.html b/2023/09/masalah-n-1-orm/index.html new file mode 100644 index 00000000..01e146a7 --- /dev/null +++ b/2023/09/masalah-n-1-orm/index.html @@ -0,0 +1,106 @@ +Memahami Masalah N + 1 dalam ORM | Dev Jurnal

Memahami Masalah N + 1 dalam ORM

Dalam pengembangan perangkat lunak, masalah N + 1 adalah salah satu masalah klasik yang sering dihadapi oleh pengembang aplikasi yang menggunakan database. Masalah ini muncul saat kita menggunakan Object-Relational Mapping (ORM) untuk mengakses data dari database, dan dapat menyebabkan kinerja aplikasi yang buruk jika tidak ditangani dengan benar.

+

Apa Itu Masalah N + 1?

+

Masalah N + 1 terjadi ketika kita mengambil kumpulan data utama, misalnya mengambil data buku dari database, dan kemudian mengambil data terkait, misalnya penulis, secara terpisah untuk setiap entitas utama. N + 1 artinya kita melakukan satu query utama untuk mengambil daftar entitas utama, dan kemudian tambahan sejumlah N query untuk mengambil data terkaitnya.

+

Contoh sederhana adalah ketika kita memiliki daftar buku dan kita ingin mengambil penulis masing-masing buku.

+
use App\Models\Book;
+ 
+$books = Book::all();
+

Jika kita mengambil daftar buku terlebih dahulu, itu akan menjalankan 1 query.

+
select * from books
+

Misalnya query di atas hasilnya adalah 25 buku. Kemudian kita mengambil penulis dari setiap buku secara terpisah.

+
foreach ($books as $book) {
+    echo $book->author->name;
+}
+

maka akan ada tambahan 25 query

+
select name from authors where id = 123
+

Itulah yang disebut masalah N + 1.

+

Mengapa Masalah N + 1 Terjadi?

+

Masalah N + 1 terjadi karena ORM, biasanya menggunakan lazy loading sebagai perilaku default. Artinya, data terkait tidak dimuat segera ketika data utama diambil, tetapi dimuat hanya saat kita mengaksesnya. Ini mengarah pada banyak query tambahan yang tidak perlu.

+

Cara Mengatasi Masalah N + 1

+

Untuk mengatasi masalah N + 1, kita dapat menggunakan beberapa teknik berikut:

+

1. Eager Loading

+

Eager loading adalah teknik di mana kita mengambil data terkait sekaligus dengan data utama, bukan secara terpisah. Dalam Laravel, kita dapat menggunakan metode with() untuk melakukan eager loading:

+
$users = Book::with('author')->get();
+

Dengan menggunakan eager loading, kita mengurangi jumlah query yang harus dilakukan ke database menjadi hanya 2 query, menghindari masalah N + 1.

+
select * from books
+ 
+select * from authors where id in (1, 2, 3, 4, 5, ...)
+

2. Join

+

Jika kita ingin menggabungkan data dari beberapa tabel, kita dapat menggunakan operasi join dalam SQL. Dalam Eloquent, kita dapat menggunakan metode join() untuk melakukan join data:

+
$users = DB::table('books')
+            ->join('authors', 'books.author_id', '=', 'authors.id')
+            ->select('books.*', 'authors.name')
+            ->get();
+

3. Batch Loading

+

Jika kita memiliki kasus di mana kita perlu mengambil banyak data terkait untuk setiap entitas utama, kita dapat menggunakan teknik batch loading. Di Laravel ini disebut lazy eager loading. Ini melibatkan pengambilan data utama, dan kemudian mengambil data terkait dalam beberapa batch query.

+
$users = Book::all();
+
+foreach ($books as $book) {
+    $user->load('authors');
+}
+

4. Gunakan Cache

+

Untuk menghindari pengambilan data terkait yang berulang-ulang, kita dapat menggunakan teknik caching. Caching akan menyimpan data terkait dalam cache sehingga kita tidak perlu mengambilnya lagi dalam permintaan berikutnya.


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2023/09/meningkatkan-kesadaran-keamanan-programer/index.html b/2023/09/meningkatkan-kesadaran-keamanan-programer/index.html new file mode 100644 index 00000000..6409885f --- /dev/null +++ b/2023/09/meningkatkan-kesadaran-keamanan-programer/index.html @@ -0,0 +1,92 @@ +Meningkatkan Kesadaran Keamanan Programer | Dev Jurnal

Meningkatkan Kesadaran Keamanan Programer

Keamanan merupakan aspek kritis dalam dunia pengembangan perangkat lunak. Programmer bertanggung jawab tidak hanya untuk menciptakan fitur yang canggih, tetapi juga untuk memastikan bahwa produk yang dihasilkan aman dari ancaman siber. Dalam upaya mewujudkan tujuan ini, programmer perlu mengadopsi kesadaran keamanan yang kuat. Dalam artikel ini, kita akan menjelajahi beberapa langkah penting yang dapat diambil oleh programmer untuk meningkatkan kesadaran keamanan.

+

Checklist Keamanan untuk programmer:

+
    +
  1. Pastikan Antivirus/Antimalware: +Memastikan perangkat kita dilengkapi dengan perangkat lunak antivirus dan antimalware yang terkini dapat membantu mengidentifikasi dan menghapus ancaman berbahaya sebelum mereka merugikan sistem kita.
  2. +
  3. Selalu Perbarui Sistem Operasi (OS) kita: +Memastikan sistem operasi kita selalu diperbarui dengan yang terbaru akan membantu menjaga keamanan dengan mengisi celah-celah keamanan yang ditemukan seiring waktu.
  4. +
  5. Selalu Perbarui Aplikasi: +Menggunakan versi terbaru dari aplikasi yang kita gunakan dapat membantu mengatasi kerentanan yang ada pada versi sebelumnya.
  6. +
  7. Aktifkan Autentikasi Dua Faktor (2FA): +Mengaktifkan autentikasi dua faktor pada akun-akun penting membantu mencegah akses yang tidak sah dengan menambahkan lapisan keamanan tambahan.
  8. +
  9. Hindari Penggunaan Kata Sandi yang Sama: +Menggunakan kata sandi yang unik untuk setiap akun mencegah jika satu akun terkompromi, akun-akun lainnya juga terancam.
  10. +
  11. Manajemen Kata Sandi dengan Password Manager: +Menggunakan manajer kata sandi membantu mengelola dan menghasilkan kata sandi yang kuat secara otomatis, serta mengenkripsi dan mengamankan kata sandi kita.
  12. +
+

Praktik Terbaik bagi programmer dalam Menggunakan Package atau Library:

+
    +
  1. Verifikasi Sumber yang Terpercaya: +Ketika mengintegrasikan package atau library dari sumber eksternal, pastikan sumber tersebut dapat dipercaya. Menggunakan sumber resmi dan terkini mengurangi risiko mengambil kode berbahaya.
  2. +
  3. Periksa Aktivitas Repositori: +Periksa riwayat commit, isu yang terbuka/ditutup, dan aktivitas terkini dalam repositori library. Ini membantu memastikan bahwa proyek tersebut aktif dan terus diperbarui.
  4. +
  5. Pahami Komunitas dan Dukungan: +Memiliki komunitas yang aktif dan dukungan yang baik dari programmer lain dapat membantu kita mengatasi masalah atau kerentanan yang mungkin muncul.
  6. +
  7. Pahami Lisensi: +Pastikan kita memahami lisensi dari paket atau perpustakaan yang kita gunakan. Beberapa lisensi mungkin memiliki persyaratan tertentu yang perlu kita penuhi.
  8. +
+

Kesadaran keamanan adalah tanggung jawab bersama di dunia pengembangan perangkat lunak. Dengan mengikuti checklist dan praktik terbaik ini, programmer dapat membantu melindungi data sensitif dan menjaga integritas perangkat lunak mereka. Dalam dunia yang semakin terhubung, keamanan harus selalu menjadi prioritas utama.


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2023/09/review-freecodecamp/index.html b/2023/09/review-freecodecamp/index.html new file mode 100644 index 00000000..d81faf8a --- /dev/null +++ b/2023/09/review-freecodecamp/index.html @@ -0,0 +1,80 @@ +Review Coding Bootcamp Online Gratis FreeCodeCamp | Dev Jurnal

Review Coding Bootcamp Online Gratis FreeCodeCamp

Kelebihan freeCodeCamp

+
    +
  1. Benar-benar Gratis: Seperti namanya, freeCodeCamp adalah platform pembelajaran yang sepenuhnya gratis. Ini memungkinkan siapa pun, tanpa memandang latar belakang finansial, untuk memulai pembelajaran pemrograman. Semua programnya benar-benar gratis, bukan trial atau kelas persiapan.
  2. +
  3. Kurikulum yang Komprehensif: freeCodeCamp menawarkan kurikulum yang luas yang mencakup berbagai bahasa pemrograman dan teknologi terkait. Kurikulumnya mencakup web development (Back end dan Front end), algoritma dan struktur data, data science, data analysis, information security, machine learning, coding interview preparation, data visualization, database administrator dan QA. Bahasa pemrograman yang digunakan adalah JavaScript dan Python. Sementara teknologi yang diajarkan mencakup HTML, CSS, React, dan Node.js. Ini membuatnya cocok untuk pemula yang ingin memulai dan juga untuk mereka yang ingin memperdalam pengetahuannya.
  4. +
  5. Proyek-Proyek Praktis: Selama pembelajaran, kita akan mengerjakan berbagai proyek yang akan membantu kita mengaplikasikan pengetahuan kita secara langsung. Semua bahan latihan untuk dilakukan sangat praktis, tidak perlu mengeset lingkungan pengembangan di komputer lokal. Proyek latihan dilakukan semua dilakukan di website dengan aplikasi yang interaktif dan jelas. Semua progress latihan kita juga ada trackingnya.
  6. +
  7. Dukungan Komunitas: freeCodeCamp memiliki komunitas yang besar dan aktif. kita dapat menghubungkan diri dengan sesama pembelajar, berkolaborasi pada proyek-proyek, dan mencari bantuan ketika kita menghadapi kesulitan. Selain itu ada juga artikel-artikel yang ditulis oleh anggota komunitas sebagai suplemen pembelajaran.
  8. +
  9. Sertifikat freeCodeCamp: Setelah menyelesaikan sebagian besar kurikulum, kita berhak menerima sertifikat freeCodeCamp. Meskipun bukan sertifikat resmi, ini dapat menjadi bukti keterampilan kita kepada calon pemberi kerja.
  10. +
+

Kekurangan freeCodeCamp

+
    +
  1. Tidak Ada Dukungan Langsung: freeCodeCamp adalah platform mandiri yang mengandalkan pembelajaran sendiri. Jika kita memerlukan bimbingan langsung atau bantuan dari instruktur, kita mungkin merasa kurang tertolong di sini.
  2. +
  3. Tidak Ada Sertifikat Resmi: Meskipun kita menerima sertifikat freeCodeCamp, sertifikat ini mungkin kurang dihargai oleh beberapa perusahaan dibandingkan dengan sertifikat resmi dari lembaga pendidikan terkemuka.
  4. +
  5. Tidak Ada Proyek Nyata: Meskipun ada proyek-proyek praktis, mereka mungkin tidak mencakup proyek-proyek yang mendalam atau proyek-proyek dunia nyata yang biasanya ditemui di kursus berbayar atau bootcamp.
  6. +
  7. Tidak Ada Struktur Kurikulum yang Sama: freeCodeCamp memungkinkan pembelajaran yang sangat fleksibel, tetapi hal ini juga dapat membuat beberapa orang merasa kebingungan tentang urutan pembelajaran yang tepat.
  8. +
  9. Tidak Ada Dukungan Pribadi: kita harus mandiri dalam menavigasi pembelajaran kita. Jika kita memerlukan dukungan pribadi, bootcamp berbayar dengan mentor mungkin menjadi pilihan yang lebih baik.
  10. +

Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2023/09/review-the-odin-project/index.html b/2023/09/review-the-odin-project/index.html new file mode 100644 index 00000000..b916fd01 --- /dev/null +++ b/2023/09/review-the-odin-project/index.html @@ -0,0 +1,82 @@ +Review Coding Bootcamp Online Gratis The Odin Project | Dev Jurnal

Review Coding Bootcamp Online Gratis The Odin Project

Kelebihan The Odin Project

+
    +
  1. Gratis Sepenuhnya: The Odin Project benar-benar gratis untuk digunakan. Ini berarti siapa pun dapat memulai pembelajaran tanpa biaya pendaftaran atau langganan bulanan. Ini bukan program trial, preview atau preparation.
  2. +
  3. Kurikulum yang Komprehensif: The Odin Project menawarkan kurikulum yang komprehensif yang mencakup berbagai bahasa pemrograman, teknologi, dan konsep terkait pengembangan web baik sisi front end, seperti HTML, CSS, JavaScript, React dan back end Node.js atau Ruby.
  4. +
+

Selain itu kurikulum juga didasari fundamental yang baik dengan algoritma, struktur data dan database. Ini cocok untuk pemula yang ingin memulai dari nol dan juga untuk mereka yang ingin memperdalam pengetahuannya.

+
    +
  1. Proyek-Proyek Praktis: Selama belajar di The Odin Project, kita akan bekerja pada berbagai proyek yang praktis. Ini membantu kita mengaplikasikan pengetahuan yang telah kita pelajari dalam situasi nyata, yang merupakan cara yang sangat efektif untuk belajar.
  2. +
  3. Fleksibilitas: kita dapat mengakses materi dan proyek-proyek kapan saja dan di mana saja. Ini memungkinkan pembelajaran yang sesuai dengan jadwal kita.
  4. +
  5. Komunitas dan Dukungan: The Odin Project memiliki komunitas yang aktif di Disccord. kita dapat berinteraksi dengan sesama pembelajar, bertanya, dan berkolaborasi pada proyek-proyek. Ini membantu menjaga motivasi dan memecahkan masalah ketika kita menghadapi kesulitan.
  6. +
+

Kekurangan The Odin Project

+
    +
  1. Tidak Ada Dukungan Instruktur Langsung: Salah satu kekurangan utama dari The Odin Project adalah kurangnya dukungan instruktur langsung. Jika kita memerlukan bimbingan langsung atau ingin menjawab pertanyaan secara instan, kita mungkin merasa terbatas di sini.
  2. +
  3. Tidak Ada Sertifikat Resmi: Meskipun kita akan membangun portofolio proyek, The Odin Project tidak memberikan sertifikat resmi seperti yang mungkin diberikan oleh institusi pendidikan formal atau bootcamp berbayar.
  4. +
  5. Materi yang Mandiri: Belajar sendiri membutuhkan tingkat disiplin dan motivasi yang tinggi. Tidak semua orang cocok dengan pendekatan ini.
  6. +
  7. Tidak Ada Pembimbingan Karir: Meskipun The Odin Project memberikan keterampilan teknis yang kuat, tidak ada dukungan khusus dalam hal pembimbingan karir. Membangun portofolio yang kuat tetapi tidak tahu cara memasarkannya dapat menjadi tantangan tersendiri.
  8. +

Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2023/09/tips-laravel-eloquent/index.html b/2023/09/tips-laravel-eloquent/index.html new file mode 100644 index 00000000..14234727 --- /dev/null +++ b/2023/09/tips-laravel-eloquent/index.html @@ -0,0 +1,314 @@ +Tips dan Trik Laravel Eloquent | Dev Jurnal

Tips dan Trik Laravel Eloquent

Saat kita menggunakan framework Laravel, ORM Eloquent terlihat seperti mekanisme sederhana, semuanya begitu mudah dilakukan. Tetapi sebenarnya di balik layar, ada banyak fungsi semi-tersembunyi dan cara-cara yang tidak banyak diketahui untuk mencapai lebih banyak dengan itu.

+

1. Increment dan Decrement

+

Daripada melakukan ini:

+
$article = Article::find($article_id);
+$article->read_count++;
+$article->save();
+

Kita bisa melakukan ini:

+
$article = Article::find($article_id);
+$article->increment('read_count');
+

Ini juga akan berfungsi:

+
Article::find($article_id)->increment('read_count');
+Article::find($article_id)->increment('read_count', 10); // +10
+Product::find($produce_id)->decrement('stock'); // -1
+

2. Method X or Y

+

Eloquent memiliki beberapa fungsi yang menggabungkan dua method, seperti “tolong lakukan X, jika tidak lakukan Y”.

+

Contoh 1 - findOrFail()

+

Daripada:

+
$user = User::find($id);
+if (!$user) { abort (404); }
+

Lakukan ini:

+
$user = User::findOrFail($id);
+

Contoh 2 - firstOrCreate()

+

Daripada:

+
$user = User::where('email', $email)->first();
+if (!$user) {
+  User::create([
+    'email' => $email
+  ]);
+}
+

Lakukan ini saja:

+
$user = User::firstOrCreate(['email' => $email]);
+

3. Method boot() pada Model

+

Ada tempat ajaib bernama boot() dalam model Eloquent di mana Kita dapat mengganti perilaku default:

+
class User extends Model
+{
+    public static function boot()
+    {
+        parent::boot();
+        static::updating(function($model)
+        {
+            // lakukan beberapa logging
+            // ganti beberapa properti seperti $model->something = transform($something);
+        });
+    }
+}
+

Mungkin salah satu contoh yang paling populer adalah mengatur nilai atribut tertentu pada saat membuat objek model. Katakanlah Kita ingin membuat atribut UUID pada saat itu.

+
public static function boot()
+{
+  parent::boot();
+  self::creating(function ($model) {
+    $model->uuid = (string)Uuid::generate();
+  });
+}
+

4. Relasi dengan kondisi dan pengurutan

+

Ini adalah cara khas untuk mendefinisikan hubungan:

+
public function users() {
+    return $this->hasMany('App\User');
+}
+

Tetapi tahukah Kita bahwa pada titik ini kita sudah dapat menambahkan where atau orderBy? Misalnya, jika Kita ingin relasi tertentu untuk beberapa jenis pengguna, juga diurutkan berdasarkan email, Kita dapat melakukan ini:

+
public function approvedUsers() {
+    return $this->hasMany('App\User')->where('approved', 1)->orderBy('email');
+}
+

5. Properti Model: timestamps, appends, dll.

+

Ada beberapa “parameter” dari model Eloquent, dalam bentuk properti dari kelas itu. Yang paling populer mungkin adalah ini:

+
class User extends Model {
+    protected $table = 'users';
+    protected $fillable = ['email', 'password']; // field mana yang booleh diisi pada saat membuat record dengan User::create()
+    protected $dates = ['created_at', 'deleted_at']; // field mana yang akan dikonversi menjadi Carbon
+    protected $appends = ['field1', 'field2']; // nilai tambahan yang dikembalikan dalam JSON
+}
+

Dan masih ada yang lain:

+
protected $primaryKey = 'uuid'; // tidak harus "id"
+public $incrementing = false; // bahkan tidak harus otomatis bertambah!
+protected $perPage = 25; // Kita dapat mengganti jumlah halaman PER MODEL (default 15)
+const CREATED_AT = 'created_at';
+const UPDATED_AT = 'updated_at'; // bahkan nama-nama kolom itu dapat diganti
+public $timestamps = false; // atau bahkan tidak digunakan sama sekali
+

Dan masih ada lagi, di sini hanya dicantumkan yang paling menarik, untuk lebih banyak silakan cek kode class Model abstrak default dan cek semua trait yang digunakan.

+

6. Temukan beberapa entri

+

Semua orang tahu method find(), bukan?

+
$user = User::find(1);
+

Namun tidak banyajk orang yang tahu bahwa itu bisa menerima beberapa ID sebagai array:

+
$users = User::find([1,2,3]);
+

7. Where X

+

Ada cara elegan untuk mengubah ini:

+
$users = User::where('approved', 1)->get();
+

Menjadi ini:

+
$users = User::whereApproved(1)->get();
+

Kita dapat mengganti nama field apa pun dan menambahkannya sebagai sufiks ke “where” dan itu akan berfungsi secara otomatis.

+

Selain itu, ada beberapa method yang telah ditentukan sebelumnya dalam Eloquent, yang terkait dengan tanggal/waktu:

+
User::whereDate('created_at', date('Y-m-d'));
+User::whereDay('created_at', date('d'));
+User::whereMonth('created_at', date('m'));
+User::whereYear('created_at', date('Y'));
+

8. Urutkan berdasarkan hubungan

+

Sebuah “trik” yang sedikit lebih rumit. Bagaimana jika Kita memiliki topik forum tetapi ingin mengurutkannya berdasarkan posting terbaru? Permintaan yang cukup umum di forum dengan topik yang diperbarui terbaru di bagian atas, bukan?

+

Pertama, deskripsikan hubungan terpisah untuk posting terbaru pada topik:

+
public function latestPost()
+{
+    return $this->hasOne(\App\Post::class)->latest();
+}
+

Dan kemudian, di controller kita, kita bisa melakukan “sulap” ini:

+
$users = Topic::with('latestPost')->get()->sortByDesc('latestPost.created_at');
+

9. Eloquent::when() - tidak ada lagi if-else

+

Banyak dari kita menulis kueri kondisional dengan “if-else”, seperti ini:

+
if (request('filter_by') == 'likes') {
+    $query->where('likes', '>', request('likes_amount', 0));
+}
+if (request('filter_by') == 'date') {
+    $query->orderBy('created_at', request('ordering_rule', 'desc'));
+}
+

Tetapi ada cara yang lebih baik - menggunakan when():

+
$query = Author::query();
+$query->when(request('filter_by') == 'likes', function ($q) {
+    return $q->where('likes', '>', request('likes_amount
+
+', 0));
+});
+$query->when(request('filter_by') == 'date', function ($q) {
+    return $q->orderBy('created_at', request('ordering_rule', 'desc'));
+});
+

Mungkin terasa tidak lebih pendek atau lebih elegan, tetapi yang paling kuat adalah pengiriman parameter:

+
$query = User::query();
+$query->when(request('role', false), function ($q, $role) {
+    return $q->where('role_id', $role);
+});
+$authors = $query->get();
+

10. BelongsTo Default Models

+

Misalkan Kita memiliki model Post yang terkait dengan Author dan kemudian kode Blade template ini:

+
{{ $post->author->name }}
+

Tetapi bagaimana jika penulisnya dihapus, atau kosong karena beberapa alasan? Kita akan mendapatkan error, seperti “properti dari objek non-objek”.

+

Tentu saja, Kita dapat mencegahnya seperti ini:

+
{{ $post->author->name ?? '' }}
+

Tetapi Kita dapat melakukannya pada method relasi di Eloquent:

+
public function author()
+{
+    return $this->belongsTo('App\Author')->withDefault();
+}
+

Dalam contoh ini, hubungan author()akan mengembalikan modelApp\Author` kosong jika tidak ada penulis yang terpasang pada posting.

+

Selain itu, kita dapat menetapkan nilai properti default untuk model default tersebut.

+
public function author()
+{
+    return $this->belongsTo('App\Author')->withDefault([
+        'name' => 'Guest Author'
+    ]);
+}
+

11. Urutkan berdasarkan Mutator

+

Bayangkan Kita memiliki ini:

+
function getFullNameAttribute()
+{
+  return $this->attributes['first_name'] . ' ' . $this->attributes['last_name'];
+}
+

Sekarang, Kita ingin mengurutkannya berdasarkan full_name itu? Ini tidak akan berfungsi:

+
$clients = Client::orderBy('full_name')->get(); // tidak berfungsi
+

Solusinya cukup sederhana. Kita perlu mengurutkan hasil setelah kita mendapatkannya.

+
$clients = Client::get()->sortBy('full_name'); // berfungsi!
+

Perhatikan bahwa nama fungsi berbeda - bukan orderBy, tetapi sortBy.

+

12. Urutan default dalam lingkup global

+

Bagaimana jika Kita ingin User::all() selalu diurutkan berdasarkan field nama? Kita dapat menetapkan lingkup global. Mari kembali ke method boot(), yang sudah kita sebutkan di atas.

+
protected static function boot()
+{
+    parent::boot();
+ 
+    // Urutkan berdasarkan nama ASC
+    static::addGlobalScope('order', function (Builder $builder) {
+        $builder->orderBy('name', 'asc');
+    });
+}
+

Baca lebih lanjut tentang Query Scopes di sini.

+

13. Method raw query

+

Terkadang kita perlu menambahkan raw query ke Eloquent kita. Untungnya, ada fungsi untuk itu.

+
// whereRaw
+$orders = DB::table('orders')
+    ->whereRaw('price > IF(state = "TX", ?, 100)', [200])
+    ->get();
+ 
+// havingRaw
+Product::groupBy('category_id')->havingRaw('COUNT(*) > 1')->get();
+ 
+// orderByRaw
+User::where('created_at', '>', '2016-01-01')
+  ->orderByRaw('(updated_at - created_at) desc')
+  ->get();
+

14. Replicate: buat salinan dari baris

+

Singkat. Tanpa penjelasan mendalam, berikut adalah cara terbaik untuk membuat salinan entri basis data:

+
$task = Tasks::find(1);
+$newTask = $task->replicate();
+$newTask->save();
+

15. Method Chunk() untuk tabel besar

+

Tidak benar-benar terkait dengan Eloquent, lebih tentang Collection, tetapi ini bagus - untuk memproses dataset yang lebih besar, Kita dapat memecahnya menjadi beberapa bagian.

+

Daripada:

+
$users = User::all();
+foreach ($users as $user) {
+    // ...
+}
+

Kita bisa melakukan:

+
User::chunk(100, function ($users) {
+    foreach ($users as $user) {
+        // ...
+    }
+});
+

16. Buat controller dan migration saat membuat model

+

Kita semua tahu perintah Artisan ini:

+
php artisan make:model Company
+

Tetapi tahukah Kita ada tiga flag yang berguna untuk menghasilkan file terkait dengan model tersebut?

+
php artisan make:model Company -mcr
+
    +
  • -m akan membuat file migration
  • +
  • -c akan membuat controller
  • +
  • -r akan menunjukkan bahwa controller harus bersifat resource
  • +
+

17. Timpa updated_at saat menyimpan

+

Tahukah Kita bahwa method save() dapat menerima parameter? Karena itu, kita dapat memberitahunya untuk “mengabaikan” fungsi default updated_at untuk diisi dengan tanda waktu saat ini. Lihat ini:

+
$product = Product::find($id);
+$product->updated_at = '2019-01-01 10:00:00';
+$product->save(['timestamps' => false]);
+

Di sini kita mengganti updated_at default dengan yang telah kita tentukan sebelumnya.

+

18. Apa hasil dari update()?

+

Pernahkah Kita bertanya-tanya apa yang sebenarnya dikembalikan oleh kode ini?

+
$result = $products->whereNull('category_id')->update(['category_id' => 2]);
+

Pembaruan dilakukan di database, tetapi apa isi variabel $result itu?

+

Jawabannya adalah baris yang terupdate. Jadi jika Kita perlu memeriksa berapa banyak baris yang terpengaruh, Kita tidak perlu memanggil method yang lain - metode update() akan mengembalikan jumlah ini untuk Kita.

+

19. Ubah kurung menjadi kueri Eloquent

+

Bagaimana jika Kita memiliki campuran and-or dalam kueri SQL Kita, seperti ini:

+
... WHERE (gender = 'Male' and age >= 18) or (gender = 'Female' and age >= 65)
+

Bagaimana menerjemahkannya menjadi Eloquent? Ini adalah cara yang salah:

+
$q->where('gender', 'Male');
+$q->orWhere('age', '>=', 18);
+$q->where('gender', 'Female');
+$q->orWhere('age', '>=', 65);
+

Urutannya akan salah. Cara yang benar sedikit lebih rumit, menggunakan fungsi closure sebagai sub-kueri:

+
$q->where(function ($query) {
+    $query->where('gender', 'Male')
+        ->where('age', '>=', 18);
+}
+
+)->orWhere(function($query) {
+    $query->where('gender', 'Female')
+        ->where('age', '>=', 65);
+})
+

20. orWhere dengan parameter ganda

+

Terakhir, Kita dapat memasukkan parameter berupa array ke orWhere().

+

Cara “biasa”:

+
$q->where('a', 1);
+$q->orWhere('b', 2);
+$q->orWhere('c', 3);
+

Kita bisa melakukannya seperti ini:

+
$q->where('a', 1);
+$q->orWhere(['b' => 2, 'c' => 3]);
+

Diterjemahkan dari: 20 Laravel Eloquent Tips and Tricks | Laravel News - Povilas Korop


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2023/09/unit-testing-arrange-act-assert/index.html b/2023/09/unit-testing-arrange-act-assert/index.html new file mode 100644 index 00000000..0aa6883c --- /dev/null +++ b/2023/09/unit-testing-arrange-act-assert/index.html @@ -0,0 +1,101 @@ +Unit Testing dengan Pendekatan Arrange, Act, dan Assert | Dev Jurnal

Unit Testing dengan Pendekatan Arrange, Act, dan Assert

Unit testing adalah salah satu praktik yang penting dalam pengembangan perangkat lunak yang membantu memastikan bahwa kode kita berfungsi dengan benar. Kita dapat menggunakan pendekatan Arrange, Act, dan Assert (AAA) untuk membuat unit test yang efektif.

+

1. Arrange

+

Mengeset input dan target. Langkah-langkah pengaturan ini dilakukan untuk menyiapkan sebuah kasus pengujian. Pikirkan apakah tes ini memerlukan objek atau pengaturan khusus? Apakah perlu menyiapkan database? Apakah perlu masuk ke aplikasi web atau membuat sebuah request http? Tangani semua operasi ini di bagian awal pengujian.

+

2. Act

+

Jalankan perilaku (behavior) yang ditargetkan. Langkah-langkah act ini mencakup hal utama yang akan diuji. Ini bisa berupa pemanggilan fungsi atau metode, pemanggilan REST API, atau interaksi dengan halaman web. Jaga agar tindakan yang dijalankan tetap fokus pada perilaku sasaran.

+

3. Assert

+

Periksa hasil yang diharapkan. Hasil dari menjalankan langkah act harus menimbulkan semacam respons. Nah, langkah assert ini adalah saat kita memverifikasi benar atau salahnya respons tersebut. Contohnya memeriksa nilai numerik atau string, mengecek response berupa json. Atau, kita mungkin memerlukan pemeriksaan beberapa aspek dari suatu sistem. Assertion pada akhirnya akan menentukan apakah pengujian berhasil atau gagal.

+

Contoh

+

Kita akan melihat contoh penggunaan AAA dalam unit testing dengan Laravel.

+

Bayangkan kita memiliki sebuah model Laravel yang sederhana untuk mengelola buku. Kita ingin menguji method hitungJumlahBuku yang bertanggung jawab menghitung jumlah total buku dalam database.

+

Langkah 1: Atur (Arrange)

+

Pertama, kita akan menyiapkan kondisi awal untuk tes kita. Ini mungkin melibatkan pengaturan database tes, membuat objek model, atau mempersiapkan kondisi lain yang diperlukan.

+
public function testHitungJumlahBuku()
+{
+    // Membuat beberapa buku dalam basis data tes
+    Buku::create(['judul' => 'Buku 1', 'penulis' => 'Penulis 1']);
+    Buku::create(['judul' => 'Buku 2', 'penulis' => 'Penulis 2']);
+    
+    // Membuat objek model
+    $buku = new Buku();
+    
+    // Act
+    $jumlahBuku = $buku->hitungJumlahBuku();
+    
+    // Verifikasi (Assert)
+    $this->assertEquals(2, $jumlahBuku);
+}
+

Pada langkah ini, kita membuat beberapa buku dalam database tes dan kemudian membuat objek model Buku.

+

Langkah 2: Lakukan (Act)

+

Kemudian, kita menjalankan metode atau fungsi yang ingin kita uji. Dalam hal ini, kita memanggil metode hitungJumlahBuku dari objek model Buku.

+
$jumlahBuku = $buku->hitungJumlahBuku();
+

Langkah 3: Verifikasi (Assert)

+

Langkah terakhir adalah memverifikasi hasil tes dengan menggunakan pernyataan “assert” untuk memeriksa apakah hasilnya sesuai dengan harapan kita.

+
$this->assertEquals(2, $jumlahBuku);
+

Dalam contoh ini, kita memeriksa apakah $jumlahBuku sama dengan 2, karena kita telah menambahkan dua buku ke dalam basis data tes pada langkah pertama.

+

Jika semua tes berjalan dengan sukses, kita akan melihat pesan bahwa tes tersebut berhasil. Namun, jika ada kesalahan dalam kode atau hasilnya tidak sesuai dengan harapan, kita akan melihat pesan kesalahan yang membantu kita melacak masalahnya.

+

Dengan menggunakan pendekatan Arrange, Act, dan Assert dalam unit testing, kita dapat memastikan bahwa kode kita berfungsi dengan benar dan dapat mengidentifikasi masalah lebih awal dalam siklus pengembangan. Unit testing adalah salah satu praktik terbaik dalam pengembangan perangkat lunak yang dapat meningkatkan keandalan dan kualitas perangkat lunak kita secara keseluruhan.


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2023/10/membaca-flame-graph/index.html b/2023/10/membaca-flame-graph/index.html new file mode 100644 index 00000000..74b807ea --- /dev/null +++ b/2023/10/membaca-flame-graph/index.html @@ -0,0 +1,82 @@ +Membaca Flame Graph | Dev Jurnal

Membaca Flame Graph

Apa itu Flame Graph?

+

Sebelum kita masuk ke dalam cara membaca flame graph, mari kita pahami terlebih dahulu apa itu flame graph. Flame graph adalah representasi visual dari tumpukan pemanggilan (call stack) dalam kode aplikasi. Ini adalah alat yang sangat efektif untuk mengidentifikasi fungsi atau bagian dari kode yang memakan banyak waktu atau sumber daya komputasi.

+

Dalam flame graph, setiap bar mewakili fungsi atau metode dalam kode. Panjang bar menunjukkan seberapa banyak waktu yang dihabiskan dalam fungsi tersebut. Bar-bar ini disusun dalam tumpukan yang menunjukkan hubungan antar pemanggilan fungsi.

+

Langkah 1: Memahami Struktur Flame Graph

+

Sebelum kita mulai membaca flame graph, mari kita pahami strukturnya. Flame graph memiliki dua sumbu utama:

+
    +
  • Sumbu Y (Vertikal): Ini adalah tumpukan pemanggilan. Tumpukan teratas adalah fungsi yang pertama kali dipanggil, sedangkan tumpukan terbawah adalah fungsi yang paling dalam dalam tumpukan pemanggilan.
  • +
  • Sumbu X (Horizontal): Ini adalah skala waktu atau penggunaan sumber daya. Semakin panjang bar, semakin banyak waktu atau sumber daya yang dihabiskan dalam fungsi tersebut.
  • +
+

Langkah 2: Identifikasi Hotspot

+

Hotspot adalah fungsi atau bagian dari kode yang memakan banyak waktu atau sumber daya komputasi. Untuk mengidentifikasi hotspot dalam flame graph, carilah bar yang paling panjang atau paling lebar. Inilah yang perlu diperiksa lebih lanjut.

+

Langkah 3: Pelajari Pemanggilan Fungsi

+

Setelah kita mengidentifikasi hotspot, langkah selanjutnya adalah memahami pemanggilan fungsi di sekitarnya. Ini bisa membantu kita mengidentifikasi apakah ada pemanggilan yang tidak perlu atau redundan yang mempengaruhi kinerja.

+

Langkah 4: Analisis Kedalaman Tumpukan

+

Flame graph juga memungkinkan kita untuk menganalisis kedalaman tumpukan pemanggilan. Jika kita melihat tumpukan pemanggilan yang sangat dalam, ini bisa menjadi indikasi bahwa ada masalah dalam rekursi tak terbatas atau pemanggilan berulang yang tidak perlu.

+

Langkah 5: Gunakan Alat Pendukung

+

Untuk membaca flame graph dengan lebih efektif, kita dapat menggunakan alat pendukung seperti FlameGraph atau alat profilasi kinerja lainnya yang menghasilkan grafik api. Alat ini sering dilengkapi dengan fitur pencarian dan pemfilteran yang memudahkan dalam analisis.

+

Ada satu video yang menurut saya cukup bagus dalam menjelaskan tentang flame graph Miha Rekar - What Are Flame Graphs and How to Read Them, RubyConfBY 2017


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2023/10/stuck-di-karir/index.html b/2023/10/stuck-di-karir/index.html new file mode 100644 index 00000000..12224bab --- /dev/null +++ b/2023/10/stuck-di-karir/index.html @@ -0,0 +1,88 @@ +Stuck di Karir | Dev Jurnal

Stuck di Karir

Ketika melakukan refleksi pada karir, seringkali kita merasa terjebak di suatu titik. Terjebak dalam sebuah peran, stagnasi gaji, atau mungkin merasa bosan dengan tugas yang kita kerjakan. Ada beberapa alasan mengapa kita bisa merasa terjebak di suatu titik tertentu dalam karir kita, serta beberapa solusi yang mungkin bisa membantu kita keluar dari perasaan terjebak tersebut.

+

Role

+

Salah satu alasan utama mengapa kita bisa merasa terjebak dalam suatu peran adalah ketidakpuasan dengan pekerjaan kita saat ini. Mungkin kita merasa peran kita tidak sesuai dengan harapan, atau kita merasa ingin naik ke tingkat yang lebih tinggi dalam organisasi. Organisasi tempat kita bekerja berpengaruh cukup besar dalam hal ini. Untuk mengatasi masalah ini, penting untuk berbicara dengan atasan atau manajer kita. Mungkin ada peluang untuk mengambil tanggung jawab yang lebih besar atau mendapatkan pelatihan tambahan untuk naik ke tingkat berikutnya.

+

Gaji

+

Jika kita merasa terjebak dalam tingkat gaji yang sama selama beberapa waktu, ada beberapa pilihan yang bisa kita pertimbangkan. Salah satunya adalah mencari peluang kerja di tempat lain, atau bahkan di luar negeri, di mana ada peluang mendapatkan gaji lebih besar. Namun, perlu diingat bahwa gaji yang lebih tinggi seringkali beriringan dengan biaya hidup yang lebih tinggi pula, misalnya kota atau negara dengan upah yang tinggi kemungkinan juga memiliki biaya hidup yang mahal. Kita juga bisa mempertimbangkan untuk berbicara dengan atasan tentang peningkatan gaji atau mencari pekerjaan sampingan untuk meningkatkan penghasilan.

+

Task

+

Terkadang, kita bisa merasa terjebak dalam tugas-tugas yang monoton dan membosankan. Hal ini bisa mengakibatkan penurunan motivasi dan kepuasan kerja. Jika kita merasa seperti ini, mungkin saatnya mencari variasi dalam pekerjaan kita. Bicarakan dengan atasan tentang minat dan kemampuan kita yang belum tergarap. Mungkin kita bisa mendapatkan tugas baru atau proyek yang lebih menarik.

+

Self Authoring

+

Salah satu pendekatan yang berguna dalam mengatasi perasaan terjebak adalah mengikuti jejak psikolog terkenal Jordan Peterson. Peterson menekankan pentingnya membuat rencana pengembangan diri pribadi (personal development plan) dengan membuat sebuah self-authoring yang mencakup masa lalu, saat ini, dan masa depan kita. Author your Past, Present, & Future

+

Masa Lalu

+
    +
  • Ceritakan latar belakang kita, keterampilan yang kita punya, minat, dan hobi kita.
  • +
+

Saat Ini

+
    +
  • Tentukan nilai-nilai, keyakinan pribadi, preferensi, kompetensi, dan keterbatasan kita saat ini.
  • +
+

Masa Depan

+
    +
  • Tetapkan tujuan jangka pendek (6 bulan), menengah (6-24 bulan), dan jangka panjang (2-5 tahun).
  • +
  • Gunakan kerangka SMART (Specific, Measurable, Achievable, Relevant, Time-bound) untuk merumuskan tujuan Kita.
  • +
  • Berdasarkan tujuan dan kerangka tersebut, buat rencana tindakan (action plan) yang akan membantu kita mencapainya.
  • +
+

Dokumen ini akan membantu Kita memahami diri Kita sendiri dengan lebih baik dan memberikan arah untuk masa depan Kita. Dengan menulis, kita dapat mengartikulasikan harapan kita dan bagaimana kita mewujudkannya menjadi kenyataan. Dalam kehidupan sehari-hari, dokumen ini juga berguna sebagai bentuk akuntabilitas. Ini juga dapat menjadi patokan dalam melakukan penilaian kinerja (performance review).


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2023/11/laravel-static-code-analysis-dengan-phpstan/index.html b/2023/11/laravel-static-code-analysis-dengan-phpstan/index.html new file mode 100644 index 00000000..b4520e81 --- /dev/null +++ b/2023/11/laravel-static-code-analysis-dengan-phpstan/index.html @@ -0,0 +1,199 @@ +Static Code Analysis dengan PHPStan | Dev Jurnal

Static Code Analysis dengan PHPStan

Analisis kode statis adalah metode evaluasi program dengan memeriksa kode sebelum dieksekusi. Ini dilakukan dengan memeriksa set kode berdasarkan sejumlah aturan penulisan kode (type variable, return value, dsb). Analisis statis dijalankan sebelum pengujian perangkat lunak dimulai. Proses ini dilakukan untuk menjamin bahwa kode yang kita kirim untuk diuji sesuai dengan standar kualitas tertinggi. Ini juga memberikan umpan balik otomatis sehingga para pengembang akan mengetahui masalah-masalah tersebut lebih awal, yang membuatnya lebih mudah dan lebih murah untuk memperbaiki masalah tersebut.

+

Apa yang Dibawa PHPStan?

+

Ketika pertama kali melihat repositori PHPStan, ada klaim yang kontroversial…

+
+

“PHPStan berfokus pada menemukan kesalahan dalam kode Anda tanpa benar-benar menjalankannya. Ini menangkap seluruh kelas bug bahkan sebelum Anda menulis tes untuk kode tersebut. Ini memindahkan PHP lebih dekat ke bahasa yang dikompilasi dalam arti bahwa kebenaran setiap baris kode dapat diperiksa sebelum Anda menjalankan baris tersebut sebenarnya.”

+
+

PHPStan memiliki banyak level aturan, dan seperti yang dapat Anda lihat, semakin tinggi tingkat yang kita pilih, semakin banyak kesalahan yang kita dapatkan. Sekarang pertanyaannya, tingkat mana yang harus kita pilih? Nah, pertama-tama kita perlu tahu apa aturan dari setiap tingkat.

+

Tingkat Aturan

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
TingkatNamaDetail
00Basic ChecksMemeriksa kelas-kelas, fungsi atau method yang tidak ditemukan yang dipanggil pada $this, jumlah argumen yang salah yang dimasukkan ke method dan fungsi tersebut, variabel yang selalu tidak terdefinisi.
01$this UnknownsVariabel yang mungkin tidak terdefinisi, method dan properti ajaib yang tidak diketahui pada kelas dengan method __call dan __get.
02MethodsMethod yang tidak diketahui diperiksa pada semua ekspresi (bukan hanya $this), memvalidasi PHPDocs.
03TypesMemeriksa tipe return, tipe yang ditugaskan ke properti.
04Dead CodePemeriksaan dasar kode yang sudah tidak terpakai - selalu false instanceof dan pemeriksaan tipe lainnya, if else mati, kode yang tidak terjangkau setelah return; dll.
05ArgumentsMemeriksa tipe argumen yang dimasukkan sebagai parameter pada method dan fungsi.
06Type HintsMelaporkan kurangnya petunjuk tipe (argument atau return value).
07Union TypesMelaporkan sebagian salahnya tipe gabungan, jika Anda memanggil metode yang hanya ada pada beberapa tipe dalam tipe gabungan, level 7 mulai melaporkan hal tersebut.
08Nullable TypesMelaporkan panggilan metode dan akses ke properti pada tipe yang dapat bernilai null.
09Mixed TypeMenjadi sangat ketat tentang tipe campuran, satu-satunya operasi yang diizinkan yang dapat Anda lakukan dengannya adalah meneruskannya ke tipe campuran lainnya.
+

Berkas Konfigurasi

+

PHPStan menggunakan berkas konfigurasi, phpstan.neon atau phpstan.neon.dist, yang memungkinkan Anda:

+
    +
  • Mendefinisikan path yang akan dianalisis.
  • +
  • Menetapkan tingkat aturan.
  • +
  • Mengecualikan path.
  • +
  • Menyertakan ekstensi PHPStan.
  • +
  • Mengabaikan kesalahan.
  • +
  • Menentukan jumlah maksimum proses paralel.
  • +
+

Berikut adalah contoh berkas konfigurasi sederhana yang secara default berada di direktori root aplikasi Anda, tetapi Anda dapat mempelajari lebih lanjut dari referensi konfigurasi.

+
includes:
+    - ./vendor/nunomaduro/larastan/extension.neon
+
+parameters:
+
+    paths:
+        - app
+        - config
+        - database
+        - routes
+
+    # Tingkat 9 adalah tingkat tertinggi
+    level: 5
+
+    ignoreErrors:
+        - '#PHPDoc tag @var#'
+
+    parallel:
+        maximumNumberOfProcesses: 4
+
+    noUnnecessaryCollectionCall: false
+    checkMissingIterableValueType: false
+

Mengabaikan Kesalahan

+

Kemungkinan besar, Anda akan perlu mengabaikan beberapa kesalahan yang untungnya diizinkan dengan dua cara berbeda:

+
    +
  1. +

    Secara langsung menggunakan tag PHPDoc

    +
    function () {
    +    /** @phpstan-ignore-next-line */
    +    echo $foo;
    +
    +    echo $bar /** @phpstan-ignore-line */
    +}
    +
  2. +
  3. +

    Dari berkas konfigurasi dan ini sebenarnya lebih bersih

    +
    parameters:
    +
    +    ignoreErrors:
    +
    +        -
    +            message: 'Access to an undefined property [a-zA-Z0-9\_]+::\$foo'
    +            path: some/dir/someFile.php
    +        -
    +            message: '#Call to an undefined method [a-zA-Z0-9\_]+::doFoo()#'
    +            path: other/dir/DifferentFile.php
    +            count: 2 # opsional, dan itu akan mengabaikan dua kemunculan pertama kesalahan
    +      -
    +            message: '#Call to an undefined method [a-zA-Z0-9\_]+::doBar()#'
    +            paths:
    +                - some/dir/*
    +                - other/dir/*
    +
  4. +
+

Selengkapnya bisa dibaca di documentasi https://phpstan.org/user-guide/getting-started


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2023/12/docker-compose/index.html b/2023/12/docker-compose/index.html new file mode 100644 index 00000000..9d79385d --- /dev/null +++ b/2023/12/docker-compose/index.html @@ -0,0 +1,80 @@ +Apa itu Docker Compose? | Dev Jurnal

Apa itu Docker Compose?

Docker Compose adalah alat untuk mendefinisikan dan menjalankan aplikasi Docker multi-kontainer (beberapa container yang saling terkait). Dengan Compose, kita menggunakan file YAML untuk mengonfigurasi service-service yang dibutuhkan aplikasi kita. Kemudian, dengan satu perintah, kita membuat dan memulai semua service yang dibutuhkan tersebut dari konfigurasi kita.

+

Satu contoh ketika kita memiliki aplikasi dashboard yang dibangun dengan framework Laravel, maka kita membutuhkan service php, mysql, npm, nginx untuk bisa menjalankannya. Docker compose dapat mengonfigurasikan semua container yang berisi service tersebut dan menjalankannya dengan satu perintah.

+

Compose dapat berjalan di semua lingkungan; production, staging, development, testing, serta work flow CI. Compose juga dilengkapi dengan perintah untuk mengelola seluruh siklus hidup aplikasi kita:

+
    +
  • Memulai, menghentikan, dan membangun kembali service-service (up, down, build)
  • +
  • Lihat status service yang berjalan
  • +
  • Streaming output log dari service yang berjalan
  • +
  • Jalankan perintah satu kali pada suatu service
  • +
+

Fitur utama Compose yang menjadikannya efektif adalah:

+
    +
  • Memiliki beberapa lingkungan terisolasi pada satu host
  • +
  • Menyimpan volume data saat kontainer dibuat (database tidak terhapus saat layanan dimatikan)
  • +
  • Hanya membuat ulang container yang telah berubah
  • +
  • Mendukung variabel dan memindahkan komposisi antar lingkungan
  • +

Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2024/01/10-hal-yang-harus-dipelajari-oleh-programmer-tentang-belajar/index.html b/2024/01/10-hal-yang-harus-dipelajari-oleh-programmer-tentang-belajar/index.html new file mode 100644 index 00000000..97119b13 --- /dev/null +++ b/2024/01/10-hal-yang-harus-dipelajari-oleh-programmer-tentang-belajar/index.html @@ -0,0 +1,97 @@ +10 Hal yang Harus Dipelajari oleh Programmer tentang "Belajar" | Dev Jurnal

10 Hal yang Harus Dipelajari oleh Programmer tentang "Belajar"

Sebuah artikel yang menarik membahas tentang “belajar” khususnya di dunia pengembang perangkat lunak. Banyak wawasan dari tulisan ini membatalkan mitos-mitos yang sering dipercayai tentang belajar. Salah satu yang paling menarik adalah bahwa belajar dalam rentang waktu yang lama secara terus menerus tanpa istirahat justru kurang efektif. Ini juga disimpulkan dengan memahami cara kerja memori di otak manusia. Artikel ini membahas tentang belajar dari beberapa sudut pandang, pembelajar, pengajar dan perekrut.

+

Silahkan baca artikel aslinya di sini: 10 Things Software Developers Should Learn about Learning

+

Wawasan Utama

+
    +
  1. Ingatan Manusia Tidak Terbuat dari Bit
  2. +
  3. Memori Manusia Terdiri dari Satu Sistem Terbatas dan Satu Sistem Tidak Terbatas
  4. +
  5. Pakar Mengenali, Pemula membuat Alasan
  6. +
  7. Pemahaman Konsep Beranjak dari Abstrak ke Konkret dan Kembali
  8. +
  9. Jarak dan Pengulangan itu Penting
  10. +
  11. Internet Belum Membuat Proses Belajar Menjadi Sesuatu yang Usang
  12. +
  13. Pemecahan Masalah Bukanlah Keterampilan Umum
  14. +
  15. Keahlian justru Bisa Menjadi Masalah dalam Beberapa Situasi
  16. +
  17. Prediktor Kemampuan Pemrograman itu Tidak Jelas
  18. +
  19. Pola Pikir Anda Penting
  20. +
+

Rekomendasi

+

Penulis telah membagi rekomendasi menjadi 2, rekomendasi untuk perekrutan dan rekomendasi untuk pelatihan dan pembelajaran.

+

Untuk perekrutan, berikut rekomendasinya:

+
    +
  • Tidak ada proksi yang bagus untuk kemampuan pemrograman. Stereotip berdasarkan gender, ras, atau faktor lainnya tidak didukung oleh bukti ilmiah. Jika Anda ingin mengetahui seberapa baik kandidat memprogram, lihat pekerjaan mereka sebelumnya atau uji mereka pada tugas pemrograman yang sebenarnya. Untuk menekankan hal tertentu: Jangan menguji kandidat dengan teka-teki asah otak.
  • +
  • Setidaknya di kalangan pengembang muda, pengalaman bertahun-tahun mungkin bukan ukuran kemampuan yang dapat diandalkan.
  • +
  • Rekomendasi terkait dari Behroozi dkk.3 adalah meminta kandidat menyelesaikan sendiri masalah wawancara di ruangan sebelum menyajikan solusinya, karena tekanan tambahan dari pewawancara yang mengamati atau mengharuskan berbicara sambil menyelesaikannya akan menambah beban kognitif dan stres dalam cara yang mengganggu kinerja.
  • +
+

Untuk pembelajaran dan pelatihan, berikut rekomendasinya:

+
    +
  • Membaca banyak kode akan membantu seseorang menjadi programmer yang lebih efisien.
  • +
  • Para ahli tidak selalu yang terbaik dalam melatih pemula.
  • +
  • Pembelajaran membutuhkan waktu, termasuk waktu antar sesi pembelajaran. Menjejalkan secara intens tidaklah efektif, tetapi pengulangan dengan jarak cukup efektif.
  • +
  • Demikian pula, menghabiskan waktu jauh dari suatu masalah dapat membantu menyelesaikannya.
  • +
  • Hanya karena Anda dapat menemukannya melalui pencarian di Internet atau alat AI generatif, bukan berarti pembelajaran sudah ketinggalan zaman.
  • +
  • Gunakan contoh untuk membedakan konsep abstrak dan fakta konkret yang dapat dipelajari.
  • +
  • Berusaha untuk berhasil (daripada menghindari kegagalan) dan percaya bahwa kemampuan dapat diubah, merupakan faktor penting dalam ketahanan dan pembelajaran (mindset itu penting!).
  • +

Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2024/02/ajari-diri-anda-pemrograman-dalam-sepuluh-tahun/index.html b/2024/02/ajari-diri-anda-pemrograman-dalam-sepuluh-tahun/index.html new file mode 100644 index 00000000..e3fedd46 --- /dev/null +++ b/2024/02/ajari-diri-anda-pemrograman-dalam-sepuluh-tahun/index.html @@ -0,0 +1,158 @@ +Ajari Diri Anda Pemrograman dalam Sepuluh Tahun | Dev Jurnal

Ajari Diri Anda Pemrograman dalam Sepuluh Tahun

Satu artikel menarik ditulis oleh Peter Norvig tentang belajar pemrograman. Kita bisa membaca versi aslinya di sini Teach Yourself Programming in Ten Years dan versi bahasa Indonesia Belajar Programming Sendiri Dalam Sepuluh Tahun. +Saya merasa perlu menulis ulang ini di blog untuk mempermudah saya :)

+

Mengapa semua orang terburu-buru?

+

Norvig melakukan riset dan menemukan bahwa sekarang ini banyak sekali buku dengan judul “Belajar X dalam Y hari” atau bahkan jam. Entah orang-orang sekarang ini terburu-buru untuk belajar +tentang komputer, atau komputer adalah hal yang sangat mudah dipelajari dari hal-hal lainnya. Tidak ada buku untuk belajar Beethoven, atau Fisika Kuantum, +atau bahkan Melatih Anjing dalam beberapa hari.

+

Terlalu cepat, sebatas permukaan

+

Dalam waktu sesingkat 3 hari kita tidak akan punya cukup waktu untuk menulis beberapa program yang berguna, dan belajar dari keberhasilan dan kegagalan program-program ini. +Kita tidak akan punya cukup waktu untuk bekerja dengan seorang programmer berpengalaman dan mengerti seperti apa hidup dalam lingkungan C++. +Singkatnya, kita tidak akan punya cukup waktu untuk belajar banyak. Jadi buku dengan judul semacam itu hanya bisa berbicara tentang hal-hal yg superfisial, bukan pengertian yg mendalam.

+
+

“Mengerti sesuatu hal dengan sedikit adalah hal yang berbahaya.” - Alexander Pope

+
+

Belajar memrogram

+

Dalam 3 hari kita bisa belajar sedikit sintaks C++ (jika kita telah mengetahui bahasa pemrograman yg lain), tapi tidak bisa belajar banyak bagaimana cara menggunakan bahasa tersebut. +Singkatnya, jika kita adalah seorang programmer Basic, kita bisa belajar menulis program menggunakan sintaks C++ dalam gaya Basic, tapi kita tidak bisa memahami keunggulan +dan kekurangan dari C++. Satu contoh lain adalah kita perlu belajar sedikit tentang JavaScript karena perlu membuat sebuah interface dari program yang sudah ada. +Yang sebenarnya terjadi adalah kita tidak sedang mempelajari bagaimana untuk memrogram; kita hanya belajar bagaimana melakukan hal tersebut. Jadi apa gunanya?

+
+

“Sebuah bahasa pemrograman yang tidak mengubah cara berpikir anda tentang pemrograman, tidak berguna untuk dipelajari.” - Alan Perlis

+
+

Mengapa Belajar dalam Sepuluh Tahun?

+

Banyak bukti ilmiah yang menunjukkan bahwa perlu waktu yang panjang bagi seseorang untuk mengembangkan keahliannya.

+
    +
  • Bloom (1985), Bryan & Harter (1899), Hayes (1989), Simmon & Chase (1973) menunjukkan bahwa diperlukan sekitar sepuluh tahun untuk mengembangkan keahlian +di berbagai macam bidang, termasuk bermain catur, mengomposisi musik, mengoperasikan telegraf, melukis, bermain piano, berenang, bermain tenis, dan riset dalam bidang neuropsychology +dan topology.
  • +
  • +

    Malcolm Gladwell mengatakan itu perlu 10,000 jam, berdasarkan laporan dalam sebuah studi murid-murid di Berlin Academy of Music yang membandingkan tiga group: terbaik, menengah, +dan terakhir dari sebuah kelas dan bertanya kepada mereka berapa lama mereka latihan:

    +
    +

    Setiap orang, dari ketiga group ini, mulai bermain kira-kira pada umur yang sama, sekitar umur 3 – 5 tahun. +Dalam tahun-tahun pertama ini, semua latihan sekitar 2 – 3 jam seminggu. Tetapi sekitar umur 8 tahun, perbedaan yang sesungguhnya mulai muncul.

    +

    Murid-murid yang akan menjadi terbaik di kelasnya mulai berlatih lebih banyak dari yg lainnya:
    +6 jam seminggu pada umur 9
    +8 jam seminggu pada umur 12
    +16 jam seminggu pada umur 14
    +dan terus bertambah hingga saat mereka berumur 20 tahun mereka berlatih lebih dari 30 jam seminggu.

    +

    Saat mereka berumur 20 tahun, orang-orang terbaik ini telah berlatih selama 10,000 jam dalam hidup mereka. +Murid-murid yg cukup baik hanya 8,000 jam, dan yang menjadi guru musik di masa depan hanya sedikit lebih dari 4,000 jam.

    +
    +
  • +
  • Samuel Johnson (1709-1784) berpikir bahwa angkanya lebih banyak: “Kesempurnaan di bidang apapun bisa didapatkan hanya dengan usaha seumur hidup; +hal tersebut tidak bisa dibeli dengan harga yang kurang dari itu.”
  • +
  • Dan Chaucer (1340-1400) mengatakan “hidup ini terlalu pendek, keahlian terlalu banyak untuk dipelajari.”
  • +
  • Hippocrates (sekitar 400SM) dikenal karena kata-kata berikut “ars longa, vita brevis”, yang adalah bagian dari kata-kata yang lebih panjang +“Ars longa, vita brevis, occasio praeceps, experimentum periculosum, iudicium difficile”, yang berarti “Hidup ini pendek, keahlian lama, +kesempatan menghilang, eksperimen berbahaya, keputusan sulit.”
  • +
+

Resep Sukses Belajar Pemrograman

+
    +
  • Miliki ketertarikan kepada programming dan lakukan karena itu mengasyikan. Pastikan bahwa itu akan tetap mengasyikan sehingga kita akan mau melakukannya untuk 10 tahun.
  • +
  • Bicara dengan programmer-programmer lain; baca program-program lain. Hal ini lebih penting daripada sebuah buku atau kursus.
  • +
  • Membuat program (learning by doing). Ini adalah bentuk latihan dengan penuh perhatian. Kita akan merasakan bagaimana menghadapi sebuah masalah dan menemukan solusinya.
  • +
  • Buat kesalahan, dapatkan feedback, perbaiki. Pengalaman tidak dihitung dari sekedar melakukan sesuatu berulang-ulang selama periode waktu tertentu. Dalam berlatih, pastikan ini dilakukan dengan +tingkat kesulitan yang tepat, mulai dari yang paling mudah lalu tingkatkan kesulitannya sedikit demi sedikit. Lakukan seperti sebuah eksperimen, buatlah kesalahan lalu perbaiki.
  • +
  • Kuliah (jika mau), gunakan empat tahun di kampus (atau lebih jika S2). Hal ini akan memberi kita akses untuk pekerjaan-pekerjaan yang membutuhkan sebuah gelar, +dan hal ini juga akan memberi kita pengertian mendalam tentang bidang ini.
  • +
  • +

    Cari pekerjaan. Jika tidak menyukai sekolah, kita bisa (dengan cukup dedikasi) mendapatkan pengalaman yang mirip di pekerjaan. Belajar dari buku saja tidak akan cukup.

    +
    +

    “Pendidikan Computer Science tidak bisa membuat siapapun menjadi programmer, sama halnya mempelajari kuas dan warna tidak bisa membuat seseorang menjadi pelukis.” - Eric Raymond, +penulis “The New Hacker’s Dictionary”.

    +
    +
  • +
  • Kerjakan project bersama programmer-programmer lain. Jadilah programmer terbaik di dalam beberapa project; dan jadilah yg terburuk di project lainnya. +Saat kita menjadi yang terbaik, kita punya kesempatan mencoba kemampuan memimpin sebuah project, dan menginspirasi orang lain dengan visi kita. +Saat kita menjadi yang terburuk, kita belajar apa yang dilakukan oleh para ahli, dan belajar apa yang mereka tidak suka lakukan (karena mereka membuat kita melakukannya untuk mereka).
  • +
  • Kerjakan project yang telah dikerjakan programmer-programmer lain. Ikutlah terlibat untuk mengerti sebuah program yang ditulis orang orang lain. +Coba untuk mengerti dan membetulkannya saat pembuatnya sedang tidak ada. Berpikirlah bagaimana membuat desain program kita mudah untuk orang lain memaintainnya.
  • +
  • Pelajari paling sedikit 6 bahasa pemrogramman. Pelajari satu bahasa yang mendukung abstraksi class (seperti Java atau C++), satu yang mendukung abstraksi fungsi +(seperti Lisp atau ML), satu yang mendukung abstraksi syntaks (seperti Lisp), satu yang mendukung spesifikasi deklaratif (seperti template Prolog atau C++), +satu yang mendukung coroutines (seperti Icon atau Scheme), dan satu yang mendukung parallelisme (seperti Sisal).
  • +
  • Pahami komputer Ingat bahwa terdapat kata “komputer” dalam “ilmu komputer”. Ketahuilah bagaimana komputer bekerja, misalnya berapa lama dibutuhkan komputer untuk mengeksekusi sebuah instruksi, +mengambil sebuah kata dari memori, membaca beberapa kata dari disk, dan mencari lokasi baru pada disk.
  • +
  • Terlibat dalam usaha standarisasi sebuah bahasa. Kita akan belajar apa yang orang lain sukai dalam sebuah bahasa, seberapa dalam perasaan itu, +dan mungkin sedikit tentang mengapa mereka memiliki perasaan tersebut.
  • +
  • Miliki sebuah perasaan untuk lepas dari usaha standarisasi bahasa secepat mungkin.
  • +
+

Perlis mengatakan bahwa para pemain hebat memiliki kualitas internal yang melampaui pelatihan mereka. Tapi dari mana kualitasnya berasal? Apakah itu bawaan? +Atau apakah mereka mengembangkannya melalui ketekunan?

+
+

“Siapa pun bisa memasak, tapi hanya mereka yang tak kenal takut yang bisa menjadi hebat.” - Auguste Gusteau (koki fiksi di Ratatouille)

+
+

Norvig menganggap pernyataan tersebut sebagai keberanian untuk bersedia mengabdikan sebagian besar hidup seseorang untuk melakukan praktik deliberatif.

+
+

“Tidak semua orang bisa menjadi seniman hebat, tapi seniman hebat bisa datang dari mana saja.” Anton Ego (kritikus Gusteau)

+
+

Jadi, silakan beli buku Java/Ruby/Javascript/PHP itu; kita mungkin akan mendapat manfaat darinya. Namun itu tidak akan mengubah hidup kita, +atau keahlian kita secara keseluruhan sebagai seorang programmer dalam 24 jam atau 21 hari. +Bagaimana jika kita mencoba bekerja keras untuk terus berkembang selama 24 bulan?


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2024/02/apa-itu-env-file/index.html b/2024/02/apa-itu-env-file/index.html new file mode 100644 index 00000000..f387a610 --- /dev/null +++ b/2024/02/apa-itu-env-file/index.html @@ -0,0 +1,89 @@ +Apa Itu .env File? | Dev Jurnal

Apa Itu .env File?

Dalam dunia pengembangan perangkat lunak, pengelolaan konfigurasi menjadi aspek penting dalam memastikan aplikasi berjalan dengan lancar di berbagai lingkungan. Salah satu alat yang telah merevolusi cara pengembang mengelola konfigurasi adalah file .env.

+

Asal Usul

+

Konsep penggunaan variabel lingkungan (environment - env) untuk mengelola konfigurasi sudah ada sejak lama, terutama dalam sistem operasi seperti Unix dan Linux. Namun, penggunaan variabel env secara langsung dalam kode tidak efisien dan kurang fleksibel, terutama ketika aplikasi harus di-deploy ke berbagai lingkungan (development, staging, production).

+

Munculnya file .env

+

Kemunculan file .env menjadi solusi bagi masalah tersebut. .env memungkinkan pengembang menyimpan variabel env di luar kode sumber, dalam bentuk file teks yang mudah dibaca. Pengembang dapat menentukan konfigurasi yang spesifik untuk setiap env tanpa harus memodifikasi kode sumber.

+

Penggunaan yang Populer

+

Penggunaan .env mulai populer bersamaan dengan munculnya framework pengembangan web seperti Ruby on Rails dan Laravel. Pengembang menggunakan .env untuk menyimpan informasi sensitif seperti API key atau kredensial database, yang tidak seharusnya disimpan dalam kode sumber. Penggunaan .env juga memungkinkan pengembang untuk dengan mudah berbagi konfigurasi dengan anggota tim lainnya.

+

Keuntungan

+

Penggunaan file .env membawa beberapa keuntungan, antara lain:

+
    +
  • Pemisahan Konfigurasi: .env memungkinkan pemisahan konfigurasi dari kode sumber, memudahkan pengelolaan konfigurasi di berbagai lingkungan.
  • +
  • Keamanan: Informasi sensitif dapat disimpan secara aman di dalam .env, mengurangi risiko kebocoran informasi.
  • +
  • Fleksibilitas: Penggunaan .env memungkinkan pengembang untuk dengan mudah menyesuaikan konfigurasi untuk berbagai lingkungan tanpa harus mengubah kode sumber.
  • +
+

Kekurangan

+

Selain itu, ada beberapa kekurangan:

+
    +
  • Penyimpanan Rumit: Ini adalah keterbatasan dari file. Kita tidak bisa menyimpan file di repo karena semua orang bisa melihatnya. Menyimpannya di root VM juga memiliki keterbatasan akses. Bagaimana dengan Docker container? Apakah kita memasukkan informasi rahasia langsung ke dalam image? Jika image tersebut bocor, semua orang akan punya akses ke informasi rahasia kita
  • +
  • Keterbatasan Akses: Apa yang terjadi jika kita perlu memperbarui password database? Ketika seseorang membuka file .env dia dapat melihat semua informasi rahasia di dalam file tersebut. Setiap kali suatu konfigurasi harus diperbarui, siapa pun yang memperbaruinya dapat melihat SEMUA informasi rahasia.
  • +
  • Pembuatan Versi: Katakanlah kita sedang menerapkan fitur baru yang memerlukan pembaruan konfigurasi/variabel rahasia, terjadi kesalahan dan pembaruan dibatalkan. Apakah ada yang ingat informasi terakhir yang kita miliki di .env? Kita tidak memiliki riwayat perubahan sebuah file .env yang tidak disimpan di dalam repo.
  • +
+

Penggunaan Modern

+

Dalam dunia pengembangan perangkat lunak modern, .env telah menjadi standar de facto dalam pengelolaan konfigurasi. Pengembang dari berbagai bahasa dan framework menggunakan .env untuk mengelola konfigurasi dengan efisien dan aman.

+

Salah satu solusi yang muncul untuk mengatasi kekurangan file env adalah menggunakan server konfigurasi. Server konfigurasi adalah aplikasi eksternal untuk menyimpan konfigurasi dan rahasia. Ini dianggap sebagai pusat untuk mengelola rahasia di seluruh lingkungan.

+

Beberapa layanan cloud dapat berfungsi sebagai server konfigurasi seperti AWS Parameter Store, Google Secrets Manager, atau HashiCorp Vault untuk para penggemar open source. Di tempat saya bekerja sendiri sudah memindahkan konfigurasi dari env file ke layanan Infisical. Setelah kita menyimpan informasi rahasia atau konfigurasi, kita akan diberikan URL seperti https://app.com/config/DB_PASSWORD/v1.


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2024/02/kursus-menulis-teknis-google-bagian-satu/index.html b/2024/02/kursus-menulis-teknis-google-bagian-satu/index.html new file mode 100644 index 00000000..f04d324d --- /dev/null +++ b/2024/02/kursus-menulis-teknis-google-bagian-satu/index.html @@ -0,0 +1,116 @@ +Kursus Menulis Teknis Google - Bagian Satu | Dev Jurnal

Kursus Menulis Teknis Google - Bagian Satu

Ini adalah ringkasan dari Kursus Menulis Teknis Google bagian satu.

+
+

Every engineer is also a writer.

+
+

Memilih kata

+
    +
  • Definisikan istilah-istilah baru atau asing.
  • +
  • Gunakan akronim dengan benar.
  • +
  • Gunakan istilah secara konsisten.
  • +
  • Hindari kata ganti yang ambigu.
  • +
+

Gunakan kalimat aktif

+
    +
  • Pilih kalimat aktif dibanding kalimat pasif.
  • +
  • Kata kerja imperatif biasanya akan membuat kalimat aktif.
  • +
+

Menyusun kalimat yang jelas

+
    +
  • Pilih kata kerja yang spesifik daripada kata kerja yang tidak jelas (terlalu umum).
  • +
+

Buat kalimat yang singkat

+
    +
  • Fokuskan setiap kalimat pada satu ide.
  • +
  • Ubah beberapa kalimat panjang menjadi sebuah daftar (ordered/unordered list).
  • +
  • Hilangkan kata-kata yang tidak diperlukan.
  • +
+

Membuat daftar dan tabel

+
    +
  • Gunakan daftar bernomor (ordered list) bila pengurutan penting dan daftar berpoin (bulleted list) bila pengurutan tidak relevan.
  • +
  • Jaga agar item dalam daftar tetap paralel (berhubungan/lingkup topik yang sama).
  • +
  • Mulailah item daftar bernomor dengan kata-kata penting.
  • +
  • Perkenalkan daftar dan tabel dengan tepat.
  • +
+

Menyusun sebuah paragraf

+
    +
  • Buat kalimat pembuka yang bagus yang menetapkan titik sentral paragraf.
  • +
  • Fokuskan setiap paragraf pada satu topik.
  • +
  • Jangan membuat paragraf terlalu panjang atau terlalu pendek.
  • +
  • Usahakan sebuah paragraf menjawab pertanyaan apa, mengapa dan bagaimana.
  • +
+

Audiens

+
    +
  • Tentukan apa yang perlu dipelajari audiens Anda.
  • +
  • Sesuaikan dokumentasi dengan audiens Anda.
  • +
+

Menyusun dokumen

+
    +
  • Nyatakan cakupan dokumen Anda.
  • +
  • Nyatakan audiens dokumen Anda.
  • +
  • Tetapkan poin-poin penting dokumen Anda di awal dokumen.
  • +
  • Tulislah dokumen untuk memenuhi kebutuhan audiens Anda.
  • +

Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2024/02/mengenal-feature-integration-dan-regression-test/index.html b/2024/02/mengenal-feature-integration-dan-regression-test/index.html new file mode 100644 index 00000000..a182752a --- /dev/null +++ b/2024/02/mengenal-feature-integration-dan-regression-test/index.html @@ -0,0 +1,76 @@ +Mengenal Feature Test, Integration Test, dan Regression Test | Dev Jurnal

Mengenal Feature Test, Integration Test, dan Regression Test

Pengembangan perangkat lunak adalah proses yang berkelanjutan. Para pengembang menambah fitur baru dan memperbaiki bug secara terus menerus. Dengan perubahan yang dilakukan terus menerus tersebut, kita perlu metode untuk memastikan perangkat lunak bekerja sesuai ekspektasi dan standar kualitas yang sudah ditetapkan. Di sinilah test atau pengujian perangkat lunak berperan.

+

Ini adalah pembahasan singkat tentang tiga jenis pengujian penting dalam pengembangan perangkat lunak: Feature Test, Integration Test, dan Regression Test. Mari kita mulai dengan memahami apa itu masing-masing pengujian dan bagaimana mereka berperan dalam memastikan kualitas perangkat lunak.

+

Feature Test (Pengujian Fitur)

+

Pengujian fitur adalah jenis pengujian yang bertujuan untuk memeriksa apakah fitur atau fungsi yang baru dikembangkan berfungsi sebagaimana mestinya. Dalam pengujian ini, fokus utamanya adalah pada satu fitur atau fungsi spesifik.

+

Contoh: Jika aplikasi kita memiliki fitur “buat postingan baru”, pengujian fitur akan memeriksa apakah pos tersebut dapat dibuat dengan benar, apakah gambar dapat diunggah dengan sukses, dan apakah pesan kesalahan muncul jika terjadi masalah.

+

Integration Test (Pengujian Integrasi)

+

Pengujian integrasi melibatkan pengujian interaksi antara komponen-komponen perangkat lunak yang berbeda untuk memastikan bahwa mereka bekerja secara bersamaan dengan baik. Tujuan utamanya adalah untuk menguji koneksi antara unit-unit yang berbeda dalam aplikasi.

+

Contoh: Pengujian integrasi adalah memastikan bahwa sistem pembayaran terhubung dengan basis data pelanggan dengan benar, atau bahwa sistem otentikasi berinteraksi dengan antarmuka pengguna tanpa masalah.

+

Regression Test (Pengujian Regresi)

+

Pengujian regresi bertujuan untuk memastikan bahwa perubahan yang baru diterapkan dalam perangkat lunak tidak mengganggu fungsi yang sudah ada sebelumnya. Ini dilakukan dengan menguji kembali fitur-fitur yang telah diuji sebelumnya setelah ada perubahan dalam kode atau integrasi baru.

+

Contoh: Jika kita telah menguji fitur pembayaran dalam versi sebelumnya, pengujian regresi akan memeriksa apakah fitur tersebut masih berfungsi setelah pembaruan atau perubahan lainnya.

+

Dengan memahami ketiga jenis pengujian ini, tim pengembangan perangkat lunak dapat memastikan bahwa aplikasi yang dikembangkan memiliki kualitas yang tinggi dan bebas dari bug yang tidak diinginkan. Terlebih lagi, dengan mengimplementasikan pengujian-pengujian ini secara efektif, kita dapat meningkatkan kepercayaan pengguna terhadap produk kita.


Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/2024/03/kursus-menulis-teknis-google-bagian-satu/index.html b/2024/03/kursus-menulis-teknis-google-bagian-satu/index.html new file mode 100644 index 00000000..84269b7f --- /dev/null +++ b/2024/03/kursus-menulis-teknis-google-bagian-satu/index.html @@ -0,0 +1,103 @@ +Kursus Menulis Teknis Google - Bagian Dua | Dev Jurnal

Kursus Menulis Teknis Google - Bagian Dua

Ini adalah ringkasan dari Kursus Menulis Teknis Google bagian dua.

+

Mengedit mandiri

+
    +
  • Gunakan panduan gaya.
  • +
  • Berpikirlah seperti audiens.
  • +
  • Baca dokumen dengan suara keras (untuk diri sendiri).
  • +
  • Kembali ke dokumen setelah menulis drafnya.
  • +
  • Temukan editor rekan (peer) yang baik.
  • +
+

Mengorganisasi dokumen berukuran besar

+
    +
  • Buat garis besar dokumen. Alternatifnya, tulis formulir bebas lalu atur.
  • +
  • Perkenalkan ruang lingkup dokumen dan prasyarat apa pun.
  • +
  • Lebih baik judul berbasis tugas.
  • +
  • Mengungkapkan informasi secara progresif (dalam beberapa situasi).
  • +
+

Membuat ilustrasi

+
    +
  • Pertimbangkan untuk menulis keterangan sebelum membuat ilustrasi.
  • +
  • Batasi jumlah informasi dalam satu gambar.
  • +
  • Fokuskan perhatian pembaca pada bagian yang relevan dari sebuah gambar atau diagram dengan menjelaskan maksudnya dalam keterangan atau dengan menambahkan isyarat visual pada gambar.
  • +
+

Membuat contoh kode

+
    +
  • Buat contoh kode ringkas yang mudah dimengerti.
  • +
  • Jaga agar komentar kode tetap singkat, tetapi tetap mengutamakan kejelasan daripada singkatnya.
  • +
  • Hindari menulis komentar tentang kode yang jelas.
  • +
  • Fokuskan energi komentar Anda pada hal-hal yang tidak intuitif dalam kode.
  • +
  • Berikan tidak hanya contoh yang benar tetapi juga contoh yang salah.
  • +
  • Berikan contoh kode yang menunjukkan berbagai kompleksitas.
  • +
+

Revisi

+
    +
  • Biasakan melakukan revisi terus menerus.
  • +
  • Sediakan jenis dokumentasi yang berbeda untuk berbagai kategori pengguna.
  • +
  • Bandingkan dan kontraskan dengan sesuatu yang sudah familiar bagi pembaca.
  • +
  • Dalam tutorial, perkuat konsep dengan contoh.
  • +
  • Dalam tutorial, perhatikan masalah yang mungkin dihadapi pembaca.
  • +

Written by@mmdmthr
My notes in public space

GitHubLinkedIn

\ No newline at end of file diff --git a/404.html b/404.html new file mode 100644 index 00000000..d5a61f9a --- /dev/null +++ b/404.html @@ -0,0 +1,61 @@ +404: Not Found | Dev Jurnal

Not Found

You just hit a route that doesn't exist... the sadness.

\ No newline at end of file diff --git a/404/index.html b/404/index.html new file mode 100644 index 00000000..208fedb5 --- /dev/null +++ b/404/index.html @@ -0,0 +1,61 @@ +404: Not Found | Dev Jurnal

Not Found

You just hit a route that doesn't exist... the sadness.

\ No newline at end of file diff --git a/CNAME b/CNAME new file mode 100644 index 00000000..aaf9c77e --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +www.devjurnal.com \ No newline at end of file diff --git a/about/index.html b/about/index.html new file mode 100644 index 00000000..21b2abbb --- /dev/null +++ b/about/index.html @@ -0,0 +1,64 @@ +

Muhammad Muthahhari

+
+

Thank you for reading my resume. If you want to contact me, Please send me an email.

+
\ No newline at end of file diff --git a/app-023ae061509e1db264bf.js b/app-023ae061509e1db264bf.js new file mode 100644 index 00000000..8d7cb7a3 --- /dev/null +++ b/app-023ae061509e1db264bf.js @@ -0,0 +1,3 @@ +/*! For license information please see app-023ae061509e1db264bf.js.LICENSE.txt */ +(window.webpackJsonp=window.webpackJsonp||[]).push([[5],{"+ZDr":function(t,e,n){"use strict";var r=n("TqRt");e.__esModule=!0,e.withPrefix=h,e.withAssetPrefix=function(t){return h(t,m())},e.navigateTo=e.replace=e.push=e.navigate=e.default=void 0;var o=r(n("8OQS")),i=r(n("PJYZ")),a=r(n("VbXa")),u=r(n("pVnL")),c=r(n("17x9")),s=r(n("q1tI")),l=n("YwZP"),f=n("LYrO"),p=n("cu4x");e.parsePath=p.parsePath;var d=function(t){return null==t?void 0:t.startsWith("/")};function h(t,e){var n,r;if(void 0===e&&(e=v()),!g(t))return t;if(t.startsWith("./")||t.startsWith("../"))return t;var o=null!==(n=null!==(r=e)&&void 0!==r?r:m())&&void 0!==n?n:"/";return""+((null==o?void 0:o.endsWith("/"))?o.slice(0,-1):o)+(t.startsWith("/")?t:"/"+t)}var m=function(){return""},v=function(){return""},g=function(t){return t&&!t.startsWith("http://")&&!t.startsWith("https://")&&!t.startsWith("//")};var y=function(t,e){return"number"==typeof t?t:g(t)?d(t)?h(t):function(t,e){return d(t)?t:(0,f.resolve)(t,e)}(t,e):t},b={activeClassName:c.default.string,activeStyle:c.default.object,partiallyActive:c.default.bool};function w(t){return s.default.createElement(l.Location,null,(function(e){var n=e.location;return s.default.createElement(O,(0,u.default)({},t,{_location:n}))}))}var O=function(t){function e(e){var n;(n=t.call(this,e)||this).defaultGetProps=function(t){var e=t.isPartiallyCurrent,r=t.isCurrent;return(n.props.partiallyActive?e:r)?{className:[n.props.className,n.props.activeClassName].filter(Boolean).join(" "),style:(0,u.default)({},n.props.style,n.props.activeStyle)}:null};var r=!1;return"undefined"!=typeof window&&window.IntersectionObserver&&(r=!0),n.state={IOSupported:r},n.handleRef=n.handleRef.bind((0,i.default)(n)),n}(0,a.default)(e,t);var n=e.prototype;return n._prefetch=function(){var t=window.location.pathname;this.props._location&&this.props._location.pathname&&(t=this.props._location.pathname);var e=y(this.props.to,t),n=(0,p.parsePath)(e).pathname;t!==n&&___loader.enqueue(n)},n.componentDidUpdate=function(t,e){this.props.to===t.to||this.state.IOSupported||this._prefetch()},n.componentDidMount=function(){this.state.IOSupported||this._prefetch()},n.componentWillUnmount=function(){if(this.io){var t=this.io,e=t.instance,n=t.el;e.unobserve(n),e.disconnect()}},n.handleRef=function(t){var e,n,r,o=this;this.props.innerRef&&this.props.innerRef.hasOwnProperty("current")?this.props.innerRef.current=t:this.props.innerRef&&this.props.innerRef(t),this.state.IOSupported&&t&&(this.io=(e=t,n=function(){o._prefetch()},(r=new window.IntersectionObserver((function(t){t.forEach((function(t){e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(r.unobserve(e),r.disconnect(),n())}))}))).observe(e),{instance:r,el:e}))},n.render=function(){var t=this,e=this.props,n=e.to,r=e.getProps,i=void 0===r?this.defaultGetProps:r,a=e.onClick,c=e.onMouseEnter,f=(e.activeClassName,e.activeStyle,e.innerRef,e.partiallyActive,e.state),d=e.replace,h=e._location,m=(0,o.default)(e,["to","getProps","onClick","onMouseEnter","activeClassName","activeStyle","innerRef","partiallyActive","state","replace","_location"]);var v=y(n,h.pathname);return g(v)?s.default.createElement(l.Link,(0,u.default)({to:v,state:f,getProps:i,innerRef:this.handleRef,onMouseEnter:function(t){c&&c(t),___loader.hovering((0,p.parsePath)(v).pathname)},onClick:function(e){if(a&&a(e),!(0!==e.button||t.props.target||e.defaultPrevented||e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)){e.preventDefault();var n=d,r=encodeURI(v)===h.pathname;"boolean"!=typeof d&&r&&(n=!0),window.___navigate(v,{state:f,replace:n})}return!0}},m)):s.default.createElement("a",(0,u.default)({href:v},m))},e}(s.default.Component);O.propTypes=(0,u.default)({},b,{onClick:c.default.func,to:c.default.string.isRequired,replace:c.default.bool,state:c.default.object});var E=function(t,e,n){return console.warn('The "'+t+'" method is now deprecated and will be removed in Gatsby v'+n+'. Please use "'+e+'" instead.')},x=s.default.forwardRef((function(t,e){return s.default.createElement(w,(0,u.default)({innerRef:e},t))}));e.default=x;e.navigate=function(t,e){window.___navigate(y(t,window.location.pathname),e)};var _=function(t){E("push","navigate",3),window.___push(y(t,window.location.pathname))};e.push=_;e.replace=function(t){E("replace","navigate",3),window.___replace(y(t,window.location.pathname))};e.navigateTo=function(t){return E("navigateTo","navigate",3),_(t)}},"/GqU":function(t,e,n){var r=n("RK3t"),o=n("HYAF");t.exports=function(t){return r(o(t))}},"/b8u":function(t,e,n){var r=n("BPiQ");t.exports=r&&!Symbol.sham&&"symbol"==typeof Symbol.iterator},"/hTd":function(t,e,n){"use strict";e.__esModule=!0,e.SessionStorage=void 0;var r=function(){function t(){}var e=t.prototype;return e.read=function(t,e){var n=this.getStateKey(t,e);try{var r=window.sessionStorage.getItem(n);return r?JSON.parse(r):0}catch(o){return window&&window.___GATSBY_REACT_ROUTER_SCROLL&&window.___GATSBY_REACT_ROUTER_SCROLL[n]?window.___GATSBY_REACT_ROUTER_SCROLL[n]:0}},e.save=function(t,e,n){var r=this.getStateKey(t,e),o=JSON.stringify(n);try{window.sessionStorage.setItem(r,o)}catch(i){window&&window.___GATSBY_REACT_ROUTER_SCROLL||(window.___GATSBY_REACT_ROUTER_SCROLL={}),window.___GATSBY_REACT_ROUTER_SCROLL[r]=JSON.parse(o)}},e.getStateKey=function(t,e){var n="@@scroll|"+t.pathname;return null==e?n:n+"|"+e},t}();e.SessionStorage=r},"0BK2":function(t,e){t.exports={}},"0Dky":function(t,e){t.exports=function(t){try{return!!t()}catch(e){return!0}}},"0GbY":function(t,e,n){var r=n("2oRo"),o=n("Fib7"),i=function(t){return o(t)?t:void 0};t.exports=function(t,e){return arguments.length<2?i(r[t]):r[t]&&r[t][e]}},"0Zpr":function(t,e,n){},"0eef":function(t,e,n){"use strict";var r={}.propertyIsEnumerable,o=Object.getOwnPropertyDescriptor,i=o&&!r.call({1:2},1);e.f=i?function(t){var e=o(this,t);return!!e&&e.enumerable}:r},"1Y/n":function(t,e,n){var r=n("We1y"),o=n("ewvW"),i=n("RK3t"),a=n("B/qT"),u=TypeError,c=function(t){return function(e,n,c,s){r(n);var l=o(e),f=i(l),p=a(l),d=t?p-1:0,h=t?-1:1;if(c<2)for(;;){if(d in f){s=f[d],d+=h;break}if(d+=h,t?d<0:p<=d)throw u("Reduce of empty array with no initial value")}for(;t?d>=0:p>d;d+=h)d in f&&(s=n(s,f[d],d,l));return s}};t.exports={left:c(!1),right:c(!0)}},"284h":function(t,e,n){var r=n("cDf5").default;function o(t){if("function"!=typeof WeakMap)return null;var e=new WeakMap,n=new WeakMap;return(o=function(t){return t?n:e})(t)}t.exports=function(t,e){if(!e&&t&&t.__esModule)return t;if(null===t||"object"!==r(t)&&"function"!=typeof t)return{default:t};var n=o(e);if(n&&n.has(t))return n.get(t);var i={},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var u in t)if("default"!==u&&Object.prototype.hasOwnProperty.call(t,u)){var c=a?Object.getOwnPropertyDescriptor(t,u):null;c&&(c.get||c.set)?Object.defineProperty(i,u,c):i[u]=t[u]}return i.default=t,n&&n.set(t,i),i},t.exports.__esModule=!0,t.exports.default=t.exports},"2Zix":function(t,e,n){var r=n("NC/Y");t.exports=/MSIE|Trident/.test(r)},"2bX/":function(t,e,n){var r=n("0GbY"),o=n("Fib7"),i=n("OpvP"),a=n("/b8u"),u=Object;t.exports=a?function(t){return"symbol"==typeof t}:function(t){var e=r("Symbol");return o(e)&&i(e.prototype,u(t))}},"2oRo":function(t,e,n){(function(e){var n=function(t){return t&&t.Math==Math&&t};t.exports=n("object"==typeof globalThis&&globalThis)||n("object"==typeof window&&window)||n("object"==typeof self&&self)||n("object"==typeof e&&e)||function(){return this}()||this||Function("return this")()}).call(this,n("yLpj"))},"30RF":function(t,e,n){"use strict";n.d(e,"d",(function(){return l})),n.d(e,"a",(function(){return f})),n.d(e,"c",(function(){return p})),n.d(e,"b",(function(){return d}));var r=n("LYrO"),o=n("cSJ8"),i=function(t){return void 0===t?t:"/"===t?"/":"/"===t.charAt(t.length-1)?t.slice(0,-1):t},a=new Map,u=[],c=function(t){var e=decodeURIComponent(t);return Object(o.a)(e,"").split("#")[0].split("?")[0]};function s(t){return t.startsWith("/")||t.startsWith("https://")||t.startsWith("http://")?t:new URL(t,window.location.href+(window.location.href.endsWith("/")?"":"/")).pathname}var l=function(t){u=t},f=function(t){var e=h(t),n=u.map((function(t){var e=t.path;return{path:t.matchPath,originalPath:e}})),o=Object(r.pick)(n,e);return o?i(o.route.originalPath):null},p=function(t){var e=h(t),n=u.map((function(t){var e=t.path;return{path:t.matchPath,originalPath:e}})),o=Object(r.pick)(n,e);return o?o.params:{}},d=function(t){var e=c(s(t));if(a.has(e))return a.get(e);var n=f(e);return n||(n=h(t)),a.set(e,n),n},h=function(t){var e=c(s(t));return"/index.html"===e&&(e="/"),e=i(e)}},"3BY2":function(t,e,n){"use strict";e.onRouteUpdate=function(t){var e=t.location;if("function"!=typeof gtag)return null;if(e&&void 0!==window.excludeGtagPaths&&window.excludeGtagPaths.some((function(t){return t.test(e.pathname)})))return null;var n=function(){var t=e?e.pathname+e.search+e.hash:void 0;window.gtag("event","page_view",{page_path:t})};return"requestAnimationFrame"in window?requestAnimationFrame((function(){requestAnimationFrame(n)})):setTimeout(n,32),null}},"3Eq5":function(t,e,n){var r=n("We1y"),o=n("cjT7");t.exports=function(t,e){var n=t[e];return o(n)?void 0:r(n)}},"3uz+":function(t,e,n){"use strict";e.__esModule=!0,e.useScrollRestoration=function(t){var e=(0,i.useLocation)(),n=(0,o.useContext)(r.ScrollContext),a=(0,o.useRef)();return(0,o.useLayoutEffect)((function(){if(a.current){var r=n.read(e,t);a.current.scrollTo(0,r||0)}}),[]),{ref:a,onScroll:function(){a.current&&n.save(e,t,a.current.scrollTop)}}};var r=n("Enzk"),o=n("q1tI"),i=n("YwZP")},"4zBA":function(t,e,n){var r=n("QNWe"),o=Function.prototype,i=o.call,a=r&&o.bind.bind(i,i);t.exports=r?a:function(t){return function(){return i.apply(t,arguments)}}},"5yr3":function(t,e,n){"use strict";var r=function(t){return t=t||Object.create(null),{on:function(e,n){(t[e]||(t[e]=[])).push(n)},off:function(e,n){t[e]&&t[e].splice(t[e].indexOf(n)>>>0,1)},emit:function(e,n){(t[e]||[]).slice().map((function(t){t(n)})),(t["*"]||[]).slice().map((function(t){t(e,n)}))}}}();e.a=r},"6JNq":function(t,e,n){var r=n("Gi26"),o=n("Vu81"),i=n("Bs8V"),a=n("m/L8");t.exports=function(t,e,n){for(var u=o(e),c=a.f,s=i.f,l=0;l=0||(o[n]=t[n]);return o},t.exports.__esModule=!0,t.exports.default=t.exports},"8oxB":function(t,e){var n,r,o=t.exports={};function i(){throw new Error("setTimeout has not been defined")}function a(){throw new Error("clearTimeout has not been defined")}function u(t){if(n===setTimeout)return setTimeout(t,0);if((n===i||!n)&&setTimeout)return n=setTimeout,setTimeout(t,0);try{return n(t,0)}catch(e){try{return n.call(null,t,0)}catch(e){return n.call(this,t,0)}}}!function(){try{n="function"==typeof setTimeout?setTimeout:i}catch(t){n=i}try{r="function"==typeof clearTimeout?clearTimeout:a}catch(t){r=a}}();var c,s=[],l=!1,f=-1;function p(){l&&c&&(l=!1,c.length?s=c.concat(s):f=-1,s.length&&d())}function d(){if(!l){var t=u(p);l=!0;for(var e=s.length;e;){for(c=s,s=[];++f1)for(var n=1;n1&&void 0!==arguments[1]?arguments[1]:{},s=c.state,l=c.replace,f=void 0!==l&&l;if("number"==typeof e)t.history.go(e);else{s=r({},s,{key:Date.now()+""});try{a||f?t.history.replaceState(s,null,e):t.history.pushState(s,null,e)}catch(d){t.location[f?"replace":"assign"](e)}}i=o(t),a=!0;var p=new Promise((function(t){return u=t}));return n.forEach((function(t){return t({location:i,action:"PUSH"})})),p}}},a=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"/",e=t.indexOf("?"),n={pathname:e>-1?t.substr(0,e):t,search:e>-1?t.substr(e):""},r=0,o=[n],i=[null];return{get location(){return o[r]},addEventListener:function(t,e){},removeEventListener:function(t,e){},history:{get entries(){return o},get index(){return r},get state(){return i[r]},pushState:function(t,e,n){var a=n.split("?"),u=a[0],c=a[1],s=void 0===c?"":c;r++,o.push({pathname:u,search:s.length?"?"+s:s}),i.push(t)},replaceState:function(t,e,n){var a=n.split("?"),u=a[0],c=a[1],s=void 0===c?"":c;o[r]={pathname:u,search:s},i[r]=t},go:function(t){var e=r+t;e<0||e>i.length-1||(r=e)}}}},u=!("undefined"==typeof window||!window.document||!window.document.createElement),c=i(u?window:a()),s=c.navigate},"9d/t":function(t,e,n){var r=n("AO7/"),o=n("Fib7"),i=n("xrYK"),a=n("tiKp")("toStringTag"),u=Object,c="Arguments"==i(function(){return arguments}());t.exports=r?i:function(t){var e,n,r;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(n=function(t,e){try{return t[e]}catch(n){}}(e=u(t),a))?n:c?i(e):"Object"==(r=i(e))&&o(e.callee)?"Arguments":r}},"9hXx":function(t,e,n){"use strict";e.__esModule=!0,e.default=void 0;e.default=function(t,e){if(!Array.isArray(e))return"manifest.webmanifest";var n=e.find((function(e){return t.startsWith(e.start_url)}));return n?"manifest_"+n.lang+".webmanifest":"manifest.webmanifest"}},"AO7/":function(t,e,n){var r={};r[n("tiKp")("toStringTag")]="z",t.exports="[object z]"===String(r)},"B/qT":function(t,e,n){var r=n("UMSQ");t.exports=function(t){return r(t.length)}},BNF5:function(t,e,n){var r=n("NC/Y").match(/firefox\/(\d+)/i);t.exports=!!r&&+r[1]},BPiQ:function(t,e,n){var r=n("LQDL"),o=n("0Dky"),i=n("2oRo").String;t.exports=!!Object.getOwnPropertySymbols&&!o((function(){var t=Symbol();return!i(t)||!(Object(t)instanceof Symbol)||!Symbol.sham&&r&&r<41}))},Bs8V:function(t,e,n){var r=n("g6v/"),o=n("xluM"),i=n("0eef"),a=n("XGwC"),u=n("/GqU"),c=n("oEtG"),s=n("Gi26"),l=n("DPsx"),f=Object.getOwnPropertyDescriptor;e.f=r?f:function(t,e){if(t=u(t),e=c(e),l)try{return f(t,e)}catch(n){}if(s(t,e))return a(!o(i.f,t,e),t[e])}},CDr4:function(t,e,n){"use strict";var r=n("DVFp"),o=TypeError;t.exports=function(t,e){if(!delete t[e])throw o("Cannot delete property "+r(e)+" of "+r(t))}},DEYx:function(t,e,n){"use strict";n.r(e),n.d(e,"onRouteUpdate",(function(){return m}));n("E9XD");var r=Object.assign||function(t){for(var e=1;e1&&void 0!==arguments[1]?arguments[1]:{},o=window.Promise||function(t){function e(){}t(e,e)},f=function(t){var e=t.target;e!==L?-1!==P.indexOf(e)&&E({target:e}):O()},p=function(){if(!k&&C.original){var t=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0;Math.abs(T-t)>j.scrollOffset&&setTimeout(O,150)}},d=function(t){var e=t.key||t.keyCode;"Escape"!==e&&"Esc"!==e&&27!==e||O()},h=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=t;if(t.background&&(L.style.background=t.background),t.container&&t.container instanceof Object&&(e.container=r({},j.container,t.container)),t.template){var n=i(t.template)?t.template:document.querySelector(t.template);e.template=n}return j=r({},j,e),P.forEach((function(t){t.dispatchEvent(l("medium-zoom:update",{detail:{zoom:I}}))})),I},m=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return t(r({},j,e))},v=function(){for(var t=arguments.length,e=Array(t),n=0;n0?e.reduce((function(t,e){return[].concat(t,u(e))}),[]):P;return r.forEach((function(t){t.classList.remove("medium-zoom-image"),t.dispatchEvent(l("medium-zoom:detach",{detail:{zoom:I}}))})),P=P.filter((function(t){return-1===r.indexOf(t)})),I},y=function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return P.forEach((function(r){r.addEventListener("medium-zoom:"+t,e,n)})),R.push({type:"medium-zoom:"+t,listener:e,options:n}),I},b=function(t,e){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return P.forEach((function(r){r.removeEventListener("medium-zoom:"+t,e,n)})),R=R.filter((function(n){return!(n.type==="medium-zoom:"+t&&n.listener.toString()===e.toString())})),I},w=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=t.target,n=function(){var t={width:document.documentElement.clientWidth,height:document.documentElement.clientHeight,left:0,top:0,right:0,bottom:0},e=void 0,n=void 0;if(j.container)if(j.container instanceof Object)e=(t=r({},t,j.container)).width-t.left-t.right-2*j.margin,n=t.height-t.top-t.bottom-2*j.margin;else{var o=(i(j.container)?j.container:document.querySelector(j.container)).getBoundingClientRect(),u=o.width,c=o.height,s=o.left,l=o.top;t=r({},t,{width:u,height:c,left:s,top:l})}e=e||t.width-2*j.margin,n=n||t.height-2*j.margin;var f=C.zoomedHd||C.original,p=a(f)?e:f.naturalWidth||e,d=a(f)?n:f.naturalHeight||n,h=f.getBoundingClientRect(),m=h.top,v=h.left,g=h.width,y=h.height,b=Math.min(Math.max(g,p),e)/g,w=Math.min(Math.max(y,d),n)/y,O=Math.min(b,w),E="scale("+O+") translate3d("+((e-g)/2-v+j.margin+t.left)/O+"px, "+((n-y)/2-m+j.margin+t.top)/O+"px, 0)";C.zoomed.style.transform=E,C.zoomedHd&&(C.zoomedHd.style.transform=E)};return new o((function(t){if(e&&-1===P.indexOf(e))t(I);else{if(C.zoomed)t(I);else{if(e)C.original=e;else{if(!(P.length>0))return void t(I);var r=P;C.original=r[0]}if(C.original.dispatchEvent(l("medium-zoom:open",{detail:{zoom:I}})),T=window.pageYOffset||document.documentElement.scrollTop||document.body.scrollTop||0,k=!0,C.zoomed=s(C.original),document.body.appendChild(L),j.template){var o=i(j.template)?j.template:document.querySelector(j.template);C.template=document.createElement("div"),C.template.appendChild(o.content.cloneNode(!0)),document.body.appendChild(C.template)}if(C.original.parentElement&&"PICTURE"===C.original.parentElement.tagName&&C.original.currentSrc&&(C.zoomed.src=C.original.currentSrc),document.body.appendChild(C.zoomed),window.requestAnimationFrame((function(){document.body.classList.add("medium-zoom--opened")})),C.original.classList.add("medium-zoom-image--hidden"),C.zoomed.classList.add("medium-zoom-image--opened"),C.zoomed.addEventListener("click",O),C.zoomed.addEventListener("transitionend",(function e(){k=!1,C.zoomed.removeEventListener("transitionend",e),C.original.dispatchEvent(l("medium-zoom:opened",{detail:{zoom:I}})),t(I)})),C.original.getAttribute("data-zoom-src")){C.zoomedHd=C.zoomed.cloneNode(),C.zoomedHd.removeAttribute("srcset"),C.zoomedHd.removeAttribute("sizes"),C.zoomedHd.removeAttribute("loading"),C.zoomedHd.src=C.zoomed.getAttribute("data-zoom-src"),C.zoomedHd.onerror=function(){clearInterval(a),console.warn("Unable to reach the zoom image target "+C.zoomedHd.src),C.zoomedHd=null,n()};var a=setInterval((function(){C.zoomedHd.complete&&(clearInterval(a),C.zoomedHd.classList.add("medium-zoom-image--opened"),C.zoomedHd.addEventListener("click",O),document.body.appendChild(C.zoomedHd),n())}),10)}else if(C.original.hasAttribute("srcset")){C.zoomedHd=C.zoomed.cloneNode(),C.zoomedHd.removeAttribute("sizes"),C.zoomedHd.removeAttribute("loading");var u=C.zoomedHd.addEventListener("load",(function(){C.zoomedHd.removeEventListener("load",u),C.zoomedHd.classList.add("medium-zoom-image--opened"),C.zoomedHd.addEventListener("click",O),document.body.appendChild(C.zoomedHd),n()}))}else n()}}}))},O=function(){return new o((function(t){if(!k&&C.original){k=!0,document.body.classList.remove("medium-zoom--opened"),C.zoomed.style.transform="",C.zoomedHd&&(C.zoomedHd.style.transform=""),C.template&&(C.template.style.transition="opacity 150ms",C.template.style.opacity=0),C.original.dispatchEvent(l("medium-zoom:close",{detail:{zoom:I}})),C.zoomed.addEventListener("transitionend",(function e(){C.original.classList.remove("medium-zoom-image--hidden"),document.body.removeChild(C.zoomed),C.zoomedHd&&document.body.removeChild(C.zoomedHd),document.body.removeChild(L),C.zoomed.classList.remove("medium-zoom-image--opened"),C.template&&document.body.removeChild(C.template),k=!1,C.zoomed.removeEventListener("transitionend",e),C.original.dispatchEvent(l("medium-zoom:closed",{detail:{zoom:I}})),C.original=null,C.zoomed=null,C.zoomedHd=null,C.template=null,t(I)}))}else t(I)}))},E=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},e=t.target;return C.original?O():w({target:e})},x=function(){return j},_=function(){return P},S=function(){return C.original},P=[],R=[],k=!1,T=0,j=n,C={original:null,zoomed:null,zoomedHd:null,template:null};"[object Object]"===Object.prototype.toString.call(e)?j=e:(e||"string"==typeof e)&&v(e),j=r({margin:0,background:"#fff",scrollOffset:40,container:null,template:null},j);var L=c(j.background);document.addEventListener("click",f),document.addEventListener("keyup",d),document.addEventListener("scroll",p),window.addEventListener("resize",O);var I={open:w,close:O,toggle:E,update:h,clone:m,attach:v,detach:g,on:y,off:b,getOptions:x,getImages:_,getZoomedImage:S};return I},p=(n("bsxc"),["excludedSelector","includedSelector"]),d={margin:24,background:"#fff",scrollOffset:40,container:null,template:null,zIndex:999,excludedSelector:null};function h(t){var e=t.excludedSelector,n=t.includedSelector,r=function(t,e){if(null==t)return{};var n,r,o={},i=Object.keys(t);for(r=0;r=0||(o[n]=t[n]);return o}(t,p),o=e?".gatsby-resp-image-image:not("+e+")":".gatsby-resp-image-image",i=Array.from(document.querySelectorAll(o));if(n){var a=Array.from(document.querySelectorAll(n));i=i.concat(a)}var u=i.filter((function(t){return!t.classList.contains("medium-zoom-image")})).map((function(t){return t.addEventListener("load",(function e(){var n=t.style.transition;t.style.transition=n+", opacity 0.5s, transform .3s cubic-bezier(.2,0,.2,1)",t.removeEventListener("load",e)})),t.setAttribute("tabIndex",0),t.addEventListener("keydown",(function(e){" "!==e.key&&"Enter"!==e.key||(e.preventDefault(),t.click())})),t}));u.length>0&&f(u,r)}var m=function(t,e){var n=Object.assign({},d,e);!function(t){if(!document.querySelector("#medium-zoom-styles")){var e=t.zIndex,n=document.createElement("style"),r="\n .medium-zoom--opened > .medium-zoom-overlay,\n .medium-zoom--opened > .medium-zoom-image,\n\t img.medium-zoom-image--opened {\n z-index: "+e+"\n }\n ";n.id="medium-zoom-styles",n.innerHTML=r,document.head.appendChild(n)}}(n),function(t){if(window.performance&&window.PerformanceObserver){var e=new PerformanceObserver((function(e){return e.getEntries().filter((function(t){return"paint"===t.entryType})).map((function(t){return"first-contentful-paint"===t.name})).forEach(t)}));try{e.observe({entryTypes:["measure","paint"]})}catch(n){console.error(n),e.disconnect()}}}((function(){return h(n)})),h(n)}},DPsx:function(t,e,n){var r=n("g6v/"),o=n("0Dky"),i=n("zBJ4");t.exports=!r&&!o((function(){return 7!=Object.defineProperty(i("div"),"a",{get:function(){return 7}}).a}))},DVFp:function(t,e){var n=String;t.exports=function(t){try{return n(t)}catch(e){return"Object"}}},E9LY:function(t,e,n){var r=n("4zBA"),o=n("0Dky"),i=n("Fib7"),a=n("Gi26"),u=n("g6v/"),c=n("Xnc8").CONFIGURABLE,s=n("iSVu"),l=n("afO8"),f=l.enforce,p=l.get,d=String,h=Object.defineProperty,m=r("".slice),v=r("".replace),g=r([].join),y=u&&!o((function(){return 8!==h((function(){}),"length",{value:8}).length})),b=String(String).split("String"),w=t.exports=function(t,e,n){"Symbol("===m(d(e),0,7)&&(e="["+v(d(e),/^Symbol\(([^)]*)\)/,"$1")+"]"),n&&n.getter&&(e="get "+e),n&&n.setter&&(e="set "+e),(!a(t,"name")||c&&t.name!==e)&&(u?h(t,"name",{value:e,configurable:!0}):t.name=e),y&&n&&a(n,"arity")&&t.length!==n.arity&&h(t,"length",{value:n.arity});try{n&&a(n,"constructor")&&n.constructor?u&&h(t,"prototype",{writable:!1}):t.prototype&&(t.prototype=void 0)}catch(o){}var r=f(t);return a(r,"source")||(r.source=g(b,"string"==typeof e?e:"")),t};Function.prototype.toString=w((function(){return i(this)&&p(this).source||s(this)}),"toString")},E9XD:function(t,e,n){"use strict";var r=n("I+eb"),o=n("1Y/n").left,i=n("pkCn"),a=n("LQDL");r({target:"Array",proto:!0,forced:!n("YF1G")&&a>79&&a<83||!i("reduce")},{reduce:function(t){var e=arguments.length;return o(this,t,e,e>1?arguments[1]:void 0)}})},Enzk:function(t,e,n){"use strict";var r=n("284h"),o=n("TqRt");e.__esModule=!0,e.ScrollHandler=e.ScrollContext=void 0;var i=o(n("PJYZ")),a=o(n("VbXa")),u=r(n("q1tI")),c=o(n("17x9")),s=n("/hTd"),l=u.createContext(new s.SessionStorage);e.ScrollContext=l,l.displayName="GatsbyScrollContext";var f=function(t){function e(){for(var e,n=arguments.length,r=new Array(n),o=0;o0&&r[0]<4?1:+(r[0]+r[1])),!o&&a&&(!(r=a.match(/Edge\/(\d+)/))||r[1]>=74)&&(r=a.match(/Chrome\/(\d+)/))&&(o=+r[1]),t.exports=o},LYrO:function(t,e,n){"use strict";n.r(e),n.d(e,"startsWith",(function(){return i})),n.d(e,"pick",(function(){return a})),n.d(e,"match",(function(){return u})),n.d(e,"resolve",(function(){return c})),n.d(e,"insertParams",(function(){return s})),n.d(e,"validateRedirect",(function(){return l})),n.d(e,"shallowCompare",(function(){return b}));var r=n("QLaP"),o=n.n(r),i=function(t,e){return t.substr(0,e.length)===e},a=function(t,e){for(var n=void 0,r=void 0,i=e.split("?")[0],a=v(i),u=""===a[0],c=m(t),s=0,l=c.length;se.score?-1:t.index-e.index}))},v=function(t){return t.replace(/(^\/+|\/+$)/g,"").split("/")},g=function(t){for(var e=arguments.length,n=Array(e>1?e-1:0),r=1;r0})))&&n.length>0?"?"+n.join("&"):"")},y=["uri","path"],b=function(t,e){var n=Object.keys(t);return n.length===Object.keys(e).length&&n.every((function(n){return e.hasOwnProperty(n)&&t[n]===e[n]}))}},LeKB:function(t,e,n){t.exports=[{plugin:n("q9nr"),options:{plugins:[],maxWidth:1200,linkImagesToOriginal:!1,showCaptions:!1,markdownCaptions:!1,sizeByPixelDensity:!1,backgroundColor:"white",quality:50,withWebp:!1,tracedSVG:!1,loading:"lazy",disableBgImageOnAlpha:!1,disableBgImage:!1}},{plugin:n("DEYx"),options:{plugins:[],margin:36,scrollOffset:0}},{plugin:n("hUyl"),options:{plugins:[],offsetY:0,className:"anchor"}},{plugin:n("npZl"),options:{plugins:[],name:"Dev Jurnal",short_name:"Dev Jurnal",start_url:"/",background_color:"#ffffff",theme_color:"#1d2740",display:"standalone",icon:"content/assets/felog.png",legacy:!0,theme_color_in_head:!0,cache_busting_mode:"query",crossOrigin:"anonymous",include_favicon:!0,cacheDigest:"5c2c5e536922e15b73b41128d93d6b59"}},{plugin:n("hZAw"),options:{plugins:[],pathToConfigModule:"src/utils/typography"}},{plugin:n("e/UW"),options:{plugins:[]}},{plugin:n("3BY2"),options:{plugins:[],trackingIds:["G-GVQKMM834T"],pluginConfig:{head:!0}}},{plugin:n("GddB"),options:{plugins:[]}}]},MMVs:function(t,e,n){t.exports=function(){var t=!1;-1!==navigator.appVersion.indexOf("MSIE 10")&&(t=!0);var e,n=[],r="object"==typeof document&&document,o=t?r.documentElement.doScroll("left"):r.documentElement.doScroll,i=r&&(o?/^loaded|^c/:/^loaded|^i|^c/).test(r.readyState);return!i&&r&&r.addEventListener("DOMContentLoaded",e=function(){for(r.removeEventListener("DOMContentLoaded",e),i=1;e=n.shift();)e()}),function(t){i?setTimeout(t,0):n.push(t)}}()},"NC/Y":function(t,e){t.exports="undefined"!=typeof navigator&&String(navigator.userAgent)||""},NSX3:function(t,e,n){"use strict";n.r(e);var r=n("xtsi");"https:"!==window.location.protocol&&"localhost"!==window.location.hostname?console.error("Service workers can only be used over HTTPS, or on localhost for development"):"serviceWorker"in navigator&&navigator.serviceWorker.register("/sw.js").then((function(t){t.addEventListener("updatefound",(function(){Object(r.apiRunner)("onServiceWorkerUpdateFound",{serviceWorker:t});var e=t.installing;console.log("installingWorker",e),e.addEventListener("statechange",(function(){switch(e.state){case"installed":navigator.serviceWorker.controller?(window.___swUpdated=!0,Object(r.apiRunner)("onServiceWorkerUpdateReady",{serviceWorker:t}),window.___failedResources&&(console.log("resources failed, SW updated - reloading"),window.location.reload())):(console.log("Content is now available offline!"),Object(r.apiRunner)("onServiceWorkerInstalled",{serviceWorker:t}));break;case"redundant":console.error("The installing service worker became redundant."),Object(r.apiRunner)("onServiceWorkerRedundant",{serviceWorker:t});break;case"activated":Object(r.apiRunner)("onServiceWorkerActive",{serviceWorker:t})}}))}))})).catch((function(t){console.error("Error during service worker registration:",t)}))},NsGk:function(t,e,n){e.components={"component---node-modules-gatsby-plugin-offline-app-shell-js":function(){return n.e(6).then(n.t.bind(null,"MqWW",7))},"component---src-pages-404-js":function(){return Promise.all([n.e(1),n.e(0),n.e(2),n.e(7)]).then(n.bind(null,"w2l6"))},"component---src-pages-about-js":function(){return Promise.all([n.e(0),n.e(8)]).then(n.bind(null,"3XHS"))},"component---src-pages-index-js":function(){return Promise.all([n.e(1),n.e(0),n.e(2),n.e(3),n.e(9)]).then(n.bind(null,"RXBc"))},"component---src-templates-blog-post-js":function(){return Promise.all([n.e(1),n.e(0),n.e(2),n.e(3),n.e(10)]).then(n.bind(null,"yZlL"))}}},OpvP:function(t,e,n){var r=n("4zBA");t.exports=r({}.isPrototypeOf)},PJYZ:function(t,e){t.exports=function(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t},t.exports.__esModule=!0,t.exports.default=t.exports},QLaP:function(t,e,n){"use strict";t.exports=function(t,e,n,r,o,i,a,u){if(!t){var c;if(void 0===e)c=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var s=[n,r,o,i,a,u],l=0;(c=new Error(e.replace(/%s/g,(function(){return s[l++]})))).name="Invariant Violation"}throw c.framesToPop=1,c}}},QNWe:function(t,e,n){var r=n("0Dky");t.exports=!r((function(){var t=function(){}.bind();return"function"!=typeof t||t.hasOwnProperty("prototype")}))},RK3t:function(t,e,n){var r=n("4zBA"),o=n("0Dky"),i=n("xrYK"),a=Object,u=r("".split);t.exports=o((function(){return!a("z").propertyIsEnumerable(0)}))?function(t){return"String"==i(t)?u(t,""):a(t)}:a},SFrS:function(t,e,n){var r=n("xluM"),o=n("Fib7"),i=n("hh1v"),a=TypeError;t.exports=function(t,e){var n,u;if("string"===e&&o(n=t.toString)&&!i(u=r(n,t)))return u;if(o(n=t.valueOf)&&!i(u=r(n,t)))return u;if("string"!==e&&o(n=t.toString)&&!i(u=r(n,t)))return u;throw a("Can't convert object to primitive value")}},SksO:function(t,e){function n(e,r){return t.exports=n=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},t.exports.__esModule=!0,t.exports.default=t.exports,n(e,r)}t.exports=n,t.exports.__esModule=!0,t.exports.default=t.exports},"T/nb":function(t,e){t.exports={title:"Dev Jurnal",description:"Blog posted about web developer",author:"mmdmthr",introduction:"My notes in public space",siteUrl:"https://www.devjurnal.com",social:{twitter:"mmdmthr",github:"mmdmthr",medium:"@mmdmthr",facebook:"mmdmthr",linkedin:"mmdmthr",instagram:"devjurnal"},icon:"content/assets/felog.png",keywords:["blog"],comment:{disqusShortName:"",utterances:"mmdmthr/devjurnal"},configs:{countOfInitialPost:10},sponsor:{buyMeACoffeeId:""},share:{facebookAppId:"198884725496062"},ga:"G-GVQKMM834T"}},TWQb:function(t,e,n){var r=n("/GqU"),o=n("I8vh"),i=n("B/qT"),a=function(t){return function(e,n,a){var u,c=r(e),s=i(c),l=o(a,s);if(t&&n!=n){for(;s>l;)if((u=c[l++])!=u)return!0}else for(;s>l;l++)if((t||l in c)&&c[l]===n)return t||l||0;return!t&&-1}};t.exports={includes:a(!0),indexOf:a(!1)}},Ta7t:function(t,e,n){var r=n("I8vh"),o=n("B/qT"),i=n("hBjN"),a=Array,u=Math.max;t.exports=function(t,e,n){for(var c=o(t),s=r(e,c),l=r(void 0===n?c:n,c),f=a(u(l-s,0)),p=0;s3)){if(h)return!0;if(v)return v<603;var t,e,n,r,o="";for(t=65;t<76;t++){switch(e=String.fromCharCode(t),t){case 66:case 69:case 70:case 72:n=3;break;case 68:case 71:n=4;break;default:n=2}for(r=0;r<47;r++)g.push({k:e+r,v:n})}for(g.sort((function(t,e){return e.v-t.v})),r=0;rs(n)?1:-1}}(t)),n=u(o),r=0;r0?o(r(t),9007199254740991):0}},USzg:function(t,e,n){var r=n("NC/Y").match(/AppleWebKit\/(\d+)\./);t.exports=!!r&&+r[1]},UxWs:function(t,e,n){"use strict";n.r(e);var r=n("dI71"),o=n("xtsi"),i=n("q1tI"),a=n.n(i),u=n("i8i4"),c=n.n(u),s=n("YwZP"),l=n("7hJ6"),f=n("MMVs"),p=n.n(f),d=n("Wbzz"),h=n("emEt"),m=n("YLt+"),v=n("5yr3"),g={id:"gatsby-announcer",style:{position:"absolute",top:0,width:1,height:1,padding:0,overflow:"hidden",clip:"rect(0, 0, 0, 0)",whiteSpace:"nowrap",border:0},"aria-live":"assertive","aria-atomic":"true"},y=n("9Xx/"),b=n("+ZDr"),w=new Map,O=new Map;function E(t){var e=w.get(t);return e||(e=O.get(t.toLowerCase())),null!=e&&(window.___replace(e.toPath),!0)}m.forEach((function(t){t.ignoreCase?O.set(t.fromPath,t):w.set(t.fromPath,t)}));var x=function(t,e){E(t.pathname)||Object(o.apiRunner)("onPreRouteUpdate",{location:t,prevLocation:e})},_=function(t,e){E(t.pathname)||Object(o.apiRunner)("onRouteUpdate",{location:t,prevLocation:e})},S=function(t,e){if(void 0===e&&(e={}),"number"!=typeof t){var n=Object(b.parsePath)(t).pathname,r=w.get(n);if(r||(r=O.get(n.toLowerCase())),r&&(t=r.toPath,n=Object(b.parsePath)(t).pathname),window.___swUpdated)window.location=n;else{var i=setTimeout((function(){v.a.emit("onDelayedLoadPageResources",{pathname:n}),Object(o.apiRunner)("onRouteUpdateDelayed",{location:window.location})}),1e3);h.default.loadPage(n).then((function(r){if(!r||r.status===h.PageResourceStatus.Error)return window.history.replaceState({},"",location.href),window.location=n,void clearTimeout(i);r&&r.page.webpackCompilationHash!==window.___webpackCompilationHash&&("serviceWorker"in navigator&&null!==navigator.serviceWorker.controller&&"activated"===navigator.serviceWorker.controller.state&&navigator.serviceWorker.controller.postMessage({gatsbyApi:"clearPathResources"}),window.location=n),Object(s.navigate)(t,e),clearTimeout(i)}))}}else y.c.navigate(t)};function P(t,e){var n=this,r=e.location,i=r.pathname,a=r.hash,u=Object(o.apiRunner)("shouldUpdateScroll",{prevRouterProps:t,pathname:i,routerProps:{location:r},getSavedScrollPosition:function(t){return[0,n._stateStorage.read(t,t.key)]}});if(u.length>0)return u[u.length-1];if(t&&t.location.pathname===i)return a?decodeURI(a.slice(1)):[0,0];return!0}var R=function(t){function e(e){var n;return(n=t.call(this,e)||this).announcementRef=a.a.createRef(),n}Object(r.a)(e,t);var n=e.prototype;return n.componentDidUpdate=function(t,e){var n=this;requestAnimationFrame((function(){var t="new page at "+n.props.location.pathname;document.title&&(t=document.title);var e=document.querySelectorAll("#gatsby-focus-wrapper h1");e&&e.length&&(t=e[0].textContent);var r="Navigated to "+t;n.announcementRef.current&&(n.announcementRef.current.innerText!==r&&(n.announcementRef.current.innerText=r))}))},n.render=function(){return a.a.createElement("div",Object.assign({},g,{ref:this.announcementRef}))},e}(a.a.Component),k=function(t,e){var n,r;return t.href!==e.href||(null==t||null===(n=t.state)||void 0===n?void 0:n.key)!==(null==e||null===(r=e.state)||void 0===r?void 0:r.key)},T=function(t){function e(e){var n;return n=t.call(this,e)||this,x(e.location,null),n}Object(r.a)(e,t);var n=e.prototype;return n.componentDidMount=function(){_(this.props.location,null)},n.shouldComponentUpdate=function(t){return!!k(t.location,this.props.location)&&(x(this.props.location,t.location),!0)},n.componentDidUpdate=function(t){k(t.location,this.props.location)&&_(this.props.location,t.location)},n.render=function(){return a.a.createElement(a.a.Fragment,null,this.props.children,a.a.createElement(R,{location:location}))},e}(a.a.Component),j=n("IOVJ"),C=n("NsGk"),L=n.n(C);function I(t,e){for(var n in t)if(!(n in e))return!0;for(var r in e)if(t[r]!==e[r])return!0;return!1}var z=function(t){function e(e){var n;n=t.call(this)||this;var r=e.location,o=e.pageResources;return n.state={location:Object.assign({},r),pageResources:o||h.default.loadPageSync(r.pathname)},n}Object(r.a)(e,t),e.getDerivedStateFromProps=function(t,e){var n=t.location;return e.location.href!==n.href?{pageResources:h.default.loadPageSync(n.pathname),location:Object.assign({},n)}:{location:Object.assign({},n)}};var n=e.prototype;return n.loadResources=function(t){var e=this;h.default.loadPage(t).then((function(n){n&&n.status!==h.PageResourceStatus.Error?e.setState({location:Object.assign({},window.location),pageResources:n}):(window.history.replaceState({},"",location.href),window.location=t)}))},n.shouldComponentUpdate=function(t,e){return e.pageResources?this.state.pageResources!==e.pageResources||(this.state.pageResources.component!==e.pageResources.component||(this.state.pageResources.json!==e.pageResources.json||(!(this.state.location.key===e.location.key||!e.pageResources.page||!e.pageResources.page.matchPath&&!e.pageResources.page.path)||function(t,e,n){return I(t.props,e)||I(t.state,n)}(this,t,e)))):(this.loadResources(t.location.pathname),!1)},n.render=function(){return this.props.children(this.state)},e}(a.a.Component),A=n("cSJ8"),D=n("JeVI"),M=new h.ProdLoader(L.a,D);Object(h.setLoader)(M),M.setApiRunner(o.apiRunner),window.asyncRequires=L.a,window.___emitter=v.a,window.___loader=h.publicLoader,y.c.listen((function(t){t.location.action=t.action})),window.___push=function(t){return S(t,{replace:!1})},window.___replace=function(t){return S(t,{replace:!0})},window.___navigate=function(t,e){return S(t,e)},E(window.location.pathname),Object(o.apiRunnerAsync)("onClientEntry").then((function(){Object(o.apiRunner)("registerServiceWorker").length>0&&n("NSX3");var t=function(t){return a.a.createElement(s.BaseContext.Provider,{value:{baseuri:"/",basepath:"/"}},a.a.createElement(j.a,t))},e=a.a.createContext({}),i=function(t){function n(){return t.apply(this,arguments)||this}return Object(r.a)(n,t),n.prototype.render=function(){var t=this.props.children;return a.a.createElement(s.Location,null,(function(n){var r=n.location;return a.a.createElement(z,{location:r},(function(n){var r=n.pageResources,o=n.location,i=Object(h.getStaticQueryResults)();return a.a.createElement(d.StaticQueryContext.Provider,{value:i},a.a.createElement(e.Provider,{value:{pageResources:r,location:o}},t))}))}))},n}(a.a.Component),u=function(n){function o(){return n.apply(this,arguments)||this}return Object(r.a)(o,n),o.prototype.render=function(){var n=this;return a.a.createElement(e.Consumer,null,(function(e){var r=e.pageResources,o=e.location;return a.a.createElement(T,{location:o},a.a.createElement(l.ScrollContext,{location:o,shouldUpdateScroll:P},a.a.createElement(s.Router,{basepath:"",location:o,id:"gatsby-focus-wrapper"},a.a.createElement(t,Object.assign({path:"/404.html"===r.page.path?Object(A.a)(o.pathname,""):encodeURI(r.page.matchPath||r.page.path)},n.props,{location:o,pageResources:r},r.json)))))}))},o}(a.a.Component),f=window,m=f.pagePath,v=f.location;m&&""+m!==v.pathname&&!(M.findMatchPath(Object(A.a)(v.pathname,""))||"/404.html"===m||m.match(/^\/404\/?$/)||m.match(/^\/offline-plugin-app-shell-fallback\/?$/))&&Object(s.navigate)(""+m+v.search+v.hash,{replace:!0}),h.publicLoader.loadPage(v.pathname).then((function(t){if(!t||t.status===h.PageResourceStatus.Error)throw new Error("page resources for "+v.pathname+" not found. Not rendering React");window.___webpackCompilationHash=t.page.webpackCompilationHash;var e=Object(o.apiRunner)("wrapRootElement",{element:a.a.createElement(u,null)},a.a.createElement(u,null),(function(t){return{element:t.result}})).pop(),n=function(){return a.a.createElement(i,null,e)},r=Object(o.apiRunner)("replaceHydrateFunction",void 0,c.a.hydrate)[0];p()((function(){r(a.a.createElement(n,null),"undefined"!=typeof window?document.getElementById("___gatsby"):void 0,(function(){Object(o.apiRunner)("onInitialClientRender")}))}))}))}))},V37c:function(t,e,n){var r=n("9d/t"),o=String;t.exports=function(t){if("Symbol"===r(t))throw TypeError("Cannot convert a Symbol value to a string");return o(t)}},VbXa:function(t,e,n){var r=n("SksO");t.exports=function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,r(t,e)},t.exports.__esModule=!0,t.exports.default=t.exports},VpIT:function(t,e,n){var r=n("xDBR"),o=n("xs3f");(t.exports=function(t,e){return o[t]||(o[t]=void 0!==e?e:{})})("versions",[]).push({version:"3.30.2",mode:r?"pure":"global",copyright:"© 2014-2023 Denis Pushkarev (zloirock.ru)",license:"https://github.com/zloirock/core-js/blob/v3.30.2/LICENSE",source:"https://github.com/zloirock/core-js"})},Vu81:function(t,e,n){var r=n("0GbY"),o=n("4zBA"),i=n("JBy8"),a=n("dBg+"),u=n("glrk"),c=o([].concat);t.exports=r("Reflect","ownKeys")||function(t){var e=i.f(u(t)),n=a.f;return n?c(e,n(t)):e}},WSbT:function(t,e,n){var r=n("tC4l");t.exports=function(t){var e=+t;return e!=e||0===e?0:r(e)}},Wbzz:function(t,e,n){"use strict";n.r(e),n.d(e,"graphql",(function(){return m})),n.d(e,"StaticQueryContext",(function(){return f})),n.d(e,"StaticQuery",(function(){return d})),n.d(e,"useStaticQuery",(function(){return h})),n.d(e,"prefetchPathname",(function(){return l}));var r=n("q1tI"),o=n.n(r),i=n("+ZDr"),a=n.n(i);n.d(e,"Link",(function(){return a.a})),n.d(e,"withAssetPrefix",(function(){return i.withAssetPrefix})),n.d(e,"withPrefix",(function(){return i.withPrefix})),n.d(e,"parsePath",(function(){return i.parsePath})),n.d(e,"navigate",(function(){return i.navigate})),n.d(e,"push",(function(){return i.push})),n.d(e,"replace",(function(){return i.replace})),n.d(e,"navigateTo",(function(){return i.navigateTo}));var u=n("7hJ6");n.d(e,"useScrollRestoration",(function(){return u.useScrollRestoration}));var c=n("lw3w"),s=n.n(c);n.d(e,"PageRenderer",(function(){return s.a}));var l=n("emEt").default.enqueue,f=o.a.createContext({});function p(t){var e=t.staticQueryData,n=t.data,r=t.query,i=t.render,a=n?n.data:e[r]&&e[r].data;return o.a.createElement(o.a.Fragment,null,a&&i(a),!a&&o.a.createElement("div",null,"Loading (StaticQuery)"))}var d=function(t){var e=t.data,n=t.query,r=t.render,i=t.children;return o.a.createElement(f.Consumer,null,(function(t){return o.a.createElement(p,{data:e,query:n,render:r||i,staticQueryData:t})}))},h=function(t){var e;o.a.useContext;var n=o.a.useContext(f);if(isNaN(Number(t)))throw new Error("useStaticQuery was called with a string but expects to be called using `graphql`. Try this:\n\nimport { useStaticQuery, graphql } from 'gatsby';\n\nuseStaticQuery(graphql`"+t+"`);\n");if(null!==(e=n[t])&&void 0!==e&&e.data)return n[t].data;throw new Error("The result of this StaticQuery could not be fetched.\n\nThis is likely a bug in Gatsby and if refreshing the page does not fix it, please open an issue in https://github.com/gatsbyjs/gatsby/issues")};function m(){throw new Error("It appears like Gatsby is misconfigured. Gatsby related `graphql` calls are supposed to only be evaluated at compile time, and then compiled away. Unfortunately, something went wrong and the query was left in the compiled code.\n\nUnless your site has a complex or custom babel/Gatsby configuration this is likely a bug in Gatsby.")}},We1y:function(t,e,n){var r=n("Fib7"),o=n("DVFp"),i=TypeError;t.exports=function(t){if(r(t))return t;throw i(o(t)+" is not a function")}},Wr5T:function(t,e,n){n("ToJy"),function(t,e){"use strict";if("IntersectionObserver"in t&&"IntersectionObserverEntry"in t&&"intersectionRatio"in t.IntersectionObserverEntry.prototype)"isIntersecting"in t.IntersectionObserverEntry.prototype||Object.defineProperty(t.IntersectionObserverEntry.prototype,"isIntersecting",{get:function(){return this.intersectionRatio>0}});else{var n=[];o.prototype.THROTTLE_TIMEOUT=100,o.prototype.POLL_INTERVAL=null,o.prototype.USE_MUTATION_OBSERVER=!0,o.prototype.observe=function(t){if(!this._observationTargets.some((function(e){return e.element==t}))){if(!t||1!=t.nodeType)throw new Error("target must be an Element");this._registerInstance(),this._observationTargets.push({element:t,entry:null}),this._monitorIntersections(),this._checkForIntersections()}},o.prototype.unobserve=function(t){this._observationTargets=this._observationTargets.filter((function(e){return e.element!=t})),this._observationTargets.length||(this._unmonitorIntersections(),this._unregisterInstance())},o.prototype.disconnect=function(){this._observationTargets=[],this._unmonitorIntersections(),this._unregisterInstance()},o.prototype.takeRecords=function(){var t=this._queuedEntries.slice();return this._queuedEntries=[],t},o.prototype._initThresholds=function(t){var e=t||[0];return Array.isArray(e)||(e=[e]),e.sort().filter((function(t,e,n){if("number"!=typeof t||isNaN(t)||t<0||t>1)throw new Error("threshold must be a number between 0 and 1 inclusively");return t!==n[e-1]}))},o.prototype._parseRootMargin=function(t){var e=(t||"0px").split(/\s+/).map((function(t){var e=/^(-?\d*\.?\d+)(px|%)$/.exec(t);if(!e)throw new Error("rootMargin must be specified in pixels or percent");return{value:parseFloat(e[1]),unit:e[2]}}));return e[1]=e[1]||e[0],e[2]=e[2]||e[0],e[3]=e[3]||e[1],e},o.prototype._monitorIntersections=function(){this._monitoringIntersections||(this._monitoringIntersections=!0,this.POLL_INTERVAL?this._monitoringInterval=setInterval(this._checkForIntersections,this.POLL_INTERVAL):(i(t,"resize",this._checkForIntersections,!0),i(e,"scroll",this._checkForIntersections,!0),this.USE_MUTATION_OBSERVER&&"MutationObserver"in t&&(this._domObserver=new MutationObserver(this._checkForIntersections),this._domObserver.observe(e,{attributes:!0,childList:!0,characterData:!0,subtree:!0}))))},o.prototype._unmonitorIntersections=function(){this._monitoringIntersections&&(this._monitoringIntersections=!1,clearInterval(this._monitoringInterval),this._monitoringInterval=null,a(t,"resize",this._checkForIntersections,!0),a(e,"scroll",this._checkForIntersections,!0),this._domObserver&&(this._domObserver.disconnect(),this._domObserver=null))},o.prototype._checkForIntersections=function(){var e=this._rootIsInDom(),n=e?this._getRootRect():{top:0,bottom:0,left:0,right:0,width:0,height:0};this._observationTargets.forEach((function(o){var i=o.element,a=u(i),c=this._rootContainsTarget(i),s=o.entry,l=e&&c&&this._computeTargetAndRootIntersection(i,n),f=o.entry=new r({time:t.performance&&performance.now&&performance.now(),target:i,boundingClientRect:a,rootBounds:n,intersectionRect:l});s?e&&c?this._hasCrossedThreshold(s,f)&&this._queuedEntries.push(f):s&&s.isIntersecting&&this._queuedEntries.push(f):this._queuedEntries.push(f)}),this),this._queuedEntries.length&&this._callback(this.takeRecords(),this)},o.prototype._computeTargetAndRootIntersection=function(n,r){if("none"!=t.getComputedStyle(n).display){for(var o,i,a,c,l,f,p,d,h=u(n),m=s(n),v=!1;!v;){var g=null,y=1==m.nodeType?t.getComputedStyle(m):{};if("none"==y.display)return;if(m==this.root||m==e?(v=!0,g=r):m!=e.body&&m!=e.documentElement&&"visible"!=y.overflow&&(g=u(m)),g&&(o=g,i=h,a=void 0,c=void 0,l=void 0,f=void 0,p=void 0,d=void 0,a=Math.max(o.top,i.top),c=Math.min(o.bottom,i.bottom),l=Math.max(o.left,i.left),f=Math.min(o.right,i.right),d=c-a,!(h=(p=f-l)>=0&&d>=0&&{top:a,bottom:c,left:l,right:f,width:p,height:d})))break;m=s(m)}return h}},o.prototype._getRootRect=function(){var t;if(this.root)t=u(this.root);else{var n=e.documentElement,r=e.body;t={top:0,left:0,right:n.clientWidth||r.clientWidth,width:n.clientWidth||r.clientWidth,bottom:n.clientHeight||r.clientHeight,height:n.clientHeight||r.clientHeight}}return this._expandRectByRootMargin(t)},o.prototype._expandRectByRootMargin=function(t){var e=this._rootMarginValues.map((function(e,n){return"px"==e.unit?e.value:e.value*(n%2?t.width:t.height)/100})),n={top:t.top-e[0],right:t.right+e[1],bottom:t.bottom+e[2],left:t.left-e[3]};return n.width=n.right-n.left,n.height=n.bottom-n.top,n},o.prototype._hasCrossedThreshold=function(t,e){var n=t&&t.isIntersecting?t.intersectionRatio||0:-1,r=e.isIntersecting?e.intersectionRatio||0:-1;if(n!==r)for(var o=0;o=0||Object.prototype.hasOwnProperty.call(t,r)&&(n[r]=t[r]);return n}function h(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}function v(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)}var g=function(t,e){var n=c()(e);return n.displayName=t,n},y=g("Location"),b=function(t){var e=t.children;return o.a.createElement(y.Consumer,null,(function(t){return t?e(t):o.a.createElement(w,null,e)}))},w=function(t){function e(){var n,r;h(this,e);for(var o=arguments.length,i=Array(o),a=0;a-1?(i=e.substring(0,r),a=e.substring(r)):i=e,o.a.createElement(y.Provider,{value:{location:{pathname:i,search:a,hash:""},navigate:function(){throw new Error("You can't call navigate on the server.")}}},n)},E=g("Base",{baseuri:"/",basepath:"/"}),x=function(t){return o.a.createElement(E.Consumer,null,(function(e){return o.a.createElement(b,null,(function(n){return o.a.createElement(_,p({},e,n,t))}))}))},_=function(t){function e(){return h(this,e),m(this,t.apply(this,arguments))}return v(e,t),e.prototype.render=function(){var t=this.props,e=t.location,n=t.navigate,r=t.basepath,i=t.primary,a=t.children,u=(t.baseuri,t.component),c=void 0===u?"div":u,s=d(t,["location","navigate","basepath","primary","children","baseuri","component"]),f=o.a.Children.toArray(a).reduce((function(t,e){var n=H(r)(e);return t.concat(n)}),[]),h=e.pathname,m=Object(l.pick)(f,h);if(m){var v=m.params,g=m.uri,y=m.route,b=m.route.value;r=y.default?r:y.path.replace(/\*$/,"");var w=p({},v,{uri:g,location:e,navigate:function(t,e){return n(Object(l.resolve)(t,g),e)}}),O=o.a.cloneElement(b,w,b.props.children?o.a.createElement(x,{location:e,primary:i},b.props.children):void 0),_=i?P:c,S=i?p({uri:g,location:e,component:c},s):s;return o.a.createElement(E.Provider,{value:{baseuri:g,basepath:r}},o.a.createElement(_,S,O))}return null},e}(o.a.PureComponent);_.defaultProps={primary:!0};var S=g("Focus"),P=function(t){var e=t.uri,n=t.location,r=t.component,i=d(t,["uri","location","component"]);return o.a.createElement(S.Consumer,null,(function(t){return o.a.createElement(T,p({},i,{component:r,requestFocus:t,uri:e,location:n}))}))},R=!0,k=0,T=function(t){function e(){var n,r;h(this,e);for(var o=arguments.length,i=Array(o),a=0;a0&&void 0!==arguments[0]?arguments[0]:{},n=e.registeredObservers,r=void 0===n?new Set:n,o=e.processedEntries,i=void 0===o?new Set:o,a=e.interval,u=void 0===a?100:a,c=e.context,s=void 0===c?self:c;!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),p(this,"registeredObservers",void 0),p(this,"processedEntries",void 0),p(this,"interval",void 0),p(this,"intervalId",void 0),p(this,"context",void 0),this.registeredObservers=r,this.processedEntries=i,this.interval=u,this.context=s,this.intervalId=null}var e,n;return e=t,(n=[{key:"getNewEntries",value:function(){var t=this;return this.context.performance.getEntries().filter((function(e){return!t.processedEntries.has(e)}))}},{key:"getObserversForType",value:function(t,e){return Array.from(t).filter((function(t){return t.entryTypes.some((function(t){return t===e}))}))}},{key:"processBuffer",value:function(t){var e=Array.from(t.buffer),n=new l(e);t.buffer.clear(),e.length&&t.callback&&t.callback.call(void 0,n,t)}},{key:"processEntries",value:function(){var t=this;this.getNewEntries().forEach((function(e){var n=e.entryType;t.getObserversForType(t.registeredObservers,n).forEach((function(t){t.buffer.add(e)})),t.processedEntries.add(e)}));var e=function(){return t.registeredObservers.forEach(t.processBuffer)};"requestAnimationFrame"in this.context?this.context.requestAnimationFrame(e):this.context.setTimeout(e,0)}},{key:"add",value:function(t){this.registeredObservers.add(t),1===this.registeredObservers.size&&this.observe()}},{key:"remove",value:function(t){this.registeredObservers.delete(t),this.registeredObservers.size||this.disconnect()}},{key:"observe",value:function(){this.intervalId=this.context.setInterval(this.processEntries.bind(this),this.interval)}},{key:"disconnect",value:function(){this.intervalId=this.context.clearInterval(this.intervalId)}}])&&f(e.prototype,n),t}()),b=function(){function t(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:y;!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),h(this,"callback",void 0),h(this,"buffer",void 0),h(this,"entryTypes",[]),h(this,"taskQueue",void 0),this.callback=e,this.buffer=new Set,this.taskQueue=n}var e,n;return e=t,(n=[{key:"observe",value:function(t){if(!t)throw new Error(v);if(t.entryTypes&&t.type)throw new Error("Failed to execute 'observe' on 'PerformanceObserver': either an 'entryTypes' or 'type' member must be present, not both.");var e;if(t.entryTypes)e=t.entryTypes;else{if(!t.type)throw new Error(v);e=[t.type]}var n=e.filter(g);n.length>0&&n.length!==e.length&&console.warn("Invalid or unsupported entry types provided to 'observe' on 'PerformanceObserver'."),n.length?(this.entryTypes=n,this.taskQueue.add(this)):console.warn("Aborting 'observe' on 'PerformanceObserver': no valid entry types present in either 'entryTypes' or 'type' member.")}},{key:"disconnect",value:function(){this.taskQueue.remove(this)}},{key:"takeRecords",value:function(){var t=Array.from(this.buffer);return new l(t)}}])&&d(e.prototype,n),t}();h(b,"supportedEntryTypes",m);var w="PerformanceObserver"in self&&"function"==typeof PerformanceObserver?PerformanceObserver:b,O=self;O.PerformanceObserver||(O.PerformanceObserver=w)}])},cDf5:function(t,e){function n(e){return t.exports=n="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},t.exports.__esModule=!0,t.exports.default=t.exports,n(e)}t.exports=n,t.exports.__esModule=!0,t.exports.default=t.exports},cSJ8:function(t,e,n){"use strict";function r(t,e){return void 0===e&&(e=""),e?t===e?"/":t.startsWith(e+"/")?t.slice(e.length):t:t}n.d(e,"a",(function(){return r}))},cjT7:function(t,e){t.exports=function(t){return null==t}},cu4x:function(t,e,n){"use strict";e.__esModule=!0,e.parsePath=function(t){var e=t||"/",n="",r="",o=e.indexOf("#");-1!==o&&(r=e.substr(o),e=e.substr(0,o));var i=e.indexOf("?");-1!==i&&(n=e.substr(i),e=e.substr(0,i));return{pathname:e,search:"?"===n?"":n,hash:"#"===r?"":r}}},"dBg+":function(t,e){e.f=Object.getOwnPropertySymbols},dI71:function(t,e,n){"use strict";function r(t,e){return(r=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t})(t,e)}function o(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,r(t,e)}n.d(e,"a",(function(){return o}))},"e/UW":function(t,e,n){"use strict";e.registerServiceWorker=function(){return!0};var r=[];e.onServiceWorkerActive=function(t){var e=t.getResourceURLsForPathname,n=t.serviceWorker;if(window.___swUpdated)n.active.postMessage({gatsbyApi:"clearPathResources"});else{var o=document.querySelectorAll("\n head > script[src],\n head > link[href],\n head > style[data-href]\n "),i=[].slice.call(o).map((function(t){return t.src||t.href||t.getAttribute("data-href")})),a=[];r.forEach((function(t){var r=e(t);a.push.apply(a,r),n.active.postMessage({gatsbyApi:"setPathResources",path:t,resources:r})})),[].concat(i,a).forEach((function(t){var e=document.createElement("link");e.rel="prefetch",e.href=t,e.onload=e.remove,e.onerror=e.remove,document.head.appendChild(e)}))}},e.onPostPrefetchPathname=function(t){var e=t.pathname,n=t.getResourceURLsForPathname;if(!window.___swUpdated&&"serviceWorker"in navigator){var o=navigator.serviceWorker;null===o.controller?r.push(e):o.controller.postMessage({gatsbyApi:"setPathResources",path:e,resources:n(e)})}}},"eDl+":function(t,e){t.exports=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"]},emEt:function(t,e,n){"use strict";n.r(e),n.d(e,"PageResourceStatus",(function(){return f})),n.d(e,"BaseLoader",(function(){return g})),n.d(e,"ProdLoader",(function(){return b})),n.d(e,"setLoader",(function(){return w})),n.d(e,"publicLoader",(function(){return O})),n.d(e,"getStaticQueryResults",(function(){return E}));var r=n("dI71");function o(t,e){(null==e||e>t.length)&&(e=t.length);for(var n=0,r=new Array(e);n0;)t[r]=t[--r];r!==i++&&(t[r]=n)}return t},u=function(t,e,n,r){for(var o=e.length,i=n.length,a=0,u=0;a0?r:n)(e)}},tiKp:function(t,e,n){var r=n("2oRo"),o=n("VpIT"),i=n("Gi26"),a=n("kOOl"),u=n("BPiQ"),c=n("/b8u"),s=r.Symbol,l=o("wks"),f=c?s.for||s:s&&s.withoutSetter||a;t.exports=function(t){return i(l,t)||(l[t]=u&&i(s,t)?s[t]:f("Symbol."+t)),l[t]}},wE6v:function(t,e,n){var r=n("xluM"),o=n("hh1v"),i=n("2bX/"),a=n("3Eq5"),u=n("SFrS"),c=n("tiKp"),s=TypeError,l=c("toPrimitive");t.exports=function(t,e){if(!o(t)||i(t))return t;var n,c=a(t,l);if(c){if(void 0===e&&(e="default"),n=r(c,t,e),!o(n)||i(n))return n;throw s("Can't convert object to primitive value")}return void 0===e&&(e="number"),u(t,e)}},xDBR:function(t,e){t.exports=!1},xluM:function(t,e,n){var r=n("QNWe"),o=Function.prototype.call;t.exports=r?o.bind(o):function(){return o.apply(o,arguments)}},xrYK:function(t,e,n){var r=n("4zBA"),o=r({}.toString),i=r("".slice);t.exports=function(t){return i(o(t),8,-1)}},xs3f:function(t,e,n){var r=n("2oRo"),o=n("Y3Q8"),i=r["__core-js_shared__"]||o("__core-js_shared__",{});t.exports=i},xtsi:function(t,e,n){n("E9XD");var r=n("LeKB"),o=n("emEt").publicLoader,i=o.getResourcesForPathname,a=o.getResourcesForPathnameSync,u=o.getResourceURLsForPathname,c=o.loadPage,s=o.loadPageSync;e.apiRunner=function(t,e,n,o){void 0===e&&(e={});var l=r.map((function(n){if(n.plugin[t]){e.getResourcesForPathnameSync=a,e.getResourcesForPathname=i,e.getResourceURLsForPathname=u,e.loadPage=c,e.loadPageSync=s;var r=n.plugin[t](e,n.options);return r&&o&&(e=o({args:e,result:r,plugin:n})),r}}));return(l=l.filter((function(t){return void 0!==t}))).length>0?l:n?[n]:[]},e.apiRunnerAsync=function(t,e,n){return r.reduce((function(n,r){return r.plugin[t]?n.then((function(){return r.plugin[t](e,r.options)})):n}),Promise.resolve())}},yLpj:function(t,e){var n;n=function(){return this}();try{n=n||new Function("return this")()}catch(r){"object"==typeof window&&(n=window)}t.exports=n},yoRg:function(t,e,n){var r=n("4zBA"),o=n("Gi26"),i=n("/GqU"),a=n("TWQb").indexOf,u=n("0BK2"),c=r([].push);t.exports=function(t,e){var n,r=i(t),s=0,l=[];for(n in r)!o(u,n)&&o(r,n)&&c(l,n);for(;e.length>s;)o(r,n=e[s++])&&(~a(l,n)||c(l,n));return l}},yy0I:function(t,e,n){var r=n("Fib7"),o=n("m/L8"),i=n("E9LY"),a=n("Y3Q8");t.exports=function(t,e,n,u){u||(u={});var c=u.enumerable,s=void 0!==u.name?u.name:e;if(r(n)&&i(n,s,u),u.global)c?t[e]=n:a(e,n);else{try{u.unsafe?t[e]&&(c=!0):delete t[e]}catch(l){}c?t[e]=n:o.f(t,e,{value:n,enumerable:!1,configurable:!u.nonConfigurable,writable:!u.nonWritable})}return t}},zBJ4:function(t,e,n){var r=n("2oRo"),o=n("hh1v"),i=r.document,a=o(i)&&o(i.createElement);t.exports=function(t){return a?i.createElement(t):{}}},zc4i:function(t,e,n){var r=n("2oRo"),o=n("Fib7"),i=r.WeakMap;t.exports=o(i)&&/native code/.test(String(i))}},[["UxWs",4,1,11]]]); +//# sourceMappingURL=app-023ae061509e1db264bf.js.map \ No newline at end of file diff --git a/app-023ae061509e1db264bf.js.LICENSE.txt b/app-023ae061509e1db264bf.js.LICENSE.txt new file mode 100644 index 00000000..9795d0b6 --- /dev/null +++ b/app-023ae061509e1db264bf.js.LICENSE.txt @@ -0,0 +1,33 @@ +/*! + * Performance Observer Polyfill + * Version: 1.1.1 + * https://github.com/fastly/performance-observer-polyfill + * + * Copyright (c) 2020, Fastly, Inc. All rights reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */ + +/*! + * domready (c) Dustin Diaz 2014 - License MIT + * ie10 fix - Mikael Kristiansson 2019 + */ + +/*! medium-zoom 1.0.8 | MIT License | https://github.com/francoischalifour/medium-zoom */ diff --git a/app-023ae061509e1db264bf.js.map b/app-023ae061509e1db264bf.js.map new file mode 100644 index 00000000..be07a2e5 --- /dev/null +++ b/app-023ae061509e1db264bf.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./node_modules/gatsby-link/index.js","webpack:///./node_modules/core-js/internals/to-indexed-object.js","webpack:///./node_modules/core-js/internals/use-symbol-as-uid.js","webpack:///./node_modules/gatsby-react-router-scroll/session-storage.js","webpack:///./node_modules/core-js/internals/hidden-keys.js","webpack:///./node_modules/core-js/internals/fails.js","webpack:///./node_modules/core-js/internals/get-built-in.js","webpack:///./node_modules/core-js/internals/object-property-is-enumerable.js","webpack:///./node_modules/core-js/internals/array-reduce.js","webpack:///./node_modules/@babel/runtime/helpers/interopRequireWildcard.js","webpack:///./node_modules/core-js/internals/engine-is-ie-or-edge.js","webpack:///./node_modules/core-js/internals/is-symbol.js","webpack:///./node_modules/core-js/internals/global.js","webpack:///./.cache/normalize-page-path.js","webpack:///./.cache/find-path.js","webpack:///./node_modules/gatsby-plugin-google-gtag/gatsby-browser.js","webpack:///./node_modules/core-js/internals/get-method.js","webpack:///./node_modules/gatsby-react-router-scroll/use-scroll-restoration.js","webpack:///./node_modules/core-js/internals/function-uncurry-this.js","webpack:///./node_modules/mitt/dist/mitt.es.js","webpack:///./.cache/emitter.js","webpack:///./node_modules/core-js/internals/copy-constructor-properties.js","webpack:///./node_modules/gatsby-react-router-scroll/index.js","webpack:///./node_modules/@babel/runtime/helpers/objectWithoutPropertiesLoose.js","webpack:///./node_modules/process/browser.js","webpack:///./node_modules/core-js/internals/shared-key.js","webpack:///./.cache/react-lifecycles-compat.js","webpack:///./node_modules/@reach/router/es/lib/history.js","webpack:///./node_modules/core-js/internals/classof.js","webpack:///./node_modules/gatsby-plugin-manifest/get-manifest-pathname.js","webpack:///./node_modules/core-js/internals/to-string-tag-support.js","webpack:///./node_modules/core-js/internals/length-of-array-like.js","webpack:///./node_modules/core-js/internals/engine-ff-version.js","webpack:///./node_modules/core-js/internals/symbol-constructor-detection.js","webpack:///./node_modules/core-js/internals/object-get-own-property-descriptor.js","webpack:///./node_modules/core-js/internals/delete-property-or-throw.js","webpack:///./node_modules/medium-zoom/dist/medium-zoom.esm.js","webpack:///./node_modules/gatsby-remark-images-medium-zoom/gatsby-browser.js","webpack:///./node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js","webpack:///./node_modules/core-js/internals/ie8-dom-define.js","webpack:///./node_modules/core-js/internals/try-to-string.js","webpack:///./node_modules/core-js/internals/make-built-in.js","webpack:///./node_modules/core-js/modules/es.array.reduce.js","webpack:///./node_modules/gatsby-react-router-scroll/scroll-handler.js","webpack:///./node_modules/core-js/internals/is-callable.js","webpack:///./gatsby-browser.js","webpack:///./node_modules/core-js/internals/has-own-property.js","webpack:///./node_modules/core-js/internals/require-object-coercible.js","webpack:///./node_modules/core-js/internals/export.js","webpack:///./node_modules/core-js/internals/to-absolute-index.js","webpack:///./.cache/page-renderer.js","webpack:///./node_modules/core-js/internals/object-get-own-property-names.js","webpack:///./node_modules/core-js/internals/engine-v8-version.js","webpack:///./node_modules/@reach/router/es/lib/utils.js","webpack:///./.cache/api-runner-browser-plugins.js","webpack:///./node_modules/@mikaelkristiansson/domready/ready.js","webpack:///./node_modules/core-js/internals/engine-user-agent.js","webpack:///./.cache/register-service-worker.js","webpack:///./.cache/_this_is_virtual_fs_path_/$virtual/async-requires.js","webpack:///./node_modules/core-js/internals/object-is-prototype-of.js","webpack:///./node_modules/@babel/runtime/helpers/assertThisInitialized.js","webpack:///./node_modules/invariant/browser.js","webpack:///./node_modules/core-js/internals/function-bind-native.js","webpack:///./node_modules/core-js/internals/indexed-object.js","webpack:///./node_modules/core-js/internals/ordinary-to-primitive.js","webpack:///./node_modules/@babel/runtime/helpers/setPrototypeOf.js","webpack:///./gatsby-meta-config.js","webpack:///./node_modules/core-js/internals/array-includes.js","webpack:///./node_modules/core-js/internals/array-slice-simple.js","webpack:///./node_modules/core-js/modules/es.array.sort.js","webpack:///./node_modules/@babel/runtime/helpers/interopRequireDefault.js","webpack:///./node_modules/core-js/internals/to-length.js","webpack:///./node_modules/core-js/internals/engine-webkit-version.js","webpack:///./.cache/route-announcer-props.js","webpack:///./.cache/navigation.js","webpack:///./node_modules/shallow-compare/es/index.js","webpack:///./.cache/ensure-resources.js","webpack:///./.cache/production-app.js","webpack:///./node_modules/core-js/internals/to-string.js","webpack:///./node_modules/@babel/runtime/helpers/inheritsLoose.js","webpack:///./node_modules/core-js/internals/shared.js","webpack:///./node_modules/core-js/internals/own-keys.js","webpack:///./node_modules/core-js/internals/to-integer-or-infinity.js","webpack:///./.cache/gatsby-browser-entry.js","webpack:///./node_modules/core-js/internals/a-callable.js","webpack:///./node_modules/intersection-observer/intersection-observer.js","webpack:///./node_modules/core-js/internals/create-property-descriptor.js","webpack:///./node_modules/core-js/internals/function-name.js","webpack:///./node_modules/core-js/internals/define-global-property.js","webpack:///./node_modules/core-js/internals/engine-is-node.js","webpack:///./node_modules/gatsby/dist/internal-plugins/bundle-optimisations/polyfills/object-assign.js","webpack:///./node_modules/@reach/router/es/index.js","webpack:///./node_modules/core-js/internals/internal-state.js","webpack:///./node_modules/@fastly/performance-observer-polyfill/polyfill/index.js","webpack:///./node_modules/@babel/runtime/helpers/typeof.js","webpack:///./.cache/strip-prefix.js","webpack:///./node_modules/core-js/internals/is-null-or-undefined.js","webpack:///./node_modules/gatsby-link/parse-path.js","webpack:///./node_modules/core-js/internals/object-get-own-property-symbols.js","webpack:///./node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js","webpack:///./node_modules/@babel/runtime/helpers/esm/inheritsLoose.js","webpack:///./node_modules/gatsby-plugin-offline/gatsby-browser.js","webpack:///./node_modules/core-js/internals/enum-bug-keys.js","webpack:///./node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js","webpack:///./node_modules/@babel/runtime/helpers/esm/toConsumableArray.js","webpack:///./node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js","webpack:///./node_modules/@babel/runtime/helpers/esm/iterableToArray.js","webpack:///./node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js","webpack:///./node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js","webpack:///./.cache/prefetch.js","webpack:///./.cache/loader.js","webpack:///./node_modules/core-js/internals/to-object.js","webpack:///./node_modules/core-js/internals/descriptors.js","webpack:///./node_modules/core-js/internals/an-object.js","webpack:///./node_modules/core-js/internals/create-property.js","webpack:///./node_modules/gatsby-remark-autolink-headers/gatsby-browser.js","webpack:///./node_modules/gatsby-react-router-scroll/scroll-container.js","webpack:///./node_modules/core-js/internals/is-object.js","webpack:///./node_modules/core-js/internals/inspect-source.js","webpack:///./node_modules/core-js/internals/document-all.js","webpack:///./node_modules/core-js/internals/uid.js","webpack:///./node_modules/core-js/internals/create-non-enumerable-property.js","webpack:///./node_modules/core-js/internals/is-forced.js","webpack:///./.cache/public-page-renderer.js","webpack:///./node_modules/core-js/internals/object-define-property.js","webpack:///./node_modules/gatsby-plugin-manifest/gatsby-browser.js","webpack:///./.cache/create-react-context.js","webpack:///./node_modules/gatsby-remark-images/constants.js","webpack:///./node_modules/core-js/internals/to-property-key.js","webpack:///./node_modules/@babel/runtime/helpers/extends.js","webpack:///./node_modules/core-js/internals/array-method-is-strict.js","webpack:///./node_modules/gatsby-remark-images/gatsby-browser.js","webpack:///./node_modules/core-js/internals/array-sort.js","webpack:///./node_modules/core-js/internals/v8-prototype-define-bug.js","webpack:///./.cache/public-page-renderer-prod.js","webpack:///./node_modules/core-js/internals/math-trunc.js","webpack:///./node_modules/core-js/internals/well-known-symbol.js","webpack:///./node_modules/core-js/internals/to-primitive.js","webpack:///./node_modules/core-js/internals/is-pure.js","webpack:///./node_modules/core-js/internals/function-call.js","webpack:///./node_modules/core-js/internals/classof-raw.js","webpack:///./node_modules/core-js/internals/shared-store.js","webpack:///./.cache/api-runner-browser.js","webpack:///(webpack)/buildin/global.js","webpack:///./node_modules/core-js/internals/object-keys-internal.js","webpack:///./node_modules/core-js/internals/define-built-in.js","webpack:///./node_modules/core-js/internals/document-create-element.js","webpack:///./node_modules/core-js/internals/weak-map-basic-detection.js"],"names":["_interopRequireDefault","exports","__esModule","withPrefix","withAssetPrefix","path","getGlobalPathPrefix","navigateTo","replace","push","navigate","default","_objectWithoutPropertiesLoose2","_assertThisInitialized2","_inheritsLoose2","_extends2","_propTypes","_react","_router","_utils","_parsePath","parsePath","isAbsolutePath","startsWith","prefix","_ref","_prefix","getGlobalBasePrefix","isLocalLink","base","endsWith","slice","rewriteLinkPath","relativeTo","current","resolve","absolutify","NavLinkPropTypes","activeClassName","string","activeStyle","object","partiallyActive","bool","GatsbyLinkLocationWrapper","props","createElement","Location","_ref2","location","GatsbyLink","_location","_React$Component","_this","call","this","defaultGetProps","_ref3","isPartiallyCurrent","isCurrent","className","filter","Boolean","join","style","IOSupported","window","IntersectionObserver","state","handleRef","bind","_proto","prototype","_prefetch","currentPath","pathname","rewrittenPath","to","newPathName","___loader","enqueue","componentDidUpdate","prevProps","prevState","componentDidMount","componentWillUnmount","io","_this$io","instance","el","unobserve","disconnect","ref","cb","_this2","innerRef","hasOwnProperty","entries","forEach","entry","target","isIntersecting","intersectionRatio","observe","render","_this3","_this$props","_this$props$getProps","getProps","_onClick","onClick","_onMouseEnter","onMouseEnter","rest","prefixedTo","Link","e","hovering","button","defaultPrevented","metaKey","altKey","ctrlKey","shiftKey","preventDefault","shouldReplace","encodeURI","___navigate","href","Component","propTypes","func","isRequired","showDeprecationWarning","functionName","altFunctionName","version","console","warn","_default","forwardRef","options","___push","___replace","IndexedObject","requireObjectCoercible","module","it","NATIVE_SYMBOL","Symbol","sham","iterator","SessionStorage","read","key","stateKey","getStateKey","value","sessionStorage","getItem","JSON","parse","save","storedValue","stringify","setItem","stateKeyBase","exec","error","global","isCallable","aFunction","argument","undefined","namespace","method","arguments","length","$propertyIsEnumerable","propertyIsEnumerable","getOwnPropertyDescriptor","Object","NASHORN_BUG","1","f","V","descriptor","enumerable","aCallable","toObject","lengthOfArrayLike","$TypeError","TypeError","createMethod","IS_RIGHT","that","callbackfn","argumentsLength","memo","O","self","index","i","left","right","_typeof","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","obj","cache","has","get","newObj","hasPropertyDescriptor","defineProperty","desc","set","UA","test","getBuiltIn","isPrototypeOf","USE_SYMBOL_AS_UID","$Object","$Symbol","Math","check","globalThis","Function","charAt","pathCache","Map","matchPaths","trimPathname","rawPathname","decodeURIComponent","stripPrefix","__BASE_PATH__","split","URL","setMatchPaths","findMatchPath","trimmedPathname","cleanPath","pickPaths","map","matchPath","originalPath","pick","normalizePagePath","route","grabMatchParams","params","findPath","foundPath","onRouteUpdate","gtag","excludeGtagPaths","some","rx","sendPageView","pagePath","search","hash","page_path","requestAnimationFrame","setTimeout","isNullOrUndefined","P","useScrollRestoration","identifier","useLocation","useContext","_scrollHandler","ScrollContext","useRef","useLayoutEffect","position","scrollTo","onScroll","scrollTop","NATIVE_BIND","FunctionPrototype","uncurryThisWithBind","fn","apply","emitter","all","create","on","type","handler","off","splice","indexOf","emit","evt","mitt","hasOwn","ownKeys","getOwnPropertyDescriptorModule","definePropertyModule","source","exceptions","keys","ScrollContainer","ScrollHandler","_scrollContainer","_useScrollRestoration","excluded","sourceKeys","cachedSetTimeout","cachedClearTimeout","process","defaultSetTimout","Error","defaultClearTimeout","runTimeout","fun","clearTimeout","currentQueue","queue","draining","queueIndex","cleanUpNextTick","concat","drainQueue","timeout","len","run","marker","runClearTimeout","Item","array","noop","nextTick","args","Array","title","browser","env","argv","versions","addListener","once","removeListener","removeAllListeners","prependListener","prependOnceListener","listeners","name","binding","cwd","chdir","dir","umask","shared","uid","polyfill","_extends","assign","getLocation","_source$location","origin","protocol","host","hostname","port","canUseDOM","decodeURI","history","createHistory","transitioning","resolveTransition","_onTransitionComplete","listen","listener","popstateListener","action","addEventListener","removeEventListener","_ref$replace","go","Date","now","replaceState","pushState","transition","Promise","res","createMemorySource","initialPath","searchIndex","initialLocation","substr","stack","states","_","uri","_uri$split","_uri$split$","_uri$split2","_uri$split2$","newIndex","document","globalHistory","TO_STRING_TAG_SUPPORT","classofRaw","TO_STRING_TAG","wellKnownSymbol","CORRECT_ARGUMENTS","tag","result","tryGet","callee","localizedManifests","isArray","localizedManifest","find","app","start_url","lang","String","toLength","firefox","match","V8_VERSION","fails","$String","getOwnPropertySymbols","symbol","DESCRIPTORS","propertyIsEnumerableModule","createPropertyDescriptor","toIndexedObject","toPropertyKey","IE8_DOM_DEFINE","$getOwnPropertyDescriptor","tryToString","isSupported","node","tagName","isNode","selector","nodeType","isSvg","image","currentSrc","src","toLowerCase","getImagesFromSelector","NodeList","isNodeList","querySelectorAll","err","createOverlay","background","overlay","classList","add","cloneTarget","template","_template$getBounding","getBoundingClientRect","top","width","height","clone","cloneNode","pageYOffset","documentElement","body","scrollLeft","pageXOffset","removeAttribute","transform","createCustomEvent","eventParams","bubbles","cancelable","detail","CustomEvent","customEvent","createEvent","initCustomEvent","css","insertAt","head","getElementsByTagName","firstChild","insertBefore","appendChild","styleSheet","cssText","createTextNode","styleInject","mediumZoom","_handleClick","event","images","toggle","close","_handleScroll","isAnimating","active","original","currentScroll","abs","zoomOptions","scrollOffset","_handleKeyUp","keyCode","update","newOptions","container","querySelector","dispatchEvent","zoom","attach","_len","selectors","_key","newImages","reduce","imagesAccumulator","currentSelector","newImage","eventListeners","detach","_len2","_key2","zoomed","imagesToDetach","remove","eventListener","toString","open","_animate","clientWidth","clientHeight","bottom","viewportWidth","viewportHeight","margin","_zoomContainer$getBou","_width","_height","_left","_top","zoomTarget","zoomedHd","naturalWidth","naturalHeight","_zoomTarget$getBoundi","scaleX","min","max","scaleY","scale","_images","content","parentElement","_handleOpenEnd","getAttribute","onerror","clearInterval","getZoomTargetSize","setInterval","complete","hasAttribute","loadEventListener","opacity","_handleCloseEnd","removeChild","getOptions","getImages","getZoomedImage","defaultOptions","zIndex","excludedSelector","applyZoomEffect","includedSelector","_objectWithoutPropertiesLoose","_excluded","imagesSelector","imageClass","imageElements","from","includedEls","contains","onImageLoad","originalTransition","setAttribute","click","pluginOptions","styles","id","innerHTML","injectStyles","callback","performance","PerformanceObserver","po","list","getEntries","entryType","entryTypes","onFCP","a","uncurryThis","CONFIGURABLE_FUNCTION_NAME","CONFIGURABLE","inspectSource","InternalStateModule","enforceInternalState","enforce","getInternalState","stringSlice","CONFIGURABLE_LENGTH","TEMPLATE","makeBuiltIn","getter","setter","configurable","arity","constructor","writable","$","$reduce","arrayMethodIsStrict","CHROME_VERSION","proto","forced","_interopRequireWildcard","React","_sessionStorage","createContext","displayName","_stateStorage","scrollListener","scrollY","windowScroll","shouldUpdateScroll","scrollToHash","getElementById","substring","scrollIntoView","prevRouterProps","routerProps","scrollPosition","_this$props$location","_this$props$location2","Provider","children","element","$documentAll","documentAll","IS_HTMLDDA","require","metaConfig","onInitialClientRender","d","s","js","fjs","share","facebookAppId","fbAsyncInit","FB","init","appId","xfbml","AppEvents","logPageView","parentNode","createNonEnumerableProperty","defineBuiltIn","defineGlobalProperty","copyConstructorProperties","isForced","targetProperty","sourceProperty","TARGET","GLOBAL","STATIC","stat","dontCallGetSet","toIntegerOrInfinity","integer","PageRenderer","_inheritsLoose","pageResources","json","pageContext","__params","pathContext","pageElement","apiRunner","loader","publicLoader","component","page","pop","internalObjectKeys","hiddenKeys","getOwnPropertyNames","userAgent","Deno","v8","routes","default_","uriPathname","uriSegments","segmentize","isRootUri","ranked","rankRoutes","l","missed","routeSegments","routeSegment","uriSegment","isSplat","dynamicMatch","paramRe","reservedNames","_to$split","toPathname","toQuery","basePathname","toSegments","baseSegments","addQuery","allSegments","segments","segment","insertParams","_path$split","pathBase","_path$split$","query","constructedPath","_params$location","_params$location$sear","searchSplit","validateRedirect","isDynamic","sort","rankRoute","score","isRootSegment","SEGMENT_POINTS","b","q","shallowCompare","obj1","obj2","obj1Keys","every","plugin","ie10","navigator","appVersion","fns","doc","hack","doScroll","loaded","readyState","shift","definition","serviceWorker","register","then","reg","installingWorker","installing","log","controller","___swUpdated","___failedResources","reload","catch","components","ReferenceError","condition","format","c","argIndex","framesToPop","classof","isObject","input","pref","val","valueOf","_setPrototypeOf","o","p","setPrototypeOf","__proto__","description","author","introduction","siteUrl","social","twitter","github","medium","facebook","linkedin","instagram","icon","keywords","comment","disqusShortName","utterances","configs","countOfInitialPost","sponsor","buyMeACoffeeId","ga","toAbsoluteIndex","IS_INCLUDES","$this","fromIndex","includes","createProperty","$Array","start","end","k","fin","n","deletePropertyOrThrow","internalSort","FF","IE_OR_EDGE","V8","WEBKIT","nativeSort","FAILS_ON_UNDEFINED","FAILS_ON_NULL","STRICT_METHOD","STABLE_SORT","code","chr","fromCharCode","v","comparefn","itemsLength","items","arrayLength","x","y","getSortCompare","webkit","RouteAnnouncerProps","padding","overflow","clip","whiteSpace","border","redirectMap","redirectIgnoreCaseMap","maybeRedirect","redirect","toPath","redirects","ignoreCase","fromPath","onPreRouteUpdate","prevLocation","timeoutId","loadPage","status","PageResourceStatus","webpackCompilationHash","___webpackCompilationHash","postMessage","gatsbyApi","reachNavigate","results","getSavedScrollPosition","RouteAnnouncer","announcementRef","createRef","nextProps","pageName","pageHeadings","textContent","newAnnouncement","innerText","compareLocationProps","nextLocation","_prevLocation$state","_nextLocation$state","RouteUpdates","_React$Component2","_this4","_proto2","shouldComponentUpdate","Fragment","shallowDiffers","_i","EnsureResources","loadPageSync","getDerivedStateFromProps","loadResources","rawPath","setState","nextState","ProdLoader","asyncRequires","setLoader","setApiRunner","___emitter","apiRunnerAsync","RouteHandler","BaseContext","baseuri","basepath","DataContext","GatsbyRoot","staticQueryResults","getStaticQueryResults","StaticQueryContext","LocationHandler","Consumer","Router","_window","browserLoc","SiteRoot","_ref4","App","renderer","ReactDOM","hydrate","domReady","subClass","superClass","IS_PURE","store","mode","copyright","license","getOwnPropertyNamesModule","getOwnPropertySymbolsModule","anObject","trunc","number","prefetchPathname","StaticQueryDataRenderer","staticQueryData","data","finalData","StaticQuery","useStaticQuery","_context$query","context","isNaN","Number","graphql","IntersectionObserverEntry","registry","THROTTLE_TIMEOUT","POLL_INTERVAL","USE_MUTATION_OBSERVER","_observationTargets","item","_registerInstance","_monitorIntersections","_checkForIntersections","_unmonitorIntersections","_unregisterInstance","takeRecords","records","_queuedEntries","_initThresholds","opt_threshold","threshold","t","_parseRootMargin","opt_rootMargin","margins","parts","parseFloat","unit","_monitoringIntersections","_monitoringInterval","addEvent","_domObserver","MutationObserver","attributes","childList","characterData","subtree","removeEvent","rootIsInDom","_rootIsInDom","rootRect","_getRootRect","targetRect","rootContainsTarget","_rootContainsTarget","oldEntry","intersectionRect","_computeTargetAndRootIntersection","newEntry","time","boundingClientRect","rootBounds","_hasCrossedThreshold","_callback","getComputedStyle","display","rect1","rect2","parent","getParentNode","atRoot","parentRect","parentComputedStyle","root","html","_expandRectByRootMargin","rect","_rootMarginValues","newRect","oldRatio","newRatio","thresholds","containsDeep","targetArea","intersectionArea","toFixed","opt_options","timer","rootMargin","opt_useCapture","attachEvent","detatchEvent","child","bitmap","getDescriptor","EXISTS","PROPER","_objectWithoutProperties","_classCallCheck","Constructor","_possibleConstructorReturn","_inherits","createNamedContext","defaultValue","Ctx","LocationContext","LocationProvider","_temp","getContext","refs","unlisten","_props$history","componentDidCatch","info","isRedirect","_navigate","unmounted","defaultProps","ServerLocation","url","baseContext","locationContext","RouterImpl","_React$PureComponent","_props","_navigate2","primary","_props$component","domProps","Children","toArray","createRoute","cloneElement","FocusWrapper","FocusHandler","wrapperProps","PureComponent","FocusContext","requestFocus","FocusHandlerImpl","initialRender","focusHandlerCount","_temp2","shouldFocus","focus","myURIChanged","navigatedUpToMe","activeElement","_this5","_props2","_props2$component","Comp","outline","tabIndex","C","_ref5","_ref6","_props$getProps","anchorProps","encodedHref","shouldNavigate","_location$state","restState","RedirectRequest","redirectTo","RedirectImpl","_React$Component3","_props3","_props3$replace","noThrow","resolvedTo","_props4","Redirect","_ref7","Match","_ref8","_ref9","_ref10","resolvedPath","useNavigate","useParams","useMatch","stripSlashes","str","elementPath","NATIVE_WEAK_MAP","sharedKey","metadata","facade","STATE","getterFor","TYPE","r","m","toStringTag","u","Reflect","construct","Proxy","getPrototypeOf","_entries","h","w","registeredObservers","Set","processedEntries","interval","intervalId","buffer","clear","getNewEntries","getObserversForType","processBuffer","size","delete","processEntries","taskQueue","E","j","hashIndex","registerServiceWorker","prefetchedPathnames","onServiceWorkerActive","getResourceURLsForPathname","nodes","headerResources","prefetchedResources","resources","resource","link","rel","onload","onPostPrefetchPathname","_arrayLikeToArray","arr","arr2","_toConsumableArray","iter","minLen","supportedPrefetchStrategy","feature","fakeLink","relList","supports","support","reject","getElementsByName","req","XMLHttpRequest","send","preFetched","prefetch","Success","preferDefault","createPageDataUrl","doFetch","onreadystatechange","toPageResources","pageData","componentChunkName","staticQueryHashes","BaseLoader","loadComponent","inFlightNetworkRequests","pageDb","inFlightDb","staticQueryDb","pageDataDb","prefetchTriggered","prefetchCompleted","memoizedGet","inFlightPromise","response","prefetchDisabled","fetchPageDataJson","loadObj","_loadObj$retries","retries","responseText","jsonPayload","payload","notFound","loadPageDataJson","loadAppData","allData","_pageData","_pageData$staticQuery","finalResult","componentChunkPromise","createdAt","staticQueryBatchPromise","staticQueryHash","staticQueryResultsMap","shouldPrefetch","connection","effectiveType","saveData","doesConnectionSupportPrefetch","realPath","doPrefetch","_this6","pageDataUrl","prefetchHelper","crossOrigin","as","createComponentUrls","isPageNotFound","_this7","appData","___chunkMapping","chunk","__PATH_PREFIX__","_BaseLoader","chunkName","componentUrls","_loader","getResourcesForPathname","getResourcesForPathnameSync","propertyKey","offsetY","getTargetOffset","clientTop","computedStyles","scrollMarginTop","getPropertyValue","parseInt","offset","_reactDom","scrollKey","ScrollContainerImplementation","findDOMNode","functionToString","postfix","random","replacement","detection","normalize","POLYFILL","NATIVE","V8_PROTOTYPE_DEFINE_BUG","$defineProperty","Attributes","DEFAULT_OPTIONS","maxWidth","wrapperStyle","backgroundColor","linkImagesToOriginal","showCaptions","markdownCaptions","withWebp","withAvif","tracedSVG","loading","disableBgImageOnAlpha","disableBgImage","EMPTY_ALT","imageWrapperClass","imageBackgroundClass","toPrimitive","isSymbol","METHOD_NAME","_require","apiCallbackContext","imageWrappers","_loop","imageWrapper","backgroundElement","imageElement","onImageComplete","color","boxShadow","arraySlice","floor","mergeSort","middle","insertionSort","merge","llength","rlength","lindex","rindex","ProdPageRenderer","InternalPageRenderer","ceil","WellKnownSymbolsStore","createWellKnownSymbol","withoutSetter","getMethod","ordinaryToPrimitive","TO_PRIMITIVE","exoticToPrim","plugins","_require$publicLoader","api","defaultReturn","argTransform","previous","next","g","names","simple","unsafe","nonConfigurable","nonWritable"],"mappings":"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","file":"app-023ae061509e1db264bf.js","sourcesContent":["\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nexports.__esModule = true;\nexports.withPrefix = withPrefix;\nexports.withAssetPrefix = withAssetPrefix;\nexports.navigateTo = exports.replace = exports.push = exports.navigate = exports.default = void 0;\n\nvar _objectWithoutPropertiesLoose2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutPropertiesLoose\"));\n\nvar _assertThisInitialized2 = _interopRequireDefault(require(\"@babel/runtime/helpers/assertThisInitialized\"));\n\nvar _inheritsLoose2 = _interopRequireDefault(require(\"@babel/runtime/helpers/inheritsLoose\"));\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _router = require(\"@reach/router\");\n\nvar _utils = require(\"@reach/router/lib/utils\");\n\nvar _parsePath = require(\"./parse-path\");\n\nexports.parsePath = _parsePath.parsePath;\n\nvar isAbsolutePath = function isAbsolutePath(path) {\n return path === null || path === void 0 ? void 0 : path.startsWith(\"/\");\n};\n\nfunction withPrefix(path, prefix) {\n var _ref, _prefix;\n\n if (prefix === void 0) {\n prefix = getGlobalBasePrefix();\n }\n\n if (!isLocalLink(path)) {\n return path;\n }\n\n if (path.startsWith(\"./\") || path.startsWith(\"../\")) {\n return path;\n }\n\n var base = (_ref = (_prefix = prefix) !== null && _prefix !== void 0 ? _prefix : getGlobalPathPrefix()) !== null && _ref !== void 0 ? _ref : \"/\";\n return \"\" + ((base === null || base === void 0 ? void 0 : base.endsWith(\"/\")) ? base.slice(0, -1) : base) + (path.startsWith(\"/\") ? path : \"/\" + path);\n} // These global values are wrapped in typeof clauses to ensure the values exist.\n// This is especially problematic in unit testing of this component.\n\n\nvar getGlobalPathPrefix = function getGlobalPathPrefix() {\n return process.env.NODE_ENV !== \"production\" ? typeof __PATH_PREFIX__ !== \"undefined\" ? __PATH_PREFIX__ : undefined : __PATH_PREFIX__;\n};\n\nvar getGlobalBasePrefix = function getGlobalBasePrefix() {\n return process.env.NODE_ENV !== \"production\" ? typeof __BASE_PATH__ !== \"undefined\" ? __BASE_PATH__ : undefined : __BASE_PATH__;\n};\n\nvar isLocalLink = function isLocalLink(path) {\n return path && !path.startsWith(\"http://\") && !path.startsWith(\"https://\") && !path.startsWith(\"//\");\n};\n\nfunction withAssetPrefix(path) {\n return withPrefix(path, getGlobalPathPrefix());\n}\n\nfunction absolutify(path, current) {\n // If it's already absolute, return as-is\n if (isAbsolutePath(path)) {\n return path;\n }\n\n return (0, _utils.resolve)(path, current);\n}\n\nvar rewriteLinkPath = function rewriteLinkPath(path, relativeTo) {\n if (typeof path === \"number\") {\n return path;\n }\n\n if (!isLocalLink(path)) {\n return path;\n }\n\n return isAbsolutePath(path) ? withPrefix(path) : absolutify(path, relativeTo);\n};\n\nvar NavLinkPropTypes = {\n activeClassName: _propTypes.default.string,\n activeStyle: _propTypes.default.object,\n partiallyActive: _propTypes.default.bool\n}; // Set up IntersectionObserver\n\nvar createIntersectionObserver = function createIntersectionObserver(el, cb) {\n var io = new window.IntersectionObserver(function (entries) {\n entries.forEach(function (entry) {\n if (el === entry.target) {\n // Check if element is within viewport, remove listener, destroy observer, and run link callback.\n // MSEdge doesn't currently support isIntersecting, so also test for an intersectionRatio > 0\n if (entry.isIntersecting || entry.intersectionRatio > 0) {\n io.unobserve(el);\n io.disconnect();\n cb();\n }\n }\n });\n }); // Add element to the observer\n\n io.observe(el);\n return {\n instance: io,\n el: el\n };\n};\n\nfunction GatsbyLinkLocationWrapper(props) {\n return /*#__PURE__*/_react.default.createElement(_router.Location, null, function (_ref2) {\n var location = _ref2.location;\n return /*#__PURE__*/_react.default.createElement(GatsbyLink, (0, _extends2.default)({}, props, {\n _location: location\n }));\n });\n}\n\nvar GatsbyLink = /*#__PURE__*/function (_React$Component) {\n (0, _inheritsLoose2.default)(GatsbyLink, _React$Component);\n\n function GatsbyLink(props) {\n var _this;\n\n _this = _React$Component.call(this, props) || this; // Default to no support for IntersectionObserver\n\n _this.defaultGetProps = function (_ref3) {\n var isPartiallyCurrent = _ref3.isPartiallyCurrent,\n isCurrent = _ref3.isCurrent;\n\n if (_this.props.partiallyActive ? isPartiallyCurrent : isCurrent) {\n return {\n className: [_this.props.className, _this.props.activeClassName].filter(Boolean).join(\" \"),\n style: (0, _extends2.default)({}, _this.props.style, _this.props.activeStyle)\n };\n }\n\n return null;\n };\n\n var IOSupported = false;\n\n if (typeof window !== \"undefined\" && window.IntersectionObserver) {\n IOSupported = true;\n }\n\n _this.state = {\n IOSupported: IOSupported\n };\n _this.handleRef = _this.handleRef.bind((0, _assertThisInitialized2.default)(_this));\n return _this;\n }\n\n var _proto = GatsbyLink.prototype;\n\n _proto._prefetch = function _prefetch() {\n var currentPath = window.location.pathname; // reach router should have the correct state\n\n if (this.props._location && this.props._location.pathname) {\n currentPath = this.props._location.pathname;\n }\n\n var rewrittenPath = rewriteLinkPath(this.props.to, currentPath);\n var newPathName = (0, _parsePath.parsePath)(rewrittenPath).pathname; // Prefech is used to speed up next navigations. When you use it on the current navigation,\n // there could be a race-condition where Chrome uses the stale data instead of waiting for the network to complete\n\n if (currentPath !== newPathName) {\n ___loader.enqueue(newPathName);\n }\n };\n\n _proto.componentDidUpdate = function componentDidUpdate(prevProps, prevState) {\n // Preserve non IO functionality if no support\n if (this.props.to !== prevProps.to && !this.state.IOSupported) {\n this._prefetch();\n }\n };\n\n _proto.componentDidMount = function componentDidMount() {\n // Preserve non IO functionality if no support\n if (!this.state.IOSupported) {\n this._prefetch();\n }\n };\n\n _proto.componentWillUnmount = function componentWillUnmount() {\n if (!this.io) {\n return;\n }\n\n var _this$io = this.io,\n instance = _this$io.instance,\n el = _this$io.el;\n instance.unobserve(el);\n instance.disconnect();\n };\n\n _proto.handleRef = function handleRef(ref) {\n var _this2 = this;\n\n if (this.props.innerRef && this.props.innerRef.hasOwnProperty(\"current\")) {\n this.props.innerRef.current = ref;\n } else if (this.props.innerRef) {\n this.props.innerRef(ref);\n }\n\n if (this.state.IOSupported && ref) {\n // If IO supported and element reference found, setup Observer functionality\n this.io = createIntersectionObserver(ref, function () {\n _this2._prefetch();\n });\n }\n };\n\n _proto.render = function render() {\n var _this3 = this;\n\n var _this$props = this.props,\n to = _this$props.to,\n _this$props$getProps = _this$props.getProps,\n getProps = _this$props$getProps === void 0 ? this.defaultGetProps : _this$props$getProps,\n _onClick = _this$props.onClick,\n _onMouseEnter = _this$props.onMouseEnter,\n $activeClassName = _this$props.activeClassName,\n $activeStyle = _this$props.activeStyle,\n $innerRef = _this$props.innerRef,\n partiallyActive = _this$props.partiallyActive,\n state = _this$props.state,\n replace = _this$props.replace,\n _location = _this$props._location,\n rest = (0, _objectWithoutPropertiesLoose2.default)(_this$props, [\"to\", \"getProps\", \"onClick\", \"onMouseEnter\", \"activeClassName\", \"activeStyle\", \"innerRef\", \"partiallyActive\", \"state\", \"replace\", \"_location\"]);\n\n if (process.env.NODE_ENV !== \"production\" && !isLocalLink(to)) {\n console.warn(\"External link \" + to + \" was detected in a Link component. Use the Link component only for internal links. See: https://gatsby.dev/internal-links\");\n }\n\n var prefixedTo = rewriteLinkPath(to, _location.pathname);\n\n if (!isLocalLink(prefixedTo)) {\n return /*#__PURE__*/_react.default.createElement(\"a\", (0, _extends2.default)({\n href: prefixedTo\n }, rest));\n }\n\n return /*#__PURE__*/_react.default.createElement(_router.Link, (0, _extends2.default)({\n to: prefixedTo,\n state: state,\n getProps: getProps,\n innerRef: this.handleRef,\n onMouseEnter: function onMouseEnter(e) {\n if (_onMouseEnter) {\n _onMouseEnter(e);\n }\n\n ___loader.hovering((0, _parsePath.parsePath)(prefixedTo).pathname);\n },\n onClick: function onClick(e) {\n if (_onClick) {\n _onClick(e);\n }\n\n if (e.button === 0 && // ignore right clicks\n !_this3.props.target && // let browser handle \"target=_blank\"\n !e.defaultPrevented && // onClick prevented default\n !e.metaKey && // ignore clicks with modifier keys...\n !e.altKey && !e.ctrlKey && !e.shiftKey) {\n e.preventDefault();\n var shouldReplace = replace;\n\n var isCurrent = encodeURI(prefixedTo) === _location.pathname;\n\n if (typeof replace !== \"boolean\" && isCurrent) {\n shouldReplace = true;\n } // Make sure the necessary scripts and data are\n // loaded before continuing.\n\n\n window.___navigate(prefixedTo, {\n state: state,\n replace: shouldReplace\n });\n }\n\n return true;\n }\n }, rest));\n };\n\n return GatsbyLink;\n}(_react.default.Component);\n\nGatsbyLink.propTypes = (0, _extends2.default)({}, NavLinkPropTypes, {\n onClick: _propTypes.default.func,\n to: _propTypes.default.string.isRequired,\n replace: _propTypes.default.bool,\n state: _propTypes.default.object\n});\n\nvar showDeprecationWarning = function showDeprecationWarning(functionName, altFunctionName, version) {\n return console.warn(\"The \\\"\" + functionName + \"\\\" method is now deprecated and will be removed in Gatsby v\" + version + \". Please use \\\"\" + altFunctionName + \"\\\" instead.\");\n};\n\nvar _default = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {\n return /*#__PURE__*/_react.default.createElement(GatsbyLinkLocationWrapper, (0, _extends2.default)({\n innerRef: ref\n }, props));\n});\n\nexports.default = _default;\n\nvar navigate = function navigate(to, options) {\n window.___navigate(rewriteLinkPath(to, window.location.pathname), options);\n};\n\nexports.navigate = navigate;\n\nvar push = function push(to) {\n showDeprecationWarning(\"push\", \"navigate\", 3);\n\n window.___push(rewriteLinkPath(to, window.location.pathname));\n};\n\nexports.push = push;\n\nvar replace = function replace(to) {\n showDeprecationWarning(\"replace\", \"navigate\", 3);\n\n window.___replace(rewriteLinkPath(to, window.location.pathname));\n}; // TODO: Remove navigateTo for Gatsby v3\n\n\nexports.replace = replace;\n\nvar navigateTo = function navigateTo(to) {\n showDeprecationWarning(\"navigateTo\", \"navigate\", 3);\n return push(to);\n};\n\nexports.navigateTo = navigateTo;","// toObject with fallback for non-array-like ES3 strings\nvar IndexedObject = require('../internals/indexed-object');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\nmodule.exports = function (it) {\n return IndexedObject(requireObjectCoercible(it));\n};\n","/* eslint-disable es/no-symbol -- required for testing */\nvar NATIVE_SYMBOL = require('../internals/symbol-constructor-detection');\n\nmodule.exports = NATIVE_SYMBOL\n && !Symbol.sham\n && typeof Symbol.iterator == 'symbol';\n","\"use strict\";\n\nexports.__esModule = true;\nexports.SessionStorage = void 0;\nvar STATE_KEY_PREFIX = \"@@scroll|\";\nvar GATSBY_ROUTER_SCROLL_STATE = \"___GATSBY_REACT_ROUTER_SCROLL\";\n\nvar SessionStorage = /*#__PURE__*/function () {\n function SessionStorage() {}\n\n var _proto = SessionStorage.prototype;\n\n _proto.read = function read(location, key) {\n var stateKey = this.getStateKey(location, key);\n\n try {\n var value = window.sessionStorage.getItem(stateKey);\n return value ? JSON.parse(value) : 0;\n } catch (e) {\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\"[gatsby-react-router-scroll] Unable to access sessionStorage; sessionStorage is not available.\");\n }\n\n if (window && window[GATSBY_ROUTER_SCROLL_STATE] && window[GATSBY_ROUTER_SCROLL_STATE][stateKey]) {\n return window[GATSBY_ROUTER_SCROLL_STATE][stateKey];\n }\n\n return 0;\n }\n };\n\n _proto.save = function save(location, key, value) {\n var stateKey = this.getStateKey(location, key);\n var storedValue = JSON.stringify(value);\n\n try {\n window.sessionStorage.setItem(stateKey, storedValue);\n } catch (e) {\n if (window && window[GATSBY_ROUTER_SCROLL_STATE]) {\n window[GATSBY_ROUTER_SCROLL_STATE][stateKey] = JSON.parse(storedValue);\n } else {\n window[GATSBY_ROUTER_SCROLL_STATE] = {};\n window[GATSBY_ROUTER_SCROLL_STATE][stateKey] = JSON.parse(storedValue);\n }\n\n if (process.env.NODE_ENV !== \"production\") {\n console.warn(\"[gatsby-react-router-scroll] Unable to save state in sessionStorage; sessionStorage is not available.\");\n }\n }\n };\n\n _proto.getStateKey = function getStateKey(location, key) {\n var stateKeyBase = \"\" + STATE_KEY_PREFIX + location.pathname;\n return key === null || typeof key === \"undefined\" ? stateKeyBase : stateKeyBase + \"|\" + key;\n };\n\n return SessionStorage;\n}();\n\nexports.SessionStorage = SessionStorage;","module.exports = {};\n","module.exports = function (exec) {\n try {\n return !!exec();\n } catch (error) {\n return true;\n }\n};\n","var global = require('../internals/global');\nvar isCallable = require('../internals/is-callable');\n\nvar aFunction = function (argument) {\n return isCallable(argument) ? argument : undefined;\n};\n\nmodule.exports = function (namespace, method) {\n return arguments.length < 2 ? aFunction(global[namespace]) : global[namespace] && global[namespace][method];\n};\n","'use strict';\nvar $propertyIsEnumerable = {}.propertyIsEnumerable;\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// Nashorn ~ JDK8 bug\nvar NASHORN_BUG = getOwnPropertyDescriptor && !$propertyIsEnumerable.call({ 1: 2 }, 1);\n\n// `Object.prototype.propertyIsEnumerable` method implementation\n// https://tc39.es/ecma262/#sec-object.prototype.propertyisenumerable\nexports.f = NASHORN_BUG ? function propertyIsEnumerable(V) {\n var descriptor = getOwnPropertyDescriptor(this, V);\n return !!descriptor && descriptor.enumerable;\n} : $propertyIsEnumerable;\n","var aCallable = require('../internals/a-callable');\nvar toObject = require('../internals/to-object');\nvar IndexedObject = require('../internals/indexed-object');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\n\nvar $TypeError = TypeError;\n\n// `Array.prototype.{ reduce, reduceRight }` methods implementation\nvar createMethod = function (IS_RIGHT) {\n return function (that, callbackfn, argumentsLength, memo) {\n aCallable(callbackfn);\n var O = toObject(that);\n var self = IndexedObject(O);\n var length = lengthOfArrayLike(O);\n var index = IS_RIGHT ? length - 1 : 0;\n var i = IS_RIGHT ? -1 : 1;\n if (argumentsLength < 2) while (true) {\n if (index in self) {\n memo = self[index];\n index += i;\n break;\n }\n index += i;\n if (IS_RIGHT ? index < 0 : length <= index) {\n throw $TypeError('Reduce of empty array with no initial value');\n }\n }\n for (;IS_RIGHT ? index >= 0 : length > index; index += i) if (index in self) {\n memo = callbackfn(memo, self[index], index, O);\n }\n return memo;\n };\n};\n\nmodule.exports = {\n // `Array.prototype.reduce` method\n // https://tc39.es/ecma262/#sec-array.prototype.reduce\n left: createMethod(false),\n // `Array.prototype.reduceRight` method\n // https://tc39.es/ecma262/#sec-array.prototype.reduceright\n right: createMethod(true)\n};\n","var _typeof = require(\"./typeof.js\")[\"default\"];\nfunction _getRequireWildcardCache(nodeInterop) {\n if (typeof WeakMap !== \"function\") return null;\n var cacheBabelInterop = new WeakMap();\n var cacheNodeInterop = new WeakMap();\n return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) {\n return nodeInterop ? cacheNodeInterop : cacheBabelInterop;\n })(nodeInterop);\n}\nfunction _interopRequireWildcard(obj, nodeInterop) {\n if (!nodeInterop && obj && obj.__esModule) {\n return obj;\n }\n if (obj === null || _typeof(obj) !== \"object\" && typeof obj !== \"function\") {\n return {\n \"default\": obj\n };\n }\n var cache = _getRequireWildcardCache(nodeInterop);\n if (cache && cache.has(obj)) {\n return cache.get(obj);\n }\n var newObj = {};\n var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor;\n for (var key in obj) {\n if (key !== \"default\" && Object.prototype.hasOwnProperty.call(obj, key)) {\n var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null;\n if (desc && (desc.get || desc.set)) {\n Object.defineProperty(newObj, key, desc);\n } else {\n newObj[key] = obj[key];\n }\n }\n }\n newObj[\"default\"] = obj;\n if (cache) {\n cache.set(obj, newObj);\n }\n return newObj;\n}\nmodule.exports = _interopRequireWildcard, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var UA = require('../internals/engine-user-agent');\n\nmodule.exports = /MSIE|Trident/.test(UA);\n","var getBuiltIn = require('../internals/get-built-in');\nvar isCallable = require('../internals/is-callable');\nvar isPrototypeOf = require('../internals/object-is-prototype-of');\nvar USE_SYMBOL_AS_UID = require('../internals/use-symbol-as-uid');\n\nvar $Object = Object;\n\nmodule.exports = USE_SYMBOL_AS_UID ? function (it) {\n return typeof it == 'symbol';\n} : function (it) {\n var $Symbol = getBuiltIn('Symbol');\n return isCallable($Symbol) && isPrototypeOf($Symbol.prototype, $Object(it));\n};\n","var check = function (it) {\n return it && it.Math == Math && it;\n};\n\n// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nmodule.exports =\n // eslint-disable-next-line es/no-global-this -- safe\n check(typeof globalThis == 'object' && globalThis) ||\n check(typeof window == 'object' && window) ||\n // eslint-disable-next-line no-restricted-globals -- safe\n check(typeof self == 'object' && self) ||\n check(typeof global == 'object' && global) ||\n // eslint-disable-next-line no-new-func -- fallback\n (function () { return this; })() || this || Function('return this')();\n","export default path => {\n if (path === undefined) {\n return path\n }\n if (path === `/`) {\n return `/`\n }\n if (path.charAt(path.length - 1) === `/`) {\n return path.slice(0, -1)\n }\n return path\n}\n","import { pick } from \"@reach/router/lib/utils\"\nimport stripPrefix from \"./strip-prefix\"\nimport normalizePagePath from \"./normalize-page-path\"\n\nconst pathCache = new Map()\nlet matchPaths = []\n\nconst trimPathname = rawPathname => {\n const pathname = decodeURIComponent(rawPathname)\n // Remove the pathPrefix from the pathname.\n const trimmedPathname = stripPrefix(pathname, __BASE_PATH__)\n // Remove any hashfragment\n .split(`#`)[0]\n // Remove search query\n .split(`?`)[0]\n\n return trimmedPathname\n}\n\nfunction absolutify(path) {\n // If it's already absolute, return as-is\n if (\n path.startsWith(`/`) ||\n path.startsWith(`https://`) ||\n path.startsWith(`http://`)\n ) {\n return path\n }\n // Calculate path relative to current location, adding a trailing slash to\n // match behavior of @reach/router\n return new URL(\n path,\n window.location.href + (window.location.href.endsWith(`/`) ? `` : `/`)\n ).pathname\n}\n\n/**\n * Set list of matchPaths\n *\n * @param {Array<{path: string, matchPath: string}>} value collection of matchPaths\n */\nexport const setMatchPaths = value => {\n matchPaths = value\n}\n\n/**\n * Return a matchpath url\n * if `match-paths.json` contains `{ \"/foo*\": \"/page1\", ...}`, then\n * `/foo?bar=far` => `/page1`\n *\n * @param {string} rawPathname A raw pathname\n * @return {string|null}\n */\nexport const findMatchPath = rawPathname => {\n const trimmedPathname = cleanPath(rawPathname)\n\n const pickPaths = matchPaths.map(({ path, matchPath }) => {\n return {\n path: matchPath,\n originalPath: path,\n }\n })\n\n const path = pick(pickPaths, trimmedPathname)\n\n if (path) {\n return normalizePagePath(path.route.originalPath)\n }\n\n return null\n}\n\n/**\n * Return a matchpath params from reach/router rules\n * if `match-paths.json` contains `{ \":bar/*foo\" }`, and the path is /baz/zaz/zoo\n * then it returns\n * { bar: baz, foo: zaz/zoo }\n *\n * @param {string} rawPathname A raw pathname\n * @return {object}\n */\nexport const grabMatchParams = rawPathname => {\n const trimmedPathname = cleanPath(rawPathname)\n\n const pickPaths = matchPaths.map(({ path, matchPath }) => {\n return {\n path: matchPath,\n originalPath: path,\n }\n })\n\n const path = pick(pickPaths, trimmedPathname)\n\n if (path) {\n return path.params\n }\n\n return {}\n}\n\n// Given a raw URL path, returns the cleaned version of it (trim off\n// `#` and query params), or if it matches an entry in\n// `match-paths.json`, its matched path is returned\n//\n// E.g. `/foo?bar=far` => `/foo`\n//\n// Or if `match-paths.json` contains `{ \"/foo*\": \"/page1\", ...}`, then\n// `/foo?bar=far` => `/page1`\nexport const findPath = rawPathname => {\n const trimmedPathname = trimPathname(absolutify(rawPathname))\n if (pathCache.has(trimmedPathname)) {\n return pathCache.get(trimmedPathname)\n }\n\n let foundPath = findMatchPath(trimmedPathname)\n\n if (!foundPath) {\n foundPath = cleanPath(rawPathname)\n }\n\n pathCache.set(trimmedPathname, foundPath)\n\n return foundPath\n}\n\n/**\n * Clean a url and converts /index.html => /\n * E.g. `/foo?bar=far` => `/foo`\n *\n * @param {string} rawPathname A raw pathname\n * @return {string}\n */\nexport const cleanPath = rawPathname => {\n const trimmedPathname = trimPathname(absolutify(rawPathname))\n\n let foundPath = trimmedPathname\n if (foundPath === `/index.html`) {\n foundPath = `/`\n }\n\n foundPath = normalizePagePath(foundPath)\n\n return foundPath\n}\n","\"use strict\";\n\nexports.onRouteUpdate = function (_ref) {\n var location = _ref.location;\n\n if (process.env.NODE_ENV !== \"production\" || typeof gtag !== \"function\") {\n return null;\n }\n\n var pathIsExcluded = location && typeof window.excludeGtagPaths !== \"undefined\" && window.excludeGtagPaths.some(function (rx) {\n return rx.test(location.pathname);\n });\n if (pathIsExcluded) return null; // wrap inside a timeout to make sure react-helmet is done with its changes (https://github.com/gatsbyjs/gatsby/issues/11592)\n\n var sendPageView = function sendPageView() {\n var pagePath = location ? location.pathname + location.search + location.hash : undefined;\n window.gtag(\"event\", \"page_view\", {\n page_path: pagePath\n });\n };\n\n if (\"requestAnimationFrame\" in window) {\n requestAnimationFrame(function () {\n requestAnimationFrame(sendPageView);\n });\n } else {\n // simulate 2 rAF calls\n setTimeout(sendPageView, 32);\n }\n\n return null;\n};","var aCallable = require('../internals/a-callable');\nvar isNullOrUndefined = require('../internals/is-null-or-undefined');\n\n// `GetMethod` abstract operation\n// https://tc39.es/ecma262/#sec-getmethod\nmodule.exports = function (V, P) {\n var func = V[P];\n return isNullOrUndefined(func) ? undefined : aCallable(func);\n};\n","\"use strict\";\n\nexports.__esModule = true;\nexports.useScrollRestoration = useScrollRestoration;\n\nvar _scrollHandler = require(\"./scroll-handler\");\n\nvar _react = require(\"react\");\n\nvar _router = require(\"@reach/router\");\n\nfunction useScrollRestoration(identifier) {\n var location = (0, _router.useLocation)();\n var state = (0, _react.useContext)(_scrollHandler.ScrollContext);\n var ref = (0, _react.useRef)();\n (0, _react.useLayoutEffect)(function () {\n if (ref.current) {\n var position = state.read(location, identifier);\n ref.current.scrollTo(0, position || 0);\n }\n }, []);\n return {\n ref: ref,\n onScroll: function onScroll() {\n if (ref.current) {\n state.save(location, identifier, ref.current.scrollTop);\n }\n }\n };\n}","var NATIVE_BIND = require('../internals/function-bind-native');\n\nvar FunctionPrototype = Function.prototype;\nvar call = FunctionPrototype.call;\nvar uncurryThisWithBind = NATIVE_BIND && FunctionPrototype.bind.bind(call, call);\n\nmodule.exports = NATIVE_BIND ? uncurryThisWithBind : function (fn) {\n return function () {\n return call.apply(fn, arguments);\n };\n};\n","// \n// An event handler can take an optional event argument\n// and should not return a value\n \n \n\n// An array of all currently registered event handlers for a type\n \n \n// A map of event types and their corresponding event handlers.\n \n \n \n \n\n/** Mitt: Tiny (~200b) functional event emitter / pubsub.\n * @name mitt\n * @returns {Mitt}\n */\nfunction mitt(all ) {\n\tall = all || Object.create(null);\n\n\treturn {\n\t\t/**\n\t\t * Register an event handler for the given type.\n\t\t *\n\t\t * @param {String} type\tType of event to listen for, or `\"*\"` for all events\n\t\t * @param {Function} handler Function to call in response to given event\n\t\t * @memberOf mitt\n\t\t */\n\t\ton: function on(type , handler ) {\n\t\t\t(all[type] || (all[type] = [])).push(handler);\n\t\t},\n\n\t\t/**\n\t\t * Remove an event handler for the given type.\n\t\t *\n\t\t * @param {String} type\tType of event to unregister `handler` from, or `\"*\"`\n\t\t * @param {Function} handler Handler function to remove\n\t\t * @memberOf mitt\n\t\t */\n\t\toff: function off(type , handler ) {\n\t\t\tif (all[type]) {\n\t\t\t\tall[type].splice(all[type].indexOf(handler) >>> 0, 1);\n\t\t\t}\n\t\t},\n\n\t\t/**\n\t\t * Invoke all handlers for the given type.\n\t\t * If present, `\"*\"` handlers are invoked after type-matched handlers.\n\t\t *\n\t\t * @param {String} type The event type to invoke\n\t\t * @param {Any} [evt] Any value (object is recommended and powerful), passed to each handler\n\t\t * @memberOf mitt\n\t\t */\n\t\temit: function emit(type , evt ) {\n\t\t\t(all[type] || []).slice().map(function (handler) { handler(evt); });\n\t\t\t(all['*'] || []).slice().map(function (handler) { handler(type, evt); });\n\t\t}\n\t};\n}\n\nexport default mitt;\n//# sourceMappingURL=mitt.es.js.map\n","import mitt from \"mitt\"\n\nconst emitter = mitt()\nexport default emitter\n","var hasOwn = require('../internals/has-own-property');\nvar ownKeys = require('../internals/own-keys');\nvar getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor');\nvar definePropertyModule = require('../internals/object-define-property');\n\nmodule.exports = function (target, source, exceptions) {\n var keys = ownKeys(source);\n var defineProperty = definePropertyModule.f;\n var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n if (!hasOwn(target, key) && !(exceptions && hasOwn(exceptions, key))) {\n defineProperty(target, key, getOwnPropertyDescriptor(source, key));\n }\n }\n};\n","\"use strict\";\n\nexports.__esModule = true;\nexports.useScrollRestoration = exports.ScrollContainer = exports.ScrollContext = void 0;\n\nvar _scrollHandler = require(\"./scroll-handler\");\n\nexports.ScrollContext = _scrollHandler.ScrollHandler;\n\nvar _scrollContainer = require(\"./scroll-container\");\n\nexports.ScrollContainer = _scrollContainer.ScrollContainer;\n\nvar _useScrollRestoration = require(\"./use-scroll-restoration\");\n\nexports.useScrollRestoration = _useScrollRestoration.useScrollRestoration;","function _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n return target;\n}\nmodule.exports = _objectWithoutPropertiesLoose, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout() {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n})();\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch (e) {\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch (e) {\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e) {\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e) {\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n var len = queue.length;\n while (len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\nfunction noop() {}\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\nprocess.listeners = function (name) {\n return [];\n};\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\nprocess.cwd = function () {\n return '/';\n};\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function () {\n return 0;\n};","var shared = require('../internals/shared');\nvar uid = require('../internals/uid');\n\nvar keys = shared('keys');\n\nmodule.exports = function (key) {\n return keys[key] || (keys[key] = uid(key));\n};\n","exports.polyfill = Component => Component\n","var _extends = Object.assign || 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; };\n\nvar getLocation = function getLocation(source) {\n var _source$location = source.location,\n search = _source$location.search,\n hash = _source$location.hash,\n href = _source$location.href,\n origin = _source$location.origin,\n protocol = _source$location.protocol,\n host = _source$location.host,\n hostname = _source$location.hostname,\n port = _source$location.port;\n var pathname = source.location.pathname;\n\n\n if (!pathname && href && canUseDOM) {\n var url = new URL(href);\n pathname = url.pathname;\n }\n\n return {\n pathname: encodeURI(decodeURI(pathname)),\n search: search,\n hash: hash,\n href: href,\n origin: origin,\n protocol: protocol,\n host: host,\n hostname: hostname,\n port: port,\n state: source.history.state,\n key: source.history.state && source.history.state.key || \"initial\"\n };\n};\n\nvar createHistory = function createHistory(source, options) {\n var listeners = [];\n var location = getLocation(source);\n var transitioning = false;\n var resolveTransition = function resolveTransition() {};\n\n return {\n get location() {\n return location;\n },\n\n get transitioning() {\n return transitioning;\n },\n\n _onTransitionComplete: function _onTransitionComplete() {\n transitioning = false;\n resolveTransition();\n },\n listen: function listen(listener) {\n listeners.push(listener);\n\n var popstateListener = function popstateListener() {\n location = getLocation(source);\n listener({ location: location, action: \"POP\" });\n };\n\n source.addEventListener(\"popstate\", popstateListener);\n\n return function () {\n source.removeEventListener(\"popstate\", popstateListener);\n listeners = listeners.filter(function (fn) {\n return fn !== listener;\n });\n };\n },\n navigate: function navigate(to) {\n var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},\n state = _ref.state,\n _ref$replace = _ref.replace,\n replace = _ref$replace === undefined ? false : _ref$replace;\n\n if (typeof to === \"number\") {\n source.history.go(to);\n } else {\n state = _extends({}, state, { key: Date.now() + \"\" });\n // try...catch iOS Safari limits to 100 pushState calls\n try {\n if (transitioning || replace) {\n source.history.replaceState(state, null, to);\n } else {\n source.history.pushState(state, null, to);\n }\n } catch (e) {\n source.location[replace ? \"replace\" : \"assign\"](to);\n }\n }\n\n location = getLocation(source);\n transitioning = true;\n var transition = new Promise(function (res) {\n return resolveTransition = res;\n });\n listeners.forEach(function (listener) {\n return listener({ location: location, action: \"PUSH\" });\n });\n return transition;\n }\n };\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// Stores history entries in memory for testing or other platforms like Native\nvar createMemorySource = function createMemorySource() {\n var initialPath = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : \"/\";\n\n var searchIndex = initialPath.indexOf(\"?\");\n var initialLocation = {\n pathname: searchIndex > -1 ? initialPath.substr(0, searchIndex) : initialPath,\n search: searchIndex > -1 ? initialPath.substr(searchIndex) : \"\"\n };\n var index = 0;\n var stack = [initialLocation];\n var states = [null];\n\n return {\n get location() {\n return stack[index];\n },\n addEventListener: function addEventListener(name, fn) {},\n removeEventListener: function removeEventListener(name, fn) {},\n\n history: {\n get entries() {\n return stack;\n },\n get index() {\n return index;\n },\n get state() {\n return states[index];\n },\n pushState: function pushState(state, _, uri) {\n var _uri$split = uri.split(\"?\"),\n pathname = _uri$split[0],\n _uri$split$ = _uri$split[1],\n search = _uri$split$ === undefined ? \"\" : _uri$split$;\n\n index++;\n stack.push({ pathname: pathname, search: search.length ? \"?\" + search : search });\n states.push(state);\n },\n replaceState: function replaceState(state, _, uri) {\n var _uri$split2 = uri.split(\"?\"),\n pathname = _uri$split2[0],\n _uri$split2$ = _uri$split2[1],\n search = _uri$split2$ === undefined ? \"\" : _uri$split2$;\n\n stack[index] = { pathname: pathname, search: search };\n states[index] = state;\n },\n go: function go(to) {\n var newIndex = index + to;\n\n if (newIndex < 0 || newIndex > states.length - 1) {\n return;\n }\n\n index = newIndex;\n }\n }\n };\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// global history - uses window.history as the source if available, otherwise a\n// memory history\nvar canUseDOM = !!(typeof window !== \"undefined\" && window.document && window.document.createElement);\nvar getSource = function getSource() {\n return canUseDOM ? window : createMemorySource();\n};\n\nvar globalHistory = createHistory(getSource());\nvar navigate = globalHistory.navigate;\n\n////////////////////////////////////////////////////////////////////////////////\n\nexport { globalHistory, navigate, createHistory, createMemorySource };","var TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support');\nvar isCallable = require('../internals/is-callable');\nvar classofRaw = require('../internals/classof-raw');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar $Object = Object;\n\n// ES3 wrong here\nvar CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) == 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n try {\n return it[key];\n } catch (error) { /* empty */ }\n};\n\n// getting tag from ES6+ `Object.prototype.toString`\nmodule.exports = TO_STRING_TAG_SUPPORT ? classofRaw : function (it) {\n var O, tag, result;\n return it === undefined ? 'Undefined' : it === null ? 'Null'\n // @@toStringTag case\n : typeof (tag = tryGet(O = $Object(it), TO_STRING_TAG)) == 'string' ? tag\n // builtinTag case\n : CORRECT_ARGUMENTS ? classofRaw(O)\n // ES3 arguments fallback\n : (result = classofRaw(O)) == 'Object' && isCallable(O.callee) ? 'Arguments' : result;\n};\n","\"use strict\";\n\nexports.__esModule = true;\nexports.default = void 0;\n\n/**\n * Get a manifest filename depending on localized pathname\n *\n * @param {string} pathname\n * @param {Array<{start_url: string, lang: string}>} localizedManifests\n * @return string\n */\nvar _default = function _default(pathname, localizedManifests) {\n var defaultFilename = \"manifest.webmanifest\";\n\n if (!Array.isArray(localizedManifests)) {\n return defaultFilename;\n }\n\n var localizedManifest = localizedManifests.find(function (app) {\n return pathname.startsWith(app.start_url);\n });\n\n if (!localizedManifest) {\n return defaultFilename;\n }\n\n return \"manifest_\" + localizedManifest.lang + \".webmanifest\";\n};\n\nexports.default = _default;","var wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar test = {};\n\ntest[TO_STRING_TAG] = 'z';\n\nmodule.exports = String(test) === '[object z]';\n","var toLength = require('../internals/to-length');\n\n// `LengthOfArrayLike` abstract operation\n// https://tc39.es/ecma262/#sec-lengthofarraylike\nmodule.exports = function (obj) {\n return toLength(obj.length);\n};\n","var userAgent = require('../internals/engine-user-agent');\n\nvar firefox = userAgent.match(/firefox\\/(\\d+)/i);\n\nmodule.exports = !!firefox && +firefox[1];\n","/* eslint-disable es/no-symbol -- required for testing */\nvar V8_VERSION = require('../internals/engine-v8-version');\nvar fails = require('../internals/fails');\nvar global = require('../internals/global');\n\nvar $String = global.String;\n\n// eslint-disable-next-line es/no-object-getownpropertysymbols -- required for testing\nmodule.exports = !!Object.getOwnPropertySymbols && !fails(function () {\n var symbol = Symbol();\n // Chrome 38 Symbol has incorrect toString conversion\n // `get-own-property-symbols` polyfill symbols converted to object are not Symbol instances\n // nb: Do not call `String` directly to avoid this being optimized out to `symbol+''` which will,\n // of course, fail.\n return !$String(symbol) || !(Object(symbol) instanceof Symbol) ||\n // Chrome 38-40 symbols are not inherited from DOM collections prototypes to instances\n !Symbol.sham && V8_VERSION && V8_VERSION < 41;\n});\n","var DESCRIPTORS = require('../internals/descriptors');\nvar call = require('../internals/function-call');\nvar propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar toPropertyKey = require('../internals/to-property-key');\nvar hasOwn = require('../internals/has-own-property');\nvar IE8_DOM_DEFINE = require('../internals/ie8-dom-define');\n\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// `Object.getOwnPropertyDescriptor` method\n// https://tc39.es/ecma262/#sec-object.getownpropertydescriptor\nexports.f = DESCRIPTORS ? $getOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) {\n O = toIndexedObject(O);\n P = toPropertyKey(P);\n if (IE8_DOM_DEFINE) try {\n return $getOwnPropertyDescriptor(O, P);\n } catch (error) { /* empty */ }\n if (hasOwn(O, P)) return createPropertyDescriptor(!call(propertyIsEnumerableModule.f, O, P), O[P]);\n};\n","'use strict';\nvar tryToString = require('../internals/try-to-string');\n\nvar $TypeError = TypeError;\n\nmodule.exports = function (O, P) {\n if (!delete O[P]) throw $TypeError('Cannot delete property ' + tryToString(P) + ' of ' + tryToString(O));\n};\n","import \"core-js/modules/es.array.reduce.js\";\n/*! medium-zoom 1.0.8 | MIT License | https://github.com/francoischalifour/medium-zoom */\nvar _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n};\nvar isSupported = function isSupported(node) {\n return node.tagName === 'IMG';\n};\n\n/* eslint-disable-next-line no-prototype-builtins */\nvar isNodeList = function isNodeList(selector) {\n return NodeList.prototype.isPrototypeOf(selector);\n};\nvar isNode = function isNode(selector) {\n return selector && selector.nodeType === 1;\n};\nvar isSvg = function isSvg(image) {\n var source = image.currentSrc || image.src;\n return source.substr(-4).toLowerCase() === '.svg';\n};\nvar getImagesFromSelector = function getImagesFromSelector(selector) {\n try {\n if (Array.isArray(selector)) {\n return selector.filter(isSupported);\n }\n if (isNodeList(selector)) {\n // Do not use spread operator or Array.from() for IE support\n return [].slice.call(selector).filter(isSupported);\n }\n if (isNode(selector)) {\n return [selector].filter(isSupported);\n }\n if (typeof selector === 'string') {\n // Do not use spread operator or Array.from() for IE support\n return [].slice.call(document.querySelectorAll(selector)).filter(isSupported);\n }\n return [];\n } catch (err) {\n throw new TypeError('The provided selector is invalid.\\n' + 'Expects a CSS selector, a Node element, a NodeList or an array.\\n' + 'See: https://github.com/francoischalifour/medium-zoom');\n }\n};\nvar createOverlay = function createOverlay(background) {\n var overlay = document.createElement('div');\n overlay.classList.add('medium-zoom-overlay');\n overlay.style.background = background;\n return overlay;\n};\nvar cloneTarget = function cloneTarget(template) {\n var _template$getBounding = template.getBoundingClientRect(),\n top = _template$getBounding.top,\n left = _template$getBounding.left,\n width = _template$getBounding.width,\n height = _template$getBounding.height;\n var clone = template.cloneNode();\n var scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0;\n var scrollLeft = window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft || 0;\n clone.removeAttribute('id');\n clone.style.position = 'absolute';\n clone.style.top = top + scrollTop + 'px';\n clone.style.left = left + scrollLeft + 'px';\n clone.style.width = width + 'px';\n clone.style.height = height + 'px';\n clone.style.transform = '';\n return clone;\n};\nvar createCustomEvent = function createCustomEvent(type, params) {\n var eventParams = _extends({\n bubbles: false,\n cancelable: false,\n detail: undefined\n }, params);\n if (typeof window.CustomEvent === 'function') {\n return new CustomEvent(type, eventParams);\n }\n var customEvent = document.createEvent('CustomEvent');\n customEvent.initCustomEvent(type, eventParams.bubbles, eventParams.cancelable, eventParams.detail);\n return customEvent;\n};\nvar mediumZoom = function mediumZoom(selector) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n /**\n * Ensure the compatibility with IE11 if no Promise polyfill are used.\n */\n var Promise = window.Promise || function Promise(fn) {\n function noop() {}\n fn(noop, noop);\n };\n var _handleClick = function _handleClick(event) {\n var target = event.target;\n if (target === overlay) {\n close();\n return;\n }\n if (images.indexOf(target) === -1) {\n return;\n }\n toggle({\n target: target\n });\n };\n var _handleScroll = function _handleScroll() {\n if (isAnimating || !active.original) {\n return;\n }\n var currentScroll = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0;\n if (Math.abs(scrollTop - currentScroll) > zoomOptions.scrollOffset) {\n setTimeout(close, 150);\n }\n };\n var _handleKeyUp = function _handleKeyUp(event) {\n var key = event.key || event.keyCode;\n\n // Close if escape key is pressed\n if (key === 'Escape' || key === 'Esc' || key === 27) {\n close();\n }\n };\n var update = function update() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var newOptions = options;\n if (options.background) {\n overlay.style.background = options.background;\n }\n if (options.container && options.container instanceof Object) {\n newOptions.container = _extends({}, zoomOptions.container, options.container);\n }\n if (options.template) {\n var template = isNode(options.template) ? options.template : document.querySelector(options.template);\n newOptions.template = template;\n }\n zoomOptions = _extends({}, zoomOptions, newOptions);\n images.forEach(function (image) {\n image.dispatchEvent(createCustomEvent('medium-zoom:update', {\n detail: {\n zoom: zoom\n }\n }));\n });\n return zoom;\n };\n var clone = function clone() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n return mediumZoom(_extends({}, zoomOptions, options));\n };\n var attach = function attach() {\n for (var _len = arguments.length, selectors = Array(_len), _key = 0; _key < _len; _key++) {\n selectors[_key] = arguments[_key];\n }\n var newImages = selectors.reduce(function (imagesAccumulator, currentSelector) {\n return [].concat(imagesAccumulator, getImagesFromSelector(currentSelector));\n }, []);\n newImages.filter(function (newImage) {\n return images.indexOf(newImage) === -1;\n }).forEach(function (newImage) {\n images.push(newImage);\n newImage.classList.add('medium-zoom-image');\n });\n eventListeners.forEach(function (_ref) {\n var type = _ref.type,\n listener = _ref.listener,\n options = _ref.options;\n newImages.forEach(function (image) {\n image.addEventListener(type, listener, options);\n });\n });\n return zoom;\n };\n var detach = function detach() {\n for (var _len2 = arguments.length, selectors = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n selectors[_key2] = arguments[_key2];\n }\n if (active.zoomed) {\n close();\n }\n var imagesToDetach = selectors.length > 0 ? selectors.reduce(function (imagesAccumulator, currentSelector) {\n return [].concat(imagesAccumulator, getImagesFromSelector(currentSelector));\n }, []) : images;\n imagesToDetach.forEach(function (image) {\n image.classList.remove('medium-zoom-image');\n image.dispatchEvent(createCustomEvent('medium-zoom:detach', {\n detail: {\n zoom: zoom\n }\n }));\n });\n images = images.filter(function (image) {\n return imagesToDetach.indexOf(image) === -1;\n });\n return zoom;\n };\n var on = function on(type, listener) {\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n images.forEach(function (image) {\n image.addEventListener('medium-zoom:' + type, listener, options);\n });\n eventListeners.push({\n type: 'medium-zoom:' + type,\n listener: listener,\n options: options\n });\n return zoom;\n };\n var off = function off(type, listener) {\n var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};\n images.forEach(function (image) {\n image.removeEventListener('medium-zoom:' + type, listener, options);\n });\n eventListeners = eventListeners.filter(function (eventListener) {\n return !(eventListener.type === 'medium-zoom:' + type && eventListener.listener.toString() === listener.toString());\n });\n return zoom;\n };\n var open = function open() {\n var _ref2 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n target = _ref2.target;\n var _animate = function _animate() {\n var container = {\n width: document.documentElement.clientWidth,\n height: document.documentElement.clientHeight,\n left: 0,\n top: 0,\n right: 0,\n bottom: 0\n };\n var viewportWidth = void 0;\n var viewportHeight = void 0;\n if (zoomOptions.container) {\n if (zoomOptions.container instanceof Object) {\n // The container is given as an object with properties like width, height, left, top\n container = _extends({}, container, zoomOptions.container);\n\n // We need to adjust custom options like container.right or container.bottom\n viewportWidth = container.width - container.left - container.right - zoomOptions.margin * 2;\n viewportHeight = container.height - container.top - container.bottom - zoomOptions.margin * 2;\n } else {\n // The container is given as an element\n var zoomContainer = isNode(zoomOptions.container) ? zoomOptions.container : document.querySelector(zoomOptions.container);\n var _zoomContainer$getBou = zoomContainer.getBoundingClientRect(),\n _width = _zoomContainer$getBou.width,\n _height = _zoomContainer$getBou.height,\n _left = _zoomContainer$getBou.left,\n _top = _zoomContainer$getBou.top;\n container = _extends({}, container, {\n width: _width,\n height: _height,\n left: _left,\n top: _top\n });\n }\n }\n viewportWidth = viewportWidth || container.width - zoomOptions.margin * 2;\n viewportHeight = viewportHeight || container.height - zoomOptions.margin * 2;\n var zoomTarget = active.zoomedHd || active.original;\n var naturalWidth = isSvg(zoomTarget) ? viewportWidth : zoomTarget.naturalWidth || viewportWidth;\n var naturalHeight = isSvg(zoomTarget) ? viewportHeight : zoomTarget.naturalHeight || viewportHeight;\n var _zoomTarget$getBoundi = zoomTarget.getBoundingClientRect(),\n top = _zoomTarget$getBoundi.top,\n left = _zoomTarget$getBoundi.left,\n width = _zoomTarget$getBoundi.width,\n height = _zoomTarget$getBoundi.height;\n var scaleX = Math.min(Math.max(width, naturalWidth), viewportWidth) / width;\n var scaleY = Math.min(Math.max(height, naturalHeight), viewportHeight) / height;\n var scale = Math.min(scaleX, scaleY);\n var translateX = (-left + (viewportWidth - width) / 2 + zoomOptions.margin + container.left) / scale;\n var translateY = (-top + (viewportHeight - height) / 2 + zoomOptions.margin + container.top) / scale;\n var transform = 'scale(' + scale + ') translate3d(' + translateX + 'px, ' + translateY + 'px, 0)';\n active.zoomed.style.transform = transform;\n if (active.zoomedHd) {\n active.zoomedHd.style.transform = transform;\n }\n };\n return new Promise(function (resolve) {\n if (target && images.indexOf(target) === -1) {\n resolve(zoom);\n return;\n }\n var _handleOpenEnd = function _handleOpenEnd() {\n isAnimating = false;\n active.zoomed.removeEventListener('transitionend', _handleOpenEnd);\n active.original.dispatchEvent(createCustomEvent('medium-zoom:opened', {\n detail: {\n zoom: zoom\n }\n }));\n resolve(zoom);\n };\n if (active.zoomed) {\n resolve(zoom);\n return;\n }\n if (target) {\n // The zoom was triggered manually via a click\n active.original = target;\n } else if (images.length > 0) {\n var _images = images;\n active.original = _images[0];\n } else {\n resolve(zoom);\n return;\n }\n active.original.dispatchEvent(createCustomEvent('medium-zoom:open', {\n detail: {\n zoom: zoom\n }\n }));\n scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0;\n isAnimating = true;\n active.zoomed = cloneTarget(active.original);\n document.body.appendChild(overlay);\n if (zoomOptions.template) {\n var template = isNode(zoomOptions.template) ? zoomOptions.template : document.querySelector(zoomOptions.template);\n active.template = document.createElement('div');\n active.template.appendChild(template.content.cloneNode(true));\n document.body.appendChild(active.template);\n }\n\n // If the selected tag is inside a tag, set the\n // currently-applied source as the cloned `src=` attribute.\n // (as these might differ, or src= might be unset in some cases)\n if (active.original.parentElement && active.original.parentElement.tagName === 'PICTURE' && active.original.currentSrc) {\n active.zoomed.src = active.original.currentSrc;\n }\n document.body.appendChild(active.zoomed);\n window.requestAnimationFrame(function () {\n document.body.classList.add('medium-zoom--opened');\n });\n active.original.classList.add('medium-zoom-image--hidden');\n active.zoomed.classList.add('medium-zoom-image--opened');\n active.zoomed.addEventListener('click', close);\n active.zoomed.addEventListener('transitionend', _handleOpenEnd);\n if (active.original.getAttribute('data-zoom-src')) {\n active.zoomedHd = active.zoomed.cloneNode();\n\n // Reset the `scrset` property or the HD image won't load.\n active.zoomedHd.removeAttribute('srcset');\n active.zoomedHd.removeAttribute('sizes');\n // Remove loading attribute so the browser can load the image normally\n active.zoomedHd.removeAttribute('loading');\n active.zoomedHd.src = active.zoomed.getAttribute('data-zoom-src');\n active.zoomedHd.onerror = function () {\n clearInterval(getZoomTargetSize);\n console.warn('Unable to reach the zoom image target ' + active.zoomedHd.src);\n active.zoomedHd = null;\n _animate();\n };\n\n // We need to access the natural size of the full HD\n // target as fast as possible to compute the animation.\n var getZoomTargetSize = setInterval(function () {\n if (active.zoomedHd.complete) {\n clearInterval(getZoomTargetSize);\n active.zoomedHd.classList.add('medium-zoom-image--opened');\n active.zoomedHd.addEventListener('click', close);\n document.body.appendChild(active.zoomedHd);\n _animate();\n }\n }, 10);\n } else if (active.original.hasAttribute('srcset')) {\n // If an image has a `srcset` attribuet, we don't know the dimensions of the\n // zoomed (HD) image (like when `data-zoom-src` is specified).\n // Therefore the approach is quite similar.\n active.zoomedHd = active.zoomed.cloneNode();\n\n // Resetting the sizes attribute tells the browser to load the\n // image best fitting the current viewport size, respecting the `srcset`.\n active.zoomedHd.removeAttribute('sizes');\n\n // In Firefox, the `loading` attribute needs to be set to `eager` (default\n // value) for the load event to be fired.\n active.zoomedHd.removeAttribute('loading');\n\n // Wait for the load event of the hd image. This will fire if the image\n // is already cached.\n var loadEventListener = active.zoomedHd.addEventListener('load', function () {\n active.zoomedHd.removeEventListener('load', loadEventListener);\n active.zoomedHd.classList.add('medium-zoom-image--opened');\n active.zoomedHd.addEventListener('click', close);\n document.body.appendChild(active.zoomedHd);\n _animate();\n });\n } else {\n _animate();\n }\n });\n };\n var close = function close() {\n return new Promise(function (resolve) {\n if (isAnimating || !active.original) {\n resolve(zoom);\n return;\n }\n var _handleCloseEnd = function _handleCloseEnd() {\n active.original.classList.remove('medium-zoom-image--hidden');\n document.body.removeChild(active.zoomed);\n if (active.zoomedHd) {\n document.body.removeChild(active.zoomedHd);\n }\n document.body.removeChild(overlay);\n active.zoomed.classList.remove('medium-zoom-image--opened');\n if (active.template) {\n document.body.removeChild(active.template);\n }\n isAnimating = false;\n active.zoomed.removeEventListener('transitionend', _handleCloseEnd);\n active.original.dispatchEvent(createCustomEvent('medium-zoom:closed', {\n detail: {\n zoom: zoom\n }\n }));\n active.original = null;\n active.zoomed = null;\n active.zoomedHd = null;\n active.template = null;\n resolve(zoom);\n };\n isAnimating = true;\n document.body.classList.remove('medium-zoom--opened');\n active.zoomed.style.transform = '';\n if (active.zoomedHd) {\n active.zoomedHd.style.transform = '';\n }\n\n // Fade out the template so it's not too abrupt\n if (active.template) {\n active.template.style.transition = 'opacity 150ms';\n active.template.style.opacity = 0;\n }\n active.original.dispatchEvent(createCustomEvent('medium-zoom:close', {\n detail: {\n zoom: zoom\n }\n }));\n active.zoomed.addEventListener('transitionend', _handleCloseEnd);\n });\n };\n var toggle = function toggle() {\n var _ref3 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {},\n target = _ref3.target;\n if (active.original) {\n return close();\n }\n return open({\n target: target\n });\n };\n var getOptions = function getOptions() {\n return zoomOptions;\n };\n var getImages = function getImages() {\n return images;\n };\n var getZoomedImage = function getZoomedImage() {\n return active.original;\n };\n var images = [];\n var eventListeners = [];\n var isAnimating = false;\n var scrollTop = 0;\n var zoomOptions = options;\n var active = {\n original: null,\n zoomed: null,\n zoomedHd: null,\n template: null\n\n // If the selector is omitted, it's replaced by the options\n };\n if (Object.prototype.toString.call(selector) === '[object Object]') {\n zoomOptions = selector;\n } else if (selector || typeof selector === 'string' // to process empty string as a selector\n ) {\n attach(selector);\n }\n\n // Apply the default option values\n zoomOptions = _extends({\n margin: 0,\n background: '#fff',\n scrollOffset: 40,\n container: null,\n template: null\n }, zoomOptions);\n var overlay = createOverlay(zoomOptions.background);\n document.addEventListener('click', _handleClick);\n document.addEventListener('keyup', _handleKeyUp);\n document.addEventListener('scroll', _handleScroll);\n window.addEventListener('resize', close);\n var zoom = {\n open: open,\n close: close,\n toggle: toggle,\n update: update,\n clone: clone,\n attach: attach,\n detach: detach,\n on: on,\n off: off,\n getOptions: getOptions,\n getImages: getImages,\n getZoomedImage: getZoomedImage\n };\n return zoom;\n};\nfunction styleInject(css, ref) {\n if (ref === void 0) ref = {};\n var insertAt = ref.insertAt;\n if (!css || typeof document === 'undefined') {\n return;\n }\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n if (insertAt === 'top') {\n if (head.firstChild) {\n head.insertBefore(style, head.firstChild);\n } else {\n head.appendChild(style);\n }\n } else {\n head.appendChild(style);\n }\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\nvar css = \".medium-zoom-overlay{position:fixed;top:0;right:0;bottom:0;left:0;opacity:0;transition:opacity .3s;will-change:opacity}.medium-zoom--opened .medium-zoom-overlay{cursor:pointer;cursor:zoom-out;opacity:1}.medium-zoom-image{cursor:pointer;cursor:zoom-in;transition:transform .3s cubic-bezier(.2,0,.2,1)!important}.medium-zoom-image--hidden{visibility:hidden}.medium-zoom-image--opened{position:relative;cursor:pointer;cursor:zoom-out;will-change:transform}\";\nstyleInject(css);\nexport default mediumZoom;","import mediumZoom from 'medium-zoom'\nimport '@fastly/performance-observer-polyfill/polyfill'\n\n// @see https://github.com/francoischalifour/medium-zoom#options\nconst defaultOptions = {\n margin: 24,\n background: '#fff',\n scrollOffset: 40,\n container: null,\n template: null,\n zIndex: 999,\n excludedSelector: null\n}\n\n// @see https://github.com/gatsbyjs/gatsby/blob/master/packages/gatsby-remark-images/src/constants.js#L1\nconst imageClass = '.gatsby-resp-image-image'\n\nconst FIRST_CONTENTFUL_PAINT = 'first-contentful-paint'\nconst ZOOM_STYLE_ID = 'medium-zoom-styles'\nconst TRANSITION_EFFECT = 'opacity 0.5s, transform .3s cubic-bezier(.2,0,.2,1)'\n\nfunction onFCP(callback) {\n // @see https://developers.google.com/web/updates/2016/06/performance-observer\n if (!window.performance || !window.PerformanceObserver) {\n return\n }\n\n const po = new PerformanceObserver(list =>\n list\n .getEntries()\n .filter(({ entryType }) => entryType === 'paint')\n .map(({ name }) => name === FIRST_CONTENTFUL_PAINT)\n .forEach(callback)\n )\n\n try {\n po.observe({ entryTypes: ['measure', 'paint'] })\n } catch (e) {\n console.error(e)\n po.disconnect()\n }\n}\n\nfunction injectStyles(options) {\n const styleTag = document.querySelector(`#${ZOOM_STYLE_ID}`)\n if (styleTag) {\n return\n }\n\n const { zIndex } = options\n const node = document.createElement('style')\n const styles = `\n .medium-zoom--opened > .medium-zoom-overlay,\n .medium-zoom--opened > .medium-zoom-image,\n\t img.medium-zoom-image--opened {\n z-index: ${zIndex}\n }\n `\n node.id = ZOOM_STYLE_ID\n node.innerHTML = styles\n document.head.appendChild(node)\n}\n\nfunction applyZoomEffect({ excludedSelector, includedSelector, ...options }) {\n const imagesSelector = excludedSelector\n ? `${imageClass}:not(${excludedSelector})`\n : imageClass\n\n let imageElements = Array.from(document.querySelectorAll(imagesSelector))\n if (includedSelector) {\n const includedEls = Array.from(document.querySelectorAll(includedSelector))\n imageElements = imageElements.concat(includedEls)\n }\n const images = imageElements\n .filter(el => !el.classList.contains('medium-zoom-image'))\n .map(el => {\n function onImageLoad() {\n const originalTransition = el.style.transition\n el.style.transition = `${originalTransition}, ${TRANSITION_EFFECT}`\n el.removeEventListener('load', onImageLoad)\n }\n el.addEventListener('load', onImageLoad)\n el.setAttribute('tabIndex', 0)\n el.addEventListener('keydown', e => {\n if (e.key === ' ' || e.key === 'Enter') {\n e.preventDefault()\n el.click()\n }\n })\n return el\n })\n\n if (images.length > 0) {\n mediumZoom(images, options)\n }\n}\n\nexport const onRouteUpdate = (_, pluginOptions) => {\n const options = { ...defaultOptions, ...pluginOptions }\n injectStyles(options)\n\n onFCP(() => applyZoomEffect(options))\n applyZoomEffect(options)\n}\n","export default function _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n return target;\n}","var DESCRIPTORS = require('../internals/descriptors');\nvar fails = require('../internals/fails');\nvar createElement = require('../internals/document-create-element');\n\n// Thanks to IE8 for its funny defineProperty\nmodule.exports = !DESCRIPTORS && !fails(function () {\n // eslint-disable-next-line es/no-object-defineproperty -- required for testing\n return Object.defineProperty(createElement('div'), 'a', {\n get: function () { return 7; }\n }).a != 7;\n});\n","var $String = String;\n\nmodule.exports = function (argument) {\n try {\n return $String(argument);\n } catch (error) {\n return 'Object';\n }\n};\n","var uncurryThis = require('../internals/function-uncurry-this');\nvar fails = require('../internals/fails');\nvar isCallable = require('../internals/is-callable');\nvar hasOwn = require('../internals/has-own-property');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar CONFIGURABLE_FUNCTION_NAME = require('../internals/function-name').CONFIGURABLE;\nvar inspectSource = require('../internals/inspect-source');\nvar InternalStateModule = require('../internals/internal-state');\n\nvar enforceInternalState = InternalStateModule.enforce;\nvar getInternalState = InternalStateModule.get;\nvar $String = String;\n// eslint-disable-next-line es/no-object-defineproperty -- safe\nvar defineProperty = Object.defineProperty;\nvar stringSlice = uncurryThis(''.slice);\nvar replace = uncurryThis(''.replace);\nvar join = uncurryThis([].join);\n\nvar CONFIGURABLE_LENGTH = DESCRIPTORS && !fails(function () {\n return defineProperty(function () { /* empty */ }, 'length', { value: 8 }).length !== 8;\n});\n\nvar TEMPLATE = String(String).split('String');\n\nvar makeBuiltIn = module.exports = function (value, name, options) {\n if (stringSlice($String(name), 0, 7) === 'Symbol(') {\n name = '[' + replace($String(name), /^Symbol\\(([^)]*)\\)/, '$1') + ']';\n }\n if (options && options.getter) name = 'get ' + name;\n if (options && options.setter) name = 'set ' + name;\n if (!hasOwn(value, 'name') || (CONFIGURABLE_FUNCTION_NAME && value.name !== name)) {\n if (DESCRIPTORS) defineProperty(value, 'name', { value: name, configurable: true });\n else value.name = name;\n }\n if (CONFIGURABLE_LENGTH && options && hasOwn(options, 'arity') && value.length !== options.arity) {\n defineProperty(value, 'length', { value: options.arity });\n }\n try {\n if (options && hasOwn(options, 'constructor') && options.constructor) {\n if (DESCRIPTORS) defineProperty(value, 'prototype', { writable: false });\n // in V8 ~ Chrome 53, prototypes of some methods, like `Array.prototype.values`, are non-writable\n } else if (value.prototype) value.prototype = undefined;\n } catch (error) { /* empty */ }\n var state = enforceInternalState(value);\n if (!hasOwn(state, 'source')) {\n state.source = join(TEMPLATE, typeof name == 'string' ? name : '');\n } return value;\n};\n\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n// eslint-disable-next-line no-extend-native -- required\nFunction.prototype.toString = makeBuiltIn(function toString() {\n return isCallable(this) && getInternalState(this).source || inspectSource(this);\n}, 'toString');\n","'use strict';\nvar $ = require('../internals/export');\nvar $reduce = require('../internals/array-reduce').left;\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar CHROME_VERSION = require('../internals/engine-v8-version');\nvar IS_NODE = require('../internals/engine-is-node');\n\n// Chrome 80-82 has a critical bug\n// https://bugs.chromium.org/p/chromium/issues/detail?id=1049982\nvar CHROME_BUG = !IS_NODE && CHROME_VERSION > 79 && CHROME_VERSION < 83;\nvar FORCED = CHROME_BUG || !arrayMethodIsStrict('reduce');\n\n// `Array.prototype.reduce` method\n// https://tc39.es/ecma262/#sec-array.prototype.reduce\n$({ target: 'Array', proto: true, forced: FORCED }, {\n reduce: function reduce(callbackfn /* , initialValue */) {\n var length = arguments.length;\n return $reduce(this, callbackfn, length, length > 1 ? arguments[1] : undefined);\n }\n});\n","\"use strict\";\n\nvar _interopRequireWildcard = require(\"@babel/runtime/helpers/interopRequireWildcard\");\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nexports.__esModule = true;\nexports.ScrollHandler = exports.ScrollContext = void 0;\n\nvar _assertThisInitialized2 = _interopRequireDefault(require(\"@babel/runtime/helpers/assertThisInitialized\"));\n\nvar _inheritsLoose2 = _interopRequireDefault(require(\"@babel/runtime/helpers/inheritsLoose\"));\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _sessionStorage = require(\"./session-storage\");\n\nvar ScrollContext = /*#__PURE__*/React.createContext(new _sessionStorage.SessionStorage());\nexports.ScrollContext = ScrollContext;\nScrollContext.displayName = \"GatsbyScrollContext\";\n\nvar ScrollHandler = /*#__PURE__*/function (_React$Component) {\n (0, _inheritsLoose2.default)(ScrollHandler, _React$Component);\n\n function ScrollHandler() {\n var _this;\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n _this = _React$Component.call.apply(_React$Component, [this].concat(args)) || this;\n _this._stateStorage = new _sessionStorage.SessionStorage();\n\n _this.scrollListener = function () {\n var key = _this.props.location.key;\n\n if (key) {\n _this._stateStorage.save(_this.props.location, key, window.scrollY);\n }\n };\n\n _this.windowScroll = function (position, prevProps) {\n if (_this.shouldUpdateScroll(prevProps, _this.props)) {\n window.scrollTo(0, position);\n }\n };\n\n _this.scrollToHash = function (hash, prevProps) {\n var node = document.getElementById(hash.substring(1));\n\n if (node && _this.shouldUpdateScroll(prevProps, _this.props)) {\n node.scrollIntoView();\n }\n };\n\n _this.shouldUpdateScroll = function (prevRouterProps, routerProps) {\n var shouldUpdateScroll = _this.props.shouldUpdateScroll;\n\n if (!shouldUpdateScroll) {\n return true;\n } // Hack to allow accessing this._stateStorage.\n\n\n return shouldUpdateScroll.call((0, _assertThisInitialized2.default)(_this), prevRouterProps, routerProps);\n };\n\n return _this;\n }\n\n var _proto = ScrollHandler.prototype;\n\n _proto.componentDidMount = function componentDidMount() {\n window.addEventListener(\"scroll\", this.scrollListener);\n var scrollPosition;\n var _this$props$location = this.props.location,\n key = _this$props$location.key,\n hash = _this$props$location.hash;\n\n if (key) {\n scrollPosition = this._stateStorage.read(this.props.location, key);\n }\n\n if (scrollPosition) {\n this.windowScroll(scrollPosition, undefined);\n } else if (hash) {\n this.scrollToHash(decodeURI(hash), undefined);\n }\n };\n\n _proto.componentWillUnmount = function componentWillUnmount() {\n window.removeEventListener(\"scroll\", this.scrollListener);\n };\n\n _proto.componentDidUpdate = function componentDidUpdate(prevProps) {\n var _this$props$location2 = this.props.location,\n hash = _this$props$location2.hash,\n key = _this$props$location2.key;\n var scrollPosition;\n\n if (key) {\n scrollPosition = this._stateStorage.read(this.props.location, key);\n }\n /** There are two pieces of state: the browser url and\n * history state which keeps track of scroll position\n * Native behaviour prescribes that we ought to restore scroll position\n * when a user navigates back in their browser (this is the `POP` action)\n * Currently, reach router has a bug that prevents this at https://github.com/reach/router/issues/228\n * So we _always_ stick to the url as a source of truth — if the url\n * contains a hash, we scroll to it\n */\n\n\n if (hash) {\n this.scrollToHash(decodeURI(hash), prevProps);\n } else {\n this.windowScroll(scrollPosition, prevProps);\n }\n };\n\n _proto.render = function render() {\n return /*#__PURE__*/React.createElement(ScrollContext.Provider, {\n value: this._stateStorage\n }, this.props.children);\n };\n\n return ScrollHandler;\n}(React.Component);\n\nexports.ScrollHandler = ScrollHandler;\nScrollHandler.propTypes = {\n shouldUpdateScroll: _propTypes.default.func,\n children: _propTypes.default.element.isRequired,\n location: _propTypes.default.object.isRequired\n};","var $documentAll = require('../internals/document-all');\n\nvar documentAll = $documentAll.all;\n\n// `IsCallable` abstract operation\n// https://tc39.es/ecma262/#sec-iscallable\nmodule.exports = $documentAll.IS_HTMLDDA ? function (argument) {\n return typeof argument == 'function' || argument === documentAll;\n} : function (argument) {\n return typeof argument == 'function';\n};\n","// custom typefaces\nrequire('typeface-noto-sans-kr')\nrequire('typeface-catamaran')\n\n// polyfill\nrequire('intersection-observer')\n\nconst metaConfig = require('./gatsby-meta-config')\n\nexports.onInitialClientRender = () => {\n if (metaConfig.share.facebookAppId) {\n window.fbAsyncInit = function() {\n FB.init({\n appId: metaConfig.share.facebookAppId,\n xfbml: true,\n version: 'v3.2',\n })\n FB.AppEvents.logPageView()\n }\n ;(function(d, s, id) {\n var js,\n fjs = d.getElementsByTagName(s)[0]\n if (d.getElementById(id)) {\n return\n }\n js = d.createElement(s)\n js.id = id\n js.src = 'https://connect.facebook.net/en_US/sdk.js'\n fjs.parentNode.insertBefore(js, fjs)\n })(document, 'script', 'facebook-jssdk')\n }\n}\n","var uncurryThis = require('../internals/function-uncurry-this');\nvar toObject = require('../internals/to-object');\n\nvar hasOwnProperty = uncurryThis({}.hasOwnProperty);\n\n// `HasOwnProperty` abstract operation\n// https://tc39.es/ecma262/#sec-hasownproperty\n// eslint-disable-next-line es/no-object-hasown -- safe\nmodule.exports = Object.hasOwn || function hasOwn(it, key) {\n return hasOwnProperty(toObject(it), key);\n};\n","var isNullOrUndefined = require('../internals/is-null-or-undefined');\n\nvar $TypeError = TypeError;\n\n// `RequireObjectCoercible` abstract operation\n// https://tc39.es/ecma262/#sec-requireobjectcoercible\nmodule.exports = function (it) {\n if (isNullOrUndefined(it)) throw $TypeError(\"Can't call method on \" + it);\n return it;\n};\n","var global = require('../internals/global');\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar defineBuiltIn = require('../internals/define-built-in');\nvar defineGlobalProperty = require('../internals/define-global-property');\nvar copyConstructorProperties = require('../internals/copy-constructor-properties');\nvar isForced = require('../internals/is-forced');\n\n/*\n options.target - name of the target object\n options.global - target is the global object\n options.stat - export as static methods of target\n options.proto - export as prototype methods of target\n options.real - real prototype method for the `pure` version\n options.forced - export even if the native feature is available\n options.bind - bind methods to the target, required for the `pure` version\n options.wrap - wrap constructors to preventing global pollution, required for the `pure` version\n options.unsafe - use the simple assignment of property instead of delete + defineProperty\n options.sham - add a flag to not completely full polyfills\n options.enumerable - export as enumerable property\n options.dontCallGetSet - prevent calling a getter on target\n options.name - the .name of the function if it does not match the key\n*/\nmodule.exports = function (options, source) {\n var TARGET = options.target;\n var GLOBAL = options.global;\n var STATIC = options.stat;\n var FORCED, target, key, targetProperty, sourceProperty, descriptor;\n if (GLOBAL) {\n target = global;\n } else if (STATIC) {\n target = global[TARGET] || defineGlobalProperty(TARGET, {});\n } else {\n target = (global[TARGET] || {}).prototype;\n }\n if (target) for (key in source) {\n sourceProperty = source[key];\n if (options.dontCallGetSet) {\n descriptor = getOwnPropertyDescriptor(target, key);\n targetProperty = descriptor && descriptor.value;\n } else targetProperty = target[key];\n FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced);\n // contained in target\n if (!FORCED && targetProperty !== undefined) {\n if (typeof sourceProperty == typeof targetProperty) continue;\n copyConstructorProperties(sourceProperty, targetProperty);\n }\n // add a flag to not completely full polyfills\n if (options.sham || (targetProperty && targetProperty.sham)) {\n createNonEnumerableProperty(sourceProperty, 'sham', true);\n }\n defineBuiltIn(target, key, sourceProperty, options);\n }\n};\n","var toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\n\nvar max = Math.max;\nvar min = Math.min;\n\n// Helper for a popular repeating case of the spec:\n// Let integer be ? ToInteger(index).\n// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length).\nmodule.exports = function (index, length) {\n var integer = toIntegerOrInfinity(index);\n return integer < 0 ? max(integer + length, 0) : min(integer, length);\n};\n","import React, { createElement } from \"react\"\nimport PropTypes from \"prop-types\"\nimport { publicLoader } from \"./loader\"\nimport { apiRunner } from \"./api-runner-browser\"\nimport { grabMatchParams } from \"./find-path\"\n\n// Renders page\nclass PageRenderer extends React.Component {\n render() {\n const props = {\n ...this.props,\n params: {\n ...grabMatchParams(this.props.location.pathname),\n ...this.props.pageResources.json.pageContext.__params,\n },\n pathContext: this.props.pageContext,\n }\n\n const [replacementElement] = apiRunner(`replaceComponentRenderer`, {\n props: this.props,\n loader: publicLoader,\n })\n\n const pageElement =\n replacementElement ||\n createElement(this.props.pageResources.component, {\n ...props,\n key: this.props.path || this.props.pageResources.page.path,\n })\n\n const wrappedPage = apiRunner(\n `wrapPageElement`,\n { element: pageElement, props },\n pageElement,\n ({ result }) => {\n return { element: result, props }\n }\n ).pop()\n\n return wrappedPage\n }\n}\n\nPageRenderer.propTypes = {\n location: PropTypes.object.isRequired,\n pageResources: PropTypes.object.isRequired,\n data: PropTypes.object,\n pageContext: PropTypes.object.isRequired,\n}\n\nexport default PageRenderer\n","var internalObjectKeys = require('../internals/object-keys-internal');\nvar enumBugKeys = require('../internals/enum-bug-keys');\n\nvar hiddenKeys = enumBugKeys.concat('length', 'prototype');\n\n// `Object.getOwnPropertyNames` method\n// https://tc39.es/ecma262/#sec-object.getownpropertynames\n// eslint-disable-next-line es/no-object-getownpropertynames -- safe\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return internalObjectKeys(O, hiddenKeys);\n};\n","var global = require('../internals/global');\nvar userAgent = require('../internals/engine-user-agent');\n\nvar process = global.process;\nvar Deno = global.Deno;\nvar versions = process && process.versions || Deno && Deno.version;\nvar v8 = versions && versions.v8;\nvar match, version;\n\nif (v8) {\n match = v8.split('.');\n // in old Chrome, versions of V8 isn't V8 = Chrome / 10\n // but their correct versions are not interesting for us\n version = match[0] > 0 && match[0] < 4 ? 1 : +(match[0] + match[1]);\n}\n\n// BrowserFS NodeJS `process` polyfill incorrectly set `.v8` to `0.0`\n// so check `userAgent` even if `.v8` exists, but 0\nif (!version && userAgent) {\n match = userAgent.match(/Edge\\/(\\d+)/);\n if (!match || match[1] >= 74) {\n match = userAgent.match(/Chrome\\/(\\d+)/);\n if (match) version = +match[1];\n }\n}\n\nmodule.exports = version;\n","import invariant from \"invariant\";\n\n////////////////////////////////////////////////////////////////////////////////\n// startsWith(string, search) - Check if `string` starts with `search`\nvar startsWith = function startsWith(string, search) {\n return string.substr(0, search.length) === search;\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// pick(routes, uri)\n//\n// Ranks and picks the best route to match. Each segment gets the highest\n// amount of points, then the type of segment gets an additional amount of\n// points where\n//\n// static > dynamic > splat > root\n//\n// This way we don't have to worry about the order of our routes, let the\n// computers do it.\n//\n// A route looks like this\n//\n// { path, default, value }\n//\n// And a returned match looks like:\n//\n// { route, params, uri }\n//\n// I know, I should use TypeScript not comments for these types.\nvar pick = function pick(routes, uri) {\n var match = void 0;\n var default_ = void 0;\n\n var _uri$split = uri.split(\"?\"),\n uriPathname = _uri$split[0];\n\n var uriSegments = segmentize(uriPathname);\n var isRootUri = uriSegments[0] === \"\";\n var ranked = rankRoutes(routes);\n\n for (var i = 0, l = ranked.length; i < l; i++) {\n var missed = false;\n var route = ranked[i].route;\n\n if (route.default) {\n default_ = {\n route: route,\n params: {},\n uri: uri\n };\n continue;\n }\n\n var routeSegments = segmentize(route.path);\n var params = {};\n var max = Math.max(uriSegments.length, routeSegments.length);\n var index = 0;\n\n for (; index < max; index++) {\n var routeSegment = routeSegments[index];\n var uriSegment = uriSegments[index];\n\n if (isSplat(routeSegment)) {\n // Hit a splat, just grab the rest, and return a match\n // uri: /files/documents/work\n // route: /files/*\n var param = routeSegment.slice(1) || \"*\";\n params[param] = uriSegments.slice(index).map(decodeURIComponent).join(\"/\");\n break;\n }\n\n if (uriSegment === undefined) {\n // URI is shorter than the route, no match\n // uri: /users\n // route: /users/:userId\n missed = true;\n break;\n }\n\n var dynamicMatch = paramRe.exec(routeSegment);\n\n if (dynamicMatch && !isRootUri) {\n var matchIsNotReserved = reservedNames.indexOf(dynamicMatch[1]) === -1;\n !matchIsNotReserved ? process.env.NODE_ENV !== \"production\" ? invariant(false, \" dynamic segment \\\"\" + dynamicMatch[1] + \"\\\" is a reserved name. Please use a different name in path \\\"\" + route.path + \"\\\".\") : invariant(false) : void 0;\n var value = decodeURIComponent(uriSegment);\n params[dynamicMatch[1]] = value;\n } else if (routeSegment !== uriSegment) {\n // Current segments don't match, not dynamic, not splat, so no match\n // uri: /users/123/settings\n // route: /users/:id/profile\n missed = true;\n break;\n }\n }\n\n if (!missed) {\n match = {\n route: route,\n params: params,\n uri: \"/\" + uriSegments.slice(0, index).join(\"/\")\n };\n break;\n }\n }\n\n return match || default_ || null;\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// match(path, uri) - Matches just one path to a uri, also lol\nvar match = function match(path, uri) {\n return pick([{ path: path }], uri);\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// resolve(to, basepath)\n//\n// Resolves URIs as though every path is a directory, no files. Relative URIs\n// in the browser can feel awkward because not only can you be \"in a directory\"\n// you can be \"at a file\", too. For example\n//\n// browserSpecResolve('foo', '/bar/') => /bar/foo\n// browserSpecResolve('foo', '/bar') => /foo\n//\n// But on the command line of a file system, it's not as complicated, you can't\n// `cd` from a file, only directories. This way, links have to know less about\n// their current path. To go deeper you can do this:\n//\n// \n// // instead of\n// \n//\n// Just like `cd`, if you want to go deeper from the command line, you do this:\n//\n// cd deeper\n// # not\n// cd $(pwd)/deeper\n//\n// By treating every path as a directory, linking to relative paths should\n// require less contextual information and (fingers crossed) be more intuitive.\nvar resolve = function resolve(to, base) {\n // /foo/bar, /baz/qux => /foo/bar\n if (startsWith(to, \"/\")) {\n return to;\n }\n\n var _to$split = to.split(\"?\"),\n toPathname = _to$split[0],\n toQuery = _to$split[1];\n\n var _base$split = base.split(\"?\"),\n basePathname = _base$split[0];\n\n var toSegments = segmentize(toPathname);\n var baseSegments = segmentize(basePathname);\n\n // ?a=b, /users?b=c => /users?a=b\n if (toSegments[0] === \"\") {\n return addQuery(basePathname, toQuery);\n }\n\n // profile, /users/789 => /users/789/profile\n if (!startsWith(toSegments[0], \".\")) {\n var pathname = baseSegments.concat(toSegments).join(\"/\");\n return addQuery((basePathname === \"/\" ? \"\" : \"/\") + pathname, toQuery);\n }\n\n // ./ /users/123 => /users/123\n // ../ /users/123 => /users\n // ../.. /users/123 => /\n // ../../one /a/b/c/d => /a/b/one\n // .././one /a/b/c/d => /a/b/c/one\n var allSegments = baseSegments.concat(toSegments);\n var segments = [];\n for (var i = 0, l = allSegments.length; i < l; i++) {\n var segment = allSegments[i];\n if (segment === \"..\") segments.pop();else if (segment !== \".\") segments.push(segment);\n }\n\n return addQuery(\"/\" + segments.join(\"/\"), toQuery);\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// insertParams(path, params)\n\nvar insertParams = function insertParams(path, params) {\n var _path$split = path.split(\"?\"),\n pathBase = _path$split[0],\n _path$split$ = _path$split[1],\n query = _path$split$ === undefined ? \"\" : _path$split$;\n\n var segments = segmentize(pathBase);\n var constructedPath = \"/\" + segments.map(function (segment) {\n var match = paramRe.exec(segment);\n return match ? params[match[1]] : segment;\n }).join(\"/\");\n var _params$location = params.location;\n _params$location = _params$location === undefined ? {} : _params$location;\n var _params$location$sear = _params$location.search,\n search = _params$location$sear === undefined ? \"\" : _params$location$sear;\n\n var searchSplit = search.split(\"?\")[1] || \"\";\n constructedPath = addQuery(constructedPath, query, searchSplit);\n return constructedPath;\n};\n\nvar validateRedirect = function validateRedirect(from, to) {\n var filter = function filter(segment) {\n return isDynamic(segment);\n };\n var fromString = segmentize(from).filter(filter).sort().join(\"/\");\n var toString = segmentize(to).filter(filter).sort().join(\"/\");\n return fromString === toString;\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// Junk\nvar paramRe = /^:(.+)/;\n\nvar SEGMENT_POINTS = 4;\nvar STATIC_POINTS = 3;\nvar DYNAMIC_POINTS = 2;\nvar SPLAT_PENALTY = 1;\nvar ROOT_POINTS = 1;\n\nvar isRootSegment = function isRootSegment(segment) {\n return segment === \"\";\n};\nvar isDynamic = function isDynamic(segment) {\n return paramRe.test(segment);\n};\nvar isSplat = function isSplat(segment) {\n return segment && segment[0] === \"*\";\n};\n\nvar rankRoute = function rankRoute(route, index) {\n var score = route.default ? 0 : segmentize(route.path).reduce(function (score, segment) {\n score += SEGMENT_POINTS;\n if (isRootSegment(segment)) score += ROOT_POINTS;else if (isDynamic(segment)) score += DYNAMIC_POINTS;else if (isSplat(segment)) score -= SEGMENT_POINTS + SPLAT_PENALTY;else score += STATIC_POINTS;\n return score;\n }, 0);\n return { route: route, score: score, index: index };\n};\n\nvar rankRoutes = function rankRoutes(routes) {\n return routes.map(rankRoute).sort(function (a, b) {\n return a.score < b.score ? 1 : a.score > b.score ? -1 : a.index - b.index;\n });\n};\n\nvar segmentize = function segmentize(uri) {\n return uri\n // strip starting/ending slashes\n .replace(/(^\\/+|\\/+$)/g, \"\").split(\"/\");\n};\n\nvar addQuery = function addQuery(pathname) {\n for (var _len = arguments.length, query = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n query[_key - 1] = arguments[_key];\n }\n\n query = query.filter(function (q) {\n return q && q.length > 0;\n });\n return pathname + (query && query.length > 0 ? \"?\" + query.join(\"&\") : \"\");\n};\n\nvar reservedNames = [\"uri\", \"path\"];\n\n/**\n * Shallow compares two objects.\n * @param {Object} obj1 The first object to compare.\n * @param {Object} obj2 The second object to compare.\n */\nvar shallowCompare = function shallowCompare(obj1, obj2) {\n var obj1Keys = Object.keys(obj1);\n return obj1Keys.length === Object.keys(obj2).length && obj1Keys.every(function (key) {\n return obj2.hasOwnProperty(key) && obj1[key] === obj2[key];\n });\n};\n\n////////////////////////////////////////////////////////////////////////////////\nexport { startsWith, pick, match, resolve, insertParams, validateRedirect, shallowCompare };","module.exports = [{\n plugin: require('../node_modules/gatsby-remark-images/gatsby-browser.js'),\n options: {\"plugins\":[],\"maxWidth\":1200,\"linkImagesToOriginal\":false,\"showCaptions\":false,\"markdownCaptions\":false,\"sizeByPixelDensity\":false,\"backgroundColor\":\"white\",\"quality\":50,\"withWebp\":false,\"tracedSVG\":false,\"loading\":\"lazy\",\"disableBgImageOnAlpha\":false,\"disableBgImage\":false},\n },{\n plugin: require('../node_modules/gatsby-remark-images-medium-zoom/gatsby-browser.js'),\n options: {\"plugins\":[],\"margin\":36,\"scrollOffset\":0},\n },{\n plugin: require('../node_modules/gatsby-remark-autolink-headers/gatsby-browser.js'),\n options: {\"plugins\":[],\"offsetY\":0,\"className\":\"anchor\"},\n },{\n plugin: require('../node_modules/gatsby-plugin-manifest/gatsby-browser.js'),\n options: {\"plugins\":[],\"name\":\"Dev Jurnal\",\"short_name\":\"Dev Jurnal\",\"start_url\":\"/\",\"background_color\":\"#ffffff\",\"theme_color\":\"#1d2740\",\"display\":\"standalone\",\"icon\":\"content/assets/felog.png\",\"legacy\":true,\"theme_color_in_head\":true,\"cache_busting_mode\":\"query\",\"crossOrigin\":\"anonymous\",\"include_favicon\":true,\"cacheDigest\":\"5c2c5e536922e15b73b41128d93d6b59\"},\n },{\n plugin: require('../node_modules/gatsby-plugin-typography/gatsby-browser.js'),\n options: {\"plugins\":[],\"pathToConfigModule\":\"src/utils/typography\"},\n },{\n plugin: require('../node_modules/gatsby-plugin-offline/gatsby-browser.js'),\n options: {\"plugins\":[]},\n },{\n plugin: require('../node_modules/gatsby-plugin-google-gtag/gatsby-browser.js'),\n options: {\"plugins\":[],\"trackingIds\":[\"G-GVQKMM834T\"],\"pluginConfig\":{\"head\":true}},\n },{\n plugin: require('../gatsby-browser.js'),\n options: {\"plugins\":[]},\n }]\n","/*!\n * domready (c) Dustin Diaz 2014 - License MIT\n * ie10 fix - Mikael Kristiansson 2019\n */\n!(function(name, definition) {\n if (typeof module != \"undefined\") module.exports = definition();\n else if (typeof define == \"function\" && typeof define.amd == \"object\")\n define(definition);\n else this[name] = definition();\n})(\"domready\", function() {\n var ie10 = false;\n if (navigator.appVersion.indexOf(\"MSIE 10\") !== -1) {\n ie10 = true;\n }\n\n var fns = [],\n listener,\n doc = typeof document === \"object\" && document,\n hack = ie10\n ? doc.documentElement.doScroll(\"left\")\n : doc.documentElement.doScroll,\n domContentLoaded = \"DOMContentLoaded\",\n loaded =\n doc && (hack ? /^loaded|^c/ : /^loaded|^i|^c/).test(doc.readyState);\n\n if (!loaded && doc)\n doc.addEventListener(\n domContentLoaded,\n (listener = function() {\n doc.removeEventListener(domContentLoaded, listener);\n loaded = 1;\n while ((listener = fns.shift())) listener();\n })\n );\n\n return function(fn) {\n loaded ? setTimeout(fn, 0) : fns.push(fn);\n };\n});\n","module.exports = typeof navigator != 'undefined' && String(navigator.userAgent) || '';\n","import { apiRunner } from \"./api-runner-browser\"\n\nif (\n window.location.protocol !== `https:` &&\n window.location.hostname !== `localhost`\n) {\n console.error(\n `Service workers can only be used over HTTPS, or on localhost for development`\n )\n} else if (`serviceWorker` in navigator) {\n navigator.serviceWorker\n .register(`${__BASE_PATH__}/sw.js`)\n .then(function (reg) {\n reg.addEventListener(`updatefound`, () => {\n apiRunner(`onServiceWorkerUpdateFound`, { serviceWorker: reg })\n // The updatefound event implies that reg.installing is set; see\n // https://w3c.github.io/ServiceWorker/#service-worker-registration-updatefound-event\n const installingWorker = reg.installing\n console.log(`installingWorker`, installingWorker)\n installingWorker.addEventListener(`statechange`, () => {\n switch (installingWorker.state) {\n case `installed`:\n if (navigator.serviceWorker.controller) {\n // At this point, the old content will have been purged and the fresh content will\n // have been added to the cache.\n\n // We set a flag so Gatsby Link knows to refresh the page on next navigation attempt\n window.___swUpdated = true\n // We call the onServiceWorkerUpdateReady API so users can show update prompts.\n apiRunner(`onServiceWorkerUpdateReady`, { serviceWorker: reg })\n\n // If resources failed for the current page, reload.\n if (window.___failedResources) {\n console.log(`resources failed, SW updated - reloading`)\n window.location.reload()\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a \"Content is cached for offline use.\" message.\n console.log(`Content is now available offline!`)\n\n // Post to service worker that install is complete.\n // Delay to allow time for the event listener to be added --\n // otherwise fetch is called too soon and resources aren't cached.\n apiRunner(`onServiceWorkerInstalled`, { serviceWorker: reg })\n }\n break\n\n case `redundant`:\n console.error(`The installing service worker became redundant.`)\n apiRunner(`onServiceWorkerRedundant`, { serviceWorker: reg })\n break\n\n case `activated`:\n apiRunner(`onServiceWorkerActive`, { serviceWorker: reg })\n break\n }\n })\n })\n })\n .catch(function (e) {\n console.error(`Error during service worker registration:`, e)\n })\n}\n","// prefer default export if available\nconst preferDefault = m => (m && m.default) || m\n\nexports.components = {\n \"component---node-modules-gatsby-plugin-offline-app-shell-js\": () => import(\"./../../../node_modules/gatsby-plugin-offline/app-shell.js\" /* webpackChunkName: \"component---node-modules-gatsby-plugin-offline-app-shell-js\" */),\n \"component---src-pages-404-js\": () => import(\"./../../../src/pages/404.js\" /* webpackChunkName: \"component---src-pages-404-js\" */),\n \"component---src-pages-about-js\": () => import(\"./../../../src/pages/about.js\" /* webpackChunkName: \"component---src-pages-about-js\" */),\n \"component---src-pages-index-js\": () => import(\"./../../../src/pages/index.js\" /* webpackChunkName: \"component---src-pages-index-js\" */),\n \"component---src-templates-blog-post-js\": () => import(\"./../../../src/templates/blog-post.js\" /* webpackChunkName: \"component---src-templates-blog-post-js\" */)\n}\n\n","var uncurryThis = require('../internals/function-uncurry-this');\n\nmodule.exports = uncurryThis({}.isPrototypeOf);\n","function _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n return self;\n}\nmodule.exports = _assertThisInitialized, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\n/**\n * Use invariant() to assert state which your program assumes to be true.\n *\n * Provide sprintf-style format (only %s is supported) and arguments\n * to provide information about what broke and what you were\n * expecting.\n *\n * The invariant message will be stripped in production, but the invariant\n * will remain to ensure logic does not differ in production.\n */\n\nvar invariant = function(condition, format, a, b, c, d, e, f) {\n if (process.env.NODE_ENV !== 'production') {\n if (format === undefined) {\n throw new Error('invariant requires an error message argument');\n }\n }\n\n if (!condition) {\n var error;\n if (format === undefined) {\n error = new Error(\n 'Minified exception occurred; use the non-minified dev environment ' +\n 'for the full error message and additional helpful warnings.'\n );\n } else {\n var args = [a, b, c, d, e, f];\n var argIndex = 0;\n error = new Error(\n format.replace(/%s/g, function() { return args[argIndex++]; })\n );\n error.name = 'Invariant Violation';\n }\n\n error.framesToPop = 1; // we don't care about invariant's own frame\n throw error;\n }\n};\n\nmodule.exports = invariant;\n","var fails = require('../internals/fails');\n\nmodule.exports = !fails(function () {\n // eslint-disable-next-line es/no-function-prototype-bind -- safe\n var test = (function () { /* empty */ }).bind();\n // eslint-disable-next-line no-prototype-builtins -- safe\n return typeof test != 'function' || test.hasOwnProperty('prototype');\n});\n","var uncurryThis = require('../internals/function-uncurry-this');\nvar fails = require('../internals/fails');\nvar classof = require('../internals/classof-raw');\n\nvar $Object = Object;\nvar split = uncurryThis(''.split);\n\n// fallback for non-array-like ES3 and non-enumerable old V8 strings\nmodule.exports = fails(function () {\n // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346\n // eslint-disable-next-line no-prototype-builtins -- safe\n return !$Object('z').propertyIsEnumerable(0);\n}) ? function (it) {\n return classof(it) == 'String' ? split(it, '') : $Object(it);\n} : $Object;\n","var call = require('../internals/function-call');\nvar isCallable = require('../internals/is-callable');\nvar isObject = require('../internals/is-object');\n\nvar $TypeError = TypeError;\n\n// `OrdinaryToPrimitive` abstract operation\n// https://tc39.es/ecma262/#sec-ordinarytoprimitive\nmodule.exports = function (input, pref) {\n var fn, val;\n if (pref === 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val;\n if (isCallable(fn = input.valueOf) && !isObject(val = call(fn, input))) return val;\n if (pref !== 'string' && isCallable(fn = input.toString) && !isObject(val = call(fn, input))) return val;\n throw $TypeError(\"Can't convert object to primitive value\");\n};\n","function _setPrototypeOf(o, p) {\n module.exports = _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;\n return _setPrototypeOf(o, p);\n}\nmodule.exports = _setPrototypeOf, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","module.exports = {\n title: `Dev Jurnal`,\n description: `Blog posted about web developer`,\n author: `mmdmthr`,\n introduction: `My notes in public space`,\n siteUrl: `https://www.devjurnal.com`, // Your blog site url\n social: {\n twitter: `mmdmthr`, // Your Twitter account\n github: `mmdmthr`, // Your GitHub account\n medium: `@mmdmthr`, // Your Medium account\n facebook: `mmdmthr`, // Your Facebook account\n linkedin: `mmdmthr`, // Your LinkedIn account\n instagram: `devjurnal`, // Your Instagram account\n },\n icon: `content/assets/felog.png`, // Add your favicon\n keywords: [`blog`],\n comment: {\n disqusShortName: '', // Your disqus-short-name. check disqus.com.\n utterances: 'mmdmthr/devjurnal', // Your repository for archive comment\n },\n configs: {\n countOfInitialPost: 10, // Config your initial count of post\n },\n sponsor: {\n buyMeACoffeeId: '',\n },\n share: {\n facebookAppId: '198884725496062', // Add facebookAppId for using facebook share feature v3.2\n },\n ga: 'G-GVQKMM834T', // Add your google analytics tranking ID\n}\n","var toIndexedObject = require('../internals/to-indexed-object');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\n\n// `Array.prototype.{ indexOf, includes }` methods implementation\nvar createMethod = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIndexedObject($this);\n var length = lengthOfArrayLike(O);\n var index = toAbsoluteIndex(fromIndex, length);\n var value;\n // Array#includes uses SameValueZero equality algorithm\n // eslint-disable-next-line no-self-compare -- NaN check\n if (IS_INCLUDES && el != el) while (length > index) {\n value = O[index++];\n // eslint-disable-next-line no-self-compare -- NaN check\n if (value != value) return true;\n // Array#indexOf ignores holes, Array#includes - not\n } else for (;length > index; index++) {\n if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n\nmodule.exports = {\n // `Array.prototype.includes` method\n // https://tc39.es/ecma262/#sec-array.prototype.includes\n includes: createMethod(true),\n // `Array.prototype.indexOf` method\n // https://tc39.es/ecma262/#sec-array.prototype.indexof\n indexOf: createMethod(false)\n};\n","var toAbsoluteIndex = require('../internals/to-absolute-index');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\nvar createProperty = require('../internals/create-property');\n\nvar $Array = Array;\nvar max = Math.max;\n\nmodule.exports = function (O, start, end) {\n var length = lengthOfArrayLike(O);\n var k = toAbsoluteIndex(start, length);\n var fin = toAbsoluteIndex(end === undefined ? length : end, length);\n var result = $Array(max(fin - k, 0));\n for (var n = 0; k < fin; k++, n++) createProperty(result, n, O[k]);\n result.length = n;\n return result;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar aCallable = require('../internals/a-callable');\nvar toObject = require('../internals/to-object');\nvar lengthOfArrayLike = require('../internals/length-of-array-like');\nvar deletePropertyOrThrow = require('../internals/delete-property-or-throw');\nvar toString = require('../internals/to-string');\nvar fails = require('../internals/fails');\nvar internalSort = require('../internals/array-sort');\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar FF = require('../internals/engine-ff-version');\nvar IE_OR_EDGE = require('../internals/engine-is-ie-or-edge');\nvar V8 = require('../internals/engine-v8-version');\nvar WEBKIT = require('../internals/engine-webkit-version');\n\nvar test = [];\nvar nativeSort = uncurryThis(test.sort);\nvar push = uncurryThis(test.push);\n\n// IE8-\nvar FAILS_ON_UNDEFINED = fails(function () {\n test.sort(undefined);\n});\n// V8 bug\nvar FAILS_ON_NULL = fails(function () {\n test.sort(null);\n});\n// Old WebKit\nvar STRICT_METHOD = arrayMethodIsStrict('sort');\n\nvar STABLE_SORT = !fails(function () {\n // feature detection can be too slow, so check engines versions\n if (V8) return V8 < 70;\n if (FF && FF > 3) return;\n if (IE_OR_EDGE) return true;\n if (WEBKIT) return WEBKIT < 603;\n\n var result = '';\n var code, chr, value, index;\n\n // generate an array with more 512 elements (Chakra and old V8 fails only in this case)\n for (code = 65; code < 76; code++) {\n chr = String.fromCharCode(code);\n\n switch (code) {\n case 66: case 69: case 70: case 72: value = 3; break;\n case 68: case 71: value = 4; break;\n default: value = 2;\n }\n\n for (index = 0; index < 47; index++) {\n test.push({ k: chr + index, v: value });\n }\n }\n\n test.sort(function (a, b) { return b.v - a.v; });\n\n for (index = 0; index < test.length; index++) {\n chr = test[index].k.charAt(0);\n if (result.charAt(result.length - 1) !== chr) result += chr;\n }\n\n return result !== 'DGBEFHACIJK';\n});\n\nvar FORCED = FAILS_ON_UNDEFINED || !FAILS_ON_NULL || !STRICT_METHOD || !STABLE_SORT;\n\nvar getSortCompare = function (comparefn) {\n return function (x, y) {\n if (y === undefined) return -1;\n if (x === undefined) return 1;\n if (comparefn !== undefined) return +comparefn(x, y) || 0;\n return toString(x) > toString(y) ? 1 : -1;\n };\n};\n\n// `Array.prototype.sort` method\n// https://tc39.es/ecma262/#sec-array.prototype.sort\n$({ target: 'Array', proto: true, forced: FORCED }, {\n sort: function sort(comparefn) {\n if (comparefn !== undefined) aCallable(comparefn);\n\n var array = toObject(this);\n\n if (STABLE_SORT) return comparefn === undefined ? nativeSort(array) : nativeSort(array, comparefn);\n\n var items = [];\n var arrayLength = lengthOfArrayLike(array);\n var itemsLength, index;\n\n for (index = 0; index < arrayLength; index++) {\n if (index in array) push(items, array[index]);\n }\n\n internalSort(items, getSortCompare(comparefn));\n\n itemsLength = lengthOfArrayLike(items);\n index = 0;\n\n while (index < itemsLength) array[index] = items[index++];\n while (index < arrayLength) deletePropertyOrThrow(array, index++);\n\n return array;\n }\n});\n","function _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : {\n \"default\": obj\n };\n}\nmodule.exports = _interopRequireDefault, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var toIntegerOrInfinity = require('../internals/to-integer-or-infinity');\n\nvar min = Math.min;\n\n// `ToLength` abstract operation\n// https://tc39.es/ecma262/#sec-tolength\nmodule.exports = function (argument) {\n return argument > 0 ? min(toIntegerOrInfinity(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991\n};\n","var userAgent = require('../internals/engine-user-agent');\n\nvar webkit = userAgent.match(/AppleWebKit\\/(\\d+)\\./);\n\nmodule.exports = !!webkit && +webkit[1];\n","// This is extracted to separate module because it's shared\n// between browser and SSR code\nexport const RouteAnnouncerProps = {\n id: `gatsby-announcer`,\n style: {\n position: `absolute`,\n top: 0,\n width: 1,\n height: 1,\n padding: 0,\n overflow: `hidden`,\n clip: `rect(0, 0, 0, 0)`,\n whiteSpace: `nowrap`,\n border: 0,\n },\n \"aria-live\": `assertive`,\n \"aria-atomic\": `true`,\n}\n","import React from \"react\"\nimport PropTypes from \"prop-types\"\nimport loader, { PageResourceStatus } from \"./loader\"\nimport redirects from \"./redirects.json\"\nimport { apiRunner } from \"./api-runner-browser\"\nimport emitter from \"./emitter\"\nimport { RouteAnnouncerProps } from \"./route-announcer-props\"\nimport { navigate as reachNavigate } from \"@reach/router\"\nimport { globalHistory } from \"@reach/router/lib/history\"\nimport { parsePath } from \"gatsby-link\"\n\n// Convert to a map for faster lookup in maybeRedirect()\n\nconst redirectMap = new Map()\nconst redirectIgnoreCaseMap = new Map()\n\nredirects.forEach(redirect => {\n if (redirect.ignoreCase) {\n redirectIgnoreCaseMap.set(redirect.fromPath, redirect)\n } else {\n redirectMap.set(redirect.fromPath, redirect)\n }\n})\n\nfunction maybeRedirect(pathname) {\n let redirect = redirectMap.get(pathname)\n if (!redirect) {\n redirect = redirectIgnoreCaseMap.get(pathname.toLowerCase())\n }\n\n if (redirect != null) {\n if (process.env.NODE_ENV !== `production`) {\n if (!loader.isPageNotFound(pathname)) {\n console.error(\n `The route \"${pathname}\" matches both a page and a redirect; this is probably not intentional.`\n )\n }\n }\n\n window.___replace(redirect.toPath)\n return true\n } else {\n return false\n }\n}\n\nconst onPreRouteUpdate = (location, prevLocation) => {\n if (!maybeRedirect(location.pathname)) {\n apiRunner(`onPreRouteUpdate`, { location, prevLocation })\n }\n}\n\nconst onRouteUpdate = (location, prevLocation) => {\n if (!maybeRedirect(location.pathname)) {\n apiRunner(`onRouteUpdate`, { location, prevLocation })\n if (\n process.env.GATSBY_EXPERIMENTAL_QUERY_ON_DEMAND &&\n process.env.GATSBY_QUERY_ON_DEMAND_LOADING_INDICATOR === `true`\n ) {\n emitter.emit(`onRouteUpdate`, { location, prevLocation })\n }\n }\n}\n\nconst navigate = (to, options = {}) => {\n // Support forward/backward navigation with numbers\n // navigate(-2) (jumps back 2 history steps)\n // navigate(2) (jumps forward 2 history steps)\n if (typeof to === `number`) {\n globalHistory.navigate(to)\n return\n }\n\n let { pathname } = parsePath(to)\n let redirect = redirectMap.get(pathname)\n if (!redirect) {\n redirect = redirectIgnoreCaseMap.get(pathname.toLowerCase())\n }\n\n // If we're redirecting, just replace the passed in pathname\n // to the one we want to redirect to.\n if (redirect) {\n to = redirect.toPath\n pathname = parsePath(to).pathname\n }\n\n // If we had a service worker update, no matter the path, reload window and\n // reset the pathname whitelist\n if (window.___swUpdated) {\n window.location = pathname\n return\n }\n\n // Start a timer to wait for a second before transitioning and showing a\n // loader in case resources aren't around yet.\n const timeoutId = setTimeout(() => {\n emitter.emit(`onDelayedLoadPageResources`, { pathname })\n apiRunner(`onRouteUpdateDelayed`, {\n location: window.location,\n })\n }, 1000)\n\n loader.loadPage(pathname).then(pageResources => {\n // If no page resources, then refresh the page\n // Do this, rather than simply `window.location.reload()`, so that\n // pressing the back/forward buttons work - otherwise when pressing\n // back, the browser will just change the URL and expect JS to handle\n // the change, which won't always work since it might not be a Gatsby\n // page.\n if (!pageResources || pageResources.status === PageResourceStatus.Error) {\n window.history.replaceState({}, ``, location.href)\n window.location = pathname\n clearTimeout(timeoutId)\n return\n }\n\n // If the loaded page has a different compilation hash to the\n // window, then a rebuild has occurred on the server. Reload.\n if (process.env.NODE_ENV === `production` && pageResources) {\n if (\n pageResources.page.webpackCompilationHash !==\n window.___webpackCompilationHash\n ) {\n // Purge plugin-offline cache\n if (\n `serviceWorker` in navigator &&\n navigator.serviceWorker.controller !== null &&\n navigator.serviceWorker.controller.state === `activated`\n ) {\n navigator.serviceWorker.controller.postMessage({\n gatsbyApi: `clearPathResources`,\n })\n }\n\n window.location = pathname\n }\n }\n reachNavigate(to, options)\n clearTimeout(timeoutId)\n })\n}\n\nfunction shouldUpdateScroll(prevRouterProps, { location }) {\n const { pathname, hash } = location\n const results = apiRunner(`shouldUpdateScroll`, {\n prevRouterProps,\n // `pathname` for backwards compatibility\n pathname,\n routerProps: { location },\n getSavedScrollPosition: args => [\n 0,\n this._stateStorage.read(args, args.key),\n ],\n })\n if (results.length > 0) {\n // Use the latest registered shouldUpdateScroll result, this allows users to override plugin's configuration\n // @see https://github.com/gatsbyjs/gatsby/issues/12038\n return results[results.length - 1]\n }\n\n if (prevRouterProps) {\n const {\n location: { pathname: oldPathname },\n } = prevRouterProps\n if (oldPathname === pathname) {\n // Scroll to element if it exists, if it doesn't, or no hash is provided,\n // scroll to top.\n return hash ? decodeURI(hash.slice(1)) : [0, 0]\n }\n }\n return true\n}\n\nfunction init() {\n // The \"scroll-behavior\" package expects the \"action\" to be on the location\n // object so let's copy it over.\n globalHistory.listen(args => {\n args.location.action = args.action\n })\n\n window.___push = to => navigate(to, { replace: false })\n window.___replace = to => navigate(to, { replace: true })\n window.___navigate = (to, options) => navigate(to, options)\n\n // Check for initial page-load redirect\n maybeRedirect(window.location.pathname)\n}\n\nclass RouteAnnouncer extends React.Component {\n constructor(props) {\n super(props)\n this.announcementRef = React.createRef()\n }\n\n componentDidUpdate(prevProps, nextProps) {\n requestAnimationFrame(() => {\n let pageName = `new page at ${this.props.location.pathname}`\n if (document.title) {\n pageName = document.title\n }\n const pageHeadings = document.querySelectorAll(`#gatsby-focus-wrapper h1`)\n if (pageHeadings && pageHeadings.length) {\n pageName = pageHeadings[0].textContent\n }\n const newAnnouncement = `Navigated to ${pageName}`\n if (this.announcementRef.current) {\n const oldAnnouncement = this.announcementRef.current.innerText\n if (oldAnnouncement !== newAnnouncement) {\n this.announcementRef.current.innerText = newAnnouncement\n }\n }\n })\n }\n\n render() {\n return
\n }\n}\n\nconst compareLocationProps = (prevLocation, nextLocation) => {\n if (prevLocation.href !== nextLocation.href) {\n return true\n }\n\n if (prevLocation?.state?.key !== nextLocation?.state?.key) {\n return true\n }\n\n return false\n}\n\n// Fire on(Pre)RouteUpdate APIs\nclass RouteUpdates extends React.Component {\n constructor(props) {\n super(props)\n onPreRouteUpdate(props.location, null)\n }\n\n componentDidMount() {\n onRouteUpdate(this.props.location, null)\n }\n\n shouldComponentUpdate(prevProps) {\n if (compareLocationProps(prevProps.location, this.props.location)) {\n onPreRouteUpdate(this.props.location, prevProps.location)\n return true\n }\n return false\n }\n\n componentDidUpdate(prevProps) {\n if (compareLocationProps(prevProps.location, this.props.location)) {\n onRouteUpdate(this.props.location, prevProps.location)\n }\n }\n\n render() {\n return (\n \n {this.props.children}\n \n \n )\n }\n}\n\nRouteUpdates.propTypes = {\n location: PropTypes.object.isRequired,\n}\n\nexport { init, shouldUpdateScroll, RouteUpdates }\n","// Pulled from react-compat\n// https://github.com/developit/preact-compat/blob/7c5de00e7c85e2ffd011bf3af02899b63f699d3a/src/index.js#L349\nfunction shallowDiffers(a, b) {\n for (var i in a) {\n if (!(i in b)) return true;\n }for (var _i in b) {\n if (a[_i] !== b[_i]) return true;\n }return false;\n}\n\nexport default (function (instance, nextProps, nextState) {\n return shallowDiffers(instance.props, nextProps) || shallowDiffers(instance.state, nextState);\n});","import React from \"react\"\nimport loader, { PageResourceStatus } from \"./loader\"\nimport shallowCompare from \"shallow-compare\"\n\nclass EnsureResources extends React.Component {\n constructor(props) {\n super()\n const { location, pageResources } = props\n this.state = {\n location: { ...location },\n pageResources: pageResources || loader.loadPageSync(location.pathname),\n }\n }\n\n static getDerivedStateFromProps({ location }, prevState) {\n if (prevState.location.href !== location.href) {\n const pageResources = loader.loadPageSync(location.pathname)\n return {\n pageResources,\n location: { ...location },\n }\n }\n\n return {\n location: { ...location },\n }\n }\n\n loadResources(rawPath) {\n loader.loadPage(rawPath).then(pageResources => {\n if (pageResources && pageResources.status !== PageResourceStatus.Error) {\n this.setState({\n location: { ...window.location },\n pageResources,\n })\n } else {\n window.history.replaceState({}, ``, location.href)\n window.location = rawPath\n }\n })\n }\n\n shouldComponentUpdate(nextProps, nextState) {\n // Always return false if we're missing resources.\n if (!nextState.pageResources) {\n this.loadResources(nextProps.location.pathname)\n return false\n }\n\n if (\n process.env.BUILD_STAGE === `develop` &&\n nextState.pageResources.stale\n ) {\n this.loadResources(nextProps.location.pathname)\n return false\n }\n\n // Check if the component or json have changed.\n if (this.state.pageResources !== nextState.pageResources) {\n return true\n }\n if (\n this.state.pageResources.component !== nextState.pageResources.component\n ) {\n return true\n }\n\n if (this.state.pageResources.json !== nextState.pageResources.json) {\n return true\n }\n // Check if location has changed on a page using internal routing\n // via matchPath configuration.\n if (\n this.state.location.key !== nextState.location.key &&\n nextState.pageResources.page &&\n (nextState.pageResources.page.matchPath ||\n nextState.pageResources.page.path)\n ) {\n return true\n }\n return shallowCompare(this, nextProps, nextState)\n }\n\n render() {\n if (process.env.NODE_ENV !== `production` && !this.state.pageResources) {\n throw new Error(\n `EnsureResources was not able to find resources for path: \"${this.props.location.pathname}\"\nThis typically means that an issue occurred building components for that path.\nRun \\`gatsby clean\\` to remove any cached elements.`\n )\n }\n\n return this.props.children(this.state)\n }\n}\n\nexport default EnsureResources\n","import { apiRunner, apiRunnerAsync } from \"./api-runner-browser\"\nimport React from \"react\"\nimport ReactDOM from \"react-dom\"\nimport { Router, navigate, Location, BaseContext } from \"@reach/router\"\nimport { ScrollContext } from \"gatsby-react-router-scroll\"\nimport domReady from \"@mikaelkristiansson/domready\"\nimport { StaticQueryContext } from \"gatsby\"\nimport {\n shouldUpdateScroll,\n init as navigationInit,\n RouteUpdates,\n} from \"./navigation\"\nimport emitter from \"./emitter\"\nimport PageRenderer from \"./page-renderer\"\nimport asyncRequires from \"$virtual/async-requires\"\nimport {\n setLoader,\n ProdLoader,\n publicLoader,\n PageResourceStatus,\n getStaticQueryResults,\n} from \"./loader\"\nimport EnsureResources from \"./ensure-resources\"\nimport stripPrefix from \"./strip-prefix\"\n\n// Generated during bootstrap\nimport matchPaths from \"$virtual/match-paths.json\"\n\nconst loader = new ProdLoader(asyncRequires, matchPaths)\nsetLoader(loader)\nloader.setApiRunner(apiRunner)\n\nwindow.asyncRequires = asyncRequires\nwindow.___emitter = emitter\nwindow.___loader = publicLoader\n\nnavigationInit()\n\napiRunnerAsync(`onClientEntry`).then(() => {\n // Let plugins register a service worker. The plugin just needs\n // to return true.\n if (apiRunner(`registerServiceWorker`).length > 0) {\n require(`./register-service-worker`)\n }\n\n // In gatsby v2 if Router is used in page using matchPaths\n // paths need to contain full path.\n // For example:\n // - page have `/app/*` matchPath\n // - inside template user needs to use `/app/xyz` as path\n // Resetting `basepath`/`baseuri` keeps current behaviour\n // to not introduce breaking change.\n // Remove this in v3\n const RouteHandler = props => (\n \n \n \n )\n\n const DataContext = React.createContext({})\n\n class GatsbyRoot extends React.Component {\n render() {\n const { children } = this.props\n return (\n \n {({ location }) => (\n \n {({ pageResources, location }) => {\n const staticQueryResults = getStaticQueryResults()\n return (\n \n \n {children}\n \n \n )\n }}\n \n )}\n \n )\n }\n }\n\n class LocationHandler extends React.Component {\n render() {\n return (\n \n {({ pageResources, location }) => (\n \n \n \n \n
\n \n \n )}\n \n )\n }\n }\n\n const { pagePath, location: browserLoc } = window\n\n // Explicitly call navigate if the canonical path (window.pagePath)\n // is different to the browser path (window.location.pathname). But\n // only if NONE of the following conditions hold:\n //\n // - The url matches a client side route (page.matchPath)\n // - it's a 404 page\n // - it's the offline plugin shell (/offline-plugin-app-shell-fallback/)\n if (\n pagePath &&\n __BASE_PATH__ + pagePath !== browserLoc.pathname &&\n !(\n loader.findMatchPath(stripPrefix(browserLoc.pathname, __BASE_PATH__)) ||\n pagePath === `/404.html` ||\n pagePath.match(/^\\/404\\/?$/) ||\n pagePath.match(/^\\/offline-plugin-app-shell-fallback\\/?$/)\n )\n ) {\n navigate(__BASE_PATH__ + pagePath + browserLoc.search + browserLoc.hash, {\n replace: true,\n })\n }\n\n publicLoader.loadPage(browserLoc.pathname).then(page => {\n if (!page || page.status === PageResourceStatus.Error) {\n throw new Error(\n `page resources for ${browserLoc.pathname} not found. Not rendering React`\n )\n }\n\n window.___webpackCompilationHash = page.page.webpackCompilationHash\n\n const SiteRoot = apiRunner(\n `wrapRootElement`,\n { element: },\n ,\n ({ result }) => {\n return { element: result }\n }\n ).pop()\n\n const App = () => {SiteRoot}\n\n const renderer = apiRunner(\n `replaceHydrateFunction`,\n undefined,\n ReactDOM.hydrate\n )[0]\n\n domReady(() => {\n renderer(\n ,\n typeof window !== `undefined`\n ? document.getElementById(`___gatsby`)\n : void 0,\n () => {\n apiRunner(`onInitialClientRender`)\n }\n )\n })\n })\n})\n","var classof = require('../internals/classof');\n\nvar $String = String;\n\nmodule.exports = function (argument) {\n if (classof(argument) === 'Symbol') throw TypeError('Cannot convert a Symbol value to a string');\n return $String(argument);\n};\n","var setPrototypeOf = require(\"./setPrototypeOf.js\");\nfunction _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n setPrototypeOf(subClass, superClass);\n}\nmodule.exports = _inheritsLoose, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var IS_PURE = require('../internals/is-pure');\nvar store = require('../internals/shared-store');\n\n(module.exports = function (key, value) {\n return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n version: '3.30.2',\n mode: IS_PURE ? 'pure' : 'global',\n copyright: '© 2014-2023 Denis Pushkarev (zloirock.ru)',\n license: 'https://github.com/zloirock/core-js/blob/v3.30.2/LICENSE',\n source: 'https://github.com/zloirock/core-js'\n});\n","var getBuiltIn = require('../internals/get-built-in');\nvar uncurryThis = require('../internals/function-uncurry-this');\nvar getOwnPropertyNamesModule = require('../internals/object-get-own-property-names');\nvar getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols');\nvar anObject = require('../internals/an-object');\n\nvar concat = uncurryThis([].concat);\n\n// all object keys, includes non-enumerable and symbols\nmodule.exports = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) {\n var keys = getOwnPropertyNamesModule.f(anObject(it));\n var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;\n return getOwnPropertySymbols ? concat(keys, getOwnPropertySymbols(it)) : keys;\n};\n","var trunc = require('../internals/math-trunc');\n\n// `ToIntegerOrInfinity` abstract operation\n// https://tc39.es/ecma262/#sec-tointegerorinfinity\nmodule.exports = function (argument) {\n var number = +argument;\n // eslint-disable-next-line no-self-compare -- NaN check\n return number !== number || number === 0 ? 0 : trunc(number);\n};\n","import React from \"react\"\nimport PropTypes from \"prop-types\"\nimport Link, {\n withPrefix,\n withAssetPrefix,\n navigate,\n push,\n replace,\n navigateTo,\n parsePath,\n} from \"gatsby-link\"\nimport { useScrollRestoration } from \"gatsby-react-router-scroll\"\nimport PageRenderer from \"./public-page-renderer\"\nimport loader from \"./loader\"\n\nconst prefetchPathname = loader.enqueue\n\nconst StaticQueryContext = React.createContext({})\n\nfunction StaticQueryDataRenderer({ staticQueryData, data, query, render }) {\n const finalData = data\n ? data.data\n : staticQueryData[query] && staticQueryData[query].data\n\n return (\n \n {finalData && render(finalData)}\n {!finalData &&
Loading (StaticQuery)
}\n
\n )\n}\n\nconst StaticQuery = props => {\n const { data, query, render, children } = props\n\n return (\n \n {staticQueryData => (\n \n )}\n \n )\n}\n\nconst useStaticQuery = query => {\n if (\n typeof React.useContext !== `function` &&\n process.env.NODE_ENV === `development`\n ) {\n throw new Error(\n `You're likely using a version of React that doesn't support Hooks\\n` +\n `Please update React and ReactDOM to 16.8.0 or later to use the useStaticQuery hook.`\n )\n }\n const context = React.useContext(StaticQueryContext)\n\n // query is a stringified number like `3303882` when wrapped with graphql, If a user forgets\n // to wrap the query in a grqphql, then casting it to a Number results in `NaN` allowing us to\n // catch the misuse of the API and give proper direction\n if (isNaN(Number(query))) {\n throw new Error(`useStaticQuery was called with a string but expects to be called using \\`graphql\\`. Try this:\n\nimport { useStaticQuery, graphql } from 'gatsby';\n\nuseStaticQuery(graphql\\`${query}\\`);\n`)\n }\n\n if (context[query]?.data) {\n return context[query].data\n } else {\n throw new Error(\n `The result of this StaticQuery could not be fetched.\\n\\n` +\n `This is likely a bug in Gatsby and if refreshing the page does not fix it, ` +\n `please open an issue in https://github.com/gatsbyjs/gatsby/issues`\n )\n }\n}\n\nStaticQuery.propTypes = {\n data: PropTypes.object,\n query: PropTypes.string.isRequired,\n render: PropTypes.func,\n children: PropTypes.func,\n}\n\nfunction graphql() {\n throw new Error(\n `It appears like Gatsby is misconfigured. Gatsby related \\`graphql\\` calls ` +\n `are supposed to only be evaluated at compile time, and then compiled away. ` +\n `Unfortunately, something went wrong and the query was left in the compiled code.\\n\\n` +\n `Unless your site has a complex or custom babel/Gatsby configuration this is likely a bug in Gatsby.`\n )\n}\n\nexport {\n Link,\n withAssetPrefix,\n withPrefix,\n graphql,\n parsePath,\n navigate,\n push, // TODO replace for v3\n replace, // TODO remove replace for v3\n navigateTo, // TODO: remove navigateTo for v3\n useScrollRestoration,\n StaticQueryContext,\n StaticQuery,\n PageRenderer,\n useStaticQuery,\n prefetchPathname,\n}\n","var isCallable = require('../internals/is-callable');\nvar tryToString = require('../internals/try-to-string');\n\nvar $TypeError = TypeError;\n\n// `Assert: IsCallable(argument) is true`\nmodule.exports = function (argument) {\n if (isCallable(argument)) return argument;\n throw $TypeError(tryToString(argument) + ' is not a function');\n};\n","require(\"core-js/modules/es.array.sort.js\");\n/**\n * Copyright 2016 Google Inc. All Rights Reserved.\n *\n * Licensed under the W3C SOFTWARE AND DOCUMENT NOTICE AND LICENSE.\n *\n * https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document\n *\n */\n\n(function (window, document) {\n 'use strict';\n\n // Exits early if all IntersectionObserver and IntersectionObserverEntry\n // features are natively supported.\n if ('IntersectionObserver' in window && 'IntersectionObserverEntry' in window && 'intersectionRatio' in window.IntersectionObserverEntry.prototype) {\n // Minimal polyfill for Edge 15's lack of `isIntersecting`\n // See: https://github.com/w3c/IntersectionObserver/issues/211\n if (!('isIntersecting' in window.IntersectionObserverEntry.prototype)) {\n Object.defineProperty(window.IntersectionObserverEntry.prototype, 'isIntersecting', {\n get: function get() {\n return this.intersectionRatio > 0;\n }\n });\n }\n return;\n }\n\n /**\n * An IntersectionObserver registry. This registry exists to hold a strong\n * reference to IntersectionObserver instances currently observing a target\n * element. Without this registry, instances without another reference may be\n * garbage collected.\n */\n var registry = [];\n\n /**\n * Creates the global IntersectionObserverEntry constructor.\n * https://w3c.github.io/IntersectionObserver/#intersection-observer-entry\n * @param {Object} entry A dictionary of instance properties.\n * @constructor\n */\n function IntersectionObserverEntry(entry) {\n this.time = entry.time;\n this.target = entry.target;\n this.rootBounds = entry.rootBounds;\n this.boundingClientRect = entry.boundingClientRect;\n this.intersectionRect = entry.intersectionRect || getEmptyRect();\n this.isIntersecting = !!entry.intersectionRect;\n\n // Calculates the intersection ratio.\n var targetRect = this.boundingClientRect;\n var targetArea = targetRect.width * targetRect.height;\n var intersectionRect = this.intersectionRect;\n var intersectionArea = intersectionRect.width * intersectionRect.height;\n\n // Sets intersection ratio.\n if (targetArea) {\n // Round the intersection ratio to avoid floating point math issues:\n // https://github.com/w3c/IntersectionObserver/issues/324\n this.intersectionRatio = Number((intersectionArea / targetArea).toFixed(4));\n } else {\n // If area is zero and is intersecting, sets to 1, otherwise to 0\n this.intersectionRatio = this.isIntersecting ? 1 : 0;\n }\n }\n\n /**\n * Creates the global IntersectionObserver constructor.\n * https://w3c.github.io/IntersectionObserver/#intersection-observer-interface\n * @param {Function} callback The function to be invoked after intersection\n * changes have queued. The function is not invoked if the queue has\n * been emptied by calling the `takeRecords` method.\n * @param {Object=} opt_options Optional configuration options.\n * @constructor\n */\n function IntersectionObserver(callback, opt_options) {\n var options = opt_options || {};\n if (typeof callback != 'function') {\n throw new Error('callback must be a function');\n }\n if (options.root && options.root.nodeType != 1) {\n throw new Error('root must be an Element');\n }\n\n // Binds and throttles `this._checkForIntersections`.\n this._checkForIntersections = throttle(this._checkForIntersections.bind(this), this.THROTTLE_TIMEOUT);\n\n // Private properties.\n this._callback = callback;\n this._observationTargets = [];\n this._queuedEntries = [];\n this._rootMarginValues = this._parseRootMargin(options.rootMargin);\n\n // Public properties.\n this.thresholds = this._initThresholds(options.threshold);\n this.root = options.root || null;\n this.rootMargin = this._rootMarginValues.map(function (margin) {\n return margin.value + margin.unit;\n }).join(' ');\n }\n\n /**\n * The minimum interval within which the document will be checked for\n * intersection changes.\n */\n IntersectionObserver.prototype.THROTTLE_TIMEOUT = 100;\n\n /**\n * The frequency in which the polyfill polls for intersection changes.\n * this can be updated on a per instance basis and must be set prior to\n * calling `observe` on the first target.\n */\n IntersectionObserver.prototype.POLL_INTERVAL = null;\n\n /**\n * Use a mutation observer on the root element\n * to detect intersection changes.\n */\n IntersectionObserver.prototype.USE_MUTATION_OBSERVER = true;\n\n /**\n * Starts observing a target element for intersection changes based on\n * the thresholds values.\n * @param {Element} target The DOM element to observe.\n */\n IntersectionObserver.prototype.observe = function (target) {\n var isTargetAlreadyObserved = this._observationTargets.some(function (item) {\n return item.element == target;\n });\n if (isTargetAlreadyObserved) {\n return;\n }\n if (!(target && target.nodeType == 1)) {\n throw new Error('target must be an Element');\n }\n this._registerInstance();\n this._observationTargets.push({\n element: target,\n entry: null\n });\n this._monitorIntersections();\n this._checkForIntersections();\n };\n\n /**\n * Stops observing a target element for intersection changes.\n * @param {Element} target The DOM element to observe.\n */\n IntersectionObserver.prototype.unobserve = function (target) {\n this._observationTargets = this._observationTargets.filter(function (item) {\n return item.element != target;\n });\n if (!this._observationTargets.length) {\n this._unmonitorIntersections();\n this._unregisterInstance();\n }\n };\n\n /**\n * Stops observing all target elements for intersection changes.\n */\n IntersectionObserver.prototype.disconnect = function () {\n this._observationTargets = [];\n this._unmonitorIntersections();\n this._unregisterInstance();\n };\n\n /**\n * Returns any queue entries that have not yet been reported to the\n * callback and clears the queue. This can be used in conjunction with the\n * callback to obtain the absolute most up-to-date intersection information.\n * @return {Array} The currently queued entries.\n */\n IntersectionObserver.prototype.takeRecords = function () {\n var records = this._queuedEntries.slice();\n this._queuedEntries = [];\n return records;\n };\n\n /**\n * Accepts the threshold value from the user configuration object and\n * returns a sorted array of unique threshold values. If a value is not\n * between 0 and 1 and error is thrown.\n * @private\n * @param {Array|number=} opt_threshold An optional threshold value or\n * a list of threshold values, defaulting to [0].\n * @return {Array} A sorted list of unique and valid threshold values.\n */\n IntersectionObserver.prototype._initThresholds = function (opt_threshold) {\n var threshold = opt_threshold || [0];\n if (!Array.isArray(threshold)) threshold = [threshold];\n return threshold.sort().filter(function (t, i, a) {\n if (typeof t != 'number' || isNaN(t) || t < 0 || t > 1) {\n throw new Error('threshold must be a number between 0 and 1 inclusively');\n }\n return t !== a[i - 1];\n });\n };\n\n /**\n * Accepts the rootMargin value from the user configuration object\n * and returns an array of the four margin values as an object containing\n * the value and unit properties. If any of the values are not properly\n * formatted or use a unit other than px or %, and error is thrown.\n * @private\n * @param {string=} opt_rootMargin An optional rootMargin value,\n * defaulting to '0px'.\n * @return {Array} An array of margin objects with the keys\n * value and unit.\n */\n IntersectionObserver.prototype._parseRootMargin = function (opt_rootMargin) {\n var marginString = opt_rootMargin || '0px';\n var margins = marginString.split(/\\s+/).map(function (margin) {\n var parts = /^(-?\\d*\\.?\\d+)(px|%)$/.exec(margin);\n if (!parts) {\n throw new Error('rootMargin must be specified in pixels or percent');\n }\n return {\n value: parseFloat(parts[1]),\n unit: parts[2]\n };\n });\n\n // Handles shorthand.\n margins[1] = margins[1] || margins[0];\n margins[2] = margins[2] || margins[0];\n margins[3] = margins[3] || margins[1];\n return margins;\n };\n\n /**\n * Starts polling for intersection changes if the polling is not already\n * happening, and if the page's visibility state is visible.\n * @private\n */\n IntersectionObserver.prototype._monitorIntersections = function () {\n if (!this._monitoringIntersections) {\n this._monitoringIntersections = true;\n\n // If a poll interval is set, use polling instead of listening to\n // resize and scroll events or DOM mutations.\n if (this.POLL_INTERVAL) {\n this._monitoringInterval = setInterval(this._checkForIntersections, this.POLL_INTERVAL);\n } else {\n addEvent(window, 'resize', this._checkForIntersections, true);\n addEvent(document, 'scroll', this._checkForIntersections, true);\n if (this.USE_MUTATION_OBSERVER && 'MutationObserver' in window) {\n this._domObserver = new MutationObserver(this._checkForIntersections);\n this._domObserver.observe(document, {\n attributes: true,\n childList: true,\n characterData: true,\n subtree: true\n });\n }\n }\n }\n };\n\n /**\n * Stops polling for intersection changes.\n * @private\n */\n IntersectionObserver.prototype._unmonitorIntersections = function () {\n if (this._monitoringIntersections) {\n this._monitoringIntersections = false;\n clearInterval(this._monitoringInterval);\n this._monitoringInterval = null;\n removeEvent(window, 'resize', this._checkForIntersections, true);\n removeEvent(document, 'scroll', this._checkForIntersections, true);\n if (this._domObserver) {\n this._domObserver.disconnect();\n this._domObserver = null;\n }\n }\n };\n\n /**\n * Scans each observation target for intersection changes and adds them\n * to the internal entries queue. If new entries are found, it\n * schedules the callback to be invoked.\n * @private\n */\n IntersectionObserver.prototype._checkForIntersections = function () {\n var rootIsInDom = this._rootIsInDom();\n var rootRect = rootIsInDom ? this._getRootRect() : getEmptyRect();\n this._observationTargets.forEach(function (item) {\n var target = item.element;\n var targetRect = getBoundingClientRect(target);\n var rootContainsTarget = this._rootContainsTarget(target);\n var oldEntry = item.entry;\n var intersectionRect = rootIsInDom && rootContainsTarget && this._computeTargetAndRootIntersection(target, rootRect);\n var newEntry = item.entry = new IntersectionObserverEntry({\n time: now(),\n target: target,\n boundingClientRect: targetRect,\n rootBounds: rootRect,\n intersectionRect: intersectionRect\n });\n if (!oldEntry) {\n this._queuedEntries.push(newEntry);\n } else if (rootIsInDom && rootContainsTarget) {\n // If the new entry intersection ratio has crossed any of the\n // thresholds, add a new entry.\n if (this._hasCrossedThreshold(oldEntry, newEntry)) {\n this._queuedEntries.push(newEntry);\n }\n } else {\n // If the root is not in the DOM or target is not contained within\n // root but the previous entry for this target had an intersection,\n // add a new record indicating removal.\n if (oldEntry && oldEntry.isIntersecting) {\n this._queuedEntries.push(newEntry);\n }\n }\n }, this);\n if (this._queuedEntries.length) {\n this._callback(this.takeRecords(), this);\n }\n };\n\n /**\n * Accepts a target and root rect computes the intersection between then\n * following the algorithm in the spec.\n * TODO(philipwalton): at this time clip-path is not considered.\n * https://w3c.github.io/IntersectionObserver/#calculate-intersection-rect-algo\n * @param {Element} target The target DOM element\n * @param {Object} rootRect The bounding rect of the root after being\n * expanded by the rootMargin value.\n * @return {?Object} The final intersection rect object or undefined if no\n * intersection is found.\n * @private\n */\n IntersectionObserver.prototype._computeTargetAndRootIntersection = function (target, rootRect) {\n // If the element isn't displayed, an intersection can't happen.\n if (window.getComputedStyle(target).display == 'none') return;\n var targetRect = getBoundingClientRect(target);\n var intersectionRect = targetRect;\n var parent = getParentNode(target);\n var atRoot = false;\n while (!atRoot) {\n var parentRect = null;\n var parentComputedStyle = parent.nodeType == 1 ? window.getComputedStyle(parent) : {};\n\n // If the parent isn't displayed, an intersection can't happen.\n if (parentComputedStyle.display == 'none') return;\n if (parent == this.root || parent == document) {\n atRoot = true;\n parentRect = rootRect;\n } else {\n // If the element has a non-visible overflow, and it's not the \n // or element, update the intersection rect.\n // Note: and cannot be clipped to a rect that's not also\n // the document rect, so no need to compute a new intersection.\n if (parent != document.body && parent != document.documentElement && parentComputedStyle.overflow != 'visible') {\n parentRect = getBoundingClientRect(parent);\n }\n }\n\n // If either of the above conditionals set a new parentRect,\n // calculate new intersection data.\n if (parentRect) {\n intersectionRect = computeRectIntersection(parentRect, intersectionRect);\n if (!intersectionRect) break;\n }\n parent = getParentNode(parent);\n }\n return intersectionRect;\n };\n\n /**\n * Returns the root rect after being expanded by the rootMargin value.\n * @return {Object} The expanded root rect.\n * @private\n */\n IntersectionObserver.prototype._getRootRect = function () {\n var rootRect;\n if (this.root) {\n rootRect = getBoundingClientRect(this.root);\n } else {\n // Use / instead of window since scroll bars affect size.\n var html = document.documentElement;\n var body = document.body;\n rootRect = {\n top: 0,\n left: 0,\n right: html.clientWidth || body.clientWidth,\n width: html.clientWidth || body.clientWidth,\n bottom: html.clientHeight || body.clientHeight,\n height: html.clientHeight || body.clientHeight\n };\n }\n return this._expandRectByRootMargin(rootRect);\n };\n\n /**\n * Accepts a rect and expands it by the rootMargin value.\n * @param {Object} rect The rect object to expand.\n * @return {Object} The expanded rect.\n * @private\n */\n IntersectionObserver.prototype._expandRectByRootMargin = function (rect) {\n var margins = this._rootMarginValues.map(function (margin, i) {\n return margin.unit == 'px' ? margin.value : margin.value * (i % 2 ? rect.width : rect.height) / 100;\n });\n var newRect = {\n top: rect.top - margins[0],\n right: rect.right + margins[1],\n bottom: rect.bottom + margins[2],\n left: rect.left - margins[3]\n };\n newRect.width = newRect.right - newRect.left;\n newRect.height = newRect.bottom - newRect.top;\n return newRect;\n };\n\n /**\n * Accepts an old and new entry and returns true if at least one of the\n * threshold values has been crossed.\n * @param {?IntersectionObserverEntry} oldEntry The previous entry for a\n * particular target element or null if no previous entry exists.\n * @param {IntersectionObserverEntry} newEntry The current entry for a\n * particular target element.\n * @return {boolean} Returns true if a any threshold has been crossed.\n * @private\n */\n IntersectionObserver.prototype._hasCrossedThreshold = function (oldEntry, newEntry) {\n // To make comparing easier, an entry that has a ratio of 0\n // but does not actually intersect is given a value of -1\n var oldRatio = oldEntry && oldEntry.isIntersecting ? oldEntry.intersectionRatio || 0 : -1;\n var newRatio = newEntry.isIntersecting ? newEntry.intersectionRatio || 0 : -1;\n\n // Ignore unchanged ratios\n if (oldRatio === newRatio) return;\n for (var i = 0; i < this.thresholds.length; i++) {\n var threshold = this.thresholds[i];\n\n // Return true if an entry matches a threshold or if the new ratio\n // and the old ratio are on the opposite sides of a threshold.\n if (threshold == oldRatio || threshold == newRatio || threshold < oldRatio !== threshold < newRatio) {\n return true;\n }\n }\n };\n\n /**\n * Returns whether or not the root element is an element and is in the DOM.\n * @return {boolean} True if the root element is an element and is in the DOM.\n * @private\n */\n IntersectionObserver.prototype._rootIsInDom = function () {\n return !this.root || containsDeep(document, this.root);\n };\n\n /**\n * Returns whether or not the target element is a child of root.\n * @param {Element} target The target element to check.\n * @return {boolean} True if the target element is a child of root.\n * @private\n */\n IntersectionObserver.prototype._rootContainsTarget = function (target) {\n return containsDeep(this.root || document, target);\n };\n\n /**\n * Adds the instance to the global IntersectionObserver registry if it isn't\n * already present.\n * @private\n */\n IntersectionObserver.prototype._registerInstance = function () {\n if (registry.indexOf(this) < 0) {\n registry.push(this);\n }\n };\n\n /**\n * Removes the instance from the global IntersectionObserver registry.\n * @private\n */\n IntersectionObserver.prototype._unregisterInstance = function () {\n var index = registry.indexOf(this);\n if (index != -1) registry.splice(index, 1);\n };\n\n /**\n * Returns the result of the performance.now() method or null in browsers\n * that don't support the API.\n * @return {number} The elapsed time since the page was requested.\n */\n function now() {\n return window.performance && performance.now && performance.now();\n }\n\n /**\n * Throttles a function and delays its execution, so it's only called at most\n * once within a given time period.\n * @param {Function} fn The function to throttle.\n * @param {number} timeout The amount of time that must pass before the\n * function can be called again.\n * @return {Function} The throttled function.\n */\n function throttle(fn, timeout) {\n var timer = null;\n return function () {\n if (!timer) {\n timer = setTimeout(function () {\n fn();\n timer = null;\n }, timeout);\n }\n };\n }\n\n /**\n * Adds an event handler to a DOM node ensuring cross-browser compatibility.\n * @param {Node} node The DOM node to add the event handler to.\n * @param {string} event The event name.\n * @param {Function} fn The event handler to add.\n * @param {boolean} opt_useCapture Optionally adds the even to the capture\n * phase. Note: this only works in modern browsers.\n */\n function addEvent(node, event, fn, opt_useCapture) {\n if (typeof node.addEventListener == 'function') {\n node.addEventListener(event, fn, opt_useCapture || false);\n } else if (typeof node.attachEvent == 'function') {\n node.attachEvent('on' + event, fn);\n }\n }\n\n /**\n * Removes a previously added event handler from a DOM node.\n * @param {Node} node The DOM node to remove the event handler from.\n * @param {string} event The event name.\n * @param {Function} fn The event handler to remove.\n * @param {boolean} opt_useCapture If the event handler was added with this\n * flag set to true, it should be set to true here in order to remove it.\n */\n function removeEvent(node, event, fn, opt_useCapture) {\n if (typeof node.removeEventListener == 'function') {\n node.removeEventListener(event, fn, opt_useCapture || false);\n } else if (typeof node.detatchEvent == 'function') {\n node.detatchEvent('on' + event, fn);\n }\n }\n\n /**\n * Returns the intersection between two rect objects.\n * @param {Object} rect1 The first rect.\n * @param {Object} rect2 The second rect.\n * @return {?Object} The intersection rect or undefined if no intersection\n * is found.\n */\n function computeRectIntersection(rect1, rect2) {\n var top = Math.max(rect1.top, rect2.top);\n var bottom = Math.min(rect1.bottom, rect2.bottom);\n var left = Math.max(rect1.left, rect2.left);\n var right = Math.min(rect1.right, rect2.right);\n var width = right - left;\n var height = bottom - top;\n return width >= 0 && height >= 0 && {\n top: top,\n bottom: bottom,\n left: left,\n right: right,\n width: width,\n height: height\n };\n }\n\n /**\n * Shims the native getBoundingClientRect for compatibility with older IE.\n * @param {Element} el The element whose bounding rect to get.\n * @return {Object} The (possibly shimmed) rect of the element.\n */\n function getBoundingClientRect(el) {\n var rect;\n try {\n rect = el.getBoundingClientRect();\n } catch (err) {\n // Ignore Windows 7 IE11 \"Unspecified error\"\n // https://github.com/w3c/IntersectionObserver/pull/205\n }\n if (!rect) return getEmptyRect();\n\n // Older IE\n if (!(rect.width && rect.height)) {\n rect = {\n top: rect.top,\n right: rect.right,\n bottom: rect.bottom,\n left: rect.left,\n width: rect.right - rect.left,\n height: rect.bottom - rect.top\n };\n }\n return rect;\n }\n\n /**\n * Returns an empty rect object. An empty rect is returned when an element\n * is not in the DOM.\n * @return {Object} The empty rect.\n */\n function getEmptyRect() {\n return {\n top: 0,\n bottom: 0,\n left: 0,\n right: 0,\n width: 0,\n height: 0\n };\n }\n\n /**\n * Checks to see if a parent element contains a child element (including inside\n * shadow DOM).\n * @param {Node} parent The parent element.\n * @param {Node} child The child element.\n * @return {boolean} True if the parent node contains the child node.\n */\n function containsDeep(parent, child) {\n var node = child;\n while (node) {\n if (node == parent) return true;\n node = getParentNode(node);\n }\n return false;\n }\n\n /**\n * Gets the parent node of an element or its host element if the parent node\n * is a shadow root.\n * @param {Node} node The node whose parent to get.\n * @return {Node|null} The parent node or null if no parent exists.\n */\n function getParentNode(node) {\n var parent = node.parentNode;\n if (parent && parent.nodeType == 11 && parent.host) {\n // If the parent is a shadow root, return the host element.\n return parent.host;\n }\n return parent;\n }\n\n // Exposes the constructors globally.\n window.IntersectionObserver = IntersectionObserver;\n window.IntersectionObserverEntry = IntersectionObserverEntry;\n})(window, document);","module.exports = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar hasOwn = require('../internals/has-own-property');\n\nvar FunctionPrototype = Function.prototype;\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar getDescriptor = DESCRIPTORS && Object.getOwnPropertyDescriptor;\n\nvar EXISTS = hasOwn(FunctionPrototype, 'name');\n// additional protection from minified / mangled / dropped function names\nvar PROPER = EXISTS && (function something() { /* empty */ }).name === 'something';\nvar CONFIGURABLE = EXISTS && (!DESCRIPTORS || (DESCRIPTORS && getDescriptor(FunctionPrototype, 'name').configurable));\n\nmodule.exports = {\n EXISTS: EXISTS,\n PROPER: PROPER,\n CONFIGURABLE: CONFIGURABLE\n};\n","var global = require('../internals/global');\n\n// eslint-disable-next-line es/no-object-defineproperty -- safe\nvar defineProperty = Object.defineProperty;\n\nmodule.exports = function (key, value) {\n try {\n defineProperty(global, key, { value: value, configurable: true, writable: true });\n } catch (error) {\n global[key] = value;\n } return value;\n};\n","var classof = require('../internals/classof-raw');\n\nmodule.exports = typeof process != 'undefined' && classof(process) == 'process';\n","\"use strict\";\n\nmodule.exports = Object.assign;","var _extends = Object.assign || 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; };\n\nfunction _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/* eslint-disable jsx-a11y/anchor-has-content */\nimport React, { useContext } from \"react\";\nimport PropTypes from \"prop-types\";\nimport invariant from \"invariant\";\nimport createContext from \"create-react-context\";\nimport { polyfill } from \"react-lifecycles-compat\";\nimport { startsWith, pick, resolve, match, insertParams, validateRedirect, shallowCompare } from \"./lib/utils\";\nimport { globalHistory, navigate, createHistory, createMemorySource } from \"./lib/history\";\n\n////////////////////////////////////////////////////////////////////////////////\n\nvar createNamedContext = function createNamedContext(name, defaultValue) {\n var Ctx = createContext(defaultValue);\n Ctx.displayName = name;\n return Ctx;\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// Location Context/Provider\nvar LocationContext = createNamedContext(\"Location\");\n\n// sets up a listener if there isn't one already so apps don't need to be\n// wrapped in some top level provider\nvar Location = function Location(_ref) {\n var children = _ref.children;\n return React.createElement(\n LocationContext.Consumer,\n null,\n function (context) {\n return context ? children(context) : React.createElement(\n LocationProvider,\n null,\n children\n );\n }\n );\n};\n\nvar LocationProvider = function (_React$Component) {\n _inherits(LocationProvider, _React$Component);\n\n function LocationProvider() {\n var _temp, _this, _ret;\n\n _classCallCheck(this, LocationProvider);\n\n for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return _ret = (_temp = (_this = _possibleConstructorReturn(this, _React$Component.call.apply(_React$Component, [this].concat(args))), _this), _this.state = {\n context: _this.getContext(),\n refs: { unlisten: null }\n }, _temp), _possibleConstructorReturn(_this, _ret);\n }\n\n LocationProvider.prototype.getContext = function getContext() {\n var _props$history = this.props.history,\n navigate = _props$history.navigate,\n location = _props$history.location;\n\n return { navigate: navigate, location: location };\n };\n\n LocationProvider.prototype.componentDidCatch = function componentDidCatch(error, info) {\n if (isRedirect(error)) {\n var _navigate = this.props.history.navigate;\n\n _navigate(error.uri, { replace: true });\n } else {\n throw error;\n }\n };\n\n LocationProvider.prototype.componentDidUpdate = function componentDidUpdate(prevProps, prevState) {\n if (prevState.context.location !== this.state.context.location) {\n this.props.history._onTransitionComplete();\n }\n };\n\n LocationProvider.prototype.componentDidMount = function componentDidMount() {\n var _this2 = this;\n\n var refs = this.state.refs,\n history = this.props.history;\n\n history._onTransitionComplete();\n refs.unlisten = history.listen(function () {\n Promise.resolve().then(function () {\n // TODO: replace rAF with react deferred update API when it's ready https://github.com/facebook/react/issues/13306\n requestAnimationFrame(function () {\n if (!_this2.unmounted) {\n _this2.setState(function () {\n return { context: _this2.getContext() };\n });\n }\n });\n });\n });\n };\n\n LocationProvider.prototype.componentWillUnmount = function componentWillUnmount() {\n var refs = this.state.refs;\n\n this.unmounted = true;\n refs.unlisten();\n };\n\n LocationProvider.prototype.render = function render() {\n var context = this.state.context,\n children = this.props.children;\n\n return React.createElement(\n LocationContext.Provider,\n { value: context },\n typeof children === \"function\" ? children(context) : children || null\n );\n };\n\n return LocationProvider;\n}(React.Component);\n\n////////////////////////////////////////////////////////////////////////////////\n\n\nLocationProvider.defaultProps = {\n history: globalHistory\n};\nprocess.env.NODE_ENV !== \"production\" ? LocationProvider.propTypes = {\n history: PropTypes.object.isRequired\n} : void 0;\nvar ServerLocation = function ServerLocation(_ref2) {\n var url = _ref2.url,\n children = _ref2.children;\n\n var searchIndex = url.indexOf(\"?\");\n var searchExists = searchIndex > -1;\n var pathname = void 0;\n var search = \"\";\n var hash = \"\";\n\n if (searchExists) {\n pathname = url.substring(0, searchIndex);\n search = url.substring(searchIndex);\n } else {\n pathname = url;\n }\n\n return React.createElement(\n LocationContext.Provider,\n {\n value: {\n location: {\n pathname: pathname,\n search: search,\n hash: hash\n },\n navigate: function navigate() {\n throw new Error(\"You can't call navigate on the server.\");\n }\n }\n },\n children\n );\n};\n////////////////////////////////////////////////////////////////////////////////\n// Sets baseuri and basepath for nested routers and links\nvar BaseContext = createNamedContext(\"Base\", { baseuri: \"/\", basepath: \"/\" });\n\n////////////////////////////////////////////////////////////////////////////////\n// The main event, welcome to the show everybody.\nvar Router = function Router(props) {\n return React.createElement(\n BaseContext.Consumer,\n null,\n function (baseContext) {\n return React.createElement(\n Location,\n null,\n function (locationContext) {\n return React.createElement(RouterImpl, _extends({}, baseContext, locationContext, props));\n }\n );\n }\n );\n};\n\nvar RouterImpl = function (_React$PureComponent) {\n _inherits(RouterImpl, _React$PureComponent);\n\n function RouterImpl() {\n _classCallCheck(this, RouterImpl);\n\n return _possibleConstructorReturn(this, _React$PureComponent.apply(this, arguments));\n }\n\n RouterImpl.prototype.render = function render() {\n var _props = this.props,\n location = _props.location,\n _navigate2 = _props.navigate,\n basepath = _props.basepath,\n primary = _props.primary,\n children = _props.children,\n baseuri = _props.baseuri,\n _props$component = _props.component,\n component = _props$component === undefined ? \"div\" : _props$component,\n domProps = _objectWithoutProperties(_props, [\"location\", \"navigate\", \"basepath\", \"primary\", \"children\", \"baseuri\", \"component\"]);\n\n var routes = React.Children.toArray(children).reduce(function (array, child) {\n var routes = createRoute(basepath)(child);\n return array.concat(routes);\n }, []);\n var pathname = location.pathname;\n\n\n var match = pick(routes, pathname);\n\n if (match) {\n var params = match.params,\n uri = match.uri,\n route = match.route,\n element = match.route.value;\n\n // remove the /* from the end for child routes relative paths\n\n basepath = route.default ? basepath : route.path.replace(/\\*$/, \"\");\n\n var props = _extends({}, params, {\n uri: uri,\n location: location,\n navigate: function navigate(to, options) {\n return _navigate2(resolve(to, uri), options);\n }\n });\n\n var clone = React.cloneElement(element, props, element.props.children ? React.createElement(\n Router,\n { location: location, primary: primary },\n element.props.children\n ) : undefined);\n\n // using 'div' for < 16.3 support\n var FocusWrapper = primary ? FocusHandler : component;\n // don't pass any props to 'div'\n var wrapperProps = primary ? _extends({ uri: uri, location: location, component: component }, domProps) : domProps;\n\n return React.createElement(\n BaseContext.Provider,\n { value: { baseuri: uri, basepath: basepath } },\n React.createElement(\n FocusWrapper,\n wrapperProps,\n clone\n )\n );\n } else {\n // Not sure if we want this, would require index routes at every level\n // warning(\n // false,\n // `\\n\\nNothing matched:\\n\\t${\n // location.pathname\n // }\\n\\nPaths checked: \\n\\t${routes\n // .map(route => route.path)\n // .join(\n // \"\\n\\t\"\n // )}\\n\\nTo get rid of this warning, add a default NotFound component as child of Router:\n // \\n\\tlet NotFound = () =>
Not Found!
\n // \\n\\t\\n\\t \\n\\t {/* ... */}\\n\\t`\n // );\n return null;\n }\n };\n\n return RouterImpl;\n}(React.PureComponent);\n\nRouterImpl.defaultProps = {\n primary: true\n};\n\n\nvar FocusContext = createNamedContext(\"Focus\");\n\nvar FocusHandler = function FocusHandler(_ref3) {\n var uri = _ref3.uri,\n location = _ref3.location,\n component = _ref3.component,\n domProps = _objectWithoutProperties(_ref3, [\"uri\", \"location\", \"component\"]);\n\n return React.createElement(\n FocusContext.Consumer,\n null,\n function (requestFocus) {\n return React.createElement(FocusHandlerImpl, _extends({}, domProps, {\n component: component,\n requestFocus: requestFocus,\n uri: uri,\n location: location\n }));\n }\n );\n};\n\n// don't focus on initial render\nvar initialRender = true;\nvar focusHandlerCount = 0;\n\nvar FocusHandlerImpl = function (_React$Component2) {\n _inherits(FocusHandlerImpl, _React$Component2);\n\n function FocusHandlerImpl() {\n var _temp2, _this4, _ret2;\n\n _classCallCheck(this, FocusHandlerImpl);\n\n for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {\n args[_key2] = arguments[_key2];\n }\n\n return _ret2 = (_temp2 = (_this4 = _possibleConstructorReturn(this, _React$Component2.call.apply(_React$Component2, [this].concat(args))), _this4), _this4.state = {}, _this4.requestFocus = function (node) {\n if (!_this4.state.shouldFocus && node) {\n node.focus();\n }\n }, _temp2), _possibleConstructorReturn(_this4, _ret2);\n }\n\n FocusHandlerImpl.getDerivedStateFromProps = function getDerivedStateFromProps(nextProps, prevState) {\n var initial = prevState.uri == null;\n if (initial) {\n return _extends({\n shouldFocus: true\n }, nextProps);\n } else {\n var myURIChanged = nextProps.uri !== prevState.uri;\n var navigatedUpToMe = prevState.location.pathname !== nextProps.location.pathname && nextProps.location.pathname === nextProps.uri;\n return _extends({\n shouldFocus: myURIChanged || navigatedUpToMe\n }, nextProps);\n }\n };\n\n FocusHandlerImpl.prototype.componentDidMount = function componentDidMount() {\n focusHandlerCount++;\n this.focus();\n };\n\n FocusHandlerImpl.prototype.componentWillUnmount = function componentWillUnmount() {\n focusHandlerCount--;\n if (focusHandlerCount === 0) {\n initialRender = true;\n }\n };\n\n FocusHandlerImpl.prototype.componentDidUpdate = function componentDidUpdate(prevProps, prevState) {\n if (prevProps.location !== this.props.location && this.state.shouldFocus) {\n this.focus();\n }\n };\n\n FocusHandlerImpl.prototype.focus = function focus() {\n if (process.env.NODE_ENV === \"test\") {\n // getting cannot read property focus of null in the tests\n // and that bit of global `initialRender` state causes problems\n // should probably figure it out!\n return;\n }\n\n var requestFocus = this.props.requestFocus;\n\n\n if (requestFocus) {\n requestFocus(this.node);\n } else {\n if (initialRender) {\n initialRender = false;\n } else if (this.node) {\n // React polyfills [autofocus] and it fires earlier than cDM,\n // so we were stealing focus away, this line prevents that.\n if (!this.node.contains(document.activeElement)) {\n this.node.focus();\n }\n }\n }\n };\n\n FocusHandlerImpl.prototype.render = function render() {\n var _this5 = this;\n\n var _props2 = this.props,\n children = _props2.children,\n style = _props2.style,\n requestFocus = _props2.requestFocus,\n _props2$component = _props2.component,\n Comp = _props2$component === undefined ? \"div\" : _props2$component,\n uri = _props2.uri,\n location = _props2.location,\n domProps = _objectWithoutProperties(_props2, [\"children\", \"style\", \"requestFocus\", \"component\", \"uri\", \"location\"]);\n\n return React.createElement(\n Comp,\n _extends({\n style: _extends({ outline: \"none\" }, style),\n tabIndex: \"-1\",\n ref: function ref(n) {\n return _this5.node = n;\n }\n }, domProps),\n React.createElement(\n FocusContext.Provider,\n { value: this.requestFocus },\n this.props.children\n )\n );\n };\n\n return FocusHandlerImpl;\n}(React.Component);\n\npolyfill(FocusHandlerImpl);\n\nvar k = function k() {};\n\n////////////////////////////////////////////////////////////////////////////////\nvar forwardRef = React.forwardRef;\n\nif (typeof forwardRef === \"undefined\") {\n forwardRef = function forwardRef(C) {\n return C;\n };\n}\n\nvar Link = forwardRef(function (_ref4, ref) {\n var innerRef = _ref4.innerRef,\n props = _objectWithoutProperties(_ref4, [\"innerRef\"]);\n\n return React.createElement(\n BaseContext.Consumer,\n null,\n function (_ref5) {\n var basepath = _ref5.basepath,\n baseuri = _ref5.baseuri;\n return React.createElement(\n Location,\n null,\n function (_ref6) {\n var location = _ref6.location,\n navigate = _ref6.navigate;\n\n var to = props.to,\n state = props.state,\n replace = props.replace,\n _props$getProps = props.getProps,\n getProps = _props$getProps === undefined ? k : _props$getProps,\n anchorProps = _objectWithoutProperties(props, [\"to\", \"state\", \"replace\", \"getProps\"]);\n\n var href = resolve(to, baseuri);\n var encodedHref = encodeURI(href);\n var isCurrent = location.pathname === encodedHref;\n var isPartiallyCurrent = startsWith(location.pathname, encodedHref);\n\n return React.createElement(\"a\", _extends({\n ref: ref || innerRef,\n \"aria-current\": isCurrent ? \"page\" : undefined\n }, anchorProps, getProps({ isCurrent: isCurrent, isPartiallyCurrent: isPartiallyCurrent, href: href, location: location }), {\n href: href,\n onClick: function onClick(event) {\n if (anchorProps.onClick) anchorProps.onClick(event);\n if (shouldNavigate(event)) {\n event.preventDefault();\n var shouldReplace = replace;\n if (typeof replace !== \"boolean\" && isCurrent) {\n var _location$state = _extends({}, location.state),\n key = _location$state.key,\n restState = _objectWithoutProperties(_location$state, [\"key\"]);\n\n shouldReplace = shallowCompare(_extends({}, state), restState);\n }\n navigate(href, {\n state: state,\n replace: shouldReplace\n });\n }\n }\n }));\n }\n );\n }\n );\n});\n\nLink.displayName = \"Link\";\n\nprocess.env.NODE_ENV !== \"production\" ? Link.propTypes = {\n to: PropTypes.string.isRequired\n} : void 0;\n\n////////////////////////////////////////////////////////////////////////////////\nfunction RedirectRequest(uri) {\n this.uri = uri;\n}\n\nvar isRedirect = function isRedirect(o) {\n return o instanceof RedirectRequest;\n};\n\nvar redirectTo = function redirectTo(to) {\n throw new RedirectRequest(to);\n};\n\nvar RedirectImpl = function (_React$Component3) {\n _inherits(RedirectImpl, _React$Component3);\n\n function RedirectImpl() {\n _classCallCheck(this, RedirectImpl);\n\n return _possibleConstructorReturn(this, _React$Component3.apply(this, arguments));\n }\n\n // Support React < 16 with this hook\n RedirectImpl.prototype.componentDidMount = function componentDidMount() {\n var _props3 = this.props,\n navigate = _props3.navigate,\n to = _props3.to,\n from = _props3.from,\n _props3$replace = _props3.replace,\n replace = _props3$replace === undefined ? true : _props3$replace,\n state = _props3.state,\n noThrow = _props3.noThrow,\n baseuri = _props3.baseuri,\n props = _objectWithoutProperties(_props3, [\"navigate\", \"to\", \"from\", \"replace\", \"state\", \"noThrow\", \"baseuri\"]);\n\n Promise.resolve().then(function () {\n var resolvedTo = resolve(to, baseuri);\n navigate(insertParams(resolvedTo, props), { replace: replace, state: state });\n });\n };\n\n RedirectImpl.prototype.render = function render() {\n var _props4 = this.props,\n navigate = _props4.navigate,\n to = _props4.to,\n from = _props4.from,\n replace = _props4.replace,\n state = _props4.state,\n noThrow = _props4.noThrow,\n baseuri = _props4.baseuri,\n props = _objectWithoutProperties(_props4, [\"navigate\", \"to\", \"from\", \"replace\", \"state\", \"noThrow\", \"baseuri\"]);\n\n var resolvedTo = resolve(to, baseuri);\n if (!noThrow) redirectTo(insertParams(resolvedTo, props));\n return null;\n };\n\n return RedirectImpl;\n}(React.Component);\n\nvar Redirect = function Redirect(props) {\n return React.createElement(\n BaseContext.Consumer,\n null,\n function (_ref7) {\n var baseuri = _ref7.baseuri;\n return React.createElement(\n Location,\n null,\n function (locationContext) {\n return React.createElement(RedirectImpl, _extends({}, locationContext, { baseuri: baseuri }, props));\n }\n );\n }\n );\n};\n\nprocess.env.NODE_ENV !== \"production\" ? Redirect.propTypes = {\n from: PropTypes.string,\n to: PropTypes.string.isRequired\n} : void 0;\n\n////////////////////////////////////////////////////////////////////////////////\nvar Match = function Match(_ref8) {\n var path = _ref8.path,\n children = _ref8.children;\n return React.createElement(\n BaseContext.Consumer,\n null,\n function (_ref9) {\n var baseuri = _ref9.baseuri;\n return React.createElement(\n Location,\n null,\n function (_ref10) {\n var navigate = _ref10.navigate,\n location = _ref10.location;\n\n var resolvedPath = resolve(path, baseuri);\n var result = match(resolvedPath, location.pathname);\n return children({\n navigate: navigate,\n location: location,\n match: result ? _extends({}, result.params, {\n uri: result.uri,\n path: path\n }) : null\n });\n }\n );\n }\n );\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// Hooks\n\nvar useLocation = function useLocation() {\n var context = useContext(LocationContext);\n\n if (!context) {\n throw new Error(\"useLocation hook was used but a LocationContext.Provider was not found in the parent tree. Make sure this is used in a component that is a child of Router\");\n }\n\n return context.location;\n};\n\nvar useNavigate = function useNavigate() {\n var context = useContext(LocationContext);\n\n if (!context) {\n throw new Error(\"useNavigate hook was used but a LocationContext.Provider was not found in the parent tree. Make sure this is used in a component that is a child of Router\");\n }\n\n return context.navigate;\n};\n\nvar useParams = function useParams() {\n var context = useContext(BaseContext);\n\n if (!context) {\n throw new Error(\"useParams hook was used but a LocationContext.Provider was not found in the parent tree. Make sure this is used in a component that is a child of Router\");\n }\n\n var location = useLocation();\n\n var results = match(context.basepath, location.pathname);\n\n return results ? results.params : null;\n};\n\nvar useMatch = function useMatch(path) {\n if (!path) {\n throw new Error(\"useMatch(path: string) requires an argument of a string to match against\");\n }\n var context = useContext(BaseContext);\n\n if (!context) {\n throw new Error(\"useMatch hook was used but a LocationContext.Provider was not found in the parent tree. Make sure this is used in a component that is a child of Router\");\n }\n\n var location = useLocation();\n\n var resolvedPath = resolve(path, context.baseuri);\n var result = match(resolvedPath, location.pathname);\n return result ? _extends({}, result.params, {\n uri: result.uri,\n path: path\n }) : null;\n};\n\n////////////////////////////////////////////////////////////////////////////////\n// Junk\nvar stripSlashes = function stripSlashes(str) {\n return str.replace(/(^\\/+|\\/+$)/g, \"\");\n};\n\nvar createRoute = function createRoute(basepath) {\n return function (element) {\n if (!element) {\n return null;\n }\n\n if (element.type === React.Fragment && element.props.children) {\n return React.Children.map(element.props.children, createRoute(basepath));\n }\n !(element.props.path || element.props.default || element.type === Redirect) ? process.env.NODE_ENV !== \"production\" ? invariant(false, \": Children of must have a `path` or `default` prop, or be a ``. None found on element type `\" + element.type + \"`\") : invariant(false) : void 0;\n\n !!(element.type === Redirect && (!element.props.from || !element.props.to)) ? process.env.NODE_ENV !== \"production\" ? invariant(false, \" requires both \\\"from\\\" and \\\"to\\\" props when inside a .\") : invariant(false) : void 0;\n\n !!(element.type === Redirect && !validateRedirect(element.props.from, element.props.to)) ? process.env.NODE_ENV !== \"production\" ? invariant(false, \" has mismatched dynamic segments, ensure both paths have the exact same dynamic segments.\") : invariant(false) : void 0;\n\n if (element.props.default) {\n return { value: element, default: true };\n }\n\n var elementPath = element.type === Redirect ? element.props.from : element.props.path;\n\n var path = elementPath === \"/\" ? basepath : stripSlashes(basepath) + \"/\" + stripSlashes(elementPath);\n\n return {\n value: element,\n default: element.props.default,\n path: element.props.children ? stripSlashes(path) + \"/*\" : path\n };\n };\n};\n\nvar shouldNavigate = function shouldNavigate(event) {\n return !event.defaultPrevented && event.button === 0 && !(event.metaKey || event.altKey || event.ctrlKey || event.shiftKey);\n};\n\n////////////////////////////////////////////////////////////////////////\nexport { Link, Location, LocationProvider, Match, Redirect, Router, ServerLocation, createHistory, createMemorySource, isRedirect, navigate, redirectTo, globalHistory, match as matchPath, useLocation, useNavigate, useParams, useMatch , BaseContext };","var NATIVE_WEAK_MAP = require('../internals/weak-map-basic-detection');\nvar global = require('../internals/global');\nvar isObject = require('../internals/is-object');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar hasOwn = require('../internals/has-own-property');\nvar shared = require('../internals/shared-store');\nvar sharedKey = require('../internals/shared-key');\nvar hiddenKeys = require('../internals/hidden-keys');\n\nvar OBJECT_ALREADY_INITIALIZED = 'Object already initialized';\nvar TypeError = global.TypeError;\nvar WeakMap = global.WeakMap;\nvar set, get, has;\n\nvar enforce = function (it) {\n return has(it) ? get(it) : set(it, {});\n};\n\nvar getterFor = function (TYPE) {\n return function (it) {\n var state;\n if (!isObject(it) || (state = get(it)).type !== TYPE) {\n throw TypeError('Incompatible receiver, ' + TYPE + ' required');\n } return state;\n };\n};\n\nif (NATIVE_WEAK_MAP || shared.state) {\n var store = shared.state || (shared.state = new WeakMap());\n /* eslint-disable no-self-assign -- prototype methods protection */\n store.get = store.get;\n store.has = store.has;\n store.set = store.set;\n /* eslint-enable no-self-assign -- prototype methods protection */\n set = function (it, metadata) {\n if (store.has(it)) throw TypeError(OBJECT_ALREADY_INITIALIZED);\n metadata.facade = it;\n store.set(it, metadata);\n return metadata;\n };\n get = function (it) {\n return store.get(it) || {};\n };\n has = function (it) {\n return store.has(it);\n };\n} else {\n var STATE = sharedKey('state');\n hiddenKeys[STATE] = true;\n set = function (it, metadata) {\n if (hasOwn(it, STATE)) throw TypeError(OBJECT_ALREADY_INITIALIZED);\n metadata.facade = it;\n createNonEnumerableProperty(it, STATE, metadata);\n return metadata;\n };\n get = function (it) {\n return hasOwn(it, STATE) ? it[STATE] : {};\n };\n has = function (it) {\n return hasOwn(it, STATE);\n };\n}\n\nmodule.exports = {\n set: set,\n get: get,\n has: has,\n enforce: enforce,\n getterFor: getterFor\n};\n","/*!\n * Performance Observer Polyfill\n * Version: 1.1.1\n * https://github.com/fastly/performance-observer-polyfill\n * \n * Copyright (c) 2020, Fastly, Inc. All rights reserved.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n * \n */\n!function (e, t) {\n \"object\" == typeof exports && \"object\" == typeof module ? module.exports = t() : \"function\" == typeof define && define.amd ? define([], t) : \"object\" == typeof exports ? exports.PerformanceOberserverPolyfill = t() : e.PerformanceOberserverPolyfill = t();\n}(this, function () {\n return function (e) {\n var t = {};\n function r(n) {\n if (t[n]) return t[n].exports;\n var o = t[n] = {\n i: n,\n l: !1,\n exports: {}\n };\n return e[n].call(o.exports, o, o.exports, r), o.l = !0, o.exports;\n }\n return r.m = e, r.c = t, r.d = function (e, t, n) {\n r.o(e, t) || Object.defineProperty(e, t, {\n enumerable: !0,\n get: n\n });\n }, r.r = function (e) {\n \"undefined\" != typeof Symbol && Symbol.toStringTag && Object.defineProperty(e, Symbol.toStringTag, {\n value: \"Module\"\n }), Object.defineProperty(e, \"__esModule\", {\n value: !0\n });\n }, r.t = function (e, t) {\n if (1 & t && (e = r(e)), 8 & t) return e;\n if (4 & t && \"object\" == typeof e && e && e.__esModule) return e;\n var n = Object.create(null);\n if (r.r(n), Object.defineProperty(n, \"default\", {\n enumerable: !0,\n value: e\n }), 2 & t && \"string\" != typeof e) for (var o in e) r.d(n, o, function (t) {\n return e[t];\n }.bind(null, o));\n return n;\n }, r.n = function (e) {\n var t = e && e.__esModule ? function () {\n return e.default;\n } : function () {\n return e;\n };\n return r.d(t, \"a\", t), t;\n }, r.o = function (e, t) {\n return Object.prototype.hasOwnProperty.call(e, t);\n }, r.p = \"\", r(r.s = 0);\n }([function (e, t, r) {\n \"use strict\";\n\n function n(e) {\n return (n = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (e) {\n return typeof e;\n } : function (e) {\n return e && \"function\" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? \"symbol\" : typeof e;\n })(e);\n }\n function o(e) {\n return function (e) {\n if (Array.isArray(e)) {\n for (var t = 0, r = new Array(e.length); t < e.length; t++) r[t] = e[t];\n return r;\n }\n }(e) || function (e) {\n if (Symbol.iterator in Object(e) || \"[object Arguments]\" === Object.prototype.toString.call(e)) return Array.from(e);\n }(e) || function () {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance\");\n }();\n }\n function i(e, t) {\n for (var r = 0; r < t.length; r++) {\n var n = t[r];\n n.enumerable = n.enumerable || !1, n.configurable = !0, \"value\" in n && (n.writable = !0), Object.defineProperty(e, n.key, n);\n }\n }\n function u(e) {\n if (void 0 === e) throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n return e;\n }\n function s(e) {\n var t = \"function\" == typeof Map ? new Map() : void 0;\n return (s = function s(e) {\n if (null === e || (r = e, -1 === Function.toString.call(r).indexOf(\"[native code]\"))) return e;\n var r;\n if (\"function\" != typeof e) throw new TypeError(\"Super expression must either be null or a function\");\n if (void 0 !== t) {\n if (t.has(e)) return t.get(e);\n t.set(e, n);\n }\n function n() {\n return c(e, arguments, f(this).constructor);\n }\n return n.prototype = Object.create(e.prototype, {\n constructor: {\n value: n,\n enumerable: !1,\n writable: !0,\n configurable: !0\n }\n }), a(n, e);\n })(e);\n }\n function c(e, t, r) {\n return (c = function () {\n if (\"undefined\" == typeof Reflect || !Reflect.construct) return !1;\n if (Reflect.construct.sham) return !1;\n if (\"function\" == typeof Proxy) return !0;\n try {\n return Date.prototype.toString.call(Reflect.construct(Date, [], function () {})), !0;\n } catch (e) {\n return !1;\n }\n }() ? Reflect.construct : function (e, t, r) {\n var n = [null];\n n.push.apply(n, t);\n var o = new (Function.bind.apply(e, n))();\n return r && a(o, r.prototype), o;\n }).apply(null, arguments);\n }\n function a(e, t) {\n return (a = Object.setPrototypeOf || function (e, t) {\n return e.__proto__ = t, e;\n })(e, t);\n }\n function f(e) {\n return (f = Object.setPrototypeOf ? Object.getPrototypeOf : function (e) {\n return e.__proto__ || Object.getPrototypeOf(e);\n })(e);\n }\n r.r(t);\n var l = function (e) {\n function t(e) {\n var r, i, s, c, a;\n return function (e, t) {\n if (!(e instanceof t)) throw new TypeError(\"Cannot call a class as a function\");\n }(this, t), i = function (e, t) {\n return !t || \"object\" !== n(t) && \"function\" != typeof t ? u(e) : t;\n }(this, (r = f(t)).call.apply(r, [this].concat(o(e)))), s = u(i), a = void 0, (c = \"_entries\") in s ? Object.defineProperty(s, c, {\n value: a,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }) : s[c] = a, i._entries = e, i;\n }\n var r, s, c;\n return function (e, t) {\n if (\"function\" != typeof t && null !== t) throw new TypeError(\"Super expression must either be null or a function\");\n e.prototype = Object.create(t && t.prototype, {\n constructor: {\n value: e,\n writable: !0,\n configurable: !0\n }\n }), t && a(e, t);\n }(t, e), r = t, (s = [{\n key: \"getEntries\",\n value: function value() {\n return this._entries;\n }\n }, {\n key: \"getEntriesByType\",\n value: function value(e) {\n return this._entries.filter(function (t) {\n return t.entryType === e;\n });\n }\n }, {\n key: \"getEntriesByName\",\n value: function value(e, t) {\n return this._entries.filter(function (t) {\n return t.name === e;\n }).filter(function (e) {\n return !t || e.entryType === t;\n });\n }\n }]) && i(r.prototype, s), c && i(r, c), t;\n }(s(Array));\n function y(e, t) {\n for (var r = 0; r < t.length; r++) {\n var n = t[r];\n n.enumerable = n.enumerable || !1, n.configurable = !0, \"value\" in n && (n.writable = !0), Object.defineProperty(e, n.key, n);\n }\n }\n function p(e, t, r) {\n return t in e ? Object.defineProperty(e, t, {\n value: r,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }) : e[t] = r, e;\n }\n function v(e, t) {\n for (var r = 0; r < t.length; r++) {\n var n = t[r];\n n.enumerable = n.enumerable || !1, n.configurable = !0, \"value\" in n && (n.writable = !0), Object.defineProperty(e, n.key, n);\n }\n }\n function b(e, t, r) {\n return t in e ? Object.defineProperty(e, t, {\n value: r,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }) : e[t] = r, e;\n }\n var d = [\"mark\", \"measure\", \"navigation\", \"resource\"],\n h = \"Failed to execute 'observe' on 'PerformanceObserver': either an 'entryTypes' or 'type' member must be present.\",\n m = \"Failed to execute 'observe' on 'PerformanceObserver': either an 'entryTypes' or 'type' member must be present, not both.\",\n g = \"Aborting 'observe' on 'PerformanceObserver': no valid entry types present in either 'entryTypes' or 'type' member.\",\n O = \"Invalid or unsupported entry types provided to 'observe' on 'PerformanceObserver'.\",\n w = function w(e) {\n return d.some(function (t) {\n return e === t;\n });\n },\n P = new (function () {\n function e() {\n var t = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {},\n r = t.registeredObservers,\n n = void 0 === r ? new Set() : r,\n o = t.processedEntries,\n i = void 0 === o ? new Set() : o,\n u = t.interval,\n s = void 0 === u ? 100 : u,\n c = t.context,\n a = void 0 === c ? self : c;\n !function (e, t) {\n if (!(e instanceof t)) throw new TypeError(\"Cannot call a class as a function\");\n }(this, e), p(this, \"registeredObservers\", void 0), p(this, \"processedEntries\", void 0), p(this, \"interval\", void 0), p(this, \"intervalId\", void 0), p(this, \"context\", void 0), this.registeredObservers = n, this.processedEntries = i, this.interval = s, this.context = a, this.intervalId = null;\n }\n var t, r, n;\n return t = e, (r = [{\n key: \"getNewEntries\",\n value: function value() {\n var e = this;\n return this.context.performance.getEntries().filter(function (t) {\n return !e.processedEntries.has(t);\n });\n }\n }, {\n key: \"getObserversForType\",\n value: function value(e, t) {\n return Array.from(e).filter(function (e) {\n return e.entryTypes.some(function (e) {\n return e === t;\n });\n });\n }\n }, {\n key: \"processBuffer\",\n value: function value(e) {\n var t = Array.from(e.buffer),\n r = new l(t);\n e.buffer.clear(), t.length && e.callback && e.callback.call(void 0, r, e);\n }\n }, {\n key: \"processEntries\",\n value: function value() {\n var e = this;\n this.getNewEntries().forEach(function (t) {\n var r = t.entryType;\n e.getObserversForType(e.registeredObservers, r).forEach(function (e) {\n e.buffer.add(t);\n }), e.processedEntries.add(t);\n });\n var t = function t() {\n return e.registeredObservers.forEach(e.processBuffer);\n };\n \"requestAnimationFrame\" in this.context ? this.context.requestAnimationFrame(t) : this.context.setTimeout(t, 0);\n }\n }, {\n key: \"add\",\n value: function value(e) {\n this.registeredObservers.add(e), 1 === this.registeredObservers.size && this.observe();\n }\n }, {\n key: \"remove\",\n value: function value(e) {\n this.registeredObservers.delete(e), this.registeredObservers.size || this.disconnect();\n }\n }, {\n key: \"observe\",\n value: function value() {\n this.intervalId = this.context.setInterval(this.processEntries.bind(this), this.interval);\n }\n }, {\n key: \"disconnect\",\n value: function value() {\n this.intervalId = this.context.clearInterval(this.intervalId);\n }\n }]) && y(t.prototype, r), n && y(t, n), e;\n }())(),\n k = function () {\n function e(t) {\n var r = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : P;\n !function (e, t) {\n if (!(e instanceof t)) throw new TypeError(\"Cannot call a class as a function\");\n }(this, e), b(this, \"callback\", void 0), b(this, \"buffer\", void 0), b(this, \"entryTypes\", []), b(this, \"taskQueue\", void 0), this.callback = t, this.buffer = new Set(), this.taskQueue = r;\n }\n var t, r, n;\n return t = e, (r = [{\n key: \"observe\",\n value: function value(e) {\n if (!e) throw new Error(h);\n if (e.entryTypes && e.type) throw new Error(m);\n var t;\n if (e.entryTypes) t = e.entryTypes;else {\n if (!e.type) throw new Error(h);\n t = [e.type];\n }\n var r = t.filter(w);\n r.length > 0 && r.length !== t.length && console.warn(O), r.length ? (this.entryTypes = r, this.taskQueue.add(this)) : console.warn(g);\n }\n }, {\n key: \"disconnect\",\n value: function value() {\n this.taskQueue.remove(this);\n }\n }, {\n key: \"takeRecords\",\n value: function value() {\n var e = Array.from(this.buffer);\n return new l(e);\n }\n }]) && v(t.prototype, r), n && v(t, n), e;\n }();\n b(k, \"supportedEntryTypes\", d);\n var E = \"PerformanceObserver\" in self && \"function\" == typeof PerformanceObserver ? PerformanceObserver : k,\n j = self;\n j.PerformanceObserver || (j.PerformanceObserver = E);\n }]);\n});","function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n return (module.exports = _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (obj) {\n return typeof obj;\n } : function (obj) {\n return obj && \"function\" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports), _typeof(obj);\n}\nmodule.exports = _typeof, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","/**\n * Remove a prefix from a string. Return the input string if the given prefix\n * isn't found.\n */\n\nexport default function stripPrefix(str, prefix = ``) {\n if (!prefix) {\n return str\n }\n\n if (str === prefix) {\n return `/`\n }\n\n if (str.startsWith(`${prefix}/`)) {\n return str.slice(prefix.length)\n }\n\n return str\n}\n","// we can't use just `it == null` since of `document.all` special case\n// https://tc39.es/ecma262/#sec-IsHTMLDDA-internal-slot-aec\nmodule.exports = function (it) {\n return it === null || it === undefined;\n};\n","\"use strict\";\n\nexports.__esModule = true;\nexports.parsePath = parsePath;\n\nfunction parsePath(path) {\n var pathname = path || \"/\";\n var search = \"\";\n var hash = \"\";\n var hashIndex = pathname.indexOf(\"#\");\n\n if (hashIndex !== -1) {\n hash = pathname.substr(hashIndex);\n pathname = pathname.substr(0, hashIndex);\n }\n\n var searchIndex = pathname.indexOf(\"?\");\n\n if (searchIndex !== -1) {\n search = pathname.substr(searchIndex);\n pathname = pathname.substr(0, searchIndex);\n }\n\n return {\n pathname: pathname,\n search: search === \"?\" ? \"\" : search,\n hash: hash === \"#\" ? \"\" : hash\n };\n}","// eslint-disable-next-line es/no-object-getownpropertysymbols -- safe\nexports.f = Object.getOwnPropertySymbols;\n","export default function _setPrototypeOf(o, p) {\n _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) {\n o.__proto__ = p;\n return o;\n };\n return _setPrototypeOf(o, p);\n}","import setPrototypeOf from \"./setPrototypeOf.js\";\nexport default function _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n setPrototypeOf(subClass, superClass);\n}","\"use strict\";\n\nexports.registerServiceWorker = function () {\n return true;\n};\n\nvar prefetchedPathnames = [];\n\nexports.onServiceWorkerActive = function (_ref) {\n var getResourceURLsForPathname = _ref.getResourceURLsForPathname,\n serviceWorker = _ref.serviceWorker;\n\n // if the SW has just updated then clear the path dependencies and don't cache\n // stuff, since we're on the old revision until we navigate to another page\n if (window.___swUpdated) {\n serviceWorker.active.postMessage({\n gatsbyApi: \"clearPathResources\"\n });\n return;\n } // grab nodes from head of document\n\n\n var nodes = document.querySelectorAll(\"\\n head > script[src],\\n head > link[href],\\n head > style[data-href]\\n \"); // get all resource URLs\n\n var headerResources = [].slice.call(nodes).map(function (node) {\n return node.src || node.href || node.getAttribute(\"data-href\");\n }); // Loop over prefetched pages and add their resources to an array,\n // plus specify which resources are required for those paths.\n\n var prefetchedResources = [];\n prefetchedPathnames.forEach(function (path) {\n var resources = getResourceURLsForPathname(path);\n prefetchedResources.push.apply(prefetchedResources, resources);\n serviceWorker.active.postMessage({\n gatsbyApi: \"setPathResources\",\n path: path,\n resources: resources\n });\n }); // Loop over all resources and fetch the page component + JSON data\n // to add it to the SW cache.\n\n var resources = [].concat(headerResources, prefetchedResources);\n resources.forEach(function (resource) {\n // Create a prefetch link for each resource, so Workbox runtime-caches them\n var link = document.createElement(\"link\");\n link.rel = \"prefetch\";\n link.href = resource;\n link.onload = link.remove;\n link.onerror = link.remove;\n document.head.appendChild(link);\n });\n};\n\nexports.onPostPrefetchPathname = function (_ref2) {\n var pathname = _ref2.pathname,\n getResourceURLsForPathname = _ref2.getResourceURLsForPathname;\n // do nothing if the SW has just updated, since we still have old pages in\n // memory which we don't want to be whitelisted\n if (window.___swUpdated) return;\n\n if (\"serviceWorker\" in navigator) {\n var _navigator = navigator,\n serviceWorker = _navigator.serviceWorker;\n\n if (serviceWorker.controller === null) {\n // if SW is not installed, we need to record any prefetches\n // that happen so we can then add them to SW cache once installed\n prefetchedPathnames.push(pathname);\n } else {\n serviceWorker.controller.postMessage({\n gatsbyApi: \"setPathResources\",\n path: pathname,\n resources: getResourceURLsForPathname(pathname)\n });\n }\n }\n};","// IE8- don't enum bug keys\nmodule.exports = [\n 'constructor',\n 'hasOwnProperty',\n 'isPrototypeOf',\n 'propertyIsEnumerable',\n 'toLocaleString',\n 'toString',\n 'valueOf'\n];\n","export default function _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n return arr2;\n}","import arrayWithoutHoles from \"./arrayWithoutHoles.js\";\nimport iterableToArray from \"./iterableToArray.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableSpread from \"./nonIterableSpread.js\";\nexport default function _toConsumableArray(arr) {\n return arrayWithoutHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableSpread();\n}","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nexport default function _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return arrayLikeToArray(arr);\n}","export default function _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n}","import arrayLikeToArray from \"./arrayLikeToArray.js\";\nexport default function _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen);\n}","export default function _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}","const support = function (feature) {\n if (typeof document === `undefined`) {\n return false\n }\n const fakeLink = document.createElement(`link`)\n try {\n if (fakeLink.relList && typeof fakeLink.relList.supports === `function`) {\n return fakeLink.relList.supports(feature)\n }\n } catch (err) {\n return false\n }\n return false\n}\n\nconst linkPrefetchStrategy = function (url, options) {\n return new Promise((resolve, reject) => {\n if (typeof document === `undefined`) {\n reject()\n return\n }\n\n const link = document.createElement(`link`)\n link.setAttribute(`rel`, `prefetch`)\n link.setAttribute(`href`, url)\n\n Object.keys(options).forEach(key => {\n link.setAttribute(key, options[key])\n })\n\n link.onload = resolve\n link.onerror = reject\n\n const parentElement =\n document.getElementsByTagName(`head`)[0] ||\n document.getElementsByName(`script`)[0].parentNode\n parentElement.appendChild(link)\n })\n}\n\nconst xhrPrefetchStrategy = function (url) {\n return new Promise((resolve, reject) => {\n const req = new XMLHttpRequest()\n req.open(`GET`, url, true)\n\n req.onload = () => {\n if (req.status === 200) {\n resolve()\n } else {\n reject()\n }\n }\n\n req.send(null)\n })\n}\n\nconst supportedPrefetchStrategy = support(`prefetch`)\n ? linkPrefetchStrategy\n : xhrPrefetchStrategy\n\nconst preFetched = {}\n\nconst prefetch = function (url, options) {\n return new Promise(resolve => {\n if (preFetched[url]) {\n resolve()\n return\n }\n\n supportedPrefetchStrategy(url, options)\n .then(() => {\n resolve()\n preFetched[url] = true\n })\n .catch(() => {}) // 404s are logged to the console anyway\n })\n}\n\nexport default prefetch\n","import prefetchHelper from \"./prefetch\"\nimport emitter from \"./emitter\"\nimport { setMatchPaths, findPath, findMatchPath } from \"./find-path\"\n\n/**\n * Available resource loading statuses\n */\nexport const PageResourceStatus = {\n /**\n * At least one of critical resources failed to load\n */\n Error: `error`,\n /**\n * Resources loaded successfully\n */\n Success: `success`,\n}\n\nconst preferDefault = m => (m && m.default) || m\n\nconst stripSurroundingSlashes = s => {\n s = s[0] === `/` ? s.slice(1) : s\n s = s.endsWith(`/`) ? s.slice(0, -1) : s\n return s\n}\n\nconst createPageDataUrl = path => {\n const fixedPath = path === `/` ? `index` : stripSurroundingSlashes(path)\n return `${__PATH_PREFIX__}/page-data/${fixedPath}/page-data.json`\n}\n\nfunction doFetch(url, method = `GET`) {\n return new Promise((resolve, reject) => {\n const req = new XMLHttpRequest()\n req.open(method, url, true)\n req.onreadystatechange = () => {\n if (req.readyState == 4) {\n resolve(req)\n }\n }\n req.send(null)\n })\n}\n\nconst doesConnectionSupportPrefetch = () => {\n if (\n `connection` in navigator &&\n typeof navigator.connection !== `undefined`\n ) {\n if ((navigator.connection.effectiveType || ``).includes(`2g`)) {\n return false\n }\n if (navigator.connection.saveData) {\n return false\n }\n }\n return true\n}\n\nconst toPageResources = (pageData, component = null) => {\n const page = {\n componentChunkName: pageData.componentChunkName,\n path: pageData.path,\n webpackCompilationHash: pageData.webpackCompilationHash,\n matchPath: pageData.matchPath,\n staticQueryHashes: pageData.staticQueryHashes,\n }\n\n return {\n component,\n json: pageData.result,\n page,\n }\n}\n\nexport class BaseLoader {\n constructor(loadComponent, matchPaths) {\n // Map of pagePath -> Page. Where Page is an object with: {\n // status: PageResourceStatus.Success || PageResourceStatus.Error,\n // payload: PageResources, // undefined if PageResourceStatus.Error\n // }\n // PageResources is {\n // component,\n // json: pageData.result,\n // page: {\n // componentChunkName,\n // path,\n // webpackCompilationHash,\n // staticQueryHashes\n // },\n // staticQueryResults\n // }\n this.pageDb = new Map()\n this.inFlightDb = new Map()\n this.staticQueryDb = {}\n this.pageDataDb = new Map()\n this.prefetchTriggered = new Set()\n this.prefetchCompleted = new Set()\n this.loadComponent = loadComponent\n setMatchPaths(matchPaths)\n }\n\n inFlightNetworkRequests = new Map()\n\n memoizedGet(url) {\n let inFlightPromise = this.inFlightNetworkRequests.get(url)\n\n if (!inFlightPromise) {\n inFlightPromise = doFetch(url, `GET`)\n this.inFlightNetworkRequests.set(url, inFlightPromise)\n }\n\n // Prefer duplication with then + catch over .finally to prevent problems in ie11 + firefox\n return inFlightPromise\n .then(response => {\n this.inFlightNetworkRequests.delete(url)\n return response\n })\n .catch(err => {\n this.inFlightNetworkRequests.delete(url)\n throw err\n })\n }\n\n setApiRunner(apiRunner) {\n this.apiRunner = apiRunner\n this.prefetchDisabled = apiRunner(`disableCorePrefetching`).some(a => a)\n }\n\n fetchPageDataJson(loadObj) {\n const { pagePath, retries = 0 } = loadObj\n const url = createPageDataUrl(pagePath)\n return this.memoizedGet(url).then(req => {\n const { status, responseText } = req\n\n // Handle 200\n if (status === 200) {\n try {\n const jsonPayload = JSON.parse(responseText)\n if (jsonPayload.path === undefined) {\n throw new Error(`not a valid pageData response`)\n }\n\n return Object.assign(loadObj, {\n status: PageResourceStatus.Success,\n payload: jsonPayload,\n })\n } catch (err) {\n // continue regardless of error\n }\n }\n\n // Handle 404\n if (status === 404 || status === 200) {\n // If the request was for a 404 page and it doesn't exist, we're done\n if (pagePath === `/404.html`) {\n return Object.assign(loadObj, {\n status: PageResourceStatus.Error,\n })\n }\n\n // Need some code here to cache the 404 request. In case\n // multiple loadPageDataJsons result in 404s\n return this.fetchPageDataJson(\n Object.assign(loadObj, { pagePath: `/404.html`, notFound: true })\n )\n }\n\n // handle 500 response (Unrecoverable)\n if (status === 500) {\n return Object.assign(loadObj, {\n status: PageResourceStatus.Error,\n })\n }\n\n // Handle everything else, including status === 0, and 503s. Should retry\n if (retries < 3) {\n return this.fetchPageDataJson(\n Object.assign(loadObj, { retries: retries + 1 })\n )\n }\n\n // Retried 3 times already, result is an error.\n return Object.assign(loadObj, {\n status: PageResourceStatus.Error,\n })\n })\n }\n\n loadPageDataJson(rawPath) {\n const pagePath = findPath(rawPath)\n if (this.pageDataDb.has(pagePath)) {\n const pageData = this.pageDataDb.get(pagePath)\n if (process.env.BUILD_STAGE !== `develop` || !pageData.stale) {\n return Promise.resolve(pageData)\n }\n }\n\n return this.fetchPageDataJson({ pagePath }).then(pageData => {\n this.pageDataDb.set(pagePath, pageData)\n\n return pageData\n })\n }\n\n findMatchPath(rawPath) {\n return findMatchPath(rawPath)\n }\n\n // TODO check all uses of this and whether they use undefined for page resources not exist\n loadPage(rawPath) {\n const pagePath = findPath(rawPath)\n if (this.pageDb.has(pagePath)) {\n const page = this.pageDb.get(pagePath)\n if (process.env.BUILD_STAGE !== `develop` || !page.payload.stale) {\n return Promise.resolve(page.payload)\n }\n }\n\n if (this.inFlightDb.has(pagePath)) {\n return this.inFlightDb.get(pagePath)\n }\n\n const inFlightPromise = Promise.all([\n this.loadAppData(),\n this.loadPageDataJson(pagePath),\n ]).then(allData => {\n const result = allData[1]\n if (result.status === PageResourceStatus.Error) {\n return {\n status: PageResourceStatus.Error,\n }\n }\n\n let pageData = result.payload\n const { componentChunkName, staticQueryHashes = [] } = pageData\n\n const finalResult = {}\n\n const componentChunkPromise = this.loadComponent(componentChunkName).then(\n component => {\n finalResult.createdAt = new Date()\n let pageResources\n if (!component) {\n finalResult.status = PageResourceStatus.Error\n } else {\n finalResult.status = PageResourceStatus.Success\n if (result.notFound === true) {\n finalResult.notFound = true\n }\n pageData = Object.assign(pageData, {\n webpackCompilationHash: allData[0]\n ? allData[0].webpackCompilationHash\n : ``,\n })\n pageResources = toPageResources(pageData, component)\n }\n // undefined if final result is an error\n return pageResources\n }\n )\n\n const staticQueryBatchPromise = Promise.all(\n staticQueryHashes.map(staticQueryHash => {\n // Check for cache in case this static query result has already been loaded\n if (this.staticQueryDb[staticQueryHash]) {\n const jsonPayload = this.staticQueryDb[staticQueryHash]\n return { staticQueryHash, jsonPayload }\n }\n\n return this.memoizedGet(\n `${__PATH_PREFIX__}/page-data/sq/d/${staticQueryHash}.json`\n ).then(req => {\n const jsonPayload = JSON.parse(req.responseText)\n return { staticQueryHash, jsonPayload }\n })\n })\n ).then(staticQueryResults => {\n const staticQueryResultsMap = {}\n\n staticQueryResults.forEach(({ staticQueryHash, jsonPayload }) => {\n staticQueryResultsMap[staticQueryHash] = jsonPayload\n this.staticQueryDb[staticQueryHash] = jsonPayload\n })\n\n return staticQueryResultsMap\n })\n\n return Promise.all([componentChunkPromise, staticQueryBatchPromise]).then(\n ([pageResources, staticQueryResults]) => {\n let payload\n if (pageResources) {\n payload = { ...pageResources, staticQueryResults }\n finalResult.payload = payload\n emitter.emit(`onPostLoadPageResources`, {\n page: payload,\n pageResources: payload,\n })\n }\n\n this.pageDb.set(pagePath, finalResult)\n\n return payload\n }\n )\n })\n\n inFlightPromise\n .then(response => {\n this.inFlightDb.delete(pagePath)\n })\n .catch(error => {\n this.inFlightDb.delete(pagePath)\n throw error\n })\n\n this.inFlightDb.set(pagePath, inFlightPromise)\n\n return inFlightPromise\n }\n\n // returns undefined if loading page ran into errors\n loadPageSync(rawPath) {\n const pagePath = findPath(rawPath)\n if (this.pageDb.has(pagePath)) {\n const pageData = this.pageDb.get(pagePath).payload\n return pageData\n }\n return undefined\n }\n\n shouldPrefetch(pagePath) {\n // Skip prefetching if we know user is on slow or constrained connection\n if (!doesConnectionSupportPrefetch()) {\n return false\n }\n\n // Check if the page exists.\n if (this.pageDb.has(pagePath)) {\n return false\n }\n\n return true\n }\n\n prefetch(pagePath) {\n if (!this.shouldPrefetch(pagePath)) {\n return false\n }\n\n // Tell plugins with custom prefetching logic that they should start\n // prefetching this path.\n if (!this.prefetchTriggered.has(pagePath)) {\n this.apiRunner(`onPrefetchPathname`, { pathname: pagePath })\n this.prefetchTriggered.add(pagePath)\n }\n\n // If a plugin has disabled core prefetching, stop now.\n if (this.prefetchDisabled) {\n return false\n }\n\n const realPath = findPath(pagePath)\n // Todo make doPrefetch logic cacheable\n // eslint-disable-next-line consistent-return\n this.doPrefetch(realPath).then(() => {\n if (!this.prefetchCompleted.has(pagePath)) {\n this.apiRunner(`onPostPrefetchPathname`, { pathname: pagePath })\n this.prefetchCompleted.add(pagePath)\n }\n })\n\n return true\n }\n\n doPrefetch(pagePath) {\n const pageDataUrl = createPageDataUrl(pagePath)\n return prefetchHelper(pageDataUrl, {\n crossOrigin: `anonymous`,\n as: `fetch`,\n }).then(() =>\n // This was just prefetched, so will return a response from\n // the cache instead of making another request to the server\n this.loadPageDataJson(pagePath)\n )\n }\n\n hovering(rawPath) {\n this.loadPage(rawPath)\n }\n\n getResourceURLsForPathname(rawPath) {\n const pagePath = findPath(rawPath)\n const page = this.pageDataDb.get(pagePath)\n if (page) {\n const pageResources = toPageResources(page.payload)\n\n return [\n ...createComponentUrls(pageResources.page.componentChunkName),\n createPageDataUrl(pagePath),\n ]\n } else {\n return null\n }\n }\n\n isPageNotFound(rawPath) {\n const pagePath = findPath(rawPath)\n const page = this.pageDb.get(pagePath)\n return !page || page.notFound\n }\n\n loadAppData(retries = 0) {\n return this.memoizedGet(`${__PATH_PREFIX__}/page-data/app-data.json`).then(\n req => {\n const { status, responseText } = req\n\n let appData\n\n if (status !== 200 && retries < 3) {\n // Retry 3 times incase of non-200 responses\n return this.loadAppData(retries + 1)\n }\n\n // Handle 200\n if (status === 200) {\n try {\n const jsonPayload = JSON.parse(responseText)\n if (jsonPayload.webpackCompilationHash === undefined) {\n throw new Error(`not a valid app-data response`)\n }\n\n appData = jsonPayload\n } catch (err) {\n // continue regardless of error\n }\n }\n\n return appData\n }\n )\n }\n}\n\nconst createComponentUrls = componentChunkName =>\n (window.___chunkMapping[componentChunkName] || []).map(\n chunk => __PATH_PREFIX__ + chunk\n )\n\nexport class ProdLoader extends BaseLoader {\n constructor(asyncRequires, matchPaths) {\n const loadComponent = chunkName =>\n asyncRequires.components[chunkName]\n ? asyncRequires.components[chunkName]()\n .then(preferDefault)\n // loader will handle the case when component is null\n .catch(() => null)\n : Promise.resolve()\n\n super(loadComponent, matchPaths)\n }\n\n doPrefetch(pagePath) {\n return super.doPrefetch(pagePath).then(result => {\n if (result.status !== PageResourceStatus.Success) {\n return Promise.resolve()\n }\n const pageData = result.payload\n const chunkName = pageData.componentChunkName\n const componentUrls = createComponentUrls(chunkName)\n return Promise.all(componentUrls.map(prefetchHelper)).then(() => pageData)\n })\n }\n\n loadPageDataJson(rawPath) {\n return super.loadPageDataJson(rawPath).then(data => {\n if (data.notFound) {\n // check if html file exist using HEAD request:\n // if it does we should navigate to it instead of showing 404\n return doFetch(rawPath, `HEAD`).then(req => {\n if (req.status === 200) {\n // page (.html file) actually exist (or we asked for 404 )\n // returning page resources status as errored to trigger\n // regular browser navigation to given page\n return {\n status: PageResourceStatus.Error,\n }\n }\n\n // if HEAD request wasn't 200, return notFound result\n // and show 404 page\n return data\n })\n }\n return data\n })\n }\n}\n\nlet instance\n\nexport const setLoader = _loader => {\n instance = _loader\n}\n\nexport const publicLoader = {\n // Deprecated methods. As far as we're aware, these are only used by\n // core gatsby and the offline plugin, however there's a very small\n // chance they're called by others.\n getResourcesForPathname: rawPath => {\n console.warn(\n `Warning: getResourcesForPathname is deprecated. Use loadPage instead`\n )\n return instance.i.loadPage(rawPath)\n },\n getResourcesForPathnameSync: rawPath => {\n console.warn(\n `Warning: getResourcesForPathnameSync is deprecated. Use loadPageSync instead`\n )\n return instance.i.loadPageSync(rawPath)\n },\n enqueue: rawPath => instance.prefetch(rawPath),\n\n // Real methods\n getResourceURLsForPathname: rawPath =>\n instance.getResourceURLsForPathname(rawPath),\n loadPage: rawPath => instance.loadPage(rawPath),\n loadPageSync: rawPath => instance.loadPageSync(rawPath),\n prefetch: rawPath => instance.prefetch(rawPath),\n isPageNotFound: rawPath => instance.isPageNotFound(rawPath),\n hovering: rawPath => instance.hovering(rawPath),\n loadAppData: () => instance.loadAppData(),\n}\n\nexport default publicLoader\n\nexport function getStaticQueryResults() {\n if (instance) {\n return instance.staticQueryDb\n } else {\n return {}\n }\n}\n","var requireObjectCoercible = require('../internals/require-object-coercible');\n\nvar $Object = Object;\n\n// `ToObject` abstract operation\n// https://tc39.es/ecma262/#sec-toobject\nmodule.exports = function (argument) {\n return $Object(requireObjectCoercible(argument));\n};\n","var fails = require('../internals/fails');\n\n// Detect IE8's incomplete defineProperty implementation\nmodule.exports = !fails(function () {\n // eslint-disable-next-line es/no-object-defineproperty -- required for testing\n return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] != 7;\n});\n","var isObject = require('../internals/is-object');\n\nvar $String = String;\nvar $TypeError = TypeError;\n\n// `Assert: Type(argument) is Object`\nmodule.exports = function (argument) {\n if (isObject(argument)) return argument;\n throw $TypeError($String(argument) + ' is not an object');\n};\n","'use strict';\nvar toPropertyKey = require('../internals/to-property-key');\nvar definePropertyModule = require('../internals/object-define-property');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\n\nmodule.exports = function (object, key, value) {\n var propertyKey = toPropertyKey(key);\n if (propertyKey in object) definePropertyModule.f(object, propertyKey, createPropertyDescriptor(0, value));\n else object[propertyKey] = value;\n};\n","\"use strict\";\n\nvar offsetY = 0;\n\nvar getTargetOffset = function getTargetOffset(hash) {\n var id = window.decodeURI(hash.replace(\"#\", \"\"));\n\n if (id !== \"\") {\n var element = document.getElementById(id);\n\n if (element) {\n var scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;\n var clientTop = document.documentElement.clientTop || document.body.clientTop || 0;\n var computedStyles = window.getComputedStyle(element);\n var scrollMarginTop = computedStyles.getPropertyValue(\"scroll-margin-top\") || computedStyles.getPropertyValue(\"scroll-snap-margin-top\") || \"0px\";\n return element.getBoundingClientRect().top + scrollTop - parseInt(scrollMarginTop, 10) - clientTop - offsetY;\n }\n }\n\n return null;\n};\n\nexports.onInitialClientRender = function (_, pluginOptions) {\n if (pluginOptions.offsetY) {\n offsetY = pluginOptions.offsetY;\n }\n\n requestAnimationFrame(function () {\n var offset = getTargetOffset(window.location.hash);\n\n if (offset !== null) {\n window.scrollTo(0, offset);\n }\n });\n};\n\nexports.shouldUpdateScroll = function (_ref) {\n var location = _ref.routerProps.location;\n var offset = getTargetOffset(location.hash);\n return offset !== null ? [0, offset] : true;\n};","\"use strict\";\n\nvar _interopRequireWildcard = require(\"@babel/runtime/helpers/interopRequireWildcard\");\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nexports.__esModule = true;\nexports.ScrollContainer = void 0;\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _inheritsLoose2 = _interopRequireDefault(require(\"@babel/runtime/helpers/inheritsLoose\"));\n\nvar React = _interopRequireWildcard(require(\"react\"));\n\nvar _reactDom = _interopRequireDefault(require(\"react-dom\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _scrollHandler = require(\"./scroll-handler\");\n\nvar _router = require(\"@reach/router\");\n\n// TODO: In Gatsby v3, this file should be removed.\n// We are deprecating this in V2 in favor of useScrollRestoration\nvar propTypes = {\n scrollKey: _propTypes.default.string.isRequired,\n shouldUpdateScroll: _propTypes.default.func,\n children: _propTypes.default.element.isRequired\n};\nvar hasNotWarnedDeprecation = true;\n\nvar ScrollContainerImplementation = /*#__PURE__*/function (_React$Component) {\n (0, _inheritsLoose2.default)(ScrollContainerImplementation, _React$Component);\n\n function ScrollContainerImplementation(props) {\n var _this;\n\n _this = _React$Component.call(this, props) || this;\n\n if (process.env.NODE_ENV !== \"production\" && hasNotWarnedDeprecation) {\n hasNotWarnedDeprecation = false;\n console.log(\"Deprecation Warning:\\n\\n Gatsby is deprecated in Gatsby v2 and will be removed in Gatsby v3.\\n Update to the React hook alternative useScrollRestoration, like this:.\\n \\n ```\\n import React from 'react';\\n import { useScrollRestoration } from 'gatsby-react-router-scroll';\\n\\n function Component() {\\n const scrollRestoration = useScrollRestoration('\" + _this.props.scrollKey + \"');\\n\\n return
    ;\\n }\\n ```\\n \");\n }\n\n return _this;\n }\n\n var _proto = ScrollContainerImplementation.prototype;\n\n _proto.componentDidMount = function componentDidMount() {\n var _this2 = this;\n\n // eslint-disable-next-line react/no-find-dom-node\n var node = _reactDom.default.findDOMNode(this);\n\n var _this$props = this.props,\n location = _this$props.location,\n scrollKey = _this$props.scrollKey;\n if (!node) return;\n node.addEventListener(\"scroll\", function () {\n _this2.props.context.save(location, scrollKey, node.scrollTop);\n });\n var position = this.props.context.read(location, scrollKey);\n node.scrollTo(0, position || 0);\n };\n\n _proto.render = function render() {\n return this.props.children;\n };\n\n return ScrollContainerImplementation;\n}(React.Component);\n\nvar ScrollContainer = function ScrollContainer(props) {\n return /*#__PURE__*/React.createElement(_router.Location, null, function (_ref) {\n var location = _ref.location;\n return /*#__PURE__*/React.createElement(_scrollHandler.ScrollContext.Consumer, null, function (context) {\n return /*#__PURE__*/React.createElement(ScrollContainerImplementation, (0, _extends2.default)({}, props, {\n context: context,\n location: location\n }));\n });\n });\n};\n\nexports.ScrollContainer = ScrollContainer;\nScrollContainer.propTypes = propTypes;","var isCallable = require('../internals/is-callable');\nvar $documentAll = require('../internals/document-all');\n\nvar documentAll = $documentAll.all;\n\nmodule.exports = $documentAll.IS_HTMLDDA ? function (it) {\n return typeof it == 'object' ? it !== null : isCallable(it) || it === documentAll;\n} : function (it) {\n return typeof it == 'object' ? it !== null : isCallable(it);\n};\n","var uncurryThis = require('../internals/function-uncurry-this');\nvar isCallable = require('../internals/is-callable');\nvar store = require('../internals/shared-store');\n\nvar functionToString = uncurryThis(Function.toString);\n\n// this helper broken in `core-js@3.4.1-3.4.4`, so we can't use `shared` helper\nif (!isCallable(store.inspectSource)) {\n store.inspectSource = function (it) {\n return functionToString(it);\n };\n}\n\nmodule.exports = store.inspectSource;\n","var documentAll = typeof document == 'object' && document.all;\n\n// https://tc39.es/ecma262/#sec-IsHTMLDDA-internal-slot\n// eslint-disable-next-line unicorn/no-typeof-undefined -- required for testing\nvar IS_HTMLDDA = typeof documentAll == 'undefined' && documentAll !== undefined;\n\nmodule.exports = {\n all: documentAll,\n IS_HTMLDDA: IS_HTMLDDA\n};\n","var uncurryThis = require('../internals/function-uncurry-this');\n\nvar id = 0;\nvar postfix = Math.random();\nvar toString = uncurryThis(1.0.toString);\n\nmodule.exports = function (key) {\n return 'Symbol(' + (key === undefined ? '' : key) + ')_' + toString(++id + postfix, 36);\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar definePropertyModule = require('../internals/object-define-property');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\n\nmodule.exports = DESCRIPTORS ? function (object, key, value) {\n return definePropertyModule.f(object, key, createPropertyDescriptor(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n","var fails = require('../internals/fails');\nvar isCallable = require('../internals/is-callable');\n\nvar replacement = /#|\\.prototype\\./;\n\nvar isForced = function (feature, detection) {\n var value = data[normalize(feature)];\n return value == POLYFILL ? true\n : value == NATIVE ? false\n : isCallable(detection) ? fails(detection)\n : !!detection;\n};\n\nvar normalize = isForced.normalize = function (string) {\n return String(string).replace(replacement, '.').toLowerCase();\n};\n\nvar data = isForced.data = {};\nvar NATIVE = isForced.NATIVE = 'N';\nvar POLYFILL = isForced.POLYFILL = 'P';\n\nmodule.exports = isForced;\n","const preferDefault = m => (m && m.default) || m\n\nif (process.env.BUILD_STAGE === `develop`) {\n module.exports = preferDefault(require(`./public-page-renderer-dev`))\n} else if (process.env.BUILD_STAGE === `build-javascript`) {\n module.exports = preferDefault(require(`./public-page-renderer-prod`))\n} else {\n module.exports = () => null\n}\n","var DESCRIPTORS = require('../internals/descriptors');\nvar IE8_DOM_DEFINE = require('../internals/ie8-dom-define');\nvar V8_PROTOTYPE_DEFINE_BUG = require('../internals/v8-prototype-define-bug');\nvar anObject = require('../internals/an-object');\nvar toPropertyKey = require('../internals/to-property-key');\n\nvar $TypeError = TypeError;\n// eslint-disable-next-line es/no-object-defineproperty -- safe\nvar $defineProperty = Object.defineProperty;\n// eslint-disable-next-line es/no-object-getownpropertydescriptor -- safe\nvar $getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\nvar ENUMERABLE = 'enumerable';\nvar CONFIGURABLE = 'configurable';\nvar WRITABLE = 'writable';\n\n// `Object.defineProperty` method\n// https://tc39.es/ecma262/#sec-object.defineproperty\nexports.f = DESCRIPTORS ? V8_PROTOTYPE_DEFINE_BUG ? function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPropertyKey(P);\n anObject(Attributes);\n if (typeof O === 'function' && P === 'prototype' && 'value' in Attributes && WRITABLE in Attributes && !Attributes[WRITABLE]) {\n var current = $getOwnPropertyDescriptor(O, P);\n if (current && current[WRITABLE]) {\n O[P] = Attributes.value;\n Attributes = {\n configurable: CONFIGURABLE in Attributes ? Attributes[CONFIGURABLE] : current[CONFIGURABLE],\n enumerable: ENUMERABLE in Attributes ? Attributes[ENUMERABLE] : current[ENUMERABLE],\n writable: false\n };\n }\n } return $defineProperty(O, P, Attributes);\n} : $defineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPropertyKey(P);\n anObject(Attributes);\n if (IE8_DOM_DEFINE) try {\n return $defineProperty(O, P, Attributes);\n } catch (error) { /* empty */ }\n if ('get' in Attributes || 'set' in Attributes) throw $TypeError('Accessors not supported');\n if ('value' in Attributes) O[P] = Attributes.value;\n return O;\n};\n","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nvar _gatsby = require(\"gatsby\");\n\nvar _getManifestPathname = _interopRequireDefault(require(\"./get-manifest-pathname\"));\n\n/* global __MANIFEST_PLUGIN_HAS_LOCALISATION__ */\n// when we don't have localisation in our manifest, we tree shake everything away\nif (__MANIFEST_PLUGIN_HAS_LOCALISATION__) {\n exports.onRouteUpdate = function (_ref, pluginOptions) {\n var location = _ref.location;\n var localize = pluginOptions.localize;\n var manifestFilename = (0, _getManifestPathname.default)(location.pathname, localize);\n var manifestEl = document.head.querySelector(\"link[rel=\\\"manifest\\\"]\");\n\n if (manifestEl) {\n manifestEl.setAttribute(\"href\", (0, _gatsby.withPrefix)(manifestFilename));\n }\n };\n}","/*\n Why commonjs and not ES imports/exports?\n\n This module is used to alias `create-react-context` package, but drop the the actual implementation part\n because Gatsby requires version of react that has implementatoin baked in.\n \n Package source is using ES modules:\n - https://github.com/jamiebuilds/create-react-context/blob/v0.3.0/src/index.js\n \n But to build this package `babel-plugin-add-module-exports` is used ( https://www.npmjs.com/package/babel-plugin-add-module-exports).\n Which result in both `module.exports` and `exports.default` being set to same thing.\n\n We don't use that babel plugin so we only have `exports.default`.\n\n This cause problems in various 3rd party react components that rely on `module.exports` being set.\n See https://github.com/gatsbyjs/gatsby/issues/23645 for example of it.\n \n Instead of adding same babel plugin we mimic output here. Adding babel plugin just for this would:\n a) unnecesairly slow down compilation for all other files (if we just apply it everywhere)\n b) or complicate babel-loader configuration with overwrite specifically for this file\n*/\n\nconst { createContext } = require(`react`)\n\nmodule.exports = createContext\nmodule.exports.default = createContext\n","\"use strict\";\n\nexports.DEFAULT_OPTIONS = {\n maxWidth: 650,\n wrapperStyle: \"\",\n backgroundColor: \"white\",\n linkImagesToOriginal: true,\n showCaptions: false,\n markdownCaptions: false,\n withWebp: false,\n withAvif: false,\n tracedSVG: false,\n loading: \"lazy\",\n disableBgImageOnAlpha: false,\n disableBgImage: false\n};\nexports.EMPTY_ALT = \"GATSBY_EMPTY_ALT\";\nexports.imageClass = \"gatsby-resp-image-image\";\nexports.imageWrapperClass = \"gatsby-resp-image-wrapper\";\nexports.imageBackgroundClass = \"gatsby-resp-image-background-image\";","var toPrimitive = require('../internals/to-primitive');\nvar isSymbol = require('../internals/is-symbol');\n\n// `ToPropertyKey` abstract operation\n// https://tc39.es/ecma262/#sec-topropertykey\nmodule.exports = function (argument) {\n var key = toPrimitive(argument, 'string');\n return isSymbol(key) ? key : key + '';\n};\n","function _extends() {\n module.exports = _extends = Object.assign ? Object.assign.bind() : function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n }, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;\n return _extends.apply(this, arguments);\n}\nmodule.exports = _extends, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","'use strict';\nvar fails = require('../internals/fails');\n\nmodule.exports = function (METHOD_NAME, argument) {\n var method = [][METHOD_NAME];\n return !!method && fails(function () {\n // eslint-disable-next-line no-useless-call -- required for testing\n method.call(null, argument || function () { return 1; }, 1);\n });\n};\n","\"use strict\";\n\nvar _require = require(\"./constants\"),\n DEFAULT_OPTIONS = _require.DEFAULT_OPTIONS,\n imageClass = _require.imageClass,\n imageBackgroundClass = _require.imageBackgroundClass,\n imageWrapperClass = _require.imageWrapperClass;\n\nexports.onRouteUpdate = function (apiCallbackContext, pluginOptions) {\n var options = Object.assign({}, DEFAULT_OPTIONS, pluginOptions);\n var imageWrappers = document.querySelectorAll(\".\" + imageWrapperClass); // https://css-tricks.com/snippets/javascript/loop-queryselectorall-matches/\n // for cross-browser looping through NodeList without polyfills\n\n var _loop = function _loop(i) {\n var imageWrapper = imageWrappers[i];\n var backgroundElement = imageWrapper.querySelector(\".\" + imageBackgroundClass);\n var imageElement = imageWrapper.querySelector(\".\" + imageClass);\n\n var onImageLoad = function onImageLoad() {\n backgroundElement.style.transition = \"opacity 0.5s 0.5s\";\n imageElement.style.transition = \"opacity 0.5s\";\n onImageComplete();\n };\n\n var onImageComplete = function onImageComplete() {\n backgroundElement.style.opacity = 0;\n imageElement.style.opacity = 1;\n imageElement.style.color = \"inherit\";\n imageElement.style.boxShadow = \"inset 0px 0px 0px 400px \" + options.backgroundColor;\n imageElement.removeEventListener(\"load\", onImageLoad);\n imageElement.removeEventListener(\"error\", onImageComplete);\n };\n\n imageElement.style.opacity = 0;\n imageElement.addEventListener(\"load\", onImageLoad);\n imageElement.addEventListener(\"error\", onImageComplete);\n\n if (imageElement.complete) {\n onImageComplete();\n }\n };\n\n for (var i = 0; i < imageWrappers.length; i++) {\n _loop(i);\n }\n};","var arraySlice = require('../internals/array-slice-simple');\n\nvar floor = Math.floor;\n\nvar mergeSort = function (array, comparefn) {\n var length = array.length;\n var middle = floor(length / 2);\n return length < 8 ? insertionSort(array, comparefn) : merge(\n array,\n mergeSort(arraySlice(array, 0, middle), comparefn),\n mergeSort(arraySlice(array, middle), comparefn),\n comparefn\n );\n};\n\nvar insertionSort = function (array, comparefn) {\n var length = array.length;\n var i = 1;\n var element, j;\n\n while (i < length) {\n j = i;\n element = array[i];\n while (j && comparefn(array[j - 1], element) > 0) {\n array[j] = array[--j];\n }\n if (j !== i++) array[j] = element;\n } return array;\n};\n\nvar merge = function (array, left, right, comparefn) {\n var llength = left.length;\n var rlength = right.length;\n var lindex = 0;\n var rindex = 0;\n\n while (lindex < llength || rindex < rlength) {\n array[lindex + rindex] = (lindex < llength && rindex < rlength)\n ? comparefn(left[lindex], right[rindex]) <= 0 ? left[lindex++] : right[rindex++]\n : lindex < llength ? left[lindex++] : right[rindex++];\n } return array;\n};\n\nmodule.exports = mergeSort;\n","var DESCRIPTORS = require('../internals/descriptors');\nvar fails = require('../internals/fails');\n\n// V8 ~ Chrome 36-\n// https://bugs.chromium.org/p/v8/issues/detail?id=3334\nmodule.exports = DESCRIPTORS && fails(function () {\n // eslint-disable-next-line es/no-object-defineproperty -- required for testing\n return Object.defineProperty(function () { /* empty */ }, 'prototype', {\n value: 42,\n writable: false\n }).prototype != 42;\n});\n","import React from \"react\"\nimport PropTypes from \"prop-types\"\n\nimport loader from \"./loader\"\nimport InternalPageRenderer from \"./page-renderer\"\n\nconst ProdPageRenderer = ({ location }) => {\n const pageResources = loader.loadPageSync(location.pathname)\n if (!pageResources) {\n return null\n }\n return React.createElement(InternalPageRenderer, {\n location,\n pageResources,\n ...pageResources.json,\n })\n}\n\nProdPageRenderer.propTypes = {\n location: PropTypes.shape({\n pathname: PropTypes.string.isRequired,\n }).isRequired,\n}\n\nexport default ProdPageRenderer\n","var ceil = Math.ceil;\nvar floor = Math.floor;\n\n// `Math.trunc` method\n// https://tc39.es/ecma262/#sec-math.trunc\n// eslint-disable-next-line es/no-math-trunc -- safe\nmodule.exports = Math.trunc || function trunc(x) {\n var n = +x;\n return (n > 0 ? floor : ceil)(n);\n};\n","var global = require('../internals/global');\nvar shared = require('../internals/shared');\nvar hasOwn = require('../internals/has-own-property');\nvar uid = require('../internals/uid');\nvar NATIVE_SYMBOL = require('../internals/symbol-constructor-detection');\nvar USE_SYMBOL_AS_UID = require('../internals/use-symbol-as-uid');\n\nvar Symbol = global.Symbol;\nvar WellKnownSymbolsStore = shared('wks');\nvar createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol['for'] || Symbol : Symbol && Symbol.withoutSetter || uid;\n\nmodule.exports = function (name) {\n if (!hasOwn(WellKnownSymbolsStore, name)) {\n WellKnownSymbolsStore[name] = NATIVE_SYMBOL && hasOwn(Symbol, name)\n ? Symbol[name]\n : createWellKnownSymbol('Symbol.' + name);\n } return WellKnownSymbolsStore[name];\n};\n","var call = require('../internals/function-call');\nvar isObject = require('../internals/is-object');\nvar isSymbol = require('../internals/is-symbol');\nvar getMethod = require('../internals/get-method');\nvar ordinaryToPrimitive = require('../internals/ordinary-to-primitive');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar $TypeError = TypeError;\nvar TO_PRIMITIVE = wellKnownSymbol('toPrimitive');\n\n// `ToPrimitive` abstract operation\n// https://tc39.es/ecma262/#sec-toprimitive\nmodule.exports = function (input, pref) {\n if (!isObject(input) || isSymbol(input)) return input;\n var exoticToPrim = getMethod(input, TO_PRIMITIVE);\n var result;\n if (exoticToPrim) {\n if (pref === undefined) pref = 'default';\n result = call(exoticToPrim, input, pref);\n if (!isObject(result) || isSymbol(result)) return result;\n throw $TypeError(\"Can't convert object to primitive value\");\n }\n if (pref === undefined) pref = 'number';\n return ordinaryToPrimitive(input, pref);\n};\n","module.exports = false;\n","var NATIVE_BIND = require('../internals/function-bind-native');\n\nvar call = Function.prototype.call;\n\nmodule.exports = NATIVE_BIND ? call.bind(call) : function () {\n return call.apply(call, arguments);\n};\n","var uncurryThis = require('../internals/function-uncurry-this');\n\nvar toString = uncurryThis({}.toString);\nvar stringSlice = uncurryThis(''.slice);\n\nmodule.exports = function (it) {\n return stringSlice(toString(it), 8, -1);\n};\n","var global = require('../internals/global');\nvar defineGlobalProperty = require('../internals/define-global-property');\n\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || defineGlobalProperty(SHARED, {});\n\nmodule.exports = store;\n","const plugins = require(`./api-runner-browser-plugins`)\nconst {\n getResourcesForPathname,\n getResourcesForPathnameSync,\n getResourceURLsForPathname,\n loadPage,\n loadPageSync,\n} = require(`./loader`).publicLoader\n\nexports.apiRunner = (api, args = {}, defaultReturn, argTransform) => {\n // Hooks for gatsby-cypress's API handler\n if (process.env.CYPRESS_SUPPORT) {\n if (window.___apiHandler) {\n window.___apiHandler(api)\n } else if (window.___resolvedAPIs) {\n window.___resolvedAPIs.push(api)\n } else {\n window.___resolvedAPIs = [api]\n }\n }\n\n let results = plugins.map(plugin => {\n if (!plugin.plugin[api]) {\n return undefined\n }\n\n // Deprecated April 2019. Use `loadPageSync` instead\n args.getResourcesForPathnameSync = getResourcesForPathnameSync\n // Deprecated April 2019. Use `loadPage` instead\n args.getResourcesForPathname = getResourcesForPathname\n args.getResourceURLsForPathname = getResourceURLsForPathname\n args.loadPage = loadPage\n args.loadPageSync = loadPageSync\n\n const result = plugin.plugin[api](args, plugin.options)\n if (result && argTransform) {\n args = argTransform({ args, result, plugin })\n }\n return result\n })\n\n // Filter out undefined results.\n results = results.filter(result => typeof result !== `undefined`)\n\n if (results.length > 0) {\n return results\n } else if (defaultReturn) {\n return [defaultReturn]\n } else {\n return []\n }\n}\n\nexports.apiRunnerAsync = (api, args, defaultReturn) =>\n plugins.reduce(\n (previous, next) =>\n next.plugin[api]\n ? previous.then(() => next.plugin[api](args, next.options))\n : previous,\n Promise.resolve()\n )\n","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n","var uncurryThis = require('../internals/function-uncurry-this');\nvar hasOwn = require('../internals/has-own-property');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar indexOf = require('../internals/array-includes').indexOf;\nvar hiddenKeys = require('../internals/hidden-keys');\n\nvar push = uncurryThis([].push);\n\nmodule.exports = function (object, names) {\n var O = toIndexedObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) !hasOwn(hiddenKeys, key) && hasOwn(O, key) && push(result, key);\n // Don't enum bug & hidden keys\n while (names.length > i) if (hasOwn(O, key = names[i++])) {\n ~indexOf(result, key) || push(result, key);\n }\n return result;\n};\n","var isCallable = require('../internals/is-callable');\nvar definePropertyModule = require('../internals/object-define-property');\nvar makeBuiltIn = require('../internals/make-built-in');\nvar defineGlobalProperty = require('../internals/define-global-property');\n\nmodule.exports = function (O, key, value, options) {\n if (!options) options = {};\n var simple = options.enumerable;\n var name = options.name !== undefined ? options.name : key;\n if (isCallable(value)) makeBuiltIn(value, name, options);\n if (options.global) {\n if (simple) O[key] = value;\n else defineGlobalProperty(key, value);\n } else {\n try {\n if (!options.unsafe) delete O[key];\n else if (O[key]) simple = true;\n } catch (error) { /* empty */ }\n if (simple) O[key] = value;\n else definePropertyModule.f(O, key, {\n value: value,\n enumerable: false,\n configurable: !options.nonConfigurable,\n writable: !options.nonWritable\n });\n } return O;\n};\n","var global = require('../internals/global');\nvar isObject = require('../internals/is-object');\n\nvar document = global.document;\n// typeof document.createElement is 'object' in old IE\nvar EXISTS = isObject(document) && isObject(document.createElement);\n\nmodule.exports = function (it) {\n return EXISTS ? document.createElement(it) : {};\n};\n","var global = require('../internals/global');\nvar isCallable = require('../internals/is-callable');\n\nvar WeakMap = global.WeakMap;\n\nmodule.exports = isCallable(WeakMap) && /native code/.test(String(WeakMap));\n"],"sourceRoot":""} \ No newline at end of file diff --git a/cd7d5f864fc9e15ed8adef086269b0aeff617554-64401eb54313e58b6cc6.js b/cd7d5f864fc9e15ed8adef086269b0aeff617554-64401eb54313e58b6cc6.js new file mode 100644 index 00000000..cde9512a --- /dev/null +++ b/cd7d5f864fc9e15ed8adef086269b0aeff617554-64401eb54313e58b6cc6.js @@ -0,0 +1,3 @@ +/*! For license information please see cd7d5f864fc9e15ed8adef086269b0aeff617554-64401eb54313e58b6cc6.js.LICENSE.txt */ +(window.webpackJsonp=window.webpackJsonp||[]).push([[3],{"1jzt":function(e,t,r){(function(r){var a,o;o=void 0!==r?r:"undefined"!=typeof window?window:this,void 0===(a=function(){return function(e){"use strict";var t={ignore:"[data-scroll-ignore]",header:null,topOnEmptyHash:!0,speed:500,speedAsDuration:!1,durationMax:null,durationMin:null,clip:!0,offset:0,easing:"easeInOutCubic",customEasing:null,updateURL:!0,popstate:!0,emitEvents:!0},r=function(){var e={};return Array.prototype.forEach.call(arguments,(function(t){for(var r in t){if(!t.hasOwnProperty(r))return;e[r]=t[r]}})),e},a=function(e){"#"===e.charAt(0)&&(e=e.substr(1));for(var t,r=String(e),a=r.length,o=-1,i="",n=r.charCodeAt(0);++ov.durationMax?v.durationMax:v.durationMin&&b=T)return p.cancelScroll(!0),i(a,r,h),n("scrollStop",d,a,l),!(f=S=null)}(w,R)||(f=e.requestAnimationFrame(t),S=r)})))}}},h=function(t){if(!t.defaultPrevented&&!(0!==t.button||t.metaKey||t.ctrlKey||t.shiftKey)&&"closest"in t.target&&(d=t.target.closest(l))&&"a"===d.tagName.toLowerCase()&&!t.target.closest(c.ignore)&&d.hostname===e.location.hostname&&d.pathname===e.location.pathname&&/#/.test(d.href)){var r,o;try{r=a(decodeURIComponent(d.hash))}catch(t){r=a(d.hash)}if("#"===r){if(!c.topOnEmptyHash)return;o=document.documentElement}else o=document.querySelector(r);(o=o||"#top"!==r?o:document.documentElement)&&(t.preventDefault(),function(t){if(history.replaceState&&t.updateURL&&!history.state){var r=e.location.hash;r=r||"",history.replaceState({smoothScroll:JSON.stringify(t),anchor:r||e.pageYOffset},document.title,r||e.location.href)}}(c),p.animateScroll(o,d))}},m=function(e){if(null!==history.state&&history.state.smoothScroll&&history.state.smoothScroll===JSON.stringify(c)){var t=history.state.anchor;"string"==typeof t&&t&&!(t=document.querySelector(a(history.state.anchor)))||p.animateScroll(t,null,{updateURL:!1})}};return p.destroy=function(){c&&(document.removeEventListener("click",h,!1),e.removeEventListener("popstate",m,!1),p.cancelScroll(),f=u=d=c=null)},function(){if(!("querySelector"in document&&"addEventListener"in e&&"requestAnimationFrame"in e&&"closest"in e.Element.prototype))throw"Smooth Scroll: This browser does not support the required JavaScript methods and browser APIs.";p.destroy(),c=r(t,s||{}),u=c.header?document.querySelector(c.header):null,document.addEventListener("click",h,!1),c.updateURL&&c.popstate&&e.addEventListener("popstate",m,!1)}(),p}}(o)}.apply(t,[]))||(e.exports=a)}).call(this,r("yLpj"))},"9H8W":function(e,t,r){},"9eSz":function(e,t,r){"use strict";var a=r("TqRt");t.__esModule=!0,t.default=void 0;var o,i=a(r("PJYZ")),n=a(r("VbXa")),l=a(r("8OQS")),s=a(r("pVnL")),c=a(r("q1tI")),d=a(r("17x9")),u=function(e){var t=(0,s.default)({},e),r=t.resolutions,a=t.sizes,o=t.critical;return r&&(t.fixed=r,delete t.resolutions),a&&(t.fluid=a,delete t.sizes),o&&(t.loading="eager"),t.fluid&&(t.fluid=w([].concat(t.fluid))),t.fixed&&(t.fixed=w([].concat(t.fixed))),t},f=function(e){var t=e.media;return!!t&&(v&&!!window.matchMedia(t).matches)},p=function(e){var t=e.fluid,r=e.fixed,a=h(t||r||[]);return a&&a.src},h=function(e){if(v&&function(e){return!!e&&Array.isArray(e)&&e.some((function(e){return void 0!==e.media}))}(e)){var t=e.findIndex(f);if(-1!==t)return e[t];var r=e.findIndex((function(e){return void 0===e.media}));if(-1!==r)return e[r]}return e[0]},m=Object.create({}),g=function(e){var t=u(e),r=p(t);return m[r]||!1},y="undefined"!=typeof HTMLImageElement&&"loading"in HTMLImageElement.prototype,v="undefined"!=typeof window,b=v&&window.IntersectionObserver,S=new WeakMap;function E(e){return e.map((function(e){var t=e.src,r=e.srcSet,a=e.srcSetWebp,o=e.media,i=e.sizes;return c.default.createElement(c.default.Fragment,{key:t},a&&c.default.createElement("source",{type:"image/webp",media:o,srcSet:a,sizes:i}),r&&c.default.createElement("source",{media:o,srcSet:r,sizes:i}))}))}function w(e){var t=[],r=[];return e.forEach((function(e){return(e.media?t:r).push(e)})),[].concat(t,r)}function L(e){return e.map((function(e){var t=e.src,r=e.media,a=e.tracedSVG;return c.default.createElement("source",{key:t,media:r,srcSet:a})}))}function I(e){return e.map((function(e){var t=e.src,r=e.media,a=e.base64;return c.default.createElement("source",{key:t,media:r,srcSet:a})}))}function O(e,t){var r=e.srcSet,a=e.srcSetWebp,o=e.media,i=e.sizes;return""}var R=function(e,t){var r=(void 0===o&&"undefined"!=typeof window&&window.IntersectionObserver&&(o=new window.IntersectionObserver((function(e){e.forEach((function(e){if(S.has(e.target)){var t=S.get(e.target);(e.isIntersecting||e.intersectionRatio>0)&&(o.unobserve(e.target),S.delete(e.target),t())}}))}),{rootMargin:"200px"})),o);return r&&(r.observe(e),S.set(e,t)),function(){r.unobserve(e),S.delete(e)}},x=function(e){var t=e.src?'src="'+e.src+'" ':'src="" ',r=e.sizes?'sizes="'+e.sizes+'" ':"",a=e.srcSet?'srcset="'+e.srcSet+'" ':"",o=e.title?'title="'+e.title+'" ':"",i=e.alt?'alt="'+e.alt+'" ':'alt="" ',n=e.width?'width="'+e.width+'" ':"",l=e.height?'height="'+e.height+'" ':"",s=e.crossOrigin?'crossorigin="'+e.crossOrigin+'" ':"",c=e.loading?'loading="'+e.loading+'" ':"",d=e.draggable?'draggable="'+e.draggable+'" ':"";return""+e.imageVariants.map((function(e){return(e.srcSetWebp?O(e,!0):"")+O(e)})).join("")+"'},T=c.default.forwardRef((function(e,t){var r=e.src,a=e.imageVariants,o=e.generateSources,i=e.spreadProps,n=e.ariaHidden,l=c.default.createElement(H,(0,s.default)({ref:t,src:r},i,{ariaHidden:n}));return a.length>1?c.default.createElement("picture",null,o(a),l):l})),H=c.default.forwardRef((function(e,t){var r=e.sizes,a=e.srcSet,o=e.src,i=e.style,n=e.onLoad,d=e.onError,u=e.loading,f=e.draggable,p=e.ariaHidden,h=(0,l.default)(e,["sizes","srcSet","src","style","onLoad","onError","loading","draggable","ariaHidden"]);return c.default.createElement("img",(0,s.default)({"aria-hidden":p,sizes:r,srcSet:a,src:o},h,{onLoad:n,onError:d,ref:t,loading:u,draggable:f,style:(0,s.default)({position:"absolute",top:0,left:0,width:"100%",height:"100%",objectFit:"cover",objectPosition:"center"},i)}))}));H.propTypes={style:d.default.object,onError:d.default.func,onLoad:d.default.func};var C=function(e){function t(t){var r;(r=e.call(this,t)||this).seenBefore=v&&g(t),r.isCritical="eager"===t.loading||t.critical,r.addNoScript=!(r.isCritical&&!t.fadeIn),r.useIOSupport=!y&&b&&!r.isCritical&&!r.seenBefore;var a=r.isCritical||v&&(y||!r.useIOSupport);return r.state={isVisible:a,imgLoaded:!1,imgCached:!1,fadeIn:!r.seenBefore&&t.fadeIn,isHydrated:!1},r.imageRef=c.default.createRef(),r.placeholderRef=t.placeholderRef||c.default.createRef(),r.handleImageLoaded=r.handleImageLoaded.bind((0,i.default)(r)),r.handleRef=r.handleRef.bind((0,i.default)(r)),r}(0,n.default)(t,e);var r=t.prototype;return r.componentDidMount=function(){if(this.setState({isHydrated:v}),this.state.isVisible&&"function"==typeof this.props.onStartLoad&&this.props.onStartLoad({wasCached:g(this.props)}),this.isCritical){var e=this.imageRef.current;e&&e.complete&&this.handleImageLoaded()}},r.componentWillUnmount=function(){this.cleanUpListeners&&this.cleanUpListeners()},r.handleRef=function(e){var t=this;this.useIOSupport&&e&&(this.cleanUpListeners=R(e,(function(){var e=g(t.props);t.state.isVisible||"function"!=typeof t.props.onStartLoad||t.props.onStartLoad({wasCached:e}),t.setState({isVisible:!0},(function(){t.setState({imgLoaded:e,imgCached:!(!t.imageRef.current||!t.imageRef.current.currentSrc)})}))})))},r.handleImageLoaded=function(){var e,t,r;e=this.props,t=u(e),(r=p(t))&&(m[r]=!0),this.setState({imgLoaded:!0}),this.props.onLoad&&this.props.onLoad()},r.render=function(){var e=u(this.props),t=e.title,r=e.alt,a=e.className,o=e.style,i=void 0===o?{}:o,n=e.imgStyle,l=void 0===n?{}:n,d=e.placeholderStyle,f=void 0===d?{}:d,p=e.placeholderClassName,m=e.fluid,g=e.fixed,y=e.backgroundColor,v=e.durationFadeIn,b=e.Tag,S=e.itemProp,w=e.loading,O=e.draggable,R=m||g;if(!R)return null;var C=!1===this.state.fadeIn||this.state.imgLoaded,M=!0===this.state.fadeIn&&!this.state.imgCached,N=(0,s.default)({opacity:C?1:0,transition:M?"opacity "+v+"ms":"none"},l),V="boolean"==typeof y?"lightgray":y,z={transitionDelay:v+"ms"},q=(0,s.default)({opacity:this.state.imgLoaded?0:1},M&&z,l,f),j={title:t,alt:this.state.isVisible?"":r,style:q,className:p,itemProp:S},k=this.state.isHydrated?h(R):R[0];if(m)return c.default.createElement(b,{className:(a||"")+" gatsby-image-wrapper",style:(0,s.default)({position:"relative",overflow:"hidden",maxWidth:k.maxWidth?k.maxWidth+"px":null,maxHeight:k.maxHeight?k.maxHeight+"px":null},i),ref:this.handleRef,key:"fluid-"+JSON.stringify(k.srcSet)},c.default.createElement(b,{"aria-hidden":!0,style:{width:"100%",paddingBottom:100/k.aspectRatio+"%"}}),V&&c.default.createElement(b,{"aria-hidden":!0,title:t,style:(0,s.default)({backgroundColor:V,position:"absolute",top:0,bottom:0,opacity:this.state.imgLoaded?0:1,right:0,left:0},M&&z)}),k.base64&&c.default.createElement(T,{ariaHidden:!0,ref:this.placeholderRef,src:k.base64,spreadProps:j,imageVariants:R,generateSources:I}),k.tracedSVG&&c.default.createElement(T,{ariaHidden:!0,ref:this.placeholderRef,src:k.tracedSVG,spreadProps:j,imageVariants:R,generateSources:L}),this.state.isVisible&&c.default.createElement("picture",null,E(R),c.default.createElement(H,{alt:r,title:t,sizes:k.sizes,src:k.src,crossOrigin:this.props.crossOrigin,srcSet:k.srcSet,style:N,ref:this.imageRef,onLoad:this.handleImageLoaded,onError:this.props.onError,itemProp:S,loading:w,draggable:O})),this.addNoScript&&c.default.createElement("noscript",{dangerouslySetInnerHTML:{__html:x((0,s.default)({alt:r,title:t,loading:w},k,{imageVariants:R}))}}));if(g){var P=(0,s.default)({position:"relative",overflow:"hidden",display:"inline-block",width:k.width,height:k.height},i);return"inherit"===i.display&&delete P.display,c.default.createElement(b,{className:(a||"")+" gatsby-image-wrapper",style:P,ref:this.handleRef,key:"fixed-"+JSON.stringify(k.srcSet)},V&&c.default.createElement(b,{"aria-hidden":!0,title:t,style:(0,s.default)({backgroundColor:V,width:k.width,opacity:this.state.imgLoaded?0:1,height:k.height},M&&z)}),k.base64&&c.default.createElement(T,{ariaHidden:!0,ref:this.placeholderRef,src:k.base64,spreadProps:j,imageVariants:R,generateSources:I}),k.tracedSVG&&c.default.createElement(T,{ariaHidden:!0,ref:this.placeholderRef,src:k.tracedSVG,spreadProps:j,imageVariants:R,generateSources:L}),this.state.isVisible&&c.default.createElement("picture",null,E(R),c.default.createElement(H,{alt:r,title:t,width:k.width,height:k.height,sizes:k.sizes,src:k.src,crossOrigin:this.props.crossOrigin,srcSet:k.srcSet,style:N,ref:this.imageRef,onLoad:this.handleImageLoaded,onError:this.props.onError,itemProp:S,loading:w,draggable:O})),this.addNoScript&&c.default.createElement("noscript",{dangerouslySetInnerHTML:{__html:x((0,s.default)({alt:r,title:t,loading:w},k,{imageVariants:R}))}}))}return null},t}(c.default.Component);C.defaultProps={fadeIn:!0,durationFadeIn:500,alt:"",Tag:"div",loading:"lazy"};var M=d.default.shape({width:d.default.number.isRequired,height:d.default.number.isRequired,src:d.default.string.isRequired,srcSet:d.default.string.isRequired,base64:d.default.string,tracedSVG:d.default.string,srcWebp:d.default.string,srcSetWebp:d.default.string,media:d.default.string}),N=d.default.shape({aspectRatio:d.default.number.isRequired,src:d.default.string.isRequired,srcSet:d.default.string.isRequired,sizes:d.default.string.isRequired,base64:d.default.string,tracedSVG:d.default.string,srcWebp:d.default.string,srcSetWebp:d.default.string,media:d.default.string,maxWidth:d.default.number,maxHeight:d.default.number});function V(e){return function(t,r,a){var o;if(!t.fixed&&!t.fluid)throw new Error("The prop `fluid` or `fixed` is marked as required in `"+a+"`, but their values are both `undefined`.");d.default.checkPropTypes(((o={})[r]=e,o),t,"prop",a)}}C.propTypes={resolutions:M,sizes:N,fixed:V(d.default.oneOfType([M,d.default.arrayOf(M)])),fluid:V(d.default.oneOfType([N,d.default.arrayOf(N)])),fadeIn:d.default.bool,durationFadeIn:d.default.number,title:d.default.string,alt:d.default.string,className:d.default.oneOfType([d.default.string,d.default.object]),critical:d.default.bool,crossOrigin:d.default.oneOfType([d.default.string,d.default.bool]),style:d.default.object,imgStyle:d.default.object,placeholderStyle:d.default.object,placeholderClassName:d.default.string,backgroundColor:d.default.oneOfType([d.default.string,d.default.bool]),onLoad:d.default.func,onError:d.default.func,onStartLoad:d.default.func,Tag:d.default.string,itemProp:d.default.string,loading:d.default.oneOf(["auto","lazy","eager"]),draggable:d.default.bool};var z=C;t.default=z},EXIE:function(e,t,r){"use strict";r.d(t,"c",(function(){return s})),r.d(t,"a",(function(){return c})),r.d(t,"b",(function(){return d}));var a,o=r("1jzt"),i=r.n(o),n=r("dwco"),l=r.n(n);function s(){return l.a.polyfill(),a=new i.a('a[href*="#"]',{speed:500,speedAsDuration:!0})}function c(){if(!a)throw Error("Not founded SmoothScroll instance");return a.destroy(),a=null}function d(e){if(!a)throw Error("Not founded SmoothScroll instance");return a.animateScroll(e),a}},dwco:function(e,t,r){!function(){"use strict";e.exports={polyfill:function(){var e=window,t=document;if(!("scrollBehavior"in t.documentElement.style)||!0===e.__forceSmoothScrollPolyfill__){var r,a=e.HTMLElement||e.Element,o={scroll:e.scroll||e.scrollTo,scrollBy:e.scrollBy,elementScroll:a.prototype.scroll||l,scrollIntoView:a.prototype.scrollIntoView},i=e.performance&&e.performance.now?e.performance.now.bind(e.performance):Date.now,n=(r=e.navigator.userAgent,new RegExp(["MSIE ","Trident/","Edge/"].join("|")).test(r)?1:0);e.scroll=e.scrollTo=function(){void 0!==arguments[0]&&(!0!==s(arguments[0])?h.call(e,t.body,void 0!==arguments[0].left?~~arguments[0].left:e.scrollX||e.pageXOffset,void 0!==arguments[0].top?~~arguments[0].top:e.scrollY||e.pageYOffset):o.scroll.call(e,void 0!==arguments[0].left?arguments[0].left:"object"!=typeof arguments[0]?arguments[0]:e.scrollX||e.pageXOffset,void 0!==arguments[0].top?arguments[0].top:void 0!==arguments[1]?arguments[1]:e.scrollY||e.pageYOffset))},e.scrollBy=function(){void 0!==arguments[0]&&(s(arguments[0])?o.scrollBy.call(e,void 0!==arguments[0].left?arguments[0].left:"object"!=typeof arguments[0]?arguments[0]:0,void 0!==arguments[0].top?arguments[0].top:void 0!==arguments[1]?arguments[1]:0):h.call(e,t.body,~~arguments[0].left+(e.scrollX||e.pageXOffset),~~arguments[0].top+(e.scrollY||e.pageYOffset)))},a.prototype.scroll=a.prototype.scrollTo=function(){if(void 0!==arguments[0])if(!0!==s(arguments[0])){var e=arguments[0].left,t=arguments[0].top;h.call(this,this,void 0===e?this.scrollLeft:~~e,void 0===t?this.scrollTop:~~t)}else{if("number"==typeof arguments[0]&&void 0===arguments[1])throw new SyntaxError("Value could not be converted");o.elementScroll.call(this,void 0!==arguments[0].left?~~arguments[0].left:"object"!=typeof arguments[0]?~~arguments[0]:this.scrollLeft,void 0!==arguments[0].top?~~arguments[0].top:void 0!==arguments[1]?~~arguments[1]:this.scrollTop)}},a.prototype.scrollBy=function(){void 0!==arguments[0]&&(!0!==s(arguments[0])?this.scroll({left:~~arguments[0].left+this.scrollLeft,top:~~arguments[0].top+this.scrollTop,behavior:arguments[0].behavior}):o.elementScroll.call(this,void 0!==arguments[0].left?~~arguments[0].left+this.scrollLeft:~~arguments[0]+this.scrollLeft,void 0!==arguments[0].top?~~arguments[0].top+this.scrollTop:~~arguments[1]+this.scrollTop))},a.prototype.scrollIntoView=function(){if(!0!==s(arguments[0])){var r=f(this),a=r.getBoundingClientRect(),i=this.getBoundingClientRect();r!==t.body?(h.call(this,r,r.scrollLeft+i.left-a.left,r.scrollTop+i.top-a.top),"fixed"!==e.getComputedStyle(r).position&&e.scrollBy({left:a.left,top:a.top,behavior:"smooth"})):e.scrollBy({left:i.left,top:i.top,behavior:"smooth"})}else o.scrollIntoView.call(this,void 0===arguments[0]||arguments[0])}}function l(e,t){this.scrollLeft=e,this.scrollTop=t}function s(e){if(null===e||"object"!=typeof e||void 0===e.behavior||"auto"===e.behavior||"instant"===e.behavior)return!0;if("object"==typeof e&&"smooth"===e.behavior)return!1;throw new TypeError("behavior member of ScrollOptions "+e.behavior+" is not a valid value for enumeration ScrollBehavior.")}function c(e,t){return"Y"===t?e.clientHeight+n1?1:l,r=.5*(1-Math.cos(Math.PI*n)),a=t.startX+(t.x-t.startX)*r,o=t.startY+(t.y-t.startY)*r,t.method.call(t.scrollable,a,o),a===t.x&&o===t.y||e.requestAnimationFrame(p.bind(e,t))}function h(r,a,n){var s,c,d,u,f=i();r===t.body?(s=e,c=e.scrollX||e.pageXOffset,d=e.scrollY||e.pageYOffset,u=o.scroll):(s=r,c=r.scrollLeft,d=r.scrollTop,u=l),p({scrollable:s,method:u,startTime:f,startX:c,startY:d,x:a,y:n})}}}}()},lbRd:function(e,t,r){"use strict";r.d(t,"a",(function(){return s}));var a=r("q1tI"),o=r.n(a),i=r("Wbzz"),n=r("9eSz"),l=r.n(n),s=(r("9H8W"),function(){return o.a.createElement(i.StaticQuery,{query:c,render:function(e){var t=e.site.siteMetadata,r=t.author,a=t.social,n=t.introduction;return o.a.createElement("div",{className:"bio"},o.a.createElement("div",{className:"author"},o.a.createElement("div",{className:"author-description"},o.a.createElement(l.a,{className:"author-image",fixed:e.avatar.childImageSharp.fixed,alt:r,style:{borderRadius:"100%"}}),o.a.createElement("div",{className:"author-name"},o.a.createElement("span",{className:"author-name-prefix"},"Written by"),o.a.createElement(i.Link,{to:"/about",className:"author-name-content"},o.a.createElement("span",null,"@",r)),o.a.createElement("div",{className:"author-introduction"},n),o.a.createElement("p",{className:"author-socials"},a.github&&o.a.createElement("a",{href:"https://github.com/"+a.github},"GitHub"),a.linkedin&&o.a.createElement("a",{href:"https://www.linkedin.com/in/"+a.linkedin+"/"},"LinkedIn"))))))}})}),c="2486386679"}}]); +//# sourceMappingURL=cd7d5f864fc9e15ed8adef086269b0aeff617554-64401eb54313e58b6cc6.js.map \ No newline at end of file diff --git a/cd7d5f864fc9e15ed8adef086269b0aeff617554-64401eb54313e58b6cc6.js.LICENSE.txt b/cd7d5f864fc9e15ed8adef086269b0aeff617554-64401eb54313e58b6cc6.js.LICENSE.txt new file mode 100644 index 00000000..9317e81d --- /dev/null +++ b/cd7d5f864fc9e15ed8adef086269b0aeff617554-64401eb54313e58b6cc6.js.LICENSE.txt @@ -0,0 +1 @@ +/*! smooth-scroll v16.1.3 | (c) 2020 Chris Ferdinandi | MIT License | http://github.com/cferdinandi/smooth-scroll */ diff --git a/cd7d5f864fc9e15ed8adef086269b0aeff617554-64401eb54313e58b6cc6.js.map b/cd7d5f864fc9e15ed8adef086269b0aeff617554-64401eb54313e58b6cc6.js.map new file mode 100644 index 00000000..e35f6657 --- /dev/null +++ b/cd7d5f864fc9e15ed8adef086269b0aeff617554-64401eb54313e58b6cc6.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./node_modules/smooth-scroll/dist/smooth-scroll.min.js","webpack:///./node_modules/gatsby-image/index.js","webpack:///./src/utils/scroll.js","webpack:///./node_modules/smoothscroll-polyfill/dist/smoothscroll.js","webpack:///./src/components/bio/index.jsx"],"names":["e","global","window","this","C","w","ignore","header","topOnEmptyHash","speed","speedAsDuration","durationMax","durationMin","clip","offset","easing","customEasing","updateURL","popstate","emitEvents","L","n","Array","prototype","forEach","call","arguments","t","hasOwnProperty","r","charAt","substr","String","o","length","a","i","charCodeAt","InvalidCharacterError","toString","H","Math","max","document","body","scrollHeight","documentElement","offsetHeight","clientHeight","x","focus","activeElement","setAttribute","style","outline","scrollTo","Q","CustomEvent","bubbles","detail","anchor","toggle","dispatchEvent","O","I","M","A","cancelAnimationFrame","cancelScroll","s","Object","tagName","c","pageYOffset","querySelector","u","l","d","f","m","h","p","parseInt","getComputedStyle","height","offsetTop","q","g","offsetParent","min","innerHeight","y","v","S","E","abs","history","pushState","smoothScroll","JSON","stringify","id","title","matchMedia","matches","floor","requestAnimationFrame","b","defaultPrevented","button","metaKey","ctrlKey","shiftKey","target","closest","toLowerCase","hostname","location","pathname","test","href","decodeURIComponent","hash","preventDefault","replaceState","state","animateScroll","destroy","removeEventListener","Element","addEventListener","_interopRequireDefault","require","exports","__esModule","default","io","_assertThisInitialized2","_inheritsLoose2","_objectWithoutPropertiesLoose2","_extends2","_react","_propTypes","convertProps","props","convertedProps","resolutions","sizes","critical","fixed","fluid","loading","groupByMedia","concat","matchesMedia","_ref","media","isBrowser","getImageCacheKey","_ref2","srcData","getCurrentSrcData","src","currentData","isArray","some","image","hasArtDirectionSupport","foundMedia","findIndex","noMedia","imageCache","create","inImageCache","cacheKey","hasNativeLazyLoadSupport","HTMLImageElement","hasIOSupport","IntersectionObserver","listeners","WeakMap","generateImageSources","imageVariants","map","_ref3","srcSet","srcSetWebp","createElement","Fragment","key","type","withMedia","without","variant","push","generateTracedSVGSources","_ref4","tracedSVG","generateBase64Sources","_ref5","base64","generateNoscriptSource","_ref6","isWebp","listenToIntersections","el","cb","observer","entries","entry","has","get","isIntersecting","intersectionRatio","unobserve","delete","rootMargin","observe","set","noscriptImg","alt","width","crossOrigin","draggable","join","Placeholder","forwardRef","ref","generateSources","spreadProps","ariaHidden","baseImage","Img","onLoad","onError","otherProps","position","top","left","objectFit","objectPosition","propTypes","object","func","Image","_React$Component","_this","seenBefore","isCritical","addNoScript","fadeIn","useIOSupport","isVisible","imgLoaded","imgCached","isHydrated","imageRef","createRef","placeholderRef","handleImageLoaded","bind","handleRef","_proto","componentDidMount","setState","onStartLoad","wasCached","img","current","complete","componentWillUnmount","cleanUpListeners","_this2","imageInCache","currentSrc","render","_convertProps","className","_convertProps$style","_convertProps$imgStyl","imgStyle","_convertProps$placeho","placeholderStyle","placeholderClassName","backgroundColor","durationFadeIn","Tag","itemProp","shouldReveal","shouldFadeIn","imageStyle","opacity","transition","bgColor","delayHideStyle","transitionDelay","imagePlaceholderStyle","placeholderImageProps","overflow","maxWidth","maxHeight","paddingBottom","aspectRatio","bottom","right","dangerouslySetInnerHTML","__html","divStyle","display","Component","defaultProps","fixedObject","shape","number","isRequired","string","srcWebp","fluidObject","requireFixedOrFluid","originalPropTypes","propName","componentName","_PropTypes$checkPropT","Error","checkPropTypes","oneOfType","arrayOf","bool","oneOf","_default","scroll","init","smoothscroll","polyfill","SmoothScroll","go","dest","module","__forceSmoothScrollPolyfill__","userAgent","HTMLElement","original","scrollBy","elementScroll","scrollElement","scrollIntoView","now","performance","Date","ROUNDING_TOLERANCE","navigator","RegExp","undefined","shouldBailOut","scrollX","pageXOffset","scrollY","scrollLeft","scrollTop","SyntaxError","behavior","scrollableParent","findScrollableParent","parentRects","getBoundingClientRect","clientRects","firstArg","TypeError","hasScrollableSpace","axis","clientWidth","scrollWidth","canOverflow","overflowValue","isScrollable","isScrollableY","isScrollableX","parentNode","host","step","context","value","currentX","currentY","k","elapsed","startTime","cos","PI","startX","startY","method","scrollable","Bio","React","StaticQuery","query","bioQuery","data","_data$site$siteMetada","site","siteMetadata","author","social","introduction","avatar","childImageSharp","borderRadius","Link","to","github","linkedin"],"mappings":"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","file":"cd7d5f864fc9e15ed8adef086269b0aeff617554-64401eb54313e58b6cc6.js","sourcesContent":["/*! smooth-scroll v16.1.3 | (c) 2020 Chris Ferdinandi | MIT License | http://github.com/cferdinandi/smooth-scroll */\n!function (e, t) {\n \"function\" == typeof define && define.amd ? define([], function () {\n return t(e);\n }) : \"object\" == typeof exports ? module.exports = t(e) : e.SmoothScroll = t(e);\n}(\"undefined\" != typeof global ? global : \"undefined\" != typeof window ? window : this, function (C) {\n \"use strict\";\n\n var w = {\n ignore: \"[data-scroll-ignore]\",\n header: null,\n topOnEmptyHash: !0,\n speed: 500,\n speedAsDuration: !1,\n durationMax: null,\n durationMin: null,\n clip: !0,\n offset: 0,\n easing: \"easeInOutCubic\",\n customEasing: null,\n updateURL: !0,\n popstate: !0,\n emitEvents: !0\n },\n L = function L() {\n var n = {};\n return Array.prototype.forEach.call(arguments, function (e) {\n for (var t in e) {\n if (!e.hasOwnProperty(t)) return;\n n[t] = e[t];\n }\n }), n;\n },\n r = function r(e) {\n \"#\" === e.charAt(0) && (e = e.substr(1));\n for (var t, n = String(e), o = n.length, a = -1, r = \"\", i = n.charCodeAt(0); ++a < o;) {\n if (0 === (t = n.charCodeAt(a))) throw new InvalidCharacterError(\"Invalid character: the input contains U+0000.\");\n 1 <= t && t <= 31 || 127 == t || 0 === a && 48 <= t && t <= 57 || 1 === a && 48 <= t && t <= 57 && 45 === i ? r += \"\\\\\" + t.toString(16) + \" \" : r += 128 <= t || 45 === t || 95 === t || 48 <= t && t <= 57 || 65 <= t && t <= 90 || 97 <= t && t <= 122 ? n.charAt(a) : \"\\\\\" + n.charAt(a);\n }\n return \"#\" + r;\n },\n H = function H() {\n return Math.max(document.body.scrollHeight, document.documentElement.scrollHeight, document.body.offsetHeight, document.documentElement.offsetHeight, document.body.clientHeight, document.documentElement.clientHeight);\n },\n q = function q(e) {\n return e ? (t = e, parseInt(C.getComputedStyle(t).height, 10) + e.offsetTop) : 0;\n var t;\n },\n x = function x(e, t, n) {\n 0 === e && document.body.focus(), n || (e.focus(), document.activeElement !== e && (e.setAttribute(\"tabindex\", \"-1\"), e.focus(), e.style.outline = \"none\"), C.scrollTo(0, t));\n },\n Q = function Q(e, t, n, o) {\n if (t.emitEvents && \"function\" == typeof C.CustomEvent) {\n var a = new CustomEvent(e, {\n bubbles: !0,\n detail: {\n anchor: n,\n toggle: o\n }\n });\n document.dispatchEvent(a);\n }\n };\n return function (o, e) {\n var O,\n a,\n I,\n M,\n A = {};\n A.cancelScroll = function (e) {\n cancelAnimationFrame(M), M = null, e || Q(\"scrollCancel\", O);\n }, A.animateScroll = function (a, r, e) {\n A.cancelScroll();\n var i = L(O || w, e || {}),\n s = \"[object Number]\" === Object.prototype.toString.call(a),\n t = s || !a.tagName ? null : a;\n if (s || t) {\n var c = C.pageYOffset;\n i.header && !I && (I = document.querySelector(i.header));\n var n,\n o,\n u,\n l,\n d,\n f,\n m,\n h,\n p = q(I),\n g = s ? a : function (e, t, n, o) {\n var a = 0;\n if (e.offsetParent) for (; a += e.offsetTop, e = e.offsetParent;);\n return a = Math.max(a - t - n, 0), o && (a = Math.min(a, H() - C.innerHeight)), a;\n }(t, p, parseInt(\"function\" == typeof i.offset ? i.offset(a, r) : i.offset, 10), i.clip),\n y = g - c,\n v = H(),\n S = 0,\n E = (n = y, u = (o = i).speedAsDuration ? o.speed : Math.abs(n / 1e3 * o.speed), o.durationMax && u > o.durationMax ? o.durationMax : o.durationMin && u < o.durationMin ? o.durationMin : parseInt(u, 10)),\n b = function b(e) {\n var t, n, o;\n l || (l = e), S += e - l, f = c + y * (n = d = 1 < (d = 0 === E ? 0 : S / E) ? 1 : d, \"easeInQuad\" === (t = i).easing && (o = n * n), \"easeOutQuad\" === t.easing && (o = n * (2 - n)), \"easeInOutQuad\" === t.easing && (o = n < .5 ? 2 * n * n : (4 - 2 * n) * n - 1), \"easeInCubic\" === t.easing && (o = n * n * n), \"easeOutCubic\" === t.easing && (o = --n * n * n + 1), \"easeInOutCubic\" === t.easing && (o = n < .5 ? 4 * n * n * n : (n - 1) * (2 * n - 2) * (2 * n - 2) + 1), \"easeInQuart\" === t.easing && (o = n * n * n * n), \"easeOutQuart\" === t.easing && (o = 1 - --n * n * n * n), \"easeInOutQuart\" === t.easing && (o = n < .5 ? 8 * n * n * n * n : 1 - 8 * --n * n * n * n), \"easeInQuint\" === t.easing && (o = n * n * n * n * n), \"easeOutQuint\" === t.easing && (o = 1 + --n * n * n * n * n), \"easeInOutQuint\" === t.easing && (o = n < .5 ? 16 * n * n * n * n * n : 1 + 16 * --n * n * n * n * n), t.customEasing && (o = t.customEasing(n)), o || n), C.scrollTo(0, Math.floor(f)), function (e, t) {\n var n = C.pageYOffset;\n if (e == t || n == t || (c < t && C.innerHeight + n) >= v) return A.cancelScroll(!0), x(a, t, s), Q(\"scrollStop\", i, a, r), !(M = l = null);\n }(f, g) || (M = C.requestAnimationFrame(b), l = e);\n };\n 0 === C.pageYOffset && C.scrollTo(0, 0), m = a, h = i, s || history.pushState && h.updateURL && history.pushState({\n smoothScroll: JSON.stringify(h),\n anchor: m.id\n }, document.title, m === document.documentElement ? \"#top\" : \"#\" + m.id), \"matchMedia\" in C && C.matchMedia(\"(prefers-reduced-motion)\").matches ? x(a, Math.floor(g), !1) : (Q(\"scrollStart\", i, a, r), A.cancelScroll(!0), C.requestAnimationFrame(b));\n }\n };\n var t = function t(e) {\n if (!e.defaultPrevented && !(0 !== e.button || e.metaKey || e.ctrlKey || e.shiftKey) && \"closest\" in e.target && (a = e.target.closest(o)) && \"a\" === a.tagName.toLowerCase() && !e.target.closest(O.ignore) && a.hostname === C.location.hostname && a.pathname === C.location.pathname && /#/.test(a.href)) {\n var t, n;\n try {\n t = r(decodeURIComponent(a.hash));\n } catch (e) {\n t = r(a.hash);\n }\n if (\"#\" === t) {\n if (!O.topOnEmptyHash) return;\n n = document.documentElement;\n } else n = document.querySelector(t);\n (n = n || \"#top\" !== t ? n : document.documentElement) && (e.preventDefault(), function (e) {\n if (history.replaceState && e.updateURL && !history.state) {\n var t = C.location.hash;\n t = t || \"\", history.replaceState({\n smoothScroll: JSON.stringify(e),\n anchor: t || C.pageYOffset\n }, document.title, t || C.location.href);\n }\n }(O), A.animateScroll(n, a));\n }\n },\n n = function n(e) {\n if (null !== history.state && history.state.smoothScroll && history.state.smoothScroll === JSON.stringify(O)) {\n var t = history.state.anchor;\n \"string\" == typeof t && t && !(t = document.querySelector(r(history.state.anchor))) || A.animateScroll(t, null, {\n updateURL: !1\n });\n }\n };\n A.destroy = function () {\n O && (document.removeEventListener(\"click\", t, !1), C.removeEventListener(\"popstate\", n, !1), A.cancelScroll(), M = I = a = O = null);\n };\n return function () {\n if (!(\"querySelector\" in document && \"addEventListener\" in C && \"requestAnimationFrame\" in C && \"closest\" in C.Element.prototype)) throw \"Smooth Scroll: This browser does not support the required JavaScript methods and browser APIs.\";\n A.destroy(), O = L(w, e || {}), I = O.header ? document.querySelector(O.header) : null, document.addEventListener(\"click\", t, !1), O.updateURL && O.popstate && C.addEventListener(\"popstate\", n, !1);\n }(), A;\n };\n});","\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nexports.__esModule = true;\nexports.default = void 0;\n\nvar _assertThisInitialized2 = _interopRequireDefault(require(\"@babel/runtime/helpers/assertThisInitialized\"));\n\nvar _inheritsLoose2 = _interopRequireDefault(require(\"@babel/runtime/helpers/inheritsLoose\"));\n\nvar _objectWithoutPropertiesLoose2 = _interopRequireDefault(require(\"@babel/runtime/helpers/objectWithoutPropertiesLoose\"));\n\nvar _extends2 = _interopRequireDefault(require(\"@babel/runtime/helpers/extends\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar logDeprecationNotice = function logDeprecationNotice(prop, replacement) {\n if (process.env.NODE_ENV === \"production\") {\n return;\n }\n\n console.log(\"\\n The \\\"\" + prop + \"\\\" prop is now deprecated and will be removed in the next major version\\n of \\\"gatsby-image\\\".\\n \");\n\n if (replacement) {\n console.log(\"Please use \" + replacement + \" instead of \\\"\" + prop + \"\\\".\");\n }\n}; // Handle legacy props during their deprecation phase\n\n\nvar convertProps = function convertProps(props) {\n var convertedProps = (0, _extends2.default)({}, props);\n var resolutions = convertedProps.resolutions,\n sizes = convertedProps.sizes,\n critical = convertedProps.critical;\n\n if (resolutions) {\n convertedProps.fixed = resolutions;\n logDeprecationNotice(\"resolutions\", \"the gatsby-image v2 prop \\\"fixed\\\"\");\n delete convertedProps.resolutions;\n }\n\n if (sizes) {\n convertedProps.fluid = sizes;\n logDeprecationNotice(\"sizes\", \"the gatsby-image v2 prop \\\"fluid\\\"\");\n delete convertedProps.sizes;\n }\n\n if (critical) {\n logDeprecationNotice(\"critical\", \"the native \\\"loading\\\" attribute\");\n convertedProps.loading = \"eager\";\n } // convert fluid & fixed to arrays so we only have to work with arrays\n\n\n if (convertedProps.fluid) {\n convertedProps.fluid = groupByMedia([].concat(convertedProps.fluid));\n }\n\n if (convertedProps.fixed) {\n convertedProps.fixed = groupByMedia([].concat(convertedProps.fixed));\n }\n\n return convertedProps;\n};\n/**\n * Checks if fluid or fixed are art-direction arrays.\n *\n * @param currentData {{media?: string}[]} The props to check for images.\n * @return {boolean}\n */\n\n\nvar hasArtDirectionSupport = function hasArtDirectionSupport(currentData) {\n return !!currentData && Array.isArray(currentData) && currentData.some(function (image) {\n return typeof image.media !== \"undefined\";\n });\n};\n/**\n * Tries to detect if a media query matches the current viewport.\n * @property media {{media?: string}} A media query string.\n * @return {boolean}\n */\n\n\nvar matchesMedia = function matchesMedia(_ref) {\n var media = _ref.media;\n return media ? isBrowser && !!window.matchMedia(media).matches : false;\n};\n/**\n * Find the source of an image to use as a key in the image cache.\n * Use `the first image in either `fixed` or `fluid`\n * @param {{fluid: {src: string, media?: string}[], fixed: {src: string, media?: string}[]}} args\n * @return {string?} Returns image src or undefined it not given.\n */\n\n\nvar getImageCacheKey = function getImageCacheKey(_ref2) {\n var fluid = _ref2.fluid,\n fixed = _ref2.fixed;\n var srcData = getCurrentSrcData(fluid || fixed || []);\n return srcData && srcData.src;\n};\n/**\n * Returns the current src - Preferably with art-direction support.\n * @param currentData {{media?: string}[], maxWidth?: Number, maxHeight?: Number} The fluid or fixed image array.\n * @return {{src: string, media?: string, maxWidth?: Number, maxHeight?: Number}}\n */\n\n\nvar getCurrentSrcData = function getCurrentSrcData(currentData) {\n if (isBrowser && hasArtDirectionSupport(currentData)) {\n // Do we have an image for the current Viewport?\n var foundMedia = currentData.findIndex(matchesMedia);\n\n if (foundMedia !== -1) {\n return currentData[foundMedia];\n } // No media matches, select first element without a media condition\n\n\n var noMedia = currentData.findIndex(function (image) {\n return typeof image.media === \"undefined\";\n });\n\n if (noMedia !== -1) {\n return currentData[noMedia];\n }\n } // Else return the first image.\n\n\n return currentData[0];\n}; // Cache if we've seen an image before so we don't bother with\n// lazy-loading & fading in on subsequent mounts.\n\n\nvar imageCache = Object.create({});\n\nvar inImageCache = function inImageCache(props) {\n var convertedProps = convertProps(props);\n var cacheKey = getImageCacheKey(convertedProps);\n return imageCache[cacheKey] || false;\n};\n\nvar activateCacheForImage = function activateCacheForImage(props) {\n var convertedProps = convertProps(props);\n var cacheKey = getImageCacheKey(convertedProps);\n\n if (cacheKey) {\n imageCache[cacheKey] = true;\n }\n}; // Native lazy-loading support: https://addyosmani.com/blog/lazy-loading/\n\n\nvar hasNativeLazyLoadSupport = typeof HTMLImageElement !== \"undefined\" && \"loading\" in HTMLImageElement.prototype;\nvar isBrowser = typeof window !== \"undefined\";\nvar hasIOSupport = isBrowser && window.IntersectionObserver;\nvar io;\nvar listeners = new WeakMap();\n\nfunction getIO() {\n if (typeof io === \"undefined\" && typeof window !== \"undefined\" && window.IntersectionObserver) {\n io = new window.IntersectionObserver(function (entries) {\n entries.forEach(function (entry) {\n if (listeners.has(entry.target)) {\n var cb = listeners.get(entry.target); // Edge doesn't currently support isIntersecting, so also test for an intersectionRatio > 0\n\n if (entry.isIntersecting || entry.intersectionRatio > 0) {\n io.unobserve(entry.target);\n listeners.delete(entry.target);\n cb();\n }\n }\n });\n }, {\n rootMargin: \"200px\"\n });\n }\n\n return io;\n}\n\nfunction generateImageSources(imageVariants) {\n return imageVariants.map(function (_ref3) {\n var src = _ref3.src,\n srcSet = _ref3.srcSet,\n srcSetWebp = _ref3.srcSetWebp,\n media = _ref3.media,\n sizes = _ref3.sizes;\n return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, {\n key: src\n }, srcSetWebp && /*#__PURE__*/_react.default.createElement(\"source\", {\n type: \"image/webp\",\n media: media,\n srcSet: srcSetWebp,\n sizes: sizes\n }), srcSet && /*#__PURE__*/_react.default.createElement(\"source\", {\n media: media,\n srcSet: srcSet,\n sizes: sizes\n }));\n });\n} // Return an array ordered by elements having a media prop, does not use\n// native sort, as a stable sort is not guaranteed by all browsers/versions\n\n\nfunction groupByMedia(imageVariants) {\n var withMedia = [];\n var without = [];\n imageVariants.forEach(function (variant) {\n return (variant.media ? withMedia : without).push(variant);\n });\n\n if (without.length > 1 && process.env.NODE_ENV !== \"production\") {\n console.warn(\"We've found \" + without.length + \" sources without a media property. They might be ignored by the browser, see: https://www.gatsbyjs.org/packages/gatsby-image/#art-directing-multiple-images\");\n }\n\n return [].concat(withMedia, without);\n}\n\nfunction generateTracedSVGSources(imageVariants) {\n return imageVariants.map(function (_ref4) {\n var src = _ref4.src,\n media = _ref4.media,\n tracedSVG = _ref4.tracedSVG;\n return /*#__PURE__*/_react.default.createElement(\"source\", {\n key: src,\n media: media,\n srcSet: tracedSVG\n });\n });\n}\n\nfunction generateBase64Sources(imageVariants) {\n return imageVariants.map(function (_ref5) {\n var src = _ref5.src,\n media = _ref5.media,\n base64 = _ref5.base64;\n return /*#__PURE__*/_react.default.createElement(\"source\", {\n key: src,\n media: media,\n srcSet: base64\n });\n });\n}\n\nfunction generateNoscriptSource(_ref6, isWebp) {\n var srcSet = _ref6.srcSet,\n srcSetWebp = _ref6.srcSetWebp,\n media = _ref6.media,\n sizes = _ref6.sizes;\n var src = isWebp ? srcSetWebp : srcSet;\n var mediaAttr = media ? \"media=\\\"\" + media + \"\\\" \" : \"\";\n var typeAttr = isWebp ? \"type='image/webp' \" : \"\";\n var sizesAttr = sizes ? \"sizes=\\\"\" + sizes + \"\\\" \" : \"\";\n return \"\";\n}\n\nfunction generateNoscriptSources(imageVariants) {\n return imageVariants.map(function (variant) {\n return (variant.srcSetWebp ? generateNoscriptSource(variant, true) : \"\") + generateNoscriptSource(variant);\n }).join(\"\");\n}\n\nvar listenToIntersections = function listenToIntersections(el, cb) {\n var observer = getIO();\n\n if (observer) {\n observer.observe(el);\n listeners.set(el, cb);\n }\n\n return function () {\n observer.unobserve(el);\n listeners.delete(el);\n };\n};\n\nvar noscriptImg = function noscriptImg(props) {\n // Check if prop exists before adding each attribute to the string output below to prevent\n // HTML validation issues caused by empty values like width=\"\" and height=\"\"\n var src = props.src ? \"src=\\\"\" + props.src + \"\\\" \" : \"src=\\\"\\\" \"; // required attribute\n\n var sizes = props.sizes ? \"sizes=\\\"\" + props.sizes + \"\\\" \" : \"\";\n var srcSet = props.srcSet ? \"srcset=\\\"\" + props.srcSet + \"\\\" \" : \"\";\n var title = props.title ? \"title=\\\"\" + props.title + \"\\\" \" : \"\";\n var alt = props.alt ? \"alt=\\\"\" + props.alt + \"\\\" \" : \"alt=\\\"\\\" \"; // required attribute\n\n var width = props.width ? \"width=\\\"\" + props.width + \"\\\" \" : \"\";\n var height = props.height ? \"height=\\\"\" + props.height + \"\\\" \" : \"\";\n var crossOrigin = props.crossOrigin ? \"crossorigin=\\\"\" + props.crossOrigin + \"\\\" \" : \"\";\n var loading = props.loading ? \"loading=\\\"\" + props.loading + \"\\\" \" : \"\";\n var draggable = props.draggable ? \"draggable=\\\"\" + props.draggable + \"\\\" \" : \"\";\n var sources = generateNoscriptSources(props.imageVariants);\n return \"\" + sources + \"\";\n}; // Earlier versions of gatsby-image during the 2.x cycle did not wrap\n// the `Img` component in a `picture` element. This maintains compatibility\n// until a breaking change can be introduced in the next major release\n\n\nvar Placeholder = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {\n var src = props.src,\n imageVariants = props.imageVariants,\n generateSources = props.generateSources,\n spreadProps = props.spreadProps,\n ariaHidden = props.ariaHidden;\n\n var baseImage = /*#__PURE__*/_react.default.createElement(Img, (0, _extends2.default)({\n ref: ref,\n src: src\n }, spreadProps, {\n ariaHidden: ariaHidden\n }));\n\n return imageVariants.length > 1 ? /*#__PURE__*/_react.default.createElement(\"picture\", null, generateSources(imageVariants), baseImage) : baseImage;\n});\n\nvar Img = /*#__PURE__*/_react.default.forwardRef(function (props, ref) {\n var sizes = props.sizes,\n srcSet = props.srcSet,\n src = props.src,\n style = props.style,\n onLoad = props.onLoad,\n onError = props.onError,\n loading = props.loading,\n draggable = props.draggable,\n ariaHidden = props.ariaHidden,\n otherProps = (0, _objectWithoutPropertiesLoose2.default)(props, [\"sizes\", \"srcSet\", \"src\", \"style\", \"onLoad\", \"onError\", \"loading\", \"draggable\", \"ariaHidden\"]);\n return /*#__PURE__*/_react.default.createElement(\"img\", (0, _extends2.default)({\n \"aria-hidden\": ariaHidden,\n sizes: sizes,\n srcSet: srcSet,\n src: src\n }, otherProps, {\n onLoad: onLoad,\n onError: onError,\n ref: ref,\n loading: loading,\n draggable: draggable,\n style: (0, _extends2.default)({\n position: \"absolute\",\n top: 0,\n left: 0,\n width: \"100%\",\n height: \"100%\",\n objectFit: \"cover\",\n objectPosition: \"center\"\n }, style)\n }));\n});\n\nImg.propTypes = {\n style: _propTypes.default.object,\n onError: _propTypes.default.func,\n onLoad: _propTypes.default.func\n};\n\nvar Image = /*#__PURE__*/function (_React$Component) {\n (0, _inheritsLoose2.default)(Image, _React$Component);\n\n function Image(props) {\n var _this;\n\n _this = _React$Component.call(this, props) || this; // If this image has already been loaded before then we can assume it's\n // already in the browser cache so it's cheap to just show directly.\n\n _this.seenBefore = isBrowser && inImageCache(props);\n _this.isCritical = props.loading === \"eager\" || props.critical;\n _this.addNoScript = !(_this.isCritical && !props.fadeIn);\n _this.useIOSupport = !hasNativeLazyLoadSupport && hasIOSupport && !_this.isCritical && !_this.seenBefore;\n var isVisible = _this.isCritical || isBrowser && (hasNativeLazyLoadSupport || !_this.useIOSupport);\n _this.state = {\n isVisible: isVisible,\n imgLoaded: false,\n imgCached: false,\n fadeIn: !_this.seenBefore && props.fadeIn,\n isHydrated: false\n };\n _this.imageRef = /*#__PURE__*/_react.default.createRef();\n _this.placeholderRef = props.placeholderRef || /*#__PURE__*/_react.default.createRef();\n _this.handleImageLoaded = _this.handleImageLoaded.bind((0, _assertThisInitialized2.default)(_this));\n _this.handleRef = _this.handleRef.bind((0, _assertThisInitialized2.default)(_this));\n return _this;\n }\n\n var _proto = Image.prototype;\n\n _proto.componentDidMount = function componentDidMount() {\n this.setState({\n isHydrated: isBrowser\n });\n\n if (this.state.isVisible && typeof this.props.onStartLoad === \"function\") {\n this.props.onStartLoad({\n wasCached: inImageCache(this.props)\n });\n }\n\n if (this.isCritical) {\n var img = this.imageRef.current;\n\n if (img && img.complete) {\n this.handleImageLoaded();\n }\n }\n };\n\n _proto.componentWillUnmount = function componentWillUnmount() {\n if (this.cleanUpListeners) {\n this.cleanUpListeners();\n }\n } // Specific to IntersectionObserver based lazy-load support\n ;\n\n _proto.handleRef = function handleRef(ref) {\n var _this2 = this;\n\n if (this.useIOSupport && ref) {\n this.cleanUpListeners = listenToIntersections(ref, function () {\n var imageInCache = inImageCache(_this2.props);\n\n if (!_this2.state.isVisible && typeof _this2.props.onStartLoad === \"function\") {\n _this2.props.onStartLoad({\n wasCached: imageInCache\n });\n } // imgCached and imgLoaded must update after isVisible,\n // Once isVisible is true, imageRef becomes accessible, which imgCached needs access to.\n // imgLoaded and imgCached are in a 2nd setState call to be changed together,\n // avoiding initiating unnecessary animation frames from style changes.\n\n\n _this2.setState({\n isVisible: true\n }, function () {\n _this2.setState({\n imgLoaded: imageInCache,\n // `currentSrc` should be a string, but can be `undefined` in IE,\n // !! operator validates the value is not undefined/null/\"\"\n // for lazyloaded components this might be null\n // TODO fix imgCached behaviour as it's now false when it's lazyloaded\n imgCached: !!(_this2.imageRef.current && _this2.imageRef.current.currentSrc)\n });\n });\n });\n }\n };\n\n _proto.handleImageLoaded = function handleImageLoaded() {\n activateCacheForImage(this.props);\n this.setState({\n imgLoaded: true\n });\n\n if (this.props.onLoad) {\n this.props.onLoad();\n }\n };\n\n _proto.render = function render() {\n var _convertProps = convertProps(this.props),\n title = _convertProps.title,\n alt = _convertProps.alt,\n className = _convertProps.className,\n _convertProps$style = _convertProps.style,\n style = _convertProps$style === void 0 ? {} : _convertProps$style,\n _convertProps$imgStyl = _convertProps.imgStyle,\n imgStyle = _convertProps$imgStyl === void 0 ? {} : _convertProps$imgStyl,\n _convertProps$placeho = _convertProps.placeholderStyle,\n placeholderStyle = _convertProps$placeho === void 0 ? {} : _convertProps$placeho,\n placeholderClassName = _convertProps.placeholderClassName,\n fluid = _convertProps.fluid,\n fixed = _convertProps.fixed,\n backgroundColor = _convertProps.backgroundColor,\n durationFadeIn = _convertProps.durationFadeIn,\n Tag = _convertProps.Tag,\n itemProp = _convertProps.itemProp,\n loading = _convertProps.loading,\n draggable = _convertProps.draggable;\n\n var imageVariants = fluid || fixed; // Abort early if missing image data (#25371)\n\n if (!imageVariants) {\n return null;\n }\n\n var shouldReveal = this.state.fadeIn === false || this.state.imgLoaded;\n var shouldFadeIn = this.state.fadeIn === true && !this.state.imgCached;\n var imageStyle = (0, _extends2.default)({\n opacity: shouldReveal ? 1 : 0,\n transition: shouldFadeIn ? \"opacity \" + durationFadeIn + \"ms\" : \"none\"\n }, imgStyle);\n var bgColor = typeof backgroundColor === \"boolean\" ? \"lightgray\" : backgroundColor;\n var delayHideStyle = {\n transitionDelay: durationFadeIn + \"ms\"\n };\n var imagePlaceholderStyle = (0, _extends2.default)({\n opacity: this.state.imgLoaded ? 0 : 1\n }, shouldFadeIn && delayHideStyle, imgStyle, placeholderStyle);\n var placeholderImageProps = {\n title: title,\n alt: !this.state.isVisible ? alt : \"\",\n style: imagePlaceholderStyle,\n className: placeholderClassName,\n itemProp: itemProp\n }; // Initial client render state needs to match SSR until hydration finishes.\n // Once hydration completes, render again to update to the correct image.\n // `imageVariants` is always an Array type at this point due to `convertProps()`\n\n var image = !this.state.isHydrated ? imageVariants[0] : getCurrentSrcData(imageVariants);\n\n if (fluid) {\n return /*#__PURE__*/_react.default.createElement(Tag, {\n className: (className ? className : \"\") + \" gatsby-image-wrapper\",\n style: (0, _extends2.default)({\n position: \"relative\",\n overflow: \"hidden\",\n maxWidth: image.maxWidth ? image.maxWidth + \"px\" : null,\n maxHeight: image.maxHeight ? image.maxHeight + \"px\" : null\n }, style),\n ref: this.handleRef,\n key: \"fluid-\" + JSON.stringify(image.srcSet)\n }, /*#__PURE__*/_react.default.createElement(Tag, {\n \"aria-hidden\": true,\n style: {\n width: \"100%\",\n paddingBottom: 100 / image.aspectRatio + \"%\"\n }\n }), bgColor && /*#__PURE__*/_react.default.createElement(Tag, {\n \"aria-hidden\": true,\n title: title,\n style: (0, _extends2.default)({\n backgroundColor: bgColor,\n position: \"absolute\",\n top: 0,\n bottom: 0,\n opacity: !this.state.imgLoaded ? 1 : 0,\n right: 0,\n left: 0\n }, shouldFadeIn && delayHideStyle)\n }), image.base64 && /*#__PURE__*/_react.default.createElement(Placeholder, {\n ariaHidden: true,\n ref: this.placeholderRef,\n src: image.base64,\n spreadProps: placeholderImageProps,\n imageVariants: imageVariants,\n generateSources: generateBase64Sources\n }), image.tracedSVG && /*#__PURE__*/_react.default.createElement(Placeholder, {\n ariaHidden: true,\n ref: this.placeholderRef,\n src: image.tracedSVG,\n spreadProps: placeholderImageProps,\n imageVariants: imageVariants,\n generateSources: generateTracedSVGSources\n }), this.state.isVisible && /*#__PURE__*/_react.default.createElement(\"picture\", null, generateImageSources(imageVariants), /*#__PURE__*/_react.default.createElement(Img, {\n alt: alt,\n title: title,\n sizes: image.sizes,\n src: image.src,\n crossOrigin: this.props.crossOrigin,\n srcSet: image.srcSet,\n style: imageStyle,\n ref: this.imageRef,\n onLoad: this.handleImageLoaded,\n onError: this.props.onError,\n itemProp: itemProp,\n loading: loading,\n draggable: draggable\n })), this.addNoScript && /*#__PURE__*/_react.default.createElement(\"noscript\", {\n dangerouslySetInnerHTML: {\n __html: noscriptImg((0, _extends2.default)({\n alt: alt,\n title: title,\n loading: loading\n }, image, {\n imageVariants: imageVariants\n }))\n }\n }));\n }\n\n if (fixed) {\n var divStyle = (0, _extends2.default)({\n position: \"relative\",\n overflow: \"hidden\",\n display: \"inline-block\",\n width: image.width,\n height: image.height\n }, style);\n\n if (style.display === \"inherit\") {\n delete divStyle.display;\n }\n\n return /*#__PURE__*/_react.default.createElement(Tag, {\n className: (className ? className : \"\") + \" gatsby-image-wrapper\",\n style: divStyle,\n ref: this.handleRef,\n key: \"fixed-\" + JSON.stringify(image.srcSet)\n }, bgColor && /*#__PURE__*/_react.default.createElement(Tag, {\n \"aria-hidden\": true,\n title: title,\n style: (0, _extends2.default)({\n backgroundColor: bgColor,\n width: image.width,\n opacity: !this.state.imgLoaded ? 1 : 0,\n height: image.height\n }, shouldFadeIn && delayHideStyle)\n }), image.base64 && /*#__PURE__*/_react.default.createElement(Placeholder, {\n ariaHidden: true,\n ref: this.placeholderRef,\n src: image.base64,\n spreadProps: placeholderImageProps,\n imageVariants: imageVariants,\n generateSources: generateBase64Sources\n }), image.tracedSVG && /*#__PURE__*/_react.default.createElement(Placeholder, {\n ariaHidden: true,\n ref: this.placeholderRef,\n src: image.tracedSVG,\n spreadProps: placeholderImageProps,\n imageVariants: imageVariants,\n generateSources: generateTracedSVGSources\n }), this.state.isVisible && /*#__PURE__*/_react.default.createElement(\"picture\", null, generateImageSources(imageVariants), /*#__PURE__*/_react.default.createElement(Img, {\n alt: alt,\n title: title,\n width: image.width,\n height: image.height,\n sizes: image.sizes,\n src: image.src,\n crossOrigin: this.props.crossOrigin,\n srcSet: image.srcSet,\n style: imageStyle,\n ref: this.imageRef,\n onLoad: this.handleImageLoaded,\n onError: this.props.onError,\n itemProp: itemProp,\n loading: loading,\n draggable: draggable\n })), this.addNoScript && /*#__PURE__*/_react.default.createElement(\"noscript\", {\n dangerouslySetInnerHTML: {\n __html: noscriptImg((0, _extends2.default)({\n alt: alt,\n title: title,\n loading: loading\n }, image, {\n imageVariants: imageVariants\n }))\n }\n }));\n }\n\n return null;\n };\n\n return Image;\n}(_react.default.Component);\n\nImage.defaultProps = {\n fadeIn: true,\n durationFadeIn: 500,\n alt: \"\",\n Tag: \"div\",\n // We set it to `lazy` by default because it's best to default to a performant\n // setting and let the user \"opt out\" to `eager`\n loading: \"lazy\"\n};\n\nvar fixedObject = _propTypes.default.shape({\n width: _propTypes.default.number.isRequired,\n height: _propTypes.default.number.isRequired,\n src: _propTypes.default.string.isRequired,\n srcSet: _propTypes.default.string.isRequired,\n base64: _propTypes.default.string,\n tracedSVG: _propTypes.default.string,\n srcWebp: _propTypes.default.string,\n srcSetWebp: _propTypes.default.string,\n media: _propTypes.default.string\n});\n\nvar fluidObject = _propTypes.default.shape({\n aspectRatio: _propTypes.default.number.isRequired,\n src: _propTypes.default.string.isRequired,\n srcSet: _propTypes.default.string.isRequired,\n sizes: _propTypes.default.string.isRequired,\n base64: _propTypes.default.string,\n tracedSVG: _propTypes.default.string,\n srcWebp: _propTypes.default.string,\n srcSetWebp: _propTypes.default.string,\n media: _propTypes.default.string,\n maxWidth: _propTypes.default.number,\n maxHeight: _propTypes.default.number\n});\n\nfunction requireFixedOrFluid(originalPropTypes) {\n return function (props, propName, componentName) {\n var _PropTypes$checkPropT;\n\n if (!props.fixed && !props.fluid) {\n throw new Error(\"The prop `fluid` or `fixed` is marked as required in `\" + componentName + \"`, but their values are both `undefined`.\");\n }\n\n _propTypes.default.checkPropTypes((_PropTypes$checkPropT = {}, _PropTypes$checkPropT[propName] = originalPropTypes, _PropTypes$checkPropT), props, \"prop\", componentName);\n };\n} // If you modify these propTypes, please don't forget to update following files as well:\n// https://github.com/gatsbyjs/gatsby/blob/master/packages/gatsby-image/index.d.ts\n// https://github.com/gatsbyjs/gatsby/blob/master/packages/gatsby-image/README.md#gatsby-image-props\n// https://github.com/gatsbyjs/gatsby/blob/master/docs/docs/gatsby-image.md#gatsby-image-props\n\n\nImage.propTypes = {\n resolutions: fixedObject,\n sizes: fluidObject,\n fixed: requireFixedOrFluid(_propTypes.default.oneOfType([fixedObject, _propTypes.default.arrayOf(fixedObject)])),\n fluid: requireFixedOrFluid(_propTypes.default.oneOfType([fluidObject, _propTypes.default.arrayOf(fluidObject)])),\n fadeIn: _propTypes.default.bool,\n durationFadeIn: _propTypes.default.number,\n title: _propTypes.default.string,\n alt: _propTypes.default.string,\n className: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.object]),\n // Support Glamor's css prop.\n critical: _propTypes.default.bool,\n crossOrigin: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.bool]),\n style: _propTypes.default.object,\n imgStyle: _propTypes.default.object,\n placeholderStyle: _propTypes.default.object,\n placeholderClassName: _propTypes.default.string,\n backgroundColor: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.bool]),\n onLoad: _propTypes.default.func,\n onError: _propTypes.default.func,\n onStartLoad: _propTypes.default.func,\n Tag: _propTypes.default.string,\n itemProp: _propTypes.default.string,\n loading: _propTypes.default.oneOf([\"auto\", \"lazy\", \"eager\"]),\n draggable: _propTypes.default.bool\n};\nvar _default = Image;\nexports.default = _default;","import SmoothScroll from 'smooth-scroll/dist/smooth-scroll.min'\nimport smoothscroll from 'smoothscroll-polyfill';\n\nlet scroll\n\nexport function init() {\n smoothscroll.polyfill()\n scroll = new SmoothScroll('a[href*=\"#\"]', {\n speed: 500,\n speedAsDuration: true,\n })\n return scroll\n}\n\nexport function destroy() {\n if (!scroll) throw Error('Not founded SmoothScroll instance')\n\n scroll.destroy()\n scroll = null\n\n return scroll\n}\n\nexport function go(dest) {\n if (!scroll) throw Error('Not founded SmoothScroll instance')\n\n scroll.animateScroll(dest)\n\n return scroll\n}\n","/* smoothscroll v0.4.4 - 2019 - Dustan Kasten, Jeremias Menichelli - MIT License */\n(function () {\n 'use strict';\n\n // polyfill\n function polyfill() {\n // aliases\n var w = window;\n var d = document;\n\n // return if scroll behavior is supported and polyfill is not forced\n if ('scrollBehavior' in d.documentElement.style && w.__forceSmoothScrollPolyfill__ !== true) {\n return;\n }\n\n // globals\n var Element = w.HTMLElement || w.Element;\n var SCROLL_TIME = 468;\n\n // object gathering original scroll methods\n var original = {\n scroll: w.scroll || w.scrollTo,\n scrollBy: w.scrollBy,\n elementScroll: Element.prototype.scroll || scrollElement,\n scrollIntoView: Element.prototype.scrollIntoView\n };\n\n // define timing method\n var now = w.performance && w.performance.now ? w.performance.now.bind(w.performance) : Date.now;\n\n /**\n * indicates if a the current browser is made by Microsoft\n * @method isMicrosoftBrowser\n * @param {String} userAgent\n * @returns {Boolean}\n */\n function isMicrosoftBrowser(userAgent) {\n var userAgentPatterns = ['MSIE ', 'Trident/', 'Edge/'];\n return new RegExp(userAgentPatterns.join('|')).test(userAgent);\n }\n\n /*\n * IE has rounding bug rounding down clientHeight and clientWidth and\n * rounding up scrollHeight and scrollWidth causing false positives\n * on hasScrollableSpace\n */\n var ROUNDING_TOLERANCE = isMicrosoftBrowser(w.navigator.userAgent) ? 1 : 0;\n\n /**\n * changes scroll position inside an element\n * @method scrollElement\n * @param {Number} x\n * @param {Number} y\n * @returns {undefined}\n */\n function scrollElement(x, y) {\n this.scrollLeft = x;\n this.scrollTop = y;\n }\n\n /**\n * returns result of applying ease math function to a number\n * @method ease\n * @param {Number} k\n * @returns {Number}\n */\n function ease(k) {\n return 0.5 * (1 - Math.cos(Math.PI * k));\n }\n\n /**\n * indicates if a smooth behavior should be applied\n * @method shouldBailOut\n * @param {Number|Object} firstArg\n * @returns {Boolean}\n */\n function shouldBailOut(firstArg) {\n if (firstArg === null || typeof firstArg !== 'object' || firstArg.behavior === undefined || firstArg.behavior === 'auto' || firstArg.behavior === 'instant') {\n // first argument is not an object/null\n // or behavior is auto, instant or undefined\n return true;\n }\n if (typeof firstArg === 'object' && firstArg.behavior === 'smooth') {\n // first argument is an object and behavior is smooth\n return false;\n }\n\n // throw error when behavior is not supported\n throw new TypeError('behavior member of ScrollOptions ' + firstArg.behavior + ' is not a valid value for enumeration ScrollBehavior.');\n }\n\n /**\n * indicates if an element has scrollable space in the provided axis\n * @method hasScrollableSpace\n * @param {Node} el\n * @param {String} axis\n * @returns {Boolean}\n */\n function hasScrollableSpace(el, axis) {\n if (axis === 'Y') {\n return el.clientHeight + ROUNDING_TOLERANCE < el.scrollHeight;\n }\n if (axis === 'X') {\n return el.clientWidth + ROUNDING_TOLERANCE < el.scrollWidth;\n }\n }\n\n /**\n * indicates if an element has a scrollable overflow property in the axis\n * @method canOverflow\n * @param {Node} el\n * @param {String} axis\n * @returns {Boolean}\n */\n function canOverflow(el, axis) {\n var overflowValue = w.getComputedStyle(el, null)['overflow' + axis];\n return overflowValue === 'auto' || overflowValue === 'scroll';\n }\n\n /**\n * indicates if an element can be scrolled in either axis\n * @method isScrollable\n * @param {Node} el\n * @param {String} axis\n * @returns {Boolean}\n */\n function isScrollable(el) {\n var isScrollableY = hasScrollableSpace(el, 'Y') && canOverflow(el, 'Y');\n var isScrollableX = hasScrollableSpace(el, 'X') && canOverflow(el, 'X');\n return isScrollableY || isScrollableX;\n }\n\n /**\n * finds scrollable parent of an element\n * @method findScrollableParent\n * @param {Node} el\n * @returns {Node} el\n */\n function findScrollableParent(el) {\n while (el !== d.body && isScrollable(el) === false) {\n el = el.parentNode || el.host;\n }\n return el;\n }\n\n /**\n * self invoked function that, given a context, steps through scrolling\n * @method step\n * @param {Object} context\n * @returns {undefined}\n */\n function step(context) {\n var time = now();\n var value;\n var currentX;\n var currentY;\n var elapsed = (time - context.startTime) / SCROLL_TIME;\n\n // avoid elapsed times higher than one\n elapsed = elapsed > 1 ? 1 : elapsed;\n\n // apply easing to elapsed time\n value = ease(elapsed);\n currentX = context.startX + (context.x - context.startX) * value;\n currentY = context.startY + (context.y - context.startY) * value;\n context.method.call(context.scrollable, currentX, currentY);\n\n // scroll more if we have not reached our destination\n if (currentX !== context.x || currentY !== context.y) {\n w.requestAnimationFrame(step.bind(w, context));\n }\n }\n\n /**\n * scrolls window or element with a smooth behavior\n * @method smoothScroll\n * @param {Object|Node} el\n * @param {Number} x\n * @param {Number} y\n * @returns {undefined}\n */\n function smoothScroll(el, x, y) {\n var scrollable;\n var startX;\n var startY;\n var method;\n var startTime = now();\n\n // define scroll context\n if (el === d.body) {\n scrollable = w;\n startX = w.scrollX || w.pageXOffset;\n startY = w.scrollY || w.pageYOffset;\n method = original.scroll;\n } else {\n scrollable = el;\n startX = el.scrollLeft;\n startY = el.scrollTop;\n method = scrollElement;\n }\n\n // scroll looping over a frame\n step({\n scrollable: scrollable,\n method: method,\n startTime: startTime,\n startX: startX,\n startY: startY,\n x: x,\n y: y\n });\n }\n\n // ORIGINAL METHODS OVERRIDES\n // w.scroll and w.scrollTo\n w.scroll = w.scrollTo = function () {\n // avoid action when no arguments are passed\n if (arguments[0] === undefined) {\n return;\n }\n\n // avoid smooth behavior if not required\n if (shouldBailOut(arguments[0]) === true) {\n original.scroll.call(w, arguments[0].left !== undefined ? arguments[0].left : typeof arguments[0] !== 'object' ? arguments[0] : w.scrollX || w.pageXOffset,\n // use top prop, second argument if present or fallback to scrollY\n arguments[0].top !== undefined ? arguments[0].top : arguments[1] !== undefined ? arguments[1] : w.scrollY || w.pageYOffset);\n return;\n }\n\n // LET THE SMOOTHNESS BEGIN!\n smoothScroll.call(w, d.body, arguments[0].left !== undefined ? ~~arguments[0].left : w.scrollX || w.pageXOffset, arguments[0].top !== undefined ? ~~arguments[0].top : w.scrollY || w.pageYOffset);\n };\n\n // w.scrollBy\n w.scrollBy = function () {\n // avoid action when no arguments are passed\n if (arguments[0] === undefined) {\n return;\n }\n\n // avoid smooth behavior if not required\n if (shouldBailOut(arguments[0])) {\n original.scrollBy.call(w, arguments[0].left !== undefined ? arguments[0].left : typeof arguments[0] !== 'object' ? arguments[0] : 0, arguments[0].top !== undefined ? arguments[0].top : arguments[1] !== undefined ? arguments[1] : 0);\n return;\n }\n\n // LET THE SMOOTHNESS BEGIN!\n smoothScroll.call(w, d.body, ~~arguments[0].left + (w.scrollX || w.pageXOffset), ~~arguments[0].top + (w.scrollY || w.pageYOffset));\n };\n\n // Element.prototype.scroll and Element.prototype.scrollTo\n Element.prototype.scroll = Element.prototype.scrollTo = function () {\n // avoid action when no arguments are passed\n if (arguments[0] === undefined) {\n return;\n }\n\n // avoid smooth behavior if not required\n if (shouldBailOut(arguments[0]) === true) {\n // if one number is passed, throw error to match Firefox implementation\n if (typeof arguments[0] === 'number' && arguments[1] === undefined) {\n throw new SyntaxError('Value could not be converted');\n }\n original.elementScroll.call(this,\n // use left prop, first number argument or fallback to scrollLeft\n arguments[0].left !== undefined ? ~~arguments[0].left : typeof arguments[0] !== 'object' ? ~~arguments[0] : this.scrollLeft,\n // use top prop, second argument or fallback to scrollTop\n arguments[0].top !== undefined ? ~~arguments[0].top : arguments[1] !== undefined ? ~~arguments[1] : this.scrollTop);\n return;\n }\n var left = arguments[0].left;\n var top = arguments[0].top;\n\n // LET THE SMOOTHNESS BEGIN!\n smoothScroll.call(this, this, typeof left === 'undefined' ? this.scrollLeft : ~~left, typeof top === 'undefined' ? this.scrollTop : ~~top);\n };\n\n // Element.prototype.scrollBy\n Element.prototype.scrollBy = function () {\n // avoid action when no arguments are passed\n if (arguments[0] === undefined) {\n return;\n }\n\n // avoid smooth behavior if not required\n if (shouldBailOut(arguments[0]) === true) {\n original.elementScroll.call(this, arguments[0].left !== undefined ? ~~arguments[0].left + this.scrollLeft : ~~arguments[0] + this.scrollLeft, arguments[0].top !== undefined ? ~~arguments[0].top + this.scrollTop : ~~arguments[1] + this.scrollTop);\n return;\n }\n this.scroll({\n left: ~~arguments[0].left + this.scrollLeft,\n top: ~~arguments[0].top + this.scrollTop,\n behavior: arguments[0].behavior\n });\n };\n\n // Element.prototype.scrollIntoView\n Element.prototype.scrollIntoView = function () {\n // avoid smooth behavior if not required\n if (shouldBailOut(arguments[0]) === true) {\n original.scrollIntoView.call(this, arguments[0] === undefined ? true : arguments[0]);\n return;\n }\n\n // LET THE SMOOTHNESS BEGIN!\n var scrollableParent = findScrollableParent(this);\n var parentRects = scrollableParent.getBoundingClientRect();\n var clientRects = this.getBoundingClientRect();\n if (scrollableParent !== d.body) {\n // reveal element inside parent\n smoothScroll.call(this, scrollableParent, scrollableParent.scrollLeft + clientRects.left - parentRects.left, scrollableParent.scrollTop + clientRects.top - parentRects.top);\n\n // reveal parent in viewport unless is fixed\n if (w.getComputedStyle(scrollableParent).position !== 'fixed') {\n w.scrollBy({\n left: parentRects.left,\n top: parentRects.top,\n behavior: 'smooth'\n });\n }\n } else {\n // reveal element in viewport\n w.scrollBy({\n left: clientRects.left,\n top: clientRects.top,\n behavior: 'smooth'\n });\n }\n };\n }\n if (typeof exports === 'object' && typeof module !== 'undefined') {\n // commonjs\n module.exports = {\n polyfill: polyfill\n };\n } else {\n // global\n polyfill();\n }\n})();","import React from 'react'\nimport { StaticQuery, graphql, Link } from 'gatsby'\nimport Image from 'gatsby-image'\n\nimport './index.scss'\n\nexport const Bio = () => (\n {\n const { author, social, introduction } = data.site.siteMetadata\n\n return (\n
    \n
    \n
    \n \n
    \n Written by\n \n @{author}\n \n
    {introduction}
    \n

    \n {social.github && (\n GitHub\n )}\n {social.linkedin && (\n \n LinkedIn\n \n )}\n

    \n
    \n
    \n
    \n
    \n )\n }}\n />\n)\n\nconst bioQuery = graphql`\n query BioQuery {\n avatar: file(absolutePath: { regex: \"/profile.png/\" }) {\n childImageSharp {\n fixed(width: 72, height: 72) {\n ...GatsbyImageSharpFixed\n }\n }\n }\n site {\n siteMetadata {\n author\n introduction\n social {\n twitter\n github\n medium\n facebook\n linkedin\n instagram\n }\n }\n }\n }\n`\n\nexport default Bio\n"],"sourceRoot":""} \ No newline at end of file diff --git a/chunk-map.json b/chunk-map.json new file mode 100644 index 00000000..81cd4362 --- /dev/null +++ b/chunk-map.json @@ -0,0 +1 @@ +{"polyfill":["/polyfill-da26d3b44af2cdb21dfe.js"],"app":["/app-023ae061509e1db264bf.js"],"component---node-modules-gatsby-plugin-offline-app-shell-js":["/component---node-modules-gatsby-plugin-offline-app-shell-js-44ceac2081f421b30e8f.js"],"component---src-pages-404-js":["/component---src-pages-404-js-31aa5c53ee5407a7ab67.js"],"component---src-pages-about-js":["/component---src-pages-about-js-9a3fe6e954bb22e55c5f.js"],"component---src-pages-index-js":["/component---src-pages-index-js-6f20049b11847c1e94d5.js"],"component---src-templates-blog-post-js":["/component---src-templates-blog-post-js-cb28e3e400a2ad9977f2.js"]} \ No newline at end of file diff --git a/component---node-modules-gatsby-plugin-offline-app-shell-js-44ceac2081f421b30e8f.js b/component---node-modules-gatsby-plugin-offline-app-shell-js-44ceac2081f421b30e8f.js new file mode 100644 index 00000000..fd460e46 --- /dev/null +++ b/component---node-modules-gatsby-plugin-offline-app-shell-js-44ceac2081f421b30e8f.js @@ -0,0 +1,2 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[6],{MqWW:function(t,e,n){"use strict";var u=n("TqRt");e.__esModule=!0,e.default=void 0;var a=u(n("VbXa")),o=u(n("q1tI")),r=function(t){function e(){return t.apply(this,arguments)||this}return(0,a.default)(e,t),e.prototype.render=function(){return o.default.createElement(o.default.Fragment,null)},e}(o.default.Component);e.default=r}}]); +//# sourceMappingURL=component---node-modules-gatsby-plugin-offline-app-shell-js-44ceac2081f421b30e8f.js.map \ No newline at end of file diff --git a/component---node-modules-gatsby-plugin-offline-app-shell-js-44ceac2081f421b30e8f.js.map b/component---node-modules-gatsby-plugin-offline-app-shell-js-44ceac2081f421b30e8f.js.map new file mode 100644 index 00000000..7fd37f15 --- /dev/null +++ b/component---node-modules-gatsby-plugin-offline-app-shell-js-44ceac2081f421b30e8f.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./node_modules/gatsby-plugin-offline/app-shell.js"],"names":["_interopRequireDefault","require","exports","__esModule","_inheritsLoose2","_react","_default","_React$Component","AppShell","apply","this","arguments","prototype","render","createElement","Fragment","Component"],"mappings":"2FAEA,IAAIA,EAAyBC,EAAQ,QAErCC,EAAQC,YAAa,EACrBD,EAAiB,aAAI,EAErB,IAAIE,EAAkBJ,EAAuBC,EAAQ,SAEjDI,EAASL,EAAuBC,EAAQ,SAoBxCK,EAhBJ,SAAUC,GAGR,SAASC,IACP,OAAOD,EAAiBE,MAAMC,KAAMC,YAAcD,KASpD,OAZA,EAAIN,EAAyB,SAAGI,EAAUD,GAM7BC,EAASI,UAEfC,OAAS,WACd,OAAOR,EAAgB,QAAES,cAAcT,EAAgB,QAAEU,SAAU,OAG9DP,EAbT,CAcEH,EAAgB,QAAEW,WAGpBd,EAAiB,QAAII","file":"component---node-modules-gatsby-plugin-offline-app-shell-js-44ceac2081f421b30e8f.js","sourcesContent":["\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nexports.__esModule = true;\nexports[\"default\"] = void 0;\n\nvar _inheritsLoose2 = _interopRequireDefault(require(\"@babel/runtime/helpers/inheritsLoose\"));\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar AppShell =\n/*#__PURE__*/\nfunction (_React$Component) {\n (0, _inheritsLoose2[\"default\"])(AppShell, _React$Component);\n\n function AppShell() {\n return _React$Component.apply(this, arguments) || this;\n }\n\n var _proto = AppShell.prototype;\n\n _proto.render = function render() {\n return _react[\"default\"].createElement(_react[\"default\"].Fragment, null);\n };\n\n return AppShell;\n}(_react[\"default\"].Component);\n\nvar _default = AppShell;\nexports[\"default\"] = _default;"],"sourceRoot":""} \ No newline at end of file diff --git a/component---src-pages-404-js-31aa5c53ee5407a7ab67.js b/component---src-pages-404-js-31aa5c53ee5407a7ab67.js new file mode 100644 index 00000000..354772b4 --- /dev/null +++ b/component---src-pages-404-js-31aa5c53ee5407a7ab67.js @@ -0,0 +1,2 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[7],{w2l6:function(t,e,n){"use strict";n.r(e);var a=n("dI71"),o=n("q1tI"),r=n.n(o),i=n("hpys"),s=n("CC2r"),u=function(t){function e(){return t.apply(this,arguments)||this}return Object(a.a)(e,t),e.prototype.render=function(){var t=this.props.data.site.siteMetadata.title;return r.a.createElement(i.a,{location:this.props.location,title:t},r.a.createElement(s.a,{title:"404: Not Found"}),r.a.createElement("h1",null,"Not Found"),r.a.createElement("p",null,"You just hit a route that doesn't exist... the sadness."))},e}(r.a.Component);e.default=u}}]); +//# sourceMappingURL=component---src-pages-404-js-31aa5c53ee5407a7ab67.js.map \ No newline at end of file diff --git a/component---src-pages-404-js-31aa5c53ee5407a7ab67.js.map b/component---src-pages-404-js-31aa5c53ee5407a7ab67.js.map new file mode 100644 index 00000000..3a43e63c --- /dev/null +++ b/component---src-pages-404-js-31aa5c53ee5407a7ab67.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/pages/404.js"],"names":["NotFoundPage","_React$Component","apply","arguments","_inheritsLoose","prototype","render","siteTitle","this","props","data","site","siteMetadata","title","React","createElement","Layout","location","Head","Component"],"mappings":"+JAMMA,EAAY,SAAAC,GAAA,SAAAD,IAAA,OAAAC,EAAAC,MAAA,KAAAC,YAAA,KAYf,OAZeC,YAAAJ,EAAAC,GAAAD,EAAAK,UAChBC,OAAA,WACE,IACMC,EADWC,KAAKC,MAAdC,KACeC,KAAKC,aAAaC,MAEzC,OACEC,IAAAC,cAACC,IAAM,CAACC,SAAUT,KAAKC,MAAMQ,SAAUJ,MAAON,GAC5CO,IAAAC,cAACG,IAAI,CAACL,MAAM,mBACZC,IAAAC,cAAA,UAAI,aACJD,IAAAC,cAAA,SAAG,6DAGRf,EAZe,CAASc,IAAMK,WAelBnB","file":"component---src-pages-404-js-31aa5c53ee5407a7ab67.js","sourcesContent":["import React from 'react'\nimport { graphql } from 'gatsby'\n\nimport { Layout } from '../layout'\nimport { Head } from '../components/head'\n\nclass NotFoundPage extends React.Component {\n render() {\n const { data } = this.props\n const siteTitle = data.site.siteMetadata.title\n\n return (\n \n \n

    Not Found

    \n

    You just hit a route that doesn't exist... the sadness.

    \n
    \n )\n }\n}\n\nexport default NotFoundPage\n\nexport const pageQuery = graphql`\n query {\n site {\n siteMetadata {\n title\n }\n }\n }\n`\n"],"sourceRoot":""} \ No newline at end of file diff --git a/component---src-pages-about-js-9a3fe6e954bb22e55c5f.js b/component---src-pages-about-js-9a3fe6e954bb22e55c5f.js new file mode 100644 index 00000000..3cfe6227 --- /dev/null +++ b/component---src-pages-about-js-9a3fe6e954bb22e55c5f.js @@ -0,0 +1,2 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[8],{"3XHS":function(t,e,a){"use strict";a.r(e);var n=a("q1tI"),r=a.n(n),i=a("p3AD"),o=a("WlAH");e.default=function(t){var e=t.data.allMarkdownRemark.edges.filter((function(t){return t.node.frontmatter.lang===o.b})).map((function(t){return t.node}))[0];return r.a.createElement("div",{style:{marginLeft:"auto",marginRight:"auto",maxWidth:Object(i.a)(24),padding:Object(i.a)(.5)+" "+Object(i.a)(3/4)+" "+Object(i.a)(1.5)+" "+Object(i.a)(3/4)}},r.a.createElement("div",{dangerouslySetInnerHTML:{__html:e.html}}))}}}]); +//# sourceMappingURL=component---src-pages-about-js-9a3fe6e954bb22e55c5f.js.map \ No newline at end of file diff --git a/component---src-pages-about-js-9a3fe6e954bb22e55c5f.js.map b/component---src-pages-about-js-9a3fe6e954bb22e55c5f.js.map new file mode 100644 index 00000000..18d2e1a8 --- /dev/null +++ b/component---src-pages-about-js-9a3fe6e954bb22e55c5f.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/pages/about.js"],"names":["_ref","resume","data","allMarkdownRemark","edges","filter","_ref2","node","frontmatter","lang","Lang","map","_ref3","React","createElement","style","marginLeft","marginRight","maxWidth","rhythm","padding","dangerouslySetInnerHTML","__html","html"],"mappings":"6FAAA,wDAMe,mBAAAA,GAAe,IAGtBC,EAHcD,EAAJE,KACKC,kBAAkBC,MAGpCC,QAAO,SAAAC,GAAO,OAAAA,EAAJC,KAAgBC,YAAYC,OAASC,OAC/CC,KAAI,SAAAC,GAAO,OAAAA,EAAJL,QAAiB,GAE3B,OACEM,IAAAC,cAAA,OACEC,MAAO,CACLC,WAAW,OACXC,YAAY,OACZC,SAAUC,YAAO,IACjBC,QAAYD,YAAO,IAAI,IAAIA,YAAO,EAAI,GAAE,IAAIA,YAAO,KAAI,IAAIA,YACzD,EAAI,KAIRN,IAAAC,cAAA,OAAKO,wBAAyB,CAAEC,OAAQrB,EAAOsB","file":"component---src-pages-about-js-9a3fe6e954bb22e55c5f.js","sourcesContent":["import React from 'react'\nimport { graphql } from 'gatsby'\n\nimport { rhythm } from '../utils/typography'\nimport * as Lang from '../constants'\n\nexport default ({ data }) => {\n const resumes = data.allMarkdownRemark.edges\n\n const resume = resumes\n .filter(({ node }) => node.frontmatter.lang === Lang.ENGLISH)\n .map(({ node }) => node)[0]\n\n return (\n \n
    \n
    \n )\n}\n\nexport const pageQuery = graphql`\n query {\n allMarkdownRemark(filter: { frontmatter: { category: { eq: null } } }) {\n edges {\n node {\n id\n excerpt(pruneLength: 160)\n html\n frontmatter {\n title\n date(formatString: \"MMMM DD, YYYY\")\n lang\n }\n }\n }\n }\n }\n`\n"],"sourceRoot":""} \ No newline at end of file diff --git a/component---src-pages-index-js-6f20049b11847c1e94d5.js b/component---src-pages-index-js-6f20049b11847c1e94d5.js new file mode 100644 index 00000000..b5c474c7 --- /dev/null +++ b/component---src-pages-index-js-6f20049b11847c1e94d5.js @@ -0,0 +1,2 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[9],{"7tbW":function(e,t,r){var n=r("LGYb");e.exports=function(e){return e&&e.length?n(e):[]}},"8jRI":function(e,t,r){"use strict";var n=new RegExp("(%[a-f0-9]{2})|([^%]+?)","gi"),o=new RegExp("(%[a-f0-9]{2})+","gi");function a(e,t){try{return[decodeURIComponent(e.join(""))]}catch(o){}if(1===e.length)return e;t=t||1;var r=e.slice(0,t),n=e.slice(t);return Array.prototype.concat.call([],a(r),a(n))}function i(e){try{return decodeURIComponent(e)}catch(o){for(var t=e.match(n)||[],r=1;r=200){var m=t?null:c(e);if(m)return u(m);p=!1,l=i,y=new n}else y=t?[]:d;e:for(;++s316&&O.b(316)},o=Object(i.useCallback)((function(e){r(e),n(),window.history.pushState({category:e},"",window.location.pathname+"?"+E.a.stringify({category:e}))}),[]),a=Object(i.useCallback)((function(e){void 0===e&&(e=!0);var t=E.a.parse(location.search).category,o=null==t?h.a.ALL:t;r(o),e&&n()}),[]);return Object(i.useEffect)((function(){return O.c(),function(){O.a()}}),[]),Object(i.useEffect)((function(){return window.addEventListener("popstate",a),function(){window.removeEventListener("popstate",a)}}),[]),Object(i.useEffect)((function(){a(!1)}),[]),[t,o]}function I(){Object(i.useEffect)((function(){return n=new IntersectionObserver(m,{root:y.d("#___gatsby"),rootMargin:"20px",threshold:.8}),v(),function(){g(),n=null}}),[]),Object(i.useEffect)((function(){g().then(v)}))}var C=r("2w9V");var A=r("hpys");t.default=function(e){var t,r=e.data,n=e.location,o=r.site.siteMetadata,s=o.configs.countOfInitialPost,l=r.allMarkdownRemark.edges,p=Object(i.useMemo)((function(){return a()(l.map((function(e){return e.node.frontmatter.category})))}),[]),d=function(){var e=C.a(1),t=Object(i.useState)(e),r=t[0],n=t[1],o=Object(i.useRef)(r);return Object(i.useEffect)((function(){o.current=r,C.c(r)}),[r]),[r,o,function(){return n((function(e){return e+1}))}]}(),m=d[0],v=d[1],g=d[2],b=k(),w=b[0],E=b[1];return I(),t=function(){var e=window.scrollY+window.innerHeight,t=function(){return function(e){return y.c()-e}(e)<80};return function(e,t){var r=t.dismissCondition,n=void 0===r?function(){return!1}:r,o=t.triggerCondition,a=void 0===o?function(){return!0}:o;if(!e)throw Error("Invalid required arguments");var i=!1;return function(){if(!i)return i=!0,requestAnimationFrame((function(){if(!n())return a()?(i=!1,e()):void 0;i=!1}))}}(g,{dismissCondition:function(){return!t()},triggerCondition:function(){return t()&&l.length>v.current*s}})()},Object(i.useEffect)((function(){return window.addEventListener("scroll",t,{passive:!1}),function(){window.removeEventListener("scroll",t,{passive:!1})}}),[]),c.a.createElement(A.a,{location:n,title:o.title},c.a.createElement(j.a,{title:h.c,keywords:o.keywords}),c.a.createElement(u.a,null),c.a.createElement(f,{categories:p,category:w,selectCategory:E}),c.a.createElement(x,{posts:l,countOfInitialPost:s,count:m,category:w}))}},WkPL:function(e,t){e.exports=function(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(e){throw e},f:o}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var a,c=!0,u=!1;return{s:function(){r=r.call(e)},n:function(){var e=r.next();return c=e.done,e},e:function(e){u=!0,a=e},f:function(){try{c||null==r.return||r.return()}finally{if(u)throw a}}}}function i(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=new Array(t);r0})).join("&")},t.parseUrl=function(e,t){t=Object.assign({decode:!0},t);var r=s(e,"#"),o=n(r,2),a=o[0],i=o[1];return Object.assign({url:a.split("?")[0]||"",query:g(m(e),t)},t&&t.parseFragmentIdentifier&&i?{fragmentIdentifier:d(i,t)}:{})},t.stringifyUrl=function(e,r){r=Object.assign({encode:!0,strict:!0},r);var n=y(e.url).split("?")[0]||"",o=t.extract(e.url),a=t.parse(o,{sort:!1}),i=Object.assign(a,e.query),c=t.stringify(i,r);c&&(c="?".concat(c));var u=function(e){var t="",r=e.indexOf("#");return-1!==r&&(t=e.slice(r)),t}(e.url);return e.fragmentIdentifier&&(u="#".concat(p(e.fragmentIdentifier,r))),"".concat(n).concat(c).concat(u)},t.pick=function(e,r,n){n=Object.assign({parseFragmentIdentifier:!0},n);var o=t.parseUrl(e,n),a=o.url,i=o.query,c=o.fragmentIdentifier;return t.stringifyUrl({url:a,query:l(i,r),fragmentIdentifier:c},n)},t.exclude=function(e,r,n){var o=Array.isArray(r)?function(e){return!r.includes(e)}:function(e,t){return!r(e,t)};return t.pick(e,o,n)}},dQpi:function(e,t,r){var n=r("yGk4"),o=r("vN+2"),a=r("rEGp"),i=n&&1/a(new n([,-0]))[1]==1/0?function(e){return new n(e)}:o;e.exports=i},m0LI:function(e,t){e.exports=function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,o,a,i,c=[],u=!0,s=!1;try{if(a=(r=r.call(e)).next,0===t){if(Object(r)!==r)return;u=!1}else for(;!(u=(n=a.call(r)).done)&&(c.push(n.value),c.length!==t);u=!0);}catch(l){s=!0,o=l}finally{try{if(!u&&null!=r.return&&(i=r.return(),Object(i)!==i))return}finally{if(s)throw o}}return c}},e.exports.__esModule=!0,e.exports.default=e.exports},wTVA:function(e,t){e.exports=function(e){if(Array.isArray(e))return e},e.exports.__esModule=!0,e.exports.default=e.exports},wkBT:function(e,t){e.exports=function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")},e.exports.__esModule=!0,e.exports.default=e.exports}}]); +//# sourceMappingURL=component---src-pages-index-js-6f20049b11847c1e94d5.js.map \ No newline at end of file diff --git a/component---src-pages-index-js-6f20049b11847c1e94d5.js.map b/component---src-pages-index-js-6f20049b11847c1e94d5.js.map new file mode 100644 index 00000000..f0ae1c34 --- /dev/null +++ b/component---src-pages-index-js-6f20049b11847c1e94d5.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./node_modules/lodash/uniq.js","webpack:///./node_modules/decode-uri-component/index.js","webpack:///./node_modules/split-on-first/index.js","webpack:///./node_modules/@babel/runtime/helpers/nonIterableSpread.js","webpack:///./node_modules/@babel/runtime/helpers/iterableToArray.js","webpack:///./node_modules/@babel/runtime/helpers/arrayWithoutHoles.js","webpack:///./node_modules/@babel/runtime/helpers/slicedToArray.js","webpack:///./node_modules/lodash/_baseUniq.js","webpack:///./node_modules/@babel/runtime/helpers/toConsumableArray.js","webpack:///./src/utils/visible.js","webpack:///./src/components/category/item/index.jsx","webpack:///./src/components/category/index.jsx","webpack:///./src/components/thumbnail-container/index.jsx","webpack:///./src/components/thumbnail-item/index.jsx","webpack:///./src/components/contents/index.jsx","webpack:///./src/hooks/useCategory.js","webpack:///./src/hooks/useIntersectionObserver.js","webpack:///./src/pages/index.js","webpack:///./src/hooks/useScrollEvent.js","webpack:///./src/hooks/useRenderedCount.js","webpack:///./src/utils/event-manager.js","webpack:///./node_modules/@babel/runtime/helpers/arrayLikeToArray.js","webpack:///./node_modules/lodash/_arrayIncludesWith.js","webpack:///./node_modules/strict-uri-encode/index.js","webpack:///./node_modules/@babel/runtime/helpers/unsupportedIterableToArray.js","webpack:///./node_modules/filter-obj/index.js","webpack:///./node_modules/query-string/index.js","webpack:///./node_modules/lodash/_createSet.js","webpack:///./node_modules/@babel/runtime/helpers/iterableToArrayLimit.js","webpack:///./node_modules/@babel/runtime/helpers/arrayWithHoles.js","webpack:///./node_modules/@babel/runtime/helpers/nonIterableRest.js"],"names":["baseUniq","module","exports","array","length","singleMatcher","RegExp","multiMatcher","decodeComponents","components","split","decodeURIComponent","join","err","left","slice","right","Array","prototype","concat","call","decode","input","tokens","match","i","encodedURI","TypeError","replace","replaceMap","exec","result","entries","Object","keys","key","customDecodeURIComponent","string","separator","separatorIndex","indexOf","__esModule","iter","Symbol","iterator","from","arrayLikeToArray","arr","isArray","arrayWithHoles","iterableToArrayLimit","unsupportedIterableToArray","nonIterableRest","SetCache","arrayIncludes","arrayIncludesWith","cacheHas","createSet","setToArray","iteratee","comparator","index","includes","isCommon","seen","set","outer","value","computed","seenIndex","push","arrayWithoutHoles","iterableToArray","nonIterableSpread","observer","Item","_ref","title","selectedCategory","onClick","scrollToCenter","tabRef","useRef","handleClick","useCallback","useEffect","React","createElement","ref","className","role","aria-selected","Category","categories","category","selectCategory","containerRef","tabWidth","current","offsetWidth","_containerRef$current","scrollLeft","containerWidth","targetScollX","getBoundingClientRect","scroll","top","behavior","id","style","margin","rhythm","map","idx","ThumbnailContainer","memo","children","observeCallback","filter","isIntersecting","forEach","_ref2","target","Dom","observerTargeting","el","observe","disconnect","Error","Promise","resolve","ThumbnailItem","node","Link","to","fields","slug","frontmatter","dangerouslySetInnerHTML","__html","excerpt","Contents","posts","countOfInitialPost","count","refinedPosts","useMemo","CATEGORY_TYPE","ALL","_ref3","useCategory","_useState","useState","setCategory","adjustScroll","window","scrollY","ScrollManager","history","pushState","location","pathname","qs","stringify","changeCategory","withScroll","parse","search","addEventListener","removeEventListener","useIntersectionObserver","IntersectionObserver","root","rootMargin","threshold","then","onScroll","data","siteMetadata","site","configs","allMarkdownRemark","edges","_uniq","_useRenderedCount","initialCount","Storage","setCount","countRef","prev","useRenderedCount","increaseCount","_useCategory","currentPos","innerHeight","isTriggerPos","getDistance","cb","_ref$dismissCondition","dismissCondition","_ref$triggerCondition","triggerCondition","tick","requestAnimationFrame","EventManager","passive","Layout","Head","HOME_TITLE","keywords","Bio","len","arr2","str","encodeURIComponent","x","charCodeAt","toString","toUpperCase","o","minLen","n","constructor","name","test","obj","predicate","ret","isArr","val","_slicedToArray","_toConsumableArray","_createForOfIteratorHelper","allowArrayLike","it","_arrayLikeToArray","_unsupportedIterableToArray","F","s","done","e","_e","f","normalCompletion","didErr","step","next","_e2","return","strictUriEncode","decodeComponent","splitOnFirst","filterObject","validateArrayFormatSeparator","encode","options","strict","removeHash","hashStart","extract","queryStart","parseValue","parseNumbers","Number","isNaN","trim","parseBooleans","toLowerCase","query","assign","sort","arrayFormat","arrayFormatSeparator","formatter","accumulator","undefined","isEncodedArray","newValue","item","parserForArrayFormat","create","_step","_iterator","param","_splitOnFirst","_splitOnFirst2","_key","_value","_i","_Object$keys","_i2","_Object$keys2","k","reduce","Boolean","keysSorter","a","b","object","shouldFilter","skipNull","skipEmptyString","encoderForArrayFormat","objectCopy","_i3","_Object$keys3","parseUrl","url","_splitOnFirst3","_splitOnFirst4","url_","hash","parseFragmentIdentifier","fragmentIdentifier","stringifyUrl","queryFromUrl","parsedQueryFromUrl","queryString","getHash","pick","_exports$parseUrl","exclude","exclusionFilter","Set","noop","values","_s","_x","_r","_arr","_n","_d"],"mappings":"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","file":"component---src-pages-index-js-6f20049b11847c1e94d5.js","sourcesContent":["var baseUniq = require('./_baseUniq');\n\n/**\n * Creates a duplicate-free version of an array, using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons, in which only the first occurrence of each element\n * is kept. The order of result values is determined by the order they occur\n * in the array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * _.uniq([2, 1, 2]);\n * // => [2, 1]\n */\nfunction uniq(array) {\n return (array && array.length) ? baseUniq(array) : [];\n}\n\nmodule.exports = uniq;\n","'use strict';\n\nvar token = '%[a-f0-9]{2}';\nvar singleMatcher = new RegExp('(' + token + ')|([^%]+?)', 'gi');\nvar multiMatcher = new RegExp('(' + token + ')+', 'gi');\nfunction decodeComponents(components, split) {\n try {\n // Try to decode the entire string first\n return [decodeURIComponent(components.join(''))];\n } catch (err) {\n // Do nothing\n }\n if (components.length === 1) {\n return components;\n }\n split = split || 1;\n\n // Split the array in 2 parts\n var left = components.slice(0, split);\n var right = components.slice(split);\n return Array.prototype.concat.call([], decodeComponents(left), decodeComponents(right));\n}\nfunction decode(input) {\n try {\n return decodeURIComponent(input);\n } catch (err) {\n var tokens = input.match(singleMatcher) || [];\n for (var i = 1; i < tokens.length; i++) {\n input = decodeComponents(tokens, i).join('');\n tokens = input.match(singleMatcher) || [];\n }\n return input;\n }\n}\nfunction customDecodeURIComponent(input) {\n // Keep track of all the replacements and prefill the map with the `BOM`\n var replaceMap = {\n '%FE%FF': \"\\uFFFD\\uFFFD\",\n '%FF%FE': \"\\uFFFD\\uFFFD\"\n };\n var match = multiMatcher.exec(input);\n while (match) {\n try {\n // Decode as big chunks as possible\n replaceMap[match[0]] = decodeURIComponent(match[0]);\n } catch (err) {\n var result = decode(match[0]);\n if (result !== match[0]) {\n replaceMap[match[0]] = result;\n }\n }\n match = multiMatcher.exec(input);\n }\n\n // Add `%C2` at the end of the map to make sure it does not replace the combinator before everything else\n replaceMap['%C2'] = \"\\uFFFD\";\n var entries = Object.keys(replaceMap);\n for (var i = 0; i < entries.length; i++) {\n // Replace all decoded components\n var key = entries[i];\n input = input.replace(new RegExp(key, 'g'), replaceMap[key]);\n }\n return input;\n}\nmodule.exports = function (encodedURI) {\n if (typeof encodedURI !== 'string') {\n throw new TypeError('Expected `encodedURI` to be of type `string`, got `' + typeof encodedURI + '`');\n }\n try {\n encodedURI = encodedURI.replace(/\\+/g, ' ');\n\n // Try the built in decoder first\n return decodeURIComponent(encodedURI);\n } catch (err) {\n // Fallback to a more advanced decoder\n return customDecodeURIComponent(encodedURI);\n }\n};","'use strict';\n\nmodule.exports = function (string, separator) {\n if (!(typeof string === 'string' && typeof separator === 'string')) {\n throw new TypeError('Expected the arguments to be of type `string`');\n }\n if (separator === '') {\n return [string];\n }\n var separatorIndex = string.indexOf(separator);\n if (separatorIndex === -1) {\n return [string];\n }\n return [string.slice(0, separatorIndex), string.slice(separatorIndex + separator.length)];\n};","function _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nmodule.exports = _nonIterableSpread, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n}\nmodule.exports = _iterableToArray, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var arrayLikeToArray = require(\"./arrayLikeToArray.js\");\nfunction _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return arrayLikeToArray(arr);\n}\nmodule.exports = _arrayWithoutHoles, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var arrayWithHoles = require(\"./arrayWithHoles.js\");\nvar iterableToArrayLimit = require(\"./iterableToArrayLimit.js\");\nvar unsupportedIterableToArray = require(\"./unsupportedIterableToArray.js\");\nvar nonIterableRest = require(\"./nonIterableRest.js\");\nfunction _slicedToArray(arr, i) {\n return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || unsupportedIterableToArray(arr, i) || nonIterableRest();\n}\nmodule.exports = _slicedToArray, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","var SetCache = require('./_SetCache'),\n arrayIncludes = require('./_arrayIncludes'),\n arrayIncludesWith = require('./_arrayIncludesWith'),\n cacheHas = require('./_cacheHas'),\n createSet = require('./_createSet'),\n setToArray = require('./_setToArray');\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * The base implementation of `_.uniqBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n */\nfunction baseUniq(array, iteratee, comparator) {\n var index = -1,\n includes = arrayIncludes,\n length = array.length,\n isCommon = true,\n result = [],\n seen = result;\n\n if (comparator) {\n isCommon = false;\n includes = arrayIncludesWith;\n }\n else if (length >= LARGE_ARRAY_SIZE) {\n var set = iteratee ? null : createSet(array);\n if (set) {\n return setToArray(set);\n }\n isCommon = false;\n includes = cacheHas;\n seen = new SetCache;\n }\n else {\n seen = iteratee ? [] : result;\n }\n outer:\n while (++index < length) {\n var value = array[index],\n computed = iteratee ? iteratee(value) : value;\n\n value = (comparator || value !== 0) ? value : 0;\n if (isCommon && computed === computed) {\n var seenIndex = seen.length;\n while (seenIndex--) {\n if (seen[seenIndex] === computed) {\n continue outer;\n }\n }\n if (iteratee) {\n seen.push(computed);\n }\n result.push(value);\n }\n else if (!includes(seen, computed, comparator)) {\n if (seen !== result) {\n seen.push(computed);\n }\n result.push(value);\n }\n }\n return result;\n}\n\nmodule.exports = baseUniq;\n","var arrayWithoutHoles = require(\"./arrayWithoutHoles.js\");\nvar iterableToArray = require(\"./iterableToArray.js\");\nvar unsupportedIterableToArray = require(\"./unsupportedIterableToArray.js\");\nvar nonIterableSpread = require(\"./nonIterableSpread.js\");\nfunction _toConsumableArray(arr) {\n return arrayWithoutHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableSpread();\n}\nmodule.exports = _toConsumableArray, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","import * as Dom from './dom'\n\nconst ROOT_ID = '#___gatsby'\nexport const TARGET_CLASS = 'observed'\nconst VISIBLE_RECOGNIZE_CLASS = 'visible'\nconst INTERSECTION_OBSERVER_ROOT_MARGIN = '20px'\nconst INTERSECTION_OBSERVER_THRESHOLD = 0.8\n\nlet observer\n\nfunction observeCallback(entries) {\n return entries\n .filter(({ isIntersecting }) => isIntersecting)\n .forEach(({ target }) => Dom.addClass(target, VISIBLE_RECOGNIZE_CLASS))\n}\n\nfunction observerTargeting() {\n return Dom.getElements(`.${TARGET_CLASS}`).forEach(el => observer.observe(el))\n}\n\nfunction disconnect() {\n if (!observer) {\n throw Error('Not found IntersectionObserver instance')\n }\n return Promise.resolve(observer.disconnect())\n}\n\nexport function init() {\n observer = new IntersectionObserver(observeCallback, {\n root: Dom.getElement(ROOT_ID),\n rootMargin: INTERSECTION_OBSERVER_ROOT_MARGIN,\n threshold: INTERSECTION_OBSERVER_THRESHOLD,\n })\n\n return observerTargeting()\n}\n\nexport function destroy() {\n disconnect()\n observer = null\n}\n\nexport function refreshObserver() {\n return disconnect().then(observerTargeting)\n}\n","import React, { useRef, useCallback, useEffect } from 'react'\n\nexport const Item = ({ title, selectedCategory, onClick, scrollToCenter }) => {\n const tabRef = useRef(null)\n\n const handleClick = useCallback(() => {\n scrollToCenter(tabRef)\n onClick(title)\n }, [tabRef])\n\n useEffect(() => {\n if (selectedCategory === title) {\n scrollToCenter(tabRef)\n }\n }, [selectedCategory, tabRef])\n\n return (\n \n
    {title}
    \n \n )\n}\n","import React, { useCallback, useRef } from 'react'\nimport { rhythm } from '../../utils/typography'\nimport './index.scss'\nimport { Item } from './item'\n\nexport const Category = ({ categories, category, selectCategory }) => {\n const containerRef = useRef(null)\n\n const scrollToCenter = useCallback(tabRef => {\n const { offsetWidth: tabWidth } = tabRef.current\n const { scrollLeft, offsetWidth: containerWidth } = containerRef.current\n const tabLeft = tabRef.current.getBoundingClientRect().left\n const containerLeft = containerRef.current.getBoundingClientRect().left\n const refineLeft = tabLeft - containerLeft\n const targetScollX = scrollLeft + refineLeft - (containerWidth / 2) + (tabWidth / 2)\n\n containerRef.current.scroll({ left: targetScollX, top: 0, behavior: 'smooth' })\n }, [containerRef])\n\n return (\n \n \n {categories.map((title, idx) => (\n \n ))}\n
\n )\n}\n","import React from 'react'\n\nimport './index.scss'\n\nexport const ThumbnailContainer = React.memo(({ children }) => (\n
{children}
\n))\n","import React from 'react'\nimport { Link } from 'gatsby'\nimport { TARGET_CLASS } from '../../utils/visible'\n\nimport './index.scss'\n\nexport const ThumbnailItem = ({ node }) => (\n \n
\n

{node.frontmatter.title || node.fields.slug}

\n

\n

\n \n)\n","import React, { useMemo } from 'react'\n\nimport { ThumbnailContainer } from '../thumbnail-container'\nimport { ThumbnailItem } from '../thumbnail-item'\nimport { CATEGORY_TYPE } from '../../constants'\n\nexport const Contents = ({ posts, countOfInitialPost, count, category }) => {\n const refinedPosts = useMemo(() =>\n posts\n .filter(\n ({ node }) =>\n category === CATEGORY_TYPE.ALL ||\n node.frontmatter.category === category\n )\n .slice(0, count * countOfInitialPost)\n )\n\n return (\n \n {refinedPosts.map(({ node }, index) => (\n \n ))}\n \n )\n}\n","import { useEffect, useState, useCallback } from 'react'\nimport qs from 'query-string'\nimport { CATEGORY_TYPE } from '../constants'\nimport * as ScrollManager from '../utils/scroll'\n\nconst DEST_POS = 316\n\nexport function useCategory() {\n const [category, setCategory] = useState(CATEGORY_TYPE.ALL)\n const adjustScroll = () => {\n if (window.scrollY > DEST_POS) {\n ScrollManager.go(DEST_POS)\n }\n }\n const selectCategory = useCallback(category => {\n setCategory(category)\n adjustScroll()\n window.history.pushState(\n { category },\n '',\n `${window.location.pathname}?${qs.stringify({ category })}`\n )\n }, [])\n const changeCategory = useCallback((withScroll = true) => {\n const { category } = qs.parse(location.search)\n const target = category == null ? CATEGORY_TYPE.ALL : category\n\n setCategory(target)\n if (withScroll) {\n adjustScroll()\n }\n }, [])\n\n useEffect(() => {\n ScrollManager.init()\n return () => {\n ScrollManager.destroy()\n }\n }, [])\n\n useEffect(() => {\n window.addEventListener('popstate', changeCategory)\n\n return () => {\n window.removeEventListener('popstate', changeCategory)\n }\n }, [])\n\n useEffect(() => {\n changeCategory(false)\n }, [])\n\n return [category, selectCategory]\n}\n","import { useEffect } from 'react'\nimport * as IOManager from '../utils/visible'\n\nexport function useIntersectionObserver() {\n useEffect(() => {\n IOManager.init()\n return () => {\n IOManager.destroy()\n }\n }, [])\n\n useEffect(() => {\n IOManager.refreshObserver()\n })\n}\n","import { graphql } from 'gatsby'\nimport _ from 'lodash'\nimport React, { useMemo } from 'react'\nimport { Bio } from '../components/bio'\nimport { Category } from '../components/category'\nimport { Contents } from '../components/contents'\nimport { Head } from '../components/head'\nimport { HOME_TITLE } from '../constants'\nimport { useCategory } from '../hooks/useCategory'\nimport { useIntersectionObserver } from '../hooks/useIntersectionObserver'\nimport { useRenderedCount } from '../hooks/useRenderedCount'\nimport { useScrollEvent } from '../hooks/useScrollEvent'\nimport { Layout } from '../layout'\nimport * as Dom from '../utils/dom'\nimport * as EventManager from '../utils/event-manager'\n\nconst BASE_LINE = 80\n\nfunction getDistance(currentPos) {\n return Dom.getDocumentHeight() - currentPos\n}\n\nexport default ({ data, location }) => {\n const { siteMetadata } = data.site\n const { countOfInitialPost } = siteMetadata.configs\n const posts = data.allMarkdownRemark.edges\n const categories = useMemo(\n () => _.uniq(posts.map(({ node }) => node.frontmatter.category)),\n []\n )\n const [count, countRef, increaseCount] = useRenderedCount()\n const [category, selectCategory] = useCategory()\n\n useIntersectionObserver()\n useScrollEvent(() => {\n const currentPos = window.scrollY + window.innerHeight\n const isTriggerPos = () => getDistance(currentPos) < BASE_LINE\n const doesNeedMore = () =>\n posts.length > countRef.current * countOfInitialPost\n\n return EventManager.toFit(increaseCount, {\n dismissCondition: () => !isTriggerPos(),\n triggerCondition: () => isTriggerPos() && doesNeedMore(),\n })()\n })\n\n return (\n \n \n \n \n \n \n )\n}\n\nexport const pageQuery = graphql`\n query {\n site {\n siteMetadata {\n title\n configs {\n countOfInitialPost\n }\n }\n }\n allMarkdownRemark(\n sort: { fields: [frontmatter___date], order: DESC }\n filter: { frontmatter: { category: { ne: null } } }\n ) {\n edges {\n node {\n excerpt(pruneLength: 200, truncate: true)\n fields {\n slug\n }\n frontmatter {\n date(formatString: \"MMMM DD, YYYY\")\n title\n category\n }\n }\n }\n }\n }\n`\n","import { useEffect } from 'react'\n\nexport function useScrollEvent(onScroll) {\n useEffect(() => {\n window.addEventListener(`scroll`, onScroll, { passive: false })\n return () => {\n window.removeEventListener(`scroll`, onScroll, { passive: false })\n }\n }, [])\n}\n","import { useState, useEffect, useRef } from 'react'\nimport * as Storage from '../utils/storage'\n\nexport function useRenderedCount() {\n const initialCount = Storage.getCount(1)\n const [count, setCount] = useState(initialCount)\n const countRef = useRef(count)\n const increaseCount = () => setCount(prev => prev + 1)\n\n useEffect(() => {\n countRef.current = count\n Storage.setCount(count)\n }, [count])\n\n return [count, countRef, increaseCount]\n}\n","export function toFit(\n cb,\n { dismissCondition = () => false, triggerCondition = () => true }\n) {\n if (!cb) {\n throw Error('Invalid required arguments')\n }\n\n let tick = false\n\n return function() {\n if (tick) {\n return\n }\n\n tick = true\n return requestAnimationFrame(() => {\n if (dismissCondition()) {\n tick = false\n return\n }\n\n if (triggerCondition()) {\n tick = false\n return cb()\n }\n })\n }\n}\n","function _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n return arr2;\n}\nmodule.exports = _arrayLikeToArray, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","/**\n * This function is like `arrayIncludes` except that it accepts a comparator.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @param {Function} comparator The comparator invoked per element.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\nfunction arrayIncludesWith(array, value, comparator) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (comparator(value, array[index])) {\n return true;\n }\n }\n return false;\n}\n\nmodule.exports = arrayIncludesWith;\n","'use strict';\n\nmodule.exports = function (str) {\n return encodeURIComponent(str).replace(/[!'()*]/g, function (x) {\n return \"%\".concat(x.charCodeAt(0).toString(16).toUpperCase());\n });\n};","var arrayLikeToArray = require(\"./arrayLikeToArray.js\");\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return arrayLikeToArray(o, minLen);\n}\nmodule.exports = _unsupportedIterableToArray, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","'use strict';\n\nmodule.exports = function (obj, predicate) {\n var ret = {};\n var keys = Object.keys(obj);\n var isArr = Array.isArray(predicate);\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n var val = obj[key];\n if (isArr ? predicate.indexOf(key) !== -1 : predicate(key, val, obj)) {\n ret[key] = val;\n }\n }\n return ret;\n};","'use strict';\n\nvar _slicedToArray = require(\"/home/runner/work/mmdmthr.github.io/mmdmthr.github.io/node_modules/@babel/runtime/helpers/slicedToArray.js\");\nvar _toConsumableArray = require(\"/home/runner/work/mmdmthr.github.io/mmdmthr.github.io/node_modules/@babel/runtime/helpers/toConsumableArray.js\");\nfunction _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\"); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }\nfunction _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === \"string\") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === \"Object\" && o.constructor) n = o.constructor.name; if (n === \"Map\" || n === \"Set\") return Array.from(o); if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }\nfunction _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }\nrequire(\"core-js/modules/es.array.sort.js\");\nrequire(\"core-js/modules/es.array.reduce.js\");\nvar strictUriEncode = require('strict-uri-encode');\nvar decodeComponent = require('decode-uri-component');\nvar splitOnFirst = require('split-on-first');\nvar filterObject = require('filter-obj');\nvar isNullOrUndefined = function isNullOrUndefined(value) {\n return value === null || value === undefined;\n};\nfunction encoderForArrayFormat(options) {\n switch (options.arrayFormat) {\n case 'index':\n return function (key) {\n return function (result, value) {\n var index = result.length;\n if (value === undefined || options.skipNull && value === null || options.skipEmptyString && value === '') {\n return result;\n }\n if (value === null) {\n return [].concat(_toConsumableArray(result), [[encode(key, options), '[', index, ']'].join('')]);\n }\n return [].concat(_toConsumableArray(result), [[encode(key, options), '[', encode(index, options), ']=', encode(value, options)].join('')]);\n };\n };\n case 'bracket':\n return function (key) {\n return function (result, value) {\n if (value === undefined || options.skipNull && value === null || options.skipEmptyString && value === '') {\n return result;\n }\n if (value === null) {\n return [].concat(_toConsumableArray(result), [[encode(key, options), '[]'].join('')]);\n }\n return [].concat(_toConsumableArray(result), [[encode(key, options), '[]=', encode(value, options)].join('')]);\n };\n };\n case 'comma':\n case 'separator':\n return function (key) {\n return function (result, value) {\n if (value === null || value === undefined || value.length === 0) {\n return result;\n }\n if (result.length === 0) {\n return [[encode(key, options), '=', encode(value, options)].join('')];\n }\n return [[result, encode(value, options)].join(options.arrayFormatSeparator)];\n };\n };\n default:\n return function (key) {\n return function (result, value) {\n if (value === undefined || options.skipNull && value === null || options.skipEmptyString && value === '') {\n return result;\n }\n if (value === null) {\n return [].concat(_toConsumableArray(result), [encode(key, options)]);\n }\n return [].concat(_toConsumableArray(result), [[encode(key, options), '=', encode(value, options)].join('')]);\n };\n };\n }\n}\nfunction parserForArrayFormat(options) {\n var result;\n switch (options.arrayFormat) {\n case 'index':\n return function (key, value, accumulator) {\n result = /\\[(\\d*)\\]$/.exec(key);\n key = key.replace(/\\[\\d*\\]$/, '');\n if (!result) {\n accumulator[key] = value;\n return;\n }\n if (accumulator[key] === undefined) {\n accumulator[key] = {};\n }\n accumulator[key][result[1]] = value;\n };\n case 'bracket':\n return function (key, value, accumulator) {\n result = /(\\[\\])$/.exec(key);\n key = key.replace(/\\[\\]$/, '');\n if (!result) {\n accumulator[key] = value;\n return;\n }\n if (accumulator[key] === undefined) {\n accumulator[key] = [value];\n return;\n }\n accumulator[key] = [].concat(accumulator[key], value);\n };\n case 'comma':\n case 'separator':\n return function (key, value, accumulator) {\n var isArray = typeof value === 'string' && value.includes(options.arrayFormatSeparator);\n var isEncodedArray = typeof value === 'string' && !isArray && decode(value, options).includes(options.arrayFormatSeparator);\n value = isEncodedArray ? decode(value, options) : value;\n var newValue = isArray || isEncodedArray ? value.split(options.arrayFormatSeparator).map(function (item) {\n return decode(item, options);\n }) : value === null ? value : decode(value, options);\n accumulator[key] = newValue;\n };\n default:\n return function (key, value, accumulator) {\n if (accumulator[key] === undefined) {\n accumulator[key] = value;\n return;\n }\n accumulator[key] = [].concat(accumulator[key], value);\n };\n }\n}\nfunction validateArrayFormatSeparator(value) {\n if (typeof value !== 'string' || value.length !== 1) {\n throw new TypeError('arrayFormatSeparator must be single character string');\n }\n}\nfunction encode(value, options) {\n if (options.encode) {\n return options.strict ? strictUriEncode(value) : encodeURIComponent(value);\n }\n return value;\n}\nfunction decode(value, options) {\n if (options.decode) {\n return decodeComponent(value);\n }\n return value;\n}\nfunction keysSorter(input) {\n if (Array.isArray(input)) {\n return input.sort();\n }\n if (typeof input === 'object') {\n return keysSorter(Object.keys(input)).sort(function (a, b) {\n return Number(a) - Number(b);\n }).map(function (key) {\n return input[key];\n });\n }\n return input;\n}\nfunction removeHash(input) {\n var hashStart = input.indexOf('#');\n if (hashStart !== -1) {\n input = input.slice(0, hashStart);\n }\n return input;\n}\nfunction getHash(url) {\n var hash = '';\n var hashStart = url.indexOf('#');\n if (hashStart !== -1) {\n hash = url.slice(hashStart);\n }\n return hash;\n}\nfunction extract(input) {\n input = removeHash(input);\n var queryStart = input.indexOf('?');\n if (queryStart === -1) {\n return '';\n }\n return input.slice(queryStart + 1);\n}\nfunction parseValue(value, options) {\n if (options.parseNumbers && !Number.isNaN(Number(value)) && typeof value === 'string' && value.trim() !== '') {\n value = Number(value);\n } else if (options.parseBooleans && value !== null && (value.toLowerCase() === 'true' || value.toLowerCase() === 'false')) {\n value = value.toLowerCase() === 'true';\n }\n return value;\n}\nfunction parse(query, options) {\n options = Object.assign({\n decode: true,\n sort: true,\n arrayFormat: 'none',\n arrayFormatSeparator: ',',\n parseNumbers: false,\n parseBooleans: false\n }, options);\n validateArrayFormatSeparator(options.arrayFormatSeparator);\n var formatter = parserForArrayFormat(options);\n\n // Create an object with no prototype\n var ret = Object.create(null);\n if (typeof query !== 'string') {\n return ret;\n }\n query = query.trim().replace(/^[?#&]/, '');\n if (!query) {\n return ret;\n }\n var _iterator = _createForOfIteratorHelper(query.split('&')),\n _step;\n try {\n for (_iterator.s(); !(_step = _iterator.n()).done;) {\n var param = _step.value;\n if (param === '') {\n continue;\n }\n var _splitOnFirst = splitOnFirst(options.decode ? param.replace(/\\+/g, ' ') : param, '='),\n _splitOnFirst2 = _slicedToArray(_splitOnFirst, 2),\n _key = _splitOnFirst2[0],\n _value = _splitOnFirst2[1];\n\n // Missing `=` should be `null`:\n // http://w3.org/TR/2012/WD-url-20120524/#collect-url-parameters\n _value = _value === undefined ? null : ['comma', 'separator'].includes(options.arrayFormat) ? _value : decode(_value, options);\n formatter(decode(_key, options), _value, ret);\n }\n } catch (err) {\n _iterator.e(err);\n } finally {\n _iterator.f();\n }\n for (var _i = 0, _Object$keys = Object.keys(ret); _i < _Object$keys.length; _i++) {\n var key = _Object$keys[_i];\n var value = ret[key];\n if (typeof value === 'object' && value !== null) {\n for (var _i2 = 0, _Object$keys2 = Object.keys(value); _i2 < _Object$keys2.length; _i2++) {\n var k = _Object$keys2[_i2];\n value[k] = parseValue(value[k], options);\n }\n } else {\n ret[key] = parseValue(value, options);\n }\n }\n if (options.sort === false) {\n return ret;\n }\n return (options.sort === true ? Object.keys(ret).sort() : Object.keys(ret).sort(options.sort)).reduce(function (result, key) {\n var value = ret[key];\n if (Boolean(value) && typeof value === 'object' && !Array.isArray(value)) {\n // Sort object keys, not values\n result[key] = keysSorter(value);\n } else {\n result[key] = value;\n }\n return result;\n }, Object.create(null));\n}\nexports.extract = extract;\nexports.parse = parse;\nexports.stringify = function (object, options) {\n if (!object) {\n return '';\n }\n options = Object.assign({\n encode: true,\n strict: true,\n arrayFormat: 'none',\n arrayFormatSeparator: ','\n }, options);\n validateArrayFormatSeparator(options.arrayFormatSeparator);\n var shouldFilter = function shouldFilter(key) {\n return options.skipNull && isNullOrUndefined(object[key]) || options.skipEmptyString && object[key] === '';\n };\n var formatter = encoderForArrayFormat(options);\n var objectCopy = {};\n for (var _i3 = 0, _Object$keys3 = Object.keys(object); _i3 < _Object$keys3.length; _i3++) {\n var key = _Object$keys3[_i3];\n if (!shouldFilter(key)) {\n objectCopy[key] = object[key];\n }\n }\n var keys = Object.keys(objectCopy);\n if (options.sort !== false) {\n keys.sort(options.sort);\n }\n return keys.map(function (key) {\n var value = object[key];\n if (value === undefined) {\n return '';\n }\n if (value === null) {\n return encode(key, options);\n }\n if (Array.isArray(value)) {\n return value.reduce(formatter(key), []).join('&');\n }\n return encode(key, options) + '=' + encode(value, options);\n }).filter(function (x) {\n return x.length > 0;\n }).join('&');\n};\nexports.parseUrl = function (url, options) {\n options = Object.assign({\n decode: true\n }, options);\n var _splitOnFirst3 = splitOnFirst(url, '#'),\n _splitOnFirst4 = _slicedToArray(_splitOnFirst3, 2),\n url_ = _splitOnFirst4[0],\n hash = _splitOnFirst4[1];\n return Object.assign({\n url: url_.split('?')[0] || '',\n query: parse(extract(url), options)\n }, options && options.parseFragmentIdentifier && hash ? {\n fragmentIdentifier: decode(hash, options)\n } : {});\n};\nexports.stringifyUrl = function (object, options) {\n options = Object.assign({\n encode: true,\n strict: true\n }, options);\n var url = removeHash(object.url).split('?')[0] || '';\n var queryFromUrl = exports.extract(object.url);\n var parsedQueryFromUrl = exports.parse(queryFromUrl, {\n sort: false\n });\n var query = Object.assign(parsedQueryFromUrl, object.query);\n var queryString = exports.stringify(query, options);\n if (queryString) {\n queryString = \"?\".concat(queryString);\n }\n var hash = getHash(object.url);\n if (object.fragmentIdentifier) {\n hash = \"#\".concat(encode(object.fragmentIdentifier, options));\n }\n return \"\".concat(url).concat(queryString).concat(hash);\n};\nexports.pick = function (input, filter, options) {\n options = Object.assign({\n parseFragmentIdentifier: true\n }, options);\n var _exports$parseUrl = exports.parseUrl(input, options),\n url = _exports$parseUrl.url,\n query = _exports$parseUrl.query,\n fragmentIdentifier = _exports$parseUrl.fragmentIdentifier;\n return exports.stringifyUrl({\n url: url,\n query: filterObject(query, filter),\n fragmentIdentifier: fragmentIdentifier\n }, options);\n};\nexports.exclude = function (input, filter, options) {\n var exclusionFilter = Array.isArray(filter) ? function (key) {\n return !filter.includes(key);\n } : function (key, value) {\n return !filter(key, value);\n };\n return exports.pick(input, exclusionFilter, options);\n};","var Set = require('./_Set'),\n noop = require('./noop'),\n setToArray = require('./_setToArray');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Creates a set object of `values`.\n *\n * @private\n * @param {Array} values The values to add to the set.\n * @returns {Object} Returns the new set.\n */\nvar createSet = !(Set && (1 / setToArray(new Set([,-0]))[1]) == INFINITY) ? noop : function(values) {\n return new Set(values);\n};\n\nmodule.exports = createSet;\n","function _iterableToArrayLimit(arr, i) {\n var _i = null == arr ? null : \"undefined\" != typeof Symbol && arr[Symbol.iterator] || arr[\"@@iterator\"];\n if (null != _i) {\n var _s,\n _e,\n _x,\n _r,\n _arr = [],\n _n = !0,\n _d = !1;\n try {\n if (_x = (_i = _i.call(arr)).next, 0 === i) {\n if (Object(_i) !== _i) return;\n _n = !1;\n } else for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i); _n = !0);\n } catch (err) {\n _d = !0, _e = err;\n } finally {\n try {\n if (!_n && null != _i[\"return\"] && (_r = _i[\"return\"](), Object(_r) !== _r)) return;\n } finally {\n if (_d) throw _e;\n }\n }\n return _arr;\n }\n}\nmodule.exports = _iterableToArrayLimit, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}\nmodule.exports = _arrayWithHoles, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;","function _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\nmodule.exports = _nonIterableRest, module.exports.__esModule = true, module.exports[\"default\"] = module.exports;"],"sourceRoot":""} \ No newline at end of file diff --git a/component---src-templates-blog-post-js-cb28e3e400a2ad9977f2.js b/component---src-templates-blog-post-js-cb28e3e400a2ad9977f2.js new file mode 100644 index 00000000..e26d76a7 --- /dev/null +++ b/component---src-templates-blog-post-js-cb28e3e400a2ad9977f2.js @@ -0,0 +1,2 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[10],{"1QcF":function(e,t,n){},DMNx:function(e,t,n){},RPjP:function(e,t,n){"use strict";e.exports=n("SLms")},SLms:function(e,t,n){"use strict";n("E9XD"),Object.defineProperty(t,"__esModule",{value:!0});var r=Object.assign||function(e){for(var t=1;t=0||Object.prototype.hasOwnProperty.call(e,r)&&(n[r]=e[r]);return n}(t,["onNewComment","language"]);for(var o in a)e.page[o]=a[o];e.language=r,n&&(e.callbacks={onNewComment:[n]})}var p=function(e){function t(){return c(this,t),l(this,(t.__proto__||Object.getPrototypeOf(t)).apply(this,arguments))}return function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,e),a(t,[{key:"componentDidMount",value:function(){this.loadDisqus()}},{key:"componentDidUpdate",value:function(){this.loadDisqus()}},{key:"shouldComponentUpdate",value:function(e,t){return e.identifier!==this.props.identifier}},{key:"render",value:function(){var e=this,t=Object.keys(this.props).reduce((function(t,n){return u.some((function(e){return e===n}))?t:r({},t,function(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}({},n,e.props[n]))}),{});return o.default.createElement("div",t,o.default.createElement("div",{id:"disqus_thread"}))}},{key:"addDisqusScript",value:function(){if(!f){var e=this.disqus=document.createElement("script"),t=document.getElementsByTagName("head")[0]||document.getElementsByTagName("body")[0];e.async=!0,e.type="text/javascript",e.src="//"+this.props.shortname+".disqus.com/embed.js",t.appendChild(e),f=!0}}},{key:"loadDisqus",value:function(){var e=this,t={};u.forEach((function(n){"shortname"!==n&&e.props[n]&&(t[n]=e.props[n])})),"undefined"!=typeof DISQUS?DISQUS.reset({reload:!0,config:function(){m(this,t),this.page.url=this.page.url.replace(/#/,"")+"#!newthread"}}):(window.disqus_config=function(){m(this,t)},this.addDisqusScript())}}]),t}(o.default.Component);p.displayName="DisqusThread",p.propTypes={id:i.default.string,shortname:i.default.string.isRequired,identifier:i.default.string,title:i.default.string,url:i.default.string,category_id:i.default.string,onNewComment:i.default.func,language:i.default.string},p.defaultProps={url:"undefined"==typeof window?null:window.location.href},t.default=p},TsVF:function(e,t,n){},hUWy:function(e,t,n){},jmfv:function(e,t,n){},"n1n/":function(e,t,n){},uhgt:function(e,t,n){},vg9a:function(e,t,n){},weRM:function(e,t,n){},yZlL:function(e,t,n){"use strict";n.r(t);var r=n("q1tI"),a=n.n(r),o=(n("TsVF"),function(){return a.a.createElement("hr",{className:"custom-hr"})}),i=n("hpys"),s=n("CC2r"),c=function(e){var t=e.title;return a.a.createElement("h1",null,t)},l=(n("1QcF"),function(e){var t=e.date;return a.a.createElement("p",{className:"post-date"},t)}),u=function(e){var t=e.html;return a.a.createElement("div",{dangerouslySetInnerHTML:{__html:t}})},f=(n("weRM"),function(e){var t=e.onClick;return a.a.createElement("a",{className:"resp-sharing-button__link",href:"#",target:"_blank",rel:"noopener","aria-label":"Share on Facebook",onClick:t},a.a.createElement("div",{className:"resp-sharing-button resp-sharing-button--facebook resp-sharing-button--large"},a.a.createElement("div",{"aria-hidden":"true",className:"resp-sharing-button__icon resp-sharing-button__icon--solid"},a.a.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},a.a.createElement("path",{d:"M18.77 7.46H14.5v-1.9c0-.9.6-1.1 1-1.1h3V.5h-4.33C10.24.5 9.5 3.44 9.5 5.32v2.15h-3v4h3v12h5v-12h3.85l.42-4z"}))),a.a.createElement("span",{className:"service-label"},"Share on Facebook")))}),m=(n("hUWy"),function(e){var t=e.onClick;return a.a.createElement("a",{className:"resp-sharing-button__link",href:"#",rel:"noopener","aria-label":"Share on Twitter",onClick:t},a.a.createElement("div",{className:"resp-sharing-button resp-sharing-button--twitter resp-sharing-button--large"},a.a.createElement("div",{"aria-hidden":"true",className:"resp-sharing-button__icon resp-sharing-button__icon--solid"},a.a.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24"},a.a.createElement("path",{d:"M23.44 4.83c-.8.37-1.5.38-2.22.02.93-.56.98-.96 1.32-2.02-.88.52-1.86.9-2.9 1.1-.82-.88-2-1.43-3.3-1.43-2.5 0-4.55 2.04-4.55 4.54 0 .36.03.7.1 1.04-3.77-.2-7.12-2-9.36-4.75-.4.67-.6 1.45-.6 2.3 0 1.56.8 2.95 2 3.77-.74-.03-1.44-.23-2.05-.57v.06c0 2.2 1.56 4.03 3.64 4.44-.67.2-1.37.2-2.06.08.58 1.8 2.26 3.12 4.25 3.16C5.78 18.1 3.37 18.74 1 18.46c2 1.3 4.4 2.04 6.97 2.04 8.35 0 12.92-6.92 12.92-12.93 0-.2 0-.4-.02-.6.9-.63 1.96-1.22 2.56-2.14z"}))),a.a.createElement("span",{className:"service-label"},"Share on Twitter")))}),p=(n("DMNx"),function(e){var t='Recommend on "'+e.title+'" written by @'+e.author;return a.a.createElement("div",{className:"social-share"},a.a.createElement(f,{onClick:function(e){return e.preventDefault(),function(e,t){window.FB.ui({method:"share",mobile_iframe:!0,href:e,quote:t})}(window.location.href,t)}}),a.a.createElement(m,{onClick:function(e){return e.preventDefault(),function(e,t){window.open("https://twitter.com/share?url="+encodeURI(encodeURI(e))+"&text="+t,"sharer","toolbar=0,status=0,width=626,height=436")}(window.location.href,t)}}))}),d=(n("jmfv"),function(e){var t=e.sponsorId;return a.a.createElement("div",{className:"sponsor-button"},a.a.createElement("a",{className:"bmc-button",target:"_blank",rel:"noopener noreferrer",href:"https://www.buymeacoffee.com/"+t},a.a.createElement("img",{src:"https://www.buymeacoffee.com/assets/img/BMC-btn-logo.svg",alt:"Buy me a coffee"}),a.a.createElement("span",null,"Buy me a coffee")))}),h=n("lbRd"),b=n("Wbzz"),g=(n("n1n/"),function(e){var t=e.pageContext,n=t.previous,r=t.next;return a.a.createElement("ul",{className:"navigator"},a.a.createElement("li",null,n&&a.a.createElement(b.Link,{to:n.fields.slug,rel:"prev"},"← ",n.frontmatter.title)),a.a.createElement("li",null,r&&a.a.createElement(b.Link,{to:r.fields.slug,rel:"next"},r.frontmatter.title," →")))});function v(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}var w=n("dI71"),y=n("RPjP"),E=n.n(y),_=function(e){function t(t){var n;return(n=e.call(this,t)||this).state={toasts:[]},n.notifyAboutComment=n.notifyAboutComment.bind(v(n)),n.onSnackbarDismiss=n.onSnackbarDismiss.bind(v(n)),n}Object(w.a)(t,e);var n=t.prototype;return n.onSnackbarDismiss=function(){var e=this.state.toasts.slice(1);this.setState({toasts:e})},n.notifyAboutComment=function(){var e=this.state.toasts.slice();e.push({text:"New comment available!!"}),this.setState({toasts:e})},n.render=function(){var e=this.props,t=e.post,n=e.shortName,r=e.siteUrl+e.slug;return a.a.createElement(E.a,{shortname:n,identifier:t.frontmatter.title,title:t.frontmatter.title,url:r,category_id:t.frontmatter.category_id,onNewComment:this.notifyAboutComment})},t}(r.Component),k=n("JqEL"),C=n("WlAH"),N=function(e){var t=e.repo,n=a.a.createRef();return Object(r.useEffect)((function(){var e=k.f(C.d.DARK),r=document.createElement("script"),a={src:"https://utteranc.es/client.js",repo:t,branch:"master",theme:e?"photon-dark":"github-light",label:"comment",async:!0,"issue-term":"pathname",crossorigin:"anonymous"};Object.keys(a).forEach((function(e){r.setAttribute(e,a[e])})),n.current.appendChild(r)}),[]),a.a.createElement("div",{className:"utterances",ref:n})},j=n("EXIE");n("uhgt"),n("vg9a"),t.default=function(e){var t=e.data,n=e.pageContext,f=e.location;Object(r.useEffect)((function(){return j.c(),function(){return j.a()}}),[]);var m=t.markdownRemark,b=t.site.siteMetadata,v=b.title,w=b.comment,y=b.siteUrl,E=b.author,k=b.sponsor,C=w.disqusShortName,O=w.utterances,S=m.frontmatter,x=S.title,D=S.date;return a.a.createElement(i.a,{location:f,title:v},a.a.createElement(s.a,{title:x,description:m.excerpt}),a.a.createElement(c,{title:x}),a.a.createElement(l,{date:D}),a.a.createElement(u,{html:m.html}),a.a.createElement(p,{title:x,author:E}),!!k.buyMeACoffeeId&&a.a.createElement(d,{sponsorId:k.buyMeACoffeeId}),a.a.createElement(o,null),a.a.createElement(h.a,null),a.a.createElement(g,{pageContext:n}),!!C&&a.a.createElement(_,{post:m,shortName:C,siteUrl:y,slug:n.slug}),!!O&&a.a.createElement(N,{repo:O}))}}}]); +//# sourceMappingURL=component---src-templates-blog-post-js-cb28e3e400a2ad9977f2.js.map \ No newline at end of file diff --git a/component---src-templates-blog-post-js-cb28e3e400a2ad9977f2.js.map b/component---src-templates-blog-post-js-cb28e3e400a2ad9977f2.js.map new file mode 100644 index 00000000..f39bf0f9 --- /dev/null +++ b/component---src-templates-blog-post-js-cb28e3e400a2ad9977f2.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./node_modules/react-disqus-comments/build/main.js","webpack:///./node_modules/react-disqus-comments/build/components/DisqusThread.js","webpack:///./src/components/elements/hr/index.jsx","webpack:///./src/components/post-title/index.jsx","webpack:///./src/components/post-date/index.jsx","webpack:///./src/components/post-container/index.jsx","webpack:///./src/components/social-share/facebook-icon/index.jsx","webpack:///./src/components/social-share/twitter-icon/index.jsx","webpack:///./src/components/social-share/index.jsx","webpack:///./src/utils/share.js","webpack:///./src/components/sponsor-button/index.jsx","webpack:///./src/components/post-navigator/index.jsx","webpack:///./node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js","webpack:///./src/components/disqus/index.jsx","webpack:///./src/components/utterances/index.jsx","webpack:///./src/templates/blog-post.js"],"names":["module","exports","Object","defineProperty","value","_extends","assign","target","i","arguments","length","source","key","prototype","hasOwnProperty","call","_createClass","defineProperties","props","descriptor","enumerable","configurable","writable","Constructor","protoProps","staticProps","_react2","_interopRequireDefault","_propTypes2","obj","__esModule","default","_classCallCheck","instance","TypeError","_possibleConstructorReturn","self","ReferenceError","DISQUS_CONFIG","__disqusAdded","copyProps","context","onNewComment","language","rest","keys","indexOf","_objectWithoutProperties","prop","page","callbacks","DisqusThread","_React$Component","this","__proto__","getPrototypeOf","apply","subClass","superClass","create","constructor","setPrototypeOf","_inherits","loadDisqus","nextProps","nextState","identifier","_this2","reduce","memo","some","config","_defineProperty","createElement","id","child","disqus","document","parent","getElementsByTagName","async","type","src","shortname","appendChild","_this3","forEach","DISQUS","reset","reload","url","replace","window","disqus_config","addDisqusScript","Component","displayName","propTypes","string","isRequired","title","category_id","func","defaultProps","location","href","Hr","React","className","PostTitle","_ref","PostDate","date","PostContainer","html","dangerouslySetInnerHTML","__html","FacebookIcon","onClick","rel","aria-label","aria-hidden","xmlns","viewBox","d","TwitterIcon","SocialShare","text","author","e","preventDefault","FB","ui","method","mobile_iframe","quote","shareToFacebook","open","encodeURI","shareToTwitter","SponsorButton","sponsorId","alt","PostNavigator","pageContext","previous","next","Link","to","fields","slug","frontmatter","_assertThisInitialized","Disqus","_Component","_this","state","toasts","notifyAboutComment","bind","onSnackbarDismiss","_inheritsLoose","_proto","slice","setState","push","render","_this$props","post","shortName","siteUrl","ReactDisqusComments","Utterances","repo","rootElm","createRef","useEffect","isDarkTheme","Dom","THEME","DARK","utterances","utterancesConfig","branch","theme","label","crossorigin","configKey","setAttribute","current","ref","data","ScrollManager","markdownRemark","metaData","site","siteMetadata","comment","sponsor","disqusShortName","_post$frontmatter","postTitle","Layout","Head","description","excerpt","buyMeACoffeeId","Elements","Bio"],"mappings":"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","file":"component---src-templates-blog-post-js-cb28e3e400a2ad9977f2.js","sourcesContent":["'use strict';\n\nmodule.exports = require('./components/DisqusThread');","'use strict';\n\nrequire(\"core-js/modules/es.array.reduce.js\");\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nvar _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n};\nvar _createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);\n if (staticProps) defineProperties(Constructor, staticProps);\n return Constructor;\n };\n}();\nvar _react = require('react');\nvar _react2 = _interopRequireDefault(_react);\nvar _propTypes = require('prop-types');\nvar _propTypes2 = _interopRequireDefault(_propTypes);\nfunction _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : {\n default: obj\n };\n}\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\nfunction _possibleConstructorReturn(self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self;\n}\nfunction _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n }\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n}\nfunction _objectWithoutProperties(obj, keys) {\n var target = {};\n for (var i in obj) {\n if (keys.indexOf(i) >= 0) continue;\n if (!Object.prototype.hasOwnProperty.call(obj, i)) continue;\n target[i] = obj[i];\n }\n return target;\n}\nvar DISQUS_CONFIG = ['shortname', 'identifier', 'title', 'url', 'category_id', 'onNewComment', 'language'];\nvar __disqusAdded = false;\nfunction copyProps(context, props) {\n var onNewComment = props.onNewComment,\n language = props.language,\n rest = _objectWithoutProperties(props, ['onNewComment', 'language']);\n for (var prop in rest) {\n context.page[prop] = rest[prop];\n }\n\n // Setting the language - if none is provided, the default one is used\n context.language = language;\n if (onNewComment) {\n context.callbacks = {\n onNewComment: [onNewComment]\n };\n }\n}\nvar DisqusThread = function (_React$Component) {\n _inherits(DisqusThread, _React$Component);\n function DisqusThread() {\n _classCallCheck(this, DisqusThread);\n return _possibleConstructorReturn(this, (DisqusThread.__proto__ || Object.getPrototypeOf(DisqusThread)).apply(this, arguments));\n }\n _createClass(DisqusThread, [{\n key: 'componentDidMount',\n value: function componentDidMount() {\n this.loadDisqus();\n }\n }, {\n key: 'componentDidUpdate',\n value: function componentDidUpdate() {\n this.loadDisqus();\n }\n }, {\n key: 'shouldComponentUpdate',\n value: function shouldComponentUpdate(nextProps, nextState) {\n return nextProps.identifier !== this.props.identifier;\n }\n }, {\n key: 'render',\n value: function render() {\n var _this2 = this;\n var props = Object.keys(this.props).reduce(function (memo, key) {\n return DISQUS_CONFIG.some(function (config) {\n return config === key;\n }) ? memo : _extends({}, memo, _defineProperty({}, key, _this2.props[key]));\n }, {});\n return _react2.default.createElement('div', props, _react2.default.createElement('div', {\n id: 'disqus_thread'\n }));\n }\n }, {\n key: 'addDisqusScript',\n value: function addDisqusScript() {\n if (__disqusAdded) {\n return;\n }\n var child = this.disqus = document.createElement('script');\n var parent = document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0];\n child.async = true;\n child.type = 'text/javascript';\n child.src = '//' + this.props.shortname + '.disqus.com/embed.js';\n parent.appendChild(child);\n __disqusAdded = true;\n }\n }, {\n key: 'loadDisqus',\n value: function loadDisqus() {\n var _this3 = this;\n var props = {};\n\n // Extract Disqus props that were supplied to this component\n DISQUS_CONFIG.forEach(function (prop) {\n // prop \"shortname\" is only necessary for loading the script, not for the config itself\n if (prop !== 'shortname' && !!_this3.props[prop]) {\n props[prop] = _this3.props[prop];\n }\n });\n\n // If Disqus has already been added, reset it\n if (typeof DISQUS !== 'undefined') {\n DISQUS.reset({\n reload: true,\n config: function config() {\n copyProps(this, props);\n\n // Disqus needs hashbang URL, see https://help.disqus.com/customer/portal/articles/472107\n this.page.url = this.page.url.replace(/#/, '') + '#!newthread';\n }\n });\n } else {\n // Otherwise add Disqus to the page\n window.disqus_config = function () {\n copyProps(this, props);\n };\n this.addDisqusScript();\n }\n }\n }]);\n return DisqusThread;\n}(_react2.default.Component);\nDisqusThread.displayName = 'DisqusThread';\nDisqusThread.propTypes = {\n id: _propTypes2.default.string,\n /**\n * `shortname` tells the Disqus service your forum's shortname,\n * which is the unique identifier for your website as registered\n * on Disqus. If undefined , the Disqus embed will not load.\n */\n shortname: _propTypes2.default.string.isRequired,\n /**\n * `identifier` tells the Disqus service how to identify the\n * current page. When the Disqus embed is loaded, the identifier\n * is used to look up the correct thread. If disqus_identifier\n * is undefined, the page's URL will be used. The URL can be\n * unreliable, such as when renaming an article slug or changing\n * domains, so we recommend using your own unique way of\n * identifying a thread.\n */\n identifier: _propTypes2.default.string,\n /**\n * `title` tells the Disqus service the title of the current page.\n * This is used when creating the thread on Disqus for the first time.\n * If undefined, Disqus will use the attribute of the page.\n * If that attribute could not be used, Disqus will use the URL of the page.\n */\n title: _propTypes2.default.string,\n /**\n * `url` tells the Disqus service the URL of the current page.\n * If undefined, Disqus will take the window.location.href.\n * This URL is used to look up or create a thread if disqus_identifier\n * is undefined. In addition, this URL is always saved when a thread is\n * being created so that Disqus knows what page a thread belongs to.\n */\n url: _propTypes2.default.string,\n /**\n * `category_id` tells the Disqus service the category to be used for\n * the current page. This is used when creating the thread on Disqus\n * for the first time.\n */\n category_id: _propTypes2.default.string,\n /**\n * `onNewComment` function accepts one parameter `comment` which is a\n * JavaScript object with comment `id` and `text`. This allows you to track\n * user comments and replies and run a script after a comment is posted.\n */\n onNewComment: _propTypes2.default.func,\n /**\n * `language` tells the Disqus service which language should be used.\n * Please refer to https://www.transifex.com/disqus/disqus/ on which languages can be used\n * If undefined, English is used as default one\n */\n language: _propTypes2.default.string\n};\nDisqusThread.defaultProps = {\n url: typeof window === 'undefined' ? null : window.location.href\n};\nexports.default = DisqusThread;","import React from 'react'\n\nimport './index.scss'\n\nexport const Hr = () => <hr className=\"custom-hr\" />\n","import React from 'react'\n\nexport const PostTitle = ({ title }) => <h1>{title}</h1>\n","import React from 'react'\n\nimport './index.scss'\n\nexport const PostDate = ({ date }) => {\n return <p className=\"post-date\">{date}</p>\n}\n","import React from 'react'\n\nexport const PostContainer = ({ html }) => (\n <div dangerouslySetInnerHTML={{ __html: html }} />\n)\n","import React from 'react'\n\nimport './index.scss'\n\nexport const FacebookIcon = ({ onClick }) => (\n <a\n className=\"resp-sharing-button__link\"\n href=\"#\"\n target=\"_blank\"\n rel=\"noopener\"\n aria-label=\"Share on Facebook\"\n onClick={onClick}\n >\n <div className=\"resp-sharing-button resp-sharing-button--facebook resp-sharing-button--large\">\n <div\n aria-hidden=\"true\"\n className=\"resp-sharing-button__icon resp-sharing-button__icon--solid\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\">\n <path d=\"M18.77 7.46H14.5v-1.9c0-.9.6-1.1 1-1.1h3V.5h-4.33C10.24.5 9.5 3.44 9.5 5.32v2.15h-3v4h3v12h5v-12h3.85l.42-4z\" />\n </svg>\n </div>\n <span className=\"service-label\">Share on Facebook</span>\n </div>\n </a>\n)\n","import React from 'react'\n\nimport './index.scss'\n\nexport const TwitterIcon = ({ onClick }) => (\n <a\n className=\"resp-sharing-button__link\"\n href=\"#\"\n rel=\"noopener\"\n aria-label=\"Share on Twitter\"\n onClick={onClick}\n >\n <div className=\"resp-sharing-button resp-sharing-button--twitter resp-sharing-button--large\">\n <div\n aria-hidden=\"true\"\n className=\"resp-sharing-button__icon resp-sharing-button__icon--solid\"\n >\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 24 24\">\n <path d=\"M23.44 4.83c-.8.37-1.5.38-2.22.02.93-.56.98-.96 1.32-2.02-.88.52-1.86.9-2.9 1.1-.82-.88-2-1.43-3.3-1.43-2.5 0-4.55 2.04-4.55 4.54 0 .36.03.7.1 1.04-3.77-.2-7.12-2-9.36-4.75-.4.67-.6 1.45-.6 2.3 0 1.56.8 2.95 2 3.77-.74-.03-1.44-.23-2.05-.57v.06c0 2.2 1.56 4.03 3.64 4.44-.67.2-1.37.2-2.06.08.58 1.8 2.26 3.12 4.25 3.16C5.78 18.1 3.37 18.74 1 18.46c2 1.3 4.4 2.04 6.97 2.04 8.35 0 12.92-6.92 12.92-12.93 0-.2 0-.4-.02-.6.9-.63 1.96-1.22 2.56-2.14z\" />\n </svg>\n </div>\n <span className=\"service-label\">Share on Twitter</span>\n </div>\n </a>\n)\n","import React from 'react'\nimport { FacebookIcon } from './facebook-icon'\nimport { TwitterIcon } from './twitter-icon'\nimport { shareToTwitter, shareToFacebook } from '../../utils/share'\n\nimport './index.scss'\n\nexport const SocialShare = ({ title, author }) => {\n const text = `Recommend on \"${title}\" written by @${author}`\n\n const onClickTwitterIcon = e => {\n e.preventDefault()\n\n return shareToTwitter(window.location.href, text)\n }\n\n const onClickFacebookIcon = e => {\n e.preventDefault()\n return shareToFacebook(window.location.href, text)\n }\n\n return (\n <div className=\"social-share\">\n <FacebookIcon onClick={onClickFacebookIcon} />\n <TwitterIcon onClick={onClickTwitterIcon} />\n </div>\n )\n}\n","export const shareToFacebook = (href, text) => {\n window.FB.ui({\n method: 'share',\n mobile_iframe: true,\n href,\n quote: text,\n })\n}\n\nexport const shareToTwitter = (href, text) => {\n window.open(\n `https://twitter.com/share?url=${encodeURI(encodeURI(href))}&text=${text}`,\n 'sharer',\n 'toolbar=0,status=0,width=626,height=436'\n )\n}\n","import React from 'react'\n\nimport './index.scss'\n\nexport const SponsorButton = ({ sponsorId }) => (\n <div className=\"sponsor-button\">\n <a\n className=\"bmc-button\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n href={`https://www.buymeacoffee.com/${sponsorId}`}\n >\n <img\n src=\"https://www.buymeacoffee.com/assets/img/BMC-btn-logo.svg\"\n alt=\"Buy me a coffee\"\n />\n <span>Buy me a coffee</span>\n </a>\n </div>\n)\n","import React from 'react'\nimport { Link } from 'gatsby'\n\nimport './index.scss'\n\nexport const PostNavigator = ({ pageContext }) => {\n const { previous, next } = pageContext\n\n return (\n <ul className=\"navigator\">\n <li>\n {previous && (\n <Link to={previous.fields.slug} rel=\"prev\">\n ← {previous.frontmatter.title}\n </Link>\n )}\n </li>\n <li>\n {next && (\n <Link to={next.fields.slug} rel=\"next\">\n {next.frontmatter.title} →\n </Link>\n )}\n </li>\n </ul>\n )\n}\n","export default function _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n return self;\n}","import React, { Component } from 'react'\nimport ReactDisqusComments from 'react-disqus-comments'\n\nexport class Disqus extends Component {\n constructor(props) {\n super(props)\n this.state = { toasts: [] }\n this.notifyAboutComment = this.notifyAboutComment.bind(this)\n this.onSnackbarDismiss = this.onSnackbarDismiss.bind(this)\n }\n\n onSnackbarDismiss() {\n const [, ...toasts] = this.state.toasts\n this.setState({ toasts })\n }\n\n notifyAboutComment() {\n const toasts = this.state.toasts.slice()\n toasts.push({ text: 'New comment available!!' })\n this.setState({ toasts })\n }\n\n render() {\n const { post, shortName, siteUrl, slug } = this.props\n const url = siteUrl + slug\n\n return (\n <ReactDisqusComments\n shortname={shortName}\n identifier={post.frontmatter.title}\n title={post.frontmatter.title}\n url={url}\n category_id={post.frontmatter.category_id}\n onNewComment={this.notifyAboutComment}\n />\n )\n }\n}\n","import React, { useEffect } from 'react'\n\nimport * as Dom from '../../utils/dom'\nimport { THEME } from '../../constants'\n\nconst src = 'https://utteranc.es/client.js'\nconst branch = 'master'\nconst DARK_THEME = 'photon-dark'\nconst LIGHT_THEME = 'github-light'\n\nexport const Utterances = ({ repo }) => {\n const rootElm = React.createRef()\n\n useEffect(() => {\n const isDarkTheme = Dom.hasClassOfBody(THEME.DARK)\n const utterances = document.createElement('script')\n const utterancesConfig = {\n src,\n repo,\n branch,\n theme: isDarkTheme ? DARK_THEME : LIGHT_THEME,\n label: 'comment',\n async: true,\n 'issue-term': 'pathname',\n crossorigin: 'anonymous',\n }\n\n Object.keys(utterancesConfig).forEach(configKey => {\n utterances.setAttribute(configKey, utterancesConfig[configKey])\n })\n rootElm.current.appendChild(utterances)\n }, [])\n\n return <div className=\"utterances\" ref={rootElm} />\n}\n","import React, { useEffect } from 'react'\nimport { graphql } from 'gatsby'\n\nimport * as Elements from '../components/elements'\nimport { Layout } from '../layout'\nimport { Head } from '../components/head'\nimport { PostTitle } from '../components/post-title'\nimport { PostDate } from '../components/post-date'\nimport { PostContainer } from '../components/post-container'\nimport { SocialShare } from '../components/social-share'\nimport { SponsorButton } from '../components/sponsor-button'\nimport { Bio } from '../components/bio'\nimport { PostNavigator } from '../components/post-navigator'\nimport { Disqus } from '../components/disqus'\nimport { Utterances } from '../components/utterances'\nimport * as ScrollManager from '../utils/scroll'\n\nimport '../styles/code.scss'\nimport 'katex/dist/katex.min.css'\n\nexport default ({ data, pageContext, location }) => {\n useEffect(() => {\n ScrollManager.init()\n return () => ScrollManager.destroy()\n }, [])\n\n const post = data.markdownRemark\n const metaData = data.site.siteMetadata\n const { title, comment, siteUrl, author, sponsor } = metaData\n const { disqusShortName, utterances } = comment\n const { title: postTitle, date } = post.frontmatter\n\n return (\n <Layout location={location} title={title}>\n <Head title={postTitle} description={post.excerpt} />\n <PostTitle title={postTitle} />\n <PostDate date={date} />\n <PostContainer html={post.html} />\n <SocialShare title={postTitle} author={author} />\n {!!sponsor.buyMeACoffeeId && (\n <SponsorButton sponsorId={sponsor.buyMeACoffeeId} />\n )}\n <Elements.Hr />\n <Bio />\n <PostNavigator pageContext={pageContext} />\n {!!disqusShortName && (\n <Disqus\n post={post}\n shortName={disqusShortName}\n siteUrl={siteUrl}\n slug={pageContext.slug}\n />\n )}\n {!!utterances && <Utterances repo={utterances} />}\n </Layout>\n )\n}\n\nexport const pageQuery = graphql`\n query BlogPostBySlug($slug: String!) {\n site {\n siteMetadata {\n title\n author\n siteUrl\n comment {\n disqusShortName\n utterances\n }\n sponsor {\n buyMeACoffeeId\n }\n }\n }\n markdownRemark(fields: { slug: { eq: $slug } }) {\n id\n excerpt(pruneLength: 280)\n html\n frontmatter {\n title\n date(formatString: \"MMMM DD, YYYY\") \n }\n }\n }\n`\n"],"sourceRoot":""} \ No newline at end of file diff --git a/d5d7a013bc6c1e2b6d7db819052c16d7efea5559-46068219784202e4ff6f.js b/d5d7a013bc6c1e2b6d7db819052c16d7efea5559-46068219784202e4ff6f.js new file mode 100644 index 00000000..2fda8f5f --- /dev/null +++ b/d5d7a013bc6c1e2b6d7db819052c16d7efea5559-46068219784202e4ff6f.js @@ -0,0 +1,2 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[2],{"+GXu":function(t,e,n){},"/lCS":function(t,e,n){var r=n("gFfm"),o=n("jbM+"),i=[["ary",128],["bind",1],["bindKey",2],["curry",8],["curryRight",16],["flip",512],["partial",32],["partialRight",64],["rearg",256]];t.exports=function(t,e){return r(i,(function(n){var r="_."+n[0];e&n[1]&&!o(t,r)&&t.push(r)})),t.sort()}},"0ADi":function(t,e,n){var r=n("heNW"),o=n("EldB"),i=n("Kz5y");t.exports=function(t,e,n,a){var c=1&e,u=o(t);return function e(){for(var o=-1,s=arguments.length,l=-1,f=a.length,h=Array(f+s),p=this&&this!==i&&this instanceof e?u:t;++l<f;)h[l]=a[l];for(;s--;)h[l++]=arguments[++o];return r(p,c?n:this,h)}}},"1Mdp":function(t,e,n){Object.defineProperty(e,"__esModule",{value:!0});var r=n("q1tI");function o(){return(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}).apply(this,arguments)}var i=r.createElement("svg",{viewBox:"-2 -5 14 20",height:"100%",width:"100%",style:{position:"absolute",top:0}},r.createElement("path",{d:"M9.9 2.12L7.78 0 4.95 2.828 2.12 0 0 2.12l2.83 2.83L0 7.776 2.123 9.9 4.95 7.07 7.78 9.9 9.9 7.776 7.072 4.95 9.9 2.12",fill:"#fff",fillRule:"evenodd"})),a=r.createElement("svg",{height:"100%",width:"100%",viewBox:"-2 -5 17 21",style:{position:"absolute",top:0}},r.createElement("path",{d:"M11.264 0L5.26 6.004 2.103 2.847 0 4.95l5.26 5.26 8.108-8.107L11.264 0",fill:"#fff",fillRule:"evenodd"}));function c(t){if(7===t.length)return t;for(var e="#",n=1;n<4;n+=1)e+=t[n]+t[n];return e}function u(t,e,n,r,o){return function(t,e,n,r,o){var i=(t-n)/(e-n);if(0===i)return r;if(1===i)return o;for(var a="#",c=1;c<6;c+=2){var u=parseInt(r.substr(c,2),16),s=parseInt(o.substr(c,2),16),l=Math.round((1-i)*u+i*s).toString(16);1===l.length&&(l="0"+l),a+=l}return a}(t,e,n,c(r),c(o))}var s=function(t){function e(e){t.call(this,e);var n=e.height,r=e.width,o=e.checked;this.t=e.handleDiameter||n-2,this.i=Math.max(r-n,r-(n+this.t)/2),this.o=Math.max(0,(n-this.t)/2),this.state={s:o?this.i:this.o},this.n=0,this.e=0,this.h=this.h.bind(this),this.r=this.r.bind(this),this.a=this.a.bind(this),this.c=this.c.bind(this),this.l=this.l.bind(this),this.u=this.u.bind(this),this.f=this.f.bind(this),this.p=this.p.bind(this),this.b=this.b.bind(this),this.g=this.g.bind(this),this.v=this.v.bind(this),this.w=this.w.bind(this)}return t&&(e.__proto__=t),((e.prototype=Object.create(t&&t.prototype)).constructor=e).prototype.componentDidUpdate=function(t){t.checked!==this.props.checked&&this.setState({s:this.props.checked?this.i:this.o})},e.prototype.k=function(t){this.y.focus(),this.setState({C:t,M:!0,m:Date.now()})},e.prototype.x=function(t){var e=this.state,n=e.C,r=e.s,o=(this.props.checked?this.i:this.o)+t-n;e.R||t===n||this.setState({R:!0});var i=Math.min(this.i,Math.max(this.o,o));i!==r&&this.setState({s:i})},e.prototype.S=function(t){var e=this.state,n=e.s,r=e.R,o=e.m,i=this.props.checked,a=(this.i+this.o)/2,c=Date.now()-o;!r||c<250?this.T(t):i?a<n?this.setState({s:this.i}):this.T(t):n<a?this.setState({s:this.o}):this.T(t),this.setState({R:!1,M:!1}),this.n=Date.now()},e.prototype.h=function(t){t.preventDefault(),"number"==typeof t.button&&0!==t.button||(this.k(t.clientX),window.addEventListener("mousemove",this.r),window.addEventListener("mouseup",this.a))},e.prototype.r=function(t){t.preventDefault(),this.x(t.clientX)},e.prototype.a=function(t){this.S(t),window.removeEventListener("mousemove",this.r),window.removeEventListener("mouseup",this.a)},e.prototype.c=function(t){this.$=null,this.k(t.touches[0].clientX)},e.prototype.l=function(t){this.x(t.touches[0].clientX)},e.prototype.u=function(t){t.preventDefault(),this.S(t)},e.prototype.p=function(t){50<Date.now()-this.n&&(this.T(t),50<Date.now()-this.e&&this.setState({M:!1}))},e.prototype.b=function(){this.e=Date.now()},e.prototype.g=function(){this.setState({M:!0})},e.prototype.v=function(){this.setState({M:!1})},e.prototype.w=function(t){this.y=t},e.prototype.f=function(t){t.preventDefault(),this.y.focus(),this.T(t),this.setState({M:!1})},e.prototype.T=function(t){var e=this.props;(0,e.onChange)(!e.checked,t,e.id)},e.prototype.render=function(){var t=this.props,e=t.disabled,n=t.className,i=t.offColor,a=t.onColor,c=t.offHandleColor,s=t.onHandleColor,l=t.checkedIcon,f=t.uncheckedIcon,h=t.boxShadow,p=t.activeBoxShadow,d=t.height,T=t.width,E=function(t,e){var n={};for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&-1===e.indexOf(r)&&(n[r]=t[r]);return n}(t,["disabled","className","offColor","onColor","offHandleColor","onHandleColor","checkedIcon","uncheckedIcon","boxShadow","activeBoxShadow","height","width","handleDiameter"]),v=this.state,_=v.s,y=v.R,m=v.M,A={position:"relative",display:"inline-block",textAlign:"left",opacity:e?.5:1,direction:"ltr",borderRadius:d/2,WebkitTransition:"opacity 0.25s",MozTransition:"opacity 0.25s",transition:"opacity 0.25s",touchAction:"none",WebkitTapHighlightColor:"rgba(0, 0, 0, 0)",WebkitUserSelect:"none",MozUserSelect:"none",msUserSelect:"none",userSelect:"none"},b={height:d,width:T,margin:Math.max(0,(this.t-d)/2),position:"relative",background:u(_,this.i,this.o,i,a),borderRadius:d/2,cursor:e?"default":"pointer",WebkitTransition:y?null:"background 0.25s",MozTransition:y?null:"background 0.25s",transition:y?null:"background 0.25s"},g={height:d,width:Math.min(1.5*d,T-(this.t+d)/2+1),position:"relative",opacity:(_-this.o)/(this.i-this.o),pointerEvents:"none",WebkitTransition:y?null:"opacity 0.25s",MozTransition:y?null:"opacity 0.25s",transition:y?null:"opacity 0.25s"},C={height:d,width:Math.min(1.5*d,T-(this.t+d)/2+1),position:"absolute",opacity:1-(_-this.o)/(this.i-this.o),right:0,top:0,pointerEvents:"none",WebkitTransition:y?null:"opacity 0.25s",MozTransition:y?null:"opacity 0.25s",transition:y?null:"opacity 0.25s"},S={height:this.t,width:this.t,background:u(_,this.i,this.o,c,s),display:"inline-block",cursor:e?"default":"pointer",borderRadius:"50%",position:"absolute",transform:"translateX("+_+"px)",top:Math.max(0,(d-this.t)/2),outline:0,boxShadow:m?p:h,border:0,WebkitTransition:y?null:"background-color 0.25s, transform 0.25s, box-shadow 0.15s",MozTransition:y?null:"background-color 0.25s, transform 0.25s, box-shadow 0.15s",transition:y?null:"background-color 0.25s, transform 0.25s, box-shadow 0.15s"};return r.createElement("div",{className:n,style:A},r.createElement("div",{className:"react-switch-bg",style:b,onClick:e?null:this.f,onMouseDown:function(t){return t.preventDefault()}},l&&r.createElement("div",{style:g},l),f&&r.createElement("div",{style:C},f)),r.createElement("div",{className:"react-switch-handle",style:S,onClick:function(t){return t.preventDefault()},onMouseDown:e?null:this.h,onTouchStart:e?null:this.c,onTouchMove:e?null:this.l,onTouchEnd:e?null:this.u,onTouchCancel:e?null:this.v}),r.createElement("input",o({},{type:"checkbox",role:"switch",disabled:e,style:{border:0,clip:"rect(0 0 0 0)",height:1,margin:-1,overflow:"hidden",padding:0,position:"absolute",width:1}},E,{ref:this.w,onFocus:this.g,onBlur:this.v,onKeyUp:this.b,onChange:this.p})))},e}(r.Component);s.defaultProps={disabled:!1,offColor:"#888",onColor:"#080",offHandleColor:"#fff",onHandleColor:"#fff",uncheckedIcon:i,checkedIcon:a,boxShadow:null,activeBoxShadow:"0 0 2px 3px #3bf",height:28,width:56},e.default=s},"2ajD":function(t,e){t.exports=function(t){return t!=t}},"2lMS":function(t,e){var n=/\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/;t.exports=function(t,e){var r=e.length;if(!r)return t;var o=r-1;return e[o]=(r>1?"& ":"")+e[o],e=e.join(r>2?", ":" "),t.replace(n,"{\n/* [wrapped with "+e+"] */\n")}},"2w9V":function(t,e,n){"use strict";n.d(e,"a",(function(){return T})),n.d(e,"c",(function(){return E})),n.d(e,"b",(function(){return v})),n.d(e,"d",(function(){return _}));var r=n("sKJ/"),o=n.n(r);function i(t){return!t||t==={}}function a(t,e){if(!i(t)){var n=t.getItem(e);if(n)return JSON.parse(n)}}function c(t,e,n){if(!i(t))return t.setItem(e,JSON.stringify(n))}var u="undefined"!=typeof window?window:{},s=u.localStorage,l=u.sessionStorage,f=o()(c,l),h=o()(a,l),p=o()(c,s),d=o()(a,s);function T(t){return h("__felog_session_storage_key__/count")||t}function E(t){return f("__felog_session_storage_key__/count",t)}function v(t){return d("__felog_local_storage_key__/theme")||t}function _(t){return p("__felog_local_storage_key__/theme",t)}},"5sOR":function(t,e,n){var r=n("N4mw"),o=n("99Ms"),i=n("T8tx");t.exports=function(t,e,n,a,c,u,s,l,f,h){var p=8&e;e|=p?32:64,4&(e&=~(p?64:32))||(e&=-4);var d=[t,e,c,p?u:void 0,p?s:void 0,p?void 0:u,p?void 0:s,l,f,h],T=n.apply(void 0,d);return r(t)&&o(T,d),T.placeholder=a,i(T,t,e)}},"6KkN":function(t,e){t.exports=function(t,e){for(var n=-1,r=t.length,o=0,i=[];++n<r;){var a=t[n];a!==e&&"__lodash_placeholder__"!==a||(t[n]="__lodash_placeholder__",i[o++]=n)}return i}},"6T1N":function(t,e,n){var r=n("s0N+"),o=n("ieoY"),i=n("Rw8+"),a=n("a1zH"),c=n("0ADi"),u=n("KF6i"),s=n("q3TU"),l=n("99Ms"),f=n("T8tx"),h=n("Sxd8"),p=Math.max;t.exports=function(t,e,n,d,T,E,v,_){var y=2&e;if(!y&&"function"!=typeof t)throw new TypeError("Expected a function");var m=d?d.length:0;if(m||(e&=-97,d=T=void 0),v=void 0===v?v:p(h(v),0),_=void 0===_?_:h(_),m-=T?T.length:0,64&e){var A=d,b=T;d=T=void 0}var g=y?void 0:u(t),C=[t,e,n,d,T,A,b,E,v,_];if(g&&s(C,g),t=C[0],e=C[1],n=C[2],d=C[3],T=C[4],!(_=C[9]=void 0===C[9]?y?0:t.length:p(C[9]-m,0))&&24&e&&(e&=-25),e&&1!=e)S=8==e||16==e?i(t,e,_):32!=e&&33!=e||T.length?a.apply(void 0,C):c(t,e,n,d);else var S=o(t,e,n);return f((g?r:l)(S,C),t,e)}},"6ae/":function(t,e,n){var r=n("dTAl"),o=n("RrRF");function i(t,e){this.__wrapped__=t,this.__actions__=[],this.__chain__=!!e,this.__index__=0,this.__values__=void 0}i.prototype=r(o.prototype),i.prototype.constructor=i,t.exports=i},"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 s,l=[];function f(){s=t(l.map((function(t){return t.props}))),h.canUseDOM?e(s):n&&(s=n(s))}var h=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 s},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=s;return s=void 0,l=[],t};var c=o.prototype;return c.shouldComponentUpdate=function(t){return!a(t,this.props)},c.componentWillMount=function(){l.push(this),f()},c.componentDidUpdate=function(){f()},c.componentWillUnmount=function(){var t=l.indexOf(this);l.splice(t,1),f()},c.render=function(){return i.createElement(r,this.props)},o}(o.Component);return c(h,"displayName","SideEffect("+function(t){return t.displayName||t.name||"Component"}(r)+")"),c(h,"canUseDOM",u),h}}},"99Ms":function(t,e,n){var r=n("s0N+"),o=n("88Gu")(r);t.exports=o},CC2r:function(t,e,n){"use strict";n.d(e,"a",(function(){return u}));var r=n("q1tI"),o=n.n(r),i=n("TJpk"),a=n.n(i),c=n("Wbzz");function u(t){var e=t.description,n=t.lang,r=t.meta,i=t.keywords,u=t.title;return o.a.createElement(c.StaticQuery,{query:s,render:function(t){var c=e||t.site.siteMetadata.description;return o.a.createElement(a.a,{htmlAttributes:{lang:n},title:u,titleTemplate:"%s | "+t.site.siteMetadata.title,meta:[{name:"description",content:c},{property:"og:title",content:u},{property:"og:description",content:c},{property:"og:type",content:"website"},{name:"twitter:card",content:"summary_large_image"},{name:"twitter:creator",content:t.site.siteMetadata.author},{name:"twitter:title",content:u},{name:"twitter:description",content:c}].concat(i.length>0?{name:"keywords",content:i.join(", ")}:[]).concat(r)})}})}u.defaultProps={lang:"en",meta:[],keywords:[]};var s="3128451518"},CZoQ:function(t,e){t.exports=function(t,e,n){for(var r=n-1,o=t.length;++r<o;)if(t[r]===e)return r;return-1}},ERuW:function(t,e,n){var r=n("JbSc"),o=Object.prototype.hasOwnProperty;t.exports=function(t){for(var e=t.name+"",n=r[e],i=o.call(r,e)?n.length:0;i--;){var a=n[i],c=a.func;if(null==c||c==t)return a.name}return e}},EldB:function(t,e,n){var r=n("dTAl"),o=n("GoyQ");t.exports=function(t){return function(){var e=arguments;switch(e.length){case 0:return new t;case 1:return new t(e[0]);case 2:return new t(e[0],e[1]);case 3:return new t(e[0],e[1],e[2]);case 4:return new t(e[0],e[1],e[2],e[3]);case 5:return new t(e[0],e[1],e[2],e[3],e[4]);case 6:return new t(e[0],e[1],e[2],e[3],e[4],e[5]);case 7:return new t(e[0],e[1],e[2],e[3],e[4],e[5],e[6])}var n=r(t.prototype),i=t.apply(n,e);return o(i)?i:n}}},FtgW:function(t,e,n){},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 s=i[u];if(!c(s))return!1;var l=t[s],f=e[s];if(!1===(o=n?n.call(r,l,f,s):void 0)||void 0===o&&l!==f)return!1}return!0}},JbSc:function(t,e){t.exports={}},JqEL:function(t,e,n){"use strict";n.d(e,"e",(function(){return r})),n.d(e,"d",(function(){return o})),n.d(e,"a",(function(){return i})),n.d(e,"b",(function(){return c})),n.d(e,"g",(function(){return u})),n.d(e,"f",(function(){return s})),n.d(e,"c",(function(){return l}));var r=function(t){return document.querySelectorAll(t)},o=function(t){return document.querySelector(t)},i=function(t,e){return t.classList.add(e)},a=function(){return o("body")},c=function(t){return i(a(),t)},u=function(t){return function(t,e){return t.classList.remove(e)}(a(),t)},s=function(t){return function(t,e){return t.classList.contains(e)}(a(),t)},l=function(){return document.documentElement.offsetHeight}},KF6i:function(t,e,n){var r=n("a5q3"),o=n("vN+2"),i=r?function(t){return r.get(t)}:o;t.exports=i},"Kfv+":function(t,e,n){var r=n("Yoag"),o=n("6ae/"),i=n("RrRF"),a=n("Z0cm"),c=n("ExA7"),u=n("xFI3"),s=Object.prototype.hasOwnProperty;function l(t){if(c(t)&&!a(t)&&!(t instanceof r)){if(t instanceof o)return t;if(s.call(t,"__wrapped__"))return u(t)}return new o(t)}l.prototype=i.prototype,l.prototype.constructor=l,t.exports=l},KwMD:function(t,e){t.exports=function(t,e,n,r){for(var o=t.length,i=n+(r?1:-1);r?i--:++i<o;)if(e(t[i],i,t))return i;return-1}},MMiu:function(t,e){var n=Math.max;t.exports=function(t,e,r,o){for(var i=-1,a=t.length,c=-1,u=r.length,s=-1,l=e.length,f=n(a-u,0),h=Array(f+l),p=!o;++i<f;)h[i]=t[i];for(var d=i;++s<l;)h[d+s]=e[s];for(;++c<u;)(p||i<a)&&(h[d+r[c]]=t[i++]);return h}},N4mw:function(t,e,n){var r=n("Yoag"),o=n("KF6i"),i=n("ERuW"),a=n("Kfv+");t.exports=function(t){var e=i(t),n=a[e];if("function"!=typeof n||!(e in r.prototype))return!1;if(t===n)return!0;var c=o(n);return!!c&&t===c[0]}},"R/W3":function(t,e,n){var r=n("KwMD"),o=n("2ajD"),i=n("CZoQ");t.exports=function(t,e,n){return e==e?i(t,e,n):r(t,o,n)}},RrRF:function(t,e){t.exports=function(){}},"Rw8+":function(t,e,n){var r=n("heNW"),o=n("EldB"),i=n("a1zH"),a=n("5sOR"),c=n("V9aw"),u=n("6KkN"),s=n("Kz5y");t.exports=function(t,e,n){var l=o(t);return function o(){for(var f=arguments.length,h=Array(f),p=f,d=c(o);p--;)h[p]=arguments[p];var T=f<3&&h[0]!==d&&h[f-1]!==d?[]:u(h,d);if((f-=T.length)<n)return a(t,e,i,o.placeholder,void 0,h,T,void 0,void 0,n-f);var E=this&&this!==s&&this instanceof o?l:t;return r(E,this,h)}}},Sxd8:function(t,e,n){var r=n("ZCgT");t.exports=function(t){var e=r(t),n=e%1;return e==e?n?e-n:e:0}},T8tx:function(t,e,n){var r=n("ulEd"),o=n("2lMS"),i=n("wclG"),a=n("/lCS");t.exports=function(t,e,n){var c=e+"";return i(t,o(c,a(r(c),n)))}},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")),s=n("v1p5"),l=n("hFT/");function f(t){return t&&t.__esModule?t:{default:t}}function h(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 d(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 T,E,v,_=(0,c.default)(s.reducePropsToState,s.handleClientStateChange,s.mapStateOnServer)((function(){return null})),y=(T=_,v=E=function(t){function e(){return p(this,e),d(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 l.TAG_NAMES.SCRIPT:case l.TAG_NAMES.NOSCRIPT:return{innerHTML:e};case l.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 l.TAG_NAMES.TITLE:return r({},i,((e={})[o.type]=c,e.titleAttributes=r({},a),e));case l.TAG_NAMES.BODY:return r({},i,{bodyAttributes:r({},a)});case l.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=h(o,["children"]),c=(0,s.convertReactPropstoHtmlAttributes)(a);switch(n.warnOnInvalidChildren(t,i),t.type){case l.TAG_NAMES.LINK:case l.TAG_NAMES.META:case l.TAG_NAMES.NOSCRIPT:case l.TAG_NAMES.SCRIPT:case l.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=h(t,["children"]),o=r({},n);return e&&(o=this.mapChildrenToProps(e,o)),i.default.createElement(T,o)},o(e,null,[{key:"canUseDOM",set:function(t){T.canUseDOM=t}}]),e}(i.default.Component),E.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},E.defaultProps={defer:!0,encodeSpecialCharacters:!0},E.peek=T.peek,E.rewind=function(){var t=T.rewind();return t||(t=(0,s.mapStateOnServer)({baseTag:[],bodyAttributes:{},encodeSpecialCharacters:!0,htmlAttributes:{},linkTags:[],metaTags:[],noscriptTags:[],scriptTags:[],styleTags:[],title:"",titleAttributes:{}})),t},v);y.renderStatic=y.rewind,e.Helmet=y,e.default=y},TO8r:function(t,e){var n=/\s/;t.exports=function(t){for(var e=t.length;e--&&n.test(t.charAt(e)););return e}},V9aw:function(t,e){t.exports=function(t){return t.placeholder}},Vq1Q:function(t,e,n){},WREK:function(t,e,n){},Yoag:function(t,e,n){var r=n("dTAl"),o=n("RrRF");function i(t){this.__wrapped__=t,this.__actions__=[],this.__dir__=1,this.__filtered__=!1,this.__iteratees__=[],this.__takeCount__=4294967295,this.__views__=[]}i.prototype=r(o.prototype),i.prototype.constructor=i,t.exports=i},ZCgT:function(t,e,n){var r=n("tLB3");t.exports=function(t){return t?(t=r(t))===1/0||t===-1/0?17976931348623157e292*(t<0?-1:1):t==t?t:0:0===t?t:0}},a1zH:function(t,e,n){var r=n("y4QH"),o=n("MMiu"),i=n("t2dP"),a=n("EldB"),c=n("5sOR"),u=n("V9aw"),s=n("pzgU"),l=n("6KkN"),f=n("Kz5y");t.exports=function t(e,n,h,p,d,T,E,v,_,y){var m=128&n,A=1&n,b=2&n,g=24&n,C=512&n,S=b?void 0:a(e);return function w(){for(var M=arguments.length,R=Array(M),O=M;O--;)R[O]=arguments[O];if(g)var P=u(w),N=i(R,P);if(p&&(R=r(R,p,d,g)),T&&(R=o(R,T,E,g)),M-=N,g&&M<y){var I=l(R,P);return c(e,n,t,w.placeholder,h,R,I,v,_,y-M)}var x=A?h:this,L=b?x[e]:e;return M=R.length,v?R=s(R,v):C&&M>1&&R.reverse(),m&&_<M&&(R.length=_),this&&this!==f&&this instanceof w&&(L=S||a(L)),L.apply(x,R)}}},a5q3:function(t,e,n){var r=n("Of+w"),o=r&&new r;t.exports=o},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,s,l=r(e),f=r(n);if(l&&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(l!=f)return!1;var h=e instanceof Date,p=n instanceof Date;if(h!=p)return!1;if(h&&p)return e.getTime()==n.getTime();var d=e instanceof RegExp,T=n instanceof RegExp;if(d!=T)return!1;if(d&&T)return e.toString()==n.toString();var E=o(e);if((u=E.length)!==o(n).length)return!1;for(c=u;0!=c--;)if(!i.call(n,E[c]))return!1;if(a&&e instanceof Element&&n instanceof Element)return e===n;for(c=u;0!=c--;)if(!("_owner"===(s=E[c])&&e.$$typeof||t(e[s],n[s])))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}}},"hFT/":function(t,e,n){n("E9XD"),e.__esModule=!0;e.ATTRIBUTE_NAMES={BODY:"bodyAttributes",HTML:"htmlAttributes",TITLE:"titleAttributes"};var r=e.TAG_NAMES={BASE:"base",BODY:"body",HEAD:"head",HTML:"html",LINK:"link",META:"meta",NOSCRIPT:"noscript",SCRIPT:"script",STYLE:"style",TITLE:"title"},o=(e.VALID_TAG_NAMES=Object.keys(r).map((function(t){return r[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(o).reduce((function(t,e){return t[o[e]]=e,t}),{}),e.SELF_CLOSING_TAGS=[r.NOSCRIPT,r.SCRIPT,r.STYLE],e.HELMET_ATTRIBUTE="data-react-helmet"},hpys:function(t,e,n){"use strict";n.d(e,"a",(function(){return y}));var r=n("q1tI"),o=n.n(r),i=n("Wbzz"),a=(n("rWA+"),function(){return o.a.createElement("a",{href:"https://github.com/mmdmthr",className:"github","aria-label":"GitHub",target:"_blank",rel:"noopener noreferrer"},o.a.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",width:"32",height:"32",viewBox:"0 0 24 24"},o.a.createElement("path",{d:"M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"})))}),c=(n("+GXu"),function(t){var e=t.title,n=t.location,r=t.rootPath,c=n.pathname===r;return o.a.createElement("div",{className:"top"},!c&&o.a.createElement(i.Link,{to:"/",className:"link"},e),o.a.createElement(a,null))}),u=(n("Vq1Q"),function(t){var e=t.title,n=t.location,r=t.rootPath;return n.pathname===r&&o.a.createElement("h1",{className:"home-header"},o.a.createElement(i.Link,{to:"/",className:"link"},e))}),s=n("ohBo"),l=n.n(s),f=n("JqEL"),h=n("2w9V"),p=n("WlAH"),d=(n("FtgW"),function(){return o.a.createElement("svg",{width:"24",height:"24"},o.a.createElement("rect",{width:"24",height:"24",fill:"none",rx:"0",ry:"0"}),o.a.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M14.8102 3.2H13.8202C13.4902 3.2 13.2302 2.93 13.2302 2.6C13.2302 2.27 13.5002 2 13.8302 2H16.2602C16.5002 2 16.7202 2.15 16.8102 2.37C16.9002 2.59 16.8502 2.85 16.6802 3.02L15.2702 4.43H16.2602C16.5902 4.43 16.8602 4.7 16.8602 5.03C16.8602 5.36 16.5902 5.63 16.2602 5.63H13.8202C13.5802 5.63 13.3602 5.48 13.2702 5.26C13.1802 5.04 13.2302 4.78 13.4002 4.61L14.8102 3.2ZM20.1401 11.0101H21.1301C21.4601 11.0101 21.7401 11.2801 21.7401 11.6101C21.7401 11.9401 21.4701 12.2101 21.1401 12.2101H18.7001C18.4601 12.2101 18.2401 12.0601 18.1501 11.8401C18.0601 11.6201 18.1101 11.3601 18.2801 11.1901L19.6901 9.78008H18.7001C18.3701 9.78008 18.1001 9.51008 18.1001 9.18008C18.1001 8.85008 18.3701 8.58008 18.7001 8.58008H21.1301C21.3701 8.58008 21.5901 8.73008 21.6801 8.95008C21.7701 9.17008 21.7201 9.43008 21.5501 9.60008L20.1401 11.0101ZM11.0302 9.8499H12.8502L10.7002 11.9999C10.5302 12.1699 10.4802 12.4299 10.5702 12.6499C10.6602 12.8699 10.8802 13.0199 11.1202 13.0199H14.2902C14.6202 13.0199 14.8902 12.7499 14.8902 12.4199C14.8902 12.0899 14.6202 11.8199 14.2902 11.8199H12.5602L14.7102 9.6699C14.8802 9.4999 14.9302 9.2399 14.8402 9.0199C14.7502 8.7999 14.5302 8.6499 14.2902 8.6499H11.0202C10.6902 8.6499 10.4202 8.9199 10.4202 9.2499C10.4202 9.5799 10.7002 9.8499 11.0302 9.8499ZM14.5501 16.89C15.6601 16.89 16.7201 16.66 17.7101 16.19C17.9401 16.08 18.2101 16.13 18.3801 16.3C18.5601 16.48 18.6101 16.75 18.5001 16.98C17.0901 20.05 13.9901 22.03 10.6001 22.03C5.79013 22.03 1.88013 18.12 1.88013 13.31C1.88013 9.94004 3.87013 6.84004 6.93013 5.40004C7.16013 5.29004 7.43012 5.34004 7.61012 5.52004C7.79012 5.70004 7.84013 5.97004 7.73013 6.20004C7.27013 7.19004 7.03012 8.26004 7.03012 9.38004C7.03012 13.52 10.4001 16.89 14.5501 16.89ZM3.09013 13.31C3.09013 17.46 6.46012 20.83 10.6101 20.83C12.9901 20.83 15.2001 19.7 16.6001 17.85C15.9401 18.01 15.2501 18.09 14.5501 18.09C9.74013 18.09 5.83012 14.18 5.83012 9.38004C5.83012 8.68004 5.91013 7.99004 6.07013 7.32004C4.22013 8.73004 3.09013 10.94 3.09013 13.31Z"}))}),T=function(){return o.a.createElement("svg",{width:"24",height:"24"},o.a.createElement("rect",{width:"24",height:"24",fill:"none",rx:"0",ry:"0"}),o.a.createElement("path",{fillRule:"evenodd",clipRule:"evenodd",d:"M12.7488 5.67224C13.1057 5.67298 13.3958 5.38416 13.3965 5.0271C13.3973 4.67005 13.1084 4.37989 12.7515 4.37915C12.3943 4.37842 12.1043 4.66724 12.1035 5.02442C12.1028 5.38135 12.3916 5.67151 12.7488 5.67224ZM9.39535 6.57153C9.70504 6.39355 9.81173 5.99841 9.63388 5.68884C9.45602 5.37914 9.06076 5.27245 8.75119 5.45031C8.44162 5.62817 8.3348 6.02343 8.51266 6.333C8.69064 6.64257 9.08578 6.74926 9.39535 6.57153ZM6.94091 9.02688C6.76171 9.33571 6.3662 9.44094 6.05736 9.26174C5.74852 9.08254 5.6433 8.68691 5.8225 8.37807C6.0017 8.06923 6.39733 7.96413 6.70617 8.14333C7.015 8.32253 7.12011 8.71804 6.94091 9.02688ZM6.04309 12.3806C6.04383 12.0234 5.75501 11.7334 5.39795 11.7327C5.0409 11.7319 4.75074 12.0208 4.75 12.3779C4.74927 12.7349 5.03809 13.0249 5.39527 13.0256C5.7522 13.0265 6.04236 12.7376 6.04309 12.3806ZM5.82116 16.3781C5.6433 16.0684 5.74999 15.6734 6.05968 15.4954C6.36925 15.3176 6.7644 15.4244 6.94237 15.734C7.12023 16.0435 7.01342 16.4388 6.70385 16.6165C6.39428 16.7945 5.99902 16.6877 5.82116 16.3781ZM9.39773 18.1882C9.08889 18.0091 8.69338 18.1142 8.51418 18.423C8.33498 18.7319 8.44008 19.1275 8.74892 19.3067C9.05776 19.4858 9.45339 19.3808 9.63259 19.072C9.81179 18.7631 9.70656 18.3674 9.39773 18.1882ZM12.1035 19.7313C12.1043 19.3743 12.3943 19.0855 12.7515 19.0862C13.1084 19.0869 13.3973 19.377 13.3965 19.7341C13.3958 20.0911 13.1057 20.3799 12.7488 20.3792C12.3916 20.3784 12.1028 20.0884 12.1035 19.7313ZM16.1047 18.1869C15.7951 18.3647 15.6883 18.7599 15.8662 19.0695C16.0442 19.3791 16.4392 19.4859 16.7489 19.308C17.0584 19.1302 17.1652 18.735 16.9873 18.4255C16.8095 18.1158 16.4143 18.009 16.1047 18.1869ZM18.559 15.7315C18.7382 15.4227 19.134 15.3177 19.4428 15.4969C19.7516 15.676 19.8566 16.0716 19.6775 16.3804C19.4983 16.6893 19.1027 16.7945 18.7939 16.6153C18.485 16.4361 18.3799 16.0403 18.559 15.7315ZM20.105 11.7327C19.7478 11.7319 19.4578 12.0208 19.457 12.3779C19.4563 12.7349 19.7451 13.0249 20.1022 13.0256C20.4592 13.0265 20.7493 12.7376 20.75 12.3806C20.7507 12.0234 20.4619 11.7334 20.105 11.7327ZM19.679 8.38046C19.8569 8.69003 19.75 9.08529 19.4405 9.26315C19.1309 9.44101 18.7356 9.33432 18.5579 9.02462C18.3799 8.71505 18.4867 8.31991 18.7964 8.14193C19.106 7.96408 19.5011 8.07089 19.679 8.38046ZM16.1022 6.57006C16.4111 6.74926 16.8068 6.64415 16.986 6.33532C17.1652 6.02648 17.06 5.63085 16.7512 5.45165C16.4423 5.27245 16.0467 5.37767 15.8676 5.68651C15.6884 5.99535 15.7934 6.39086 16.1022 6.57006ZM8.26319 12.3795C8.26319 9.90466 10.2761 7.8916 12.75 7.8916C15.2249 7.8916 17.2379 9.90466 17.2379 12.3795C17.2379 14.8534 15.2249 16.8663 12.75 16.8663C10.2761 16.8663 8.26319 14.8534 8.26319 12.3795ZM9.5553 12.3795C9.5553 14.141 10.9885 15.5741 12.75 15.5741C14.5115 15.5741 15.9458 14.141 15.9458 12.3795C15.9458 10.618 14.5115 9.18372 12.75 9.18372C10.9885 9.18372 9.5553 10.618 9.5553 12.3795Z"}))};var E=function(){var t=Object(r.useState)(!1),e=t[0],n=t[1],i=function(t){var e=function(t){return t?p.d.DARK:p.d.LIGHT}(t);h.d(t),n(t),function(t){switch(t){case p.d.LIGHT:f.b(p.d.LIGHT),f.g(p.d.DARK);break;case p.d.DARK:f.b(p.d.DARK),f.g(p.d.LIGHT)}}(e)};return Object(r.useEffect)((function(){var t=h.b(f.f(p.d.DARK));i(t)}),[]),o.a.createElement("div",{className:"switch-container"},o.a.createElement("label",{htmlFor:"normal-switch"},o.a.createElement(l.a,{onChange:i,checked:e,id:"normal-switch",height:24,width:48,checkedIcon:o.a.createElement("div",{className:"icon checkedIcon"},o.a.createElement(d,null)),uncheckedIcon:o.a.createElement("div",{className:"icon uncheckedIcon"},o.a.createElement(T,null)),offColor:"#d9dfe2",offHandleColor:"#fff",onColor:"#999",onHandleColor:"#282c35"})))},v=(n("WREK"),function(){return o.a.createElement("footer",{className:"footer"},"Built with"," ",o.a.createElement("a",{href:"https://github.com/JaeYeopHan/gatsby-starter-bee"},"Gatsby-starter-bee"))}),_=n("p3AD"),y=(n("uE/X"),function(t){var e=t.location,n=t.title,r=t.children;return o.a.createElement(o.a.Fragment,null,o.a.createElement(c,{title:n,location:e,rootPath:"/"}),o.a.createElement("div",{style:{marginLeft:"auto",marginRight:"auto",maxWidth:Object(_.a)(24),padding:Object(_.a)(1.5)+" "+Object(_.a)(3/4)}},o.a.createElement(E,null),o.a.createElement(u,{title:n,location:e,rootPath:"/"}),r,o.a.createElement(v,null)))})},ieoY:function(t,e,n){var r=n("EldB"),o=n("Kz5y");t.exports=function(t,e,n){var i=1&e,a=r(t);return function e(){var r=this&&this!==o&&this instanceof e?a:t;return r.apply(i?n:this,arguments)}}},jXQH:function(t,e,n){var r=n("TO8r"),o=/^\s+/;t.exports=function(t){return t?t.slice(0,r(t)+1).replace(o,""):t}},"jbM+":function(t,e,n){var r=n("R/W3");t.exports=function(t,e){return!!(null==t?0:t.length)&&r(t,e,0)>-1}},ohBo:function(t,e,n){t.exports=n("1Mdp")},pzgU:function(t,e,n){var r=n("Q1l4"),o=n("wJg7"),i=Math.min;t.exports=function(t,e){for(var n=t.length,a=i(e.length,n),c=r(t);a--;){var u=e[a];t[a]=o(u,n)?c[u]:void 0}return t}},q3TU:function(t,e,n){var r=n("y4QH"),o=n("MMiu"),i=n("6KkN"),a=Math.min;t.exports=function(t,e){var n=t[1],c=e[1],u=n|c,s=u<131,l=128==c&&8==n||128==c&&256==n&&t[7].length<=e[8]||384==c&&e[7].length<=e[8]&&8==n;if(!s&&!l)return t;1&c&&(t[2]=e[2],u|=1&n?0:4);var f=e[3];if(f){var h=t[3];t[3]=h?r(h,f,e[4]):f,t[4]=h?i(t[3],"__lodash_placeholder__"):e[4]}return(f=e[5])&&(h=t[5],t[5]=h?o(h,f,e[6]):f,t[6]=h?i(t[5],"__lodash_placeholder__"):e[6]),(f=e[7])&&(t[7]=f),128&c&&(t[8]=null==t[8]?e[8]:a(t[8],e[8])),null==t[9]&&(t[9]=e[9]),t[0]=e[0],t[1]=u,t}},"rWA+":function(t,e,n){},"s0N+":function(t,e,n){var r=n("zZ0H"),o=n("a5q3"),i=o?function(t,e){return o.set(t,e),t}:r;t.exports=i},"sKJ/":function(t,e,n){var r=n("EA7m"),o=n("6T1N"),i=n("V9aw"),a=n("6KkN"),c=r((function(t,e){var n=a(e,i(c));return o(t,32,void 0,e,n)}));c.placeholder={},t.exports=c},t2dP:function(t,e){t.exports=function(t,e){for(var n=t.length,r=0;n--;)t[n]===e&&++r;return r}},tLB3:function(t,e,n){var r=n("jXQH"),o=n("GoyQ"),i=n("/9aa"),a=/^[-+]0x[0-9a-f]+$/i,c=/^0b[01]+$/i,u=/^0o[0-7]+$/i,s=parseInt;t.exports=function(t){if("number"==typeof t)return t;if(i(t))return NaN;if(o(t)){var e="function"==typeof t.valueOf?t.valueOf():t;t=o(e)?e+"":e}if("string"!=typeof t)return 0===t?t:+t;t=r(t);var n=c.test(t);return n||u.test(t)?s(t.slice(2),n?2:8):a.test(t)?NaN:+t}},"uE/X":function(t,e,n){},ulEd:function(t,e){var n=/\{\n\/\* \[wrapped with (.+)\] \*/,r=/,? & /;t.exports=function(t){var e=t.match(n);return e?e[1].split(r):[]}},v1p5:function(t,e,n){(function(t){n("E9XD"),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 s,l=function(t){var e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return!1===e?String(t):String(t).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")},f=function(t){var e=E(t,c.TAG_NAMES.TITLE),n=E(t,c.HELMET_PROPS.TITLE_TEMPLATE);if(n&&e)return n.replace(/%s/g,(function(){return e}));var r=E(t,c.HELMET_PROPS.DEFAULT_TITLE);return e||r||void 0},h=function(t){return E(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)}),{})},d=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}),[])},T=function(t,e,n){var o={};return n.filter((function(e){return!!Array.isArray(e[t])||(void 0!==e[t]&&A("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],s=u.toLowerCase();-1===e.indexOf(s)||n===c.TAG_PROPERTIES.REL&&"canonical"===t[n].toLowerCase()||s===c.TAG_PROPERTIES.REL&&"stylesheet"===t[s].toLowerCase()||(n=s),-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 l=t[n].toLowerCase();return o[n]||(o[n]={}),r[n]||(r[n]={}),!o[n][l]&&(r[n][l]=!0,!0)})).reverse().forEach((function(e){return t.push(e)}));for(var i=Object.keys(r),u=0;u<i.length;u++){var s=i[u],l=(0,a.default)({},o[s],r[s]);o[s]=l}return t}),[]).reverse()},E=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},v=(s=Date.now(),function(t){var e=Date.now();e-s>16?(s=e,t(e)):setTimeout((function(){v(t)}),0)}),_=function(t){return clearTimeout(t)},y="undefined"!=typeof window?window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||v:t.requestAnimationFrame||v,m="undefined"!=typeof window?window.cancelAnimationFrame||window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||_:t.cancelAnimationFrame||_,A=function(t){return console&&"function"==typeof console.warn&&console.warn(t)},b=null,g=function(t,e){var n=t.baseTag,r=t.bodyAttributes,o=t.htmlAttributes,i=t.linkTags,a=t.metaTags,u=t.noscriptTags,s=t.onChangeClientState,l=t.scriptTags,f=t.styleTags,h=t.title,p=t.titleAttributes;w(c.TAG_NAMES.BODY,r),w(c.TAG_NAMES.HTML,o),S(h,p);var d={baseTag:M(c.TAG_NAMES.BASE,n),linkTags:M(c.TAG_NAMES.LINK,i),metaTags:M(c.TAG_NAMES.META,a),noscriptTags:M(c.TAG_NAMES.NOSCRIPT,u),scriptTags:M(c.TAG_NAMES.SCRIPT,l),styleTags:M(c.TAG_NAMES.STYLE,f)},T={},E={};Object.keys(d).forEach((function(t){var e=d[t],n=e.newTags,r=e.oldTags;n.length&&(T[t]=n),r.length&&(E[t]=d[t].oldTags)})),e&&e(),s(t,T,E)},C=function(t){return Array.isArray(t)?t.join(""):t},S=function(t,e){void 0!==t&&document.title!==t&&(document.title=C(t)),w(c.TAG_NAMES.TITLE,e)},w=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 s=a[u],l=e[s]||"";n.getAttribute(s)!==l&&n.setAttribute(s,l),-1===o.indexOf(s)&&o.push(s);var f=i.indexOf(s);-1!==f&&i.splice(f,1)}for(var h=i.length-1;h>=0;h--)n.removeAttribute(i[h]);o.length===i.length?n.removeAttribute(c.HELMET_ATTRIBUTE):n.getAttribute(c.HELMET_ATTRIBUTE)!==a.join(",")&&n.setAttribute(c.HELMET_ATTRIBUTE,a.join(","))}},M=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}},R=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}),"")},O=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)},P=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=O(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=R(n),i=C(e);return o?"<"+t+" "+c.HELMET_ATTRIBUTE+'="true" '+o+">"+l(i,r)+"</"+t+">":"<"+t+" "+c.HELMET_ATTRIBUTE+'="true">'+l(i,r)+"</"+t+">"}(t,e.title,e.titleAttributes,n)}};case c.ATTRIBUTE_NAMES.BODY:case c.ATTRIBUTE_NAMES.HTML:return{toComponent:function(){return O(e)},toString:function(){return R(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+'="'+l(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){b&&m(b),t.defer?b=y((function(){g(t,(function(){b=null}))})):(g(t),b=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,s=t.scriptTags,l=t.styleTags,f=t.title,h=void 0===f?"":f,p=t.titleAttributes;return{base:P(c.TAG_NAMES.BASE,e,r),bodyAttributes:P(c.ATTRIBUTE_NAMES.BODY,n,r),htmlAttributes:P(c.ATTRIBUTE_NAMES.HTML,o,r),link:P(c.TAG_NAMES.LINK,i,r),meta:P(c.TAG_NAMES.META,a,r),noscript:P(c.TAG_NAMES.NOSCRIPT,u,r),script:P(c.TAG_NAMES.SCRIPT,s,r),style:P(c.TAG_NAMES.STYLE,l,r),title:P(c.TAG_NAMES.TITLE,{title:h,titleAttributes:p},r)}},e.reducePropsToState=function(t){return{baseTag:d([c.TAG_PROPERTIES.HREF],t),bodyAttributes:p(c.ATTRIBUTE_NAMES.BODY,t),defer:E(t,c.HELMET_PROPS.DEFER),encode:E(t,c.HELMET_PROPS.ENCODE_SPECIAL_CHARACTERS),htmlAttributes:p(c.ATTRIBUTE_NAMES.HTML,t),linkTags:T(c.TAG_NAMES.LINK,[c.TAG_PROPERTIES.REL,c.TAG_PROPERTIES.HREF],t),metaTags:T(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:T(c.TAG_NAMES.NOSCRIPT,[c.TAG_PROPERTIES.INNER_HTML],t),onChangeClientState:h(t),scriptTags:T(c.TAG_NAMES.SCRIPT,[c.TAG_PROPERTIES.SRC,c.TAG_PROPERTIES.INNER_HTML],t),styleTags:T(c.TAG_NAMES.STYLE,[c.TAG_PROPERTIES.CSS_TEXT],t),title:f(t),titleAttributes:p(c.ATTRIBUTE_NAMES.TITLE,t)}},e.requestAnimationFrame=y,e.warn=A}).call(this,n("yLpj"))},"vN+2":function(t,e){t.exports=function(){}},xFI3:function(t,e,n){var r=n("Yoag"),o=n("6ae/"),i=n("Q1l4");t.exports=function(t){if(t instanceof r)return t.clone();var e=new o(t.__wrapped__,t.__chain__);return e.__actions__=i(t.__actions__),e.__index__=t.__index__,e.__values__=t.__values__,e}},y4QH:function(t,e){var n=Math.max;t.exports=function(t,e,r,o){for(var i=-1,a=t.length,c=r.length,u=-1,s=e.length,l=n(a-c,0),f=Array(s+l),h=!o;++u<s;)f[u]=e[u];for(;++i<c;)(h||i<a)&&(f[r[i]]=t[i]);for(;l--;)f[u++]=t[i++];return f}}}]); +//# sourceMappingURL=d5d7a013bc6c1e2b6d7db819052c16d7efea5559-46068219784202e4ff6f.js.map \ No newline at end of file diff --git a/d5d7a013bc6c1e2b6d7db819052c16d7efea5559-46068219784202e4ff6f.js.map b/d5d7a013bc6c1e2b6d7db819052c16d7efea5559-46068219784202e4ff6f.js.map new file mode 100644 index 00000000..e1bfa8aa --- /dev/null +++ b/d5d7a013bc6c1e2b6d7db819052c16d7efea5559-46068219784202e4ff6f.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./node_modules/lodash/_updateWrapDetails.js","webpack:///./node_modules/lodash/_createPartial.js","webpack:///./node_modules/react-switch/dist/react-switch.min.js","webpack:///./node_modules/lodash/_baseIsNaN.js","webpack:///./node_modules/lodash/_insertWrapDetails.js","webpack:///./src/utils/storage/core.js","webpack:///./src/utils/storage/browser.js","webpack:///./src/utils/storage/sessionStorage.js","webpack:///./src/utils/storage/localStorage.js","webpack:///./src/utils/storage/index.js","webpack:///./node_modules/lodash/_createRecurry.js","webpack:///./node_modules/lodash/_replaceHolders.js","webpack:///./node_modules/lodash/_createWrap.js","webpack:///./node_modules/lodash/_LodashWrapper.js","webpack:///./node_modules/react-side-effect/lib/index.js","webpack:///./node_modules/lodash/_setData.js","webpack:///./src/components/head/index.jsx","webpack:///./node_modules/lodash/_strictIndexOf.js","webpack:///./node_modules/lodash/_getFuncName.js","webpack:///./node_modules/lodash/_createCtor.js","webpack:///./node_modules/shallowequal/index.js","webpack:///./node_modules/lodash/_realNames.js","webpack:///./src/utils/dom.js","webpack:///./node_modules/lodash/_getData.js","webpack:///./node_modules/lodash/wrapperLodash.js","webpack:///./node_modules/lodash/_baseFindIndex.js","webpack:///./node_modules/lodash/_composeArgsRight.js","webpack:///./node_modules/lodash/_isLaziable.js","webpack:///./node_modules/lodash/_baseIndexOf.js","webpack:///./node_modules/lodash/_baseLodash.js","webpack:///./node_modules/lodash/_createCurry.js","webpack:///./node_modules/lodash/toInteger.js","webpack:///./node_modules/lodash/_setWrapToString.js","webpack:///./node_modules/react-helmet/lib/Helmet.js","webpack:///./node_modules/lodash/_trimmedEndIndex.js","webpack:///./node_modules/lodash/_getHolder.js","webpack:///./node_modules/lodash/_LazyWrapper.js","webpack:///./node_modules/lodash/toFinite.js","webpack:///./node_modules/lodash/_createHybrid.js","webpack:///./node_modules/lodash/_metaMap.js","webpack:///./node_modules/react-fast-compare/index.js","webpack:///./node_modules/react-helmet/lib/HelmetConstants.js","webpack:///./src/components/social-share/github-icon/index.jsx","webpack:///./src/components/top/index.jsx","webpack:///./src/components/header/index.jsx","webpack:///./src/components/theme-switch/index.jsx","webpack:///./src/components/footer/index.jsx","webpack:///./src/layout/index.jsx","webpack:///./node_modules/lodash/_createBind.js","webpack:///./node_modules/lodash/_baseTrim.js","webpack:///./node_modules/lodash/_arrayIncludes.js","webpack:///./node_modules/react-switch/index.js","webpack:///./node_modules/lodash/_reorder.js","webpack:///./node_modules/lodash/_mergeData.js","webpack:///./node_modules/lodash/_baseSetData.js","webpack:///./node_modules/lodash/partial.js","webpack:///./node_modules/lodash/_countHolders.js","webpack:///./node_modules/lodash/toNumber.js","webpack:///./node_modules/lodash/_getWrapDetails.js","webpack:///./node_modules/react-helmet/lib/HelmetUtils.js","webpack:///./node_modules/lodash/noop.js","webpack:///./node_modules/lodash/_wrapperClone.js","webpack:///./node_modules/lodash/_composeArgs.js"],"names":["arrayEach","arrayIncludes","wrapFlags","module","exports","details","bitmask","pair","value","push","sort","apply","createCtor","root","func","thisArg","partials","isBind","Ctor","wrapper","argsIndex","argsLength","arguments","length","leftIndex","leftLength","args","Array","fn","this","Object","defineProperty","React","_extends","assign","t","i","o","s","prototype","hasOwnProperty","call","uncheckedIcon","createElement","viewBox","height","width","style","position","top","d","fill","fillRule","checkedIcon","convertShorthandColor","getBackgroundColor","n","e","h","r","a","parseInt","substr","c","l","Math","round","toString","createBackgroundColor","ReactSwitch","checked","handleDiameter","max","state","bind","u","f","p","b","g","v","w","__proto__","create","constructor","componentDidUpdate","props","setState","k","y","focus","C","M","m","Date","now","x","R","min","S","T","preventDefault","button","clientX","window","addEventListener","removeEventListener","$","touches","onChange","id","render","disabled","className","offColor","onColor","offHandleColor","onHandleColor","boxShadow","activeBoxShadow","indexOf","objectWithoutProperties","display","textAlign","opacity","direction","borderRadius","WebkitTransition","MozTransition","transition","touchAction","WebkitTapHighlightColor","WebkitUserSelect","MozUserSelect","msUserSelect","userSelect","margin","background","cursor","pointerEvents","right","transform","outline","border","onClick","onMouseDown","onTouchStart","onTouchMove","onTouchEnd","onTouchCancel","type","role","clip","overflow","padding","ref","onFocus","onBlur","onKeyUp","Component","defaultProps","default","reWrapComment","source","lastIndex","join","replace","isEmpty","storage","getValueFrom","key","rawData","getItem","JSON","parse","setValueTo","data","setItem","stringify","win","localStorage","sessionStorage","setValueToSessionStorage","_partial","getValueFromSessionStorage","setValueToLocalStorage","getValueFromLocalStorage","getCount","defaultValue","SESSION_STORAGE_KEY","setCount","val","getTheme","LOCAL_STORAGE_KEY","setTheme","isLaziable","setData","setWrapToString","wrapFunc","placeholder","holders","argPos","ary","arity","isCurry","newData","undefined","result","array","index","resIndex","baseSetData","createBind","createCurry","createHybrid","createPartial","getData","mergeData","toInteger","nativeMax","isBindKey","TypeError","partialsRight","holdersRight","baseCreate","baseLodash","LodashWrapper","chainAll","__wrapped__","__actions__","__chain__","__index__","__values__","_interopDefault","ex","React__default","shallowEqual","_defineProperty","obj","enumerable","configurable","writable","canUseDOM","document","reducePropsToState","handleStateChangeOnClient","mapStateOnServer","Error","WrappedComponent","mountedInstances","emitChange","map","instance","SideEffect","_Component","subClass","superClass","peek","rewind","recordedState","_proto","shouldComponentUpdate","nextProps","componentWillMount","componentWillUnmount","splice","displayName","name","getDisplayName","shortOut","Head","_ref","description","lang","meta","keywords","title","StaticQuery","query","detailsQuery","metaDescription","site","siteMetadata","Helmet","htmlAttributes","titleTemplate","content","property","author","concat","fromIndex","realNames","otherFunc","isObject","thisBinding","objA","objB","compare","compareContext","ret","keysA","keys","keysB","bHasOwnProperty","idx","valueA","valueB","getElements","selector","querySelectorAll","getElement","querySelector","addClass","element","classList","add","getBody","addClassToBody","removeClassToBody","remove","removeClass","hasClassOfBody","contains","hasClass","getDocumentHeight","documentElement","offsetHeight","metaMap","noop","get","LazyWrapper","isArray","isObjectLike","wrapperClone","lodash","predicate","fromRight","isCurried","holdersIndex","holdersLength","rightIndex","rightLength","rangeLength","isUncurried","offset","getFuncName","funcName","other","baseFindIndex","baseIsNaN","strictIndexOf","createRecurry","getHolder","replaceHolders","toFinite","remainder","getWrapDetails","insertWrapDetails","setToString","updateWrapDetails","reference","__esModule","target","_createClass","defineProperties","descriptor","Constructor","protoProps","staticProps","_react2","_interopRequireDefault","_propTypes2","_reactSideEffect2","_reactFastCompare2","_HelmetUtils","_HelmetConstants","_objectWithoutProperties","_classCallCheck","_possibleConstructorReturn","self","ReferenceError","_class","_temp","HelmetSideEffects","handleClientStateChange","HelmetExport","_React$Component","HelmetWrapper","setPrototypeOf","_inherits","mapNestedChildrenToProps","child","nestedChildren","TAG_NAMES","SCRIPT","NOSCRIPT","innerHTML","STYLE","cssText","flattenArrayTypeChildren","_extends2","arrayTypeChildren","newChildProps","mapObjectTypeChildren","_ref2","_extends3","_extends4","newProps","TITLE","titleAttributes","BODY","bodyAttributes","HTML","mapArrayTypeChildrenToProps","newFlattenedProps","forEach","arrayChildName","_extends5","warnOnInvalidChildren","mapChildrenToProps","children","_this2","Children","_child$props","childProps","convertReactPropstoHtmlAttributes","LINK","META","_props","set","propTypes","base","object","oneOfType","arrayOf","node","defaultTitle","string","defer","bool","encodeSpecialCharacters","link","noscript","onChangeClientState","script","mappedState","baseTag","linkTags","metaTags","noscriptTags","scriptTags","styleTags","renderStatic","reWhitespace","test","charAt","__dir__","__filtered__","__iteratees__","__takeCount__","__views__","toNumber","composeArgs","composeArgsRight","countHolders","reorder","isAry","isFlip","holdersCount","newHolders","reverse","WeakMap","keyList","hasProp","hasElementType","Element","equal","arrA","arrB","dateA","dateB","getTime","regexpA","RegExp","regexpB","$$typeof","error","message","match","number","console","warn","ATTRIBUTE_NAMES","BASE","HEAD","REACT_TAG_MAP","VALID_TAG_NAMES","TAG_PROPERTIES","CHARSET","CSS_TEXT","HREF","HTTPEQUIV","INNER_HTML","ITEM_PROP","NAME","PROPERTY","REL","SRC","accesskey","charset","class","contenteditable","contextmenu","itemprop","tabindex","HELMET_PROPS","DEFAULT_TITLE","DEFER","ENCODE_SPECIAL_CHARACTERS","ON_CHANGE_CLIENT_STATE","TITLE_TEMPLATE","HTML_TAG_MAP","reduce","SELF_CLOSING_TAGS","HELMET_ATTRIBUTE","GitHubIcon","href","aria-label","rel","xmlns","Top","location","rootPath","isRoot","pathname","Link","to","Header","MoonIcon","rx","ry","clipRule","SunIcon","ThemeSwitch","_useState","useState","setChecked","handleChange","theme","THEME","DARK","LIGHT","Storage","Dom","toggleTheme","useEffect","htmlFor","Switch","Footer","Layout","Fragment","marginLeft","marginRight","maxWidth","rhythm","trimmedEndIndex","reTrimStart","slice","baseIndexOf","copyArray","isIndex","nativeMin","indexes","arrLength","oldArray","srcBitmask","newBitmask","isCommon","isCombo","identity","baseRest","createWrap","partial","baseTrim","isSymbol","reIsBadHex","reIsBinary","reIsOctal","freeParseInt","valueOf","isBinary","reWrapDetails","reSplitDetails","split","requestAnimationFrame","_typeof","Symbol","iterator","_objectAssign2","clock","str","encode","String","getTitleFromPropsList","propsList","innermostTitle","getInnermostProperty","innermostTemplate","innermostDefaultTitle","getOnChangeClientState","getAttributesFromPropsList","tagType","filter","tagAttrs","current","getBaseTagFromPropsList","primaryAttributes","innermostBaseTag","tag","lowerCaseAttributeKey","toLowerCase","getTagsFromPropsList","tagName","approvedSeenTags","approvedTags","instanceTags","instanceSeenTags","primaryAttributeKey","attributeKey","tagUnion","rafPolyfill","callback","currentTime","setTimeout","cafPolyfill","clearTimeout","webkitRequestAnimationFrame","mozRequestAnimationFrame","global","cancelAnimationFrame","webkitCancelAnimationFrame","mozCancelAnimationFrame","msg","_helmetCallback","commitTagChanges","newState","cb","updateAttributes","updateTitle","tagUpdates","updateTags","addedTags","removedTags","_tagUpdates$tagType","newTags","oldTags","flattenArray","possibleArray","attributes","elementTag","getElementsByTagName","helmetAttributeString","getAttribute","helmetAttributes","attributesToRemove","attributeKeys","attribute","setAttribute","indexToSave","_i","removeAttribute","tags","headElement","head","tagNodes","indexToDelete","newElement","styleSheet","appendChild","createTextNode","some","existingTag","isEqualNode","parentNode","removeChild","generateElementAttributesAsString","attr","convertElementAttributestoReactProps","initProps","getMethodsForTag","toComponent","_initProps","attributeString","flattenedTitle","generateTitleAsString","_mappedTag","mappedTag","mappedAttribute","dangerouslySetInnerHTML","__html","generateTagsAsReactComponent","attributeHtml","tagContent","isSelfClosing","generateTagsAsString","initAttributes","_ref$title","clone"],"mappings":"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","file":"d5d7a013bc6c1e2b6d7db819052c16d7efea5559-46068219784202e4ff6f.js","sourcesContent":["var arrayEach = require('./_arrayEach'),\n arrayIncludes = require('./_arrayIncludes');\n\n/** Used to compose bitmasks for function metadata. */\nvar WRAP_BIND_FLAG = 1,\n WRAP_BIND_KEY_FLAG = 2,\n WRAP_CURRY_FLAG = 8,\n WRAP_CURRY_RIGHT_FLAG = 16,\n WRAP_PARTIAL_FLAG = 32,\n WRAP_PARTIAL_RIGHT_FLAG = 64,\n WRAP_ARY_FLAG = 128,\n WRAP_REARG_FLAG = 256,\n WRAP_FLIP_FLAG = 512;\n\n/** Used to associate wrap methods with their bit flags. */\nvar wrapFlags = [\n ['ary', WRAP_ARY_FLAG],\n ['bind', WRAP_BIND_FLAG],\n ['bindKey', WRAP_BIND_KEY_FLAG],\n ['curry', WRAP_CURRY_FLAG],\n ['curryRight', WRAP_CURRY_RIGHT_FLAG],\n ['flip', WRAP_FLIP_FLAG],\n ['partial', WRAP_PARTIAL_FLAG],\n ['partialRight', WRAP_PARTIAL_RIGHT_FLAG],\n ['rearg', WRAP_REARG_FLAG]\n];\n\n/**\n * Updates wrapper `details` based on `bitmask` flags.\n *\n * @private\n * @returns {Array} details The details to modify.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @returns {Array} Returns `details`.\n */\nfunction updateWrapDetails(details, bitmask) {\n arrayEach(wrapFlags, function(pair) {\n var value = '_.' + pair[0];\n if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {\n details.push(value);\n }\n });\n return details.sort();\n}\n\nmodule.exports = updateWrapDetails;\n","var apply = require('./_apply'),\n createCtor = require('./_createCtor'),\n root = require('./_root');\n\n/** Used to compose bitmasks for function metadata. */\nvar WRAP_BIND_FLAG = 1;\n\n/**\n * Creates a function that wraps `func` to invoke it with the `this` binding\n * of `thisArg` and `partials` prepended to the arguments it receives.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @param {*} thisArg The `this` binding of `func`.\n * @param {Array} partials The arguments to prepend to those provided to\n * the new function.\n * @returns {Function} Returns the new wrapped function.\n */\nfunction createPartial(func, bitmask, thisArg, partials) {\n var isBind = bitmask & WRAP_BIND_FLAG,\n Ctor = createCtor(func);\n\n function wrapper() {\n var argsIndex = -1,\n argsLength = arguments.length,\n leftIndex = -1,\n leftLength = partials.length,\n args = Array(leftLength + argsLength),\n fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n\n while (++leftIndex < leftLength) {\n args[leftIndex] = partials[leftIndex];\n }\n while (argsLength--) {\n args[leftIndex++] = arguments[++argsIndex];\n }\n return apply(fn, isBind ? thisArg : this, args);\n }\n return wrapper;\n}\n\nmodule.exports = createPartial;\n","Object.defineProperty(exports, \"__esModule\", {\n value: !0\n});\nvar React = require(\"react\");\nfunction _extends() {\n return (_extends = Object.assign || function (t) {\n for (var i = 1; i < arguments.length; i++) {\n var o = arguments[i];\n for (var s in o) Object.prototype.hasOwnProperty.call(o, s) && (t[s] = o[s]);\n }\n return t;\n }).apply(this, arguments);\n}\nvar uncheckedIcon = React.createElement(\"svg\", {\n viewBox: \"-2 -5 14 20\",\n height: \"100%\",\n width: \"100%\",\n style: {\n position: \"absolute\",\n top: 0\n }\n }, React.createElement(\"path\", {\n d: \"M9.9 2.12L7.78 0 4.95 2.828 2.12 0 0 2.12l2.83 2.83L0 7.776 2.123 9.9 4.95 7.07 7.78 9.9 9.9 7.776 7.072 4.95 9.9 2.12\",\n fill: \"#fff\",\n fillRule: \"evenodd\"\n })),\n checkedIcon = React.createElement(\"svg\", {\n height: \"100%\",\n width: \"100%\",\n viewBox: \"-2 -5 17 21\",\n style: {\n position: \"absolute\",\n top: 0\n }\n }, React.createElement(\"path\", {\n d: \"M11.264 0L5.26 6.004 2.103 2.847 0 4.95l5.26 5.26 8.108-8.107L11.264 0\",\n fill: \"#fff\",\n fillRule: \"evenodd\"\n }));\nfunction createBackgroundColor(t, i, o, s, n) {\n var e = (t - o) / (i - o);\n if (0 === e) return s;\n if (1 === e) return n;\n for (var h = \"#\", r = 1; r < 6; r += 2) {\n var a = parseInt(s.substr(r, 2), 16),\n c = parseInt(n.substr(r, 2), 16),\n l = Math.round((1 - e) * a + e * c).toString(16);\n 1 === l.length && (l = \"0\" + l), h += l;\n }\n return h;\n}\nfunction convertShorthandColor(t) {\n if (7 === t.length) return t;\n for (var i = \"#\", o = 1; o < 4; o += 1) i += t[o] + t[o];\n return i;\n}\nfunction getBackgroundColor(t, i, o, s, n) {\n return createBackgroundColor(t, i, o, convertShorthandColor(s), convertShorthandColor(n));\n}\nfunction objectWithoutProperties(t, i) {\n var o = {};\n for (var s in t) Object.prototype.hasOwnProperty.call(t, s) && -1 === i.indexOf(s) && (o[s] = t[s]);\n return o;\n}\nvar ReactSwitch = function (n) {\n function t(t) {\n n.call(this, t);\n var i = t.height,\n o = t.width,\n s = t.checked;\n this.t = t.handleDiameter || i - 2, this.i = Math.max(o - i, o - (i + this.t) / 2), this.o = Math.max(0, (i - this.t) / 2), this.state = {\n s: s ? this.i : this.o\n }, this.n = 0, this.e = 0, this.h = this.h.bind(this), this.r = this.r.bind(this), this.a = this.a.bind(this), this.c = this.c.bind(this), this.l = this.l.bind(this), this.u = this.u.bind(this), this.f = this.f.bind(this), this.p = this.p.bind(this), this.b = this.b.bind(this), this.g = this.g.bind(this), this.v = this.v.bind(this), this.w = this.w.bind(this);\n }\n return n && (t.__proto__ = n), ((t.prototype = Object.create(n && n.prototype)).constructor = t).prototype.componentDidUpdate = function (t) {\n t.checked !== this.props.checked && this.setState({\n s: this.props.checked ? this.i : this.o\n });\n }, t.prototype.k = function (t) {\n this.y.focus(), this.setState({\n C: t,\n M: !0,\n m: Date.now()\n });\n }, t.prototype.x = function (t) {\n var i = this.state,\n o = i.C,\n s = i.s,\n n = (this.props.checked ? this.i : this.o) + t - o;\n i.R || t === o || this.setState({\n R: !0\n });\n var e = Math.min(this.i, Math.max(this.o, n));\n e !== s && this.setState({\n s: e\n });\n }, t.prototype.S = function (t) {\n var i = this.state,\n o = i.s,\n s = i.R,\n n = i.m,\n e = this.props.checked,\n h = (this.i + this.o) / 2,\n r = Date.now() - n;\n !s || r < 250 ? this.T(t) : e ? h < o ? this.setState({\n s: this.i\n }) : this.T(t) : o < h ? this.setState({\n s: this.o\n }) : this.T(t), this.setState({\n R: !1,\n M: !1\n }), this.n = Date.now();\n }, t.prototype.h = function (t) {\n t.preventDefault(), \"number\" == typeof t.button && 0 !== t.button || (this.k(t.clientX), window.addEventListener(\"mousemove\", this.r), window.addEventListener(\"mouseup\", this.a));\n }, t.prototype.r = function (t) {\n t.preventDefault(), this.x(t.clientX);\n }, t.prototype.a = function (t) {\n this.S(t), window.removeEventListener(\"mousemove\", this.r), window.removeEventListener(\"mouseup\", this.a);\n }, t.prototype.c = function (t) {\n this.$ = null, this.k(t.touches[0].clientX);\n }, t.prototype.l = function (t) {\n this.x(t.touches[0].clientX);\n }, t.prototype.u = function (t) {\n t.preventDefault(), this.S(t);\n }, t.prototype.p = function (t) {\n 50 < Date.now() - this.n && (this.T(t), 50 < Date.now() - this.e && this.setState({\n M: !1\n }));\n }, t.prototype.b = function () {\n this.e = Date.now();\n }, t.prototype.g = function () {\n this.setState({\n M: !0\n });\n }, t.prototype.v = function () {\n this.setState({\n M: !1\n });\n }, t.prototype.w = function (t) {\n this.y = t;\n }, t.prototype.f = function (t) {\n t.preventDefault(), this.y.focus(), this.T(t), this.setState({\n M: !1\n });\n }, t.prototype.T = function (t) {\n var i = this.props;\n (0, i.onChange)(!i.checked, t, i.id);\n }, t.prototype.render = function () {\n var t = this.props,\n i = t.disabled,\n o = t.className,\n s = t.offColor,\n n = t.onColor,\n e = t.offHandleColor,\n h = t.onHandleColor,\n r = t.checkedIcon,\n a = t.uncheckedIcon,\n c = t.boxShadow,\n l = t.activeBoxShadow,\n u = t.height,\n d = t.width,\n f = objectWithoutProperties(t, [\"disabled\", \"className\", \"offColor\", \"onColor\", \"offHandleColor\", \"onHandleColor\", \"checkedIcon\", \"uncheckedIcon\", \"boxShadow\", \"activeBoxShadow\", \"height\", \"width\", \"handleDiameter\"]),\n p = this.state,\n b = p.s,\n g = p.R,\n v = p.M,\n w = {\n position: \"relative\",\n display: \"inline-block\",\n textAlign: \"left\",\n opacity: i ? .5 : 1,\n direction: \"ltr\",\n borderRadius: u / 2,\n WebkitTransition: \"opacity 0.25s\",\n MozTransition: \"opacity 0.25s\",\n transition: \"opacity 0.25s\",\n touchAction: \"none\",\n WebkitTapHighlightColor: \"rgba(0, 0, 0, 0)\",\n WebkitUserSelect: \"none\",\n MozUserSelect: \"none\",\n msUserSelect: \"none\",\n userSelect: \"none\"\n },\n k = {\n height: u,\n width: d,\n margin: Math.max(0, (this.t - u) / 2),\n position: \"relative\",\n background: getBackgroundColor(b, this.i, this.o, s, n),\n borderRadius: u / 2,\n cursor: i ? \"default\" : \"pointer\",\n WebkitTransition: g ? null : \"background 0.25s\",\n MozTransition: g ? null : \"background 0.25s\",\n transition: g ? null : \"background 0.25s\"\n },\n y = {\n height: u,\n width: Math.min(1.5 * u, d - (this.t + u) / 2 + 1),\n position: \"relative\",\n opacity: (b - this.o) / (this.i - this.o),\n pointerEvents: \"none\",\n WebkitTransition: g ? null : \"opacity 0.25s\",\n MozTransition: g ? null : \"opacity 0.25s\",\n transition: g ? null : \"opacity 0.25s\"\n },\n C = {\n height: u,\n width: Math.min(1.5 * u, d - (this.t + u) / 2 + 1),\n position: \"absolute\",\n opacity: 1 - (b - this.o) / (this.i - this.o),\n right: 0,\n top: 0,\n pointerEvents: \"none\",\n WebkitTransition: g ? null : \"opacity 0.25s\",\n MozTransition: g ? null : \"opacity 0.25s\",\n transition: g ? null : \"opacity 0.25s\"\n },\n M = {\n height: this.t,\n width: this.t,\n background: getBackgroundColor(b, this.i, this.o, e, h),\n display: \"inline-block\",\n cursor: i ? \"default\" : \"pointer\",\n borderRadius: \"50%\",\n position: \"absolute\",\n transform: \"translateX(\" + b + \"px)\",\n top: Math.max(0, (u - this.t) / 2),\n outline: 0,\n boxShadow: v ? l : c,\n border: 0,\n WebkitTransition: g ? null : \"background-color 0.25s, transform 0.25s, box-shadow 0.15s\",\n MozTransition: g ? null : \"background-color 0.25s, transform 0.25s, box-shadow 0.15s\",\n transition: g ? null : \"background-color 0.25s, transform 0.25s, box-shadow 0.15s\"\n };\n return React.createElement(\"div\", {\n className: o,\n style: w\n }, React.createElement(\"div\", {\n className: \"react-switch-bg\",\n style: k,\n onClick: i ? null : this.f,\n onMouseDown: function onMouseDown(t) {\n return t.preventDefault();\n }\n }, r && React.createElement(\"div\", {\n style: y\n }, r), a && React.createElement(\"div\", {\n style: C\n }, a)), React.createElement(\"div\", {\n className: \"react-switch-handle\",\n style: M,\n onClick: function onClick(t) {\n return t.preventDefault();\n },\n onMouseDown: i ? null : this.h,\n onTouchStart: i ? null : this.c,\n onTouchMove: i ? null : this.l,\n onTouchEnd: i ? null : this.u,\n onTouchCancel: i ? null : this.v\n }), React.createElement(\"input\", _extends({}, {\n type: \"checkbox\",\n role: \"switch\",\n disabled: i,\n style: {\n border: 0,\n clip: \"rect(0 0 0 0)\",\n height: 1,\n margin: -1,\n overflow: \"hidden\",\n padding: 0,\n position: \"absolute\",\n width: 1\n }\n }, f, {\n ref: this.w,\n onFocus: this.g,\n onBlur: this.v,\n onKeyUp: this.b,\n onChange: this.p\n })));\n }, t;\n}(React.Component);\nReactSwitch.defaultProps = {\n disabled: !1,\n offColor: \"#888\",\n onColor: \"#080\",\n offHandleColor: \"#fff\",\n onHandleColor: \"#fff\",\n uncheckedIcon: uncheckedIcon,\n checkedIcon: checkedIcon,\n boxShadow: null,\n activeBoxShadow: \"0 0 2px 3px #3bf\",\n height: 28,\n width: 56\n}, exports.default = ReactSwitch;","/**\n * The base implementation of `_.isNaN` without support for number objects.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n */\nfunction baseIsNaN(value) {\n return value !== value;\n}\n\nmodule.exports = baseIsNaN;\n","/** Used to match wrap detail comments. */\nvar reWrapComment = /\\{(?:\\n\\/\\* \\[wrapped with .+\\] \\*\\/)?\\n?/;\n\n/**\n * Inserts wrapper `details` in a comment at the top of the `source` body.\n *\n * @private\n * @param {string} source The source to modify.\n * @returns {Array} details The details to insert.\n * @returns {string} Returns the modified source.\n */\nfunction insertWrapDetails(source, details) {\n var length = details.length;\n if (!length) {\n return source;\n }\n var lastIndex = length - 1;\n details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];\n details = details.join(length > 2 ? ', ' : ' ');\n return source.replace(reWrapComment, '{\\n/* [wrapped with ' + details + '] */\\n');\n}\n\nmodule.exports = insertWrapDetails;\n","function isEmpty(storage) {\n return !storage || storage === {}\n}\n\nexport function getValueFrom(storage, key) {\n if (isEmpty(storage)) {\n return\n }\n const rawData = storage.getItem(key)\n\n if (!rawData) {\n return\n }\n return JSON.parse(rawData)\n}\n\nexport function setValueTo(storage, key, data) {\n if (isEmpty(storage)) {\n return\n }\n return storage.setItem(key, JSON.stringify(data))\n}\n","const win = typeof window !== `undefined` ? window : {}\n\nexport const localStorage = win.localStorage\nexport const sessionStorage = win.sessionStorage\n","import _ from 'lodash'\n\nimport { setValueTo, getValueFrom } from './core'\nimport { sessionStorage } from './browser'\n\nexport const setValueToSessionStorage = _.partial(setValueTo, sessionStorage)\nexport const getValueFromSessionStorage = _.partial(\n getValueFrom,\n sessionStorage\n)\n","import _ from 'lodash'\n\nimport { setValueTo, getValueFrom } from './core'\nimport { localStorage } from './browser'\n\nexport const setValueToLocalStorage = _.partial(setValueTo, localStorage)\nexport const getValueFromLocalStorage = _.partial(getValueFrom, localStorage)\n","import {\n setValueToSessionStorage,\n getValueFromSessionStorage,\n} from './sessionStorage'\nimport {\n setValueToLocalStorage,\n getValueFromLocalStorage,\n} from './localStorage'\n\nconst SESSION_STORAGE_KEY = '__felog_session_storage_key__'\nconst LOCAL_STORAGE_KEY = '__felog_local_storage_key__'\n\nexport function getCount(defaultValue) {\n return (\n getValueFromSessionStorage(`${SESSION_STORAGE_KEY}/count`) || defaultValue\n )\n}\n\nexport function setCount(val) {\n return setValueToSessionStorage(`${SESSION_STORAGE_KEY}/count`, val)\n}\n\nexport function getData() {\n return getValueFromLocalStorage(LOCAL_STORAGE_KEY)\n}\n\nexport function setData(val) {\n return setValueToLocalStorage(LOCAL_STORAGE_KEY, val)\n}\n\nexport function getTheme(defaultValue) {\n return getValueFromLocalStorage(`${LOCAL_STORAGE_KEY}/theme`) || defaultValue\n}\n\nexport function setTheme(val) {\n return setValueToLocalStorage(`${LOCAL_STORAGE_KEY}/theme`, val)\n}\n","var isLaziable = require('./_isLaziable'),\n setData = require('./_setData'),\n setWrapToString = require('./_setWrapToString');\n\n/** Used to compose bitmasks for function metadata. */\nvar WRAP_BIND_FLAG = 1,\n WRAP_BIND_KEY_FLAG = 2,\n WRAP_CURRY_BOUND_FLAG = 4,\n WRAP_CURRY_FLAG = 8,\n WRAP_PARTIAL_FLAG = 32,\n WRAP_PARTIAL_RIGHT_FLAG = 64;\n\n/**\n * Creates a function that wraps `func` to continue currying.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @param {Function} wrapFunc The function to create the `func` wrapper.\n * @param {*} placeholder The placeholder value.\n * @param {*} [thisArg] The `this` binding of `func`.\n * @param {Array} [partials] The arguments to prepend to those provided to\n * the new function.\n * @param {Array} [holders] The `partials` placeholder indexes.\n * @param {Array} [argPos] The argument positions of the new function.\n * @param {number} [ary] The arity cap of `func`.\n * @param {number} [arity] The arity of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\nfunction createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {\n var isCurry = bitmask & WRAP_CURRY_FLAG,\n newHolders = isCurry ? holders : undefined,\n newHoldersRight = isCurry ? undefined : holders,\n newPartials = isCurry ? partials : undefined,\n newPartialsRight = isCurry ? undefined : partials;\n\n bitmask |= (isCurry ? WRAP_PARTIAL_FLAG : WRAP_PARTIAL_RIGHT_FLAG);\n bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG : WRAP_PARTIAL_FLAG);\n\n if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {\n bitmask &= ~(WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG);\n }\n var newData = [\n func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,\n newHoldersRight, argPos, ary, arity\n ];\n\n var result = wrapFunc.apply(undefined, newData);\n if (isLaziable(func)) {\n setData(result, newData);\n }\n result.placeholder = placeholder;\n return setWrapToString(result, func, bitmask);\n}\n\nmodule.exports = createRecurry;\n","/** Used as the internal argument placeholder. */\nvar PLACEHOLDER = '__lodash_placeholder__';\n\n/**\n * Replaces all `placeholder` elements in `array` with an internal placeholder\n * and returns an array of their indexes.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {*} placeholder The placeholder to replace.\n * @returns {Array} Returns the new array of placeholder indexes.\n */\nfunction replaceHolders(array, placeholder) {\n var index = -1,\n length = array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (value === placeholder || value === PLACEHOLDER) {\n array[index] = PLACEHOLDER;\n result[resIndex++] = index;\n }\n }\n return result;\n}\n\nmodule.exports = replaceHolders;\n","var baseSetData = require('./_baseSetData'),\n createBind = require('./_createBind'),\n createCurry = require('./_createCurry'),\n createHybrid = require('./_createHybrid'),\n createPartial = require('./_createPartial'),\n getData = require('./_getData'),\n mergeData = require('./_mergeData'),\n setData = require('./_setData'),\n setWrapToString = require('./_setWrapToString'),\n toInteger = require('./toInteger');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/** Used to compose bitmasks for function metadata. */\nvar WRAP_BIND_FLAG = 1,\n WRAP_BIND_KEY_FLAG = 2,\n WRAP_CURRY_FLAG = 8,\n WRAP_CURRY_RIGHT_FLAG = 16,\n WRAP_PARTIAL_FLAG = 32,\n WRAP_PARTIAL_RIGHT_FLAG = 64;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * Creates a function that either curries or invokes `func` with optional\n * `this` binding and partially applied arguments.\n *\n * @private\n * @param {Function|string} func The function or method name to wrap.\n * @param {number} bitmask The bitmask flags.\n * 1 - `_.bind`\n * 2 - `_.bindKey`\n * 4 - `_.curry` or `_.curryRight` of a bound function\n * 8 - `_.curry`\n * 16 - `_.curryRight`\n * 32 - `_.partial`\n * 64 - `_.partialRight`\n * 128 - `_.rearg`\n * 256 - `_.ary`\n * 512 - `_.flip`\n * @param {*} [thisArg] The `this` binding of `func`.\n * @param {Array} [partials] The arguments to be partially applied.\n * @param {Array} [holders] The `partials` placeholder indexes.\n * @param {Array} [argPos] The argument positions of the new function.\n * @param {number} [ary] The arity cap of `func`.\n * @param {number} [arity] The arity of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\nfunction createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {\n var isBindKey = bitmask & WRAP_BIND_KEY_FLAG;\n if (!isBindKey && typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n var length = partials ? partials.length : 0;\n if (!length) {\n bitmask &= ~(WRAP_PARTIAL_FLAG | WRAP_PARTIAL_RIGHT_FLAG);\n partials = holders = undefined;\n }\n ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0);\n arity = arity === undefined ? arity : toInteger(arity);\n length -= holders ? holders.length : 0;\n\n if (bitmask & WRAP_PARTIAL_RIGHT_FLAG) {\n var partialsRight = partials,\n holdersRight = holders;\n\n partials = holders = undefined;\n }\n var data = isBindKey ? undefined : getData(func);\n\n var newData = [\n func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,\n argPos, ary, arity\n ];\n\n if (data) {\n mergeData(newData, data);\n }\n func = newData[0];\n bitmask = newData[1];\n thisArg = newData[2];\n partials = newData[3];\n holders = newData[4];\n arity = newData[9] = newData[9] === undefined\n ? (isBindKey ? 0 : func.length)\n : nativeMax(newData[9] - length, 0);\n\n if (!arity && bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG)) {\n bitmask &= ~(WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG);\n }\n if (!bitmask || bitmask == WRAP_BIND_FLAG) {\n var result = createBind(func, bitmask, thisArg);\n } else if (bitmask == WRAP_CURRY_FLAG || bitmask == WRAP_CURRY_RIGHT_FLAG) {\n result = createCurry(func, bitmask, arity);\n } else if ((bitmask == WRAP_PARTIAL_FLAG || bitmask == (WRAP_BIND_FLAG | WRAP_PARTIAL_FLAG)) && !holders.length) {\n result = createPartial(func, bitmask, thisArg, partials);\n } else {\n result = createHybrid.apply(undefined, newData);\n }\n var setter = data ? baseSetData : setData;\n return setWrapToString(setter(result, newData), func, bitmask);\n}\n\nmodule.exports = createWrap;\n","var baseCreate = require('./_baseCreate'),\n baseLodash = require('./_baseLodash');\n\n/**\n * The base constructor for creating `lodash` wrapper objects.\n *\n * @private\n * @param {*} value The value to wrap.\n * @param {boolean} [chainAll] Enable explicit method chain sequences.\n */\nfunction LodashWrapper(value, chainAll) {\n this.__wrapped__ = value;\n this.__actions__ = [];\n this.__chain__ = !!chainAll;\n this.__index__ = 0;\n this.__values__ = undefined;\n}\n\nLodashWrapper.prototype = baseCreate(baseLodash.prototype);\nLodashWrapper.prototype.constructor = LodashWrapper;\n\nmodule.exports = LodashWrapper;\n","'use strict';\n\nfunction _interopDefault(ex) {\n return ex && typeof ex === 'object' && 'default' in ex ? ex['default'] : ex;\n}\nvar React = require('react');\nvar React__default = _interopDefault(React);\nvar shallowEqual = _interopDefault(require('shallowequal'));\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}\nfunction _inheritsLoose(subClass, superClass) {\n subClass.prototype = Object.create(superClass.prototype);\n subClass.prototype.constructor = subClass;\n subClass.__proto__ = superClass;\n}\nvar canUseDOM = !!(typeof window !== 'undefined' && window.document && window.document.createElement);\nfunction withSideEffect(reducePropsToState, handleStateChangeOnClient, mapStateOnServer) {\n if (typeof reducePropsToState !== 'function') {\n throw new Error('Expected reducePropsToState to be a function.');\n }\n if (typeof handleStateChangeOnClient !== 'function') {\n throw new Error('Expected handleStateChangeOnClient to be a function.');\n }\n if (typeof mapStateOnServer !== 'undefined' && typeof mapStateOnServer !== 'function') {\n throw new Error('Expected mapStateOnServer to either be undefined or a function.');\n }\n function getDisplayName(WrappedComponent) {\n return WrappedComponent.displayName || WrappedComponent.name || 'Component';\n }\n return function wrap(WrappedComponent) {\n if (typeof WrappedComponent !== 'function') {\n throw new Error('Expected WrappedComponent to be a React component.');\n }\n var mountedInstances = [];\n var state;\n function emitChange() {\n state = reducePropsToState(mountedInstances.map(function (instance) {\n return instance.props;\n }));\n if (SideEffect.canUseDOM) {\n handleStateChangeOnClient(state);\n } else if (mapStateOnServer) {\n state = mapStateOnServer(state);\n }\n }\n var SideEffect = /*#__PURE__*/\n function (_Component) {\n _inheritsLoose(SideEffect, _Component);\n function SideEffect() {\n return _Component.apply(this, arguments) || this;\n }\n\n // Try to use displayName of wrapped component\n // Expose canUseDOM so tests can monkeypatch it\n SideEffect.peek = function peek() {\n return state;\n };\n SideEffect.rewind = function rewind() {\n if (SideEffect.canUseDOM) {\n throw new Error('You may only call rewind() on the server. Call peek() to read the current state.');\n }\n var recordedState = state;\n state = undefined;\n mountedInstances = [];\n return recordedState;\n };\n var _proto = SideEffect.prototype;\n _proto.shouldComponentUpdate = function shouldComponentUpdate(nextProps) {\n return !shallowEqual(nextProps, this.props);\n };\n _proto.componentWillMount = function componentWillMount() {\n mountedInstances.push(this);\n emitChange();\n };\n _proto.componentDidUpdate = function componentDidUpdate() {\n emitChange();\n };\n _proto.componentWillUnmount = function componentWillUnmount() {\n var index = mountedInstances.indexOf(this);\n mountedInstances.splice(index, 1);\n emitChange();\n };\n _proto.render = function render() {\n return React__default.createElement(WrappedComponent, this.props);\n };\n return SideEffect;\n }(React.Component);\n _defineProperty(SideEffect, \"displayName\", \"SideEffect(\" + getDisplayName(WrappedComponent) + \")\");\n _defineProperty(SideEffect, \"canUseDOM\", canUseDOM);\n return SideEffect;\n };\n}\nmodule.exports = withSideEffect;","var baseSetData = require('./_baseSetData'),\n shortOut = require('./_shortOut');\n\n/**\n * Sets metadata for `func`.\n *\n * **Note:** If this function becomes hot, i.e. is invoked a lot in a short\n * period of time, it will trip its breaker and transition to an identity\n * function to avoid garbage collection pauses in V8. See\n * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)\n * for more details.\n *\n * @private\n * @param {Function} func The function to associate metadata with.\n * @param {*} data The metadata.\n * @returns {Function} Returns `func`.\n */\nvar setData = shortOut(baseSetData);\n\nmodule.exports = setData;\n","import React from 'react'\nimport PropTypes from 'prop-types'\nimport Helmet from 'react-helmet'\nimport { StaticQuery, graphql } from 'gatsby'\n\nexport function Head({ description, lang, meta, keywords, title }) {\n return (\n <StaticQuery\n query={detailsQuery}\n render={data => {\n const metaDescription =\n description || data.site.siteMetadata.description\n return (\n <Helmet\n htmlAttributes={{\n lang,\n }}\n title={title}\n titleTemplate={`%s | ${data.site.siteMetadata.title}`}\n meta={[\n {\n name: `description`,\n content: metaDescription,\n },\n {\n property: `og:title`,\n content: title,\n },\n {\n property: `og:description`,\n content: metaDescription,\n },\n {\n property: `og:type`,\n content: `website`,\n },\n {\n name: `twitter:card`,\n content: `summary_large_image`,\n },\n {\n name: `twitter:creator`,\n content: data.site.siteMetadata.author,\n },\n {\n name: `twitter:title`,\n content: title,\n },\n {\n name: `twitter:description`,\n content: metaDescription,\n },\n ]\n .concat(\n keywords.length > 0\n ? {\n name: `keywords`,\n content: keywords.join(`, `),\n }\n : []\n )\n .concat(meta)}\n />\n )\n }}\n />\n )\n}\n\nHead.defaultProps = {\n lang: `en`,\n meta: [],\n keywords: [],\n}\n\nHead.propTypes = {\n description: PropTypes.string,\n lang: PropTypes.string,\n meta: PropTypes.array,\n keywords: PropTypes.arrayOf(PropTypes.string),\n title: PropTypes.string.isRequired,\n}\n\nconst detailsQuery = graphql`\n query DefaultSEOQuery {\n site {\n siteMetadata {\n title\n description\n author\n }\n }\n }\n`\n","/**\n * A specialized version of `_.indexOf` which performs strict equality\n * comparisons of values, i.e. `===`.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction strictIndexOf(array, value, fromIndex) {\n var index = fromIndex - 1,\n length = array.length;\n\n while (++index < length) {\n if (array[index] === value) {\n return index;\n }\n }\n return -1;\n}\n\nmodule.exports = strictIndexOf;\n","var realNames = require('./_realNames');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Gets the name of `func`.\n *\n * @private\n * @param {Function} func The function to query.\n * @returns {string} Returns the function name.\n */\nfunction getFuncName(func) {\n var result = (func.name + ''),\n array = realNames[result],\n length = hasOwnProperty.call(realNames, result) ? array.length : 0;\n\n while (length--) {\n var data = array[length],\n otherFunc = data.func;\n if (otherFunc == null || otherFunc == func) {\n return data.name;\n }\n }\n return result;\n}\n\nmodule.exports = getFuncName;\n","var baseCreate = require('./_baseCreate'),\n isObject = require('./isObject');\n\n/**\n * Creates a function that produces an instance of `Ctor` regardless of\n * whether it was invoked as part of a `new` expression or by `call` or `apply`.\n *\n * @private\n * @param {Function} Ctor The constructor to wrap.\n * @returns {Function} Returns the new wrapped function.\n */\nfunction createCtor(Ctor) {\n return function() {\n // Use a `switch` statement to work with class constructors. See\n // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist\n // for more details.\n var args = arguments;\n switch (args.length) {\n case 0: return new Ctor;\n case 1: return new Ctor(args[0]);\n case 2: return new Ctor(args[0], args[1]);\n case 3: return new Ctor(args[0], args[1], args[2]);\n case 4: return new Ctor(args[0], args[1], args[2], args[3]);\n case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);\n case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);\n case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);\n }\n var thisBinding = baseCreate(Ctor.prototype),\n result = Ctor.apply(thisBinding, args);\n\n // Mimic the constructor's `return` behavior.\n // See https://es5.github.io/#x13.2.2 for more details.\n return isObject(result) ? result : thisBinding;\n };\n}\n\nmodule.exports = createCtor;\n","//\n\nmodule.exports = function shallowEqual(objA, objB, compare, compareContext) {\n var ret = compare ? compare.call(compareContext, objA, objB) : void 0;\n if (ret !== void 0) {\n return !!ret;\n }\n if (objA === objB) {\n return true;\n }\n if (typeof objA !== \"object\" || !objA || typeof objB !== \"object\" || !objB) {\n return false;\n }\n var keysA = Object.keys(objA);\n var keysB = Object.keys(objB);\n if (keysA.length !== keysB.length) {\n return false;\n }\n var bHasOwnProperty = Object.prototype.hasOwnProperty.bind(objB);\n\n // Test for A's keys different from B.\n for (var idx = 0; idx < keysA.length; idx++) {\n var key = keysA[idx];\n if (!bHasOwnProperty(key)) {\n return false;\n }\n var valueA = objA[key];\n var valueB = objB[key];\n ret = compare ? compare.call(compareContext, valueA, valueB, key) : void 0;\n if (ret === false || ret === void 0 && valueA !== valueB) {\n return false;\n }\n }\n return true;\n};","/** Used to lookup unminified function names. */\nvar realNames = {};\n\nmodule.exports = realNames;\n","const BODY = 'body'\n\nexport const getElements = selector => document.querySelectorAll(selector)\nexport const getElement = selector => document.querySelector(selector)\nexport const addClass = (element, className) => element.classList.add(className)\nexport const removeClass = (element, className) =>\n element.classList.remove(className)\nexport const hasClass = (element, className) =>\n element.classList.contains(className)\nexport const getBody = () => getElement(BODY)\nexport const addClassToBody = className => addClass(getBody(), className)\nexport const removeClassToBody = className => removeClass(getBody(), className)\nexport const hasClassOfBody = className => hasClass(getBody(), className)\nexport const getRect = className =>\n getElement(className).getBoundingClientRect()\nexport const getPosY = className => getRect(className).y\n\nexport const getDocumentHeight = () => document.documentElement.offsetHeight\n","var metaMap = require('./_metaMap'),\n noop = require('./noop');\n\n/**\n * Gets metadata for `func`.\n *\n * @private\n * @param {Function} func The function to query.\n * @returns {*} Returns the metadata for `func`.\n */\nvar getData = !metaMap ? noop : function(func) {\n return metaMap.get(func);\n};\n\nmodule.exports = getData;\n","var LazyWrapper = require('./_LazyWrapper'),\n LodashWrapper = require('./_LodashWrapper'),\n baseLodash = require('./_baseLodash'),\n isArray = require('./isArray'),\n isObjectLike = require('./isObjectLike'),\n wrapperClone = require('./_wrapperClone');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates a `lodash` object which wraps `value` to enable implicit method\n * chain sequences. Methods that operate on and return arrays, collections,\n * and functions can be chained together. Methods that retrieve a single value\n * or may return a primitive value will automatically end the chain sequence\n * and return the unwrapped value. Otherwise, the value must be unwrapped\n * with `_#value`.\n *\n * Explicit chain sequences, which must be unwrapped with `_#value`, may be\n * enabled using `_.chain`.\n *\n * The execution of chained methods is lazy, that is, it's deferred until\n * `_#value` is implicitly or explicitly called.\n *\n * Lazy evaluation allows several methods to support shortcut fusion.\n * Shortcut fusion is an optimization to merge iteratee calls; this avoids\n * the creation of intermediate arrays and can greatly reduce the number of\n * iteratee executions. Sections of a chain sequence qualify for shortcut\n * fusion if the section is applied to an array and iteratees accept only\n * one argument. The heuristic for whether a section qualifies for shortcut\n * fusion is subject to change.\n *\n * Chaining is supported in custom builds as long as the `_#value` method is\n * directly or indirectly included in the build.\n *\n * In addition to lodash methods, wrappers have `Array` and `String` methods.\n *\n * The wrapper `Array` methods are:\n * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`\n *\n * The wrapper `String` methods are:\n * `replace` and `split`\n *\n * The wrapper methods that support shortcut fusion are:\n * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,\n * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,\n * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`\n *\n * The chainable wrapper methods are:\n * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,\n * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,\n * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,\n * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,\n * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,\n * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,\n * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,\n * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,\n * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,\n * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,\n * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,\n * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,\n * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,\n * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,\n * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,\n * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,\n * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,\n * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,\n * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,\n * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,\n * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,\n * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,\n * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,\n * `zipObject`, `zipObjectDeep`, and `zipWith`\n *\n * The wrapper methods that are **not** chainable by default are:\n * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,\n * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,\n * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,\n * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,\n * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,\n * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,\n * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,\n * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,\n * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,\n * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,\n * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,\n * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,\n * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,\n * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,\n * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,\n * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,\n * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,\n * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,\n * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,\n * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,\n * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,\n * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,\n * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,\n * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,\n * `upperFirst`, `value`, and `words`\n *\n * @name _\n * @constructor\n * @category Seq\n * @param {*} value The value to wrap in a `lodash` instance.\n * @returns {Object} Returns the new `lodash` wrapper instance.\n * @example\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * var wrapped = _([1, 2, 3]);\n *\n * // Returns an unwrapped value.\n * wrapped.reduce(_.add);\n * // => 6\n *\n * // Returns a wrapped value.\n * var squares = wrapped.map(square);\n *\n * _.isArray(squares);\n * // => false\n *\n * _.isArray(squares.value());\n * // => true\n */\nfunction lodash(value) {\n if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {\n if (value instanceof LodashWrapper) {\n return value;\n }\n if (hasOwnProperty.call(value, '__wrapped__')) {\n return wrapperClone(value);\n }\n }\n return new LodashWrapper(value);\n}\n\n// Ensure wrappers are instances of `baseLodash`.\nlodash.prototype = baseLodash.prototype;\nlodash.prototype.constructor = lodash;\n\nmodule.exports = lodash;\n","/**\n * The base implementation of `_.findIndex` and `_.findLastIndex` without\n * support for iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Function} predicate The function invoked per iteration.\n * @param {number} fromIndex The index to search from.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseFindIndex(array, predicate, fromIndex, fromRight) {\n var length = array.length,\n index = fromIndex + (fromRight ? 1 : -1);\n\n while ((fromRight ? index-- : ++index < length)) {\n if (predicate(array[index], index, array)) {\n return index;\n }\n }\n return -1;\n}\n\nmodule.exports = baseFindIndex;\n","/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * This function is like `composeArgs` except that the arguments composition\n * is tailored for `_.partialRight`.\n *\n * @private\n * @param {Array} args The provided arguments.\n * @param {Array} partials The arguments to append to those provided.\n * @param {Array} holders The `partials` placeholder indexes.\n * @params {boolean} [isCurried] Specify composing for a curried function.\n * @returns {Array} Returns the new array of composed arguments.\n */\nfunction composeArgsRight(args, partials, holders, isCurried) {\n var argsIndex = -1,\n argsLength = args.length,\n holdersIndex = -1,\n holdersLength = holders.length,\n rightIndex = -1,\n rightLength = partials.length,\n rangeLength = nativeMax(argsLength - holdersLength, 0),\n result = Array(rangeLength + rightLength),\n isUncurried = !isCurried;\n\n while (++argsIndex < rangeLength) {\n result[argsIndex] = args[argsIndex];\n }\n var offset = argsIndex;\n while (++rightIndex < rightLength) {\n result[offset + rightIndex] = partials[rightIndex];\n }\n while (++holdersIndex < holdersLength) {\n if (isUncurried || argsIndex < argsLength) {\n result[offset + holders[holdersIndex]] = args[argsIndex++];\n }\n }\n return result;\n}\n\nmodule.exports = composeArgsRight;\n","var LazyWrapper = require('./_LazyWrapper'),\n getData = require('./_getData'),\n getFuncName = require('./_getFuncName'),\n lodash = require('./wrapperLodash');\n\n/**\n * Checks if `func` has a lazy counterpart.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` has a lazy counterpart,\n * else `false`.\n */\nfunction isLaziable(func) {\n var funcName = getFuncName(func),\n other = lodash[funcName];\n\n if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {\n return false;\n }\n if (func === other) {\n return true;\n }\n var data = getData(other);\n return !!data && func === data[0];\n}\n\nmodule.exports = isLaziable;\n","var baseFindIndex = require('./_baseFindIndex'),\n baseIsNaN = require('./_baseIsNaN'),\n strictIndexOf = require('./_strictIndexOf');\n\n/**\n * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} fromIndex The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction baseIndexOf(array, value, fromIndex) {\n return value === value\n ? strictIndexOf(array, value, fromIndex)\n : baseFindIndex(array, baseIsNaN, fromIndex);\n}\n\nmodule.exports = baseIndexOf;\n","/**\n * The function whose prototype chain sequence wrappers inherit from.\n *\n * @private\n */\nfunction baseLodash() {\n // No operation performed.\n}\n\nmodule.exports = baseLodash;\n","var apply = require('./_apply'),\n createCtor = require('./_createCtor'),\n createHybrid = require('./_createHybrid'),\n createRecurry = require('./_createRecurry'),\n getHolder = require('./_getHolder'),\n replaceHolders = require('./_replaceHolders'),\n root = require('./_root');\n\n/**\n * Creates a function that wraps `func` to enable currying.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @param {number} arity The arity of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\nfunction createCurry(func, bitmask, arity) {\n var Ctor = createCtor(func);\n\n function wrapper() {\n var length = arguments.length,\n args = Array(length),\n index = length,\n placeholder = getHolder(wrapper);\n\n while (index--) {\n args[index] = arguments[index];\n }\n var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)\n ? []\n : replaceHolders(args, placeholder);\n\n length -= holders.length;\n if (length < arity) {\n return createRecurry(\n func, bitmask, createHybrid, wrapper.placeholder, undefined,\n args, holders, undefined, undefined, arity - length);\n }\n var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n return apply(fn, this, args);\n }\n return wrapper;\n}\n\nmodule.exports = createCurry;\n","var toFinite = require('./toFinite');\n\n/**\n * Converts `value` to an integer.\n *\n * **Note:** This method is loosely based on\n * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toInteger(3.2);\n * // => 3\n *\n * _.toInteger(Number.MIN_VALUE);\n * // => 0\n *\n * _.toInteger(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toInteger('3.2');\n * // => 3\n */\nfunction toInteger(value) {\n var result = toFinite(value),\n remainder = result % 1;\n\n return result === result ? (remainder ? result - remainder : result) : 0;\n}\n\nmodule.exports = toInteger;\n","var getWrapDetails = require('./_getWrapDetails'),\n insertWrapDetails = require('./_insertWrapDetails'),\n setToString = require('./_setToString'),\n updateWrapDetails = require('./_updateWrapDetails');\n\n/**\n * Sets the `toString` method of `wrapper` to mimic the source of `reference`\n * with wrapper details in a comment at the top of the source body.\n *\n * @private\n * @param {Function} wrapper The function to modify.\n * @param {Function} reference The reference function.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @returns {Function} Returns `wrapper`.\n */\nfunction setWrapToString(wrapper, reference, bitmask) {\n var source = (reference + '');\n return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));\n}\n\nmodule.exports = setWrapToString;\n","exports.__esModule = true;\nexports.Helmet = undefined;\nvar _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n};\nvar _createClass = function () {\n function defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n return function (Constructor, protoProps, staticProps) {\n if (protoProps) defineProperties(Constructor.prototype, protoProps);\n if (staticProps) defineProperties(Constructor, staticProps);\n return Constructor;\n };\n}();\nvar _react = require(\"react\");\nvar _react2 = _interopRequireDefault(_react);\nvar _propTypes = require(\"prop-types\");\nvar _propTypes2 = _interopRequireDefault(_propTypes);\nvar _reactSideEffect = require(\"react-side-effect\");\nvar _reactSideEffect2 = _interopRequireDefault(_reactSideEffect);\nvar _reactFastCompare = require(\"react-fast-compare\");\nvar _reactFastCompare2 = _interopRequireDefault(_reactFastCompare);\nvar _HelmetUtils = require(\"./HelmetUtils.js\");\nvar _HelmetConstants = require(\"./HelmetConstants.js\");\nfunction _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : {\n default: obj\n };\n}\nfunction _objectWithoutProperties(obj, keys) {\n var target = {};\n for (var i in obj) {\n if (keys.indexOf(i) >= 0) continue;\n if (!Object.prototype.hasOwnProperty.call(obj, i)) continue;\n target[i] = obj[i];\n }\n return target;\n}\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\nfunction _possibleConstructorReturn(self, call) {\n if (!self) {\n throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");\n }\n return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self;\n}\nfunction _inherits(subClass, superClass) {\n if (typeof superClass !== \"function\" && superClass !== null) {\n throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass);\n }\n subClass.prototype = Object.create(superClass && superClass.prototype, {\n constructor: {\n value: subClass,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass;\n}\nvar Helmet = function Helmet(Component) {\n var _class, _temp;\n return _temp = _class = function (_React$Component) {\n _inherits(HelmetWrapper, _React$Component);\n function HelmetWrapper() {\n _classCallCheck(this, HelmetWrapper);\n return _possibleConstructorReturn(this, _React$Component.apply(this, arguments));\n }\n HelmetWrapper.prototype.shouldComponentUpdate = function shouldComponentUpdate(nextProps) {\n return !(0, _reactFastCompare2.default)(this.props, nextProps);\n };\n HelmetWrapper.prototype.mapNestedChildrenToProps = function mapNestedChildrenToProps(child, nestedChildren) {\n if (!nestedChildren) {\n return null;\n }\n switch (child.type) {\n case _HelmetConstants.TAG_NAMES.SCRIPT:\n case _HelmetConstants.TAG_NAMES.NOSCRIPT:\n return {\n innerHTML: nestedChildren\n };\n case _HelmetConstants.TAG_NAMES.STYLE:\n return {\n cssText: nestedChildren\n };\n }\n throw new Error(\"<\" + child.type + \" /> elements are self-closing and can not contain children. Refer to our API for more information.\");\n };\n HelmetWrapper.prototype.flattenArrayTypeChildren = function flattenArrayTypeChildren(_ref) {\n var _extends2;\n var child = _ref.child,\n arrayTypeChildren = _ref.arrayTypeChildren,\n newChildProps = _ref.newChildProps,\n nestedChildren = _ref.nestedChildren;\n return _extends({}, arrayTypeChildren, (_extends2 = {}, _extends2[child.type] = [].concat(arrayTypeChildren[child.type] || [], [_extends({}, newChildProps, this.mapNestedChildrenToProps(child, nestedChildren))]), _extends2));\n };\n HelmetWrapper.prototype.mapObjectTypeChildren = function mapObjectTypeChildren(_ref2) {\n var _extends3, _extends4;\n var child = _ref2.child,\n newProps = _ref2.newProps,\n newChildProps = _ref2.newChildProps,\n nestedChildren = _ref2.nestedChildren;\n switch (child.type) {\n case _HelmetConstants.TAG_NAMES.TITLE:\n return _extends({}, newProps, (_extends3 = {}, _extends3[child.type] = nestedChildren, _extends3.titleAttributes = _extends({}, newChildProps), _extends3));\n case _HelmetConstants.TAG_NAMES.BODY:\n return _extends({}, newProps, {\n bodyAttributes: _extends({}, newChildProps)\n });\n case _HelmetConstants.TAG_NAMES.HTML:\n return _extends({}, newProps, {\n htmlAttributes: _extends({}, newChildProps)\n });\n }\n return _extends({}, newProps, (_extends4 = {}, _extends4[child.type] = _extends({}, newChildProps), _extends4));\n };\n HelmetWrapper.prototype.mapArrayTypeChildrenToProps = function mapArrayTypeChildrenToProps(arrayTypeChildren, newProps) {\n var newFlattenedProps = _extends({}, newProps);\n Object.keys(arrayTypeChildren).forEach(function (arrayChildName) {\n var _extends5;\n newFlattenedProps = _extends({}, newFlattenedProps, (_extends5 = {}, _extends5[arrayChildName] = arrayTypeChildren[arrayChildName], _extends5));\n });\n return newFlattenedProps;\n };\n HelmetWrapper.prototype.warnOnInvalidChildren = function warnOnInvalidChildren(child, nestedChildren) {\n if (process.env.NODE_ENV !== \"production\") {\n if (!_HelmetConstants.VALID_TAG_NAMES.some(function (name) {\n return child.type === name;\n })) {\n if (typeof child.type === \"function\") {\n return (0, _HelmetUtils.warn)(\"You may be attempting to nest <Helmet> components within each other, which is not allowed. Refer to our API for more information.\");\n }\n return (0, _HelmetUtils.warn)(\"Only elements types \" + _HelmetConstants.VALID_TAG_NAMES.join(\", \") + \" are allowed. Helmet does not support rendering <\" + child.type + \"> elements. Refer to our API for more information.\");\n }\n if (nestedChildren && typeof nestedChildren !== \"string\" && (!Array.isArray(nestedChildren) || nestedChildren.some(function (nestedChild) {\n return typeof nestedChild !== \"string\";\n }))) {\n throw new Error(\"Helmet expects a string as a child of <\" + child.type + \">. Did you forget to wrap your children in braces? ( <\" + child.type + \">{``}</\" + child.type + \"> ) Refer to our API for more information.\");\n }\n }\n return true;\n };\n HelmetWrapper.prototype.mapChildrenToProps = function mapChildrenToProps(children, newProps) {\n var _this2 = this;\n var arrayTypeChildren = {};\n _react2.default.Children.forEach(children, function (child) {\n if (!child || !child.props) {\n return;\n }\n var _child$props = child.props,\n nestedChildren = _child$props.children,\n childProps = _objectWithoutProperties(_child$props, [\"children\"]);\n var newChildProps = (0, _HelmetUtils.convertReactPropstoHtmlAttributes)(childProps);\n _this2.warnOnInvalidChildren(child, nestedChildren);\n switch (child.type) {\n case _HelmetConstants.TAG_NAMES.LINK:\n case _HelmetConstants.TAG_NAMES.META:\n case _HelmetConstants.TAG_NAMES.NOSCRIPT:\n case _HelmetConstants.TAG_NAMES.SCRIPT:\n case _HelmetConstants.TAG_NAMES.STYLE:\n arrayTypeChildren = _this2.flattenArrayTypeChildren({\n child: child,\n arrayTypeChildren: arrayTypeChildren,\n newChildProps: newChildProps,\n nestedChildren: nestedChildren\n });\n break;\n default:\n newProps = _this2.mapObjectTypeChildren({\n child: child,\n newProps: newProps,\n newChildProps: newChildProps,\n nestedChildren: nestedChildren\n });\n break;\n }\n });\n newProps = this.mapArrayTypeChildrenToProps(arrayTypeChildren, newProps);\n return newProps;\n };\n HelmetWrapper.prototype.render = function render() {\n var _props = this.props,\n children = _props.children,\n props = _objectWithoutProperties(_props, [\"children\"]);\n var newProps = _extends({}, props);\n if (children) {\n newProps = this.mapChildrenToProps(children, newProps);\n }\n return _react2.default.createElement(Component, newProps);\n };\n _createClass(HelmetWrapper, null, [{\n key: \"canUseDOM\",\n // Component.peek comes from react-side-effect:\n // For testing, you may use a static peek() method available on the returned component.\n // It lets you get the current state without resetting the mounted instance stack.\n // Don’t use it for anything other than testing.\n\n /**\n * @param {Object} base: {\"target\": \"_blank\", \"href\": \"http://mysite.com/\"}\n * @param {Object} bodyAttributes: {\"className\": \"root\"}\n * @param {String} defaultTitle: \"Default Title\"\n * @param {Boolean} defer: true\n * @param {Boolean} encodeSpecialCharacters: true\n * @param {Object} htmlAttributes: {\"lang\": \"en\", \"amp\": undefined}\n * @param {Array} link: [{\"rel\": \"canonical\", \"href\": \"http://mysite.com/example\"}]\n * @param {Array} meta: [{\"name\": \"description\", \"content\": \"Test description\"}]\n * @param {Array} noscript: [{\"innerHTML\": \"<img src='http://mysite.com/js/test.js'\"}]\n * @param {Function} onChangeClientState: \"(newState) => console.log(newState)\"\n * @param {Array} script: [{\"type\": \"text/javascript\", \"src\": \"http://mysite.com/js/test.js\"}]\n * @param {Array} style: [{\"type\": \"text/css\", \"cssText\": \"div { display: block; color: blue; }\"}]\n * @param {String} title: \"Title\"\n * @param {Object} titleAttributes: {\"itemprop\": \"name\"}\n * @param {String} titleTemplate: \"MySite.com - %s\"\n */\n set: function set(canUseDOM) {\n Component.canUseDOM = canUseDOM;\n }\n }]);\n return HelmetWrapper;\n }(_react2.default.Component), _class.propTypes = {\n base: _propTypes2.default.object,\n bodyAttributes: _propTypes2.default.object,\n children: _propTypes2.default.oneOfType([_propTypes2.default.arrayOf(_propTypes2.default.node), _propTypes2.default.node]),\n defaultTitle: _propTypes2.default.string,\n defer: _propTypes2.default.bool,\n encodeSpecialCharacters: _propTypes2.default.bool,\n htmlAttributes: _propTypes2.default.object,\n link: _propTypes2.default.arrayOf(_propTypes2.default.object),\n meta: _propTypes2.default.arrayOf(_propTypes2.default.object),\n noscript: _propTypes2.default.arrayOf(_propTypes2.default.object),\n onChangeClientState: _propTypes2.default.func,\n script: _propTypes2.default.arrayOf(_propTypes2.default.object),\n style: _propTypes2.default.arrayOf(_propTypes2.default.object),\n title: _propTypes2.default.string,\n titleAttributes: _propTypes2.default.object,\n titleTemplate: _propTypes2.default.string\n }, _class.defaultProps = {\n defer: true,\n encodeSpecialCharacters: true\n }, _class.peek = Component.peek, _class.rewind = function () {\n var mappedState = Component.rewind();\n if (!mappedState) {\n // provide fallback if mappedState is undefined\n mappedState = (0, _HelmetUtils.mapStateOnServer)({\n baseTag: [],\n bodyAttributes: {},\n encodeSpecialCharacters: true,\n htmlAttributes: {},\n linkTags: [],\n metaTags: [],\n noscriptTags: [],\n scriptTags: [],\n styleTags: [],\n title: \"\",\n titleAttributes: {}\n });\n }\n return mappedState;\n }, _temp;\n};\nvar NullComponent = function NullComponent() {\n return null;\n};\nvar HelmetSideEffects = (0, _reactSideEffect2.default)(_HelmetUtils.reducePropsToState, _HelmetUtils.handleClientStateChange, _HelmetUtils.mapStateOnServer)(NullComponent);\nvar HelmetExport = Helmet(HelmetSideEffects);\nHelmetExport.renderStatic = HelmetExport.rewind;\nexports.Helmet = HelmetExport;\nexports.default = HelmetExport;","/** Used to match a single whitespace character. */\nvar reWhitespace = /\\s/;\n\n/**\n * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace\n * character of `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the index of the last non-whitespace character.\n */\nfunction trimmedEndIndex(string) {\n var index = string.length;\n\n while (index-- && reWhitespace.test(string.charAt(index))) {}\n return index;\n}\n\nmodule.exports = trimmedEndIndex;\n","/**\n * Gets the argument placeholder value for `func`.\n *\n * @private\n * @param {Function} func The function to inspect.\n * @returns {*} Returns the placeholder value.\n */\nfunction getHolder(func) {\n var object = func;\n return object.placeholder;\n}\n\nmodule.exports = getHolder;\n","var baseCreate = require('./_baseCreate'),\n baseLodash = require('./_baseLodash');\n\n/** Used as references for the maximum length and index of an array. */\nvar MAX_ARRAY_LENGTH = 4294967295;\n\n/**\n * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.\n *\n * @private\n * @constructor\n * @param {*} value The value to wrap.\n */\nfunction LazyWrapper(value) {\n this.__wrapped__ = value;\n this.__actions__ = [];\n this.__dir__ = 1;\n this.__filtered__ = false;\n this.__iteratees__ = [];\n this.__takeCount__ = MAX_ARRAY_LENGTH;\n this.__views__ = [];\n}\n\n// Ensure `LazyWrapper` is an instance of `baseLodash`.\nLazyWrapper.prototype = baseCreate(baseLodash.prototype);\nLazyWrapper.prototype.constructor = LazyWrapper;\n\nmodule.exports = LazyWrapper;\n","var toNumber = require('./toNumber');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0,\n MAX_INTEGER = 1.7976931348623157e+308;\n\n/**\n * Converts `value` to a finite number.\n *\n * @static\n * @memberOf _\n * @since 4.12.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted number.\n * @example\n *\n * _.toFinite(3.2);\n * // => 3.2\n *\n * _.toFinite(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toFinite(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toFinite('3.2');\n * // => 3.2\n */\nfunction toFinite(value) {\n if (!value) {\n return value === 0 ? value : 0;\n }\n value = toNumber(value);\n if (value === INFINITY || value === -INFINITY) {\n var sign = (value < 0 ? -1 : 1);\n return sign * MAX_INTEGER;\n }\n return value === value ? value : 0;\n}\n\nmodule.exports = toFinite;\n","var composeArgs = require('./_composeArgs'),\n composeArgsRight = require('./_composeArgsRight'),\n countHolders = require('./_countHolders'),\n createCtor = require('./_createCtor'),\n createRecurry = require('./_createRecurry'),\n getHolder = require('./_getHolder'),\n reorder = require('./_reorder'),\n replaceHolders = require('./_replaceHolders'),\n root = require('./_root');\n\n/** Used to compose bitmasks for function metadata. */\nvar WRAP_BIND_FLAG = 1,\n WRAP_BIND_KEY_FLAG = 2,\n WRAP_CURRY_FLAG = 8,\n WRAP_CURRY_RIGHT_FLAG = 16,\n WRAP_ARY_FLAG = 128,\n WRAP_FLIP_FLAG = 512;\n\n/**\n * Creates a function that wraps `func` to invoke it with optional `this`\n * binding of `thisArg`, partial application, and currying.\n *\n * @private\n * @param {Function|string} func The function or method name to wrap.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @param {*} [thisArg] The `this` binding of `func`.\n * @param {Array} [partials] The arguments to prepend to those provided to\n * the new function.\n * @param {Array} [holders] The `partials` placeholder indexes.\n * @param {Array} [partialsRight] The arguments to append to those provided\n * to the new function.\n * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.\n * @param {Array} [argPos] The argument positions of the new function.\n * @param {number} [ary] The arity cap of `func`.\n * @param {number} [arity] The arity of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\nfunction createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {\n var isAry = bitmask & WRAP_ARY_FLAG,\n isBind = bitmask & WRAP_BIND_FLAG,\n isBindKey = bitmask & WRAP_BIND_KEY_FLAG,\n isCurried = bitmask & (WRAP_CURRY_FLAG | WRAP_CURRY_RIGHT_FLAG),\n isFlip = bitmask & WRAP_FLIP_FLAG,\n Ctor = isBindKey ? undefined : createCtor(func);\n\n function wrapper() {\n var length = arguments.length,\n args = Array(length),\n index = length;\n\n while (index--) {\n args[index] = arguments[index];\n }\n if (isCurried) {\n var placeholder = getHolder(wrapper),\n holdersCount = countHolders(args, placeholder);\n }\n if (partials) {\n args = composeArgs(args, partials, holders, isCurried);\n }\n if (partialsRight) {\n args = composeArgsRight(args, partialsRight, holdersRight, isCurried);\n }\n length -= holdersCount;\n if (isCurried && length < arity) {\n var newHolders = replaceHolders(args, placeholder);\n return createRecurry(\n func, bitmask, createHybrid, wrapper.placeholder, thisArg,\n args, newHolders, argPos, ary, arity - length\n );\n }\n var thisBinding = isBind ? thisArg : this,\n fn = isBindKey ? thisBinding[func] : func;\n\n length = args.length;\n if (argPos) {\n args = reorder(args, argPos);\n } else if (isFlip && length > 1) {\n args.reverse();\n }\n if (isAry && ary < length) {\n args.length = ary;\n }\n if (this && this !== root && this instanceof wrapper) {\n fn = Ctor || createCtor(fn);\n }\n return fn.apply(thisBinding, args);\n }\n return wrapper;\n}\n\nmodule.exports = createHybrid;\n","var WeakMap = require('./_WeakMap');\n\n/** Used to store function metadata. */\nvar metaMap = WeakMap && new WeakMap;\n\nmodule.exports = metaMap;\n","'use strict';\n\nvar isArray = Array.isArray;\nvar keyList = Object.keys;\nvar hasProp = Object.prototype.hasOwnProperty;\nvar hasElementType = typeof Element !== 'undefined';\nfunction equal(a, b) {\n // fast-deep-equal index.js 2.0.1\n if (a === b) return true;\n if (a && b && typeof a == 'object' && typeof b == 'object') {\n var arrA = isArray(a),\n arrB = isArray(b),\n i,\n length,\n key;\n if (arrA && arrB) {\n length = a.length;\n if (length != b.length) return false;\n for (i = length; i-- !== 0;) if (!equal(a[i], b[i])) return false;\n return true;\n }\n if (arrA != arrB) return false;\n var dateA = a instanceof Date,\n dateB = b instanceof Date;\n if (dateA != dateB) return false;\n if (dateA && dateB) return a.getTime() == b.getTime();\n var regexpA = a instanceof RegExp,\n regexpB = b instanceof RegExp;\n if (regexpA != regexpB) return false;\n if (regexpA && regexpB) return a.toString() == b.toString();\n var keys = keyList(a);\n length = keys.length;\n if (length !== keyList(b).length) return false;\n for (i = length; i-- !== 0;) if (!hasProp.call(b, keys[i])) return false;\n // end fast-deep-equal\n\n // start react-fast-compare\n // custom handling for DOM elements\n if (hasElementType && a instanceof Element && b instanceof Element) return a === b;\n\n // custom handling for React\n for (i = length; i-- !== 0;) {\n key = keys[i];\n if (key === '_owner' && a.$$typeof) {\n // React-specific: avoid traversing React elements' _owner.\n // _owner contains circular references\n // and is not needed when comparing the actual elements (and not their owners)\n // .$$typeof and ._store on just reasonable markers of a react element\n continue;\n } else {\n // all other properties should be traversed as usual\n if (!equal(a[key], b[key])) return false;\n }\n }\n // end react-fast-compare\n\n // fast-deep-equal index.js 2.0.1\n return true;\n }\n return a !== a && b !== b;\n}\n// end fast-deep-equal\n\nmodule.exports = function exportedEqual(a, b) {\n try {\n return equal(a, b);\n } catch (error) {\n if (error.message && error.message.match(/stack|recursion/i) || error.number === -2146828260) {\n // warn on circular references, don't crash\n // browsers give this different errors name and messages:\n // chrome/safari: \"RangeError\", \"Maximum call stack size exceeded\"\n // firefox: \"InternalError\", too much recursion\"\n // edge: \"Error\", \"Out of stack space\"\n console.warn('Warning: react-fast-compare does not handle circular references.', error.name, error.message);\n return false;\n }\n // some other error. we should definitely know about these\n throw error;\n }\n};","require(\"core-js/modules/es.array.reduce.js\");\nexports.__esModule = true;\nvar ATTRIBUTE_NAMES = exports.ATTRIBUTE_NAMES = {\n BODY: \"bodyAttributes\",\n HTML: \"htmlAttributes\",\n TITLE: \"titleAttributes\"\n};\nvar TAG_NAMES = exports.TAG_NAMES = {\n BASE: \"base\",\n BODY: \"body\",\n HEAD: \"head\",\n HTML: \"html\",\n LINK: \"link\",\n META: \"meta\",\n NOSCRIPT: \"noscript\",\n SCRIPT: \"script\",\n STYLE: \"style\",\n TITLE: \"title\"\n};\nvar VALID_TAG_NAMES = exports.VALID_TAG_NAMES = Object.keys(TAG_NAMES).map(function (name) {\n return TAG_NAMES[name];\n});\nvar TAG_PROPERTIES = exports.TAG_PROPERTIES = {\n CHARSET: \"charset\",\n CSS_TEXT: \"cssText\",\n HREF: \"href\",\n HTTPEQUIV: \"http-equiv\",\n INNER_HTML: \"innerHTML\",\n ITEM_PROP: \"itemprop\",\n NAME: \"name\",\n PROPERTY: \"property\",\n REL: \"rel\",\n SRC: \"src\"\n};\nvar REACT_TAG_MAP = exports.REACT_TAG_MAP = {\n accesskey: \"accessKey\",\n charset: \"charSet\",\n class: \"className\",\n contenteditable: \"contentEditable\",\n contextmenu: \"contextMenu\",\n \"http-equiv\": \"httpEquiv\",\n itemprop: \"itemProp\",\n tabindex: \"tabIndex\"\n};\nvar HELMET_PROPS = exports.HELMET_PROPS = {\n DEFAULT_TITLE: \"defaultTitle\",\n DEFER: \"defer\",\n ENCODE_SPECIAL_CHARACTERS: \"encodeSpecialCharacters\",\n ON_CHANGE_CLIENT_STATE: \"onChangeClientState\",\n TITLE_TEMPLATE: \"titleTemplate\"\n};\nvar HTML_TAG_MAP = exports.HTML_TAG_MAP = Object.keys(REACT_TAG_MAP).reduce(function (obj, key) {\n obj[REACT_TAG_MAP[key]] = key;\n return obj;\n}, {});\nvar SELF_CLOSING_TAGS = exports.SELF_CLOSING_TAGS = [TAG_NAMES.NOSCRIPT, TAG_NAMES.SCRIPT, TAG_NAMES.STYLE];\nvar HELMET_ATTRIBUTE = exports.HELMET_ATTRIBUTE = \"data-react-helmet\";","import React from 'react'\n\nimport './index.scss'\n\nexport const GitHubIcon = () => {\n return (\n <a\n href=\"https://github.com/mmdmthr\"\n className=\"github\"\n aria-label=\"GitHub\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"32\"\n height=\"32\"\n viewBox=\"0 0 24 24\"\n >\n <path d=\"M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z\" />\n </svg>\n </a>\n )\n}\n","import React from 'react'\nimport { Link } from 'gatsby'\nimport { GitHubIcon } from '../social-share/github-icon'\n\nimport './index.scss'\n\nexport const Top = ({ title, location, rootPath }) => {\n const isRoot = location.pathname === rootPath\n return (\n <div className=\"top\">\n {!isRoot && (\n <Link to={`/`} className=\"link\">\n {title}\n </Link>\n )}\n <GitHubIcon />\n </div>\n )\n}\n","import React from 'react'\nimport { Link } from 'gatsby'\n\nimport './index.scss'\n\nexport const Header = ({ title, location, rootPath }) => {\n const isRoot = location.pathname === rootPath\n return (\n isRoot && (\n <h1 className=\"home-header\">\n <Link to={`/`} className=\"link\">\n {title}\n </Link>\n </h1>\n )\n )\n}\n","import React, { useState, useEffect } from 'react'\nimport Switch from 'react-switch'\n\nimport * as Dom from '../../utils/dom'\nimport * as Storage from '../../utils/storage'\nimport { THEME } from '../../constants'\n\nimport './index.scss'\n\nconst MoonIcon = () => {\n return (\n <svg width=\"24\" height=\"24\">\n <rect width=\"24\" height=\"24\" fill=\"none\" rx=\"0\" ry=\"0\" />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M14.8102 3.2H13.8202C13.4902 3.2 13.2302 2.93 13.2302 2.6C13.2302 2.27 13.5002 2 13.8302 2H16.2602C16.5002 2 16.7202 2.15 16.8102 2.37C16.9002 2.59 16.8502 2.85 16.6802 3.02L15.2702 4.43H16.2602C16.5902 4.43 16.8602 4.7 16.8602 5.03C16.8602 5.36 16.5902 5.63 16.2602 5.63H13.8202C13.5802 5.63 13.3602 5.48 13.2702 5.26C13.1802 5.04 13.2302 4.78 13.4002 4.61L14.8102 3.2ZM20.1401 11.0101H21.1301C21.4601 11.0101 21.7401 11.2801 21.7401 11.6101C21.7401 11.9401 21.4701 12.2101 21.1401 12.2101H18.7001C18.4601 12.2101 18.2401 12.0601 18.1501 11.8401C18.0601 11.6201 18.1101 11.3601 18.2801 11.1901L19.6901 9.78008H18.7001C18.3701 9.78008 18.1001 9.51008 18.1001 9.18008C18.1001 8.85008 18.3701 8.58008 18.7001 8.58008H21.1301C21.3701 8.58008 21.5901 8.73008 21.6801 8.95008C21.7701 9.17008 21.7201 9.43008 21.5501 9.60008L20.1401 11.0101ZM11.0302 9.8499H12.8502L10.7002 11.9999C10.5302 12.1699 10.4802 12.4299 10.5702 12.6499C10.6602 12.8699 10.8802 13.0199 11.1202 13.0199H14.2902C14.6202 13.0199 14.8902 12.7499 14.8902 12.4199C14.8902 12.0899 14.6202 11.8199 14.2902 11.8199H12.5602L14.7102 9.6699C14.8802 9.4999 14.9302 9.2399 14.8402 9.0199C14.7502 8.7999 14.5302 8.6499 14.2902 8.6499H11.0202C10.6902 8.6499 10.4202 8.9199 10.4202 9.2499C10.4202 9.5799 10.7002 9.8499 11.0302 9.8499ZM14.5501 16.89C15.6601 16.89 16.7201 16.66 17.7101 16.19C17.9401 16.08 18.2101 16.13 18.3801 16.3C18.5601 16.48 18.6101 16.75 18.5001 16.98C17.0901 20.05 13.9901 22.03 10.6001 22.03C5.79013 22.03 1.88013 18.12 1.88013 13.31C1.88013 9.94004 3.87013 6.84004 6.93013 5.40004C7.16013 5.29004 7.43012 5.34004 7.61012 5.52004C7.79012 5.70004 7.84013 5.97004 7.73013 6.20004C7.27013 7.19004 7.03012 8.26004 7.03012 9.38004C7.03012 13.52 10.4001 16.89 14.5501 16.89ZM3.09013 13.31C3.09013 17.46 6.46012 20.83 10.6101 20.83C12.9901 20.83 15.2001 19.7 16.6001 17.85C15.9401 18.01 15.2501 18.09 14.5501 18.09C9.74013 18.09 5.83012 14.18 5.83012 9.38004C5.83012 8.68004 5.91013 7.99004 6.07013 7.32004C4.22013 8.73004 3.09013 10.94 3.09013 13.31Z\"\n />\n </svg>\n )\n}\n\nconst SunIcon = () => {\n return (\n <svg width=\"24\" height=\"24\">\n <rect width=\"24\" height=\"24\" fill=\"none\" rx=\"0\" ry=\"0\" />\n <path\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n d=\"M12.7488 5.67224C13.1057 5.67298 13.3958 5.38416 13.3965 5.0271C13.3973 4.67005 13.1084 4.37989 12.7515 4.37915C12.3943 4.37842 12.1043 4.66724 12.1035 5.02442C12.1028 5.38135 12.3916 5.67151 12.7488 5.67224ZM9.39535 6.57153C9.70504 6.39355 9.81173 5.99841 9.63388 5.68884C9.45602 5.37914 9.06076 5.27245 8.75119 5.45031C8.44162 5.62817 8.3348 6.02343 8.51266 6.333C8.69064 6.64257 9.08578 6.74926 9.39535 6.57153ZM6.94091 9.02688C6.76171 9.33571 6.3662 9.44094 6.05736 9.26174C5.74852 9.08254 5.6433 8.68691 5.8225 8.37807C6.0017 8.06923 6.39733 7.96413 6.70617 8.14333C7.015 8.32253 7.12011 8.71804 6.94091 9.02688ZM6.04309 12.3806C6.04383 12.0234 5.75501 11.7334 5.39795 11.7327C5.0409 11.7319 4.75074 12.0208 4.75 12.3779C4.74927 12.7349 5.03809 13.0249 5.39527 13.0256C5.7522 13.0265 6.04236 12.7376 6.04309 12.3806ZM5.82116 16.3781C5.6433 16.0684 5.74999 15.6734 6.05968 15.4954C6.36925 15.3176 6.7644 15.4244 6.94237 15.734C7.12023 16.0435 7.01342 16.4388 6.70385 16.6165C6.39428 16.7945 5.99902 16.6877 5.82116 16.3781ZM9.39773 18.1882C9.08889 18.0091 8.69338 18.1142 8.51418 18.423C8.33498 18.7319 8.44008 19.1275 8.74892 19.3067C9.05776 19.4858 9.45339 19.3808 9.63259 19.072C9.81179 18.7631 9.70656 18.3674 9.39773 18.1882ZM12.1035 19.7313C12.1043 19.3743 12.3943 19.0855 12.7515 19.0862C13.1084 19.0869 13.3973 19.377 13.3965 19.7341C13.3958 20.0911 13.1057 20.3799 12.7488 20.3792C12.3916 20.3784 12.1028 20.0884 12.1035 19.7313ZM16.1047 18.1869C15.7951 18.3647 15.6883 18.7599 15.8662 19.0695C16.0442 19.3791 16.4392 19.4859 16.7489 19.308C17.0584 19.1302 17.1652 18.735 16.9873 18.4255C16.8095 18.1158 16.4143 18.009 16.1047 18.1869ZM18.559 15.7315C18.7382 15.4227 19.134 15.3177 19.4428 15.4969C19.7516 15.676 19.8566 16.0716 19.6775 16.3804C19.4983 16.6893 19.1027 16.7945 18.7939 16.6153C18.485 16.4361 18.3799 16.0403 18.559 15.7315ZM20.105 11.7327C19.7478 11.7319 19.4578 12.0208 19.457 12.3779C19.4563 12.7349 19.7451 13.0249 20.1022 13.0256C20.4592 13.0265 20.7493 12.7376 20.75 12.3806C20.7507 12.0234 20.4619 11.7334 20.105 11.7327ZM19.679 8.38046C19.8569 8.69003 19.75 9.08529 19.4405 9.26315C19.1309 9.44101 18.7356 9.33432 18.5579 9.02462C18.3799 8.71505 18.4867 8.31991 18.7964 8.14193C19.106 7.96408 19.5011 8.07089 19.679 8.38046ZM16.1022 6.57006C16.4111 6.74926 16.8068 6.64415 16.986 6.33532C17.1652 6.02648 17.06 5.63085 16.7512 5.45165C16.4423 5.27245 16.0467 5.37767 15.8676 5.68651C15.6884 5.99535 15.7934 6.39086 16.1022 6.57006ZM8.26319 12.3795C8.26319 9.90466 10.2761 7.8916 12.75 7.8916C15.2249 7.8916 17.2379 9.90466 17.2379 12.3795C17.2379 14.8534 15.2249 16.8663 12.75 16.8663C10.2761 16.8663 8.26319 14.8534 8.26319 12.3795ZM9.5553 12.3795C9.5553 14.141 10.9885 15.5741 12.75 15.5741C14.5115 15.5741 15.9458 14.141 15.9458 12.3795C15.9458 10.618 14.5115 9.18372 12.75 9.18372C10.9885 9.18372 9.5553 10.618 9.5553 12.3795Z\"\n />\n </svg>\n )\n}\nfunction getTheme(checked) {\n return checked ? THEME.DARK : THEME.LIGHT\n}\n\nfunction toggleTheme(theme) {\n switch (theme) {\n case THEME.LIGHT: {\n Dom.addClassToBody(THEME.LIGHT)\n Dom.removeClassToBody(THEME.DARK)\n break\n }\n case THEME.DARK: {\n Dom.addClassToBody(THEME.DARK)\n Dom.removeClassToBody(THEME.LIGHT)\n break\n }\n }\n}\n\nexport const ThemeSwitch = () => {\n const [checked, setChecked] = useState(false)\n\n const handleChange = checked => {\n const theme = getTheme(checked)\n\n Storage.setTheme(checked)\n setChecked(checked)\n toggleTheme(theme)\n }\n\n useEffect(() => {\n const checked = Storage.getTheme(Dom.hasClassOfBody(THEME.DARK))\n\n handleChange(checked)\n }, [])\n\n return (\n <div className=\"switch-container\">\n <label htmlFor=\"normal-switch\">\n <Switch\n onChange={handleChange}\n checked={checked}\n id=\"normal-switch\"\n height={24}\n width={48}\n checkedIcon={\n <div className=\"icon checkedIcon\">\n <MoonIcon />\n </div>\n }\n uncheckedIcon={\n <div className=\"icon uncheckedIcon\">\n <SunIcon />\n </div>\n }\n offColor={'#d9dfe2'}\n offHandleColor={'#fff'}\n onColor={'#999'}\n onHandleColor={'#282c35'}\n />\n </label>\n </div>\n )\n}\n","import React from 'react'\n\nimport './index.scss'\n\nexport const Footer = () => (\n <footer className=\"footer\">\n Built with{' '}\n <a href=\"https://github.com/JaeYeopHan/gatsby-starter-bee\">\n Gatsby-starter-bee\n </a>\n </footer>\n)\n","import React from 'react'\n\nimport { Top } from '../components/top'\nimport { Header } from '../components/header'\nimport { ThemeSwitch } from '../components/theme-switch'\nimport { Footer } from '../components/footer'\nimport { rhythm } from '../utils/typography'\n\nimport './index.scss'\n\nexport const Layout = ({ location, title, children }) => {\n const rootPath = `${__PATH_PREFIX__}/`\n\n return (\n <React.Fragment>\n <Top title={title} location={location} rootPath={rootPath} />\n <div\n style={{\n marginLeft: `auto`,\n marginRight: `auto`,\n maxWidth: rhythm(24),\n padding: `${rhythm(1.5)} ${rhythm(3 / 4)}`,\n }}\n >\n <ThemeSwitch />\n <Header title={title} location={location} rootPath={rootPath} />\n {children}\n <Footer />\n </div>\n </React.Fragment>\n )\n}\n","var createCtor = require('./_createCtor'),\n root = require('./_root');\n\n/** Used to compose bitmasks for function metadata. */\nvar WRAP_BIND_FLAG = 1;\n\n/**\n * Creates a function that wraps `func` to invoke it with the optional `this`\n * binding of `thisArg`.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {number} bitmask The bitmask flags. See `createWrap` for more details.\n * @param {*} [thisArg] The `this` binding of `func`.\n * @returns {Function} Returns the new wrapped function.\n */\nfunction createBind(func, bitmask, thisArg) {\n var isBind = bitmask & WRAP_BIND_FLAG,\n Ctor = createCtor(func);\n\n function wrapper() {\n var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;\n return fn.apply(isBind ? thisArg : this, arguments);\n }\n return wrapper;\n}\n\nmodule.exports = createBind;\n","var trimmedEndIndex = require('./_trimmedEndIndex');\n\n/** Used to match leading whitespace. */\nvar reTrimStart = /^\\s+/;\n\n/**\n * The base implementation of `_.trim`.\n *\n * @private\n * @param {string} string The string to trim.\n * @returns {string} Returns the trimmed string.\n */\nfunction baseTrim(string) {\n return string\n ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')\n : string;\n}\n\nmodule.exports = baseTrim;\n","var baseIndexOf = require('./_baseIndexOf');\n\n/**\n * A specialized version of `_.includes` for arrays without support for\n * specifying an index to search from.\n *\n * @private\n * @param {Array} [array] The array to inspect.\n * @param {*} target The value to search for.\n * @returns {boolean} Returns `true` if `target` is found, else `false`.\n */\nfunction arrayIncludes(array, value) {\n var length = array == null ? 0 : array.length;\n return !!length && baseIndexOf(array, value, 0) > -1;\n}\n\nmodule.exports = arrayIncludes;\n","if (process.env.NODE_ENV === \"production\") {\n module.exports = require(\"./dist/react-switch.min.js\");\n} else {\n module.exports = require(\"./dist/react-switch.dev.js\");\n}","var copyArray = require('./_copyArray'),\n isIndex = require('./_isIndex');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMin = Math.min;\n\n/**\n * Reorder `array` according to the specified indexes where the element at\n * the first index is assigned as the first element, the element at\n * the second index is assigned as the second element, and so on.\n *\n * @private\n * @param {Array} array The array to reorder.\n * @param {Array} indexes The arranged array indexes.\n * @returns {Array} Returns `array`.\n */\nfunction reorder(array, indexes) {\n var arrLength = array.length,\n length = nativeMin(indexes.length, arrLength),\n oldArray = copyArray(array);\n\n while (length--) {\n var index = indexes[length];\n array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;\n }\n return array;\n}\n\nmodule.exports = reorder;\n","var composeArgs = require('./_composeArgs'),\n composeArgsRight = require('./_composeArgsRight'),\n replaceHolders = require('./_replaceHolders');\n\n/** Used as the internal argument placeholder. */\nvar PLACEHOLDER = '__lodash_placeholder__';\n\n/** Used to compose bitmasks for function metadata. */\nvar WRAP_BIND_FLAG = 1,\n WRAP_BIND_KEY_FLAG = 2,\n WRAP_CURRY_BOUND_FLAG = 4,\n WRAP_CURRY_FLAG = 8,\n WRAP_ARY_FLAG = 128,\n WRAP_REARG_FLAG = 256;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMin = Math.min;\n\n/**\n * Merges the function metadata of `source` into `data`.\n *\n * Merging metadata reduces the number of wrappers used to invoke a function.\n * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`\n * may be applied regardless of execution order. Methods like `_.ary` and\n * `_.rearg` modify function arguments, making the order in which they are\n * executed important, preventing the merging of metadata. However, we make\n * an exception for a safe combined case where curried functions have `_.ary`\n * and or `_.rearg` applied.\n *\n * @private\n * @param {Array} data The destination metadata.\n * @param {Array} source The source metadata.\n * @returns {Array} Returns `data`.\n */\nfunction mergeData(data, source) {\n var bitmask = data[1],\n srcBitmask = source[1],\n newBitmask = bitmask | srcBitmask,\n isCommon = newBitmask < (WRAP_BIND_FLAG | WRAP_BIND_KEY_FLAG | WRAP_ARY_FLAG);\n\n var isCombo =\n ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_CURRY_FLAG)) ||\n ((srcBitmask == WRAP_ARY_FLAG) && (bitmask == WRAP_REARG_FLAG) && (data[7].length <= source[8])) ||\n ((srcBitmask == (WRAP_ARY_FLAG | WRAP_REARG_FLAG)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG));\n\n // Exit early if metadata can't be merged.\n if (!(isCommon || isCombo)) {\n return data;\n }\n // Use source `thisArg` if available.\n if (srcBitmask & WRAP_BIND_FLAG) {\n data[2] = source[2];\n // Set when currying a bound function.\n newBitmask |= bitmask & WRAP_BIND_FLAG ? 0 : WRAP_CURRY_BOUND_FLAG;\n }\n // Compose partial arguments.\n var value = source[3];\n if (value) {\n var partials = data[3];\n data[3] = partials ? composeArgs(partials, value, source[4]) : value;\n data[4] = partials ? replaceHolders(data[3], PLACEHOLDER) : source[4];\n }\n // Compose partial right arguments.\n value = source[5];\n if (value) {\n partials = data[5];\n data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;\n data[6] = partials ? replaceHolders(data[5], PLACEHOLDER) : source[6];\n }\n // Use source `argPos` if available.\n value = source[7];\n if (value) {\n data[7] = value;\n }\n // Use source `ary` if it's smaller.\n if (srcBitmask & WRAP_ARY_FLAG) {\n data[8] = data[8] == null ? source[8] : nativeMin(data[8], source[8]);\n }\n // Use source `arity` if one is not provided.\n if (data[9] == null) {\n data[9] = source[9];\n }\n // Use source `func` and merge bitmasks.\n data[0] = source[0];\n data[1] = newBitmask;\n\n return data;\n}\n\nmodule.exports = mergeData;\n","var identity = require('./identity'),\n metaMap = require('./_metaMap');\n\n/**\n * The base implementation of `setData` without support for hot loop shorting.\n *\n * @private\n * @param {Function} func The function to associate metadata with.\n * @param {*} data The metadata.\n * @returns {Function} Returns `func`.\n */\nvar baseSetData = !metaMap ? identity : function(func, data) {\n metaMap.set(func, data);\n return func;\n};\n\nmodule.exports = baseSetData;\n","var baseRest = require('./_baseRest'),\n createWrap = require('./_createWrap'),\n getHolder = require('./_getHolder'),\n replaceHolders = require('./_replaceHolders');\n\n/** Used to compose bitmasks for function metadata. */\nvar WRAP_PARTIAL_FLAG = 32;\n\n/**\n * Creates a function that invokes `func` with `partials` prepended to the\n * arguments it receives. This method is like `_.bind` except it does **not**\n * alter the `this` binding.\n *\n * The `_.partial.placeholder` value, which defaults to `_` in monolithic\n * builds, may be used as a placeholder for partially applied arguments.\n *\n * **Note:** This method doesn't set the \"length\" property of partially\n * applied functions.\n *\n * @static\n * @memberOf _\n * @since 0.2.0\n * @category Function\n * @param {Function} func The function to partially apply arguments to.\n * @param {...*} [partials] The arguments to be partially applied.\n * @returns {Function} Returns the new partially applied function.\n * @example\n *\n * function greet(greeting, name) {\n * return greeting + ' ' + name;\n * }\n *\n * var sayHelloTo = _.partial(greet, 'hello');\n * sayHelloTo('fred');\n * // => 'hello fred'\n *\n * // Partially applied with placeholders.\n * var greetFred = _.partial(greet, _, 'fred');\n * greetFred('hi');\n * // => 'hi fred'\n */\nvar partial = baseRest(function(func, partials) {\n var holders = replaceHolders(partials, getHolder(partial));\n return createWrap(func, WRAP_PARTIAL_FLAG, undefined, partials, holders);\n});\n\n// Assign default placeholders.\npartial.placeholder = {};\n\nmodule.exports = partial;\n","/**\n * Gets the number of `placeholder` occurrences in `array`.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} placeholder The placeholder to search for.\n * @returns {number} Returns the placeholder count.\n */\nfunction countHolders(array, placeholder) {\n var length = array.length,\n result = 0;\n\n while (length--) {\n if (array[length] === placeholder) {\n ++result;\n }\n }\n return result;\n}\n\nmodule.exports = countHolders;\n","var baseTrim = require('./_baseTrim'),\n isObject = require('./isObject'),\n isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = baseTrim(value);\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = toNumber;\n","/** Used to match wrap detail comments. */\nvar reWrapDetails = /\\{\\n\\/\\* \\[wrapped with (.+)\\] \\*/,\n reSplitDetails = /,? & /;\n\n/**\n * Extracts wrapper details from the `source` body comment.\n *\n * @private\n * @param {string} source The source to inspect.\n * @returns {Array} Returns the wrapper details.\n */\nfunction getWrapDetails(source) {\n var match = source.match(reWrapDetails);\n return match ? match[1].split(reSplitDetails) : [];\n}\n\nmodule.exports = getWrapDetails;\n","require(\"core-js/modules/es.array.reduce.js\");\nexports.__esModule = true;\nexports.warn = exports.requestAnimationFrame = exports.reducePropsToState = exports.mapStateOnServer = exports.handleClientStateChange = exports.convertReactPropstoHtmlAttributes = undefined;\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) {\n return typeof obj;\n} : function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n};\nvar _extends = Object.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n return target;\n};\nvar _react = require(\"react\");\nvar _react2 = _interopRequireDefault(_react);\nvar _objectAssign = require(\"object-assign\");\nvar _objectAssign2 = _interopRequireDefault(_objectAssign);\nvar _HelmetConstants = require(\"./HelmetConstants.js\");\nfunction _interopRequireDefault(obj) {\n return obj && obj.__esModule ? obj : {\n default: obj\n };\n}\nvar encodeSpecialCharacters = function encodeSpecialCharacters(str) {\n var encode = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n if (encode === false) {\n return String(str);\n }\n return String(str).replace(/&/g, \"&\").replace(/</g, \"<\").replace(/>/g, \">\").replace(/\"/g, \""\").replace(/'/g, \"'\");\n};\nvar getTitleFromPropsList = function getTitleFromPropsList(propsList) {\n var innermostTitle = getInnermostProperty(propsList, _HelmetConstants.TAG_NAMES.TITLE);\n var innermostTemplate = getInnermostProperty(propsList, _HelmetConstants.HELMET_PROPS.TITLE_TEMPLATE);\n if (innermostTemplate && innermostTitle) {\n // use function arg to avoid need to escape $ characters\n return innermostTemplate.replace(/%s/g, function () {\n return innermostTitle;\n });\n }\n var innermostDefaultTitle = getInnermostProperty(propsList, _HelmetConstants.HELMET_PROPS.DEFAULT_TITLE);\n return innermostTitle || innermostDefaultTitle || undefined;\n};\nvar getOnChangeClientState = function getOnChangeClientState(propsList) {\n return getInnermostProperty(propsList, _HelmetConstants.HELMET_PROPS.ON_CHANGE_CLIENT_STATE) || function () {};\n};\nvar getAttributesFromPropsList = function getAttributesFromPropsList(tagType, propsList) {\n return propsList.filter(function (props) {\n return typeof props[tagType] !== \"undefined\";\n }).map(function (props) {\n return props[tagType];\n }).reduce(function (tagAttrs, current) {\n return _extends({}, tagAttrs, current);\n }, {});\n};\nvar getBaseTagFromPropsList = function getBaseTagFromPropsList(primaryAttributes, propsList) {\n return propsList.filter(function (props) {\n return typeof props[_HelmetConstants.TAG_NAMES.BASE] !== \"undefined\";\n }).map(function (props) {\n return props[_HelmetConstants.TAG_NAMES.BASE];\n }).reverse().reduce(function (innermostBaseTag, tag) {\n if (!innermostBaseTag.length) {\n var keys = Object.keys(tag);\n for (var i = 0; i < keys.length; i++) {\n var attributeKey = keys[i];\n var lowerCaseAttributeKey = attributeKey.toLowerCase();\n if (primaryAttributes.indexOf(lowerCaseAttributeKey) !== -1 && tag[lowerCaseAttributeKey]) {\n return innermostBaseTag.concat(tag);\n }\n }\n }\n return innermostBaseTag;\n }, []);\n};\nvar getTagsFromPropsList = function getTagsFromPropsList(tagName, primaryAttributes, propsList) {\n // Calculate list of tags, giving priority innermost component (end of the propslist)\n var approvedSeenTags = {};\n return propsList.filter(function (props) {\n if (Array.isArray(props[tagName])) {\n return true;\n }\n if (typeof props[tagName] !== \"undefined\") {\n warn(\"Helmet: \" + tagName + \" should be of type \\\"Array\\\". Instead found type \\\"\" + _typeof(props[tagName]) + \"\\\"\");\n }\n return false;\n }).map(function (props) {\n return props[tagName];\n }).reverse().reduce(function (approvedTags, instanceTags) {\n var instanceSeenTags = {};\n instanceTags.filter(function (tag) {\n var primaryAttributeKey = void 0;\n var keys = Object.keys(tag);\n for (var i = 0; i < keys.length; i++) {\n var attributeKey = keys[i];\n var lowerCaseAttributeKey = attributeKey.toLowerCase();\n\n // Special rule with link tags, since rel and href are both primary tags, rel takes priority\n if (primaryAttributes.indexOf(lowerCaseAttributeKey) !== -1 && !(primaryAttributeKey === _HelmetConstants.TAG_PROPERTIES.REL && tag[primaryAttributeKey].toLowerCase() === \"canonical\") && !(lowerCaseAttributeKey === _HelmetConstants.TAG_PROPERTIES.REL && tag[lowerCaseAttributeKey].toLowerCase() === \"stylesheet\")) {\n primaryAttributeKey = lowerCaseAttributeKey;\n }\n // Special case for innerHTML which doesn't work lowercased\n if (primaryAttributes.indexOf(attributeKey) !== -1 && (attributeKey === _HelmetConstants.TAG_PROPERTIES.INNER_HTML || attributeKey === _HelmetConstants.TAG_PROPERTIES.CSS_TEXT || attributeKey === _HelmetConstants.TAG_PROPERTIES.ITEM_PROP)) {\n primaryAttributeKey = attributeKey;\n }\n }\n if (!primaryAttributeKey || !tag[primaryAttributeKey]) {\n return false;\n }\n var value = tag[primaryAttributeKey].toLowerCase();\n if (!approvedSeenTags[primaryAttributeKey]) {\n approvedSeenTags[primaryAttributeKey] = {};\n }\n if (!instanceSeenTags[primaryAttributeKey]) {\n instanceSeenTags[primaryAttributeKey] = {};\n }\n if (!approvedSeenTags[primaryAttributeKey][value]) {\n instanceSeenTags[primaryAttributeKey][value] = true;\n return true;\n }\n return false;\n }).reverse().forEach(function (tag) {\n return approvedTags.push(tag);\n });\n\n // Update seen tags with tags from this instance\n var keys = Object.keys(instanceSeenTags);\n for (var i = 0; i < keys.length; i++) {\n var attributeKey = keys[i];\n var tagUnion = (0, _objectAssign2.default)({}, approvedSeenTags[attributeKey], instanceSeenTags[attributeKey]);\n approvedSeenTags[attributeKey] = tagUnion;\n }\n return approvedTags;\n }, []).reverse();\n};\nvar getInnermostProperty = function getInnermostProperty(propsList, property) {\n for (var i = propsList.length - 1; i >= 0; i--) {\n var props = propsList[i];\n if (props.hasOwnProperty(property)) {\n return props[property];\n }\n }\n return null;\n};\nvar reducePropsToState = function reducePropsToState(propsList) {\n return {\n baseTag: getBaseTagFromPropsList([_HelmetConstants.TAG_PROPERTIES.HREF], propsList),\n bodyAttributes: getAttributesFromPropsList(_HelmetConstants.ATTRIBUTE_NAMES.BODY, propsList),\n defer: getInnermostProperty(propsList, _HelmetConstants.HELMET_PROPS.DEFER),\n encode: getInnermostProperty(propsList, _HelmetConstants.HELMET_PROPS.ENCODE_SPECIAL_CHARACTERS),\n htmlAttributes: getAttributesFromPropsList(_HelmetConstants.ATTRIBUTE_NAMES.HTML, propsList),\n linkTags: getTagsFromPropsList(_HelmetConstants.TAG_NAMES.LINK, [_HelmetConstants.TAG_PROPERTIES.REL, _HelmetConstants.TAG_PROPERTIES.HREF], propsList),\n metaTags: getTagsFromPropsList(_HelmetConstants.TAG_NAMES.META, [_HelmetConstants.TAG_PROPERTIES.NAME, _HelmetConstants.TAG_PROPERTIES.CHARSET, _HelmetConstants.TAG_PROPERTIES.HTTPEQUIV, _HelmetConstants.TAG_PROPERTIES.PROPERTY, _HelmetConstants.TAG_PROPERTIES.ITEM_PROP], propsList),\n noscriptTags: getTagsFromPropsList(_HelmetConstants.TAG_NAMES.NOSCRIPT, [_HelmetConstants.TAG_PROPERTIES.INNER_HTML], propsList),\n onChangeClientState: getOnChangeClientState(propsList),\n scriptTags: getTagsFromPropsList(_HelmetConstants.TAG_NAMES.SCRIPT, [_HelmetConstants.TAG_PROPERTIES.SRC, _HelmetConstants.TAG_PROPERTIES.INNER_HTML], propsList),\n styleTags: getTagsFromPropsList(_HelmetConstants.TAG_NAMES.STYLE, [_HelmetConstants.TAG_PROPERTIES.CSS_TEXT], propsList),\n title: getTitleFromPropsList(propsList),\n titleAttributes: getAttributesFromPropsList(_HelmetConstants.ATTRIBUTE_NAMES.TITLE, propsList)\n };\n};\nvar rafPolyfill = function () {\n var clock = Date.now();\n return function (callback) {\n var currentTime = Date.now();\n if (currentTime - clock > 16) {\n clock = currentTime;\n callback(currentTime);\n } else {\n setTimeout(function () {\n rafPolyfill(callback);\n }, 0);\n }\n };\n}();\nvar cafPolyfill = function cafPolyfill(id) {\n return clearTimeout(id);\n};\nvar requestAnimationFrame = typeof window !== \"undefined\" ? window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || rafPolyfill : global.requestAnimationFrame || rafPolyfill;\nvar cancelAnimationFrame = typeof window !== \"undefined\" ? window.cancelAnimationFrame || window.webkitCancelAnimationFrame || window.mozCancelAnimationFrame || cafPolyfill : global.cancelAnimationFrame || cafPolyfill;\nvar warn = function warn(msg) {\n return console && typeof console.warn === \"function\" && console.warn(msg);\n};\nvar _helmetCallback = null;\nvar handleClientStateChange = function handleClientStateChange(newState) {\n if (_helmetCallback) {\n cancelAnimationFrame(_helmetCallback);\n }\n if (newState.defer) {\n _helmetCallback = requestAnimationFrame(function () {\n commitTagChanges(newState, function () {\n _helmetCallback = null;\n });\n });\n } else {\n commitTagChanges(newState);\n _helmetCallback = null;\n }\n};\nvar commitTagChanges = function commitTagChanges(newState, cb) {\n var baseTag = newState.baseTag,\n bodyAttributes = newState.bodyAttributes,\n htmlAttributes = newState.htmlAttributes,\n linkTags = newState.linkTags,\n metaTags = newState.metaTags,\n noscriptTags = newState.noscriptTags,\n onChangeClientState = newState.onChangeClientState,\n scriptTags = newState.scriptTags,\n styleTags = newState.styleTags,\n title = newState.title,\n titleAttributes = newState.titleAttributes;\n updateAttributes(_HelmetConstants.TAG_NAMES.BODY, bodyAttributes);\n updateAttributes(_HelmetConstants.TAG_NAMES.HTML, htmlAttributes);\n updateTitle(title, titleAttributes);\n var tagUpdates = {\n baseTag: updateTags(_HelmetConstants.TAG_NAMES.BASE, baseTag),\n linkTags: updateTags(_HelmetConstants.TAG_NAMES.LINK, linkTags),\n metaTags: updateTags(_HelmetConstants.TAG_NAMES.META, metaTags),\n noscriptTags: updateTags(_HelmetConstants.TAG_NAMES.NOSCRIPT, noscriptTags),\n scriptTags: updateTags(_HelmetConstants.TAG_NAMES.SCRIPT, scriptTags),\n styleTags: updateTags(_HelmetConstants.TAG_NAMES.STYLE, styleTags)\n };\n var addedTags = {};\n var removedTags = {};\n Object.keys(tagUpdates).forEach(function (tagType) {\n var _tagUpdates$tagType = tagUpdates[tagType],\n newTags = _tagUpdates$tagType.newTags,\n oldTags = _tagUpdates$tagType.oldTags;\n if (newTags.length) {\n addedTags[tagType] = newTags;\n }\n if (oldTags.length) {\n removedTags[tagType] = tagUpdates[tagType].oldTags;\n }\n });\n cb && cb();\n onChangeClientState(newState, addedTags, removedTags);\n};\nvar flattenArray = function flattenArray(possibleArray) {\n return Array.isArray(possibleArray) ? possibleArray.join(\"\") : possibleArray;\n};\nvar updateTitle = function updateTitle(title, attributes) {\n if (typeof title !== \"undefined\" && document.title !== title) {\n document.title = flattenArray(title);\n }\n updateAttributes(_HelmetConstants.TAG_NAMES.TITLE, attributes);\n};\nvar updateAttributes = function updateAttributes(tagName, attributes) {\n var elementTag = document.getElementsByTagName(tagName)[0];\n if (!elementTag) {\n return;\n }\n var helmetAttributeString = elementTag.getAttribute(_HelmetConstants.HELMET_ATTRIBUTE);\n var helmetAttributes = helmetAttributeString ? helmetAttributeString.split(\",\") : [];\n var attributesToRemove = [].concat(helmetAttributes);\n var attributeKeys = Object.keys(attributes);\n for (var i = 0; i < attributeKeys.length; i++) {\n var attribute = attributeKeys[i];\n var value = attributes[attribute] || \"\";\n if (elementTag.getAttribute(attribute) !== value) {\n elementTag.setAttribute(attribute, value);\n }\n if (helmetAttributes.indexOf(attribute) === -1) {\n helmetAttributes.push(attribute);\n }\n var indexToSave = attributesToRemove.indexOf(attribute);\n if (indexToSave !== -1) {\n attributesToRemove.splice(indexToSave, 1);\n }\n }\n for (var _i = attributesToRemove.length - 1; _i >= 0; _i--) {\n elementTag.removeAttribute(attributesToRemove[_i]);\n }\n if (helmetAttributes.length === attributesToRemove.length) {\n elementTag.removeAttribute(_HelmetConstants.HELMET_ATTRIBUTE);\n } else if (elementTag.getAttribute(_HelmetConstants.HELMET_ATTRIBUTE) !== attributeKeys.join(\",\")) {\n elementTag.setAttribute(_HelmetConstants.HELMET_ATTRIBUTE, attributeKeys.join(\",\"));\n }\n};\nvar updateTags = function updateTags(type, tags) {\n var headElement = document.head || document.querySelector(_HelmetConstants.TAG_NAMES.HEAD);\n var tagNodes = headElement.querySelectorAll(type + \"[\" + _HelmetConstants.HELMET_ATTRIBUTE + \"]\");\n var oldTags = Array.prototype.slice.call(tagNodes);\n var newTags = [];\n var indexToDelete = void 0;\n if (tags && tags.length) {\n tags.forEach(function (tag) {\n var newElement = document.createElement(type);\n for (var attribute in tag) {\n if (tag.hasOwnProperty(attribute)) {\n if (attribute === _HelmetConstants.TAG_PROPERTIES.INNER_HTML) {\n newElement.innerHTML = tag.innerHTML;\n } else if (attribute === _HelmetConstants.TAG_PROPERTIES.CSS_TEXT) {\n if (newElement.styleSheet) {\n newElement.styleSheet.cssText = tag.cssText;\n } else {\n newElement.appendChild(document.createTextNode(tag.cssText));\n }\n } else {\n var value = typeof tag[attribute] === \"undefined\" ? \"\" : tag[attribute];\n newElement.setAttribute(attribute, value);\n }\n }\n }\n newElement.setAttribute(_HelmetConstants.HELMET_ATTRIBUTE, \"true\");\n\n // Remove a duplicate tag from domTagstoRemove, so it isn't cleared.\n if (oldTags.some(function (existingTag, index) {\n indexToDelete = index;\n return newElement.isEqualNode(existingTag);\n })) {\n oldTags.splice(indexToDelete, 1);\n } else {\n newTags.push(newElement);\n }\n });\n }\n oldTags.forEach(function (tag) {\n return tag.parentNode.removeChild(tag);\n });\n newTags.forEach(function (tag) {\n return headElement.appendChild(tag);\n });\n return {\n oldTags: oldTags,\n newTags: newTags\n };\n};\nvar generateElementAttributesAsString = function generateElementAttributesAsString(attributes) {\n return Object.keys(attributes).reduce(function (str, key) {\n var attr = typeof attributes[key] !== \"undefined\" ? key + \"=\\\"\" + attributes[key] + \"\\\"\" : \"\" + key;\n return str ? str + \" \" + attr : attr;\n }, \"\");\n};\nvar generateTitleAsString = function generateTitleAsString(type, title, attributes, encode) {\n var attributeString = generateElementAttributesAsString(attributes);\n var flattenedTitle = flattenArray(title);\n return attributeString ? \"<\" + type + \" \" + _HelmetConstants.HELMET_ATTRIBUTE + \"=\\\"true\\\" \" + attributeString + \">\" + encodeSpecialCharacters(flattenedTitle, encode) + \"</\" + type + \">\" : \"<\" + type + \" \" + _HelmetConstants.HELMET_ATTRIBUTE + \"=\\\"true\\\">\" + encodeSpecialCharacters(flattenedTitle, encode) + \"</\" + type + \">\";\n};\nvar generateTagsAsString = function generateTagsAsString(type, tags, encode) {\n return tags.reduce(function (str, tag) {\n var attributeHtml = Object.keys(tag).filter(function (attribute) {\n return !(attribute === _HelmetConstants.TAG_PROPERTIES.INNER_HTML || attribute === _HelmetConstants.TAG_PROPERTIES.CSS_TEXT);\n }).reduce(function (string, attribute) {\n var attr = typeof tag[attribute] === \"undefined\" ? attribute : attribute + \"=\\\"\" + encodeSpecialCharacters(tag[attribute], encode) + \"\\\"\";\n return string ? string + \" \" + attr : attr;\n }, \"\");\n var tagContent = tag.innerHTML || tag.cssText || \"\";\n var isSelfClosing = _HelmetConstants.SELF_CLOSING_TAGS.indexOf(type) === -1;\n return str + \"<\" + type + \" \" + _HelmetConstants.HELMET_ATTRIBUTE + \"=\\\"true\\\" \" + attributeHtml + (isSelfClosing ? \"/>\" : \">\" + tagContent + \"</\" + type + \">\");\n }, \"\");\n};\nvar convertElementAttributestoReactProps = function convertElementAttributestoReactProps(attributes) {\n var initProps = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n return Object.keys(attributes).reduce(function (obj, key) {\n obj[_HelmetConstants.REACT_TAG_MAP[key] || key] = attributes[key];\n return obj;\n }, initProps);\n};\nvar convertReactPropstoHtmlAttributes = function convertReactPropstoHtmlAttributes(props) {\n var initAttributes = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n return Object.keys(props).reduce(function (obj, key) {\n obj[_HelmetConstants.HTML_TAG_MAP[key] || key] = props[key];\n return obj;\n }, initAttributes);\n};\nvar generateTitleAsReactComponent = function generateTitleAsReactComponent(type, title, attributes) {\n var _initProps;\n\n // assigning into an array to define toString function on it\n var initProps = (_initProps = {\n key: title\n }, _initProps[_HelmetConstants.HELMET_ATTRIBUTE] = true, _initProps);\n var props = convertElementAttributestoReactProps(attributes, initProps);\n return [_react2.default.createElement(_HelmetConstants.TAG_NAMES.TITLE, props, title)];\n};\nvar generateTagsAsReactComponent = function generateTagsAsReactComponent(type, tags) {\n return tags.map(function (tag, i) {\n var _mappedTag;\n var mappedTag = (_mappedTag = {\n key: i\n }, _mappedTag[_HelmetConstants.HELMET_ATTRIBUTE] = true, _mappedTag);\n Object.keys(tag).forEach(function (attribute) {\n var mappedAttribute = _HelmetConstants.REACT_TAG_MAP[attribute] || attribute;\n if (mappedAttribute === _HelmetConstants.TAG_PROPERTIES.INNER_HTML || mappedAttribute === _HelmetConstants.TAG_PROPERTIES.CSS_TEXT) {\n var content = tag.innerHTML || tag.cssText;\n mappedTag.dangerouslySetInnerHTML = {\n __html: content\n };\n } else {\n mappedTag[mappedAttribute] = tag[attribute];\n }\n });\n return _react2.default.createElement(type, mappedTag);\n });\n};\nvar getMethodsForTag = function getMethodsForTag(type, tags, encode) {\n switch (type) {\n case _HelmetConstants.TAG_NAMES.TITLE:\n return {\n toComponent: function toComponent() {\n return generateTitleAsReactComponent(type, tags.title, tags.titleAttributes, encode);\n },\n toString: function toString() {\n return generateTitleAsString(type, tags.title, tags.titleAttributes, encode);\n }\n };\n case _HelmetConstants.ATTRIBUTE_NAMES.BODY:\n case _HelmetConstants.ATTRIBUTE_NAMES.HTML:\n return {\n toComponent: function toComponent() {\n return convertElementAttributestoReactProps(tags);\n },\n toString: function toString() {\n return generateElementAttributesAsString(tags);\n }\n };\n default:\n return {\n toComponent: function toComponent() {\n return generateTagsAsReactComponent(type, tags);\n },\n toString: function toString() {\n return generateTagsAsString(type, tags, encode);\n }\n };\n }\n};\nvar mapStateOnServer = function mapStateOnServer(_ref) {\n var baseTag = _ref.baseTag,\n bodyAttributes = _ref.bodyAttributes,\n encode = _ref.encode,\n htmlAttributes = _ref.htmlAttributes,\n linkTags = _ref.linkTags,\n metaTags = _ref.metaTags,\n noscriptTags = _ref.noscriptTags,\n scriptTags = _ref.scriptTags,\n styleTags = _ref.styleTags,\n _ref$title = _ref.title,\n title = _ref$title === undefined ? \"\" : _ref$title,\n titleAttributes = _ref.titleAttributes;\n return {\n base: getMethodsForTag(_HelmetConstants.TAG_NAMES.BASE, baseTag, encode),\n bodyAttributes: getMethodsForTag(_HelmetConstants.ATTRIBUTE_NAMES.BODY, bodyAttributes, encode),\n htmlAttributes: getMethodsForTag(_HelmetConstants.ATTRIBUTE_NAMES.HTML, htmlAttributes, encode),\n link: getMethodsForTag(_HelmetConstants.TAG_NAMES.LINK, linkTags, encode),\n meta: getMethodsForTag(_HelmetConstants.TAG_NAMES.META, metaTags, encode),\n noscript: getMethodsForTag(_HelmetConstants.TAG_NAMES.NOSCRIPT, noscriptTags, encode),\n script: getMethodsForTag(_HelmetConstants.TAG_NAMES.SCRIPT, scriptTags, encode),\n style: getMethodsForTag(_HelmetConstants.TAG_NAMES.STYLE, styleTags, encode),\n title: getMethodsForTag(_HelmetConstants.TAG_NAMES.TITLE, {\n title: title,\n titleAttributes: titleAttributes\n }, encode)\n };\n};\nexports.convertReactPropstoHtmlAttributes = convertReactPropstoHtmlAttributes;\nexports.handleClientStateChange = handleClientStateChange;\nexports.mapStateOnServer = mapStateOnServer;\nexports.reducePropsToState = reducePropsToState;\nexports.requestAnimationFrame = requestAnimationFrame;\nexports.warn = warn;","/**\n * This method returns `undefined`.\n *\n * @static\n * @memberOf _\n * @since 2.3.0\n * @category Util\n * @example\n *\n * _.times(2, _.noop);\n * // => [undefined, undefined]\n */\nfunction noop() {\n // No operation performed.\n}\n\nmodule.exports = noop;\n","var LazyWrapper = require('./_LazyWrapper'),\n LodashWrapper = require('./_LodashWrapper'),\n copyArray = require('./_copyArray');\n\n/**\n * Creates a clone of `wrapper`.\n *\n * @private\n * @param {Object} wrapper The wrapper to clone.\n * @returns {Object} Returns the cloned wrapper.\n */\nfunction wrapperClone(wrapper) {\n if (wrapper instanceof LazyWrapper) {\n return wrapper.clone();\n }\n var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);\n result.__actions__ = copyArray(wrapper.__actions__);\n result.__index__ = wrapper.__index__;\n result.__values__ = wrapper.__values__;\n return result;\n}\n\nmodule.exports = wrapperClone;\n","/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * Creates an array that is the composition of partially applied arguments,\n * placeholders, and provided arguments into a single array of arguments.\n *\n * @private\n * @param {Array} args The provided arguments.\n * @param {Array} partials The arguments to prepend to those provided.\n * @param {Array} holders The `partials` placeholder indexes.\n * @params {boolean} [isCurried] Specify composing for a curried function.\n * @returns {Array} Returns the new array of composed arguments.\n */\nfunction composeArgs(args, partials, holders, isCurried) {\n var argsIndex = -1,\n argsLength = args.length,\n holdersLength = holders.length,\n leftIndex = -1,\n leftLength = partials.length,\n rangeLength = nativeMax(argsLength - holdersLength, 0),\n result = Array(leftLength + rangeLength),\n isUncurried = !isCurried;\n\n while (++leftIndex < leftLength) {\n result[leftIndex] = partials[leftIndex];\n }\n while (++argsIndex < holdersLength) {\n if (isUncurried || argsIndex < argsLength) {\n result[holders[argsIndex]] = args[argsIndex];\n }\n }\n while (rangeLength--) {\n result[leftIndex++] = args[argsIndex++];\n }\n return result;\n}\n\nmodule.exports = composeArgs;\n"],"sourceRoot":""} \ No newline at end of file diff --git a/favicon-32x32.png b/favicon-32x32.png new file mode 100644 index 00000000..95afd080 Binary files /dev/null and b/favicon-32x32.png differ diff --git a/favicon.ico b/favicon.ico new file mode 100644 index 00000000..bdeeb6aa Binary files /dev/null and b/favicon.ico differ diff --git a/framework-22d51f0f5ee9f1c9c6e1.js b/framework-22d51f0f5ee9f1c9c6e1.js new file mode 100644 index 00000000..7a05307c --- /dev/null +++ b/framework-22d51f0f5ee9f1c9c6e1.js @@ -0,0 +1,3 @@ +/*! For license information please see framework-22d51f0f5ee9f1c9c6e1.js.LICENSE.txt */ +(window.webpackJsonp=window.webpackJsonp||[]).push([[11],{"+wdc":function(e,t,n){"use strict";var r,l,i,a,o;if("undefined"==typeof window||"function"!=typeof MessageChannel){var u=null,c=null,s=function(){if(null!==u)try{var e=t.unstable_now();u(!0,e),u=null}catch(n){throw setTimeout(s,0),n}},f=Date.now();t.unstable_now=function(){return Date.now()-f},r=function(e){null!==u?setTimeout(r,0,e):(u=e,setTimeout(s,0))},l=function(e,t){c=setTimeout(e,t)},i=function(){clearTimeout(c)},a=function(){return!1},o=t.unstable_forceFrameRate=function(){}}else{var d=window.performance,p=window.Date,m=window.setTimeout,h=window.clearTimeout;if("undefined"!=typeof console){var v=window.cancelAnimationFrame;"function"!=typeof window.requestAnimationFrame&&console.error("This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills"),"function"!=typeof v&&console.error("This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills")}if("object"==typeof d&&"function"==typeof d.now)t.unstable_now=function(){return d.now()};else{var g=p.now();t.unstable_now=function(){return p.now()-g}}var y=!1,b=null,w=-1,k=5,x=0;a=function(){return t.unstable_now()>=x},o=function(){},t.unstable_forceFrameRate=function(e){0>e||125<e?console.error("forceFrameRate takes a positive int between 0 and 125, forcing framerates higher than 125 fps is not unsupported"):k=0<e?Math.floor(1e3/e):5};var T=new MessageChannel,E=T.port2;T.port1.onmessage=function(){if(null!==b){var e=t.unstable_now();x=e+k;try{b(!0,e)?E.postMessage(null):(y=!1,b=null)}catch(n){throw E.postMessage(null),n}}else y=!1},r=function(e){b=e,y||(y=!0,E.postMessage(null))},l=function(e,n){w=m((function(){e(t.unstable_now())}),n)},i=function(){h(w),w=-1}}function S(e,t){var n=e.length;e.push(t);e:for(;;){var r=n-1>>>1,l=e[r];if(!(void 0!==l&&0<P(l,t)))break e;e[r]=t,e[n]=l,n=r}}function C(e){return void 0===(e=e[0])?null:e}function _(e){var t=e[0];if(void 0!==t){var n=e.pop();if(n!==t){e[0]=n;e:for(var r=0,l=e.length;r<l;){var i=2*(r+1)-1,a=e[i],o=i+1,u=e[o];if(void 0!==a&&0>P(a,n))void 0!==u&&0>P(u,a)?(e[r]=u,e[o]=n,r=o):(e[r]=a,e[i]=n,r=i);else{if(!(void 0!==u&&0>P(u,n)))break e;e[r]=u,e[o]=n,r=o}}}return t}return null}function P(e,t){var n=e.sortIndex-t.sortIndex;return 0!==n?n:e.id-t.id}var N=[],z=[],O=1,R=null,I=3,M=!1,F=!1,D=!1;function L(e){for(var t=C(z);null!==t;){if(null===t.callback)_(z);else{if(!(t.startTime<=e))break;_(z),t.sortIndex=t.expirationTime,S(N,t)}t=C(z)}}function A(e){if(D=!1,L(e),!F)if(null!==C(N))F=!0,r(U);else{var t=C(z);null!==t&&l(A,t.startTime-e)}}function U(e,n){F=!1,D&&(D=!1,i()),M=!0;var r=I;try{for(L(n),R=C(N);null!==R&&(!(R.expirationTime>n)||e&&!a());){var o=R.callback;if(null!==o){R.callback=null,I=R.priorityLevel;var u=o(R.expirationTime<=n);n=t.unstable_now(),"function"==typeof u?R.callback=u:R===C(N)&&_(N),L(n)}else _(N);R=C(N)}if(null!==R)var c=!0;else{var s=C(z);null!==s&&l(A,s.startTime-n),c=!1}return c}finally{R=null,I=r,M=!1}}function V(e){switch(e){case 1:return-1;case 2:return 250;case 5:return 1073741823;case 4:return 1e4;default:return 5e3}}var W=o;t.unstable_IdlePriority=5,t.unstable_ImmediatePriority=1,t.unstable_LowPriority=4,t.unstable_NormalPriority=3,t.unstable_Profiling=null,t.unstable_UserBlockingPriority=2,t.unstable_cancelCallback=function(e){e.callback=null},t.unstable_continueExecution=function(){F||M||(F=!0,r(U))},t.unstable_getCurrentPriorityLevel=function(){return I},t.unstable_getFirstCallbackNode=function(){return C(N)},t.unstable_next=function(e){switch(I){case 1:case 2:case 3:var t=3;break;default:t=I}var n=I;I=t;try{return e()}finally{I=n}},t.unstable_pauseExecution=function(){},t.unstable_requestPaint=W,t.unstable_runWithPriority=function(e,t){switch(e){case 1:case 2:case 3:case 4:case 5:break;default:e=3}var n=I;I=e;try{return t()}finally{I=n}},t.unstable_scheduleCallback=function(e,n,a){var o=t.unstable_now();if("object"==typeof a&&null!==a){var u=a.delay;u="number"==typeof u&&0<u?o+u:o,a="number"==typeof a.timeout?a.timeout:V(e)}else a=V(e),u=o;return e={id:O++,callback:n,priorityLevel:e,startTime:u,expirationTime:a=u+a,sortIndex:-1},u>o?(e.sortIndex=u,S(z,e),null===C(N)&&e===C(z)&&(D?i():D=!0,l(A,u-o))):(e.sortIndex=a,S(N,e),F||M||(F=!0,r(U))),e},t.unstable_shouldYield=function(){var e=t.unstable_now();L(e);var n=C(N);return n!==R&&null!==R&&null!==n&&null!==n.callback&&n.startTime<=e&&n.expirationTime<R.expirationTime||a()},t.unstable_wrapCallback=function(e){var t=I;return function(){var n=I;I=t;try{return e.apply(this,arguments)}finally{I=n}}}},"16Al":function(e,t,n){"use strict";var r=n("WbBG");function l(){}function i(){}i.resetWarningCache=l,e.exports=function(){function e(e,t,n,l,i,a){if(a!==r){var o=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw o.name="Invariant Violation",o}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:i,resetWarningCache:l};return n.PropTypes=n,n}},"17x9":function(e,t,n){e.exports=n("16Al")()},QCnb:function(e,t,n){"use strict";e.exports=n("+wdc")},WbBG:function(e,t,n){"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},i8i4:function(e,t,n){"use strict";!function e(){if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE){0;try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(t){console.error(t)}}}(),e.exports=n("yl30")},q1tI:function(e,t,n){"use strict";e.exports=n("viRO")},viRO:function(e,t,n){"use strict";var r=n("YVoz"),l="function"==typeof Symbol&&Symbol.for,i=l?Symbol.for("react.element"):60103,a=l?Symbol.for("react.portal"):60106,o=l?Symbol.for("react.fragment"):60107,u=l?Symbol.for("react.strict_mode"):60108,c=l?Symbol.for("react.profiler"):60114,s=l?Symbol.for("react.provider"):60109,f=l?Symbol.for("react.context"):60110,d=l?Symbol.for("react.forward_ref"):60112,p=l?Symbol.for("react.suspense"):60113,m=l?Symbol.for("react.memo"):60115,h=l?Symbol.for("react.lazy"):60116,v="function"==typeof Symbol&&Symbol.iterator;function g(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n<arguments.length;n++)t+="&args[]="+encodeURIComponent(arguments[n]);return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}var y={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},b={};function w(e,t,n){this.props=e,this.context=t,this.refs=b,this.updater=n||y}function k(){}function x(e,t,n){this.props=e,this.context=t,this.refs=b,this.updater=n||y}w.prototype.isReactComponent={},w.prototype.setState=function(e,t){if("object"!=typeof e&&"function"!=typeof e&&null!=e)throw Error(g(85));this.updater.enqueueSetState(this,e,t,"setState")},w.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")},k.prototype=w.prototype;var T=x.prototype=new k;T.constructor=x,r(T,w.prototype),T.isPureReactComponent=!0;var E={current:null},S=Object.prototype.hasOwnProperty,C={key:!0,ref:!0,__self:!0,__source:!0};function _(e,t,n){var r,l={},a=null,o=null;if(null!=t)for(r in void 0!==t.ref&&(o=t.ref),void 0!==t.key&&(a=""+t.key),t)S.call(t,r)&&!C.hasOwnProperty(r)&&(l[r]=t[r]);var u=arguments.length-2;if(1===u)l.children=n;else if(1<u){for(var c=Array(u),s=0;s<u;s++)c[s]=arguments[s+2];l.children=c}if(e&&e.defaultProps)for(r in u=e.defaultProps)void 0===l[r]&&(l[r]=u[r]);return{$$typeof:i,type:e,key:a,ref:o,props:l,_owner:E.current}}function P(e){return"object"==typeof e&&null!==e&&e.$$typeof===i}var N=/\/+/g,z=[];function O(e,t,n,r){if(z.length){var l=z.pop();return l.result=e,l.keyPrefix=t,l.func=n,l.context=r,l.count=0,l}return{result:e,keyPrefix:t,func:n,context:r,count:0}}function R(e){e.result=null,e.keyPrefix=null,e.func=null,e.context=null,e.count=0,10>z.length&&z.push(e)}function I(e,t,n){return null==e?0:function e(t,n,r,l){var o=typeof t;"undefined"!==o&&"boolean"!==o||(t=null);var u=!1;if(null===t)u=!0;else switch(o){case"string":case"number":u=!0;break;case"object":switch(t.$$typeof){case i:case a:u=!0}}if(u)return r(l,t,""===n?"."+M(t,0):n),1;if(u=0,n=""===n?".":n+":",Array.isArray(t))for(var c=0;c<t.length;c++){var s=n+M(o=t[c],c);u+=e(o,s,r,l)}else if(null===t||"object"!=typeof t?s=null:s="function"==typeof(s=v&&t[v]||t["@@iterator"])?s:null,"function"==typeof s)for(t=s.call(t),c=0;!(o=t.next()).done;)u+=e(o=o.value,s=n+M(o,c++),r,l);else if("object"===o)throw r=""+t,Error(g(31,"[object Object]"===r?"object with keys {"+Object.keys(t).join(", ")+"}":r,""));return u}(e,"",t,n)}function M(e,t){return"object"==typeof e&&null!==e&&null!=e.key?function(e){var t={"=":"=0",":":"=2"};return"$"+(""+e).replace(/[=:]/g,(function(e){return t[e]}))}(e.key):t.toString(36)}function F(e,t){e.func.call(e.context,t,e.count++)}function D(e,t,n){var r=e.result,l=e.keyPrefix;e=e.func.call(e.context,t,e.count++),Array.isArray(e)?L(e,r,n,(function(e){return e})):null!=e&&(P(e)&&(e=function(e,t){return{$$typeof:i,type:e.type,key:t,ref:e.ref,props:e.props,_owner:e._owner}}(e,l+(!e.key||t&&t.key===e.key?"":(""+e.key).replace(N,"$&/")+"/")+n)),r.push(e))}function L(e,t,n,r,l){var i="";null!=n&&(i=(""+n).replace(N,"$&/")+"/"),I(e,D,t=O(t,i,r,l)),R(t)}var A={current:null};function U(){var e=A.current;if(null===e)throw Error(g(321));return e}var V={ReactCurrentDispatcher:A,ReactCurrentBatchConfig:{suspense:null},ReactCurrentOwner:E,IsSomeRendererActing:{current:!1},assign:r};t.Children={map:function(e,t,n){if(null==e)return e;var r=[];return L(e,r,null,t,n),r},forEach:function(e,t,n){if(null==e)return e;I(e,F,t=O(null,null,t,n)),R(t)},count:function(e){return I(e,(function(){return null}),null)},toArray:function(e){var t=[];return L(e,t,null,(function(e){return e})),t},only:function(e){if(!P(e))throw Error(g(143));return e}},t.Component=w,t.Fragment=o,t.Profiler=c,t.PureComponent=x,t.StrictMode=u,t.Suspense=p,t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=V,t.cloneElement=function(e,t,n){if(null==e)throw Error(g(267,e));var l=r({},e.props),a=e.key,o=e.ref,u=e._owner;if(null!=t){if(void 0!==t.ref&&(o=t.ref,u=E.current),void 0!==t.key&&(a=""+t.key),e.type&&e.type.defaultProps)var c=e.type.defaultProps;for(s in t)S.call(t,s)&&!C.hasOwnProperty(s)&&(l[s]=void 0===t[s]&&void 0!==c?c[s]:t[s])}var s=arguments.length-2;if(1===s)l.children=n;else if(1<s){c=Array(s);for(var f=0;f<s;f++)c[f]=arguments[f+2];l.children=c}return{$$typeof:i,type:e.type,key:a,ref:o,props:l,_owner:u}},t.createContext=function(e,t){return void 0===t&&(t=null),(e={$$typeof:f,_calculateChangedBits:t,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null}).Provider={$$typeof:s,_context:e},e.Consumer=e},t.createElement=_,t.createFactory=function(e){var t=_.bind(null,e);return t.type=e,t},t.createRef=function(){return{current:null}},t.forwardRef=function(e){return{$$typeof:d,render:e}},t.isValidElement=P,t.lazy=function(e){return{$$typeof:h,_ctor:e,_status:-1,_result:null}},t.memo=function(e,t){return{$$typeof:m,type:e,compare:void 0===t?null:t}},t.useCallback=function(e,t){return U().useCallback(e,t)},t.useContext=function(e,t){return U().useContext(e,t)},t.useDebugValue=function(){},t.useEffect=function(e,t){return U().useEffect(e,t)},t.useImperativeHandle=function(e,t,n){return U().useImperativeHandle(e,t,n)},t.useLayoutEffect=function(e,t){return U().useLayoutEffect(e,t)},t.useMemo=function(e,t){return U().useMemo(e,t)},t.useReducer=function(e,t,n){return U().useReducer(e,t,n)},t.useRef=function(e){return U().useRef(e)},t.useState=function(e){return U().useState(e)},t.version="16.14.0"},yl30:function(e,t,n){"use strict";var r=n("q1tI"),l=n("YVoz"),i=n("QCnb");function a(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n<arguments.length;n++)t+="&args[]="+encodeURIComponent(arguments[n]);return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}if(!r)throw Error(a(227));function o(e,t,n,r,l,i,a,o,u){var c=Array.prototype.slice.call(arguments,3);try{t.apply(n,c)}catch(s){this.onError(s)}}var u=!1,c=null,s=!1,f=null,d={onError:function(e){u=!0,c=e}};function p(e,t,n,r,l,i,a,s,f){u=!1,c=null,o.apply(d,arguments)}var m=null,h=null,v=null;function g(e,t,n){var r=e.type||"unknown-event";e.currentTarget=v(n),function(e,t,n,r,l,i,o,d,m){if(p.apply(this,arguments),u){if(!u)throw Error(a(198));var h=c;u=!1,c=null,s||(s=!0,f=h)}}(r,t,void 0,e),e.currentTarget=null}var y=null,b={};function w(){if(y)for(var e in b){var t=b[e],n=y.indexOf(e);if(!(-1<n))throw Error(a(96,e));if(!x[n]){if(!t.extractEvents)throw Error(a(97,e));for(var r in x[n]=t,n=t.eventTypes){var l=void 0,i=n[r],o=t,u=r;if(T.hasOwnProperty(u))throw Error(a(99,u));T[u]=i;var c=i.phasedRegistrationNames;if(c){for(l in c)c.hasOwnProperty(l)&&k(c[l],o,u);l=!0}else i.registrationName?(k(i.registrationName,o,u),l=!0):l=!1;if(!l)throw Error(a(98,r,e))}}}}function k(e,t,n){if(E[e])throw Error(a(100,e));E[e]=t,S[e]=t.eventTypes[n].dependencies}var x=[],T={},E={},S={};function C(e){var t,n=!1;for(t in e)if(e.hasOwnProperty(t)){var r=e[t];if(!b.hasOwnProperty(t)||b[t]!==r){if(b[t])throw Error(a(102,t));b[t]=r,n=!0}}n&&w()}var _=!("undefined"==typeof window||void 0===window.document||void 0===window.document.createElement),P=null,N=null,z=null;function O(e){if(e=h(e)){if("function"!=typeof P)throw Error(a(280));var t=e.stateNode;t&&(t=m(t),P(e.stateNode,e.type,t))}}function R(e){N?z?z.push(e):z=[e]:N=e}function I(){if(N){var e=N,t=z;if(z=N=null,O(e),t)for(e=0;e<t.length;e++)O(t[e])}}function M(e,t){return e(t)}function F(e,t,n,r,l){return e(t,n,r,l)}function D(){}var L=M,A=!1,U=!1;function V(){null===N&&null===z||(D(),I())}function W(e,t,n){if(U)return e(t,n);U=!0;try{return L(e,t,n)}finally{U=!1,V()}}var Q=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,j=Object.prototype.hasOwnProperty,$={},B={};function H(e,t,n,r,l,i){this.acceptsBooleans=2===t||3===t||4===t,this.attributeName=r,this.attributeNamespace=l,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=i}var K={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach((function(e){K[e]=new H(e,0,!1,e,null,!1)})),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach((function(e){var t=e[0];K[t]=new H(t,1,!1,e[1],null,!1)})),["contentEditable","draggable","spellCheck","value"].forEach((function(e){K[e]=new H(e,2,!1,e.toLowerCase(),null,!1)})),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach((function(e){K[e]=new H(e,2,!1,e,null,!1)})),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach((function(e){K[e]=new H(e,3,!1,e.toLowerCase(),null,!1)})),["checked","multiple","muted","selected"].forEach((function(e){K[e]=new H(e,3,!0,e,null,!1)})),["capture","download"].forEach((function(e){K[e]=new H(e,4,!1,e,null,!1)})),["cols","rows","size","span"].forEach((function(e){K[e]=new H(e,6,!1,e,null,!1)})),["rowSpan","start"].forEach((function(e){K[e]=new H(e,5,!1,e.toLowerCase(),null,!1)}));var q=/[\-:]([a-z])/g;function Y(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach((function(e){var t=e.replace(q,Y);K[t]=new H(t,1,!1,e,null,!1)})),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach((function(e){var t=e.replace(q,Y);K[t]=new H(t,1,!1,e,"http://www.w3.org/1999/xlink",!1)})),["xml:base","xml:lang","xml:space"].forEach((function(e){var t=e.replace(q,Y);K[t]=new H(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1)})),["tabIndex","crossOrigin"].forEach((function(e){K[e]=new H(e,1,!1,e.toLowerCase(),null,!1)})),K.xlinkHref=new H("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0),["src","href","action","formAction"].forEach((function(e){K[e]=new H(e,1,!1,e.toLowerCase(),null,!0)}));var X=r.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;function G(e,t,n,r){var l=K.hasOwnProperty(t)?K[t]:null;(null!==l?0===l.type:!r&&(2<t.length&&("o"===t[0]||"O"===t[0])&&("n"===t[1]||"N"===t[1])))||(function(e,t,n,r){if(null==t||function(e,t,n,r){if(null!==n&&0===n.type)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return!r&&(null!==n?!n.acceptsBooleans:"data-"!==(e=e.toLowerCase().slice(0,5))&&"aria-"!==e);default:return!1}}(e,t,n,r))return!0;if(r)return!1;if(null!==n)switch(n.type){case 3:return!t;case 4:return!1===t;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}(t,n,l,r)&&(n=null),r||null===l?function(e){return!!j.call(B,e)||!j.call($,e)&&(Q.test(e)?B[e]=!0:($[e]=!0,!1))}(t)&&(null===n?e.removeAttribute(t):e.setAttribute(t,""+n)):l.mustUseProperty?e[l.propertyName]=null===n?3!==l.type&&"":n:(t=l.attributeName,r=l.attributeNamespace,null===n?e.removeAttribute(t):(n=3===(l=l.type)||4===l&&!0===n?"":""+n,r?e.setAttributeNS(r,t,n):e.setAttribute(t,n))))}X.hasOwnProperty("ReactCurrentDispatcher")||(X.ReactCurrentDispatcher={current:null}),X.hasOwnProperty("ReactCurrentBatchConfig")||(X.ReactCurrentBatchConfig={suspense:null});var J=/^(.*)[\\\/]/,Z="function"==typeof Symbol&&Symbol.for,ee=Z?Symbol.for("react.element"):60103,te=Z?Symbol.for("react.portal"):60106,ne=Z?Symbol.for("react.fragment"):60107,re=Z?Symbol.for("react.strict_mode"):60108,le=Z?Symbol.for("react.profiler"):60114,ie=Z?Symbol.for("react.provider"):60109,ae=Z?Symbol.for("react.context"):60110,oe=Z?Symbol.for("react.concurrent_mode"):60111,ue=Z?Symbol.for("react.forward_ref"):60112,ce=Z?Symbol.for("react.suspense"):60113,se=Z?Symbol.for("react.suspense_list"):60120,fe=Z?Symbol.for("react.memo"):60115,de=Z?Symbol.for("react.lazy"):60116,pe=Z?Symbol.for("react.block"):60121,me="function"==typeof Symbol&&Symbol.iterator;function he(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=me&&e[me]||e["@@iterator"])?e:null}function ve(e){if(null==e)return null;if("function"==typeof e)return e.displayName||e.name||null;if("string"==typeof e)return e;switch(e){case ne:return"Fragment";case te:return"Portal";case le:return"Profiler";case re:return"StrictMode";case ce:return"Suspense";case se:return"SuspenseList"}if("object"==typeof e)switch(e.$$typeof){case ae:return"Context.Consumer";case ie:return"Context.Provider";case ue:var t=e.render;return t=t.displayName||t.name||"",e.displayName||(""!==t?"ForwardRef("+t+")":"ForwardRef");case fe:return ve(e.type);case pe:return ve(e.render);case de:if(e=1===e._status?e._result:null)return ve(e)}return null}function ge(e){var t="";do{e:switch(e.tag){case 3:case 4:case 6:case 7:case 10:case 9:var n="";break e;default:var r=e._debugOwner,l=e._debugSource,i=ve(e.type);n=null,r&&(n=ve(r.type)),r=i,i="",l?i=" (at "+l.fileName.replace(J,"")+":"+l.lineNumber+")":n&&(i=" (created by "+n+")"),n="\n in "+(r||"Unknown")+i}t+=n,e=e.return}while(e);return t}function ye(e){switch(typeof e){case"boolean":case"number":case"object":case"string":case"undefined":return e;default:return""}}function be(e){var t=e.type;return(e=e.nodeName)&&"input"===e.toLowerCase()&&("checkbox"===t||"radio"===t)}function we(e){e._valueTracker||(e._valueTracker=function(e){var t=be(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&void 0!==n&&"function"==typeof n.get&&"function"==typeof n.set){var l=n.get,i=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return l.call(this)},set:function(e){r=""+e,i.call(this,e)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(e){r=""+e},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}(e))}function ke(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=be(e)?e.checked?"true":"false":e.value),(e=r)!==n&&(t.setValue(e),!0)}function xe(e,t){var n=t.checked;return l({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=n?n:e._wrapperState.initialChecked})}function Te(e,t){var n=null==t.defaultValue?"":t.defaultValue,r=null!=t.checked?t.checked:t.defaultChecked;n=ye(null!=t.value?t.value:n),e._wrapperState={initialChecked:r,initialValue:n,controlled:"checkbox"===t.type||"radio"===t.type?null!=t.checked:null!=t.value}}function Ee(e,t){null!=(t=t.checked)&&G(e,"checked",t,!1)}function Se(e,t){Ee(e,t);var n=ye(t.value),r=t.type;if(null!=n)"number"===r?(0===n&&""===e.value||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if("submit"===r||"reset"===r)return void e.removeAttribute("value");t.hasOwnProperty("value")?_e(e,t.type,n):t.hasOwnProperty("defaultValue")&&_e(e,t.type,ye(t.defaultValue)),null==t.checked&&null!=t.defaultChecked&&(e.defaultChecked=!!t.defaultChecked)}function Ce(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var r=t.type;if(!("submit"!==r&&"reset"!==r||void 0!==t.value&&null!==t.value))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}""!==(n=e.name)&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,""!==n&&(e.name=n)}function _e(e,t,n){"number"===t&&e.ownerDocument.activeElement===e||(null==n?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}function Pe(e,t){return e=l({children:void 0},t),(t=function(e){var t="";return r.Children.forEach(e,(function(e){null!=e&&(t+=e)})),t}(t.children))&&(e.children=t),e}function Ne(e,t,n,r){if(e=e.options,t){t={};for(var l=0;l<n.length;l++)t["$"+n[l]]=!0;for(n=0;n<e.length;n++)l=t.hasOwnProperty("$"+e[n].value),e[n].selected!==l&&(e[n].selected=l),l&&r&&(e[n].defaultSelected=!0)}else{for(n=""+ye(n),t=null,l=0;l<e.length;l++){if(e[l].value===n)return e[l].selected=!0,void(r&&(e[l].defaultSelected=!0));null!==t||e[l].disabled||(t=e[l])}null!==t&&(t.selected=!0)}}function ze(e,t){if(null!=t.dangerouslySetInnerHTML)throw Error(a(91));return l({},t,{value:void 0,defaultValue:void 0,children:""+e._wrapperState.initialValue})}function Oe(e,t){var n=t.value;if(null==n){if(n=t.children,t=t.defaultValue,null!=n){if(null!=t)throw Error(a(92));if(Array.isArray(n)){if(!(1>=n.length))throw Error(a(93));n=n[0]}t=n}null==t&&(t=""),n=t}e._wrapperState={initialValue:ye(n)}}function Re(e,t){var n=ye(t.value),r=ye(t.defaultValue);null!=n&&((n=""+n)!==e.value&&(e.value=n),null==t.defaultValue&&e.defaultValue!==n&&(e.defaultValue=n)),null!=r&&(e.defaultValue=""+r)}function Ie(e){var t=e.textContent;t===e._wrapperState.initialValue&&""!==t&&null!==t&&(e.value=t)}var Me="http://www.w3.org/1999/xhtml",Fe="http://www.w3.org/2000/svg";function De(e){switch(e){case"svg":return"http://www.w3.org/2000/svg";case"math":return"http://www.w3.org/1998/Math/MathML";default:return"http://www.w3.org/1999/xhtml"}}function Le(e,t){return null==e||"http://www.w3.org/1999/xhtml"===e?De(t):"http://www.w3.org/2000/svg"===e&&"foreignObject"===t?"http://www.w3.org/1999/xhtml":e}var Ae,Ue=function(e){return"undefined"!=typeof MSApp&&MSApp.execUnsafeLocalFunction?function(t,n,r,l){MSApp.execUnsafeLocalFunction((function(){return e(t,n)}))}:e}((function(e,t){if(e.namespaceURI!==Fe||"innerHTML"in e)e.innerHTML=t;else{for((Ae=Ae||document.createElement("div")).innerHTML="<svg>"+t.valueOf().toString()+"</svg>",t=Ae.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}}));function Ve(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&3===n.nodeType)return void(n.nodeValue=t)}e.textContent=t}function We(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n["Webkit"+e]="webkit"+t,n["Moz"+e]="moz"+t,n}var Qe={animationend:We("Animation","AnimationEnd"),animationiteration:We("Animation","AnimationIteration"),animationstart:We("Animation","AnimationStart"),transitionend:We("Transition","TransitionEnd")},je={},$e={};function Be(e){if(je[e])return je[e];if(!Qe[e])return e;var t,n=Qe[e];for(t in n)if(n.hasOwnProperty(t)&&t in $e)return je[e]=n[t];return e}_&&($e=document.createElement("div").style,"AnimationEvent"in window||(delete Qe.animationend.animation,delete Qe.animationiteration.animation,delete Qe.animationstart.animation),"TransitionEvent"in window||delete Qe.transitionend.transition);var He=Be("animationend"),Ke=Be("animationiteration"),qe=Be("animationstart"),Ye=Be("transitionend"),Xe="abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange seeked seeking stalled suspend timeupdate volumechange waiting".split(" "),Ge=new("function"==typeof WeakMap?WeakMap:Map);function Je(e){var t=Ge.get(e);return void 0===t&&(t=new Map,Ge.set(e,t)),t}function Ze(e){var t=e,n=e;if(e.alternate)for(;t.return;)t=t.return;else{e=t;do{0!=(1026&(t=e).effectTag)&&(n=t.return),e=t.return}while(e)}return 3===t.tag?n:null}function et(e){if(13===e.tag){var t=e.memoizedState;if(null===t&&(null!==(e=e.alternate)&&(t=e.memoizedState)),null!==t)return t.dehydrated}return null}function tt(e){if(Ze(e)!==e)throw Error(a(188))}function nt(e){if(!(e=function(e){var t=e.alternate;if(!t){if(null===(t=Ze(e)))throw Error(a(188));return t!==e?null:e}for(var n=e,r=t;;){var l=n.return;if(null===l)break;var i=l.alternate;if(null===i){if(null!==(r=l.return)){n=r;continue}break}if(l.child===i.child){for(i=l.child;i;){if(i===n)return tt(l),e;if(i===r)return tt(l),t;i=i.sibling}throw Error(a(188))}if(n.return!==r.return)n=l,r=i;else{for(var o=!1,u=l.child;u;){if(u===n){o=!0,n=l,r=i;break}if(u===r){o=!0,r=l,n=i;break}u=u.sibling}if(!o){for(u=i.child;u;){if(u===n){o=!0,n=i,r=l;break}if(u===r){o=!0,r=i,n=l;break}u=u.sibling}if(!o)throw Error(a(189))}}if(n.alternate!==r)throw Error(a(190))}if(3!==n.tag)throw Error(a(188));return n.stateNode.current===n?e:t}(e)))return null;for(var t=e;;){if(5===t.tag||6===t.tag)return t;if(t.child)t.child.return=t,t=t.child;else{if(t===e)break;for(;!t.sibling;){if(!t.return||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}}return null}function rt(e,t){if(null==t)throw Error(a(30));return null==e?t:Array.isArray(e)?Array.isArray(t)?(e.push.apply(e,t),e):(e.push(t),e):Array.isArray(t)?[e].concat(t):[e,t]}function lt(e,t,n){Array.isArray(e)?e.forEach(t,n):e&&t.call(n,e)}var it=null;function at(e){if(e){var t=e._dispatchListeners,n=e._dispatchInstances;if(Array.isArray(t))for(var r=0;r<t.length&&!e.isPropagationStopped();r++)g(e,t[r],n[r]);else t&&g(e,t,n);e._dispatchListeners=null,e._dispatchInstances=null,e.isPersistent()||e.constructor.release(e)}}function ot(e){if(null!==e&&(it=rt(it,e)),e=it,it=null,e){if(lt(e,at),it)throw Error(a(95));if(s)throw e=f,s=!1,f=null,e}}function ut(e){return(e=e.target||e.srcElement||window).correspondingUseElement&&(e=e.correspondingUseElement),3===e.nodeType?e.parentNode:e}function ct(e){if(!_)return!1;var t=(e="on"+e)in document;return t||((t=document.createElement("div")).setAttribute(e,"return;"),t="function"==typeof t[e]),t}var st=[];function ft(e){e.topLevelType=null,e.nativeEvent=null,e.targetInst=null,e.ancestors.length=0,10>st.length&&st.push(e)}function dt(e,t,n,r){if(st.length){var l=st.pop();return l.topLevelType=e,l.eventSystemFlags=r,l.nativeEvent=t,l.targetInst=n,l}return{topLevelType:e,eventSystemFlags:r,nativeEvent:t,targetInst:n,ancestors:[]}}function pt(e){var t=e.targetInst,n=t;do{if(!n){e.ancestors.push(n);break}var r=n;if(3===r.tag)r=r.stateNode.containerInfo;else{for(;r.return;)r=r.return;r=3!==r.tag?null:r.stateNode.containerInfo}if(!r)break;5!==(t=n.tag)&&6!==t||e.ancestors.push(n),n=_n(r)}while(n);for(n=0;n<e.ancestors.length;n++){t=e.ancestors[n];var l=ut(e.nativeEvent);r=e.topLevelType;var i=e.nativeEvent,a=e.eventSystemFlags;0===n&&(a|=64);for(var o=null,u=0;u<x.length;u++){var c=x[u];c&&(c=c.extractEvents(r,t,i,l,a))&&(o=rt(o,c))}ot(o)}}function mt(e,t,n){if(!n.has(e)){switch(e){case"scroll":qt(t,"scroll",!0);break;case"focus":case"blur":qt(t,"focus",!0),qt(t,"blur",!0),n.set("blur",null),n.set("focus",null);break;case"cancel":case"close":ct(e)&&qt(t,e,!0);break;case"invalid":case"submit":case"reset":break;default:-1===Xe.indexOf(e)&&Kt(e,t)}n.set(e,null)}}var ht,vt,gt,yt=!1,bt=[],wt=null,kt=null,xt=null,Tt=new Map,Et=new Map,St=[],Ct="mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput close cancel copy cut paste click change contextmenu reset submit".split(" "),_t="focus blur dragenter dragleave mouseover mouseout pointerover pointerout gotpointercapture lostpointercapture".split(" ");function Pt(e,t,n,r,l){return{blockedOn:e,topLevelType:t,eventSystemFlags:32|n,nativeEvent:l,container:r}}function Nt(e,t){switch(e){case"focus":case"blur":wt=null;break;case"dragenter":case"dragleave":kt=null;break;case"mouseover":case"mouseout":xt=null;break;case"pointerover":case"pointerout":Tt.delete(t.pointerId);break;case"gotpointercapture":case"lostpointercapture":Et.delete(t.pointerId)}}function zt(e,t,n,r,l,i){return null===e||e.nativeEvent!==i?(e=Pt(t,n,r,l,i),null!==t&&(null!==(t=Pn(t))&&vt(t)),e):(e.eventSystemFlags|=r,e)}function Ot(e){var t=_n(e.target);if(null!==t){var n=Ze(t);if(null!==n)if(13===(t=n.tag)){if(null!==(t=et(n)))return e.blockedOn=t,void i.unstable_runWithPriority(e.priority,(function(){gt(n)}))}else if(3===t&&n.stateNode.hydrate)return void(e.blockedOn=3===n.tag?n.stateNode.containerInfo:null)}e.blockedOn=null}function Rt(e){if(null!==e.blockedOn)return!1;var t=Jt(e.topLevelType,e.eventSystemFlags,e.container,e.nativeEvent);if(null!==t){var n=Pn(t);return null!==n&&vt(n),e.blockedOn=t,!1}return!0}function It(e,t,n){Rt(e)&&n.delete(t)}function Mt(){for(yt=!1;0<bt.length;){var e=bt[0];if(null!==e.blockedOn){null!==(e=Pn(e.blockedOn))&&ht(e);break}var t=Jt(e.topLevelType,e.eventSystemFlags,e.container,e.nativeEvent);null!==t?e.blockedOn=t:bt.shift()}null!==wt&&Rt(wt)&&(wt=null),null!==kt&&Rt(kt)&&(kt=null),null!==xt&&Rt(xt)&&(xt=null),Tt.forEach(It),Et.forEach(It)}function Ft(e,t){e.blockedOn===t&&(e.blockedOn=null,yt||(yt=!0,i.unstable_scheduleCallback(i.unstable_NormalPriority,Mt)))}function Dt(e){function t(t){return Ft(t,e)}if(0<bt.length){Ft(bt[0],e);for(var n=1;n<bt.length;n++){var r=bt[n];r.blockedOn===e&&(r.blockedOn=null)}}for(null!==wt&&Ft(wt,e),null!==kt&&Ft(kt,e),null!==xt&&Ft(xt,e),Tt.forEach(t),Et.forEach(t),n=0;n<St.length;n++)(r=St[n]).blockedOn===e&&(r.blockedOn=null);for(;0<St.length&&null===(n=St[0]).blockedOn;)Ot(n),null===n.blockedOn&&St.shift()}var Lt={},At=new Map,Ut=new Map,Vt=["abort","abort",He,"animationEnd",Ke,"animationIteration",qe,"animationStart","canplay","canPlay","canplaythrough","canPlayThrough","durationchange","durationChange","emptied","emptied","encrypted","encrypted","ended","ended","error","error","gotpointercapture","gotPointerCapture","load","load","loadeddata","loadedData","loadedmetadata","loadedMetadata","loadstart","loadStart","lostpointercapture","lostPointerCapture","playing","playing","progress","progress","seeking","seeking","stalled","stalled","suspend","suspend","timeupdate","timeUpdate",Ye,"transitionEnd","waiting","waiting"];function Wt(e,t){for(var n=0;n<e.length;n+=2){var r=e[n],l=e[n+1],i="on"+(l[0].toUpperCase()+l.slice(1));i={phasedRegistrationNames:{bubbled:i,captured:i+"Capture"},dependencies:[r],eventPriority:t},Ut.set(r,t),At.set(r,i),Lt[l]=i}}Wt("blur blur cancel cancel click click close close contextmenu contextMenu copy copy cut cut auxclick auxClick dblclick doubleClick dragend dragEnd dragstart dragStart drop drop focus focus input input invalid invalid keydown keyDown keypress keyPress keyup keyUp mousedown mouseDown mouseup mouseUp paste paste pause pause play play pointercancel pointerCancel pointerdown pointerDown pointerup pointerUp ratechange rateChange reset reset seeked seeked submit submit touchcancel touchCancel touchend touchEnd touchstart touchStart volumechange volumeChange".split(" "),0),Wt("drag drag dragenter dragEnter dragexit dragExit dragleave dragLeave dragover dragOver mousemove mouseMove mouseout mouseOut mouseover mouseOver pointermove pointerMove pointerout pointerOut pointerover pointerOver scroll scroll toggle toggle touchmove touchMove wheel wheel".split(" "),1),Wt(Vt,2);for(var Qt="change selectionchange textInput compositionstart compositionend compositionupdate".split(" "),jt=0;jt<Qt.length;jt++)Ut.set(Qt[jt],0);var $t=i.unstable_UserBlockingPriority,Bt=i.unstable_runWithPriority,Ht=!0;function Kt(e,t){qt(t,e,!1)}function qt(e,t,n){var r=Ut.get(t);switch(void 0===r?2:r){case 0:r=Yt.bind(null,t,1,e);break;case 1:r=Xt.bind(null,t,1,e);break;default:r=Gt.bind(null,t,1,e)}n?e.addEventListener(t,r,!0):e.addEventListener(t,r,!1)}function Yt(e,t,n,r){A||D();var l=Gt,i=A;A=!0;try{F(l,e,t,n,r)}finally{(A=i)||V()}}function Xt(e,t,n,r){Bt($t,Gt.bind(null,e,t,n,r))}function Gt(e,t,n,r){if(Ht)if(0<bt.length&&-1<Ct.indexOf(e))e=Pt(null,e,t,n,r),bt.push(e);else{var l=Jt(e,t,n,r);if(null===l)Nt(e,r);else if(-1<Ct.indexOf(e))e=Pt(l,e,t,n,r),bt.push(e);else if(!function(e,t,n,r,l){switch(t){case"focus":return wt=zt(wt,e,t,n,r,l),!0;case"dragenter":return kt=zt(kt,e,t,n,r,l),!0;case"mouseover":return xt=zt(xt,e,t,n,r,l),!0;case"pointerover":var i=l.pointerId;return Tt.set(i,zt(Tt.get(i)||null,e,t,n,r,l)),!0;case"gotpointercapture":return i=l.pointerId,Et.set(i,zt(Et.get(i)||null,e,t,n,r,l)),!0}return!1}(l,e,t,n,r)){Nt(e,r),e=dt(e,r,null,t);try{W(pt,e)}finally{ft(e)}}}}function Jt(e,t,n,r){if(null!==(n=_n(n=ut(r)))){var l=Ze(n);if(null===l)n=null;else{var i=l.tag;if(13===i){if(null!==(n=et(l)))return n;n=null}else if(3===i){if(l.stateNode.hydrate)return 3===l.tag?l.stateNode.containerInfo:null;n=null}else l!==n&&(n=null)}}e=dt(e,r,n,t);try{W(pt,e)}finally{ft(e)}return null}var Zt={animationIterationCount:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},en=["Webkit","ms","Moz","O"];function tn(e,t,n){return null==t||"boolean"==typeof t||""===t?"":n||"number"!=typeof t||0===t||Zt.hasOwnProperty(e)&&Zt[e]?(""+t).trim():t+"px"}function nn(e,t){for(var n in e=e.style,t)if(t.hasOwnProperty(n)){var r=0===n.indexOf("--"),l=tn(n,t[n],r);"float"===n&&(n="cssFloat"),r?e.setProperty(n,l):e[n]=l}}Object.keys(Zt).forEach((function(e){en.forEach((function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),Zt[t]=Zt[e]}))}));var rn=l({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function ln(e,t){if(t){if(rn[e]&&(null!=t.children||null!=t.dangerouslySetInnerHTML))throw Error(a(137,e,""));if(null!=t.dangerouslySetInnerHTML){if(null!=t.children)throw Error(a(60));if("object"!=typeof t.dangerouslySetInnerHTML||!("__html"in t.dangerouslySetInnerHTML))throw Error(a(61))}if(null!=t.style&&"object"!=typeof t.style)throw Error(a(62,""))}}function an(e,t){if(-1===e.indexOf("-"))return"string"==typeof t.is;switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var on=Me;function un(e,t){var n=Je(e=9===e.nodeType||11===e.nodeType?e:e.ownerDocument);t=S[t];for(var r=0;r<t.length;r++)mt(t[r],e,n)}function cn(){}function sn(e){if(void 0===(e=e||("undefined"!=typeof document?document:void 0)))return null;try{return e.activeElement||e.body}catch(Hu){return e.body}}function fn(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function dn(e,t){var n,r=fn(e);for(e=0;r;){if(3===r.nodeType){if(n=e+r.textContent.length,e<=t&&n>=t)return{node:r,offset:t-e};e=n}e:{for(;r;){if(r.nextSibling){r=r.nextSibling;break e}r=r.parentNode}r=void 0}r=fn(r)}}function pn(){for(var e=window,t=sn();t instanceof e.HTMLIFrameElement;){try{var n="string"==typeof t.contentWindow.location.href}catch(r){n=!1}if(!n)break;t=sn((e=t.contentWindow).document)}return t}function mn(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&("input"===t&&("text"===e.type||"search"===e.type||"tel"===e.type||"url"===e.type||"password"===e.type)||"textarea"===t||"true"===e.contentEditable)}var hn=null,vn=null;function gn(e,t){switch(e){case"button":case"input":case"select":case"textarea":return!!t.autoFocus}return!1}function yn(e,t){return"textarea"===e||"option"===e||"noscript"===e||"string"==typeof t.children||"number"==typeof t.children||"object"==typeof t.dangerouslySetInnerHTML&&null!==t.dangerouslySetInnerHTML&&null!=t.dangerouslySetInnerHTML.__html}var bn="function"==typeof setTimeout?setTimeout:void 0,wn="function"==typeof clearTimeout?clearTimeout:void 0;function kn(e){for(;null!=e;e=e.nextSibling){var t=e.nodeType;if(1===t||3===t)break}return e}function xn(e){e=e.previousSibling;for(var t=0;e;){if(8===e.nodeType){var n=e.data;if("$"===n||"$!"===n||"$?"===n){if(0===t)return e;t--}else"/$"===n&&t++}e=e.previousSibling}return null}var Tn=Math.random().toString(36).slice(2),En="__reactInternalInstance$"+Tn,Sn="__reactEventHandlers$"+Tn,Cn="__reactContainere$"+Tn;function _n(e){var t=e[En];if(t)return t;for(var n=e.parentNode;n;){if(t=n[Cn]||n[En]){if(n=t.alternate,null!==t.child||null!==n&&null!==n.child)for(e=xn(e);null!==e;){if(n=e[En])return n;e=xn(e)}return t}n=(e=n).parentNode}return null}function Pn(e){return!(e=e[En]||e[Cn])||5!==e.tag&&6!==e.tag&&13!==e.tag&&3!==e.tag?null:e}function Nn(e){if(5===e.tag||6===e.tag)return e.stateNode;throw Error(a(33))}function zn(e){return e[Sn]||null}function On(e){do{e=e.return}while(e&&5!==e.tag);return e||null}function Rn(e,t){var n=e.stateNode;if(!n)return null;var r=m(n);if(!r)return null;n=r[t];e:switch(t){case"onClick":case"onClickCapture":case"onDoubleClick":case"onDoubleClickCapture":case"onMouseDown":case"onMouseDownCapture":case"onMouseMove":case"onMouseMoveCapture":case"onMouseUp":case"onMouseUpCapture":case"onMouseEnter":(r=!r.disabled)||(r=!("button"===(e=e.type)||"input"===e||"select"===e||"textarea"===e)),e=!r;break e;default:e=!1}if(e)return null;if(n&&"function"!=typeof n)throw Error(a(231,t,typeof n));return n}function In(e,t,n){(t=Rn(e,n.dispatchConfig.phasedRegistrationNames[t]))&&(n._dispatchListeners=rt(n._dispatchListeners,t),n._dispatchInstances=rt(n._dispatchInstances,e))}function Mn(e){if(e&&e.dispatchConfig.phasedRegistrationNames){for(var t=e._targetInst,n=[];t;)n.push(t),t=On(t);for(t=n.length;0<t--;)In(n[t],"captured",e);for(t=0;t<n.length;t++)In(n[t],"bubbled",e)}}function Fn(e,t,n){e&&n&&n.dispatchConfig.registrationName&&(t=Rn(e,n.dispatchConfig.registrationName))&&(n._dispatchListeners=rt(n._dispatchListeners,t),n._dispatchInstances=rt(n._dispatchInstances,e))}function Dn(e){e&&e.dispatchConfig.registrationName&&Fn(e._targetInst,null,e)}function Ln(e){lt(e,Mn)}var An=null,Un=null,Vn=null;function Wn(){if(Vn)return Vn;var e,t,n=Un,r=n.length,l="value"in An?An.value:An.textContent,i=l.length;for(e=0;e<r&&n[e]===l[e];e++);var a=r-e;for(t=1;t<=a&&n[r-t]===l[i-t];t++);return Vn=l.slice(e,1<t?1-t:void 0)}function Qn(){return!0}function jn(){return!1}function $n(e,t,n,r){for(var l in this.dispatchConfig=e,this._targetInst=t,this.nativeEvent=n,e=this.constructor.Interface)e.hasOwnProperty(l)&&((t=e[l])?this[l]=t(n):"target"===l?this.target=r:this[l]=n[l]);return this.isDefaultPrevented=(null!=n.defaultPrevented?n.defaultPrevented:!1===n.returnValue)?Qn:jn,this.isPropagationStopped=jn,this}function Bn(e,t,n,r){if(this.eventPool.length){var l=this.eventPool.pop();return this.call(l,e,t,n,r),l}return new this(e,t,n,r)}function Hn(e){if(!(e instanceof this))throw Error(a(279));e.destructor(),10>this.eventPool.length&&this.eventPool.push(e)}function Kn(e){e.eventPool=[],e.getPooled=Bn,e.release=Hn}l($n.prototype,{preventDefault:function(){this.defaultPrevented=!0;var e=this.nativeEvent;e&&(e.preventDefault?e.preventDefault():"unknown"!=typeof e.returnValue&&(e.returnValue=!1),this.isDefaultPrevented=Qn)},stopPropagation:function(){var e=this.nativeEvent;e&&(e.stopPropagation?e.stopPropagation():"unknown"!=typeof e.cancelBubble&&(e.cancelBubble=!0),this.isPropagationStopped=Qn)},persist:function(){this.isPersistent=Qn},isPersistent:jn,destructor:function(){var e,t=this.constructor.Interface;for(e in t)this[e]=null;this.nativeEvent=this._targetInst=this.dispatchConfig=null,this.isPropagationStopped=this.isDefaultPrevented=jn,this._dispatchInstances=this._dispatchListeners=null}}),$n.Interface={type:null,target:null,currentTarget:function(){return null},eventPhase:null,bubbles:null,cancelable:null,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:null,isTrusted:null},$n.extend=function(e){function t(){}function n(){return r.apply(this,arguments)}var r=this;t.prototype=r.prototype;var i=new t;return l(i,n.prototype),n.prototype=i,n.prototype.constructor=n,n.Interface=l({},r.Interface,e),n.extend=r.extend,Kn(n),n},Kn($n);var qn=$n.extend({data:null}),Yn=$n.extend({data:null}),Xn=[9,13,27,32],Gn=_&&"CompositionEvent"in window,Jn=null;_&&"documentMode"in document&&(Jn=document.documentMode);var Zn=_&&"TextEvent"in window&&!Jn,er=_&&(!Gn||Jn&&8<Jn&&11>=Jn),tr=String.fromCharCode(32),nr={beforeInput:{phasedRegistrationNames:{bubbled:"onBeforeInput",captured:"onBeforeInputCapture"},dependencies:["compositionend","keypress","textInput","paste"]},compositionEnd:{phasedRegistrationNames:{bubbled:"onCompositionEnd",captured:"onCompositionEndCapture"},dependencies:"blur compositionend keydown keypress keyup mousedown".split(" ")},compositionStart:{phasedRegistrationNames:{bubbled:"onCompositionStart",captured:"onCompositionStartCapture"},dependencies:"blur compositionstart keydown keypress keyup mousedown".split(" ")},compositionUpdate:{phasedRegistrationNames:{bubbled:"onCompositionUpdate",captured:"onCompositionUpdateCapture"},dependencies:"blur compositionupdate keydown keypress keyup mousedown".split(" ")}},rr=!1;function lr(e,t){switch(e){case"keyup":return-1!==Xn.indexOf(t.keyCode);case"keydown":return 229!==t.keyCode;case"keypress":case"mousedown":case"blur":return!0;default:return!1}}function ir(e){return"object"==typeof(e=e.detail)&&"data"in e?e.data:null}var ar=!1;var or={eventTypes:nr,extractEvents:function(e,t,n,r){var l;if(Gn)e:{switch(e){case"compositionstart":var i=nr.compositionStart;break e;case"compositionend":i=nr.compositionEnd;break e;case"compositionupdate":i=nr.compositionUpdate;break e}i=void 0}else ar?lr(e,n)&&(i=nr.compositionEnd):"keydown"===e&&229===n.keyCode&&(i=nr.compositionStart);return i?(er&&"ko"!==n.locale&&(ar||i!==nr.compositionStart?i===nr.compositionEnd&&ar&&(l=Wn()):(Un="value"in(An=r)?An.value:An.textContent,ar=!0)),i=qn.getPooled(i,t,n,r),l?i.data=l:null!==(l=ir(n))&&(i.data=l),Ln(i),l=i):l=null,(e=Zn?function(e,t){switch(e){case"compositionend":return ir(t);case"keypress":return 32!==t.which?null:(rr=!0,tr);case"textInput":return(e=t.data)===tr&&rr?null:e;default:return null}}(e,n):function(e,t){if(ar)return"compositionend"===e||!Gn&&lr(e,t)?(e=Wn(),Vn=Un=An=null,ar=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1<t.char.length)return t.char;if(t.which)return String.fromCharCode(t.which)}return null;case"compositionend":return er&&"ko"!==t.locale?null:t.data;default:return null}}(e,n))?((t=Yn.getPooled(nr.beforeInput,t,n,r)).data=e,Ln(t)):t=null,null===l?t:null===t?l:[l,t]}},ur={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function cr(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return"input"===t?!!ur[e.type]:"textarea"===t}var sr={change:{phasedRegistrationNames:{bubbled:"onChange",captured:"onChangeCapture"},dependencies:"blur change click focus input keydown keyup selectionchange".split(" ")}};function fr(e,t,n){return(e=$n.getPooled(sr.change,e,t,n)).type="change",R(n),Ln(e),e}var dr=null,pr=null;function mr(e){ot(e)}function hr(e){if(ke(Nn(e)))return e}function vr(e,t){if("change"===e)return t}var gr=!1;function yr(){dr&&(dr.detachEvent("onpropertychange",br),pr=dr=null)}function br(e){if("value"===e.propertyName&&hr(pr))if(e=fr(pr,e,ut(e)),A)ot(e);else{A=!0;try{M(mr,e)}finally{A=!1,V()}}}function wr(e,t,n){"focus"===e?(yr(),pr=n,(dr=t).attachEvent("onpropertychange",br)):"blur"===e&&yr()}function kr(e){if("selectionchange"===e||"keyup"===e||"keydown"===e)return hr(pr)}function xr(e,t){if("click"===e)return hr(t)}function Tr(e,t){if("input"===e||"change"===e)return hr(t)}_&&(gr=ct("input")&&(!document.documentMode||9<document.documentMode));var Er={eventTypes:sr,_isInputEventSupported:gr,extractEvents:function(e,t,n,r){var l=t?Nn(t):window,i=l.nodeName&&l.nodeName.toLowerCase();if("select"===i||"input"===i&&"file"===l.type)var a=vr;else if(cr(l))if(gr)a=Tr;else{a=kr;var o=wr}else(i=l.nodeName)&&"input"===i.toLowerCase()&&("checkbox"===l.type||"radio"===l.type)&&(a=xr);if(a&&(a=a(e,t)))return fr(a,n,r);o&&o(e,l,t),"blur"===e&&(e=l._wrapperState)&&e.controlled&&"number"===l.type&&_e(l,"number",l.value)}},Sr=$n.extend({view:null,detail:null}),Cr={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};function _r(e){var t=this.nativeEvent;return t.getModifierState?t.getModifierState(e):!!(e=Cr[e])&&!!t[e]}function Pr(){return _r}var Nr=0,zr=0,Or=!1,Rr=!1,Ir=Sr.extend({screenX:null,screenY:null,clientX:null,clientY:null,pageX:null,pageY:null,ctrlKey:null,shiftKey:null,altKey:null,metaKey:null,getModifierState:Pr,button:null,buttons:null,relatedTarget:function(e){return e.relatedTarget||(e.fromElement===e.srcElement?e.toElement:e.fromElement)},movementX:function(e){if("movementX"in e)return e.movementX;var t=Nr;return Nr=e.screenX,Or?"mousemove"===e.type?e.screenX-t:0:(Or=!0,0)},movementY:function(e){if("movementY"in e)return e.movementY;var t=zr;return zr=e.screenY,Rr?"mousemove"===e.type?e.screenY-t:0:(Rr=!0,0)}}),Mr=Ir.extend({pointerId:null,width:null,height:null,pressure:null,tangentialPressure:null,tiltX:null,tiltY:null,twist:null,pointerType:null,isPrimary:null}),Fr={mouseEnter:{registrationName:"onMouseEnter",dependencies:["mouseout","mouseover"]},mouseLeave:{registrationName:"onMouseLeave",dependencies:["mouseout","mouseover"]},pointerEnter:{registrationName:"onPointerEnter",dependencies:["pointerout","pointerover"]},pointerLeave:{registrationName:"onPointerLeave",dependencies:["pointerout","pointerover"]}},Dr={eventTypes:Fr,extractEvents:function(e,t,n,r,l){var i="mouseover"===e||"pointerover"===e,a="mouseout"===e||"pointerout"===e;if(i&&0==(32&l)&&(n.relatedTarget||n.fromElement)||!a&&!i)return null;(i=r.window===r?r:(i=r.ownerDocument)?i.defaultView||i.parentWindow:window,a)?(a=t,null!==(t=(t=n.relatedTarget||n.toElement)?_n(t):null)&&(t!==Ze(t)||5!==t.tag&&6!==t.tag)&&(t=null)):a=null;if(a===t)return null;if("mouseout"===e||"mouseover"===e)var o=Ir,u=Fr.mouseLeave,c=Fr.mouseEnter,s="mouse";else"pointerout"!==e&&"pointerover"!==e||(o=Mr,u=Fr.pointerLeave,c=Fr.pointerEnter,s="pointer");if(e=null==a?i:Nn(a),i=null==t?i:Nn(t),(u=o.getPooled(u,a,n,r)).type=s+"leave",u.target=e,u.relatedTarget=i,(n=o.getPooled(c,t,n,r)).type=s+"enter",n.target=i,n.relatedTarget=e,s=t,(r=a)&&s)e:{for(c=s,a=0,e=o=r;e;e=On(e))a++;for(e=0,t=c;t;t=On(t))e++;for(;0<a-e;)o=On(o),a--;for(;0<e-a;)c=On(c),e--;for(;a--;){if(o===c||o===c.alternate)break e;o=On(o),c=On(c)}o=null}else o=null;for(c=o,o=[];r&&r!==c&&(null===(a=r.alternate)||a!==c);)o.push(r),r=On(r);for(r=[];s&&s!==c&&(null===(a=s.alternate)||a!==c);)r.push(s),s=On(s);for(s=0;s<o.length;s++)Fn(o[s],"bubbled",u);for(s=r.length;0<s--;)Fn(r[s],"captured",n);return 0==(64&l)?[u]:[u,n]}};var Lr="function"==typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t},Ar=Object.prototype.hasOwnProperty;function Ur(e,t){if(Lr(e,t))return!0;if("object"!=typeof e||null===e||"object"!=typeof t||null===t)return!1;var n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(r=0;r<n.length;r++)if(!Ar.call(t,n[r])||!Lr(e[n[r]],t[n[r]]))return!1;return!0}var Vr=_&&"documentMode"in document&&11>=document.documentMode,Wr={select:{phasedRegistrationNames:{bubbled:"onSelect",captured:"onSelectCapture"},dependencies:"blur contextmenu dragend focus keydown keyup mousedown mouseup selectionchange".split(" ")}},Qr=null,jr=null,$r=null,Br=!1;function Hr(e,t){var n=t.window===t?t.document:9===t.nodeType?t:t.ownerDocument;return Br||null==Qr||Qr!==sn(n)?null:("selectionStart"in(n=Qr)&&mn(n)?n={start:n.selectionStart,end:n.selectionEnd}:n={anchorNode:(n=(n.ownerDocument&&n.ownerDocument.defaultView||window).getSelection()).anchorNode,anchorOffset:n.anchorOffset,focusNode:n.focusNode,focusOffset:n.focusOffset},$r&&Ur($r,n)?null:($r=n,(e=$n.getPooled(Wr.select,jr,e,t)).type="select",e.target=Qr,Ln(e),e))}var Kr={eventTypes:Wr,extractEvents:function(e,t,n,r,l,i){if(!(i=!(l=i||(r.window===r?r.document:9===r.nodeType?r:r.ownerDocument)))){e:{l=Je(l),i=S.onSelect;for(var a=0;a<i.length;a++)if(!l.has(i[a])){l=!1;break e}l=!0}i=!l}if(i)return null;switch(l=t?Nn(t):window,e){case"focus":(cr(l)||"true"===l.contentEditable)&&(Qr=l,jr=t,$r=null);break;case"blur":$r=jr=Qr=null;break;case"mousedown":Br=!0;break;case"contextmenu":case"mouseup":case"dragend":return Br=!1,Hr(n,r);case"selectionchange":if(Vr)break;case"keydown":case"keyup":return Hr(n,r)}return null}},qr=$n.extend({animationName:null,elapsedTime:null,pseudoElement:null}),Yr=$n.extend({clipboardData:function(e){return"clipboardData"in e?e.clipboardData:window.clipboardData}}),Xr=Sr.extend({relatedTarget:null});function Gr(e){var t=e.keyCode;return"charCode"in e?0===(e=e.charCode)&&13===t&&(e=13):e=t,10===e&&(e=13),32<=e||13===e?e:0}var Jr={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},Zr={8:"Backspace",9:"Tab",12:"Clear",13:"Enter",16:"Shift",17:"Control",18:"Alt",19:"Pause",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",45:"Insert",46:"Delete",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NumLock",145:"ScrollLock",224:"Meta"},el=Sr.extend({key:function(e){if(e.key){var t=Jr[e.key]||e.key;if("Unidentified"!==t)return t}return"keypress"===e.type?13===(e=Gr(e))?"Enter":String.fromCharCode(e):"keydown"===e.type||"keyup"===e.type?Zr[e.keyCode]||"Unidentified":""},location:null,ctrlKey:null,shiftKey:null,altKey:null,metaKey:null,repeat:null,locale:null,getModifierState:Pr,charCode:function(e){return"keypress"===e.type?Gr(e):0},keyCode:function(e){return"keydown"===e.type||"keyup"===e.type?e.keyCode:0},which:function(e){return"keypress"===e.type?Gr(e):"keydown"===e.type||"keyup"===e.type?e.keyCode:0}}),tl=Ir.extend({dataTransfer:null}),nl=Sr.extend({touches:null,targetTouches:null,changedTouches:null,altKey:null,metaKey:null,ctrlKey:null,shiftKey:null,getModifierState:Pr}),rl=$n.extend({propertyName:null,elapsedTime:null,pseudoElement:null}),ll=Ir.extend({deltaX:function(e){return"deltaX"in e?e.deltaX:"wheelDeltaX"in e?-e.wheelDeltaX:0},deltaY:function(e){return"deltaY"in e?e.deltaY:"wheelDeltaY"in e?-e.wheelDeltaY:"wheelDelta"in e?-e.wheelDelta:0},deltaZ:null,deltaMode:null}),il={eventTypes:Lt,extractEvents:function(e,t,n,r){var l=At.get(e);if(!l)return null;switch(e){case"keypress":if(0===Gr(n))return null;case"keydown":case"keyup":e=el;break;case"blur":case"focus":e=Xr;break;case"click":if(2===n.button)return null;case"auxclick":case"dblclick":case"mousedown":case"mousemove":case"mouseup":case"mouseout":case"mouseover":case"contextmenu":e=Ir;break;case"drag":case"dragend":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"dragstart":case"drop":e=tl;break;case"touchcancel":case"touchend":case"touchmove":case"touchstart":e=nl;break;case He:case Ke:case qe:e=qr;break;case Ye:e=rl;break;case"scroll":e=Sr;break;case"wheel":e=ll;break;case"copy":case"cut":case"paste":e=Yr;break;case"gotpointercapture":case"lostpointercapture":case"pointercancel":case"pointerdown":case"pointermove":case"pointerout":case"pointerover":case"pointerup":e=Mr;break;default:e=$n}return Ln(t=e.getPooled(l,t,n,r)),t}};if(y)throw Error(a(101));y=Array.prototype.slice.call("ResponderEventPlugin SimpleEventPlugin EnterLeaveEventPlugin ChangeEventPlugin SelectEventPlugin BeforeInputEventPlugin".split(" ")),w(),m=zn,h=Pn,v=Nn,C({SimpleEventPlugin:il,EnterLeaveEventPlugin:Dr,ChangeEventPlugin:Er,SelectEventPlugin:Kr,BeforeInputEventPlugin:or});var al=[],ol=-1;function ul(e){0>ol||(e.current=al[ol],al[ol]=null,ol--)}function cl(e,t){ol++,al[ol]=e.current,e.current=t}var sl={},fl={current:sl},dl={current:!1},pl=sl;function ml(e,t){var n=e.type.contextTypes;if(!n)return sl;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var l,i={};for(l in n)i[l]=t[l];return r&&((e=e.stateNode).__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=i),i}function hl(e){return null!=(e=e.childContextTypes)}function vl(){ul(dl),ul(fl)}function gl(e,t,n){if(fl.current!==sl)throw Error(a(168));cl(fl,t),cl(dl,n)}function yl(e,t,n){var r=e.stateNode;if(e=t.childContextTypes,"function"!=typeof r.getChildContext)return n;for(var i in r=r.getChildContext())if(!(i in e))throw Error(a(108,ve(t)||"Unknown",i));return l({},n,{},r)}function bl(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||sl,pl=fl.current,cl(fl,e),cl(dl,dl.current),!0}function wl(e,t,n){var r=e.stateNode;if(!r)throw Error(a(169));n?(e=yl(e,t,pl),r.__reactInternalMemoizedMergedChildContext=e,ul(dl),ul(fl),cl(fl,e)):ul(dl),cl(dl,n)}var kl=i.unstable_runWithPriority,xl=i.unstable_scheduleCallback,Tl=i.unstable_cancelCallback,El=i.unstable_requestPaint,Sl=i.unstable_now,Cl=i.unstable_getCurrentPriorityLevel,_l=i.unstable_ImmediatePriority,Pl=i.unstable_UserBlockingPriority,Nl=i.unstable_NormalPriority,zl=i.unstable_LowPriority,Ol=i.unstable_IdlePriority,Rl={},Il=i.unstable_shouldYield,Ml=void 0!==El?El:function(){},Fl=null,Dl=null,Ll=!1,Al=Sl(),Ul=1e4>Al?Sl:function(){return Sl()-Al};function Vl(){switch(Cl()){case _l:return 99;case Pl:return 98;case Nl:return 97;case zl:return 96;case Ol:return 95;default:throw Error(a(332))}}function Wl(e){switch(e){case 99:return _l;case 98:return Pl;case 97:return Nl;case 96:return zl;case 95:return Ol;default:throw Error(a(332))}}function Ql(e,t){return e=Wl(e),kl(e,t)}function jl(e,t,n){return e=Wl(e),xl(e,t,n)}function $l(e){return null===Fl?(Fl=[e],Dl=xl(_l,Hl)):Fl.push(e),Rl}function Bl(){if(null!==Dl){var e=Dl;Dl=null,Tl(e)}Hl()}function Hl(){if(!Ll&&null!==Fl){Ll=!0;var e=0;try{var t=Fl;Ql(99,(function(){for(;e<t.length;e++){var n=t[e];do{n=n(!0)}while(null!==n)}})),Fl=null}catch(n){throw null!==Fl&&(Fl=Fl.slice(e+1)),xl(_l,Bl),n}finally{Ll=!1}}}function Kl(e,t,n){return 1073741821-(1+((1073741821-e+t/10)/(n/=10)|0))*n}function ql(e,t){if(e&&e.defaultProps)for(var n in t=l({},t),e=e.defaultProps)void 0===t[n]&&(t[n]=e[n]);return t}var Yl={current:null},Xl=null,Gl=null,Jl=null;function Zl(){Jl=Gl=Xl=null}function ei(e){var t=Yl.current;ul(Yl),e.type._context._currentValue=t}function ti(e,t){for(;null!==e;){var n=e.alternate;if(e.childExpirationTime<t)e.childExpirationTime=t,null!==n&&n.childExpirationTime<t&&(n.childExpirationTime=t);else{if(!(null!==n&&n.childExpirationTime<t))break;n.childExpirationTime=t}e=e.return}}function ni(e,t){Xl=e,Jl=Gl=null,null!==(e=e.dependencies)&&null!==e.firstContext&&(e.expirationTime>=t&&(Na=!0),e.firstContext=null)}function ri(e,t){if(Jl!==e&&!1!==t&&0!==t)if("number"==typeof t&&1073741823!==t||(Jl=e,t=1073741823),t={context:e,observedBits:t,next:null},null===Gl){if(null===Xl)throw Error(a(308));Gl=t,Xl.dependencies={expirationTime:0,firstContext:t,responders:null}}else Gl=Gl.next=t;return e._currentValue}var li=!1;function ii(e){e.updateQueue={baseState:e.memoizedState,baseQueue:null,shared:{pending:null},effects:null}}function ai(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,baseQueue:e.baseQueue,shared:e.shared,effects:e.effects})}function oi(e,t){return(e={expirationTime:e,suspenseConfig:t,tag:0,payload:null,callback:null,next:null}).next=e}function ui(e,t){if(null!==(e=e.updateQueue)){var n=(e=e.shared).pending;null===n?t.next=t:(t.next=n.next,n.next=t),e.pending=t}}function ci(e,t){var n=e.alternate;null!==n&&ai(n,e),null===(n=(e=e.updateQueue).baseQueue)?(e.baseQueue=t.next=t,t.next=t):(t.next=n.next,n.next=t)}function si(e,t,n,r){var i=e.updateQueue;li=!1;var a=i.baseQueue,o=i.shared.pending;if(null!==o){if(null!==a){var u=a.next;a.next=o.next,o.next=u}a=o,i.shared.pending=null,null!==(u=e.alternate)&&(null!==(u=u.updateQueue)&&(u.baseQueue=o))}if(null!==a){u=a.next;var c=i.baseState,s=0,f=null,d=null,p=null;if(null!==u)for(var m=u;;){if((o=m.expirationTime)<r){var h={expirationTime:m.expirationTime,suspenseConfig:m.suspenseConfig,tag:m.tag,payload:m.payload,callback:m.callback,next:null};null===p?(d=p=h,f=c):p=p.next=h,o>s&&(s=o)}else{null!==p&&(p=p.next={expirationTime:1073741823,suspenseConfig:m.suspenseConfig,tag:m.tag,payload:m.payload,callback:m.callback,next:null}),iu(o,m.suspenseConfig);e:{var v=e,g=m;switch(o=t,h=n,g.tag){case 1:if("function"==typeof(v=g.payload)){c=v.call(h,c,o);break e}c=v;break e;case 3:v.effectTag=-4097&v.effectTag|64;case 0:if(null==(o="function"==typeof(v=g.payload)?v.call(h,c,o):v))break e;c=l({},c,o);break e;case 2:li=!0}}null!==m.callback&&(e.effectTag|=32,null===(o=i.effects)?i.effects=[m]:o.push(m))}if(null===(m=m.next)||m===u){if(null===(o=i.shared.pending))break;m=a.next=o.next,o.next=u,i.baseQueue=a=o,i.shared.pending=null}}null===p?f=c:p.next=d,i.baseState=f,i.baseQueue=p,au(s),e.expirationTime=s,e.memoizedState=c}}function fi(e,t,n){if(e=t.effects,t.effects=null,null!==e)for(t=0;t<e.length;t++){var r=e[t],l=r.callback;if(null!==l){if(r.callback=null,r=l,l=n,"function"!=typeof r)throw Error(a(191,r));r.call(l)}}}var di=X.ReactCurrentBatchConfig,pi=(new r.Component).refs;function mi(e,t,n,r){n=null==(n=n(r,t=e.memoizedState))?t:l({},t,n),e.memoizedState=n,0===e.expirationTime&&(e.updateQueue.baseState=n)}var hi={isMounted:function(e){return!!(e=e._reactInternalFiber)&&Ze(e)===e},enqueueSetState:function(e,t,n){e=e._reactInternalFiber;var r=Ho(),l=di.suspense;(l=oi(r=Ko(r,e,l),l)).payload=t,null!=n&&(l.callback=n),ui(e,l),qo(e,r)},enqueueReplaceState:function(e,t,n){e=e._reactInternalFiber;var r=Ho(),l=di.suspense;(l=oi(r=Ko(r,e,l),l)).tag=1,l.payload=t,null!=n&&(l.callback=n),ui(e,l),qo(e,r)},enqueueForceUpdate:function(e,t){e=e._reactInternalFiber;var n=Ho(),r=di.suspense;(r=oi(n=Ko(n,e,r),r)).tag=2,null!=t&&(r.callback=t),ui(e,r),qo(e,n)}};function vi(e,t,n,r,l,i,a){return"function"==typeof(e=e.stateNode).shouldComponentUpdate?e.shouldComponentUpdate(r,i,a):!t.prototype||!t.prototype.isPureReactComponent||(!Ur(n,r)||!Ur(l,i))}function gi(e,t,n){var r=!1,l=sl,i=t.contextType;return"object"==typeof i&&null!==i?i=ri(i):(l=hl(t)?pl:fl.current,i=(r=null!=(r=t.contextTypes))?ml(e,l):sl),t=new t(n,i),e.memoizedState=null!==t.state&&void 0!==t.state?t.state:null,t.updater=hi,e.stateNode=t,t._reactInternalFiber=e,r&&((e=e.stateNode).__reactInternalMemoizedUnmaskedChildContext=l,e.__reactInternalMemoizedMaskedChildContext=i),t}function yi(e,t,n,r){e=t.state,"function"==typeof t.componentWillReceiveProps&&t.componentWillReceiveProps(n,r),"function"==typeof t.UNSAFE_componentWillReceiveProps&&t.UNSAFE_componentWillReceiveProps(n,r),t.state!==e&&hi.enqueueReplaceState(t,t.state,null)}function bi(e,t,n,r){var l=e.stateNode;l.props=n,l.state=e.memoizedState,l.refs=pi,ii(e);var i=t.contextType;"object"==typeof i&&null!==i?l.context=ri(i):(i=hl(t)?pl:fl.current,l.context=ml(e,i)),si(e,n,l,r),l.state=e.memoizedState,"function"==typeof(i=t.getDerivedStateFromProps)&&(mi(e,t,i,n),l.state=e.memoizedState),"function"==typeof t.getDerivedStateFromProps||"function"==typeof l.getSnapshotBeforeUpdate||"function"!=typeof l.UNSAFE_componentWillMount&&"function"!=typeof l.componentWillMount||(t=l.state,"function"==typeof l.componentWillMount&&l.componentWillMount(),"function"==typeof l.UNSAFE_componentWillMount&&l.UNSAFE_componentWillMount(),t!==l.state&&hi.enqueueReplaceState(l,l.state,null),si(e,n,l,r),l.state=e.memoizedState),"function"==typeof l.componentDidMount&&(e.effectTag|=4)}var wi=Array.isArray;function ki(e,t,n){if(null!==(e=n.ref)&&"function"!=typeof e&&"object"!=typeof e){if(n._owner){if(n=n._owner){if(1!==n.tag)throw Error(a(309));var r=n.stateNode}if(!r)throw Error(a(147,e));var l=""+e;return null!==t&&null!==t.ref&&"function"==typeof t.ref&&t.ref._stringRef===l?t.ref:((t=function(e){var t=r.refs;t===pi&&(t=r.refs={}),null===e?delete t[l]:t[l]=e})._stringRef=l,t)}if("string"!=typeof e)throw Error(a(284));if(!n._owner)throw Error(a(290,e))}return e}function xi(e,t){if("textarea"!==e.type)throw Error(a(31,"[object Object]"===Object.prototype.toString.call(t)?"object with keys {"+Object.keys(t).join(", ")+"}":t,""))}function Ti(e){function t(t,n){if(e){var r=t.lastEffect;null!==r?(r.nextEffect=n,t.lastEffect=n):t.firstEffect=t.lastEffect=n,n.nextEffect=null,n.effectTag=8}}function n(n,r){if(!e)return null;for(;null!==r;)t(n,r),r=r.sibling;return null}function r(e,t){for(e=new Map;null!==t;)null!==t.key?e.set(t.key,t):e.set(t.index,t),t=t.sibling;return e}function l(e,t){return(e=Cu(e,t)).index=0,e.sibling=null,e}function i(t,n,r){return t.index=r,e?null!==(r=t.alternate)?(r=r.index)<n?(t.effectTag=2,n):r:(t.effectTag=2,n):n}function o(t){return e&&null===t.alternate&&(t.effectTag=2),t}function u(e,t,n,r){return null===t||6!==t.tag?((t=Nu(n,e.mode,r)).return=e,t):((t=l(t,n)).return=e,t)}function c(e,t,n,r){return null!==t&&t.elementType===n.type?((r=l(t,n.props)).ref=ki(e,t,n),r.return=e,r):((r=_u(n.type,n.key,n.props,null,e.mode,r)).ref=ki(e,t,n),r.return=e,r)}function s(e,t,n,r){return null===t||4!==t.tag||t.stateNode.containerInfo!==n.containerInfo||t.stateNode.implementation!==n.implementation?((t=zu(n,e.mode,r)).return=e,t):((t=l(t,n.children||[])).return=e,t)}function f(e,t,n,r,i){return null===t||7!==t.tag?((t=Pu(n,e.mode,r,i)).return=e,t):((t=l(t,n)).return=e,t)}function d(e,t,n){if("string"==typeof t||"number"==typeof t)return(t=Nu(""+t,e.mode,n)).return=e,t;if("object"==typeof t&&null!==t){switch(t.$$typeof){case ee:return(n=_u(t.type,t.key,t.props,null,e.mode,n)).ref=ki(e,null,t),n.return=e,n;case te:return(t=zu(t,e.mode,n)).return=e,t}if(wi(t)||he(t))return(t=Pu(t,e.mode,n,null)).return=e,t;xi(e,t)}return null}function p(e,t,n,r){var l=null!==t?t.key:null;if("string"==typeof n||"number"==typeof n)return null!==l?null:u(e,t,""+n,r);if("object"==typeof n&&null!==n){switch(n.$$typeof){case ee:return n.key===l?n.type===ne?f(e,t,n.props.children,r,l):c(e,t,n,r):null;case te:return n.key===l?s(e,t,n,r):null}if(wi(n)||he(n))return null!==l?null:f(e,t,n,r,null);xi(e,n)}return null}function m(e,t,n,r,l){if("string"==typeof r||"number"==typeof r)return u(t,e=e.get(n)||null,""+r,l);if("object"==typeof r&&null!==r){switch(r.$$typeof){case ee:return e=e.get(null===r.key?n:r.key)||null,r.type===ne?f(t,e,r.props.children,l,r.key):c(t,e,r,l);case te:return s(t,e=e.get(null===r.key?n:r.key)||null,r,l)}if(wi(r)||he(r))return f(t,e=e.get(n)||null,r,l,null);xi(t,r)}return null}function h(l,a,o,u){for(var c=null,s=null,f=a,h=a=0,v=null;null!==f&&h<o.length;h++){f.index>h?(v=f,f=null):v=f.sibling;var g=p(l,f,o[h],u);if(null===g){null===f&&(f=v);break}e&&f&&null===g.alternate&&t(l,f),a=i(g,a,h),null===s?c=g:s.sibling=g,s=g,f=v}if(h===o.length)return n(l,f),c;if(null===f){for(;h<o.length;h++)null!==(f=d(l,o[h],u))&&(a=i(f,a,h),null===s?c=f:s.sibling=f,s=f);return c}for(f=r(l,f);h<o.length;h++)null!==(v=m(f,l,h,o[h],u))&&(e&&null!==v.alternate&&f.delete(null===v.key?h:v.key),a=i(v,a,h),null===s?c=v:s.sibling=v,s=v);return e&&f.forEach((function(e){return t(l,e)})),c}function v(l,o,u,c){var s=he(u);if("function"!=typeof s)throw Error(a(150));if(null==(u=s.call(u)))throw Error(a(151));for(var f=s=null,h=o,v=o=0,g=null,y=u.next();null!==h&&!y.done;v++,y=u.next()){h.index>v?(g=h,h=null):g=h.sibling;var b=p(l,h,y.value,c);if(null===b){null===h&&(h=g);break}e&&h&&null===b.alternate&&t(l,h),o=i(b,o,v),null===f?s=b:f.sibling=b,f=b,h=g}if(y.done)return n(l,h),s;if(null===h){for(;!y.done;v++,y=u.next())null!==(y=d(l,y.value,c))&&(o=i(y,o,v),null===f?s=y:f.sibling=y,f=y);return s}for(h=r(l,h);!y.done;v++,y=u.next())null!==(y=m(h,l,v,y.value,c))&&(e&&null!==y.alternate&&h.delete(null===y.key?v:y.key),o=i(y,o,v),null===f?s=y:f.sibling=y,f=y);return e&&h.forEach((function(e){return t(l,e)})),s}return function(e,r,i,u){var c="object"==typeof i&&null!==i&&i.type===ne&&null===i.key;c&&(i=i.props.children);var s="object"==typeof i&&null!==i;if(s)switch(i.$$typeof){case ee:e:{for(s=i.key,c=r;null!==c;){if(c.key===s){switch(c.tag){case 7:if(i.type===ne){n(e,c.sibling),(r=l(c,i.props.children)).return=e,e=r;break e}break;default:if(c.elementType===i.type){n(e,c.sibling),(r=l(c,i.props)).ref=ki(e,c,i),r.return=e,e=r;break e}}n(e,c);break}t(e,c),c=c.sibling}i.type===ne?((r=Pu(i.props.children,e.mode,u,i.key)).return=e,e=r):((u=_u(i.type,i.key,i.props,null,e.mode,u)).ref=ki(e,r,i),u.return=e,e=u)}return o(e);case te:e:{for(c=i.key;null!==r;){if(r.key===c){if(4===r.tag&&r.stateNode.containerInfo===i.containerInfo&&r.stateNode.implementation===i.implementation){n(e,r.sibling),(r=l(r,i.children||[])).return=e,e=r;break e}n(e,r);break}t(e,r),r=r.sibling}(r=zu(i,e.mode,u)).return=e,e=r}return o(e)}if("string"==typeof i||"number"==typeof i)return i=""+i,null!==r&&6===r.tag?(n(e,r.sibling),(r=l(r,i)).return=e,e=r):(n(e,r),(r=Nu(i,e.mode,u)).return=e,e=r),o(e);if(wi(i))return h(e,r,i,u);if(he(i))return v(e,r,i,u);if(s&&xi(e,i),void 0===i&&!c)switch(e.tag){case 1:case 0:throw e=e.type,Error(a(152,e.displayName||e.name||"Component"))}return n(e,r)}}var Ei=Ti(!0),Si=Ti(!1),Ci={},_i={current:Ci},Pi={current:Ci},Ni={current:Ci};function zi(e){if(e===Ci)throw Error(a(174));return e}function Oi(e,t){switch(cl(Ni,t),cl(Pi,e),cl(_i,Ci),e=t.nodeType){case 9:case 11:t=(t=t.documentElement)?t.namespaceURI:Le(null,"");break;default:t=Le(t=(e=8===e?t.parentNode:t).namespaceURI||null,e=e.tagName)}ul(_i),cl(_i,t)}function Ri(){ul(_i),ul(Pi),ul(Ni)}function Ii(e){zi(Ni.current);var t=zi(_i.current),n=Le(t,e.type);t!==n&&(cl(Pi,e),cl(_i,n))}function Mi(e){Pi.current===e&&(ul(_i),ul(Pi))}var Fi={current:0};function Di(e){for(var t=e;null!==t;){if(13===t.tag){var n=t.memoizedState;if(null!==n&&(null===(n=n.dehydrated)||"$?"===n.data||"$!"===n.data))return t}else if(19===t.tag&&void 0!==t.memoizedProps.revealOrder){if(0!=(64&t.effectTag))return t}else if(null!==t.child){t.child.return=t,t=t.child;continue}if(t===e)break;for(;null===t.sibling;){if(null===t.return||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}function Li(e,t){return{responder:e,props:t}}var Ai=X.ReactCurrentDispatcher,Ui=X.ReactCurrentBatchConfig,Vi=0,Wi=null,Qi=null,ji=null,$i=!1;function Bi(){throw Error(a(321))}function Hi(e,t){if(null===t)return!1;for(var n=0;n<t.length&&n<e.length;n++)if(!Lr(e[n],t[n]))return!1;return!0}function Ki(e,t,n,r,l,i){if(Vi=i,Wi=t,t.memoizedState=null,t.updateQueue=null,t.expirationTime=0,Ai.current=null===e||null===e.memoizedState?va:ga,e=n(r,l),t.expirationTime===Vi){i=0;do{if(t.expirationTime=0,!(25>i))throw Error(a(301));i+=1,ji=Qi=null,t.updateQueue=null,Ai.current=ya,e=n(r,l)}while(t.expirationTime===Vi)}if(Ai.current=ha,t=null!==Qi&&null!==Qi.next,Vi=0,ji=Qi=Wi=null,$i=!1,t)throw Error(a(300));return e}function qi(){var e={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return null===ji?Wi.memoizedState=ji=e:ji=ji.next=e,ji}function Yi(){if(null===Qi){var e=Wi.alternate;e=null!==e?e.memoizedState:null}else e=Qi.next;var t=null===ji?Wi.memoizedState:ji.next;if(null!==t)ji=t,Qi=e;else{if(null===e)throw Error(a(310));e={memoizedState:(Qi=e).memoizedState,baseState:Qi.baseState,baseQueue:Qi.baseQueue,queue:Qi.queue,next:null},null===ji?Wi.memoizedState=ji=e:ji=ji.next=e}return ji}function Xi(e,t){return"function"==typeof t?t(e):t}function Gi(e){var t=Yi(),n=t.queue;if(null===n)throw Error(a(311));n.lastRenderedReducer=e;var r=Qi,l=r.baseQueue,i=n.pending;if(null!==i){if(null!==l){var o=l.next;l.next=i.next,i.next=o}r.baseQueue=l=i,n.pending=null}if(null!==l){l=l.next,r=r.baseState;var u=o=i=null,c=l;do{var s=c.expirationTime;if(s<Vi){var f={expirationTime:c.expirationTime,suspenseConfig:c.suspenseConfig,action:c.action,eagerReducer:c.eagerReducer,eagerState:c.eagerState,next:null};null===u?(o=u=f,i=r):u=u.next=f,s>Wi.expirationTime&&(Wi.expirationTime=s,au(s))}else null!==u&&(u=u.next={expirationTime:1073741823,suspenseConfig:c.suspenseConfig,action:c.action,eagerReducer:c.eagerReducer,eagerState:c.eagerState,next:null}),iu(s,c.suspenseConfig),r=c.eagerReducer===e?c.eagerState:e(r,c.action);c=c.next}while(null!==c&&c!==l);null===u?i=r:u.next=o,Lr(r,t.memoizedState)||(Na=!0),t.memoizedState=r,t.baseState=i,t.baseQueue=u,n.lastRenderedState=r}return[t.memoizedState,n.dispatch]}function Ji(e){var t=Yi(),n=t.queue;if(null===n)throw Error(a(311));n.lastRenderedReducer=e;var r=n.dispatch,l=n.pending,i=t.memoizedState;if(null!==l){n.pending=null;var o=l=l.next;do{i=e(i,o.action),o=o.next}while(o!==l);Lr(i,t.memoizedState)||(Na=!0),t.memoizedState=i,null===t.baseQueue&&(t.baseState=i),n.lastRenderedState=i}return[i,r]}function Zi(e){var t=qi();return"function"==typeof e&&(e=e()),t.memoizedState=t.baseState=e,e=(e=t.queue={pending:null,dispatch:null,lastRenderedReducer:Xi,lastRenderedState:e}).dispatch=ma.bind(null,Wi,e),[t.memoizedState,e]}function ea(e,t,n,r){return e={tag:e,create:t,destroy:n,deps:r,next:null},null===(t=Wi.updateQueue)?(t={lastEffect:null},Wi.updateQueue=t,t.lastEffect=e.next=e):null===(n=t.lastEffect)?t.lastEffect=e.next=e:(r=n.next,n.next=e,e.next=r,t.lastEffect=e),e}function ta(){return Yi().memoizedState}function na(e,t,n,r){var l=qi();Wi.effectTag|=e,l.memoizedState=ea(1|t,n,void 0,void 0===r?null:r)}function ra(e,t,n,r){var l=Yi();r=void 0===r?null:r;var i=void 0;if(null!==Qi){var a=Qi.memoizedState;if(i=a.destroy,null!==r&&Hi(r,a.deps))return void ea(t,n,i,r)}Wi.effectTag|=e,l.memoizedState=ea(1|t,n,i,r)}function la(e,t){return na(516,4,e,t)}function ia(e,t){return ra(516,4,e,t)}function aa(e,t){return ra(4,2,e,t)}function oa(e,t){return"function"==typeof t?(e=e(),t(e),function(){t(null)}):null!=t?(e=e(),t.current=e,function(){t.current=null}):void 0}function ua(e,t,n){return n=null!=n?n.concat([e]):null,ra(4,2,oa.bind(null,t,e),n)}function ca(){}function sa(e,t){return qi().memoizedState=[e,void 0===t?null:t],e}function fa(e,t){var n=Yi();t=void 0===t?null:t;var r=n.memoizedState;return null!==r&&null!==t&&Hi(t,r[1])?r[0]:(n.memoizedState=[e,t],e)}function da(e,t){var n=Yi();t=void 0===t?null:t;var r=n.memoizedState;return null!==r&&null!==t&&Hi(t,r[1])?r[0]:(e=e(),n.memoizedState=[e,t],e)}function pa(e,t,n){var r=Vl();Ql(98>r?98:r,(function(){e(!0)})),Ql(97<r?97:r,(function(){var r=Ui.suspense;Ui.suspense=void 0===t?null:t;try{e(!1),n()}finally{Ui.suspense=r}}))}function ma(e,t,n){var r=Ho(),l=di.suspense;l={expirationTime:r=Ko(r,e,l),suspenseConfig:l,action:n,eagerReducer:null,eagerState:null,next:null};var i=t.pending;if(null===i?l.next=l:(l.next=i.next,i.next=l),t.pending=l,i=e.alternate,e===Wi||null!==i&&i===Wi)$i=!0,l.expirationTime=Vi,Wi.expirationTime=Vi;else{if(0===e.expirationTime&&(null===i||0===i.expirationTime)&&null!==(i=t.lastRenderedReducer))try{var a=t.lastRenderedState,o=i(a,n);if(l.eagerReducer=i,l.eagerState=o,Lr(o,a))return}catch(u){}qo(e,r)}}var ha={readContext:ri,useCallback:Bi,useContext:Bi,useEffect:Bi,useImperativeHandle:Bi,useLayoutEffect:Bi,useMemo:Bi,useReducer:Bi,useRef:Bi,useState:Bi,useDebugValue:Bi,useResponder:Bi,useDeferredValue:Bi,useTransition:Bi},va={readContext:ri,useCallback:sa,useContext:ri,useEffect:la,useImperativeHandle:function(e,t,n){return n=null!=n?n.concat([e]):null,na(4,2,oa.bind(null,t,e),n)},useLayoutEffect:function(e,t){return na(4,2,e,t)},useMemo:function(e,t){var n=qi();return t=void 0===t?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=qi();return t=void 0!==n?n(t):t,r.memoizedState=r.baseState=t,e=(e=r.queue={pending:null,dispatch:null,lastRenderedReducer:e,lastRenderedState:t}).dispatch=ma.bind(null,Wi,e),[r.memoizedState,e]},useRef:function(e){return e={current:e},qi().memoizedState=e},useState:Zi,useDebugValue:ca,useResponder:Li,useDeferredValue:function(e,t){var n=Zi(e),r=n[0],l=n[1];return la((function(){var n=Ui.suspense;Ui.suspense=void 0===t?null:t;try{l(e)}finally{Ui.suspense=n}}),[e,t]),r},useTransition:function(e){var t=Zi(!1),n=t[0];return t=t[1],[sa(pa.bind(null,t,e),[t,e]),n]}},ga={readContext:ri,useCallback:fa,useContext:ri,useEffect:ia,useImperativeHandle:ua,useLayoutEffect:aa,useMemo:da,useReducer:Gi,useRef:ta,useState:function(){return Gi(Xi)},useDebugValue:ca,useResponder:Li,useDeferredValue:function(e,t){var n=Gi(Xi),r=n[0],l=n[1];return ia((function(){var n=Ui.suspense;Ui.suspense=void 0===t?null:t;try{l(e)}finally{Ui.suspense=n}}),[e,t]),r},useTransition:function(e){var t=Gi(Xi),n=t[0];return t=t[1],[fa(pa.bind(null,t,e),[t,e]),n]}},ya={readContext:ri,useCallback:fa,useContext:ri,useEffect:ia,useImperativeHandle:ua,useLayoutEffect:aa,useMemo:da,useReducer:Ji,useRef:ta,useState:function(){return Ji(Xi)},useDebugValue:ca,useResponder:Li,useDeferredValue:function(e,t){var n=Ji(Xi),r=n[0],l=n[1];return ia((function(){var n=Ui.suspense;Ui.suspense=void 0===t?null:t;try{l(e)}finally{Ui.suspense=n}}),[e,t]),r},useTransition:function(e){var t=Ji(Xi),n=t[0];return t=t[1],[fa(pa.bind(null,t,e),[t,e]),n]}},ba=null,wa=null,ka=!1;function xa(e,t){var n=Eu(5,null,null,0);n.elementType="DELETED",n.type="DELETED",n.stateNode=t,n.return=e,n.effectTag=8,null!==e.lastEffect?(e.lastEffect.nextEffect=n,e.lastEffect=n):e.firstEffect=e.lastEffect=n}function Ta(e,t){switch(e.tag){case 5:var n=e.type;return null!==(t=1!==t.nodeType||n.toLowerCase()!==t.nodeName.toLowerCase()?null:t)&&(e.stateNode=t,!0);case 6:return null!==(t=""===e.pendingProps||3!==t.nodeType?null:t)&&(e.stateNode=t,!0);case 13:default:return!1}}function Ea(e){if(ka){var t=wa;if(t){var n=t;if(!Ta(e,t)){if(!(t=kn(n.nextSibling))||!Ta(e,t))return e.effectTag=-1025&e.effectTag|2,ka=!1,void(ba=e);xa(ba,n)}ba=e,wa=kn(t.firstChild)}else e.effectTag=-1025&e.effectTag|2,ka=!1,ba=e}}function Sa(e){for(e=e.return;null!==e&&5!==e.tag&&3!==e.tag&&13!==e.tag;)e=e.return;ba=e}function Ca(e){if(e!==ba)return!1;if(!ka)return Sa(e),ka=!0,!1;var t=e.type;if(5!==e.tag||"head"!==t&&"body"!==t&&!yn(t,e.memoizedProps))for(t=wa;t;)xa(e,t),t=kn(t.nextSibling);if(Sa(e),13===e.tag){if(!(e=null!==(e=e.memoizedState)?e.dehydrated:null))throw Error(a(317));e:{for(e=e.nextSibling,t=0;e;){if(8===e.nodeType){var n=e.data;if("/$"===n){if(0===t){wa=kn(e.nextSibling);break e}t--}else"$"!==n&&"$!"!==n&&"$?"!==n||t++}e=e.nextSibling}wa=null}}else wa=ba?kn(e.stateNode.nextSibling):null;return!0}function _a(){wa=ba=null,ka=!1}var Pa=X.ReactCurrentOwner,Na=!1;function za(e,t,n,r){t.child=null===e?Si(t,null,n,r):Ei(t,e.child,n,r)}function Oa(e,t,n,r,l){n=n.render;var i=t.ref;return ni(t,l),r=Ki(e,t,n,r,i,l),null===e||Na?(t.effectTag|=1,za(e,t,r,l),t.child):(t.updateQueue=e.updateQueue,t.effectTag&=-517,e.expirationTime<=l&&(e.expirationTime=0),Ka(e,t,l))}function Ra(e,t,n,r,l,i){if(null===e){var a=n.type;return"function"!=typeof a||Su(a)||void 0!==a.defaultProps||null!==n.compare||void 0!==n.defaultProps?((e=_u(n.type,null,r,null,t.mode,i)).ref=t.ref,e.return=t,t.child=e):(t.tag=15,t.type=a,Ia(e,t,a,r,l,i))}return a=e.child,l<i&&(l=a.memoizedProps,(n=null!==(n=n.compare)?n:Ur)(l,r)&&e.ref===t.ref)?Ka(e,t,i):(t.effectTag|=1,(e=Cu(a,r)).ref=t.ref,e.return=t,t.child=e)}function Ia(e,t,n,r,l,i){return null!==e&&Ur(e.memoizedProps,r)&&e.ref===t.ref&&(Na=!1,l<i)?(t.expirationTime=e.expirationTime,Ka(e,t,i)):Fa(e,t,n,r,i)}function Ma(e,t){var n=t.ref;(null===e&&null!==n||null!==e&&e.ref!==n)&&(t.effectTag|=128)}function Fa(e,t,n,r,l){var i=hl(n)?pl:fl.current;return i=ml(t,i),ni(t,l),n=Ki(e,t,n,r,i,l),null===e||Na?(t.effectTag|=1,za(e,t,n,l),t.child):(t.updateQueue=e.updateQueue,t.effectTag&=-517,e.expirationTime<=l&&(e.expirationTime=0),Ka(e,t,l))}function Da(e,t,n,r,l){if(hl(n)){var i=!0;bl(t)}else i=!1;if(ni(t,l),null===t.stateNode)null!==e&&(e.alternate=null,t.alternate=null,t.effectTag|=2),gi(t,n,r),bi(t,n,r,l),r=!0;else if(null===e){var a=t.stateNode,o=t.memoizedProps;a.props=o;var u=a.context,c=n.contextType;"object"==typeof c&&null!==c?c=ri(c):c=ml(t,c=hl(n)?pl:fl.current);var s=n.getDerivedStateFromProps,f="function"==typeof s||"function"==typeof a.getSnapshotBeforeUpdate;f||"function"!=typeof a.UNSAFE_componentWillReceiveProps&&"function"!=typeof a.componentWillReceiveProps||(o!==r||u!==c)&&yi(t,a,r,c),li=!1;var d=t.memoizedState;a.state=d,si(t,r,a,l),u=t.memoizedState,o!==r||d!==u||dl.current||li?("function"==typeof s&&(mi(t,n,s,r),u=t.memoizedState),(o=li||vi(t,n,o,r,d,u,c))?(f||"function"!=typeof a.UNSAFE_componentWillMount&&"function"!=typeof a.componentWillMount||("function"==typeof a.componentWillMount&&a.componentWillMount(),"function"==typeof a.UNSAFE_componentWillMount&&a.UNSAFE_componentWillMount()),"function"==typeof a.componentDidMount&&(t.effectTag|=4)):("function"==typeof a.componentDidMount&&(t.effectTag|=4),t.memoizedProps=r,t.memoizedState=u),a.props=r,a.state=u,a.context=c,r=o):("function"==typeof a.componentDidMount&&(t.effectTag|=4),r=!1)}else a=t.stateNode,ai(e,t),o=t.memoizedProps,a.props=t.type===t.elementType?o:ql(t.type,o),u=a.context,"object"==typeof(c=n.contextType)&&null!==c?c=ri(c):c=ml(t,c=hl(n)?pl:fl.current),(f="function"==typeof(s=n.getDerivedStateFromProps)||"function"==typeof a.getSnapshotBeforeUpdate)||"function"!=typeof a.UNSAFE_componentWillReceiveProps&&"function"!=typeof a.componentWillReceiveProps||(o!==r||u!==c)&&yi(t,a,r,c),li=!1,u=t.memoizedState,a.state=u,si(t,r,a,l),d=t.memoizedState,o!==r||u!==d||dl.current||li?("function"==typeof s&&(mi(t,n,s,r),d=t.memoizedState),(s=li||vi(t,n,o,r,u,d,c))?(f||"function"!=typeof a.UNSAFE_componentWillUpdate&&"function"!=typeof a.componentWillUpdate||("function"==typeof a.componentWillUpdate&&a.componentWillUpdate(r,d,c),"function"==typeof a.UNSAFE_componentWillUpdate&&a.UNSAFE_componentWillUpdate(r,d,c)),"function"==typeof a.componentDidUpdate&&(t.effectTag|=4),"function"==typeof a.getSnapshotBeforeUpdate&&(t.effectTag|=256)):("function"!=typeof a.componentDidUpdate||o===e.memoizedProps&&u===e.memoizedState||(t.effectTag|=4),"function"!=typeof a.getSnapshotBeforeUpdate||o===e.memoizedProps&&u===e.memoizedState||(t.effectTag|=256),t.memoizedProps=r,t.memoizedState=d),a.props=r,a.state=d,a.context=c,r=s):("function"!=typeof a.componentDidUpdate||o===e.memoizedProps&&u===e.memoizedState||(t.effectTag|=4),"function"!=typeof a.getSnapshotBeforeUpdate||o===e.memoizedProps&&u===e.memoizedState||(t.effectTag|=256),r=!1);return La(e,t,n,r,i,l)}function La(e,t,n,r,l,i){Ma(e,t);var a=0!=(64&t.effectTag);if(!r&&!a)return l&&wl(t,n,!1),Ka(e,t,i);r=t.stateNode,Pa.current=t;var o=a&&"function"!=typeof n.getDerivedStateFromError?null:r.render();return t.effectTag|=1,null!==e&&a?(t.child=Ei(t,e.child,null,i),t.child=Ei(t,null,o,i)):za(e,t,o,i),t.memoizedState=r.state,l&&wl(t,n,!0),t.child}function Aa(e){var t=e.stateNode;t.pendingContext?gl(0,t.pendingContext,t.pendingContext!==t.context):t.context&&gl(0,t.context,!1),Oi(e,t.containerInfo)}var Ua,Va,Wa,Qa={dehydrated:null,retryTime:0};function ja(e,t,n){var r,l=t.mode,i=t.pendingProps,a=Fi.current,o=!1;if((r=0!=(64&t.effectTag))||(r=0!=(2&a)&&(null===e||null!==e.memoizedState)),r?(o=!0,t.effectTag&=-65):null!==e&&null===e.memoizedState||void 0===i.fallback||!0===i.unstable_avoidThisFallback||(a|=1),cl(Fi,1&a),null===e){if(void 0!==i.fallback&&Ea(t),o){if(o=i.fallback,(i=Pu(null,l,0,null)).return=t,0==(2&t.mode))for(e=null!==t.memoizedState?t.child.child:t.child,i.child=e;null!==e;)e.return=i,e=e.sibling;return(n=Pu(o,l,n,null)).return=t,i.sibling=n,t.memoizedState=Qa,t.child=i,n}return l=i.children,t.memoizedState=null,t.child=Si(t,null,l,n)}if(null!==e.memoizedState){if(l=(e=e.child).sibling,o){if(i=i.fallback,(n=Cu(e,e.pendingProps)).return=t,0==(2&t.mode)&&(o=null!==t.memoizedState?t.child.child:t.child)!==e.child)for(n.child=o;null!==o;)o.return=n,o=o.sibling;return(l=Cu(l,i)).return=t,n.sibling=l,n.childExpirationTime=0,t.memoizedState=Qa,t.child=n,l}return n=Ei(t,e.child,i.children,n),t.memoizedState=null,t.child=n}if(e=e.child,o){if(o=i.fallback,(i=Pu(null,l,0,null)).return=t,i.child=e,null!==e&&(e.return=i),0==(2&t.mode))for(e=null!==t.memoizedState?t.child.child:t.child,i.child=e;null!==e;)e.return=i,e=e.sibling;return(n=Pu(o,l,n,null)).return=t,i.sibling=n,n.effectTag|=2,i.childExpirationTime=0,t.memoizedState=Qa,t.child=i,n}return t.memoizedState=null,t.child=Ei(t,e,i.children,n)}function $a(e,t){e.expirationTime<t&&(e.expirationTime=t);var n=e.alternate;null!==n&&n.expirationTime<t&&(n.expirationTime=t),ti(e.return,t)}function Ba(e,t,n,r,l,i){var a=e.memoizedState;null===a?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:r,tail:n,tailExpiration:0,tailMode:l,lastEffect:i}:(a.isBackwards=t,a.rendering=null,a.renderingStartTime=0,a.last=r,a.tail=n,a.tailExpiration=0,a.tailMode=l,a.lastEffect=i)}function Ha(e,t,n){var r=t.pendingProps,l=r.revealOrder,i=r.tail;if(za(e,t,r.children,n),0!=(2&(r=Fi.current)))r=1&r|2,t.effectTag|=64;else{if(null!==e&&0!=(64&e.effectTag))e:for(e=t.child;null!==e;){if(13===e.tag)null!==e.memoizedState&&$a(e,n);else if(19===e.tag)$a(e,n);else if(null!==e.child){e.child.return=e,e=e.child;continue}if(e===t)break e;for(;null===e.sibling;){if(null===e.return||e.return===t)break e;e=e.return}e.sibling.return=e.return,e=e.sibling}r&=1}if(cl(Fi,r),0==(2&t.mode))t.memoizedState=null;else switch(l){case"forwards":for(n=t.child,l=null;null!==n;)null!==(e=n.alternate)&&null===Di(e)&&(l=n),n=n.sibling;null===(n=l)?(l=t.child,t.child=null):(l=n.sibling,n.sibling=null),Ba(t,!1,l,n,i,t.lastEffect);break;case"backwards":for(n=null,l=t.child,t.child=null;null!==l;){if(null!==(e=l.alternate)&&null===Di(e)){t.child=l;break}e=l.sibling,l.sibling=n,n=l,l=e}Ba(t,!0,n,null,i,t.lastEffect);break;case"together":Ba(t,!1,null,null,void 0,t.lastEffect);break;default:t.memoizedState=null}return t.child}function Ka(e,t,n){null!==e&&(t.dependencies=e.dependencies);var r=t.expirationTime;if(0!==r&&au(r),t.childExpirationTime<n)return null;if(null!==e&&t.child!==e.child)throw Error(a(153));if(null!==t.child){for(n=Cu(e=t.child,e.pendingProps),t.child=n,n.return=t;null!==e.sibling;)e=e.sibling,(n=n.sibling=Cu(e,e.pendingProps)).return=t;n.sibling=null}return t.child}function qa(e,t){switch(e.tailMode){case"hidden":t=e.tail;for(var n=null;null!==t;)null!==t.alternate&&(n=t),t=t.sibling;null===n?e.tail=null:n.sibling=null;break;case"collapsed":n=e.tail;for(var r=null;null!==n;)null!==n.alternate&&(r=n),n=n.sibling;null===r?t||null===e.tail?e.tail=null:e.tail.sibling=null:r.sibling=null}}function Ya(e,t,n){var r=t.pendingProps;switch(t.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return null;case 1:return hl(t.type)&&vl(),null;case 3:return Ri(),ul(dl),ul(fl),(n=t.stateNode).pendingContext&&(n.context=n.pendingContext,n.pendingContext=null),null!==e&&null!==e.child||!Ca(t)||(t.effectTag|=4),null;case 5:Mi(t),n=zi(Ni.current);var i=t.type;if(null!==e&&null!=t.stateNode)Va(e,t,i,r,n),e.ref!==t.ref&&(t.effectTag|=128);else{if(!r){if(null===t.stateNode)throw Error(a(166));return null}if(e=zi(_i.current),Ca(t)){r=t.stateNode,i=t.type;var o=t.memoizedProps;switch(r[En]=t,r[Sn]=o,i){case"iframe":case"object":case"embed":Kt("load",r);break;case"video":case"audio":for(e=0;e<Xe.length;e++)Kt(Xe[e],r);break;case"source":Kt("error",r);break;case"img":case"image":case"link":Kt("error",r),Kt("load",r);break;case"form":Kt("reset",r),Kt("submit",r);break;case"details":Kt("toggle",r);break;case"input":Te(r,o),Kt("invalid",r),un(n,"onChange");break;case"select":r._wrapperState={wasMultiple:!!o.multiple},Kt("invalid",r),un(n,"onChange");break;case"textarea":Oe(r,o),Kt("invalid",r),un(n,"onChange")}for(var u in ln(i,o),e=null,o)if(o.hasOwnProperty(u)){var c=o[u];"children"===u?"string"==typeof c?r.textContent!==c&&(e=["children",c]):"number"==typeof c&&r.textContent!==""+c&&(e=["children",""+c]):E.hasOwnProperty(u)&&null!=c&&un(n,u)}switch(i){case"input":we(r),Ce(r,o,!0);break;case"textarea":we(r),Ie(r);break;case"select":case"option":break;default:"function"==typeof o.onClick&&(r.onclick=cn)}n=e,t.updateQueue=n,null!==n&&(t.effectTag|=4)}else{switch(u=9===n.nodeType?n:n.ownerDocument,e===on&&(e=De(i)),e===on?"script"===i?((e=u.createElement("div")).innerHTML="<script><\/script>",e=e.removeChild(e.firstChild)):"string"==typeof r.is?e=u.createElement(i,{is:r.is}):(e=u.createElement(i),"select"===i&&(u=e,r.multiple?u.multiple=!0:r.size&&(u.size=r.size))):e=u.createElementNS(e,i),e[En]=t,e[Sn]=r,Ua(e,t),t.stateNode=e,u=an(i,r),i){case"iframe":case"object":case"embed":Kt("load",e),c=r;break;case"video":case"audio":for(c=0;c<Xe.length;c++)Kt(Xe[c],e);c=r;break;case"source":Kt("error",e),c=r;break;case"img":case"image":case"link":Kt("error",e),Kt("load",e),c=r;break;case"form":Kt("reset",e),Kt("submit",e),c=r;break;case"details":Kt("toggle",e),c=r;break;case"input":Te(e,r),c=xe(e,r),Kt("invalid",e),un(n,"onChange");break;case"option":c=Pe(e,r);break;case"select":e._wrapperState={wasMultiple:!!r.multiple},c=l({},r,{value:void 0}),Kt("invalid",e),un(n,"onChange");break;case"textarea":Oe(e,r),c=ze(e,r),Kt("invalid",e),un(n,"onChange");break;default:c=r}ln(i,c);var s=c;for(o in s)if(s.hasOwnProperty(o)){var f=s[o];"style"===o?nn(e,f):"dangerouslySetInnerHTML"===o?null!=(f=f?f.__html:void 0)&&Ue(e,f):"children"===o?"string"==typeof f?("textarea"!==i||""!==f)&&Ve(e,f):"number"==typeof f&&Ve(e,""+f):"suppressContentEditableWarning"!==o&&"suppressHydrationWarning"!==o&&"autoFocus"!==o&&(E.hasOwnProperty(o)?null!=f&&un(n,o):null!=f&&G(e,o,f,u))}switch(i){case"input":we(e),Ce(e,r,!1);break;case"textarea":we(e),Ie(e);break;case"option":null!=r.value&&e.setAttribute("value",""+ye(r.value));break;case"select":e.multiple=!!r.multiple,null!=(n=r.value)?Ne(e,!!r.multiple,n,!1):null!=r.defaultValue&&Ne(e,!!r.multiple,r.defaultValue,!0);break;default:"function"==typeof c.onClick&&(e.onclick=cn)}gn(i,r)&&(t.effectTag|=4)}null!==t.ref&&(t.effectTag|=128)}return null;case 6:if(e&&null!=t.stateNode)Wa(0,t,e.memoizedProps,r);else{if("string"!=typeof r&&null===t.stateNode)throw Error(a(166));n=zi(Ni.current),zi(_i.current),Ca(t)?(n=t.stateNode,r=t.memoizedProps,n[En]=t,n.nodeValue!==r&&(t.effectTag|=4)):((n=(9===n.nodeType?n:n.ownerDocument).createTextNode(r))[En]=t,t.stateNode=n)}return null;case 13:return ul(Fi),r=t.memoizedState,0!=(64&t.effectTag)?(t.expirationTime=n,t):(n=null!==r,r=!1,null===e?void 0!==t.memoizedProps.fallback&&Ca(t):(r=null!==(i=e.memoizedState),n||null===i||null!==(i=e.child.sibling)&&(null!==(o=t.firstEffect)?(t.firstEffect=i,i.nextEffect=o):(t.firstEffect=t.lastEffect=i,i.nextEffect=null),i.effectTag=8)),n&&!r&&0!=(2&t.mode)&&(null===e&&!0!==t.memoizedProps.unstable_avoidThisFallback||0!=(1&Fi.current)?_o===wo&&(_o=ko):(_o!==wo&&_o!==ko||(_o=xo),0!==Ro&&null!==Eo&&(Iu(Eo,Co),Mu(Eo,Ro)))),(n||r)&&(t.effectTag|=4),null);case 4:return Ri(),null;case 10:return ei(t),null;case 17:return hl(t.type)&&vl(),null;case 19:if(ul(Fi),null===(r=t.memoizedState))return null;if(i=0!=(64&t.effectTag),null===(o=r.rendering)){if(i)qa(r,!1);else if(_o!==wo||null!==e&&0!=(64&e.effectTag))for(o=t.child;null!==o;){if(null!==(e=Di(o))){for(t.effectTag|=64,qa(r,!1),null!==(i=e.updateQueue)&&(t.updateQueue=i,t.effectTag|=4),null===r.lastEffect&&(t.firstEffect=null),t.lastEffect=r.lastEffect,r=t.child;null!==r;)o=n,(i=r).effectTag&=2,i.nextEffect=null,i.firstEffect=null,i.lastEffect=null,null===(e=i.alternate)?(i.childExpirationTime=0,i.expirationTime=o,i.child=null,i.memoizedProps=null,i.memoizedState=null,i.updateQueue=null,i.dependencies=null):(i.childExpirationTime=e.childExpirationTime,i.expirationTime=e.expirationTime,i.child=e.child,i.memoizedProps=e.memoizedProps,i.memoizedState=e.memoizedState,i.updateQueue=e.updateQueue,o=e.dependencies,i.dependencies=null===o?null:{expirationTime:o.expirationTime,firstContext:o.firstContext,responders:o.responders}),r=r.sibling;return cl(Fi,1&Fi.current|2),t.child}o=o.sibling}}else{if(!i)if(null!==(e=Di(o))){if(t.effectTag|=64,i=!0,null!==(n=e.updateQueue)&&(t.updateQueue=n,t.effectTag|=4),qa(r,!0),null===r.tail&&"hidden"===r.tailMode&&!o.alternate)return null!==(t=t.lastEffect=r.lastEffect)&&(t.nextEffect=null),null}else 2*Ul()-r.renderingStartTime>r.tailExpiration&&1<n&&(t.effectTag|=64,i=!0,qa(r,!1),t.expirationTime=t.childExpirationTime=n-1);r.isBackwards?(o.sibling=t.child,t.child=o):(null!==(n=r.last)?n.sibling=o:t.child=o,r.last=o)}return null!==r.tail?(0===r.tailExpiration&&(r.tailExpiration=Ul()+500),n=r.tail,r.rendering=n,r.tail=n.sibling,r.lastEffect=t.lastEffect,r.renderingStartTime=Ul(),n.sibling=null,t=Fi.current,cl(Fi,i?1&t|2:1&t),n):null}throw Error(a(156,t.tag))}function Xa(e){switch(e.tag){case 1:hl(e.type)&&vl();var t=e.effectTag;return 4096&t?(e.effectTag=-4097&t|64,e):null;case 3:if(Ri(),ul(dl),ul(fl),0!=(64&(t=e.effectTag)))throw Error(a(285));return e.effectTag=-4097&t|64,e;case 5:return Mi(e),null;case 13:return ul(Fi),4096&(t=e.effectTag)?(e.effectTag=-4097&t|64,e):null;case 19:return ul(Fi),null;case 4:return Ri(),null;case 10:return ei(e),null;default:return null}}function Ga(e,t){return{value:e,source:t,stack:ge(t)}}Ua=function(e,t){for(var n=t.child;null!==n;){if(5===n.tag||6===n.tag)e.appendChild(n.stateNode);else if(4!==n.tag&&null!==n.child){n.child.return=n,n=n.child;continue}if(n===t)break;for(;null===n.sibling;){if(null===n.return||n.return===t)return;n=n.return}n.sibling.return=n.return,n=n.sibling}},Va=function(e,t,n,r,i){var a=e.memoizedProps;if(a!==r){var o,u,c=t.stateNode;switch(zi(_i.current),e=null,n){case"input":a=xe(c,a),r=xe(c,r),e=[];break;case"option":a=Pe(c,a),r=Pe(c,r),e=[];break;case"select":a=l({},a,{value:void 0}),r=l({},r,{value:void 0}),e=[];break;case"textarea":a=ze(c,a),r=ze(c,r),e=[];break;default:"function"!=typeof a.onClick&&"function"==typeof r.onClick&&(c.onclick=cn)}for(o in ln(n,r),n=null,a)if(!r.hasOwnProperty(o)&&a.hasOwnProperty(o)&&null!=a[o])if("style"===o)for(u in c=a[o])c.hasOwnProperty(u)&&(n||(n={}),n[u]="");else"dangerouslySetInnerHTML"!==o&&"children"!==o&&"suppressContentEditableWarning"!==o&&"suppressHydrationWarning"!==o&&"autoFocus"!==o&&(E.hasOwnProperty(o)?e||(e=[]):(e=e||[]).push(o,null));for(o in r){var s=r[o];if(c=null!=a?a[o]:void 0,r.hasOwnProperty(o)&&s!==c&&(null!=s||null!=c))if("style"===o)if(c){for(u in c)!c.hasOwnProperty(u)||s&&s.hasOwnProperty(u)||(n||(n={}),n[u]="");for(u in s)s.hasOwnProperty(u)&&c[u]!==s[u]&&(n||(n={}),n[u]=s[u])}else n||(e||(e=[]),e.push(o,n)),n=s;else"dangerouslySetInnerHTML"===o?(s=s?s.__html:void 0,c=c?c.__html:void 0,null!=s&&c!==s&&(e=e||[]).push(o,s)):"children"===o?c===s||"string"!=typeof s&&"number"!=typeof s||(e=e||[]).push(o,""+s):"suppressContentEditableWarning"!==o&&"suppressHydrationWarning"!==o&&(E.hasOwnProperty(o)?(null!=s&&un(i,o),e||c===s||(e=[])):(e=e||[]).push(o,s))}n&&(e=e||[]).push("style",n),i=e,(t.updateQueue=i)&&(t.effectTag|=4)}},Wa=function(e,t,n,r){n!==r&&(t.effectTag|=4)};var Ja="function"==typeof WeakSet?WeakSet:Set;function Za(e,t){var n=t.source,r=t.stack;null===r&&null!==n&&(r=ge(n)),null!==n&&ve(n.type),t=t.value,null!==e&&1===e.tag&&ve(e.type);try{console.error(t)}catch(l){setTimeout((function(){throw l}))}}function eo(e){var t=e.ref;if(null!==t)if("function"==typeof t)try{t(null)}catch(n){yu(e,n)}else t.current=null}function to(e,t){switch(t.tag){case 0:case 11:case 15:case 22:return;case 1:if(256&t.effectTag&&null!==e){var n=e.memoizedProps,r=e.memoizedState;t=(e=t.stateNode).getSnapshotBeforeUpdate(t.elementType===t.type?n:ql(t.type,n),r),e.__reactInternalSnapshotBeforeUpdate=t}return;case 3:case 5:case 6:case 4:case 17:return}throw Error(a(163))}function no(e,t){if(null!==(t=null!==(t=t.updateQueue)?t.lastEffect:null)){var n=t=t.next;do{if((n.tag&e)===e){var r=n.destroy;n.destroy=void 0,void 0!==r&&r()}n=n.next}while(n!==t)}}function ro(e,t){if(null!==(t=null!==(t=t.updateQueue)?t.lastEffect:null)){var n=t=t.next;do{if((n.tag&e)===e){var r=n.create;n.destroy=r()}n=n.next}while(n!==t)}}function lo(e,t,n){switch(n.tag){case 0:case 11:case 15:case 22:return void ro(3,n);case 1:if(e=n.stateNode,4&n.effectTag)if(null===t)e.componentDidMount();else{var r=n.elementType===n.type?t.memoizedProps:ql(n.type,t.memoizedProps);e.componentDidUpdate(r,t.memoizedState,e.__reactInternalSnapshotBeforeUpdate)}return void(null!==(t=n.updateQueue)&&fi(n,t,e));case 3:if(null!==(t=n.updateQueue)){if(e=null,null!==n.child)switch(n.child.tag){case 5:e=n.child.stateNode;break;case 1:e=n.child.stateNode}fi(n,t,e)}return;case 5:return e=n.stateNode,void(null===t&&4&n.effectTag&&gn(n.type,n.memoizedProps)&&e.focus());case 6:case 4:case 12:return;case 13:return void(null===n.memoizedState&&(n=n.alternate,null!==n&&(n=n.memoizedState,null!==n&&(n=n.dehydrated,null!==n&&Dt(n)))));case 19:case 17:case 20:case 21:return}throw Error(a(163))}function io(e,t,n){switch("function"==typeof xu&&xu(t),t.tag){case 0:case 11:case 14:case 15:case 22:if(null!==(e=t.updateQueue)&&null!==(e=e.lastEffect)){var r=e.next;Ql(97<n?97:n,(function(){var e=r;do{var n=e.destroy;if(void 0!==n){var l=t;try{n()}catch(i){yu(l,i)}}e=e.next}while(e!==r)}))}break;case 1:eo(t),"function"==typeof(n=t.stateNode).componentWillUnmount&&function(e,t){try{t.props=e.memoizedProps,t.state=e.memoizedState,t.componentWillUnmount()}catch(n){yu(e,n)}}(t,n);break;case 5:eo(t);break;case 4:co(e,t,n)}}function ao(e){var t=e.alternate;e.return=null,e.child=null,e.memoizedState=null,e.updateQueue=null,e.dependencies=null,e.alternate=null,e.firstEffect=null,e.lastEffect=null,e.pendingProps=null,e.memoizedProps=null,e.stateNode=null,null!==t&&ao(t)}function oo(e){return 5===e.tag||3===e.tag||4===e.tag}function uo(e){e:{for(var t=e.return;null!==t;){if(oo(t)){var n=t;break e}t=t.return}throw Error(a(160))}switch(t=n.stateNode,n.tag){case 5:var r=!1;break;case 3:case 4:t=t.containerInfo,r=!0;break;default:throw Error(a(161))}16&n.effectTag&&(Ve(t,""),n.effectTag&=-17);e:t:for(n=e;;){for(;null===n.sibling;){if(null===n.return||oo(n.return)){n=null;break e}n=n.return}for(n.sibling.return=n.return,n=n.sibling;5!==n.tag&&6!==n.tag&&18!==n.tag;){if(2&n.effectTag)continue t;if(null===n.child||4===n.tag)continue t;n.child.return=n,n=n.child}if(!(2&n.effectTag)){n=n.stateNode;break e}}r?function e(t,n,r){var l=t.tag,i=5===l||6===l;if(i)t=i?t.stateNode:t.stateNode.instance,n?8===r.nodeType?r.parentNode.insertBefore(t,n):r.insertBefore(t,n):(8===r.nodeType?(n=r.parentNode).insertBefore(t,r):(n=r).appendChild(t),null!==(r=r._reactRootContainer)&&void 0!==r||null!==n.onclick||(n.onclick=cn));else if(4!==l&&null!==(t=t.child))for(e(t,n,r),t=t.sibling;null!==t;)e(t,n,r),t=t.sibling}(e,n,t):function e(t,n,r){var l=t.tag,i=5===l||6===l;if(i)t=i?t.stateNode:t.stateNode.instance,n?r.insertBefore(t,n):r.appendChild(t);else if(4!==l&&null!==(t=t.child))for(e(t,n,r),t=t.sibling;null!==t;)e(t,n,r),t=t.sibling}(e,n,t)}function co(e,t,n){for(var r,l,i=t,o=!1;;){if(!o){o=i.return;e:for(;;){if(null===o)throw Error(a(160));switch(r=o.stateNode,o.tag){case 5:l=!1;break e;case 3:case 4:r=r.containerInfo,l=!0;break e}o=o.return}o=!0}if(5===i.tag||6===i.tag){e:for(var u=e,c=i,s=n,f=c;;)if(io(u,f,s),null!==f.child&&4!==f.tag)f.child.return=f,f=f.child;else{if(f===c)break e;for(;null===f.sibling;){if(null===f.return||f.return===c)break e;f=f.return}f.sibling.return=f.return,f=f.sibling}l?(u=r,c=i.stateNode,8===u.nodeType?u.parentNode.removeChild(c):u.removeChild(c)):r.removeChild(i.stateNode)}else if(4===i.tag){if(null!==i.child){r=i.stateNode.containerInfo,l=!0,i.child.return=i,i=i.child;continue}}else if(io(e,i,n),null!==i.child){i.child.return=i,i=i.child;continue}if(i===t)break;for(;null===i.sibling;){if(null===i.return||i.return===t)return;4===(i=i.return).tag&&(o=!1)}i.sibling.return=i.return,i=i.sibling}}function so(e,t){switch(t.tag){case 0:case 11:case 14:case 15:case 22:return void no(3,t);case 1:return;case 5:var n=t.stateNode;if(null!=n){var r=t.memoizedProps,l=null!==e?e.memoizedProps:r;e=t.type;var i=t.updateQueue;if(t.updateQueue=null,null!==i){for(n[Sn]=r,"input"===e&&"radio"===r.type&&null!=r.name&&Ee(n,r),an(e,l),t=an(e,r),l=0;l<i.length;l+=2){var o=i[l],u=i[l+1];"style"===o?nn(n,u):"dangerouslySetInnerHTML"===o?Ue(n,u):"children"===o?Ve(n,u):G(n,o,u,t)}switch(e){case"input":Se(n,r);break;case"textarea":Re(n,r);break;case"select":t=n._wrapperState.wasMultiple,n._wrapperState.wasMultiple=!!r.multiple,null!=(e=r.value)?Ne(n,!!r.multiple,e,!1):t!==!!r.multiple&&(null!=r.defaultValue?Ne(n,!!r.multiple,r.defaultValue,!0):Ne(n,!!r.multiple,r.multiple?[]:"",!1))}}}return;case 6:if(null===t.stateNode)throw Error(a(162));return void(t.stateNode.nodeValue=t.memoizedProps);case 3:return void((t=t.stateNode).hydrate&&(t.hydrate=!1,Dt(t.containerInfo)));case 12:return;case 13:if(n=t,null===t.memoizedState?r=!1:(r=!0,n=t.child,Mo=Ul()),null!==n)e:for(e=n;;){if(5===e.tag)i=e.stateNode,r?"function"==typeof(i=i.style).setProperty?i.setProperty("display","none","important"):i.display="none":(i=e.stateNode,l=null!=(l=e.memoizedProps.style)&&l.hasOwnProperty("display")?l.display:null,i.style.display=tn("display",l));else if(6===e.tag)e.stateNode.nodeValue=r?"":e.memoizedProps;else{if(13===e.tag&&null!==e.memoizedState&&null===e.memoizedState.dehydrated){(i=e.child.sibling).return=e,e=i;continue}if(null!==e.child){e.child.return=e,e=e.child;continue}}if(e===n)break;for(;null===e.sibling;){if(null===e.return||e.return===n)break e;e=e.return}e.sibling.return=e.return,e=e.sibling}return void fo(t);case 19:return void fo(t);case 17:return}throw Error(a(163))}function fo(e){var t=e.updateQueue;if(null!==t){e.updateQueue=null;var n=e.stateNode;null===n&&(n=e.stateNode=new Ja),t.forEach((function(t){var r=wu.bind(null,e,t);n.has(t)||(n.add(t),t.then(r,r))}))}}var po="function"==typeof WeakMap?WeakMap:Map;function mo(e,t,n){(n=oi(n,null)).tag=3,n.payload={element:null};var r=t.value;return n.callback=function(){Do||(Do=!0,Lo=r),Za(e,t)},n}function ho(e,t,n){(n=oi(n,null)).tag=3;var r=e.type.getDerivedStateFromError;if("function"==typeof r){var l=t.value;n.payload=function(){return Za(e,t),r(l)}}var i=e.stateNode;return null!==i&&"function"==typeof i.componentDidCatch&&(n.callback=function(){"function"!=typeof r&&(null===Ao?Ao=new Set([this]):Ao.add(this),Za(e,t));var n=t.stack;this.componentDidCatch(t.value,{componentStack:null!==n?n:""})}),n}var vo,go=Math.ceil,yo=X.ReactCurrentDispatcher,bo=X.ReactCurrentOwner,wo=0,ko=3,xo=4,To=0,Eo=null,So=null,Co=0,_o=wo,Po=null,No=1073741823,zo=1073741823,Oo=null,Ro=0,Io=!1,Mo=0,Fo=null,Do=!1,Lo=null,Ao=null,Uo=!1,Vo=null,Wo=90,Qo=null,jo=0,$o=null,Bo=0;function Ho(){return 0!=(48&To)?1073741821-(Ul()/10|0):0!==Bo?Bo:Bo=1073741821-(Ul()/10|0)}function Ko(e,t,n){if(0==(2&(t=t.mode)))return 1073741823;var r=Vl();if(0==(4&t))return 99===r?1073741823:1073741822;if(0!=(16&To))return Co;if(null!==n)e=Kl(e,0|n.timeoutMs||5e3,250);else switch(r){case 99:e=1073741823;break;case 98:e=Kl(e,150,100);break;case 97:case 96:e=Kl(e,5e3,250);break;case 95:e=2;break;default:throw Error(a(326))}return null!==Eo&&e===Co&&--e,e}function qo(e,t){if(50<jo)throw jo=0,$o=null,Error(a(185));if(null!==(e=Yo(e,t))){var n=Vl();1073741823===t?0!=(8&To)&&0==(48&To)?Zo(e):(Go(e),0===To&&Bl()):Go(e),0==(4&To)||98!==n&&99!==n||(null===Qo?Qo=new Map([[e,t]]):(void 0===(n=Qo.get(e))||n>t)&&Qo.set(e,t))}}function Yo(e,t){e.expirationTime<t&&(e.expirationTime=t);var n=e.alternate;null!==n&&n.expirationTime<t&&(n.expirationTime=t);var r=e.return,l=null;if(null===r&&3===e.tag)l=e.stateNode;else for(;null!==r;){if(n=r.alternate,r.childExpirationTime<t&&(r.childExpirationTime=t),null!==n&&n.childExpirationTime<t&&(n.childExpirationTime=t),null===r.return&&3===r.tag){l=r.stateNode;break}r=r.return}return null!==l&&(Eo===l&&(au(t),_o===xo&&Iu(l,Co)),Mu(l,t)),l}function Xo(e){var t=e.lastExpiredTime;if(0!==t)return t;if(!Ru(e,t=e.firstPendingTime))return t;var n=e.lastPingedTime;return 2>=(e=n>(e=e.nextKnownPendingLevel)?n:e)&&t!==e?0:e}function Go(e){if(0!==e.lastExpiredTime)e.callbackExpirationTime=1073741823,e.callbackPriority=99,e.callbackNode=$l(Zo.bind(null,e));else{var t=Xo(e),n=e.callbackNode;if(0===t)null!==n&&(e.callbackNode=null,e.callbackExpirationTime=0,e.callbackPriority=90);else{var r=Ho();if(1073741823===t?r=99:1===t||2===t?r=95:r=0>=(r=10*(1073741821-t)-10*(1073741821-r))?99:250>=r?98:5250>=r?97:95,null!==n){var l=e.callbackPriority;if(e.callbackExpirationTime===t&&l>=r)return;n!==Rl&&Tl(n)}e.callbackExpirationTime=t,e.callbackPriority=r,t=1073741823===t?$l(Zo.bind(null,e)):jl(r,Jo.bind(null,e),{timeout:10*(1073741821-t)-Ul()}),e.callbackNode=t}}}function Jo(e,t){if(Bo=0,t)return Fu(e,t=Ho()),Go(e),null;var n=Xo(e);if(0!==n){if(t=e.callbackNode,0!=(48&To))throw Error(a(327));if(hu(),e===Eo&&n===Co||nu(e,n),null!==So){var r=To;To|=16;for(var l=lu();;)try{uu();break}catch(u){ru(e,u)}if(Zl(),To=r,yo.current=l,1===_o)throw t=Po,nu(e,n),Iu(e,n),Go(e),t;if(null===So)switch(l=e.finishedWork=e.current.alternate,e.finishedExpirationTime=n,r=_o,Eo=null,r){case wo:case 1:throw Error(a(345));case 2:Fu(e,2<n?2:n);break;case ko:if(Iu(e,n),n===(r=e.lastSuspendedTime)&&(e.nextKnownPendingLevel=fu(l)),1073741823===No&&10<(l=Mo+500-Ul())){if(Io){var i=e.lastPingedTime;if(0===i||i>=n){e.lastPingedTime=n,nu(e,n);break}}if(0!==(i=Xo(e))&&i!==n)break;if(0!==r&&r!==n){e.lastPingedTime=r;break}e.timeoutHandle=bn(du.bind(null,e),l);break}du(e);break;case xo:if(Iu(e,n),n===(r=e.lastSuspendedTime)&&(e.nextKnownPendingLevel=fu(l)),Io&&(0===(l=e.lastPingedTime)||l>=n)){e.lastPingedTime=n,nu(e,n);break}if(0!==(l=Xo(e))&&l!==n)break;if(0!==r&&r!==n){e.lastPingedTime=r;break}if(1073741823!==zo?r=10*(1073741821-zo)-Ul():1073741823===No?r=0:(r=10*(1073741821-No)-5e3,0>(r=(l=Ul())-r)&&(r=0),(n=10*(1073741821-n)-l)<(r=(120>r?120:480>r?480:1080>r?1080:1920>r?1920:3e3>r?3e3:4320>r?4320:1960*go(r/1960))-r)&&(r=n)),10<r){e.timeoutHandle=bn(du.bind(null,e),r);break}du(e);break;case 5:if(1073741823!==No&&null!==Oo){i=No;var o=Oo;if(0>=(r=0|o.busyMinDurationMs)?r=0:(l=0|o.busyDelayMs,r=(i=Ul()-(10*(1073741821-i)-(0|o.timeoutMs||5e3)))<=l?0:l+r-i),10<r){Iu(e,n),e.timeoutHandle=bn(du.bind(null,e),r);break}}du(e);break;default:throw Error(a(329))}if(Go(e),e.callbackNode===t)return Jo.bind(null,e)}}return null}function Zo(e){var t=e.lastExpiredTime;if(t=0!==t?t:1073741823,0!=(48&To))throw Error(a(327));if(hu(),e===Eo&&t===Co||nu(e,t),null!==So){var n=To;To|=16;for(var r=lu();;)try{ou();break}catch(l){ru(e,l)}if(Zl(),To=n,yo.current=r,1===_o)throw n=Po,nu(e,t),Iu(e,t),Go(e),n;if(null!==So)throw Error(a(261));e.finishedWork=e.current.alternate,e.finishedExpirationTime=t,Eo=null,du(e),Go(e)}return null}function eu(e,t){var n=To;To|=1;try{return e(t)}finally{0===(To=n)&&Bl()}}function tu(e,t){var n=To;To&=-2,To|=8;try{return e(t)}finally{0===(To=n)&&Bl()}}function nu(e,t){e.finishedWork=null,e.finishedExpirationTime=0;var n=e.timeoutHandle;if(-1!==n&&(e.timeoutHandle=-1,wn(n)),null!==So)for(n=So.return;null!==n;){var r=n;switch(r.tag){case 1:null!=(r=r.type.childContextTypes)&&vl();break;case 3:Ri(),ul(dl),ul(fl);break;case 5:Mi(r);break;case 4:Ri();break;case 13:case 19:ul(Fi);break;case 10:ei(r)}n=n.return}Eo=e,So=Cu(e.current,null),Co=t,_o=wo,Po=null,zo=No=1073741823,Oo=null,Ro=0,Io=!1}function ru(e,t){for(;;){try{if(Zl(),Ai.current=ha,$i)for(var n=Wi.memoizedState;null!==n;){var r=n.queue;null!==r&&(r.pending=null),n=n.next}if(Vi=0,ji=Qi=Wi=null,$i=!1,null===So||null===So.return)return _o=1,Po=t,So=null;e:{var l=e,i=So.return,a=So,o=t;if(t=Co,a.effectTag|=2048,a.firstEffect=a.lastEffect=null,null!==o&&"object"==typeof o&&"function"==typeof o.then){var u=o;if(0==(2&a.mode)){var c=a.alternate;c?(a.updateQueue=c.updateQueue,a.memoizedState=c.memoizedState,a.expirationTime=c.expirationTime):(a.updateQueue=null,a.memoizedState=null)}var s=0!=(1&Fi.current),f=i;do{var d;if(d=13===f.tag){var p=f.memoizedState;if(null!==p)d=null!==p.dehydrated;else{var m=f.memoizedProps;d=void 0!==m.fallback&&(!0!==m.unstable_avoidThisFallback||!s)}}if(d){var h=f.updateQueue;if(null===h){var v=new Set;v.add(u),f.updateQueue=v}else h.add(u);if(0==(2&f.mode)){if(f.effectTag|=64,a.effectTag&=-2981,1===a.tag)if(null===a.alternate)a.tag=17;else{var g=oi(1073741823,null);g.tag=2,ui(a,g)}a.expirationTime=1073741823;break e}o=void 0,a=t;var y=l.pingCache;if(null===y?(y=l.pingCache=new po,o=new Set,y.set(u,o)):void 0===(o=y.get(u))&&(o=new Set,y.set(u,o)),!o.has(a)){o.add(a);var b=bu.bind(null,l,u,a);u.then(b,b)}f.effectTag|=4096,f.expirationTime=t;break e}f=f.return}while(null!==f);o=Error((ve(a.type)||"A React component")+" suspended while rendering, but no fallback UI was specified.\n\nAdd a <Suspense fallback=...> component higher in the tree to provide a loading indicator or placeholder to display."+ge(a))}5!==_o&&(_o=2),o=Ga(o,a),f=i;do{switch(f.tag){case 3:u=o,f.effectTag|=4096,f.expirationTime=t,ci(f,mo(f,u,t));break e;case 1:u=o;var w=f.type,k=f.stateNode;if(0==(64&f.effectTag)&&("function"==typeof w.getDerivedStateFromError||null!==k&&"function"==typeof k.componentDidCatch&&(null===Ao||!Ao.has(k)))){f.effectTag|=4096,f.expirationTime=t,ci(f,ho(f,u,t));break e}}f=f.return}while(null!==f)}So=su(So)}catch(x){t=x;continue}break}}function lu(){var e=yo.current;return yo.current=ha,null===e?ha:e}function iu(e,t){e<No&&2<e&&(No=e),null!==t&&e<zo&&2<e&&(zo=e,Oo=t)}function au(e){e>Ro&&(Ro=e)}function ou(){for(;null!==So;)So=cu(So)}function uu(){for(;null!==So&&!Il();)So=cu(So)}function cu(e){var t=vo(e.alternate,e,Co);return e.memoizedProps=e.pendingProps,null===t&&(t=su(e)),bo.current=null,t}function su(e){So=e;do{var t=So.alternate;if(e=So.return,0==(2048&So.effectTag)){if(t=Ya(t,So,Co),1===Co||1!==So.childExpirationTime){for(var n=0,r=So.child;null!==r;){var l=r.expirationTime,i=r.childExpirationTime;l>n&&(n=l),i>n&&(n=i),r=r.sibling}So.childExpirationTime=n}if(null!==t)return t;null!==e&&0==(2048&e.effectTag)&&(null===e.firstEffect&&(e.firstEffect=So.firstEffect),null!==So.lastEffect&&(null!==e.lastEffect&&(e.lastEffect.nextEffect=So.firstEffect),e.lastEffect=So.lastEffect),1<So.effectTag&&(null!==e.lastEffect?e.lastEffect.nextEffect=So:e.firstEffect=So,e.lastEffect=So))}else{if(null!==(t=Xa(So)))return t.effectTag&=2047,t;null!==e&&(e.firstEffect=e.lastEffect=null,e.effectTag|=2048)}if(null!==(t=So.sibling))return t;So=e}while(null!==So);return _o===wo&&(_o=5),null}function fu(e){var t=e.expirationTime;return t>(e=e.childExpirationTime)?t:e}function du(e){var t=Vl();return Ql(99,pu.bind(null,e,t)),null}function pu(e,t){do{hu()}while(null!==Vo);if(0!=(48&To))throw Error(a(327));var n=e.finishedWork,r=e.finishedExpirationTime;if(null===n)return null;if(e.finishedWork=null,e.finishedExpirationTime=0,n===e.current)throw Error(a(177));e.callbackNode=null,e.callbackExpirationTime=0,e.callbackPriority=90,e.nextKnownPendingLevel=0;var l=fu(n);if(e.firstPendingTime=l,r<=e.lastSuspendedTime?e.firstSuspendedTime=e.lastSuspendedTime=e.nextKnownPendingLevel=0:r<=e.firstSuspendedTime&&(e.firstSuspendedTime=r-1),r<=e.lastPingedTime&&(e.lastPingedTime=0),r<=e.lastExpiredTime&&(e.lastExpiredTime=0),e===Eo&&(So=Eo=null,Co=0),1<n.effectTag?null!==n.lastEffect?(n.lastEffect.nextEffect=n,l=n.firstEffect):l=n:l=n.firstEffect,null!==l){var i=To;To|=32,bo.current=null,hn=Ht;var o=pn();if(mn(o)){if("selectionStart"in o)var u={start:o.selectionStart,end:o.selectionEnd};else e:{var c=(u=(u=o.ownerDocument)&&u.defaultView||window).getSelection&&u.getSelection();if(c&&0!==c.rangeCount){u=c.anchorNode;var s=c.anchorOffset,f=c.focusNode;c=c.focusOffset;try{u.nodeType,f.nodeType}catch(C){u=null;break e}var d=0,p=-1,m=-1,h=0,v=0,g=o,y=null;t:for(;;){for(var b;g!==u||0!==s&&3!==g.nodeType||(p=d+s),g!==f||0!==c&&3!==g.nodeType||(m=d+c),3===g.nodeType&&(d+=g.nodeValue.length),null!==(b=g.firstChild);)y=g,g=b;for(;;){if(g===o)break t;if(y===u&&++h===s&&(p=d),y===f&&++v===c&&(m=d),null!==(b=g.nextSibling))break;y=(g=y).parentNode}g=b}u=-1===p||-1===m?null:{start:p,end:m}}else u=null}u=u||{start:0,end:0}}else u=null;vn={activeElementDetached:null,focusedElem:o,selectionRange:u},Ht=!1,Fo=l;do{try{mu()}catch(C){if(null===Fo)throw Error(a(330));yu(Fo,C),Fo=Fo.nextEffect}}while(null!==Fo);Fo=l;do{try{for(o=e,u=t;null!==Fo;){var w=Fo.effectTag;if(16&w&&Ve(Fo.stateNode,""),128&w){var k=Fo.alternate;if(null!==k){var x=k.ref;null!==x&&("function"==typeof x?x(null):x.current=null)}}switch(1038&w){case 2:uo(Fo),Fo.effectTag&=-3;break;case 6:uo(Fo),Fo.effectTag&=-3,so(Fo.alternate,Fo);break;case 1024:Fo.effectTag&=-1025;break;case 1028:Fo.effectTag&=-1025,so(Fo.alternate,Fo);break;case 4:so(Fo.alternate,Fo);break;case 8:co(o,s=Fo,u),ao(s)}Fo=Fo.nextEffect}}catch(C){if(null===Fo)throw Error(a(330));yu(Fo,C),Fo=Fo.nextEffect}}while(null!==Fo);if(x=vn,k=pn(),w=x.focusedElem,u=x.selectionRange,k!==w&&w&&w.ownerDocument&&function e(t,n){return!(!t||!n)&&(t===n||(!t||3!==t.nodeType)&&(n&&3===n.nodeType?e(t,n.parentNode):"contains"in t?t.contains(n):!!t.compareDocumentPosition&&!!(16&t.compareDocumentPosition(n))))}(w.ownerDocument.documentElement,w)){null!==u&&mn(w)&&(k=u.start,void 0===(x=u.end)&&(x=k),"selectionStart"in w?(w.selectionStart=k,w.selectionEnd=Math.min(x,w.value.length)):(x=(k=w.ownerDocument||document)&&k.defaultView||window).getSelection&&(x=x.getSelection(),s=w.textContent.length,o=Math.min(u.start,s),u=void 0===u.end?o:Math.min(u.end,s),!x.extend&&o>u&&(s=u,u=o,o=s),s=dn(w,o),f=dn(w,u),s&&f&&(1!==x.rangeCount||x.anchorNode!==s.node||x.anchorOffset!==s.offset||x.focusNode!==f.node||x.focusOffset!==f.offset)&&((k=k.createRange()).setStart(s.node,s.offset),x.removeAllRanges(),o>u?(x.addRange(k),x.extend(f.node,f.offset)):(k.setEnd(f.node,f.offset),x.addRange(k))))),k=[];for(x=w;x=x.parentNode;)1===x.nodeType&&k.push({element:x,left:x.scrollLeft,top:x.scrollTop});for("function"==typeof w.focus&&w.focus(),w=0;w<k.length;w++)(x=k[w]).element.scrollLeft=x.left,x.element.scrollTop=x.top}Ht=!!hn,vn=hn=null,e.current=n,Fo=l;do{try{for(w=e;null!==Fo;){var T=Fo.effectTag;if(36&T&&lo(w,Fo.alternate,Fo),128&T){k=void 0;var E=Fo.ref;if(null!==E){var S=Fo.stateNode;switch(Fo.tag){case 5:k=S;break;default:k=S}"function"==typeof E?E(k):E.current=k}}Fo=Fo.nextEffect}}catch(C){if(null===Fo)throw Error(a(330));yu(Fo,C),Fo=Fo.nextEffect}}while(null!==Fo);Fo=null,Ml(),To=i}else e.current=n;if(Uo)Uo=!1,Vo=e,Wo=t;else for(Fo=l;null!==Fo;)t=Fo.nextEffect,Fo.nextEffect=null,Fo=t;if(0===(t=e.firstPendingTime)&&(Ao=null),1073741823===t?e===$o?jo++:(jo=0,$o=e):jo=0,"function"==typeof ku&&ku(n.stateNode,r),Go(e),Do)throw Do=!1,e=Lo,Lo=null,e;return 0!=(8&To)||Bl(),null}function mu(){for(;null!==Fo;){var e=Fo.effectTag;0!=(256&e)&&to(Fo.alternate,Fo),0==(512&e)||Uo||(Uo=!0,jl(97,(function(){return hu(),null}))),Fo=Fo.nextEffect}}function hu(){if(90!==Wo){var e=97<Wo?97:Wo;return Wo=90,Ql(e,vu)}}function vu(){if(null===Vo)return!1;var e=Vo;if(Vo=null,0!=(48&To))throw Error(a(331));var t=To;for(To|=32,e=e.current.firstEffect;null!==e;){try{var n=e;if(0!=(512&n.effectTag))switch(n.tag){case 0:case 11:case 15:case 22:no(5,n),ro(5,n)}}catch(r){if(null===e)throw Error(a(330));yu(e,r)}n=e.nextEffect,e.nextEffect=null,e=n}return To=t,Bl(),!0}function gu(e,t,n){ui(e,t=mo(e,t=Ga(n,t),1073741823)),null!==(e=Yo(e,1073741823))&&Go(e)}function yu(e,t){if(3===e.tag)gu(e,e,t);else for(var n=e.return;null!==n;){if(3===n.tag){gu(n,e,t);break}if(1===n.tag){var r=n.stateNode;if("function"==typeof n.type.getDerivedStateFromError||"function"==typeof r.componentDidCatch&&(null===Ao||!Ao.has(r))){ui(n,e=ho(n,e=Ga(t,e),1073741823)),null!==(n=Yo(n,1073741823))&&Go(n);break}}n=n.return}}function bu(e,t,n){var r=e.pingCache;null!==r&&r.delete(t),Eo===e&&Co===n?_o===xo||_o===ko&&1073741823===No&&Ul()-Mo<500?nu(e,Co):Io=!0:Ru(e,n)&&(0!==(t=e.lastPingedTime)&&t<n||(e.lastPingedTime=n,Go(e)))}function wu(e,t){var n=e.stateNode;null!==n&&n.delete(t),0===(t=0)&&(t=Ko(t=Ho(),e,null)),null!==(e=Yo(e,t))&&Go(e)}vo=function(e,t,n){var r=t.expirationTime;if(null!==e){var l=t.pendingProps;if(e.memoizedProps!==l||dl.current)Na=!0;else{if(r<n){switch(Na=!1,t.tag){case 3:Aa(t),_a();break;case 5:if(Ii(t),4&t.mode&&1!==n&&l.hidden)return t.expirationTime=t.childExpirationTime=1,null;break;case 1:hl(t.type)&&bl(t);break;case 4:Oi(t,t.stateNode.containerInfo);break;case 10:r=t.memoizedProps.value,l=t.type._context,cl(Yl,l._currentValue),l._currentValue=r;break;case 13:if(null!==t.memoizedState)return 0!==(r=t.child.childExpirationTime)&&r>=n?ja(e,t,n):(cl(Fi,1&Fi.current),null!==(t=Ka(e,t,n))?t.sibling:null);cl(Fi,1&Fi.current);break;case 19:if(r=t.childExpirationTime>=n,0!=(64&e.effectTag)){if(r)return Ha(e,t,n);t.effectTag|=64}if(null!==(l=t.memoizedState)&&(l.rendering=null,l.tail=null),cl(Fi,Fi.current),!r)return null}return Ka(e,t,n)}Na=!1}}else Na=!1;switch(t.expirationTime=0,t.tag){case 2:if(r=t.type,null!==e&&(e.alternate=null,t.alternate=null,t.effectTag|=2),e=t.pendingProps,l=ml(t,fl.current),ni(t,n),l=Ki(null,t,r,e,l,n),t.effectTag|=1,"object"==typeof l&&null!==l&&"function"==typeof l.render&&void 0===l.$$typeof){if(t.tag=1,t.memoizedState=null,t.updateQueue=null,hl(r)){var i=!0;bl(t)}else i=!1;t.memoizedState=null!==l.state&&void 0!==l.state?l.state:null,ii(t);var o=r.getDerivedStateFromProps;"function"==typeof o&&mi(t,r,o,e),l.updater=hi,t.stateNode=l,l._reactInternalFiber=t,bi(t,r,e,n),t=La(null,t,r,!0,i,n)}else t.tag=0,za(null,t,l,n),t=t.child;return t;case 16:e:{if(l=t.elementType,null!==e&&(e.alternate=null,t.alternate=null,t.effectTag|=2),e=t.pendingProps,function(e){if(-1===e._status){e._status=0;var t=e._ctor;t=t(),e._result=t,t.then((function(t){0===e._status&&(t=t.default,e._status=1,e._result=t)}),(function(t){0===e._status&&(e._status=2,e._result=t)}))}}(l),1!==l._status)throw l._result;switch(l=l._result,t.type=l,i=t.tag=function(e){if("function"==typeof e)return Su(e)?1:0;if(null!=e){if((e=e.$$typeof)===ue)return 11;if(e===fe)return 14}return 2}(l),e=ql(l,e),i){case 0:t=Fa(null,t,l,e,n);break e;case 1:t=Da(null,t,l,e,n);break e;case 11:t=Oa(null,t,l,e,n);break e;case 14:t=Ra(null,t,l,ql(l.type,e),r,n);break e}throw Error(a(306,l,""))}return t;case 0:return r=t.type,l=t.pendingProps,Fa(e,t,r,l=t.elementType===r?l:ql(r,l),n);case 1:return r=t.type,l=t.pendingProps,Da(e,t,r,l=t.elementType===r?l:ql(r,l),n);case 3:if(Aa(t),r=t.updateQueue,null===e||null===r)throw Error(a(282));if(r=t.pendingProps,l=null!==(l=t.memoizedState)?l.element:null,ai(e,t),si(t,r,null,n),(r=t.memoizedState.element)===l)_a(),t=Ka(e,t,n);else{if((l=t.stateNode.hydrate)&&(wa=kn(t.stateNode.containerInfo.firstChild),ba=t,l=ka=!0),l)for(n=Si(t,null,r,n),t.child=n;n;)n.effectTag=-3&n.effectTag|1024,n=n.sibling;else za(e,t,r,n),_a();t=t.child}return t;case 5:return Ii(t),null===e&&Ea(t),r=t.type,l=t.pendingProps,i=null!==e?e.memoizedProps:null,o=l.children,yn(r,l)?o=null:null!==i&&yn(r,i)&&(t.effectTag|=16),Ma(e,t),4&t.mode&&1!==n&&l.hidden?(t.expirationTime=t.childExpirationTime=1,t=null):(za(e,t,o,n),t=t.child),t;case 6:return null===e&&Ea(t),null;case 13:return ja(e,t,n);case 4:return Oi(t,t.stateNode.containerInfo),r=t.pendingProps,null===e?t.child=Ei(t,null,r,n):za(e,t,r,n),t.child;case 11:return r=t.type,l=t.pendingProps,Oa(e,t,r,l=t.elementType===r?l:ql(r,l),n);case 7:return za(e,t,t.pendingProps,n),t.child;case 8:case 12:return za(e,t,t.pendingProps.children,n),t.child;case 10:e:{r=t.type._context,l=t.pendingProps,o=t.memoizedProps,i=l.value;var u=t.type._context;if(cl(Yl,u._currentValue),u._currentValue=i,null!==o)if(u=o.value,0===(i=Lr(u,i)?0:0|("function"==typeof r._calculateChangedBits?r._calculateChangedBits(u,i):1073741823))){if(o.children===l.children&&!dl.current){t=Ka(e,t,n);break e}}else for(null!==(u=t.child)&&(u.return=t);null!==u;){var c=u.dependencies;if(null!==c){o=u.child;for(var s=c.firstContext;null!==s;){if(s.context===r&&0!=(s.observedBits&i)){1===u.tag&&((s=oi(n,null)).tag=2,ui(u,s)),u.expirationTime<n&&(u.expirationTime=n),null!==(s=u.alternate)&&s.expirationTime<n&&(s.expirationTime=n),ti(u.return,n),c.expirationTime<n&&(c.expirationTime=n);break}s=s.next}}else o=10===u.tag&&u.type===t.type?null:u.child;if(null!==o)o.return=u;else for(o=u;null!==o;){if(o===t){o=null;break}if(null!==(u=o.sibling)){u.return=o.return,o=u;break}o=o.return}u=o}za(e,t,l.children,n),t=t.child}return t;case 9:return l=t.type,r=(i=t.pendingProps).children,ni(t,n),r=r(l=ri(l,i.unstable_observedBits)),t.effectTag|=1,za(e,t,r,n),t.child;case 14:return i=ql(l=t.type,t.pendingProps),Ra(e,t,l,i=ql(l.type,i),r,n);case 15:return Ia(e,t,t.type,t.pendingProps,r,n);case 17:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:ql(r,l),null!==e&&(e.alternate=null,t.alternate=null,t.effectTag|=2),t.tag=1,hl(r)?(e=!0,bl(t)):e=!1,ni(t,n),gi(t,r,l),bi(t,r,l,n),La(null,t,r,!0,e,n);case 19:return Ha(e,t,n)}throw Error(a(156,t.tag))};var ku=null,xu=null;function Tu(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.effectTag=0,this.lastEffect=this.firstEffect=this.nextEffect=null,this.childExpirationTime=this.expirationTime=0,this.alternate=null}function Eu(e,t,n,r){return new Tu(e,t,n,r)}function Su(e){return!(!(e=e.prototype)||!e.isReactComponent)}function Cu(e,t){var n=e.alternate;return null===n?((n=Eu(e.tag,t,e.key,e.mode)).elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.effectTag=0,n.nextEffect=null,n.firstEffect=null,n.lastEffect=null),n.childExpirationTime=e.childExpirationTime,n.expirationTime=e.expirationTime,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=null===t?null:{expirationTime:t.expirationTime,firstContext:t.firstContext,responders:t.responders},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function _u(e,t,n,r,l,i){var o=2;if(r=e,"function"==typeof e)Su(e)&&(o=1);else if("string"==typeof e)o=5;else e:switch(e){case ne:return Pu(n.children,l,i,t);case oe:o=8,l|=7;break;case re:o=8,l|=1;break;case le:return(e=Eu(12,n,t,8|l)).elementType=le,e.type=le,e.expirationTime=i,e;case ce:return(e=Eu(13,n,t,l)).type=ce,e.elementType=ce,e.expirationTime=i,e;case se:return(e=Eu(19,n,t,l)).elementType=se,e.expirationTime=i,e;default:if("object"==typeof e&&null!==e)switch(e.$$typeof){case ie:o=10;break e;case ae:o=9;break e;case ue:o=11;break e;case fe:o=14;break e;case de:o=16,r=null;break e;case pe:o=22;break e}throw Error(a(130,null==e?e:typeof e,""))}return(t=Eu(o,n,t,l)).elementType=e,t.type=r,t.expirationTime=i,t}function Pu(e,t,n,r){return(e=Eu(7,e,r,t)).expirationTime=n,e}function Nu(e,t,n){return(e=Eu(6,e,null,t)).expirationTime=n,e}function zu(e,t,n){return(t=Eu(4,null!==e.children?e.children:[],e.key,t)).expirationTime=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function Ou(e,t,n){this.tag=t,this.current=null,this.containerInfo=e,this.pingCache=this.pendingChildren=null,this.finishedExpirationTime=0,this.finishedWork=null,this.timeoutHandle=-1,this.pendingContext=this.context=null,this.hydrate=n,this.callbackNode=null,this.callbackPriority=90,this.lastExpiredTime=this.lastPingedTime=this.nextKnownPendingLevel=this.lastSuspendedTime=this.firstSuspendedTime=this.firstPendingTime=0}function Ru(e,t){var n=e.firstSuspendedTime;return e=e.lastSuspendedTime,0!==n&&n>=t&&e<=t}function Iu(e,t){var n=e.firstSuspendedTime,r=e.lastSuspendedTime;n<t&&(e.firstSuspendedTime=t),(r>t||0===n)&&(e.lastSuspendedTime=t),t<=e.lastPingedTime&&(e.lastPingedTime=0),t<=e.lastExpiredTime&&(e.lastExpiredTime=0)}function Mu(e,t){t>e.firstPendingTime&&(e.firstPendingTime=t);var n=e.firstSuspendedTime;0!==n&&(t>=n?e.firstSuspendedTime=e.lastSuspendedTime=e.nextKnownPendingLevel=0:t>=e.lastSuspendedTime&&(e.lastSuspendedTime=t+1),t>e.nextKnownPendingLevel&&(e.nextKnownPendingLevel=t))}function Fu(e,t){var n=e.lastExpiredTime;(0===n||n>t)&&(e.lastExpiredTime=t)}function Du(e,t,n,r){var l=t.current,i=Ho(),o=di.suspense;i=Ko(i,l,o);e:if(n){t:{if(Ze(n=n._reactInternalFiber)!==n||1!==n.tag)throw Error(a(170));var u=n;do{switch(u.tag){case 3:u=u.stateNode.context;break t;case 1:if(hl(u.type)){u=u.stateNode.__reactInternalMemoizedMergedChildContext;break t}}u=u.return}while(null!==u);throw Error(a(171))}if(1===n.tag){var c=n.type;if(hl(c)){n=yl(n,c,u);break e}}n=u}else n=sl;return null===t.context?t.context=n:t.pendingContext=n,(t=oi(i,o)).payload={element:e},null!==(r=void 0===r?null:r)&&(t.callback=r),ui(l,t),qo(l,i),i}function Lu(e){if(!(e=e.current).child)return null;switch(e.child.tag){case 5:default:return e.child.stateNode}}function Au(e,t){null!==(e=e.memoizedState)&&null!==e.dehydrated&&e.retryTime<t&&(e.retryTime=t)}function Uu(e,t){Au(e,t),(e=e.alternate)&&Au(e,t)}function Vu(e,t,n){var r=new Ou(e,t,n=null!=n&&!0===n.hydrate),l=Eu(3,null,null,2===t?7:1===t?3:0);r.current=l,l.stateNode=r,ii(l),e[Cn]=r.current,n&&0!==t&&function(e,t){var n=Je(t);Ct.forEach((function(e){mt(e,t,n)})),_t.forEach((function(e){mt(e,t,n)}))}(0,9===e.nodeType?e:e.ownerDocument),this._internalRoot=r}function Wu(e){return!(!e||1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType&&(8!==e.nodeType||" react-mount-point-unstable "!==e.nodeValue))}function Qu(e,t,n,r,l){var i=n._reactRootContainer;if(i){var a=i._internalRoot;if("function"==typeof l){var o=l;l=function(){var e=Lu(a);o.call(e)}}Du(t,a,e,l)}else{if(i=n._reactRootContainer=function(e,t){if(t||(t=!(!(t=e?9===e.nodeType?e.documentElement:e.firstChild:null)||1!==t.nodeType||!t.hasAttribute("data-reactroot"))),!t)for(var n;n=e.lastChild;)e.removeChild(n);return new Vu(e,0,t?{hydrate:!0}:void 0)}(n,r),a=i._internalRoot,"function"==typeof l){var u=l;l=function(){var e=Lu(a);u.call(e)}}tu((function(){Du(t,a,e,l)}))}return Lu(a)}function ju(e,t,n){var r=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:te,key:null==r?null:""+r,children:e,containerInfo:t,implementation:n}}function $u(e,t){var n=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;if(!Wu(t))throw Error(a(200));return ju(e,t,null,n)}Vu.prototype.render=function(e){Du(e,this._internalRoot,null,null)},Vu.prototype.unmount=function(){var e=this._internalRoot,t=e.containerInfo;Du(null,e,null,(function(){t[Cn]=null}))},ht=function(e){if(13===e.tag){var t=Kl(Ho(),150,100);qo(e,t),Uu(e,t)}},vt=function(e){13===e.tag&&(qo(e,3),Uu(e,3))},gt=function(e){if(13===e.tag){var t=Ho();qo(e,t=Ko(t,e,null)),Uu(e,t)}},P=function(e,t,n){switch(t){case"input":if(Se(e,n),t=n.name,"radio"===n.type&&null!=t){for(n=e;n.parentNode;)n=n.parentNode;for(n=n.querySelectorAll("input[name="+JSON.stringify(""+t)+'][type="radio"]'),t=0;t<n.length;t++){var r=n[t];if(r!==e&&r.form===e.form){var l=zn(r);if(!l)throw Error(a(90));ke(r),Se(r,l)}}}break;case"textarea":Re(e,n);break;case"select":null!=(t=n.value)&&Ne(e,!!n.multiple,t,!1)}},M=eu,F=function(e,t,n,r,l){var i=To;To|=4;try{return Ql(98,e.bind(null,t,n,r,l))}finally{0===(To=i)&&Bl()}},D=function(){0==(49&To)&&(function(){if(null!==Qo){var e=Qo;Qo=null,e.forEach((function(e,t){Fu(t,e),Go(t)})),Bl()}}(),hu())},L=function(e,t){var n=To;To|=2;try{return e(t)}finally{0===(To=n)&&Bl()}};var Bu,Hu,Ku={Events:[Pn,Nn,zn,C,T,Ln,function(e){lt(e,Dn)},R,I,Gt,ot,hu,{current:!1}]};Hu=(Bu={findFiberByHostInstance:_n,bundleType:0,version:"16.14.0",rendererPackageName:"react-dom"}).findFiberByHostInstance,function(e){if("undefined"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__)return!1;var t=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(t.isDisabled||!t.supportsFiber)return!0;try{var n=t.inject(e);ku=function(e){try{t.onCommitFiberRoot(n,e,void 0,64==(64&e.current.effectTag))}catch(r){}},xu=function(e){try{t.onCommitFiberUnmount(n,e)}catch(r){}}}catch(r){}}(l({},Bu,{overrideHookState:null,overrideProps:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:X.ReactCurrentDispatcher,findHostInstanceByFiber:function(e){return null===(e=nt(e))?null:e.stateNode},findFiberByHostInstance:function(e){return Hu?Hu(e):null},findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null})),t.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=Ku,t.createPortal=$u,t.findDOMNode=function(e){if(null==e)return null;if(1===e.nodeType)return e;var t=e._reactInternalFiber;if(void 0===t){if("function"==typeof e.render)throw Error(a(188));throw Error(a(268,Object.keys(e)))}return e=null===(e=nt(t))?null:e.stateNode},t.flushSync=function(e,t){if(0!=(48&To))throw Error(a(187));var n=To;To|=1;try{return Ql(99,e.bind(null,t))}finally{To=n,Bl()}},t.hydrate=function(e,t,n){if(!Wu(t))throw Error(a(200));return Qu(null,e,t,!0,n)},t.render=function(e,t,n){if(!Wu(t))throw Error(a(200));return Qu(null,e,t,!1,n)},t.unmountComponentAtNode=function(e){if(!Wu(e))throw Error(a(40));return!!e._reactRootContainer&&(tu((function(){Qu(null,null,e,!1,(function(){e._reactRootContainer=null,e[Cn]=null}))})),!0)},t.unstable_batchedUpdates=eu,t.unstable_createPortal=function(e,t){return $u(e,t,2<arguments.length&&void 0!==arguments[2]?arguments[2]:null)},t.unstable_renderSubtreeIntoContainer=function(e,t,n,r){if(!Wu(n))throw Error(a(200));if(null==e||void 0===e._reactInternalFiber)throw Error(a(38));return Qu(e,t,n,!1,r)},t.version="16.14.0"}}]); +//# sourceMappingURL=framework-22d51f0f5ee9f1c9c6e1.js.map \ No newline at end of file diff --git a/framework-22d51f0f5ee9f1c9c6e1.js.LICENSE.txt b/framework-22d51f0f5ee9f1c9c6e1.js.LICENSE.txt new file mode 100644 index 00000000..664b2210 --- /dev/null +++ b/framework-22d51f0f5ee9f1c9c6e1.js.LICENSE.txt @@ -0,0 +1,26 @@ +/** @license React v0.19.1 + * scheduler.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +/** @license React v16.14.0 + * react-dom.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +/** @license React v16.14.0 + * react.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ diff --git a/framework-22d51f0f5ee9f1c9c6e1.js.map b/framework-22d51f0f5ee9f1c9c6e1.js.map new file mode 100644 index 00000000..69c84be2 --- /dev/null +++ b/framework-22d51f0f5ee9f1c9c6e1.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./node_modules/scheduler/cjs/scheduler.production.min.js","webpack:///./node_modules/prop-types/factoryWithThrowingShims.js","webpack:///./node_modules/prop-types/index.js","webpack:///./node_modules/scheduler/index.js","webpack:///./node_modules/prop-types/lib/ReactPropTypesSecret.js","webpack:///./node_modules/react-dom/index.js","webpack:///./node_modules/react/index.js","webpack:///./node_modules/react/cjs/react.production.min.js","webpack:///./node_modules/react-dom/cjs/react-dom.production.min.js"],"names":["f","g","h","k","l","window","MessageChannel","p","q","t","a","exports","unstable_now","b","setTimeout","u","Date","now","clearTimeout","unstable_forceFrameRate","w","performance","x","y","z","console","A","cancelAnimationFrame","requestAnimationFrame","error","B","C","D","E","F","G","Math","floor","H","I","port2","port1","onmessage","postMessage","J","c","length","push","d","e","K","L","M","pop","m","n","v","r","sortIndex","id","N","O","P","Q","R","S","T","U","V","callback","startTime","expirationTime","W","X","priorityLevel","Y","Z","unstable_IdlePriority","unstable_ImmediatePriority","unstable_LowPriority","unstable_NormalPriority","unstable_Profiling","unstable_UserBlockingPriority","unstable_cancelCallback","unstable_continueExecution","unstable_getCurrentPriorityLevel","unstable_getFirstCallbackNode","unstable_next","unstable_pauseExecution","unstable_requestPaint","unstable_runWithPriority","unstable_scheduleCallback","delay","timeout","unstable_shouldYield","unstable_wrapCallback","apply","this","arguments","ReactPropTypesSecret","emptyFunction","emptyFunctionWithReset","resetWarningCache","module","shim","props","propName","componentName","location","propFullName","secret","err","Error","name","getShim","isRequired","ReactPropTypes","array","bigint","bool","func","number","object","string","symbol","any","arrayOf","element","elementType","instanceOf","node","objectOf","oneOf","oneOfType","shape","exact","checkPropTypes","PropTypes","checkDCE","__REACT_DEVTOOLS_GLOBAL_HOOK__","Symbol","for","iterator","encodeURIComponent","isMounted","enqueueForceUpdate","enqueueReplaceState","enqueueSetState","context","refs","updater","prototype","isReactComponent","setState","forceUpdate","constructor","isPureReactComponent","current","Object","hasOwnProperty","key","ref","__self","__source","call","children","Array","defaultProps","$$typeof","type","_owner","result","keyPrefix","count","isArray","next","done","value","keys","join","replace","escape","toString","aa","ba","ReactCurrentDispatcher","ReactCurrentBatchConfig","suspense","ReactCurrentOwner","IsSomeRendererActing","assign","Children","map","forEach","toArray","only","Component","Fragment","Profiler","PureComponent","StrictMode","Suspense","__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED","cloneElement","createContext","_calculateChangedBits","_currentValue","_currentValue2","_threadCount","Provider","Consumer","_context","createElement","createFactory","bind","createRef","forwardRef","render","isValidElement","lazy","_ctor","_status","_result","memo","compare","useCallback","useContext","useDebugValue","useEffect","useImperativeHandle","useLayoutEffect","useMemo","useReducer","useRef","useState","version","slice","onError","da","ea","fa","ha","ia","ja","la","ma","na","oa","currentTarget","ka","pa","qa","ra","indexOf","sa","extractEvents","eventTypes","ta","phasedRegistrationNames","ua","registrationName","va","wa","dependencies","xa","ya","document","za","Aa","Ba","Ca","stateNode","Da","Ea","Fa","Ga","Ha","Ia","Ja","Ka","La","Ma","Na","Oa","Pa","Qa","acceptsBooleans","attributeName","attributeNamespace","mustUseProperty","propertyName","sanitizeURL","split","toLowerCase","Ua","Va","toUpperCase","xlinkHref","Wa","Xa","Sa","isNaN","Ta","test","Ra","removeAttribute","setAttribute","setAttributeNS","Ya","Za","$a","ab","bb","cb","db","eb","fb","gb","hb","ib","jb","kb","lb","mb","nb","pb","displayName","qb","tag","_debugOwner","_debugSource","fileName","lineNumber","return","rb","sb","nodeName","xb","_valueTracker","getOwnPropertyDescriptor","get","set","defineProperty","configurable","enumerable","getValue","setValue","stopTracking","tb","yb","checked","zb","defaultChecked","defaultValue","_wrapperState","initialChecked","Ab","initialValue","controlled","Bb","Cb","Db","Eb","ownerDocument","activeElement","Gb","Fb","Hb","options","selected","defaultSelected","disabled","Ib","dangerouslySetInnerHTML","Jb","Kb","Lb","textContent","Mb","Nb","Ob","Pb","Qb","MSApp","execUnsafeLocalFunction","namespaceURI","innerHTML","valueOf","firstChild","removeChild","appendChild","Rb","lastChild","nodeType","nodeValue","Sb","Tb","animationend","animationiteration","animationstart","transitionend","Ub","Vb","Wb","style","animation","transition","Xb","Yb","Zb","$b","ac","bc","WeakMap","Map","cc","dc","alternate","effectTag","ec","memoizedState","dehydrated","fc","hc","child","sibling","gc","ic","concat","jc","kc","lc","_dispatchListeners","_dispatchInstances","isPropagationStopped","isPersistent","release","mc","nc","target","srcElement","correspondingUseElement","parentNode","oc","pc","qc","topLevelType","nativeEvent","targetInst","ancestors","rc","eventSystemFlags","sc","containerInfo","tc","uc","has","vc","wc","xc","yc","zc","Ac","Bc","Cc","Dc","Ec","Fc","Gc","Hc","Ic","Kc","blockedOn","container","Lc","delete","pointerId","Mc","Nc","Pc","priority","hydrate","Qc","Rc","Sc","Tc","shift","Uc","Vc","Wc","Yc","Zc","$c","ad","bubbled","captured","eventPriority","bd","cd","dd","ed","fd","gd","hd","addEventListener","Oc","jd","animationIterationCount","borderImageOutset","borderImageSlice","borderImageWidth","boxFlex","boxFlexGroup","boxOrdinalGroup","columnCount","columns","flex","flexGrow","flexPositive","flexShrink","flexNegative","flexOrder","gridArea","gridRow","gridRowEnd","gridRowSpan","gridRowStart","gridColumn","gridColumnEnd","gridColumnSpan","gridColumnStart","fontWeight","lineClamp","lineHeight","opacity","order","orphans","tabSize","widows","zIndex","zoom","fillOpacity","floodOpacity","stopOpacity","strokeDasharray","strokeDashoffset","strokeMiterlimit","strokeOpacity","strokeWidth","kd","ld","trim","md","setProperty","charAt","substring","nd","menuitem","area","base","br","col","embed","hr","img","input","keygen","link","meta","param","source","track","wbr","od","pd","is","qd","rd","sd","td","body","ud","vd","offset","nextSibling","xd","HTMLIFrameElement","contentWindow","href","yd","contentEditable","Dd","Ed","Fd","autoFocus","Gd","__html","Hd","Id","Jd","Kd","previousSibling","data","Ld","random","Md","Nd","Od","Pd","Qd","Rd","Sd","Td","dispatchConfig","Ud","_targetInst","Vd","Wd","Xd","Yd","Zd","$d","ae","be","ce","Interface","isDefaultPrevented","defaultPrevented","returnValue","ee","eventPool","fe","destructor","de","getPooled","preventDefault","stopPropagation","cancelBubble","persist","eventPhase","bubbles","cancelable","timeStamp","isTrusted","extend","ge","he","ie","je","ke","documentMode","le","me","ne","String","fromCharCode","oe","beforeInput","compositionEnd","compositionStart","compositionUpdate","pe","qe","keyCode","re","detail","se","ve","locale","which","te","ctrlKey","altKey","metaKey","char","ue","we","color","date","datetime","email","month","password","range","search","tel","text","time","url","week","xe","ye","change","ze","Ae","Be","Ce","De","Ee","Fe","Ge","detachEvent","He","Ie","attachEvent","Je","Ke","Le","Me","_isInputEventSupported","Ne","view","Oe","Alt","Control","Meta","Shift","Pe","getModifierState","Qe","Re","Se","Te","Ue","Ve","screenX","screenY","clientX","clientY","pageX","pageY","shiftKey","button","buttons","relatedTarget","fromElement","toElement","movementX","movementY","We","width","height","pressure","tangentialPressure","tiltX","tiltY","twist","pointerType","isPrimary","Xe","mouseEnter","mouseLeave","pointerEnter","pointerLeave","Ye","defaultView","parentWindow","$e","af","bf","cf","df","select","ef","ff","gf","hf","jf","start","selectionStart","end","selectionEnd","anchorNode","getSelection","anchorOffset","focusNode","focusOffset","kf","onSelect","lf","animationName","elapsedTime","pseudoElement","mf","clipboardData","nf","of","charCode","pf","Esc","Spacebar","Left","Up","Right","Down","Del","Win","Menu","Apps","Scroll","MozPrintableKey","qf","8","9","12","13","16","17","18","19","20","27","32","33","34","35","36","37","38","39","40","45","46","112","113","114","115","116","117","118","119","120","121","122","123","144","145","224","rf","repeat","sf","dataTransfer","tf","touches","targetTouches","changedTouches","uf","vf","deltaX","wheelDeltaX","deltaY","wheelDeltaY","wheelDelta","deltaZ","deltaMode","wf","SimpleEventPlugin","EnterLeaveEventPlugin","ChangeEventPlugin","SelectEventPlugin","BeforeInputEventPlugin","yf","zf","Af","Bf","Cf","contextTypes","__reactInternalMemoizedUnmaskedChildContext","__reactInternalMemoizedMaskedChildContext","childContextTypes","Df","Ef","Ff","getChildContext","Gf","__reactInternalMemoizedMergedChildContext","Hf","If","Jf","Kf","Lf","Mf","Nf","Of","Pf","Qf","Rf","Sf","Tf","Uf","Vf","Wf","Xf","Yf","Zf","$f","ag","bg","cg","dg","eg","fg","gg","hg","ig","jg","kg","lg","mg","ng","og","pg","childExpirationTime","qg","firstContext","rg","sg","observedBits","responders","tg","ug","updateQueue","baseState","baseQueue","shared","pending","effects","vg","wg","suspenseConfig","payload","xg","yg","zg","ca","Ag","Bg","Cg","Dg","Eg","Fg","Jg","_reactInternalFiber","Gg","Hg","Ig","Kg","shouldComponentUpdate","Lg","contextType","state","Mg","componentWillReceiveProps","UNSAFE_componentWillReceiveProps","Ng","getDerivedStateFromProps","getSnapshotBeforeUpdate","UNSAFE_componentWillMount","componentWillMount","componentDidMount","Og","Pg","_stringRef","Qg","Rg","lastEffect","nextEffect","firstEffect","index","Sg","Tg","mode","Ug","implementation","Vg","Wg","Xg","Yg","Zg","$g","ah","bh","ch","dh","documentElement","tagName","eh","fh","gh","hh","memoizedProps","revealOrder","ih","responder","jh","kh","lh","mh","nh","oh","ph","qh","rh","sh","th","queue","uh","vh","wh","lastRenderedReducer","action","eagerReducer","eagerState","lastRenderedState","dispatch","xh","yh","zh","Ah","create","destroy","deps","Bh","Ch","Dh","Eh","Fh","Gh","Hh","Ih","Jh","Kh","Lh","Mh","Nh","readContext","useResponder","useDeferredValue","useTransition","Oh","Ph","Qh","Rh","Sh","Th","pendingProps","Uh","Vh","Wh","Xh","Yh","Zh","$h","ai","bi","ci","di","ei","fi","UNSAFE_componentWillUpdate","componentWillUpdate","componentDidUpdate","gi","getDerivedStateFromError","hi","pendingContext","ni","pi","qi","ii","retryTime","ji","fallback","unstable_avoidThisFallback","ki","li","isBackwards","rendering","renderingStartTime","last","tail","tailExpiration","tailMode","mi","ri","si","wasMultiple","multiple","onClick","onclick","size","createElementNS","createTextNode","ti","ui","vi","wi","xi","yi","zi","Ai","stack","Bi","WeakSet","Set","Ci","Fi","Ei","Gi","__reactInternalSnapshotBeforeUpdate","Hi","Ii","Ji","focus","Ki","Li","componentWillUnmount","Di","Mi","Ni","Oi","Pi","Qi","instance","insertBefore","_reactRootContainer","Ri","Si","Ti","display","Ui","Vi","add","then","Wi","Xi","Yi","Zi","$i","componentDidCatch","aj","componentStack","Rj","bj","ceil","cj","dj","kj","lj","mj","nj","oj","qj","rj","sj","tj","uj","vj","wj","timeoutMs","xj","yj","zj","lastExpiredTime","Aj","firstPendingTime","lastPingedTime","nextKnownPendingLevel","callbackExpirationTime","callbackPriority","callbackNode","Bj","Cj","Dj","Ej","Fj","Gj","Hj","finishedWork","finishedExpirationTime","lastSuspendedTime","Ij","timeoutHandle","Jj","busyMinDurationMs","busyDelayMs","Kj","Mj","Nj","pingCache","Oj","ub","Pj","Xc","Qj","Sj","firstSuspendedTime","rangeCount","wb","activeElementDetached","focusedElem","selectionRange","Tj","wd","contains","compareDocumentPosition","min","createRange","setStart","removeAllRanges","addRange","setEnd","left","scrollLeft","top","scrollTop","vb","Uj","Vj","Wj","hidden","default","ob","Xj","unstable_observedBits","Zj","pendingChildren","ak","bk","ck","dk","ek","fk","Jc","_internalRoot","gk","ik","hasAttribute","hk","jk","kk","unmount","querySelectorAll","JSON","stringify","form","Lj","lk","Events","findFiberByHostInstance","bundleType","rendererPackageName","isDisabled","supportsFiber","inject","onCommitFiberRoot","onCommitFiberUnmount","Yj","overrideHookState","overrideProps","setSuspenseHandler","scheduleUpdate","currentDispatcherRef","findHostInstanceByFiber","findHostInstancesForRefresh","scheduleRefresh","scheduleRoot","setRefreshHandler","getCurrentFiber","createPortal","findDOMNode","flushSync","unmountComponentAtNode","unstable_batchedUpdates","unstable_createPortal","unstable_renderSubtreeIntoContainer"],"mappings":"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","file":"framework-22d51f0f5ee9f1c9c6e1.js","sourcesContent":["/** @license React v0.19.1\n * scheduler.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';var f,g,h,k,l;\nif(\"undefined\"===typeof window||\"function\"!==typeof MessageChannel){var p=null,q=null,t=function(){if(null!==p)try{var a=exports.unstable_now();p(!0,a);p=null}catch(b){throw setTimeout(t,0),b;}},u=Date.now();exports.unstable_now=function(){return Date.now()-u};f=function(a){null!==p?setTimeout(f,0,a):(p=a,setTimeout(t,0))};g=function(a,b){q=setTimeout(a,b)};h=function(){clearTimeout(q)};k=function(){return!1};l=exports.unstable_forceFrameRate=function(){}}else{var w=window.performance,x=window.Date,\ny=window.setTimeout,z=window.clearTimeout;if(\"undefined\"!==typeof console){var A=window.cancelAnimationFrame;\"function\"!==typeof window.requestAnimationFrame&&console.error(\"This browser doesn't support requestAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills\");\"function\"!==typeof A&&console.error(\"This browser doesn't support cancelAnimationFrame. Make sure that you load a polyfill in older browsers. https://fb.me/react-polyfills\")}if(\"object\"===\ntypeof w&&\"function\"===typeof w.now)exports.unstable_now=function(){return w.now()};else{var B=x.now();exports.unstable_now=function(){return x.now()-B}}var C=!1,D=null,E=-1,F=5,G=0;k=function(){return exports.unstable_now()>=G};l=function(){};exports.unstable_forceFrameRate=function(a){0>a||125<a?console.error(\"forceFrameRate takes a positive int between 0 and 125, forcing framerates higher than 125 fps is not unsupported\"):F=0<a?Math.floor(1E3/a):5};var H=new MessageChannel,I=H.port2;H.port1.onmessage=\nfunction(){if(null!==D){var a=exports.unstable_now();G=a+F;try{D(!0,a)?I.postMessage(null):(C=!1,D=null)}catch(b){throw I.postMessage(null),b;}}else C=!1};f=function(a){D=a;C||(C=!0,I.postMessage(null))};g=function(a,b){E=y(function(){a(exports.unstable_now())},b)};h=function(){z(E);E=-1}}function J(a,b){var c=a.length;a.push(b);a:for(;;){var d=c-1>>>1,e=a[d];if(void 0!==e&&0<K(e,b))a[d]=b,a[c]=e,c=d;else break a}}function L(a){a=a[0];return void 0===a?null:a}\nfunction M(a){var b=a[0];if(void 0!==b){var c=a.pop();if(c!==b){a[0]=c;a:for(var d=0,e=a.length;d<e;){var m=2*(d+1)-1,n=a[m],v=m+1,r=a[v];if(void 0!==n&&0>K(n,c))void 0!==r&&0>K(r,n)?(a[d]=r,a[v]=c,d=v):(a[d]=n,a[m]=c,d=m);else if(void 0!==r&&0>K(r,c))a[d]=r,a[v]=c,d=v;else break a}}return b}return null}function K(a,b){var c=a.sortIndex-b.sortIndex;return 0!==c?c:a.id-b.id}var N=[],O=[],P=1,Q=null,R=3,S=!1,T=!1,U=!1;\nfunction V(a){for(var b=L(O);null!==b;){if(null===b.callback)M(O);else if(b.startTime<=a)M(O),b.sortIndex=b.expirationTime,J(N,b);else break;b=L(O)}}function W(a){U=!1;V(a);if(!T)if(null!==L(N))T=!0,f(X);else{var b=L(O);null!==b&&g(W,b.startTime-a)}}\nfunction X(a,b){T=!1;U&&(U=!1,h());S=!0;var c=R;try{V(b);for(Q=L(N);null!==Q&&(!(Q.expirationTime>b)||a&&!k());){var d=Q.callback;if(null!==d){Q.callback=null;R=Q.priorityLevel;var e=d(Q.expirationTime<=b);b=exports.unstable_now();\"function\"===typeof e?Q.callback=e:Q===L(N)&&M(N);V(b)}else M(N);Q=L(N)}if(null!==Q)var m=!0;else{var n=L(O);null!==n&&g(W,n.startTime-b);m=!1}return m}finally{Q=null,R=c,S=!1}}\nfunction Y(a){switch(a){case 1:return-1;case 2:return 250;case 5:return 1073741823;case 4:return 1E4;default:return 5E3}}var Z=l;exports.unstable_IdlePriority=5;exports.unstable_ImmediatePriority=1;exports.unstable_LowPriority=4;exports.unstable_NormalPriority=3;exports.unstable_Profiling=null;exports.unstable_UserBlockingPriority=2;exports.unstable_cancelCallback=function(a){a.callback=null};exports.unstable_continueExecution=function(){T||S||(T=!0,f(X))};\nexports.unstable_getCurrentPriorityLevel=function(){return R};exports.unstable_getFirstCallbackNode=function(){return L(N)};exports.unstable_next=function(a){switch(R){case 1:case 2:case 3:var b=3;break;default:b=R}var c=R;R=b;try{return a()}finally{R=c}};exports.unstable_pauseExecution=function(){};exports.unstable_requestPaint=Z;exports.unstable_runWithPriority=function(a,b){switch(a){case 1:case 2:case 3:case 4:case 5:break;default:a=3}var c=R;R=a;try{return b()}finally{R=c}};\nexports.unstable_scheduleCallback=function(a,b,c){var d=exports.unstable_now();if(\"object\"===typeof c&&null!==c){var e=c.delay;e=\"number\"===typeof e&&0<e?d+e:d;c=\"number\"===typeof c.timeout?c.timeout:Y(a)}else c=Y(a),e=d;c=e+c;a={id:P++,callback:b,priorityLevel:a,startTime:e,expirationTime:c,sortIndex:-1};e>d?(a.sortIndex=e,J(O,a),null===L(N)&&a===L(O)&&(U?h():U=!0,g(W,e-d))):(a.sortIndex=c,J(N,a),T||S||(T=!0,f(X)));return a};\nexports.unstable_shouldYield=function(){var a=exports.unstable_now();V(a);var b=L(N);return b!==Q&&null!==Q&&null!==b&&null!==b.callback&&b.startTime<=a&&b.expirationTime<Q.expirationTime||k()};exports.unstable_wrapCallback=function(a){var b=R;return function(){var c=R;R=b;try{return a.apply(this,arguments)}finally{R=c}}};\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = require('./lib/ReactPropTypesSecret');\n\nfunction emptyFunction() {}\nfunction emptyFunctionWithReset() {}\nemptyFunctionWithReset.resetWarningCache = emptyFunction;\n\nmodule.exports = function() {\n function shim(props, propName, componentName, location, propFullName, secret) {\n if (secret === ReactPropTypesSecret) {\n // It is still safe when called from React.\n return;\n }\n var err = new Error(\n 'Calling PropTypes validators directly is not supported by the `prop-types` package. ' +\n 'Use PropTypes.checkPropTypes() to call them. ' +\n 'Read more at http://fb.me/use-check-prop-types'\n );\n err.name = 'Invariant Violation';\n throw err;\n };\n shim.isRequired = shim;\n function getShim() {\n return shim;\n };\n // Important!\n // Keep this list in sync with production version in `./factoryWithTypeCheckers.js`.\n var ReactPropTypes = {\n array: shim,\n bigint: shim,\n bool: shim,\n func: shim,\n number: shim,\n object: shim,\n string: shim,\n symbol: shim,\n\n any: shim,\n arrayOf: getShim,\n element: shim,\n elementType: shim,\n instanceOf: getShim,\n node: shim,\n objectOf: getShim,\n oneOf: getShim,\n oneOfType: getShim,\n shape: getShim,\n exact: getShim,\n\n checkPropTypes: emptyFunctionWithReset,\n resetWarningCache: emptyFunction\n };\n\n ReactPropTypes.PropTypes = ReactPropTypes;\n\n return ReactPropTypes;\n};\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nif (process.env.NODE_ENV !== 'production') {\n var ReactIs = require('react-is');\n\n // By explicitly using `prop-types` you are opting into new development behavior.\n // http://fb.me/prop-types-in-prod\n var throwOnDirectAccess = true;\n module.exports = require('./factoryWithTypeCheckers')(ReactIs.isElement, throwOnDirectAccess);\n} else {\n // By explicitly using `prop-types` you are opting into new production behavior.\n // http://fb.me/prop-types-in-prod\n module.exports = require('./factoryWithThrowingShims')();\n}\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/scheduler.production.min.js');\n} else {\n module.exports = require('./cjs/scheduler.development.js');\n}\n","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';\n\nvar ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';\n\nmodule.exports = ReactPropTypesSecret;\n","'use strict';\n\nfunction checkDCE() {\n /* global __REACT_DEVTOOLS_GLOBAL_HOOK__ */\n if (\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ === 'undefined' ||\n typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE !== 'function'\n ) {\n return;\n }\n if (process.env.NODE_ENV !== 'production') {\n // This branch is unreachable because this function is only called\n // in production, but the condition is true only in development.\n // Therefore if the branch is still here, dead code elimination wasn't\n // properly applied.\n // Don't change the message. React DevTools relies on it. Also make sure\n // this message doesn't occur elsewhere in this function, or it will cause\n // a false positive.\n throw new Error('^_^');\n }\n try {\n // Verify that the code above has been dead code eliminated (DCE'd).\n __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(checkDCE);\n } catch (err) {\n // DevTools shouldn't crash React, no matter what.\n // We should still report in case we break this code.\n console.error(err);\n }\n}\n\nif (process.env.NODE_ENV === 'production') {\n // DCE check should happen before ReactDOM bundle executes so that\n // DevTools can report bad minification during injection.\n checkDCE();\n module.exports = require('./cjs/react-dom.production.min.js');\n} else {\n module.exports = require('./cjs/react-dom.development.js');\n}\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react.production.min.js');\n} else {\n module.exports = require('./cjs/react.development.js');\n}\n","/** @license React v16.14.0\n * react.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n'use strict';var l=require(\"object-assign\"),n=\"function\"===typeof Symbol&&Symbol.for,p=n?Symbol.for(\"react.element\"):60103,q=n?Symbol.for(\"react.portal\"):60106,r=n?Symbol.for(\"react.fragment\"):60107,t=n?Symbol.for(\"react.strict_mode\"):60108,u=n?Symbol.for(\"react.profiler\"):60114,v=n?Symbol.for(\"react.provider\"):60109,w=n?Symbol.for(\"react.context\"):60110,x=n?Symbol.for(\"react.forward_ref\"):60112,y=n?Symbol.for(\"react.suspense\"):60113,z=n?Symbol.for(\"react.memo\"):60115,A=n?Symbol.for(\"react.lazy\"):\n60116,B=\"function\"===typeof Symbol&&Symbol.iterator;function C(a){for(var b=\"https://reactjs.org/docs/error-decoder.html?invariant=\"+a,c=1;c<arguments.length;c++)b+=\"&args[]=\"+encodeURIComponent(arguments[c]);return\"Minified React error #\"+a+\"; visit \"+b+\" for the full message or use the non-minified dev environment for full errors and additional helpful warnings.\"}\nvar D={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},E={};function F(a,b,c){this.props=a;this.context=b;this.refs=E;this.updater=c||D}F.prototype.isReactComponent={};F.prototype.setState=function(a,b){if(\"object\"!==typeof a&&\"function\"!==typeof a&&null!=a)throw Error(C(85));this.updater.enqueueSetState(this,a,b,\"setState\")};F.prototype.forceUpdate=function(a){this.updater.enqueueForceUpdate(this,a,\"forceUpdate\")};\nfunction G(){}G.prototype=F.prototype;function H(a,b,c){this.props=a;this.context=b;this.refs=E;this.updater=c||D}var I=H.prototype=new G;I.constructor=H;l(I,F.prototype);I.isPureReactComponent=!0;var J={current:null},K=Object.prototype.hasOwnProperty,L={key:!0,ref:!0,__self:!0,__source:!0};\nfunction M(a,b,c){var e,d={},g=null,k=null;if(null!=b)for(e in void 0!==b.ref&&(k=b.ref),void 0!==b.key&&(g=\"\"+b.key),b)K.call(b,e)&&!L.hasOwnProperty(e)&&(d[e]=b[e]);var f=arguments.length-2;if(1===f)d.children=c;else if(1<f){for(var h=Array(f),m=0;m<f;m++)h[m]=arguments[m+2];d.children=h}if(a&&a.defaultProps)for(e in f=a.defaultProps,f)void 0===d[e]&&(d[e]=f[e]);return{$$typeof:p,type:a,key:g,ref:k,props:d,_owner:J.current}}\nfunction N(a,b){return{$$typeof:p,type:a.type,key:b,ref:a.ref,props:a.props,_owner:a._owner}}function O(a){return\"object\"===typeof a&&null!==a&&a.$$typeof===p}function escape(a){var b={\"=\":\"=0\",\":\":\"=2\"};return\"$\"+(\"\"+a).replace(/[=:]/g,function(a){return b[a]})}var P=/\\/+/g,Q=[];function R(a,b,c,e){if(Q.length){var d=Q.pop();d.result=a;d.keyPrefix=b;d.func=c;d.context=e;d.count=0;return d}return{result:a,keyPrefix:b,func:c,context:e,count:0}}\nfunction S(a){a.result=null;a.keyPrefix=null;a.func=null;a.context=null;a.count=0;10>Q.length&&Q.push(a)}\nfunction T(a,b,c,e){var d=typeof a;if(\"undefined\"===d||\"boolean\"===d)a=null;var g=!1;if(null===a)g=!0;else switch(d){case \"string\":case \"number\":g=!0;break;case \"object\":switch(a.$$typeof){case p:case q:g=!0}}if(g)return c(e,a,\"\"===b?\".\"+U(a,0):b),1;g=0;b=\"\"===b?\".\":b+\":\";if(Array.isArray(a))for(var k=0;k<a.length;k++){d=a[k];var f=b+U(d,k);g+=T(d,f,c,e)}else if(null===a||\"object\"!==typeof a?f=null:(f=B&&a[B]||a[\"@@iterator\"],f=\"function\"===typeof f?f:null),\"function\"===typeof f)for(a=f.call(a),k=\n0;!(d=a.next()).done;)d=d.value,f=b+U(d,k++),g+=T(d,f,c,e);else if(\"object\"===d)throw c=\"\"+a,Error(C(31,\"[object Object]\"===c?\"object with keys {\"+Object.keys(a).join(\", \")+\"}\":c,\"\"));return g}function V(a,b,c){return null==a?0:T(a,\"\",b,c)}function U(a,b){return\"object\"===typeof a&&null!==a&&null!=a.key?escape(a.key):b.toString(36)}function W(a,b){a.func.call(a.context,b,a.count++)}\nfunction aa(a,b,c){var e=a.result,d=a.keyPrefix;a=a.func.call(a.context,b,a.count++);Array.isArray(a)?X(a,e,c,function(a){return a}):null!=a&&(O(a)&&(a=N(a,d+(!a.key||b&&b.key===a.key?\"\":(\"\"+a.key).replace(P,\"$&/\")+\"/\")+c)),e.push(a))}function X(a,b,c,e,d){var g=\"\";null!=c&&(g=(\"\"+c).replace(P,\"$&/\")+\"/\");b=R(b,g,e,d);V(a,aa,b);S(b)}var Y={current:null};function Z(){var a=Y.current;if(null===a)throw Error(C(321));return a}\nvar ba={ReactCurrentDispatcher:Y,ReactCurrentBatchConfig:{suspense:null},ReactCurrentOwner:J,IsSomeRendererActing:{current:!1},assign:l};exports.Children={map:function(a,b,c){if(null==a)return a;var e=[];X(a,e,null,b,c);return e},forEach:function(a,b,c){if(null==a)return a;b=R(null,null,b,c);V(a,W,b);S(b)},count:function(a){return V(a,function(){return null},null)},toArray:function(a){var b=[];X(a,b,null,function(a){return a});return b},only:function(a){if(!O(a))throw Error(C(143));return a}};\nexports.Component=F;exports.Fragment=r;exports.Profiler=u;exports.PureComponent=H;exports.StrictMode=t;exports.Suspense=y;exports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=ba;\nexports.cloneElement=function(a,b,c){if(null===a||void 0===a)throw Error(C(267,a));var e=l({},a.props),d=a.key,g=a.ref,k=a._owner;if(null!=b){void 0!==b.ref&&(g=b.ref,k=J.current);void 0!==b.key&&(d=\"\"+b.key);if(a.type&&a.type.defaultProps)var f=a.type.defaultProps;for(h in b)K.call(b,h)&&!L.hasOwnProperty(h)&&(e[h]=void 0===b[h]&&void 0!==f?f[h]:b[h])}var h=arguments.length-2;if(1===h)e.children=c;else if(1<h){f=Array(h);for(var m=0;m<h;m++)f[m]=arguments[m+2];e.children=f}return{$$typeof:p,type:a.type,\nkey:d,ref:g,props:e,_owner:k}};exports.createContext=function(a,b){void 0===b&&(b=null);a={$$typeof:w,_calculateChangedBits:b,_currentValue:a,_currentValue2:a,_threadCount:0,Provider:null,Consumer:null};a.Provider={$$typeof:v,_context:a};return a.Consumer=a};exports.createElement=M;exports.createFactory=function(a){var b=M.bind(null,a);b.type=a;return b};exports.createRef=function(){return{current:null}};exports.forwardRef=function(a){return{$$typeof:x,render:a}};exports.isValidElement=O;\nexports.lazy=function(a){return{$$typeof:A,_ctor:a,_status:-1,_result:null}};exports.memo=function(a,b){return{$$typeof:z,type:a,compare:void 0===b?null:b}};exports.useCallback=function(a,b){return Z().useCallback(a,b)};exports.useContext=function(a,b){return Z().useContext(a,b)};exports.useDebugValue=function(){};exports.useEffect=function(a,b){return Z().useEffect(a,b)};exports.useImperativeHandle=function(a,b,c){return Z().useImperativeHandle(a,b,c)};\nexports.useLayoutEffect=function(a,b){return Z().useLayoutEffect(a,b)};exports.useMemo=function(a,b){return Z().useMemo(a,b)};exports.useReducer=function(a,b,c){return Z().useReducer(a,b,c)};exports.useRef=function(a){return Z().useRef(a)};exports.useState=function(a){return Z().useState(a)};exports.version=\"16.14.0\";\n","/** @license React v16.14.0\n * react-dom.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n/*\n Modernizr 3.0.0pre (Custom Build) | MIT\n*/\n'use strict';var aa=require(\"react\"),n=require(\"object-assign\"),r=require(\"scheduler\");function u(a){for(var b=\"https://reactjs.org/docs/error-decoder.html?invariant=\"+a,c=1;c<arguments.length;c++)b+=\"&args[]=\"+encodeURIComponent(arguments[c]);return\"Minified React error #\"+a+\"; visit \"+b+\" for the full message or use the non-minified dev environment for full errors and additional helpful warnings.\"}if(!aa)throw Error(u(227));\nfunction ba(a,b,c,d,e,f,g,h,k){var l=Array.prototype.slice.call(arguments,3);try{b.apply(c,l)}catch(m){this.onError(m)}}var da=!1,ea=null,fa=!1,ha=null,ia={onError:function(a){da=!0;ea=a}};function ja(a,b,c,d,e,f,g,h,k){da=!1;ea=null;ba.apply(ia,arguments)}function ka(a,b,c,d,e,f,g,h,k){ja.apply(this,arguments);if(da){if(da){var l=ea;da=!1;ea=null}else throw Error(u(198));fa||(fa=!0,ha=l)}}var la=null,ma=null,na=null;\nfunction oa(a,b,c){var d=a.type||\"unknown-event\";a.currentTarget=na(c);ka(d,b,void 0,a);a.currentTarget=null}var pa=null,qa={};\nfunction ra(){if(pa)for(var a in qa){var b=qa[a],c=pa.indexOf(a);if(!(-1<c))throw Error(u(96,a));if(!sa[c]){if(!b.extractEvents)throw Error(u(97,a));sa[c]=b;c=b.eventTypes;for(var d in c){var e=void 0;var f=c[d],g=b,h=d;if(ta.hasOwnProperty(h))throw Error(u(99,h));ta[h]=f;var k=f.phasedRegistrationNames;if(k){for(e in k)k.hasOwnProperty(e)&&ua(k[e],g,h);e=!0}else f.registrationName?(ua(f.registrationName,g,h),e=!0):e=!1;if(!e)throw Error(u(98,d,a));}}}}\nfunction ua(a,b,c){if(va[a])throw Error(u(100,a));va[a]=b;wa[a]=b.eventTypes[c].dependencies}var sa=[],ta={},va={},wa={};function xa(a){var b=!1,c;for(c in a)if(a.hasOwnProperty(c)){var d=a[c];if(!qa.hasOwnProperty(c)||qa[c]!==d){if(qa[c])throw Error(u(102,c));qa[c]=d;b=!0}}b&&ra()}var ya=!(\"undefined\"===typeof window||\"undefined\"===typeof window.document||\"undefined\"===typeof window.document.createElement),za=null,Aa=null,Ba=null;\nfunction Ca(a){if(a=ma(a)){if(\"function\"!==typeof za)throw Error(u(280));var b=a.stateNode;b&&(b=la(b),za(a.stateNode,a.type,b))}}function Da(a){Aa?Ba?Ba.push(a):Ba=[a]:Aa=a}function Ea(){if(Aa){var a=Aa,b=Ba;Ba=Aa=null;Ca(a);if(b)for(a=0;a<b.length;a++)Ca(b[a])}}function Fa(a,b){return a(b)}function Ga(a,b,c,d,e){return a(b,c,d,e)}function Ha(){}var Ia=Fa,Ja=!1,Ka=!1;function La(){if(null!==Aa||null!==Ba)Ha(),Ea()}\nfunction Ma(a,b,c){if(Ka)return a(b,c);Ka=!0;try{return Ia(a,b,c)}finally{Ka=!1,La()}}var Na=/^[:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD][:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$/,Oa=Object.prototype.hasOwnProperty,Pa={},Qa={};\nfunction Ra(a){if(Oa.call(Qa,a))return!0;if(Oa.call(Pa,a))return!1;if(Na.test(a))return Qa[a]=!0;Pa[a]=!0;return!1}function Sa(a,b,c,d){if(null!==c&&0===c.type)return!1;switch(typeof b){case \"function\":case \"symbol\":return!0;case \"boolean\":if(d)return!1;if(null!==c)return!c.acceptsBooleans;a=a.toLowerCase().slice(0,5);return\"data-\"!==a&&\"aria-\"!==a;default:return!1}}\nfunction Ta(a,b,c,d){if(null===b||\"undefined\"===typeof b||Sa(a,b,c,d))return!0;if(d)return!1;if(null!==c)switch(c.type){case 3:return!b;case 4:return!1===b;case 5:return isNaN(b);case 6:return isNaN(b)||1>b}return!1}function v(a,b,c,d,e,f){this.acceptsBooleans=2===b||3===b||4===b;this.attributeName=d;this.attributeNamespace=e;this.mustUseProperty=c;this.propertyName=a;this.type=b;this.sanitizeURL=f}var C={};\n\"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style\".split(\" \").forEach(function(a){C[a]=new v(a,0,!1,a,null,!1)});[[\"acceptCharset\",\"accept-charset\"],[\"className\",\"class\"],[\"htmlFor\",\"for\"],[\"httpEquiv\",\"http-equiv\"]].forEach(function(a){var b=a[0];C[b]=new v(b,1,!1,a[1],null,!1)});[\"contentEditable\",\"draggable\",\"spellCheck\",\"value\"].forEach(function(a){C[a]=new v(a,2,!1,a.toLowerCase(),null,!1)});\n[\"autoReverse\",\"externalResourcesRequired\",\"focusable\",\"preserveAlpha\"].forEach(function(a){C[a]=new v(a,2,!1,a,null,!1)});\"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope\".split(\" \").forEach(function(a){C[a]=new v(a,3,!1,a.toLowerCase(),null,!1)});\n[\"checked\",\"multiple\",\"muted\",\"selected\"].forEach(function(a){C[a]=new v(a,3,!0,a,null,!1)});[\"capture\",\"download\"].forEach(function(a){C[a]=new v(a,4,!1,a,null,!1)});[\"cols\",\"rows\",\"size\",\"span\"].forEach(function(a){C[a]=new v(a,6,!1,a,null,!1)});[\"rowSpan\",\"start\"].forEach(function(a){C[a]=new v(a,5,!1,a.toLowerCase(),null,!1)});var Ua=/[\\-:]([a-z])/g;function Va(a){return a[1].toUpperCase()}\n\"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height\".split(\" \").forEach(function(a){var b=a.replace(Ua,\nVa);C[b]=new v(b,1,!1,a,null,!1)});\"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type\".split(\" \").forEach(function(a){var b=a.replace(Ua,Va);C[b]=new v(b,1,!1,a,\"http://www.w3.org/1999/xlink\",!1)});[\"xml:base\",\"xml:lang\",\"xml:space\"].forEach(function(a){var b=a.replace(Ua,Va);C[b]=new v(b,1,!1,a,\"http://www.w3.org/XML/1998/namespace\",!1)});[\"tabIndex\",\"crossOrigin\"].forEach(function(a){C[a]=new v(a,1,!1,a.toLowerCase(),null,!1)});\nC.xlinkHref=new v(\"xlinkHref\",1,!1,\"xlink:href\",\"http://www.w3.org/1999/xlink\",!0);[\"src\",\"href\",\"action\",\"formAction\"].forEach(function(a){C[a]=new v(a,1,!1,a.toLowerCase(),null,!0)});var Wa=aa.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;Wa.hasOwnProperty(\"ReactCurrentDispatcher\")||(Wa.ReactCurrentDispatcher={current:null});Wa.hasOwnProperty(\"ReactCurrentBatchConfig\")||(Wa.ReactCurrentBatchConfig={suspense:null});\nfunction Xa(a,b,c,d){var e=C.hasOwnProperty(b)?C[b]:null;var f=null!==e?0===e.type:d?!1:!(2<b.length)||\"o\"!==b[0]&&\"O\"!==b[0]||\"n\"!==b[1]&&\"N\"!==b[1]?!1:!0;f||(Ta(b,c,e,d)&&(c=null),d||null===e?Ra(b)&&(null===c?a.removeAttribute(b):a.setAttribute(b,\"\"+c)):e.mustUseProperty?a[e.propertyName]=null===c?3===e.type?!1:\"\":c:(b=e.attributeName,d=e.attributeNamespace,null===c?a.removeAttribute(b):(e=e.type,c=3===e||4===e&&!0===c?\"\":\"\"+c,d?a.setAttributeNS(d,b,c):a.setAttribute(b,c))))}\nvar Ya=/^(.*)[\\\\\\/]/,E=\"function\"===typeof Symbol&&Symbol.for,Za=E?Symbol.for(\"react.element\"):60103,$a=E?Symbol.for(\"react.portal\"):60106,ab=E?Symbol.for(\"react.fragment\"):60107,bb=E?Symbol.for(\"react.strict_mode\"):60108,cb=E?Symbol.for(\"react.profiler\"):60114,db=E?Symbol.for(\"react.provider\"):60109,eb=E?Symbol.for(\"react.context\"):60110,fb=E?Symbol.for(\"react.concurrent_mode\"):60111,gb=E?Symbol.for(\"react.forward_ref\"):60112,hb=E?Symbol.for(\"react.suspense\"):60113,ib=E?Symbol.for(\"react.suspense_list\"):\n60120,jb=E?Symbol.for(\"react.memo\"):60115,kb=E?Symbol.for(\"react.lazy\"):60116,lb=E?Symbol.for(\"react.block\"):60121,mb=\"function\"===typeof Symbol&&Symbol.iterator;function nb(a){if(null===a||\"object\"!==typeof a)return null;a=mb&&a[mb]||a[\"@@iterator\"];return\"function\"===typeof a?a:null}function ob(a){if(-1===a._status){a._status=0;var b=a._ctor;b=b();a._result=b;b.then(function(b){0===a._status&&(b=b.default,a._status=1,a._result=b)},function(b){0===a._status&&(a._status=2,a._result=b)})}}\nfunction pb(a){if(null==a)return null;if(\"function\"===typeof a)return a.displayName||a.name||null;if(\"string\"===typeof a)return a;switch(a){case ab:return\"Fragment\";case $a:return\"Portal\";case cb:return\"Profiler\";case bb:return\"StrictMode\";case hb:return\"Suspense\";case ib:return\"SuspenseList\"}if(\"object\"===typeof a)switch(a.$$typeof){case eb:return\"Context.Consumer\";case db:return\"Context.Provider\";case gb:var b=a.render;b=b.displayName||b.name||\"\";return a.displayName||(\"\"!==b?\"ForwardRef(\"+b+\")\":\n\"ForwardRef\");case jb:return pb(a.type);case lb:return pb(a.render);case kb:if(a=1===a._status?a._result:null)return pb(a)}return null}function qb(a){var b=\"\";do{a:switch(a.tag){case 3:case 4:case 6:case 7:case 10:case 9:var c=\"\";break a;default:var d=a._debugOwner,e=a._debugSource,f=pb(a.type);c=null;d&&(c=pb(d.type));d=f;f=\"\";e?f=\" (at \"+e.fileName.replace(Ya,\"\")+\":\"+e.lineNumber+\")\":c&&(f=\" (created by \"+c+\")\");c=\"\\n in \"+(d||\"Unknown\")+f}b+=c;a=a.return}while(a);return b}\nfunction rb(a){switch(typeof a){case \"boolean\":case \"number\":case \"object\":case \"string\":case \"undefined\":return a;default:return\"\"}}function sb(a){var b=a.type;return(a=a.nodeName)&&\"input\"===a.toLowerCase()&&(\"checkbox\"===b||\"radio\"===b)}\nfunction tb(a){var b=sb(a)?\"checked\":\"value\",c=Object.getOwnPropertyDescriptor(a.constructor.prototype,b),d=\"\"+a[b];if(!a.hasOwnProperty(b)&&\"undefined\"!==typeof c&&\"function\"===typeof c.get&&\"function\"===typeof c.set){var e=c.get,f=c.set;Object.defineProperty(a,b,{configurable:!0,get:function(){return e.call(this)},set:function(a){d=\"\"+a;f.call(this,a)}});Object.defineProperty(a,b,{enumerable:c.enumerable});return{getValue:function(){return d},setValue:function(a){d=\"\"+a},stopTracking:function(){a._valueTracker=\nnull;delete a[b]}}}}function xb(a){a._valueTracker||(a._valueTracker=tb(a))}function yb(a){if(!a)return!1;var b=a._valueTracker;if(!b)return!0;var c=b.getValue();var d=\"\";a&&(d=sb(a)?a.checked?\"true\":\"false\":a.value);a=d;return a!==c?(b.setValue(a),!0):!1}function zb(a,b){var c=b.checked;return n({},b,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=c?c:a._wrapperState.initialChecked})}\nfunction Ab(a,b){var c=null==b.defaultValue?\"\":b.defaultValue,d=null!=b.checked?b.checked:b.defaultChecked;c=rb(null!=b.value?b.value:c);a._wrapperState={initialChecked:d,initialValue:c,controlled:\"checkbox\"===b.type||\"radio\"===b.type?null!=b.checked:null!=b.value}}function Bb(a,b){b=b.checked;null!=b&&Xa(a,\"checked\",b,!1)}\nfunction Cb(a,b){Bb(a,b);var c=rb(b.value),d=b.type;if(null!=c)if(\"number\"===d){if(0===c&&\"\"===a.value||a.value!=c)a.value=\"\"+c}else a.value!==\"\"+c&&(a.value=\"\"+c);else if(\"submit\"===d||\"reset\"===d){a.removeAttribute(\"value\");return}b.hasOwnProperty(\"value\")?Db(a,b.type,c):b.hasOwnProperty(\"defaultValue\")&&Db(a,b.type,rb(b.defaultValue));null==b.checked&&null!=b.defaultChecked&&(a.defaultChecked=!!b.defaultChecked)}\nfunction Eb(a,b,c){if(b.hasOwnProperty(\"value\")||b.hasOwnProperty(\"defaultValue\")){var d=b.type;if(!(\"submit\"!==d&&\"reset\"!==d||void 0!==b.value&&null!==b.value))return;b=\"\"+a._wrapperState.initialValue;c||b===a.value||(a.value=b);a.defaultValue=b}c=a.name;\"\"!==c&&(a.name=\"\");a.defaultChecked=!!a._wrapperState.initialChecked;\"\"!==c&&(a.name=c)}\nfunction Db(a,b,c){if(\"number\"!==b||a.ownerDocument.activeElement!==a)null==c?a.defaultValue=\"\"+a._wrapperState.initialValue:a.defaultValue!==\"\"+c&&(a.defaultValue=\"\"+c)}function Fb(a){var b=\"\";aa.Children.forEach(a,function(a){null!=a&&(b+=a)});return b}function Gb(a,b){a=n({children:void 0},b);if(b=Fb(b.children))a.children=b;return a}\nfunction Hb(a,b,c,d){a=a.options;if(b){b={};for(var e=0;e<c.length;e++)b[\"$\"+c[e]]=!0;for(c=0;c<a.length;c++)e=b.hasOwnProperty(\"$\"+a[c].value),a[c].selected!==e&&(a[c].selected=e),e&&d&&(a[c].defaultSelected=!0)}else{c=\"\"+rb(c);b=null;for(e=0;e<a.length;e++){if(a[e].value===c){a[e].selected=!0;d&&(a[e].defaultSelected=!0);return}null!==b||a[e].disabled||(b=a[e])}null!==b&&(b.selected=!0)}}\nfunction Ib(a,b){if(null!=b.dangerouslySetInnerHTML)throw Error(u(91));return n({},b,{value:void 0,defaultValue:void 0,children:\"\"+a._wrapperState.initialValue})}function Jb(a,b){var c=b.value;if(null==c){c=b.children;b=b.defaultValue;if(null!=c){if(null!=b)throw Error(u(92));if(Array.isArray(c)){if(!(1>=c.length))throw Error(u(93));c=c[0]}b=c}null==b&&(b=\"\");c=b}a._wrapperState={initialValue:rb(c)}}\nfunction Kb(a,b){var c=rb(b.value),d=rb(b.defaultValue);null!=c&&(c=\"\"+c,c!==a.value&&(a.value=c),null==b.defaultValue&&a.defaultValue!==c&&(a.defaultValue=c));null!=d&&(a.defaultValue=\"\"+d)}function Lb(a){var b=a.textContent;b===a._wrapperState.initialValue&&\"\"!==b&&null!==b&&(a.value=b)}var Mb={html:\"http://www.w3.org/1999/xhtml\",mathml:\"http://www.w3.org/1998/Math/MathML\",svg:\"http://www.w3.org/2000/svg\"};\nfunction Nb(a){switch(a){case \"svg\":return\"http://www.w3.org/2000/svg\";case \"math\":return\"http://www.w3.org/1998/Math/MathML\";default:return\"http://www.w3.org/1999/xhtml\"}}function Ob(a,b){return null==a||\"http://www.w3.org/1999/xhtml\"===a?Nb(b):\"http://www.w3.org/2000/svg\"===a&&\"foreignObject\"===b?\"http://www.w3.org/1999/xhtml\":a}\nvar Pb,Qb=function(a){return\"undefined\"!==typeof MSApp&&MSApp.execUnsafeLocalFunction?function(b,c,d,e){MSApp.execUnsafeLocalFunction(function(){return a(b,c,d,e)})}:a}(function(a,b){if(a.namespaceURI!==Mb.svg||\"innerHTML\"in a)a.innerHTML=b;else{Pb=Pb||document.createElement(\"div\");Pb.innerHTML=\"<svg>\"+b.valueOf().toString()+\"</svg>\";for(b=Pb.firstChild;a.firstChild;)a.removeChild(a.firstChild);for(;b.firstChild;)a.appendChild(b.firstChild)}});\nfunction Rb(a,b){if(b){var c=a.firstChild;if(c&&c===a.lastChild&&3===c.nodeType){c.nodeValue=b;return}}a.textContent=b}function Sb(a,b){var c={};c[a.toLowerCase()]=b.toLowerCase();c[\"Webkit\"+a]=\"webkit\"+b;c[\"Moz\"+a]=\"moz\"+b;return c}var Tb={animationend:Sb(\"Animation\",\"AnimationEnd\"),animationiteration:Sb(\"Animation\",\"AnimationIteration\"),animationstart:Sb(\"Animation\",\"AnimationStart\"),transitionend:Sb(\"Transition\",\"TransitionEnd\")},Ub={},Vb={};\nya&&(Vb=document.createElement(\"div\").style,\"AnimationEvent\"in window||(delete Tb.animationend.animation,delete Tb.animationiteration.animation,delete Tb.animationstart.animation),\"TransitionEvent\"in window||delete Tb.transitionend.transition);function Wb(a){if(Ub[a])return Ub[a];if(!Tb[a])return a;var b=Tb[a],c;for(c in b)if(b.hasOwnProperty(c)&&c in Vb)return Ub[a]=b[c];return a}\nvar Xb=Wb(\"animationend\"),Yb=Wb(\"animationiteration\"),Zb=Wb(\"animationstart\"),$b=Wb(\"transitionend\"),ac=\"abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange seeked seeking stalled suspend timeupdate volumechange waiting\".split(\" \"),bc=new (\"function\"===typeof WeakMap?WeakMap:Map);function cc(a){var b=bc.get(a);void 0===b&&(b=new Map,bc.set(a,b));return b}\nfunction dc(a){var b=a,c=a;if(a.alternate)for(;b.return;)b=b.return;else{a=b;do b=a,0!==(b.effectTag&1026)&&(c=b.return),a=b.return;while(a)}return 3===b.tag?c:null}function ec(a){if(13===a.tag){var b=a.memoizedState;null===b&&(a=a.alternate,null!==a&&(b=a.memoizedState));if(null!==b)return b.dehydrated}return null}function fc(a){if(dc(a)!==a)throw Error(u(188));}\nfunction gc(a){var b=a.alternate;if(!b){b=dc(a);if(null===b)throw Error(u(188));return b!==a?null:a}for(var c=a,d=b;;){var e=c.return;if(null===e)break;var f=e.alternate;if(null===f){d=e.return;if(null!==d){c=d;continue}break}if(e.child===f.child){for(f=e.child;f;){if(f===c)return fc(e),a;if(f===d)return fc(e),b;f=f.sibling}throw Error(u(188));}if(c.return!==d.return)c=e,d=f;else{for(var g=!1,h=e.child;h;){if(h===c){g=!0;c=e;d=f;break}if(h===d){g=!0;d=e;c=f;break}h=h.sibling}if(!g){for(h=f.child;h;){if(h===\nc){g=!0;c=f;d=e;break}if(h===d){g=!0;d=f;c=e;break}h=h.sibling}if(!g)throw Error(u(189));}}if(c.alternate!==d)throw Error(u(190));}if(3!==c.tag)throw Error(u(188));return c.stateNode.current===c?a:b}function hc(a){a=gc(a);if(!a)return null;for(var b=a;;){if(5===b.tag||6===b.tag)return b;if(b.child)b.child.return=b,b=b.child;else{if(b===a)break;for(;!b.sibling;){if(!b.return||b.return===a)return null;b=b.return}b.sibling.return=b.return;b=b.sibling}}return null}\nfunction ic(a,b){if(null==b)throw Error(u(30));if(null==a)return b;if(Array.isArray(a)){if(Array.isArray(b))return a.push.apply(a,b),a;a.push(b);return a}return Array.isArray(b)?[a].concat(b):[a,b]}function jc(a,b,c){Array.isArray(a)?a.forEach(b,c):a&&b.call(c,a)}var kc=null;\nfunction lc(a){if(a){var b=a._dispatchListeners,c=a._dispatchInstances;if(Array.isArray(b))for(var d=0;d<b.length&&!a.isPropagationStopped();d++)oa(a,b[d],c[d]);else b&&oa(a,b,c);a._dispatchListeners=null;a._dispatchInstances=null;a.isPersistent()||a.constructor.release(a)}}function mc(a){null!==a&&(kc=ic(kc,a));a=kc;kc=null;if(a){jc(a,lc);if(kc)throw Error(u(95));if(fa)throw a=ha,fa=!1,ha=null,a;}}\nfunction nc(a){a=a.target||a.srcElement||window;a.correspondingUseElement&&(a=a.correspondingUseElement);return 3===a.nodeType?a.parentNode:a}function oc(a){if(!ya)return!1;a=\"on\"+a;var b=a in document;b||(b=document.createElement(\"div\"),b.setAttribute(a,\"return;\"),b=\"function\"===typeof b[a]);return b}var pc=[];function qc(a){a.topLevelType=null;a.nativeEvent=null;a.targetInst=null;a.ancestors.length=0;10>pc.length&&pc.push(a)}\nfunction rc(a,b,c,d){if(pc.length){var e=pc.pop();e.topLevelType=a;e.eventSystemFlags=d;e.nativeEvent=b;e.targetInst=c;return e}return{topLevelType:a,eventSystemFlags:d,nativeEvent:b,targetInst:c,ancestors:[]}}\nfunction sc(a){var b=a.targetInst,c=b;do{if(!c){a.ancestors.push(c);break}var d=c;if(3===d.tag)d=d.stateNode.containerInfo;else{for(;d.return;)d=d.return;d=3!==d.tag?null:d.stateNode.containerInfo}if(!d)break;b=c.tag;5!==b&&6!==b||a.ancestors.push(c);c=tc(d)}while(c);for(c=0;c<a.ancestors.length;c++){b=a.ancestors[c];var e=nc(a.nativeEvent);d=a.topLevelType;var f=a.nativeEvent,g=a.eventSystemFlags;0===c&&(g|=64);for(var h=null,k=0;k<sa.length;k++){var l=sa[k];l&&(l=l.extractEvents(d,b,f,e,g))&&(h=\nic(h,l))}mc(h)}}function uc(a,b,c){if(!c.has(a)){switch(a){case \"scroll\":vc(b,\"scroll\",!0);break;case \"focus\":case \"blur\":vc(b,\"focus\",!0);vc(b,\"blur\",!0);c.set(\"blur\",null);c.set(\"focus\",null);break;case \"cancel\":case \"close\":oc(a)&&vc(b,a,!0);break;case \"invalid\":case \"submit\":case \"reset\":break;default:-1===ac.indexOf(a)&&F(a,b)}c.set(a,null)}}\nvar wc,xc,yc,zc=!1,Ac=[],Bc=null,Cc=null,Dc=null,Ec=new Map,Fc=new Map,Gc=[],Hc=\"mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput close cancel copy cut paste click change contextmenu reset submit\".split(\" \"),Ic=\"focus blur dragenter dragleave mouseover mouseout pointerover pointerout gotpointercapture lostpointercapture\".split(\" \");\nfunction Jc(a,b){var c=cc(b);Hc.forEach(function(a){uc(a,b,c)});Ic.forEach(function(a){uc(a,b,c)})}function Kc(a,b,c,d,e){return{blockedOn:a,topLevelType:b,eventSystemFlags:c|32,nativeEvent:e,container:d}}\nfunction Lc(a,b){switch(a){case \"focus\":case \"blur\":Bc=null;break;case \"dragenter\":case \"dragleave\":Cc=null;break;case \"mouseover\":case \"mouseout\":Dc=null;break;case \"pointerover\":case \"pointerout\":Ec.delete(b.pointerId);break;case \"gotpointercapture\":case \"lostpointercapture\":Fc.delete(b.pointerId)}}function Mc(a,b,c,d,e,f){if(null===a||a.nativeEvent!==f)return a=Kc(b,c,d,e,f),null!==b&&(b=Nc(b),null!==b&&xc(b)),a;a.eventSystemFlags|=d;return a}\nfunction Oc(a,b,c,d,e){switch(b){case \"focus\":return Bc=Mc(Bc,a,b,c,d,e),!0;case \"dragenter\":return Cc=Mc(Cc,a,b,c,d,e),!0;case \"mouseover\":return Dc=Mc(Dc,a,b,c,d,e),!0;case \"pointerover\":var f=e.pointerId;Ec.set(f,Mc(Ec.get(f)||null,a,b,c,d,e));return!0;case \"gotpointercapture\":return f=e.pointerId,Fc.set(f,Mc(Fc.get(f)||null,a,b,c,d,e)),!0}return!1}\nfunction Pc(a){var b=tc(a.target);if(null!==b){var c=dc(b);if(null!==c)if(b=c.tag,13===b){if(b=ec(c),null!==b){a.blockedOn=b;r.unstable_runWithPriority(a.priority,function(){yc(c)});return}}else if(3===b&&c.stateNode.hydrate){a.blockedOn=3===c.tag?c.stateNode.containerInfo:null;return}}a.blockedOn=null}function Qc(a){if(null!==a.blockedOn)return!1;var b=Rc(a.topLevelType,a.eventSystemFlags,a.container,a.nativeEvent);if(null!==b){var c=Nc(b);null!==c&&xc(c);a.blockedOn=b;return!1}return!0}\nfunction Sc(a,b,c){Qc(a)&&c.delete(b)}function Tc(){for(zc=!1;0<Ac.length;){var a=Ac[0];if(null!==a.blockedOn){a=Nc(a.blockedOn);null!==a&&wc(a);break}var b=Rc(a.topLevelType,a.eventSystemFlags,a.container,a.nativeEvent);null!==b?a.blockedOn=b:Ac.shift()}null!==Bc&&Qc(Bc)&&(Bc=null);null!==Cc&&Qc(Cc)&&(Cc=null);null!==Dc&&Qc(Dc)&&(Dc=null);Ec.forEach(Sc);Fc.forEach(Sc)}function Uc(a,b){a.blockedOn===b&&(a.blockedOn=null,zc||(zc=!0,r.unstable_scheduleCallback(r.unstable_NormalPriority,Tc)))}\nfunction Vc(a){function b(b){return Uc(b,a)}if(0<Ac.length){Uc(Ac[0],a);for(var c=1;c<Ac.length;c++){var d=Ac[c];d.blockedOn===a&&(d.blockedOn=null)}}null!==Bc&&Uc(Bc,a);null!==Cc&&Uc(Cc,a);null!==Dc&&Uc(Dc,a);Ec.forEach(b);Fc.forEach(b);for(c=0;c<Gc.length;c++)d=Gc[c],d.blockedOn===a&&(d.blockedOn=null);for(;0<Gc.length&&(c=Gc[0],null===c.blockedOn);)Pc(c),null===c.blockedOn&&Gc.shift()}\nvar Wc={},Yc=new Map,Zc=new Map,$c=[\"abort\",\"abort\",Xb,\"animationEnd\",Yb,\"animationIteration\",Zb,\"animationStart\",\"canplay\",\"canPlay\",\"canplaythrough\",\"canPlayThrough\",\"durationchange\",\"durationChange\",\"emptied\",\"emptied\",\"encrypted\",\"encrypted\",\"ended\",\"ended\",\"error\",\"error\",\"gotpointercapture\",\"gotPointerCapture\",\"load\",\"load\",\"loadeddata\",\"loadedData\",\"loadedmetadata\",\"loadedMetadata\",\"loadstart\",\"loadStart\",\"lostpointercapture\",\"lostPointerCapture\",\"playing\",\"playing\",\"progress\",\"progress\",\"seeking\",\n\"seeking\",\"stalled\",\"stalled\",\"suspend\",\"suspend\",\"timeupdate\",\"timeUpdate\",$b,\"transitionEnd\",\"waiting\",\"waiting\"];function ad(a,b){for(var c=0;c<a.length;c+=2){var d=a[c],e=a[c+1],f=\"on\"+(e[0].toUpperCase()+e.slice(1));f={phasedRegistrationNames:{bubbled:f,captured:f+\"Capture\"},dependencies:[d],eventPriority:b};Zc.set(d,b);Yc.set(d,f);Wc[e]=f}}\nad(\"blur blur cancel cancel click click close close contextmenu contextMenu copy copy cut cut auxclick auxClick dblclick doubleClick dragend dragEnd dragstart dragStart drop drop focus focus input input invalid invalid keydown keyDown keypress keyPress keyup keyUp mousedown mouseDown mouseup mouseUp paste paste pause pause play play pointercancel pointerCancel pointerdown pointerDown pointerup pointerUp ratechange rateChange reset reset seeked seeked submit submit touchcancel touchCancel touchend touchEnd touchstart touchStart volumechange volumeChange\".split(\" \"),0);\nad(\"drag drag dragenter dragEnter dragexit dragExit dragleave dragLeave dragover dragOver mousemove mouseMove mouseout mouseOut mouseover mouseOver pointermove pointerMove pointerout pointerOut pointerover pointerOver scroll scroll toggle toggle touchmove touchMove wheel wheel\".split(\" \"),1);ad($c,2);for(var bd=\"change selectionchange textInput compositionstart compositionend compositionupdate\".split(\" \"),cd=0;cd<bd.length;cd++)Zc.set(bd[cd],0);\nvar dd=r.unstable_UserBlockingPriority,ed=r.unstable_runWithPriority,fd=!0;function F(a,b){vc(b,a,!1)}function vc(a,b,c){var d=Zc.get(b);switch(void 0===d?2:d){case 0:d=gd.bind(null,b,1,a);break;case 1:d=hd.bind(null,b,1,a);break;default:d=id.bind(null,b,1,a)}c?a.addEventListener(b,d,!0):a.addEventListener(b,d,!1)}function gd(a,b,c,d){Ja||Ha();var e=id,f=Ja;Ja=!0;try{Ga(e,a,b,c,d)}finally{(Ja=f)||La()}}function hd(a,b,c,d){ed(dd,id.bind(null,a,b,c,d))}\nfunction id(a,b,c,d){if(fd)if(0<Ac.length&&-1<Hc.indexOf(a))a=Kc(null,a,b,c,d),Ac.push(a);else{var e=Rc(a,b,c,d);if(null===e)Lc(a,d);else if(-1<Hc.indexOf(a))a=Kc(e,a,b,c,d),Ac.push(a);else if(!Oc(e,a,b,c,d)){Lc(a,d);a=rc(a,d,null,b);try{Ma(sc,a)}finally{qc(a)}}}}\nfunction Rc(a,b,c,d){c=nc(d);c=tc(c);if(null!==c){var e=dc(c);if(null===e)c=null;else{var f=e.tag;if(13===f){c=ec(e);if(null!==c)return c;c=null}else if(3===f){if(e.stateNode.hydrate)return 3===e.tag?e.stateNode.containerInfo:null;c=null}else e!==c&&(c=null)}}a=rc(a,d,c,b);try{Ma(sc,a)}finally{qc(a)}return null}\nvar jd={animationIterationCount:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,\nfloodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},kd=[\"Webkit\",\"ms\",\"Moz\",\"O\"];Object.keys(jd).forEach(function(a){kd.forEach(function(b){b=b+a.charAt(0).toUpperCase()+a.substring(1);jd[b]=jd[a]})});function ld(a,b,c){return null==b||\"boolean\"===typeof b||\"\"===b?\"\":c||\"number\"!==typeof b||0===b||jd.hasOwnProperty(a)&&jd[a]?(\"\"+b).trim():b+\"px\"}\nfunction md(a,b){a=a.style;for(var c in b)if(b.hasOwnProperty(c)){var d=0===c.indexOf(\"--\"),e=ld(c,b[c],d);\"float\"===c&&(c=\"cssFloat\");d?a.setProperty(c,e):a[c]=e}}var nd=n({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});\nfunction od(a,b){if(b){if(nd[a]&&(null!=b.children||null!=b.dangerouslySetInnerHTML))throw Error(u(137,a,\"\"));if(null!=b.dangerouslySetInnerHTML){if(null!=b.children)throw Error(u(60));if(!(\"object\"===typeof b.dangerouslySetInnerHTML&&\"__html\"in b.dangerouslySetInnerHTML))throw Error(u(61));}if(null!=b.style&&\"object\"!==typeof b.style)throw Error(u(62,\"\"));}}\nfunction pd(a,b){if(-1===a.indexOf(\"-\"))return\"string\"===typeof b.is;switch(a){case \"annotation-xml\":case \"color-profile\":case \"font-face\":case \"font-face-src\":case \"font-face-uri\":case \"font-face-format\":case \"font-face-name\":case \"missing-glyph\":return!1;default:return!0}}var qd=Mb.html;function rd(a,b){a=9===a.nodeType||11===a.nodeType?a:a.ownerDocument;var c=cc(a);b=wa[b];for(var d=0;d<b.length;d++)uc(b[d],a,c)}function sd(){}\nfunction td(a){a=a||(\"undefined\"!==typeof document?document:void 0);if(\"undefined\"===typeof a)return null;try{return a.activeElement||a.body}catch(b){return a.body}}function ud(a){for(;a&&a.firstChild;)a=a.firstChild;return a}function vd(a,b){var c=ud(a);a=0;for(var d;c;){if(3===c.nodeType){d=a+c.textContent.length;if(a<=b&&d>=b)return{node:c,offset:b-a};a=d}a:{for(;c;){if(c.nextSibling){c=c.nextSibling;break a}c=c.parentNode}c=void 0}c=ud(c)}}\nfunction wd(a,b){return a&&b?a===b?!0:a&&3===a.nodeType?!1:b&&3===b.nodeType?wd(a,b.parentNode):\"contains\"in a?a.contains(b):a.compareDocumentPosition?!!(a.compareDocumentPosition(b)&16):!1:!1}function xd(){for(var a=window,b=td();b instanceof a.HTMLIFrameElement;){try{var c=\"string\"===typeof b.contentWindow.location.href}catch(d){c=!1}if(c)a=b.contentWindow;else break;b=td(a.document)}return b}\nfunction yd(a){var b=a&&a.nodeName&&a.nodeName.toLowerCase();return b&&(\"input\"===b&&(\"text\"===a.type||\"search\"===a.type||\"tel\"===a.type||\"url\"===a.type||\"password\"===a.type)||\"textarea\"===b||\"true\"===a.contentEditable)}var zd=\"$\",Ad=\"/$\",Bd=\"$?\",Cd=\"$!\",Dd=null,Ed=null;function Fd(a,b){switch(a){case \"button\":case \"input\":case \"select\":case \"textarea\":return!!b.autoFocus}return!1}\nfunction Gd(a,b){return\"textarea\"===a||\"option\"===a||\"noscript\"===a||\"string\"===typeof b.children||\"number\"===typeof b.children||\"object\"===typeof b.dangerouslySetInnerHTML&&null!==b.dangerouslySetInnerHTML&&null!=b.dangerouslySetInnerHTML.__html}var Hd=\"function\"===typeof setTimeout?setTimeout:void 0,Id=\"function\"===typeof clearTimeout?clearTimeout:void 0;function Jd(a){for(;null!=a;a=a.nextSibling){var b=a.nodeType;if(1===b||3===b)break}return a}\nfunction Kd(a){a=a.previousSibling;for(var b=0;a;){if(8===a.nodeType){var c=a.data;if(c===zd||c===Cd||c===Bd){if(0===b)return a;b--}else c===Ad&&b++}a=a.previousSibling}return null}var Ld=Math.random().toString(36).slice(2),Md=\"__reactInternalInstance$\"+Ld,Nd=\"__reactEventHandlers$\"+Ld,Od=\"__reactContainere$\"+Ld;\nfunction tc(a){var b=a[Md];if(b)return b;for(var c=a.parentNode;c;){if(b=c[Od]||c[Md]){c=b.alternate;if(null!==b.child||null!==c&&null!==c.child)for(a=Kd(a);null!==a;){if(c=a[Md])return c;a=Kd(a)}return b}a=c;c=a.parentNode}return null}function Nc(a){a=a[Md]||a[Od];return!a||5!==a.tag&&6!==a.tag&&13!==a.tag&&3!==a.tag?null:a}function Pd(a){if(5===a.tag||6===a.tag)return a.stateNode;throw Error(u(33));}function Qd(a){return a[Nd]||null}\nfunction Rd(a){do a=a.return;while(a&&5!==a.tag);return a?a:null}\nfunction Sd(a,b){var c=a.stateNode;if(!c)return null;var d=la(c);if(!d)return null;c=d[b];a:switch(b){case \"onClick\":case \"onClickCapture\":case \"onDoubleClick\":case \"onDoubleClickCapture\":case \"onMouseDown\":case \"onMouseDownCapture\":case \"onMouseMove\":case \"onMouseMoveCapture\":case \"onMouseUp\":case \"onMouseUpCapture\":case \"onMouseEnter\":(d=!d.disabled)||(a=a.type,d=!(\"button\"===a||\"input\"===a||\"select\"===a||\"textarea\"===a));a=!d;break a;default:a=!1}if(a)return null;if(c&&\"function\"!==typeof c)throw Error(u(231,\nb,typeof c));return c}function Td(a,b,c){if(b=Sd(a,c.dispatchConfig.phasedRegistrationNames[b]))c._dispatchListeners=ic(c._dispatchListeners,b),c._dispatchInstances=ic(c._dispatchInstances,a)}function Ud(a){if(a&&a.dispatchConfig.phasedRegistrationNames){for(var b=a._targetInst,c=[];b;)c.push(b),b=Rd(b);for(b=c.length;0<b--;)Td(c[b],\"captured\",a);for(b=0;b<c.length;b++)Td(c[b],\"bubbled\",a)}}\nfunction Vd(a,b,c){a&&c&&c.dispatchConfig.registrationName&&(b=Sd(a,c.dispatchConfig.registrationName))&&(c._dispatchListeners=ic(c._dispatchListeners,b),c._dispatchInstances=ic(c._dispatchInstances,a))}function Wd(a){a&&a.dispatchConfig.registrationName&&Vd(a._targetInst,null,a)}function Xd(a){jc(a,Ud)}var Yd=null,Zd=null,$d=null;\nfunction ae(){if($d)return $d;var a,b=Zd,c=b.length,d,e=\"value\"in Yd?Yd.value:Yd.textContent,f=e.length;for(a=0;a<c&&b[a]===e[a];a++);var g=c-a;for(d=1;d<=g&&b[c-d]===e[f-d];d++);return $d=e.slice(a,1<d?1-d:void 0)}function be(){return!0}function ce(){return!1}\nfunction G(a,b,c,d){this.dispatchConfig=a;this._targetInst=b;this.nativeEvent=c;a=this.constructor.Interface;for(var e in a)a.hasOwnProperty(e)&&((b=a[e])?this[e]=b(c):\"target\"===e?this.target=d:this[e]=c[e]);this.isDefaultPrevented=(null!=c.defaultPrevented?c.defaultPrevented:!1===c.returnValue)?be:ce;this.isPropagationStopped=ce;return this}\nn(G.prototype,{preventDefault:function(){this.defaultPrevented=!0;var a=this.nativeEvent;a&&(a.preventDefault?a.preventDefault():\"unknown\"!==typeof a.returnValue&&(a.returnValue=!1),this.isDefaultPrevented=be)},stopPropagation:function(){var a=this.nativeEvent;a&&(a.stopPropagation?a.stopPropagation():\"unknown\"!==typeof a.cancelBubble&&(a.cancelBubble=!0),this.isPropagationStopped=be)},persist:function(){this.isPersistent=be},isPersistent:ce,destructor:function(){var a=this.constructor.Interface,\nb;for(b in a)this[b]=null;this.nativeEvent=this._targetInst=this.dispatchConfig=null;this.isPropagationStopped=this.isDefaultPrevented=ce;this._dispatchInstances=this._dispatchListeners=null}});G.Interface={type:null,target:null,currentTarget:function(){return null},eventPhase:null,bubbles:null,cancelable:null,timeStamp:function(a){return a.timeStamp||Date.now()},defaultPrevented:null,isTrusted:null};\nG.extend=function(a){function b(){}function c(){return d.apply(this,arguments)}var d=this;b.prototype=d.prototype;var e=new b;n(e,c.prototype);c.prototype=e;c.prototype.constructor=c;c.Interface=n({},d.Interface,a);c.extend=d.extend;de(c);return c};de(G);function ee(a,b,c,d){if(this.eventPool.length){var e=this.eventPool.pop();this.call(e,a,b,c,d);return e}return new this(a,b,c,d)}\nfunction fe(a){if(!(a instanceof this))throw Error(u(279));a.destructor();10>this.eventPool.length&&this.eventPool.push(a)}function de(a){a.eventPool=[];a.getPooled=ee;a.release=fe}var ge=G.extend({data:null}),he=G.extend({data:null}),ie=[9,13,27,32],je=ya&&\"CompositionEvent\"in window,ke=null;ya&&\"documentMode\"in document&&(ke=document.documentMode);\nvar le=ya&&\"TextEvent\"in window&&!ke,me=ya&&(!je||ke&&8<ke&&11>=ke),ne=String.fromCharCode(32),oe={beforeInput:{phasedRegistrationNames:{bubbled:\"onBeforeInput\",captured:\"onBeforeInputCapture\"},dependencies:[\"compositionend\",\"keypress\",\"textInput\",\"paste\"]},compositionEnd:{phasedRegistrationNames:{bubbled:\"onCompositionEnd\",captured:\"onCompositionEndCapture\"},dependencies:\"blur compositionend keydown keypress keyup mousedown\".split(\" \")},compositionStart:{phasedRegistrationNames:{bubbled:\"onCompositionStart\",\ncaptured:\"onCompositionStartCapture\"},dependencies:\"blur compositionstart keydown keypress keyup mousedown\".split(\" \")},compositionUpdate:{phasedRegistrationNames:{bubbled:\"onCompositionUpdate\",captured:\"onCompositionUpdateCapture\"},dependencies:\"blur compositionupdate keydown keypress keyup mousedown\".split(\" \")}},pe=!1;\nfunction qe(a,b){switch(a){case \"keyup\":return-1!==ie.indexOf(b.keyCode);case \"keydown\":return 229!==b.keyCode;case \"keypress\":case \"mousedown\":case \"blur\":return!0;default:return!1}}function re(a){a=a.detail;return\"object\"===typeof a&&\"data\"in a?a.data:null}var se=!1;function te(a,b){switch(a){case \"compositionend\":return re(b);case \"keypress\":if(32!==b.which)return null;pe=!0;return ne;case \"textInput\":return a=b.data,a===ne&&pe?null:a;default:return null}}\nfunction ue(a,b){if(se)return\"compositionend\"===a||!je&&qe(a,b)?(a=ae(),$d=Zd=Yd=null,se=!1,a):null;switch(a){case \"paste\":return null;case \"keypress\":if(!(b.ctrlKey||b.altKey||b.metaKey)||b.ctrlKey&&b.altKey){if(b.char&&1<b.char.length)return b.char;if(b.which)return String.fromCharCode(b.which)}return null;case \"compositionend\":return me&&\"ko\"!==b.locale?null:b.data;default:return null}}\nvar ve={eventTypes:oe,extractEvents:function(a,b,c,d){var e;if(je)b:{switch(a){case \"compositionstart\":var f=oe.compositionStart;break b;case \"compositionend\":f=oe.compositionEnd;break b;case \"compositionupdate\":f=oe.compositionUpdate;break b}f=void 0}else se?qe(a,c)&&(f=oe.compositionEnd):\"keydown\"===a&&229===c.keyCode&&(f=oe.compositionStart);f?(me&&\"ko\"!==c.locale&&(se||f!==oe.compositionStart?f===oe.compositionEnd&&se&&(e=ae()):(Yd=d,Zd=\"value\"in Yd?Yd.value:Yd.textContent,se=!0)),f=ge.getPooled(f,\nb,c,d),e?f.data=e:(e=re(c),null!==e&&(f.data=e)),Xd(f),e=f):e=null;(a=le?te(a,c):ue(a,c))?(b=he.getPooled(oe.beforeInput,b,c,d),b.data=a,Xd(b)):b=null;return null===e?b:null===b?e:[e,b]}},we={color:!0,date:!0,datetime:!0,\"datetime-local\":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function xe(a){var b=a&&a.nodeName&&a.nodeName.toLowerCase();return\"input\"===b?!!we[a.type]:\"textarea\"===b?!0:!1}\nvar ye={change:{phasedRegistrationNames:{bubbled:\"onChange\",captured:\"onChangeCapture\"},dependencies:\"blur change click focus input keydown keyup selectionchange\".split(\" \")}};function ze(a,b,c){a=G.getPooled(ye.change,a,b,c);a.type=\"change\";Da(c);Xd(a);return a}var Ae=null,Be=null;function Ce(a){mc(a)}function De(a){var b=Pd(a);if(yb(b))return a}function Ee(a,b){if(\"change\"===a)return b}var Fe=!1;ya&&(Fe=oc(\"input\")&&(!document.documentMode||9<document.documentMode));\nfunction Ge(){Ae&&(Ae.detachEvent(\"onpropertychange\",He),Be=Ae=null)}function He(a){if(\"value\"===a.propertyName&&De(Be))if(a=ze(Be,a,nc(a)),Ja)mc(a);else{Ja=!0;try{Fa(Ce,a)}finally{Ja=!1,La()}}}function Ie(a,b,c){\"focus\"===a?(Ge(),Ae=b,Be=c,Ae.attachEvent(\"onpropertychange\",He)):\"blur\"===a&&Ge()}function Je(a){if(\"selectionchange\"===a||\"keyup\"===a||\"keydown\"===a)return De(Be)}function Ke(a,b){if(\"click\"===a)return De(b)}function Le(a,b){if(\"input\"===a||\"change\"===a)return De(b)}\nvar Me={eventTypes:ye,_isInputEventSupported:Fe,extractEvents:function(a,b,c,d){var e=b?Pd(b):window,f=e.nodeName&&e.nodeName.toLowerCase();if(\"select\"===f||\"input\"===f&&\"file\"===e.type)var g=Ee;else if(xe(e))if(Fe)g=Le;else{g=Je;var h=Ie}else(f=e.nodeName)&&\"input\"===f.toLowerCase()&&(\"checkbox\"===e.type||\"radio\"===e.type)&&(g=Ke);if(g&&(g=g(a,b)))return ze(g,c,d);h&&h(a,e,b);\"blur\"===a&&(a=e._wrapperState)&&a.controlled&&\"number\"===e.type&&Db(e,\"number\",e.value)}},Ne=G.extend({view:null,detail:null}),\nOe={Alt:\"altKey\",Control:\"ctrlKey\",Meta:\"metaKey\",Shift:\"shiftKey\"};function Pe(a){var b=this.nativeEvent;return b.getModifierState?b.getModifierState(a):(a=Oe[a])?!!b[a]:!1}function Qe(){return Pe}\nvar Re=0,Se=0,Te=!1,Ue=!1,Ve=Ne.extend({screenX:null,screenY:null,clientX:null,clientY:null,pageX:null,pageY:null,ctrlKey:null,shiftKey:null,altKey:null,metaKey:null,getModifierState:Qe,button:null,buttons:null,relatedTarget:function(a){return a.relatedTarget||(a.fromElement===a.srcElement?a.toElement:a.fromElement)},movementX:function(a){if(\"movementX\"in a)return a.movementX;var b=Re;Re=a.screenX;return Te?\"mousemove\"===a.type?a.screenX-b:0:(Te=!0,0)},movementY:function(a){if(\"movementY\"in a)return a.movementY;\nvar b=Se;Se=a.screenY;return Ue?\"mousemove\"===a.type?a.screenY-b:0:(Ue=!0,0)}}),We=Ve.extend({pointerId:null,width:null,height:null,pressure:null,tangentialPressure:null,tiltX:null,tiltY:null,twist:null,pointerType:null,isPrimary:null}),Xe={mouseEnter:{registrationName:\"onMouseEnter\",dependencies:[\"mouseout\",\"mouseover\"]},mouseLeave:{registrationName:\"onMouseLeave\",dependencies:[\"mouseout\",\"mouseover\"]},pointerEnter:{registrationName:\"onPointerEnter\",dependencies:[\"pointerout\",\"pointerover\"]},pointerLeave:{registrationName:\"onPointerLeave\",\ndependencies:[\"pointerout\",\"pointerover\"]}},Ye={eventTypes:Xe,extractEvents:function(a,b,c,d,e){var f=\"mouseover\"===a||\"pointerover\"===a,g=\"mouseout\"===a||\"pointerout\"===a;if(f&&0===(e&32)&&(c.relatedTarget||c.fromElement)||!g&&!f)return null;f=d.window===d?d:(f=d.ownerDocument)?f.defaultView||f.parentWindow:window;if(g){if(g=b,b=(b=c.relatedTarget||c.toElement)?tc(b):null,null!==b){var h=dc(b);if(b!==h||5!==b.tag&&6!==b.tag)b=null}}else g=null;if(g===b)return null;if(\"mouseout\"===a||\"mouseover\"===\na){var k=Ve;var l=Xe.mouseLeave;var m=Xe.mouseEnter;var p=\"mouse\"}else if(\"pointerout\"===a||\"pointerover\"===a)k=We,l=Xe.pointerLeave,m=Xe.pointerEnter,p=\"pointer\";a=null==g?f:Pd(g);f=null==b?f:Pd(b);l=k.getPooled(l,g,c,d);l.type=p+\"leave\";l.target=a;l.relatedTarget=f;c=k.getPooled(m,b,c,d);c.type=p+\"enter\";c.target=f;c.relatedTarget=a;d=g;p=b;if(d&&p)a:{k=d;m=p;g=0;for(a=k;a;a=Rd(a))g++;a=0;for(b=m;b;b=Rd(b))a++;for(;0<g-a;)k=Rd(k),g--;for(;0<a-g;)m=Rd(m),a--;for(;g--;){if(k===m||k===m.alternate)break a;\nk=Rd(k);m=Rd(m)}k=null}else k=null;m=k;for(k=[];d&&d!==m;){g=d.alternate;if(null!==g&&g===m)break;k.push(d);d=Rd(d)}for(d=[];p&&p!==m;){g=p.alternate;if(null!==g&&g===m)break;d.push(p);p=Rd(p)}for(p=0;p<k.length;p++)Vd(k[p],\"bubbled\",l);for(p=d.length;0<p--;)Vd(d[p],\"captured\",c);return 0===(e&64)?[l]:[l,c]}};function Ze(a,b){return a===b&&(0!==a||1/a===1/b)||a!==a&&b!==b}var $e=\"function\"===typeof Object.is?Object.is:Ze,af=Object.prototype.hasOwnProperty;\nfunction bf(a,b){if($e(a,b))return!0;if(\"object\"!==typeof a||null===a||\"object\"!==typeof b||null===b)return!1;var c=Object.keys(a),d=Object.keys(b);if(c.length!==d.length)return!1;for(d=0;d<c.length;d++)if(!af.call(b,c[d])||!$e(a[c[d]],b[c[d]]))return!1;return!0}\nvar cf=ya&&\"documentMode\"in document&&11>=document.documentMode,df={select:{phasedRegistrationNames:{bubbled:\"onSelect\",captured:\"onSelectCapture\"},dependencies:\"blur contextmenu dragend focus keydown keyup mousedown mouseup selectionchange\".split(\" \")}},ef=null,ff=null,gf=null,hf=!1;\nfunction jf(a,b){var c=b.window===b?b.document:9===b.nodeType?b:b.ownerDocument;if(hf||null==ef||ef!==td(c))return null;c=ef;\"selectionStart\"in c&&yd(c)?c={start:c.selectionStart,end:c.selectionEnd}:(c=(c.ownerDocument&&c.ownerDocument.defaultView||window).getSelection(),c={anchorNode:c.anchorNode,anchorOffset:c.anchorOffset,focusNode:c.focusNode,focusOffset:c.focusOffset});return gf&&bf(gf,c)?null:(gf=c,a=G.getPooled(df.select,ff,a,b),a.type=\"select\",a.target=ef,Xd(a),a)}\nvar kf={eventTypes:df,extractEvents:function(a,b,c,d,e,f){e=f||(d.window===d?d.document:9===d.nodeType?d:d.ownerDocument);if(!(f=!e)){a:{e=cc(e);f=wa.onSelect;for(var g=0;g<f.length;g++)if(!e.has(f[g])){e=!1;break a}e=!0}f=!e}if(f)return null;e=b?Pd(b):window;switch(a){case \"focus\":if(xe(e)||\"true\"===e.contentEditable)ef=e,ff=b,gf=null;break;case \"blur\":gf=ff=ef=null;break;case \"mousedown\":hf=!0;break;case \"contextmenu\":case \"mouseup\":case \"dragend\":return hf=!1,jf(c,d);case \"selectionchange\":if(cf)break;\ncase \"keydown\":case \"keyup\":return jf(c,d)}return null}},lf=G.extend({animationName:null,elapsedTime:null,pseudoElement:null}),mf=G.extend({clipboardData:function(a){return\"clipboardData\"in a?a.clipboardData:window.clipboardData}}),nf=Ne.extend({relatedTarget:null});function of(a){var b=a.keyCode;\"charCode\"in a?(a=a.charCode,0===a&&13===b&&(a=13)):a=b;10===a&&(a=13);return 32<=a||13===a?a:0}\nvar pf={Esc:\"Escape\",Spacebar:\" \",Left:\"ArrowLeft\",Up:\"ArrowUp\",Right:\"ArrowRight\",Down:\"ArrowDown\",Del:\"Delete\",Win:\"OS\",Menu:\"ContextMenu\",Apps:\"ContextMenu\",Scroll:\"ScrollLock\",MozPrintableKey:\"Unidentified\"},qf={8:\"Backspace\",9:\"Tab\",12:\"Clear\",13:\"Enter\",16:\"Shift\",17:\"Control\",18:\"Alt\",19:\"Pause\",20:\"CapsLock\",27:\"Escape\",32:\" \",33:\"PageUp\",34:\"PageDown\",35:\"End\",36:\"Home\",37:\"ArrowLeft\",38:\"ArrowUp\",39:\"ArrowRight\",40:\"ArrowDown\",45:\"Insert\",46:\"Delete\",112:\"F1\",113:\"F2\",114:\"F3\",115:\"F4\",\n116:\"F5\",117:\"F6\",118:\"F7\",119:\"F8\",120:\"F9\",121:\"F10\",122:\"F11\",123:\"F12\",144:\"NumLock\",145:\"ScrollLock\",224:\"Meta\"},rf=Ne.extend({key:function(a){if(a.key){var b=pf[a.key]||a.key;if(\"Unidentified\"!==b)return b}return\"keypress\"===a.type?(a=of(a),13===a?\"Enter\":String.fromCharCode(a)):\"keydown\"===a.type||\"keyup\"===a.type?qf[a.keyCode]||\"Unidentified\":\"\"},location:null,ctrlKey:null,shiftKey:null,altKey:null,metaKey:null,repeat:null,locale:null,getModifierState:Qe,charCode:function(a){return\"keypress\"===\na.type?of(a):0},keyCode:function(a){return\"keydown\"===a.type||\"keyup\"===a.type?a.keyCode:0},which:function(a){return\"keypress\"===a.type?of(a):\"keydown\"===a.type||\"keyup\"===a.type?a.keyCode:0}}),sf=Ve.extend({dataTransfer:null}),tf=Ne.extend({touches:null,targetTouches:null,changedTouches:null,altKey:null,metaKey:null,ctrlKey:null,shiftKey:null,getModifierState:Qe}),uf=G.extend({propertyName:null,elapsedTime:null,pseudoElement:null}),vf=Ve.extend({deltaX:function(a){return\"deltaX\"in a?a.deltaX:\"wheelDeltaX\"in\na?-a.wheelDeltaX:0},deltaY:function(a){return\"deltaY\"in a?a.deltaY:\"wheelDeltaY\"in a?-a.wheelDeltaY:\"wheelDelta\"in a?-a.wheelDelta:0},deltaZ:null,deltaMode:null}),wf={eventTypes:Wc,extractEvents:function(a,b,c,d){var e=Yc.get(a);if(!e)return null;switch(a){case \"keypress\":if(0===of(c))return null;case \"keydown\":case \"keyup\":a=rf;break;case \"blur\":case \"focus\":a=nf;break;case \"click\":if(2===c.button)return null;case \"auxclick\":case \"dblclick\":case \"mousedown\":case \"mousemove\":case \"mouseup\":case \"mouseout\":case \"mouseover\":case \"contextmenu\":a=\nVe;break;case \"drag\":case \"dragend\":case \"dragenter\":case \"dragexit\":case \"dragleave\":case \"dragover\":case \"dragstart\":case \"drop\":a=sf;break;case \"touchcancel\":case \"touchend\":case \"touchmove\":case \"touchstart\":a=tf;break;case Xb:case Yb:case Zb:a=lf;break;case $b:a=uf;break;case \"scroll\":a=Ne;break;case \"wheel\":a=vf;break;case \"copy\":case \"cut\":case \"paste\":a=mf;break;case \"gotpointercapture\":case \"lostpointercapture\":case \"pointercancel\":case \"pointerdown\":case \"pointermove\":case \"pointerout\":case \"pointerover\":case \"pointerup\":a=\nWe;break;default:a=G}b=a.getPooled(e,b,c,d);Xd(b);return b}};if(pa)throw Error(u(101));pa=Array.prototype.slice.call(\"ResponderEventPlugin SimpleEventPlugin EnterLeaveEventPlugin ChangeEventPlugin SelectEventPlugin BeforeInputEventPlugin\".split(\" \"));ra();var xf=Nc;la=Qd;ma=xf;na=Pd;xa({SimpleEventPlugin:wf,EnterLeaveEventPlugin:Ye,ChangeEventPlugin:Me,SelectEventPlugin:kf,BeforeInputEventPlugin:ve});var yf=[],zf=-1;function H(a){0>zf||(a.current=yf[zf],yf[zf]=null,zf--)}\nfunction I(a,b){zf++;yf[zf]=a.current;a.current=b}var Af={},J={current:Af},K={current:!1},Bf=Af;function Cf(a,b){var c=a.type.contextTypes;if(!c)return Af;var d=a.stateNode;if(d&&d.__reactInternalMemoizedUnmaskedChildContext===b)return d.__reactInternalMemoizedMaskedChildContext;var e={},f;for(f in c)e[f]=b[f];d&&(a=a.stateNode,a.__reactInternalMemoizedUnmaskedChildContext=b,a.__reactInternalMemoizedMaskedChildContext=e);return e}function L(a){a=a.childContextTypes;return null!==a&&void 0!==a}\nfunction Df(){H(K);H(J)}function Ef(a,b,c){if(J.current!==Af)throw Error(u(168));I(J,b);I(K,c)}function Ff(a,b,c){var d=a.stateNode;a=b.childContextTypes;if(\"function\"!==typeof d.getChildContext)return c;d=d.getChildContext();for(var e in d)if(!(e in a))throw Error(u(108,pb(b)||\"Unknown\",e));return n({},c,{},d)}function Gf(a){a=(a=a.stateNode)&&a.__reactInternalMemoizedMergedChildContext||Af;Bf=J.current;I(J,a);I(K,K.current);return!0}\nfunction Hf(a,b,c){var d=a.stateNode;if(!d)throw Error(u(169));c?(a=Ff(a,b,Bf),d.__reactInternalMemoizedMergedChildContext=a,H(K),H(J),I(J,a)):H(K);I(K,c)}\nvar If=r.unstable_runWithPriority,Jf=r.unstable_scheduleCallback,Kf=r.unstable_cancelCallback,Lf=r.unstable_requestPaint,Mf=r.unstable_now,Nf=r.unstable_getCurrentPriorityLevel,Of=r.unstable_ImmediatePriority,Pf=r.unstable_UserBlockingPriority,Qf=r.unstable_NormalPriority,Rf=r.unstable_LowPriority,Sf=r.unstable_IdlePriority,Tf={},Uf=r.unstable_shouldYield,Vf=void 0!==Lf?Lf:function(){},Wf=null,Xf=null,Yf=!1,Zf=Mf(),$f=1E4>Zf?Mf:function(){return Mf()-Zf};\nfunction ag(){switch(Nf()){case Of:return 99;case Pf:return 98;case Qf:return 97;case Rf:return 96;case Sf:return 95;default:throw Error(u(332));}}function bg(a){switch(a){case 99:return Of;case 98:return Pf;case 97:return Qf;case 96:return Rf;case 95:return Sf;default:throw Error(u(332));}}function cg(a,b){a=bg(a);return If(a,b)}function dg(a,b,c){a=bg(a);return Jf(a,b,c)}function eg(a){null===Wf?(Wf=[a],Xf=Jf(Of,fg)):Wf.push(a);return Tf}function gg(){if(null!==Xf){var a=Xf;Xf=null;Kf(a)}fg()}\nfunction fg(){if(!Yf&&null!==Wf){Yf=!0;var a=0;try{var b=Wf;cg(99,function(){for(;a<b.length;a++){var c=b[a];do c=c(!0);while(null!==c)}});Wf=null}catch(c){throw null!==Wf&&(Wf=Wf.slice(a+1)),Jf(Of,gg),c;}finally{Yf=!1}}}function hg(a,b,c){c/=10;return 1073741821-(((1073741821-a+b/10)/c|0)+1)*c}function ig(a,b){if(a&&a.defaultProps){b=n({},b);a=a.defaultProps;for(var c in a)void 0===b[c]&&(b[c]=a[c])}return b}var jg={current:null},kg=null,lg=null,mg=null;function ng(){mg=lg=kg=null}\nfunction og(a){var b=jg.current;H(jg);a.type._context._currentValue=b}function pg(a,b){for(;null!==a;){var c=a.alternate;if(a.childExpirationTime<b)a.childExpirationTime=b,null!==c&&c.childExpirationTime<b&&(c.childExpirationTime=b);else if(null!==c&&c.childExpirationTime<b)c.childExpirationTime=b;else break;a=a.return}}function qg(a,b){kg=a;mg=lg=null;a=a.dependencies;null!==a&&null!==a.firstContext&&(a.expirationTime>=b&&(rg=!0),a.firstContext=null)}\nfunction sg(a,b){if(mg!==a&&!1!==b&&0!==b){if(\"number\"!==typeof b||1073741823===b)mg=a,b=1073741823;b={context:a,observedBits:b,next:null};if(null===lg){if(null===kg)throw Error(u(308));lg=b;kg.dependencies={expirationTime:0,firstContext:b,responders:null}}else lg=lg.next=b}return a._currentValue}var tg=!1;function ug(a){a.updateQueue={baseState:a.memoizedState,baseQueue:null,shared:{pending:null},effects:null}}\nfunction vg(a,b){a=a.updateQueue;b.updateQueue===a&&(b.updateQueue={baseState:a.baseState,baseQueue:a.baseQueue,shared:a.shared,effects:a.effects})}function wg(a,b){a={expirationTime:a,suspenseConfig:b,tag:0,payload:null,callback:null,next:null};return a.next=a}function xg(a,b){a=a.updateQueue;if(null!==a){a=a.shared;var c=a.pending;null===c?b.next=b:(b.next=c.next,c.next=b);a.pending=b}}\nfunction yg(a,b){var c=a.alternate;null!==c&&vg(c,a);a=a.updateQueue;c=a.baseQueue;null===c?(a.baseQueue=b.next=b,b.next=b):(b.next=c.next,c.next=b)}\nfunction zg(a,b,c,d){var e=a.updateQueue;tg=!1;var f=e.baseQueue,g=e.shared.pending;if(null!==g){if(null!==f){var h=f.next;f.next=g.next;g.next=h}f=g;e.shared.pending=null;h=a.alternate;null!==h&&(h=h.updateQueue,null!==h&&(h.baseQueue=g))}if(null!==f){h=f.next;var k=e.baseState,l=0,m=null,p=null,x=null;if(null!==h){var z=h;do{g=z.expirationTime;if(g<d){var ca={expirationTime:z.expirationTime,suspenseConfig:z.suspenseConfig,tag:z.tag,payload:z.payload,callback:z.callback,next:null};null===x?(p=x=\nca,m=k):x=x.next=ca;g>l&&(l=g)}else{null!==x&&(x=x.next={expirationTime:1073741823,suspenseConfig:z.suspenseConfig,tag:z.tag,payload:z.payload,callback:z.callback,next:null});Ag(g,z.suspenseConfig);a:{var D=a,t=z;g=b;ca=c;switch(t.tag){case 1:D=t.payload;if(\"function\"===typeof D){k=D.call(ca,k,g);break a}k=D;break a;case 3:D.effectTag=D.effectTag&-4097|64;case 0:D=t.payload;g=\"function\"===typeof D?D.call(ca,k,g):D;if(null===g||void 0===g)break a;k=n({},k,g);break a;case 2:tg=!0}}null!==z.callback&&\n(a.effectTag|=32,g=e.effects,null===g?e.effects=[z]:g.push(z))}z=z.next;if(null===z||z===h)if(g=e.shared.pending,null===g)break;else z=f.next=g.next,g.next=h,e.baseQueue=f=g,e.shared.pending=null}while(1)}null===x?m=k:x.next=p;e.baseState=m;e.baseQueue=x;Bg(l);a.expirationTime=l;a.memoizedState=k}}\nfunction Cg(a,b,c){a=b.effects;b.effects=null;if(null!==a)for(b=0;b<a.length;b++){var d=a[b],e=d.callback;if(null!==e){d.callback=null;d=e;e=c;if(\"function\"!==typeof d)throw Error(u(191,d));d.call(e)}}}var Dg=Wa.ReactCurrentBatchConfig,Eg=(new aa.Component).refs;function Fg(a,b,c,d){b=a.memoizedState;c=c(d,b);c=null===c||void 0===c?b:n({},b,c);a.memoizedState=c;0===a.expirationTime&&(a.updateQueue.baseState=c)}\nvar Jg={isMounted:function(a){return(a=a._reactInternalFiber)?dc(a)===a:!1},enqueueSetState:function(a,b,c){a=a._reactInternalFiber;var d=Gg(),e=Dg.suspense;d=Hg(d,a,e);e=wg(d,e);e.payload=b;void 0!==c&&null!==c&&(e.callback=c);xg(a,e);Ig(a,d)},enqueueReplaceState:function(a,b,c){a=a._reactInternalFiber;var d=Gg(),e=Dg.suspense;d=Hg(d,a,e);e=wg(d,e);e.tag=1;e.payload=b;void 0!==c&&null!==c&&(e.callback=c);xg(a,e);Ig(a,d)},enqueueForceUpdate:function(a,b){a=a._reactInternalFiber;var c=Gg(),d=Dg.suspense;\nc=Hg(c,a,d);d=wg(c,d);d.tag=2;void 0!==b&&null!==b&&(d.callback=b);xg(a,d);Ig(a,c)}};function Kg(a,b,c,d,e,f,g){a=a.stateNode;return\"function\"===typeof a.shouldComponentUpdate?a.shouldComponentUpdate(d,f,g):b.prototype&&b.prototype.isPureReactComponent?!bf(c,d)||!bf(e,f):!0}\nfunction Lg(a,b,c){var d=!1,e=Af;var f=b.contextType;\"object\"===typeof f&&null!==f?f=sg(f):(e=L(b)?Bf:J.current,d=b.contextTypes,f=(d=null!==d&&void 0!==d)?Cf(a,e):Af);b=new b(c,f);a.memoizedState=null!==b.state&&void 0!==b.state?b.state:null;b.updater=Jg;a.stateNode=b;b._reactInternalFiber=a;d&&(a=a.stateNode,a.__reactInternalMemoizedUnmaskedChildContext=e,a.__reactInternalMemoizedMaskedChildContext=f);return b}\nfunction Mg(a,b,c,d){a=b.state;\"function\"===typeof b.componentWillReceiveProps&&b.componentWillReceiveProps(c,d);\"function\"===typeof b.UNSAFE_componentWillReceiveProps&&b.UNSAFE_componentWillReceiveProps(c,d);b.state!==a&&Jg.enqueueReplaceState(b,b.state,null)}\nfunction Ng(a,b,c,d){var e=a.stateNode;e.props=c;e.state=a.memoizedState;e.refs=Eg;ug(a);var f=b.contextType;\"object\"===typeof f&&null!==f?e.context=sg(f):(f=L(b)?Bf:J.current,e.context=Cf(a,f));zg(a,c,e,d);e.state=a.memoizedState;f=b.getDerivedStateFromProps;\"function\"===typeof f&&(Fg(a,b,f,c),e.state=a.memoizedState);\"function\"===typeof b.getDerivedStateFromProps||\"function\"===typeof e.getSnapshotBeforeUpdate||\"function\"!==typeof e.UNSAFE_componentWillMount&&\"function\"!==typeof e.componentWillMount||\n(b=e.state,\"function\"===typeof e.componentWillMount&&e.componentWillMount(),\"function\"===typeof e.UNSAFE_componentWillMount&&e.UNSAFE_componentWillMount(),b!==e.state&&Jg.enqueueReplaceState(e,e.state,null),zg(a,c,e,d),e.state=a.memoizedState);\"function\"===typeof e.componentDidMount&&(a.effectTag|=4)}var Og=Array.isArray;\nfunction Pg(a,b,c){a=c.ref;if(null!==a&&\"function\"!==typeof a&&\"object\"!==typeof a){if(c._owner){c=c._owner;if(c){if(1!==c.tag)throw Error(u(309));var d=c.stateNode}if(!d)throw Error(u(147,a));var e=\"\"+a;if(null!==b&&null!==b.ref&&\"function\"===typeof b.ref&&b.ref._stringRef===e)return b.ref;b=function(a){var b=d.refs;b===Eg&&(b=d.refs={});null===a?delete b[e]:b[e]=a};b._stringRef=e;return b}if(\"string\"!==typeof a)throw Error(u(284));if(!c._owner)throw Error(u(290,a));}return a}\nfunction Qg(a,b){if(\"textarea\"!==a.type)throw Error(u(31,\"[object Object]\"===Object.prototype.toString.call(b)?\"object with keys {\"+Object.keys(b).join(\", \")+\"}\":b,\"\"));}\nfunction Rg(a){function b(b,c){if(a){var d=b.lastEffect;null!==d?(d.nextEffect=c,b.lastEffect=c):b.firstEffect=b.lastEffect=c;c.nextEffect=null;c.effectTag=8}}function c(c,d){if(!a)return null;for(;null!==d;)b(c,d),d=d.sibling;return null}function d(a,b){for(a=new Map;null!==b;)null!==b.key?a.set(b.key,b):a.set(b.index,b),b=b.sibling;return a}function e(a,b){a=Sg(a,b);a.index=0;a.sibling=null;return a}function f(b,c,d){b.index=d;if(!a)return c;d=b.alternate;if(null!==d)return d=d.index,d<c?(b.effectTag=\n2,c):d;b.effectTag=2;return c}function g(b){a&&null===b.alternate&&(b.effectTag=2);return b}function h(a,b,c,d){if(null===b||6!==b.tag)return b=Tg(c,a.mode,d),b.return=a,b;b=e(b,c);b.return=a;return b}function k(a,b,c,d){if(null!==b&&b.elementType===c.type)return d=e(b,c.props),d.ref=Pg(a,b,c),d.return=a,d;d=Ug(c.type,c.key,c.props,null,a.mode,d);d.ref=Pg(a,b,c);d.return=a;return d}function l(a,b,c,d){if(null===b||4!==b.tag||b.stateNode.containerInfo!==c.containerInfo||b.stateNode.implementation!==\nc.implementation)return b=Vg(c,a.mode,d),b.return=a,b;b=e(b,c.children||[]);b.return=a;return b}function m(a,b,c,d,f){if(null===b||7!==b.tag)return b=Wg(c,a.mode,d,f),b.return=a,b;b=e(b,c);b.return=a;return b}function p(a,b,c){if(\"string\"===typeof b||\"number\"===typeof b)return b=Tg(\"\"+b,a.mode,c),b.return=a,b;if(\"object\"===typeof b&&null!==b){switch(b.$$typeof){case Za:return c=Ug(b.type,b.key,b.props,null,a.mode,c),c.ref=Pg(a,null,b),c.return=a,c;case $a:return b=Vg(b,a.mode,c),b.return=a,b}if(Og(b)||\nnb(b))return b=Wg(b,a.mode,c,null),b.return=a,b;Qg(a,b)}return null}function x(a,b,c,d){var e=null!==b?b.key:null;if(\"string\"===typeof c||\"number\"===typeof c)return null!==e?null:h(a,b,\"\"+c,d);if(\"object\"===typeof c&&null!==c){switch(c.$$typeof){case Za:return c.key===e?c.type===ab?m(a,b,c.props.children,d,e):k(a,b,c,d):null;case $a:return c.key===e?l(a,b,c,d):null}if(Og(c)||nb(c))return null!==e?null:m(a,b,c,d,null);Qg(a,c)}return null}function z(a,b,c,d,e){if(\"string\"===typeof d||\"number\"===typeof d)return a=\na.get(c)||null,h(b,a,\"\"+d,e);if(\"object\"===typeof d&&null!==d){switch(d.$$typeof){case Za:return a=a.get(null===d.key?c:d.key)||null,d.type===ab?m(b,a,d.props.children,e,d.key):k(b,a,d,e);case $a:return a=a.get(null===d.key?c:d.key)||null,l(b,a,d,e)}if(Og(d)||nb(d))return a=a.get(c)||null,m(b,a,d,e,null);Qg(b,d)}return null}function ca(e,g,h,k){for(var l=null,t=null,m=g,y=g=0,A=null;null!==m&&y<h.length;y++){m.index>y?(A=m,m=null):A=m.sibling;var q=x(e,m,h[y],k);if(null===q){null===m&&(m=A);break}a&&\nm&&null===q.alternate&&b(e,m);g=f(q,g,y);null===t?l=q:t.sibling=q;t=q;m=A}if(y===h.length)return c(e,m),l;if(null===m){for(;y<h.length;y++)m=p(e,h[y],k),null!==m&&(g=f(m,g,y),null===t?l=m:t.sibling=m,t=m);return l}for(m=d(e,m);y<h.length;y++)A=z(m,e,y,h[y],k),null!==A&&(a&&null!==A.alternate&&m.delete(null===A.key?y:A.key),g=f(A,g,y),null===t?l=A:t.sibling=A,t=A);a&&m.forEach(function(a){return b(e,a)});return l}function D(e,g,h,l){var k=nb(h);if(\"function\"!==typeof k)throw Error(u(150));h=k.call(h);\nif(null==h)throw Error(u(151));for(var m=k=null,t=g,y=g=0,A=null,q=h.next();null!==t&&!q.done;y++,q=h.next()){t.index>y?(A=t,t=null):A=t.sibling;var D=x(e,t,q.value,l);if(null===D){null===t&&(t=A);break}a&&t&&null===D.alternate&&b(e,t);g=f(D,g,y);null===m?k=D:m.sibling=D;m=D;t=A}if(q.done)return c(e,t),k;if(null===t){for(;!q.done;y++,q=h.next())q=p(e,q.value,l),null!==q&&(g=f(q,g,y),null===m?k=q:m.sibling=q,m=q);return k}for(t=d(e,t);!q.done;y++,q=h.next())q=z(t,e,y,q.value,l),null!==q&&(a&&null!==\nq.alternate&&t.delete(null===q.key?y:q.key),g=f(q,g,y),null===m?k=q:m.sibling=q,m=q);a&&t.forEach(function(a){return b(e,a)});return k}return function(a,d,f,h){var k=\"object\"===typeof f&&null!==f&&f.type===ab&&null===f.key;k&&(f=f.props.children);var l=\"object\"===typeof f&&null!==f;if(l)switch(f.$$typeof){case Za:a:{l=f.key;for(k=d;null!==k;){if(k.key===l){switch(k.tag){case 7:if(f.type===ab){c(a,k.sibling);d=e(k,f.props.children);d.return=a;a=d;break a}break;default:if(k.elementType===f.type){c(a,\nk.sibling);d=e(k,f.props);d.ref=Pg(a,k,f);d.return=a;a=d;break a}}c(a,k);break}else b(a,k);k=k.sibling}f.type===ab?(d=Wg(f.props.children,a.mode,h,f.key),d.return=a,a=d):(h=Ug(f.type,f.key,f.props,null,a.mode,h),h.ref=Pg(a,d,f),h.return=a,a=h)}return g(a);case $a:a:{for(k=f.key;null!==d;){if(d.key===k)if(4===d.tag&&d.stateNode.containerInfo===f.containerInfo&&d.stateNode.implementation===f.implementation){c(a,d.sibling);d=e(d,f.children||[]);d.return=a;a=d;break a}else{c(a,d);break}else b(a,d);d=\nd.sibling}d=Vg(f,a.mode,h);d.return=a;a=d}return g(a)}if(\"string\"===typeof f||\"number\"===typeof f)return f=\"\"+f,null!==d&&6===d.tag?(c(a,d.sibling),d=e(d,f),d.return=a,a=d):(c(a,d),d=Tg(f,a.mode,h),d.return=a,a=d),g(a);if(Og(f))return ca(a,d,f,h);if(nb(f))return D(a,d,f,h);l&&Qg(a,f);if(\"undefined\"===typeof f&&!k)switch(a.tag){case 1:case 0:throw a=a.type,Error(u(152,a.displayName||a.name||\"Component\"));}return c(a,d)}}var Xg=Rg(!0),Yg=Rg(!1),Zg={},$g={current:Zg},ah={current:Zg},bh={current:Zg};\nfunction ch(a){if(a===Zg)throw Error(u(174));return a}function dh(a,b){I(bh,b);I(ah,a);I($g,Zg);a=b.nodeType;switch(a){case 9:case 11:b=(b=b.documentElement)?b.namespaceURI:Ob(null,\"\");break;default:a=8===a?b.parentNode:b,b=a.namespaceURI||null,a=a.tagName,b=Ob(b,a)}H($g);I($g,b)}function eh(){H($g);H(ah);H(bh)}function fh(a){ch(bh.current);var b=ch($g.current);var c=Ob(b,a.type);b!==c&&(I(ah,a),I($g,c))}function gh(a){ah.current===a&&(H($g),H(ah))}var M={current:0};\nfunction hh(a){for(var b=a;null!==b;){if(13===b.tag){var c=b.memoizedState;if(null!==c&&(c=c.dehydrated,null===c||c.data===Bd||c.data===Cd))return b}else if(19===b.tag&&void 0!==b.memoizedProps.revealOrder){if(0!==(b.effectTag&64))return b}else if(null!==b.child){b.child.return=b;b=b.child;continue}if(b===a)break;for(;null===b.sibling;){if(null===b.return||b.return===a)return null;b=b.return}b.sibling.return=b.return;b=b.sibling}return null}function ih(a,b){return{responder:a,props:b}}\nvar jh=Wa.ReactCurrentDispatcher,kh=Wa.ReactCurrentBatchConfig,lh=0,N=null,O=null,P=null,mh=!1;function Q(){throw Error(u(321));}function nh(a,b){if(null===b)return!1;for(var c=0;c<b.length&&c<a.length;c++)if(!$e(a[c],b[c]))return!1;return!0}\nfunction oh(a,b,c,d,e,f){lh=f;N=b;b.memoizedState=null;b.updateQueue=null;b.expirationTime=0;jh.current=null===a||null===a.memoizedState?ph:qh;a=c(d,e);if(b.expirationTime===lh){f=0;do{b.expirationTime=0;if(!(25>f))throw Error(u(301));f+=1;P=O=null;b.updateQueue=null;jh.current=rh;a=c(d,e)}while(b.expirationTime===lh)}jh.current=sh;b=null!==O&&null!==O.next;lh=0;P=O=N=null;mh=!1;if(b)throw Error(u(300));return a}\nfunction th(){var a={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};null===P?N.memoizedState=P=a:P=P.next=a;return P}function uh(){if(null===O){var a=N.alternate;a=null!==a?a.memoizedState:null}else a=O.next;var b=null===P?N.memoizedState:P.next;if(null!==b)P=b,O=a;else{if(null===a)throw Error(u(310));O=a;a={memoizedState:O.memoizedState,baseState:O.baseState,baseQueue:O.baseQueue,queue:O.queue,next:null};null===P?N.memoizedState=P=a:P=P.next=a}return P}\nfunction vh(a,b){return\"function\"===typeof b?b(a):b}\nfunction wh(a){var b=uh(),c=b.queue;if(null===c)throw Error(u(311));c.lastRenderedReducer=a;var d=O,e=d.baseQueue,f=c.pending;if(null!==f){if(null!==e){var g=e.next;e.next=f.next;f.next=g}d.baseQueue=e=f;c.pending=null}if(null!==e){e=e.next;d=d.baseState;var h=g=f=null,k=e;do{var l=k.expirationTime;if(l<lh){var m={expirationTime:k.expirationTime,suspenseConfig:k.suspenseConfig,action:k.action,eagerReducer:k.eagerReducer,eagerState:k.eagerState,next:null};null===h?(g=h=m,f=d):h=h.next=m;l>N.expirationTime&&\n(N.expirationTime=l,Bg(l))}else null!==h&&(h=h.next={expirationTime:1073741823,suspenseConfig:k.suspenseConfig,action:k.action,eagerReducer:k.eagerReducer,eagerState:k.eagerState,next:null}),Ag(l,k.suspenseConfig),d=k.eagerReducer===a?k.eagerState:a(d,k.action);k=k.next}while(null!==k&&k!==e);null===h?f=d:h.next=g;$e(d,b.memoizedState)||(rg=!0);b.memoizedState=d;b.baseState=f;b.baseQueue=h;c.lastRenderedState=d}return[b.memoizedState,c.dispatch]}\nfunction xh(a){var b=uh(),c=b.queue;if(null===c)throw Error(u(311));c.lastRenderedReducer=a;var d=c.dispatch,e=c.pending,f=b.memoizedState;if(null!==e){c.pending=null;var g=e=e.next;do f=a(f,g.action),g=g.next;while(g!==e);$e(f,b.memoizedState)||(rg=!0);b.memoizedState=f;null===b.baseQueue&&(b.baseState=f);c.lastRenderedState=f}return[f,d]}\nfunction yh(a){var b=th();\"function\"===typeof a&&(a=a());b.memoizedState=b.baseState=a;a=b.queue={pending:null,dispatch:null,lastRenderedReducer:vh,lastRenderedState:a};a=a.dispatch=zh.bind(null,N,a);return[b.memoizedState,a]}function Ah(a,b,c,d){a={tag:a,create:b,destroy:c,deps:d,next:null};b=N.updateQueue;null===b?(b={lastEffect:null},N.updateQueue=b,b.lastEffect=a.next=a):(c=b.lastEffect,null===c?b.lastEffect=a.next=a:(d=c.next,c.next=a,a.next=d,b.lastEffect=a));return a}\nfunction Bh(){return uh().memoizedState}function Ch(a,b,c,d){var e=th();N.effectTag|=a;e.memoizedState=Ah(1|b,c,void 0,void 0===d?null:d)}function Dh(a,b,c,d){var e=uh();d=void 0===d?null:d;var f=void 0;if(null!==O){var g=O.memoizedState;f=g.destroy;if(null!==d&&nh(d,g.deps)){Ah(b,c,f,d);return}}N.effectTag|=a;e.memoizedState=Ah(1|b,c,f,d)}function Eh(a,b){return Ch(516,4,a,b)}function Fh(a,b){return Dh(516,4,a,b)}function Gh(a,b){return Dh(4,2,a,b)}\nfunction Hh(a,b){if(\"function\"===typeof b)return a=a(),b(a),function(){b(null)};if(null!==b&&void 0!==b)return a=a(),b.current=a,function(){b.current=null}}function Ih(a,b,c){c=null!==c&&void 0!==c?c.concat([a]):null;return Dh(4,2,Hh.bind(null,b,a),c)}function Jh(){}function Kh(a,b){th().memoizedState=[a,void 0===b?null:b];return a}function Lh(a,b){var c=uh();b=void 0===b?null:b;var d=c.memoizedState;if(null!==d&&null!==b&&nh(b,d[1]))return d[0];c.memoizedState=[a,b];return a}\nfunction Mh(a,b){var c=uh();b=void 0===b?null:b;var d=c.memoizedState;if(null!==d&&null!==b&&nh(b,d[1]))return d[0];a=a();c.memoizedState=[a,b];return a}function Nh(a,b,c){var d=ag();cg(98>d?98:d,function(){a(!0)});cg(97<d?97:d,function(){var d=kh.suspense;kh.suspense=void 0===b?null:b;try{a(!1),c()}finally{kh.suspense=d}})}\nfunction zh(a,b,c){var d=Gg(),e=Dg.suspense;d=Hg(d,a,e);e={expirationTime:d,suspenseConfig:e,action:c,eagerReducer:null,eagerState:null,next:null};var f=b.pending;null===f?e.next=e:(e.next=f.next,f.next=e);b.pending=e;f=a.alternate;if(a===N||null!==f&&f===N)mh=!0,e.expirationTime=lh,N.expirationTime=lh;else{if(0===a.expirationTime&&(null===f||0===f.expirationTime)&&(f=b.lastRenderedReducer,null!==f))try{var g=b.lastRenderedState,h=f(g,c);e.eagerReducer=f;e.eagerState=h;if($e(h,g))return}catch(k){}finally{}Ig(a,\nd)}}\nvar sh={readContext:sg,useCallback:Q,useContext:Q,useEffect:Q,useImperativeHandle:Q,useLayoutEffect:Q,useMemo:Q,useReducer:Q,useRef:Q,useState:Q,useDebugValue:Q,useResponder:Q,useDeferredValue:Q,useTransition:Q},ph={readContext:sg,useCallback:Kh,useContext:sg,useEffect:Eh,useImperativeHandle:function(a,b,c){c=null!==c&&void 0!==c?c.concat([a]):null;return Ch(4,2,Hh.bind(null,b,a),c)},useLayoutEffect:function(a,b){return Ch(4,2,a,b)},useMemo:function(a,b){var c=th();b=void 0===b?null:b;a=a();c.memoizedState=[a,\nb];return a},useReducer:function(a,b,c){var d=th();b=void 0!==c?c(b):b;d.memoizedState=d.baseState=b;a=d.queue={pending:null,dispatch:null,lastRenderedReducer:a,lastRenderedState:b};a=a.dispatch=zh.bind(null,N,a);return[d.memoizedState,a]},useRef:function(a){var b=th();a={current:a};return b.memoizedState=a},useState:yh,useDebugValue:Jh,useResponder:ih,useDeferredValue:function(a,b){var c=yh(a),d=c[0],e=c[1];Eh(function(){var c=kh.suspense;kh.suspense=void 0===b?null:b;try{e(a)}finally{kh.suspense=\nc}},[a,b]);return d},useTransition:function(a){var b=yh(!1),c=b[0];b=b[1];return[Kh(Nh.bind(null,b,a),[b,a]),c]}},qh={readContext:sg,useCallback:Lh,useContext:sg,useEffect:Fh,useImperativeHandle:Ih,useLayoutEffect:Gh,useMemo:Mh,useReducer:wh,useRef:Bh,useState:function(){return wh(vh)},useDebugValue:Jh,useResponder:ih,useDeferredValue:function(a,b){var c=wh(vh),d=c[0],e=c[1];Fh(function(){var c=kh.suspense;kh.suspense=void 0===b?null:b;try{e(a)}finally{kh.suspense=c}},[a,b]);return d},useTransition:function(a){var b=\nwh(vh),c=b[0];b=b[1];return[Lh(Nh.bind(null,b,a),[b,a]),c]}},rh={readContext:sg,useCallback:Lh,useContext:sg,useEffect:Fh,useImperativeHandle:Ih,useLayoutEffect:Gh,useMemo:Mh,useReducer:xh,useRef:Bh,useState:function(){return xh(vh)},useDebugValue:Jh,useResponder:ih,useDeferredValue:function(a,b){var c=xh(vh),d=c[0],e=c[1];Fh(function(){var c=kh.suspense;kh.suspense=void 0===b?null:b;try{e(a)}finally{kh.suspense=c}},[a,b]);return d},useTransition:function(a){var b=xh(vh),c=b[0];b=b[1];return[Lh(Nh.bind(null,\nb,a),[b,a]),c]}},Oh=null,Ph=null,Qh=!1;function Rh(a,b){var c=Sh(5,null,null,0);c.elementType=\"DELETED\";c.type=\"DELETED\";c.stateNode=b;c.return=a;c.effectTag=8;null!==a.lastEffect?(a.lastEffect.nextEffect=c,a.lastEffect=c):a.firstEffect=a.lastEffect=c}\nfunction Th(a,b){switch(a.tag){case 5:var c=a.type;b=1!==b.nodeType||c.toLowerCase()!==b.nodeName.toLowerCase()?null:b;return null!==b?(a.stateNode=b,!0):!1;case 6:return b=\"\"===a.pendingProps||3!==b.nodeType?null:b,null!==b?(a.stateNode=b,!0):!1;case 13:return!1;default:return!1}}\nfunction Uh(a){if(Qh){var b=Ph;if(b){var c=b;if(!Th(a,b)){b=Jd(c.nextSibling);if(!b||!Th(a,b)){a.effectTag=a.effectTag&-1025|2;Qh=!1;Oh=a;return}Rh(Oh,c)}Oh=a;Ph=Jd(b.firstChild)}else a.effectTag=a.effectTag&-1025|2,Qh=!1,Oh=a}}function Vh(a){for(a=a.return;null!==a&&5!==a.tag&&3!==a.tag&&13!==a.tag;)a=a.return;Oh=a}\nfunction Wh(a){if(a!==Oh)return!1;if(!Qh)return Vh(a),Qh=!0,!1;var b=a.type;if(5!==a.tag||\"head\"!==b&&\"body\"!==b&&!Gd(b,a.memoizedProps))for(b=Ph;b;)Rh(a,b),b=Jd(b.nextSibling);Vh(a);if(13===a.tag){a=a.memoizedState;a=null!==a?a.dehydrated:null;if(!a)throw Error(u(317));a:{a=a.nextSibling;for(b=0;a;){if(8===a.nodeType){var c=a.data;if(c===Ad){if(0===b){Ph=Jd(a.nextSibling);break a}b--}else c!==zd&&c!==Cd&&c!==Bd||b++}a=a.nextSibling}Ph=null}}else Ph=Oh?Jd(a.stateNode.nextSibling):null;return!0}\nfunction Xh(){Ph=Oh=null;Qh=!1}var Yh=Wa.ReactCurrentOwner,rg=!1;function R(a,b,c,d){b.child=null===a?Yg(b,null,c,d):Xg(b,a.child,c,d)}function Zh(a,b,c,d,e){c=c.render;var f=b.ref;qg(b,e);d=oh(a,b,c,d,f,e);if(null!==a&&!rg)return b.updateQueue=a.updateQueue,b.effectTag&=-517,a.expirationTime<=e&&(a.expirationTime=0),$h(a,b,e);b.effectTag|=1;R(a,b,d,e);return b.child}\nfunction ai(a,b,c,d,e,f){if(null===a){var g=c.type;if(\"function\"===typeof g&&!bi(g)&&void 0===g.defaultProps&&null===c.compare&&void 0===c.defaultProps)return b.tag=15,b.type=g,ci(a,b,g,d,e,f);a=Ug(c.type,null,d,null,b.mode,f);a.ref=b.ref;a.return=b;return b.child=a}g=a.child;if(e<f&&(e=g.memoizedProps,c=c.compare,c=null!==c?c:bf,c(e,d)&&a.ref===b.ref))return $h(a,b,f);b.effectTag|=1;a=Sg(g,d);a.ref=b.ref;a.return=b;return b.child=a}\nfunction ci(a,b,c,d,e,f){return null!==a&&bf(a.memoizedProps,d)&&a.ref===b.ref&&(rg=!1,e<f)?(b.expirationTime=a.expirationTime,$h(a,b,f)):di(a,b,c,d,f)}function ei(a,b){var c=b.ref;if(null===a&&null!==c||null!==a&&a.ref!==c)b.effectTag|=128}function di(a,b,c,d,e){var f=L(c)?Bf:J.current;f=Cf(b,f);qg(b,e);c=oh(a,b,c,d,f,e);if(null!==a&&!rg)return b.updateQueue=a.updateQueue,b.effectTag&=-517,a.expirationTime<=e&&(a.expirationTime=0),$h(a,b,e);b.effectTag|=1;R(a,b,c,e);return b.child}\nfunction fi(a,b,c,d,e){if(L(c)){var f=!0;Gf(b)}else f=!1;qg(b,e);if(null===b.stateNode)null!==a&&(a.alternate=null,b.alternate=null,b.effectTag|=2),Lg(b,c,d),Ng(b,c,d,e),d=!0;else if(null===a){var g=b.stateNode,h=b.memoizedProps;g.props=h;var k=g.context,l=c.contextType;\"object\"===typeof l&&null!==l?l=sg(l):(l=L(c)?Bf:J.current,l=Cf(b,l));var m=c.getDerivedStateFromProps,p=\"function\"===typeof m||\"function\"===typeof g.getSnapshotBeforeUpdate;p||\"function\"!==typeof g.UNSAFE_componentWillReceiveProps&&\n\"function\"!==typeof g.componentWillReceiveProps||(h!==d||k!==l)&&Mg(b,g,d,l);tg=!1;var x=b.memoizedState;g.state=x;zg(b,d,g,e);k=b.memoizedState;h!==d||x!==k||K.current||tg?(\"function\"===typeof m&&(Fg(b,c,m,d),k=b.memoizedState),(h=tg||Kg(b,c,h,d,x,k,l))?(p||\"function\"!==typeof g.UNSAFE_componentWillMount&&\"function\"!==typeof g.componentWillMount||(\"function\"===typeof g.componentWillMount&&g.componentWillMount(),\"function\"===typeof g.UNSAFE_componentWillMount&&g.UNSAFE_componentWillMount()),\"function\"===\ntypeof g.componentDidMount&&(b.effectTag|=4)):(\"function\"===typeof g.componentDidMount&&(b.effectTag|=4),b.memoizedProps=d,b.memoizedState=k),g.props=d,g.state=k,g.context=l,d=h):(\"function\"===typeof g.componentDidMount&&(b.effectTag|=4),d=!1)}else g=b.stateNode,vg(a,b),h=b.memoizedProps,g.props=b.type===b.elementType?h:ig(b.type,h),k=g.context,l=c.contextType,\"object\"===typeof l&&null!==l?l=sg(l):(l=L(c)?Bf:J.current,l=Cf(b,l)),m=c.getDerivedStateFromProps,(p=\"function\"===typeof m||\"function\"===\ntypeof g.getSnapshotBeforeUpdate)||\"function\"!==typeof g.UNSAFE_componentWillReceiveProps&&\"function\"!==typeof g.componentWillReceiveProps||(h!==d||k!==l)&&Mg(b,g,d,l),tg=!1,k=b.memoizedState,g.state=k,zg(b,d,g,e),x=b.memoizedState,h!==d||k!==x||K.current||tg?(\"function\"===typeof m&&(Fg(b,c,m,d),x=b.memoizedState),(m=tg||Kg(b,c,h,d,k,x,l))?(p||\"function\"!==typeof g.UNSAFE_componentWillUpdate&&\"function\"!==typeof g.componentWillUpdate||(\"function\"===typeof g.componentWillUpdate&&g.componentWillUpdate(d,\nx,l),\"function\"===typeof g.UNSAFE_componentWillUpdate&&g.UNSAFE_componentWillUpdate(d,x,l)),\"function\"===typeof g.componentDidUpdate&&(b.effectTag|=4),\"function\"===typeof g.getSnapshotBeforeUpdate&&(b.effectTag|=256)):(\"function\"!==typeof g.componentDidUpdate||h===a.memoizedProps&&k===a.memoizedState||(b.effectTag|=4),\"function\"!==typeof g.getSnapshotBeforeUpdate||h===a.memoizedProps&&k===a.memoizedState||(b.effectTag|=256),b.memoizedProps=d,b.memoizedState=x),g.props=d,g.state=x,g.context=l,d=m):\n(\"function\"!==typeof g.componentDidUpdate||h===a.memoizedProps&&k===a.memoizedState||(b.effectTag|=4),\"function\"!==typeof g.getSnapshotBeforeUpdate||h===a.memoizedProps&&k===a.memoizedState||(b.effectTag|=256),d=!1);return gi(a,b,c,d,f,e)}\nfunction gi(a,b,c,d,e,f){ei(a,b);var g=0!==(b.effectTag&64);if(!d&&!g)return e&&Hf(b,c,!1),$h(a,b,f);d=b.stateNode;Yh.current=b;var h=g&&\"function\"!==typeof c.getDerivedStateFromError?null:d.render();b.effectTag|=1;null!==a&&g?(b.child=Xg(b,a.child,null,f),b.child=Xg(b,null,h,f)):R(a,b,h,f);b.memoizedState=d.state;e&&Hf(b,c,!0);return b.child}function hi(a){var b=a.stateNode;b.pendingContext?Ef(a,b.pendingContext,b.pendingContext!==b.context):b.context&&Ef(a,b.context,!1);dh(a,b.containerInfo)}\nvar ii={dehydrated:null,retryTime:0};\nfunction ji(a,b,c){var d=b.mode,e=b.pendingProps,f=M.current,g=!1,h;(h=0!==(b.effectTag&64))||(h=0!==(f&2)&&(null===a||null!==a.memoizedState));h?(g=!0,b.effectTag&=-65):null!==a&&null===a.memoizedState||void 0===e.fallback||!0===e.unstable_avoidThisFallback||(f|=1);I(M,f&1);if(null===a){void 0!==e.fallback&&Uh(b);if(g){g=e.fallback;e=Wg(null,d,0,null);e.return=b;if(0===(b.mode&2))for(a=null!==b.memoizedState?b.child.child:b.child,e.child=a;null!==a;)a.return=e,a=a.sibling;c=Wg(g,d,c,null);c.return=\nb;e.sibling=c;b.memoizedState=ii;b.child=e;return c}d=e.children;b.memoizedState=null;return b.child=Yg(b,null,d,c)}if(null!==a.memoizedState){a=a.child;d=a.sibling;if(g){e=e.fallback;c=Sg(a,a.pendingProps);c.return=b;if(0===(b.mode&2)&&(g=null!==b.memoizedState?b.child.child:b.child,g!==a.child))for(c.child=g;null!==g;)g.return=c,g=g.sibling;d=Sg(d,e);d.return=b;c.sibling=d;c.childExpirationTime=0;b.memoizedState=ii;b.child=c;return d}c=Xg(b,a.child,e.children,c);b.memoizedState=null;return b.child=\nc}a=a.child;if(g){g=e.fallback;e=Wg(null,d,0,null);e.return=b;e.child=a;null!==a&&(a.return=e);if(0===(b.mode&2))for(a=null!==b.memoizedState?b.child.child:b.child,e.child=a;null!==a;)a.return=e,a=a.sibling;c=Wg(g,d,c,null);c.return=b;e.sibling=c;c.effectTag|=2;e.childExpirationTime=0;b.memoizedState=ii;b.child=e;return c}b.memoizedState=null;return b.child=Xg(b,a,e.children,c)}\nfunction ki(a,b){a.expirationTime<b&&(a.expirationTime=b);var c=a.alternate;null!==c&&c.expirationTime<b&&(c.expirationTime=b);pg(a.return,b)}function li(a,b,c,d,e,f){var g=a.memoizedState;null===g?a.memoizedState={isBackwards:b,rendering:null,renderingStartTime:0,last:d,tail:c,tailExpiration:0,tailMode:e,lastEffect:f}:(g.isBackwards=b,g.rendering=null,g.renderingStartTime=0,g.last=d,g.tail=c,g.tailExpiration=0,g.tailMode=e,g.lastEffect=f)}\nfunction mi(a,b,c){var d=b.pendingProps,e=d.revealOrder,f=d.tail;R(a,b,d.children,c);d=M.current;if(0!==(d&2))d=d&1|2,b.effectTag|=64;else{if(null!==a&&0!==(a.effectTag&64))a:for(a=b.child;null!==a;){if(13===a.tag)null!==a.memoizedState&&ki(a,c);else if(19===a.tag)ki(a,c);else if(null!==a.child){a.child.return=a;a=a.child;continue}if(a===b)break a;for(;null===a.sibling;){if(null===a.return||a.return===b)break a;a=a.return}a.sibling.return=a.return;a=a.sibling}d&=1}I(M,d);if(0===(b.mode&2))b.memoizedState=\nnull;else switch(e){case \"forwards\":c=b.child;for(e=null;null!==c;)a=c.alternate,null!==a&&null===hh(a)&&(e=c),c=c.sibling;c=e;null===c?(e=b.child,b.child=null):(e=c.sibling,c.sibling=null);li(b,!1,e,c,f,b.lastEffect);break;case \"backwards\":c=null;e=b.child;for(b.child=null;null!==e;){a=e.alternate;if(null!==a&&null===hh(a)){b.child=e;break}a=e.sibling;e.sibling=c;c=e;e=a}li(b,!0,c,null,f,b.lastEffect);break;case \"together\":li(b,!1,null,null,void 0,b.lastEffect);break;default:b.memoizedState=null}return b.child}\nfunction $h(a,b,c){null!==a&&(b.dependencies=a.dependencies);var d=b.expirationTime;0!==d&&Bg(d);if(b.childExpirationTime<c)return null;if(null!==a&&b.child!==a.child)throw Error(u(153));if(null!==b.child){a=b.child;c=Sg(a,a.pendingProps);b.child=c;for(c.return=b;null!==a.sibling;)a=a.sibling,c=c.sibling=Sg(a,a.pendingProps),c.return=b;c.sibling=null}return b.child}var ni,oi,pi,qi;\nni=function(a,b){for(var c=b.child;null!==c;){if(5===c.tag||6===c.tag)a.appendChild(c.stateNode);else if(4!==c.tag&&null!==c.child){c.child.return=c;c=c.child;continue}if(c===b)break;for(;null===c.sibling;){if(null===c.return||c.return===b)return;c=c.return}c.sibling.return=c.return;c=c.sibling}};oi=function(){};\npi=function(a,b,c,d,e){var f=a.memoizedProps;if(f!==d){var g=b.stateNode;ch($g.current);a=null;switch(c){case \"input\":f=zb(g,f);d=zb(g,d);a=[];break;case \"option\":f=Gb(g,f);d=Gb(g,d);a=[];break;case \"select\":f=n({},f,{value:void 0});d=n({},d,{value:void 0});a=[];break;case \"textarea\":f=Ib(g,f);d=Ib(g,d);a=[];break;default:\"function\"!==typeof f.onClick&&\"function\"===typeof d.onClick&&(g.onclick=sd)}od(c,d);var h,k;c=null;for(h in f)if(!d.hasOwnProperty(h)&&f.hasOwnProperty(h)&&null!=f[h])if(\"style\"===\nh)for(k in g=f[h],g)g.hasOwnProperty(k)&&(c||(c={}),c[k]=\"\");else\"dangerouslySetInnerHTML\"!==h&&\"children\"!==h&&\"suppressContentEditableWarning\"!==h&&\"suppressHydrationWarning\"!==h&&\"autoFocus\"!==h&&(va.hasOwnProperty(h)?a||(a=[]):(a=a||[]).push(h,null));for(h in d){var l=d[h];g=null!=f?f[h]:void 0;if(d.hasOwnProperty(h)&&l!==g&&(null!=l||null!=g))if(\"style\"===h)if(g){for(k in g)!g.hasOwnProperty(k)||l&&l.hasOwnProperty(k)||(c||(c={}),c[k]=\"\");for(k in l)l.hasOwnProperty(k)&&g[k]!==l[k]&&(c||(c={}),\nc[k]=l[k])}else c||(a||(a=[]),a.push(h,c)),c=l;else\"dangerouslySetInnerHTML\"===h?(l=l?l.__html:void 0,g=g?g.__html:void 0,null!=l&&g!==l&&(a=a||[]).push(h,l)):\"children\"===h?g===l||\"string\"!==typeof l&&\"number\"!==typeof l||(a=a||[]).push(h,\"\"+l):\"suppressContentEditableWarning\"!==h&&\"suppressHydrationWarning\"!==h&&(va.hasOwnProperty(h)?(null!=l&&rd(e,h),a||g===l||(a=[])):(a=a||[]).push(h,l))}c&&(a=a||[]).push(\"style\",c);e=a;if(b.updateQueue=e)b.effectTag|=4}};\nqi=function(a,b,c,d){c!==d&&(b.effectTag|=4)};function ri(a,b){switch(a.tailMode){case \"hidden\":b=a.tail;for(var c=null;null!==b;)null!==b.alternate&&(c=b),b=b.sibling;null===c?a.tail=null:c.sibling=null;break;case \"collapsed\":c=a.tail;for(var d=null;null!==c;)null!==c.alternate&&(d=c),c=c.sibling;null===d?b||null===a.tail?a.tail=null:a.tail.sibling=null:d.sibling=null}}\nfunction si(a,b,c){var d=b.pendingProps;switch(b.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return null;case 1:return L(b.type)&&Df(),null;case 3:return eh(),H(K),H(J),c=b.stateNode,c.pendingContext&&(c.context=c.pendingContext,c.pendingContext=null),null!==a&&null!==a.child||!Wh(b)||(b.effectTag|=4),oi(b),null;case 5:gh(b);c=ch(bh.current);var e=b.type;if(null!==a&&null!=b.stateNode)pi(a,b,e,d,c),a.ref!==b.ref&&(b.effectTag|=128);else{if(!d){if(null===b.stateNode)throw Error(u(166));\nreturn null}a=ch($g.current);if(Wh(b)){d=b.stateNode;e=b.type;var f=b.memoizedProps;d[Md]=b;d[Nd]=f;switch(e){case \"iframe\":case \"object\":case \"embed\":F(\"load\",d);break;case \"video\":case \"audio\":for(a=0;a<ac.length;a++)F(ac[a],d);break;case \"source\":F(\"error\",d);break;case \"img\":case \"image\":case \"link\":F(\"error\",d);F(\"load\",d);break;case \"form\":F(\"reset\",d);F(\"submit\",d);break;case \"details\":F(\"toggle\",d);break;case \"input\":Ab(d,f);F(\"invalid\",d);rd(c,\"onChange\");break;case \"select\":d._wrapperState=\n{wasMultiple:!!f.multiple};F(\"invalid\",d);rd(c,\"onChange\");break;case \"textarea\":Jb(d,f),F(\"invalid\",d),rd(c,\"onChange\")}od(e,f);a=null;for(var g in f)if(f.hasOwnProperty(g)){var h=f[g];\"children\"===g?\"string\"===typeof h?d.textContent!==h&&(a=[\"children\",h]):\"number\"===typeof h&&d.textContent!==\"\"+h&&(a=[\"children\",\"\"+h]):va.hasOwnProperty(g)&&null!=h&&rd(c,g)}switch(e){case \"input\":xb(d);Eb(d,f,!0);break;case \"textarea\":xb(d);Lb(d);break;case \"select\":case \"option\":break;default:\"function\"===typeof f.onClick&&\n(d.onclick=sd)}c=a;b.updateQueue=c;null!==c&&(b.effectTag|=4)}else{g=9===c.nodeType?c:c.ownerDocument;a===qd&&(a=Nb(e));a===qd?\"script\"===e?(a=g.createElement(\"div\"),a.innerHTML=\"<script>\\x3c/script>\",a=a.removeChild(a.firstChild)):\"string\"===typeof d.is?a=g.createElement(e,{is:d.is}):(a=g.createElement(e),\"select\"===e&&(g=a,d.multiple?g.multiple=!0:d.size&&(g.size=d.size))):a=g.createElementNS(a,e);a[Md]=b;a[Nd]=d;ni(a,b,!1,!1);b.stateNode=a;g=pd(e,d);switch(e){case \"iframe\":case \"object\":case \"embed\":F(\"load\",\na);h=d;break;case \"video\":case \"audio\":for(h=0;h<ac.length;h++)F(ac[h],a);h=d;break;case \"source\":F(\"error\",a);h=d;break;case \"img\":case \"image\":case \"link\":F(\"error\",a);F(\"load\",a);h=d;break;case \"form\":F(\"reset\",a);F(\"submit\",a);h=d;break;case \"details\":F(\"toggle\",a);h=d;break;case \"input\":Ab(a,d);h=zb(a,d);F(\"invalid\",a);rd(c,\"onChange\");break;case \"option\":h=Gb(a,d);break;case \"select\":a._wrapperState={wasMultiple:!!d.multiple};h=n({},d,{value:void 0});F(\"invalid\",a);rd(c,\"onChange\");break;case \"textarea\":Jb(a,\nd);h=Ib(a,d);F(\"invalid\",a);rd(c,\"onChange\");break;default:h=d}od(e,h);var k=h;for(f in k)if(k.hasOwnProperty(f)){var l=k[f];\"style\"===f?md(a,l):\"dangerouslySetInnerHTML\"===f?(l=l?l.__html:void 0,null!=l&&Qb(a,l)):\"children\"===f?\"string\"===typeof l?(\"textarea\"!==e||\"\"!==l)&&Rb(a,l):\"number\"===typeof l&&Rb(a,\"\"+l):\"suppressContentEditableWarning\"!==f&&\"suppressHydrationWarning\"!==f&&\"autoFocus\"!==f&&(va.hasOwnProperty(f)?null!=l&&rd(c,f):null!=l&&Xa(a,f,l,g))}switch(e){case \"input\":xb(a);Eb(a,d,!1);\nbreak;case \"textarea\":xb(a);Lb(a);break;case \"option\":null!=d.value&&a.setAttribute(\"value\",\"\"+rb(d.value));break;case \"select\":a.multiple=!!d.multiple;c=d.value;null!=c?Hb(a,!!d.multiple,c,!1):null!=d.defaultValue&&Hb(a,!!d.multiple,d.defaultValue,!0);break;default:\"function\"===typeof h.onClick&&(a.onclick=sd)}Fd(e,d)&&(b.effectTag|=4)}null!==b.ref&&(b.effectTag|=128)}return null;case 6:if(a&&null!=b.stateNode)qi(a,b,a.memoizedProps,d);else{if(\"string\"!==typeof d&&null===b.stateNode)throw Error(u(166));\nc=ch(bh.current);ch($g.current);Wh(b)?(c=b.stateNode,d=b.memoizedProps,c[Md]=b,c.nodeValue!==d&&(b.effectTag|=4)):(c=(9===c.nodeType?c:c.ownerDocument).createTextNode(d),c[Md]=b,b.stateNode=c)}return null;case 13:H(M);d=b.memoizedState;if(0!==(b.effectTag&64))return b.expirationTime=c,b;c=null!==d;d=!1;null===a?void 0!==b.memoizedProps.fallback&&Wh(b):(e=a.memoizedState,d=null!==e,c||null===e||(e=a.child.sibling,null!==e&&(f=b.firstEffect,null!==f?(b.firstEffect=e,e.nextEffect=f):(b.firstEffect=b.lastEffect=\ne,e.nextEffect=null),e.effectTag=8)));if(c&&!d&&0!==(b.mode&2))if(null===a&&!0!==b.memoizedProps.unstable_avoidThisFallback||0!==(M.current&1))S===ti&&(S=ui);else{if(S===ti||S===ui)S=vi;0!==wi&&null!==T&&(xi(T,U),yi(T,wi))}if(c||d)b.effectTag|=4;return null;case 4:return eh(),oi(b),null;case 10:return og(b),null;case 17:return L(b.type)&&Df(),null;case 19:H(M);d=b.memoizedState;if(null===d)return null;e=0!==(b.effectTag&64);f=d.rendering;if(null===f)if(e)ri(d,!1);else{if(S!==ti||null!==a&&0!==(a.effectTag&\n64))for(f=b.child;null!==f;){a=hh(f);if(null!==a){b.effectTag|=64;ri(d,!1);e=a.updateQueue;null!==e&&(b.updateQueue=e,b.effectTag|=4);null===d.lastEffect&&(b.firstEffect=null);b.lastEffect=d.lastEffect;for(d=b.child;null!==d;)e=d,f=c,e.effectTag&=2,e.nextEffect=null,e.firstEffect=null,e.lastEffect=null,a=e.alternate,null===a?(e.childExpirationTime=0,e.expirationTime=f,e.child=null,e.memoizedProps=null,e.memoizedState=null,e.updateQueue=null,e.dependencies=null):(e.childExpirationTime=a.childExpirationTime,\ne.expirationTime=a.expirationTime,e.child=a.child,e.memoizedProps=a.memoizedProps,e.memoizedState=a.memoizedState,e.updateQueue=a.updateQueue,f=a.dependencies,e.dependencies=null===f?null:{expirationTime:f.expirationTime,firstContext:f.firstContext,responders:f.responders}),d=d.sibling;I(M,M.current&1|2);return b.child}f=f.sibling}}else{if(!e)if(a=hh(f),null!==a){if(b.effectTag|=64,e=!0,c=a.updateQueue,null!==c&&(b.updateQueue=c,b.effectTag|=4),ri(d,!0),null===d.tail&&\"hidden\"===d.tailMode&&!f.alternate)return b=\nb.lastEffect=d.lastEffect,null!==b&&(b.nextEffect=null),null}else 2*$f()-d.renderingStartTime>d.tailExpiration&&1<c&&(b.effectTag|=64,e=!0,ri(d,!1),b.expirationTime=b.childExpirationTime=c-1);d.isBackwards?(f.sibling=b.child,b.child=f):(c=d.last,null!==c?c.sibling=f:b.child=f,d.last=f)}return null!==d.tail?(0===d.tailExpiration&&(d.tailExpiration=$f()+500),c=d.tail,d.rendering=c,d.tail=c.sibling,d.lastEffect=b.lastEffect,d.renderingStartTime=$f(),c.sibling=null,b=M.current,I(M,e?b&1|2:b&1),c):null}throw Error(u(156,\nb.tag));}function zi(a){switch(a.tag){case 1:L(a.type)&&Df();var b=a.effectTag;return b&4096?(a.effectTag=b&-4097|64,a):null;case 3:eh();H(K);H(J);b=a.effectTag;if(0!==(b&64))throw Error(u(285));a.effectTag=b&-4097|64;return a;case 5:return gh(a),null;case 13:return H(M),b=a.effectTag,b&4096?(a.effectTag=b&-4097|64,a):null;case 19:return H(M),null;case 4:return eh(),null;case 10:return og(a),null;default:return null}}function Ai(a,b){return{value:a,source:b,stack:qb(b)}}\nvar Bi=\"function\"===typeof WeakSet?WeakSet:Set;function Ci(a,b){var c=b.source,d=b.stack;null===d&&null!==c&&(d=qb(c));null!==c&&pb(c.type);b=b.value;null!==a&&1===a.tag&&pb(a.type);try{console.error(b)}catch(e){setTimeout(function(){throw e;})}}function Di(a,b){try{b.props=a.memoizedProps,b.state=a.memoizedState,b.componentWillUnmount()}catch(c){Ei(a,c)}}function Fi(a){var b=a.ref;if(null!==b)if(\"function\"===typeof b)try{b(null)}catch(c){Ei(a,c)}else b.current=null}\nfunction Gi(a,b){switch(b.tag){case 0:case 11:case 15:case 22:return;case 1:if(b.effectTag&256&&null!==a){var c=a.memoizedProps,d=a.memoizedState;a=b.stateNode;b=a.getSnapshotBeforeUpdate(b.elementType===b.type?c:ig(b.type,c),d);a.__reactInternalSnapshotBeforeUpdate=b}return;case 3:case 5:case 6:case 4:case 17:return}throw Error(u(163));}\nfunction Hi(a,b){b=b.updateQueue;b=null!==b?b.lastEffect:null;if(null!==b){var c=b=b.next;do{if((c.tag&a)===a){var d=c.destroy;c.destroy=void 0;void 0!==d&&d()}c=c.next}while(c!==b)}}function Ii(a,b){b=b.updateQueue;b=null!==b?b.lastEffect:null;if(null!==b){var c=b=b.next;do{if((c.tag&a)===a){var d=c.create;c.destroy=d()}c=c.next}while(c!==b)}}\nfunction Ji(a,b,c){switch(c.tag){case 0:case 11:case 15:case 22:Ii(3,c);return;case 1:a=c.stateNode;if(c.effectTag&4)if(null===b)a.componentDidMount();else{var d=c.elementType===c.type?b.memoizedProps:ig(c.type,b.memoizedProps);a.componentDidUpdate(d,b.memoizedState,a.__reactInternalSnapshotBeforeUpdate)}b=c.updateQueue;null!==b&&Cg(c,b,a);return;case 3:b=c.updateQueue;if(null!==b){a=null;if(null!==c.child)switch(c.child.tag){case 5:a=c.child.stateNode;break;case 1:a=c.child.stateNode}Cg(c,b,a)}return;\ncase 5:a=c.stateNode;null===b&&c.effectTag&4&&Fd(c.type,c.memoizedProps)&&a.focus();return;case 6:return;case 4:return;case 12:return;case 13:null===c.memoizedState&&(c=c.alternate,null!==c&&(c=c.memoizedState,null!==c&&(c=c.dehydrated,null!==c&&Vc(c))));return;case 19:case 17:case 20:case 21:return}throw Error(u(163));}\nfunction Ki(a,b,c){\"function\"===typeof Li&&Li(b);switch(b.tag){case 0:case 11:case 14:case 15:case 22:a=b.updateQueue;if(null!==a&&(a=a.lastEffect,null!==a)){var d=a.next;cg(97<c?97:c,function(){var a=d;do{var c=a.destroy;if(void 0!==c){var g=b;try{c()}catch(h){Ei(g,h)}}a=a.next}while(a!==d)})}break;case 1:Fi(b);c=b.stateNode;\"function\"===typeof c.componentWillUnmount&&Di(b,c);break;case 5:Fi(b);break;case 4:Mi(a,b,c)}}\nfunction Ni(a){var b=a.alternate;a.return=null;a.child=null;a.memoizedState=null;a.updateQueue=null;a.dependencies=null;a.alternate=null;a.firstEffect=null;a.lastEffect=null;a.pendingProps=null;a.memoizedProps=null;a.stateNode=null;null!==b&&Ni(b)}function Oi(a){return 5===a.tag||3===a.tag||4===a.tag}\nfunction Pi(a){a:{for(var b=a.return;null!==b;){if(Oi(b)){var c=b;break a}b=b.return}throw Error(u(160));}b=c.stateNode;switch(c.tag){case 5:var d=!1;break;case 3:b=b.containerInfo;d=!0;break;case 4:b=b.containerInfo;d=!0;break;default:throw Error(u(161));}c.effectTag&16&&(Rb(b,\"\"),c.effectTag&=-17);a:b:for(c=a;;){for(;null===c.sibling;){if(null===c.return||Oi(c.return)){c=null;break a}c=c.return}c.sibling.return=c.return;for(c=c.sibling;5!==c.tag&&6!==c.tag&&18!==c.tag;){if(c.effectTag&2)continue b;\nif(null===c.child||4===c.tag)continue b;else c.child.return=c,c=c.child}if(!(c.effectTag&2)){c=c.stateNode;break a}}d?Qi(a,c,b):Ri(a,c,b)}\nfunction Qi(a,b,c){var d=a.tag,e=5===d||6===d;if(e)a=e?a.stateNode:a.stateNode.instance,b?8===c.nodeType?c.parentNode.insertBefore(a,b):c.insertBefore(a,b):(8===c.nodeType?(b=c.parentNode,b.insertBefore(a,c)):(b=c,b.appendChild(a)),c=c._reactRootContainer,null!==c&&void 0!==c||null!==b.onclick||(b.onclick=sd));else if(4!==d&&(a=a.child,null!==a))for(Qi(a,b,c),a=a.sibling;null!==a;)Qi(a,b,c),a=a.sibling}\nfunction Ri(a,b,c){var d=a.tag,e=5===d||6===d;if(e)a=e?a.stateNode:a.stateNode.instance,b?c.insertBefore(a,b):c.appendChild(a);else if(4!==d&&(a=a.child,null!==a))for(Ri(a,b,c),a=a.sibling;null!==a;)Ri(a,b,c),a=a.sibling}\nfunction Mi(a,b,c){for(var d=b,e=!1,f,g;;){if(!e){e=d.return;a:for(;;){if(null===e)throw Error(u(160));f=e.stateNode;switch(e.tag){case 5:g=!1;break a;case 3:f=f.containerInfo;g=!0;break a;case 4:f=f.containerInfo;g=!0;break a}e=e.return}e=!0}if(5===d.tag||6===d.tag){a:for(var h=a,k=d,l=c,m=k;;)if(Ki(h,m,l),null!==m.child&&4!==m.tag)m.child.return=m,m=m.child;else{if(m===k)break a;for(;null===m.sibling;){if(null===m.return||m.return===k)break a;m=m.return}m.sibling.return=m.return;m=m.sibling}g?(h=\nf,k=d.stateNode,8===h.nodeType?h.parentNode.removeChild(k):h.removeChild(k)):f.removeChild(d.stateNode)}else if(4===d.tag){if(null!==d.child){f=d.stateNode.containerInfo;g=!0;d.child.return=d;d=d.child;continue}}else if(Ki(a,d,c),null!==d.child){d.child.return=d;d=d.child;continue}if(d===b)break;for(;null===d.sibling;){if(null===d.return||d.return===b)return;d=d.return;4===d.tag&&(e=!1)}d.sibling.return=d.return;d=d.sibling}}\nfunction Si(a,b){switch(b.tag){case 0:case 11:case 14:case 15:case 22:Hi(3,b);return;case 1:return;case 5:var c=b.stateNode;if(null!=c){var d=b.memoizedProps,e=null!==a?a.memoizedProps:d;a=b.type;var f=b.updateQueue;b.updateQueue=null;if(null!==f){c[Nd]=d;\"input\"===a&&\"radio\"===d.type&&null!=d.name&&Bb(c,d);pd(a,e);b=pd(a,d);for(e=0;e<f.length;e+=2){var g=f[e],h=f[e+1];\"style\"===g?md(c,h):\"dangerouslySetInnerHTML\"===g?Qb(c,h):\"children\"===g?Rb(c,h):Xa(c,g,h,b)}switch(a){case \"input\":Cb(c,d);break;\ncase \"textarea\":Kb(c,d);break;case \"select\":b=c._wrapperState.wasMultiple,c._wrapperState.wasMultiple=!!d.multiple,a=d.value,null!=a?Hb(c,!!d.multiple,a,!1):b!==!!d.multiple&&(null!=d.defaultValue?Hb(c,!!d.multiple,d.defaultValue,!0):Hb(c,!!d.multiple,d.multiple?[]:\"\",!1))}}}return;case 6:if(null===b.stateNode)throw Error(u(162));b.stateNode.nodeValue=b.memoizedProps;return;case 3:b=b.stateNode;b.hydrate&&(b.hydrate=!1,Vc(b.containerInfo));return;case 12:return;case 13:c=b;null===b.memoizedState?\nd=!1:(d=!0,c=b.child,Ti=$f());if(null!==c)a:for(a=c;;){if(5===a.tag)f=a.stateNode,d?(f=f.style,\"function\"===typeof f.setProperty?f.setProperty(\"display\",\"none\",\"important\"):f.display=\"none\"):(f=a.stateNode,e=a.memoizedProps.style,e=void 0!==e&&null!==e&&e.hasOwnProperty(\"display\")?e.display:null,f.style.display=ld(\"display\",e));else if(6===a.tag)a.stateNode.nodeValue=d?\"\":a.memoizedProps;else if(13===a.tag&&null!==a.memoizedState&&null===a.memoizedState.dehydrated){f=a.child.sibling;f.return=a;a=\nf;continue}else if(null!==a.child){a.child.return=a;a=a.child;continue}if(a===c)break;for(;null===a.sibling;){if(null===a.return||a.return===c)break a;a=a.return}a.sibling.return=a.return;a=a.sibling}Ui(b);return;case 19:Ui(b);return;case 17:return}throw Error(u(163));}function Ui(a){var b=a.updateQueue;if(null!==b){a.updateQueue=null;var c=a.stateNode;null===c&&(c=a.stateNode=new Bi);b.forEach(function(b){var d=Vi.bind(null,a,b);c.has(b)||(c.add(b),b.then(d,d))})}}\nvar Wi=\"function\"===typeof WeakMap?WeakMap:Map;function Xi(a,b,c){c=wg(c,null);c.tag=3;c.payload={element:null};var d=b.value;c.callback=function(){Yi||(Yi=!0,Zi=d);Ci(a,b)};return c}\nfunction $i(a,b,c){c=wg(c,null);c.tag=3;var d=a.type.getDerivedStateFromError;if(\"function\"===typeof d){var e=b.value;c.payload=function(){Ci(a,b);return d(e)}}var f=a.stateNode;null!==f&&\"function\"===typeof f.componentDidCatch&&(c.callback=function(){\"function\"!==typeof d&&(null===aj?aj=new Set([this]):aj.add(this),Ci(a,b));var c=b.stack;this.componentDidCatch(b.value,{componentStack:null!==c?c:\"\"})});return c}\nvar bj=Math.ceil,cj=Wa.ReactCurrentDispatcher,dj=Wa.ReactCurrentOwner,V=0,ej=8,fj=16,gj=32,ti=0,hj=1,ij=2,ui=3,vi=4,jj=5,W=V,T=null,X=null,U=0,S=ti,kj=null,lj=1073741823,mj=1073741823,nj=null,wi=0,oj=!1,Ti=0,pj=500,Y=null,Yi=!1,Zi=null,aj=null,qj=!1,rj=null,sj=90,tj=null,uj=0,vj=null,wj=0;function Gg(){return(W&(fj|gj))!==V?1073741821-($f()/10|0):0!==wj?wj:wj=1073741821-($f()/10|0)}\nfunction Hg(a,b,c){b=b.mode;if(0===(b&2))return 1073741823;var d=ag();if(0===(b&4))return 99===d?1073741823:1073741822;if((W&fj)!==V)return U;if(null!==c)a=hg(a,c.timeoutMs|0||5E3,250);else switch(d){case 99:a=1073741823;break;case 98:a=hg(a,150,100);break;case 97:case 96:a=hg(a,5E3,250);break;case 95:a=2;break;default:throw Error(u(326));}null!==T&&a===U&&--a;return a}\nfunction Ig(a,b){if(50<uj)throw uj=0,vj=null,Error(u(185));a=xj(a,b);if(null!==a){var c=ag();1073741823===b?(W&ej)!==V&&(W&(fj|gj))===V?yj(a):(Z(a),W===V&&gg()):Z(a);(W&4)===V||98!==c&&99!==c||(null===tj?tj=new Map([[a,b]]):(c=tj.get(a),(void 0===c||c>b)&&tj.set(a,b)))}}\nfunction xj(a,b){a.expirationTime<b&&(a.expirationTime=b);var c=a.alternate;null!==c&&c.expirationTime<b&&(c.expirationTime=b);var d=a.return,e=null;if(null===d&&3===a.tag)e=a.stateNode;else for(;null!==d;){c=d.alternate;d.childExpirationTime<b&&(d.childExpirationTime=b);null!==c&&c.childExpirationTime<b&&(c.childExpirationTime=b);if(null===d.return&&3===d.tag){e=d.stateNode;break}d=d.return}null!==e&&(T===e&&(Bg(b),S===vi&&xi(e,U)),yi(e,b));return e}\nfunction zj(a){var b=a.lastExpiredTime;if(0!==b)return b;b=a.firstPendingTime;if(!Aj(a,b))return b;var c=a.lastPingedTime;a=a.nextKnownPendingLevel;a=c>a?c:a;return 2>=a&&b!==a?0:a}\nfunction Z(a){if(0!==a.lastExpiredTime)a.callbackExpirationTime=1073741823,a.callbackPriority=99,a.callbackNode=eg(yj.bind(null,a));else{var b=zj(a),c=a.callbackNode;if(0===b)null!==c&&(a.callbackNode=null,a.callbackExpirationTime=0,a.callbackPriority=90);else{var d=Gg();1073741823===b?d=99:1===b||2===b?d=95:(d=10*(1073741821-b)-10*(1073741821-d),d=0>=d?99:250>=d?98:5250>=d?97:95);if(null!==c){var e=a.callbackPriority;if(a.callbackExpirationTime===b&&e>=d)return;c!==Tf&&Kf(c)}a.callbackExpirationTime=\nb;a.callbackPriority=d;b=1073741823===b?eg(yj.bind(null,a)):dg(d,Bj.bind(null,a),{timeout:10*(1073741821-b)-$f()});a.callbackNode=b}}}\nfunction Bj(a,b){wj=0;if(b)return b=Gg(),Cj(a,b),Z(a),null;var c=zj(a);if(0!==c){b=a.callbackNode;if((W&(fj|gj))!==V)throw Error(u(327));Dj();a===T&&c===U||Ej(a,c);if(null!==X){var d=W;W|=fj;var e=Fj();do try{Gj();break}catch(h){Hj(a,h)}while(1);ng();W=d;cj.current=e;if(S===hj)throw b=kj,Ej(a,c),xi(a,c),Z(a),b;if(null===X)switch(e=a.finishedWork=a.current.alternate,a.finishedExpirationTime=c,d=S,T=null,d){case ti:case hj:throw Error(u(345));case ij:Cj(a,2<c?2:c);break;case ui:xi(a,c);d=a.lastSuspendedTime;\nc===d&&(a.nextKnownPendingLevel=Ij(e));if(1073741823===lj&&(e=Ti+pj-$f(),10<e)){if(oj){var f=a.lastPingedTime;if(0===f||f>=c){a.lastPingedTime=c;Ej(a,c);break}}f=zj(a);if(0!==f&&f!==c)break;if(0!==d&&d!==c){a.lastPingedTime=d;break}a.timeoutHandle=Hd(Jj.bind(null,a),e);break}Jj(a);break;case vi:xi(a,c);d=a.lastSuspendedTime;c===d&&(a.nextKnownPendingLevel=Ij(e));if(oj&&(e=a.lastPingedTime,0===e||e>=c)){a.lastPingedTime=c;Ej(a,c);break}e=zj(a);if(0!==e&&e!==c)break;if(0!==d&&d!==c){a.lastPingedTime=\nd;break}1073741823!==mj?d=10*(1073741821-mj)-$f():1073741823===lj?d=0:(d=10*(1073741821-lj)-5E3,e=$f(),c=10*(1073741821-c)-e,d=e-d,0>d&&(d=0),d=(120>d?120:480>d?480:1080>d?1080:1920>d?1920:3E3>d?3E3:4320>d?4320:1960*bj(d/1960))-d,c<d&&(d=c));if(10<d){a.timeoutHandle=Hd(Jj.bind(null,a),d);break}Jj(a);break;case jj:if(1073741823!==lj&&null!==nj){f=lj;var g=nj;d=g.busyMinDurationMs|0;0>=d?d=0:(e=g.busyDelayMs|0,f=$f()-(10*(1073741821-f)-(g.timeoutMs|0||5E3)),d=f<=e?0:e+d-f);if(10<d){xi(a,c);a.timeoutHandle=\nHd(Jj.bind(null,a),d);break}}Jj(a);break;default:throw Error(u(329));}Z(a);if(a.callbackNode===b)return Bj.bind(null,a)}}return null}\nfunction yj(a){var b=a.lastExpiredTime;b=0!==b?b:1073741823;if((W&(fj|gj))!==V)throw Error(u(327));Dj();a===T&&b===U||Ej(a,b);if(null!==X){var c=W;W|=fj;var d=Fj();do try{Kj();break}catch(e){Hj(a,e)}while(1);ng();W=c;cj.current=d;if(S===hj)throw c=kj,Ej(a,b),xi(a,b),Z(a),c;if(null!==X)throw Error(u(261));a.finishedWork=a.current.alternate;a.finishedExpirationTime=b;T=null;Jj(a);Z(a)}return null}function Lj(){if(null!==tj){var a=tj;tj=null;a.forEach(function(a,c){Cj(c,a);Z(c)});gg()}}\nfunction Mj(a,b){var c=W;W|=1;try{return a(b)}finally{W=c,W===V&&gg()}}function Nj(a,b){var c=W;W&=-2;W|=ej;try{return a(b)}finally{W=c,W===V&&gg()}}\nfunction Ej(a,b){a.finishedWork=null;a.finishedExpirationTime=0;var c=a.timeoutHandle;-1!==c&&(a.timeoutHandle=-1,Id(c));if(null!==X)for(c=X.return;null!==c;){var d=c;switch(d.tag){case 1:d=d.type.childContextTypes;null!==d&&void 0!==d&&Df();break;case 3:eh();H(K);H(J);break;case 5:gh(d);break;case 4:eh();break;case 13:H(M);break;case 19:H(M);break;case 10:og(d)}c=c.return}T=a;X=Sg(a.current,null);U=b;S=ti;kj=null;mj=lj=1073741823;nj=null;wi=0;oj=!1}\nfunction Hj(a,b){do{try{ng();jh.current=sh;if(mh)for(var c=N.memoizedState;null!==c;){var d=c.queue;null!==d&&(d.pending=null);c=c.next}lh=0;P=O=N=null;mh=!1;if(null===X||null===X.return)return S=hj,kj=b,X=null;a:{var e=a,f=X.return,g=X,h=b;b=U;g.effectTag|=2048;g.firstEffect=g.lastEffect=null;if(null!==h&&\"object\"===typeof h&&\"function\"===typeof h.then){var k=h;if(0===(g.mode&2)){var l=g.alternate;l?(g.updateQueue=l.updateQueue,g.memoizedState=l.memoizedState,g.expirationTime=l.expirationTime):(g.updateQueue=\nnull,g.memoizedState=null)}var m=0!==(M.current&1),p=f;do{var x;if(x=13===p.tag){var z=p.memoizedState;if(null!==z)x=null!==z.dehydrated?!0:!1;else{var ca=p.memoizedProps;x=void 0===ca.fallback?!1:!0!==ca.unstable_avoidThisFallback?!0:m?!1:!0}}if(x){var D=p.updateQueue;if(null===D){var t=new Set;t.add(k);p.updateQueue=t}else D.add(k);if(0===(p.mode&2)){p.effectTag|=64;g.effectTag&=-2981;if(1===g.tag)if(null===g.alternate)g.tag=17;else{var y=wg(1073741823,null);y.tag=2;xg(g,y)}g.expirationTime=1073741823;\nbreak a}h=void 0;g=b;var A=e.pingCache;null===A?(A=e.pingCache=new Wi,h=new Set,A.set(k,h)):(h=A.get(k),void 0===h&&(h=new Set,A.set(k,h)));if(!h.has(g)){h.add(g);var q=Oj.bind(null,e,k,g);k.then(q,q)}p.effectTag|=4096;p.expirationTime=b;break a}p=p.return}while(null!==p);h=Error((pb(g.type)||\"A React component\")+\" suspended while rendering, but no fallback UI was specified.\\n\\nAdd a <Suspense fallback=...> component higher in the tree to provide a loading indicator or placeholder to display.\"+qb(g))}S!==\njj&&(S=ij);h=Ai(h,g);p=f;do{switch(p.tag){case 3:k=h;p.effectTag|=4096;p.expirationTime=b;var B=Xi(p,k,b);yg(p,B);break a;case 1:k=h;var w=p.type,ub=p.stateNode;if(0===(p.effectTag&64)&&(\"function\"===typeof w.getDerivedStateFromError||null!==ub&&\"function\"===typeof ub.componentDidCatch&&(null===aj||!aj.has(ub)))){p.effectTag|=4096;p.expirationTime=b;var vb=$i(p,k,b);yg(p,vb);break a}}p=p.return}while(null!==p)}X=Pj(X)}catch(Xc){b=Xc;continue}break}while(1)}\nfunction Fj(){var a=cj.current;cj.current=sh;return null===a?sh:a}function Ag(a,b){a<lj&&2<a&&(lj=a);null!==b&&a<mj&&2<a&&(mj=a,nj=b)}function Bg(a){a>wi&&(wi=a)}function Kj(){for(;null!==X;)X=Qj(X)}function Gj(){for(;null!==X&&!Uf();)X=Qj(X)}function Qj(a){var b=Rj(a.alternate,a,U);a.memoizedProps=a.pendingProps;null===b&&(b=Pj(a));dj.current=null;return b}\nfunction Pj(a){X=a;do{var b=X.alternate;a=X.return;if(0===(X.effectTag&2048)){b=si(b,X,U);if(1===U||1!==X.childExpirationTime){for(var c=0,d=X.child;null!==d;){var e=d.expirationTime,f=d.childExpirationTime;e>c&&(c=e);f>c&&(c=f);d=d.sibling}X.childExpirationTime=c}if(null!==b)return b;null!==a&&0===(a.effectTag&2048)&&(null===a.firstEffect&&(a.firstEffect=X.firstEffect),null!==X.lastEffect&&(null!==a.lastEffect&&(a.lastEffect.nextEffect=X.firstEffect),a.lastEffect=X.lastEffect),1<X.effectTag&&(null!==\na.lastEffect?a.lastEffect.nextEffect=X:a.firstEffect=X,a.lastEffect=X))}else{b=zi(X);if(null!==b)return b.effectTag&=2047,b;null!==a&&(a.firstEffect=a.lastEffect=null,a.effectTag|=2048)}b=X.sibling;if(null!==b)return b;X=a}while(null!==X);S===ti&&(S=jj);return null}function Ij(a){var b=a.expirationTime;a=a.childExpirationTime;return b>a?b:a}function Jj(a){var b=ag();cg(99,Sj.bind(null,a,b));return null}\nfunction Sj(a,b){do Dj();while(null!==rj);if((W&(fj|gj))!==V)throw Error(u(327));var c=a.finishedWork,d=a.finishedExpirationTime;if(null===c)return null;a.finishedWork=null;a.finishedExpirationTime=0;if(c===a.current)throw Error(u(177));a.callbackNode=null;a.callbackExpirationTime=0;a.callbackPriority=90;a.nextKnownPendingLevel=0;var e=Ij(c);a.firstPendingTime=e;d<=a.lastSuspendedTime?a.firstSuspendedTime=a.lastSuspendedTime=a.nextKnownPendingLevel=0:d<=a.firstSuspendedTime&&(a.firstSuspendedTime=\nd-1);d<=a.lastPingedTime&&(a.lastPingedTime=0);d<=a.lastExpiredTime&&(a.lastExpiredTime=0);a===T&&(X=T=null,U=0);1<c.effectTag?null!==c.lastEffect?(c.lastEffect.nextEffect=c,e=c.firstEffect):e=c:e=c.firstEffect;if(null!==e){var f=W;W|=gj;dj.current=null;Dd=fd;var g=xd();if(yd(g)){if(\"selectionStart\"in g)var h={start:g.selectionStart,end:g.selectionEnd};else a:{h=(h=g.ownerDocument)&&h.defaultView||window;var k=h.getSelection&&h.getSelection();if(k&&0!==k.rangeCount){h=k.anchorNode;var l=k.anchorOffset,\nm=k.focusNode;k=k.focusOffset;try{h.nodeType,m.nodeType}catch(wb){h=null;break a}var p=0,x=-1,z=-1,ca=0,D=0,t=g,y=null;b:for(;;){for(var A;;){t!==h||0!==l&&3!==t.nodeType||(x=p+l);t!==m||0!==k&&3!==t.nodeType||(z=p+k);3===t.nodeType&&(p+=t.nodeValue.length);if(null===(A=t.firstChild))break;y=t;t=A}for(;;){if(t===g)break b;y===h&&++ca===l&&(x=p);y===m&&++D===k&&(z=p);if(null!==(A=t.nextSibling))break;t=y;y=t.parentNode}t=A}h=-1===x||-1===z?null:{start:x,end:z}}else h=null}h=h||{start:0,end:0}}else h=\nnull;Ed={activeElementDetached:null,focusedElem:g,selectionRange:h};fd=!1;Y=e;do try{Tj()}catch(wb){if(null===Y)throw Error(u(330));Ei(Y,wb);Y=Y.nextEffect}while(null!==Y);Y=e;do try{for(g=a,h=b;null!==Y;){var q=Y.effectTag;q&16&&Rb(Y.stateNode,\"\");if(q&128){var B=Y.alternate;if(null!==B){var w=B.ref;null!==w&&(\"function\"===typeof w?w(null):w.current=null)}}switch(q&1038){case 2:Pi(Y);Y.effectTag&=-3;break;case 6:Pi(Y);Y.effectTag&=-3;Si(Y.alternate,Y);break;case 1024:Y.effectTag&=-1025;break;case 1028:Y.effectTag&=\n-1025;Si(Y.alternate,Y);break;case 4:Si(Y.alternate,Y);break;case 8:l=Y,Mi(g,l,h),Ni(l)}Y=Y.nextEffect}}catch(wb){if(null===Y)throw Error(u(330));Ei(Y,wb);Y=Y.nextEffect}while(null!==Y);w=Ed;B=xd();q=w.focusedElem;h=w.selectionRange;if(B!==q&&q&&q.ownerDocument&&wd(q.ownerDocument.documentElement,q)){null!==h&&yd(q)&&(B=h.start,w=h.end,void 0===w&&(w=B),\"selectionStart\"in q?(q.selectionStart=B,q.selectionEnd=Math.min(w,q.value.length)):(w=(B=q.ownerDocument||document)&&B.defaultView||window,w.getSelection&&\n(w=w.getSelection(),l=q.textContent.length,g=Math.min(h.start,l),h=void 0===h.end?g:Math.min(h.end,l),!w.extend&&g>h&&(l=h,h=g,g=l),l=vd(q,g),m=vd(q,h),l&&m&&(1!==w.rangeCount||w.anchorNode!==l.node||w.anchorOffset!==l.offset||w.focusNode!==m.node||w.focusOffset!==m.offset)&&(B=B.createRange(),B.setStart(l.node,l.offset),w.removeAllRanges(),g>h?(w.addRange(B),w.extend(m.node,m.offset)):(B.setEnd(m.node,m.offset),w.addRange(B))))));B=[];for(w=q;w=w.parentNode;)1===w.nodeType&&B.push({element:w,left:w.scrollLeft,\ntop:w.scrollTop});\"function\"===typeof q.focus&&q.focus();for(q=0;q<B.length;q++)w=B[q],w.element.scrollLeft=w.left,w.element.scrollTop=w.top}fd=!!Dd;Ed=Dd=null;a.current=c;Y=e;do try{for(q=a;null!==Y;){var ub=Y.effectTag;ub&36&&Ji(q,Y.alternate,Y);if(ub&128){B=void 0;var vb=Y.ref;if(null!==vb){var Xc=Y.stateNode;switch(Y.tag){case 5:B=Xc;break;default:B=Xc}\"function\"===typeof vb?vb(B):vb.current=B}}Y=Y.nextEffect}}catch(wb){if(null===Y)throw Error(u(330));Ei(Y,wb);Y=Y.nextEffect}while(null!==Y);Y=\nnull;Vf();W=f}else a.current=c;if(qj)qj=!1,rj=a,sj=b;else for(Y=e;null!==Y;)b=Y.nextEffect,Y.nextEffect=null,Y=b;b=a.firstPendingTime;0===b&&(aj=null);1073741823===b?a===vj?uj++:(uj=0,vj=a):uj=0;\"function\"===typeof Uj&&Uj(c.stateNode,d);Z(a);if(Yi)throw Yi=!1,a=Zi,Zi=null,a;if((W&ej)!==V)return null;gg();return null}function Tj(){for(;null!==Y;){var a=Y.effectTag;0!==(a&256)&&Gi(Y.alternate,Y);0===(a&512)||qj||(qj=!0,dg(97,function(){Dj();return null}));Y=Y.nextEffect}}\nfunction Dj(){if(90!==sj){var a=97<sj?97:sj;sj=90;return cg(a,Vj)}}function Vj(){if(null===rj)return!1;var a=rj;rj=null;if((W&(fj|gj))!==V)throw Error(u(331));var b=W;W|=gj;for(a=a.current.firstEffect;null!==a;){try{var c=a;if(0!==(c.effectTag&512))switch(c.tag){case 0:case 11:case 15:case 22:Hi(5,c),Ii(5,c)}}catch(d){if(null===a)throw Error(u(330));Ei(a,d)}c=a.nextEffect;a.nextEffect=null;a=c}W=b;gg();return!0}\nfunction Wj(a,b,c){b=Ai(c,b);b=Xi(a,b,1073741823);xg(a,b);a=xj(a,1073741823);null!==a&&Z(a)}function Ei(a,b){if(3===a.tag)Wj(a,a,b);else for(var c=a.return;null!==c;){if(3===c.tag){Wj(c,a,b);break}else if(1===c.tag){var d=c.stateNode;if(\"function\"===typeof c.type.getDerivedStateFromError||\"function\"===typeof d.componentDidCatch&&(null===aj||!aj.has(d))){a=Ai(b,a);a=$i(c,a,1073741823);xg(c,a);c=xj(c,1073741823);null!==c&&Z(c);break}}c=c.return}}\nfunction Oj(a,b,c){var d=a.pingCache;null!==d&&d.delete(b);T===a&&U===c?S===vi||S===ui&&1073741823===lj&&$f()-Ti<pj?Ej(a,U):oj=!0:Aj(a,c)&&(b=a.lastPingedTime,0!==b&&b<c||(a.lastPingedTime=c,Z(a)))}function Vi(a,b){var c=a.stateNode;null!==c&&c.delete(b);b=0;0===b&&(b=Gg(),b=Hg(b,a,null));a=xj(a,b);null!==a&&Z(a)}var Rj;\nRj=function(a,b,c){var d=b.expirationTime;if(null!==a){var e=b.pendingProps;if(a.memoizedProps!==e||K.current)rg=!0;else{if(d<c){rg=!1;switch(b.tag){case 3:hi(b);Xh();break;case 5:fh(b);if(b.mode&4&&1!==c&&e.hidden)return b.expirationTime=b.childExpirationTime=1,null;break;case 1:L(b.type)&&Gf(b);break;case 4:dh(b,b.stateNode.containerInfo);break;case 10:d=b.memoizedProps.value;e=b.type._context;I(jg,e._currentValue);e._currentValue=d;break;case 13:if(null!==b.memoizedState){d=b.child.childExpirationTime;\nif(0!==d&&d>=c)return ji(a,b,c);I(M,M.current&1);b=$h(a,b,c);return null!==b?b.sibling:null}I(M,M.current&1);break;case 19:d=b.childExpirationTime>=c;if(0!==(a.effectTag&64)){if(d)return mi(a,b,c);b.effectTag|=64}e=b.memoizedState;null!==e&&(e.rendering=null,e.tail=null);I(M,M.current);if(!d)return null}return $h(a,b,c)}rg=!1}}else rg=!1;b.expirationTime=0;switch(b.tag){case 2:d=b.type;null!==a&&(a.alternate=null,b.alternate=null,b.effectTag|=2);a=b.pendingProps;e=Cf(b,J.current);qg(b,c);e=oh(null,\nb,d,a,e,c);b.effectTag|=1;if(\"object\"===typeof e&&null!==e&&\"function\"===typeof e.render&&void 0===e.$$typeof){b.tag=1;b.memoizedState=null;b.updateQueue=null;if(L(d)){var f=!0;Gf(b)}else f=!1;b.memoizedState=null!==e.state&&void 0!==e.state?e.state:null;ug(b);var g=d.getDerivedStateFromProps;\"function\"===typeof g&&Fg(b,d,g,a);e.updater=Jg;b.stateNode=e;e._reactInternalFiber=b;Ng(b,d,a,c);b=gi(null,b,d,!0,f,c)}else b.tag=0,R(null,b,e,c),b=b.child;return b;case 16:a:{e=b.elementType;null!==a&&(a.alternate=\nnull,b.alternate=null,b.effectTag|=2);a=b.pendingProps;ob(e);if(1!==e._status)throw e._result;e=e._result;b.type=e;f=b.tag=Xj(e);a=ig(e,a);switch(f){case 0:b=di(null,b,e,a,c);break a;case 1:b=fi(null,b,e,a,c);break a;case 11:b=Zh(null,b,e,a,c);break a;case 14:b=ai(null,b,e,ig(e.type,a),d,c);break a}throw Error(u(306,e,\"\"));}return b;case 0:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:ig(d,e),di(a,b,d,e,c);case 1:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:ig(d,e),fi(a,b,d,e,c);\ncase 3:hi(b);d=b.updateQueue;if(null===a||null===d)throw Error(u(282));d=b.pendingProps;e=b.memoizedState;e=null!==e?e.element:null;vg(a,b);zg(b,d,null,c);d=b.memoizedState.element;if(d===e)Xh(),b=$h(a,b,c);else{if(e=b.stateNode.hydrate)Ph=Jd(b.stateNode.containerInfo.firstChild),Oh=b,e=Qh=!0;if(e)for(c=Yg(b,null,d,c),b.child=c;c;)c.effectTag=c.effectTag&-3|1024,c=c.sibling;else R(a,b,d,c),Xh();b=b.child}return b;case 5:return fh(b),null===a&&Uh(b),d=b.type,e=b.pendingProps,f=null!==a?a.memoizedProps:\nnull,g=e.children,Gd(d,e)?g=null:null!==f&&Gd(d,f)&&(b.effectTag|=16),ei(a,b),b.mode&4&&1!==c&&e.hidden?(b.expirationTime=b.childExpirationTime=1,b=null):(R(a,b,g,c),b=b.child),b;case 6:return null===a&&Uh(b),null;case 13:return ji(a,b,c);case 4:return dh(b,b.stateNode.containerInfo),d=b.pendingProps,null===a?b.child=Xg(b,null,d,c):R(a,b,d,c),b.child;case 11:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:ig(d,e),Zh(a,b,d,e,c);case 7:return R(a,b,b.pendingProps,c),b.child;case 8:return R(a,\nb,b.pendingProps.children,c),b.child;case 12:return R(a,b,b.pendingProps.children,c),b.child;case 10:a:{d=b.type._context;e=b.pendingProps;g=b.memoizedProps;f=e.value;var h=b.type._context;I(jg,h._currentValue);h._currentValue=f;if(null!==g)if(h=g.value,f=$e(h,f)?0:(\"function\"===typeof d._calculateChangedBits?d._calculateChangedBits(h,f):1073741823)|0,0===f){if(g.children===e.children&&!K.current){b=$h(a,b,c);break a}}else for(h=b.child,null!==h&&(h.return=b);null!==h;){var k=h.dependencies;if(null!==\nk){g=h.child;for(var l=k.firstContext;null!==l;){if(l.context===d&&0!==(l.observedBits&f)){1===h.tag&&(l=wg(c,null),l.tag=2,xg(h,l));h.expirationTime<c&&(h.expirationTime=c);l=h.alternate;null!==l&&l.expirationTime<c&&(l.expirationTime=c);pg(h.return,c);k.expirationTime<c&&(k.expirationTime=c);break}l=l.next}}else g=10===h.tag?h.type===b.type?null:h.child:h.child;if(null!==g)g.return=h;else for(g=h;null!==g;){if(g===b){g=null;break}h=g.sibling;if(null!==h){h.return=g.return;g=h;break}g=g.return}h=\ng}R(a,b,e.children,c);b=b.child}return b;case 9:return e=b.type,f=b.pendingProps,d=f.children,qg(b,c),e=sg(e,f.unstable_observedBits),d=d(e),b.effectTag|=1,R(a,b,d,c),b.child;case 14:return e=b.type,f=ig(e,b.pendingProps),f=ig(e.type,f),ai(a,b,e,f,d,c);case 15:return ci(a,b,b.type,b.pendingProps,d,c);case 17:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:ig(d,e),null!==a&&(a.alternate=null,b.alternate=null,b.effectTag|=2),b.tag=1,L(d)?(a=!0,Gf(b)):a=!1,qg(b,c),Lg(b,d,e),Ng(b,d,e,c),gi(null,\nb,d,!0,a,c);case 19:return mi(a,b,c)}throw Error(u(156,b.tag));};var Uj=null,Li=null;function Yj(a){if(\"undefined\"===typeof __REACT_DEVTOOLS_GLOBAL_HOOK__)return!1;var b=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(b.isDisabled||!b.supportsFiber)return!0;try{var c=b.inject(a);Uj=function(a){try{b.onCommitFiberRoot(c,a,void 0,64===(a.current.effectTag&64))}catch(e){}};Li=function(a){try{b.onCommitFiberUnmount(c,a)}catch(e){}}}catch(d){}return!0}\nfunction Zj(a,b,c,d){this.tag=a;this.key=c;this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null;this.index=0;this.ref=null;this.pendingProps=b;this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null;this.mode=d;this.effectTag=0;this.lastEffect=this.firstEffect=this.nextEffect=null;this.childExpirationTime=this.expirationTime=0;this.alternate=null}function Sh(a,b,c,d){return new Zj(a,b,c,d)}\nfunction bi(a){a=a.prototype;return!(!a||!a.isReactComponent)}function Xj(a){if(\"function\"===typeof a)return bi(a)?1:0;if(void 0!==a&&null!==a){a=a.$$typeof;if(a===gb)return 11;if(a===jb)return 14}return 2}\nfunction Sg(a,b){var c=a.alternate;null===c?(c=Sh(a.tag,b,a.key,a.mode),c.elementType=a.elementType,c.type=a.type,c.stateNode=a.stateNode,c.alternate=a,a.alternate=c):(c.pendingProps=b,c.effectTag=0,c.nextEffect=null,c.firstEffect=null,c.lastEffect=null);c.childExpirationTime=a.childExpirationTime;c.expirationTime=a.expirationTime;c.child=a.child;c.memoizedProps=a.memoizedProps;c.memoizedState=a.memoizedState;c.updateQueue=a.updateQueue;b=a.dependencies;c.dependencies=null===b?null:{expirationTime:b.expirationTime,\nfirstContext:b.firstContext,responders:b.responders};c.sibling=a.sibling;c.index=a.index;c.ref=a.ref;return c}\nfunction Ug(a,b,c,d,e,f){var g=2;d=a;if(\"function\"===typeof a)bi(a)&&(g=1);else if(\"string\"===typeof a)g=5;else a:switch(a){case ab:return Wg(c.children,e,f,b);case fb:g=8;e|=7;break;case bb:g=8;e|=1;break;case cb:return a=Sh(12,c,b,e|8),a.elementType=cb,a.type=cb,a.expirationTime=f,a;case hb:return a=Sh(13,c,b,e),a.type=hb,a.elementType=hb,a.expirationTime=f,a;case ib:return a=Sh(19,c,b,e),a.elementType=ib,a.expirationTime=f,a;default:if(\"object\"===typeof a&&null!==a)switch(a.$$typeof){case db:g=\n10;break a;case eb:g=9;break a;case gb:g=11;break a;case jb:g=14;break a;case kb:g=16;d=null;break a;case lb:g=22;break a}throw Error(u(130,null==a?a:typeof a,\"\"));}b=Sh(g,c,b,e);b.elementType=a;b.type=d;b.expirationTime=f;return b}function Wg(a,b,c,d){a=Sh(7,a,d,b);a.expirationTime=c;return a}function Tg(a,b,c){a=Sh(6,a,null,b);a.expirationTime=c;return a}\nfunction Vg(a,b,c){b=Sh(4,null!==a.children?a.children:[],a.key,b);b.expirationTime=c;b.stateNode={containerInfo:a.containerInfo,pendingChildren:null,implementation:a.implementation};return b}\nfunction ak(a,b,c){this.tag=b;this.current=null;this.containerInfo=a;this.pingCache=this.pendingChildren=null;this.finishedExpirationTime=0;this.finishedWork=null;this.timeoutHandle=-1;this.pendingContext=this.context=null;this.hydrate=c;this.callbackNode=null;this.callbackPriority=90;this.lastExpiredTime=this.lastPingedTime=this.nextKnownPendingLevel=this.lastSuspendedTime=this.firstSuspendedTime=this.firstPendingTime=0}\nfunction Aj(a,b){var c=a.firstSuspendedTime;a=a.lastSuspendedTime;return 0!==c&&c>=b&&a<=b}function xi(a,b){var c=a.firstSuspendedTime,d=a.lastSuspendedTime;c<b&&(a.firstSuspendedTime=b);if(d>b||0===c)a.lastSuspendedTime=b;b<=a.lastPingedTime&&(a.lastPingedTime=0);b<=a.lastExpiredTime&&(a.lastExpiredTime=0)}\nfunction yi(a,b){b>a.firstPendingTime&&(a.firstPendingTime=b);var c=a.firstSuspendedTime;0!==c&&(b>=c?a.firstSuspendedTime=a.lastSuspendedTime=a.nextKnownPendingLevel=0:b>=a.lastSuspendedTime&&(a.lastSuspendedTime=b+1),b>a.nextKnownPendingLevel&&(a.nextKnownPendingLevel=b))}function Cj(a,b){var c=a.lastExpiredTime;if(0===c||c>b)a.lastExpiredTime=b}\nfunction bk(a,b,c,d){var e=b.current,f=Gg(),g=Dg.suspense;f=Hg(f,e,g);a:if(c){c=c._reactInternalFiber;b:{if(dc(c)!==c||1!==c.tag)throw Error(u(170));var h=c;do{switch(h.tag){case 3:h=h.stateNode.context;break b;case 1:if(L(h.type)){h=h.stateNode.__reactInternalMemoizedMergedChildContext;break b}}h=h.return}while(null!==h);throw Error(u(171));}if(1===c.tag){var k=c.type;if(L(k)){c=Ff(c,k,h);break a}}c=h}else c=Af;null===b.context?b.context=c:b.pendingContext=c;b=wg(f,g);b.payload={element:a};d=void 0===\nd?null:d;null!==d&&(b.callback=d);xg(e,b);Ig(e,f);return f}function ck(a){a=a.current;if(!a.child)return null;switch(a.child.tag){case 5:return a.child.stateNode;default:return a.child.stateNode}}function dk(a,b){a=a.memoizedState;null!==a&&null!==a.dehydrated&&a.retryTime<b&&(a.retryTime=b)}function ek(a,b){dk(a,b);(a=a.alternate)&&dk(a,b)}\nfunction fk(a,b,c){c=null!=c&&!0===c.hydrate;var d=new ak(a,b,c),e=Sh(3,null,null,2===b?7:1===b?3:0);d.current=e;e.stateNode=d;ug(e);a[Od]=d.current;c&&0!==b&&Jc(a,9===a.nodeType?a:a.ownerDocument);this._internalRoot=d}fk.prototype.render=function(a){bk(a,this._internalRoot,null,null)};fk.prototype.unmount=function(){var a=this._internalRoot,b=a.containerInfo;bk(null,a,null,function(){b[Od]=null})};\nfunction gk(a){return!(!a||1!==a.nodeType&&9!==a.nodeType&&11!==a.nodeType&&(8!==a.nodeType||\" react-mount-point-unstable \"!==a.nodeValue))}function hk(a,b){b||(b=a?9===a.nodeType?a.documentElement:a.firstChild:null,b=!(!b||1!==b.nodeType||!b.hasAttribute(\"data-reactroot\")));if(!b)for(var c;c=a.lastChild;)a.removeChild(c);return new fk(a,0,b?{hydrate:!0}:void 0)}\nfunction ik(a,b,c,d,e){var f=c._reactRootContainer;if(f){var g=f._internalRoot;if(\"function\"===typeof e){var h=e;e=function(){var a=ck(g);h.call(a)}}bk(b,g,a,e)}else{f=c._reactRootContainer=hk(c,d);g=f._internalRoot;if(\"function\"===typeof e){var k=e;e=function(){var a=ck(g);k.call(a)}}Nj(function(){bk(b,g,a,e)})}return ck(g)}function jk(a,b,c){var d=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:$a,key:null==d?null:\"\"+d,children:a,containerInfo:b,implementation:c}}\nwc=function(a){if(13===a.tag){var b=hg(Gg(),150,100);Ig(a,b);ek(a,b)}};xc=function(a){13===a.tag&&(Ig(a,3),ek(a,3))};yc=function(a){if(13===a.tag){var b=Gg();b=Hg(b,a,null);Ig(a,b);ek(a,b)}};\nza=function(a,b,c){switch(b){case \"input\":Cb(a,c);b=c.name;if(\"radio\"===c.type&&null!=b){for(c=a;c.parentNode;)c=c.parentNode;c=c.querySelectorAll(\"input[name=\"+JSON.stringify(\"\"+b)+'][type=\"radio\"]');for(b=0;b<c.length;b++){var d=c[b];if(d!==a&&d.form===a.form){var e=Qd(d);if(!e)throw Error(u(90));yb(d);Cb(d,e)}}}break;case \"textarea\":Kb(a,c);break;case \"select\":b=c.value,null!=b&&Hb(a,!!c.multiple,b,!1)}};Fa=Mj;\nGa=function(a,b,c,d,e){var f=W;W|=4;try{return cg(98,a.bind(null,b,c,d,e))}finally{W=f,W===V&&gg()}};Ha=function(){(W&(1|fj|gj))===V&&(Lj(),Dj())};Ia=function(a,b){var c=W;W|=2;try{return a(b)}finally{W=c,W===V&&gg()}};function kk(a,b){var c=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;if(!gk(b))throw Error(u(200));return jk(a,b,null,c)}var lk={Events:[Nc,Pd,Qd,xa,ta,Xd,function(a){jc(a,Wd)},Da,Ea,id,mc,Dj,{current:!1}]};\n(function(a){var b=a.findFiberByHostInstance;return Yj(n({},a,{overrideHookState:null,overrideProps:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:Wa.ReactCurrentDispatcher,findHostInstanceByFiber:function(a){a=hc(a);return null===a?null:a.stateNode},findFiberByHostInstance:function(a){return b?b(a):null},findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null}))})({findFiberByHostInstance:tc,bundleType:0,version:\"16.14.0\",\nrendererPackageName:\"react-dom\"});exports.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=lk;exports.createPortal=kk;exports.findDOMNode=function(a){if(null==a)return null;if(1===a.nodeType)return a;var b=a._reactInternalFiber;if(void 0===b){if(\"function\"===typeof a.render)throw Error(u(188));throw Error(u(268,Object.keys(a)));}a=hc(b);a=null===a?null:a.stateNode;return a};\nexports.flushSync=function(a,b){if((W&(fj|gj))!==V)throw Error(u(187));var c=W;W|=1;try{return cg(99,a.bind(null,b))}finally{W=c,gg()}};exports.hydrate=function(a,b,c){if(!gk(b))throw Error(u(200));return ik(null,a,b,!0,c)};exports.render=function(a,b,c){if(!gk(b))throw Error(u(200));return ik(null,a,b,!1,c)};\nexports.unmountComponentAtNode=function(a){if(!gk(a))throw Error(u(40));return a._reactRootContainer?(Nj(function(){ik(null,null,a,!1,function(){a._reactRootContainer=null;a[Od]=null})}),!0):!1};exports.unstable_batchedUpdates=Mj;exports.unstable_createPortal=function(a,b){return kk(a,b,2<arguments.length&&void 0!==arguments[2]?arguments[2]:null)};\nexports.unstable_renderSubtreeIntoContainer=function(a,b,c,d){if(!gk(c))throw Error(u(200));if(null==a||void 0===a._reactInternalFiber)throw Error(u(38));return ik(a,b,c,!1,d)};exports.version=\"16.14.0\";\n"],"sourceRoot":""} \ No newline at end of file diff --git a/icons/icon-144x144.png b/icons/icon-144x144.png new file mode 100644 index 00000000..30992847 Binary files /dev/null and b/icons/icon-144x144.png differ diff --git a/icons/icon-192x192.png b/icons/icon-192x192.png new file mode 100644 index 00000000..822e6585 Binary files /dev/null and b/icons/icon-192x192.png differ diff --git a/icons/icon-256x256.png b/icons/icon-256x256.png new file mode 100644 index 00000000..6fda2aae Binary files /dev/null and b/icons/icon-256x256.png differ diff --git a/icons/icon-384x384.png b/icons/icon-384x384.png new file mode 100644 index 00000000..dda75a43 Binary files /dev/null and b/icons/icon-384x384.png differ diff --git a/icons/icon-48x48.png b/icons/icon-48x48.png new file mode 100644 index 00000000..d2389c72 Binary files /dev/null and b/icons/icon-48x48.png differ diff --git a/icons/icon-512x512.png b/icons/icon-512x512.png new file mode 100644 index 00000000..554e7f90 Binary files /dev/null and b/icons/icon-512x512.png differ diff --git a/icons/icon-72x72.png b/icons/icon-72x72.png new file mode 100644 index 00000000..25eea8bb Binary files /dev/null and b/icons/icon-72x72.png differ diff --git a/icons/icon-96x96.png b/icons/icon-96x96.png new file mode 100644 index 00000000..4d35947c Binary files /dev/null and b/icons/icon-96x96.png differ diff --git a/idb-keyval-iife.min.js b/idb-keyval-iife.min.js new file mode 100644 index 00000000..067a966f --- /dev/null +++ b/idb-keyval-iife.min.js @@ -0,0 +1 @@ +var idbKeyval=function(e){"use strict";class t{constructor(e="keyval-store",t="keyval"){this.storeName=t,this._dbp=new Promise((r,n)=>{const o=indexedDB.open(e,1);o.onerror=(()=>n(o.error)),o.onsuccess=(()=>r(o.result)),o.onupgradeneeded=(()=>{o.result.createObjectStore(t)})})}_withIDBStore(e,t){return this._dbp.then(r=>new Promise((n,o)=>{const s=r.transaction(this.storeName,e);s.oncomplete=(()=>n()),s.onabort=s.onerror=(()=>o(s.error)),t(s.objectStore(this.storeName))}))}}let r;function n(){return r||(r=new t),r}return e.Store=t,e.get=function(e,t=n()){let r;return t._withIDBStore("readonly",t=>{r=t.get(e)}).then(()=>r.result)},e.set=function(e,t,r=n()){return r._withIDBStore("readwrite",r=>{r.put(t,e)})},e.del=function(e,t=n()){return t._withIDBStore("readwrite",t=>{t.delete(e)})},e.clear=function(e=n()){return e._withIDBStore("readwrite",e=>{e.clear()})},e.keys=function(e=n()){const t=[];return e._withIDBStore("readonly",e=>{(e.openKeyCursor||e.openCursor).call(e).onsuccess=function(){this.result&&(t.push(this.result.key),this.result.continue())}}).then(()=>t)},e}({}); \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 00000000..03f3c3c1 --- /dev/null +++ b/index.html @@ -0,0 +1,65 @@ +<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="ie=edge"/><meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no, minimum-scale=1, maximum-scale=1, user-scalable=0, viewport-fit=cover"/><style id="typography.js">html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block}audio:not([controls]){display:none;height:0}progress{vertical-align:baseline}[hidden],template{display:none}a{background-color:transparent;}a:active,a:hover{outline-width:0}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:inherit;font-weight:bolder}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}svg:not(:root){overflow:hidden}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}figure{margin:1em 40px}hr{box-sizing:content-box;height:0;overflow:visible}button,input,optgroup,select,textarea{font:inherit;margin:0}optgroup{font-weight:700}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-input-placeholder{color:inherit;opacity:.54}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}html{font:100%/1.625 -apple-system,'BlinkMacSystemFont','Segoe UI','Roboto','Helvetica','Arial',sans-serif,'Apple Color Emoji','Segoe UI Emoji','Segoe UI Symbol';box-sizing:border-box;overflow-y:scroll;}*{box-sizing:inherit;}*:before{box-sizing:inherit;}*:after{box-sizing:inherit;}body{color:hsla(0,0%,0%,0.8);font-family:-apple-system,'BlinkMacSystemFont','Segoe UI','Roboto','Helvetica','Arial',sans-serif,'Apple Color Emoji','Segoe UI Emoji','Segoe UI Symbol';font-weight:normal;word-wrap:break-word;font-kerning:normal;-moz-font-feature-settings:"kern", "liga", "clig", "calt";-ms-font-feature-settings:"kern", "liga", "clig", "calt";-webkit-font-feature-settings:"kern", "liga", "clig", "calt";font-feature-settings:"kern", "liga", "clig", "calt";}img{max-width:100%;margin-left:0;margin-right:0;margin-top:0;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;margin-bottom:0.8125rem;}h1{margin-left:0;margin-right:0;margin-top:2.4375rem;padding-bottom:calc(0.40625rem - 1px);padding-left:0;padding-right:0;padding-top:0;margin-bottom:1.21875rem;color:inherit;font-family:Catamaran;font-weight:800;text-rendering:optimizeLegibility;font-size:2rem;line-height:1.2;border-bottom:1px solid hsla(0,0%,0%,0.07);}h2{margin-left:0;margin-right:0;margin-top:56px;padding-bottom:calc(0.40625rem - 1px);padding-left:0;padding-right:0;padding-top:0;margin-bottom:20px;color:inherit;font-family:Catamaran;font-weight:700;text-rendering:optimizeLegibility;font-size:1.51572rem;line-height:1.2;border-bottom:1px solid hsla(0,0%,0%,0.07);}h3{margin-left:0;margin-right:0;margin-top:0;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;margin-bottom:0.8125rem;color:inherit;font-family:-apple-system,'BlinkMacSystemFont','Segoe UI','Roboto','Helvetica','Arial',sans-serif,'Apple Color Emoji','Segoe UI Emoji','Segoe UI Symbol';font-weight:600;text-rendering:optimizeLegibility;font-size:1.31951rem;line-height:1.1;}h4{margin-left:0;margin-right:0;margin-top:0;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;margin-bottom:0.8125rem;color:inherit;font-family:-apple-system,'BlinkMacSystemFont','Segoe UI','Roboto','Helvetica','Arial',sans-serif,'Apple Color Emoji','Segoe UI Emoji','Segoe UI Symbol';font-weight:600;text-rendering:optimizeLegibility;font-size:1rem;line-height:1.1;}h5{margin-left:0;margin-right:0;margin-top:0;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;margin-bottom:0.8125rem;color:inherit;font-family:-apple-system,'BlinkMacSystemFont','Segoe UI','Roboto','Helvetica','Arial',sans-serif,'Apple Color Emoji','Segoe UI Emoji','Segoe UI Symbol';font-weight:600;text-rendering:optimizeLegibility;font-size:0.87055rem;line-height:1.1;}h6{margin-left:0;margin-right:0;margin-top:0;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;margin-bottom:0.8125rem;color:hsla(0,0%,0%,0.53);font-family:-apple-system,'BlinkMacSystemFont','Segoe UI','Roboto','Helvetica','Arial',sans-serif,'Apple Color Emoji','Segoe UI Emoji','Segoe UI Symbol';font-weight:600;text-rendering:optimizeLegibility;font-size:0.81225rem;line-height:1.1;}hgroup{margin-left:0;margin-right:0;margin-top:0;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;margin-bottom:0.8125rem;}ul{margin-left:1.625rem;margin-right:0;margin-top:0;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;margin-bottom:6px;list-style-position:outside;list-style-image:none;}ol{margin-left:1.625rem;margin-right:0;margin-top:0;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;margin-bottom:0.8125rem;list-style-position:outside;list-style-image:none;}dl{margin-left:0;margin-right:0;margin-top:0;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;margin-bottom:0.8125rem;}dd{margin-left:0;margin-right:0;margin-top:0;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;margin-bottom:0.8125rem;}p{margin-left:0;margin-right:0;margin-top:0;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;margin-bottom:0.8125rem;}figure{margin-left:0;margin-right:0;margin-top:0;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;margin-bottom:0.8125rem;}pre{margin-left:0;margin-right:0;margin-top:0;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;margin-bottom:0.8125rem;font-size:0.85rem;line-height:1.625rem;}table{margin-left:0;margin-right:0;margin-top:0;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;margin-bottom:0.8125rem;font-size:1rem;line-height:1.625rem;border-collapse:collapse;width:100%;}fieldset{margin-left:0;margin-right:0;margin-top:0;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;margin-bottom:0.8125rem;}blockquote{margin-left:0;margin-right:0;margin-top:0;padding-bottom:0;padding-left:calc(0.8125rem - 1px);padding-right:0;padding-top:0;margin-bottom:0.8125rem;border-left:4px solid hsla(0,0%,0%,0.13);color:hsla(0,0%,0%,0.53);}form{margin-left:0;margin-right:0;margin-top:0;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;margin-bottom:0.8125rem;}noscript{margin-left:0;margin-right:0;margin-top:0;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;margin-bottom:0.8125rem;}iframe{margin-left:0;margin-right:0;margin-top:0;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;margin-bottom:0.8125rem;}hr{margin-left:0;margin-right:0;margin-top:0;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;margin-bottom:calc(0.8125rem - 1px);background:hsla(0,0%,0%,0.2);border:none;height:1px;}address{margin-left:0;margin-right:0;margin-top:0;padding-bottom:0;padding-left:0;padding-right:0;padding-top:0;margin-bottom:0.8125rem;}b{font-weight:600;}strong{font-weight:600;}dt{font-weight:600;}th{font-weight:600;}li{margin-bottom:2px;}ol li{padding-left:0;}ul li{padding-left:0;}li > ol{margin-left:1.625rem;margin-bottom:calc(0.8125rem / 2);margin-top:calc(0.8125rem / 2);}li > ul{margin-left:1.625rem;margin-bottom:calc(0.8125rem / 2);margin-top:calc(0.8125rem / 2);}blockquote *:last-child{margin-bottom:0;}li *:last-child{margin-bottom:0;}p *:last-child{margin-bottom:0;}li > p{margin-bottom:calc(0.8125rem / 2);}code{font-size:0.85rem;line-height:1.625rem;}kbd{font-size:0.85rem;line-height:1.625rem;}samp{font-size:0.85rem;line-height:1.625rem;}abbr{border-bottom:1px dotted hsla(0,0%,0%,0.5);cursor:help;}acronym{border-bottom:1px dotted hsla(0,0%,0%,0.5);cursor:help;}abbr[title]{border-bottom:1px dotted hsla(0,0%,0%,0.5);cursor:help;text-decoration:none;}thead{text-align:left;}td,th{text-align:left;border-bottom:1px solid hsla(0,0%,0%,0.12);font-feature-settings:"tnum";-moz-font-feature-settings:"tnum";-ms-font-feature-settings:"tnum";-webkit-font-feature-settings:"tnum";padding-left:1.08333rem;padding-right:1.08333rem;padding-top:0.8125rem;padding-bottom:calc(0.8125rem - 1px);}th:first-child,td:first-child{padding-left:0;}th:last-child,td:last-child{padding-right:0;}h3,h4,h5,h6{margin-bottom:0.8125rem;margin-top:1.625rem;}ol,ul{margin-left:2.03125rem;}li>ol,li>ul{margin-left:2.03125rem;}a{color:#0687f0;text-decoration:none;box-shadow:none;}a:hover,a:active{text-decoration:underline;}a.gatsby-resp-image-link{box-shadow:none;text-decoration:none;}a:hover{text-decoration:none;}</style><style data-href="/styles.406e3fc2ab4b0decbd8a.css" id="gatsby-global-css">@import url(https://cdn.jsdelivr.net/gh/tonsky/FiraCode@1.206/distr/fira_code.css);@font-face{font-family:Noto Sans KR;font-style:normal;font-display:swap;font-weight:100;src:local("Noto Sans KR Thin "),local("Noto Sans KR-Thin"),url(/static/noto-sans-kr-latin-100-2de137ca3e12ea146ee47485a97f1e78.woff2) format("woff2"),url(/static/noto-sans-kr-latin-100-b965647685dd9fc531d1f8a1cc25e024.woff) format("woff")}@font-face{font-family:Noto Sans KR;font-style:normal;font-display:swap;font-weight:300;src:local("Noto Sans KR Light "),local("Noto Sans KR-Light"),url(/static/noto-sans-kr-latin-300-4f773a0fce88aa857d70b56c5b0a1d26.woff2) format("woff2"),url(/static/noto-sans-kr-latin-300-ee87751dac814562bac316d848e35748.woff) format("woff")}@font-face{font-family:Noto Sans KR;font-style:normal;font-display:swap;font-weight:400;src:local("Noto Sans KR Regular "),local("Noto Sans KR-Regular"),url(/static/noto-sans-kr-latin-400-be09f2ced7ff9fa6eda5f0416e2fc840.woff2) format("woff2"),url(/static/noto-sans-kr-latin-400-4c50be0fe5b21a153b8e40a392c2d3fe.woff) format("woff")}@font-face{font-family:Noto Sans KR;font-style:normal;font-display:swap;font-weight:500;src:local("Noto Sans KR Medium "),local("Noto Sans KR-Medium"),url(/static/noto-sans-kr-latin-500-416698c2fc4b3951f8d63d3d2ae23900.woff2) format("woff2"),url(/static/noto-sans-kr-latin-500-28601458e118110e494903a1fcd6dcf5.woff) format("woff")}@font-face{font-family:Noto Sans KR;font-style:normal;font-display:swap;font-weight:700;src:local("Noto Sans KR Bold "),local("Noto Sans KR-Bold"),url(/static/noto-sans-kr-latin-700-04e782e08729f3725ae5a9c95da0c8ba.woff2) format("woff2"),url(/static/noto-sans-kr-latin-700-b9e989a96027f839a9569d2d011e0b71.woff) format("woff")}@font-face{font-family:Noto Sans KR;font-style:normal;font-display:swap;font-weight:900;src:local("Noto Sans KR Black "),local("Noto Sans KR-Black"),url(/static/noto-sans-kr-latin-900-c41f1395489a117ca36d550142a1695f.woff2) format("woff2"),url(/static/noto-sans-kr-latin-900-589f5fbf84d9dc9984a969bae969fd60.woff) format("woff")}@font-face{font-family:Catamaran;font-style:normal;font-display:swap;font-weight:100;src:local("Catamaran Thin "),local("Catamaran-Thin"),url(/static/catamaran-latin-100-3570195a7b5f619dd9b2419d8fa3f089.woff2) format("woff2"),url(/static/catamaran-latin-100-e82908f57f6d2f23eb9876b2d6868195.woff) format("woff")}@font-face{font-family:Catamaran;font-style:normal;font-display:swap;font-weight:200;src:local("Catamaran Extra Light "),local("Catamaran-Extra Light"),url(/static/catamaran-latin-200-987ea210308405ac77ba2f36430a70c9.woff2) format("woff2"),url(/static/catamaran-latin-200-bb5993d2f001b739bb9ab7c3ed9725c3.woff) format("woff")}@font-face{font-family:Catamaran;font-style:normal;font-display:swap;font-weight:300;src:local("Catamaran Light "),local("Catamaran-Light"),url(/static/catamaran-latin-300-2b8a4bd13e9d5ba755f010f8732b0bb6.woff2) format("woff2"),url(/static/catamaran-latin-300-c2696c65c33dcf37871b72bad51ee1ce.woff) format("woff")}@font-face{font-family:Catamaran;font-style:normal;font-display:swap;font-weight:400;src:local("Catamaran Regular "),local("Catamaran-Regular"),url(/static/catamaran-latin-400-640947b787a38ec35d097129637d9130.woff2) format("woff2"),url(/static/catamaran-latin-400-97e5bc807a3e915e3fbf40ce5fcb1128.woff) format("woff")}@font-face{font-family:Catamaran;font-style:normal;font-display:swap;font-weight:500;src:local("Catamaran Medium "),local("Catamaran-Medium"),url(/static/catamaran-latin-500-884483dd213f37ae3b5c98f73dd190a5.woff2) format("woff2"),url(/static/catamaran-latin-500-412cf386e31213e3601cb2132b9c4c2d.woff) format("woff")}@font-face{font-family:Catamaran;font-style:normal;font-display:swap;font-weight:600;src:local("Catamaran SemiBold "),local("Catamaran-SemiBold"),url(/static/catamaran-latin-600-eb6ebda25331e50d3f42c45a41f613bb.woff2) format("woff2"),url(/static/catamaran-latin-600-215c58c6114e0556cb1c332c0fda463a.woff) format("woff")}@font-face{font-family:Catamaran;font-style:normal;font-display:swap;font-weight:700;src:local("Catamaran Bold "),local("Catamaran-Bold"),url(/static/catamaran-latin-700-3196f49881b324fa5a5f937875cc380f.woff2) format("woff2"),url(/static/catamaran-latin-700-05f6e51c518dd3b521b258e5c05d0e72.woff) format("woff")}@font-face{font-family:Catamaran;font-style:normal;font-display:swap;font-weight:800;src:local("Catamaran ExtraBold "),local("Catamaran-ExtraBold"),url(/static/catamaran-latin-800-601b1d0f1b78fd65c3205b2c004bbe60.woff2) format("woff2"),url(/static/catamaran-latin-800-3b1675e4ede7e86ec79fa84c1203908e.woff) format("woff")}@font-face{font-family:Catamaran;font-style:normal;font-display:swap;font-weight:900;src:local("Catamaran Black "),local("Catamaran-Black"),url(/static/catamaran-latin-900-6bb5f96614acb7754020b922e1a63d24.woff2) format("woff2"),url(/static/catamaran-latin-900-79292dba48851cc3a212863c860d8f09.woff) format("woff")}.custom-hr{margin:64px;background:linear-gradient(72deg,#002b88,#128bee);border:none;height:2px}.github{float:right;padding:14px;opacity:.6}.top{position:relative;width:100%;height:60px;background:linear-gradient(72deg,#002b88,#128bee)}.top .link{display:inline-block;font-size:28px;padding-top:8px;color:#fff;opacity:.7;margin-left:20px;font-family:Catamaran;font-weight:800}.home-header{margin-top:0;border-bottom:none;font-weight:900;font-size:48px;letter-spacing:-2px}.link{box-shadow:none;text-decoration:none;color:inherit}.switch-container{text-align:right}.switch-container .icon{text-align:center;color:#222;font-size:14px;font-weight:900}.footer{padding-top:52px;text-align:center;font-size:12px}.footer a{text-decoration:none!important}body.light{background-color:#fff;text-shadow:0 0 .1px rgba(0,0,0,.3)}body.light .home-header{color:#333}body.light .bio .author-name-content{background-color:#ecf0f2}body.light .bio .author-introduction{color:#7d7d7d}body.light .bio a{color:#002b88}body.light .category-container{border-color:#ecf0f2;border-style:solid;border-width:1px 6px;background-color:#f4f7f8}body.light .category-container .item{border:1px solid #ecf0f2;background-color:#fff;box-shadow:0 1px 1px rgba(0,0,0,.1)}body.light .category-container .item a{color:#666}body.light .category-container .item[aria-selected=true]{border:2px solid #909da1;font-weight:bolder}body.light .category-container .item[aria-selected=true] a{color:#636c6e}body.light .thumbnail h3{color:#333}body.light .thumbnail p{color:#7d7d7d}body.light .thumbnail:hover{text-shadow:0 0 6px rgba(0,0,0,.2)}body.light .footer{color:#aaa}body.light .footer a{color:#333}body.light .navigator a{background-color:#fceff7;color:#128bee}body.dark{background-color:#282c35;text-shadow:0 0 .1px hsla(0,0%,100%,.3)}body.dark,body.dark .home-header{color:#eee}body.dark .bio .author-name-content{background-color:#383636}body.dark .bio .author-introduction{color:#d8d7d7}body.dark .bio a{color:#12a8ed}body.dark .category-container{border-color:#383636;border-style:solid;border-width:1px 6px;background-color:#24272c}body.dark .category-container .item{border:1px solid #383636;background-color:#282c35;box-shadow:0 1px 1px hsla(0,0%,100%,.1)}body.dark .category-container .item a{color:#d8d7d7}body.dark .category-container .item[aria-selected=true]{border:2px solid #666;font-weight:bolder}body.dark .category-container .item[aria-selected=true] a{color:#fff}body.dark .thumbnail h3{color:#eee}body.dark .thumbnail p{color:#d8d7d7}body.dark .thumbnail:hover{text-shadow:0 0 6px hsla(0,0%,100%,.2)}body.dark .footer{color:#d8d7d7}body.dark .footer a{color:#fff}body.dark blockquote{border-left:4px solid hsla(0,0%,100%,.822)}body.dark h1,body.dark h2{border-bottom-color:hsla(0,0%,100%,.3)}body.dark .navigator a{background-color:#fceff7;color:#128bee}body.dark td{border-bottom:1px solid #eee}body{font-family:Noto Sans KR,sans-serif;background-color:#fff;-webkit-text-size-adjust:antialiased;-moz-osx-font-smoothing:grayscale;transition:background-color .3s,color .3s}.post-date{text-align:right;font-size:12px;font-style:italic}.resp-sharing-button--facebook:hover{background-color:#2d4373}.resp-sharing-button--facebook{background-color:#3b5998;border-color:#3b5998}.resp-sharing-button--facebook:active,.resp-sharing-button--facebook:hover{background-color:#2d4373;border-color:#2d4373}.resp-sharing-button--twitter:hover{background-color:#2795e9}.resp-sharing-button--twitter{background-color:#55acee;border-color:#55acee}.resp-sharing-button--twitter:active,.resp-sharing-button--twitter:hover{background-color:#2795e9;border-color:#2795e9}.social-share{text-align:right;height:100%}.resp-sharing-button__icon,.resp-sharing-button__link{display:inline-block;vertical-align:middle;border:none}.resp-sharing-button__link{text-decoration:none;color:#fff;margin:4px;height:33px}.resp-sharing-button__link .service-label{font-size:12px;padding-right:4px}.resp-sharing-button{height:33px;border-radius:6px;transition:25ms ease-out;padding:3px 8px 3px 10px;font-family:Helvetica Neue,Helvetica,Arial,sans-serif}.resp-sharing-button__icon svg{width:1em;height:1.5em;margin-right:.4em;vertical-align:top}.resp-sharing-button__icon{stroke:#fff;fill:none}.resp-sharing-button__icon--solid{fill:#fff;stroke:none}.sponsor-button{text-align:right;margin:4px}.sponsor-button .bmc-button{display:inline-block;padding:0 7px;width:133px;height:33px;text-decoration:none;background-color:#bb5794;color:#fff;border:1px solid transparent;border-radius:6px;letter-spacing:-.08px;box-sizing:border-box;font-size:12px;line-height:30px;text-align:left}.sponsor-button .bmc-button:active,.sponsor-button .bmc-button:hover{background-color:#a0457d}.sponsor-button .bmc-button img{width:20px;margin-bottom:1px;box-shadow:none;border:none;vertical-align:middle}.sponsor-button .bmc-button span{margin-left:6px}.bio{margin-bottom:24px}.bio .author-description{display:flex}.bio .author-image{margin-top:12px;margin-right:12px;margin-bottom:0;min-width:72px}.bio .author-name-prefix{font-size:90%;margin-right:4px}.bio .author-name-content{display:inline-block;font-size:95%;padding:2px 6px;font-weight:bolder;border-radius:8px;-webkit-transform-origin:center;transform-origin:center;-webkit-animation:flutter 2s linear infinite;animation:flutter 2s linear infinite}.bio .author-introduction{margin-top:4px;font-size:80%;line-height:1.4}.bio .author-socials{margin-top:4px}.bio a{margin-right:8px;font-size:80%}.bio a.visited{text-decoration:none}@-webkit-keyframes flutter{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}35%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}40%{-webkit-transform:rotate(-5deg);transform:rotate(-5deg)}60%{-webkit-transform:rotate(5deg);transform:rotate(5deg)}65%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(0deg);transform:rotate(0deg)}}@keyframes flutter{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}35%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}40%{-webkit-transform:rotate(-5deg);transform:rotate(-5deg)}60%{-webkit-transform:rotate(5deg);transform:rotate(5deg)}65%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(0deg);transform:rotate(0deg)}}.category-container{position:sticky;position:-webkit-sticky;top:0;line-height:0;white-space:nowrap;overflow-x:scroll;-ms-overflow-style:none;overflow:-moz-scrollbars-none;z-index:1;padding:6px 20px}.category-container .item{display:inline-block;margin:.25rem 6px .25rem 0;border-radius:15px;white-space:normal;box-sizing:border-box;cursor:pointer}.category-container .item div{display:block;padding:14px 16px 16px;font-size:13px;box-sizing:border-box}.category-container .item:last-child{margin-right:0}.category-container::-webkit-scrollbar{display:none}.category-container{scroll-behavior:smooth}@media(prefers-reduced-motion:reduce){.my-smooth-container{scroll-behavior:auto}}.thumbnail-container{min-height:calc(100vh - 3.5rem)}.thumbnail{display:block;margin-bottom:12px;padding:4px 4px 12px;box-shadow:none;transition:text-shadow .3s,opacity .4s;opacity:0}.thumbnail p{font-size:90%;line-height:1.4}.thumbnail.visible{opacity:1}.navigator{margin:40px 0;display:flex;flex-wrap:wrap;justify-content:space-between;list-style:none;padding:0}.navigator li{margin-bottom:12px}.navigator a{padding:7px 16px 8px;border-radius:6px;font-size:12px;opacity:.8}.gatsby-highlight-code-line{background-color:#022a4b;display:block;margin-right:-1.2em;margin-left:-1.2em;padding-right:1em;padding-left:.75em;border-left:.35em solid #0687f0}blockquote{color:#999}code[class*=language-],pre[class*=language-]{color:#e0e0e0;background:none;font-family:Fira Code,Consolas,Monaco,Andale Mono,Ubuntu Mono,monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:1.6;font-size:13px;-o-tab-size:2;tab-size:2;-webkit-hyphens:none;hyphens:none;-ms-overflow-style:none;overflow:-moz-scrollbars-none}pre[class*=language-]::-webkit-scrollbar{display:none}pre[class*=language-]{padding:1.2em;margin:1.5em 0;overflow:auto;border-radius:.6em}:not(pre)>code[class*=language-],pre[class*=language-]{background:#212121}:not(pre)>code[class*=language-]{padding:.1em .6em;border-radius:.2em;white-space:normal;background:#ece5f1;color:#0044d8}.token.block-comment,.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#616161}.token.punctuation{color:#e0e0e0}.token.attr-name,.token.deleted,.token.namespace,.token.tag{color:#e2777a}.token.function-name{color:#6196cc}.token.boolean,.token.function,.token.number{color:#ff9100}.token.class-name,.token.constant,.token.property,.token.symbol{color:#ff0}.token.atrule,.token.builtin,.token.important,.token.keyword,.token.selector{color:#b388ff}.token.attr-value,.token.char,.token.regex,.token.string,.token.variable{color:#00e676}.token.entity,.token.operator,.token.url{color:#67cdcc}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.token.inserted{color:green}@font-face{font-family:KaTeX_AMS;src:url(/static/KaTeX_AMS-Regular-e78e28b4834954df047e4925e9dbf354.woff2) format("woff2"),url(/static/KaTeX_AMS-Regular-7f06b4e30317f784d61d26686aed0ab2.woff) format("woff"),url(/static/KaTeX_AMS-Regular-aaf4eee9fba9907d61c3935e0b6a54ae.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Caligraphic;src:url(/static/KaTeX_Caligraphic-Bold-4ec58befa687e9752c3c91cd9bcf1bcb.woff2) format("woff2"),url(/static/KaTeX_Caligraphic-Bold-1e802ca9dedc4ed4e3c6f645e4316128.woff) format("woff"),url(/static/KaTeX_Caligraphic-Bold-021dd4dc61ee5f5cdf315f43b48c094b.ttf) format("truetype");font-weight:700;font-style:normal}@font-face{font-family:KaTeX_Caligraphic;src:url(/static/KaTeX_Caligraphic-Regular-7edb53b6693d75b8a2232481eea1a52c.woff2) format("woff2"),url(/static/KaTeX_Caligraphic-Regular-d3b46c3a530116933081d9d74e3e9fe8.woff) format("woff"),url(/static/KaTeX_Caligraphic-Regular-d49f2d55ce4f40f982d8ba63d746fbf9.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Fraktur;src:url(/static/KaTeX_Fraktur-Bold-d5b59ec9764e10f4a82369ae29f3ac58.woff2) format("woff2"),url(/static/KaTeX_Fraktur-Bold-c4c8cab7d5be97b2bb283e531c077355.woff) format("woff"),url(/static/KaTeX_Fraktur-Bold-a31e7cba7b7221ebf1a2ae545fb306b2.ttf) format("truetype");font-weight:700;font-style:normal}@font-face{font-family:KaTeX_Fraktur;src:url(/static/KaTeX_Fraktur-Regular-32a5339eb809f381a7357ba56f82aab3.woff2) format("woff2"),url(/static/KaTeX_Fraktur-Regular-b7d9c46bff5d51da6209e355cc4a235d.woff) format("woff"),url(/static/KaTeX_Fraktur-Regular-a48dad4f58c82e38a10da0ceebb86370.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Main;src:url(/static/KaTeX_Main-Bold-8e1e01c4b1207c0a383d9a2b4f86e637.woff2) format("woff2"),url(/static/KaTeX_Main-Bold-22086eb5d97009c3e99bcc1d16ce6865.woff) format("woff"),url(/static/KaTeX_Main-Bold-9ceff51b3cb7ce6eb4e8efa8163a1472.ttf) format("truetype");font-weight:700;font-style:normal}@font-face{font-family:KaTeX_Main;src:url(/static/KaTeX_Main-BoldItalic-284a17fe5baf72ff8217d4c7e70c0f82.woff2) format("woff2"),url(/static/KaTeX_Main-BoldItalic-4c57dbc44bfff1fdf08a59cf556fdab3.woff) format("woff"),url(/static/KaTeX_Main-BoldItalic-e8b44b990516dab7937bf240fde8b46a.ttf) format("truetype");font-weight:700;font-style:italic}@font-face{font-family:KaTeX_Main;src:url(/static/KaTeX_Main-Italic-e533d5a2506cf053cd671b335ec04dde.woff2) format("woff2"),url(/static/KaTeX_Main-Italic-99be0e10c38cd42466e6fe1665ef9536.woff) format("woff"),url(/static/KaTeX_Main-Italic-29c86397e75cdcb3135af8295f1c2e28.ttf) format("truetype");font-weight:400;font-style:italic}@font-face{font-family:KaTeX_Main;src:url(/static/KaTeX_Main-Regular-5c734d78610fa35282f3379f866707f2.woff2) format("woff2"),url(/static/KaTeX_Main-Regular-b741441f6d71014d0453ca3ebc884dd4.woff) format("woff"),url(/static/KaTeX_Main-Regular-5c94aef490324b0925dbe5f643e8fd04.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Math;src:url(/static/KaTeX_Math-BoldItalic-d747bd1e7a6a43864285edd73dcde253.woff2) format("woff2"),url(/static/KaTeX_Math-BoldItalic-b13731ef4e2bfc3d8d859271e39550fc.woff) format("woff"),url(/static/KaTeX_Math-BoldItalic-9a2834a9ff8ab411153571e0e55ac693.ttf) format("truetype");font-weight:700;font-style:italic}@font-face{font-family:KaTeX_Math;src:url(/static/KaTeX_Math-Italic-4ad08b826b8065e1eab85324d726538c.woff2) format("woff2"),url(/static/KaTeX_Math-Italic-f0303906c2a67ac63bf1e8ccd638a89e.woff) format("woff"),url(/static/KaTeX_Math-Italic-291e76b8871b84560701bd29f9d1dcc7.ttf) format("truetype");font-weight:400;font-style:italic}@font-face{font-family:"KaTeX_SansSerif";src:url(/static/KaTeX_SansSerif-Bold-6e0830bee40435e72165345e0682fbfc.woff2) format("woff2"),url(/static/KaTeX_SansSerif-Bold-3fb419559955e3ce75619f1a5e8c6c84.woff) format("woff"),url(/static/KaTeX_SansSerif-Bold-7dc027cba9f7b11ec92af4a311372a85.ttf) format("truetype");font-weight:700;font-style:normal}@font-face{font-family:"KaTeX_SansSerif";src:url(/static/KaTeX_SansSerif-Italic-fba01c9c6fb2866a0f95bcacb2c187a5.woff2) format("woff2"),url(/static/KaTeX_SansSerif-Italic-727a9b0d97d72d2fc0228fe4e07fb4d8.woff) format("woff"),url(/static/KaTeX_SansSerif-Italic-4059868e460d2d2e6be18e180d20c43d.ttf) format("truetype");font-weight:400;font-style:italic}@font-face{font-family:"KaTeX_SansSerif";src:url(/static/KaTeX_SansSerif-Regular-d929cd671b19f0cfea55b6200fb47461.woff2) format("woff2"),url(/static/KaTeX_SansSerif-Regular-2555754a67062cac3a0913b715ab982f.woff) format("woff"),url(/static/KaTeX_SansSerif-Regular-5c58d168c0b66d2c32234a6718e74dfb.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Script;src:url(/static/KaTeX_Script-Regular-755e2491f13b5269f0afd5a56f7aa692.woff2) format("woff2"),url(/static/KaTeX_Script-Regular-d524c9a5b62a17f98f4a97af37fea735.woff) format("woff"),url(/static/KaTeX_Script-Regular-d12ea9efb375f9dc331f562e69892638.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Size1;src:url(data:font/woff2;base64,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) format("woff2"),url(data:font/woff;base64,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) format("woff"),url(/static/KaTeX_Size1-Regular-7342d45b052c3a2abc21049959fbab7f.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Size2;src:url(data:font/woff2;base64,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) format("woff2"),url(data:font/woff;base64,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) format("woff"),url(/static/KaTeX_Size2-Regular-eb130dcc661de766c999c60ba1525a88.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Size3;src:url(data:font/woff2;base64,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) format("woff2"),url(data:font/woff;base64,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) format("woff"),url(data:font/ttf;base64,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ZQBYAF8AUwBpAHoAZQAzAC0AUgBlAGcAdQBsAGEAcgBWAGUAcgBzAGkAbwBuACAAMAAuADAALgA0AEMAbwBwAHkAcgBpAGcAaAB0ACAAKABjACkAIAAyADAAMAA5AC0AMgAwADEAMAAsACAARABlAHMAaQBnAG4AIABTAGMAaQBlAG4AYwBlACwAIABJAG4AYwAuACAAKAA8AHcAdwB3AC4AbQBhAHQAaABqAGEAeAAuAG8AcgBnAD4AKQAKAEMAbwBwAHkAcgBpAGcAaAB0ACAAKABjACkAIAAyADAAMQA0AC0AMgAwADEAOAAgAEsAaABhAG4AIABBAGMAYQBkAGUAbQB5ACAAKAA8AHcAdwB3AC4AawBoAGEAbgBhAGMAYQBkAGUAbQB5AC4AbwByAGcAPgApACwACgB3AGkAdABoACAAUgBlAHMAZQByAHYAZQBkACAARgBvAG4AdAAgAE4AYQBtAGUAIABLAGEAVABlAFgAXwBTAGkAegBlADMALgAKAAoAVABoAGkAcwAgAEYAbwBuAHQAIABTAG8AZgB0AHcAYQByAGUAIABpAHMAIABsAGkAYwBlAG4AcwBlAGQAIAB1AG4AZABlAHIAIAB0AGgAZQAgAFMASQBMACAATwBwAGUAbgAgAEYAbwBuAHQAIABMAGkAYwBlAG4AcwBlACwAIABWAGUAcgBzAGkAbwBuACAAMQAuADEALgAKAFQAaABpAHMAIABsAGkAYwBlAG4AcwBlACAAYQB2AGEAaQBsAGEAYgBsAGUAIAB3AGkAdABoACAAYQAgAEYAQQBRACAAYQB0ADoACgBoAHQAdABwADoALwAvAHMAYwByAGkAcAB0AHMALgBzAGkAbAAuAG8AcgBnAC8ATwBGAEwAaAB0AHQAcAA6AC8ALwBzAGMAcgBpAHAAdABzAC4AcwBpAGwALgBvAHIAZwAvAE8ARgBMAAACAAAAAAAA/4MAMgAAAAAAAAAAAAAAAAAAAAAAAAAAABsAAAABAAIAAwALAAwAEgA+AD8AQABeAGABAgDYANkBAwEEAKUBBQEGAQcBCAEJAQoBCwEMAQ0HdW5pMDBBMAd1bmkwMzAyCXRpbGRlY29tYgd1bmkyMzA4B3VuaTIzMDkHdW5pMjMwQQd1bmkyMzBCB3VuaTI3RTgHdW5pMjdFOQd1bmlFRkZEB3VuaUVGRkUHdW5pRUZGRgAAAAEAAf//AA8=) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Size4;src:url(data:font/woff2;base64,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) format("woff2"),url(data:font/woff;base64,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) format("woff"),url(/static/KaTeX_Size4-Regular-ad7672524b64b730dfd176140a8945cb.ttf) format("truetype");font-weight:400;font-style:normal}@font-face{font-family:KaTeX_Typewriter;src:url(/static/KaTeX_Typewriter-Regular-6cc31ea5c223c88705a13727a71417fa.woff2) format("woff2"),url(/static/KaTeX_Typewriter-Regular-3fe216d2a5f736c560cde71984554b64.woff) format("woff"),url(/static/KaTeX_Typewriter-Regular-257023560753aeb0b89b7e434d3da17f.ttf) format("truetype");font-weight:400;font-style:normal}.katex{font:normal 1.21em KaTeX_Main,Times New Roman,serif;line-height:1.2;text-indent:0;text-rendering:auto}.katex *{-ms-high-contrast-adjust:none!important}.katex .katex-version:after{content:"0.11.1"}.katex .katex-mathml{position:absolute;clip:rect(1px,1px,1px,1px);padding:0;border:0;height:1px;width:1px;overflow:hidden}.katex .katex-html>.newline{display:block}.katex .base{position:relative;white-space:nowrap;width:-webkit-min-content;width:min-content}.katex .base,.katex .strut{display:inline-block}.katex .textbf{font-weight:700}.katex .textit{font-style:italic}.katex .textrm{font-family:KaTeX_Main}.katex .textsf{font-family:KaTeX_SansSerif}.katex .texttt{font-family:KaTeX_Typewriter}.katex .mathdefault{font-family:KaTeX_Math;font-style:italic}.katex .mathit{font-family:KaTeX_Main;font-style:italic}.katex .mathrm{font-style:normal}.katex .mathbf{font-family:KaTeX_Main;font-weight:700}.katex .boldsymbol{font-family:KaTeX_Math;font-weight:700;font-style:italic}.katex .amsrm,.katex .mathbb,.katex .textbb{font-family:KaTeX_AMS}.katex .mathcal{font-family:KaTeX_Caligraphic}.katex .mathfrak,.katex .textfrak{font-family:KaTeX_Fraktur}.katex .mathtt{font-family:KaTeX_Typewriter}.katex .mathscr,.katex .textscr{font-family:KaTeX_Script}.katex .mathsf,.katex .textsf{font-family:KaTeX_SansSerif}.katex .mathboldsf,.katex .textboldsf{font-family:KaTeX_SansSerif;font-weight:700}.katex .mathitsf,.katex .textitsf{font-family:KaTeX_SansSerif;font-style:italic}.katex .mainrm{font-family:KaTeX_Main;font-style:normal}.katex .vlist-t{display:inline-table;table-layout:fixed}.katex .vlist-r{display:table-row}.katex .vlist{display:table-cell;vertical-align:bottom;position:relative}.katex .vlist>span{display:block;height:0;position:relative}.katex .vlist>span>span{display:inline-block}.katex .vlist>span>.pstrut{overflow:hidden;width:0}.katex .vlist-t2{margin-right:-2px}.katex .vlist-s{display:table-cell;vertical-align:bottom;font-size:1px;width:2px;min-width:2px}.katex .msupsub{text-align:left}.katex .mfrac>span>span{text-align:center}.katex .mfrac .frac-line{display:inline-block;width:100%;border-bottom-style:solid}.katex .hdashline,.katex .hline,.katex .mfrac .frac-line,.katex .overline .overline-line,.katex .rule,.katex .underline .underline-line{min-height:1px}.katex .mspace{display:inline-block}.katex .clap,.katex .llap,.katex .rlap{width:0;position:relative}.katex .clap>.inner,.katex .llap>.inner,.katex .rlap>.inner{position:absolute}.katex .clap>.fix,.katex .llap>.fix,.katex .rlap>.fix{display:inline-block}.katex .llap>.inner{right:0}.katex .clap>.inner,.katex .rlap>.inner{left:0}.katex .clap>.inner>span{margin-left:-50%;margin-right:50%}.katex .rule{display:inline-block;border:0 solid;position:relative}.katex .hline,.katex .overline .overline-line,.katex .underline .underline-line{display:inline-block;width:100%;border-bottom-style:solid}.katex .hdashline{display:inline-block;width:100%;border-bottom-style:dashed}.katex .sqrt>.root{margin-left:.27777778em;margin-right:-.55555556em}.katex .fontsize-ensurer.reset-size1.size1,.katex .sizing.reset-size1.size1{font-size:1em}.katex .fontsize-ensurer.reset-size1.size2,.katex .sizing.reset-size1.size2{font-size:1.2em}.katex .fontsize-ensurer.reset-size1.size3,.katex .sizing.reset-size1.size3{font-size:1.4em}.katex .fontsize-ensurer.reset-size1.size4,.katex .sizing.reset-size1.size4{font-size:1.6em}.katex .fontsize-ensurer.reset-size1.size5,.katex .sizing.reset-size1.size5{font-size:1.8em}.katex .fontsize-ensurer.reset-size1.size6,.katex .sizing.reset-size1.size6{font-size:2em}.katex .fontsize-ensurer.reset-size1.size7,.katex .sizing.reset-size1.size7{font-size:2.4em}.katex .fontsize-ensurer.reset-size1.size8,.katex .sizing.reset-size1.size8{font-size:2.88em}.katex .fontsize-ensurer.reset-size1.size9,.katex .sizing.reset-size1.size9{font-size:3.456em}.katex .fontsize-ensurer.reset-size1.size10,.katex .sizing.reset-size1.size10{font-size:4.148em}.katex .fontsize-ensurer.reset-size1.size11,.katex .sizing.reset-size1.size11{font-size:4.976em}.katex .fontsize-ensurer.reset-size2.size1,.katex .sizing.reset-size2.size1{font-size:.83333333em}.katex .fontsize-ensurer.reset-size2.size2,.katex .sizing.reset-size2.size2{font-size:1em}.katex .fontsize-ensurer.reset-size2.size3,.katex .sizing.reset-size2.size3{font-size:1.16666667em}.katex .fontsize-ensurer.reset-size2.size4,.katex .sizing.reset-size2.size4{font-size:1.33333333em}.katex .fontsize-ensurer.reset-size2.size5,.katex .sizing.reset-size2.size5{font-size:1.5em}.katex .fontsize-ensurer.reset-size2.size6,.katex .sizing.reset-size2.size6{font-size:1.66666667em}.katex .fontsize-ensurer.reset-size2.size7,.katex .sizing.reset-size2.size7{font-size:2em}.katex .fontsize-ensurer.reset-size2.size8,.katex .sizing.reset-size2.size8{font-size:2.4em}.katex .fontsize-ensurer.reset-size2.size9,.katex .sizing.reset-size2.size9{font-size:2.88em}.katex .fontsize-ensurer.reset-size2.size10,.katex .sizing.reset-size2.size10{font-size:3.45666667em}.katex .fontsize-ensurer.reset-size2.size11,.katex .sizing.reset-size2.size11{font-size:4.14666667em}.katex .fontsize-ensurer.reset-size3.size1,.katex .sizing.reset-size3.size1{font-size:.71428571em}.katex .fontsize-ensurer.reset-size3.size2,.katex .sizing.reset-size3.size2{font-size:.85714286em}.katex .fontsize-ensurer.reset-size3.size3,.katex .sizing.reset-size3.size3{font-size:1em}.katex .fontsize-ensurer.reset-size3.size4,.katex .sizing.reset-size3.size4{font-size:1.14285714em}.katex .fontsize-ensurer.reset-size3.size5,.katex .sizing.reset-size3.size5{font-size:1.28571429em}.katex .fontsize-ensurer.reset-size3.size6,.katex .sizing.reset-size3.size6{font-size:1.42857143em}.katex .fontsize-ensurer.reset-size3.size7,.katex .sizing.reset-size3.size7{font-size:1.71428571em}.katex .fontsize-ensurer.reset-size3.size8,.katex .sizing.reset-size3.size8{font-size:2.05714286em}.katex .fontsize-ensurer.reset-size3.size9,.katex .sizing.reset-size3.size9{font-size:2.46857143em}.katex .fontsize-ensurer.reset-size3.size10,.katex .sizing.reset-size3.size10{font-size:2.96285714em}.katex .fontsize-ensurer.reset-size3.size11,.katex .sizing.reset-size3.size11{font-size:3.55428571em}.katex .fontsize-ensurer.reset-size4.size1,.katex .sizing.reset-size4.size1{font-size:.625em}.katex .fontsize-ensurer.reset-size4.size2,.katex .sizing.reset-size4.size2{font-size:.75em}.katex .fontsize-ensurer.reset-size4.size3,.katex .sizing.reset-size4.size3{font-size:.875em}.katex .fontsize-ensurer.reset-size4.size4,.katex .sizing.reset-size4.size4{font-size:1em}.katex .fontsize-ensurer.reset-size4.size5,.katex .sizing.reset-size4.size5{font-size:1.125em}.katex .fontsize-ensurer.reset-size4.size6,.katex .sizing.reset-size4.size6{font-size:1.25em}.katex .fontsize-ensurer.reset-size4.size7,.katex .sizing.reset-size4.size7{font-size:1.5em}.katex .fontsize-ensurer.reset-size4.size8,.katex .sizing.reset-size4.size8{font-size:1.8em}.katex .fontsize-ensurer.reset-size4.size9,.katex .sizing.reset-size4.size9{font-size:2.16em}.katex .fontsize-ensurer.reset-size4.size10,.katex .sizing.reset-size4.size10{font-size:2.5925em}.katex .fontsize-ensurer.reset-size4.size11,.katex .sizing.reset-size4.size11{font-size:3.11em}.katex .fontsize-ensurer.reset-size5.size1,.katex .sizing.reset-size5.size1{font-size:.55555556em}.katex .fontsize-ensurer.reset-size5.size2,.katex .sizing.reset-size5.size2{font-size:.66666667em}.katex .fontsize-ensurer.reset-size5.size3,.katex .sizing.reset-size5.size3{font-size:.77777778em}.katex .fontsize-ensurer.reset-size5.size4,.katex .sizing.reset-size5.size4{font-size:.88888889em}.katex .fontsize-ensurer.reset-size5.size5,.katex .sizing.reset-size5.size5{font-size:1em}.katex .fontsize-ensurer.reset-size5.size6,.katex .sizing.reset-size5.size6{font-size:1.11111111em}.katex .fontsize-ensurer.reset-size5.size7,.katex .sizing.reset-size5.size7{font-size:1.33333333em}.katex .fontsize-ensurer.reset-size5.size8,.katex .sizing.reset-size5.size8{font-size:1.6em}.katex .fontsize-ensurer.reset-size5.size9,.katex .sizing.reset-size5.size9{font-size:1.92em}.katex .fontsize-ensurer.reset-size5.size10,.katex .sizing.reset-size5.size10{font-size:2.30444444em}.katex .fontsize-ensurer.reset-size5.size11,.katex .sizing.reset-size5.size11{font-size:2.76444444em}.katex .fontsize-ensurer.reset-size6.size1,.katex .sizing.reset-size6.size1{font-size:.5em}.katex .fontsize-ensurer.reset-size6.size2,.katex .sizing.reset-size6.size2{font-size:.6em}.katex .fontsize-ensurer.reset-size6.size3,.katex .sizing.reset-size6.size3{font-size:.7em}.katex .fontsize-ensurer.reset-size6.size4,.katex .sizing.reset-size6.size4{font-size:.8em}.katex .fontsize-ensurer.reset-size6.size5,.katex .sizing.reset-size6.size5{font-size:.9em}.katex .fontsize-ensurer.reset-size6.size6,.katex .sizing.reset-size6.size6{font-size:1em}.katex .fontsize-ensurer.reset-size6.size7,.katex .sizing.reset-size6.size7{font-size:1.2em}.katex .fontsize-ensurer.reset-size6.size8,.katex .sizing.reset-size6.size8{font-size:1.44em}.katex .fontsize-ensurer.reset-size6.size9,.katex .sizing.reset-size6.size9{font-size:1.728em}.katex .fontsize-ensurer.reset-size6.size10,.katex .sizing.reset-size6.size10{font-size:2.074em}.katex .fontsize-ensurer.reset-size6.size11,.katex .sizing.reset-size6.size11{font-size:2.488em}.katex .fontsize-ensurer.reset-size7.size1,.katex .sizing.reset-size7.size1{font-size:.41666667em}.katex .fontsize-ensurer.reset-size7.size2,.katex .sizing.reset-size7.size2{font-size:.5em}.katex .fontsize-ensurer.reset-size7.size3,.katex .sizing.reset-size7.size3{font-size:.58333333em}.katex .fontsize-ensurer.reset-size7.size4,.katex .sizing.reset-size7.size4{font-size:.66666667em}.katex .fontsize-ensurer.reset-size7.size5,.katex .sizing.reset-size7.size5{font-size:.75em}.katex .fontsize-ensurer.reset-size7.size6,.katex .sizing.reset-size7.size6{font-size:.83333333em}.katex .fontsize-ensurer.reset-size7.size7,.katex .sizing.reset-size7.size7{font-size:1em}.katex .fontsize-ensurer.reset-size7.size8,.katex .sizing.reset-size7.size8{font-size:1.2em}.katex .fontsize-ensurer.reset-size7.size9,.katex .sizing.reset-size7.size9{font-size:1.44em}.katex .fontsize-ensurer.reset-size7.size10,.katex .sizing.reset-size7.size10{font-size:1.72833333em}.katex .fontsize-ensurer.reset-size7.size11,.katex .sizing.reset-size7.size11{font-size:2.07333333em}.katex .fontsize-ensurer.reset-size8.size1,.katex .sizing.reset-size8.size1{font-size:.34722222em}.katex .fontsize-ensurer.reset-size8.size2,.katex .sizing.reset-size8.size2{font-size:.41666667em}.katex .fontsize-ensurer.reset-size8.size3,.katex .sizing.reset-size8.size3{font-size:.48611111em}.katex .fontsize-ensurer.reset-size8.size4,.katex .sizing.reset-size8.size4{font-size:.55555556em}.katex .fontsize-ensurer.reset-size8.size5,.katex .sizing.reset-size8.size5{font-size:.625em}.katex .fontsize-ensurer.reset-size8.size6,.katex .sizing.reset-size8.size6{font-size:.69444444em}.katex .fontsize-ensurer.reset-size8.size7,.katex .sizing.reset-size8.size7{font-size:.83333333em}.katex .fontsize-ensurer.reset-size8.size8,.katex .sizing.reset-size8.size8{font-size:1em}.katex .fontsize-ensurer.reset-size8.size9,.katex .sizing.reset-size8.size9{font-size:1.2em}.katex .fontsize-ensurer.reset-size8.size10,.katex .sizing.reset-size8.size10{font-size:1.44027778em}.katex .fontsize-ensurer.reset-size8.size11,.katex .sizing.reset-size8.size11{font-size:1.72777778em}.katex .fontsize-ensurer.reset-size9.size1,.katex .sizing.reset-size9.size1{font-size:.28935185em}.katex .fontsize-ensurer.reset-size9.size2,.katex .sizing.reset-size9.size2{font-size:.34722222em}.katex .fontsize-ensurer.reset-size9.size3,.katex .sizing.reset-size9.size3{font-size:.40509259em}.katex .fontsize-ensurer.reset-size9.size4,.katex .sizing.reset-size9.size4{font-size:.46296296em}.katex .fontsize-ensurer.reset-size9.size5,.katex .sizing.reset-size9.size5{font-size:.52083333em}.katex .fontsize-ensurer.reset-size9.size6,.katex .sizing.reset-size9.size6{font-size:.5787037em}.katex .fontsize-ensurer.reset-size9.size7,.katex .sizing.reset-size9.size7{font-size:.69444444em}.katex .fontsize-ensurer.reset-size9.size8,.katex .sizing.reset-size9.size8{font-size:.83333333em}.katex .fontsize-ensurer.reset-size9.size9,.katex .sizing.reset-size9.size9{font-size:1em}.katex .fontsize-ensurer.reset-size9.size10,.katex .sizing.reset-size9.size10{font-size:1.20023148em}.katex .fontsize-ensurer.reset-size9.size11,.katex .sizing.reset-size9.size11{font-size:1.43981481em}.katex .fontsize-ensurer.reset-size10.size1,.katex .sizing.reset-size10.size1{font-size:.24108004em}.katex .fontsize-ensurer.reset-size10.size2,.katex .sizing.reset-size10.size2{font-size:.28929605em}.katex .fontsize-ensurer.reset-size10.size3,.katex .sizing.reset-size10.size3{font-size:.33751205em}.katex .fontsize-ensurer.reset-size10.size4,.katex .sizing.reset-size10.size4{font-size:.38572806em}.katex .fontsize-ensurer.reset-size10.size5,.katex .sizing.reset-size10.size5{font-size:.43394407em}.katex .fontsize-ensurer.reset-size10.size6,.katex .sizing.reset-size10.size6{font-size:.48216008em}.katex .fontsize-ensurer.reset-size10.size7,.katex .sizing.reset-size10.size7{font-size:.57859209em}.katex .fontsize-ensurer.reset-size10.size8,.katex .sizing.reset-size10.size8{font-size:.69431051em}.katex .fontsize-ensurer.reset-size10.size9,.katex .sizing.reset-size10.size9{font-size:.83317261em}.katex .fontsize-ensurer.reset-size10.size10,.katex .sizing.reset-size10.size10{font-size:1em}.katex .fontsize-ensurer.reset-size10.size11,.katex .sizing.reset-size10.size11{font-size:1.19961427em}.katex .fontsize-ensurer.reset-size11.size1,.katex .sizing.reset-size11.size1{font-size:.20096463em}.katex .fontsize-ensurer.reset-size11.size2,.katex .sizing.reset-size11.size2{font-size:.24115756em}.katex .fontsize-ensurer.reset-size11.size3,.katex .sizing.reset-size11.size3{font-size:.28135048em}.katex .fontsize-ensurer.reset-size11.size4,.katex .sizing.reset-size11.size4{font-size:.32154341em}.katex .fontsize-ensurer.reset-size11.size5,.katex .sizing.reset-size11.size5{font-size:.36173633em}.katex .fontsize-ensurer.reset-size11.size6,.katex .sizing.reset-size11.size6{font-size:.40192926em}.katex .fontsize-ensurer.reset-size11.size7,.katex .sizing.reset-size11.size7{font-size:.48231511em}.katex .fontsize-ensurer.reset-size11.size8,.katex .sizing.reset-size11.size8{font-size:.57877814em}.katex .fontsize-ensurer.reset-size11.size9,.katex .sizing.reset-size11.size9{font-size:.69453376em}.katex .fontsize-ensurer.reset-size11.size10,.katex .sizing.reset-size11.size10{font-size:.83360129em}.katex .fontsize-ensurer.reset-size11.size11,.katex .sizing.reset-size11.size11{font-size:1em}.katex .delimsizing.size1{font-family:KaTeX_Size1}.katex .delimsizing.size2{font-family:KaTeX_Size2}.katex .delimsizing.size3{font-family:KaTeX_Size3}.katex .delimsizing.size4{font-family:KaTeX_Size4}.katex .delimsizing.mult .delim-size1>span{font-family:KaTeX_Size1}.katex .delimsizing.mult .delim-size4>span{font-family:KaTeX_Size4}.katex .nulldelimiter{display:inline-block;width:.12em}.katex .delimcenter,.katex .op-symbol{position:relative}.katex .op-symbol.small-op{font-family:KaTeX_Size1}.katex .op-symbol.large-op{font-family:KaTeX_Size2}.katex .accent>.vlist-t,.katex .op-limits>.vlist-t{text-align:center}.katex .accent .accent-body{position:relative}.katex .accent .accent-body:not(.accent-full){width:0}.katex .overlay{display:block}.katex .mtable .vertical-separator{display:inline-block;min-width:1px}.katex .mtable .arraycolsep{display:inline-block}.katex .mtable .col-align-c>.vlist-t{text-align:center}.katex .mtable .col-align-l>.vlist-t{text-align:left}.katex .mtable .col-align-r>.vlist-t{text-align:right}.katex .svg-align{text-align:left}.katex svg{display:block;position:absolute;width:100%;height:inherit;fill:currentColor;stroke:currentColor;fill-rule:nonzero;fill-opacity:1;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1}.katex svg path{stroke:none}.katex img{border-style:none;min-width:0;min-height:0;max-width:none;max-height:none}.katex .stretchy{width:100%;display:block;position:relative;overflow:hidden}.katex .stretchy:after,.katex .stretchy:before{content:""}.katex .hide-tail{width:100%;position:relative;overflow:hidden}.katex .halfarrow-left{position:absolute;left:0;width:50.2%;overflow:hidden}.katex .halfarrow-right{position:absolute;right:0;width:50.2%;overflow:hidden}.katex .brace-left{position:absolute;left:0;width:25.1%;overflow:hidden}.katex .brace-center{position:absolute;left:25%;width:50%;overflow:hidden}.katex .brace-right{position:absolute;right:0;width:25.1%;overflow:hidden}.katex .x-arrow-pad{padding:0 .5em}.katex .mover,.katex .munder,.katex .x-arrow{text-align:center}.katex .boxpad{padding:0 .3em}.katex .fbox,.katex .fcolorbox{box-sizing:border-box;border:.04em solid}.katex .cancel-pad{padding:0 .2em}.katex .cancel-lap{margin-left:-.2em;margin-right:-.2em}.katex .sout{border-bottom-style:solid;border-bottom-width:.08em}.katex-display{display:block;margin:1em 0;text-align:center}.katex-display>.katex{display:block;text-align:center;white-space:nowrap}.katex-display>.katex>.katex-html{display:block;position:relative}.katex-display>.katex>.katex-html>.tag{position:absolute;right:0}.katex-display.leqno>.katex>.katex-html>.tag{left:0;right:auto}.katex-display.fleqn>.katex{text-align:left}</style><meta name="generator" content="Gatsby 2.32.13"/><style type="text/css"> + .anchor.before { + position: absolute; + top: 0; + left: 0; + transform: translateX(-100%); + padding-right: 4px; + } + .anchor.after { + display: inline-block; + padding-left: 4px; + } + h1 .anchor svg, + h2 .anchor svg, + h3 .anchor svg, + h4 .anchor svg, + h5 .anchor svg, + h6 .anchor svg { + visibility: hidden; + } + h1:hover .anchor svg, + h2:hover .anchor svg, + h3:hover .anchor svg, + h4:hover .anchor svg, + h5:hover .anchor svg, + h6:hover .anchor svg, + h1 .anchor:focus svg, + h2 .anchor:focus svg, + h3 .anchor:focus svg, + h4 .anchor:focus svg, + h5 .anchor:focus svg, + h6 .anchor:focus svg { + visibility: visible; + } + </style><script> + document.addEventListener("DOMContentLoaded", function(event) { + var hash = window.decodeURI(location.hash.replace('#', '')) + if (hash !== '') { + var element = document.getElementById(hash) + if (element) { + var scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop + var clientTop = document.documentElement.clientTop || document.body.clientTop || 0 + var offset = element.getBoundingClientRect().top + scrollTop - clientTop + // Wait for the browser to finish rendering before scrolling. + setTimeout((function() { + window.scrollTo(0, offset - 0) + }), 0) + } + } + }) + </script><link rel="icon" href="/favicon-32x32.png?v=5c2c5e536922e15b73b41128d93d6b59" type="image/png"/><link rel="manifest" href="/manifest.webmanifest" crossorigin="anonymous"/><meta name="theme-color" content="#1d2740"/><link rel="apple-touch-icon" sizes="48x48" href="/icons/icon-48x48.png?v=5c2c5e536922e15b73b41128d93d6b59"/><link rel="apple-touch-icon" sizes="72x72" href="/icons/icon-72x72.png?v=5c2c5e536922e15b73b41128d93d6b59"/><link rel="apple-touch-icon" sizes="96x96" href="/icons/icon-96x96.png?v=5c2c5e536922e15b73b41128d93d6b59"/><link rel="apple-touch-icon" sizes="144x144" href="/icons/icon-144x144.png?v=5c2c5e536922e15b73b41128d93d6b59"/><link rel="apple-touch-icon" sizes="192x192" href="/icons/icon-192x192.png?v=5c2c5e536922e15b73b41128d93d6b59"/><link rel="apple-touch-icon" sizes="256x256" href="/icons/icon-256x256.png?v=5c2c5e536922e15b73b41128d93d6b59"/><link rel="apple-touch-icon" sizes="384x384" href="/icons/icon-384x384.png?v=5c2c5e536922e15b73b41128d93d6b59"/><link rel="apple-touch-icon" sizes="512x512" href="/icons/icon-512x512.png?v=5c2c5e536922e15b73b41128d93d6b59"/><link rel="alternate" type="application/rss+xml" href="/rss.xml"/><title data-react-helmet="true">Home | Dev Jurnal

Dev Jurnal

Written by@mmdmthr
My notes in public space

GitHubLinkedIn

Kursus Menulis Teknis Google - Bagian Dua

Ini adalah ringkasan dari Kursus Menulis Teknis Google bagian dua. Mengedit mandiri Gunakan panduan gaya. Berpikirlah seperti audiens. Baca dokumen dengan suara keras (untuk diri sendiri). Kembali ke…

Kursus Menulis Teknis Google - Bagian Satu

Ini adalah ringkasan dari Kursus Menulis Teknis Google bagian satu. Every engineer is also a writer. Memilih kata Definisikan istilah-istilah baru atau asing. Gunakan akronim dengan benar. Gunakan is…

Ajari Diri Anda Pemrograman dalam Sepuluh Tahun

Satu artikel menarik ditulis oleh Peter Norvig tentang belajar pemrograman. Kita bisa membaca versi aslinya di sini Teach Yourself Programming in Ten Years dan versi bahasa Indonesia Belajar Programm…

Mengenal Feature Test, Integration Test, dan Regression Test

Pengembangan perangkat lunak adalah proses yang berkelanjutan. Para pengembang menambah fitur baru dan memperbaiki bug secara terus menerus. Dengan perubahan yang dilakukan terus menerus tersebut, ki…

Apa Itu .env File?

Dalam dunia pengembangan perangkat lunak, pengelolaan konfigurasi menjadi aspek penting dalam memastikan aplikasi berjalan dengan lancar di berbagai lingkungan. Salah satu alat yang telah merevolusi …

10 Hal yang Harus Dipelajari oleh Programmer tentang "Belajar"

Sebuah artikel yang menarik membahas tentang “belajar” khususnya di dunia pengembang perangkat lunak. Banyak wawasan dari tulisan ini membatalkan mitos-mitos yang sering dipercayai tentang belajar. S…

Apa itu Docker Compose?

Docker Compose adalah alat untuk mendefinisikan dan menjalankan aplikasi Docker multi-kontainer (beberapa container yang saling terkait). Dengan Compose, kita menggunakan file YAML untuk mengonfigura…

Static Code Analysis dengan PHPStan

Analisis kode statis adalah metode evaluasi program dengan memeriksa kode sebelum dieksekusi. Ini dilakukan dengan memeriksa set kode berdasarkan sejumlah aturan penulisan kode (type variable, return…

Stuck di Karir

Ketika melakukan refleksi pada karir, seringkali kita merasa terjebak di suatu titik. Terjebak dalam sebuah peran, stagnasi gaji, atau mungkin merasa bosan dengan tugas yang kita kerjakan. Ada bebera…

Membaca Flame Graph

Apa itu Flame Graph? Sebelum kita masuk ke dalam cara membaca flame graph, mari kita pahami terlebih dahulu apa itu flame graph. Flame graph adalah representasi visual dari tumpukan pemanggilan (call…

\ No newline at end of file diff --git a/manifest.webmanifest b/manifest.webmanifest new file mode 100644 index 00000000..621d41bd --- /dev/null +++ b/manifest.webmanifest @@ -0,0 +1 @@ +{"name":"Dev Jurnal","short_name":"Dev Jurnal","start_url":"/","background_color":"#ffffff","theme_color":"#1d2740","display":"standalone","cacheDigest":"5c2c5e536922e15b73b41128d93d6b59","icons":[{"src":"icons/icon-48x48.png?v=5c2c5e536922e15b73b41128d93d6b59","sizes":"48x48","type":"image/png"},{"src":"icons/icon-72x72.png?v=5c2c5e536922e15b73b41128d93d6b59","sizes":"72x72","type":"image/png"},{"src":"icons/icon-96x96.png?v=5c2c5e536922e15b73b41128d93d6b59","sizes":"96x96","type":"image/png"},{"src":"icons/icon-144x144.png?v=5c2c5e536922e15b73b41128d93d6b59","sizes":"144x144","type":"image/png"},{"src":"icons/icon-192x192.png?v=5c2c5e536922e15b73b41128d93d6b59","sizes":"192x192","type":"image/png"},{"src":"icons/icon-256x256.png?v=5c2c5e536922e15b73b41128d93d6b59","sizes":"256x256","type":"image/png"},{"src":"icons/icon-384x384.png?v=5c2c5e536922e15b73b41128d93d6b59","sizes":"384x384","type":"image/png"},{"src":"icons/icon-512x512.png?v=5c2c5e536922e15b73b41128d93d6b59","sizes":"512x512","type":"image/png"}]} \ No newline at end of file diff --git a/offline-plugin-app-shell-fallback/index.html b/offline-plugin-app-shell-fallback/index.html new file mode 100644 index 00000000..4729c725 --- /dev/null +++ b/offline-plugin-app-shell-fallback/index.html @@ -0,0 +1,61 @@ +
\ No newline at end of file diff --git a/page-data/2020/07/cara-memulai-jadi-programmer/page-data.json b/page-data/2020/07/cara-memulai-jadi-programmer/page-data.json new file mode 100644 index 00000000..8ced66b6 --- /dev/null +++ b/page-data/2020/07/cara-memulai-jadi-programmer/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2020/07/cara-memulai-jadi-programmer/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"bb19408d-06f8-557b-8ccb-15576a42c84d","excerpt":"Untuk memulai jadi programmer, ada beberapa hal yang perlu kita cari tahu sebelumnya Apa yang mau kita buat? Aplikasi desktop, mobile atau website? Hal itu menentukan bahasa pemrograman apa yang harus kita kuasai. Misalnya untuk pemrograman web kamu bisa memilih PHP, JavaScript…","html":"

Untuk memulai jadi programmer, ada beberapa hal yang perlu kita cari tahu sebelumnya

\n
    \n
  1. Apa yang mau kita buat? Aplikasi desktop, mobile atau website? Hal itu menentukan bahasa pemrograman apa yang harus kita kuasai. Misalnya untuk pemrograman web kamu bisa memilih PHP, JavaScript atau Ruby. Atau untuk aplikasi mobile ada bahasa Java.
  2. \n
  3. Pelajari konsep inti pemrograman. Setelah menentukan pilihan apa yang akan kita buat, pelajari konsep inti pemrograman dengan bahasa yang sudah dipilih. Pada dasarnya semua bahasa pemrograman memiliki konsep inti yang relatif sama. Salah satu hal yang membedakan antara bahasa satu dengan yang lainnya adalah syntax-nya. Fokus menguasai satu bahasa pemrograman dengan konsep inti yang kuat akan membuat kita lebih mudah menguasai bahasa lainnya. Konsep inti dari bahasa pemrograman yang perlu kita kuasai adalah variabel, tipe data, komentar, pengkondisian (if-else), perulangan (looping) dan fungsi (function).
  4. \n
  5. Buat aplikasi sederhana. Mengetahui tentang konsep inti pemrograman tidak serta merta membuat kita bisa menjadi programer handal. Kamu harus segera membuat program pertamamu dengan apa yang kamu punya. Learning by doing, dengan membuat program kamu akan mengerti tentang algoritma atau bagaimana membuat kode bekerja menghasilkan sesuatu yang kita inginkan.
  6. \n
","frontmatter":{"title":"Memulai Jadi Programmer","date":"July 15, 2020"}}},"pageContext":{"slug":"/2020/07/cara-memulai-jadi-programmer/","previous":{"fields":{"slug":"/2020/07/pustaka-dokumentasi-lengkap/"},"frontmatter":{"title":"Pustaka Dokumentasi Lengkap"}},"next":{"fields":{"slug":"/2021/01/markdown-adalah/"},"frontmatter":{"title":"Markdown adalah"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2020/07/peta-jalan-web-developer/page-data.json b/page-data/2020/07/peta-jalan-web-developer/page-data.json new file mode 100644 index 00000000..a5cf3288 --- /dev/null +++ b/page-data/2020/07/peta-jalan-web-developer/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2020/07/peta-jalan-web-developer/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"f5662452-2553-5998-8e45-e9daefb7baeb","excerpt":"Sebagai seorang web developer, kita bisa melihat peta jalan di situs roadmap.sh untuk memberikan gambaran yang lebih jelas dalam melangkah di belantara hutan pemrograman web. Peta jalan ini tentu bukan rujukan mutlak, itu ditulis berdasarkan pengalaman seseorang dan dilengkapi…","html":"

Sebagai seorang web developer, kita bisa melihat peta jalan di situs roadmap.sh untuk memberikan gambaran yang lebih jelas dalam melangkah di belantara hutan pemrograman web. Peta jalan ini tentu bukan rujukan mutlak, itu ditulis berdasarkan pengalaman seseorang dan dilengkapi oleh komunitas. Peta jalan itu akan membantu kita untuk menyusun urutan dan prioritas teknologi atau tools apa yang harus kita kuasai di setiap tahapannya.

\n

Pertama, secara garis besar peta jalan ini dibagi sesuai tujuannya. Apakah kita memilih untuk berfokus pada front-end, back-end atau devops. Setiap peta jalan ini akan memberi tahu kita step-by-step tentang pengetahuan apa yang harus kita kuasai berdasarkan saran anggota komunitas developer yang berkontribusi di situs tersebut. Di setiap cek poinnya dicantumkan teknologi apa saja yang wajib kita kuasai dan beberapa alternatifnya yang tersedia saat ini. Dengan memanfaatkan informasi dari website tersebut kita bisa lebih terarah dalam mempelajari teknologi web.

","frontmatter":{"title":"Peta Jalan Web Developer","date":"July 15, 2020"}}},"pageContext":{"slug":"/2020/07/peta-jalan-web-developer/","previous":null,"next":{"fields":{"slug":"/2020/07/pustaka-dokumentasi-lengkap/"},"frontmatter":{"title":"Pustaka Dokumentasi Lengkap"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2020/07/pustaka-dokumentasi-lengkap/page-data.json b/page-data/2020/07/pustaka-dokumentasi-lengkap/page-data.json new file mode 100644 index 00000000..2a6c4c7d --- /dev/null +++ b/page-data/2020/07/pustaka-dokumentasi-lengkap/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2020/07/pustaka-dokumentasi-lengkap/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"03923c08-d1a1-5a6f-b38b-9db6d4aaf004","excerpt":"Saat kita membeli barang elektronik, pabrik menyertakan sebuah manual book sebagai petunjuk penggunaan bagi user. Hal tersebut juga berlaku untuk produk di dunia IT. Untuk bisa menggunakan sebuah produk dengan baik dan benar, produsen menyiapkan dokumentasi, sebuah panduan…","html":"

Saat kita membeli barang elektronik, pabrik menyertakan sebuah manual book sebagai petunjuk penggunaan bagi user. Hal tersebut juga berlaku untuk produk di dunia IT. Untuk bisa menggunakan sebuah produk dengan baik dan benar, produsen menyiapkan dokumentasi, sebuah panduan penggunaan untuk pengguna dalam mengoperasikan produk tersebut. Kita bisa mengunjungi website resmi masing-masing vendor untuk membaca dokumentasi. Atau kita bisa mengunjungi DevDocs, website yang menggabungkan beberapa API dokumentasi dalam antarmuka yang cepat, teratur, dan dilengkapi dengan fitur pencarian. Meskipun tampilannya tidak sebaik dokumentasi resmi, website ini akan memudahkan kita untuk browsing dokumentasi di satu tempat saja tanpa perlu membuka banyak halaman dokumentasi resmi masing-masing produk.

","frontmatter":{"title":"Pustaka Dokumentasi Lengkap","date":"July 15, 2020"}}},"pageContext":{"slug":"/2020/07/pustaka-dokumentasi-lengkap/","previous":{"fields":{"slug":"/2020/07/peta-jalan-web-developer/"},"frontmatter":{"title":"Peta Jalan Web Developer"}},"next":{"fields":{"slug":"/2020/07/cara-memulai-jadi-programmer/"},"frontmatter":{"title":"Memulai Jadi Programmer"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2021/01/markdown-adalah/page-data.json b/page-data/2021/01/markdown-adalah/page-data.json new file mode 100644 index 00000000..37bade81 --- /dev/null +++ b/page-data/2021/01/markdown-adalah/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2021/01/markdown-adalah/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"ece97511-e7eb-5004-9952-744ccb230756","excerpt":"Markdown adalah bahasa markup ringan untuk memformat plain teks menggunakan editor teks biasa yang kemudian diubah menjadi HTML terstruktur. Jadi, kita bisa membuat format teks bold atau membuat list menggunakan notepad tanpa menulis tag HTML. John Gruber dan Aaron Swartz membuat…","html":"

Markdown adalah bahasa markup ringan untuk memformat plain teks menggunakan editor teks biasa yang kemudian diubah menjadi HTML terstruktur. Jadi, kita bisa membuat format teks bold atau membuat list menggunakan notepad tanpa menulis tag HTML.

\n

John Gruber dan Aaron Swartz membuat Markdown pada tahun 2004 setelah merasa frustrasi menulis teks yang panjang menggunakan tag HTML untuk memformat konten. Dia kemudian merancang sistem penulisan yang akan membuat dokumen berbasis web mudah ditulis dan dibaca dalam bentuk raw nya sekalipun.

\n

Markdown banyak digunakan dalam halaman dokumentasi dan file readme. File markdown disimpan menggunakan ekstensi *.md. Markdown dibuat untuk bisa dibaca dan ditulis semudah mungkin seperti teks biasa. Berbeda dengan format markup lain seperti HTML yang menggunakan tag (misal <strong> untuk cetak tebal), markdown hanya menggunakan simbol-simbol sederhana. Sumber inspirasi terbesar untuk sintaks Markdown adalah format teks pada email.

\n

Selain digunakan pada dokumentasi teknis, banyak orang yang merasakan manfaat markdown dibanding aplikasi pengolah kata dengan GUI. Mungkin sebagian besar pengguna pemula merasa tombol GUI lebih mudah digunakan. Sementara penulis yang lebih advance merasa terbantu dengan Markdown. Mengapa? Alasan terbesarnya adalah karena alur penulisan.

\n

Ketika menggunakan aplikasi GUI, Anda harus menjeda tulisan Anda setiap beberapa menit (atau terkadang detik) dan mengoperasikan mouse untuk mengklik, mengeblok, mengklik tombol pemformatan, dan kemudian mengklik kembali ke tempat Anda tinggalkan untuk melanjutkan.Proses ini melelahkan dan membuat pekerjaan terputus ketika yang ingin Anda lakukan hanyalah mengeluarkan kata-kata dari kepala ke layar.

\n

Markdown memungkinkan Anda menjaga jari-jari Anda tetap di atas keyboard saat Anda menerapkan pemformatan dengan cepat. Singkatnya: Anda tidak perlu berhenti mengetik atau memikirkan hal lain untuk menerapkan format yang diinginkan. Meskipun tampak seperti hal detail yang kecil, tetapi hal itu dapat memiliki efek yang sangat besar. Setelah Anda mulai menulis dengan Markdown, sangat sulit untuk kembali ke GUI dengan banyak tombol yang harus diklik.

\n

Berikut contoh sederhana sintaks Markdown

\n
The _quick_ brown fox, jumped **over** the lazy [dog](https://en.wikipedia.org/wiki/Dog)
\n

Blok kode di atas akan menghasilkan teks berikut

\n

The quick brown fox, jumped over the lazy dog

\n

Penggunaan sintaks Markdown selengkapnya dapat dibaca di artikel Cara Menggunakan Markdown

","frontmatter":{"title":"Markdown adalah","date":"January 30, 2021"}}},"pageContext":{"slug":"/2021/01/markdown-adalah/","previous":{"fields":{"slug":"/2020/07/cara-memulai-jadi-programmer/"},"frontmatter":{"title":"Memulai Jadi Programmer"}},"next":{"fields":{"slug":"/2021/02/cara-menggunakan-markdown-dasar/"},"frontmatter":{"title":"Cara Menggunakan Markdown Dasar"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2021/02/cara-menggunakan-markdown-dasar/page-data.json b/page-data/2021/02/cara-menggunakan-markdown-dasar/page-data.json new file mode 100644 index 00000000..6c3c62b9 --- /dev/null +++ b/page-data/2021/02/cara-menggunakan-markdown-dasar/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2021/02/cara-menggunakan-markdown-dasar/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"8e2abc34-5425-59b4-bb7f-8e5a64f6e50b","excerpt":"Markdown dirancang dengan tujuan mudah dibaca oleh manusia. Sebagian besar sintaksnya sederhana dan intuitif sehingga mudah dipelajari. Berikut beberapa sintaks yang mungkin sering anda gunakan dalam menulis. Heading Heading pada Markdown ditulis dengan tanda pagar/hash…","html":"

Markdown dirancang dengan tujuan mudah dibaca oleh manusia. Sebagian besar sintaksnya sederhana dan intuitif sehingga mudah dipelajari. Berikut beberapa sintaks yang mungkin sering anda gunakan dalam menulis.

\n

Heading

\n
# Heading 1\n## Heading 2\n### Heading 3
\n

Heading pada Markdown ditulis dengan tanda pagar/hash (#). Jumlah pagar menentukan tingkat heading tersebut. Satu pagar menghasilkan h1, dua pagar menghasilkan h2 dan seterusnya sampai maksimal 6 tingkat. Pada praktiknya kita seringkali hanya menggunakan 3 tingkat saja.

\n

Text

\n
*italic*\n**bold**\n***bold-italic***\n[link](https://example.com)
\n

Biasanya kita membutuhkan tekanan pada tulisan kita. Kita bisa menggunakan Markdown untuk membuat penekanan dengan cetak miring, cetak tebal atau cetak miring dan tebal. Markdown membuatnya cukup intuitif dengan melambangkannya sesuai jumlah tanda bintang.

\n

Untuk membuat teks link, bungkus teksnya menggunakan tanda kurung siku [] lalu letakkan url setelahnya dengan membungkusnya menggunakan kurung biasa ().

\n

Image

\n
![alt](https://image.com/link.jpg)
\n

Untuk menyematkan gambar pada Markdown caranya hampir sama dengan link, hanya saja sintaks image diawali dengan tanda seru !. Di dalam kurung siku diisi dengan alt atau teks deskriptif mengenai gambar. lalu letakkan url gambar setelahnya dengan membungkusnya menggunakan kurung biasa ().

\n

List

\n
* Susu\n* Roti\n    * Roti Tawar\n    * Roti selai cokelat\n* Mentega\n\n1. Merapikan taman\n2. Membersihkan dapur\n3. Memasak
\n

Memformat list menggunakan HTML mungkin cukup merepotkan. Di Markdown kita bisa membuat list dengan sangat natural. Jika menginginkan bullet list, ganti tanda * pada contoh dengan - atau + lalu tanda itu akan diubah menjadi dot (titik). Kita juga bisa membuat list yang bersarang dengan menambah 4 spasi, list dengan indentasi akan otomatis menjadi child. Untuk format angka lakukan hal yang serupa, tetapi tidak menggunakan tanda bintang, gunakan saja angka biasa

\n
    \n
  • Susu
  • \n
  • \n

    Roti

    \n
      \n
    • Roti Tawar
    • \n
    • Roti selai cokelat
    • \n
    \n
  • \n
  • Mentega
  • \n
  • \n

    Merapikan taman

    \n
      \n
    1. Memotong rumput
    2. \n
    3. Menyiram bunga
    4. \n
    \n
  • \n
  • Membersihkan dapur
  • \n
  • Memasak
  • \n
\n

Quotes (kutipan)

\n
> \"I think it is possible for ordinary people to choose to be extraordinary.\"
\n

Kutipan pada Markdown diawali dengan tanda lebih besar dari (>). Contoh di atas akan diubah menjadi blok quote di bawah.

\n
\n

“I think it is possible for ordinary people to choose to be extraordinary.”

\n
\n

Dengan menguasai sintaks di atas, kita sudah bisa menulis konten menggunakan Markdown. Masih banyak lagi yang bisa kita lakukan dengan Markdown, baca di artikel Cara Menggunakan Markdown Lanjutan

","frontmatter":{"title":"Cara Menggunakan Markdown Dasar","date":"February 07, 2021"}}},"pageContext":{"slug":"/2021/02/cara-menggunakan-markdown-dasar/","previous":{"fields":{"slug":"/2021/01/markdown-adalah/"},"frontmatter":{"title":"Markdown adalah"}},"next":{"fields":{"slug":"/2021/02/cara-menggunakan-markdown-lanjutan/"},"frontmatter":{"title":"Cara Menggunakan Markdown Lanjutan"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2021/02/cara-menggunakan-markdown-lanjutan/page-data.json b/page-data/2021/02/cara-menggunakan-markdown-lanjutan/page-data.json new file mode 100644 index 00000000..1deac806 --- /dev/null +++ b/page-data/2021/02/cara-menggunakan-markdown-lanjutan/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2021/02/cara-menggunakan-markdown-lanjutan/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"ae70009a-827e-5481-8a3e-67d9c5c81a91","excerpt":"Ada beberapa pemformatan yang dibutuhkan oleh penulis lanjutan. Itu juga bisa membantu dalam menulis artikel blog. Berikut sintaks Markdown yang biasa digunakan dalam penulisan yang lebih advance Garis Horizontal (hr) Biasanya kita membutuhkan sebuah viusal untuk membuat pembatas…","html":"

Ada beberapa pemformatan yang dibutuhkan oleh penulis lanjutan. Itu juga bisa membantu dalam menulis artikel blog. Berikut sintaks Markdown yang biasa digunakan dalam penulisan yang lebih advance

\n

Garis Horizontal (hr)

\n
---
\n

Biasanya kita membutuhkan sebuah viusal untuk membuat pembatas antar section dalam sebuah artikel. Dengan Markdown kita bisa mengetikkan tiga strip yang akan menghasilkan elemen berikut

\n
\n

Persis seperti menggunakan elemen <hr> pada HTML

\n

Code Snippet

\n
Kalimat dengan `code` inline\n\n    .css-class {\n        text-decoration: bold;\n    }
\n

Jika kita sering menulis dokumentasi teknis, kita mungkin sering menggunakan code snippet untuk menampilkan sintaks kodingan kita. Untuk melakukan itu gunakan tanda backtick (`) untuk membungkus kode yang hanya satu baris. Atau tekan 4 spasi untuk membuat sebuah paragrapf menjadi satu blok kode.

\n

Daftar Referensi dan Judul

\n
**The quick brown [fox][1], jumped over the lazy [dog][2].**\n\n[1]: https://en.wikipedia.org/wiki/Fox \"Wikipedia: Fox\"\n[2]: https://en.wikipedia.org/wiki/Dog \"Wikipedia: Dog\"
\n

Penulis yang memerlukan penyematan referensi bisa menggunakan cara di atas. Angka yang dituliskan setelah text dalam kurung siku akan merujuk pada link yang ditulis dengan angka yang sama. Kata dalam kutipan setelah url adalah judul dari kutipan tersebut yang bisa juga digunakan pada link sebagai atribut title.

\n
[Dog](https://en.wikipedia.org/wiki/Dog \"Wikipedia: Dog\")
\n

Coba letakkan kursor pada link berikut Dog

\n

Escaping

\n
\\*kata\\*
\n

Bagaimana jika kita ingin menuliskan secara literal sebuah *kata* namun tidak ditampilkan sebagai cetak miring? Escape karakter Markdown dengan tanda back slash () supaya tanda baca tidak dikonversi menjadi tag HTML.

\n

Embedd HTML

\n
<button>HTML Button</button>
\n

Salah satu fitur paling keren dari Markdown adalah kita tetap bisa menulis sintaks plain HTML. Teks HTML akan dibaca sebagai tag HTML seperti biasa dan menghasilkan komponen sesuai teksnya.

\n

\n

Markdown Editor

\n

Untuk segera menulis menggunakan Markdown kita bisa beralih dari plain text editor menggunakan Markdown editor yang akan menampilkan teks terformat yang bersumber dari teks Markdown. Untuk pengguna Windows ada beberapa alternatif

\n\n

Jika ingin membaca lebih lanjut tentang panduan Markdown Anda bisa mengunjungi markdownguide.org atau baca post Markdown Cheatseet

","frontmatter":{"title":"Cara Menggunakan Markdown Lanjutan","date":"February 09, 2021"}}},"pageContext":{"slug":"/2021/02/cara-menggunakan-markdown-lanjutan/","previous":{"fields":{"slug":"/2021/02/cara-menggunakan-markdown-dasar/"},"frontmatter":{"title":"Cara Menggunakan Markdown Dasar"}},"next":{"fields":{"slug":"/2021/02/markdown-cheatseet/"},"frontmatter":{"title":"Markdown Cheatseet"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2021/02/cara-menggunakan-npm/page-data.json b/page-data/2021/02/cara-menggunakan-npm/page-data.json new file mode 100644 index 00000000..353ae194 --- /dev/null +++ b/page-data/2021/02/cara-menggunakan-npm/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2021/02/cara-menggunakan-npm/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"fbec1e06-5ef4-5975-a2a0-443451e5d272","excerpt":"Di sisi pengguna, kita bisa menginstall paket-paket yang tersedia gratis di npm registry dengan menjalankan CLI. Jadi ada baiknya mengetahui cara menggunakan alat yang powerfull ini. npm install - adalah perintah yang paling umum digunakan saat mengembangkan aplikasi JavaScript…","html":"

Di sisi pengguna, kita bisa menginstall paket-paket yang tersedia gratis di npm registry dengan menjalankan CLI. Jadi ada baiknya mengetahui cara menggunakan alat yang powerfull ini.

\n

npm install - adalah perintah yang paling umum digunakan saat mengembangkan aplikasi JavaScript / Node.js saat ini. Secara default, npm install <package-name> akan menginstal versi terbaru dari sebuah paket dengan tanda versi ^. Instalasi npm dalam konteks lokal sebuah project adalah mengunduh paket ke folder node_modules di dalam direktori project sesuai dengan spesifikasi package.json, mengupdate versi paket (dan meregenerasi package-lock.json) di mana pun itu berdasarkan pada pencocokan versi yang ditandai dengan ^ dan ~ .

\n

Kita dapat menambahkan flag global (-g) jika ingin menginstal paket dalam konteks global yang dapat digunakan di direktori manapun dalam komputer (umumnya pada paket tool CLI seperti live server misalnya). npm telah membuat penginstalan paket JavaScript begitu mudah sehingga perintah ini sering digunakan secara tidak benar. Akibatnya npm banyak menjadi lelucon programmer karena menghasilkan folder node_module dengan ukuran sangat besar.

\n

Di sinilah --production flag berperan. Di bagian sebelumnya, kita membahas dependensi dan devDependency yang dimaksudkan untuk penggunaan masing-masing dalam lingkungan produksi dan pengembangan / pengujian. Dengan melampirkan --production flag ke perintah npm install, kita hanya akan menginstal paket dari dependensi, sehingga secara drastis mengurangi ukuran node_modules. Kita hanya menginstal apa yang benar-benar diperlukan agar aplikasi dapat aktif dan berjalan.

\n

npm ci - jika npm install --production optimal untuk lingkungan produksi, haruskah ada perintah yang optimal untuk pengaturan pengembangan lokal dan pengujian? Gunakan npm ci. Sama seperti bagaimana jika package-lock.json belum ada dalam proyek yang dihasilkan setiap kali npm install dipanggil, npm ci menggunakan file ini untuk mengunduh versi yang tepat dari setiap paket yang menjadi dependensi proyek kita. Ini adalah cara memastikan bahwa konteks proyek kita sama persis ketika dijalankan di berbagai mesin, baik laptop kita yang digunakan untuk pengembangan atau lingkungan build CI (Continuous Integration) seperti Github Actions.

\n

npm audit - Dengan banyaknya paket yang telah diterbitkan dan dapat dengan mudah diinstal, paket npm rentan terhadap penerbit paket yang buruk dengan niat jahat yang mungkin terjadi seperti dalam artikel ini. Menyadari adanya masalah pada ekosistem tersebut, organisasi npm.js memunculkan ide tentang npm audit. Mereka membuat daftar celah keamanan yang dapat diaudit oleh pengembang terhadap dependensi paket mereka menggunakan perintah npm audit. npm audit memberikan informasi kepada pengembang tentang kerentanan dan apakah ada versi dengan perbaikan untuk ditingkatkan. Sebagai contoh,

\n

\"screenshot

\n

Jika remediasi tersedia di upgrade versi non-breaking berikutnya, npm audit fix dapat digunakan untuk mengupgrade versi dependensi yang terpengaruh secara otomatis.

\n

Sumber: freecodecamp.org

","frontmatter":{"title":"Cara Menggunakan NPM","date":"February 17, 2021"}}},"pageContext":{"slug":"/2021/02/cara-menggunakan-npm/","previous":{"fields":{"slug":"/2021/02/jamstack-adalah/"},"frontmatter":{"title":"JAMStack Adalah"}},"next":{"fields":{"slug":"/2021/02/npm-adalah/"},"frontmatter":{"title":"NPM Adalah"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2021/02/film-dokumenter-bill-gates/page-data.json b/page-data/2021/02/film-dokumenter-bill-gates/page-data.json new file mode 100644 index 00000000..c7e23299 --- /dev/null +++ b/page-data/2021/02/film-dokumenter-bill-gates/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2021/02/film-dokumenter-bill-gates/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"c97110f9-0dc7-58cb-9c54-b5366e6fb1c7","excerpt":"Selepas menyerahkan kepemimpinan perusahaan kepada penerusnya, Bill Gates fokus pada upaya mengatasi masalah masyarakat terutama di negara-negara berkembang melalui yayasannya. Film dokumenter Netflix berjudul Inside Bill’s Brain: Decoding Bill Gates ini mengisahkan tentang visi…","html":"

Selepas menyerahkan kepemimpinan perusahaan kepada penerusnya, Bill Gates fokus pada upaya mengatasi masalah masyarakat terutama di negara-negara berkembang melalui yayasannya. Film dokumenter Netflix berjudul Inside Bill’s Brain: Decoding Bill Gates ini mengisahkan tentang visi Bill Gates untuk mewujudkan dunia yang lebih baik.

\n

Membuat Toilet

\n

Bill dan Melinda tergerak untuk membuat toilet setelah dia melihat betapa buruk sanitasi di negara-negara berkembang. Di banyak negara berkembang, terutama Afrika yang disorot, sanitasi menjadi masalah lingkungan yang besar yang berdampak pada kualitas hidup manusia. Diperlihatkan kondisi banyak orang masih membuang kotoran manusia di aliran sungai (bagian yang paling menjijikkan). Itu menyebabkan masalah yang lebih besar lagi seperti merebaknya diare yang bisa berakibat kematian pada anak usia dini. Katanya penyakit yang disebabkan oleh kontaminasi air membunuh lebih dari 500.000 anak balita setiap tahun.

\n

Bill Gates mulai memikirkan cara untuk mengatasi masalah sanitasi ini. Menurut pengamatannya, salah satu problem terbesar yang dihadapinya adalah sistem sanitasi di kota tidak kompatibel jika diterapkan begitu saja di lingkungan negara berkembang. Sistem perpipaan yang kompleks membuatnya berbiaya tinggi. Di samping itu sistem toilet yang sudah ada memerlukan energi dari luar. Dia lalu membuat event inovasi toilet yang melibatkan universitas dan perusahaan swasta untuk menemukan toilet yang baik, bisa mencukupi energinya sendiri dan berbiaya murah. Dengan melakukan itu Bill berambisi merevolusi sistem toilet saat ini yang sudah berusia 200 tahun.

\n

Ada tiga cara yang dilakukannya, pertama menghubungi insinyur teknik ternama dan memintanya membuat toilet untuk skala besar. Dia berhasil menemukan teknologinya, toilet bersih yang menghasilkan energinya sendiri dan yang paling baik, hasil dari pengolahan limbah manusia itu adalah air jernih yang bisa langsung diminum. Inovasi kedua datang dari universitas yang membuat toilet skala individu, dengan spesifikasi yang sama. Beberapa prototipe toilet yang bagus mulai muncul dari para peneliti dan inovator di universitas, tapi harganya masih di kisaran 50.000 dolar dan diangap terlalu mahal. Bill menginginkan produknya harus di bawah 500 dolar. Untuk prototipe bagus yang belum layak dari sisi biaya, dia melakukan presentasi ke Cina. Dia mencari perusahaan manufaktur yang bisa memproduksi toilet dalam jumlah besar sehingga membuat harga satuannya menjadi lebih murah. Sampai film itu dibuat, Bill telah menghabiskan 7 tahun dan 200 juta dollar untuk mewujudkan visinya tentang toilet.

\n

Memberantas Polio

\n

Bill melihat penyakit polio sebagai isu besar yang mempengaruhi kehidupan manusia. Dia melihat seorang anak perempuan yang kehilangan masa depannya karena terdampak polio. Penyakit ini sangat menular dan bisa berujung pada kelumpuhan. Dia berjuang keras dengan target zero case polio, artinya tidak ada lagi penderita polio di seluruh dunia. Dia mulai memproduksi vaksin dan membangun tim yang melakukan imunisasi di daerah terpencil negara-negara berkembang. Kasus yang paling sulit ditemukan di Nigeria. Masalahnya adalah ketika di satu bagian pekerjaannya tuntas, namun di bagian lain muncul kasus baru. Bill memutuskan untuk turun tangan sendiri. Lalu dia menyadari bahwa masih ada kekurangan dalam melakukan pemetaan. Dia kemudian meningkatkan kecanggihan dalam melakukan pemetaan, meningkatkan dana untuk itu menjadi dua kali lipat hingga 400 juta dolar.

\n

Tidak berhenti sampai di situ, dia kembali menghadapi masalah ketika programnya ditentang oleh kelompok agama yang menganggap imunisasi sebagai upaya sterilisasi wanita. Dia kemudian turun tangan sendiri menemui pimpinan adat, agama dan budaya sampai kemudian mereka menerima gagasan vaksin polionya. Tidak selesai di situ, pemberontakan kelompok Boko Haram yang anti barat ikut menghalangi programnya. Salah satu kelompok relawan imunisasinya ditembak saat sedang berkeliling melakukan imunisasi. Polisi yang menjaga mereka juga tewas tertembak. Itu terjadi tidak hanya di Nigeria tapi juga di Afganistan. Orang-orang mulai ragu dengan ambisinya menghapus polio dari dunia. Untuk menjawab pertanyaan itu dia berbicara di forum dunia dan memaparkan bahwa dia akan terus melanjutkan pekerjaannya. Orang bilang itu tidak sepadan, tapi dia akan terus mewujudkan visinya untuk membuat dunia bebas dari polio.

\n

Membuat Energi Bersih

\n

Salah satu isu yang menjadi sorotan Bill Gates adalah perubahan iklim. Bill banyak membaca buku yang berkaitan dengan iklim dan dia menemukan bahwa penggunaan energi di dunia ini mulai mengkhawatirkan karena banyak menghasilkan emisi gas rumah kaca. Seperempat dari polusi itu dihasilkan oleh transportasi, kemudian peternakan, gedung-gedung dan rumah lalu sisanya sektor lain. Dia melihat sel surya dan baterai sebagai alternatif energi bersih, tapi itu tidak bisa menjadi solusi utama dalam jangka panjang karena keterbatasan baterai sebagai wadah listrik tidak akan mencukupi dengan penggunaan energi saat ini. Hal itu disebabkan karena kita harus menghadapi situasi tanpa cahaya matahari seperti malam, cuaca, musim dingin dsb.

\n

Bill justru melihat nuklir sebagai solusi. Masalah energi nuklir datang dari stigma negetif bahwa energi nuklir itu berbahaya. Orang-orang punya ingatan buruk dengan reaktor nuklir seperti pada peristiwa Chernobyl dan Fukushima. Namun Bill Gates punya keyakinan lain, katanya peristiwa itu terjadi karena teknologi reaktor nuklir yang sudah usang dan kebanyakan terjadi karena human error. Dia melihat ada penyebab pada setiap peristiwa kecelakaan nuklir yang sebenarnya bisa diantisipasi dengan teknologi baru. Pandangan negatif tentang nuklir dijawab oleh Bill dengan mengumpulkan pakar-pakar nuklir terbaik. Teknologi yang berusia puluhan tahun lalu itu bisa diperbaiki untuk menjadi teknologi yang ramah lingkungan dan aman. Visinya diwujudkan dengan mendirikan perusahaan bernama Terra Power.

\n

Selanjutnya dia memberi pesan pada semua orang bahwa tidak ada solusi tunggal dalam mengatasi perubahan iklim. Setiap level masyarakat bisa memiliki alternatif solusi untuk menghentikan perubahan iklim supaya tidak menghancurkan bumi. Perusahaan-perusahaan bisa mengganti energinya dengan energi bersih, mulai meninggalkan batu bara dan beralih pada energi matahari, angin atau mikrohidro. Pemerintah bisa membuat kebijakan yang pro lingkungan. Individu dalam masyarakat bisa lebih bijak dalam menggunakan energi dan mengelola limbahnya.

","frontmatter":{"title":"Film Dokumenter Bill Gates","date":"February 26, 2021"}}},"pageContext":{"slug":"/2021/02/film-dokumenter-bill-gates/","previous":{"fields":{"slug":"/2021/02/npm-adalah/"},"frontmatter":{"title":"NPM Adalah"}},"next":{"fields":{"slug":"/2021/03/membuat-website-jamstack/"},"frontmatter":{"title":"Membuat Website JAMStack"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2021/02/jamstack-adalah/page-data.json b/page-data/2021/02/jamstack-adalah/page-data.json new file mode 100644 index 00000000..8b485f7e --- /dev/null +++ b/page-data/2021/02/jamstack-adalah/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2021/02/jamstack-adalah/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"314ce2e1-f668-5c25-ae3e-3ebd0d31793a","excerpt":"JAMstack adalah arsitektur software yang disusun dari 3 komponen: Javascript, API, dan Markup. Arsitektur JAMStack dirancang untuk membuat website lebih cepat, lebih aman, dan lebih mudah untuk diskalakan. Prinsip inti JAMStack adalah pre-rendering dan decoupling. Pre-rendering…","html":"

JAMstack adalah arsitektur software yang disusun dari 3 komponen: Javascript, API, dan Markup. Arsitektur JAMStack dirancang untuk membuat website lebih cepat, lebih aman, dan lebih mudah untuk diskalakan. Prinsip inti JAMStack adalah pre-rendering dan decoupling.

\n

Pre-rendering berarti halaman website (markup) yang mewakili view adalah file statis yang telah dibuild (berupa file html). Web server tidak perlu melakukan render setiap kali user melakukan request. Dengan Jamstack, front-end dibangun terlebih dahulu menjadi halaman statis beserta aset yang sudah sangat dioptimalkan selama proses build. Proses pre-rendering ini menghasilkan website yang dapat disajikan langsung dari CDN. Dengan begitu akan mengurangi biaya, kompleksitas, dan risiko server dinamis sebagai infrastruktur penting.

\n

Decoupling berarti memisahkan antara sistem dengan service. Masing-masing komponen berdiri sendiri dan berkomunikasi menggunakan API. Pada praktik kebanyakan, halaman website dirender di sisi server setiap kali user melakukan request. Ini yang disebut dengan website dinamis, misalnya tampilan sebuah website (view) dirender dengan PHP atau bahasa pemrograman lainnya. Dengan metode itu kebutuhan server akan meningkat seiring dengan penambahan pengguna. Ini membuat sitem semakin besar dan kompleks.

\n

Istilah “JAMStack” muncul saat Matt Biilmann dan Chris Bach membuat alur kerja pengembangan web modern di Netlify, mereka mencari istilah mudah untuk merujuk pada sebuah pendekatan arsitektural itu untuk digunakan dalam percakapan. Jamstack mencakup banyak dasar-dasar arsitektur web yang ada, sehingga mereka menciptakan istilah Jamstack untuk membantu orang-orang membicarakannya dengan lebih ringkas.

\n

Dengan begitu banyak tool populer untuk membuat website statis, seperti Gatsby, Hugo, Jekyll, Eleventy, NextJS, dan masih banyak lagi, banyak pengembang web sudah terbiasa dengan alat yang dibutuhkan untuk mengembangkan Jamstack.

\n

Mengapa menggunakan JAMStack

\n

Arsitektur JAMStack dapat memberi beberapa kelebihan pada website dan alur kerja pengembangan. Berikut beberapa kelebihannya

\n

Keamanan

\n

Jamstack menghilangkan penggunaan bagian dinamis dalam infrastruktur hosting sehingga menghasilkan lebih sedikit penggunaan server dan sistem menjadi lebih sulit untuk diserang.Tampilan halaman web dan aset adalah file yang dibuat secara pre-render, ini memungkinkan hanya memberikan akses baca saja (read-only) ke hosting. Hal itu mengurangi risiko serangan lebih jauh. Sementara layanan yang sifatnya dinamis dapat disediakan oleh vendor dengan tim yang dedicated atau pihak ketiga yang sudah memiliki keamanan sistem.

\n

Skala

\n

Arsitektur yang populer saat ini menangani beban lalu lintas yang padat dengan menambahkan logika untuk membuat cache pada tampilan dan sumber daya yang sering diakses. Jamstack secara natural menyediakan ini. Karena halaman web dapat disajikan sepenuhnya dari CDN, tidak ada logika atau alur kerja yang rumit untuk menentukan aset apa yang dapat di-cache dan kapan. Bahkan dengan website Jamstack semuanya dapat disimpan dalam cache di CDN. Dengan begitu penerapannya bisa lebih sederhana dan kapasitas loadnya bisa lebih besar.

\n

Performa

\n

Kita semua tau kecepatan memuat (load) halaman berdampak pada pengalaman pengguna dan konversi. Website Jamstack menghilangkan kebutuhan untuk menghasilkan tampilan halaman di server setiap kali ada request, karena halaman telah dibuat sebelumnya (pre-rendered). Dengan semua halaman telah tersedia di CDN yang dekat dengan pengguna dan siap untuk ditayangkan, kinerja yang sangat tinggi dimungkinkan tanpa menggunakan infrastruktur yang mahal atau kompleks.

\n

Pemeliharaan

\n

Ketika kompleksitas hosting berkurang, berkurang pula tugas pemeliharaan. Situs yang dibuat sebelumnya (pre-rendered), disajikan langsung dari host sederhana atau langsung dari CDN sehingga tidak memerlukan tim ahli untuk memastikannya tetap bisa diakses. Pekerjaan yang berhubungan dengan tampilan halaman sudah selesai selama pembuatan, jadi website yang dihasilkan sudah stabil dan dapat dihosting tanpa server yang mungkin memerlukan patching, update, dan maintenance.

\n

Portabilitas

\n

Situs Jamstack bersifat pre-rendered atau sudah dibuat sebelumnya. Itu berarti kita dapat menghostingnya dari berbagai layanan hosting dan memiliki kemampuan lebih besar untuk memindahkannya ke host pilihan Anda. Kita tidak perlu memindahkan banyak sekali file, cukup source file halaman web saja. Solusi hosting statis sederhana apa pun harus dapat melayani situs Jamstack. Kita tidak lagi terkunci pada satu infrastruktur.

\n

Pengalaman Pengembang

\n

Jamstack adalah sebuah arsitektur, bukan alat yang spesifik. Website Jamstack dapat dibangun dengan berbagai alat. Itu tidak bergantung pada teknologi eksklusif atau framework yang eksotis dan sedikit diketahui. Sebaliknya, mereka mengembangkan alat dan konvensi yang tersedia secara luas.

\n

Sumber: jamstack.org

","frontmatter":{"title":"JAMStack Adalah","date":"February 16, 2021"}}},"pageContext":{"slug":"/2021/02/jamstack-adalah/","previous":{"fields":{"slug":"/2021/02/markdown-cheatseet/"},"frontmatter":{"title":"Markdown Cheatseet"}},"next":{"fields":{"slug":"/2021/02/cara-menggunakan-npm/"},"frontmatter":{"title":"Cara Menggunakan NPM"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2021/02/markdown-cheatseet/page-data.json b/page-data/2021/02/markdown-cheatseet/page-data.json new file mode 100644 index 00000000..8a11c1b4 --- /dev/null +++ b/page-data/2021/02/markdown-cheatseet/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2021/02/markdown-cheatseet/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"a9c428ec-f1aa-5a64-800d-9897454749f4","excerpt":"Sintaks Dasar Element Sintaks Heading # h1 ## h2 ### h3 Bold ***bold text*** Italic *italic text* Blockquote > blockquote Ordered List 1. First item 2. Second item 3. Third item Unoredered List - First item - Second item - Third item Code `code` Horizontal rule --- Link…","html":"

Sintaks Dasar

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
ElementSintaks
Heading# h1
## h2
### h3
Bold***bold text***
Italic*italic text*
Blockquote> blockquote
Ordered List1. First item
2. Second item
3. Third item
Unoredered List- First item
- Second item
- Third item
Code`code`
Horizontal rule---
Link[title](https://www.example.com)
Image![alt text](image.jpg)
\n

Sintaks Lanjutan

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
ElementSintaks
Table| Syntax | Description |
| ----------- | --------- |
| Header | Title |
| Paragraph | Text |
Fenced Code Block```
{
“firstName”: “John”,
“lastName”: “Smith”,
“age”: 25
}
```
FootnoteHere’s a sentence with a footnote. [^1]
[^1]: This is the footnote.
Heading ID### My Great Heading {#custom-id}
Definition Listterm
: definition
Strikethrough~~~ The world is flat ~~~
Task List- [x] Write the press release
- [ ] Update the website
- [ ] Contact the media
","frontmatter":{"title":"Markdown Cheatseet","date":"February 13, 2021"}}},"pageContext":{"slug":"/2021/02/markdown-cheatseet/","previous":{"fields":{"slug":"/2021/02/cara-menggunakan-markdown-lanjutan/"},"frontmatter":{"title":"Cara Menggunakan Markdown Lanjutan"}},"next":{"fields":{"slug":"/2021/02/jamstack-adalah/"},"frontmatter":{"title":"JAMStack Adalah"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2021/02/npm-adalah/page-data.json b/page-data/2021/02/npm-adalah/page-data.json new file mode 100644 index 00000000..30f6219f --- /dev/null +++ b/page-data/2021/02/npm-adalah/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2021/02/npm-adalah/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"6cb029e7-553e-5464-9922-e382d50f8887","excerpt":"NPM (Node Package Manager) adalah pengelola paket default untuk runtime JavaScript Node.js. NPM dibuat pada tahun 2009 sebagai proyek open source untuk membantu pengembang JavaScript berbagi paket modul kode dengan mudah. NPM terdiri dari dua bagian utama: di sisi kita sebagai…","html":"

NPM (Node Package Manager) adalah pengelola paket default untuk runtime JavaScript Node.js. NPM dibuat pada tahun 2009 sebagai proyek open source untuk membantu pengembang JavaScript berbagi paket modul kode dengan mudah. NPM terdiri dari dua bagian utama: di sisi kita sebagai klien menggunakan command line interface (CLI) untuk menginstall dan menerbitkan paket, dan repositori online atau disebut npm registry yang menghosting paket-paket kode open source Javascript seperti Node.JS, aplikasi web front-end, aplikasi mobile, robot, router, dan kebutuhan lain yang tak terhitung jumlahnya dari komunitas JavaScript. Banyak paket kode yang diterbitkan di NPM dengan berbagai macam fungsinya bisa mempercepat proses pengembangan web kita.

\n

npm init

\n

Semua dimulai dari file package.json. Setiap project JavaScript - baik itu Node.js atau aplikasi browser - dapat dicakup sebagai paket npm dengan informasi paketnya sendiri. Tugas package.json adalah mendeskripsikan proyek tersebut. Itu seperti daftar komposisi pada bungkus makanan. package.json dibuat ketika npm init dijalankan untuk menginisialisasi proyek JavaScript / Node.js. Di dalamnya terdapat informasi, diantaranya metadata dasar yang disediakan oleh pengembang:

\n
    \n
  • name: nama library / proyek JavaScript Anda
  • \n
  • version: versi proyek Anda. Bagian ini bisa berguna sebagai sumber versi deploy.
  • \n
  • description: deskripsi proyek
  • \n
  • lisensi: lisensi proyek
  • \n
\n

npm script

\n

package.json juga mendukung properti scripts yang dapat didefinisikan untuk menjalankan command line yang diinstal dalam konteks lokal sebuah proyek. Misalnya, bagian skrip dari proyek npm dapat terlihat seperti ini:

\n
{\n  \"scripts\": {\n    \"build\": \"tsc\",\n    \"format\": \"prettier --write ** / *. ts\",\n    \"format-check\": \"prettier --check ** / *. ts\",\n    \"lint\": \"eslint src / ** / *. ts\",\n    \"pack\": \"ncc build\",\n    \"test\": \"jest\",\n    \"all\": \"npm run build && npm run format && npm run lint && npm run pack && npm test\"\n  }\n}
\n

Skrip di atas memberitahu paket apa saja yang dijalankan dengan skrip perintah yang tertulis. Eslint, prettier, ncc, jest tidak harus diinstal sebagai executable global melainkan hanya lokal untuk proyek Anda di dalam folder node_modules / .bin /.

\n

dependencies vs devDependecies

\n

Bagian ini ditulis dalam bentuk key value object dengan nama library npm sebagai key dan versi library yang ditulis dengan format semantik sebagai value. Ini adalah contoh dari templatenya:

\n
{\n  \"dependencies\": {\n    \"@actions/core\": \"^1.2.3\",\n    \"@actions/github\": \"^2.1.1\"\n  },\n  \"devDependencies\": {\n    \"@types/jest\": \"^25.1.4\",\n    \"@types/node\": \"^13.9.0\",\n    \"@typescript-eslint/parser\": \"^2.22.0\",\n    \"@zeit/ncc\": \"^0.21.1\",\n    \"eslint\": \"^6.8.0\",\n    \"eslint-plugin-github\": \"^3.4.1\",\n    \"eslint-plugin-jest\": \"^23.8.2\",\n    \"jest\": \"^25.1.0\",\n    \"jest-circus\": \"^25.1.0\",\n    \"js-yaml\": \"^3.13.1\",\n    \"prettier\": \"^1.19.1\",\n    \"ts-jest\": \"^25.2.1\",\n    \"typescript\": \"^3.8.3\"\n  }\n}
\n

Dependensi ini nantinya akan diinstal ketika menjalankan perintah npm install dengan flag --save dan --save-dev. Flag tersebut dimaksudkan untuk memberi tahu dependensi akan digunakan masing-masing untuk lingkungan produksi dan pengembangan / pengujian. Kami akan menggali lebih dalam tentang pemasangan paket-paket ini di bagian selanjutnya. Selain itu penting untuk memahami kemungkinan tanda yang muncul sebelum versi semantik (baca selengkapnya tentang semantic versioning):

\n
    \n
  • ^: rilis minor terbaru. Misalnya, spesifikasi ^1.0.4 mungkin menginstal versi 1.3.0 jika itu adalah versi minor terbaru dalam 1 seri utama.
  • \n
  • ~: rilis patch terbaru. Dengan cara yang sama seperti ^ untuk rilis minor, spesifikasi ~ 1.0.4 mungkin menginstal versi 1.0.7 jika itu adalah versi minor terbaru dalam seri 1.0 minor.\nSemua versi paket yang tepat ini akan didokumentasikan dalam file package-lock.json yang dihasilkan.
  • \n
\n

package-lock.json

\n

File ini menjelaskan versi pasti dari dependensi yang digunakan dalam proyek JavaScript npm. Jika dianalogikan seperti makanan package.json adalah label bahan dengan deskripsi secara umum, di dalam package-lock.json semua terlihat lebih detil. Dan sebagaimana makanan kita biasanya hanya membaca secara umum komposisinya, tidak perlu membaca kapan bawang dalam sebuah makanan dipanen dsb. package-lock.json tidak dimaksudkan untuk dibaca baris demi baris oleh pengembang. package-lock.json biasanya dibuat oleh perintah npm install, dan juga dibaca oleh alat NPM CLI kita untuk memastikan reproduksi lingkungan build untuk proyek dengan perintah npm ci.

\n

Sumber: freecodecamp.org

","frontmatter":{"title":"NPM Adalah","date":"February 20, 2021"}}},"pageContext":{"slug":"/2021/02/npm-adalah/","previous":{"fields":{"slug":"/2021/02/cara-menggunakan-npm/"},"frontmatter":{"title":"Cara Menggunakan NPM"}},"next":{"fields":{"slug":"/2021/02/film-dokumenter-bill-gates/"},"frontmatter":{"title":"Film Dokumenter Bill Gates"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2021/03/membuat-website-jamstack/page-data.json b/page-data/2021/03/membuat-website-jamstack/page-data.json new file mode 100644 index 00000000..279dca83 --- /dev/null +++ b/page-data/2021/03/membuat-website-jamstack/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2021/03/membuat-website-jamstack/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"76d33b3e-0367-5e7e-a3f2-dabc9537d816","excerpt":"Banyak tools pengembangan website yang bisa membuat website JAMStack dengan mudah. Di sisi front end kita bisa menggunakan static site generator (SSG) untuk membuat halaman statis secara pre render. Ada banyak sekali framework open source yang dikembangkan dengan berbagai macam…","html":"

Banyak tools pengembangan website yang bisa membuat website JAMStack dengan mudah. Di sisi front end kita bisa menggunakan static site generator (SSG) untuk membuat halaman statis secara pre render. Ada banyak sekali framework open source yang dikembangkan dengan berbagai macam bahasa pemrograman untuk melakukan hal ini. Masing-masing framework juga memiliki spesialisasi masing-masing. Ada yang untuk membuat blog, website dokumentasi dan ada juga yang fungsinya lebih banyak. Beberapa contoh yang populer saat ini misalnya Gatsby, Next.js, Hugo dan Jekyll.

\n

Di sisi back end datanya kita bisa menggunakan headless CMS yang akan memberikan layanan API. Di beberapa SSG seperti Gatsby disediakan GraphQL untuk query. Jika tidak memerlukan adanya back end untuk mengolah banyak data, kita bisa saja tidak menggunakan CMS. SSG seperti Gatsby bisa menggunakan file markdown untuk mengisi kontennya, itu sangat cukup untuk sebuah blog atau website sederhana. Daftar lengkap tools untuk membuat website Jamstack bisa dilihat di website jamstack.org

\n

Static site generator\nHeadless CMS

","frontmatter":{"title":"Membuat Website JAMStack","date":"March 06, 2021"}}},"pageContext":{"slug":"/2021/03/membuat-website-jamstack/","previous":{"fields":{"slug":"/2021/02/film-dokumenter-bill-gates/"},"frontmatter":{"title":"Film Dokumenter Bill Gates"}},"next":{"fields":{"slug":"/2021/03/visi-elon-musk/"},"frontmatter":{"title":"Visi Elon Musk"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2021/03/visi-elon-musk/page-data.json b/page-data/2021/03/visi-elon-musk/page-data.json new file mode 100644 index 00000000..f18f9cd4 --- /dev/null +++ b/page-data/2021/03/visi-elon-musk/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2021/03/visi-elon-musk/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"511384f8-2a6d-593a-9568-fa846ab60686","excerpt":"Elon Musk adalah tokoh bisnis, penemu dan seorang industrialis kondang. Dia mendirikan dan memimpin beberapa perusahaan teknologi sejak usia sangat muda. Dimulai dari PayPal, Tesla, SpaceX dll. Saat ini dia menjadi salah satu orang yang berada di jajaran orang terkaya di dunia…","html":"

Elon Musk adalah tokoh bisnis, penemu dan seorang industrialis kondang. Dia mendirikan dan memimpin beberapa perusahaan teknologi sejak usia sangat muda. Dimulai dari PayPal, Tesla, SpaceX dll. Saat ini dia menjadi salah satu orang yang berada di jajaran orang terkaya di dunia. Kepiawaiannya mengelola bisnis dan menemukan teknologi-teknologi canggih didorong oleh visinya untuk masa depan.

\n

Inklusi Keuangan

\n

PayPal didirikan karena dia menginginkan sistem keuangan yang inklusif. Harapannya semua orang bisa melakukan transaksi keuangan dengan leluasa di internet.

\n

Perubahan Iklim

\n

Dia juga melihat isu perubahan iklim dapat mengancam kehidupan manusia di masa depan. Itu yang menginspirasinya mengakuisisi Tesla untuk memberikan alternatif kendaraan berenergi listrik. Selain itu dia juga membuat Solar City, model sebuah kota dengan energi matahari sebagai sumber pembangkit listriknya.

\n

Transportasi Masal

\n

Visinya di bidang transportasi diwujudkan dengan menginisiasi teknologi Hyperloop, sebuah sistem transportasi darat yang digerakkan dengan medan magnet di dalam sebuah terowongan. Idenya ini dibuat sebagai projek open source supaya semua orang bisa ikut mengembangkannya. Transportasi masa depan yang ideal menurut Musk bukanlah transportasi udara.

\n

Bumi yang Rusak

\n

Visi lain Musk adalah melihat bahwa bumi tidak akan bisa ditinggali selamanya. Dia membuat alternatif manusia untuk bepergian ke luar bumi dengan perusahaannya Space X.

\n

Manusia vs Mesin

\n

Musk melihat bahwa evolusi teknologi akan menyalip evolusi manusia. Di satu titik manusia tidak akan bisa menyusul kecerdasan mesin, tubuh dan otak manusia akan usang.

\n

Karena itu dia mendirikan Neuralink supaya manusia bisa terhubung langsung dengan mesin. Dengan begitu manusia akan leluasa mengendalikan mesin dan itu akan menutup kekurangan manusia. Sebuah implan akan ditanam di dalam kepala, dengan itu manusia bisa mengendalikan mesin hanya dengan memikirkannya.

\n

Kecerdasan Buatan

\n

Musk termasuk orang yang berhati-hati dalam menghadapi teknologi kecerdasan buatan. Dia berada di sisi pimpinan bisnis yang khawatir akan dampak kecerdasan buatan pada kehidupan manusia. Gagasan Open AI lahir supaya kecerdasan buatan bersifat inklusif. Projek ini dibuat sebagai open source, tidak hanya perusahaan komersial yang bisa mengeksploitasi kecerdasan buatan.

","frontmatter":{"title":"Visi Elon Musk","date":"March 13, 2021"}}},"pageContext":{"slug":"/2021/03/visi-elon-musk/","previous":{"fields":{"slug":"/2021/03/membuat-website-jamstack/"},"frontmatter":{"title":"Membuat Website JAMStack"}},"next":{"fields":{"slug":"/2021/07/film-dokumenter-vuejs/"},"frontmatter":{"title":"Film Dokumenter Sejarah Vue JS"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2021/07/film-dokumenter-vuejs/page-data.json b/page-data/2021/07/film-dokumenter-vuejs/page-data.json new file mode 100644 index 00000000..092eb3f4 --- /dev/null +++ b/page-data/2021/07/film-dokumenter-vuejs/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2021/07/film-dokumenter-vuejs/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"42bf75bf-92ad-5644-b3b7-10a56f3bb4a1","excerpt":"Dimulai dari proyek sampingan saat bekerja di Google, \nhingga saat ini sering disandingkan dengan raksasa JavaScript \nseperti React dan Angular. Dengan bantuan Sarah Drasner, Taylor Otwell, Thorsten Lünborg, dan banyak lainnya dari komunitas Vue.js, \nEvan You menceritakan kisah…","html":"

Dimulai dari proyek sampingan saat bekerja di Google,\nhingga saat ini sering disandingkan dengan raksasa JavaScript\nseperti React dan Angular.

\n

Dengan bantuan Sarah Drasner, Taylor Otwell, Thorsten Lünborg, dan banyak lainnya dari komunitas Vue.js,\nEvan You menceritakan kisah bagaimana dia berjuang melawan rintangan untuk menghidupkan Vuejs.

\n
","frontmatter":{"title":"Film Dokumenter Sejarah Vue JS","date":"July 10, 2021"}}},"pageContext":{"slug":"/2021/07/film-dokumenter-vuejs/","previous":{"fields":{"slug":"/2021/03/visi-elon-musk/"},"frontmatter":{"title":"Visi Elon Musk"}},"next":{"fields":{"slug":"/2021/07/install-laravel/"},"frontmatter":{"title":"Cara Install Laravel"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2021/07/install-laravel/page-data.json b/page-data/2021/07/install-laravel/page-data.json new file mode 100644 index 00000000..89caf35e --- /dev/null +++ b/page-data/2021/07/install-laravel/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2021/07/install-laravel/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"075582de-3310-550d-b548-ea41f476579b","excerpt":"Via Composer Jika di komputer sudah terinstall PHP dan Composer, kita dapat membuat proyek Laravel baru \ndengan menggunakan Composer secara langsung. Setelah aplikasi dibuat, kita bisa menjalankan server pengembangan lokal Laravel (local development server)\nmenggunakan perintah…","html":"

Via Composer

\n

Jika di komputer sudah terinstall PHP dan Composer, kita dapat membuat proyek Laravel baru\ndengan menggunakan Composer secara langsung.

\n
// membuat folder projek laravel dengan nama example-app\ncomposer create-project laravel/laravel example-app\n\n// masuk ke folder aplikasi yang baru saja dibuat\ncd example-app
\n

Setelah aplikasi dibuat, kita bisa menjalankan server pengembangan lokal Laravel (local development server)\nmenggunakan perintah servis Artisan CLI:

\n
// jalankan server\nphp artisan serve
\n

Via Laravel Installer

\n

Pertama instal Laravel Installer sebagai dependensi global Composer:

\n
// install laravel installer sebagai dependensi global\ncomposer global require laravel/installer\n\n// jalankan command laravel new untuk membuat projek baru\nlaravel new example-app\n\n// masuk ke folder aplikasi yang baru saja dibuat\ncd example-app\n\n// jalankan server\nphp artisan serve
\n

Pastikan untuk mengarahkan direktori bin vendor Composer di $PATH\nsehingga perintah laravel dapat dieksekusi dapat ditemukan oleh sistem.\nJika belum, kemungkinan perintah laravel akan mengalami error laravel: command not found.\nPada sistem operasi Windows direktori umumnya ada di:

\n
%USERPROFILE%\\AppData\\Roaming\\Composer\\vendor\\bin
","frontmatter":{"title":"Cara Install Laravel","date":"July 10, 2021"}}},"pageContext":{"slug":"/2021/07/install-laravel/","previous":{"fields":{"slug":"/2021/07/film-dokumenter-vuejs/"},"frontmatter":{"title":"Film Dokumenter Sejarah Vue JS"}},"next":{"fields":{"slug":"/2021/07/javascript-truthy-dan-falsy/"},"frontmatter":{"title":"JavaScript Truthy dan Falsy"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2021/07/javascript-truthy-dan-falsy/page-data.json b/page-data/2021/07/javascript-truthy-dan-falsy/page-data.json new file mode 100644 index 00000000..68963fff --- /dev/null +++ b/page-data/2021/07/javascript-truthy-dan-falsy/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2021/07/javascript-truthy-dan-falsy/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"34a78152-15d8-52ec-8978-90a7da104bf5","excerpt":"Salah satu tipe data primitif dalam dalam JavaScript adalah boolean, \nyaitu tipe data logis yang memiliki nilai true atau false.\nJavaScript memiliki sifat type coercion atau konversi nilai secara otomatis \natau implisit dari satu tipe data ke tipe data lainnya (seperti string ke…","html":"

Salah satu tipe data primitif dalam dalam JavaScript adalah boolean,\nyaitu tipe data logis yang memiliki nilai true atau false.\nJavaScript memiliki sifat type coercion atau konversi nilai secara otomatis\natau implisit dari satu tipe data ke tipe data lainnya (seperti string ke angka, objek ke boolean).

\n

Oleh karena itu nilai-nilai di luar tipe data boolean\njuga dapat dievaluasi sebagai nilai true atau false.\nDalam konteks boolean ada istilah truthy yaitu nilai-nilai yang dianggap true,\ndan falsy yaitu nilai yang dianggap false.

\n

Beberapa contoh nilai truthy adalah

\n
true // boolean true\n{} // object\n[] // array\n15 // integer tidak bernilai 0\n'0' // string
\n

Sementara nilai falsy adalah

\n
false //boolean false\nundefined\nnull\nNaN\n0 // integer 0\n\"\" // string kosong
\n

Di JavaScript setiap nilai bisa dievaluasi nilai boolean-nya menggunakan fungsi Boolean().

\n
Boolean(1) // true\nBoolean('0') // true\nBoolean(0) // false
\n

Sumber bacaan:

\n
    \n
  1. Type Coercion
  2. \n
  3. Truthy
  4. \n
  5. Falsy
  6. \n
  7. Boolean
  8. \n
","frontmatter":{"title":"JavaScript Truthy dan Falsy","date":"July 22, 2021"}}},"pageContext":{"slug":"/2021/07/javascript-truthy-dan-falsy/","previous":{"fields":{"slug":"/2021/07/install-laravel/"},"frontmatter":{"title":"Cara Install Laravel"}},"next":{"fields":{"slug":"/2021/07/perbedaan-const-dan-let/"},"frontmatter":{"title":"Perbedaan const dan let"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2021/07/laravel-routing/page-data.json b/page-data/2021/07/laravel-routing/page-data.json new file mode 100644 index 00000000..77cfff66 --- /dev/null +++ b/page-data/2021/07/laravel-routing/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2021/07/laravel-routing/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"5673bb7e-f565-56c9-b602-af3079855f6e","excerpt":"Class Route pada Laravel menyediakan method yang sederhana \nuntuk mendefinisikan route dan fungsi-fungsinya tanpa file konfigurasi\nyang rumit. Route yang paling dasar menerima parameter URI dan sebuah closure. Mengarahkan pada Controller Pada kebanyakan aplikasi, kita mengarahkan…","html":"

Class Route pada Laravel menyediakan method yang sederhana\nuntuk mendefinisikan route dan fungsi-fungsinya tanpa file konfigurasi\nyang rumit. Route yang paling dasar menerima parameter URI dan sebuah closure.

\n
use Illuminate\\Support\\Facades\\Route;\n\nRoute::get('/greeting', function () {\n    return 'Hello World';\n});
\n

Mengarahkan pada Controller

\n

Pada kebanyakan aplikasi, kita mengarahkan URL menuju controller dan method\nyang akan menangani permintaan.

\n
use App\\Http\\Controllers\\UserController;\n\nRoute::get('/user', [UserController::class, 'index']);\n// Mengarahkan ke method index pada UserController
\n

Merespon Request Sesuai dengan HTTP Verb

\n

Router pada Laravel dapat merespon semua HTTP verb

\n
Route::get($uri, $callback);\nRoute::post($uri, $callback);\nRoute::put($uri, $callback);\nRoute::patch($uri, $callback);\nRoute::delete($uri, $callback);\nRoute::options($uri, $callback);
\n

Jika ingin membuat route yang merespon beberapa HTTP verb sekaligus bisa menggunakan\nmethod match, atau jika menginginkan route yang merespon semua HTTP verbs\nbisa menggunakan method any:

\n
Route::match(['get', 'post'], '/', function () {\n    //\n});\n\nRoute::any('/', function () {\n    //\n});
\n

Route untuk Resource Controller

\n

Kadang kita memperlakukan setiap model data sebagai ”resource”,\ndimana kita melakukan serangkaian operasi yang sama pada resource\ntersebut. Misalnya kita memiliki aplikasi yang mengelola data buku dan film.\nKita akan membuat fitur create, read, update atau delete pada resource tersebut.

\n

Fitur tersebut umum sekali dibuat pada aplikasi, sehingga Laravel menyediakan\nresource controller, sebuah controller dengan method yang lengkap beserta\nroute create, read, update, and delete (“CRUD”) dalam satu baris kode saja.

\n

Untuk membuat controllernya gunakan perintah php artisan dengan tambahan\n--resource

\n
php artisan make:controller PhotoController --resource
\n

Perintah tersebut akan membuat controller baru yang di dalamnya sudah terdapat\nmethod-method untuk masing-masing operasi CRUD. Selanjutnya cukup buat satu baris kode\nyang sudah mencakup semua method pada controller resource.

\n
use App\\Http\\Controllers\\PhotoController;\n\nRoute::resource('photos', PhotoController::class);
\n

Satu baris route di atas akan membuat beberapa route yang akan menangani\nvariasi fungsi pada resource sesuai dengan HTTP verbs-nya. Jika kita memiliki\nbeberapa resource bisa juga digabungkan menggunakan array

\n
Route::resources([\n    'photos' => PhotoController::class,\n    'posts' => PostController::class,\n]);
\n

Jika sudah memiliki route di luar resource, letakkan kodenya di atas route resource.\nFungsi yang ditangani resource controller dan route yang dibuat:

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
VerbURIActionRoute Name
GET/photosindexphotos.index
GET/photos/createcreatephotos.create
POST/photosstorephotos.store
GET/photos/{photo}showphotos.show
GET/photos/{photo}/editeditphotos.edit
PUT/PATCH/photos/{photo}updatephotos.update
DELETE/photos/{photo}destroyphotos.destroy
\n

Menampilkan View

\n

Jika hanya ingin menampilkan halaman tertentu (view) maka tidak perlu\nmembuat controller method, langsung saja gunakan Route::view()

\n
// Daripada memebuat controller dan method dulu\nclass TextsController extends Controller\n{\n  public function about()\n  {\n    return view('texts.about');\n  }\n}\n// Kemeudian membuat route seperti ini\nRoute::get('about', [PageController::class, 'action']);\n//\n//\n// Lebih singkat langsung saja\nRoute::view('about', 'texts.about');
\n

Method view menerima tiga argument, pertama URI, kedua nama view-nya\nlalu yang ketiga data berupa array (opsional).

\n
Route::view('about', 'texts.about', ['name' => 'Hari']);
\n

Menambahkan Parameter dengan Fungsi route()

\n

Jika ingin menambahkan parameter pada route, buat array\ndengan pasangan key/value. Parameter tersebut akan\nditambahkan pada string query URL.

\n
Route::get('user/{id}/profile', function ($id) {\n//\n})->name('profile');\n$url = route('profile', ['id' => 1, 'photos' => 'yes']);\n// Hasilnya: /user/1/profile?photos=yes
\n

Melihat Route yang Sudah Dibuat

\n

Gunakan perintah php artisan route:list untuk melihat route yang\nada pada aplikasi kita.

\n
php artisan route:list
","frontmatter":{"title":"Laravel Routing","date":"July 26, 2021"}}},"pageContext":{"slug":"/2021/07/laravel-routing/","previous":{"fields":{"slug":"/2021/07/normalisasi-database/"},"frontmatter":{"title":"Normalisasi Database"}},"next":{"fields":{"slug":"/2021/08/public-private-protected-properties-and-method/"},"frontmatter":{"title":"Property dan Method Public, Private, Protected"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2021/07/normalisasi-database/page-data.json b/page-data/2021/07/normalisasi-database/page-data.json new file mode 100644 index 00000000..945c5260 --- /dev/null +++ b/page-data/2021/07/normalisasi-database/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2021/07/normalisasi-database/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"d56fb839-ee3b-5e1b-ac09-e57742ccc052","excerpt":"Normalisasi database adalah proses menata tabel, kolom dan relasi antar tabel \nuntuk menghindari redundansi data dan mencapai integritas data. \nSecara sederhana prinsip yang harus dipegang adalah Hindari redundansi (pengulangan) data Mencapai integritas data Meletakkan data di…","html":"

Normalisasi database adalah proses menata tabel, kolom dan relasi antar tabel\nuntuk menghindari redundansi data dan mencapai integritas data.\nSecara sederhana prinsip yang harus dipegang adalah

\n
    \n
  1. Hindari redundansi (pengulangan) data
  2. \n
  3. Mencapai integritas data
  4. \n
  5. Meletakkan data di tabel yang tepat
  6. \n
  7. Menghindari anomali create, update, delete
  8. \n
\n

Dalam melakukan normalisasi database akan melewati beberapa bentuk\ntergantung kebutuhan. Biasanya dengan melewati 3 bentuk normal\n(normal form) sudah cukup bagus.

\n

Normal Pertama

\n

Pada bentuk normal pertama aturannya adalah setiap kolom harus atomic.\nKita hanya boleh menyimpan satu data dalam satu kolom. Kita juga tidak\nboleh membuat beberapa kolom yang merepresentasikan informasi yang sama.\nAturan yang kedua adalah harus ada satu data kunci yang mengidentifikasi\nsetiap baris pada tabel.

\n

Normal Kedua

\n

Pada bentuk normal kedua aturannya adalah semua kolom yang bukan merupakan\ndata kunci harus tergantung pada primary key.

\n

Normal Ketiga

\n

Pada bentuk normal ketiga aturannya adalah semua kolom yang bukan merupakan\nkunci harus tergantung pada primary key secara transitif (tidak langsung).

\n

Konten ini bersumber dari tulisan Ben Brumm dari databasestar.com

","frontmatter":{"title":"Normalisasi Database","date":"July 25, 2021"}}},"pageContext":{"slug":"/2021/07/normalisasi-database/","previous":{"fields":{"slug":"/2021/07/perbedaan-const-dan-let/"},"frontmatter":{"title":"Perbedaan const dan let"}},"next":{"fields":{"slug":"/2021/07/laravel-routing/"},"frontmatter":{"title":"Laravel Routing"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2021/07/perbedaan-const-dan-let/page-data.json b/page-data/2021/07/perbedaan-const-dan-let/page-data.json new file mode 100644 index 00000000..10f0e15c --- /dev/null +++ b/page-data/2021/07/perbedaan-const-dan-let/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2021/07/perbedaan-const-dan-let/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"9b0b9161-af3a-5bff-88c8-687ed176cc51","excerpt":"Sampai tahun 2015 JavaScript menggunakan untuk mendeklarasikan variabel.\nSejak ES6 muncul dan digunakan untuk mendeklarasikan variabel. \nApa perbedaan keduanya? Kita bisa lihat dari karakteristik berikut: harus diinisialisasi saat deklarasi Menyebabkan error . \nKetika…","html":"

Sampai tahun 2015 JavaScript menggunakan var untuk mendeklarasikan variabel.\nSejak ES6 muncul const dan let digunakan untuk mendeklarasikan variabel.\nApa perbedaan keduanya? Kita bisa lihat dari karakteristik berikut:

\n
    \n
  1. \n

    const harus diinisialisasi saat deklarasi

    \n
    const a
    \n

    Menyebabkan error SyntaxError: Missing initializer in const declaration.\nKetika mendeklarasikan variabel harus menginisialisasi sebuah nilai

    \n
    const a = 1
    \n

    Sedangkan pendeklarasian let tidak harus dengan inisialisasi nilai

    \n
    let a\na = 1
    \n
  2. \n
  3. \n

    const tidak dapat di-assign ulang nilainya setelah diinisialisasi

    \n
    const a = 1\na = 2
    \n

    Menyebabkan error TypeError: Assignment to constant variable,\nsementara let dapat di-assign ulang nilainya

    \n
    let a = 1\na = 2
    \n
  4. \n
  5. \n

    const dan let tidak dapat dideklarasikan ulang

    \n
    let a = 1\nlet a = 2\n//\nconst a = 1\nconst a = 2
    \n

    Menyebabkan error SyntaxError: Identifier 'a' has already been declared

    \n
  6. \n
\n

Lalu apa faedahnya? Paling aman gunakan const, kecuali kita tahu persis akan melakukan\nperubahan nilai dari variabel yang kita buat. Jika sebuah variabel tidak\nbisa diubah nilainya maka itu akan mengurangi kemungkinan bug yang disebebabkan oleh\nnilai variabel yang tidak sengaja berubah.

","frontmatter":{"title":"Perbedaan const dan let","date":"July 24, 2021"}}},"pageContext":{"slug":"/2021/07/perbedaan-const-dan-let/","previous":{"fields":{"slug":"/2021/07/javascript-truthy-dan-falsy/"},"frontmatter":{"title":"JavaScript Truthy dan Falsy"}},"next":{"fields":{"slug":"/2021/07/normalisasi-database/"},"frontmatter":{"title":"Normalisasi Database"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2021/08/5-singkatan-prinsip-pemrograman/page-data.json b/page-data/2021/08/5-singkatan-prinsip-pemrograman/page-data.json new file mode 100644 index 00000000..6203184f --- /dev/null +++ b/page-data/2021/08/5-singkatan-prinsip-pemrograman/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2021/08/5-singkatan-prinsip-pemrograman/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"eab16136-d9df-5cd6-bbd9-2bdf38067be6","excerpt":"Mengarungi industri teknologi, khususnya di bidang \npengembangan perangkat lunak, membutuhkan keterampilan \npemrograman atau menulis kode. Semakin besar skala sebuah aplikasi perangkat lunak maka kode \ntidak bisa asal ditulis begitu saja. Ada beberapa kaidah populer \ndalam dunia…","html":"

Mengarungi industri teknologi, khususnya di bidang\npengembangan perangkat lunak, membutuhkan keterampilan\npemrograman atau menulis kode.

\n

Semakin besar skala sebuah aplikasi perangkat lunak maka kode\ntidak bisa asal ditulis begitu saja. Ada beberapa kaidah populer\ndalam dunia pemrograman yang mungkin sering kita dengar singkatan-singkatannya.

\n

KISS (Keep It Simple Stupid)

\n

Tulis kode dengan sesederhana mungkin.\nJangan tergoda untuk membuat kode yang rumit. Jika sebuah kode bisa ditulis\ndalam satu baris, tulislah satu baris.

\n
function addNumbers(num1,num2){\n return num1 + num2;\n}
\n

Sederhana, mudah dibaca dan langsung dapat dipahami bagaimana kode tersebut bekerja.\nGunakan nama variabel yang jelas, mencerminkan nilai dalam variabel tersebut.\nGunakan library yang sudah tersedia. Bayangkan kita akan bekerja dengan kode-kode itu\nlagi setelah 6 bulan tidak melihatnya, apakah kita masih bisa memahaminya?\nJagalah supaya tetap sederhana agar tidak sakit kepala.

\n

DRY (Don’t Repeat Yourself)

\n

Jangan mengulang penulisan kode. Perilaku\ntersebut adalah kesalahan umum dalam koding yang bisa dihindari dengan beberapa\nmetode. Jika masih melakukan copy paste pada sebuah blok code artinya kode kita belum DRY.

\n

Open/Closed

\n

Terbuka untuk pengembangan, tapi tertutup untuk perubahan.\nPrinsip ini mendorong kita untuk menulis kode yang dapat dikembangkan, namun sebisa mungkin\ntertutup untuk modifikasi secara langsung. Prinsip ini membutuhkan keterampilan desain dan analisis\nyang tinggi. Kita bisa melihat contohnya pada library/framework yang sudah matang dan berumur panjang.

\n

SRP (Single Responsibility Principle)

\n

Setiap class/modul memiliki satu fungsi spesifik.\nJangan menambahkan terlalu banyak tugas pada sebuah class karena itu akan meningkatkan kerumitan.\nRefactor dan pecah-pecah menjadi class atau modul yang lebih kecil.

\n

YAGNI (You Aren’t Going to Need It)

\n

Jangan membuat kode yang tidak diperlukan saat ini.\nJangan membuat kode untuk masa depan. Selesaikan masalah saat ini lalu refactor.\nJangan memperbaiki masalah yang tidak ada.

","frontmatter":{"title":"5 Singkatan Prinsip Pemrograman","date":"August 28, 2021"}}},"pageContext":{"slug":"/2021/08/5-singkatan-prinsip-pemrograman/","previous":{"fields":{"slug":"/2021/08/melihat-eksekusi-kode/"},"frontmatter":{"title":"Melihat Eksekusi Kode, Langkah demi Langkah"}},"next":{"fields":{"slug":"/2021/09/mengirim-email-menggunakan-mailgun-laravel/"},"frontmatter":{"title":"Mengirim Email Menggunakan Mailgun pada Laravel"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2021/08/buku-pemrograman-gratis-catatan-untuk-profesional/page-data.json b/page-data/2021/08/buku-pemrograman-gratis-catatan-untuk-profesional/page-data.json new file mode 100644 index 00000000..c75bdf95 --- /dev/null +++ b/page-data/2021/08/buku-pemrograman-gratis-catatan-untuk-profesional/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2021/08/buku-pemrograman-gratis-catatan-untuk-profesional/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"60da7652-25c7-5da6-8ed6-3090e26c22aa","excerpt":"Membaca adalah cara tercepat untuk menyerap informasi. Salah satu website yang \nmenyediakan buku pemrograman gratis adalah goalkicker.com. \nBuku yang diterbitkan di situs tersebut adalah seri buku notes for profesional yang berisi \ncatatan-catatan penting mengenai hal-hal yang…","html":"

Membaca adalah cara tercepat untuk menyerap informasi. Salah satu website yang\nmenyediakan buku pemrograman gratis adalah goalkicker.com.\nBuku yang diterbitkan di situs tersebut adalah seri buku notes for profesional yang berisi\ncatatan-catatan penting mengenai hal-hal yang sering digunakan dalam pekerjaan.

\n

Buku ini bukanlah kitab bahasa pemrograman yang membahas satu bahasa pemrograman secara lengkap.\nMateri di dalam buku adalah catatan-catatan yang dikumpulkan hasil kolaborasi dari para profesional.\nSehingga bentuknya lebih seperti petunjuk mengenai fungsi-fungsi dalam bahasa pemrograman dan bagaimana cara penggunaannya.

\n

Hal yang saya sukai dari buku-buku tersebut adalah penjelasan yang\ndiberikan sederhana dan singkat cocok untuk orang yang sudah bekerja.\nSelain itu susunan bukunya juga sistematis dengan pengelompokan yang\nmemudahkan pembaca dalam mencari topik tertentu.

","frontmatter":{"title":"Buku Pemrograman Gratis - Seri Catatan untuk Profesional","date":"August 14, 2021"}}},"pageContext":{"slug":"/2021/08/buku-pemrograman-gratis-catatan-untuk-profesional/","previous":{"fields":{"slug":"/2021/08/public-private-protected-properties-and-method/"},"frontmatter":{"title":"Property dan Method Public, Private, Protected"}},"next":{"fields":{"slug":"/2021/08/melihat-eksekusi-kode/"},"frontmatter":{"title":"Melihat Eksekusi Kode, Langkah demi Langkah"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2021/08/melihat-eksekusi-kode/page-data.json b/page-data/2021/08/melihat-eksekusi-kode/page-data.json new file mode 100644 index 00000000..4c45da3d --- /dev/null +++ b/page-data/2021/08/melihat-eksekusi-kode/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2021/08/melihat-eksekusi-kode/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"3049428f-0c16-56f5-872d-485a4a9dd5b9","excerpt":"Python Tutor membantu orang-orang melewati hambatan dalam belajar pemrograman yaitu: \nmemahami apa yang terjadi ketika komputer menjalankan sebuah kode. \nSeringkali sulit untuk membayangkan bagaimana komputer bekerja sesuai \ndengan kode yang kita tulis. Python tutor menyajikan…","html":"

Python Tutor membantu orang-orang melewati hambatan dalam belajar pemrograman yaitu:\nmemahami apa yang terjadi ketika komputer menjalankan sebuah kode.\nSeringkali sulit untuk membayangkan bagaimana komputer bekerja sesuai\ndengan kode yang kita tulis.

\n

Python tutor menyajikan visualisasi langkah\ndemi langkah bagaimana kode dieksekusi oleh komputer.\nSaat artikel ini ditulis Python Tutor mendukung bahasa\nPython, Java, C, C++, JavaScript dan Ruby.

","frontmatter":{"title":"Melihat Eksekusi Kode, Langkah demi Langkah","date":"August 16, 2021"}}},"pageContext":{"slug":"/2021/08/melihat-eksekusi-kode/","previous":{"fields":{"slug":"/2021/08/buku-pemrograman-gratis-catatan-untuk-profesional/"},"frontmatter":{"title":"Buku Pemrograman Gratis - Seri Catatan untuk Profesional"}},"next":{"fields":{"slug":"/2021/08/5-singkatan-prinsip-pemrograman/"},"frontmatter":{"title":"5 Singkatan Prinsip Pemrograman"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2021/08/public-private-protected-properties-and-method/page-data.json b/page-data/2021/08/public-private-protected-properties-and-method/page-data.json new file mode 100644 index 00000000..cb08dd82 --- /dev/null +++ b/page-data/2021/08/public-private-protected-properties-and-method/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2021/08/public-private-protected-properties-and-method/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"46e4eff4-4939-54de-9f08-d46399e84e05","excerpt":"Ada tiga macam tipe akses yang dapat diterapkan untuk property (variabel pada class/object) dan method (function pada class/object) pada PHP. Masing-masing tipe memberikan level akses yang berbeda terhadap property atau method dalam sebuah class/object dan digunakan untuk kasus…","html":"

Ada tiga macam tipe akses yang dapat diterapkan untuk property (variabel pada class/object) dan method (function pada class/object) pada PHP. Masing-masing tipe memberikan level akses yang berbeda terhadap property atau method dalam sebuah class/object dan digunakan untuk kasus yang berbeda dalam pemrograman berorientasi objek. Dalam PHP dikenal tipe akses public, private dan protected.

\n

Public

\n

Property atau method yang dideklarasikan dengan kata kunci public mengizinkan akses yang paling luas. Public berarti mengizinkan property atau method dapat diakses oleh:

\n
    \n
  • Class yang mendeklarasikannya
  • \n
  • Sublass/class turunan (class yang melakukan extend)
  • \n
  • Semua object eksternal, class atau kode yang berada diluar hirarki class yang mendeklarasikannya
  • \n
\n

Contoh dari akses public sebagai berikut:

\n
class MyClass {\n // Mendeklrasaikan property public\n public $myProperty = 'test';\n // Mendeklrasikan method public\n public function myMethod() {\n return $this->myProperty;\n }\n}\n$obj = new MyClass(); //menginstance sebuah object\necho $obj->myMethod(); //mengakses method di kelas MyClass\n// Out: test\necho $obj->myProperty; //mengakses property di kelas MyClass\n// Out: test
\n

Protected

\n

Mendeklarasikan property atau method dengan kata kunci protected berarti mengizinkan untuk diakses oleh:

\n
    \n
  • Class yang mendeklarasikannya
  • \n
  • Class turunannya (class yang melakukan extend)
  • \n
\n

Akses protected berarti tidak mengizinkan object, class atau kode di luar hirarki class untuk mengakses property atau method di dalam class yang mendeklrasikannya. Jika ada kode yang tidak tidak berada dalam lingkup akses tersebut mencoba mengakses property/method protected maka akan muncul pesan error. Intinya yang bisa mengakses property/method private hanya instance dari class yang mendeklarasikannya.

\n

Contoh dari akses protected sebagai berikut:

\n
class MyClass {\n protected $myProperty = 'test';\n protected function myMethod() {\n    return $this->myProperty;\n }\n}\n// Subclass dari MyClass\nclass MySubClass extends MyClass {\n public function run() {\n    echo $this->myMethod();\n }\n}\n$obj = new MySubClass();\n$obj->run(); // Memanggil MyClass::myMethod() dari dalam sublcass (diizinkan);\n// Out: test\n$obj->myMethod(); // Mengakses method protected dari instance subclass (tidak diizinkan)\n// Out: Fatal error: Call to protected method MyClass::myMethod() from context ''
\n

Contoh di atas menunjukkan bahwa kita hanya bisa mengakses elemen protected dari dalam scope-nya sendiri. “Apa yang berada di dalam rumah hanya dapat diakses dari dalam rumah”

\n

Private

\n

Mendeklarasikan property/method private mengizinkan untuk dapat diakses oleh:

\n
    \n
  • Class yang mendeklrasikannya saja (bukan subclass)
  • \n
\n

Sebuah property/method private hanya dapat diakses di dalam class yang membuatnya.\nSedikit catatan, objek dengan tipe yang sama akan memiliki akses satu sama lain pada elemen private dan protected meskipun mereka bukan instance yang sama.

\n
class MyClass {\n private $myProperty = 'test';\n private function myPrivateMethod() {\n    return $this->myProperty;\n }\n public function myPublicMethod() {\n    return $this->myPrivateMethod();\n }\n public function modifyPrivatePropertyOf(MyClass $anotherInstance) {\n    $anotherInstance->myProperty = \"new value\";\n }\n}\nclass MySubClass extends MyClass {\n public function run() {\n    echo $this->myPublicMethod();\n }\n public function runWithPrivate() {\n    echo $this->myPrivateMethod();\n }\n}\n$obj = new MySubClass();\n$newObj = new MySubClass();\n// Memanggil MyClass::myPublicMethod(), yang akan memanggil\n// MyClass::myPrivateMethod(); (diizinkan karena yang memanggil \n//adalah method pada class yang mendeklrasikan)\n$obj->run();\n// Out: test\n\n$obj->modifyPrivatePropertyOf($newObj); //memodifikasi private property \n// dari instance yang berbeda (diizinkan)\n$newObj->run();\n// Out: new value\necho $obj->myPrivateMethod(); // mengakses method private secara langsung \n//pada super class (tidak diizinkan)\n// Out: Fatal error: Call to private method MyClass::myPrivateMethod() from context ''\necho $obj->runWithPrivate(); // mengakses method private \n// dari instance subclass (juga tidak diizinkan)\n// Out: Fatal error: Call to private method MyClass::myPrivateMethod() from context 'MySubClass'
","frontmatter":{"title":"Property dan Method Public, Private, Protected","date":"August 08, 2021"}}},"pageContext":{"slug":"/2021/08/public-private-protected-properties-and-method/","previous":{"fields":{"slug":"/2021/07/laravel-routing/"},"frontmatter":{"title":"Laravel Routing"}},"next":{"fields":{"slug":"/2021/08/buku-pemrograman-gratis-catatan-untuk-profesional/"},"frontmatter":{"title":"Buku Pemrograman Gratis - Seri Catatan untuk Profesional"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2021/09/mengirim-email-menggunakan-mailgun-laravel/page-data.json b/page-data/2021/09/mengirim-email-menggunakan-mailgun-laravel/page-data.json new file mode 100644 index 00000000..f165b61f --- /dev/null +++ b/page-data/2021/09/mengirim-email-menggunakan-mailgun-laravel/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2021/09/mengirim-email-menggunakan-mailgun-laravel/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"fffbfbdb-2180-51d8-838c-2c38d518e49c","excerpt":"Laravel menyediakan API email yang sederhana menggunakan library SwiftMailer. \nLayanan email pada Laravel dapat dikonfigurasi melalui file . \nSalah satu penyedia layanan mailer yang tersedia adalah Mailgun. \nMailgun menyediakan driver email berbasis API yang lebih sederhana dan…","html":"

Laravel menyediakan API email yang sederhana menggunakan library SwiftMailer.\nLayanan email pada Laravel dapat dikonfigurasi melalui file config/mail.php.\nSalah satu penyedia layanan mailer yang tersedia adalah Mailgun.\nMailgun menyediakan driver email berbasis API yang lebih sederhana dan singkat\ndibanding mengirim email menggunakan SMTP server.

\n

Untuk menggunakan driver Mailgun yang berbasis API, Laravel membutuhkan\nlibrary Guzzle HTTP, install dulu dari composer package manager

\n
composer require guzzlehttp/guzzle
\n

Secara default, file konfigurasi config/mail.php akan mengambil nilai\ndari variabel pada file .env. Maka kita akan menyimpan semua konfigurasi pada file .env.

\n
// setting mail driver yang digunakan\nMAIL_DRIVER=mailgun\n// email from (email pengirim)\nMAIL_FROM=admin@apps.com\n// nama pengirim\nMAIL_FROM_NAME=Admin\n// domain mailgun kita\nMAILGUN_DOMAIN={domain-mailgun}\n// API key mailgun kita\nMAILGUN_SECRET={api-key-mailgun}
\n

Domain dan API key mailgun bisa kita dapatkan setelah melakukan registrasi Mailgun.\nKita dapat melihatnya pada dashboard.

\n

Petunjuk ketika mengalami error saat mengirimkan email dapat melihat referensi status code https://documentation.mailgun.com/en/latest/api-intro.html#status-codes

","frontmatter":{"title":"Mengirim Email Menggunakan Mailgun pada Laravel","date":"September 18, 2021"}}},"pageContext":{"slug":"/2021/09/mengirim-email-menggunakan-mailgun-laravel/","previous":{"fields":{"slug":"/2021/08/5-singkatan-prinsip-pemrograman/"},"frontmatter":{"title":"5 Singkatan Prinsip Pemrograman"}},"next":{"fields":{"slug":"/2021/10/menghapus-git-branch-local-dan-remote/"},"frontmatter":{"title":"Menghapus Git Branch Local dan Remote"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2021/10/menghapus-git-branch-local-dan-remote/page-data.json b/page-data/2021/10/menghapus-git-branch-local-dan-remote/page-data.json new file mode 100644 index 00000000..9db70119 --- /dev/null +++ b/page-data/2021/10/menghapus-git-branch-local-dan-remote/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2021/10/menghapus-git-branch-local-dan-remote/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"7f0fe4b2-d785-5ac4-9b29-a1429c90343f","excerpt":"Perintah untuk menghapus branch git Kita tidak dapat menghapus branch yang sedang aktif, untuk itu\nkita harus melakukan ke branch yang sedang tidak akan kita hapus.\nmisalnya . Perintah untuk menghapus branch lokal: Opsi hanya akan menghapus branch yang sudah di-push dan merge…","html":"

Perintah untuk menghapus branch git

\n
// menghapus branch lokal\ngit branch -d namaBranchLokal\n\n// menghapus branch remote\ngit push origin --delete namaBranchRemote
\n

Kita tidak dapat menghapus branch yang sedang aktif, untuk itu\nkita harus melakukan checkout ke branch yang sedang tidak akan kita hapus.\nmisalnya git checkout main.

\n

Perintah untuk menghapus branch lokal:

\n
git branch -d <branch>
\n

Opsi -d hanya akan menghapus branch yang sudah di-push dan merge dengan remote branch.\nJika ingin menghapus branch yang belum di-push, gunakan opsi -D.

\n

Perintah untuk menghapus branch remote:

\n
git push <remote> --delete <branch>
\n

atau singkatnya:

\n
git push <remote> :<branch>
\n

Jika remote branch ternyata sudah dihapus akan muncul pesan error.

\n
error: unable to push to unqualified destination: remoteBranchName The destination refspec neither matches an existing ref on the remote nor begins with refs/, and we are unable to guess a prefix based on the source ref. error: failed to push some refs to 'git@repository_name'
\n

Sinkronkan branch lokal kita dengan branch remote

\n
git fetch -p
\n

Opsi -p berarti prune, branch lokal yang sudah tidak ada lagi di remote repo akan dihapus.

\n

Sumber https://www.freecodecamp.org/news/how-to-delete-a-git-branch-both-locally-and-remotely/

","frontmatter":{"title":"Menghapus Git Branch Local dan Remote","date":"October 18, 2021"}}},"pageContext":{"slug":"/2021/10/menghapus-git-branch-local-dan-remote/","previous":{"fields":{"slug":"/2021/09/mengirim-email-menggunakan-mailgun-laravel/"},"frontmatter":{"title":"Mengirim Email Menggunakan Mailgun pada Laravel"}},"next":{"fields":{"slug":"/2021/11/menggunakan-git-stash/"},"frontmatter":{"title":"Menggunakan Git Stash"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2021/11/menggunakan-git-stash/page-data.json b/page-data/2021/11/menggunakan-git-stash/page-data.json new file mode 100644 index 00000000..d389a110 --- /dev/null +++ b/page-data/2021/11/menggunakan-git-stash/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2021/11/menggunakan-git-stash/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"775775c3-683c-5ca8-95b5-5610f2a338cd","excerpt":"Selain working area, staging dan repository, \nGit memiliki area yang disebut stash di mana kita dapat menyimpan \nsementara perubahan yang kita buat tanpa melakukan commit ke repository. Ini berguna dalam situasi kita sedang melakukan perubahan pada kode, \ndan belum siap untuk…","html":"

Selain working area, staging dan repository,\nGit memiliki area yang disebut stash di mana kita dapat menyimpan\nsementara perubahan yang kita buat tanpa melakukan commit ke repository.

\n

Ini berguna dalam situasi kita sedang melakukan perubahan pada kode,\ndan belum siap untuk melakukan commit, namun kita perlu berpindah ke branch lain.

\n

Stash Perubahan

\n

Untuk menyimpan perubahan kita ke stash, gunakan perintah

\n
git stash save \"pesan stash\"
\n

Perintah tersebut akan menyimpan perubahan dan mengembalikan (revert) working directory\nke posisi commit terakhir. Perubahan yang tersimpan di stash dapat diakses dari branch manapun\ndalam satu repository.

\n

Melihat Perubahan dalam Stash

\n

Untuk melihat perubahan yang tersimpan dalam stash, gunakan perintah

\n
git stash list
\n

Perintah di atas akan mengembalikan daftar stash yang tersimpan dalam format

\n
stash@{0}: NAMA-BRANCH: PESAN
\n

stash@{0} adalah nama dari stash, nomor dalam kurung {0} adalah index dari stash.\nNama dan index tersebut digunakan untuk memilih stash yang akan kita terapkan.

\n

Mengambil Perubahan dalam Stash

\n

Untuk mengambil perubahan yang tersimpan di dalam stash ke branch yang sedang aktif,\ngunakan perintah berikut

\n
# terapkan perubahan dari stash ke branch aktif\ngit stash apply NAMA-STASH\n\n# terapkan perubahan dan hapus file dari stash\ngit stash pop NAMA-STASH
\n

Ketika menerapkan perubahan dari stash ada kemungkinan terjadi konflik,\nuntuk menyelesaikannya sama seperti dalam kasus konflik merge.

\n

Menghapus Perubahan dalam Stash

\n

Untuk menghapus perubahan dari daftar stash, jika kita sudah tidak lagi membutuhkannya,\ngunakan perintah berikut:

\n
# menghapus stash yang dipilih\ngit stash drop NAMA-STASH\n\n# menghapus semua stash\ngit stash clear
\n

Sumber https://www.freecodecamp.org/news/git-stash-explained/

","frontmatter":{"title":"Menggunakan Git Stash","date":"November 18, 2021"}}},"pageContext":{"slug":"/2021/11/menggunakan-git-stash/","previous":{"fields":{"slug":"/2021/10/menghapus-git-branch-local-dan-remote/"},"frontmatter":{"title":"Menghapus Git Branch Local dan Remote"}},"next":{"fields":{"slug":"/2022/01/menggunakan-dua-profil-git/"},"frontmatter":{"title":"Menggunakan Dua Profil Git"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2022/01/menggunakan-dua-profil-git/page-data.json b/page-data/2022/01/menggunakan-dua-profil-git/page-data.json new file mode 100644 index 00000000..71ab10ff --- /dev/null +++ b/page-data/2022/01/menggunakan-dua-profil-git/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2022/01/menggunakan-dua-profil-git/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"b9cf3341-6f1d-5f2b-910b-c709cbe2bfc9","excerpt":"Bayangkan situasi ini, kita memiliki dua akun git. Satu akun untuk repo perusahaan tempat kita bekerja \ndan satunya lagi akun git pribadi. Kita akan memerlukan dua profil yang berbeda untuk mengakses masing-masing repo. Tentu kita bisa mengeset konfigurasi pada masing-masing repo…","html":"

Bayangkan situasi ini, kita memiliki dua akun git. Satu akun untuk repo perusahaan tempat kita bekerja\ndan satunya lagi akun git pribadi. Kita akan memerlukan dua profil yang berbeda untuk mengakses masing-masing repo.

\n

Tentu kita bisa mengeset konfigurasi pada masing-masing repo setiap kali kita git init/clone.\nTapi itu akan membuat kita melakukannya berkali-kali jika kita memiliki banyak repo.\nTujuan tulisan ini adalah untuk mengeset config secara global dan membuat profilnya menyesuaikan kebutuhan akses kita.

\n

File Konfigurasi Git (.gitconfig)

\n

Konfigurasi Git disimpan pada file .gitconfig yang biasanya tersimpan di folder home.\nFile ini adalah titik awal bagi Git untuk mengidentifikasi konfigurasi apa yang akan digunakan.

\n

Jika kita pernah melakukan konfigurasi Git user secara global (git config –global user.name)\nmaka kemungkinan isi dari file .gitconfig akan terlihat seperti ini.

\n
[user]\n  name = username\n  email = email@example.com
\n

Artinya ketika melakukan commit di repo apapun maka profil tersebut yang akan digunakan.

\n

Tujuan kita adalah memiliki dua profil berbeda yang akan di-load sesuai dengan repo kita, apakah itu repo kantor atau pribadi.\nCaranya adalah dengan memisahkan repo kita menjadi beberapa direktori sesuai dengan profil yang kita inginkan, kemudian mendefinisikan file .gitconfig untuk setiap profil.

\n

1 - Buat Direktori Terpisah untuk Masing-masing Repo

\n

Atur repo proyek yang sedang kita kerjakan ke dalam folder terpisah.\nSebagai contoh, katakanlah ada dua profil Git yang kita miliki.\nIni adalah kasus penggunaan umum bagi kebanyakan dari kita:

\n

WORK → untuk proyek terkait pekerjaan
\nPERSONAL → untuk proyek pribadi (open source atau proyek sampingan)

\n

2 - Edit Konfigurasi Global Git

\n

Edit file .gitconfig global atau buat di direktori home jika belum ada. Jangan lupa buat backup file .gitconfig jika ingin tetap menyimpan konfigurasi lama. Setelah itu tambahkan semua direktori profil sebagai entri seperti pada contoh di bawah ini.

\n
# ~/.gitconfig\n\n[includeIf \"gitdir:~/personal/\"]\n   path = ~/.gitconfig-personal\n[includeIf \"gitdir:~/work/\"]\n   path = ~/.gitconfig-work
\n

Script tersebut akan membuat sebuah kondisi, jika path direktori git tempat menyimpan proyek cocok dengan salah satu path di includeIF, maka Git menggunakan file konfigurasi profil tersebut. Jika tidak, ia akan menggunakan konfigurasi default.

\n

3 - Buat Konfigurasi Git untuk Masing-Masing Profil

\n

Buat file .gitconfig-personal dan .gitconfig-work yang sudah kita definisikan di file .gitconfig global. Masing-masing file ini dapat berisi semua konfigurasi yang kita butuhkan, mulai dari username dan email hingga commit hook.

\n
# ~/.gitconfig-work\n\n[user]\n  nama = work_user\n  email = email_kerja\n\n# ~/.gitconfig-personal\n\n[user]\n  name = personal_user\n  email = personal_email
\n

Cek Perubahannya

\n

Seharusnya sekarang kita sudah memiliki 3 file git config.

\n
➜  ~ l | grep 'git*'  \n-rw-rw-r--  1 user   staff    116 Apr  3 12:31 .gitconfig\n-rw-rw-r--  1 user   staff     50 Mar 26 18:22 .gitconfig-personal\n-rw-rw-r--  1 user   staff     52 Mar 26 18:21 .gitconfig-work
\n

Sekarang kita buat direktori work dan personal, buat repo baru atau clone repo di dalam folder tersebut.\nSebagai contoh kita akan melihat konfigurasi yang digunakan pada direktori personal.

\n
$ cd ~/personal\n$ mkdir personal-test-repo\n$ cd personal-test-repo\n$ git init\n$ git config -l\n\n# script menggunakan (include) file .gitconfig personal\n# dan mengabaikan konfigurasi work\n# karena proyek berada di direktori personal\n\nincludeif.gitdir:~/project/.path=~/.gitconfig-personal\nuser.name=mmdmthr\nuser.email=muhhari@gmail.com\nincludeif.gitdir:~/dev/.path=~/.gitconfig-work\ncore.repositoryformatversion=0\ncore.filemode=true\ncore.bare=false\ncore.logallrefupdates=true
\n

Seperti yang terlihat, email dan username berbeda di kedua direktori sesuai dengan path di mana git berada.

\n

Sumber https://www.freecodecamp.org/news/how-to-handle-multiple-git-configurations-in-one-machine/

","frontmatter":{"title":"Menggunakan Dua Profil Git","date":"January 18, 2022"}}},"pageContext":{"slug":"/2022/01/menggunakan-dua-profil-git/","previous":{"fields":{"slug":"/2021/11/menggunakan-git-stash/"},"frontmatter":{"title":"Menggunakan Git Stash"}},"next":{"fields":{"slug":"/2022/02/melihat-raw-query-database-eloquent-laravel/"},"frontmatter":{"title":"Melihat Raw Query Database Eloquent Laravel"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2022/02/melihat-raw-query-database-eloquent-laravel/page-data.json b/page-data/2022/02/melihat-raw-query-database-eloquent-laravel/page-data.json new file mode 100644 index 00000000..2635cf71 --- /dev/null +++ b/page-data/2022/02/melihat-raw-query-database-eloquent-laravel/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2022/02/melihat-raw-query-database-eloquent-laravel/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"0f607fe2-291b-58c2-bafd-8c10320c4744","excerpt":"Ada kalanya kita perlu melakukan debuging pada query eloquent, \nmungkin saat menemukan query model yang kita buat tidak menampilkan data sesuai ekspektasi. \nKita bisa melihat query apa yang dibuat saat menjalankan model eloquent. Menggunakan Laravel Eloquent Method Eloquent…","html":"

Ada kalanya kita perlu melakukan debuging pada query eloquent,\nmungkin saat menemukan query model yang kita buat tidak menampilkan data sesuai ekspektasi.\nKita bisa melihat query apa yang dibuat saat menjalankan model eloquent.

\n

Menggunakan Laravel Eloquent Method

\n

Eloquent menyediakan method yang mengembalikan string query tanpa menjalankannya yaitu method toSql().\nIni sesuai jika kita hanya ingin melihat query saja tanpa ingin mengubah data –\ntetapi cara ini tidak menampilkan seluruh kueri jika kuerinya lebih kompleks atau jika memiliki subkueri.

\n

Contoh Kode

\n
App\\User::query()\n    ->where('created_at', '<', now()->subYear())\n    ->with('assignedApps', 'courses')\n    ->orderBy('email', 'asc')\n    ->limit(5)\n    ->toSql();
\n

Output

\n
select * from `users` where `created_at` < ? order by `email` asc limit 5
\n

Menggunakan Laravel Query Log

\n

Aktifkan log query untuk menangkap query yang dijalankan, perlu diperhatikan bahwa\nquery log akan menangkap query yang dijalankan oleh model. Ini berarti query sudah\nselesai dijalankan di database. Cara untuk mengaktifkan log dilakukan menggunakan.

\n

DB::connection()->enableQueryLog();

\n

Setelah itu kita dapat melihat query yang dijalankan menggunakan\nkode di bawah ini

\n

$queries = DB::getQueryLog();

\n

jika ingin melihat query yang terakhir dieksekusi

\n

$last_query = end($queries);

\n

Contoh

\n
public function show(Order $order){\n    // aktifkan query log\n    \\DB::connection()->enableQueryLog();\n\n    // jalankan model\n    $data = $order->all();\n\n    // tangkap query\n    $queries = \\DB::getQueryLog();\n    return dd($queries);\n}
\n

Sumber:
\nhttps://beyondco.de/blog/how-to-get-the-raw-sql-query-from-the-laravel-query-builder
\nhttps://stackoverflow.com/questions/41140975/laravel-eloquent-display-query-log

","frontmatter":{"title":"Melihat Raw Query Database Eloquent Laravel","date":"February 25, 2022"}}},"pageContext":{"slug":"/2022/02/melihat-raw-query-database-eloquent-laravel/","previous":{"fields":{"slug":"/2022/01/menggunakan-dua-profil-git/"},"frontmatter":{"title":"Menggunakan Dua Profil Git"}},"next":{"fields":{"slug":"/2022/04/membuat-template-email-di-gmail/"},"frontmatter":{"title":"Membuat Template Email di Gmail"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2022/03/alur-kerja-menggunakan-git/page-data.json b/page-data/2022/03/alur-kerja-menggunakan-git/page-data.json new file mode 100644 index 00000000..cee813a2 --- /dev/null +++ b/page-data/2022/03/alur-kerja-menggunakan-git/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2022/03/alur-kerja-menggunakan-git/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"be080466-9833-539c-ab3d-7e2c59e5bcf6","excerpt":"Memahami Tiga Bagian dari Proyek Git Proyek Git memiliki tiga bagian utama berikut: Direktori git Direktori kerja (working directory/working tree/repositori) Area staging Direktori Git Direktori Git (terletak di ) adalah tempat Git menyimpan semua yang dibutuhkan untuk melacak…","html":"

Memahami Tiga Bagian dari Proyek Git

\n

Proyek Git memiliki tiga bagian utama berikut:

\n
    \n
  1. Direktori git
  2. \n
  3. Direktori kerja (working directory/working tree/repositori)
  4. \n
  5. Area staging
  6. \n
\n

Direktori Git

\n

Direktori Git (terletak di YOUR-PROJECT-PATH/.git/) adalah tempat Git menyimpan semua yang dibutuhkan untuk melacak proyek secara akurat. Ini termasuk metadata dan database objek yang mencakup versi terkompresi dari file proyek.

\n

Direktori kerja

\n

Direktori kerja adalah tempat pengguna membuat perubahan lokal pada sebuah proyek. Direktori kerja menarik file proyek dari database objek direktori Git dan menempatkannya di mesin lokal pengguna.

\n

Catatan: Direktori juga dikenal sebagai Repositori atau disingkat repo. Repo di mesin lokal pengguna disebut “Repo lokal” sedangkan repo di server git (misalnya GitHub/GitLab) disebut “Remote Repo” (Repo jarak jauh).

\n

Area Staging

\n

Area staging adalah file (juga disebut “indeks”, “stage”, atau “cache”) yang menyimpan informasi tentang apa yang akan masuk ke commit kita berikutnya. Commit adalah saat kita memberi tahu Git untuk menyimpan perubahan tahap ini (perubahan yang sudah dimasukkan dalam staging area). Git mengambil snapshot dari file sebagaimana adanya dan secara permanen menyimpan snapshot tersebut di direktori Git.

\n

Dengan tiga bagian di atas, file yang sedang kita kerjakan akan memiliki tiga jenis status yang berbeda tergantung di mana file tersebut berada pada waktu tertentu: created/modified/deleted, staged atau committed. Saat kita mulai bekerja di dalam working directory seperti membuat file baru, menghapusnya atau hanya membuat perubahan pada sebuah file di working direktori, itu semua akan dicatat oleh git (status akan berubah dengan created/modified/deleted). Selanjutnya, kita bisa memindahkan file yang kita inginkan untuk commit ke area staging (status staged). Akhirnya setelah kita merasa yakin dengan perubahan yang dibuat, kita bisa melakukan commit.

\n

Sumber: The Ultimate Guide to Git Reset and Git Revert

","frontmatter":{"title":"Alur Kerja Menggunakan Git","date":"May 16, 2022"}}},"pageContext":{"slug":"/2022/03/alur-kerja-menggunakan-git/","previous":{"fields":{"slug":"/2022/05/dconf-editor/"},"frontmatter":{"title":"Dconf Editor"}},"next":{"fields":{"slug":"/2022/06/perbedaan-git-reset-dan-git-revert/"},"frontmatter":{"title":"Perbedaan Git Reset dan Git Revert"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2022/04/membuat-template-email-di-gmail/page-data.json b/page-data/2022/04/membuat-template-email-di-gmail/page-data.json new file mode 100644 index 00000000..5d566cc0 --- /dev/null +++ b/page-data/2022/04/membuat-template-email-di-gmail/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2022/04/membuat-template-email-di-gmail/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"e047c91b-4b99-5183-841d-392cb61d436c","excerpt":"Kita mungkin pernah mengalami harus mengetik email yang sama berulang kali, dalam kasus saya mengirim email cuti. Di Gmail kita dapat menulis email satu kali, lalu menyimpan email tersebut sebagai template. Kita juga dapat menyertakan tanda tangan. Dengan begitu, kita dapat…","html":"

Kita mungkin pernah mengalami harus mengetik email yang sama berulang kali, dalam kasus saya mengirim email cuti. Di Gmail kita dapat menulis email satu kali, lalu menyimpan email tersebut sebagai template. Kita juga dapat menyertakan tanda tangan. Dengan begitu, kita dapat membuka template dan mengirimnya lagi hanya dengan beberapa klik. Begini cara untuk membuat template email di Gmail.

\n

Catatan: Template email hanya tersedia di Gmail web. Template tidak tersedia di aplikasi seluler Gmail.

\n

Mengaktifkan template

\n
    \n
  1. Buka Gmail.
  2. \n
  3. Di pojok kanan atas, klik Setelan (icon gear) lalu Lihat semua setelan (see all settings).
  4. \n
  5. Di bagian atas, klik tab Lanjutan (advanced).
  6. \n
  7. Di bagian Template, pilih Aktifkan (enable).
  8. \n
  9. Pada bagian bawah, klik Simpan Perubahan (save changes).
  10. \n
\n

Membuat template baru atau mengubah template

\n

Catatan: kita dapat membuat hingga 50 template.

\n
    \n
  1. Buka Gmail, lalu klik Tulis (compose).
  2. \n
  3. Di jendela Tulis, masukkan teks template kita.
  4. \n
  5. Klik Lainnya (icon titik tiga) lalu pilih Template.
  6. \n
  7. \n

    Pilih salah satu opsi:

    \n
      \n
    • Untuk membuat template baru, klik Simpan draf sebagai template (save draft as template), lalu Simpan sebagai template baru (save as new template).
    • \n
    • Untuk mengubah template yang disimpan sebelumnya, klik Simpan draf sebagai template (save draft as template), lalu di bawah Timpa Template (overwrite template) pilih template dan klik Simpan (save) untuk menimpanya.
    • \n
    \n
  8. \n
\n

Menyisipkan template

\n
    \n
  1. Buka Gmail, lalu klik Tulis.
  2. \n
  3. Klik Lainnya (icon titik tiga) lalu pilih Template.
  4. \n
  5. Untuk menyisipkan template, pada Sisipkan template (insert template), pilih template tersimpan yang ingin dimasukkan ke dalam email.
  6. \n
  7. Tulis isi pesan seperti biasa dan klik Kirim.
  8. \n
\n

Menghapus template

\n
    \n
  1. Buka Gmail lalu klik Tulis.
  2. \n
  3. Klik Lainnya (icon titik tiga) lalu pilih Template.
  4. \n
  5. Untuk menghapus template pesan, klik Hapus template, pilih template yang ingin dihapus, lalu klik Hapus.
  6. \n
\n

Sumber Create email templates

","frontmatter":{"title":"Membuat Template Email di Gmail","date":"April 14, 2022"}}},"pageContext":{"slug":"/2022/04/membuat-template-email-di-gmail/","previous":{"fields":{"slug":"/2022/02/melihat-raw-query-database-eloquent-laravel/"},"frontmatter":{"title":"Melihat Raw Query Database Eloquent Laravel"}},"next":{"fields":{"slug":"/2022/05/dconf-editor/"},"frontmatter":{"title":"Dconf Editor"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2022/05/dconf-editor/page-data.json b/page-data/2022/05/dconf-editor/page-data.json new file mode 100644 index 00000000..b79105d9 --- /dev/null +++ b/page-data/2022/05/dconf-editor/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2022/05/dconf-editor/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"26bab873-caa4-58b1-be8a-366bab59b36c","excerpt":"Dconf-editor memungkinkan kita untuk mengubah hampir setiap aspek lingkungan desktop GNOME. Namun kita harus berhati-hati dalam mengedit. Sebagian besar pengaturan dapat diubah dengan cepat, tanpa memerlukan konfirmasi. Antar muka dconf-editor sangat sederhana, kita bisa…","html":"

Dconf-editor memungkinkan kita untuk mengubah hampir setiap aspek lingkungan desktop GNOME. Namun kita harus berhati-hati dalam mengedit. Sebagian besar pengaturan dapat diubah dengan cepat, tanpa memerlukan konfirmasi.

\n

Antar muka dconf-editor sangat sederhana, kita bisa melakukan pencarian berdasarkan kata kunci lalu akan diarahkan ke file konfigurasi yang berkaitan, dari situ kita bisa mengubah konfigurasinya langsung.

\n

Berikut perintah untuk menginstall dconf-editor:

\n
# update repository\napt-get update\n\n# install dconf-editor\napt-get install dconf-editor -y
\n

Beberapa hal yang saya ubah menggunakan dconf-editor adalah melakukan pengaturan pada dash to dock dan menonaktifkan notifikasi kalender

\n

Untuk mengetahui lebih lanjut mengenai dconf-editor

\n

Catatan: Meskipun kita dapat melakukan reset pada perubahan yang kita buat, namun ada risiko setting yang kita buat mengakibatkan sistem bekerja tidak seperti keinginan kita, sehingga akan sulit untuk mengembalikannya ke keadaan semula.

\n

Untuk alasan ini, disarankan untuk tidak bermain-main dengan dconf-editor, khususnya jika kita tidak suka menghabiskan waktu untuk melakukan trouble shooting dan memperbaiki error atau jika kita tidak terlalu familiar dengan Linux dan GNOME.

","frontmatter":{"title":"Dconf Editor","date":"May 05, 2022"}}},"pageContext":{"slug":"/2022/05/dconf-editor/","previous":{"fields":{"slug":"/2022/04/membuat-template-email-di-gmail/"},"frontmatter":{"title":"Membuat Template Email di Gmail"}},"next":{"fields":{"slug":"/2022/03/alur-kerja-menggunakan-git/"},"frontmatter":{"title":"Alur Kerja Menggunakan Git"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2022/06/perbedaan-git-reset-dan-git-revert/page-data.json b/page-data/2022/06/perbedaan-git-reset-dan-git-revert/page-data.json new file mode 100644 index 00000000..3cd7d6b8 --- /dev/null +++ b/page-data/2022/06/perbedaan-git-reset-dan-git-revert/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2022/06/perbedaan-git-reset-dan-git-revert/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"4bd47137-a978-5874-a9e7-327d33c69fea","excerpt":"TL;DR membatalkan commit sebelumnya dengan cara menulis ulang riwayat commit (commit history). Sementara bekerja dengan cara membuat commit baru untuk membatalkan perubahan yang dibuat oleh commit sebelumnya, tanpa mengubah riwayat commit. Untuk memahami alur kerja git, ada…","html":"

TL;DR

\n
\n

git reset membatalkan commit sebelumnya dengan cara menulis ulang riwayat commit (commit history). Sementara git revert bekerja dengan cara membuat commit baru untuk membatalkan perubahan yang dibuat oleh commit sebelumnya, tanpa mengubah riwayat commit.

\n
\n

Untuk memahami alur kerja git, ada baiknya membaca artikel ini

\n

Git Reset

\n

Perintah git reset memungkinkan kita untuk MENGATUR ULANG posisi HEAD saat ini ke keadaan tertentu. Kita dapat mengatur ulang status file tertentu atau seluruh branch. Perintah ini berguna jika perubahan yang kita buat masih berada di repo lokal dan belum melakukan push commit ke GitHub atau repositori remote lainnya.

\n

Reset sebuah file atau beberapa file

\n

Perintah berikut memungkinkan kita memilih potongan konten dan mengembalikan atau menghapusnya.

\n
git reset (--patch | -p) [tree-ish] [--] [paths]
\n

Menghapus file dari staging area (unstage)

\n

Jika kita menambahkan file ke area staging dengan git add, tetapi ternyata kita tidak lagi menginginkannya menjadi bagian dari commit, kita dapat menggunakan git reset untuk menghapus file tersebut dari area staging:

\n
git reset HEAD FILE-YANG-INGIN-DI-UNSTAGE
\n

Perintah ini hanya menghapus file itu dari staging area, perubahan yang kita buat akan tetap ada di file.

\n

Reset branch ke commit sebelumnya

\n

Perintah berikut mengatur ulang HEAD branch kita saat ini ke COMMIT yang ditentukan dan memperbarui index. Ini pada dasarnya memundurkan status branch kita, lalu semua commit yang kita buat setelah itu akan menimpa commit-commit yang dibuat setelah titik reset. Jika kita menghilangkan MODE, defaultnya adalah --mixed:

\n
git reset MODE COMMIT-HASH
\n

Pilihan untuk MODE adalah:

\n
    \n
  • --soft: tidak mengatur ulang file indeks atau working tree, tetapi mengatur ulang HEAD ke commit yang diinginkan. Mengubah semua status file menjadi “Perubahan yang akan di-commit”
  • \n
  • --mixed: mengatur ulang indeks tetapi bukan working tree dan memberikan laporan perubahan apa saja yang belum diperbarui
  • \n
  • --hard: mengatur ulang indeks dan working tree. Setiap perubahan pada file yang direkam di working tree sejak melakukan commit akan dibatalkan.
  • \n
  • --merge: mengatur ulang indeks dan memperbarui file di working tree yang berbeda antara commit dan HEAD, tetapi menyimpan yang berbeda antara indeks dan working tree
  • \n
  • --keep: mengatur ulang entri indeks dan memperbarui file di working tree yang berbeda antara commit dan HEAD. Jika file yang berbeda antara commit dan HEAD memiliki perubahan lokal, reset dibatalkan
  • \n
\n

Catatan Penting Tentang Hard Reset

\n

Berhati-hatilah saat menggunakan git reset dengan opsi --hard karena perintah ini mengatur ulang riwayat commit, area staging, dan direktori kerja kita. Jika opsi ini tidak digunakan dengan benar, dapat berisiko kehilangan file atau perubahan yang sudah kita buat.

\n

Git Revert

\n

Perintah git revert dan git reset sama-sama membatalkan commit sebelumnya. Tetapi jika kita telah melakukan push commit ke repositori remote, kita disarankan untuk tidak menggunakan git reset karena ia menulis ulang riwayat commit. Efek dari perubahan riwayat commit ini dapat membuat rekan kita yang masih bekerja dengan riwayat commit yang lama tidak dapat melakukan push ke repositori remote karena git mendeteksi dua riwayat commit yang berbeda.

\n

Alih-alih, lebih baik menggunakan git revert, yang membatalkan perubahan yang dibuat oleh commit sebelumnya dengan membuat commit yang baru, semua tanpa mengubah riwayat commit.

\n

Revert sebuah commit atau beberapa commit sekaligus

\n

Perintah berikut memungkinkan kita mengembalikan perubahan dari commit atau commit sebelumnya dan membuat commit baru.

\n
git revert [--[no-]edit] [-n] [-m parent-number] [-s] [-S[<keyid>]] <commit>…\ngit revert --continue\ngit revert --quit\ngit revert --abort
\n

Opsi umum:

\n
  -e\n  --edit
\n
    \n
  • Ini adalah opsi default dan tidak perlu diatur secara eksplisit. Ini membuka editor teks default sistem kita dan memungkinkan kita mengedit pesan commit baru sebelum melakukan revert.
  • \n
  • Opsi ini melakukan kebalikan dari -e, dan git revert tidak akan membuka editor teks.
  • \n
  • Opsi ini mencegah git revert membatalkan commit sebelumnya dan membuat commit baru. Daripada membuat commit baru, -n akan membatalkan perubahan dari commit sebelumnya dan menambahkannya ke Indeks Staging dan Direktori Kerja.
  • \n
\n
--no-edit\n-n\n-no-commit
\n

Sumber: The Ultimate Guide to Git Reset and Git Revert

","frontmatter":{"title":"Perbedaan Git Reset dan Git Revert","date":"June 26, 2022"}}},"pageContext":{"slug":"/2022/06/perbedaan-git-reset-dan-git-revert/","previous":{"fields":{"slug":"/2022/03/alur-kerja-menggunakan-git/"},"frontmatter":{"title":"Alur Kerja Menggunakan Git"}},"next":{"fields":{"slug":"/2022/07/cara-berkomunikasi-dalam-tim/"},"frontmatter":{"title":"Cara Berkomunikasi dalam Tim"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2022/07/cara-berkomunikasi-dalam-tim/page-data.json b/page-data/2022/07/cara-berkomunikasi-dalam-tim/page-data.json new file mode 100644 index 00000000..85951759 --- /dev/null +++ b/page-data/2022/07/cara-berkomunikasi-dalam-tim/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2022/07/cara-berkomunikasi-dalam-tim/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"81fc4da4-3581-55b5-87ae-71319d8c29a1","excerpt":"Sebaik apapun pemahaman kita tentang suatu masalah atau sebuah situasi, ketika kita mendiskusikannya dengan orang lain, kita harus menyesuaikan kata-kata kita sehingga mereka dapat dengan cepat memahami apa yang relevan bagi mereka: Ketika berbicara dengan orang bisnis, bicarakan…","html":"

Sebaik apapun pemahaman kita tentang suatu masalah atau sebuah situasi, ketika kita mendiskusikannya dengan orang lain, kita harus menyesuaikan kata-kata kita sehingga mereka dapat dengan cepat memahami apa yang relevan bagi mereka:

\n
    \n
  1. Ketika berbicara dengan orang bisnis, bicarakan tentang dampak bisnis dari apa yang kita lakukan. Hindari menggunakan jargon yang terlalu teknis.
  2. \n
  3. Saat berbicara dengan manajemen teknik, komunikasikan dampak atau tantangan teknisnya.
  4. \n
  5. Saat berbicara dengan pembuat keputusan, jelaskan opsi yang tersedia serta implikasi dan risikonya, bukan detail tentang bagaimana cara kerja opsi tersebut.
  6. \n
  7. Saat memberikan pembaruan status, perhatikan apa lagi yang telah terjadi dan bagaimana pembaruan yang kita buat relevan dengan tujuan proyek.
  8. \n
\n

Dikutip dari tulisan Addy Osmani, Software Engineering - The Soft Parts

","frontmatter":{"title":"Cara Berkomunikasi dalam Tim","date":"July 15, 2022"}}},"pageContext":{"slug":"/2022/07/cara-berkomunikasi-dalam-tim/","previous":{"fields":{"slug":"/2022/06/perbedaan-git-reset-dan-git-revert/"},"frontmatter":{"title":"Perbedaan Git Reset dan Git Revert"}},"next":{"fields":{"slug":"/2022/07/php-truthy-falsy-value/"},"frontmatter":{"title":"PHP Truthy dan Falsy Value"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2022/07/contoh-api-contract/page-data.json b/page-data/2022/07/contoh-api-contract/page-data.json new file mode 100644 index 00000000..d6af42a2 --- /dev/null +++ b/page-data/2022/07/contoh-api-contract/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2022/07/contoh-api-contract/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"5daab9f5-dff4-5956-8daa-38990fdaec79","excerpt":"Ketika membuat API, kita perlu menuliskan dokumen yang mendeskripsikan apa yang dilakukan API kita dan \nbagaimana API tersebut bekerja. Dokumen tersebut biasa disebut dengan API contract. \nAPI contract akan memudahkan pengguna ketika melakukan integrasi terhadap API kita. Tidak…","html":"

Ketika membuat API, kita perlu menuliskan dokumen yang mendeskripsikan apa yang dilakukan API kita dan\nbagaimana API tersebut bekerja. Dokumen tersebut biasa disebut dengan API contract.\nAPI contract akan memudahkan pengguna ketika melakukan integrasi terhadap API kita.

\n

Tidak ada bentuk baku dalam menyusun dokumen API contract. Yang terpenting dokumen tersebut memberikan informasi\nyang tepat mengenai API. Kerangkanya bisa meliputi nama versi, endpoint, HTTP method, dan parameter/payload yang dapat digunakan.\nKita dapat membuat dokumen API ini dengan peralatan yang tersedia, misalnya Swagger

\n

Berikut salah satu contoh dokumen API contract:

\n

Users

\n
    \n
  • \n

    User object

    \n
    {\nid: integer\nusername: string\nemail: string\ncreated_at: datetime(iso 8601)\nupdated_at: datetime(iso 8601)\n}
    \n

    GET /users

    \n

    Returns all users in the system.

    \n
  • \n
  • URL Params
    \nNone
  • \n
  • Data Params
    \nNone
  • \n
  • Headers
    \nContent-Type: application/json
  • \n
  • Success Response:
  • \n
  • \n

    Code: 200
    \nContent:

    \n
    {\nusers: [\n       {<user_object>},\n       {<user_object>},\n       {<user_object>}\n     ]\n}
    \n
  • \n
\n

GET /users/:id

\n

Returns the specified user.

\n
    \n
  • URL Params
    \nRequired: id=[integer]
  • \n
  • Data Params
    \nNone
  • \n
  • Headers
    \nContent-Type: application/json
    \nAuthorization: Bearer <OAuth Token>
  • \n
  • Success Response:
  • \n
  • Code: 200
    \nContent: { <user_object> }
  • \n
  • \n

    Error Response:

    \n
      \n
    • Code: 404
      \nContent: { error : \"User doesn't exist\" }
      \nOR
    • \n
    • Code: 401
      \nContent: { error : error : \"You are unauthorized to make this request.\" }
    • \n
    \n
  • \n
\n

GET /users/:id/orders

\n

Returns all Orders associated with the specified user.

\n
    \n
  • URL Params
    \nRequired: id=[integer]
  • \n
  • Data Params
    \nNone
  • \n
  • Headers
    \nContent-Type: application/json
    \nAuthorization: Bearer <OAuth Token>
  • \n
  • Success Response:
  • \n
  • \n

    Code: 200
    \nContent:

    \n
    {\norders: [\n       {<order_object>},\n       {<order_object>},\n       {<order_object>}\n     ]\n}
    \n
  • \n
  • \n

    Error Response:

    \n
      \n
    • Code: 404
      \nContent: { error : \"User doesn't exist\" }
      \nOR
    • \n
    • Code: 401
      \nContent: { error : error : \"You are unauthorized to make this request.\" }
    • \n
    \n
  • \n
\n

POST /users

\n

Creates a new User and returns the new object.

\n
    \n
  • URL Params
    \nNone
  • \n
  • Headers
    \nContent-Type: application/json
  • \n
  • \n

    Data Params

    \n
    {\nusername: string,\nemail: string\n}
    \n
  • \n
  • Success Response:
  • \n
  • Code: 200
    \nContent: { <user_object> }
  • \n
\n

PATCH /users/:id

\n

Updates fields on the specified user and returns the updated object.

\n
    \n
  • URL Params
    \nRequired: id=[integer]
  • \n
  • \n

    Data Params

    \n
    {\n\tusername: string,\nemail: string\n}
    \n
  • \n
  • Headers
    \nContent-Type: application/json
    \nAuthorization: Bearer <OAuth Token>
  • \n
  • Success Response:
  • \n
  • Code: 200
    \nContent: { <user_object> }
  • \n
  • \n

    Error Response:

    \n
      \n
    • Code: 404
      \nContent: { error : \"User doesn't exist\" }
      \nOR
    • \n
    • Code: 401
      \nContent: { error : error : \"You are unauthorized to make this request.\" }
    • \n
    \n
  • \n
\n

DELETE /users/:id

\n

Deletes the specified user.

\n
    \n
  • URL Params
    \nRequired: id=[integer]
  • \n
  • Data Params
    \nNone
  • \n
  • Headers
    \nContent-Type: application/json
    \nAuthorization: Bearer <OAuth Token>
  • \n
  • \n

    Success Response:

    \n
      \n
    • Code: 204
    • \n
    \n
  • \n
  • \n

    Error Response:

    \n
      \n
    • Code: 404
      \nContent: { error : \"User doesn't exist\" }
      \nOR
    • \n
    • Code: 401
      \nContent: { error : error : \"You are unauthorized to make this request.\" }
    • \n
    \n
  • \n
\n

Products

\n
    \n
  • \n

    Product object

    \n
    {\nid: integer\nname: string\ncost: float(2)\navailable_quantity: integer\ncreated_at: datetime(iso 8601)\nupdated_at: datetime(iso 8601)\n}
    \n

    GET /products

    \n

    Returns all products in the system.

    \n
  • \n
  • URL Params
    \nNone
  • \n
  • Data Params
    \nNone
  • \n
  • Headers
    \nContent-Type: application/json
  • \n
  • Success Response:
  • \n
  • \n

    Code: 200
    \nContent:

    \n
    {\nproducts: [\n       {<product_object>},\n       {<product_object>},\n       {<product_object>}\n     ]\n}
    \n
  • \n
\n

GET /products/:id

\n

Returns the specified product.

\n
    \n
  • URL Params
    \nRequired: id=[integer]
  • \n
  • Data Params
    \nNone
  • \n
  • Headers
    \nContent-Type: application/json
    \nAuthorization: Bearer <OAuth Token>
  • \n
  • Success Response:
  • \n
  • Code: 200
    \nContent: { <product_object> }
  • \n
  • \n

    Error Response:

    \n
      \n
    • Code: 404
      \nContent: { error : \"Product doesn't exist\" }
      \nOR
    • \n
    • Code: 401
      \nContent: { error : error : \"You are unauthorized to make this request.\" }
    • \n
    \n
  • \n
\n

GET /products/:id/orders

\n

Returns all Orders associated with the specified product.

\n
    \n
  • URL Params
    \nRequired: id=[integer]
  • \n
  • Data Params
    \nNone
  • \n
  • Headers
    \nContent-Type: application/json
    \nAuthorization: Bearer <OAuth Token>
  • \n
  • Success Response:
  • \n
  • \n

    Code: 200
    \nContent:

    \n
    {\norders: [\n       {<order_object>},\n       {<order_object>},\n       {<order_object>}\n     ]\n}
    \n
  • \n
  • \n

    Error Response:

    \n
      \n
    • Code: 404
      \nContent: { error : \"Product doesn't exist\" }
      \nOR
    • \n
    • Code: 401
      \nContent: { error : error : \"You are unauthorized to make this request.\" }
    • \n
    \n
  • \n
\n

POST /products

\n

Creates a new Product and returns the new object.

\n
    \n
  • URL Params
    \nNone
  • \n
  • \n

    Data Params

    \n
    {\nname: string\ncost: float(2)\navailable_quantity: integer\n}
    \n
  • \n
  • Headers
    \nContent-Type: application/json
  • \n
  • Success Response:
  • \n
  • Code: 200
    \nContent: { <product_object> }
  • \n
\n

PATCH /products/:id

\n

Updates fields on the specified product and returns the updated object.

\n
    \n
  • URL Params
    \nRequired: id=[integer]
  • \n
  • \n

    Data Params

    \n
    {\n\tname: string\ncost: float(2)\navailable_quantity: integer\n}
    \n
  • \n
  • Headers
    \nContent-Type: application/json
    \nAuthorization: Bearer <OAuth Token>
  • \n
  • Success Response:
  • \n
  • Code: 200
    \nContent: { <product_object> }
  • \n
  • \n

    Error Response:

    \n
      \n
    • Code: 404
      \nContent: { error : \"Product doesn't exist\" }
      \nOR
    • \n
    • Code: 401
      \nContent: { error : error : \"You are unauthorized to make this request.\" }
    • \n
    \n
  • \n
\n

DELETE /products/:id

\n

Deletes the specified product.

\n
    \n
  • URL Params
    \nRequired: id=[integer]
  • \n
  • Data Params
    \nNone
  • \n
  • Headers
    \nContent-Type: application/json
    \nAuthorization: Bearer <OAuth Token>
  • \n
  • \n

    Success Response:

    \n
      \n
    • Code: 204
    • \n
    \n
  • \n
  • \n

    Error Response:

    \n
      \n
    • Code: 404
      \nContent: { error : \"Product doesn't exist\" }
      \nOR
    • \n
    • Code: 401
      \nContent: { error : error : \"You are unauthorized to make this request.\" }
    • \n
    \n
  • \n
\n

Orders

\n
    \n
  • \n

    Order object

    \n
    {\nid: integer\nuser_id: <user_id>\ntotal: float(2)\nproducts: [\n          { \n            product: <product_id>,\n            quantity: integer \n          },\n          { \n            product: <product_id>,\n            quantity: integer \n          },\n          { \n            product: <product_id>,\n            quantity: integer \n          },\n        ]\ncreated_at: datetime(iso 8601)\nupdated_at: datetime(iso 8601)\n}
    \n

    GET /orders

    \n

    Returns all users in the system.

    \n
  • \n
  • URL Params
    \nNone
  • \n
  • Data Params
    \nNone
  • \n
  • Headers
    \nContent-Type: application/json
  • \n
  • Success Response:
  • \n
  • \n

    Code: 200
    \nContent:

    \n
    {\norders: [\n       {<order_object>},\n       {<order_object>},\n       {<order_object>}\n     ]\n}
    \n
  • \n
\n

GET /orders/:id

\n

Returns the specified order.

\n
    \n
  • URL Params
    \nRequired: id=[integer]
  • \n
  • Data Params
    \nNone
  • \n
  • Headers
    \nContent-Type: application/json
    \nAuthorization: Bearer <OAuth Token>
  • \n
  • Success Response:
  • \n
  • Code: 200
    \nContent: { <order_object> }
  • \n
  • \n

    Error Response:

    \n
      \n
    • Code: 404
      \nContent: { error : \"Order doesn't exist\" }
      \nOR
    • \n
    • Code: 401
      \nContent: { error : error : \"You are unauthorized to make this request.\" }
    • \n
    \n
  • \n
\n

GET /orders/:id/products

\n

Returns all Products associated with the specified order.

\n
    \n
  • URL Params
    \nRequired: id=[integer]
  • \n
  • Data Params
    \nNone
  • \n
  • Headers
    \nContent-Type: application/json
    \nAuthorization: Bearer <OAuth Token>
  • \n
  • Success Response:
  • \n
  • \n

    Code: 200
    \nContent:

    \n
    {\nproducts: [\n       {<product_object>},\n       {<product_object>},\n       {<product_object>}\n     ]\n}
    \n
  • \n
  • \n

    Error Response:

    \n
      \n
    • Code: 404
      \nContent: { error : \"Order doesn't exist\" }
      \nOR
    • \n
    • Code: 401
      \nContent: { error : error : \"You are unauthorized to make this request.\" }
    • \n
    \n
  • \n
\n

GET /orders/:id/user

\n

Returns all Users associated with the specified order.

\n
    \n
  • URL Params
    \nRequired: id=[integer]
  • \n
  • Data Params
    \nNone
  • \n
  • Headers
    \nContent-Type: application/json
    \nAuthorization: Bearer <OAuth Token>
  • \n
  • Success Response: { <user_object> }
  • \n
  • \n

    Error Response:

    \n
      \n
    • Code: 404
      \nContent: { error : \"Order doesn't exist\" }
      \nOR
    • \n
    • Code: 401
      \nContent: { error : error : \"You are unauthorized to make this request.\" }
    • \n
    \n
  • \n
\n

POST /orders

\n

Creates a new Order and returns the new object.

\n
    \n
  • URL Params
    \nNone
  • \n
  • \n

    Data Params

    \n
    {\n\tuser_id: <user_id>\n\tproduct: <product_id>,\n\tquantity: integer \n}
    \n
  • \n
  • Headers
    \nContent-Type: application/json
  • \n
  • Success Response:
  • \n
  • Code: 200
    \nContent: { <order_object> }
  • \n
\n

PATCH /orders/:id

\n

Updates fields on the specified order and returns the updated object.

\n
    \n
  • URL Params
    \nRequired: id=[integer]
  • \n
  • \n

    Data Params

    \n
    {\n\tproduct: <product_id>,\n\tquantity: integer \n}
    \n
  • \n
  • Headers
    \nContent-Type: application/json
    \nAuthorization: Bearer <OAuth Token>
  • \n
  • Success Response:
  • \n
  • Code: 200
    \nContent: { <order_object> }
  • \n
  • \n

    Error Response:

    \n
      \n
    • Code: 404
      \nContent: { error : \"Order doesn't exist\" }
      \nOR
    • \n
    • Code: 401
      \nContent: { error : error : \"You are unauthorized to make this request.\" }
    • \n
    \n
  • \n
\n

DELETE /orders/:id

\n

Deletes the specified order.

\n
    \n
  • URL Params
    \nRequired: id=[integer]
  • \n
  • Data Params
    \nNone
  • \n
  • Headers
    \nContent-Type: application/json
    \nAuthorization: Bearer <OAuth Token>
  • \n
  • \n

    Success Response:

    \n
      \n
    • Code: 204
    • \n
    \n
  • \n
  • \n

    Error Response:

    \n
      \n
    • Code: 404
      \nContent: { error : \"Order doesn't exist\" }
      \nOR
    • \n
    • Code: 401
      \nContent: { error : error : \"You are unauthorized to make this request.\" }
    • \n
    \n

    Sumber: https://gist.github.com/BeattieM/324063512d166122ba5c

    \n
  • \n
","frontmatter":{"title":"Contoh API Contract","date":"August 01, 2022"}}},"pageContext":{"slug":"/2022/07/contoh-api-contract/","previous":{"fields":{"slug":"/2022/08/first-rule-dalam-testing/"},"frontmatter":{"title":"Aturan FIRST dalam Clean Test"}},"next":{"fields":{"slug":"/2022/08/search-di-vim/"},"frontmatter":{"title":"Search di Vim"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2022/07/php-truthy-falsy-value/page-data.json b/page-data/2022/07/php-truthy-falsy-value/page-data.json new file mode 100644 index 00000000..7fe29d96 --- /dev/null +++ b/page-data/2022/07/php-truthy-falsy-value/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2022/07/php-truthy-falsy-value/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"2d05edd6-4488-54ef-a92a-2b051c09b2ae","excerpt":"Saat kita menggunakan nilai non-boolean dalam konteks boolean, misalnya untuk kondisi pada pernyataan . \nPHP mengevaluasi nilai tersebut menjadi nilai boolean. Nilai-nilai berikut dievaluasi menjadi : Kata kunci Bilangan bulat nol Angka desimal nol dan String kosong dan…","html":"

Saat kita menggunakan nilai non-boolean dalam konteks boolean, misalnya untuk kondisi pada pernyataan if.\nPHP mengevaluasi nilai tersebut menjadi nilai boolean. Nilai-nilai berikut dievaluasi menjadi false:

\n
    \n
  • Kata kunci false
  • \n
  • Bilangan bulat nol 0
  • \n
  • Angka desimal nol 0.0 dan -0.0
  • \n
  • String kosong \"\" dan string \"0\"
  • \n
  • Nilai NULL
  • \n
  • Array kosong, yaitu array dengan elemen nol []
  • \n
\n

PHP mengevaluasi nilai lain menjadi true.

\n

Kita bisa melihat hasil evaluasi nilai non-boolean menjadi boolean pada PHP menggunakan cast (bool) atau (boolean)

\n
<?php\nvar_dump((bool) false);     // bool(false)\nvar_dump((bool) 0);         // bool(false)\nvar_dump((bool) 0.0);       // bool(false)\nvar_dump((bool) \"0\");       // bool(false)\nvar_dump((bool) \"\");        // bool(false)\nvar_dump((bool) array());   // bool(false)\nvar_dump((bool) 1);         // bool(true)\nvar_dump((bool) -2);        // bool(true)\nvar_dump((bool) \"foo\");     // bool(true)\nvar_dump((bool) 2.3e5);     // bool(true)\nvar_dump((bool) array(12)); // bool(true)\nvar_dump((bool) \"false\");   // bool(true)\n?>
\n

Referensi:
\nhttps://www.php.net/manual/en/language.types.boolean.php

","frontmatter":{"title":"PHP Truthy dan Falsy Value","date":"July 24, 2022"}}},"pageContext":{"slug":"/2022/07/php-truthy-falsy-value/","previous":{"fields":{"slug":"/2022/07/cara-berkomunikasi-dalam-tim/"},"frontmatter":{"title":"Cara Berkomunikasi dalam Tim"}},"next":{"fields":{"slug":"/2022/08/first-rule-dalam-testing/"},"frontmatter":{"title":"Aturan FIRST dalam Clean Test"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2022/08/first-rule-dalam-testing/page-data.json b/page-data/2022/08/first-rule-dalam-testing/page-data.json new file mode 100644 index 00000000..3b56e936 --- /dev/null +++ b/page-data/2022/08/first-rule-dalam-testing/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2022/08/first-rule-dalam-testing/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"3340e591-3767-55b6-a303-523fab542c03","excerpt":"Dalam buku Clean Code, Uncle Bob menjelaskan tentang lima aturan Clean Tests \nyang membentuk akronim FIRST: Fast (Cepat) Tes harus cepat. Mereka harus dapat dijalankan dengan cepat. Saat pengujian berjalan lambat, \nKita tidak ingin sering menjalankannya. Jika kita tidak sering…","html":"

Dalam buku Clean Code, Uncle Bob menjelaskan tentang lima aturan Clean Tests\nyang membentuk akronim FIRST:

\n

Fast (Cepat)

\n

Tes harus cepat. Mereka harus dapat dijalankan dengan cepat. Saat pengujian berjalan lambat,\nKita tidak ingin sering menjalankannya. Jika kita tidak sering menjalankannya,\nkita tidak akan menemukan masalah cukup awal untuk memperbaikinya dengan mudah.\nKita tidak akan merasa bebas untuk membersihkan kode. Akhirnya kode\nakan mulai membusuk.

\n

Independent (Mandiri)

\n

Tes tidak boleh bergantung satu sama lain. Satu tes tidak boleh mengatur kondisi untuk tes berikutnya.\nKita harus dapat menjalankan setiap pengujian secara independen dan menjalankan pengujian\ndalam urutan apa pun yang kita suka. Ketika tes bergantung satu sama lain,\nmaka tes pertama yang gagal menyebabkan serangkaian kegagalan ke hilir,\nmembuat diagnosis menjadi sulit dan menyembunyikan cacat hilir.

\n

Repeatable (Dapat diulang)

\n

Tes harus dapat diulang di lingkungan apa pun. Kita harus dapat menjalankan pengujian di lingkungan produksi,\ndi lingkungan QA, dan di laptop kita tanpa jaringan. Jika pengujian kita tidak dapat diulang di lingkungan apa pun,\nmaka kita akan selalu memiliki alasan mengapa mereka gagal. Kita juga tidak dapat menjalankan pengujian\nsaat lingkungan yang dibutuhkan tidak tersedia.

\n

Self-Validating (Memvalidasi Diri)

\n

Tes harus memiliki output boolean. Entah mereka lulus atau gagal. Kita tidak perlu membaca file log\nuntuk mengetahui apakah tes lulus. Kita tidak perlu membandingkan dua file teks yang berbeda\nsecara manual untuk melihat apakah tes lulus. Jika tes tidak memvalidasi sendiri,\nmaka kegagalan dapat menjadi subjektif dan menjalankan tes dapat memerlukan evaluasi manual yang panjang.

\n

Timely (Tepat pada Waktunya)

\n

Tes harus ditulis tepat pada waktunya. Unit test harus ditulis tepat sebelum menulis kode yang membuatnya lulus.\nJika kita menulis tes setelah menulis kode, maka kita mungkin merasa kode produksi sulit untuk diuji.\nLalu kita mungkin memutuskan bahwa beberapa kode produksi terlalu sulit untuk diuji.\nKita mungkin tidak mendesain kode produksi untuk dapat diuji.

","frontmatter":{"title":"Aturan FIRST dalam Clean Test","date":"August 01, 2022"}}},"pageContext":{"slug":"/2022/08/first-rule-dalam-testing/","previous":{"fields":{"slug":"/2022/07/php-truthy-falsy-value/"},"frontmatter":{"title":"PHP Truthy dan Falsy Value"}},"next":{"fields":{"slug":"/2022/07/contoh-api-contract/"},"frontmatter":{"title":"Contoh API Contract"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2022/08/hukum-test-driven-development/page-data.json b/page-data/2022/08/hukum-test-driven-development/page-data.json new file mode 100644 index 00000000..3a6bedb9 --- /dev/null +++ b/page-data/2022/08/hukum-test-driven-development/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2022/08/hukum-test-driven-development/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"f905fbae-e507-53da-90d4-322a6bba4110","excerpt":"Hukum Pertama Anda tidak boleh menulis kode sampai Anda telah menulis unit test yang gagal. Artinya kita harus menulis unit tes terlebih dahulu sebelum menulis kode. \nTentu saja hasil tesnya akan gagal (failing test), karena belum ada kode yang ditulis. Hukum Kedua Anda tidak…","html":"

Hukum Pertama

\n
\n

Anda tidak boleh menulis kode sampai Anda telah menulis unit test yang gagal.

\n
\n

Artinya kita harus menulis unit tes terlebih dahulu sebelum menulis kode.\nTentu saja hasil tesnya akan gagal (failing test), karena belum ada kode yang ditulis.

\n

Hukum Kedua

\n
\n

Anda tidak boleh menulis unit test lebih dari yang cukup untuk gagal.\nTidak berhasil mengkompilasi adalah gagal.

\n
\n

Pikirkan kasus yang paling sederhana, tes paling dasar yang akan membuat kode kita saat ini gagal.\nTahapan ini akan biasa disebut dengan istilah red.

\n

Hukum Ketiga

\n
\n

Anda tidak boleh menulis kode lebih dari yang cukup untuk lulus tes yang gagal saat ini.

\n
\n

Kita mulai menulis kode, hanya untuk lulus dari tes yang sudah kita buat.\nKita sama sekali tidak menambahkan kode lebih dari yang diperlukan untuk membuat tes lulus.\nTahapan kode yang berhasil pada tes ini biasa disebut dengan istilah green.

\n

Saat berada di tahap hijau (green), amati bahwa kode kita kadang kurang baik\n(karena yang paling penting adalah lulus tes dulu).\nSetelah kode berhasil lulus tes, inilah saat kita melakukan refactor,\nselalu lakukan refactor ketika tes telah lulus;\nini adalah satu-satunya cara untuk memastikan bahwa kita melakukan refactor dengan benar.\nTidak perlu memikirkan kode yang rapih dan baik atau melakukan refactor jika tes masih gagal.

\n

Manfaat TDD

\n

Dengan menggunakan TDD, kita didorong untuk memikirkan segala macam situasi,\nmembuat berbagai macam test case yang kemungkinan akan dihadapi.\nKita kemudian menulis tes untuk situasi tersebut, dan dalam prosesnya,\nmulai memahami masalahnya dengan lebih baik. Biasanya, proses ini menghasilkan pengetahuan\nyang mendalam tentang algoritma.

\n

Jika kita sudah tidak dapat lagi memikirkan tes gagal lainnya untuk ditulis,\napakah ini berarti kode kita sudah sempurna? Belum tentu, kecuali ada seperangkat aturan\nyang telah ditentukan sebelumnya. TDD tidak menjamin kode tanpa bug;\nmetode ini hanya membantu kita menulis kode yang lebih baik\nyang dapat dipahami dan dimodifikasi dengan lebih baik.

\n

Terlebih lagi, jika kita menemukan bug, akan lebih mudah untuk menulis tes\nyang mereproduksi bug tersebut. Dengan cara ini, kita dapat memastikan\nbahwa bug tidak pernah terjadi lagi - karena kita telah mengujinya!

","frontmatter":{"title":"Tiga Hukum Test Driven Development","date":"August 17, 2022"}}},"pageContext":{"slug":"/2022/08/hukum-test-driven-development/","previous":{"fields":{"slug":"/2022/08/menyingkat-perintah-git-dengan-alias/"},"frontmatter":{"title":"Menyingkat Perintah Git dengan Alias"}},"next":{"fields":{"slug":"/2022/09/update-go-di-ubuntu/"},"frontmatter":{"title":"Update Versi Go di Ubuntu"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2022/08/menyingkat-perintah-git-dengan-alias/page-data.json b/page-data/2022/08/menyingkat-perintah-git-dengan-alias/page-data.json new file mode 100644 index 00000000..2632bfec --- /dev/null +++ b/page-data/2022/08/menyingkat-perintah-git-dengan-alias/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2022/08/menyingkat-perintah-git-dengan-alias/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"c7473881-b1e3-5ca8-acef-74c455d7702e","excerpt":"Dalam pekerjaan sehari-hari saya lebih suka berinteraksi dengan git melalui perintah di command line. \nPaling tidak untuk perintah yang sering digunakan seperti commit, push, atau checkout. Namun semakin lama \nrasanya perintah-perintah tersebut terlalu panjang untuk diketik…","html":"

Dalam pekerjaan sehari-hari saya lebih suka berinteraksi dengan git melalui perintah di command line.\nPaling tidak untuk perintah yang sering digunakan seperti commit, push, atau checkout. Namun semakin lama\nrasanya perintah-perintah tersebut terlalu panjang untuk diketik. Karena itu saya membuat beberapa alias\nuntuk menulis perintah git dengan lebih singkat sehingga mempercepat pekerjaan.

\n

Cara Membuat Alias

\n

Alias memungkinkan kita untuk menetapkan kata kunci yang dapat memicu perintah yang lebih panjang.\nKita dapat mendefinisikan alias dalam file konfigurasi .bash_profile atau . bashrc .\nKarena saya menggunakan ZSH, file konfigurasinya bernama .zshrc.\nFile konfigurasi tersebut biasanya berada di direktori home. Misalnya, .zshrc saya berada di /home/user/.zshrc

\n

Alias pada bash ditulis seperti contoh berikut

\n
alias ALIAS_NAME=\"ALIAS_COMMAND\"
\n

Nama alias bisa apa saja yang kita inginkan, asalkan belum digunakan oleh perintah lain.\nMisalnya, alias di bawah ini akan membuka situs web di Chrome:

\n
alias devjurnal=\"chrome https://devjurnal.com\"
\n

Jika saya mengetik devjurnal di terminal baru, URL tersebut akan terbuka di Chrome.

\n

Menyingkat Perintah Git

\n

Commit

\n

Ini adalah perintah yang paling sering digunakan, yaitu untuk commit dan menambahkan pesan commit.

\n
alias gac=\"git add . && git commit -m\" # + pesan commit
\n

Dengan alias ini, cukup mengetik alias, ditambah pesan komit yang kita inginkan.

\n
gac \"Pesan komit saya\"
\n

Pull dan Push

\n

Melakukan push dan pull ke/dari remote repo adalah perintah umum lainnya.

\n
alias gp=\"git push\" # + remote & nama branch\nalias gl=\"git pull\" # + remote & nama branch
\n

Branch

\n

Ini adalah alias untuk bekerja dengan branch. Membuat branch baru atau checkout ke cabang lain:

\n
alias gb=\"git branch\" # + nama branch\nalias gco=\"git checkout\" # + nama branch
\n

Referensi : https://bitsofco.de/git-aliases-for-lazy-developers/

","frontmatter":{"title":"Menyingkat Perintah Git dengan Alias","date":"August 07, 2022"}}},"pageContext":{"slug":"/2022/08/menyingkat-perintah-git-dengan-alias/","previous":{"fields":{"slug":"/2022/08/search-di-vim/"},"frontmatter":{"title":"Search di Vim"}},"next":{"fields":{"slug":"/2022/08/hukum-test-driven-development/"},"frontmatter":{"title":"Tiga Hukum Test Driven Development"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2022/08/search-di-vim/page-data.json b/page-data/2022/08/search-di-vim/page-data.json new file mode 100644 index 00000000..fee2bd85 --- /dev/null +++ b/page-data/2022/08/search-di-vim/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2022/08/search-di-vim/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"83c33666-a653-596d-8d5b-c5e467612c8b","excerpt":"Kita dapat melakukan pencarian teks di Vim menggunakan (garis miring) \ndan (tanda tanya) di mode normal. Tanda garis miring untuk pencarian maju dan \nuntuk mencari mundur tekan , ketik pola pencarian lalu tekan Enter. Perintah pencarian di Vim mencari pola sebagai string…","html":"

Kita dapat melakukan pencarian teks di Vim menggunakan / (garis miring)\ndan ? (tanda tanya) di mode normal. Tanda garis miring / untuk pencarian maju dan\nuntuk mencari mundur tekan ?, ketik pola pencarian lalu tekan Enter.

\n

Perintah pencarian di Vim mencari pola sebagai string,\nbukan keseluruhan kata. Jika, misalnya, kita mencari teks “gnu”,\npencarian akan menemukan kecocokan di mana “gnu” disematkan\ndalam kata-kata yang lebih besar, seperti “cygnus” atau “magnum”.

\n

Tekan n untuk mencari hasil cocok berikutnya atau\nhuruf besar N (shift + n) untuk mencari ke arah yang berlawanan.

\n

Cari Seluruh Kata

\n

Untuk mencari seluruh kata,\nketik \\< untuk menandai awal kata, masukkan pola pencarian,\nketik \\> untuk menandai akhir kata, dan tekan Enter untuk melakukan pencarian .

\n

Misalnya, untuk mencari “gnu” kita menggunakan /\\<gnu\\>

\n

Cari Kata dengan Cursor

\n

Kita juga dapat mencari seluruh kata dengan menggerakkan kursor\nke kata dan menekan * (tanda bintang) untuk mencari maju atau # (hash)\nuntuk mencari mundur. Untuk menemukan kecocokan berikutnya tekan * atau # lagi.

\n

Histori pencarian

\n

Vim melacak semua operasi pencarian yang kita buat di sesi saat ini.\nUntuk menelusuri riwayat pencarian, tekan / atau ? dan gunakan\ntombol panah atas/bawah untuk menemukan operasi pencarian sebelumnya.\nUntuk menjalankan pencarian, cukup tekan Enter.\nKita juga dapat mengedit pola pencarian sebelum melakukan operasi.

\n

Huruf besar dan kecil

\n

Secara default, hasil pencarian Vim sensitif terhadap huruf besar/kecil;\nmencari “GNU” tidak akan cocok dengan “Gnu”.

\n

Untuk mengabaikan jenis huruf :set ignorecase atau :set ic di baris perintah Vim.\nKita juga dapat mengatur set ignore menjadi opsi default dengan menambahkan perintah\ndi file ~/.vimrc kita.

\n

Untuk mengubah kembali ke mode pencocokan huruf besar-kecil, ketik :set noignorecase atau :set noic.

\n

Cara lain untuk memaksa mengabaikan kasus adalah dengan menambahkan \\c setelah pola pencarian.\nMisalnya /Linux\\c melakukan pencarian set ignore. Huruf besar \\C setelah pola memaksa pencarian kecocokan huruf.

\n

Sumber: https://linuxize.com/post/vim-search/

","frontmatter":{"title":"Search di Vim","date":"August 02, 2022"}}},"pageContext":{"slug":"/2022/08/search-di-vim/","previous":{"fields":{"slug":"/2022/07/contoh-api-contract/"},"frontmatter":{"title":"Contoh API Contract"}},"next":{"fields":{"slug":"/2022/08/menyingkat-perintah-git-dengan-alias/"},"frontmatter":{"title":"Menyingkat Perintah Git dengan Alias"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2022/09/setting-keyboard-keychron-ubuntu/page-data.json b/page-data/2022/09/setting-keyboard-keychron-ubuntu/page-data.json new file mode 100644 index 00000000..2357501f --- /dev/null +++ b/page-data/2022/09/setting-keyboard-keychron-ubuntu/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2022/09/setting-keyboard-keychron-ubuntu/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"4bfaf7b5-7937-52de-8a20-5834a3b37b33","excerpt":"Mengatur Tombol Fn + F Keyboard Keychron di Linux menggunakan driver  (bahkan dalam mode Windows/Android), \nbaik dalam mode Bluetooth maupun Kabel. Secara default, driver ini menggunakan tombol F (F1-F12) \nsebagai tombol pintasan multimedia dan kita harus menekan tombol  + untuk…","html":"

Mengatur Tombol Fn + F

\n

Keyboard Keychron di Linux menggunakan driver hid_apple (bahkan dalam mode Windows/Android),\nbaik dalam mode Bluetooth maupun Kabel. Secara default, driver ini menggunakan tombol F (F1-F12)\nsebagai tombol pintasan multimedia dan kita harus menekan tombol fn + untuk mendapatkan tombol F1 hingga F12 yang biasa.

\n

Untuk mengubahnya, kita perlu mengubah parameter fnmode untuk modul kernel hid_apple .\nBerikut beberapa dokumentasi di dalamnya,\ntetapi ringkasan singkatnya dapat ditemukan di bawah:

\n
    \n
  • 0 = disabled: Menonaktifkan tombol fn. Menekan fn+F8 akan berperilaku seperti kita hanya menekan F8
  • \n
  • 1 = fkeyslast: Tombol fungsi digunakan sebagai tombol terakhir. Menekan tombol F8 akan bertindak sebagai tombol khusus (pintasan).\nMenekan fn+F8 akan berperilaku seperti F8
  • \n
  • 2 = fkeysfirst: Tombol fungsi digunakan sebagai tombol pertama. Menekan tombol F8 akan berperilaku seperti F8. Menekan fn+F8 akan bertindak sebagai tombol khusus (play/pause).
  • \n
\n

kita dapat menetapkan nilai untuk sementara (untuk pengujian, misalnya) dengan melakukan:

\n
# ubah <value> di bawah dengan nilai 0, 1 atau 2\n# contoh: echo 2 | sudo tee /sys/module/hid_apple/parameters/fnmode\necho <value> | sudo tee /sys/module/hid_apple/parameters/fnmode
\n

Uji bagaimana keyboard berperilaku setelah mengubah nilai. Pilih salah satu yang sesuai kebutuhan untuk kita.\nSetelah kita menemukan nilai yang sesuai untuk kita, kita dapat membuat perubahan permanen:

\n
    \n
  1. Buat file /etc/modprobe.d/hid_apple.conf
  2. \n
  3. Tambahkan baris ini di dalam file: options hid_apple fnmode=<value>,\nganti <value> dengan nilai yang kita inginkan pada tahap sebelumnya (0, 1 atau 2)
  4. \n
  5. Simpan file
  6. \n
  7. Jalankan sudo update-initramfs -u
  8. \n
  9. Reboot
  10. \n
\n

Jika mengalami kendala dengan mode numpad: Tekan dua kali F6 atau fn + F6.

\n

Aktifkan konfigurasi koneksi cepat Bluetooth:

\n

Jika keyboard membutuhkan waktu terlalu lama untuk terhubung ke komputer melalui Bluetooth\n(misalnya, ketika kita menekan tombol dan mengaktifkan dari mode sleep),\nkita dapat mengaktifkan koneksi cepat Bluetooth. Ini biasanya membuat keyboard terhubung dalam waktu kurang dari 1 detik.

\n

Beberapa pengguna melaporkan efek samping masalah pada headphone Bluetooth\nseperti audio yang muncul dan ketidakstabilan, tetapi saya belum mengalami hal seperti itu.

\n
    \n
  1. Edit file /etc/bluetooth/main.conf
  2. \n
  3. Hapus komentar konfigurasi FastConnectable dan setel ke true: FastConnectable = true
  4. \n
  5. Hapus komentar ReconnectAttempts=7 (setel nilainya ke nilai apa pun yang kita inginkan)
  6. \n
  7. Hapus komentar ReconnectIntervals=1, 2, 3
  8. \n
\n

Sumber: https://gist.github.com/andrebrait/961cefe730f4a2c41f57911e6195e444

","frontmatter":{"title":"Setting Keyboard Keychron K2 di Ubuntu","date":"September 12, 2022"}}},"pageContext":{"slug":"/2022/09/setting-keyboard-keychron-ubuntu/","previous":{"fields":{"slug":"/2022/09/update-go-di-ubuntu/"},"frontmatter":{"title":"Update Versi Go di Ubuntu"}},"next":{"fields":{"slug":"/2022/09/stop-mysql-startup/"},"frontmatter":{"title":"Stop MySQL dari Start Up"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2022/09/stop-mysql-startup/page-data.json b/page-data/2022/09/stop-mysql-startup/page-data.json new file mode 100644 index 00000000..667f99a2 --- /dev/null +++ b/page-data/2022/09/stop-mysql-startup/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2022/09/stop-mysql-startup/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"13da37a1-5234-5552-a5af-7934ec35bbd3","excerpt":"Untuk menghentikan service MySQL supaya tidak otomatis dijalankan saat \nstart up, gunakan perintah berikut","html":"

Untuk menghentikan service MySQL supaya tidak otomatis dijalankan saat\nstart up, gunakan perintah berikut

\n
sudo systemctl disable mysql
","frontmatter":{"title":"Stop MySQL dari Start Up","date":"September 15, 2022"}}},"pageContext":{"slug":"/2022/09/stop-mysql-startup/","previous":{"fields":{"slug":"/2022/09/setting-keyboard-keychron-ubuntu/"},"frontmatter":{"title":"Setting Keyboard Keychron K2 di Ubuntu"}},"next":{"fields":{"slug":"/2022/10/update-snap-store/"},"frontmatter":{"title":"Update Snap Store"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2022/09/update-go-di-ubuntu/page-data.json b/page-data/2022/09/update-go-di-ubuntu/page-data.json new file mode 100644 index 00000000..5c62ebf1 --- /dev/null +++ b/page-data/2022/09/update-go-di-ubuntu/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2022/09/update-go-di-ubuntu/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"3c0e0ba1-0d7e-5324-8dc4-cdc45bc68602","excerpt":"Bagaimana Cara Melakukan Update Versi Go di Ubuntu 1. Uninstall Go Seperti yang tertulis pada halaman dokumentasi \nkita harus menghapus versi Go sebelumnya yang terinstall di komputer kita \npada folder . Itu bisa dilakukan dengan perintah berikut: 2. Install versi yang baru…","html":"

Bagaimana Cara Melakukan Update Versi Go di Ubuntu

\n

1. Uninstall Go

\n

Seperti yang tertulis pada halaman dokumentasi\nkita harus menghapus versi Go sebelumnya yang terinstall di komputer kita\npada folder /usr/local/go. Itu bisa dilakukan dengan perintah berikut:

\n
sudo rm -rf /usr/local/go
\n

2. Install versi yang baru

\n

Kunjungi halaman download lalu download file instalasi\nyang sesuai dengan sistem komputer kita.

\n

3. Ekstrak file

\n

Dari folder tempat kita menyimpan file instalasi, jalankan perintah berikut

\n
sudo tar -C /usr/local -xzf go1.19.linux-amd64.tar.gz
\n

4. Pastikan PATH sudah tertulis

\n
echo $PATH | grep \"/usr/local/go/bin\"
\n

5. Memastikan versi telah update

\n

Pastikan bahwa kita telah menginstal Go versi baru dengan membuka command prompt\ndan mengetik perintah berikut

\n
go version
\n

Sumber:

\n","frontmatter":{"title":"Update Versi Go di Ubuntu","date":"September 04, 2022"}}},"pageContext":{"slug":"/2022/09/update-go-di-ubuntu/","previous":{"fields":{"slug":"/2022/08/hukum-test-driven-development/"},"frontmatter":{"title":"Tiga Hukum Test Driven Development"}},"next":{"fields":{"slug":"/2022/09/setting-keyboard-keychron-ubuntu/"},"frontmatter":{"title":"Setting Keyboard Keychron K2 di Ubuntu"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2022/10/update-snap-store/page-data.json b/page-data/2022/10/update-snap-store/page-data.json new file mode 100644 index 00000000..3b3524bd --- /dev/null +++ b/page-data/2022/10/update-snap-store/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2022/10/update-snap-store/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"3afca057-6216-5940-a5bd-8e2ab410ba3d","excerpt":"Untuk melakukan update snap store Jika aplikasi tersebut masih menjalankan proses, \nperintah tersebut akan mengembalikan nilai PID.\nKita harus menghentikan prosesnya Sumber: https://askubuntu.com/questions/1412575/pending-update-of-snap-store","html":"

Untuk melakukan update snap store

\n
snap-store --quit\n\nsudo snap refresh
\n

Jika aplikasi tersebut masih menjalankan proses,\nperintah tersebut akan mengembalikan nilai PID.\nKita harus menghentikan prosesnya

\n
kill <pid>
\n

Sumber: https://askubuntu.com/questions/1412575/pending-update-of-snap-store

","frontmatter":{"title":"Update Snap Store","date":"October 15, 2022"}}},"pageContext":{"slug":"/2022/10/update-snap-store/","previous":{"fields":{"slug":"/2022/09/stop-mysql-startup/"},"frontmatter":{"title":"Stop MySQL dari Start Up"}},"next":{"fields":{"slug":"/2022/12/install-vscode-ubuntu/"},"frontmatter":{"title":"Install VS Code di Ubuntu"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2022/12/install-vscode-ubuntu/page-data.json b/page-data/2022/12/install-vscode-ubuntu/page-data.json new file mode 100644 index 00000000..58296009 --- /dev/null +++ b/page-data/2022/12/install-vscode-ubuntu/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2022/12/install-vscode-ubuntu/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"f937d87b-3af6-5591-9dab-9d721d594170","excerpt":"Berikut adalah cara menginstall VS Code di Ubuntu melalui apt package manager: 1. Update Repository Jalankan perintah berikut untuk melakukan update repository \ndan memastikan kita mendapat vscode versi terbaru 2. Install Package Dependency Supaya dapat berjalan dengan baik…","html":"

Berikut adalah cara menginstall VS Code di Ubuntu melalui apt package manager:

\n

1. Update Repository

\n

Jalankan perintah berikut untuk melakukan update repository\ndan memastikan kita mendapat vscode versi terbaru

\n
sudo apt update
\n

2. Install Package Dependency

\n

Supaya dapat berjalan dengan baik, vscode perlu menginstal dependensi paket.\nJalankan perintah berikut untuk menginstall dependensi paket:

\n
sudo apt install software-properties-common apt-transport-https wget -y
\n

Perintah tersebut secara otomatis menginstal semua dependensi vscode.

\n

3. Tambahkan GPG Key

\n

Impor kunci GPG yang disediakan oleh Microsoft untuk memverifikasi integritas paket:

\n
wget -q https://packages.microsoft.com/keys/microsoft.asc -O- | sudo apt-key add -
\n

4. Tambahkan Repository

\n

Jalankan perintah berikut untuk menambahkan repositori Visual Studio Code ke sistem:

\n
sudo add-apt-repository \"deb [arch=amd64] https://packages.microsoft.com/repos/vscode stable main\"
\n

5. Install vscode

\n

Setelah repository ditambahkan kita bisa menginstall vscode dengan menjalankan perintah berikut:

\n
sudo apt install code
\n

6. Verifikasi instalasi

\n

Jalankan perintah berikut untuk memastikan vscode telah terinstall

\n
code --version
\n

Jika instalasi berhasil, output akan menunjukkan versi vscode.

\n

Sumber: https://phoenixnap.com/kb/install-vscode-ubuntu

","frontmatter":{"title":"Install VS Code di Ubuntu","date":"December 15, 2022"}}},"pageContext":{"slug":"/2022/12/install-vscode-ubuntu/","previous":{"fields":{"slug":"/2022/10/update-snap-store/"},"frontmatter":{"title":"Update Snap Store"}},"next":{"fields":{"slug":"/2022/12/laravel-security/"},"frontmatter":{"title":"Laravel Security"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2022/12/laravel-security/page-data.json b/page-data/2022/12/laravel-security/page-data.json new file mode 100644 index 00000000..54182c6c --- /dev/null +++ b/page-data/2022/12/laravel-security/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2022/12/laravel-security/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"c5e6eb2d-0a85-5551-9bad-1072035d9fd5","excerpt":"Beberapa hal yang bisa kita lakukan untuk meningkatkan\nkeamanan website dengan Laravel Fitur Login/Otentikasi Terapkan role user dan akses dengan benar Terapkan penggunaan password yang kuat Tampilkan pesan error secara umum, tidak perlu detil Terapkan rate limiter Response…","html":"

Beberapa hal yang bisa kita lakukan untuk meningkatkan\nkeamanan website dengan Laravel

\n

Fitur Login/Otentikasi

\n
    \n
  • Terapkan role user dan akses dengan benar
  • \n
  • Terapkan penggunaan password yang kuat
  • \n
  • Tampilkan pesan error secara umum, tidak perlu detil
  • \n
  • Terapkan rate limiter
  • \n
\n

Response Header

\n
    \n
  • \n

    Set X-Frame-Options dengan nilai DENY

    \n

    X-Frame-Options dapat digunakan untuk menunjukkan apakah browser boleh atau tidak merender halaman dalam <frame>, <iframe>, <embed> atau <object>.\nIni dapat digunakan untuk menghindari serangan pembajakan klik, dengan memastikan bahwa sebuah konten tidak disematkan ke situs lain. Dengan mengeset nilainya dengan DENY, halaman dalam frame yang dimuat dari situs lain akan gagal.

    \n
  • \n
  • Set CORS allow origins dengan benar sesuai kebutuhan
  • \n
\n

Error Handling & Logging

\n
    \n
  • Hindari memberikan rincian terlalu detil pada pesan error. Informasi yang terlalu banyak dapat dimanfaatkan oleh penyerang.
  • \n
  • Batasi informasi yang di-log, penyerang dapat mengincar file log
  • \n
  • Data yang bisa di-log: id, nama fungsi, nama class
  • \n
  • Data yang jangan di-log: informasi seperti email, nomor telepon, token
  • \n
\n

Front End

\n
    \n
  • Jangan ada log di console production
  • \n
  • Batasi input dari user, karena ini dapat jadi celah penyerang memasukkan data
  • \n
  • Hindari menggunakan hidden field untuk data yang sifatnya sensitif, ini dapat dilihat dari page source
  • \n
  • Berhati-hati dalam menggunakan localStorage atau sessionStorage karena data tersimpan di sisi client
  • \n
  • Jaga dependensi paket tetap update, pastikan juga library/paket yang dipakai tidak disusupi script penyerang
  • \n
  • Set Referrer-Policy dengan nilai no-referrer
  • \n
","frontmatter":{"title":"Laravel Security","date":"December 26, 2022"}}},"pageContext":{"slug":"/2022/12/laravel-security/","previous":{"fields":{"slug":"/2022/12/install-vscode-ubuntu/"},"frontmatter":{"title":"Install VS Code di Ubuntu"}},"next":{"fields":{"slug":"/2023/01/lessons-michael-janda/"},"frontmatter":{"title":"Professional Lessons from Michael Janda"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2023/01/laravel-auth-routes/page-data.json b/page-data/2023/01/laravel-auth-routes/page-data.json new file mode 100644 index 00000000..2addbda2 --- /dev/null +++ b/page-data/2023/01/laravel-auth-routes/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2023/01/laravel-auth-routes/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"ed3494f6-2b8c-594e-9872-99e4a27dd0ff","excerpt":"Laravel menyediakan helper untuk membuat route otentikasi Jika tidak ingin menggunakan semua auth routes, kita bisa memasukkan konfigurasinya sebagai parameter Referensi: https://sekolahkoding.com/forum/bagaimana-cara-kerja-authroutes-1534167893 https://stackoverflow.com…","html":"

Laravel menyediakan helper untuk membuat route otentikasi

\n
Auth::routes()\n\n// akan membuat routes\n\n// Authentication Routes...\nRoute::get('login', 'Auth\\LoginController@showLoginForm')->name('login');\nRoute::post('login', 'Auth\\LoginController@login');\nRoute::post('logout', 'Auth\\LoginController@logout')->name('logout');\n\n// Registration Routes...\nRoute::get('register', 'Auth\\RegisterController@showRegistrationForm')->name('register');\nRoute::post('register', 'Auth\\RegisterController@register');\n\n// Password Reset Routes...\nRoute::get('password/reset', 'Auth\\ForgotPasswordController@showLinkRequestForm')->name('password.request');\nRoute::post('password/email', 'Auth\\ForgotPasswordController@sendResetLinkEmail')->name('password.email');\nRoute::get('password/reset/{token}', 'Auth\\ResetPasswordController@showResetForm')->name('password.reset');\nRoute::post('password/reset', 'Auth\\ResetPasswordController@reset');
\n

Jika tidak ingin menggunakan semua auth routes, kita bisa memasukkan konfigurasinya sebagai parameter

\n
Auth::routes([\n  'register' => false, // disable registration routes...\n  'reset' => false, // disable password reset routes...\n]);
\n

Referensi:
\nhttps://sekolahkoding.com/forum/bagaimana-cara-kerja-authroutes-1534167893

\n

https://stackoverflow.com/questions/29183348/how-to-disable-registration-new-users-in-laravel

","frontmatter":{"title":"Laravel Auth Routes","date":"January 03, 2023"}}},"pageContext":{"slug":"/2023/01/laravel-auth-routes/","previous":{"fields":{"slug":"/2023/01/lessons-michael-janda/"},"frontmatter":{"title":"Professional Lessons from Michael Janda"}},"next":{"fields":{"slug":"/2023/01/menjalankan-artisan-storage-link-shared-hosting/"},"frontmatter":{"title":"Menjalankan Perintah PHP Artisan Storage Link di Shared Hosting"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2023/01/lessons-michael-janda/page-data.json b/page-data/2023/01/lessons-michael-janda/page-data.json new file mode 100644 index 00000000..ade033cb --- /dev/null +++ b/page-data/2023/01/lessons-michael-janda/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2023/01/lessons-michael-janda/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"e033b05d-15fd-5665-b7cf-797908d43f8c","excerpt":"Michael Janda adalah seorang freelance designer yang sering membagikan wawasan dan tip seputar pekerjaan. Ada beberapa pelajaran yang menurut saya menarik dan inilah rangkumannya: Presentasikan solusi terlebih dahulu, baru bicara tentang harga Cara berpikir seperti pengusaha…","html":"

Michael Janda adalah seorang freelance designer yang sering membagikan wawasan dan tip seputar pekerjaan. Ada beberapa pelajaran yang menurut saya menarik dan inilah rangkumannya:

\n
    \n
  • Presentasikan solusi terlebih dahulu, baru bicara tentang harga
  • \n
  • Cara berpikir seperti pengusaha: kenali kelemahan kita dan didik diri sendiri untuk mengubah perilaku atau mempekerjakan orang yang lebih kuat
  • \n
  • Di mana kita memulai bukanlah cerminan dari nilai kita di masa depan
  • \n
  • Tingkatkan nilai kita dengan belajar memecahkan masalah yang lebih besar
  • \n
  • Persaingan di puncak lebih sedikit dibanding di bawah, naiklah ke puncak
  • \n
  • Tidak masalah jika kita adalah desainer/programmer terbaik di dunia, jika kita tidak dapat bekerja dengan cepat, kita akan kesulitan untuk berhasil dalam karier
  • \n
  • Kecepatan produksi dan kualitas produk sama pentingnya
  • \n
  • Sebagian besar ide terbaik membutuhkan ide buruk terlebih dahulu. Jangan percaya ide pertama. Terus dorong naluri kreativitas sampai kita menemukan permata
  • \n
  • \n

    Selesaikan masalah klien dengan menjawab pertanyaan berikut:

    \n
      \n
    • Persona. Siapa yang memiliki masalah?
    • \n
    • Masalah. Apa masalahnya.
    • \n
    • Strategi. Bagaimana kita akan memecahkan masalah?
    • \n
    • Objektif. Apa yang akan dicapai dari solusi?
    • \n
    • Fitur. Fitur apa yang diperlukan untuk mencapai tujuan?
    • \n
    • Solusi. Seperti apa produknya dan bagaimana fungsinya?
    • \n
    \n
  • \n
  • Buat setiap klien merasa seperti satu-satunya klien kita
  • \n
  • Dalam lingkungan bisnis, selalu berusahalah jadi orang yang berpenampilan terbaik. (The One Degree Rule for Dress)
  • \n
  • Jangan pernah melakukan pekerjaan tanpa dokumen. Bahkan untuk ibumu pun tidak
  • \n
  • Pilih ceruk (niche) yaitu: sesuatu yang kita sukai, sesuatu yang kita kuasai, dan sesuatu yang layak secara finansial. Gunakan corong ceruk (niche funnel)
  • \n
  • Bersikaplah cukup rendah hati untuk mengenali apa yang tidak kita ketahui dan cukup bangga untuk mempelajarinya
  • \n
  • Kita harus bertahan cukup lama dalam permainan untuk membangun keahlian
  • \n
  • Pekerjaan yang pertama mungkin adalah yang terburuk, mulailah saja dan terur lakukan perbaikan
  • \n
  • Keberuntungan adalah produk sampingan dari persiapan, ketekunan, dan kesabaran
  • \n
  • Kesuksesan kita adalah produk sampingan dari kesuksesan yang kita ciptakan untuk orang lain
  • \n
","frontmatter":{"title":"Professional Lessons from Michael Janda","date":"January 01, 2023"}}},"pageContext":{"slug":"/2023/01/lessons-michael-janda/","previous":{"fields":{"slug":"/2022/12/laravel-security/"},"frontmatter":{"title":"Laravel Security"}},"next":{"fields":{"slug":"/2023/01/laravel-auth-routes/"},"frontmatter":{"title":"Laravel Auth Routes"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2023/01/mengoptimalkan-query-database-laravel/page-data.json b/page-data/2023/01/mengoptimalkan-query-database-laravel/page-data.json new file mode 100644 index 00000000..7fa9e72a --- /dev/null +++ b/page-data/2023/01/mengoptimalkan-query-database-laravel/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2023/01/mengoptimalkan-query-database-laravel/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"9f9de5a9-be76-5fa0-88e3-f686f9676c65","excerpt":"1. Mengambil Data dalam Jumlah Besar Opsi 1: Menggunakan chunk Jika aplikasi perlu memproses jumlah data yang besar, \nkita bisa melakukannya dengan (potongan). \nFungsi menjalankan query dalam potongan-potongan \nberdasarkan nilai offset dan limit, ini lebih optimal \ndibanding…","html":"

1. Mengambil Data dalam Jumlah Besar

\n

Opsi 1: Menggunakan chunk

\n

Jika aplikasi perlu memproses jumlah data yang besar,\nkita bisa melakukannya dengan chunk (potongan).\nFungsi chunk menjalankan query dalam potongan-potongan\nberdasarkan nilai offset dan limit, ini lebih optimal\ndibanding query mengambil semua data di database.\nContoh di bawah mengambil 100 record dari tabel posts,\nmemprosesnya, mengambil 100 record lagi, dan memprosesnya.

\n
// eloquent\n$posts = Post::chunk(100, function($posts){\n    foreach ($posts as $post){\n     // Proses posts\n    }\n});\n\n// query builder\n$posts = DB::table('posts')->chunk(100, function ($posts){\n    foreach ($posts as $post){\n     // Proses posts\n    }\n});
\n

Opsi 2: Menggunakan chunkById

\n

Kita juga dapat menggunakan chunkById. chunkById menggunakan field id\nyang merupakan integer (bilangan bulat), dan kueri menggunakan klausa where,\nkueri akan jauh lebih cepat.

\n
// eloquent\n$posts = Post::chunkById(100, function($posts){\n    foreach ($posts as $post){\n     // Proses posts\n    }\n});\n\n// query builder\n$posts = DB::table('posts')->chunkById(100, function ($posts){\n    foreach ($posts as $post){\n     // Proses posts\n    }\n});
\n

2. Select hanya kolom yang dibutuhkan

\n

Gunakan fungsi select dalam kueri untuk memilih hanya kolom tertentu\nalih-alih mengambil semua kolom dalam sebuah tabel.

\n
// eloquent\n$posts = Post::select(['id','title'])->find(1);\n\n// query builder\n$posts = DB::table('posts')\n            ->where('id','=',1)\n            ->select(['id','title'])\n            ->first(); 
\n

3. Gunakan pluck saat membutuhkan hanya satu atau dua kolom dari database

\n
// eloquent\n$posts = Post::pluck('title', 'slug');\n\n// query builder\n$posts = DB::table('posts')->pluck('title','slug');
\n

Ketika kode di atas dijalankan, ia melakukan hal berikut di belakang layar.

\n

Jalankan select title, slug dari kueri posts di database.\nMembuat array dengan title sebagai nilai array dan slug sebagai key array.\nMengembalikan array(format array: [ slug => title, slug => title ])

\n

Untuk mengakses hasilnya

\n
foreach ($posts as $slug => $title){\n    // $title post\n    // $slug post\n}
\n

Jika ingin mengambil hanya satu kolom

\n
// eloquent\n$posts = Post::pluck('title');\n\n// query builder\n$posts = DB::table('posts')->pluck('title');\nforeach ($posts as  $title){\n    // $title post\n}
\n

4. Hitung jumlah baris menggunakan kueri, bukan dari collection

\n

Dengan menggunakan pendekatan ini, kita dapat langsung menghitung\njumlah total baris pada database itu sendiri.

\n
// eloquent\n$posts = Post::count();\n\n// query builder\n$posts = DB::table('posts')->count();
\n

5. Menggunakan with dalam relasi

\n

Jika kita menggunakan relasi dalam model eloquent\nmaka kita harus menggunakan method with.

\n
$posts = Post::with(['author'])->get();
\n

Demikian pula, jika kita menggunakan hubungan bersarang maka kita dapat menggunakan ini

\n
$posts = Post::with(['author.team'])->get();
\n

6. Jangan memanggil relasi yang tidak perlu

\n

Jangan panggil relasi jika kita yakin id relasi ada di tabel.

\n

Contoh:\nUntuk mendapatkan id penulis dari sebuah posting, biasanya kita lakukan

\n
$post = Post::findOrFail(<post id>);\n$post->author->id;
\n

Sebagai gantinya, kita bisa langsung mendapatkan id penulis dengan melakukan hal berikut.

\n
$post = Post::findOrFail(<post id>);\n$post->author_id; \n// table posts memiliki kolom author_id yang menyimpan id penulis
\n

Tapi selalu lakukan pengecekan bahwa baris yang dituju ada di tabel penulis\njika direferensikan di tabel posts.

\n

7. Tambahkan indeks ke kolom yang sering dikueri

\n

Jika kita melakukan query dengan where di sebuah kolom.\nKita bisa menambahkan indeks ke kolom tersebut.\nKueri jauh lebih cepat saat melakukan kueri pada baris dengan kolom indeks.

\n

8. Gunakan simplePaginate, bukan Paginate

\n

Paginate Menghasilkan link pagination untuk semua halaman.\nSementara simplePaginate Menghasilkan hanya tautan paginasi berikutnya dan sebelumnya.

\n
// Menghasilkan link pagination untuk semua halaman\n$posts = Post::paginate(20);\n\n// Menghasilkan hanya link pagination next dan previous\n$posts = Post::simplePaginate(20);
\n

9. Hindari penggunaan wildcard di awal (dengan keyword LIKE)

\n

Jika kita mengetahui kata kunci muncul di awal nilai kolom,\nkita dapat menjalankan kueri seperti di bawah ini.

\n
select * from table_name where column like keyword%\n# bukan %keyword%
\n

10. Hindari penggunaan fungsi SQL pada klausa where

\n

Cukup gunakan where pada kolom tanggal seperti ini

\n
// Yes\n$posts = Post::where('created_at', '>=', now() )->get();\n\n// No\n$posts = Post::whereDate('created_at', '>=', now() )->get();
\n

11. Hindari menambahkan terlalu banyak kolom ke sebuah tabel

\n

Menambahkan terlalu banyak kolom ke tabel akan menambah sebuah record\ndan akan memperlambat pemindaian tabel. Saat melakukan kueri select *,\nkita akhirnya akan mengambil banyak kolom yang sebenarnya tidak diperlukan.\nDalam situasi itu pemecahan tabel akan membantu.

\n

12. Pisahkan kolom dengan tipe data teks ke dalam tabelnya sendiri

\n

Pertimbangkan kasus di mana kita memiliki tabel yang disebut posting\ndengan kolom konten yang menyimpan konten posting blog.\nKonten untuk posting blog akan sangat besar dan seringkali,\nkita memerlukan data ini hanya jika seseorang melihat\nposting blog tertentu.

\n

Jadi, memisahkan kolom ini dari tabel posts akan secara drastis\nmeningkatkan performa kueri saat ada terlalu banyak postingan.

\n

13. Cara yang lebih baik untuk mengambil baris terbaru dari sebuah tabel

\n

Jika menggunakan id dalam bentuk integer atau nilai yang berurutan,\ncara yang lebih baik untuk mengambil baris terbaru adalah seperti di bawah ini.\nDibandingkan dengan mengurutkan string (pada field date).

\n
$posts = Post::latest('id')->get();
\n

14. Periksa dan optimalkan kueri

\n

Tidak ada satu solusi universal saat mengoptimalkan kueri di laravel.\nHanya kita yang tahu apa yang dilakukan aplikasi kita,\nberapa banyak kueri yang dibuatnya, berapa banyak yang benar-benar digunakan.

\n

Untuk melakukan ini, kita dapat menggunakan

\n
DB::enableQueryLog();\ndd(DB::getQueryLog());
\n
    \n
  1. Laravel Debugbar - Laravel debugbar memiliki tab bernama database\nyang akan menampilkan semua kueri yang dijalankan saat kita mengunjungi sebuah halaman.\nKunjungi semua halaman di aplikasi dan lihat kueri yang dijalankan di setiap halaman.
  2. \n
  3. Clockwork - Clockwork sama dengan laravel debugbar.\nTapi alih-alih memberikan toolbar ke situs web,\nitu akan menampilkan informasi debug di developer tools window\natau sebagai UI mandiri dengan mengunjungi appurl/clockwork.
  4. \n
  5. Laravel Telescope - Setelah Telescope diinstal,\nkita dapat mengakses dasbor dengan mengunjungi\nappurl/telescope. Di dasbor telescope, buka tab kueri, dan itu akan\nmenampilkan semua kueri yang dijalankan oleh aplikasi.
  6. \n
\n

Referensi:\nHow to Optimize Database Queries in Laravel?

","frontmatter":{"title":"Mengoptimalkan Query Database di Laravel","date":"January 28, 2023"}}},"pageContext":{"slug":"/2023/01/mengoptimalkan-query-database-laravel/","previous":{"fields":{"slug":"/2023/01/menjalankan-artisan-storage-link-shared-hosting/"},"frontmatter":{"title":"Menjalankan Perintah PHP Artisan Storage Link di Shared Hosting"}},"next":{"fields":{"slug":"/2023/02/membuat-bootable-flashdisk-di-ubuntu-dengan-ventoy/"},"frontmatter":{"title":"Membuat Bootable Flashdisk Windows di Ubuntu dengan Ventoy"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2023/01/menjalankan-artisan-storage-link-shared-hosting/page-data.json b/page-data/2023/01/menjalankan-artisan-storage-link-shared-hosting/page-data.json new file mode 100644 index 00000000..9a9012a1 --- /dev/null +++ b/page-data/2023/01/menjalankan-artisan-storage-link-shared-hosting/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2023/01/menjalankan-artisan-storage-link-shared-hosting/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"02a4353c-1952-544f-9f87-f539838c4c5c","excerpt":"Perintah dijalankan untuk membuat \nsymbolic link antara folder storage dengan folder public di web server. \nKita dapat menjalankan perintah tersebut \ndi shared hosting tanpa mengakses terminal. Caranya adalah dengan \nmembuat perintah tersebut dijalankan lewat route: Variabel…","html":"

Perintah php artisan storage:link dijalankan untuk membuat\nsymbolic link antara folder storage dengan folder public di web server.\nKita dapat menjalankan perintah tersebut\ndi shared hosting tanpa mengakses terminal. Caranya adalah dengan\nmembuat perintah tersebut dijalankan lewat route:

\n
Route::get('/linkstorage', function () {\n    $targetFolder = base_path().'/storage/app/public';\n    $linkFolder = $_SERVER['DOCUMENT_ROOT'].'/storage';\n    symlink($targetFolder, $linkFolder); \n});
\n

Variabel $linkFolder disesuaikan dengan letak folder di web hosting.\nDalam kasus ini folder storage berada di dalam folder public.\nSaya menemukan kasus error yang berhubungan dengan proc_open\nketika mengisi path link folder tidak sesuai.

\n
the Process class relies on proc_open, which is not available on your PHP installation
\n

Atau bisa juga mengupdate config filesystem di file config/filesystems.php\ndengan menambahkan baris berikut pada key 'disks'

\n
'links' => [\n    $_SERVER['DOCUMENT_ROOT'].'/storage' => storage_path('app/public'),\n],
","frontmatter":{"title":"Menjalankan Perintah PHP Artisan Storage Link di Shared Hosting","date":"January 21, 2023"}}},"pageContext":{"slug":"/2023/01/menjalankan-artisan-storage-link-shared-hosting/","previous":{"fields":{"slug":"/2023/01/laravel-auth-routes/"},"frontmatter":{"title":"Laravel Auth Routes"}},"next":{"fields":{"slug":"/2023/01/mengoptimalkan-query-database-laravel/"},"frontmatter":{"title":"Mengoptimalkan Query Database di Laravel"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2023/02/membuat-bootable-flashdisk-di-ubuntu-dengan-ventoy/page-data.json b/page-data/2023/02/membuat-bootable-flashdisk-di-ubuntu-dengan-ventoy/page-data.json new file mode 100644 index 00000000..b9585080 --- /dev/null +++ b/page-data/2023/02/membuat-bootable-flashdisk-di-ubuntu-dengan-ventoy/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2023/02/membuat-bootable-flashdisk-di-ubuntu-dengan-ventoy/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"eed40149-e1cd-52f8-806b-dae0bddf9677","excerpt":"Ventoy adalah tool open source untuk membuat live USB. \nKita dapat menggunakannya untuk membuat USB multi-boot, \nlive USB Linux yang persisten, dan USB Windows yang bootable. Langkah 1: Siapkan USB drive Ventoy memformat disk USB saat membuat bootable disk. \nNamun, ada kasus di…","html":"

Ventoy adalah tool open source untuk membuat live USB.\nKita dapat menggunakannya untuk membuat USB multi-boot,\nlive USB Linux yang persisten, dan USB Windows yang bootable.

\n

Langkah 1: Siapkan USB drive

\n

Ventoy memformat disk USB saat membuat bootable disk.\nNamun, ada kasus di mana proses pemformatan gagal melakukannya\npada disk Linux yang sudah bootable. Karena alasan ini, disarankan\nuntuk memformat disk USB sebelum melanjutkan lebih jauh.

\n

Colokkan lalu format disk USB. Klik kanan pada disk yang terpasang\ndan kemudian memilih opsi format.

\n

Tidak masalah sistem file mana yang dipilih selama pemformatan.\nIni akan diformat lagi oleh Ventoy di langkah selanjutnya.

\n

Setelah diformat, tetap sambungkan USB dan lanjutkan\nke langkah berikutnya untuk menginstal Ventoy.

\n

Langkah 2: Download dan instal Ventoy di Linux

\n

Ventoy adalah tool campuran GUI dan CLI yang dapat digunakan\npada semua distribusi Linux. Download Ventoy untuk Linux\ndari halaman rilis repositori GitHub-nya.\nDownload Ventoy untuk Linux

\n

Pilih file .tar.gz dengan nama Linux. Ini adalah file yang harus kita download.\nSetelah didownload, ekstrak file tar gz. Klik kanan lalu ekstrak.

\n

Masuk ke dalam folder yang telah diekstraksi, dan kita dapat melihat\nbeberapa skrip di dalamnya. Kita perlu menjalankan satu file bernama VentoyWeb.sh.\nBuka terminal dari folder tersebut, klik kanan lalu pilih ”Open in Terminal“.

\n

Gunakan perintah berikut untuk menjalankan Ventoy:

\n
sudo ./VentoyWeb.sh
\n

Ventoy akan menjalankan server lokal dan akan memberi kita URL\nuntuk membuka GUI di browser. Salin URL ini dan tempel di browser.\nIni akan membuka halaman web dengan Ventoy berjalan di dalamnya.\nJika USB sudah terpasang, Ventoy akan mengenalinya.\nJika tidak, tekan tombol refresh.

\n

Langkah 3: Gunakan Ventoy untuk membuat disk USB Windows 10 yang dapat di-boot

\n

Meskipun Ventoy memiliki opsi untuk membuat bootable disk\nyang dapat di-boot dengan secure boot, saat ini fitur tersebut\nbersifat eksperimental dan mungkin tidak berfungsi.

\n

Mengingat kita akan melakukan instalasi UEFI,\nsebaiknya gunakan GPT untuk skema partisi.

\n

Setelah semuanya diatur, tekan tombol install. Ini akan menunjukkan\nkepada kita beberapa peringatan. Jika penginstalan selesai dengan sukses,\nkita akan melihat pesan sukses.

\n

Catatan: Jika tidak melihat disk Ventoy terpasang setelah instalasi berhasil,\nlepaskan USB lalu pasang kembali.

\n

Saat kita menekan tombol instal, itu membuat dua partisi pada disk USB.

\n
 VTOYEFI: Partisi kecil untuk file UEFI.\n Ventoy: Partisi besar dan kosong dalam format ExFAT tempat kita akan menyalin file image ISO.
\n

Itulah yang perlu kita lakukan. Salin file image ISO Windows 10\nke partisi ExFAT yang lebih besar di disk USB.

\n

Setelah penyalinan selesai, JANGAN TERBURU-BURU melepaskan USB dulu.\nKlik opsi unmount dari pengelola file. Kemungkinan beberapa file masih ditulis\ndan mungkin menampilkan pesan error.

\n

Tunggu beberapa menit lagi sampai ada pesan bahwa aman untuk melepaskan disk.\nSekarang kita dapat mencabutnya dan menggunakannya di sistem mana pun yang diinginkan.

\n

Referensi: https://itsfoss.com/bootable-windows-usb-linux/

","frontmatter":{"title":"Membuat Bootable Flashdisk Windows di Ubuntu dengan Ventoy","date":"February 05, 2023"}}},"pageContext":{"slug":"/2023/02/membuat-bootable-flashdisk-di-ubuntu-dengan-ventoy/","previous":{"fields":{"slug":"/2023/01/mengoptimalkan-query-database-laravel/"},"frontmatter":{"title":"Mengoptimalkan Query Database di Laravel"}},"next":{"fields":{"slug":"/2023/02/tips-laravel-routing-part-1/"},"frontmatter":{"title":"Tips Routing Laravel - Bagian 1"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2023/02/tips-laravel-routing-part-1/page-data.json b/page-data/2023/02/tips-laravel-routing-part-1/page-data.json new file mode 100644 index 00000000..3d2a3e92 --- /dev/null +++ b/page-data/2023/02/tips-laravel-routing-part-1/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2023/02/tips-laravel-routing-part-1/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"5bb45813-19f6-528d-a475-823484d63048","excerpt":"Pada file routing seringkali digunakan sintaks \ndan yang sederhana. Namun, dalam proyek yang lebih besar, \nrouting biasanya akan menjadi lebih rumit. Ada beberapa cara yang dapat diterapkan \nuntuk menangani masalah routing dalam situasi tertentu. Tip 1. Route::get() SEBELUM…","html":"

Pada file routing seringkali digunakan sintaks Route::get()\ndan Route::post() yang sederhana. Namun, dalam proyek yang lebih besar,\nrouting biasanya akan menjadi lebih rumit. Ada beberapa cara yang dapat diterapkan\nuntuk menangani masalah routing dalam situasi tertentu.

\n

Tip 1. Route::get() SEBELUM Route::resource()

\n

Ini adalah salah satu kesalahan paling umum ketika menggunakan\nResource Controller

\n
Route::resource('photos', 'PhotoController');\nRoute::get('photos/popular', 'PhotoController@method');
\n

Rute kedua tidak akan akurat, karena itu akan dicocokkan dengan\nmethod show() dari Route::resource() yaitu /photos/{id}.\nDalam kasus ini, “popular” akan ditetapkan sebagai parameter $id.

\n

Jika ingin menambahkan rute get/post, selain Route::resource(),\nletakkan SEBELUM resource. Seperti ini:

\n
Route::get('photos/popular', 'PhotoController@method');\nRoute::resource('photos', 'PhotoController');
\n

Tip 2. Route Group di dalam Grup Lain

\n

Kita mungkin semua tahu bahwa kita dapat mengelompokkan rute dengan Route::group()\ndan menetapkan middlewares/prefix yang berbeda dan parameter lainnya,\nseperti rute yang bersifat publik dan rute yang mengharuskan log in.

\n

Tetapi bagaimana jika kita memerlukan seperangkat aturan tertentu\nuntuk subgrup dari grup tersebut?

\n

Contoh: kita memerlukan rute publik dan rute yang diautentikasi,\ntetapi di dalam grup yang diautentikasi, kita perlu memisahkan administrator\ndari pengguna biasa.

\n

Ini bisa kita lakukan:

\n
// rute publik\nRute::get('/', 'HomeController@index');\n\n// Pengguna harus log in - dengan middleware \"auth\".\nRute::grup(['middleware' => ['auth']], function () {\n\n     // /user/XXX: Selain \"auth\", grup ini akan memiliki middleware \"simple_users\"\n     Rute::grup(['middleware' => ['simple_users'], 'prefix' => 'user'], function () {\n         Rute::resource('tugas', 'TaskController');\n     });\n\n     // /admin/XXX: Grup ini tidak akan memiliki \"simple_users\", tetapi akan memiliki \"auth\" dan \"admins\"\n     Route::group(['middleware' => ['admins'], 'prefix' => 'admin'], function () {\n         Route::resource('users', 'UserController');\n     });\n});
\n

Tip 3. Validasi Parameter Rute – Contoh Multi-Bahasa

\n

Kasus yang cukup umum adalah mengawali rute dengan bahasa lokal,\nseperti fr/blog atau en/article/333. Bagaimana kita memastikan\nbahwa dua huruf pertama itu tidak digunakan untuk hal lain selain bahasa?

\n

Kita dapat memvalidasinya langsung di rute, dengan parameter where:

\n
Route::group(['prefix' => '{locale}', 'where' => ['locale' => '[a-zA-Z]{2}']], function () {\n     Rute::get('/', 'HomeController@index');\n     Route::get('article/{id}', 'ArticleController@show');\n});
\n

Bagian utama di sini adalah where => ['locale' => '[a-zA-Z]{2}']\ndi mana kita menggunakan regular expression untuk mencocokkan parameter yang\nhanya sesuai dengan kombinasi dua huruf.

\n

Tip 4. Dynamic Subdomain Routing

\n

Kita bisa lihat yang satu ini langsung dari\ndokumentasi resmi Laravel.\nJika kita memiliki subdomain dinamis, misalnya subdomain yang berbeda\nuntuk setiap pengguna, paramater tersebut diperlukan sebagai variabel.\nLaravel telah melakukannya secara otomatis. Lihat contoh:

\n
Rute::domain('{account}.myapp.com')->grup(function () {\n     Rute::get('user/{id}', function ($account, $id) {\n         //\n     });\n});
\n

Perhatikan bahwa {account} secara otomatis diteruskan sebagai\nparameter $account di dalam semua method controller.

\n

Tip 5. Route List dan Route Caching

\n

Cara memeriksa rute yang ada dalam sebuah proyek.\nKita mungkin tidak tahu persis ada rute apa saja dalam sebuah aplikasi.\nBisa saja tersembunyi di dalam Route::resource(),\natau di dalam Route::group yang lebih kompleks.

\n

Kita dapat memeriksa semua rute yang sebenarnya dengan perintah Artisan:

\n
php artisan route:list
\n

Perlu diingat, bahwa di Laravel ada route caching,\nsetelah ada perubahan rute, kita perlu menjalankan perintah:

\n
php artisan route:clear
\n

Sumber: https://blog.quickadminpanel.com/laravel-routing-8-advanced-tips-languages-apis-groups-validation/

","frontmatter":{"title":"Tips Routing Laravel - Bagian 1","date":"February 18, 2023"}}},"pageContext":{"slug":"/2023/02/tips-laravel-routing-part-1/","previous":{"fields":{"slug":"/2023/02/membuat-bootable-flashdisk-di-ubuntu-dengan-ventoy/"},"frontmatter":{"title":"Membuat Bootable Flashdisk Windows di Ubuntu dengan Ventoy"}},"next":{"fields":{"slug":"/2023/02/tips-laravel-routing-part-2/"},"frontmatter":{"title":"Tips Routing Laravel - Bagian 2"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2023/02/tips-laravel-routing-part-2/page-data.json b/page-data/2023/02/tips-laravel-routing-part-2/page-data.json new file mode 100644 index 00000000..7007ddd7 --- /dev/null +++ b/page-data/2023/02/tips-laravel-routing-part-2/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2023/02/tips-laravel-routing-part-2/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"f8d3301e-60a1-5f7a-b817-e9c6d32b3a31","excerpt":"Tip 6. Hati-hati dengan Binding Model Route Bahasa Non-Inggris Terkadang, URL harus berisi kata-kata non-Inggris. Misalnya, \nkita memiliki portal berbahasa Indonesia untuk perpustakaan \ndan ingin memiliki URL untuk melihat daftar buku, \ndan untuk melihat sebuah buku, seperti…","html":"

Tip 6. Hati-hati dengan Binding Model Route Bahasa Non-Inggris

\n

Terkadang, URL harus berisi kata-kata non-Inggris. Misalnya,\nkita memiliki portal berbahasa Indonesia untuk perpustakaan\ndan ingin memiliki URL /daftar-buku untuk melihat daftar buku,\ndan /buku/1 untuk melihat sebuah buku, seperti Resource Controller biasa.

\n

Tapi di database, semua nama harus dalam bahasa Inggris.\nDengan asumsi “magic” Laravel bisa bekerja dengan kata benda tunggal dan jamak,\nkita membuat model Book lengkap dengan migrasi dan controller, dengan perintah ini:

\n
php artisan make:model Book -mcr
\n

Tambahan -mcr akan membuat model dan resource controller,\nini hasilnya:

\n
/**\n * Display the specified resource.\n *\n * @param  \\App\\Book  $book\n * @return \\Illuminate\\Http\\Response\n */\npublic function show(Book $book)\n{\n    // ...\n}
\n

Tetapi dengan perintah tersebut, di route/web.php kita akan memiliki ini:

\n
Route::resource('buku', 'BookController');
\n

Masalahnya adalah itu tidak akan bekerja dan itu tidak akan\nmenimbulkan error, hanya variabel $book yang akan kosong,\ndan ini seringkali membuat kita tidak mengerti mengapa itu terjadi.

\n

Menurut deskripsi Resource Controller, nama variabel\nharus sama dengan parameter dalam bentuk tunggal:

\n
// Tidak bekerja\npublic function show(Book $book)\n{\n    // ...\n}\n\n// Seharusnya\npublic function show(Book $buku)\n{\n    // ...\n}
\n

Dalam proyek dengan Bahasa non Inggris, tidak disarankan menggunakan\nRoute::resource dan Route Model Binding sama sekali.\nTerlalu banyak “magic” tidak dapat diprediksi. Dalam struktur bahasa Inggris,\nLaravel akan dengan mudah mengetahui bahwa book adalah bentuk tunggal dari books.\nNamun, bagaimana Laravel akan “menebak” bahwa “buku” dianggap sebagai\nbentuk tunggal dari “daftar buku”?

\n

Tip 7. Route API – dari V1 ke V2

\n

Bayangkan kita bekerja dengan proyek berbasis API\ndan perlu merilis versi baru dari API ini.\nJadi endpoint versi yang lama harus tetap di api/[sesuatu],\ndan untuk versi baru kita akan menggunakan api/V2/[sesuatu].

\n

Seluruh logika ada di file app/Providers/RouteServiceProvider.php:

\n
public function map()\n{\n    $this->mapApiRoutes();\n\n    $this->mapWebRoutes();\n\n    // ...\n}\n\nprotected function mapWebRoutes()\n{\n    Route::middleware('web')\n        ->namespace($this->namespace)\n        ->group(base_path('routes/web.php'));\n}\n\nprotected function mapApiRoutes()\n{\n    Route::prefix('api')\n        ->middleware('api')\n        ->namespace($this->namespace)\n        ->group(base_path('routes/api.php'));\n}
\n

Kita bisa melihat, route API didaftarkan dalam fungsi terpisah dengan prefix api.\nJadi, jika kita ingin membuat grup route V2, kita dapat membuat route/api_v2.php\nsecara terpisah dan lakukan ini:

\n
public function map()\n{\n    // ... tambahkan map api v2\n\n    $this->mapApiV2Routes();\n}\n\n// Tambahkan method baru\nprotected function mapApiV2Routes()\n{\n    Route::prefix('api/V2')\n        ->middleware('api')\n        ->namespace($this->namespace)\n        ->group(base_path('routes/api_v2.php'));\n}
\n

Dengan cara ini, route lama tidak akan rusak,\ndan kita cukup membuat serangkaian route baru.

\n

Kiat 7. Rate Limiter (Pembatasan) – Secara Global dan untuk Pengguna

\n

Kita dapat membatasi beberapa URL untuk dipanggil\nmaksimal 60 kali per menit, dengan throttle:60,1.

\n
Route::middleware('auth:api', 'throttle:60,1')->group(function () {\n    Route::get('/user', function () {\n        //\n    });\n});
\n

Kita juga dapat melakukannya secara terpisah\nuntuk pengguna umum dan untuk pengguna yang log in.

\n
// maksimal 10 request per menit untuk pengguna umum dan 60 untuk user yang terotentikasi\nRoute::middleware('throttle:10|60,1')->group(function () {\n    //\n});
\n

Selain itu kita bisa membatasi jumlah untuk pengguna tertentu\nberdasarkan kolom users.rate_limit di database:

\n
Route::middleware('auth:api', 'throttle:rate_limit,1')->group(function () {\n    Route::get('/user', function () {\n        //\n    });\n});
\n

Sumber: https://blog.quickadminpanel.com/laravel-routing-8-advanced-tips-languages-apis-groups-validation/

","frontmatter":{"title":"Tips Routing Laravel - Bagian 2","date":"February 25, 2023"}}},"pageContext":{"slug":"/2023/02/tips-laravel-routing-part-2/","previous":{"fields":{"slug":"/2023/02/tips-laravel-routing-part-1/"},"frontmatter":{"title":"Tips Routing Laravel - Bagian 1"}},"next":{"fields":{"slug":"/2023/03/sebelum-bertanya/"},"frontmatter":{"title":"Tips Sebelum Bertanya"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2023/03/sebelum-bertanya/page-data.json b/page-data/2023/03/sebelum-bertanya/page-data.json new file mode 100644 index 00000000..9dbc8e74 --- /dev/null +++ b/page-data/2023/03/sebelum-bertanya/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2023/03/sebelum-bertanya/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"5eb42cc6-cbf2-5ee7-abb8-17e7ad200e43","excerpt":"Saat menemukan masalah (teknis) dan merasa perlu bertanya lewat chat, email \natau forum, ada baiknya kita melakukan hal-hal ini dulu: 1. Cari kasus yang sama/mirip di arsip forum Seringkali masalah yang kita temui bukanlah kejadian yang pertama di internet, \nkecuali kita sedang…","html":"

Saat menemukan masalah (teknis) dan merasa perlu bertanya lewat chat, email\natau forum, ada baiknya kita melakukan hal-hal ini dulu:

\n

1. Cari kasus yang sama/mirip di arsip forum

\n

Seringkali masalah yang kita temui bukanlah kejadian yang pertama di internet,\nkecuali kita sedang mendalami topik yang sangat advance. Kita bisa melihat\npostingan sebelumnya yang membahas masalah yang mirip atau bahkan sama.

\n

2. Cari dengan kata kunci di mesin pencari

\n

Ketika mencari lewat mesin pencari, coba beberapa cara mulai dari copy paste\npesan error secara detil kemudian memperluasnya dengan kata kunci yang lebih umum.\nBiasanya mesin pencari akan menunjukkan hasil pencarian berupa topik di\nforum tanya jawab seperti stackoverflow dengan judul yang paling mendekati.

\n

3. Baca dokumentasi resmi

\n

Umumnya sebuah produk hadir dengan petunjuk penggunaan atau dokumentasi.\nKetika menemukan masalah, misalnya dalam menggunakan framework biasanya petunjuk\npenggunaan dan solusi dari masalah-masalah tertentu ada dalam dokumentasi resmi.

\n

4. Baca FAQ

\n

FAQ merangkum banyak pertanyaan yang paling sering ditanyakan.

\n

5. Baca GitHub Issues

\n

Jika menggunakan kode open source, kita bisa melihat masalah-masalah yang dilaporkan\ndi GitHub, lalu pergi ke tab issues.

\n

6. Coba lakukan langkah debugging dan bereksperimen

\n

Debugging adalah proses yang mengidentifikasi masalah,\nmengisolasi sumber masalah dan kemudian menentukan cara untuk mengatasinya.\nCara paling sederhana dalam bereksperimen adalah dengan mengubah-ubah\ninput dan melihat hasilnya di output.

\n

7. Baca source code dengan lebih teliti

\n

Seringkali ketika tergesa-gesa atau sudah kelelahan, kita menjadi tidak teliti dan\nbisa jadi melewatkan hal-hal sederhana seperti typo misalnya.\nIstirahat sejenak lalu baca lagi dengan lebih teliti.

\n

8. Tanya AI (ChatGPT/GitHub Copilot)

\n

Saat ini sudah mulai banyak muncul produk asisten berupa chat bot ataupun ekstensi\ncode editor yang memanfaatkan kecerdasan buatan. Kita bisa memanfaatkan kelebihan tersebut\nuntuk berdiskusi tentang masalah yang sedang kita hadapi.

\n

Ketika kita mengajukan pertanyaan, tunjukkan hasil yang kita dapat\nsetelah melakukan hal-hal di atas. Itu akan membantu memberi petunjuk\nsejauh mana kita telah berusaha mencari jawabannya. Dengan begitu kita\ntidak membuang waktu orang lain untuk mencari jawabannya dari awal.

\n

Selain itu kita juga akan belajar dari proses pemecahan masalah tersebut,\nbukannya hanya mendapatkan jawaban akhir dari orang lain.\nItu akan bermanfaat untuk kita di masa depan,\nketerampilan kita untuk memecahkan masalah secara mandiri juga akan semakin terasah.

","frontmatter":{"title":"Tips Sebelum Bertanya","date":"March 05, 2023"}}},"pageContext":{"slug":"/2023/03/sebelum-bertanya/","previous":{"fields":{"slug":"/2023/02/tips-laravel-routing-part-2/"},"frontmatter":{"title":"Tips Routing Laravel - Bagian 2"}},"next":{"fields":{"slug":"/2023/03/unit-test-klasifikasi/"},"frontmatter":{"title":"Unit Test - Klasifikasi"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2023/03/unit-test-klasifikasi/page-data.json b/page-data/2023/03/unit-test-klasifikasi/page-data.json new file mode 100644 index 00000000..8c2e0584 --- /dev/null +++ b/page-data/2023/03/unit-test-klasifikasi/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2023/03/unit-test-klasifikasi/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"f9a54956-8d0e-5376-81d6-eb29b6ab4f9d","excerpt":"Sebelum membuat test case apa pun, kita perlu menentukan \nnilai input dari fungsi/metode tertentu yang perlu dites. \nTest case harus dirancang untuk mencakup semua kombinasi nilai masukan \ndan prasyarat (precondition). Jenis input dataset untuk unit test \nbisa dibagi 3. Normal…","html":"

Sebelum membuat test case apa pun, kita perlu menentukan\nnilai input dari fungsi/metode tertentu yang perlu dites.\nTest case harus dirancang untuk mencakup semua kombinasi nilai masukan\ndan prasyarat (precondition). Jenis input dataset untuk unit test\nbisa dibagi 3.

\n
    \n
  1. Normal: Input berada pada nilai rentang normal (yang dapat diterima).\nSejumlah besar kode dapat dicakup hanya dengan menjalankan test case normal.
  2. \n
  3. Boundary (Batas): Input berada pada atau di luar batas maksimum atau minimumnya.\nKasus tersebut lebih digunakan untuk mengidentifikasi kesalahan pada batas daripada menemukan\nyang ada di pusat domain input.
  4. \n
  5. Abnormal: Input tidak valid (ilegal atau tidak diharapkan) untuk menguji\npenanganan dan pemulihan kesalahan.
  6. \n
\n

Contoh: Misalkan kita memiliki fungsi yang memvalidasi alamat email yang dimasukkan oleh pengguna. Panjang maksimum alamat email adalah 50 karakter.

\n
function validate($email) {\n    if (filter_var($email, FILTER_VALIDATE_EMAIL) && strlen($email) <= 50) {\n        return true;\n    }\n    return false;\n}
\n

Kita dapat menulis test case seperti di bawah ini:

\n

Normal cases

\n
public function test_valid_email_format_and_length()\n{\n    // Email dengan panjang 18 (kurang dari: maximum - 1)\n    $email = 'sample@framgia.com';\n    $this->assertEquals(true, validate($email));\n}
\n

Boundary cases

\n
public function test_valid_email_format_and_length_max_minus()\n{\n    // Email dengan panjang 49 (maximum - 1)\n    $email = 'samplesamplesamplesamplesamplesamples@framgia.com';\n    $this->assertEquals(true, validate($email));\n}\n\npublic function test_valid_email_format_and_length_max()\n{\n    // Email dengan panjang 50 (nilai dama dengan maximum)\n    $email = 'samplesamplesamplesamplesamplesamplesa@framgia.com';\n    $this->assertEquals(true, validate($email));\n}\n\npublic function test_valid_email_format_and_length_max_plus()\n{\n    // Email dengan panjang 51 (maximum + 1)\n    $email = 'samplesamplesamplesamplesamplesamplesam@framgia.com';\n    $this->assertEquals(false, validate($email));\n}
\n

Abnormal cases

\n
public function test_invalid_email_format()\n{\n    // Format email tidak valid dengan panjang normal (antara 0 ~ 50)\n    $email = 'framgia.com';\n    $this->assertEquals(false, validate($email));\n}\n\npublic function test_valid_email_format_and_length_exceeded()\n{\n    // Email dengan panjang 54\n    $email = 'samplesamplesamplesamplesamplesamplesample@framgia.com';\n    $this->assertEquals(false, validate($email));\n}
\n

Sumber: https://github.com/framgia/laravel-test-guideline/blob/master/en/Knowledge.md

","frontmatter":{"title":"Unit Test - Klasifikasi","date":"March 25, 2023"}}},"pageContext":{"slug":"/2023/03/unit-test-klasifikasi/","previous":{"fields":{"slug":"/2023/03/sebelum-bertanya/"},"frontmatter":{"title":"Tips Sebelum Bertanya"}},"next":{"fields":{"slug":"/2023/04/tips-debugging/"},"frontmatter":{"title":"Tips Debugging"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2023/04/apa-itu-oauth2-part-1/page-data.json b/page-data/2023/04/apa-itu-oauth2-part-1/page-data.json new file mode 100644 index 00000000..99616bd0 --- /dev/null +++ b/page-data/2023/04/apa-itu-oauth2-part-1/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2023/04/apa-itu-oauth2-part-1/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"4fa65e7d-53a4-5a59-b936-c2a26c4ebfd3","excerpt":"OAuth 2.0 adalah protokol standar industri untuk otorisasi. OAuth 2.0 berfokus pada kesederhanaan pengembang aplikasi klien serta memberikan alur otorisasi khusus untuk aplikasi web, aplikasi desktop, ponsel, dan perangkat ruangan. Roles (Peran) Aplikasi Pihak Ketiga: “Client…","html":"

OAuth 2.0 adalah protokol standar industri untuk otorisasi. OAuth 2.0 berfokus pada kesederhanaan pengembang aplikasi klien serta memberikan alur otorisasi khusus untuk aplikasi web, aplikasi desktop, ponsel, dan perangkat ruangan.

\n

Roles (Peran)

\n

Aplikasi Pihak Ketiga: “Client”

\n

Client adalah aplikasi yang berusaha mendapatkan akses ke data pengguna. Aplikasi pihak ketiga ini perlu mendapatkan izin dari pengguna sebelum dapat mengakses sumber daya di server penyedia layanan.

\n

API: “Resource Server (Server Sumber Daya)”

\n

Server sumber daya adalah server API yang digunakan untuk mengakses data pengguna.

\n

Authorization Server (Server Otorisasi)

\n

Ini adalah server yang menyajikan antarmuka tempat pengguna dapat menyetujui atau menolak permintaan akses. Dalam implementasi yang lebih kecil, ini mungkin server yang sama dengan server API, tetapi dalam penerapan pada skala yang lebih besar, server ini sering dibangun sebagai komponen terpisah.

\n

User/Pengguna: “Resource Owner (Pemilik Sumber Daya)”

\n

Pemilik sumber daya adalah pengguna yang memberikan akses ke sebagian sumber daya di akunnya.

\n

Contoh

\n

Kita sedang mengembangkan aplikasi yang perlu mengakses data pada Google Drive pengguna. Aplikasi yang kita buat dalam kasus tersebut berperan sebagai client. Sementara pemilik akun Google Drive berperan sebagai resource owner, dia adalah pemilik sumber daya yang berhak mengizinkan atau menolak permintaan dari aplikasi kita untuk mengakses data-datanya. Sementara Google adalah penyedia layanan API sekaligus server otorisasi. Aplikasi yang kita buat hanya bisa mengakses data-data di server hanya jika diberikan izin oleh pengguna.

\n

Membuat Aplikasi

\n

Sebelum dapat memulai proses OAuth, kita harus mendaftarkan aplikasi client ke penyedia layanan terlebih dahulu (dalam contoh di atas Google Drive API). Saat mendaftarkan aplikasi baru, kita biasanya memberikan informasi dasar seperti nama aplikasi, situs web, logo, dll. Selain itu, kita harus mendaftarkan redirect URI yang akan digunakan untuk mengalihkan pengguna ke server web, aplikasi berbasis browser, atau aplikasi seluler.

\n

Redirect URI

\n

Penyedia layanan hanya akan mengarahkan pengguna ke URI terdaftar, ini untuk membantu mencegah beberapa jenis serangan. Redirect URI berupa HTTP harus disajikan melalui HTTPS. Ini membantu mencegah token dicegat dan terbaca selama proses otorisasi. Aplikasi native dapat mendaftarkan redirect URI dengan skema URL khusus untuk aplikasi tersebut, yang mungkin terlihat seperti demoapp://redirect.

\n

Client ID dan Secret

\n

Setelah mendaftarkan aplikasi client, kita akan menerima ID klien dan secara opsional kode rahasia klien. ID klien dianggap sebagai informasi publik, dan digunakan untuk membuat URL login, atau disertakan dalam kode Javascript di halaman. Kode rahasia klien harus dijaga kerahasiaannya. Jika aplikasi yang diterapkan tidak dapat menjaga kerahasiaan kode ini, seperti aplikasi SPA Javascript atau aplikasi native, maka kode tersebut tidak digunakan, dan idealnya layanan tidak seharusnya mengeluarkan kode rahasia untuk jenis aplikasi ini sejak awal.

\n

Sumber: https://aaronparecki.com/oauth-2-simplified/

","frontmatter":{"title":"Apa Itu OAuth2 part 1","date":"April 16, 2023"}}},"pageContext":{"slug":"/2023/04/apa-itu-oauth2-part-1/","previous":{"fields":{"slug":"/2023/04/tips-debugging/"},"frontmatter":{"title":"Tips Debugging"}},"next":{"fields":{"slug":"/2023/05/apa-itu-oauth2-part-2-aplikasi-web-server/"},"frontmatter":{"title":"Apa Itu OAuth2 part 2 - Aplikasi Web Server"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2023/04/tips-debugging/page-data.json b/page-data/2023/04/tips-debugging/page-data.json new file mode 100644 index 00000000..6cfd5e00 --- /dev/null +++ b/page-data/2023/04/tips-debugging/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2023/04/tips-debugging/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"2e99a242-3474-5c07-a34e-5225749b6595","excerpt":"Aktivitas debugging terkadang bisa membuat kita frustrasi. Namun, dengan mindset yang tepat kita bisa melakukan debugging dengan lebih baik tanpa stres. Ingat selalu mengenai hal-hal ini dan ada beberapa langkah praktis yang bisa kita lakukan dalam proses debugging: Komputer…","html":"

Aktivitas debugging terkadang bisa membuat kita frustrasi. Namun, dengan mindset yang tepat kita bisa melakukan debugging dengan lebih baik tanpa stres. Ingat selalu mengenai hal-hal ini dan ada beberapa langkah praktis yang bisa kita lakukan dalam proses debugging:

\n
    \n
  1. Komputer adalah sesuatu yang bekerja dengan logika, selalu ada penjelasan logis pada suatu masalah yang muncul. Bahkan ketika nampaknya tidak mungkin ditemukan pada saat itu juga. Dapatkan informasi sebanyak mungkin untuk mereproduksi masalah (tangkapan layar/rekaman, langkah mendetail untuk mereproduksi masalah, mengumpulkan log dan pesan kesalahan yang relevan). Informasi dari log seperti error trace dapat membantu kita memahami di bagian mana kesalahan terjadi.
  2. \n
  3. Rubber duck debugging adalah cara melakukan debugging dengan mengartikulasikan masalah dalam bahasa lisan atau tulisan. Ini seperti seolah-olah kita sedang menjelaskan sebuah masalah kepada orang lain, hal itu bisa membantu kita menggambarkan masalah dengan lebih jelas dibanding hanya memikirkannya. Kita juga bisa melakukannya dengan menulis.
  4. \n
  5. Kebuntuan adalah hal yang sifatnya sementara, dengan ketekunan dan usaha, sebuah masalah pasti akan ditemukan solusinya. Jangan menyerah dengan cepat. Berhenti dan ambil waktu untuk bersantai sejenak, berjalan-jalan ke luar, minum air putih. Terkadang kebuntuan terjadi karena pikiran kita terlalu lelah dan memerlukan waktu untuk istirahat. Seringkali setelah pikiran kita segar kembali, ide-ide akan muncul dengan sendirinya.
  6. \n
  7. Penting untuk mengetahui batas kemampuan kita dan tau kapan waktunya kita perlu bertanya pada orang lain yang memiliki lebih banyak pengalaman. Kita bisa mengirim chat ke senior atau berkomunikasi dengan anggota komunitas. Terkadang orang lain dapat membantu dengan melihat masalah dari perspektif lain yang bisa jadi kita luput. Ketahui kapan waktunya harus berhenti dan mulai meminta bantuan pada orang lain.
  8. \n
  9. Tidak selalu perlu mengeluarkan banyak usaha untuk menyelesaikan setiap bug. Kita harus memprioritaskan bug berdasarkan potensi dampak dan kerumitan yang ditimbulkan. Fokus pada bug yang berdampak paling besar dan jangan menghabiskan waktu terlalu lama pada bug-bug yang rumit namun tidak begitu berdampak.
  10. \n
\n

Sumber: https://www.youtube.com/watch?v=J8uAiZJMfzQ

","frontmatter":{"title":"Tips Debugging","date":"April 08, 2023"}}},"pageContext":{"slug":"/2023/04/tips-debugging/","previous":{"fields":{"slug":"/2023/03/unit-test-klasifikasi/"},"frontmatter":{"title":"Unit Test - Klasifikasi"}},"next":{"fields":{"slug":"/2023/04/apa-itu-oauth2-part-1/"},"frontmatter":{"title":"Apa Itu OAuth2 part 1"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2023/05/apa-itu-oauth2-part-2-aplikasi-web-server/page-data.json b/page-data/2023/05/apa-itu-oauth2-part-2-aplikasi-web-server/page-data.json new file mode 100644 index 00000000..852e87f7 --- /dev/null +++ b/page-data/2023/05/apa-itu-oauth2-part-2-aplikasi-web-server/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2023/05/apa-itu-oauth2-part-2-aplikasi-web-server/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"fe024fc0-37aa-5f3e-895b-a17ad359b8cb","excerpt":"Langkah pertama dalam proses OAuth2 adalah mendapatkan otorisasi dari pengguna (authorization). Pada aplikasi berbasis browser (web misalnya) atau aplikasi native mobile (Android, iOS, dsb), hal ini biasanya dilakukan dengan menampilkan antarmuka yang disediakan oleh layanan…","html":"

Langkah pertama dalam proses OAuth2 adalah mendapatkan otorisasi dari pengguna (authorization). Pada aplikasi berbasis browser (web misalnya) atau aplikasi native mobile (Android, iOS, dsb), hal ini biasanya dilakukan dengan menampilkan antarmuka yang disediakan oleh layanan kepada pengguna.

\n

OAuth2 menyediakan beberapa jenis pemberian akses (grant types) untuk berbagai kasus penggunaan:

\n
    \n
  • Authorization Code untuk aplikasi yang berjalan di server web, aplikasi berbasis browser, dan seluler.
  • \n
  • Password untuk masuk dengan nama pengguna dan kata sandi (hanya untuk aplikasi pihak pertama)
  • \n
  • Client credentials untuk akses aplikasi tanpa kehadiran pengguna
  • \n
  • Implicit sebelumnya direkomendasikan untuk klien tanpa client secret, tetapi telah digantikan dengan menggunakan pemberian Kode Otorisasi dengan PKCE.
  • \n
\n

Web Server Apps

\n

Aplikasi server web adalah jenis aplikasi paling umum saat berhadapan dengan server OAuth. Aplikasi web ditulis dalam bahasa sisi server dan dijalankan di server di mana kode sumber aplikasi tidak dapat diakses secara publik. Ini berarti aplikasi dapat menggunakan client secret saat berkomunikasi dengan server otorisasi, yang dapat membantu menghindari banyak vektor serangan.

\n

Authorization

\n

Buat link untuk ”log in” pengguna:

\n
https://authorization-server.com/auth?response_type=code&\n  client_id=CLIENT_ID&redirect_uri=REDIRECT_URI&scope=photos&state=1234zyx
\n
    \n
  • response_type=code - Menunjukkan bahwa server menghendaki untuk menerima kode otorisasi (auth code)
  • \n
  • client_id - ID klien yang kita dapat saat pertama kali membuat aplikasi
  • \n
  • redirect_uri - URI untuk mengembalikan pengguna ke aplikasi kita setelah proses otorisasi selesai
  • \n
  • scope - cakupan/bagian mana dari akun pengguna yang ingin kita akses (dapat berisi satu atau beberapa)
  • \n
  • state - string acak yang dibuat oleh aplikasi kita, yang akan digunakan untuk verifikasi nanti
  • \n
\n

Pemberian Akses oleh Pengguna

\n

Pengguna melihat prompt otorisasi berupa antarmuka yang disediakan oleh penyedia layanan. Di proses ini aplikasi meminta persetujuan pengguna untuk mengakses sumber daya/data pengguna. Pengguna dapat mengizinkan atau menolak permintaan akses tersebut. Pengguna akan diminta log in terlebih dahulu jika belum.

\n

\"auth

\n

\nAntarmuka Pengguna untuk Prompt Otorisasi - diambil dari web aaronparecki.com\n

\n

Jika pengguna mengklik “izinkan”, layanan akan mengalihkan pengguna kembali ke situs kita, dan aplikasi kita akan mendapatkan kode otorisasi.

\n
https://example-app.com/cb?code=AUTH_CODE_DISINI&state=1234zyx
\n
    \n
  • code - Server mengembalikan kode otorisasi (auth code) dalam query string
  • \n
  • state - Server mengembalikan nilai state yang sama dengan yang aplikasi kita berikan pada login URL
  • \n
\n

Kita harus terlebih dahulu membandingkan nilai state ini untuk memastikannya sesuai dengan yang aplikasi kita buat. Kita dapat menyimpan nilai state dalam cookie atau session, dan membandingkannya saat pengguna kembali. Ini membantu memastikan titik akhir pengalihan (redirection endpoint) kita tidak dapat diakali untuk mencoba bertukar kode otorisasi arbitrer.

\n

Mendapatkan Token Akses

\n

Server kita perlu menukar kode otorisasi dengan token akses dengan membuat http request POST ke endpoint token server otorisasi:

\n
POST https://api.authorization-server.com/token\n  grant_type=authorization_code&\n  code=AUTH_CODE_HERE&\n  redirect_uri=REDIRECT_URI&\n  client_id=CLIENT_ID&\n  client_secret=CLIENT_SECRET
\n
    \n
  • grant_type=authorization_code - Jenis pemberian akses untuk alur ini adalah ”authorization_code” (kode otorisasi)
  • \n
  • code=AUTH_CODE_HERE - Ini adalah kode yang kita terima dalam string kueri
  • \n
  • redirect_uri=REDIRECT_URI - Harus sama dengan redirect URI yang disediakan di link asli
  • \n
  • client_id=CLIENT_ID - ID klien yang kita terima saat pertama kali membuat aplikasi
  • \n
  • client_secret=CLIENT_SECRET - Karena permintaan ini dibuat dari kode sisi server, client secret disertakan di respons (tidak akan terlihat di browser)
  • \n
\n

Server membalas dengan token akses dan waktu kedaluwarsa

\n
{\n  \"access_token\":\"RsT5OjbzRn430zqMLgV3Ia\",\n  \"expires_in\":3600\n}
\n

atau jika ada kesalahan

\n
{\n  \"error\":\"invalid_request\"\n}
\n

Keamanan: Perhatikan bahwa penyedia layanan harus mewajibkan aplikasi untuk melakukan pendaftaran redirect URI sebelumnya. Ini untuk memastikan bahwa pengguna tidak dapat di-redirect selain menuju ke aplikasi kita.

\n

Sumber: https://aaronparecki.com/oauth-2-simplified/

","frontmatter":{"title":"Apa Itu OAuth2 part 2 - Aplikasi Web Server","date":"May 06, 2023"}}},"pageContext":{"slug":"/2023/05/apa-itu-oauth2-part-2-aplikasi-web-server/","previous":{"fields":{"slug":"/2023/04/apa-itu-oauth2-part-1/"},"frontmatter":{"title":"Apa Itu OAuth2 part 1"}},"next":{"fields":{"slug":"/2023/05/kompromi-dalam-pengembangan-perangkat-lunak/"},"frontmatter":{"title":"Kompromi dalam Pengembangan Perangkat Lunak"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2023/05/kompromi-dalam-pengembangan-perangkat-lunak/page-data.json b/page-data/2023/05/kompromi-dalam-pengembangan-perangkat-lunak/page-data.json new file mode 100644 index 00000000..a831020e --- /dev/null +++ b/page-data/2023/05/kompromi-dalam-pengembangan-perangkat-lunak/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2023/05/kompromi-dalam-pengembangan-perangkat-lunak/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"8c89df73-3b0e-504e-b649-b4846fca93b3","excerpt":"Sebuah tulisan singkat yang saya baca di linkedin, ditulis oleh mas Giovanni Sakti Nugraha - Software Engineering Manager & Leader, Consultant, Tech Content Creator | Livestreaming at insinyur.online (ID). Dalam tulisan ini, pernyataan awal beliau adalah : “Sebagai insinyur…","html":"

Sebuah tulisan singkat yang saya baca di linkedin, ditulis oleh mas Giovanni Sakti Nugraha - Software Engineering Manager & Leader, Consultant, Tech Content Creator | Livestreaming at insinyur.online (ID).

\n

Dalam tulisan ini, pernyataan awal beliau adalah : “Sebagai insinyur perangkat lunak, tujuan kita adalah melakukan ”trade-off“.

\n

Terjemahan dari kata ”trade-off” dalam bahasa Indonesia adalah “pengorbanan”. Istilah ini digunakan untuk menggambarkan situasi di mana seseorang harus memilih antara dua pilihan atau lebih yang memiliki keuntungan dan kerugian yang berbeda-beda, dan harus mengorbankan sesuatu untuk memperoleh sesuatu yang diinginkan.

\n

Dalam konteks bisnis, trade-off juga bisa diartikan sebagai kompromi yang dibuat antara biaya dan manfaat suatu keputusan atau strategi bisnis. Berikut tulisan lengkapnya yang saya terjemahkan ke dalam Bahasa Indonesia.

\n
\n

“Sebagai insinyur perangkat lunak, tujuan kita adalah melakukan ”trade-off. Menyeimbangkan (kebanyakan) hal-hal berikut: latensi, throughput, keandalan, dan produktivitas.

\n

Yang penting adalah benar-benar memahami hasil yang ingin kita capai dan sadar akan trade-off yang kita buat.

\n

Sebaliknya, yang berbahaya adalah jika kita mengikuti salah satu sisi ekstrem (dalam menerapkan praktik engineering) secara membabi buta tanpa menyadari apa yang baru saja kita lakukan.

\n

Memilih bahasa pemrograman adalah salah satu contoh keputusan yang perlu kita buat secara sadar. Contoh lainnya adalah menyimpan dan mengambil data, termasuk model data, dll.

\n

Ada banyak keputusan lain yang perlu dibuat sebagai insinyur perangkat lunak saat kita melakukan pekerjaan kita, terutama dalam skala besar di mana keputusan kecil dapat memiliki dampak yang berkali-kali lipat.”

\n

Sumber: Giovanni Sakti Nugraha - LinkedIn

","frontmatter":{"title":"Kompromi dalam Pengembangan Perangkat Lunak","date":"May 13, 2023"}}},"pageContext":{"slug":"/2023/05/kompromi-dalam-pengembangan-perangkat-lunak/","previous":{"fields":{"slug":"/2023/05/apa-itu-oauth2-part-2-aplikasi-web-server/"},"frontmatter":{"title":"Apa Itu OAuth2 part 2 - Aplikasi Web Server"}},"next":{"fields":{"slug":"/2023/05/menulis-acceptance-test-dengan-given-when-then/"},"frontmatter":{"title":"Menulis Acceptance Test dengan Formula Given-When-Then"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2023/05/menulis-acceptance-test-dengan-given-when-then/page-data.json b/page-data/2023/05/menulis-acceptance-test-dengan-given-when-then/page-data.json new file mode 100644 index 00000000..20d1a13f --- /dev/null +++ b/page-data/2023/05/menulis-acceptance-test-dengan-given-when-then/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2023/05/menulis-acceptance-test-dengan-given-when-then/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"c6f1fad1-cb4c-56f1-a342-e4dda8be4a63","excerpt":"Dalam pengembangan perangkat lunak, Given-When-Then merupakan sebuah formula atau template yang bertujuan untuk memandu penulisan acceptance test (pengujian penerimaan) terhadap User Story. Formula ini terdiri dari tiga bagian, yaitu: (Given) beberapa konteks atau kondisi awal…","html":"

Dalam pengembangan perangkat lunak, Given-When-Then merupakan sebuah formula atau template yang bertujuan untuk memandu penulisan acceptance test (pengujian penerimaan) terhadap User Story. Formula ini terdiri dari tiga bagian, yaitu:

\n
    \n
  • (Given) beberapa konteks atau kondisi awal
  • \n
  • (When) aksi atau tindakan tertentu yang dilakukan
  • \n
  • (Then) sejumlah konsekuensi yang dapat diamati (seharusnya terjadi)
  • \n
\n

Contoh penggunaan formula Given-When-Then:

\n
    \n
  • Given my bank account is in credit, and I made no withdrawals recently (saldo rekening bank saya mencukupi dan saya belum melakukan penarikan dana baru-baru ini),
  • \n
  • When I attempt to withdraw an amount less than my card’s limit (saya mencoba menarik dana dalam jumlah kurang dari batas kartu saya),
  • \n
  • Then a particular set of observable consequences should obtain (penarikan dana harus berhasil tanpa adanya kesalahan atau peringatan),
  • \n
\n

Manfaat

\n

Formula Given-When-Then membantu dalam merancang acceptance test dengan lebih terstruktur dan jelas. Bagian Given memberikan konteks atau kondisi awal yang diperlukan sebelum menjalankan aksi atau tindakan. Bagian When menyatakan aksi atau tindakan yang akan diuji. Sedangkan bagian Then menyatakan hasil atau konsekuensi yang diharapkan setelah aksi dilakukan.

\n

Dengan menggunakan formula ini, tim pengembang perangkat lunak dapat memastikan bahwa User Story atau cerita pengguna telah memenuhi persyaratan yang telah ditentukan. Penggunaan formula Given-When-Then juga membantu mempermudah komunikasi antara anggota tim pengembang (developer), penguji (QA), dan pemangku kepentingan lainnya, sehingga meminimalkan risiko kesalahpahaman.

\n

Dalam praktiknya, formula Given-When-Then dapat digunakan secara berulang untuk menulis skenario pengujian acceptance test yang berbeda-beda, sehingga memastikan bahwa aplikasi atau sistem yang dikembangkan berperilaku sesuai dengan harapan dan kebutuhan pengguna.

\n

Jadi, dengan menggunakan formula Given-When-Then, tim pengembang dapat lebih mudah menggambarkan konteks, tindakan, dan hasil yang diharapkan dalam pengujian acceptance test. Hal ini membantu memastikan kualitas dan keandalan perangkat lunak yang dikembangkan, serta meminimalisir risiko adanya bug atau kesalahan dalam sistem.

","frontmatter":{"title":"Menulis Acceptance Test dengan Formula Given-When-Then","date":"May 20, 2023"}}},"pageContext":{"slug":"/2023/05/menulis-acceptance-test-dengan-given-when-then/","previous":{"fields":{"slug":"/2023/05/kompromi-dalam-pengembangan-perangkat-lunak/"},"frontmatter":{"title":"Kompromi dalam Pengembangan Perangkat Lunak"}},"next":{"fields":{"slug":"/2023/05/panduan-facility-dan-severity-dalam-syslog/"},"frontmatter":{"title":"Mengenal RFC 5424 - Panduan untuk Facility dan Severity dalam Syslog"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2023/05/panduan-facility-dan-severity-dalam-syslog/page-data.json b/page-data/2023/05/panduan-facility-dan-severity-dalam-syslog/page-data.json new file mode 100644 index 00000000..b27a43cc --- /dev/null +++ b/page-data/2023/05/panduan-facility-dan-severity-dalam-syslog/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2023/05/panduan-facility-dan-severity-dalam-syslog/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"89dddec0-79d0-5f16-b470-8fcf54250e5a","excerpt":"Syslog adalah protokol standar yang digunakan untuk mengirim, mengumpulkan, dan mengelola pesan log pada sistem komputer. Pesan log ini berisi informasi penting tentang kejadian dan keadaan sistem yang dapat membantu dalam pemantauan, analisis, dan pemecahan masalah. Salah satu…","html":"

Syslog adalah protokol standar yang digunakan untuk mengirim, mengumpulkan, dan mengelola pesan log pada sistem komputer. Pesan log ini berisi informasi penting tentang kejadian dan keadaan sistem yang dapat membantu dalam pemantauan, analisis, dan pemecahan masalah.

\n

Salah satu aspek penting dalam protokol syslog adalah atribut ”Facility” dan ”Severity” yang digunakan untuk memberikan informasi tentang sumber pesan dan seberapa penting pesan tersebut. Meskipun nilainya tidak normatif, namun Facility dan Severity sering digunakan dalam praktik syslog. RFC 5424 adalah dokumen yang merinci nilai-nilai ini untuk tujuan informasi.

\n

Facility adalah kode numerik yang menentukan sumber pesan log. RFC 5424 memperkenalkan 24 nilai Facility yang berbeda. Nilai-nilai ini berkisar antara 0 hingga 23 dan memiliki deskripsi yang spesifik. Berikut adalah tabel yang menggambarkan nilai-nilai Facility beserta deskripsinya:

\n
          Numerical             Facility\n             Code\n\n              0             kernel messages\n              1             user-level messages\n              2             mail system\n              3             system daemons\n              4             security/authorization messages\n              5             messages generated internally by syslogd\n              6             line printer subsystem\n              7             network news subsystem\n              8             UUCP subsystem\n              9             clock daemon\n             10             security/authorization messages\n             11             FTP daemon\n             12             NTP subsystem\n             13             log audit\n             14             log alert\n             15             clock daemon (note 2)\n             16             local use 0  (local0)\n             17             local use 1  (local1)\n             18             local use 2  (local2)\n             19             local use 3  (local3)\n             20             local use 4  (local4)\n             21             local use 5  (local5)\n             22             local use 6  (local6)\n             23             local use 7  (local7)\n\n              Table 1.  Syslog Message Facilities
\n

Selanjutnya, Severity adalah indikator tingkat kepentingan pesan log. RFC 5424 juga menyediakan 8 nilai Severity yang berbeda, mulai dari 0 hingga 7. Setiap nilai Severity memiliki deskripsi yang menjelaskan tingkat kepentingan pesan tersebut. Berikut adalah tabel yang menggambarkan nilai-nilai Severity beserta deskripsinya:

\n
           Numerical         Severity\n             Code\n\n              0       Emergency: system is unusable\n              1       Alert: action must be taken immediately\n              2       Critical: critical conditions\n              3       Error: error conditions\n              4       Warning: warning conditions\n              5       Notice: normal but significant condition\n              6       Informational: informational messages\n              7       Debug: debug-level messages\n\n              Table 2. Syslog Message Severities
\n

Dalam protokol syslog, nilai Priority sebuah pesan log dihitung dengan mengalikan nilai Facility dengan 8 terlebih dahulu, kemudian menambahkannya dengan nilai numerik Severity.

\n

Sebagai contoh:

\n
    \n
  • sebuah pesan kernel (Facility=0) dengan Severity Emergency (Severity=0) akan memiliki nilai Prioritas sebesar 0
  • \n
  • sementara pesan “local use 4” (Facility=20) dengan Severity Notice (Severity=5) akan memiliki nilai Prioritas sebesar 165
  • \n
\n

Dalam PRI (prioritas) sebuah pesan syslog, nilai-nilai ini akan ditempatkan di antara tanda kurung sudut sebagai <0> dan <165>. Hanya pada nilai Prioritas “0” yang diikuti oleh tanda ”<” sebelumnya. Selain itu, tidak boleh menggunakan angka “0” di depan.

","frontmatter":{"title":"Mengenal RFC 5424 - Panduan untuk Facility dan Severity dalam Syslog","date":"May 27, 2023"}}},"pageContext":{"slug":"/2023/05/panduan-facility-dan-severity-dalam-syslog/","previous":{"fields":{"slug":"/2023/05/menulis-acceptance-test-dengan-given-when-then/"},"frontmatter":{"title":"Menulis Acceptance Test dengan Formula Given-When-Then"}},"next":{"fields":{"slug":"/2023/06/auto-build-deploy-gatsby-site-ke-github-page-dengan-github-action/"},"frontmatter":{"title":"Auto Build dan Deploy Gatsby Site ke GitHub Page dengan GitHub Action"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2023/06/apa-itu-github-action/page-data.json b/page-data/2023/06/apa-itu-github-action/page-data.json new file mode 100644 index 00000000..20f6a486 --- /dev/null +++ b/page-data/2023/06/apa-itu-github-action/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2023/06/apa-itu-github-action/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"8208323d-e699-5266-9cdc-3e2f68dfbc2f","excerpt":"Dalam pengembangan perangkat lunak modern, otomatisasi dan pengaturan aliran kerja (workflow) yang efisien sangatlah penting. GitHub Action, yang disediakan oleh GitHub, adalah salah satu platform untuk mengotomatisasi proses pengembangan perangkat lunak. Dalam tulisan ini, kita…","html":"

Dalam pengembangan perangkat lunak modern, otomatisasi dan pengaturan aliran kerja (workflow) yang efisien sangatlah penting. GitHub Action, yang disediakan oleh GitHub, adalah salah satu platform untuk mengotomatisasi proses pengembangan perangkat lunak.

\n

Dalam tulisan ini, kita akan membahas tentang GitHub Action, bagaimana cara menggunakannya, dan manfaatnya dalam meningkatkan efisiensi pengembangan perangkat lunak.

\n

Apa itu GitHub Action?

\n

GitHub Action adalah platform otomatisasi yang disediakan oleh GitHub. Dengan menggunakan GitHub Action, Kita dapat membuat alur kerja otomatis (workflow) untuk menjalankan berbagai tugas terkait pengembangan perangkat lunak, seperti pengujian (test), pembangunan (build), dan pengiriman (deploy).

\n

GitHub Action menggabungkan kekuatan dari pemicu berbasis peristiwa (event-based triggers) dengan eksekusi kode dan serangkaian aksi terstruktur, yang semuanya dapat diatur dan dikonfigurasi di dalam repositori GitHub Kita.

\n

Manfaat GitHub Action

\n
    \n
  1. \n

    Otomatisasi Proses

    \n

    GitHub Action memungkinkan Kita mengotomatisasi proses pengembangan perangkat lunak. Kita dapat membuat alur kerja yang menjalankan langkah-langkah tertentu secara otomatis setiap kali ada perubahan di repositori, seperti pengujian unit (unit test), membangun aplikasi (build), atau mendeploy ke server produksi.

    \n
  2. \n
  3. \n

    Integrasi dengan Repositori GitHub

    \n

    GitHub Action sepenuhnya terintegrasi dengan repositori GitHub Kita. Kita dapat membuat dan mengelola alur kerja otomatis langsung dari repositori, memberikan visibilitas yang mudah dan mengurangi kerumitan.

    \n
  4. \n
  5. \n

    Action Marketplace

    \n

    GitHub Action memiliki Marketplace Action yang kaya dengan berbagai action yang sudah dibuat sebelumnya. Kita dapat dengan mudah menemukan dan menggunakan aksi yang sesuai dengan kebutuhan proyek Kita. Action-action ini mencakup pengujian, pembangunan, notifikasi, penerbitan ke layanan cloud, dan banyak lagi.

    \n
  6. \n
  7. \n

    Fleksibilitas dan Kustomisasi

    \n

    GitHub Action memberikan fleksibilitas tinggi dalam menentukan langkah-langkah dan aksi-aksi yang akan dieksekusi dalam alur kerja. Kita dapat menyesuaikan alur kerja sesuai kebutuhan proyek Kita dengan menambahkan atau mengubah langkah-langkah yang ada.

    \n
  8. \n
  9. \n

    Kolaborasi Tim

    \n

    GitHub Action memudahkan kolaborasi tim dalam pengembangan perangkat lunak. Semua anggota tim dapat melihat, mengelola, dan berkontribusi pada alur kerja otomatis yang ada di repositori. Hal ini memastikan konsistensi dalam pengembangan dan meningkatkan efisiensi kerja tim.

    \n
  10. \n
\n

Cara Menggunakan GitHub Action

\n

Langkah dalam menggunakan GitHub Action secara garis besar sebagai berikut

\n
    \n
  1. Membuat File Konfigurasi: Buat file konfigurasi untuk alur kerja otomatis (misalnya .github/*workflow*s/main.yml) di repositori GitHub Kita.
  2. \n
  3. Menentukan Trigger Event: Tentukan event-trigger yang akan memicu alur kerja otomatis, seperti perubahan di repositori, pembukaan pull request, atau pembuatan tag.
  4. \n
  5. Menentukan Steps: Tentukan langkah-langkah yang akan dieksekusi dalam alur kerja otomatis. Kita dapat menggunakan aksi yang ada di Marketplace atau membuat aksi kustom sesuai kebutuhan.
  6. \n
  7. Menyimpan dan Mengaktifkan: Simpan file konfigurasi dan unggah ke repositori GitHub Kita. GitHub Action secara otomatis akan mengaktifkan dan menjalankan alur kerja otomatis sesuai dengan konfigurasi yang telah ditentukan.
  8. \n
\n

Panduan lengkap membuat CI/CD dengan GitHub Action dapat dibaca pada artikel berikut Membuat CI/CD dengan GitHub Action

","frontmatter":{"title":"Apa itu GitHub Action?","date":"June 17, 2023"}}},"pageContext":{"slug":"/2023/06/apa-itu-github-action/","previous":{"fields":{"slug":"/2023/06/tipe-tiket-jira/"},"frontmatter":{"title":"Mengenal Tiket Jira: Epic, Story, Bug, Task, dan Subtask dalam Manajemen Proyek"}},"next":{"fields":{"slug":"/2023/06/membuat-ci-cd-dengan-github-action/"},"frontmatter":{"title":"Panduan Membuat CI/CD dengan GitHub Action"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2023/06/auto-build-deploy-gatsby-site-ke-github-page-dengan-github-action/page-data.json b/page-data/2023/06/auto-build-deploy-gatsby-site-ke-github-page-dengan-github-action/page-data.json new file mode 100644 index 00000000..18c8f3ec --- /dev/null +++ b/page-data/2023/06/auto-build-deploy-gatsby-site-ke-github-page-dengan-github-action/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2023/06/auto-build-deploy-gatsby-site-ke-github-page-dengan-github-action/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"27ef9a9c-e344-5ffa-b4c3-036c9ee933ca","excerpt":"Blog yang sedang Anda baca ini dibuat dengan GatsbyJs dan dihosting di GitHub Pages. \nSebelumnya, deploy site dilakukan secara manual menggunakan perintah setiap saya menambahkan artikel baru. Auto Deploy Proses ini dapat dibuat otomatis dengan memanfaatkan GitHub Actions…","html":"

Blog yang sedang Anda baca ini dibuat dengan GatsbyJs dan dihosting di GitHub Pages.\nSebelumnya, deploy site dilakukan secara manual menggunakan perintah gatsby build setiap saya menambahkan artikel baru.

\n
gatsby build --prefix-paths && gh-pages -d public
\n

Auto Deploy

\n

Proses ini dapat dibuat otomatis dengan memanfaatkan GitHub Actions workflow.

\n
    \n
  1. \n

    Buat branch baru github-action

    \n

    Semua perubahan file berkaitan dengan pekerjaan GitHub action akan disimpan di sini.

    \n
  2. \n
  3. \n

    Buat Personal Access Token

    \n

    Untuk dapat menggunakan workflow ini, kita juga perlu membuat Token Akses. Buka Setting (klik foto profil di pojok kanan atas) -> Developer Settings (paling bawah) -> Generate new token. Pada token classic, kita pilih scope berikut: repo, workflow, dan write: package.

    \n
  4. \n
  5. \n

    Set access token di actions

    \n

    Copy secret token. Kemudian kembali ke repositori kita: Settings -> Secrets and Variable -> Actions. Klik tombol new repository secret. Kita atur namanya ACCESS_TOKEN yang akan kita gunakan di file deploy.yml.

    \n
  6. \n
  7. \n

    Buat file workflow

    \n

    Untuk melakukan ini, kita akan membuat file bernama deploy.yml di dalam folder .github/workflows.

    \n
    name: Gatsby Publish\n\non:\n  push:\n    branches:\n    - main\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n    - name: Checkout\n        uses: actions/checkout@v3\n    - name: Use Node.js\n        uses: actions/setup-node@v3\n        with:\n          node-version: '16'\n    - name: Gatsby Publish\n        uses: enriikke/gatsby-gh-pages-action@v2\n        with:\n          access-token: ${{ secrets.ACCESS_TOKEN }}\n          deploy-branch: gh-pages\n        env:\n          NPM_CONFIG_LEGACY_PEER_DEPS: true
    \n

    Dalam file ini, kita mendefinisikan bahwa setiap kali melakukan push ke branch main, kita menjalankan job Gatsby Publish.

    \n

    Saya menambahkan setup node untuk memastikan proses build menggunakan versi nodejs yang tepat. Saya juga mengeset deploy-branch: gh-pages karena itu branch yang saya gunakan untuk mempublikasikan blog. Sementara attribute env NPM_CONFIG_LEGACY_PEER_DEPS: true untuk mengantisipasi versi peer dependency yang tidak cocok (namun sebenarnya tetap bisa berfungsi).

    \n
  8. \n
  9. \n

    Buat Pull Request dan Merge

    \n

    Setelah semua siap, kita bisa mencoba script tersebut dengan cara melakukan pull request ke branch main. Github akan menampilkan status workflow di bawah tab Actions. Setiap kali kita melakukan push commit baru atau melakukan merge dari branch lain, actions akan melakukan build pada aplikasi kita.

    \n
  10. \n
\n

Referensi: Auto-Deploy Gatsby to Github Pages

","frontmatter":{"title":"Auto Build dan Deploy Gatsby Site ke GitHub Page dengan GitHub Action","date":"June 03, 2023"}}},"pageContext":{"slug":"/2023/06/auto-build-deploy-gatsby-site-ke-github-page-dengan-github-action/","previous":{"fields":{"slug":"/2023/05/panduan-facility-dan-severity-dalam-syslog/"},"frontmatter":{"title":"Mengenal RFC 5424 - Panduan untuk Facility dan Severity dalam Syslog"}},"next":{"fields":{"slug":"/2023/06/tipe-tiket-jira/"},"frontmatter":{"title":"Mengenal Tiket Jira: Epic, Story, Bug, Task, dan Subtask dalam Manajemen Proyek"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2023/06/membuat-ci-cd-dengan-github-action/page-data.json b/page-data/2023/06/membuat-ci-cd-dengan-github-action/page-data.json new file mode 100644 index 00000000..51b1c0ae --- /dev/null +++ b/page-data/2023/06/membuat-ci-cd-dengan-github-action/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2023/06/membuat-ci-cd-dengan-github-action/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"2fc0b152-d880-5d49-98c1-4d342cdbad9f","excerpt":"Continuous Integration (CI) dan Continuous Deployment (CD) adalah praktik penting dalam pengembangan perangkat lunak modern. CI/CD memungkinkan tim pengembang untuk secara otomatis menguji (test), membangun (build), dan mendeploy perangkat lunak mereka dengan cepat dan efisien…","html":"

Continuous Integration (CI) dan Continuous Deployment (CD) adalah praktik penting dalam pengembangan perangkat lunak modern. CI/CD memungkinkan tim pengembang untuk secara otomatis menguji (test), membangun (build), dan mendeploy perangkat lunak mereka dengan cepat dan efisien.

\n

Salah satu alat yang populer untuk mengimplementasikan CI/CD adalah GitHub Action. Dalam artikel ini, kita akan membahas langkah-langkah untuk membuat CI/CD dengan GitHub Action, sehingga dapat meningkatkan kecepatan dan kualitas pengembangan perangkat lunak Kita.

\n

Persiapan Repositori GitHub

\n

Langkah pertama adalah mempersiapkan repositori GitHub yang akan digunakan untuk proyek Kita. Pastikan repositori sudah dibuat dan perangkat lunak yang ingin Kita bangun dan deploy sudah diunggah ke repositori tersebut.

\n

Membuat File Konfigurasi CI/CD

\n

Selanjutnya, buat file konfigurasi CI/CD di repositori Kita. File ini akan memberi tahu GitHub Action tentang alur kerja atau langkah-langkah yang harus dijalankan saat CI/CD berlangsung. File konfigurasi umumnya dikenal sebagai .github/workflows/main.yml. Kita dapat menggunakan teks editor favorit Kita untuk membuat file ini.

\n

Menentukan Event Trigger

\n

Di dalam file konfigurasi, tentukan trigger event yang akan memicu CI/CD. Misalnya, Kita dapat mengatur CI/CD untuk dijalankan setiap kali ada commit baru ke branch tertentu, ada tag baru yang dibuat, atau ada pull request dibuka. Gunakan sintaks on untuk menentukan event trigger yang sesuai dengan kebutuhan Kita.

\n

Menentukan Jobs

\n

Setiap workflow CI/CD terdiri dari satu atau beberapa job. Job adalah unit kerja yang terdiri dari beberapa langkah. Kita dapat menentukan satu atau lebih job di dalam file konfigurasi. Misalnya, Kita dapat memiliki job untuk menguji kode, membangun aplikasi, dan mendeploy ke lingkungan produksi.

\n

Menentukan Steps

\n

Di dalam setiap job, Kita perlu menentukan langkah-langkah (steps) yang harus dijalankan. Steps adalah langkah-langkah yang harus dilakukan oleh GitHub Action. Misalnya, Kita dapat menggunakan steps untuk menginstal dependensi, menjalankan skrip pengujian, atau membuat paket yang siap untuk dideploy.

\n

Menentukan Actions

\n

Dalam langkah-langkah Kita, Kita dapat menggunakan aksi (actions) yang telah tersedia di Marketplace GitHub atau Kita dapat membuat aksi kustom Kita sendiri. Aksi adalah unit yang dapat digunakan untuk melakukan tugas tertentu dalam CI/CD Kita.

\n

Misalnya, ada aksi untuk menguji kode menggunakan framework tertentu, membangun aplikasi menggunakan alat tertentu, atau mendeploy ke layanan cloud tertentu.

\n

Mengaktifkan CI/CD

\n

Setelah Kita menentukan semua langkah-langkah yang diperlukan, simpan file konfigurasi dan unggah ke repositori GitHub Kita. GitHub Action secara otomatis akan mendeteksi dan mulai menjalankan CI/CD sesuai dengan konfigurasi yang telah Kita tentukan. Kita dapat melihat status CI/CD di tab “Actions” di repositori GitHub Kita.

\n

Memantau dan Mengelola CI/CD

\n

Setelah CI/CD diaktifkan, Kita dapat memantau dan mengelola proses CI/CD. GitHub Action akan memberikan laporan tentang langkah-langkah yang berhasil atau gagal. Jika ada kegagalan, Kita dapat melihat log untuk menemukan penyebabnya dan memperbaikinya.

\n

Mengoptimalkan CI/CD

\n

CI/CD adalah proses yang dapat terus ditingkatkan. Kita dapat mengoptimalkan CI/CD Kita dengan mengubah langkah-langkah, menambahkan skrip tambahan, atau menggunakan aksi yang lebih efisien. Selain itu, Kita dapat mengkonfigurasi notifikasi untuk menerima pemberitahuan tentang keberhasilan atau kegagalan CI/CD.

\n

Contoh

\n

Salah satu contoh CI/CD untuk melakukan auto build dan deploy website dengan Gatsby bisa dibaca pada artikel berikut Auto Build dan Deploy Gatsby Site ke GitHub Page dengan GitHub Action

","frontmatter":{"title":"Panduan Membuat CI/CD dengan GitHub Action","date":"June 23, 2023"}}},"pageContext":{"slug":"/2023/06/membuat-ci-cd-dengan-github-action/","previous":{"fields":{"slug":"/2023/06/apa-itu-github-action/"},"frontmatter":{"title":"Apa itu GitHub Action?"}},"next":{"fields":{"slug":"/2023/07/install-rubygems-error-this-file-is-owned-by-your-os/"},"frontmatter":{"title":"Install Rubygems Error: This file is owned by your OS, not by rubygems upstream"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2023/06/tipe-tiket-jira/page-data.json b/page-data/2023/06/tipe-tiket-jira/page-data.json new file mode 100644 index 00000000..c54a23e8 --- /dev/null +++ b/page-data/2023/06/tipe-tiket-jira/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2023/06/tipe-tiket-jira/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"ab70e812-370f-568f-8c69-bcae5759c3b4","excerpt":"Dalam dunia manajemen proyek, penggunaan perangkat lunak untuk membantu mengatur pekerjaan dan mengelola tugas menjadi hal yang sangat umum. Salah satu perangkat lunak yang populer digunakan dalam manajemen proyek adalah Jira. Jira adalah alat kolaborasi yang membantu tim…","html":"

Dalam dunia manajemen proyek, penggunaan perangkat lunak untuk membantu mengatur pekerjaan dan mengelola tugas menjadi hal yang sangat umum. Salah satu perangkat lunak yang populer digunakan dalam manajemen proyek adalah Jira. Jira adalah alat kolaborasi yang membantu tim pengembangan perangkat lunak dalam melacak pekerjaan, mengatur tugas, dan mengelola aliran kerja proyek.

\n

Dalam Jira, tiket digunakan untuk mewakili tugas-tugas yang perlu diselesaikan dalam proyek. Dalam artikel ini, kita akan menggali lebih dalam tentang jenis tiket yang umum digunakan dalam Jira, yaitu Epic, Story, Bug, Task, dan Subtask.

\n

Epic

\n

Epic adalah unit kerja yang besar dan kompleks yang terdiri dari beberapa story atau tugas yang lebih kecil. Epic merupakan tiket teratas dalam hierarki Jira dan digunakan untuk menggambarkan fitur atau fungsionalitas yang besar. Jenis tiket ini adalah satu-satunya yang dapat ditampilkan dalam tampilan Gantt Cart di bagian roadmap.

\n

Biasanya, Epic tidak dapat diselesaikan dalam satu iterasi atau sprint, melainkan memerlukan beberapa iterasi untuk menyelesaikannya. Epic memberikan cara mudah untuk melacak kemajuan proyek atau inisiatif besar dan memastikan bahwa semua pekerjaan yang saling terkait diselaraskan dan diprioritaskan dengan benar. Epic tidak dimasukkan ke dalam backlog.

\n

Contoh Epic adalah “Pengembangan Fitur Autentikasi Pengguna”.

\n

Story

\n

Story adalah tiket yang merepresentasikan fitur, fungsi, atau kebutuhan pengguna yang dapat diselesaikan dalam satu iterasi atau sprint. Story lebih spesifik dibandingkan dengan Epic, tetapi tetap memiliki ukuran yang cukup besar untuk dipecah menjadi tugas-tugas yang lebih kecil.

\n

Biasanya, Story ditulis dalam format naratif, diungkapkan dalam beberapa kalimat pendek, dan idealnya menggunakan bahasa non-teknis yang berfokus pada kebutuhan pengguna atau pemangku kepentingan. Sintaksis dalam penulisan story dapat dibuat template yang menjawab pertanyaan siapa (who), apa (what/action) dan mengapa (why)

\n
who -> As a <user> \nwhat -> I want to <be able to do ABC>\nwhy -> So that <XYZ can be done>
\n

Contoh Story adalah “Sebagai pengguna, saya ingin dapat mengunggah gambar profil saya.”

\n

Bug

\n

Bug adalah tiket yang digunakan untuk melacak masalah atau kesalahan dalam perangkat lunak. Bug dapat muncul saat pengembangan perangkat lunak atau dalam tahap pengujian. Tiket Bug berisi informasi tentang masalah yang ditemukan, termasuk deskripsi, langkah-langkah untuk mengulang masalah, dan prioritas. Tim pengembangan menggunakan tiket Bug untuk memperbaiki masalah dan menguji perbaikan yang diimplementasikan.

\n

Contoh Bug adalah “Tombol ‘Simpan’ tidak berfungsi saat mengedit profil pengguna.”

\n

Task

\n

Task adalah tiket yang mewakili tugas-tugas kecil yang perlu diselesaikan untuk menyelesaikan Story atau Epic. Task dapat diberikan kepada anggota tim yang bertanggung jawab untuk menyelesaikannya.

\n

Biasanya, Task lebih terperinci, bersifat teknis dan memiliki waktu pengerjaan yang lebih singkat dibandingkan dengan Story atau Epic. Dalam proyek pengembangan perangkat lunak misalnya, Task mewakili aktivitas teknis, seperti mendesain diagram, menulis kode untuk membuat fungsionalitas tertentu, menguji perangkat, atau menyiapkan kumpulan data. Task digunakan sebagai referensi commit (menggunakan ID issue Jira) dan dapat berkaitan dengan sebuah branch pada git.

\n

Contoh Task adalah “Membuat halaman pengaturan profil pengguna” atau “Mengimplementasikan validasi input pada formulir pendaftaran.”

\n

Subtask

\n

Subtask adalah tiket yang digunakan untuk memecah Task menjadi bagian yang lebih kecil dan terpisah. Subtask membantu dalam mengorganisir pekerjaan dan membaginya ke dalam tugas-tugas yang lebih mudah dikelola.

\n

Referensi:

\n","frontmatter":{"title":"Mengenal Tiket Jira: Epic, Story, Bug, Task, dan Subtask dalam Manajemen Proyek","date":"June 08, 2023"}}},"pageContext":{"slug":"/2023/06/tipe-tiket-jira/","previous":{"fields":{"slug":"/2023/06/auto-build-deploy-gatsby-site-ke-github-page-dengan-github-action/"},"frontmatter":{"title":"Auto Build dan Deploy Gatsby Site ke GitHub Page dengan GitHub Action"}},"next":{"fields":{"slug":"/2023/06/apa-itu-github-action/"},"frontmatter":{"title":"Apa itu GitHub Action?"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2023/07/apa-itu-guid/page-data.json b/page-data/2023/07/apa-itu-guid/page-data.json new file mode 100644 index 00000000..91459f2a --- /dev/null +++ b/page-data/2023/07/apa-itu-guid/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2023/07/apa-itu-guid/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"de99145a-543e-5d4f-8fe8-1b902cceb5f3","excerpt":"Dalam pengembangan perangkat lunak, sering kali kita memerlukan identifier unik yang dapat membedakan setiap entitas atau objek. Salah satu caranya adalah dengan menggunakan GUID (Globally Unique Identifier). Apa itu GUID, bagaimana GUID bekerja, dan bagaimana kita dapat…","html":"

Dalam pengembangan perangkat lunak, sering kali kita memerlukan identifier unik yang dapat membedakan setiap entitas atau objek. Salah satu caranya adalah dengan menggunakan GUID (Globally Unique Identifier). Apa itu GUID, bagaimana GUID bekerja, dan bagaimana kita dapat menggunakannya dalam pengembangan perangkat lunak.

\n
    \n
  1. \n

    Apa itu GUID?

    \n

    GUID adalah singkatan dari Globally Unique Identifier. Secara sederhana, GUID adalah sebuah nilai yang unik secara global. GUID terdiri dari angka dan huruf yang disusun dalam format tertentu. Setiap GUID dijamin unik di seluruh dunia, sehingga sangat jarang terjadi kemungkinan duplikat. GUID sering digunakan dalam berbagai konteks, seperti basis data, sistem jaringan, dan pengembangan perangkat lunak.

    \n
  2. \n
  3. \n

    Bagaimana GUID Dibuat?

    \n

    GUID dibuat menggunakan algoritma yang kompleks. GUID memiliki panjang tetap sebesar 128 bit (16 byte) dan biasanya diwakili dalam format alfanumerik yang terdiri dari 32 karakter heksadesimal yang dipisahkan oleh tanda hubung dengan susunan 8-4-4-4-12.

    \n

    Proses pembuatan GUID melibatkan kombinasi waktu saat pembuatan, alamat jaringan, dan nilai acak lainnya. Hal ini memastikan keunikan GUID di seluruh dunia dan mengurangi kemungkinan duplikat yang sangat rendah.

    \n
  4. \n
  5. \n

    Penggunaan GUID dalam Pengembangan Perangkat Lunak

    \n

    GUID memiliki berbagai penggunaan yang bermanfaat dalam pengembangan perangkat lunak. Beberapa penggunaan GUID yang umum meliputi:

    \n
      \n
    • Identifikasi Unik: GUID digunakan untuk memberikan identifikasi unik pada entitas atau objek dalam sistem perangkat lunak. Misalnya, GUID digunakan sebagai ID unik untuk rekaman dalam basis data atau sebagai identifier unik untuk objek dalam program.
    • \n
    • Replikasi Data: GUID digunakan untuk memastikan keunikan data dalam sistem yang direplikasi. Dalam situasi di mana beberapa salinan data ada di berbagai tempat, GUID memungkinkan sistem untuk mengidentifikasi dan melacak salinan yang tepat.
    • \n
    • Keamanan dan Enkripsi: GUID digunakan dalam protokol keamanan dan enkripsi untuk memberikan identifikasi dan kunci yang unik. GUID dapat digunakan sebagai identitas pengguna, token otentikasi, atau kunci enkripsi yang unik.
    • \n
    • Pelacakan Log dan Audit: GUID digunakan untuk melacak dan memantau aktivitas dalam sistem. Dalam log dan audit trail, GUID digunakan untuk mengidentifikasi dan melacak entitas yang terlibat dalam aktivitas tertentu.
    • \n
    \n
  6. \n
  7. \n

    Kelebihan GUID

    \n
      \n
    • Keunikan Global: GUID menjamin keunikan global yang tinggi, membuatnya sangat cocok untuk penggunaan di seluruh dunia.
    • \n
    • Pembuatan Mandiri: GUID dapat dibuat secara mandiri tanpa perlu koordinasi dengan sistem lain. Ini memungkinkan pembuatan GUID dengan cepat dan efisien.
    • \n
    • Skala yang Tinggi: GUID dapat digunakan untuk mengelola jumlah data yang sangat besar dengan kemungkinan duplikat yang hampir nol.
    • \n
    \n
  8. \n
  9. \n

    Keterbatasan GUID

    \n
      \n
    • Panjang: GUID memiliki panjang tetap sebesar 128 bit, yang membuatnya lebih panjang daripada identifier lainnya seperti nomor integer atau string pendek.
    • \n
    • Tidak Dapat Mudah Dibaca: Representasi GUID dalam format alfanumerik tidak mudah dibaca oleh manusia. GUID lebih cocok untuk penggunaan internal dan di dalam sistem daripada untuk ditampilkan kepada pengguna.
    • \n
    \n
  10. \n
","frontmatter":{"title":"Memahami GUID (Globally Unique Identifier) dan Penggunaannya","date":"July 29, 2023"}}},"pageContext":{"slug":"/2023/07/apa-itu-guid/","previous":{"fields":{"slug":"/2023/07/meningkatkan-produktivitas-dengan-chatgpt/"},"frontmatter":{"title":"Meningkatkan Produktivitas Pengembangan Perangkat Lunak dengan ChatGPT"}},"next":{"fields":{"slug":"/2023/08/memahami-dan-mengelola-burnout/"},"frontmatter":{"title":"Memahami Burnout dan Cara Mengelolanya untuk Kesehatan Mental"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2023/07/belajar-dengan-metode-feynman/page-data.json b/page-data/2023/07/belajar-dengan-metode-feynman/page-data.json new file mode 100644 index 00000000..ec7b452d --- /dev/null +++ b/page-data/2023/07/belajar-dengan-metode-feynman/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2023/07/belajar-dengan-metode-feynman/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"5cda67d0-e8f0-508a-84ed-2b919ad2b117","excerpt":"Teknik Feynman didasarkan pada pendekatan yang diambil oleh fisikawan terkenal, Richard Feynman, yang terkenal dengan kemampuannya dalam menjelaskan konsep-konsep yang kompleks secara sederhana dan jelas. Mari kita jelajahi langkah-langkah teknik Feynman untuk meningkatkan…","html":"

Teknik Feynman didasarkan pada pendekatan yang diambil oleh fisikawan terkenal, Richard Feynman, yang terkenal dengan kemampuannya dalam menjelaskan konsep-konsep yang kompleks secara sederhana dan jelas. Mari kita jelajahi langkah-langkah teknik Feynman untuk meningkatkan pemahaman kita.

\n
    \n
  1. Tahap pertama dalam teknik Feynman adalah melakukan penelitian tentang topik yang ingin dipelajari. Baca buku, artikel, atau sumber-sumber lain yang relevan untuk memperoleh pemahaman dasar tentang materi tersebut. Buat catatan penting selama proses penelitian ini.
  2. \n
  3. Langkah selanjutnya adalah mencoba mengajarkan topik tersebut kepada seseorang, seolah-olah Kita sedang menjelaskan kepada anak berusia lima tahun. Pendekatan ini akan memaksa Kita untuk menyederhanakan konsep-konsep yang rumit menjadi bentuk yang lebih mudah dimengerti. Gunakan bahasa yang sederhana dan contoh yang konkret untuk menjelaskan ide-ide tersebut. Jika Kita mengalami kesulitan dalam menjelaskan sesuatu, itu berarti ada celah dalam pemahaman Kita yang perlu diisi.
  4. \n
  5. Isilah celah-celah dalam pengetahuan Kita melalui penelitian tambahan. Identifikasi area-area yang kurang Kita mengerti sepenuhnya dan coba perbaiki pemahaman Kita tentang konsep-konsep tersebut. Gunakan sumber daya tambahan seperti video, tutorial online, atau diskusi dengan orang yang lebih ahli di bidang tersebut.
  6. \n
  7. Setelah Kita memperoleh pemahaman yang lebih baik tentang topik tersebut, langkah selanjutnya adalah menyederhanakan dan meningkatkan penjelasan Kita. Ambil catatan yang Kita buat pada tahap pertama dan perbaiki serta sederhanakan penjelasan tersebut. Gunakan contoh yang lebih relevan dan ilustratif untuk mengilustrasikan konsep-konsep yang Kita pelajari. Pastikan penjelasan Kita tetap sederhana dan mudah dimengerti oleh orang lain.
  8. \n
  9. Langkah terakhir dalam teknik Feynman adalah mengulangi langkah-langkah sebelumnya. Kembali ke tahap kedua dan coba ajarkan materi tersebut kepada orang lain. Dalam proses ini, Kita akan menemukan bahwa ada area-area yang masih membingungkan atau perlu diperbaiki. Ulangi siklus ini sampai Kita dapat menjelaskan topik dengan jelas dan tanpa kesulitan.
  10. \n
\n

Dengan menerapkan teknik Feynman, Kita akan dapat mengembangkan pemahaman yang mendalam tentang topik yang sedang Kita pelajari. Pendekatan ini membantu Kita untuk merangkum, menyederhanakan, dan mengkomunikasikan konsep-konsep dengan jelas. Selain itu, dengan mengajarkan kepada orang lain, Kita juga dapat menguji pemahaman Kita sendiri dan menemukan celah-celah dalam pengetahuan Kita.

\n

Dengan mengadopsi metode ini, Kita akan memperoleh pemahaman yang lebih dalam dan memperkuat fondasi pengetahuan Kita. Terus berlatih dan jangan takut untuk menyederhanakan dan mengajarkan apa yang Kita pelajari. Blog ini juga merupakan upaya latihan dalam menyederhanakan dan mengajarkan apa yang sudah saya pelajari :)

","frontmatter":{"title":"Belajar Apapun dengan Metode Feynman","date":"July 07, 2023"}}},"pageContext":{"slug":"/2023/07/belajar-dengan-metode-feynman/","previous":{"fields":{"slug":"/2023/07/install-rubygems-error-this-file-is-owned-by-your-os/"},"frontmatter":{"title":"Install Rubygems Error: This file is owned by your OS, not by rubygems upstream"}},"next":{"fields":{"slug":"/2023/07/struktur-dan-komponen-url/"},"frontmatter":{"title":"Struktur URL: Memahami Komponen-Komponennya"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2023/07/install-rubygems-error-this-file-is-owned-by-your-os/page-data.json b/page-data/2023/07/install-rubygems-error-this-file-is-owned-by-your-os/page-data.json new file mode 100644 index 00000000..6a55c2e9 --- /dev/null +++ b/page-data/2023/07/install-rubygems-error-this-file-is-owned-by-your-os/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2023/07/install-rubygems-error-this-file-is-owned-by-your-os/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"f19d151f-05fc-58c5-b289-0e978ff98cca","excerpt":"Saya mencoba menginstall Jekyll untuk membuat blog static di GitHub pages. Karena itu saya membutuhkan Rubygems, package manager untuk bahasa pemrograman Ruby yang digunakan untuk pengembangan aplikasi web. Ketika memulai langkah instalasi, saya menghadapi beberapa masalah…","html":"

Saya mencoba menginstall Jekyll untuk membuat blog static di GitHub pages. Karena itu saya membutuhkan Rubygems, package manager untuk bahasa pemrograman Ruby yang digunakan untuk pengembangan aplikasi web. Ketika memulai langkah instalasi, saya menghadapi beberapa masalah. Berikut kronologinya dan langkah-langkah untuk memperbaiki masalah ini.

\n
    \n
  1. Pertama-tama, saya mencoba menginstall Jekyll menggunakan perintah gem install jekyll. Namun, saya mendapatkan pesan error yang mengindikasikan bahwa Ruby saya perlu diperbarui (update).
  2. \n
  3. Untuk mengatasi masalah ini, saya mencoba menginstall atau memperbarui Rubygems dengan menjalankan perintah gem update --system. Sayangnya, saya mendapatkan pesan error ini: ”This file is owned by your OS, not by rubygems upstream”. Pesan ini mengindikasikan bahwa file tersebut dimiliki oleh sistem operasi (OS) saya, bukan oleh Rubygems.
  4. \n
  5. \n

    Setelah melakukan beberapa penelitian, saya mengetahui bahwa masalah ini terjadi karena beberapa komponen Ruby telah terinstall dengan menggunakan package manager seperti Synaptic Package Manager atau apt-get.

    \n

    Dalam kasus tersebut maka hal pertama yang harus saya lakukan adalah menghapus instalasi Ruby terlebih dahulu. Perintah apt-get tampaknya tidak berhasil menghapus sesuai ekspektasi, lalu saya menghapus semua instalasi Ruby menggunakan Synaptic Package Manager.

    \n
      \n
    • Cari dengan kata kunci “ruby”
    • \n
    • Centang item dan pilih ”completely remove installation
    • \n
    \n
  6. \n
  7. Setelah menghapus semua instalasi Ruby yang ada, langkah selanjutnya adalah menginstall Ruby secara langsung menggunakan metode kompilasi dan pembangunan (compile & build) dari source code-nya. Kita dapat mengunduh source code Ruby dari situs resmi Ruby di https://www.ruby-lang.org. Pilih sesuai dengan sistem operasi yang kita gunakan. Saya menggunakan Ubuntu jadi saya memilih tar.gz
  8. \n
  9. Setelah kita mengunduh source code Ruby, ekstrak file arsip tersebut ke direktori yang diinginkan. Kemudian, buka terminal dan arahkan ke direktori yang berisi file kode sumber Ruby yang diekstrak.
  10. \n
  11. \n

    Di terminal, jalankan perintah berikut untuk mengonfigurasi proses kompilasi dan instalasi Ruby:

    \n
    ./configure\nmake\nsudo make install
    \n

    Perintah ./configure akan melakukan konfigurasi sesuai dengan sistem operasi kita. Setelah proses konfigurasi selesai, jalankan perintah make untuk mengompilasi kode sumber Ruby. Terakhir, jalankan perintah sudo make install untuk menginstal Ruby ke sistem kita.

    \n
  12. \n
  13. Setelah instalasi selesai, coba jalankan perintah ruby -v di terminal untuk memastikan bahwa Ruby telah terinstal dengan sukses dan versi yang tepat.
  14. \n
  15. Sekarang, kita dapat mencoba menginstall atau memperbarui Rubygems dengan menjalankan perintah gem update --system. Kali ini, kita seharusnya tidak lagi mendapatkan pesan kesalahan ”This file is owned by your OS, not by rubygems upstream“.
  16. \n
\n

Setelah mengikuti langkah-langkah di atas, saya berhasil mengatasi masalah yang muncul saat menginstall Rubygems. Sekarang saya dapat melanjutkan proses instalasi Jekyll dan menggunakan Rubygems untuk membuat static web dengan lancar.

","frontmatter":{"title":"Install Rubygems Error: This file is owned by your OS, not by rubygems upstream","date":"July 01, 2023"}}},"pageContext":{"slug":"/2023/07/install-rubygems-error-this-file-is-owned-by-your-os/","previous":{"fields":{"slug":"/2023/06/membuat-ci-cd-dengan-github-action/"},"frontmatter":{"title":"Panduan Membuat CI/CD dengan GitHub Action"}},"next":{"fields":{"slug":"/2023/07/belajar-dengan-metode-feynman/"},"frontmatter":{"title":"Belajar Apapun dengan Metode Feynman"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2023/07/meningkatkan-produktivitas-dengan-chatgpt/page-data.json b/page-data/2023/07/meningkatkan-produktivitas-dengan-chatgpt/page-data.json new file mode 100644 index 00000000..3c2f06cd --- /dev/null +++ b/page-data/2023/07/meningkatkan-produktivitas-dengan-chatgpt/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2023/07/meningkatkan-produktivitas-dengan-chatgpt/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"18b134f7-3725-560c-b95e-ae1b810faf11","excerpt":"ChatGPT adalah alat berbasis kecerdasan buatan (Artifical Intelligence/AI) yang sedang merevolusi cara kerja pengembang perangkat lunak. Mari kita lihat bagaimana ChatGPT dapat meningkatkan efisiensi pekerjaan sehari-hari kita dan memberikan keunggulan kompetitif. Temukan…","html":"

ChatGPT adalah alat berbasis kecerdasan buatan (Artifical Intelligence/AI) yang sedang merevolusi cara kerja pengembang perangkat lunak. Mari kita lihat bagaimana ChatGPT dapat meningkatkan efisiensi pekerjaan sehari-hari kita dan memberikan keunggulan kompetitif. Temukan bagaimana cara memanfaatkan kekuatan ChatGPT dan tetap berada di depan dalam dunia pengembangan perangkat lunak yang terus berkembang.

\n
    \n
  1. \n

    Membantu Memahami Kode yang Membingungkan

    \n

    Salah satu cara paling umum yang digunakan oleh pengembang perangkat lunak adalah menggunakan ChatGPT untuk membantu memahami kode yang membingungkan. ChatGPT memiliki pengetahuan yang luas tentang bahasa pemrograman dan dapat menjelaskan cara kerja bagian-bagian kode tertentu dengan cara yang sederhana. Dengan bantuan ChatGPT, kita dapat memahami kode yang sedang kita kerjakan dengan lebih baik dan merasa lebih percaya diri ketika berurusan dengan kode yang kompleks.

    \n
  2. \n
  3. \n

    Menemukan Kesalahan dan Melakukan Review Kode

    \n

    ChatGPT dapat membantu kita menemukan kesalahan di dalam kode dan memberikan saran perbaikan. Ketika kita bekerja pada suatu proyek, seringkali kita menemukan bahwa sesuatu tidak berjalan seperti yang diharapkan. ChatGPT dapat melihat kode kita dan menunjukkan kesalahan atau area yang mungkin perlu diperbaiki. Ini juga dapat memberikan saran tentang cara membuat kode kita lebih baik.

    \n
  4. \n
  5. \n

    Menerjemahkan Kode antar Bahasa Pemrograman

    \n

    ChatGPT juga dapat membantu kita menerjemahkan kode dari satu bahasa pemrograman ke bahasa pemrograman lain. Ini sangat berguna jika kita mendapatkan solusi dalam satu bahasa, tetapi proyek kita menggunakan bahasa pemrograman yang berbeda. ChatGPT memiliki pengetahuan tentang banyak bahasa pemrograman, sehingga dapat membantu kita melakukan perubahan yang diperlukan. Dengan bantuan ChatGPT, kita dapat mengubah kode dari satu bahasa ke bahasa lain dengan mudah. Hal ini menghemat waktu, membantu menghindari kesalahan saat dilakukan secara manual, dan juga memperluas pengetahuan kita tentang berbagai bahasa pemrograman.

    \n
  6. \n
  7. \n

    Pembelajaran Bahasa Pemrograman Baru

    \n

    ChatGPT dapat menjadi teman belajar saat kita mempelajari bahasa pemrograman baru. Misalnya, saat kita harus menyelesaikan sebuah proyek dalam bahasa Rust yang baru bagi kita. Kita dapat bertanya kepada ChatGPT bagaimana melakukannya. ChatGPT dapat memberikan bimbingan, contoh, dan bahkan memberi potongan kode untuk membantu kita memulai mengerjakan sesuatu. Dengan mengajukan pertanyaan-pertanyaan spesifik atau meminta contoh-contoh, kita dapat belajar cara menggunakan suatu library, fungsi, atau fitur bahasa pemrograman yang masih baru bagi kita. Dengan bantuan ChatGPT, kita dapat dengan cepat memahami lebih baik bahasa pemrograman baru tersebut dan menyelesaikan proyek kita dengan efisien.

    \n
  8. \n
  9. \n

    Menulis Unit Test

    \n

    ChatGPT dapat membantu kita menulis unit test untuk kode kita. Unit test penting karena membantu memastikan kode kita berfungsi dengan benar dan perubahan yang kita lakukan tidak merusak fungsionalitas yang ada. Menulis unit test yang baik dapat menjadi tantangan dan kadang-kadang membosankan, tetapi ChatGPT dapat membantu mempermudahnya. Dengan bantuan ChatGPT, kita dapat membuat unit test komprehensif untuk kode produksi dalam dunia nyata, memastikan kode kita berfungsi dengan benar dan mempertahankan tingkat kualitas perangkat lunak yang tinggi.

    \n
  10. \n
  11. \n

    Mengubah dan Memperbaiki Kode

    \n

    ChatGPT dapat membantu kita mengubah kode yang ada untuk menambahkan lebih banyak fungsionalitas. Dengan pemahaman ChatGPT tentang bahasa pemrograman dan konsep rekayasa perangkat lunak, ia dapat membantu kita meningkatkan kode kita dengan memberikan saran perubahan atau memberikan potongan kode baru. Dengan bantuan ChatGPT, kita dapat menghemat waktu, memastikan perubahan kita diimplementasikan dengan benar, dan belajar teknik baru untuk meningkatkan kode kita.

    \n
  12. \n
  13. \n

    Menulis Dokumentasi dan Komentar

    \n

    ChatGPT dapat membantu kita menulis dokumentasi dan komentar untuk kode kita. Dokumentasi dan komentar yang ditulis dengan baik sangat penting untuk mempertahankan keberlanjutan kode kita. ChatGPT dapat membantu kita menulis komentar dan dokumentasi yang jelas, ringkas, dan informatif, bahkan untuk kode dunia nyata yang kompleks. Dengan bantuan ChatGPT, kita dapat memastikan bahwa kode kita mudah dipahami dan dipelihara, sehingga lebih mudah diakses oleh pengembang lain.

    \n
  14. \n
\n

ChatGPT adalah alat yang mengubah permainan bagi pengembang perangkat lunak. Ia dapat membantu kita menangani pekerjaan yang kompleks, memahami bahasa pemrograman baru, dan meningkatkan kode kita dengan efisien. Dengan memanfaatkan ChatGPT, kita dapat menjadi pengembang yang lebih baik dan membuat pekerjaan kita lebih menyenangkan. Namun, sebagaimana alat-alat lain yang tercipta di dunia, fungsinya adalah untuk membantu kita. Semua keputusan yang diambil dan hasil akhirnya bergantung kepada kita sebagai penggunanya.

","frontmatter":{"title":"Meningkatkan Produktivitas Pengembangan Perangkat Lunak dengan ChatGPT","date":"July 25, 2023"}}},"pageContext":{"slug":"/2023/07/meningkatkan-produktivitas-dengan-chatgpt/","previous":{"fields":{"slug":"/2023/07/pola-arsitektur-api-populer/"},"frontmatter":{"title":"6 Pola Arsitektur API yang Populer Saat Ini"}},"next":{"fields":{"slug":"/2023/07/apa-itu-guid/"},"frontmatter":{"title":"Memahami GUID (Globally Unique Identifier) dan Penggunaannya"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2023/07/pola-arsitektur-api-populer/page-data.json b/page-data/2023/07/pola-arsitektur-api-populer/page-data.json new file mode 100644 index 00000000..5d04cc7b --- /dev/null +++ b/page-data/2023/07/pola-arsitektur-api-populer/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2023/07/pola-arsitektur-api-populer/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"eb419a12-faf5-51f3-ba6a-d37662a0b88a","excerpt":"Dalam pengembangan perangkat lunak modern, API (Application Programming Interfaces) memainkan peran yang penting. Mereka bertindak sebagai jembatan, komponen inilah yang membuat perangkat lunak yang berbeda dapat saling berkomunikasi dan berinteraksi. API bertanggung jawab atas…","html":"

Dalam pengembangan perangkat lunak modern, API (Application Programming Interfaces) memainkan peran yang penting. Mereka bertindak sebagai jembatan, komponen inilah yang membuat perangkat lunak yang berbeda dapat saling berkomunikasi dan berinteraksi.

\n

API bertanggung jawab atas pertukaran data, pemanggilan fungsi, dan integrasi keseluruhan antara sistem perangkat lunak yang berbeda. Untuk memfasilitasi operasi-operasi ini, terdapat beberapa gaya arsitektur, masing-masing dengan filosofi desain dan kasus penggunaan masing-masing.

\n
    \n
  1. \n

    SOAP

    \n

    SOAP (Simple Object Access Protocol) adalah salah satu API tertua dan matang dalam industri. Ia menggunakan XML sebagai basisnya, dan digunakan secara luas dalam layanan keuangan dan gerbang pembayaran (payment gateway) di mana keamanan dan keKitalan menjadi kunci. Namun, jika Kita bekerja pada aplikasi mobile yang ringan atau prototipe cepat, SOAP mungkin terlalu rumit karena kompleksitas dan kelengkapan fiturnya.

    \n
  2. \n
  3. \n

    RESTful API

    \n

    API RESTful (Representational State Transfer) adalah tulang punggung internet saat ini. API jenis ini sangat populer, mudah diimplementasikan, dan menggunakan metode HTTP. Kebanyakan layanan web yang kita gunakan sehari-hari, seperti Twitter atau YouTube, didukung oleh API RESTful. Namun, perlu diingat, jika Kita membutuhkan data real-time atau beroperasi dengan model data yang sangat terhubung, REST mungkin bukan pilihan terbaik.

    \n
  4. \n
  5. \n

    GraphQL

    \n

    GraphQL bukan hanya gaya arsitektur, tetapi juga bahasa kueri yang memungkinkan klien untuk meminta data tertentu sesuai kebutuhan. Ini menghindari pengambilan data yang berlebihan atau kekurangan.

    \n

    Kita hanya meminta data yang Kita butuhkan secara spesifik, yang mengarah pada komunikasi jaringan yang lebih efisien dan respon yang lebih cepat. GraphQL dikembangkan oleh Facebook untuk memberikan data yang efisien dan tepat kepada miliaran pengguna, dan sekarang digunakan oleh perusahaan seperti GitHub dan Shopify.

    \n

    Fleksibilitas dan efisiensinya membuatnya menjadi pilihan yang kuat untuk aplikasi dengan kebutuhan data yang kompleks. Namun, belajar GraphQL membutuhkan waktu yang cukup lama dan mungkin terlalu berlebihan untuk aplikasi yang sederhana. Selain itu, GraphQL membutuhkan pemrosesan yang lebih banyak di sisi server karena kemampuannya dalam melakukan query yang fleksibel.

    \n
  6. \n
  7. \n

    gRPC

    \n

    gRPC (Google Remote Procedure Call) adalah kerangka kerja modern yang kinerjanya tinggi dan menggunakan Protocol Buffers. Ia menjadi favorit dalam arsitektur microservice. Perusahaan seperti Netflix menggunakan gRPC untuk mengelola komunikasi antar-layanan yang besar. Namun, jika Kita berurusan dengan klien browser, gRPC mungkin menimbulkan beberapa tantangan karena dukungan browser yang terbatas.

    \n
  8. \n
  9. \n

    WebSocket

    \n

    WebSocket berkaitan dengan koneksi real-time, dua arah, dan persisten. Ini sempurna untuk aplikasi obrolan langsung (chat) dan game real-time, di mana pertukaran data dengan latensi rendah menjadi penting. Namun, jika aplikasi Kita tidak membutuhkan data real-time, menggunakan WebSocket mungkin menjadi beban yang tidak perlu.

    \n
  10. \n
  11. \n

    Webhook

    \n

    Webhook berkaitan dengan panggilan HTTP yang didorong oleh peristiwa (event based trigger) dan operasi asinkron. Misalnya, GitHub menggunakan webhook untuk memberi tahu sistem lain ketika ada commit baru. Namun, ingatlah bahwa jika Kita membutuhkan komunikasi sinkron atau respons yang segera, webhook mungkin bukan pilihan terbaik.

    \n
  12. \n
\n

Itulah rangkuman singkat tentang gaya arsitektur API yang paling umum digunakan. Seperti yang kita lihat, tidak ada satu gaya yang cocok untuk semua kasus. Sesuaikan pendekatan Kita dengan kebutuhan proyek yang unik. Pahami kelebihan dan kekurangan masing-masing arsitektur agar mendapatkan manfaat yang optimal dengan biaya paling rendah.

","frontmatter":{"title":"6 Pola Arsitektur API yang Populer Saat Ini","date":"July 22, 2023"}}},"pageContext":{"slug":"/2023/07/pola-arsitektur-api-populer/","previous":{"fields":{"slug":"/2023/07/struktur-dan-komponen-url/"},"frontmatter":{"title":"Struktur URL: Memahami Komponen-Komponennya"}},"next":{"fields":{"slug":"/2023/07/meningkatkan-produktivitas-dengan-chatgpt/"},"frontmatter":{"title":"Meningkatkan Produktivitas Pengembangan Perangkat Lunak dengan ChatGPT"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2023/07/struktur-dan-komponen-url/page-data.json b/page-data/2023/07/struktur-dan-komponen-url/page-data.json new file mode 100644 index 00000000..6d8bdb40 --- /dev/null +++ b/page-data/2023/07/struktur-dan-komponen-url/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2023/07/struktur-dan-komponen-url/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"78b6b292-3dc2-59ce-aae1-8c719710bd66","excerpt":"TL;DR Contoh URL = protocol = domain name = port = path = query = parameters = fragments URL (Uniform Resource Locator) adalah alamat yang digunakan untuk mengidentifikasi dan mengakses sumber daya di internet. URL memiliki struktur yang terdiri dari beberapa komponen…","html":"

TL;DR

\n

Contoh URL

\n
https://blog.devjurnal.com:8080/subscribe?utm_source=menu#nowhere
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
https://= protocol
blog.devjurnal.com= domain name
:8080= port
/subscribe= path
?= query
utm_source=menu= parameters
#nowhere= fragments
\n

URL (Uniform Resource Locator) adalah alamat yang digunakan untuk mengidentifikasi dan mengakses sumber daya di internet. URL memiliki struktur yang terdiri dari beberapa komponen penting. Mari kita lihat ringkasan tentang struktur URL dan apa arti dari setiap komponennya.

\n
    \n
  1. \n

    Protokol (Protocol)

    \n

    Protokol menentukan aturan dan format komunikasi yang digunakan untuk mengakses sumber daya di internet. Dalam contoh URL di atas, protokol yang digunakan adalah ”https://”. Protokol HTTPS digunakan untuk mengakses sumber daya melalui koneksi yang aman dan terenkripsi.

    \n
  2. \n
  3. \n

    Nama Domain (Domain Name)

    \n

    Nama domain merupakan identifikasi unik untuk mengarahkan ke alamat IP yang sesuai dengan server yang menghosting sumber daya yang ingin diakses. Pada contoh URL di atas, nama domain adalah “blog.devjurnal.com”. Nama domain ini mengarahkan ke server yang menyediakan konten atau sumber daya yang ingin diakses.

    \n
  4. \n
  5. \n

    Port

    \n

    Port adalah angka yang menentukan saluran khusus melalui mana klien dapat berkomunikasi dengan server yang dituju. Pada contoh URL di atas, angka “8080” adalah nomor port yang ditentukan untuk mengakses sumber daya di server tersebut. Port ini bersifat opsional dan biasanya tidak diperlukan jika menggunakan port standar seperti 80 untuk HTTP atau 443 untuk HTTPS.

    \n
  6. \n
  7. \n

    Path

    \n

    Path adalah bagian dari URL yang menunjukkan jalur ke sumber daya yang ingin diakses di dalam server. Pada contoh URL di atas, path adalah “/subscribe”. Path ini dapat menggambarkan struktur folder dan file pada server yang mengarahkan ke sumber daya yang diminta.

    \n
  8. \n
  9. \n

    Query

    \n

    Query adalah bagian URL setelah tanda tanya (”?”) yang digunakan untuk mengirimkan data tambahan ke server. Query biasanya berisi parameter dan nilainya yang digunakan oleh server untuk menghasilkan respons yang sesuai. Pada contoh URL di atas, query adalah “utm_source=menu”. Jika ada tambahan query, akan dilanjutkan dengan simbol ”&“. Parameter ini dapat memberikan informasi tambahan kepada server, seperti sumber lalu lintas pengguna.

    \n
  10. \n
  11. \n

    Fragmen

    \n

    Fragmen adalah bagian URL yang mengacu pada bagian tertentu dari halaman atau sumber daya yang diakses. Biasanya, fragmen diwakili oleh tanda pagar (”#”) diikuti dengan teks atau nama elemen tertentu. Pada contoh URL di atas, fragmen adalah “nowhere”. Fragmen ini berguna untuk langsung mengarahkan pengguna ke bagian tertentu dari halaman yang diakses.

    \n
  12. \n
","frontmatter":{"title":"Struktur URL: Memahami Komponen-Komponennya","date":"July 13, 2023"}}},"pageContext":{"slug":"/2023/07/struktur-dan-komponen-url/","previous":{"fields":{"slug":"/2023/07/belajar-dengan-metode-feynman/"},"frontmatter":{"title":"Belajar Apapun dengan Metode Feynman"}},"next":{"fields":{"slug":"/2023/07/pola-arsitektur-api-populer/"},"frontmatter":{"title":"6 Pola Arsitektur API yang Populer Saat Ini"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2023/08/apa-itu-datadog-apm/page-data.json b/page-data/2023/08/apa-itu-datadog-apm/page-data.json new file mode 100644 index 00000000..c2854f6e --- /dev/null +++ b/page-data/2023/08/apa-itu-datadog-apm/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2023/08/apa-itu-datadog-apm/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"35e6db01-459a-54ee-b503-4844312f4729","excerpt":"Dalam dunia pengembangan perangkat lunak, memastikan kinerja aplikasi yang optimal adalah kunci kesuksesan. Untuk mencapai hal tersebut, kita perlu memantau dan menganalisis kinerja aplikasi secara terus-menerus. Salah satu alat yang dapat membantu kita dalam hal ini adalah…","html":"

Dalam dunia pengembangan perangkat lunak, memastikan kinerja aplikasi yang optimal adalah kunci kesuksesan. Untuk mencapai hal tersebut, kita perlu memantau dan menganalisis kinerja aplikasi secara terus-menerus. Salah satu alat yang dapat membantu kita dalam hal ini adalah DataDog APM (Application Performance Monitoring). Berikut ini adalah fitur-fitur penting dari DataDog APM dan bagaimana penggunaannya dapat mengoptimalkan kinerja aplikasi kita.

\n
    \n
  1. \n

    Pemantauan Kinerja end-to-end

    \n

    DataDog APM memberikan visibilitas end-to-end terhadap kinerja aplikasi kita. Alat ini melacak setiap permintaan dan respons yang terjadi dalam aplikasi, sehingga kita dapat memahami bagaimana setiap komponen bekerja dan berinteraksi. Dengan DataDog APM, kita dapat melihat waktu respons, durasi pemanggilan ke basis data, dan latensi jaringan. Hal ini memungkinkan kita untuk mengidentifikasi fluktuasi kinerja, mengidentifikasi bottlenecks, dan mengoptimalkan performa aplikasi secara keseluruhan.

    \n
  2. \n
  3. \n

    Pelacakan Distribusi dan Konteks Transaksi

    \n

    DataDog APM memungkinkan pelacakan distribusi dan konteks transaksi dalam aplikasi kita. Dengan fitur ini, kita dapat melacak perjalanan suatu transaksi melalui berbagai layanan dan komponen aplikasi. DataDog APM juga memungkinkan kita untuk menambahkan metadata tambahan ke dalam transaksi, seperti ID pengguna atau informasi pelacakan kustom lainnya. Hal ini sangat berguna dalam menelusuri dan menganalisis masalah atau gangguan kinerja yang terjadi dalam aplikasi kita.

    \n
  4. \n
  5. \n

    Visualisasi dan Analisis yang Kuat

    \n

    DataDog APM menyediakan visualisasi yang kuat untuk membantu kita memahami kinerja aplikasi secara visual. Dashboard interaktif memungkinkan kita untuk memantau metrik dan tren kinerja secara real-time. DataDog APM juga menawarkan fitur analisis yang kuat, termasuk pemetaan tren kinerja seiring waktu, pembandingan kinerja antar versi aplikasi, dan deteksi anomali otomatis. Dengan analisis ini, kita dapat mengidentifikasi masalah kinerja, mengoptimalkan kode, dan meningkatkan pengalaman pengguna.

    \n
  6. \n
  7. \n

    Integrasi yang Luas

    \n

    DataDog APM dapat dengan mudah diintegrasikan dengan berbagai teknologi dan lingkungan. Alat ini mendukung banyak bahasa pemrograman, framework, dan teknologi yang umum digunakan dalam pengembangan aplikasi. DataDog APM juga memiliki integrasi yang kuat dengan alat-alat lain dalam ekosistem DataDog, seperti pemantauan infrastruktur, log management, dan layanan lainnya. Integrasi yang luas ini memungkinkan kita untuk mendapatkan visibilitas dan pemahaman yang komprehensif tentang kinerja aplikasi kita.

    \n
  8. \n
  9. \n

    Pemberitahuan dan Alarm

    \n

    DataDog APM memungkinkan kita untuk mengatur pemberitahuan dan alarm yang dapat memberi tahu kita tentang masalah kinerja atau gangguan yang terjadi dalam aplikasi kita. Kita dapat mengonfigurasi ambang batas tertentu untuk metrik kinerja, seperti waktu respons yang melampaui batas tertentu atau jumlah permintaan yang tinggi. Ketika ambang batas tersebut tercapai, DataDog APM akan memberi tahu kita melalui pesan atau saluran komunikasi yang kita pilih. Hal ini memungkinkan kita untuk secara proaktif menangani masalah kinerja sebelum pengguna merasakannya.

    \n
  10. \n
","frontmatter":{"title":"Mengoptimalkan Kinerja Aplikasi dengan DataDog APM","date":"August 05, 2023"}}},"pageContext":{"slug":"/2023/08/apa-itu-datadog-apm/","previous":{"fields":{"slug":"/2023/08/memahami-dan-mengelola-burnout/"},"frontmatter":{"title":"Memahami Burnout dan Cara Mengelolanya untuk Kesehatan Mental"}},"next":{"fields":{"slug":"/2023/08/technical-debt-hutang-yang-harus-dibayar/"},"frontmatter":{"title":"Technical Debt, Hutang Teknis yang Harus Dibayar"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2023/08/cara-belajar-lebih-baik-dan-lebih-cepat-sebagai-programmer/page-data.json b/page-data/2023/08/cara-belajar-lebih-baik-dan-lebih-cepat-sebagai-programmer/page-data.json new file mode 100644 index 00000000..2c916586 --- /dev/null +++ b/page-data/2023/08/cara-belajar-lebih-baik-dan-lebih-cepat-sebagai-programmer/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2023/08/cara-belajar-lebih-baik-dan-lebih-cepat-sebagai-programmer/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"6a9f7faa-4fdd-5d76-8443-4c0d4a7d063e","excerpt":"Belajar keterampilan baru adalah kunci untuk tetap relevan dan berkembang dalam karier di dunia rekayasa perangkat lunak yang berkembang pesat. Bagaimana cara belajar lebih baik dan lebih cepat sebagai seorang insinyur perangkat lunak? Artikel ini akan menguraikan lima strategi…","html":"

Belajar keterampilan baru adalah kunci untuk tetap relevan dan berkembang dalam karier di dunia rekayasa perangkat lunak yang berkembang pesat. Bagaimana cara belajar lebih baik dan lebih cepat sebagai seorang insinyur perangkat lunak? Artikel ini akan menguraikan lima strategi utama yang memastikan pembelajaran yang berkelanjutan dan pertumbuhan pribadi, sehingga membantu Kita meningkatkan proses pembelajaran.

\n

1. Dorong Rasa Ingin Tahu

\n

Sebagai manusia, rasa ingin tahu adalah bagian dari sifat kita. Setiap kali Kita menemukan sesuatu yang menarik di bidang Kita, penting untuk mengenali dan mengeksplorasinya lebih dalam. Ketika Kita menemukan topik atau konsep yang memicu minat Kita, catatlah segera. Gunakan aplikasi pencatat untuk mendokumentasikan apa yang membuat Kita penasaran dan mengapa Kita tertarik padanya. Dengan mencatat rasa ingin tahu Kita, Kita menciptakan motivasi pribadi untuk mempelajari materi pelajaran lebih mendalam. Tinjau kembali catatan Kita secara berkala untuk mengingatkan diri Kita tentang topik yang ingin Kita telusuri lebih lanjut.

\n

2. Mulai dengan Segera

\n

Mengalahkan kemalasan dan penundaan adalah hal yang sangat penting untuk mempercepat pembelajaran Kita. Alih-alih menunggu waktu yang tepat atau sumber daya terbaik, mulailah belajar sekarang juga. Saat Kita memulai perjalanan pembelajaran dari nol, segala sumber daya sangat berharga. Jangan buang waktu mencari sumber daya terbaik; sebaliknya, pelajari saja materi yang tersedia. Penting untuk mulai membangun pengetahuan dan familiaritas Kita dengan materi pelajaran. Memulai dengan segera memungkinkan Kita mendapatkan momentum dan membuat kemajuan.

\n

3. Terapkan Langsung

\n

Alih-alih hanya merancang rencana dalam pikiran Kita, fokuslah pada implementasi langsung. Sangat mudah untuk terjebak dalam euforia membuat konsep dan membayangkan ide tanpa mengambil tindakan nyata. Untuk menghindari jebakan ini, siapkan lingkungan pengembangan lokal Kita dan mulailah membuat kode.

\n

Entah itu mempelajari bahasa pemrograman baru, menjelajahi database, atau teknologi lainnya, terlibatlah aktif dalam implementasi praktis. Hindari terperangkap dalam siklus tutorial yang tak berujung, di mana Kita terus menggunakan tutorial tanpa menerapkan apa yang telah Kita pelajari. Pastikan bahwa ide dan pengetahuan Kita diterjemahkan ke dalam keterampilan praktis.

\n

4. Perkuat Fondasi

\n

Untuk memahami konsep-konsep lanjutan secara efektif, penting untuk membangun fondasi yang kuat di dasar-dasarnya. Menghabiskan lebih banyak waktu pada konsep dasar dan secara bertahap maju ke topik yang lebih lanjut memungkinkan pemahaman yang lebih mendalam. Mulai dari nol mutlak dan secara bertahap tingkatkan pengetahuan dan keterampilan Kita akan mempermudah pemahaman konsep yang kompleks. Jangan terburu-buru menjelajahi topik lanjutan tanpa pemahaman yang kuat tentang dasar-dasarnya, hal ini dapat membuat frustrasi dan seringkali membuat kita ingin menyerah. Investasikan waktu untuk membangun fondasi yang kuat, dan itu akan membuka jalan untuk pemahaman konsep tingkat lanjut yang lebih mudah.

\n

5. Time Boxing

\n

Hindari kebosanan atau kehilangan fokus dengan melakukan beberapa kegiatan belajar secara bersamaan. Alih-alih hanya fokus pada satu topik, pilihlah dua atau tiga bidang minat untuk dipelajari secara paralel. Jika Kita merasa bosan atau terjebak dengan satu topik, beralihlah ke topik lain untuk sementara. Dengan mendiversifikasi upaya belajar Kita, Kita akan tetap termotivasi dan membuat kemajuan di berbagai bidang. Namun, penting untuk menetapkan batasan dan batas waktu untuk setiap pengejaran. “Time boxing” memungkinkan Kita untuk mengevaluasi kemajuan Kita secara berkala dan memutuskan apakah akan melanjutkan atau mengalihkan fokus Kita.

\n

Sumber:\nHow to learn better and faster as a software engineer?

","frontmatter":{"title":"Cara Belajar Lebih Baik dan Lebih Cepat sebagai Programmer","date":"August 16, 2023"}}},"pageContext":{"slug":"/2023/08/cara-belajar-lebih-baik-dan-lebih-cepat-sebagai-programmer/","previous":{"fields":{"slug":"/2023/08/cara-programmer-junior-ke-senior/"},"frontmatter":{"title":"Cara Programmer Junior menjadi Senior 1"}},"next":{"fields":{"slug":"/2023/08/perbaikan-berkelanjutan-dengan-sprint-retrospective/"},"frontmatter":{"title":"Perbaikan Berkelanjutan dengan Sprint Retrospective"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2023/08/cara-programmer-junior-ke-senior/page-data.json b/page-data/2023/08/cara-programmer-junior-ke-senior/page-data.json new file mode 100644 index 00000000..f7d6265b --- /dev/null +++ b/page-data/2023/08/cara-programmer-junior-ke-senior/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2023/08/cara-programmer-junior-ke-senior/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"af2eedfc-cb88-51ca-bc92-494a664ab664","excerpt":"Memulai perjalanan sebagai programmer adalah momen yang menyenangkan. Kita mempelajari hal-hal baru dan akhirnya melihat kode Kita dipublikasikan. Namun, seiring berjalannya waktu, Kita mungkin mulai memikirkan masa depan dan mempertimbangkan bagaimana cara mempersiapkan diri…","html":"

Memulai perjalanan sebagai programmer adalah momen yang menyenangkan. Kita mempelajari hal-hal baru dan akhirnya melihat kode Kita dipublikasikan. Namun, seiring berjalannya waktu, Kita mungkin mulai memikirkan masa depan dan mempertimbangkan bagaimana cara mempersiapkan diri untuk menjadi seorang programmer senior, serta keterampilan dan kompetensi penting yang dibutuhkan untuk mencapai tujuan tersebut.

\n

Kompetensi Teknis Utama untuk Kemajuan Karir

\n

Menunjukkan pemahaman yang kuat dalam bidang teknis sangat penting untuk langkah selanjutnya dalam karier Kita. Menguasai dasar-dasar pemrograman, struktur data, algoritma, dan praktik pengembangan perangkat lunak adalah hal yang sangat penting. Fokuslah pada penulisan kode yang bersih dan mudah dipelihara dengan mengikuti praktik terbaik untuk pengujian, pengoptimalan kinerja, dan skalabilitas.

\n

Namun, menjadi seorang pengembang perangkat lunak yang kuat hanya akan membawa Kita sejauh ini. Untuk berhasil sebagai seorang senior engineer, rekan kerja, manajer, dan sponsor Kita juga harus mengakui kualitas pekerjaan Kita serta kemampuan Kita merancang dan mengembangkan solusi untuk masalah yang kompleks. Mencatat dan mendokumentasikan kesuksesan Kita melalui pull request dapat membantu memberikan bukti tentang pengetahuan terapan Kita (ini juga bisa dimasukkan dalam dokumen kebanggaan, yang akan dibahas nanti).

\n

Hubungkan Antara Teknik dan Pendapatan di dalam Bisnis

\n

Memiliki pemahaman yang kuat tentang domain bisnis Kita akan membantu Kita mengkontekstualisasikan masalah yang Kita selesaikan, memahami dampak pekerjaan Kita pada perusahaan, dan mengidentifikasi serta memilih tugas yang tepat. Konsistensi dalam memberikan pekerjaan berkualitas tinggi adalah kunci untuk menunjukkan kemampuan Kita untuk memenuhi atau bahkan melampaui harapan.

\n

Jika Kita ingin naik jabatan di perusahaan, Kita memerlukan pemahaman mendalam tentang bagaimana logika teknis berinteraksi dengan logika bisnis perusahaan Kita. Dengan kata lain, bagaimana teknologi yang Kita kerjakan terkait dengan pendapatan perusahaan? Pendekatan dalam pengambilan keputusan teknik akan berbeda antara perusahaan yang bergantung pada pendapatan dari periklanan dan perusahaan yang berbasis pada model langganan. Memahami ini akan membantu Kita menentukan area di mana Kita bisa mengembangkan keterampilan Kita.

\n

Tunjukkan Pemahaman Kita

\n

Ada berbagai cara untuk menunjukkan pemahaman Kita tentang domain bisnis dan potensi kepemimpinan Kita. Salah satunya adalah dengan mengidentifikasi peluang untuk peningkatan secara bertahap dengan mengamati proses saat ini secara cermat dan menemukan cara untuk memperbaikinya. Kita juga dapat membuat cerita pengguna (user story), yang akan membantu menyoroti kebutuhan pengguna yang dapat menjadi landasan untuk perbaikan produk.

\n

Berpartisipasi dalam mengulas kode (code review) memberikan kesempatan untuk memberikan umpan balik konstruktif kepada anggota tim Kita dan menunjukkan kemampuan Kita dalam kepemimpinan dan kerjasama yang efektif. Selain itu, Kita dapat bergabung dengan tim lain untuk mengatasi tantangan teknis dan menunjukkan kemauan Kita untuk bekerja lintas kelompok. Terakhir, manfaatkan ruang gerak di tempat yang Kita lihat dan tawarkan solusi untuk membangun kepercayaan pada produk.

\n

Buat “Dokumen Kebanggaan”

\n

“Dokumen kebanggaan” adalah cara untuk menunjukkan keahlian Kita dan mencatat pencapaian Kita. Dokumen ini akan sangat berharga saat menulis ulasan diri Kita, dan juga dapat dibagikan kepada pimpinan Kita ketika membahas tujuan profesional dan perkembangan menuju promosi. Dokumen ini harus mencakup:

\n
    \n
  1. \n

    Proyek yang Sudah Diselesaikan

    \n

    Cantumkan semua proyek yang pernah Kita kerjakan, termasuk teknologi yang digunakan, tujuan proyek, dan yang paling penting, hasil yang telah dicapai. Fokus pada proyek yang diselesaikan sebagai bagian dari tim atau yang memiliki dampak nyata pada kebutuhan bisnis.

    \n
  2. \n
  3. \n

    Keterampilan Teknis

    \n

    Cantumkan keterampilan teknis yang telah Kita kembangkan atau tingkatkan dari waktu ke waktu. Ini bisa termasuk bahasa pemrograman, kerangka kerja pengembangan perangkat lunak (framework), atau teknologi lainnya.

    \n
  4. \n
  5. \n

    Pengembangan Profesional

    \n

    Sertakan catatan pelatihan, kursus, dan sertifikasi yang telah Kita selesaikan untuk menunjukkan komitmen Kita terhadap pembelajaran berkelanjutan dan pertumbuhan profesional.

    \n
  6. \n
  7. \n

    Pencapaian dan Pengakuan

    \n

    Dokumentasikan setiap pencapaian atau pengakuan penting yang telah Kita raih, seperti menyelesaikan proyek lebih cepat dari jadwal atau berhasil memperbaiki bug yang rumit.

    \n
  8. \n
  9. \n

    Umpan Balik dan Pengakuan

    \n

    Rinci setiap umpan balik atau pengakuan yang telah Kita terima dari kolega atau atasan, seperti ulasan kinerja yang positif, pengakuan atas pekerjaan yang luar biasa, atau pujian atas kontribusi Kita pada tim.

    \n
  10. \n
  11. \n

    Kontribusi Open Source

    \n

    Tunjukkan kontribusi Kita pada proyek open source dan kerja sukarela lainnya, karena ini menunjukkan kesediaan Kita untuk berbagi pengetahuan dan berkolaborasi.

    \n
  12. \n
\n

Keterampilan Komunikasi dan Kolaborasi yang Efektif

\n

Keterampilan komunikasi dan kolaborasi yang efektif sangat penting bagi seorang programmer junior yang bercita-cita menjadi seorang senior. Saat Kita naik jabatan dalam karier, Kita diharapkan untuk bekerja dengan tim lintas fungsi, mengelola proyek, dan berkomunikasi tentang solusi teknis kepada pihak yang bukan ahli di bidang teknologi.

\n

Kita juga perlu tahu cara berkomunikasi dengan audiens eksekutif, yang berarti Kita harus memiliki pesan yang jelas dan ringkas yang berfokus pada inti masalah. Selain itu, Kita dapat mengandalkan keterampilan Kita untuk mempengaruhi hasil teknis selama rapat. Sebagai contoh, ketika klien baru-baru ini meminta lebih banyak kontrol atas filter kata-kata kotor mereka, saya menciptakan filter kata-kata kotor yang dapat disesuaikan sehingga mereka dapat menambahkan kata-kata baru melalui array.

\n

Relawan untuk Membimbing dan Bergabung dengan Karyawan Baru

\n

Sebagai seorang mentor, Kita dapat membantu anggota tim baru beradaptasi dengan cepat dengan peran mereka, memberikan bimbingan dan dukungan kepada mereka, dan menciptakan lingkungan yang ramah untuk pertumbuhan dan pembelajaran pribadi. Menjadi seorang mentor menunjukkan kemampuan Kita untuk bekerja dengan baik dengan orang lain dan juga menunjukkan keterampilan komunikasi yang kuat.

\n

Pada saat yang sama, Kita memerlukan dukungan sponsor dan mentor Kita sendiri untuk membantu Kita menguasai keterampilan yang kompleks, mendapatkan kesempatan pertumbuhan dalam perusahaan, dan mendapatkan visibilitas yang Kita butuhkan untuk dipromosikan. Ini sangat penting karena Kita tidak akan dapat mencapai tujuan ini sendirian.

\n

Menulis Dokumentasi

\n

Saat Kita maju ke peran senior, Kita harus memberikan contoh komunikasi dan kolaborasi yang efektif kepada junior. Menulis dokumentasi yang jelas dan ringkas menunjukkan dedikasi Kita untuk memastikan bahwa informasi dikomunikasikan dengan efektif dan konsisten.

\n

Dokumentasi yang baik tidak hanya menambahkan lapisan keamanan teknis yang penting bagi tim, tetapi juga menghemat waktu, mencegah kesalahan, dan memberikan referensi bagi anggota tim dan pihak non-teknis. Selain itu, menulis dokumentasi juga menunjukkan bahwa Kita bersedia melakukan tugas-tugas yang mungkin kurang disukai orang lain, yang merupakan ciri dari seorang pemain tim yang baik.

\n

Teruslah Belajar

\n

Seperti yang mungkin sudah Kita alami, dunia teknologi berkembang dengan cepat, dan Kita harus terus belajar dan mengembangkan keterampilan untuk tetap relevan dalam industri. Untuk berhasil dalam peran senior, tunjukkan kualitas kerja berdasarkan pembelajaran tersebut yang menunjukkan kemajuan Kita menuju kepemimpinan.

\n

Tetap up-to-date dengan menghadiri acara industri, terlibat dalam komunitas teknis (seperti GitHub, Stack Overflow, atau HackerNews), dan terhubung dengan sesama profesional. Di luar jaringan, komunitas ini memberikan kesempatan untuk mempromosikan pencapaian tim Kita secara eksternal, yang menunjukkan kepada kolega senior komitmen Kita terhadap arah perusahaan.

\n

Terakhir, ingatlah bahwa peningkatan karier membutuhkan waktu dan dedikasi. Kita harus sabar, gigih, dan bersedia melakukan pekerjaan yang diperlukan untuk berhasil. Maju dari insinyur junior menjadi senior memerlukan keterampilan teknis, kepemimpinan, kepemilikan proyek, komunikasi yang efektif, kolaborasi, pemahaman domain bisnis, kinerja tinggi, dan pemikiran inovatif. Dan Kita sudah memiliki semua itu. Selamat berjuang dan semoga sukses dalam perjalanan menuju kesuksesan karir sebagai programmer senior!

\n

Sumber:\nJunior to senior: An action plan for engineering career success

","frontmatter":{"title":"Cara Programmer Junior menjadi Senior 1","date":"August 12, 2023"}}},"pageContext":{"slug":"/2023/08/cara-programmer-junior-ke-senior/","previous":{"fields":{"slug":"/2023/08/technical-debt-hutang-yang-harus-dibayar/"},"frontmatter":{"title":"Technical Debt, Hutang Teknis yang Harus Dibayar"}},"next":{"fields":{"slug":"/2023/08/cara-belajar-lebih-baik-dan-lebih-cepat-sebagai-programmer/"},"frontmatter":{"title":"Cara Belajar Lebih Baik dan Lebih Cepat sebagai Programmer"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2023/08/memahami-dan-mengelola-burnout/page-data.json b/page-data/2023/08/memahami-dan-mengelola-burnout/page-data.json new file mode 100644 index 00000000..392065b1 --- /dev/null +++ b/page-data/2023/08/memahami-dan-mengelola-burnout/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2023/08/memahami-dan-mengelola-burnout/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"6ce9e2c2-be82-566b-b1e6-374df3434484","excerpt":"Dalam kehidupan yang sibuk dan tuntutan pekerjaan yang tinggi, sering kali kita mengalami burnout atau kelelahan yang parah. Burnout dapat berdampak buruk pada kesehatan fisik dan mental kita. Dalam artikel ini, kita akan membahas pengalaman burnout, tahapan-tahapan yang terjadi…","html":"

Dalam kehidupan yang sibuk dan tuntutan pekerjaan yang tinggi, sering kali kita mengalami burnout atau kelelahan yang parah. Burnout dapat berdampak buruk pada kesehatan fisik dan mental kita. Dalam artikel ini, kita akan membahas pengalaman burnout, tahapan-tahapan yang terjadi, dan beberapa tips dan trik untuk mengelola burnout agar dapat menjaga kesehatan mental kita.

\n

Tahapan Burnout

\n
    \n
  1. \n

    Fase bulan madu

    \n

    Tahap di mana kita merasa sangat antusias dan ingin menyelesaikan semua hal yang selama ini ingin kita kerjakan. Kita mengambil lebih banyak pekerjaan dan mengatakan ya dengan penuh percaya diri untuk semuanya karena optimis akan kemampuan kita.

    \n
  2. \n
  3. \n

    Stres

    \n

    Stres ini bisa terjadi karena kita mulai menyadari kurangnya waktu yang cukup untuk menyelesaikan semua pekerjaan yang kita miliki. Kita merasa cemas karena tidak bisa menyelesaikan hal-hal seperti yang kita biasa selesaikan sebelumnya, dan sekarang kita merasa kewalahan dengan banyaknya pekerjaan.

    \n
  4. \n
  5. \n

    Stres kronis

    \n

    Kondisi ini muncul ketika kita mulai menunda pekerjaan-pekerjaan yang tertinggal, akhirnya semua menjadi menumpuk dan kita merasa ragu apakah kita mampu melakukannya. Rasa yang meragukan diri sendiri menyerang, imposter syndrome, yang membuat kita bertanya-tanya apakah kita benar-benar mampu menjalani pekerjaan impian yang kita bayangkan. Mungkin saya tidak mampu melakukannya lagi.

    \n
  6. \n
  7. \n

    Kehilangan kepercayaan diri

    \n

    Ini adalah tahap yang paling umum dan mengarah pada tahap terburuk yaitu burnout. Burnout awal ini adalah yang terburuk karena kita kehilangan identitas sebagai pribadi dan lupa untuk menikmati hal-hal yang kita sukai. Hobi, teman, dan kehidupan kita sendiri terasa terputus karena kita hanya fokus pada pekerjaan. Tahap ini sangat buruk, tetapi sebenarnya setiap tahap burnout buruk. Hal ini berdampak merugikan pada kesehatan fisik dan mental kita.

    \n
  8. \n
  9. \n

    Burnout parah

    \n

    Tahap terakhir yang umum dialami orang setelah burnout adalah burnout yang parah di mana kita bangun dan merasa tidak mampu menyelesaikan hal-hal, tetapi kita berusaha untuk tetap melakukannya. Ketika tidak ada tujuan akhir yang terlihat, itulah yang terburuk.

    \n
  10. \n
\n

Mengelola Burnout

\n

Ada beberapa hal yang dapat kita lakukan ketika merasakan stres atau berada dalam tahap burnout. Salah satunya adalah mengingat bahwa kita memiliki batasan dan prioritas, dan kita sendiri juga harus menjadi prioritas. Ketika kita mengambil sebuah pekerjaan, apakah itu cara kita menjaga kesehatan diri sendiri?

\n

Kita perlu mengenali dan melakukan introspeksi, apakah kita menjadi orang yang terlalu berprestasi atau begitu ingin dihargai orang lain, atau apakah ini tentang kemampuan kita dalam menghadapi beban kerja.

\n

Salah satu hal yang dapat dilakukan adalah menanyakan kepada diri sendiri, jika saya mengakui bahwa saya mampu melakukannya, dan memiliki waktu untuk menyelesaikan pekerjaan ini, maka saya akan melakukannya. Tetapi jika itu tidak benar - jika saya sudah memiliki 10 pekerjaan yang tertunda, yang seharusnya saya lakukan pada siklus sebelumnya - maka saya harus menghormati diri saya sendiri dan mengatakan bahwa saya tidak dapat melakukannya saat ini.

\n

Meskipun sulit untuk mengatakan tidak dan ada perasaan takut mengecewakan orang lain, namun ketika kita mulai mengatakan tidak, kita akan merasa lebih baik. Penghalang kita akan berkurang dan kita akan merasa bersyukur karena orang lain bisa memahami.

\n

Kemudian kita dapat lebih sering mengatakan tidak dan dengan jujur menyampaikan kepada orang lain bahwa saat ini kita tidak dapat melakukannya, tetapi mungkin jika mereka bertanya dalam seminggu setelah satu siklus selesai, kita bisa mengambil lebih banyak pekerjaan. Jika kita belum menyelesaikan pekerjaan-pekerjaan kita, maka ini bukan tanggung jawab kita, jadi kita dapat membantu, tetapi tidak menjamin untuk dapat menyelesaikannya.

\n

Tips Singkat

\n

Selain itu, ada beberapa tips singkat yang dapat dilakukan untuk mengurangi burnout. Salah satunya adalah dengan memikirkan empat senyawa kimia bahagia di otak kita yang membantu kita merasa rileks secara sementara. Ini disebut dengan singkatan DOSE, yaitu dopamine, oxytocin, serotonin, dan endorphins.

\n
    \n
  • Dopamine adalah senyawa yang memberikan perasaan senang (bayangkan saat kita mendapat sebuah hadiah) ketika kita merasa telah mencapai sesuatu, misalnya saat kita mendapatkan pengakuan atau penghargaan. Salah satu kegiatan yang dapat dilakukan adalah menuliskan tiga hal yang memotivasi atau hal-hal yang kita syukuri.
  • \n
  • Oxytocin adalah senyawa yang memberikan perasaan hangat dan nyaman ketika kita merasa dicintai atau saat kita mendapatkan pelukan.
  • \n
  • Serotonin dirilis saat kita tertawa, sehingga menimbulkan perasaan lebih santai dan rileks. Kita dapat menonton video lucu hewan atau bayi yang dapat memicu tawa dan meningkatkan kadar serotonin dalam tubuh.
  • \n
  • Endorphin adalah senyawa yang dapat dilepaskan dengan cepat saat kita mulai bergerak. Cukup dengan menggerakkan tangan atau kaki, kita dapat merasakan efek endorphin dan merasa sedikit lebih baik.
  • \n
\n

Burnout adalah masalah serius yang dapat mempengaruhi kesehatan fisik dan mental kita. Lebih parahnya lagi, kita seringkali tidak menyadarinya. Penting untuk mengenali tanda-tanda dan tahapan-tahapan burnout agar dapat mengambil langkah-langkah yang tepat untuk mengelolanya.

\n

Dengan mengatur batasan, menghormati diri sendiri, dan menemukan cara untuk mengurangi stres secara sementara, kita dapat menjaga kesehatan mental dan menghindari burnout yang lebih parah. Jagalah diri Kita dan jangan ragu untuk meminta bantuan jika diperlukan. Kesehatan mental kita adalah hal yang penting dan harus menjadi prioritas.

\n

Sumber:\nThe 5 States of Burnout - Jenny Truong, DevRel & Head of Operations at Stately

","frontmatter":{"title":"Memahami Burnout dan Cara Mengelolanya untuk Kesehatan Mental","date":"August 02, 2023"}}},"pageContext":{"slug":"/2023/08/memahami-dan-mengelola-burnout/","previous":{"fields":{"slug":"/2023/07/apa-itu-guid/"},"frontmatter":{"title":"Memahami GUID (Globally Unique Identifier) dan Penggunaannya"}},"next":{"fields":{"slug":"/2023/08/apa-itu-datadog-apm/"},"frontmatter":{"title":"Mengoptimalkan Kinerja Aplikasi dengan DataDog APM"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2023/08/memahami-secure-development-lifecycle/page-data.json b/page-data/2023/08/memahami-secure-development-lifecycle/page-data.json new file mode 100644 index 00000000..2884ee5e --- /dev/null +++ b/page-data/2023/08/memahami-secure-development-lifecycle/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2023/08/memahami-secure-development-lifecycle/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"05827266-48de-5cf6-b19a-504dbcfb6854","excerpt":"Pengembangan perangkat lunak yang aman merupakan aspek krusial dalam era di mana serangan siber semakin canggih dan beragam. Perangkat lunak yang kita kembangkan tidak hanya harus memenuhi persyaratan fungsi, namun juga harus menjaga keamanan pengguna. Secure Development…","html":"

Pengembangan perangkat lunak yang aman merupakan aspek krusial dalam era di mana serangan siber semakin canggih dan beragam. Perangkat lunak yang kita kembangkan tidak hanya harus memenuhi persyaratan fungsi, namun juga harus menjaga keamanan pengguna. Secure Development Lifecycle (SDLC) adalah pendekatan yang terstruktur untuk mengintegrasikan keamanan ke dalam seluruh siklus pengembangan perangkat lunak.

\n

Apa itu Secure Development Lifecycle (SDLC)?

\n

Secure Development Lifecycle (SDLC) adalah pendekatan metodologis dalam pengembangan perangkat lunak yang menempatkan keamanan sebagai prioritas sepanjang seluruh siklus hidup pengembangan. Tujuannya adalah untuk mencegah, mengidentifikasi, dan mengatasi kerentanan keamanan serta cacat perangkat lunak sejak awal, daripada mengatasi masalah setelah perangkat lunak sudah diimplementasikan.

\n

Mengapa Secure Development Lifecycle Penting?

\n
    \n
  1. Mencegah Ancaman Awal:\nDengan mengintegrasikan keamanan sejak awal, kerentanan dan celah keamanan dapat diidentifikasi dan diperbaiki sebelum produk akhir diluncurkan, mencegah kemungkinan eksploitasi.
  2. \n
  3. Mengurangi Biaya Perbaikan:\nMemperbaiki masalah keamanan setelah implementasi dapat menghabiskan biaya dan waktu yang signifikan. SDLC membantu mengurangi biaya ini dengan mengatasi masalah di tahap awal pengembangan.
  4. \n
  5. Mempertahankan Reputasi:\nKerentanan dan serangan siber dapat merusak reputasi perusahaan. SDLC membantu membangun kepercayaan dengan menghasilkan produk yang aman dan andal.
  6. \n
  7. Kepatuhan Regulasi:\nBanyak industri sekarang diatur oleh standar keamanan tertentu. SDLC membantu perusahaan mematuhi regulasi ini dengan mengintegrasikan keamanan dalam pengembangan.
  8. \n
\n

Langkah-langkah dalam Secure Development Lifecycle:

\n
    \n
  1. \n

    Requirements (Persyaratan)

    \n

    a. Security Classification (Klasifikasi Keamanan): Ini berarti menentukan seberapa pentingnya sistem atau perangkat lunak tersebut dalam hal keamanan. Apakah itu sangat rahasia, hanya boleh diakses oleh beberapa orang, atau bisa diakses oleh siapa saja.

    \n

    b. Risk Assessment (Penilaian Risiko): Ini melibatkan mengidentifikasi dan menilai potensi masalah keamanan yang mungkin muncul. Dengan cara ini, kita dapat mengerti seberapa besar kemungkinan terjadinya masalah dan seberapa buruk dampaknya.

    \n

    c. Security Requirements (Persyaratan Keamanan): Ini adalah aturan dan panduan yang harus diikuti untuk menjaga keamanan sistem atau perangkat lunak. Misalnya, mungkin ada persyaratan untuk pengguna harus memasukkan kata sandi yang kuat.

    \n
  2. \n
  3. \n

    Design (Desain)

    \n

    a. Threat Modelling (Pemodelan Ancaman): Ini adalah cara untuk merencanakan bagaimana sistem atau perangkat lunak mungkin diserang oleh pihak jahat. Dengan memahami potensi serangan, kita bisa merancang perlindungan yang lebih baik.

    \n

    b. Design Review (Ulasan Desain): Ini melibatkan tim melihat kembali rencana desain untuk memastikan bahwa semua langkah yang tepat telah diambil untuk menjaga keamanan. Apakah ada celah yang terlewatkan?

    \n
  4. \n
  5. \n

    Development (Pengembangan)

    \n

    a. Secure Coding Guidelines (Panduan Koding Aman): Ini adalah aturan dan panduan yang harus diikuti oleh para pengembang ketika menulis kode. Tujuannya adalah untuk memastikan bahwa kode yang ditulis tidak memiliki kerentanan yang bisa dieksploitasi oleh penyerang.

    \n

    b. Secure Code Scanning (Pemindaian Kode Aman): Ini adalah proses memeriksa kode yang ditulis untuk menemukan potensi masalah keamanan. Pemindaian dilakukan secara otomatis menggunakan alat khusus.

    \n
  6. \n
  7. \n

    Testing (Pengujian)

    \n

    a. Security Testing (Pengujian Keamanan): Ini adalah serangkaian pengujian yang dilakukan pada sistem atau perangkat lunak untuk menemukan celah atau kerentanan keamanan. Tujuannya adalah untuk memastikan bahwa sistem tahan terhadap serangan.

    \n

    b. Code Review (Ulasan Kode): Ini melibatkan pengembang lain yang melihat kembali kode yang ditulis oleh seseorang. Tujuannya adalah untuk menemukan masalah dan memberikan saran perbaikan.

    \n
  8. \n
  9. \n

    Deployment (Penerapan)

    \n

    a. Penetration Testing (Pengujian Penetrasi): Ini melibatkan orang yang mencoba menyerang sistem atau perangkat lunak seperti penyerang sebenarnya. Tujuannya adalah untuk melihat seberapa tahan sistem terhadap serangan nyata.

    \n

    b. Security Hardening (Penguatan Keamanan): Ini adalah langkah-langkah yang diambil untuk memperkuat sistem atau perangkat lunak agar lebih tahan terhadap serangan. Ini bisa termasuk mengatur konfigurasi yang lebih aman atau menutup celah keamanan yang ditemukan selama pengujian.

    \n
  10. \n
\n

Dalam dunia yang semakin terhubung dan rentan terhadap serangan siber, mengadopsi Secure Development Lifecycle (SDLC) menjadi suatu keharusan. Memastikan bahwa keamanan terintegrasi dalam seluruh siklus hidup pengembangan adalah kunci untuk melindungi data sensitif, menjaga reputasi perusahaan, dan mengurangi risiko terhadap serangan siber. Dengan menerapkan langkah-langkah SDLC, perusahaan dapat menghasilkan perangkat lunak yang aman, handal, dan sesuai dengan regulasi keamanan yang relevan.

","frontmatter":{"title":"Memahami Secure Development Lifecycle (SDLC)","date":"August 30, 2023"}}},"pageContext":{"slug":"/2023/08/memahami-secure-development-lifecycle/","previous":{"fields":{"slug":"/2023/08/menulis-versi-package-dependency/"},"frontmatter":{"title":"Menulis Versi Package Dependency dalam Pengembangan Perangkat Lunak"}},"next":{"fields":{"slug":"/2023/09/meningkatkan-kesadaran-keamanan-programer/"},"frontmatter":{"title":"Meningkatkan Kesadaran Keamanan Programer"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2023/08/menulis-versi-package-dependency/page-data.json b/page-data/2023/08/menulis-versi-package-dependency/page-data.json new file mode 100644 index 00000000..656b06c4 --- /dev/null +++ b/page-data/2023/08/menulis-versi-package-dependency/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2023/08/menulis-versi-package-dependency/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"eb29d7a5-3b73-5f17-8975-8d4b281c86f8","excerpt":"Pengembangan perangkat lunak modern seringkali melibatkan penggunaan banyak paket (package) atau pustaka (library) dari sumber eksternal. Ketergantungan paket ini memungkinkan pengembang untuk memanfaatkan fungsionalitas yang sudah ada tanpa perlu membuat semuanya dari awal…","html":"

Pengembangan perangkat lunak modern seringkali melibatkan penggunaan banyak paket (package) atau pustaka (library) dari sumber eksternal. Ketergantungan paket ini memungkinkan pengembang untuk memanfaatkan fungsionalitas yang sudah ada tanpa perlu membuat semuanya dari awal. Namun, dalam pengelolaan dependency paket, salah satu hal yang penting adalah menentukan versi yang sesuai.

\n

Mengapa Package Version Penting?

\n

Ketika kita menggunakan paket atau pustaka dari pihak ketiga, sangat penting untuk memilih versi yang sesuai dengan proyek kita. Setiap versi mungkin memiliki perbaikan bug, peningkatan performa, atau bahkan perubahan fungsionalitas yang signifikan. Memilih versi yang tepat dapat mencegah konflik dan masalah yang tidak diinginkan dalam pengembangan perangkat lunak kita.

\n

Menggunakan Format Semantic Versioning (SemVer)

\n

Cara umum untuk menentukan versi dependency paket adalah melalui prinsip Semantic Versioning (SemVer). SemVer terdiri dari tiga angka yang menunjukkan “MAJOR.MINOR.PATCH”. Ketiga komponen ini memiliki arti sebagai berikut:

\n
    \n
  1. MAJOR: Ditingkatkan ketika kita melakukan perubahan yang tidak kompatibel dengan versi sebelumnya dalam API paket.
  2. \n
  3. MINOR: Ditingkatkan ketika kita menambahkan fitur baru yang kompatibel dengan versi sebelumnya (backward compatible) dalam API paket.
  4. \n
  5. PATCH: Ditingkatkan ketika kita membuat perbaikan yang kompatibel dengan versi sebelumnya (backward compatible) dalam API paket.
  6. \n
\n

Misalnya, jika paket memiliki versi “2.1.3”, artinya versi utama adalah 2, versi minor adalah 1, dan versi patch adalah 3.

\n

Menulis Package Dependency dalam File Konfigurasi

\n

File konfigurasi proyek seperti “package.json”, “composer.json atau “requirements.txt” biasanya digunakan untuk menulis daftar dependency paket. Berikut adalah contoh bagaimana kita dapat menulis dependency dengan menggunakan format SemVer:

\n

package.json:

\n
{\n  \"dependencies\": {\n    \"nama-paket\": \"^1.2.0\"\n  }\n}
\n

requirements.txt:

\n
nama-paket==1.2.0
\n

Pada contoh di atas, tanda ^ pada “package.json” dan tanda == pada “requirements.txt” memberi tahu sistem manajemen paket untuk menggunakan versi yang kompatibel dengan versi yang ditentukan, namun tetap memperbolehkan peningkatan versi minor atau patch.

\n

Menangani Versi Secara Hati-hati

\n

Saat menulis versi dependency, penting untuk mempertimbangkan seberapa kritis paket tersebut terhadap proyek kita. Jika kita membutuhkan stabilitas, mungkin lebih baik untuk menentukan versi yang spesifik. Namun, jika kita ingin memanfaatkan perbaikan dan peningkatan baru, menggunakan tanda seperti ^ atau ~ dapat membantu kita tetap mendapatkan pembaruan tanpa mengorbankan stabilitas sepenuhnya.

\n

Memantau Pembaruan Paket

\n

Terkadang, pembaruan paket dapat mempengaruhi kinerja atau stabilitas proyek kita. Oleh karena itu, penting untuk secara berkala memeriksa pembaruan yang tersedia untuk dependency kita dan melakukan uji coba sebelum menerapkannya dalam produksi.

","frontmatter":{"title":"Menulis Versi Package Dependency dalam Pengembangan Perangkat Lunak","date":"August 23, 2023"}}},"pageContext":{"slug":"/2023/08/menulis-versi-package-dependency/","previous":{"fields":{"slug":"/2023/08/review-password-manager-dashlane/"},"frontmatter":{"title":"Review Password Manager - Dashlane"}},"next":{"fields":{"slug":"/2023/08/memahami-secure-development-lifecycle/"},"frontmatter":{"title":"Memahami Secure Development Lifecycle (SDLC)"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2023/08/perbaikan-berkelanjutan-dengan-sprint-retrospective/page-data.json b/page-data/2023/08/perbaikan-berkelanjutan-dengan-sprint-retrospective/page-data.json new file mode 100644 index 00000000..701826b4 --- /dev/null +++ b/page-data/2023/08/perbaikan-berkelanjutan-dengan-sprint-retrospective/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2023/08/perbaikan-berkelanjutan-dengan-sprint-retrospective/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"1c174c71-b9d5-5731-9092-2268491b8b21","excerpt":"Sprint Retrospective adalah sebuah seremoni penting di akhir setiap iterasi (sprint) dalam pengembangan perangkat lunak dengan pendekatan Agile. Apa itu Sprint Retrospective, mengapa hal ini begitu penting bagi kelancaran proyek, serta bagaimana melaksanakannya dengan efektif…","html":"

Sprint Retrospective adalah sebuah seremoni penting di akhir setiap iterasi (sprint) dalam pengembangan perangkat lunak dengan pendekatan Agile. Apa itu Sprint Retrospective, mengapa hal ini begitu penting bagi kelancaran proyek, serta bagaimana melaksanakannya dengan efektif.

\n

Apa Itu Sprint Retrospective?

\n

Sprint Retrospective adalah pertemuan yang dilakukan di akhir setiap sprint dalam metodologi Agile, seperti Scrum. Tujuan dari pertemuan ini adalah untuk merefleksikan sprint yang baru saja selesai dan mengidentifikasi area yang perlu ditingkatkan untuk tim. Dalam waktu yang ditentukan, tim berkolaborasi untuk mengevaluasi proses pengembangan, memperkuat hal-hal positif yang telah dicapai, dan mengidentifikasi potensi masalah atau hambatan yang dapat dihindari pada sprint berikutnya.

\n

Mengapa Sprint Retrospective Begitu Penting?

\n

Sprint Retrospective memiliki peran krusial dalam pengembangan perangkat lunak yang sukses. Dengan refleksi dan evaluasi secara berkala, tim dapat terus memperbaiki cara kerja mereka, meningkatkan efisiensi, dan mengurangi risiko. Beberapa manfaat dari Sprint Retrospective antara lain:

\n
    \n
  1. Peningkatan Proses: Tim dapat mengidentifikasi proses pengembangan yang berhasil dan mempertahankannya, serta memperbaiki proses yang kurang efektif untuk meningkatkan produktivitas.
  2. \n
  3. Peningkatan Komunikasi: Pertemuan ini memberikan kesempatan bagi setiap anggota tim untuk berbicara dan menyampaikan masukan mereka, membantu meningkatkan komunikasi dan kolaborasi di antara mereka. Komunikasi ini penting, bahkan untuk sekedar menyampaikan hal-hal yang membuat anggota tim senang atau stres.
  4. \n
  5. Pengenalan Perubahan: Dengan secara teratur melakukan refleksi, tim dapat mengidentifikasi masalah yang mungkin belum terdeteksi sebelumnya dan mengambil langkah-langkah perbaikan yang diperlukan.
  6. \n
  7. Peningkatan Kualitas: Dengan mengidentifikasi masalah dan kesempatan untuk perbaikan, tim dapat meningkatkan kualitas produk yang dihasilkan.
  8. \n
\n

Bagaimana Melaksanakan Sprint Retrospective dengan Efektif?

\n

Berikut adalah panduan langkah demi langkah untuk melaksanakan Sprint Retrospective yang efektif:

\n
    \n
  1. Persiapkan Pertemuan: Pastikan semua anggota tim tahu tentang waktu dan tempat pertemuan. Sebaiknya pilih suasana yang nyaman dan bebas dari gangguan.
  2. \n
  3. Refleksi Individu: Mintalah setiap anggota tim untuk merefleksikan sprint yang baru saja berakhir secara individu. Apa yang mereka anggap berhasil? Apa yang mungkin bisa ditingkatkan? Adakah hal-hal yang mempersulit atau mempermudah pekerjaan mereka?
  4. \n
  5. Diskusi Bersama: Saat pertemuan, mulailah dengan membuka sesi diskusi. Biarkan setiap anggota tim berbagi pandangan mereka tentang sprint yang lalu, termasuk hal-hal positif dan tantangan yang dihadapi.
  6. \n
  7. Identifikasi Poin Penting: Bantu tim untuk mengidentifikasi pola atau tema yang muncul dari diskusi. Apa saja hal yang perlu ditingkatkan atau dipertahankan?
  8. \n
  9. Tentukan Prioritas: Mintalah tim untuk menetapkan prioritas pada area perbaikan yang telah diidentifikasi. Pilihlah beberapa poin utama yang dapat diimplementasikan pada sprint berikutnya.
  10. \n
  11. Buat Rencana Tindakan: Bersama-sama, buat rencana tindakan yang jelas untuk setiap poin prioritas. Pastikan tanggung jawab ditetapkan untuk masing-masing perubahan yang direncanakan.
  12. \n
  13. Positif dan Apresiasi: Akhiri pertemuan dengan memberikan apresiasi atas usaha dan kerja keras setiap anggota tim. Fokus pada hal-hal positif yang telah dicapai.
  14. \n
\n

Tips: Biasanya pertemuan ini memerlukan alat bantu seperti retro board dengan sticky notes atau dalam kondisi pertemuan online, tim kami menggunakan alat online semacam Reetro.io.

","frontmatter":{"title":"Perbaikan Berkelanjutan dengan Sprint Retrospective","date":"August 19, 2023"}}},"pageContext":{"slug":"/2023/08/perbaikan-berkelanjutan-dengan-sprint-retrospective/","previous":{"fields":{"slug":"/2023/08/cara-belajar-lebih-baik-dan-lebih-cepat-sebagai-programmer/"},"frontmatter":{"title":"Cara Belajar Lebih Baik dan Lebih Cepat sebagai Programmer"}},"next":{"fields":{"slug":"/2023/08/review-password-manager-dashlane/"},"frontmatter":{"title":"Review Password Manager - Dashlane"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2023/08/review-password-manager-dashlane/page-data.json b/page-data/2023/08/review-password-manager-dashlane/page-data.json new file mode 100644 index 00000000..4aa1284a --- /dev/null +++ b/page-data/2023/08/review-password-manager-dashlane/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2023/08/review-password-manager-dashlane/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"ab61bfcc-af26-5967-88fd-c36079ebe385","excerpt":"Dashlane adalah alat manajemen kata sandi (password manager) populer yang membantu kita menyimpan dan mengelola kata sandi dengan aman. Berikut adalah beberapa kelebihan dan kekurangan menggunakan Dashlane: Kelebihan: Manajemen Kata Sandi Aman: Dashlane menyediakan brankas aman…","html":"

Dashlane adalah alat manajemen kata sandi (password manager) populer yang membantu kita menyimpan dan mengelola kata sandi dengan aman. Berikut adalah beberapa kelebihan dan kekurangan menggunakan Dashlane:

\n

Kelebihan:

\n
    \n
  1. Manajemen Kata Sandi Aman: Dashlane menyediakan brankas aman tempat kita dapat menyimpan semua kata sandi, sehingga lebih mudah untuk memiliki kata sandi yang unik dan kuat untuk setiap akun online tanpa risiko melupakannya.
  2. \n
  3. Pembuatan Kata Sandi: Alat ini dapat menghasilkan kata sandi yang kuat dan acak untuk kita, memastikan bahwa akun kita terlindungi dari ancaman keamanan umum seperti serangan brute force.
  4. \n
  5. Isi Otomatis dan Masuk Otomatis: Dashlane dapat secara otomatis mengisi kredensial masuk untuk situs web atau mobile app, menghemat waktu kita dan mengurangi kemungkinan salah ketik kata sandi.
  6. \n
  7. Dukungan Lintas Platform: Dashlane tersedia di berbagai platform, termasuk Windows, macOS, iOS, dan Android, memudahkan untuk mengakses kata sandi kita dari berbagai perangkat.
  8. \n
  9. Catatan Aman dan Dompet Digital: Selain kata sandi, Dashlane dapat menyimpan informasi sensitif lainnya dengan aman seperti detail kartu kredit, catatan aman, dan informasi pribadi.
  10. \n
  11. Dukungan Autentikasi Dua Faktor (2FA): Dashlane mendukung autentikasi dua faktor, menambahkan lapisan keamanan ekstra ke akun kita.
  12. \n
  13. Laporan Kesehatan Kata Sandi: Dashlane menyediakan laporan kesehatan kata sandi yang menganalisis kekuatan dan keamanan kata sandi kita, membantu kita mengidentifikasi kata sandi yang lemah atau digunakan kembali. Kita mungkin menggunakan kata sandi yang sama di beberapa situs, di mana itu adalah praktik yang tidak aman.
  14. \n
  15. Masuk dengan Biometrik: pada aplikasi mobile, kita bisa membuka brankas dengan autentikasi sidik jari, namun Dashlane akan secara acak meminta input master password untuk menjaga kita tetap mengingatnya.
  16. \n
\n

Kekurangan:

\n
    \n
  1. Biaya: Kumpulan fitur lengkap Dashlane, termasuk sinkronisasi lintas perangkat, memerlukan langganan premium, yang mungkin dianggap mahal dibandingkan dengan pengelola kata sandi lainnya. Namun family plan menawarkan langganan lebih murah untuk keluarga.
  2. \n
  3. Ketergantungan Konektivitas Internet: Dashlane mengandalkan koneksi internet untuk menyinkronkan kata sandi kita di seluruh perangkat, yang dapat menjadi batasan jika kita memerlukan akses ke kata sandi secara offline.
  4. \n
  5. Pemulihan Kata Sandi Utama: Dashlane tidak memiliki opsi pemulihan kata sandi utama, yang berarti jika kita lupa kata sandi utama, kita mungkin kehilangan akses ke akun dan menyimpan kata sandi selamanya.
  6. \n
  7. Versi Gratis Terbatas: Dashlane versi gratis memiliki batasan jumlah kata sandi yang dapat kita simpan dan jumlah perangkat yang dapat kita gunakan.
  8. \n
  9. Masalah Keamanan Berbasis Cloud: Karena Dashlane menyimpan kata sandi kita di cloud, mungkin ada kekhawatiran tentang keamanan data kita, meskipun Dashlane menggunakan enkripsi yang kuat dan tindakan keamanan lainnya untuk melindungi informasi pengguna.
  10. \n
  11. Lokalisasi: Saya melihat penyimpanan akun bank di antarmuka Dashlane mengikuti standar Eropa/Internasional. Penyimpanan akun bank lokal mungkin perlu penyesuaian.
  12. \n
\n

Sejauh ini saya tidak menemukan kesulitan berarti menggunakan Dashlane dibanding password manager lain. Dari sisi antarmuka pengguna saya pikir Dashlane relatif lebih sederhana dan intuitif. Hanya saja jika dikombinasikan dengan aplikasi otentikasinya, kadang saya mendapati itu menduplikasi akun yang sudah ada alih-aluh mengupdate akun yang sudah ada. Awalnya saya mencoba berlangganan layanan ini dengan montly plan, langsung di Play Store pembayaran dengan GoPay. Sejak bulan kemarin saya memutuskan untuk berlangganan dengan annual plan.

","frontmatter":{"title":"Review Password Manager - Dashlane","date":"August 23, 2023"}}},"pageContext":{"slug":"/2023/08/review-password-manager-dashlane/","previous":{"fields":{"slug":"/2023/08/perbaikan-berkelanjutan-dengan-sprint-retrospective/"},"frontmatter":{"title":"Perbaikan Berkelanjutan dengan Sprint Retrospective"}},"next":{"fields":{"slug":"/2023/08/menulis-versi-package-dependency/"},"frontmatter":{"title":"Menulis Versi Package Dependency dalam Pengembangan Perangkat Lunak"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2023/08/technical-debt-hutang-yang-harus-dibayar/page-data.json b/page-data/2023/08/technical-debt-hutang-yang-harus-dibayar/page-data.json new file mode 100644 index 00000000..3d3d6741 --- /dev/null +++ b/page-data/2023/08/technical-debt-hutang-yang-harus-dibayar/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2023/08/technical-debt-hutang-yang-harus-dibayar/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"59ba3213-ec38-5920-b99f-f07ade9bf9e2","excerpt":"Setiap programmer berusaha sebaik mungkin untuk menulis kode yang baik dan bersih (clean) sejak awal. Tidak ada yang sengaja ingin menyusun kode yang kacau dan menyulitkan proyek. Namun, pada suatu titik, bagaimana kode yang bersih bisa berubah menjadi tidak bersih? Metafora…","html":"

Setiap programmer berusaha sebaik mungkin untuk menulis kode yang baik dan bersih (clean) sejak awal. Tidak ada yang sengaja ingin menyusun kode yang kacau dan menyulitkan proyek. Namun, pada suatu titik, bagaimana kode yang bersih bisa berubah menjadi tidak bersih?

\n

Metafora “hutang teknis” yang merujuk pada kode yang tidak bersih awalnya diusulkan oleh Ward Cunningham.

\n

Bayangkan kita mendapatkan pinjaman dari bank untuk dapat membeli sesuatu lebih cepat. Kita akan membayar ekstra sebagai bunga atas pinjaman tersebut. Dengan begitu, kita tidak hanya membayar pokok pinjaman tetapi juga bunga tambahan. Terkadang, bunga yang harus kita bayar bisa begitu besar sehingga jumlahnya melebihi pendapatan kita, membuat pembayaran penuh menjadi sulit dilakukan.

\n

Hal yang serupa dapat terjadi dengan kode. Mungkin kita ingin mempercepat pengembangan dengan tidak menulis tes untuk fitur baru, namun perlahan-lahan hal ini akan memperlambat kemajuan kita setiap harinya hingga akhirnya kita harus “melunasi” hutang tersebut dengan menulis tes.

\n

Penyebab hutang Teknis

\n
    \n
  1. \n

    Tekanan Bisnis

    \n

    Terkadang, kondisi bisnis memaksa kita untuk meluncurkan fitur sebelum sepenuhnya selesai. Dalam situasi seperti ini, tambalan dan kode kotor mungkin muncul untuk menyembunyikan bagian proyek yang belum selesai.

    \n
  2. \n
  3. \n

    Kurangnya Pemahaman tentang Konsekuensi hutang Teknis

    \n

    Terkadang, atasan atau manajemen mungkin tidak sepenuhnya memahami bahwa hutang teknis memiliki konsekuensi, seperti melambatnya laju pengembangan karena hutang terus menumpuk. Hal ini bisa menyulitkan untuk mengalokasikan waktu untuk refactoring karena manajemen mungkin tidak memahami nilai jangka panjang dari perbaikan tersebut.

    \n
  4. \n
  5. \n

    Kegagalan dalam Menghadapi Keterkaitan Komponen yang Ketat

    \n

    Terkadang, proyek dapat menjadi seperti monolit daripada terdiri dari modul-modul individu. Dalam situasi ini, setiap perubahan pada satu bagian proyek akan mempengaruhi bagian lainnya. Tim pengembangan akan menghadapi kesulitan dalam mengisolasi pekerjaan anggota individu.

    \n
  6. \n
  7. \n

    Kurangnya Tes

    \n

    Ketidakmampuan untuk menyediakan umpan balik secara langsung dapat mendorong solusi cepat yang berisiko atau pemecahan masalah sementara. Dalam kasus terburuk, perubahan ini dapat diterapkan dan diimplementasikan langsung ke produksi tanpa pengujian sebelumnya, ini menyebabkan masalah serius.

    \n
  8. \n
  9. \n

    Kurangnya Dokumentasi

    \n

    Kurangnya dokumentasi dapat memperlambat proses integrasi anggota baru ke dalam proyek dan dapat menyebabkan masalah ketika anggota kunci meninggalkan proyek.

    \n
  10. \n
  11. \n

    Kurangnya Interaksi Antar Anggota Tim

    \n

    Jika pengetahuan tidak didistribusikan secara merata di antara seluruh tim, orang-orang akhirnya akan bekerja dengan pemahaman yang usang tentang proses dan informasi proyek. Hal ini dapat memburuk jika pengembang junior tidak mendapatkan pelatihan yang memadai dari mentor mereka.

    \n
  12. \n
  13. \n

    Pengembangan Simultan dalam Cabang yang Berbeda

    \n

    Hal ini dapat menyebabkan akumulasi hutang teknis yang semakin bertambah saat perubahan digabungkan. Semakin banyak perubahan yang dilakukan secara terpisah, semakin besar total hutang teknis.

    \n
  14. \n
  15. \n

    Penundaan Refactoring

    \n

    Persyaratan proyek (requirement) dapat berubah seiring waktu, dan pada suatu titik bisa menjadi jelas bahwa bagian dari kode sudah usang dan tidak lagi praktis. Hal ini memerlukan refactoring untuk memenuhi requirement baru. Semakin lama refactoring ditunda, semakin banyak kode yang bergantung padanya harus dikerjakan ulang di masa mendatang.

    \n
  16. \n
  17. \n

    Kurangnya Pemantauan Kepatuhan

    \n

    Ini terjadi ketika setiap anggota proyek menulis kode sesuai preferensi pribadinya tanpa peduli keseragaman kode secara keseluruhan.

    \n
  18. \n
  19. \n

    Ketidakmampuan

    \n

    Terkadang, pengembang mungkin tidak memiliki pengetahuan atau keterampilan untuk menulis kode yang baik dan bersih.

    \n
  20. \n
\n

Mengatasi hutang Teknis

\n

Untuk mengatasi hutang teknis, perlu adanya komitmen dari seluruh tim pengembangan dan manajemen untuk:

\n
    \n
  • Menggunakan Prinsip-Prinsip Perancangan yang Baik: Pastikan seluruh tim memahami dan mengikuti prinsip-prinsip desain yang baik agar kode tetap bersih dan mudah dipahami.
  • \n
  • Mendokumentasikan Kode: Selalu berusaha untuk menyertakan dokumentasi yang jelas dan lengkap untuk memudahkan orang lain memahami kode.
  • \n
  • Mengutamakan Tes: Selalu menyertakan tes yang memadai untuk setiap bagian kode yang ditulis untuk menghindari masalah di masa depan.
  • \n
  • Melakukan Refactoring Secara Berkala: Selalu lakukan refactoring untuk membersihkan kode dan menghilangkan hutang teknis secara teratur.
  • \n
  • Meningkatkan Kolaborasi: Pastikan seluruh anggota tim berkomunikasi dan berkolaborasi dengan baik untuk memastikan pengetahuan tentang proyek selalu terbagi dengan baik.
  • \n
\n

Dengan menerapkan langkah-langkah ini, tim pengembangan dapat mengurangi dan mencegah akumulasi hutang teknis, sehingga proyek dapat berjalan lebih lancar dan lebih efisien.

\n

Sumber:\nRefactoring Guru - Technical Debt

","frontmatter":{"title":"Technical Debt, Hutang Teknis yang Harus Dibayar","date":"August 08, 2023"}}},"pageContext":{"slug":"/2023/08/technical-debt-hutang-yang-harus-dibayar/","previous":{"fields":{"slug":"/2023/08/apa-itu-datadog-apm/"},"frontmatter":{"title":"Mengoptimalkan Kinerja Aplikasi dengan DataDog APM"}},"next":{"fields":{"slug":"/2023/08/cara-programmer-junior-ke-senior/"},"frontmatter":{"title":"Cara Programmer Junior menjadi Senior 1"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2023/09/coding-bootcamp-gratis/page-data.json b/page-data/2023/09/coding-bootcamp-gratis/page-data.json new file mode 100644 index 00000000..07e290ee --- /dev/null +++ b/page-data/2023/09/coding-bootcamp-gratis/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2023/09/coding-bootcamp-gratis/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"1596d2c0-e938-5e7f-8b67-23985f3f8158","excerpt":"Berikut adalah daftar beberapa bootcamp coding online gratis: freeCodeCamp: adalah salah satu bootcamp coding gratis yang paling terkenal. FreeCodeCamp menawarkan kurikulum komprehensif yang mencakup pengembangan web, data science, dan banyak lagi. Siswa dapat memperoleh…","html":"

Berikut adalah daftar beberapa bootcamp coding online gratis:

\n
    \n
  1. \n

    freeCodeCamp: adalah salah satu bootcamp coding gratis yang paling terkenal. FreeCodeCamp menawarkan kurikulum komprehensif yang mencakup pengembangan web, data science, dan banyak lagi. Siswa dapat memperoleh sertifikasi melalui freeCodeCamp.

    \n

    Website: freeCodeCamp

    \n
  2. \n
  3. \n

    The Odin Project: Berfokus pada pengembangan web, The Odin Project adalah kurikulum sumber terbuka yang mencakup HTML, CSS, JavaScript, dan banyak lagi. Ini dirancang untuk siswa mengatur kecepatan belajar sesuai kemampuan diri sendiri.

    \n

    Website: The Odin Project

    \n
  4. \n
  5. \n

    Coursera (Audit Courses): Meskipun banyak kursus Coursera memerlukan pembayaran, kita dapat mengaudit banyak kursus tersebut secara gratis. Ini memungkinkan kita untuk mengakses materi kursus dan kuliah.

    \n

    Website: Coursera

    \n
  6. \n
  7. \n

    edX (Audit Courses): Mirip dengan Coursera, edX menawarkan opsi untuk mengaudit kursus secara gratis. Kita dapat mengakses materi kursus, video, dan kuis.

    \n

    Website: edX

    \n
  8. \n
  9. \n

    Harvard’s CS50x: Harvard menawarkan kursus pengantar ilmu komputer, CS50, online gratis melalui edX. Ini mencakup berbagai bahasa dan konsep pemrograman.

    \n

    Website: Harvard’s CS50x

    \n
  10. \n
  11. \n

    MIT OpenCourseWare: Meskipun bukan bootcamp tradisional, MIT menawarkan berbagai kursus ilmu komputer dan pemrograman secara gratis melalui inisiatif OpenCourseWare.

    \n

    Website: MIT OpenCourseWare

    \n
  12. \n
  13. \n

    App Academy Open: App Academy, yang terkenal dengan bootcamp coding intensifnya, menawarkan versi online gratis dari kurikulumnya yang mencakup pengembangan web.

    \n

    Website: App Academy Open

    \n
  14. \n
  15. \n

    Launch School’s Prep Courses: Launch School menawarkan kursus persiapan gratis untuk membantu pelajar mempersiapkan diri untuk program berbayar yang lebih ekstensif. Kursus persiapan ini mencakup dasar-dasar.

    \n

    Website: Launch School

    \n
  16. \n
  17. \n

    Upskill: Upskill menawarkan program bootcamp coding gratis yang berfokus pada pengembangan web dan rekayasa perangkat lunak.

    \n

    Website: Upskill

    \n
  18. \n
  19. \n

    Lambda School’s Mini Bootcamp: Lambda School menawarkan bootcamp mini gratis yang memberikan pengenalan pengembangan web.

    \n

    Website: Lambda School Mini Bootcamp

    \n
  20. \n
","frontmatter":{"title":"Coding Bootcamp Online Gratis","date":"September 06, 2023"}}},"pageContext":{"slug":"/2023/09/coding-bootcamp-gratis/","previous":{"fields":{"slug":"/2023/09/meningkatkan-kesadaran-keamanan-programer/"},"frontmatter":{"title":"Meningkatkan Kesadaran Keamanan Programer"}},"next":{"fields":{"slug":"/2023/09/tips-laravel-eloquent/"},"frontmatter":{"title":"Tips dan Trik Laravel Eloquent"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2023/09/masalah-n-1-orm/page-data.json b/page-data/2023/09/masalah-n-1-orm/page-data.json new file mode 100644 index 00000000..895e958c --- /dev/null +++ b/page-data/2023/09/masalah-n-1-orm/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2023/09/masalah-n-1-orm/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"8d3fe066-ed1a-5bad-ba4e-4497ede93a9c","excerpt":"Dalam pengembangan perangkat lunak, masalah N + 1 adalah salah satu masalah klasik yang sering dihadapi oleh pengembang aplikasi yang menggunakan database. Masalah ini muncul saat kita menggunakan Object-Relational Mapping (ORM) untuk mengakses data dari database, dan dapat…","html":"

Dalam pengembangan perangkat lunak, masalah N + 1 adalah salah satu masalah klasik yang sering dihadapi oleh pengembang aplikasi yang menggunakan database. Masalah ini muncul saat kita menggunakan Object-Relational Mapping (ORM) untuk mengakses data dari database, dan dapat menyebabkan kinerja aplikasi yang buruk jika tidak ditangani dengan benar.

\n

Apa Itu Masalah N + 1?

\n

Masalah N + 1 terjadi ketika kita mengambil kumpulan data utama, misalnya mengambil data buku dari database, dan kemudian mengambil data terkait, misalnya penulis, secara terpisah untuk setiap entitas utama. N + 1 artinya kita melakukan satu query utama untuk mengambil daftar entitas utama, dan kemudian tambahan sejumlah N query untuk mengambil data terkaitnya.

\n

Contoh sederhana adalah ketika kita memiliki daftar buku dan kita ingin mengambil penulis masing-masing buku.

\n
use App\\Models\\Book;\n \n$books = Book::all();
\n

Jika kita mengambil daftar buku terlebih dahulu, itu akan menjalankan 1 query.

\n
select * from books
\n

Misalnya query di atas hasilnya adalah 25 buku. Kemudian kita mengambil penulis dari setiap buku secara terpisah.

\n
foreach ($books as $book) {\n    echo $book->author->name;\n}
\n

maka akan ada tambahan 25 query

\n
select name from authors where id = 123
\n

Itulah yang disebut masalah N + 1.

\n

Mengapa Masalah N + 1 Terjadi?

\n

Masalah N + 1 terjadi karena ORM, biasanya menggunakan lazy loading sebagai perilaku default. Artinya, data terkait tidak dimuat segera ketika data utama diambil, tetapi dimuat hanya saat kita mengaksesnya. Ini mengarah pada banyak query tambahan yang tidak perlu.

\n

Cara Mengatasi Masalah N + 1

\n

Untuk mengatasi masalah N + 1, kita dapat menggunakan beberapa teknik berikut:

\n

1. Eager Loading

\n

Eager loading adalah teknik di mana kita mengambil data terkait sekaligus dengan data utama, bukan secara terpisah. Dalam Laravel, kita dapat menggunakan metode with() untuk melakukan eager loading:

\n
$users = Book::with('author')->get();
\n

Dengan menggunakan eager loading, kita mengurangi jumlah query yang harus dilakukan ke database menjadi hanya 2 query, menghindari masalah N + 1.

\n
select * from books\n \nselect * from authors where id in (1, 2, 3, 4, 5, ...)
\n

2. Join

\n

Jika kita ingin menggabungkan data dari beberapa tabel, kita dapat menggunakan operasi join dalam SQL. Dalam Eloquent, kita dapat menggunakan metode join() untuk melakukan join data:

\n
$users = DB::table('books')\n            ->join('authors', 'books.author_id', '=', 'authors.id')\n            ->select('books.*', 'authors.name')\n            ->get();
\n

3. Batch Loading

\n

Jika kita memiliki kasus di mana kita perlu mengambil banyak data terkait untuk setiap entitas utama, kita dapat menggunakan teknik batch loading. Di Laravel ini disebut lazy eager loading. Ini melibatkan pengambilan data utama, dan kemudian mengambil data terkait dalam beberapa batch query.

\n
$users = Book::all();\n\nforeach ($books as $book) {\n    $user->load('authors');\n}
\n

4. Gunakan Cache

\n

Untuk menghindari pengambilan data terkait yang berulang-ulang, kita dapat menggunakan teknik caching. Caching akan menyimpan data terkait dalam cache sehingga kita tidak perlu mengambilnya lagi dalam permintaan berikutnya.

","frontmatter":{"title":"Memahami Masalah N + 1 dalam ORM","date":"September 27, 2023"}}},"pageContext":{"slug":"/2023/09/masalah-n-1-orm/","previous":{"fields":{"slug":"/2023/09/unit-testing-arrange-act-assert/"},"frontmatter":{"title":"Unit Testing dengan Pendekatan Arrange, Act, dan Assert"}},"next":{"fields":{"slug":"/2023/10/membaca-flame-graph/"},"frontmatter":{"title":"Membaca Flame Graph"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2023/09/meningkatkan-kesadaran-keamanan-programer/page-data.json b/page-data/2023/09/meningkatkan-kesadaran-keamanan-programer/page-data.json new file mode 100644 index 00000000..d8e9a449 --- /dev/null +++ b/page-data/2023/09/meningkatkan-kesadaran-keamanan-programer/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2023/09/meningkatkan-kesadaran-keamanan-programer/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"9d32c0bf-d392-50f1-a743-0e0bf13e9b3e","excerpt":"Keamanan merupakan aspek kritis dalam dunia pengembangan perangkat lunak. Programmer bertanggung jawab tidak hanya untuk menciptakan fitur yang canggih, tetapi juga untuk memastikan bahwa produk yang dihasilkan aman dari ancaman siber. Dalam upaya mewujudkan tujuan ini…","html":"

Keamanan merupakan aspek kritis dalam dunia pengembangan perangkat lunak. Programmer bertanggung jawab tidak hanya untuk menciptakan fitur yang canggih, tetapi juga untuk memastikan bahwa produk yang dihasilkan aman dari ancaman siber. Dalam upaya mewujudkan tujuan ini, programmer perlu mengadopsi kesadaran keamanan yang kuat. Dalam artikel ini, kita akan menjelajahi beberapa langkah penting yang dapat diambil oleh programmer untuk meningkatkan kesadaran keamanan.

\n

Checklist Keamanan untuk programmer:

\n
    \n
  1. Pastikan Antivirus/Antimalware:\nMemastikan perangkat kita dilengkapi dengan perangkat lunak antivirus dan antimalware yang terkini dapat membantu mengidentifikasi dan menghapus ancaman berbahaya sebelum mereka merugikan sistem kita.
  2. \n
  3. Selalu Perbarui Sistem Operasi (OS) kita:\nMemastikan sistem operasi kita selalu diperbarui dengan yang terbaru akan membantu menjaga keamanan dengan mengisi celah-celah keamanan yang ditemukan seiring waktu.
  4. \n
  5. Selalu Perbarui Aplikasi:\nMenggunakan versi terbaru dari aplikasi yang kita gunakan dapat membantu mengatasi kerentanan yang ada pada versi sebelumnya.
  6. \n
  7. Aktifkan Autentikasi Dua Faktor (2FA):\nMengaktifkan autentikasi dua faktor pada akun-akun penting membantu mencegah akses yang tidak sah dengan menambahkan lapisan keamanan tambahan.
  8. \n
  9. Hindari Penggunaan Kata Sandi yang Sama:\nMenggunakan kata sandi yang unik untuk setiap akun mencegah jika satu akun terkompromi, akun-akun lainnya juga terancam.
  10. \n
  11. Manajemen Kata Sandi dengan Password Manager:\nMenggunakan manajer kata sandi membantu mengelola dan menghasilkan kata sandi yang kuat secara otomatis, serta mengenkripsi dan mengamankan kata sandi kita.
  12. \n
\n

Praktik Terbaik bagi programmer dalam Menggunakan Package atau Library:

\n
    \n
  1. Verifikasi Sumber yang Terpercaya:\nKetika mengintegrasikan package atau library dari sumber eksternal, pastikan sumber tersebut dapat dipercaya. Menggunakan sumber resmi dan terkini mengurangi risiko mengambil kode berbahaya.
  2. \n
  3. Periksa Aktivitas Repositori:\nPeriksa riwayat commit, isu yang terbuka/ditutup, dan aktivitas terkini dalam repositori library. Ini membantu memastikan bahwa proyek tersebut aktif dan terus diperbarui.
  4. \n
  5. Pahami Komunitas dan Dukungan:\nMemiliki komunitas yang aktif dan dukungan yang baik dari programmer lain dapat membantu kita mengatasi masalah atau kerentanan yang mungkin muncul.
  6. \n
  7. Pahami Lisensi:\nPastikan kita memahami lisensi dari paket atau perpustakaan yang kita gunakan. Beberapa lisensi mungkin memiliki persyaratan tertentu yang perlu kita penuhi.
  8. \n
\n

Kesadaran keamanan adalah tanggung jawab bersama di dunia pengembangan perangkat lunak. Dengan mengikuti checklist dan praktik terbaik ini, programmer dapat membantu melindungi data sensitif dan menjaga integritas perangkat lunak mereka. Dalam dunia yang semakin terhubung, keamanan harus selalu menjadi prioritas utama.

","frontmatter":{"title":"Meningkatkan Kesadaran Keamanan Programer","date":"September 02, 2023"}}},"pageContext":{"slug":"/2023/09/meningkatkan-kesadaran-keamanan-programer/","previous":{"fields":{"slug":"/2023/08/memahami-secure-development-lifecycle/"},"frontmatter":{"title":"Memahami Secure Development Lifecycle (SDLC)"}},"next":{"fields":{"slug":"/2023/09/coding-bootcamp-gratis/"},"frontmatter":{"title":"Coding Bootcamp Online Gratis"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2023/09/review-freecodecamp/page-data.json b/page-data/2023/09/review-freecodecamp/page-data.json new file mode 100644 index 00000000..37d68dca --- /dev/null +++ b/page-data/2023/09/review-freecodecamp/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2023/09/review-freecodecamp/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"32ce2ea8-eb36-5bfd-b6e6-1ddcd5ab98a4","excerpt":"Kelebihan freeCodeCamp Benar-benar Gratis: Seperti namanya, freeCodeCamp adalah platform pembelajaran yang sepenuhnya gratis. Ini memungkinkan siapa pun, tanpa memandang latar belakang finansial, untuk memulai pembelajaran pemrograman. Semua programnya benar-benar gratis, bukan…","html":"

Kelebihan freeCodeCamp

\n
    \n
  1. Benar-benar Gratis: Seperti namanya, freeCodeCamp adalah platform pembelajaran yang sepenuhnya gratis. Ini memungkinkan siapa pun, tanpa memandang latar belakang finansial, untuk memulai pembelajaran pemrograman. Semua programnya benar-benar gratis, bukan trial atau kelas persiapan.
  2. \n
  3. Kurikulum yang Komprehensif: freeCodeCamp menawarkan kurikulum yang luas yang mencakup berbagai bahasa pemrograman dan teknologi terkait. Kurikulumnya mencakup web development (Back end dan Front end), algoritma dan struktur data, data science, data analysis, information security, machine learning, coding interview preparation, data visualization, database administrator dan QA. Bahasa pemrograman yang digunakan adalah JavaScript dan Python. Sementara teknologi yang diajarkan mencakup HTML, CSS, React, dan Node.js. Ini membuatnya cocok untuk pemula yang ingin memulai dan juga untuk mereka yang ingin memperdalam pengetahuannya.
  4. \n
  5. Proyek-Proyek Praktis: Selama pembelajaran, kita akan mengerjakan berbagai proyek yang akan membantu kita mengaplikasikan pengetahuan kita secara langsung. Semua bahan latihan untuk dilakukan sangat praktis, tidak perlu mengeset lingkungan pengembangan di komputer lokal. Proyek latihan dilakukan semua dilakukan di website dengan aplikasi yang interaktif dan jelas. Semua progress latihan kita juga ada trackingnya.
  6. \n
  7. Dukungan Komunitas: freeCodeCamp memiliki komunitas yang besar dan aktif. kita dapat menghubungkan diri dengan sesama pembelajar, berkolaborasi pada proyek-proyek, dan mencari bantuan ketika kita menghadapi kesulitan. Selain itu ada juga artikel-artikel yang ditulis oleh anggota komunitas sebagai suplemen pembelajaran.
  8. \n
  9. Sertifikat freeCodeCamp: Setelah menyelesaikan sebagian besar kurikulum, kita berhak menerima sertifikat freeCodeCamp. Meskipun bukan sertifikat resmi, ini dapat menjadi bukti keterampilan kita kepada calon pemberi kerja.
  10. \n
\n

Kekurangan freeCodeCamp

\n
    \n
  1. Tidak Ada Dukungan Langsung: freeCodeCamp adalah platform mandiri yang mengandalkan pembelajaran sendiri. Jika kita memerlukan bimbingan langsung atau bantuan dari instruktur, kita mungkin merasa kurang tertolong di sini.
  2. \n
  3. Tidak Ada Sertifikat Resmi: Meskipun kita menerima sertifikat freeCodeCamp, sertifikat ini mungkin kurang dihargai oleh beberapa perusahaan dibandingkan dengan sertifikat resmi dari lembaga pendidikan terkemuka.
  4. \n
  5. Tidak Ada Proyek Nyata: Meskipun ada proyek-proyek praktis, mereka mungkin tidak mencakup proyek-proyek yang mendalam atau proyek-proyek dunia nyata yang biasanya ditemui di kursus berbayar atau bootcamp.
  6. \n
  7. Tidak Ada Struktur Kurikulum yang Sama: freeCodeCamp memungkinkan pembelajaran yang sangat fleksibel, tetapi hal ini juga dapat membuat beberapa orang merasa kebingungan tentang urutan pembelajaran yang tepat.
  8. \n
  9. Tidak Ada Dukungan Pribadi: kita harus mandiri dalam menavigasi pembelajaran kita. Jika kita memerlukan dukungan pribadi, bootcamp berbayar dengan mentor mungkin menjadi pilihan yang lebih baik.
  10. \n
","frontmatter":{"title":"Review Coding Bootcamp Online Gratis FreeCodeCamp","date":"September 13, 2023"}}},"pageContext":{"slug":"/2023/09/review-freecodecamp/","previous":{"fields":{"slug":"/2023/09/tips-laravel-eloquent/"},"frontmatter":{"title":"Tips dan Trik Laravel Eloquent"}},"next":{"fields":{"slug":"/2023/09/review-the-odin-project/"},"frontmatter":{"title":"Review Coding Bootcamp Online Gratis The Odin Project"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2023/09/review-the-odin-project/page-data.json b/page-data/2023/09/review-the-odin-project/page-data.json new file mode 100644 index 00000000..50a6d08e --- /dev/null +++ b/page-data/2023/09/review-the-odin-project/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2023/09/review-the-odin-project/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"36b0e423-fe81-5ce0-9c40-9af16fd73d1e","excerpt":"Kelebihan The Odin Project Gratis Sepenuhnya: The Odin Project benar-benar gratis untuk digunakan. Ini berarti siapa pun dapat memulai pembelajaran tanpa biaya pendaftaran atau langganan bulanan. Ini bukan program trial, preview atau preparation. Kurikulum yang Komprehensif: The…","html":"

Kelebihan The Odin Project

\n
    \n
  1. Gratis Sepenuhnya: The Odin Project benar-benar gratis untuk digunakan. Ini berarti siapa pun dapat memulai pembelajaran tanpa biaya pendaftaran atau langganan bulanan. Ini bukan program trial, preview atau preparation.
  2. \n
  3. Kurikulum yang Komprehensif: The Odin Project menawarkan kurikulum yang komprehensif yang mencakup berbagai bahasa pemrograman, teknologi, dan konsep terkait pengembangan web baik sisi front end, seperti HTML, CSS, JavaScript, React dan back end Node.js atau Ruby.
  4. \n
\n

Selain itu kurikulum juga didasari fundamental yang baik dengan algoritma, struktur data dan database. Ini cocok untuk pemula yang ingin memulai dari nol dan juga untuk mereka yang ingin memperdalam pengetahuannya.

\n
    \n
  1. Proyek-Proyek Praktis: Selama belajar di The Odin Project, kita akan bekerja pada berbagai proyek yang praktis. Ini membantu kita mengaplikasikan pengetahuan yang telah kita pelajari dalam situasi nyata, yang merupakan cara yang sangat efektif untuk belajar.
  2. \n
  3. Fleksibilitas: kita dapat mengakses materi dan proyek-proyek kapan saja dan di mana saja. Ini memungkinkan pembelajaran yang sesuai dengan jadwal kita.
  4. \n
  5. Komunitas dan Dukungan: The Odin Project memiliki komunitas yang aktif di Disccord. kita dapat berinteraksi dengan sesama pembelajar, bertanya, dan berkolaborasi pada proyek-proyek. Ini membantu menjaga motivasi dan memecahkan masalah ketika kita menghadapi kesulitan.
  6. \n
\n

Kekurangan The Odin Project

\n
    \n
  1. Tidak Ada Dukungan Instruktur Langsung: Salah satu kekurangan utama dari The Odin Project adalah kurangnya dukungan instruktur langsung. Jika kita memerlukan bimbingan langsung atau ingin menjawab pertanyaan secara instan, kita mungkin merasa terbatas di sini.
  2. \n
  3. Tidak Ada Sertifikat Resmi: Meskipun kita akan membangun portofolio proyek, The Odin Project tidak memberikan sertifikat resmi seperti yang mungkin diberikan oleh institusi pendidikan formal atau bootcamp berbayar.
  4. \n
  5. Materi yang Mandiri: Belajar sendiri membutuhkan tingkat disiplin dan motivasi yang tinggi. Tidak semua orang cocok dengan pendekatan ini.
  6. \n
  7. Tidak Ada Pembimbingan Karir: Meskipun The Odin Project memberikan keterampilan teknis yang kuat, tidak ada dukungan khusus dalam hal pembimbingan karir. Membangun portofolio yang kuat tetapi tidak tahu cara memasarkannya dapat menjadi tantangan tersendiri.
  8. \n
","frontmatter":{"title":"Review Coding Bootcamp Online Gratis The Odin Project","date":"September 16, 2023"}}},"pageContext":{"slug":"/2023/09/review-the-odin-project/","previous":{"fields":{"slug":"/2023/09/review-freecodecamp/"},"frontmatter":{"title":"Review Coding Bootcamp Online Gratis FreeCodeCamp"}},"next":{"fields":{"slug":"/2023/09/unit-testing-arrange-act-assert/"},"frontmatter":{"title":"Unit Testing dengan Pendekatan Arrange, Act, dan Assert"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2023/09/tips-laravel-eloquent/page-data.json b/page-data/2023/09/tips-laravel-eloquent/page-data.json new file mode 100644 index 00000000..d4766fb8 --- /dev/null +++ b/page-data/2023/09/tips-laravel-eloquent/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2023/09/tips-laravel-eloquent/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"683c1726-5d56-57aa-b6f7-dba94746a6ac","excerpt":"Saat kita menggunakan framework Laravel, ORM Eloquent terlihat seperti mekanisme sederhana, semuanya begitu mudah dilakukan. Tetapi sebenarnya di balik layar, ada banyak fungsi semi-tersembunyi dan cara-cara yang tidak banyak diketahui untuk mencapai lebih banyak dengan itu.…","html":"

Saat kita menggunakan framework Laravel, ORM Eloquent terlihat seperti mekanisme sederhana, semuanya begitu mudah dilakukan. Tetapi sebenarnya di balik layar, ada banyak fungsi semi-tersembunyi dan cara-cara yang tidak banyak diketahui untuk mencapai lebih banyak dengan itu.

\n

1. Increment dan Decrement

\n

Daripada melakukan ini:

\n
$article = Article::find($article_id);\n$article->read_count++;\n$article->save();
\n

Kita bisa melakukan ini:

\n
$article = Article::find($article_id);\n$article->increment('read_count');
\n

Ini juga akan berfungsi:

\n
Article::find($article_id)->increment('read_count');\nArticle::find($article_id)->increment('read_count', 10); // +10\nProduct::find($produce_id)->decrement('stock'); // -1
\n

2. Method X or Y

\n

Eloquent memiliki beberapa fungsi yang menggabungkan dua method, seperti “tolong lakukan X, jika tidak lakukan Y”.

\n

Contoh 1 - findOrFail()

\n

Daripada:

\n
$user = User::find($id);\nif (!$user) { abort (404); }
\n

Lakukan ini:

\n
$user = User::findOrFail($id);
\n

Contoh 2 - firstOrCreate()

\n

Daripada:

\n
$user = User::where('email', $email)->first();\nif (!$user) {\n  User::create([\n    'email' => $email\n  ]);\n}
\n

Lakukan ini saja:

\n
$user = User::firstOrCreate(['email' => $email]);
\n

3. Method boot() pada Model

\n

Ada tempat ajaib bernama boot() dalam model Eloquent di mana Kita dapat mengganti perilaku default:

\n
class User extends Model\n{\n    public static function boot()\n    {\n        parent::boot();\n        static::updating(function($model)\n        {\n            // lakukan beberapa logging\n            // ganti beberapa properti seperti $model->something = transform($something);\n        });\n    }\n}
\n

Mungkin salah satu contoh yang paling populer adalah mengatur nilai atribut tertentu pada saat membuat objek model. Katakanlah Kita ingin membuat atribut UUID pada saat itu.

\n
public static function boot()\n{\n  parent::boot();\n  self::creating(function ($model) {\n    $model->uuid = (string)Uuid::generate();\n  });\n}
\n

4. Relasi dengan kondisi dan pengurutan

\n

Ini adalah cara khas untuk mendefinisikan hubungan:

\n
public function users() {\n    return $this->hasMany('App\\User');\n}
\n

Tetapi tahukah Kita bahwa pada titik ini kita sudah dapat menambahkan where atau orderBy? Misalnya, jika Kita ingin relasi tertentu untuk beberapa jenis pengguna, juga diurutkan berdasarkan email, Kita dapat melakukan ini:

\n
public function approvedUsers() {\n    return $this->hasMany('App\\User')->where('approved', 1)->orderBy('email');\n}
\n

5. Properti Model: timestamps, appends, dll.

\n

Ada beberapa “parameter” dari model Eloquent, dalam bentuk properti dari kelas itu. Yang paling populer mungkin adalah ini:

\n
class User extends Model {\n    protected $table = 'users';\n    protected $fillable = ['email', 'password']; // field mana yang booleh diisi pada saat membuat record dengan User::create()\n    protected $dates = ['created_at', 'deleted_at']; // field mana yang akan dikonversi menjadi Carbon\n    protected $appends = ['field1', 'field2']; // nilai tambahan yang dikembalikan dalam JSON\n}
\n

Dan masih ada yang lain:

\n
protected $primaryKey = 'uuid'; // tidak harus \"id\"\npublic $incrementing = false; // bahkan tidak harus otomatis bertambah!\nprotected $perPage = 25; // Kita dapat mengganti jumlah halaman PER MODEL (default 15)\nconst CREATED_AT = 'created_at';\nconst UPDATED_AT = 'updated_at'; // bahkan nama-nama kolom itu dapat diganti\npublic $timestamps = false; // atau bahkan tidak digunakan sama sekali
\n

Dan masih ada lagi, di sini hanya dicantumkan yang paling menarik, untuk lebih banyak silakan cek kode class Model abstrak default dan cek semua trait yang digunakan.

\n

6. Temukan beberapa entri

\n

Semua orang tahu method find(), bukan?

\n
$user = User::find(1);
\n

Namun tidak banyajk orang yang tahu bahwa itu bisa menerima beberapa ID sebagai array:

\n
$users = User::find([1,2,3]);
\n

7. Where X

\n

Ada cara elegan untuk mengubah ini:

\n
$users = User::where('approved', 1)->get();
\n

Menjadi ini:

\n
$users = User::whereApproved(1)->get();
\n

Kita dapat mengganti nama field apa pun dan menambahkannya sebagai sufiks ke “where” dan itu akan berfungsi secara otomatis.

\n

Selain itu, ada beberapa method yang telah ditentukan sebelumnya dalam Eloquent, yang terkait dengan tanggal/waktu:

\n
User::whereDate('created_at', date('Y-m-d'));\nUser::whereDay('created_at', date('d'));\nUser::whereMonth('created_at', date('m'));\nUser::whereYear('created_at', date('Y'));
\n

8. Urutkan berdasarkan hubungan

\n

Sebuah “trik” yang sedikit lebih rumit. Bagaimana jika Kita memiliki topik forum tetapi ingin mengurutkannya berdasarkan posting terbaru? Permintaan yang cukup umum di forum dengan topik yang diperbarui terbaru di bagian atas, bukan?

\n

Pertama, deskripsikan hubungan terpisah untuk posting terbaru pada topik:

\n
public function latestPost()\n{\n    return $this->hasOne(\\App\\Post::class)->latest();\n}
\n

Dan kemudian, di controller kita, kita bisa melakukan “sulap” ini:

\n
$users = Topic::with('latestPost')->get()->sortByDesc('latestPost.created_at');
\n

9. Eloquent::when() - tidak ada lagi if-else

\n

Banyak dari kita menulis kueri kondisional dengan “if-else”, seperti ini:

\n
if (request('filter_by') == 'likes') {\n    $query->where('likes', '>', request('likes_amount', 0));\n}\nif (request('filter_by') == 'date') {\n    $query->orderBy('created_at', request('ordering_rule', 'desc'));\n}
\n

Tetapi ada cara yang lebih baik - menggunakan when():

\n
$query = Author::query();\n$query->when(request('filter_by') == 'likes', function ($q) {\n    return $q->where('likes', '>', request('likes_amount\n\n', 0));\n});\n$query->when(request('filter_by') == 'date', function ($q) {\n    return $q->orderBy('created_at', request('ordering_rule', 'desc'));\n});
\n

Mungkin terasa tidak lebih pendek atau lebih elegan, tetapi yang paling kuat adalah pengiriman parameter:

\n
$query = User::query();\n$query->when(request('role', false), function ($q, $role) {\n    return $q->where('role_id', $role);\n});\n$authors = $query->get();
\n

10. BelongsTo Default Models

\n

Misalkan Kita memiliki model Post yang terkait dengan Author dan kemudian kode Blade template ini:

\n
{{ $post->author->name }}
\n

Tetapi bagaimana jika penulisnya dihapus, atau kosong karena beberapa alasan? Kita akan mendapatkan error, seperti “properti dari objek non-objek”.

\n

Tentu saja, Kita dapat mencegahnya seperti ini:

\n
{{ $post->author->name ?? '' }}
\n

Tetapi Kita dapat melakukannya pada method relasi di Eloquent:

\n
public function author()\n{\n    return $this->belongsTo('App\\Author')->withDefault();\n}
\n

Dalam contoh ini, hubungan author()akan mengembalikan modelApp\\Author` kosong jika tidak ada penulis yang terpasang pada posting.

\n

Selain itu, kita dapat menetapkan nilai properti default untuk model default tersebut.

\n
public function author()\n{\n    return $this->belongsTo('App\\Author')->withDefault([\n        'name' => 'Guest Author'\n    ]);\n}
\n

11. Urutkan berdasarkan Mutator

\n

Bayangkan Kita memiliki ini:

\n
function getFullNameAttribute()\n{\n  return $this->attributes['first_name'] . ' ' . $this->attributes['last_name'];\n}
\n

Sekarang, Kita ingin mengurutkannya berdasarkan full_name itu? Ini tidak akan berfungsi:

\n
$clients = Client::orderBy('full_name')->get(); // tidak berfungsi
\n

Solusinya cukup sederhana. Kita perlu mengurutkan hasil setelah kita mendapatkannya.

\n
$clients = Client::get()->sortBy('full_name'); // berfungsi!
\n

Perhatikan bahwa nama fungsi berbeda - bukan orderBy, tetapi sortBy.

\n

12. Urutan default dalam lingkup global

\n

Bagaimana jika Kita ingin User::all() selalu diurutkan berdasarkan field nama? Kita dapat menetapkan lingkup global. Mari kembali ke method boot(), yang sudah kita sebutkan di atas.

\n
protected static function boot()\n{\n    parent::boot();\n \n    // Urutkan berdasarkan nama ASC\n    static::addGlobalScope('order', function (Builder $builder) {\n        $builder->orderBy('name', 'asc');\n    });\n}
\n

Baca lebih lanjut tentang Query Scopes di sini.

\n

13. Method raw query

\n

Terkadang kita perlu menambahkan raw query ke Eloquent kita. Untungnya, ada fungsi untuk itu.

\n
// whereRaw\n$orders = DB::table('orders')\n    ->whereRaw('price > IF(state = \"TX\", ?, 100)', [200])\n    ->get();\n \n// havingRaw\nProduct::groupBy('category_id')->havingRaw('COUNT(*) > 1')->get();\n \n// orderByRaw\nUser::where('created_at', '>', '2016-01-01')\n  ->orderByRaw('(updated_at - created_at) desc')\n  ->get();
\n

14. Replicate: buat salinan dari baris

\n

Singkat. Tanpa penjelasan mendalam, berikut adalah cara terbaik untuk membuat salinan entri basis data:

\n
$task = Tasks::find(1);\n$newTask = $task->replicate();\n$newTask->save();
\n

15. Method Chunk() untuk tabel besar

\n

Tidak benar-benar terkait dengan Eloquent, lebih tentang Collection, tetapi ini bagus - untuk memproses dataset yang lebih besar, Kita dapat memecahnya menjadi beberapa bagian.

\n

Daripada:

\n
$users = User::all();\nforeach ($users as $user) {\n    // ...\n}
\n

Kita bisa melakukan:

\n
User::chunk(100, function ($users) {\n    foreach ($users as $user) {\n        // ...\n    }\n});
\n

16. Buat controller dan migration saat membuat model

\n

Kita semua tahu perintah Artisan ini:

\n
php artisan make:model Company
\n

Tetapi tahukah Kita ada tiga flag yang berguna untuk menghasilkan file terkait dengan model tersebut?

\n
php artisan make:model Company -mcr
\n
    \n
  • -m akan membuat file migration
  • \n
  • -c akan membuat controller
  • \n
  • -r akan menunjukkan bahwa controller harus bersifat resource
  • \n
\n

17. Timpa updated_at saat menyimpan

\n

Tahukah Kita bahwa method save() dapat menerima parameter? Karena itu, kita dapat memberitahunya untuk “mengabaikan” fungsi default updated_at untuk diisi dengan tanda waktu saat ini. Lihat ini:

\n
$product = Product::find($id);\n$product->updated_at = '2019-01-01 10:00:00';\n$product->save(['timestamps' => false]);
\n

Di sini kita mengganti updated_at default dengan yang telah kita tentukan sebelumnya.

\n

18. Apa hasil dari update()?

\n

Pernahkah Kita bertanya-tanya apa yang sebenarnya dikembalikan oleh kode ini?

\n
$result = $products->whereNull('category_id')->update(['category_id' => 2]);
\n

Pembaruan dilakukan di database, tetapi apa isi variabel $result itu?

\n

Jawabannya adalah baris yang terupdate. Jadi jika Kita perlu memeriksa berapa banyak baris yang terpengaruh, Kita tidak perlu memanggil method yang lain - metode update() akan mengembalikan jumlah ini untuk Kita.

\n

19. Ubah kurung menjadi kueri Eloquent

\n

Bagaimana jika Kita memiliki campuran and-or dalam kueri SQL Kita, seperti ini:

\n
... WHERE (gender = 'Male' and age >= 18) or (gender = 'Female' and age >= 65)
\n

Bagaimana menerjemahkannya menjadi Eloquent? Ini adalah cara yang salah:

\n
$q->where('gender', 'Male');\n$q->orWhere('age', '>=', 18);\n$q->where('gender', 'Female');\n$q->orWhere('age', '>=', 65);
\n

Urutannya akan salah. Cara yang benar sedikit lebih rumit, menggunakan fungsi closure sebagai sub-kueri:

\n
$q->where(function ($query) {\n    $query->where('gender', 'Male')\n        ->where('age', '>=', 18);\n}\n\n)->orWhere(function($query) {\n    $query->where('gender', 'Female')\n        ->where('age', '>=', 65);\n})
\n

20. orWhere dengan parameter ganda

\n

Terakhir, Kita dapat memasukkan parameter berupa array ke orWhere().

\n

Cara “biasa”:

\n
$q->where('a', 1);\n$q->orWhere('b', 2);\n$q->orWhere('c', 3);
\n

Kita bisa melakukannya seperti ini:

\n
$q->where('a', 1);\n$q->orWhere(['b' => 2, 'c' => 3]);
\n

Diterjemahkan dari: 20 Laravel Eloquent Tips and Tricks | Laravel News - Povilas Korop

","frontmatter":{"title":"Tips dan Trik Laravel Eloquent","date":"September 09, 2023"}}},"pageContext":{"slug":"/2023/09/tips-laravel-eloquent/","previous":{"fields":{"slug":"/2023/09/coding-bootcamp-gratis/"},"frontmatter":{"title":"Coding Bootcamp Online Gratis"}},"next":{"fields":{"slug":"/2023/09/review-freecodecamp/"},"frontmatter":{"title":"Review Coding Bootcamp Online Gratis FreeCodeCamp"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2023/09/unit-testing-arrange-act-assert/page-data.json b/page-data/2023/09/unit-testing-arrange-act-assert/page-data.json new file mode 100644 index 00000000..fe35993e --- /dev/null +++ b/page-data/2023/09/unit-testing-arrange-act-assert/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2023/09/unit-testing-arrange-act-assert/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"f8bb96d5-79f6-50ba-b0eb-dd05ac78db01","excerpt":"Unit testing adalah salah satu praktik yang penting dalam pengembangan perangkat lunak yang membantu memastikan bahwa kode kita berfungsi dengan benar. Kita dapat menggunakan pendekatan Arrange, Act, dan Assert (AAA) untuk membuat unit test yang efektif. 1. Arrange Mengeset…","html":"

Unit testing adalah salah satu praktik yang penting dalam pengembangan perangkat lunak yang membantu memastikan bahwa kode kita berfungsi dengan benar. Kita dapat menggunakan pendekatan Arrange, Act, dan Assert (AAA) untuk membuat unit test yang efektif.

\n

1. Arrange

\n

Mengeset input dan target. Langkah-langkah pengaturan ini dilakukan untuk menyiapkan sebuah kasus pengujian. Pikirkan apakah tes ini memerlukan objek atau pengaturan khusus? Apakah perlu menyiapkan database? Apakah perlu masuk ke aplikasi web atau membuat sebuah request http? Tangani semua operasi ini di bagian awal pengujian.

\n

2. Act

\n

Jalankan perilaku (behavior) yang ditargetkan. Langkah-langkah act ini mencakup hal utama yang akan diuji. Ini bisa berupa pemanggilan fungsi atau metode, pemanggilan REST API, atau interaksi dengan halaman web. Jaga agar tindakan yang dijalankan tetap fokus pada perilaku sasaran.

\n

3. Assert

\n

Periksa hasil yang diharapkan. Hasil dari menjalankan langkah act harus menimbulkan semacam respons. Nah, langkah assert ini adalah saat kita memverifikasi benar atau salahnya respons tersebut. Contohnya memeriksa nilai numerik atau string, mengecek response berupa json. Atau, kita mungkin memerlukan pemeriksaan beberapa aspek dari suatu sistem. Assertion pada akhirnya akan menentukan apakah pengujian berhasil atau gagal.

\n

Contoh

\n

Kita akan melihat contoh penggunaan AAA dalam unit testing dengan Laravel.

\n

Bayangkan kita memiliki sebuah model Laravel yang sederhana untuk mengelola buku. Kita ingin menguji method hitungJumlahBuku yang bertanggung jawab menghitung jumlah total buku dalam database.

\n

Langkah 1: Atur (Arrange)

\n

Pertama, kita akan menyiapkan kondisi awal untuk tes kita. Ini mungkin melibatkan pengaturan database tes, membuat objek model, atau mempersiapkan kondisi lain yang diperlukan.

\n
public function testHitungJumlahBuku()\n{\n    // Membuat beberapa buku dalam basis data tes\n    Buku::create(['judul' => 'Buku 1', 'penulis' => 'Penulis 1']);\n    Buku::create(['judul' => 'Buku 2', 'penulis' => 'Penulis 2']);\n    \n    // Membuat objek model\n    $buku = new Buku();\n    \n    // Act\n    $jumlahBuku = $buku->hitungJumlahBuku();\n    \n    // Verifikasi (Assert)\n    $this->assertEquals(2, $jumlahBuku);\n}
\n

Pada langkah ini, kita membuat beberapa buku dalam database tes dan kemudian membuat objek model Buku.

\n

Langkah 2: Lakukan (Act)

\n

Kemudian, kita menjalankan metode atau fungsi yang ingin kita uji. Dalam hal ini, kita memanggil metode hitungJumlahBuku dari objek model Buku.

\n
$jumlahBuku = $buku->hitungJumlahBuku();
\n

Langkah 3: Verifikasi (Assert)

\n

Langkah terakhir adalah memverifikasi hasil tes dengan menggunakan pernyataan “assert” untuk memeriksa apakah hasilnya sesuai dengan harapan kita.

\n
$this->assertEquals(2, $jumlahBuku);
\n

Dalam contoh ini, kita memeriksa apakah $jumlahBuku sama dengan 2, karena kita telah menambahkan dua buku ke dalam basis data tes pada langkah pertama.

\n

Jika semua tes berjalan dengan sukses, kita akan melihat pesan bahwa tes tersebut berhasil. Namun, jika ada kesalahan dalam kode atau hasilnya tidak sesuai dengan harapan, kita akan melihat pesan kesalahan yang membantu kita melacak masalahnya.

\n

Dengan menggunakan pendekatan Arrange, Act, dan Assert dalam unit testing, kita dapat memastikan bahwa kode kita berfungsi dengan benar dan dapat mengidentifikasi masalah lebih awal dalam siklus pengembangan. Unit testing adalah salah satu praktik terbaik dalam pengembangan perangkat lunak yang dapat meningkatkan keandalan dan kualitas perangkat lunak kita secara keseluruhan.

","frontmatter":{"title":"Unit Testing dengan Pendekatan Arrange, Act, dan Assert","date":"September 20, 2023"}}},"pageContext":{"slug":"/2023/09/unit-testing-arrange-act-assert/","previous":{"fields":{"slug":"/2023/09/review-the-odin-project/"},"frontmatter":{"title":"Review Coding Bootcamp Online Gratis The Odin Project"}},"next":{"fields":{"slug":"/2023/09/masalah-n-1-orm/"},"frontmatter":{"title":"Memahami Masalah N + 1 dalam ORM"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2023/10/membaca-flame-graph/page-data.json b/page-data/2023/10/membaca-flame-graph/page-data.json new file mode 100644 index 00000000..271952bb --- /dev/null +++ b/page-data/2023/10/membaca-flame-graph/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2023/10/membaca-flame-graph/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"22ba34cf-a2ce-5159-8c63-fdacf42b2798","excerpt":"Apa itu Flame Graph? Sebelum kita masuk ke dalam cara membaca flame graph, mari kita pahami terlebih dahulu apa itu flame graph. Flame graph adalah representasi visual dari tumpukan pemanggilan (call stack) dalam kode aplikasi. Ini adalah alat yang sangat efektif untuk…","html":"

Apa itu Flame Graph?

\n

Sebelum kita masuk ke dalam cara membaca flame graph, mari kita pahami terlebih dahulu apa itu flame graph. Flame graph adalah representasi visual dari tumpukan pemanggilan (call stack) dalam kode aplikasi. Ini adalah alat yang sangat efektif untuk mengidentifikasi fungsi atau bagian dari kode yang memakan banyak waktu atau sumber daya komputasi.

\n

Dalam flame graph, setiap bar mewakili fungsi atau metode dalam kode. Panjang bar menunjukkan seberapa banyak waktu yang dihabiskan dalam fungsi tersebut. Bar-bar ini disusun dalam tumpukan yang menunjukkan hubungan antar pemanggilan fungsi.

\n

Langkah 1: Memahami Struktur Flame Graph

\n

Sebelum kita mulai membaca flame graph, mari kita pahami strukturnya. Flame graph memiliki dua sumbu utama:

\n
    \n
  • Sumbu Y (Vertikal): Ini adalah tumpukan pemanggilan. Tumpukan teratas adalah fungsi yang pertama kali dipanggil, sedangkan tumpukan terbawah adalah fungsi yang paling dalam dalam tumpukan pemanggilan.
  • \n
  • Sumbu X (Horizontal): Ini adalah skala waktu atau penggunaan sumber daya. Semakin panjang bar, semakin banyak waktu atau sumber daya yang dihabiskan dalam fungsi tersebut.
  • \n
\n

Langkah 2: Identifikasi Hotspot

\n

Hotspot adalah fungsi atau bagian dari kode yang memakan banyak waktu atau sumber daya komputasi. Untuk mengidentifikasi hotspot dalam flame graph, carilah bar yang paling panjang atau paling lebar. Inilah yang perlu diperiksa lebih lanjut.

\n

Langkah 3: Pelajari Pemanggilan Fungsi

\n

Setelah kita mengidentifikasi hotspot, langkah selanjutnya adalah memahami pemanggilan fungsi di sekitarnya. Ini bisa membantu kita mengidentifikasi apakah ada pemanggilan yang tidak perlu atau redundan yang mempengaruhi kinerja.

\n

Langkah 4: Analisis Kedalaman Tumpukan

\n

Flame graph juga memungkinkan kita untuk menganalisis kedalaman tumpukan pemanggilan. Jika kita melihat tumpukan pemanggilan yang sangat dalam, ini bisa menjadi indikasi bahwa ada masalah dalam rekursi tak terbatas atau pemanggilan berulang yang tidak perlu.

\n

Langkah 5: Gunakan Alat Pendukung

\n

Untuk membaca flame graph dengan lebih efektif, kita dapat menggunakan alat pendukung seperti FlameGraph atau alat profilasi kinerja lainnya yang menghasilkan grafik api. Alat ini sering dilengkapi dengan fitur pencarian dan pemfilteran yang memudahkan dalam analisis.

\n

Ada satu video yang menurut saya cukup bagus dalam menjelaskan tentang flame graph Miha Rekar - What Are Flame Graphs and How to Read Them, RubyConfBY 2017

","frontmatter":{"title":"Membaca Flame Graph","date":"October 02, 2023"}}},"pageContext":{"slug":"/2023/10/membaca-flame-graph/","previous":{"fields":{"slug":"/2023/09/masalah-n-1-orm/"},"frontmatter":{"title":"Memahami Masalah N + 1 dalam ORM"}},"next":{"fields":{"slug":"/2023/10/stuck-di-karir/"},"frontmatter":{"title":"Stuck di Karir"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2023/10/stuck-di-karir/page-data.json b/page-data/2023/10/stuck-di-karir/page-data.json new file mode 100644 index 00000000..b6812260 --- /dev/null +++ b/page-data/2023/10/stuck-di-karir/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2023/10/stuck-di-karir/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"4b5770ec-0817-512a-ac54-cbe8a1d3da1a","excerpt":"Ketika melakukan refleksi pada karir, seringkali kita merasa terjebak di suatu titik. Terjebak dalam sebuah peran, stagnasi gaji, atau mungkin merasa bosan dengan tugas yang kita kerjakan. Ada beberapa alasan mengapa kita bisa merasa terjebak di suatu titik tertentu dalam karir…","html":"

Ketika melakukan refleksi pada karir, seringkali kita merasa terjebak di suatu titik. Terjebak dalam sebuah peran, stagnasi gaji, atau mungkin merasa bosan dengan tugas yang kita kerjakan. Ada beberapa alasan mengapa kita bisa merasa terjebak di suatu titik tertentu dalam karir kita, serta beberapa solusi yang mungkin bisa membantu kita keluar dari perasaan terjebak tersebut.

\n

Role

\n

Salah satu alasan utama mengapa kita bisa merasa terjebak dalam suatu peran adalah ketidakpuasan dengan pekerjaan kita saat ini. Mungkin kita merasa peran kita tidak sesuai dengan harapan, atau kita merasa ingin naik ke tingkat yang lebih tinggi dalam organisasi. Organisasi tempat kita bekerja berpengaruh cukup besar dalam hal ini. Untuk mengatasi masalah ini, penting untuk berbicara dengan atasan atau manajer kita. Mungkin ada peluang untuk mengambil tanggung jawab yang lebih besar atau mendapatkan pelatihan tambahan untuk naik ke tingkat berikutnya.

\n

Gaji

\n

Jika kita merasa terjebak dalam tingkat gaji yang sama selama beberapa waktu, ada beberapa pilihan yang bisa kita pertimbangkan. Salah satunya adalah mencari peluang kerja di tempat lain, atau bahkan di luar negeri, di mana ada peluang mendapatkan gaji lebih besar. Namun, perlu diingat bahwa gaji yang lebih tinggi seringkali beriringan dengan biaya hidup yang lebih tinggi pula, misalnya kota atau negara dengan upah yang tinggi kemungkinan juga memiliki biaya hidup yang mahal. Kita juga bisa mempertimbangkan untuk berbicara dengan atasan tentang peningkatan gaji atau mencari pekerjaan sampingan untuk meningkatkan penghasilan.

\n

Task

\n

Terkadang, kita bisa merasa terjebak dalam tugas-tugas yang monoton dan membosankan. Hal ini bisa mengakibatkan penurunan motivasi dan kepuasan kerja. Jika kita merasa seperti ini, mungkin saatnya mencari variasi dalam pekerjaan kita. Bicarakan dengan atasan tentang minat dan kemampuan kita yang belum tergarap. Mungkin kita bisa mendapatkan tugas baru atau proyek yang lebih menarik.

\n

Self Authoring

\n

Salah satu pendekatan yang berguna dalam mengatasi perasaan terjebak adalah mengikuti jejak psikolog terkenal Jordan Peterson. Peterson menekankan pentingnya membuat rencana pengembangan diri pribadi (personal development plan) dengan membuat sebuah self-authoring yang mencakup masa lalu, saat ini, dan masa depan kita. Author your Past, Present, & Future

\n

Masa Lalu

\n
    \n
  • Ceritakan latar belakang kita, keterampilan yang kita punya, minat, dan hobi kita.
  • \n
\n

Saat Ini

\n
    \n
  • Tentukan nilai-nilai, keyakinan pribadi, preferensi, kompetensi, dan keterbatasan kita saat ini.
  • \n
\n

Masa Depan

\n
    \n
  • Tetapkan tujuan jangka pendek (6 bulan), menengah (6-24 bulan), dan jangka panjang (2-5 tahun).
  • \n
  • Gunakan kerangka SMART (Specific, Measurable, Achievable, Relevant, Time-bound) untuk merumuskan tujuan Kita.
  • \n
  • Berdasarkan tujuan dan kerangka tersebut, buat rencana tindakan (action plan) yang akan membantu kita mencapainya.
  • \n
\n

Dokumen ini akan membantu Kita memahami diri Kita sendiri dengan lebih baik dan memberikan arah untuk masa depan Kita. Dengan menulis, kita dapat mengartikulasikan harapan kita dan bagaimana kita mewujudkannya menjadi kenyataan. Dalam kehidupan sehari-hari, dokumen ini juga berguna sebagai bentuk akuntabilitas. Ini juga dapat menjadi patokan dalam melakukan penilaian kinerja (performance review).

","frontmatter":{"title":"Stuck di Karir","date":"October 07, 2023"}}},"pageContext":{"slug":"/2023/10/stuck-di-karir/","previous":{"fields":{"slug":"/2023/10/membaca-flame-graph/"},"frontmatter":{"title":"Membaca Flame Graph"}},"next":{"fields":{"slug":"/2023/11/laravel-static-code-analysis-dengan-phpstan/"},"frontmatter":{"title":"Static Code Analysis dengan PHPStan"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2023/11/laravel-static-code-analysis-dengan-phpstan/page-data.json b/page-data/2023/11/laravel-static-code-analysis-dengan-phpstan/page-data.json new file mode 100644 index 00000000..54eabd79 --- /dev/null +++ b/page-data/2023/11/laravel-static-code-analysis-dengan-phpstan/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2023/11/laravel-static-code-analysis-dengan-phpstan/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"eb00adad-bdd2-5bc0-ac84-85c9ee544967","excerpt":"Analisis kode statis adalah metode evaluasi program dengan memeriksa kode sebelum dieksekusi. Ini dilakukan dengan memeriksa set kode berdasarkan sejumlah aturan penulisan kode (type variable, return value, dsb). Analisis statis dijalankan sebelum pengujian perangkat lunak…","html":"

Analisis kode statis adalah metode evaluasi program dengan memeriksa kode sebelum dieksekusi. Ini dilakukan dengan memeriksa set kode berdasarkan sejumlah aturan penulisan kode (type variable, return value, dsb). Analisis statis dijalankan sebelum pengujian perangkat lunak dimulai. Proses ini dilakukan untuk menjamin bahwa kode yang kita kirim untuk diuji sesuai dengan standar kualitas tertinggi. Ini juga memberikan umpan balik otomatis sehingga para pengembang akan mengetahui masalah-masalah tersebut lebih awal, yang membuatnya lebih mudah dan lebih murah untuk memperbaiki masalah tersebut.

\n

Apa yang Dibawa PHPStan?

\n

Ketika pertama kali melihat repositori PHPStan, ada klaim yang kontroversial…

\n
\n

“PHPStan berfokus pada menemukan kesalahan dalam kode Anda tanpa benar-benar menjalankannya. Ini menangkap seluruh kelas bug bahkan sebelum Anda menulis tes untuk kode tersebut. Ini memindahkan PHP lebih dekat ke bahasa yang dikompilasi dalam arti bahwa kebenaran setiap baris kode dapat diperiksa sebelum Anda menjalankan baris tersebut sebenarnya.”

\n
\n

PHPStan memiliki banyak level aturan, dan seperti yang dapat Anda lihat, semakin tinggi tingkat yang kita pilih, semakin banyak kesalahan yang kita dapatkan. Sekarang pertanyaannya, tingkat mana yang harus kita pilih? Nah, pertama-tama kita perlu tahu apa aturan dari setiap tingkat.

\n

Tingkat Aturan

\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
TingkatNamaDetail
00Basic ChecksMemeriksa kelas-kelas, fungsi atau method yang tidak ditemukan yang dipanggil pada $this, jumlah argumen yang salah yang dimasukkan ke method dan fungsi tersebut, variabel yang selalu tidak terdefinisi.
01$this UnknownsVariabel yang mungkin tidak terdefinisi, method dan properti ajaib yang tidak diketahui pada kelas dengan method __call dan __get.
02MethodsMethod yang tidak diketahui diperiksa pada semua ekspresi (bukan hanya $this), memvalidasi PHPDocs.
03TypesMemeriksa tipe return, tipe yang ditugaskan ke properti.
04Dead CodePemeriksaan dasar kode yang sudah tidak terpakai - selalu false instanceof dan pemeriksaan tipe lainnya, if else mati, kode yang tidak terjangkau setelah return; dll.
05ArgumentsMemeriksa tipe argumen yang dimasukkan sebagai parameter pada method dan fungsi.
06Type HintsMelaporkan kurangnya petunjuk tipe (argument atau return value).
07Union TypesMelaporkan sebagian salahnya tipe gabungan, jika Anda memanggil metode yang hanya ada pada beberapa tipe dalam tipe gabungan, level 7 mulai melaporkan hal tersebut.
08Nullable TypesMelaporkan panggilan metode dan akses ke properti pada tipe yang dapat bernilai null.
09Mixed TypeMenjadi sangat ketat tentang tipe campuran, satu-satunya operasi yang diizinkan yang dapat Anda lakukan dengannya adalah meneruskannya ke tipe campuran lainnya.
\n

Berkas Konfigurasi

\n

PHPStan menggunakan berkas konfigurasi, phpstan.neon atau phpstan.neon.dist, yang memungkinkan Anda:

\n
    \n
  • Mendefinisikan path yang akan dianalisis.
  • \n
  • Menetapkan tingkat aturan.
  • \n
  • Mengecualikan path.
  • \n
  • Menyertakan ekstensi PHPStan.
  • \n
  • Mengabaikan kesalahan.
  • \n
  • Menentukan jumlah maksimum proses paralel.
  • \n
\n

Berikut adalah contoh berkas konfigurasi sederhana yang secara default berada di direktori root aplikasi Anda, tetapi Anda dapat mempelajari lebih lanjut dari referensi konfigurasi.

\n
includes:\n    - ./vendor/nunomaduro/larastan/extension.neon\n\nparameters:\n\n    paths:\n        - app\n        - config\n        - database\n        - routes\n\n    # Tingkat 9 adalah tingkat tertinggi\n    level: 5\n\n    ignoreErrors:\n        - '#PHPDoc tag @var#'\n\n    parallel:\n        maximumNumberOfProcesses: 4\n\n    noUnnecessaryCollectionCall: false\n    checkMissingIterableValueType: false
\n

Mengabaikan Kesalahan

\n

Kemungkinan besar, Anda akan perlu mengabaikan beberapa kesalahan yang untungnya diizinkan dengan dua cara berbeda:

\n
    \n
  1. \n

    Secara langsung menggunakan tag PHPDoc

    \n
    function () {\n    /** @phpstan-ignore-next-line */\n    echo $foo;\n\n    echo $bar /** @phpstan-ignore-line */\n}
    \n
  2. \n
  3. \n

    Dari berkas konfigurasi dan ini sebenarnya lebih bersih

    \n
    parameters:\n\n    ignoreErrors:\n\n        -\n            message: 'Access to an undefined property [a-zA-Z0-9\\_]+::\\$foo'\n            path: some/dir/someFile.php\n        -\n            message: '#Call to an undefined method [a-zA-Z0-9\\_]+::doFoo()#'\n            path: other/dir/DifferentFile.php\n            count: 2 # opsional, dan itu akan mengabaikan dua kemunculan pertama kesalahan\n      -\n            message: '#Call to an undefined method [a-zA-Z0-9\\_]+::doBar()#'\n            paths:\n                - some/dir/*\n                - other/dir/*
    \n
  4. \n
\n

Selengkapnya bisa dibaca di documentasi https://phpstan.org/user-guide/getting-started

","frontmatter":{"title":"Static Code Analysis dengan PHPStan","date":"November 25, 2023"}}},"pageContext":{"slug":"/2023/11/laravel-static-code-analysis-dengan-phpstan/","previous":{"fields":{"slug":"/2023/10/stuck-di-karir/"},"frontmatter":{"title":"Stuck di Karir"}},"next":{"fields":{"slug":"/2023/12/docker-compose/"},"frontmatter":{"title":"Apa itu Docker Compose?"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2023/12/docker-compose/page-data.json b/page-data/2023/12/docker-compose/page-data.json new file mode 100644 index 00000000..3d044e9b --- /dev/null +++ b/page-data/2023/12/docker-compose/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2023/12/docker-compose/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"9b26eba7-9b0a-5748-8b3e-9d9cbcb8fbac","excerpt":"Docker Compose adalah alat untuk mendefinisikan dan menjalankan aplikasi Docker multi-kontainer (beberapa container yang saling terkait). Dengan Compose, kita menggunakan file YAML untuk mengonfigurasi service-service yang dibutuhkan aplikasi kita. Kemudian, dengan satu perintah…","html":"

Docker Compose adalah alat untuk mendefinisikan dan menjalankan aplikasi Docker multi-kontainer (beberapa container yang saling terkait). Dengan Compose, kita menggunakan file YAML untuk mengonfigurasi service-service yang dibutuhkan aplikasi kita. Kemudian, dengan satu perintah, kita membuat dan memulai semua service yang dibutuhkan tersebut dari konfigurasi kita.

\n

Satu contoh ketika kita memiliki aplikasi dashboard yang dibangun dengan framework Laravel, maka kita membutuhkan service php, mysql, npm, nginx untuk bisa menjalankannya. Docker compose dapat mengonfigurasikan semua container yang berisi service tersebut dan menjalankannya dengan satu perintah.

\n

Compose dapat berjalan di semua lingkungan; production, staging, development, testing, serta work flow CI. Compose juga dilengkapi dengan perintah untuk mengelola seluruh siklus hidup aplikasi kita:

\n
    \n
  • Memulai, menghentikan, dan membangun kembali service-service (up, down, build)
  • \n
  • Lihat status service yang berjalan
  • \n
  • Streaming output log dari service yang berjalan
  • \n
  • Jalankan perintah satu kali pada suatu service
  • \n
\n

Fitur utama Compose yang menjadikannya efektif adalah:

\n
    \n
  • Memiliki beberapa lingkungan terisolasi pada satu host
  • \n
  • Menyimpan volume data saat kontainer dibuat (database tidak terhapus saat layanan dimatikan)
  • \n
  • Hanya membuat ulang container yang telah berubah
  • \n
  • Mendukung variabel dan memindahkan komposisi antar lingkungan
  • \n
","frontmatter":{"title":"Apa itu Docker Compose?","date":"December 10, 2023"}}},"pageContext":{"slug":"/2023/12/docker-compose/","previous":{"fields":{"slug":"/2023/11/laravel-static-code-analysis-dengan-phpstan/"},"frontmatter":{"title":"Static Code Analysis dengan PHPStan"}},"next":{"fields":{"slug":"/2024/01/10-hal-yang-harus-dipelajari-oleh-programmer-tentang-belajar/"},"frontmatter":{"title":"10 Hal yang Harus Dipelajari oleh Programmer tentang \"Belajar\""}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2024/01/10-hal-yang-harus-dipelajari-oleh-programmer-tentang-belajar/page-data.json b/page-data/2024/01/10-hal-yang-harus-dipelajari-oleh-programmer-tentang-belajar/page-data.json new file mode 100644 index 00000000..5e0ee30d --- /dev/null +++ b/page-data/2024/01/10-hal-yang-harus-dipelajari-oleh-programmer-tentang-belajar/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2024/01/10-hal-yang-harus-dipelajari-oleh-programmer-tentang-belajar/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"1c31a82e-00e7-5b30-aa93-0b3910997ac4","excerpt":"Sebuah artikel yang menarik membahas tentang “belajar” khususnya di dunia pengembang perangkat lunak. Banyak wawasan dari tulisan ini membatalkan mitos-mitos yang sering dipercayai tentang belajar. Salah satu yang paling menarik adalah bahwa belajar dalam rentang waktu yang lama…","html":"

Sebuah artikel yang menarik membahas tentang “belajar” khususnya di dunia pengembang perangkat lunak. Banyak wawasan dari tulisan ini membatalkan mitos-mitos yang sering dipercayai tentang belajar. Salah satu yang paling menarik adalah bahwa belajar dalam rentang waktu yang lama secara terus menerus tanpa istirahat justru kurang efektif. Ini juga disimpulkan dengan memahami cara kerja memori di otak manusia. Artikel ini membahas tentang belajar dari beberapa sudut pandang, pembelajar, pengajar dan perekrut.

\n

Silahkan baca artikel aslinya di sini: 10 Things Software Developers Should Learn about Learning

\n

Wawasan Utama

\n
    \n
  1. Ingatan Manusia Tidak Terbuat dari Bit
  2. \n
  3. Memori Manusia Terdiri dari Satu Sistem Terbatas dan Satu Sistem Tidak Terbatas
  4. \n
  5. Pakar Mengenali, Pemula membuat Alasan
  6. \n
  7. Pemahaman Konsep Beranjak dari Abstrak ke Konkret dan Kembali
  8. \n
  9. Jarak dan Pengulangan itu Penting
  10. \n
  11. Internet Belum Membuat Proses Belajar Menjadi Sesuatu yang Usang
  12. \n
  13. Pemecahan Masalah Bukanlah Keterampilan Umum
  14. \n
  15. Keahlian justru Bisa Menjadi Masalah dalam Beberapa Situasi
  16. \n
  17. Prediktor Kemampuan Pemrograman itu Tidak Jelas
  18. \n
  19. Pola Pikir Anda Penting
  20. \n
\n

Rekomendasi

\n

Penulis telah membagi rekomendasi menjadi 2, rekomendasi untuk perekrutan dan rekomendasi untuk pelatihan dan pembelajaran.

\n

Untuk perekrutan, berikut rekomendasinya:

\n
    \n
  • Tidak ada proksi yang bagus untuk kemampuan pemrograman. Stereotip berdasarkan gender, ras, atau faktor lainnya tidak didukung oleh bukti ilmiah. Jika Anda ingin mengetahui seberapa baik kandidat memprogram, lihat pekerjaan mereka sebelumnya atau uji mereka pada tugas pemrograman yang sebenarnya. Untuk menekankan hal tertentu: Jangan menguji kandidat dengan teka-teki asah otak.
  • \n
  • Setidaknya di kalangan pengembang muda, pengalaman bertahun-tahun mungkin bukan ukuran kemampuan yang dapat diandalkan.
  • \n
  • Rekomendasi terkait dari Behroozi dkk.3 adalah meminta kandidat menyelesaikan sendiri masalah wawancara di ruangan sebelum menyajikan solusinya, karena tekanan tambahan dari pewawancara yang mengamati atau mengharuskan berbicara sambil menyelesaikannya akan menambah beban kognitif dan stres dalam cara yang mengganggu kinerja.
  • \n
\n

Untuk pembelajaran dan pelatihan, berikut rekomendasinya:

\n
    \n
  • Membaca banyak kode akan membantu seseorang menjadi programmer yang lebih efisien.
  • \n
  • Para ahli tidak selalu yang terbaik dalam melatih pemula.
  • \n
  • Pembelajaran membutuhkan waktu, termasuk waktu antar sesi pembelajaran. Menjejalkan secara intens tidaklah efektif, tetapi pengulangan dengan jarak cukup efektif.
  • \n
  • Demikian pula, menghabiskan waktu jauh dari suatu masalah dapat membantu menyelesaikannya.
  • \n
  • Hanya karena Anda dapat menemukannya melalui pencarian di Internet atau alat AI generatif, bukan berarti pembelajaran sudah ketinggalan zaman.
  • \n
  • Gunakan contoh untuk membedakan konsep abstrak dan fakta konkret yang dapat dipelajari.
  • \n
  • Berusaha untuk berhasil (daripada menghindari kegagalan) dan percaya bahwa kemampuan dapat diubah, merupakan faktor penting dalam ketahanan dan pembelajaran (mindset itu penting!).
  • \n
","frontmatter":{"title":"10 Hal yang Harus Dipelajari oleh Programmer tentang \"Belajar\"","date":"January 22, 2024"}}},"pageContext":{"slug":"/2024/01/10-hal-yang-harus-dipelajari-oleh-programmer-tentang-belajar/","previous":{"fields":{"slug":"/2023/12/docker-compose/"},"frontmatter":{"title":"Apa itu Docker Compose?"}},"next":{"fields":{"slug":"/2024/02/apa-itu-env-file/"},"frontmatter":{"title":"Apa Itu .env File?"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2024/02/ajari-diri-anda-pemrograman-dalam-sepuluh-tahun/page-data.json b/page-data/2024/02/ajari-diri-anda-pemrograman-dalam-sepuluh-tahun/page-data.json new file mode 100644 index 00000000..98a3a640 --- /dev/null +++ b/page-data/2024/02/ajari-diri-anda-pemrograman-dalam-sepuluh-tahun/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2024/02/ajari-diri-anda-pemrograman-dalam-sepuluh-tahun/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"6e78e42b-8e59-5536-9594-099dcf95b128","excerpt":"Satu artikel menarik ditulis oleh Peter Norvig tentang belajar pemrograman. Kita bisa membaca versi aslinya di sini Teach Yourself Programming in Ten Years dan versi bahasa Indonesia Belajar Programming Sendiri Dalam Sepuluh Tahun. \nSaya merasa perlu menulis ulang ini di blog…","html":"

Satu artikel menarik ditulis oleh Peter Norvig tentang belajar pemrograman. Kita bisa membaca versi aslinya di sini Teach Yourself Programming in Ten Years dan versi bahasa Indonesia Belajar Programming Sendiri Dalam Sepuluh Tahun.\nSaya merasa perlu menulis ulang ini di blog untuk mempermudah saya :)

\n

Mengapa semua orang terburu-buru?

\n

Norvig melakukan riset dan menemukan bahwa sekarang ini banyak sekali buku dengan judul “Belajar X dalam Y hari” atau bahkan jam. Entah orang-orang sekarang ini terburu-buru untuk belajar\ntentang komputer, atau komputer adalah hal yang sangat mudah dipelajari dari hal-hal lainnya. Tidak ada buku untuk belajar Beethoven, atau Fisika Kuantum,\natau bahkan Melatih Anjing dalam beberapa hari.

\n

Terlalu cepat, sebatas permukaan

\n

Dalam waktu sesingkat 3 hari kita tidak akan punya cukup waktu untuk menulis beberapa program yang berguna, dan belajar dari keberhasilan dan kegagalan program-program ini.\nKita tidak akan punya cukup waktu untuk bekerja dengan seorang programmer berpengalaman dan mengerti seperti apa hidup dalam lingkungan C++.\nSingkatnya, kita tidak akan punya cukup waktu untuk belajar banyak. Jadi buku dengan judul semacam itu hanya bisa berbicara tentang hal-hal yg superfisial, bukan pengertian yg mendalam.

\n
\n

“Mengerti sesuatu hal dengan sedikit adalah hal yang berbahaya.” - Alexander Pope

\n
\n

Belajar memrogram

\n

Dalam 3 hari kita bisa belajar sedikit sintaks C++ (jika kita telah mengetahui bahasa pemrograman yg lain), tapi tidak bisa belajar banyak bagaimana cara menggunakan bahasa tersebut.\nSingkatnya, jika kita adalah seorang programmer Basic, kita bisa belajar menulis program menggunakan sintaks C++ dalam gaya Basic, tapi kita tidak bisa memahami keunggulan\ndan kekurangan dari C++. Satu contoh lain adalah kita perlu belajar sedikit tentang JavaScript karena perlu membuat sebuah interface dari program yang sudah ada.\nYang sebenarnya terjadi adalah kita tidak sedang mempelajari bagaimana untuk memrogram; kita hanya belajar bagaimana melakukan hal tersebut. Jadi apa gunanya?

\n
\n

“Sebuah bahasa pemrograman yang tidak mengubah cara berpikir anda tentang pemrograman, tidak berguna untuk dipelajari.” - Alan Perlis

\n
\n

Mengapa Belajar dalam Sepuluh Tahun?

\n

Banyak bukti ilmiah yang menunjukkan bahwa perlu waktu yang panjang bagi seseorang untuk mengembangkan keahliannya.

\n
    \n
  • Bloom (1985), Bryan & Harter (1899), Hayes (1989), Simmon & Chase (1973) menunjukkan bahwa diperlukan sekitar sepuluh tahun untuk mengembangkan keahlian\ndi berbagai macam bidang, termasuk bermain catur, mengomposisi musik, mengoperasikan telegraf, melukis, bermain piano, berenang, bermain tenis, dan riset dalam bidang neuropsychology\ndan topology.
  • \n
  • \n

    Malcolm Gladwell mengatakan itu perlu 10,000 jam, berdasarkan laporan dalam sebuah studi murid-murid di Berlin Academy of Music yang membandingkan tiga group: terbaik, menengah,\ndan terakhir dari sebuah kelas dan bertanya kepada mereka berapa lama mereka latihan:

    \n
    \n

    Setiap orang, dari ketiga group ini, mulai bermain kira-kira pada umur yang sama, sekitar umur 3 – 5 tahun.\nDalam tahun-tahun pertama ini, semua latihan sekitar 2 – 3 jam seminggu. Tetapi sekitar umur 8 tahun, perbedaan yang sesungguhnya mulai muncul.

    \n

    Murid-murid yang akan menjadi terbaik di kelasnya mulai berlatih lebih banyak dari yg lainnya:
    \n6 jam seminggu pada umur 9
    \n8 jam seminggu pada umur 12
    \n16 jam seminggu pada umur 14
    \ndan terus bertambah hingga saat mereka berumur 20 tahun mereka berlatih lebih dari 30 jam seminggu.

    \n

    Saat mereka berumur 20 tahun, orang-orang terbaik ini telah berlatih selama 10,000 jam dalam hidup mereka.\nMurid-murid yg cukup baik hanya 8,000 jam, dan yang menjadi guru musik di masa depan hanya sedikit lebih dari 4,000 jam.

    \n
    \n
  • \n
  • Samuel Johnson (1709-1784) berpikir bahwa angkanya lebih banyak: “Kesempurnaan di bidang apapun bisa didapatkan hanya dengan usaha seumur hidup;\nhal tersebut tidak bisa dibeli dengan harga yang kurang dari itu.”
  • \n
  • Dan Chaucer (1340-1400) mengatakan “hidup ini terlalu pendek, keahlian terlalu banyak untuk dipelajari.”
  • \n
  • Hippocrates (sekitar 400SM) dikenal karena kata-kata berikut “ars longa, vita brevis”, yang adalah bagian dari kata-kata yang lebih panjang\n“Ars longa, vita brevis, occasio praeceps, experimentum periculosum, iudicium difficile”, yang berarti “Hidup ini pendek, keahlian lama,\nkesempatan menghilang, eksperimen berbahaya, keputusan sulit.”
  • \n
\n

Resep Sukses Belajar Pemrograman

\n
    \n
  • Miliki ketertarikan kepada programming dan lakukan karena itu mengasyikan. Pastikan bahwa itu akan tetap mengasyikan sehingga kita akan mau melakukannya untuk 10 tahun.
  • \n
  • Bicara dengan programmer-programmer lain; baca program-program lain. Hal ini lebih penting daripada sebuah buku atau kursus.
  • \n
  • Membuat program (learning by doing). Ini adalah bentuk latihan dengan penuh perhatian. Kita akan merasakan bagaimana menghadapi sebuah masalah dan menemukan solusinya.
  • \n
  • Buat kesalahan, dapatkan feedback, perbaiki. Pengalaman tidak dihitung dari sekedar melakukan sesuatu berulang-ulang selama periode waktu tertentu. Dalam berlatih, pastikan ini dilakukan dengan\ntingkat kesulitan yang tepat, mulai dari yang paling mudah lalu tingkatkan kesulitannya sedikit demi sedikit. Lakukan seperti sebuah eksperimen, buatlah kesalahan lalu perbaiki.
  • \n
  • Kuliah (jika mau), gunakan empat tahun di kampus (atau lebih jika S2). Hal ini akan memberi kita akses untuk pekerjaan-pekerjaan yang membutuhkan sebuah gelar,\ndan hal ini juga akan memberi kita pengertian mendalam tentang bidang ini.
  • \n
  • \n

    Cari pekerjaan. Jika tidak menyukai sekolah, kita bisa (dengan cukup dedikasi) mendapatkan pengalaman yang mirip di pekerjaan. Belajar dari buku saja tidak akan cukup.

    \n
    \n

    “Pendidikan Computer Science tidak bisa membuat siapapun menjadi programmer, sama halnya mempelajari kuas dan warna tidak bisa membuat seseorang menjadi pelukis.” - Eric Raymond,\npenulis “The New Hacker’s Dictionary”.

    \n
    \n
  • \n
  • Kerjakan project bersama programmer-programmer lain. Jadilah programmer terbaik di dalam beberapa project; dan jadilah yg terburuk di project lainnya.\nSaat kita menjadi yang terbaik, kita punya kesempatan mencoba kemampuan memimpin sebuah project, dan menginspirasi orang lain dengan visi kita.\nSaat kita menjadi yang terburuk, kita belajar apa yang dilakukan oleh para ahli, dan belajar apa yang mereka tidak suka lakukan (karena mereka membuat kita melakukannya untuk mereka).
  • \n
  • Kerjakan project yang telah dikerjakan programmer-programmer lain. Ikutlah terlibat untuk mengerti sebuah program yang ditulis orang orang lain.\nCoba untuk mengerti dan membetulkannya saat pembuatnya sedang tidak ada. Berpikirlah bagaimana membuat desain program kita mudah untuk orang lain memaintainnya.
  • \n
  • Pelajari paling sedikit 6 bahasa pemrogramman. Pelajari satu bahasa yang mendukung abstraksi class (seperti Java atau C++), satu yang mendukung abstraksi fungsi\n(seperti Lisp atau ML), satu yang mendukung abstraksi syntaks (seperti Lisp), satu yang mendukung spesifikasi deklaratif (seperti template Prolog atau C++),\nsatu yang mendukung coroutines (seperti Icon atau Scheme), dan satu yang mendukung parallelisme (seperti Sisal).
  • \n
  • Pahami komputer Ingat bahwa terdapat kata “komputer” dalam “ilmu komputer”. Ketahuilah bagaimana komputer bekerja, misalnya berapa lama dibutuhkan komputer untuk mengeksekusi sebuah instruksi,\nmengambil sebuah kata dari memori, membaca beberapa kata dari disk, dan mencari lokasi baru pada disk.
  • \n
  • Terlibat dalam usaha standarisasi sebuah bahasa. Kita akan belajar apa yang orang lain sukai dalam sebuah bahasa, seberapa dalam perasaan itu,\ndan mungkin sedikit tentang mengapa mereka memiliki perasaan tersebut.
  • \n
  • Miliki sebuah perasaan untuk lepas dari usaha standarisasi bahasa secepat mungkin.
  • \n
\n

Perlis mengatakan bahwa para pemain hebat memiliki kualitas internal yang melampaui pelatihan mereka. Tapi dari mana kualitasnya berasal? Apakah itu bawaan?\nAtau apakah mereka mengembangkannya melalui ketekunan?

\n
\n

“Siapa pun bisa memasak, tapi hanya mereka yang tak kenal takut yang bisa menjadi hebat.” - Auguste Gusteau (koki fiksi di Ratatouille)

\n
\n

Norvig menganggap pernyataan tersebut sebagai keberanian untuk bersedia mengabdikan sebagian besar hidup seseorang untuk melakukan praktik deliberatif.

\n
\n

“Tidak semua orang bisa menjadi seniman hebat, tapi seniman hebat bisa datang dari mana saja.” Anton Ego (kritikus Gusteau)

\n
\n

Jadi, silakan beli buku Java/Ruby/Javascript/PHP itu; kita mungkin akan mendapat manfaat darinya. Namun itu tidak akan mengubah hidup kita,\natau keahlian kita secara keseluruhan sebagai seorang programmer dalam 24 jam atau 21 hari.\nBagaimana jika kita mencoba bekerja keras untuk terus berkembang selama 24 bulan?

","frontmatter":{"title":"Ajari Diri Anda Pemrograman dalam Sepuluh Tahun","date":"February 15, 2024"}}},"pageContext":{"slug":"/2024/02/ajari-diri-anda-pemrograman-dalam-sepuluh-tahun/","previous":{"fields":{"slug":"/2024/02/mengenal-feature-integration-dan-regression-test/"},"frontmatter":{"title":"Mengenal Feature Test, Integration Test, dan Regression Test"}},"next":{"fields":{"slug":"/2024/02/kursus-menulis-teknis-google-bagian-satu/"},"frontmatter":{"title":"Kursus Menulis Teknis Google - Bagian Satu"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2024/02/apa-itu-env-file/page-data.json b/page-data/2024/02/apa-itu-env-file/page-data.json new file mode 100644 index 00000000..beb8c0d7 --- /dev/null +++ b/page-data/2024/02/apa-itu-env-file/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2024/02/apa-itu-env-file/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"7574e7d6-031f-5aff-81fd-4f022f144082","excerpt":"Dalam dunia pengembangan perangkat lunak, pengelolaan konfigurasi menjadi aspek penting dalam memastikan aplikasi berjalan dengan lancar di berbagai lingkungan. Salah satu alat yang telah merevolusi cara pengembang mengelola konfigurasi adalah file .env. Asal Usul Konsep…","html":"

Dalam dunia pengembangan perangkat lunak, pengelolaan konfigurasi menjadi aspek penting dalam memastikan aplikasi berjalan dengan lancar di berbagai lingkungan. Salah satu alat yang telah merevolusi cara pengembang mengelola konfigurasi adalah file .env.

\n

Asal Usul

\n

Konsep penggunaan variabel lingkungan (environment - env) untuk mengelola konfigurasi sudah ada sejak lama, terutama dalam sistem operasi seperti Unix dan Linux. Namun, penggunaan variabel env secara langsung dalam kode tidak efisien dan kurang fleksibel, terutama ketika aplikasi harus di-deploy ke berbagai lingkungan (development, staging, production).

\n

Munculnya file .env

\n

Kemunculan file .env menjadi solusi bagi masalah tersebut. .env memungkinkan pengembang menyimpan variabel env di luar kode sumber, dalam bentuk file teks yang mudah dibaca. Pengembang dapat menentukan konfigurasi yang spesifik untuk setiap env tanpa harus memodifikasi kode sumber.

\n

Penggunaan yang Populer

\n

Penggunaan .env mulai populer bersamaan dengan munculnya framework pengembangan web seperti Ruby on Rails dan Laravel. Pengembang menggunakan .env untuk menyimpan informasi sensitif seperti API key atau kredensial database, yang tidak seharusnya disimpan dalam kode sumber. Penggunaan .env juga memungkinkan pengembang untuk dengan mudah berbagi konfigurasi dengan anggota tim lainnya.

\n

Keuntungan

\n

Penggunaan file .env membawa beberapa keuntungan, antara lain:

\n
    \n
  • Pemisahan Konfigurasi: .env memungkinkan pemisahan konfigurasi dari kode sumber, memudahkan pengelolaan konfigurasi di berbagai lingkungan.
  • \n
  • Keamanan: Informasi sensitif dapat disimpan secara aman di dalam .env, mengurangi risiko kebocoran informasi.
  • \n
  • Fleksibilitas: Penggunaan .env memungkinkan pengembang untuk dengan mudah menyesuaikan konfigurasi untuk berbagai lingkungan tanpa harus mengubah kode sumber.
  • \n
\n

Kekurangan

\n

Selain itu, ada beberapa kekurangan:

\n
    \n
  • Penyimpanan Rumit: Ini adalah keterbatasan dari file. Kita tidak bisa menyimpan file di repo karena semua orang bisa melihatnya. Menyimpannya di root VM juga memiliki keterbatasan akses. Bagaimana dengan Docker container? Apakah kita memasukkan informasi rahasia langsung ke dalam image? Jika image tersebut bocor, semua orang akan punya akses ke informasi rahasia kita
  • \n
  • Keterbatasan Akses: Apa yang terjadi jika kita perlu memperbarui password database? Ketika seseorang membuka file .env dia dapat melihat semua informasi rahasia di dalam file tersebut. Setiap kali suatu konfigurasi harus diperbarui, siapa pun yang memperbaruinya dapat melihat SEMUA informasi rahasia.
  • \n
  • Pembuatan Versi: Katakanlah kita sedang menerapkan fitur baru yang memerlukan pembaruan konfigurasi/variabel rahasia, terjadi kesalahan dan pembaruan dibatalkan. Apakah ada yang ingat informasi terakhir yang kita miliki di .env? Kita tidak memiliki riwayat perubahan sebuah file .env yang tidak disimpan di dalam repo.
  • \n
\n

Penggunaan Modern

\n

Dalam dunia pengembangan perangkat lunak modern, .env telah menjadi standar de facto dalam pengelolaan konfigurasi. Pengembang dari berbagai bahasa dan framework menggunakan .env untuk mengelola konfigurasi dengan efisien dan aman.

\n

Salah satu solusi yang muncul untuk mengatasi kekurangan file env adalah menggunakan server konfigurasi. Server konfigurasi adalah aplikasi eksternal untuk menyimpan konfigurasi dan rahasia. Ini dianggap sebagai pusat untuk mengelola rahasia di seluruh lingkungan.

\n

Beberapa layanan cloud dapat berfungsi sebagai server konfigurasi seperti AWS Parameter Store, Google Secrets Manager, atau HashiCorp Vault untuk para penggemar open source. Di tempat saya bekerja sendiri sudah memindahkan konfigurasi dari env file ke layanan Infisical. Setelah kita menyimpan informasi rahasia atau konfigurasi, kita akan diberikan URL seperti https://app.com/config/DB_PASSWORD/v1.

","frontmatter":{"title":"Apa Itu .env File?","date":"February 08, 2024"}}},"pageContext":{"slug":"/2024/02/apa-itu-env-file/","previous":{"fields":{"slug":"/2024/01/10-hal-yang-harus-dipelajari-oleh-programmer-tentang-belajar/"},"frontmatter":{"title":"10 Hal yang Harus Dipelajari oleh Programmer tentang \"Belajar\""}},"next":{"fields":{"slug":"/2024/02/mengenal-feature-integration-dan-regression-test/"},"frontmatter":{"title":"Mengenal Feature Test, Integration Test, dan Regression Test"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2024/02/kursus-menulis-teknis-google-bagian-satu/page-data.json b/page-data/2024/02/kursus-menulis-teknis-google-bagian-satu/page-data.json new file mode 100644 index 00000000..09756470 --- /dev/null +++ b/page-data/2024/02/kursus-menulis-teknis-google-bagian-satu/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2024/02/kursus-menulis-teknis-google-bagian-satu/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"06c387ac-3144-5d8f-8c76-4debb8754215","excerpt":"Ini adalah ringkasan dari Kursus Menulis Teknis Google bagian satu. Every engineer is also a writer. Memilih kata Definisikan istilah-istilah baru atau asing. Gunakan akronim dengan benar. Gunakan istilah secara konsisten. Hindari kata ganti yang ambigu. Gunakan kalimat aktif…","html":"

Ini adalah ringkasan dari Kursus Menulis Teknis Google bagian satu.

\n
\n

Every engineer is also a writer.

\n
\n

Memilih kata

\n
    \n
  • Definisikan istilah-istilah baru atau asing.
  • \n
  • Gunakan akronim dengan benar.
  • \n
  • Gunakan istilah secara konsisten.
  • \n
  • Hindari kata ganti yang ambigu.
  • \n
\n

Gunakan kalimat aktif

\n
    \n
  • Pilih kalimat aktif dibanding kalimat pasif.
  • \n
  • Kata kerja imperatif biasanya akan membuat kalimat aktif.
  • \n
\n

Menyusun kalimat yang jelas

\n
    \n
  • Pilih kata kerja yang spesifik daripada kata kerja yang tidak jelas (terlalu umum).
  • \n
\n

Buat kalimat yang singkat

\n
    \n
  • Fokuskan setiap kalimat pada satu ide.
  • \n
  • Ubah beberapa kalimat panjang menjadi sebuah daftar (ordered/unordered list).
  • \n
  • Hilangkan kata-kata yang tidak diperlukan.
  • \n
\n

Membuat daftar dan tabel

\n
    \n
  • Gunakan daftar bernomor (ordered list) bila pengurutan penting dan daftar berpoin (bulleted list) bila pengurutan tidak relevan.
  • \n
  • Jaga agar item dalam daftar tetap paralel (berhubungan/lingkup topik yang sama).
  • \n
  • Mulailah item daftar bernomor dengan kata-kata penting.
  • \n
  • Perkenalkan daftar dan tabel dengan tepat.
  • \n
\n

Menyusun sebuah paragraf

\n
    \n
  • Buat kalimat pembuka yang bagus yang menetapkan titik sentral paragraf.
  • \n
  • Fokuskan setiap paragraf pada satu topik.
  • \n
  • Jangan membuat paragraf terlalu panjang atau terlalu pendek.
  • \n
  • Usahakan sebuah paragraf menjawab pertanyaan apa, mengapa dan bagaimana.
  • \n
\n

Audiens

\n
    \n
  • Tentukan apa yang perlu dipelajari audiens Anda.
  • \n
  • Sesuaikan dokumentasi dengan audiens Anda.
  • \n
\n

Menyusun dokumen

\n
    \n
  • Nyatakan cakupan dokumen Anda.
  • \n
  • Nyatakan audiens dokumen Anda.
  • \n
  • Tetapkan poin-poin penting dokumen Anda di awal dokumen.
  • \n
  • Tulislah dokumen untuk memenuhi kebutuhan audiens Anda.
  • \n
","frontmatter":{"title":"Kursus Menulis Teknis Google - Bagian Satu","date":"February 25, 2024"}}},"pageContext":{"slug":"/2024/02/kursus-menulis-teknis-google-bagian-satu/","previous":{"fields":{"slug":"/2024/02/ajari-diri-anda-pemrograman-dalam-sepuluh-tahun/"},"frontmatter":{"title":"Ajari Diri Anda Pemrograman dalam Sepuluh Tahun"}},"next":{"fields":{"slug":"/2024/03/kursus-menulis-teknis-google-bagian-satu/"},"frontmatter":{"title":"Kursus Menulis Teknis Google - Bagian Dua"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2024/02/mengenal-feature-integration-dan-regression-test/page-data.json b/page-data/2024/02/mengenal-feature-integration-dan-regression-test/page-data.json new file mode 100644 index 00000000..ddb10494 --- /dev/null +++ b/page-data/2024/02/mengenal-feature-integration-dan-regression-test/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2024/02/mengenal-feature-integration-dan-regression-test/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"916f65b3-8a5d-50df-b449-bdb8e908dee2","excerpt":"Pengembangan perangkat lunak adalah proses yang berkelanjutan. Para pengembang menambah fitur baru dan memperbaiki bug secara terus menerus. Dengan perubahan yang dilakukan terus menerus tersebut, kita perlu metode untuk memastikan perangkat lunak bekerja sesuai ekspektasi dan…","html":"

Pengembangan perangkat lunak adalah proses yang berkelanjutan. Para pengembang menambah fitur baru dan memperbaiki bug secara terus menerus. Dengan perubahan yang dilakukan terus menerus tersebut, kita perlu metode untuk memastikan perangkat lunak bekerja sesuai ekspektasi dan standar kualitas yang sudah ditetapkan. Di sinilah test atau pengujian perangkat lunak berperan.

\n

Ini adalah pembahasan singkat tentang tiga jenis pengujian penting dalam pengembangan perangkat lunak: Feature Test, Integration Test, dan Regression Test. Mari kita mulai dengan memahami apa itu masing-masing pengujian dan bagaimana mereka berperan dalam memastikan kualitas perangkat lunak.

\n

Feature Test (Pengujian Fitur)

\n

Pengujian fitur adalah jenis pengujian yang bertujuan untuk memeriksa apakah fitur atau fungsi yang baru dikembangkan berfungsi sebagaimana mestinya. Dalam pengujian ini, fokus utamanya adalah pada satu fitur atau fungsi spesifik.

\n

Contoh: Jika aplikasi kita memiliki fitur “buat postingan baru”, pengujian fitur akan memeriksa apakah pos tersebut dapat dibuat dengan benar, apakah gambar dapat diunggah dengan sukses, dan apakah pesan kesalahan muncul jika terjadi masalah.

\n

Integration Test (Pengujian Integrasi)

\n

Pengujian integrasi melibatkan pengujian interaksi antara komponen-komponen perangkat lunak yang berbeda untuk memastikan bahwa mereka bekerja secara bersamaan dengan baik. Tujuan utamanya adalah untuk menguji koneksi antara unit-unit yang berbeda dalam aplikasi.

\n

Contoh: Pengujian integrasi adalah memastikan bahwa sistem pembayaran terhubung dengan basis data pelanggan dengan benar, atau bahwa sistem otentikasi berinteraksi dengan antarmuka pengguna tanpa masalah.

\n

Regression Test (Pengujian Regresi)

\n

Pengujian regresi bertujuan untuk memastikan bahwa perubahan yang baru diterapkan dalam perangkat lunak tidak mengganggu fungsi yang sudah ada sebelumnya. Ini dilakukan dengan menguji kembali fitur-fitur yang telah diuji sebelumnya setelah ada perubahan dalam kode atau integrasi baru.

\n

Contoh: Jika kita telah menguji fitur pembayaran dalam versi sebelumnya, pengujian regresi akan memeriksa apakah fitur tersebut masih berfungsi setelah pembaruan atau perubahan lainnya.

\n

Dengan memahami ketiga jenis pengujian ini, tim pengembangan perangkat lunak dapat memastikan bahwa aplikasi yang dikembangkan memiliki kualitas yang tinggi dan bebas dari bug yang tidak diinginkan. Terlebih lagi, dengan mengimplementasikan pengujian-pengujian ini secara efektif, kita dapat meningkatkan kepercayaan pengguna terhadap produk kita.

","frontmatter":{"title":"Mengenal Feature Test, Integration Test, dan Regression Test","date":"February 12, 2024"}}},"pageContext":{"slug":"/2024/02/mengenal-feature-integration-dan-regression-test/","previous":{"fields":{"slug":"/2024/02/apa-itu-env-file/"},"frontmatter":{"title":"Apa Itu .env File?"}},"next":{"fields":{"slug":"/2024/02/ajari-diri-anda-pemrograman-dalam-sepuluh-tahun/"},"frontmatter":{"title":"Ajari Diri Anda Pemrograman dalam Sepuluh Tahun"}}}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/2024/03/kursus-menulis-teknis-google-bagian-satu/page-data.json b/page-data/2024/03/kursus-menulis-teknis-google-bagian-satu/page-data.json new file mode 100644 index 00000000..03774331 --- /dev/null +++ b/page-data/2024/03/kursus-menulis-teknis-google-bagian-satu/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-templates-blog-post-js","path":"/2024/03/kursus-menulis-teknis-google-bagian-satu/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","author":"mmdmthr","siteUrl":"https://www.devjurnal.com","comment":{"disqusShortName":"","utterances":"mmdmthr/devjurnal"},"sponsor":{"buyMeACoffeeId":""}}},"markdownRemark":{"id":"f3cd6333-e686-55ea-b591-6b84923ab886","excerpt":"Ini adalah ringkasan dari Kursus Menulis Teknis Google bagian dua. Mengedit mandiri Gunakan panduan gaya. Berpikirlah seperti audiens. Baca dokumen dengan suara keras (untuk diri sendiri). Kembali ke dokumen setelah menulis drafnya. Temukan editor rekan (peer) yang baik…","html":"

Ini adalah ringkasan dari Kursus Menulis Teknis Google bagian dua.

\n

Mengedit mandiri

\n
    \n
  • Gunakan panduan gaya.
  • \n
  • Berpikirlah seperti audiens.
  • \n
  • Baca dokumen dengan suara keras (untuk diri sendiri).
  • \n
  • Kembali ke dokumen setelah menulis drafnya.
  • \n
  • Temukan editor rekan (peer) yang baik.
  • \n
\n

Mengorganisasi dokumen berukuran besar

\n
    \n
  • Buat garis besar dokumen. Alternatifnya, tulis formulir bebas lalu atur.
  • \n
  • Perkenalkan ruang lingkup dokumen dan prasyarat apa pun.
  • \n
  • Lebih baik judul berbasis tugas.
  • \n
  • Mengungkapkan informasi secara progresif (dalam beberapa situasi).
  • \n
\n

Membuat ilustrasi

\n
    \n
  • Pertimbangkan untuk menulis keterangan sebelum membuat ilustrasi.
  • \n
  • Batasi jumlah informasi dalam satu gambar.
  • \n
  • Fokuskan perhatian pembaca pada bagian yang relevan dari sebuah gambar atau diagram dengan menjelaskan maksudnya dalam keterangan atau dengan menambahkan isyarat visual pada gambar.
  • \n
\n

Membuat contoh kode

\n
    \n
  • Buat contoh kode ringkas yang mudah dimengerti.
  • \n
  • Jaga agar komentar kode tetap singkat, tetapi tetap mengutamakan kejelasan daripada singkatnya.
  • \n
  • Hindari menulis komentar tentang kode yang jelas.
  • \n
  • Fokuskan energi komentar Anda pada hal-hal yang tidak intuitif dalam kode.
  • \n
  • Berikan tidak hanya contoh yang benar tetapi juga contoh yang salah.
  • \n
  • Berikan contoh kode yang menunjukkan berbagai kompleksitas.
  • \n
\n

Revisi

\n
    \n
  • Biasakan melakukan revisi terus menerus.
  • \n
  • Sediakan jenis dokumentasi yang berbeda untuk berbagai kategori pengguna.
  • \n
  • Bandingkan dan kontraskan dengan sesuatu yang sudah familiar bagi pembaca.
  • \n
  • Dalam tutorial, perkuat konsep dengan contoh.
  • \n
  • Dalam tutorial, perhatikan masalah yang mungkin dihadapi pembaca.
  • \n
","frontmatter":{"title":"Kursus Menulis Teknis Google - Bagian Dua","date":"March 02, 2024"}}},"pageContext":{"slug":"/2024/03/kursus-menulis-teknis-google-bagian-satu/","previous":{"fields":{"slug":"/2024/02/kursus-menulis-teknis-google-bagian-satu/"},"frontmatter":{"title":"Kursus Menulis Teknis Google - Bagian Satu"}},"next":null}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/404.html/page-data.json b/page-data/404.html/page-data.json new file mode 100644 index 00000000..66bd39b9 --- /dev/null +++ b/page-data/404.html/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-pages-404-js","path":"/404.html","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal"}}},"pageContext":{}},"staticQueryHashes":["3128451518"]} \ No newline at end of file diff --git a/page-data/404/page-data.json b/page-data/404/page-data.json new file mode 100644 index 00000000..960b64bd --- /dev/null +++ b/page-data/404/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-pages-404-js","path":"/404/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal"}}},"pageContext":{}},"staticQueryHashes":["3128451518"]} \ No newline at end of file diff --git a/page-data/about/page-data.json b/page-data/about/page-data.json new file mode 100644 index 00000000..2f03194d --- /dev/null +++ b/page-data/about/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-pages-about-js","path":"/about/","result":{"data":{"allMarkdownRemark":{"edges":[{"node":{"id":"76d3a302-9c17-5ae1-9f5d-4361102bd123","excerpt":"Muhammad Muthahhari Thank you for reading my resume. If you want to contact me, Please send me an email.","html":"

Muhammad Muthahhari

\n
\n

Thank you for reading my resume. If you want to contact me, Please send me an email.

\n
","frontmatter":{"title":"about","date":"January 27, 2019","lang":"en"}}}]}},"pageContext":{}},"staticQueryHashes":[]} \ No newline at end of file diff --git a/page-data/app-data.json b/page-data/app-data.json new file mode 100644 index 00000000..333c05ff --- /dev/null +++ b/page-data/app-data.json @@ -0,0 +1 @@ +{"webpackCompilationHash":"957181f6dc59241c0803"} diff --git a/page-data/index/page-data.json b/page-data/index/page-data.json new file mode 100644 index 00000000..62d70433 --- /dev/null +++ b/page-data/index/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---src-pages-index-js","path":"/","result":{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","configs":{"countOfInitialPost":10}}},"allMarkdownRemark":{"edges":[{"node":{"excerpt":"Ini adalah ringkasan dari Kursus Menulis Teknis Google bagian dua. Mengedit mandiri Gunakan panduan gaya. Berpikirlah seperti audiens. Baca dokumen dengan suara keras (untuk diri sendiri). Kembali ke…","fields":{"slug":"/2024/03/kursus-menulis-teknis-google-bagian-satu/"},"frontmatter":{"date":"March 02, 2024","title":"Kursus Menulis Teknis Google - Bagian Dua","category":"notes"}}},{"node":{"excerpt":"Ini adalah ringkasan dari Kursus Menulis Teknis Google bagian satu. Every engineer is also a writer. Memilih kata Definisikan istilah-istilah baru atau asing. Gunakan akronim dengan benar. Gunakan is…","fields":{"slug":"/2024/02/kursus-menulis-teknis-google-bagian-satu/"},"frontmatter":{"date":"February 25, 2024","title":"Kursus Menulis Teknis Google - Bagian Satu","category":"notes"}}},{"node":{"excerpt":"Satu artikel menarik ditulis oleh Peter Norvig tentang belajar pemrograman. Kita bisa membaca versi aslinya di sini Teach Yourself Programming in Ten Years dan versi bahasa Indonesia Belajar Programm…","fields":{"slug":"/2024/02/ajari-diri-anda-pemrograman-dalam-sepuluh-tahun/"},"frontmatter":{"date":"February 15, 2024","title":"Ajari Diri Anda Pemrograman dalam Sepuluh Tahun","category":"notes"}}},{"node":{"excerpt":"Pengembangan perangkat lunak adalah proses yang berkelanjutan. Para pengembang menambah fitur baru dan memperbaiki bug secara terus menerus. Dengan perubahan yang dilakukan terus menerus tersebut, ki…","fields":{"slug":"/2024/02/mengenal-feature-integration-dan-regression-test/"},"frontmatter":{"date":"February 12, 2024","title":"Mengenal Feature Test, Integration Test, dan Regression Test","category":"notes"}}},{"node":{"excerpt":"Dalam dunia pengembangan perangkat lunak, pengelolaan konfigurasi menjadi aspek penting dalam memastikan aplikasi berjalan dengan lancar di berbagai lingkungan. Salah satu alat yang telah merevolusi …","fields":{"slug":"/2024/02/apa-itu-env-file/"},"frontmatter":{"date":"February 08, 2024","title":"Apa Itu .env File?","category":"notes"}}},{"node":{"excerpt":"Sebuah artikel yang menarik membahas tentang “belajar” khususnya di dunia pengembang perangkat lunak. Banyak wawasan dari tulisan ini membatalkan mitos-mitos yang sering dipercayai tentang belajar. S…","fields":{"slug":"/2024/01/10-hal-yang-harus-dipelajari-oleh-programmer-tentang-belajar/"},"frontmatter":{"date":"January 22, 2024","title":"10 Hal yang Harus Dipelajari oleh Programmer tentang \"Belajar\"","category":"notes"}}},{"node":{"excerpt":"Docker Compose adalah alat untuk mendefinisikan dan menjalankan aplikasi Docker multi-kontainer (beberapa container yang saling terkait). Dengan Compose, kita menggunakan file YAML untuk mengonfigura…","fields":{"slug":"/2023/12/docker-compose/"},"frontmatter":{"date":"December 10, 2023","title":"Apa itu Docker Compose?","category":"notes"}}},{"node":{"excerpt":"Analisis kode statis adalah metode evaluasi program dengan memeriksa kode sebelum dieksekusi. Ini dilakukan dengan memeriksa set kode berdasarkan sejumlah aturan penulisan kode (type variable, return…","fields":{"slug":"/2023/11/laravel-static-code-analysis-dengan-phpstan/"},"frontmatter":{"date":"November 25, 2023","title":"Static Code Analysis dengan PHPStan","category":"php"}}},{"node":{"excerpt":"Ketika melakukan refleksi pada karir, seringkali kita merasa terjebak di suatu titik. Terjebak dalam sebuah peran, stagnasi gaji, atau mungkin merasa bosan dengan tugas yang kita kerjakan. Ada bebera…","fields":{"slug":"/2023/10/stuck-di-karir/"},"frontmatter":{"date":"October 07, 2023","title":"Stuck di Karir","category":"notes"}}},{"node":{"excerpt":"Apa itu Flame Graph? Sebelum kita masuk ke dalam cara membaca flame graph, mari kita pahami terlebih dahulu apa itu flame graph. Flame graph adalah representasi visual dari tumpukan pemanggilan (call…","fields":{"slug":"/2023/10/membaca-flame-graph/"},"frontmatter":{"date":"October 02, 2023","title":"Membaca Flame Graph","category":"notes"}}},{"node":{"excerpt":"Dalam pengembangan perangkat lunak, masalah N + 1 adalah salah satu masalah klasik yang sering dihadapi oleh pengembang aplikasi yang menggunakan database. Masalah ini muncul saat kita menggunakan Ob…","fields":{"slug":"/2023/09/masalah-n-1-orm/"},"frontmatter":{"date":"September 27, 2023","title":"Memahami Masalah N + 1 dalam ORM","category":"optimization"}}},{"node":{"excerpt":"Unit testing adalah salah satu praktik yang penting dalam pengembangan perangkat lunak yang membantu memastikan bahwa kode kita berfungsi dengan benar. Kita dapat menggunakan pendekatan Arrange, Act,…","fields":{"slug":"/2023/09/unit-testing-arrange-act-assert/"},"frontmatter":{"date":"September 20, 2023","title":"Unit Testing dengan Pendekatan Arrange, Act, dan Assert","category":"testing"}}},{"node":{"excerpt":"Kelebihan The Odin Project Gratis Sepenuhnya: The Odin Project benar-benar gratis untuk digunakan. Ini berarti siapa pun dapat memulai pembelajaran tanpa biaya pendaftaran atau langganan bulanan. Ini…","fields":{"slug":"/2023/09/review-the-odin-project/"},"frontmatter":{"date":"September 16, 2023","title":"Review Coding Bootcamp Online Gratis The Odin Project","category":"notes"}}},{"node":{"excerpt":"Kelebihan freeCodeCamp Benar-benar Gratis: Seperti namanya, freeCodeCamp adalah platform pembelajaran yang sepenuhnya gratis. Ini memungkinkan siapa pun, tanpa memandang latar belakang finansial, unt…","fields":{"slug":"/2023/09/review-freecodecamp/"},"frontmatter":{"date":"September 13, 2023","title":"Review Coding Bootcamp Online Gratis FreeCodeCamp","category":"notes"}}},{"node":{"excerpt":"Saat kita menggunakan framework Laravel, ORM Eloquent terlihat seperti mekanisme sederhana, semuanya begitu mudah dilakukan. Tetapi sebenarnya di balik layar, ada banyak fungsi semi-tersembunyi dan c…","fields":{"slug":"/2023/09/tips-laravel-eloquent/"},"frontmatter":{"date":"September 09, 2023","title":"Tips dan Trik Laravel Eloquent","category":"laravel"}}},{"node":{"excerpt":"Berikut adalah daftar beberapa bootcamp coding online gratis: freeCodeCamp: adalah salah satu bootcamp coding gratis yang paling terkenal. FreeCodeCamp menawarkan kurikulum komprehensif yang mencakup…","fields":{"slug":"/2023/09/coding-bootcamp-gratis/"},"frontmatter":{"date":"September 06, 2023","title":"Coding Bootcamp Online Gratis","category":"notes"}}},{"node":{"excerpt":"Keamanan merupakan aspek kritis dalam dunia pengembangan perangkat lunak. Programmer bertanggung jawab tidak hanya untuk menciptakan fitur yang canggih, tetapi juga untuk memastikan bahwa produk yang…","fields":{"slug":"/2023/09/meningkatkan-kesadaran-keamanan-programer/"},"frontmatter":{"date":"September 02, 2023","title":"Meningkatkan Kesadaran Keamanan Programer","category":"notes"}}},{"node":{"excerpt":"Pengembangan perangkat lunak yang aman merupakan aspek krusial dalam era di mana serangan siber semakin canggih dan beragam. Perangkat lunak yang kita kembangkan tidak hanya harus memenuhi persyarata…","fields":{"slug":"/2023/08/memahami-secure-development-lifecycle/"},"frontmatter":{"date":"August 30, 2023","title":"Memahami Secure Development Lifecycle (SDLC)","category":"notes"}}},{"node":{"excerpt":"Pengembangan perangkat lunak modern seringkali melibatkan penggunaan banyak paket (package) atau pustaka (library) dari sumber eksternal. Ketergantungan paket ini memungkinkan pengembang untuk memanf…","fields":{"slug":"/2023/08/menulis-versi-package-dependency/"},"frontmatter":{"date":"August 23, 2023","title":"Menulis Versi Package Dependency dalam Pengembangan Perangkat Lunak","category":"notes"}}},{"node":{"excerpt":"Dashlane adalah alat manajemen kata sandi (password manager) populer yang membantu kita menyimpan dan mengelola kata sandi dengan aman. Berikut adalah beberapa kelebihan dan kekurangan menggunakan Da…","fields":{"slug":"/2023/08/review-password-manager-dashlane/"},"frontmatter":{"date":"August 23, 2023","title":"Review Password Manager - Dashlane","category":"notes"}}},{"node":{"excerpt":"Sprint Retrospective adalah sebuah seremoni penting di akhir setiap iterasi (sprint) dalam pengembangan perangkat lunak dengan pendekatan Agile. Apa itu Sprint Retrospective, mengapa hal ini begitu p…","fields":{"slug":"/2023/08/perbaikan-berkelanjutan-dengan-sprint-retrospective/"},"frontmatter":{"date":"August 19, 2023","title":"Perbaikan Berkelanjutan dengan Sprint Retrospective","category":"notes"}}},{"node":{"excerpt":"Belajar keterampilan baru adalah kunci untuk tetap relevan dan berkembang dalam karier di dunia rekayasa perangkat lunak yang berkembang pesat. Bagaimana cara belajar lebih baik dan lebih cepat sebag…","fields":{"slug":"/2023/08/cara-belajar-lebih-baik-dan-lebih-cepat-sebagai-programmer/"},"frontmatter":{"date":"August 16, 2023","title":"Cara Belajar Lebih Baik dan Lebih Cepat sebagai Programmer","category":"notes"}}},{"node":{"excerpt":"Memulai perjalanan sebagai programmer adalah momen yang menyenangkan. Kita mempelajari hal-hal baru dan akhirnya melihat kode Kita dipublikasikan. Namun, seiring berjalannya waktu, Kita mungkin mulai…","fields":{"slug":"/2023/08/cara-programmer-junior-ke-senior/"},"frontmatter":{"date":"August 12, 2023","title":"Cara Programmer Junior menjadi Senior 1","category":"notes"}}},{"node":{"excerpt":"Setiap programmer berusaha sebaik mungkin untuk menulis kode yang baik dan bersih (clean) sejak awal. Tidak ada yang sengaja ingin menyusun kode yang kacau dan menyulitkan proyek. Namun, pada suatu t…","fields":{"slug":"/2023/08/technical-debt-hutang-yang-harus-dibayar/"},"frontmatter":{"date":"August 08, 2023","title":"Technical Debt, Hutang Teknis yang Harus Dibayar","category":"notes"}}},{"node":{"excerpt":"Dalam dunia pengembangan perangkat lunak, memastikan kinerja aplikasi yang optimal adalah kunci kesuksesan. Untuk mencapai hal tersebut, kita perlu memantau dan menganalisis kinerja aplikasi secara t…","fields":{"slug":"/2023/08/apa-itu-datadog-apm/"},"frontmatter":{"date":"August 05, 2023","title":"Mengoptimalkan Kinerja Aplikasi dengan DataDog APM","category":"notes"}}},{"node":{"excerpt":"Dalam kehidupan yang sibuk dan tuntutan pekerjaan yang tinggi, sering kali kita mengalami burnout atau kelelahan yang parah. Burnout dapat berdampak buruk pada kesehatan fisik dan mental kita. Dalam …","fields":{"slug":"/2023/08/memahami-dan-mengelola-burnout/"},"frontmatter":{"date":"August 02, 2023","title":"Memahami Burnout dan Cara Mengelolanya untuk Kesehatan Mental","category":"notes"}}},{"node":{"excerpt":"Dalam pengembangan perangkat lunak, sering kali kita memerlukan identifier unik yang dapat membedakan setiap entitas atau objek. Salah satu caranya adalah dengan menggunakan GUID (Globally Unique Ide…","fields":{"slug":"/2023/07/apa-itu-guid/"},"frontmatter":{"date":"July 29, 2023","title":"Memahami GUID (Globally Unique Identifier) dan Penggunaannya","category":"notes"}}},{"node":{"excerpt":"ChatGPT adalah alat berbasis kecerdasan buatan (Artifical Intelligence/AI) yang sedang merevolusi cara kerja pengembang perangkat lunak. Mari kita lihat bagaimana ChatGPT dapat meningkatkan efisiensi…","fields":{"slug":"/2023/07/meningkatkan-produktivitas-dengan-chatgpt/"},"frontmatter":{"date":"July 25, 2023","title":"Meningkatkan Produktivitas Pengembangan Perangkat Lunak dengan ChatGPT","category":"notes"}}},{"node":{"excerpt":"Dalam pengembangan perangkat lunak modern, API (Application Programming Interfaces) memainkan peran yang penting. Mereka bertindak sebagai jembatan, komponen inilah yang membuat perangkat lunak yang …","fields":{"slug":"/2023/07/pola-arsitektur-api-populer/"},"frontmatter":{"date":"July 22, 2023","title":"6 Pola Arsitektur API yang Populer Saat Ini","category":"notes"}}},{"node":{"excerpt":"TL;DR Contoh URL = protocol = domain name = port = path = query = parameters = fragments URL (Uniform Resource Locator) adalah alamat yang digunakan untuk mengidentifikasi dan mengakses sumb…","fields":{"slug":"/2023/07/struktur-dan-komponen-url/"},"frontmatter":{"date":"July 13, 2023","title":"Struktur URL: Memahami Komponen-Komponennya","category":"notes"}}},{"node":{"excerpt":"Teknik Feynman didasarkan pada pendekatan yang diambil oleh fisikawan terkenal, Richard Feynman, yang terkenal dengan kemampuannya dalam menjelaskan konsep-konsep yang kompleks secara sederhana dan j…","fields":{"slug":"/2023/07/belajar-dengan-metode-feynman/"},"frontmatter":{"date":"July 07, 2023","title":"Belajar Apapun dengan Metode Feynman","category":"notes"}}},{"node":{"excerpt":"Saya mencoba menginstall Jekyll untuk membuat blog static di GitHub pages. Karena itu saya membutuhkan Rubygems, package manager untuk bahasa pemrograman Ruby yang digunakan untuk pengembangan aplika…","fields":{"slug":"/2023/07/install-rubygems-error-this-file-is-owned-by-your-os/"},"frontmatter":{"date":"July 01, 2023","title":"Install Rubygems Error: This file is owned by your OS, not by rubygems upstream","category":"notes"}}},{"node":{"excerpt":"Continuous Integration (CI) dan Continuous Deployment (CD) adalah praktik penting dalam pengembangan perangkat lunak modern. CI/CD memungkinkan tim pengembang untuk secara otomatis menguji (test), me…","fields":{"slug":"/2023/06/membuat-ci-cd-dengan-github-action/"},"frontmatter":{"date":"June 23, 2023","title":"Panduan Membuat CI/CD dengan GitHub Action","category":"notes"}}},{"node":{"excerpt":"Dalam pengembangan perangkat lunak modern, otomatisasi dan pengaturan aliran kerja (workflow) yang efisien sangatlah penting. GitHub Action, yang disediakan oleh GitHub, adalah salah satu platform un…","fields":{"slug":"/2023/06/apa-itu-github-action/"},"frontmatter":{"date":"June 17, 2023","title":"Apa itu GitHub Action?","category":"notes"}}},{"node":{"excerpt":"Dalam dunia manajemen proyek, penggunaan perangkat lunak untuk membantu mengatur pekerjaan dan mengelola tugas menjadi hal yang sangat umum. Salah satu perangkat lunak yang populer digunakan dalam ma…","fields":{"slug":"/2023/06/tipe-tiket-jira/"},"frontmatter":{"date":"June 08, 2023","title":"Mengenal Tiket Jira: Epic, Story, Bug, Task, dan Subtask dalam Manajemen Proyek","category":"notes"}}},{"node":{"excerpt":"Blog yang sedang Anda baca ini dibuat dengan GatsbyJs dan dihosting di GitHub Pages. \nSebelumnya, deploy site dilakukan secara manual menggunakan perintah setiap saya menambahkan artikel baru. Auto …","fields":{"slug":"/2023/06/auto-build-deploy-gatsby-site-ke-github-page-dengan-github-action/"},"frontmatter":{"date":"June 03, 2023","title":"Auto Build dan Deploy Gatsby Site ke GitHub Page dengan GitHub Action","category":"notes"}}},{"node":{"excerpt":"Syslog adalah protokol standar yang digunakan untuk mengirim, mengumpulkan, dan mengelola pesan log pada sistem komputer. Pesan log ini berisi informasi penting tentang kejadian dan keadaan sistem ya…","fields":{"slug":"/2023/05/panduan-facility-dan-severity-dalam-syslog/"},"frontmatter":{"date":"May 27, 2023","title":"Mengenal RFC 5424 - Panduan untuk Facility dan Severity dalam Syslog","category":"notes"}}},{"node":{"excerpt":"Dalam pengembangan perangkat lunak, Given-When-Then merupakan sebuah formula atau template yang bertujuan untuk memandu penulisan acceptance test (pengujian penerimaan) terhadap User Story. Formula i…","fields":{"slug":"/2023/05/menulis-acceptance-test-dengan-given-when-then/"},"frontmatter":{"date":"May 20, 2023","title":"Menulis Acceptance Test dengan Formula Given-When-Then","category":"testing"}}},{"node":{"excerpt":"Sebuah tulisan singkat yang saya baca di linkedin, ditulis oleh mas Giovanni Sakti Nugraha - Software Engineering Manager & Leader, Consultant, Tech Content Creator | Livestreaming at insinyur.online…","fields":{"slug":"/2023/05/kompromi-dalam-pengembangan-perangkat-lunak/"},"frontmatter":{"date":"May 13, 2023","title":"Kompromi dalam Pengembangan Perangkat Lunak","category":"notes"}}},{"node":{"excerpt":"Langkah pertama dalam proses OAuth2 adalah mendapatkan otorisasi dari pengguna (authorization). Pada aplikasi berbasis browser (web misalnya) atau aplikasi native mobile (Android, iOS, dsb), hal ini …","fields":{"slug":"/2023/05/apa-itu-oauth2-part-2-aplikasi-web-server/"},"frontmatter":{"date":"May 06, 2023","title":"Apa Itu OAuth2 part 2 - Aplikasi Web Server","category":"notes"}}},{"node":{"excerpt":"OAuth 2.0 adalah protokol standar industri untuk otorisasi. OAuth 2.0 berfokus pada kesederhanaan pengembang aplikasi klien serta memberikan alur otorisasi khusus untuk aplikasi web, aplikasi desktop…","fields":{"slug":"/2023/04/apa-itu-oauth2-part-1/"},"frontmatter":{"date":"April 16, 2023","title":"Apa Itu OAuth2 part 1","category":"notes"}}},{"node":{"excerpt":"Aktivitas debugging terkadang bisa membuat kita frustrasi. Namun, dengan mindset yang tepat kita bisa melakukan debugging dengan lebih baik tanpa stres. Ingat selalu mengenai hal-hal ini dan ada bebe…","fields":{"slug":"/2023/04/tips-debugging/"},"frontmatter":{"date":"April 08, 2023","title":"Tips Debugging","category":"notes"}}},{"node":{"excerpt":"Sebelum membuat test case apa pun, kita perlu menentukan \nnilai input dari fungsi/metode tertentu yang perlu dites. \nTest case harus dirancang untuk mencakup semua kombinasi nilai masukan \ndan prasya…","fields":{"slug":"/2023/03/unit-test-klasifikasi/"},"frontmatter":{"date":"March 25, 2023","title":"Unit Test - Klasifikasi","category":"testing"}}},{"node":{"excerpt":"Saat menemukan masalah (teknis) dan merasa perlu bertanya lewat chat, email \natau forum, ada baiknya kita melakukan hal-hal ini dulu: 1. Cari kasus yang sama/mirip di arsip forum Seringkali masalah y…","fields":{"slug":"/2023/03/sebelum-bertanya/"},"frontmatter":{"date":"March 05, 2023","title":"Tips Sebelum Bertanya","category":"notes"}}},{"node":{"excerpt":"Tip 6. Hati-hati dengan Binding Model Route Bahasa Non-Inggris Terkadang, URL harus berisi kata-kata non-Inggris. Misalnya, \nkita memiliki portal berbahasa Indonesia untuk perpustakaan \ndan ingin mem…","fields":{"slug":"/2023/02/tips-laravel-routing-part-2/"},"frontmatter":{"date":"February 25, 2023","title":"Tips Routing Laravel - Bagian 2","category":"laravel"}}},{"node":{"excerpt":"Pada file routing seringkali digunakan sintaks \ndan yang sederhana. Namun, dalam proyek yang lebih besar, \nrouting biasanya akan menjadi lebih rumit. Ada beberapa cara yang dapat diterapkan \nuntuk …","fields":{"slug":"/2023/02/tips-laravel-routing-part-1/"},"frontmatter":{"date":"February 18, 2023","title":"Tips Routing Laravel - Bagian 1","category":"laravel"}}},{"node":{"excerpt":"Ventoy adalah tool open source untuk membuat live USB. \nKita dapat menggunakannya untuk membuat USB multi-boot, \nlive USB Linux yang persisten, dan USB Windows yang bootable. Langkah 1: Siapkan USB d…","fields":{"slug":"/2023/02/membuat-bootable-flashdisk-di-ubuntu-dengan-ventoy/"},"frontmatter":{"date":"February 05, 2023","title":"Membuat Bootable Flashdisk Windows di Ubuntu dengan Ventoy","category":"notes"}}},{"node":{"excerpt":"1. Mengambil Data dalam Jumlah Besar Opsi 1: Menggunakan chunk Jika aplikasi perlu memproses jumlah data yang besar, \nkita bisa melakukannya dengan (potongan). \nFungsi menjalankan query dalam poton…","fields":{"slug":"/2023/01/mengoptimalkan-query-database-laravel/"},"frontmatter":{"date":"January 28, 2023","title":"Mengoptimalkan Query Database di Laravel","category":"laravel"}}},{"node":{"excerpt":"Perintah dijalankan untuk membuat \nsymbolic link antara folder storage dengan folder public di web server. \nKita dapat menjalankan perintah tersebut \ndi shared hosting tanpa mengakses terminal. Cara…","fields":{"slug":"/2023/01/menjalankan-artisan-storage-link-shared-hosting/"},"frontmatter":{"date":"January 21, 2023","title":"Menjalankan Perintah PHP Artisan Storage Link di Shared Hosting","category":"laravel"}}},{"node":{"excerpt":"Laravel menyediakan helper untuk membuat route otentikasi Jika tidak ingin menggunakan semua auth routes, kita bisa memasukkan konfigurasinya sebagai parameter Referensi: https://sekolahkoding.com/fo…","fields":{"slug":"/2023/01/laravel-auth-routes/"},"frontmatter":{"date":"January 03, 2023","title":"Laravel Auth Routes","category":"laravel"}}},{"node":{"excerpt":"Michael Janda adalah seorang freelance designer yang sering membagikan wawasan dan tip seputar pekerjaan. Ada beberapa pelajaran yang menurut saya menarik dan inilah rangkumannya: Presentasikan solus…","fields":{"slug":"/2023/01/lessons-michael-janda/"},"frontmatter":{"date":"January 01, 2023","title":"Professional Lessons from Michael Janda","category":"notes"}}},{"node":{"excerpt":"Beberapa hal yang bisa kita lakukan untuk meningkatkan\nkeamanan website dengan Laravel Fitur Login/Otentikasi Terapkan role user dan akses dengan benar Terapkan penggunaan password yang kuat Tampilka…","fields":{"slug":"/2022/12/laravel-security/"},"frontmatter":{"date":"December 26, 2022","title":"Laravel Security","category":"laravel"}}},{"node":{"excerpt":"Berikut adalah cara menginstall VS Code di Ubuntu melalui apt package manager: 1. Update Repository Jalankan perintah berikut untuk melakukan update repository \ndan memastikan kita mendapat vscode ve…","fields":{"slug":"/2022/12/install-vscode-ubuntu/"},"frontmatter":{"date":"December 15, 2022","title":"Install VS Code di Ubuntu","category":"notes"}}},{"node":{"excerpt":"Untuk melakukan update snap store Jika aplikasi tersebut masih menjalankan proses, \nperintah tersebut akan mengembalikan nilai PID.\nKita harus menghentikan prosesnya Sumber: https://askubuntu.com/que…","fields":{"slug":"/2022/10/update-snap-store/"},"frontmatter":{"date":"October 15, 2022","title":"Update Snap Store","category":"notes"}}},{"node":{"excerpt":"Untuk menghentikan service MySQL supaya tidak otomatis dijalankan saat \nstart up, gunakan perintah berikut","fields":{"slug":"/2022/09/stop-mysql-startup/"},"frontmatter":{"date":"September 15, 2022","title":"Stop MySQL dari Start Up","category":"notes"}}},{"node":{"excerpt":"Mengatur Tombol Fn + F Keyboard Keychron di Linux menggunakan driver  (bahkan dalam mode Windows/Android), \nbaik dalam mode Bluetooth maupun Kabel. Secara default, driver ini menggunakan tombol F (F1…","fields":{"slug":"/2022/09/setting-keyboard-keychron-ubuntu/"},"frontmatter":{"date":"September 12, 2022","title":"Setting Keyboard Keychron K2 di Ubuntu","category":"notes"}}},{"node":{"excerpt":"Bagaimana Cara Melakukan Update Versi Go di Ubuntu 1. Uninstall Go Seperti yang tertulis pada halaman dokumentasi \nkita harus menghapus versi Go sebelumnya yang terinstall di komputer kita \npada fold…","fields":{"slug":"/2022/09/update-go-di-ubuntu/"},"frontmatter":{"date":"September 04, 2022","title":"Update Versi Go di Ubuntu","category":"notes"}}},{"node":{"excerpt":"Hukum Pertama Anda tidak boleh menulis kode sampai Anda telah menulis unit test yang gagal. Artinya kita harus menulis unit tes terlebih dahulu sebelum menulis kode. \nTentu saja hasil tesnya akan gag…","fields":{"slug":"/2022/08/hukum-test-driven-development/"},"frontmatter":{"date":"August 17, 2022","title":"Tiga Hukum Test Driven Development","category":"testing"}}},{"node":{"excerpt":"Dalam pekerjaan sehari-hari saya lebih suka berinteraksi dengan git melalui perintah di command line. \nPaling tidak untuk perintah yang sering digunakan seperti commit, push, atau checkout. Namun sem…","fields":{"slug":"/2022/08/menyingkat-perintah-git-dengan-alias/"},"frontmatter":{"date":"August 07, 2022","title":"Menyingkat Perintah Git dengan Alias","category":"git"}}},{"node":{"excerpt":"Kita dapat melakukan pencarian teks di Vim menggunakan (garis miring) \ndan (tanda tanya) di mode normal. Tanda garis miring untuk pencarian maju dan \nuntuk mencari mundur tekan , ketik pola pencar…","fields":{"slug":"/2022/08/search-di-vim/"},"frontmatter":{"date":"August 02, 2022","title":"Search di Vim","category":"notes"}}},{"node":{"excerpt":"Ketika membuat API, kita perlu menuliskan dokumen yang mendeskripsikan apa yang dilakukan API kita dan \nbagaimana API tersebut bekerja. Dokumen tersebut biasa disebut dengan API contract. \nAPI contra…","fields":{"slug":"/2022/07/contoh-api-contract/"},"frontmatter":{"date":"August 01, 2022","title":"Contoh API Contract","category":"notes"}}},{"node":{"excerpt":"Dalam buku Clean Code, Uncle Bob menjelaskan tentang lima aturan Clean Tests \nyang membentuk akronim FIRST: Fast (Cepat) Tes harus cepat. Mereka harus dapat dijalankan dengan cepat. Saat pengujian be…","fields":{"slug":"/2022/08/first-rule-dalam-testing/"},"frontmatter":{"date":"August 01, 2022","title":"Aturan FIRST dalam Clean Test","category":"testing"}}},{"node":{"excerpt":"Saat kita menggunakan nilai non-boolean dalam konteks boolean, misalnya untuk kondisi pada pernyataan . \nPHP mengevaluasi nilai tersebut menjadi nilai boolean. Nilai-nilai berikut dievaluasi menjadi …","fields":{"slug":"/2022/07/php-truthy-falsy-value/"},"frontmatter":{"date":"July 24, 2022","title":"PHP Truthy dan Falsy Value","category":"php"}}},{"node":{"excerpt":"Sebaik apapun pemahaman kita tentang suatu masalah atau sebuah situasi, ketika kita mendiskusikannya dengan orang lain, kita harus menyesuaikan kata-kata kita sehingga mereka dapat dengan cepat memah…","fields":{"slug":"/2022/07/cara-berkomunikasi-dalam-tim/"},"frontmatter":{"date":"July 15, 2022","title":"Cara Berkomunikasi dalam Tim","category":"notes"}}},{"node":{"excerpt":"TL;DR membatalkan commit sebelumnya dengan cara menulis ulang riwayat commit (commit history). Sementara bekerja dengan cara membuat commit baru untuk membatalkan perubahan yang dibuat oleh commit …","fields":{"slug":"/2022/06/perbedaan-git-reset-dan-git-revert/"},"frontmatter":{"date":"June 26, 2022","title":"Perbedaan Git Reset dan Git Revert","category":"git"}}},{"node":{"excerpt":"Memahami Tiga Bagian dari Proyek Git Proyek Git memiliki tiga bagian utama berikut: Direktori git Direktori kerja (working directory/working tree/repositori) Area staging Direktori Git Direktori Git …","fields":{"slug":"/2022/03/alur-kerja-menggunakan-git/"},"frontmatter":{"date":"May 16, 2022","title":"Alur Kerja Menggunakan Git","category":"git"}}},{"node":{"excerpt":"Dconf-editor memungkinkan kita untuk mengubah hampir setiap aspek lingkungan desktop GNOME. Namun kita harus berhati-hati dalam mengedit. Sebagian besar pengaturan dapat diubah dengan cepat, tanpa me…","fields":{"slug":"/2022/05/dconf-editor/"},"frontmatter":{"date":"May 05, 2022","title":"Dconf Editor","category":"how to"}}},{"node":{"excerpt":"Kita mungkin pernah mengalami harus mengetik email yang sama berulang kali, dalam kasus saya mengirim email cuti. Di Gmail kita dapat menulis email satu kali, lalu menyimpan email tersebut sebagai te…","fields":{"slug":"/2022/04/membuat-template-email-di-gmail/"},"frontmatter":{"date":"April 14, 2022","title":"Membuat Template Email di Gmail","category":"productivity"}}},{"node":{"excerpt":"Ada kalanya kita perlu melakukan debuging pada query eloquent, \nmungkin saat menemukan query model yang kita buat tidak menampilkan data sesuai ekspektasi. \nKita bisa melihat query apa yang dibuat sa…","fields":{"slug":"/2022/02/melihat-raw-query-database-eloquent-laravel/"},"frontmatter":{"date":"February 25, 2022","title":"Melihat Raw Query Database Eloquent Laravel","category":"laravel"}}},{"node":{"excerpt":"Bayangkan situasi ini, kita memiliki dua akun git. Satu akun untuk repo perusahaan tempat kita bekerja \ndan satunya lagi akun git pribadi. Kita akan memerlukan dua profil yang berbeda untuk mengakses…","fields":{"slug":"/2022/01/menggunakan-dua-profil-git/"},"frontmatter":{"date":"January 18, 2022","title":"Menggunakan Dua Profil Git","category":"git"}}},{"node":{"excerpt":"Selain working area, staging dan repository, \nGit memiliki area yang disebut stash di mana kita dapat menyimpan \nsementara perubahan yang kita buat tanpa melakukan commit ke repository. Ini berguna …","fields":{"slug":"/2021/11/menggunakan-git-stash/"},"frontmatter":{"date":"November 18, 2021","title":"Menggunakan Git Stash","category":"git"}}},{"node":{"excerpt":"Perintah untuk menghapus branch git Kita tidak dapat menghapus branch yang sedang aktif, untuk itu\nkita harus melakukan ke branch yang sedang tidak akan kita hapus.\nmisalnya . Perintah untuk menghap…","fields":{"slug":"/2021/10/menghapus-git-branch-local-dan-remote/"},"frontmatter":{"date":"October 18, 2021","title":"Menghapus Git Branch Local dan Remote","category":"git"}}},{"node":{"excerpt":"Laravel menyediakan API email yang sederhana menggunakan library SwiftMailer. \nLayanan email pada Laravel dapat dikonfigurasi melalui file . \nSalah satu penyedia layanan mailer yang tersedia adalah M…","fields":{"slug":"/2021/09/mengirim-email-menggunakan-mailgun-laravel/"},"frontmatter":{"date":"September 18, 2021","title":"Mengirim Email Menggunakan Mailgun pada Laravel","category":"laravel"}}},{"node":{"excerpt":"Mengarungi industri teknologi, khususnya di bidang \npengembangan perangkat lunak, membutuhkan keterampilan \npemrograman atau menulis kode. Semakin besar skala sebuah aplikasi perangkat lunak maka kod…","fields":{"slug":"/2021/08/5-singkatan-prinsip-pemrograman/"},"frontmatter":{"date":"August 28, 2021","title":"5 Singkatan Prinsip Pemrograman","category":"notes"}}},{"node":{"excerpt":"Python Tutor membantu orang-orang melewati hambatan dalam belajar pemrograman yaitu: \nmemahami apa yang terjadi ketika komputer menjalankan sebuah kode. \nSeringkali sulit untuk membayangkan bagaimana…","fields":{"slug":"/2021/08/melihat-eksekusi-kode/"},"frontmatter":{"date":"August 16, 2021","title":"Melihat Eksekusi Kode, Langkah demi Langkah","category":"notes"}}},{"node":{"excerpt":"Membaca adalah cara tercepat untuk menyerap informasi. Salah satu website yang \nmenyediakan buku pemrograman gratis adalah goalkicker.com. \nBuku yang diterbitkan di situs tersebut adalah seri buku no…","fields":{"slug":"/2021/08/buku-pemrograman-gratis-catatan-untuk-profesional/"},"frontmatter":{"date":"August 14, 2021","title":"Buku Pemrograman Gratis - Seri Catatan untuk Profesional","category":"notes"}}},{"node":{"excerpt":"Ada tiga macam tipe akses yang dapat diterapkan untuk property (variabel pada class/object) dan method (function pada class/object) pada PHP. Masing-masing tipe memberikan level akses yang berbeda te…","fields":{"slug":"/2021/08/public-private-protected-properties-and-method/"},"frontmatter":{"date":"August 08, 2021","title":"Property dan Method Public, Private, Protected","category":"php"}}},{"node":{"excerpt":"Class Route pada Laravel menyediakan method yang sederhana \nuntuk mendefinisikan route dan fungsi-fungsinya tanpa file konfigurasi\nyang rumit. Route yang paling dasar menerima parameter URI dan sebua…","fields":{"slug":"/2021/07/laravel-routing/"},"frontmatter":{"date":"July 26, 2021","title":"Laravel Routing","category":"laravel"}}},{"node":{"excerpt":"Normalisasi database adalah proses menata tabel, kolom dan relasi antar tabel \nuntuk menghindari redundansi data dan mencapai integritas data. \nSecara sederhana prinsip yang harus dipegang adalah Hin…","fields":{"slug":"/2021/07/normalisasi-database/"},"frontmatter":{"date":"July 25, 2021","title":"Normalisasi Database","category":"database"}}},{"node":{"excerpt":"Sampai tahun 2015 JavaScript menggunakan untuk mendeklarasikan variabel.\nSejak ES6 muncul dan digunakan untuk mendeklarasikan variabel. \nApa perbedaan keduanya? Kita bisa lihat dari karakteristik …","fields":{"slug":"/2021/07/perbedaan-const-dan-let/"},"frontmatter":{"date":"July 24, 2021","title":"Perbedaan const dan let","category":"javascript"}}},{"node":{"excerpt":"Salah satu tipe data primitif dalam dalam JavaScript adalah boolean, \nyaitu tipe data logis yang memiliki nilai true atau false.\nJavaScript memiliki sifat type coercion atau konversi nilai secara oto…","fields":{"slug":"/2021/07/javascript-truthy-dan-falsy/"},"frontmatter":{"date":"July 22, 2021","title":"JavaScript Truthy dan Falsy","category":"javascript"}}},{"node":{"excerpt":"Via Composer Jika di komputer sudah terinstall PHP dan Composer, kita dapat membuat proyek Laravel baru \ndengan menggunakan Composer secara langsung. Setelah aplikasi dibuat, kita bisa menjalankan s…","fields":{"slug":"/2021/07/install-laravel/"},"frontmatter":{"date":"July 10, 2021","title":"Cara Install Laravel","category":"laravel"}}},{"node":{"excerpt":"Dimulai dari proyek sampingan saat bekerja di Google, \nhingga saat ini sering disandingkan dengan raksasa JavaScript \nseperti React dan Angular. Dengan bantuan Sarah Drasner, Taylor Otwell, Thorsten …","fields":{"slug":"/2021/07/film-dokumenter-vuejs/"},"frontmatter":{"date":"July 10, 2021","title":"Film Dokumenter Sejarah Vue JS","category":"notes"}}},{"node":{"excerpt":"Elon Musk adalah tokoh bisnis, penemu dan seorang industrialis kondang. Dia mendirikan dan memimpin beberapa perusahaan teknologi sejak usia sangat muda. Dimulai dari PayPal, Tesla, SpaceX dll. Saat …","fields":{"slug":"/2021/03/visi-elon-musk/"},"frontmatter":{"date":"March 13, 2021","title":"Visi Elon Musk","category":"notes"}}},{"node":{"excerpt":"Banyak tools pengembangan website yang bisa membuat website JAMStack dengan mudah. Di sisi front end kita bisa menggunakan static site generator (SSG) untuk membuat halaman statis secara pre render. …","fields":{"slug":"/2021/03/membuat-website-jamstack/"},"frontmatter":{"date":"March 06, 2021","title":"Membuat Website JAMStack","category":"how to"}}},{"node":{"excerpt":"Selepas menyerahkan kepemimpinan perusahaan kepada penerusnya, Bill Gates fokus pada upaya mengatasi masalah masyarakat terutama di negara-negara berkembang melalui yayasannya. Film dokumenter Netfli…","fields":{"slug":"/2021/02/film-dokumenter-bill-gates/"},"frontmatter":{"date":"February 26, 2021","title":"Film Dokumenter Bill Gates","category":"notes"}}},{"node":{"excerpt":"NPM (Node Package Manager) adalah pengelola paket default untuk runtime JavaScript Node.js. NPM dibuat pada tahun 2009 sebagai proyek open source untuk membantu pengembang JavaScript berbagi paket mo…","fields":{"slug":"/2021/02/npm-adalah/"},"frontmatter":{"date":"February 20, 2021","title":"NPM Adalah","category":"notes"}}},{"node":{"excerpt":"Di sisi pengguna, kita bisa menginstall paket-paket yang tersedia gratis di npm registry dengan menjalankan CLI. Jadi ada baiknya mengetahui cara menggunakan alat yang powerfull ini. npm install - ad…","fields":{"slug":"/2021/02/cara-menggunakan-npm/"},"frontmatter":{"date":"February 17, 2021","title":"Cara Menggunakan NPM","category":"how to"}}},{"node":{"excerpt":"JAMstack adalah arsitektur software yang disusun dari 3 komponen: Javascript, API, dan Markup. Arsitektur JAMStack dirancang untuk membuat website lebih cepat, lebih aman, dan lebih mudah untuk diska…","fields":{"slug":"/2021/02/jamstack-adalah/"},"frontmatter":{"date":"February 16, 2021","title":"JAMStack Adalah","category":"notes"}}},{"node":{"excerpt":"Sintaks Dasar Element Sintaks Heading # h1 ## h2 ### h3 Bold ***bold text*** Italic *italic text* Blockquote > blockquote Ordered List 1. First item 2. Second item 3. Third item Unoredered List -…","fields":{"slug":"/2021/02/markdown-cheatseet/"},"frontmatter":{"date":"February 13, 2021","title":"Markdown Cheatseet","category":"notes"}}},{"node":{"excerpt":"Ada beberapa pemformatan yang dibutuhkan oleh penulis lanjutan. Itu juga bisa membantu dalam menulis artikel blog. Berikut sintaks Markdown yang biasa digunakan dalam penulisan yang lebih advance Gar…","fields":{"slug":"/2021/02/cara-menggunakan-markdown-lanjutan/"},"frontmatter":{"date":"February 09, 2021","title":"Cara Menggunakan Markdown Lanjutan","category":"how to"}}},{"node":{"excerpt":"Markdown dirancang dengan tujuan mudah dibaca oleh manusia. Sebagian besar sintaksnya sederhana dan intuitif sehingga mudah dipelajari. Berikut beberapa sintaks yang mungkin sering anda gunakan dalam…","fields":{"slug":"/2021/02/cara-menggunakan-markdown-dasar/"},"frontmatter":{"date":"February 07, 2021","title":"Cara Menggunakan Markdown Dasar","category":"how to"}}},{"node":{"excerpt":"Markdown adalah bahasa markup ringan untuk memformat plain teks menggunakan editor teks biasa yang kemudian diubah menjadi HTML terstruktur. Jadi, kita bisa membuat format teks bold atau membuat list…","fields":{"slug":"/2021/01/markdown-adalah/"},"frontmatter":{"date":"January 30, 2021","title":"Markdown adalah","category":"notes"}}},{"node":{"excerpt":"Untuk memulai jadi programmer, ada beberapa hal yang perlu kita cari tahu sebelumnya Apa yang mau kita buat? Aplikasi desktop, mobile atau website? Hal itu menentukan bahasa pemrograman apa yang haru…","fields":{"slug":"/2020/07/cara-memulai-jadi-programmer/"},"frontmatter":{"date":"July 15, 2020","title":"Memulai Jadi Programmer","category":"how to"}}},{"node":{"excerpt":"Saat kita membeli barang elektronik, pabrik menyertakan sebuah manual book sebagai petunjuk penggunaan bagi user. Hal tersebut juga berlaku untuk produk di dunia IT. Untuk bisa menggunakan sebuah pro…","fields":{"slug":"/2020/07/pustaka-dokumentasi-lengkap/"},"frontmatter":{"date":"July 15, 2020","title":"Pustaka Dokumentasi Lengkap","category":"notes"}}},{"node":{"excerpt":"Sebagai seorang web developer, kita bisa melihat peta jalan di situs roadmap.sh untuk memberikan gambaran yang lebih jelas dalam melangkah di belantara hutan pemrograman web. Peta jalan ini tentu buk…","fields":{"slug":"/2020/07/peta-jalan-web-developer/"},"frontmatter":{"date":"July 15, 2020","title":"Peta Jalan Web Developer","category":"notes"}}}]}},"pageContext":{}},"staticQueryHashes":["2486386679","3128451518"]} \ No newline at end of file diff --git a/page-data/offline-plugin-app-shell-fallback/page-data.json b/page-data/offline-plugin-app-shell-fallback/page-data.json new file mode 100644 index 00000000..417eb34b --- /dev/null +++ b/page-data/offline-plugin-app-shell-fallback/page-data.json @@ -0,0 +1 @@ +{"componentChunkName":"component---node-modules-gatsby-plugin-offline-app-shell-js","path":"/offline-plugin-app-shell-fallback/","result":{"pageContext":{}},"staticQueryHashes":[]} \ No newline at end of file diff --git a/page-data/sq/d/2486386679.json b/page-data/sq/d/2486386679.json new file mode 100644 index 00000000..61a656af --- /dev/null +++ b/page-data/sq/d/2486386679.json @@ -0,0 +1 @@ +{"data":{"avatar":{"childImageSharp":{"fixed":{"base64":"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAACNiR0NAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFKUlEQVQ4y0WU+U9UVxTHp0nbpDF20SrrAK1Gq3VLI4soi0DTKLEu2AYx4IrgwMzgDItLBSyCoAwgqKwDzICgyL5Ni7sR2ZQBhKpVqok1MaVp2r/g0zNP0/5w8vJucj/38z33vKeK9PEkxteFPWtciAtwI9bnE84ciefx+DC/PRzkjq2VVM0evvL6lNjdUUw/HOLJaD8vHo3RZc5Hs8aJpBAvEgLdORjgjirK15Pdfm7sXeNGfKCaAz5zyU3ez8unk1yqKUXtPI8P3n+X+XM/YtZ775Cmj+PVEzsvHo/TW1OAdq0zhlDPN0Ap1Q5fL/b5i9k6dzRBHgKcQ17yXp5N2Yn+NogY/9nkRS/BtGsx2o1qXOfOoqW+gpmXz+g2m9Cum09ymAfaIHcFqory8yJ2rdgFqEkM9lQiFx6J5WafjcQNC+k/sYrhvFD6MoJoTVlJwJLZ/JCi45/Xz+mpLkAX4PwfUBukRrVTgAfWuUp+Ndr1nophQdo+7t68SuaO5ZTtX8KVtGDOxfuTG72IuLD5lBfk8PeraWwSWa8AZW+QG4kOw2j/BUp2R1ydNDfedy6nU/YyfL2DqkRvDnz9GaY9y9BvXkp8+GKObvOgJD2Wmekx+mpN6CWyMdRNgC5oAl1QxaxdINndFKBegBq/OeSnimFHLY0Ji7GbQrmR4U3rYT9u535DVqQn6XHh/PlslKuWfDGchzHEFa3ANGKr2iXARIdusAPoSaL/p+RqI5meGKY1cwt1CV9yLGIFieHLKNy3DFOcNyM/X2bmqf0tUC5FMXT+H6gLdkMn/TOEeskYzCNHs13GZgqb+STHtqgxRa8mM9KbhA2ulKbHMPPrA15NDXC9TnoY6AC6KsCEQAHGBCwkab27QNXSXC/lxBzNNp5PPeDJ0DVSI/2ICfmcnWFfELL8Q5pK0/nj8RC/C/BGXSGHAp2khy4CdBKgkwDXCTDEDf16DwwhHmh8ZpMVGy5fxAj3O6toNq5gT4gz4T7uJG1y51KRntePhvhrepQ7l86RHOxKSpgICdABVe0SQ2OoGp1cTPrmFZRoNtFkSqW/uZy79QX0VyRxrWg3DSciKU7diuHQQUrOnefGT5301BZJZCcMwU7og10E6vzWUBbL9FsZvHSWB53VjHZVMyZ2kz01jPc2MNhZz53mGmyNVRSVnOfoj6fJyMmn4lwRNVk6MiNWyYDLNy22ymCfjFjJSEsp9o4q7O3lTHabmeqtZrzLjF1qTMATvVYmbRbGu6vpayyjw1pKX0MZt1otVBZkow9dILZi+P1qD1qyY7kvc3ersVQMa2VjHQ+lRjvNiu14bx3jPVYmemr5xfam7jZX0W4po9VaTl5hCYadG+XP87FEDlpKvzWXm3JqS3kBg20WxnobpRqw99Qpdb/TokAnbVblsAl5DomApaqc+upKjuaYMBqSiJORU2m3BTFwuQSbRCjJzqC78oxYWgV0kZGuOgbba3nQ5Xi3yiEOWL1YWxhqr8FcUUFOfhHGE6dJOZ5NQtgiVBnx3zEs/WurucDprCyazqYz2l6pgO61WxjssDAihvcF7gA7arjDsV5L0alMog4kYDhZQMqJM+g2+6AqTNsvl1FJ3flCUlKP0VycLuNyhmsNpfS3CrStRgEPdzri1yvwe2219FqKSTHq2LY3gUNZhaSdKkYXEYCqszxb9K1cNpdz5PgpeipPYW8p4frFC9y+YuZmUyUD7Y6+XmTcdpGBDiu3m800S2u0RiPb45IxZJ/lcN4FDsnF/AvGCdCyf4WLxQAAAABJRU5ErkJggg==","width":72,"height":72,"src":"/static/8d8388e6cd46f549f44b924da1517e26/e5b88/profile.png","srcSet":"/static/8d8388e6cd46f549f44b924da1517e26/e5b88/profile.png 1x,\n/static/8d8388e6cd46f549f44b924da1517e26/e7bd6/profile.png 1.5x,\n/static/8d8388e6cd46f549f44b924da1517e26/a12fc/profile.png 2x"}}},"site":{"siteMetadata":{"author":"mmdmthr","introduction":"My notes in public space","social":{"twitter":"mmdmthr","github":"mmdmthr","medium":"@mmdmthr","facebook":"mmdmthr","linkedin":"mmdmthr","instagram":"devjurnal"}}}}} \ No newline at end of file diff --git a/page-data/sq/d/3128451518.json b/page-data/sq/d/3128451518.json new file mode 100644 index 00000000..8b1b6840 --- /dev/null +++ b/page-data/sq/d/3128451518.json @@ -0,0 +1 @@ +{"data":{"site":{"siteMetadata":{"title":"Dev Jurnal","description":"Blog posted about web developer","author":"mmdmthr"}}}} \ No newline at end of file diff --git a/polyfill-da26d3b44af2cdb21dfe.js b/polyfill-da26d3b44af2cdb21dfe.js new file mode 100644 index 00000000..af3ed5b3 --- /dev/null +++ b/polyfill-da26d3b44af2cdb21dfe.js @@ -0,0 +1,2 @@ +(window.webpackJsonp=window.webpackJsonp||[]).push([[12],{VXT5:function(t,e,r){(function(t){!function(){var e="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:void 0!==t?t:"undefined"!=typeof self?self:{};function r(t,e,r){return t(r={path:e,exports:{},require:function(t,e){return function(){throw new Error("Dynamic requires are not currently supported by @rollup/plugin-commonjs")}()}},r.exports),r.exports}var n=function(t){return t&&t.Math==Math&&t},o=n("object"==typeof globalThis&&globalThis)||n("object"==typeof window&&window)||n("object"==typeof self&&self)||n("object"==typeof e&&e)||function(){return this}()||Function("return this")(),i=function(t){try{return!!t()}catch(t){return!0}},a=!i((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]})),u={}.propertyIsEnumerable,c=Object.getOwnPropertyDescriptor,s={f:c&&!u.call({1:2},1)?function(t){var e=c(this,t);return!!e&&e.enumerable}:u},f=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}},l={}.toString,h=function(t){return l.call(t).slice(8,-1)},p="".split,d=i((function(){return!Object("z").propertyIsEnumerable(0)}))?function(t){return"String"==h(t)?p.call(t,""):Object(t)}:Object,v=function(t){if(null==t)throw TypeError("Can't call method on "+t);return t},g=function(t){return d(v(t))},y=function(t){return"object"==typeof t?null!==t:"function"==typeof t},m=function(t,e){if(!y(t))return t;var r,n;if(e&&"function"==typeof(r=t.toString)&&!y(n=r.call(t)))return n;if("function"==typeof(r=t.valueOf)&&!y(n=r.call(t)))return n;if(!e&&"function"==typeof(r=t.toString)&&!y(n=r.call(t)))return n;throw TypeError("Can't convert object to primitive value")},b={}.hasOwnProperty,S=function(t,e){return b.call(t,e)},E=o.document,w=y(E)&&y(E.createElement),R=function(t){return w?E.createElement(t):{}},T=!a&&!i((function(){return 7!=Object.defineProperty(R("div"),"a",{get:function(){return 7}}).a})),O=Object.getOwnPropertyDescriptor,x={f:a?O:function(t,e){if(t=g(t),e=m(e,!0),T)try{return O(t,e)}catch(t){}if(S(t,e))return f(!s.f.call(t,e),t[e])}},A=function(t){if(!y(t))throw TypeError(String(t)+" is not an object");return t},I=Object.defineProperty,_={f:a?I:function(t,e,r){if(A(t),e=m(e,!0),A(r),T)try{return I(t,e,r)}catch(t){}if("get"in r||"set"in r)throw TypeError("Accessors not supported");return"value"in r&&(t[e]=r.value),t}},j=a?function(t,e,r){return _.f(t,e,f(1,r))}:function(t,e,r){return t[e]=r,t},P=function(t,e){try{j(o,t,e)}catch(n){o[t]=e}return e},N=o["__core-js_shared__"]||P("__core-js_shared__",{}),M=Function.toString;"function"!=typeof N.inspectSource&&(N.inspectSource=function(t){return M.call(t)});var U,k,L,D=N.inspectSource,C=o.WeakMap,F="function"==typeof C&&/native code/.test(D(C)),B=r((function(t){(t.exports=function(t,e){return N[t]||(N[t]=void 0!==e?e:{})})("versions",[]).push({version:"3.8.1",mode:"global",copyright:"© 2020 Denis Pushkarev (zloirock.ru)"})})),W=0,z=Math.random(),G=function(t){return"Symbol("+String(void 0===t?"":t)+")_"+(++W+z).toString(36)},K=B("keys"),V=function(t){return K[t]||(K[t]=G(t))},$={};if(F){var q=N.state||(N.state=new(0,o.WeakMap)),H=q.get,X=q.has,Y=q.set;U=function(t,e){return e.facade=t,Y.call(q,t,e),e},k=function(t){return H.call(q,t)||{}},L=function(t){return X.call(q,t)}}else{var J=V("state");$[J]=!0,U=function(t,e){return e.facade=t,j(t,J,e),e},k=function(t){return S(t,J)?t[J]:{}},L=function(t){return S(t,J)}}var Q,Z={set:U,get:k,has:L,enforce:function(t){return L(t)?k(t):U(t,{})},getterFor:function(t){return function(e){var r;if(!y(e)||(r=k(e)).type!==t)throw TypeError("Incompatible receiver, "+t+" required");return r}}},tt=r((function(t){var e=Z.get,r=Z.enforce,n=String(String).split("String");(t.exports=function(t,e,i,a){var u,c=!!a&&!!a.unsafe,s=!!a&&!!a.enumerable,f=!!a&&!!a.noTargetGet;"function"==typeof i&&("string"!=typeof e||S(i,"name")||j(i,"name",e),(u=r(i)).source||(u.source=n.join("string"==typeof e?e:""))),t!==o?(c?!f&&t[e]&&(s=!0):delete t[e],s?t[e]=i:j(t,e,i)):s?t[e]=i:P(e,i)})(Function.prototype,"toString",(function(){return"function"==typeof this&&e(this).source||D(this)}))})),et=o,rt=function(t){return"function"==typeof t?t:void 0},nt=function(t,e){return arguments.length<2?rt(et[t])||rt(o[t]):et[t]&&et[t][e]||o[t]&&o[t][e]},ot=Math.ceil,it=Math.floor,at=function(t){return isNaN(t=+t)?0:(t>0?it:ot)(t)},ut=Math.min,ct=function(t){return t>0?ut(at(t),9007199254740991):0},st=Math.max,ft=Math.min,lt=function(t,e){var r=at(t);return r<0?st(r+e,0):ft(r,e)},ht=function(t){return function(e,r,n){var o,i=g(e),a=ct(i.length),u=lt(n,a);if(t&&r!=r){for(;a>u;)if((o=i[u++])!=o)return!0}else for(;a>u;u++)if((t||u in i)&&i[u]===r)return t||u||0;return!t&&-1}},pt={includes:ht(!0),indexOf:ht(!1)},dt=pt.indexOf,vt=function(t,e){var r,n=g(t),o=0,i=[];for(r in n)!S($,r)&&S(n,r)&&i.push(r);for(;e.length>o;)S(n,r=e[o++])&&(~dt(i,r)||i.push(r));return i},gt=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"],yt=gt.concat("length","prototype"),mt={f:Object.getOwnPropertyNames||function(t){return vt(t,yt)}},bt={f:Object.getOwnPropertySymbols},St=nt("Reflect","ownKeys")||function(t){var e=mt.f(A(t)),r=bt.f;return r?e.concat(r(t)):e},Et=function(t,e){for(var r=St(e),n=_.f,o=x.f,i=0;i2?arguments[2]:void 0,u=Nt((void 0===a?n:lt(a,n))-i,n-o),c=1;for(i0;)i in r?r[o]=r[i]:delete r[o],o+=c,i+=c;return r},Ut=!!Object.getOwnPropertySymbols&&!i((function(){return!String(Symbol())})),kt=Ut&&!Symbol.sham&&"symbol"==typeof Symbol.iterator,Lt=B("wks"),Dt=o.Symbol,Ct=kt?Dt:Dt&&Dt.withoutSetter||G,Ft=function(t){return S(Lt,t)||(Lt[t]=Ut&&S(Dt,t)?Dt[t]:Ct("Symbol."+t)),Lt[t]},Bt=Object.keys||function(t){return vt(t,gt)},Wt=a?Object.defineProperties:function(t,e){A(t);for(var r,n=Bt(e),o=n.length,i=0;o>i;)_.f(t,r=n[i++],e[r]);return t},zt=nt("document","documentElement"),Gt=V("IE_PROTO"),Kt=function(){},Vt=function(t){return"