{"version":3,"sources":["jsdelivr-header.js","/npm/react-resize-tools@1.0.18/node_modules/lodash.debounce/index.js","/npm/react-resize-tools@1.0.18/src/useScreenSize.ts","/npm/react-resize-tools@1.0.18/src/useScroll.ts","/npm/react-resize-tools@1.0.18/src/useScreenWidthType.ts"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA,6PCII,gBAAkB,sBAGlB,IAAM,IAGN,UAAY,kBAGZ,OAAS,aAGT,WAAa,qBAGb,WAAa,aAGb,UAAY,cAGZ,aAAe,SAGf,WAA8B,iBAAV,gBAAsB,gBAAU,eAAO,SAAW,QAAU,eAGhF,SAA0B,iBAAR,MAAoB,MAAQ,KAAK,SAAW,QAAU,KAGxE,KAAO,YAAc,UAAY,SAAS,cAAT,GAGjC,YAAc,OAAO,UAOrB,eAAiB,YAAY,SAG7B,UAAY,KAAK,IACjB,UAAY,KAAK,IAkBjB,IAAM,WACR,OAAO,KAAK,KAAK,KACnB,EAwDA,SAAS,SAAS,EAAM,EAAM,GAC5B,IAAI,EACA,EACA,EACA,EACA,EACA,EACA,EAAiB,EACjB,GAAU,EACV,GAAS,EACT,GAAW,EAEf,GAAmB,mBAAR,EACT,MAAM,IAAI,UAAU,iBAUtB,SAAS,EAAW,GAClB,IAAI,EAAO,EACP,EAAU,EAKd,OAHA,EAAW,OAAW,EACtB,EAAiB,EACjB,EAAS,EAAK,MAAM,EAAS,EAEjC,CAmBE,SAAS,EAAa,GACpB,IAAI,EAAoB,EAAO,EAM/B,YAAyB,IAAjB,GAA+B,GAAqB,GACzD,EAAoB,GAAO,GANJ,EAAO,GAM8B,CACnE,CAEE,SAAS,IACP,IAAI,EAAO,MACX,GAAI,EAAa,GACf,OAAO,EAAa,GAGtB,EAAU,WAAW,EAzBvB,SAAuB,GACrB,IAEI,EAAS,GAFW,EAAO,GAI/B,OAAO,EAAS,UAAU,EAAQ,GAHR,EAAO,IAGkC,CACvE,CAmBuC,CAAc,GACrD,CAEE,SAAS,EAAa,GAKpB,OAJA,OAAU,EAIN,GAAY,EACP,EAAW,IAEpB,EAAW,OAAW,EACf,EACX,CAcE,SAAS,IACP,IAAI,EAAO,MACP,EAAa,EAAa,GAM9B,GAJA,EAAW,UACX,EAAW,KACX,EAAe,EAEX,EAAY,CACd,QAAgB,IAAZ,EACF,OAvEN,SAAqB,GAMnB,OAJA,EAAiB,EAEjB,EAAU,WAAW,EAAc,GAE5B,EAAU,EAAW,GAAQ,CACxC,CAgEe,CAAY,GAErB,GAAI,EAGF,OADA,EAAU,WAAW,EAAc,GAC5B,EAAW,EAE1B,CAII,YAHgB,IAAZ,IACF,EAAU,WAAW,EAAc,IAE9B,CACX,CAGE,OAxGA,EAAO,SAAS,IAAS,EACrB,SAAS,KACX,IAAY,EAAQ,QAEpB,GADA,EAAS,YAAa,GACH,UAAU,SAAS,EAAQ,UAAY,EAAG,GAAQ,EACrE,EAAW,aAAc,IAAY,EAAQ,SAAW,GAiG1D,EAAU,OAnCV,gBACkB,IAAZ,GACF,aAAa,GAEf,EAAiB,EACjB,EAAW,EAAe,EAAW,OAAU,CACnD,EA8BE,EAAU,MA5BV,WACE,YAAmB,IAAZ,EAAwB,EAAS,EAAa,MACzD,EA2BS,CACT,CA2BA,SAAS,SAAS,GAChB,IAAI,SAAc,EAClB,QAAS,IAAkB,UAAR,GAA4B,YAAR,EACzC,CA0BA,SAAS,aAAa,GACpB,QAAS,GAAyB,iBAAT,CAC3B,CAmBA,SAAS,SAAS,GAChB,MAAuB,iBAAT,GACX,aAAa,IAAU,eAAe,KAAK,IAAU,SAC1D,CAyBA,SAAS,SAAS,GAChB,GAAoB,iBAAT,EACT,OAAO,EAET,GAAI,SAAS,GACX,OAAO,IAET,GAAI,SAAS,GAAQ,CACnB,IAAI,EAAgC,mBAAjB,EAAM,QAAwB,EAAM,UAAY,EACnE,EAAQ,SAAS,GAAU,EAAQ,GAAM,CAC7C,CACE,GAAoB,iBAAT,EACT,OAAiB,IAAV,EAAc,GAAS,EAEhC,EAAQ,EAAM,QAAQ,OAAQ,IAC9B,IAAI,EAAW,WAAW,KAAK,GAC/B,OAAQ,GAAY,UAAU,KAAK,GAC/B,aAAa,EAAM,MAAM,GAAI,EAAW,EAAI,GAC3C,WAAW,KAAK,GAAS,KAAO,CACvC,CAEA,IAAA,gBAAiB,SC9WX,cAAgB,SAAC,GACf,IAAA,EAA8B,eAAqB,CACvD,WAAY,EACZ,YAAa,EACb,WAAY,EACZ,YAAa,IAJR,EAAU,EAAA,GAAE,EAAa,EAAA,GAO1B,EAAmB,kBACvB,iBAAS,WACP,EAAc,CACZ,WAAY,OAAO,WACnB,YAAa,OAAO,YACpB,WAAY,OAAO,WACnB,YAAa,OAAO,a,GAErB,GAAQ,GACX,IAWF,OARA,iBAAU,WAKR,OAJA,IAEA,OAAO,iBAAiB,SAAU,GAE3B,WAAM,OAAA,OAAO,oBAAoB,SAAU,EAArC,C,GACZ,IAEI,CACT,ECpCM,UAAY,SAAC,GACX,IAAA,EAA8B,eAAS,CAC3C,YAAa,IADR,EAAU,EAAA,GAAE,EAAa,EAAA,GAI1B,EAAe,kBACnB,iBAAS,WACP,EAAc,CACZ,YAAa,OAAO,a,GAErB,GAAQ,GACX,IAWF,OARA,iBAAU,WAKR,OAJA,IAEA,OAAO,iBAAiB,SAAU,GAE3B,WAAM,OAAA,OAAO,oBAAoB,SAAU,EAArC,C,GACZ,IAEI,CACT,ECdM,kBAAoB,SAAC,GAAE,IAAA,EAAE,EAAA,GAAE,EAAE,EAAA,GAAE,EAAE,EAAA,GAAE,EAAE,EAAA,GAAE,EAAG,EAAA,IACxC,EAAQ,OAAO,WACjB,EAAuB,KAQ3B,OANI,GAAM,GAAS,IAAI,EAAY,MAC/B,GAAM,GAAS,IAAI,EAAY,MAC/B,GAAM,GAAS,IAAI,EAAY,MAC/B,GAAM,GAAS,IAAI,EAAY,MAC/B,GAAO,GAAS,IAAK,EAAY,OAE9B,CACT,EAEM,mBAAqB,SACzB,G,IAAA,OAA8C,IAAA,EAAA,CAC5C,GAAI,IACJ,GAAI,IACJ,GAAI,KACJ,GAAI,KACJ,IAAK,MACN,EANC,EAAE,EAAA,GAAE,EAAE,EAAA,GAAE,EAAE,EAAA,GAAE,EAAE,EAAA,GAAE,EAAG,EAAA,IAQf,EAAwC,eAC5C,kBAAkB,CAAE,GAAE,EAAE,GAAE,EAAE,GAAE,EAAE,GAAE,EAAE,IAAG,KADlC,EAAe,EAAA,GAAE,EAAkB,EAAA,GAIpC,EAAS,WACb,EAAmB,kBAAkB,CAAE,GAAE,EAAE,GAAE,EAAE,GAAE,EAAE,GAAE,EAAE,IAAG,IAC5D,EAUA,OARA,iBAAU,WAKR,OAJA,IAEA,OAAO,iBAAiB,SAAU,GAE3B,WAAM,OAAA,OAAO,oBAAoB,SAAU,EAArC,C,GACZ,IAEI,CACT,E","file":"/npm/react-resize-tools@1.0.18/lib/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/react-resize-tools@1.0.18/lib/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","/**\n * lodash (Custom Build) <https://lodash.com/>\n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors <https://jquery.org/>\n * Released under MIT license <https://lodash.com/license>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/** Used to match leading and trailing whitespace. */\nvar reTrim = /^\\s+|\\s+$/g;\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/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\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\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 objectToString = objectProto.toString;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n    nativeMin = Math.min;\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n *   console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n  return root.Date.now();\n};\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n *  Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n *  The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n *  Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n *   'leading': true,\n *   'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n  var lastArgs,\n      lastThis,\n      maxWait,\n      result,\n      timerId,\n      lastCallTime,\n      lastInvokeTime = 0,\n      leading = false,\n      maxing = false,\n      trailing = true;\n\n  if (typeof func != 'function') {\n    throw new TypeError(FUNC_ERROR_TEXT);\n  }\n  wait = toNumber(wait) || 0;\n  if (isObject(options)) {\n    leading = !!options.leading;\n    maxing = 'maxWait' in options;\n    maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n    trailing = 'trailing' in options ? !!options.trailing : trailing;\n  }\n\n  function invokeFunc(time) {\n    var args = lastArgs,\n        thisArg = lastThis;\n\n    lastArgs = lastThis = undefined;\n    lastInvokeTime = time;\n    result = func.apply(thisArg, args);\n    return result;\n  }\n\n  function leadingEdge(time) {\n    // Reset any `maxWait` timer.\n    lastInvokeTime = time;\n    // Start the timer for the trailing edge.\n    timerId = setTimeout(timerExpired, wait);\n    // Invoke the leading edge.\n    return leading ? invokeFunc(time) : result;\n  }\n\n  function remainingWait(time) {\n    var timeSinceLastCall = time - lastCallTime,\n        timeSinceLastInvoke = time - lastInvokeTime,\n        result = wait - timeSinceLastCall;\n\n    return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;\n  }\n\n  function shouldInvoke(time) {\n    var timeSinceLastCall = time - lastCallTime,\n        timeSinceLastInvoke = time - lastInvokeTime;\n\n    // Either this is the first call, activity has stopped and we're at the\n    // trailing edge, the system time has gone backwards and we're treating\n    // it as the trailing edge, or we've hit the `maxWait` limit.\n    return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n      (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n  }\n\n  function timerExpired() {\n    var time = now();\n    if (shouldInvoke(time)) {\n      return trailingEdge(time);\n    }\n    // Restart the timer.\n    timerId = setTimeout(timerExpired, remainingWait(time));\n  }\n\n  function trailingEdge(time) {\n    timerId = undefined;\n\n    // Only invoke if we have `lastArgs` which means `func` has been\n    // debounced at least once.\n    if (trailing && lastArgs) {\n      return invokeFunc(time);\n    }\n    lastArgs = lastThis = undefined;\n    return result;\n  }\n\n  function cancel() {\n    if (timerId !== undefined) {\n      clearTimeout(timerId);\n    }\n    lastInvokeTime = 0;\n    lastArgs = lastCallTime = lastThis = timerId = undefined;\n  }\n\n  function flush() {\n    return timerId === undefined ? result : trailingEdge(now());\n  }\n\n  function debounced() {\n    var time = now(),\n        isInvoking = shouldInvoke(time);\n\n    lastArgs = arguments;\n    lastThis = this;\n    lastCallTime = time;\n\n    if (isInvoking) {\n      if (timerId === undefined) {\n        return leadingEdge(lastCallTime);\n      }\n      if (maxing) {\n        // Handle invocations in a tight loop.\n        timerId = setTimeout(timerExpired, wait);\n        return invokeFunc(lastCallTime);\n      }\n    }\n    if (timerId === undefined) {\n      timerId = setTimeout(timerExpired, wait);\n    }\n    return result;\n  }\n  debounced.cancel = cancel;\n  debounced.flush = flush;\n  return debounced;\n}\n\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 && (type == 'object' || type == 'function');\n}\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 * @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 && typeof value == 'object';\n}\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) && objectToString.call(value) == symbolTag);\n}\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 = value.replace(reTrim, '');\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 = debounce;\n","import { useState, useEffect, useCallback } from \"react\";\r\nimport debounce from \"lodash.debounce\";\r\n\r\nexport type ScreenSize = {\r\n  innerWidth: number;\r\n  innerHeight: number;\r\n  outerWidth: number;\r\n  outerHeight: number;\r\n};\r\n\r\nconst useScreenSize = (wait?: number) => {\r\n  const [screenSize, setScreenSize] = useState<ScreenSize>({\r\n    innerWidth: 0,\r\n    innerHeight: 0,\r\n    outerWidth: 0,\r\n    outerHeight: 0,\r\n  });\r\n\r\n  const updateScreenSize = useCallback(\r\n    debounce(() => {\r\n      setScreenSize({\r\n        innerWidth: window.innerWidth,\r\n        innerHeight: window.innerHeight,\r\n        outerWidth: window.outerWidth,\r\n        outerHeight: window.outerHeight,\r\n      });\r\n    }, wait || 0),\r\n    []\r\n  );\r\n\r\n  useEffect(() => {\r\n    updateScreenSize();\r\n\r\n    window.addEventListener(\"resize\", updateScreenSize);\r\n\r\n    return () => window.removeEventListener(\"resize\", updateScreenSize);\r\n  }, []);\r\n\r\n  return screenSize;\r\n};\r\n\r\nexport default useScreenSize;\r\n","import debounce from \"lodash.debounce\";\r\nimport { useState, useEffect, useCallback } from \"react\";\r\n\r\nconst useScroll = (wait?: number) => {\r\n  const [screenSize, setScreenSize] = useState({\r\n    outerHeight: 0,\r\n  });\r\n\r\n  const updateScroll = useCallback(\r\n    debounce(() => {\r\n      setScreenSize({\r\n        outerHeight: window.outerHeight,\r\n      });\r\n    }, wait || 0),\r\n    []\r\n  );\r\n\r\n  useEffect(() => {\r\n    updateScroll();\r\n\r\n    window.addEventListener(\"scroll\", updateScroll);\r\n\r\n    return () => window.removeEventListener(\"scroll\", updateScroll);\r\n  }, []);\r\n\r\n  return screenSize;\r\n};\r\n\r\nexport default useScroll;\r\n","import { useState, useEffect } from \"react\";\r\n\r\nexport type UseScreenWidthType = {\r\n  sm?: number;\r\n  md?: number;\r\n  lg?: number;\r\n  xl?: number;\r\n  xxl?: number;\r\n};\r\n\r\nexport type WidthType = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"xxl\" | null;\r\n\r\nconst updateScreenWidth = ({ sm, md, lg, xl, xxl }: UseScreenWidthType) => {\r\n  const width = window.innerWidth;\r\n  let widthType: WidthType = \"xs\";\r\n\r\n  if (sm && width >= sm) widthType = \"sm\";\r\n  if (md && width >= md) widthType = \"md\";\r\n  if (lg && width >= lg) widthType = \"lg\";\r\n  if (xl && width >= xl) widthType = \"xl\";\r\n  if (xxl && width >= xxl) widthType = \"xxl\";\r\n\r\n  return widthType;\r\n};\r\n\r\nconst useScreenWidthType = (\r\n  { sm, md, lg, xl, xxl }: UseScreenWidthType = {\r\n    sm: 640,\r\n    md: 768,\r\n    lg: 1024,\r\n    xl: 1280,\r\n    xxl: 1400,\r\n  }\r\n): WidthType => {\r\n  const [screenWidthType, setScreenWidthType] = useState<WidthType | null>(\r\n    updateScreenWidth({ sm, md, lg, xl, xxl })\r\n  );\r\n\r\n  const update = () => {\r\n    setScreenWidthType(updateScreenWidth({ sm, md, lg, xl, xxl }));\r\n  };\r\n\r\n  useEffect(() => {\r\n    update();\r\n\r\n    window.addEventListener(\"resize\", update);\r\n\r\n    return () => window.removeEventListener(\"resize\", update);\r\n  }, []);\r\n\r\n  return screenWidthType;\r\n};\r\n\r\nexport default useScreenWidthType;\r\n"]}