He not busy being born is busy dying (2022)

Liven 评论 说来有点可笑 4 2019-03-17 09:16:11

这篇书评可能有关键情节透露

《说来有点可笑》It's kind of a funny story, 是来自内德.维齐尼(Ned Vizzini)的小说作品,讲述了一个16岁的男孩格雷格因为抑郁症而对整个世界绝望,甚至想自杀,而后阴差阳错的入住了一家医院,并在病房里认识了一群可爱的朋友,更爱上了叫诺埃尔的姑娘,只是在医院短短5天的生活,让他明白了该如何面对生活,爱情以及成长的压力。

内德.维齐尼是美国著名青年作家,15岁就开始为纽约出版社写稿,也许正是因为这样的经历,他可以从青少年的视觉很好的去阐释当代青年所面临的困惑和成长的烦恼,扑面而来的各方压力,很多时候都会令人忍不住想逃。想起前几天刚看的新闻,美国自行车选手,里约奥运会自行车女子团体追逐赛银牌获得者凯利·卡特琳8日自杀身亡,年仅23岁。她为什么自杀,当代青年人都在面临着什么 ? 我们很难做一个唯一的评定。只是处于世界观人生观价值观正在发展奠基的青少年是如何看待这个世界的呢? 或者我们都可以试着走进这本书,走进格雷格的世界去一探究竟。内德诙谐的笔调,真实,亲密,有趣,却又同时充满讽刺意味,让本书变成一本可读性很强的作品。

作者全程都是以格雷格的视角去展示周边的事物, 我在哪儿? 通过展示他跟家人的日常对话,他无法正常饮食以及跟心理医生的多次对话,让我们开始对格雷格不一样的看待生活和世界的视觉觉得好奇,又有那么一些无可奈何。老实说,在前面这部分,我其实看的很煎熬,因为无法想象生活竟然会艰难到如此的程度,这对于一个青少年来说无疑是一个不小的挑战,他为了备考高中,很用心的做了各种准备,而好友亚纶轻易的就考上了。我如何到了那里? 他跟好友亚纶一起举办party, 看电影,学着喝酒,他很喜欢妮娅,可是妮娅却跟亚纶谈恋爱了,他蜷缩在自己的壳里,一点点差点把自己淹没。

扑通。

我想要自己的心脏,我的大脑还在运转。

(Video) "If you're not busy being born, you're busy dying." *FREE AUDIO*

我想活下去,但又想死去,到底该怎么办?

正是因为这样的纠结,在去布鲁克林大桥跳下去之前,他从书架上取下了《如何在失爱中存活》这本书,跟随里面的指示,拨打了自杀热线,并因此开始了在北边六号医院的旅程。在这里,他看到了不一样的人们,不一样的世界,每个人都有或多或少的缺陷和疾病,他不再担心被别人笑话,而只需要安静的做自己。也正是因为如此,他开始接受大家的鼓励,花很多时间去画画,继续画他的城市地图,那些被大家成为脑图的地图,竟然得到那么多人的欣赏。最幸福的是,他认识了那么美丽可爱的诺埃尔,他不再充满疑虑,而是终于开始感觉到自己的能量,感觉的自己正在看到一个更好的未来,迎面着越来越好的生活。

说到这里你也许已经感觉到这个故事也许并不是真的可笑,而是用诙谐嘲讽的笔调像我们展示了一个抑郁症患者面临的世界。希望所有的心理疾病患者都能通过治疗,从思维的黑暗里走出来,去旅行,飞翔,游泳,相爱,跳舞,获胜,微笑,牵手,走路,跳跃,打篮球,滑雪,慢跑,快跑……快跑回家,它们都是属于你的,当你选择了它们,它们便属于你,美妙的世界也将属于你。所以,从现在开始,认真的活着,活着,认真的去体验这个美妙的世界!

(Video) Bob Dylan - It's Alright, Ma (I'm Only Bleeding) - With Lyrics

© 本文版权归作者 Liven 所有,任何形式转载请联系作者。

(Video) Bob Dylan - It's Alright, Ma (I'm Only Bleeding) (Official Audio)

","

(Video) He Not Busy Being Born is Busy Dying

","

","

"].join("");$("body").delegate("a.create-review, .top-tab .btn","click",function(a){a.preventDefault();var e=$(this),o=e;if(e.hasClass("cls_abnormal")&&window._USER_ABNORMAL)return void(show_abnormal&&show_abnormal());e.attr("href")||(o=e.find("a"));var n=$("div.popup-container"),t=o.attr("data-isverify"),r=o.attr("data-verify-url");t&&"false"!=t.toLowerCase()?location.href=o.attr("href"):(n.size()<1&&($("body").append(i),n=$("div.popup-container")),n.find(".btn").attr("href",r),n.removeClass("hide"))}).on("click","div.popup-container .close",function(){$("div.popup-container").addClass("hide")})}(),$("body").delegate(".review-footer-action-remove a","click",function(i){if(i.preventDefault(),window._USER_ABNORMAL)return void(window.show_abnormal&&window.show_abnormal());if(confirm("真的就删了吗?")){var a=$(this).data(),e=$('

').appendTo("body");e[0].submit()}})}();; !function(e){function n(r){if(t[r])return t[r].exports;var o=t[r]={exports:{},id:r,loaded:!1};return e[r].call(o.exports,o,o.exports,n),o.loaded=!0,o.exports}var t={};return n.m=e,n.c=t,n.p="",n(0)}(function(e){for(var n in e)if(Object.prototype.hasOwnProperty.call(e,n))switch(typeof e[n]){case"function":break;case"object":e[n]=function(n){var t=n.slice(1),r=e[n[0]];return function(e,n,o){r.apply(this,[e,n,o].concat(t))}}(e[n]);break;default:e[n]=e[e[n]]}return e}([function(module,exports,__webpack_require__){eval("'use strict';\n\nvar _vote = __webpack_require__(70);\n\nvar _vote2 = _interopRequireDefault(_vote);\n\nvar _comment = __webpack_require__(68);\n\nvar _comment2 = _interopRequireDefault(_comment);\n\nvar _ad_insert = __webpack_require__(71);\n\nvar _ad_insert2 = _interopRequireDefault(_ad_insert);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n(function () {\n var adInsert = new _ad_insert2.default();\n if (document.readyState !== 'loading') {\n (0, _vote2.default)(document);\n window.reviewObj && (0, _comment2.default)(document);\n } else if (document.addEventListener) {\n document.addEventListener('DOMContentLoaded', function () {\n (0, _vote2.default)(document);\n window.reviewObj && (0, _comment2.default)(document);\n $('.comment-item').each(function (index, ele) {\n // 长评回复 4 位展示信息流广告\n if (index === 2) {\n $(ele).after(adInsert.html());\n }\n });\n }, false);\n } else {\n window.attachEvent('onreadystatechange', function () {\n if (document.readyState !== 'loading') {\n (0, _vote2.default)(document);\n window.reviewObj && (0, _comment2.default)(document);\n }\n });\n }\n window.onload = function () {\n adInsert.getAd();\n };\n})(); /* global reviewObj */\n\n// index page js\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/js/review.js\n// module id = 0\n// module chunks = 0\n//# sourceURL=webpack:///./src/js/review.js?")},function(module,exports){eval("'use strict';\n\nfunction unwrapExports (x) {\n\treturn x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;\n}\n\nfunction createCommonjsModule(fn, module) {\n\treturn module = { exports: {} }, fn(module, module.exports), module.exports;\n}\n\nvar _global = createCommonjsModule(function (module) {\n// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar global = module.exports = typeof window != 'undefined' && window.Math == Math\n ? window : typeof self != 'undefined' && self.Math == Math ? self\n // eslint-disable-next-line no-new-func\n : Function('return this')();\nif (typeof __g == 'number') __g = global; // eslint-disable-line no-undef\n});\n\nvar _core = createCommonjsModule(function (module) {\nvar core = module.exports = { version: '2.6.8' };\nif (typeof __e == 'number') __e = core; // eslint-disable-line no-undef\n});\nvar _core_1 = _core.version;\n\nvar _aFunction = function (it) {\n if (typeof it != 'function') throw TypeError(it + ' is not a function!');\n return it;\n};\n\n// optional / simple context binding\n\nvar _ctx = function (fn, that, length) {\n _aFunction(fn);\n if (that === undefined) return fn;\n switch (length) {\n case 1: return function (a) {\n return fn.call(that, a);\n };\n case 2: return function (a, b) {\n return fn.call(that, a, b);\n };\n case 3: return function (a, b, c) {\n return fn.call(that, a, b, c);\n };\n }\n return function (/* ...args */) {\n return fn.apply(that, arguments);\n };\n};\n\nvar _isObject = function (it) {\n return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n\nvar _anObject = function (it) {\n if (!_isObject(it)) throw TypeError(it + ' is not an object!');\n return it;\n};\n\nvar _fails = function (exec) {\n try {\n return !!exec();\n } catch (e) {\n return true;\n }\n};\n\n// Thank's IE8 for his funny defineProperty\nvar _descriptors = !_fails(function () {\n return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;\n});\n\nvar document$1 = _global.document;\n// typeof document.createElement is 'object' in old IE\nvar is = _isObject(document$1) && _isObject(document$1.createElement);\nvar _domCreate = function (it) {\n return is ? document$1.createElement(it) : {};\n};\n\nvar _ie8DomDefine = !_descriptors && !_fails(function () {\n return Object.defineProperty(_domCreate('div'), 'a', { get: function () { return 7; } }).a != 7;\n});\n\n// 7.1.1 ToPrimitive(input [, PreferredType])\n\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nvar _toPrimitive = function (it, S) {\n if (!_isObject(it)) return it;\n var fn, val;\n if (S && typeof (fn = it.toString) == 'function' && !_isObject(val = fn.call(it))) return val;\n if (typeof (fn = it.valueOf) == 'function' && !_isObject(val = fn.call(it))) return val;\n if (!S && typeof (fn = it.toString) == 'function' && !_isObject(val = fn.call(it))) return val;\n throw TypeError(\"Can't convert object to primitive value\");\n};\n\nvar dP = Object.defineProperty;\n\nvar f = _descriptors ? Object.defineProperty : function defineProperty(O, P, Attributes) {\n _anObject(O);\n P = _toPrimitive(P, true);\n _anObject(Attributes);\n if (_ie8DomDefine) try {\n return dP(O, P, Attributes);\n } catch (e) { /* 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\nvar _objectDp = {\n\tf: f\n};\n\nvar _propertyDesc = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n};\n\nvar _hide = _descriptors ? function (object, key, value) {\n return _objectDp.f(object, key, _propertyDesc(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n\nvar hasOwnProperty = {}.hasOwnProperty;\nvar _has = function (it, key) {\n return hasOwnProperty.call(it, key);\n};\n\nvar PROTOTYPE = 'prototype';\n\nvar $export = function (type, name, source) {\n var IS_FORCED = type & $export.F;\n var IS_GLOBAL = type & $export.G;\n var IS_STATIC = type & $export.S;\n var IS_PROTO = type & $export.P;\n var IS_BIND = type & $export.B;\n var IS_WRAP = type & $export.W;\n var exports = IS_GLOBAL ? _core : _core[name] || (_core[name] = {});\n var expProto = exports[PROTOTYPE];\n var target = IS_GLOBAL ? _global : IS_STATIC ? _global[name] : (_global[name] || {})[PROTOTYPE];\n var key, own, out;\n if (IS_GLOBAL) source = name;\n for (key in source) {\n // contains in native\n own = !IS_FORCED && target && target[key] !== undefined;\n if (own && _has(exports, key)) continue;\n // export native or passed\n out = own ? target[key] : source[key];\n // prevent global pollution for namespaces\n exports[key] = IS_GLOBAL && typeof target[key] != 'function' ? source[key]\n // bind timers to global for call from export context\n : IS_BIND && own ? _ctx(out, _global)\n // wrap global constructors for prevent change them in library\n : IS_WRAP && target[key] == out ? (function (C) {\n var F = function (a, b, c) {\n if (this instanceof C) {\n switch (arguments.length) {\n case 0: return new C();\n case 1: return new C(a);\n case 2: return new C(a, b);\n } return new C(a, b, c);\n } return C.apply(this, arguments);\n };\n F[PROTOTYPE] = C[PROTOTYPE];\n return F;\n // make static versions for prototype methods\n })(out) : IS_PROTO && typeof out == 'function' ? _ctx(Function.call, out) : out;\n // export proto methods to core.%CONSTRUCTOR%.methods.%NAME%\n if (IS_PROTO) {\n (exports.virtual || (exports.virtual = {}))[key] = out;\n // export proto methods to core.%CONSTRUCTOR%.prototype.%NAME%\n if (type & $export.R && expProto && !expProto[key]) _hide(expProto, key, out);\n }\n }\n};\n// type bitmap\n$export.F = 1; // forced\n$export.G = 2; // global\n$export.S = 4; // static\n$export.P = 8; // proto\n$export.B = 16; // bind\n$export.W = 32; // wrap\n$export.U = 64; // safe\n$export.R = 128; // real proto method for `library`\nvar _export = $export;\n\nvar toString = {}.toString;\n\nvar _cof = function (it) {\n return toString.call(it).slice(8, -1);\n};\n\n// fallback for non-array-like ES3 and non-enumerable old V8 strings\n\n// eslint-disable-next-line no-prototype-builtins\nvar _iobject = Object('z').propertyIsEnumerable(0) ? Object : function (it) {\n return _cof(it) == 'String' ? it.split('') : Object(it);\n};\n\n// 7.2.1 RequireObjectCoercible(argument)\nvar _defined = function (it) {\n if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n return it;\n};\n\n// to indexed object, toObject with fallback for non-array-like ES3 strings\n\n\nvar _toIobject = function (it) {\n return _iobject(_defined(it));\n};\n\n// 7.1.4 ToInteger\nvar ceil = Math.ceil;\nvar floor = Math.floor;\nvar _toInteger = function (it) {\n return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);\n};\n\n// 7.1.15 ToLength\n\nvar min = Math.min;\nvar _toLength = function (it) {\n return it > 0 ? min(_toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991\n};\n\nvar max = Math.max;\nvar min$1 = Math.min;\nvar _toAbsoluteIndex = function (index, length) {\n index = _toInteger(index);\n return index < 0 ? max(index + length, 0) : min$1(index, length);\n};\n\n// false -> Array#indexOf\n// true -> Array#includes\n\n\n\nvar _arrayIncludes = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = _toIobject($this);\n var length = _toLength(O.length);\n var index = _toAbsoluteIndex(fromIndex, length);\n var value;\n // Array#includes uses SameValueZero equality algorithm\n // eslint-disable-next-line no-self-compare\n if (IS_INCLUDES && el != el) while (length > index) {\n value = O[index++];\n // eslint-disable-next-line no-self-compare\n if (value != value) return true;\n // Array#indexOf ignores holes, Array#includes - not\n } else for (;length > index; index++) if (IS_INCLUDES || index in O) {\n if (O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n\nvar _library = true;\n\nvar _shared = createCommonjsModule(function (module) {\nvar SHARED = '__core-js_shared__';\nvar store = _global[SHARED] || (_global[SHARED] = {});\n\n(module.exports = function (key, value) {\n return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n version: _core.version,\n mode: 'pure',\n copyright: '© 2019 Denis Pushkarev (zloirock.ru)'\n});\n});\n\nvar id = 0;\nvar px = Math.random();\nvar _uid = function (key) {\n return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));\n};\n\nvar shared = _shared('keys');\n\nvar _sharedKey = function (key) {\n return shared[key] || (shared[key] = _uid(key));\n};\n\nvar arrayIndexOf = _arrayIncludes(false);\nvar IE_PROTO = _sharedKey('IE_PROTO');\n\nvar _objectKeysInternal = function (object, names) {\n var O = _toIobject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) if (key != IE_PROTO) _has(O, key) && result.push(key);\n // Don't enum bug & hidden keys\n while (names.length > i) if (_has(O, key = names[i++])) {\n ~arrayIndexOf(result, key) || result.push(key);\n }\n return result;\n};\n\n// IE 8- don't enum bug keys\nvar _enumBugKeys = (\n 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'\n).split(',');\n\n// 19.1.2.14 / 15.2.3.14 Object.keys(O)\n\n\n\nvar _objectKeys = Object.keys || function keys(O) {\n return _objectKeysInternal(O, _enumBugKeys);\n};\n\nvar _objectDps = _descriptors ? Object.defineProperties : function defineProperties(O, Properties) {\n _anObject(O);\n var keys = _objectKeys(Properties);\n var length = keys.length;\n var i = 0;\n var P;\n while (length > i) _objectDp.f(O, P = keys[i++], Properties[P]);\n return O;\n};\n\nvar document$2 = _global.document;\nvar _html = document$2 && document$2.documentElement;\n\n// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\n\n\n\nvar IE_PROTO$1 = _sharedKey('IE_PROTO');\nvar Empty = function () { /* empty */ };\nvar PROTOTYPE$1 = 'prototype';\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar createDict = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = _domCreate('iframe');\n var i = _enumBugKeys.length;\n var lt = '<';\n var gt = '>';\n var iframeDocument;\n iframe.style.display = 'none';\n _html.appendChild(iframe);\n iframe.src = 'javascript:'; // eslint-disable-line no-script-url\n // createDict = iframe.contentWindow.Object;\n // html.removeChild(iframe);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);\n iframeDocument.close();\n createDict = iframeDocument.F;\n while (i--) delete createDict[PROTOTYPE$1][_enumBugKeys[i]];\n return createDict();\n};\n\nvar _objectCreate = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n Empty[PROTOTYPE$1] = _anObject(O);\n result = new Empty();\n Empty[PROTOTYPE$1] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO$1] = O;\n } else result = createDict();\n return Properties === undefined ? result : _objectDps(result, Properties);\n};\n\n// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\n_export(_export.S, 'Object', { create: _objectCreate });\n\nvar $Object = _core.Object;\nvar create = function create(P, D) {\n return $Object.create(P, D);\n};\n\nvar create$1 = create;\n\nfunction _inheritsLoose(subClass, superClass) {\n subClass.prototype = create$1(superClass.prototype);\n subClass.prototype.constructor = subClass;\n subClass.__proto__ = superClass;\n}\n\nvar inheritsLoose = _inheritsLoose;\n\nfunction styleInject(css, ref) {\n if ( ref === void 0 ) ref = {};\n var insertAt = ref.insertAt;\n\n if (!css || typeof document === 'undefined') { return; }\n\n var head = document.head || document.getElementsByTagName('head')[0];\n var style = document.createElement('style');\n style.type = 'text/css';\n\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\n if (style.styleSheet) {\n style.styleSheet.cssText = css;\n } else {\n style.appendChild(document.createTextNode(css));\n }\n}\n\nvar reactIs_development = createCommonjsModule(function (module, exports) {\n\n\n\n{\n (function() {\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\n// The Symbol used to tag the ReactElement-like types. If there is no native Symbol\n// nor polyfill, then a plain number is used for performance.\nvar hasSymbol = typeof Symbol === 'function' && Symbol.for;\n\nvar REACT_ELEMENT_TYPE = hasSymbol ? Symbol.for('react.element') : 0xeac7;\nvar REACT_PORTAL_TYPE = hasSymbol ? Symbol.for('react.portal') : 0xeaca;\nvar REACT_FRAGMENT_TYPE = hasSymbol ? Symbol.for('react.fragment') : 0xeacb;\nvar REACT_STRICT_MODE_TYPE = hasSymbol ? Symbol.for('react.strict_mode') : 0xeacc;\nvar REACT_PROFILER_TYPE = hasSymbol ? Symbol.for('react.profiler') : 0xead2;\nvar REACT_PROVIDER_TYPE = hasSymbol ? Symbol.for('react.provider') : 0xeacd;\nvar REACT_CONTEXT_TYPE = hasSymbol ? Symbol.for('react.context') : 0xeace;\nvar REACT_ASYNC_MODE_TYPE = hasSymbol ? Symbol.for('react.async_mode') : 0xeacf;\nvar REACT_CONCURRENT_MODE_TYPE = hasSymbol ? Symbol.for('react.concurrent_mode') : 0xeacf;\nvar REACT_FORWARD_REF_TYPE = hasSymbol ? Symbol.for('react.forward_ref') : 0xead0;\nvar REACT_SUSPENSE_TYPE = hasSymbol ? Symbol.for('react.suspense') : 0xead1;\nvar REACT_MEMO_TYPE = hasSymbol ? Symbol.for('react.memo') : 0xead3;\nvar REACT_LAZY_TYPE = hasSymbol ? Symbol.for('react.lazy') : 0xead4;\n\nfunction isValidElementType(type) {\n return typeof type === 'string' || typeof type === 'function' ||\n // Note: its typeof might be other than 'symbol' or 'number' if it's a polyfill.\n type === REACT_FRAGMENT_TYPE || type === REACT_CONCURRENT_MODE_TYPE || type === REACT_PROFILER_TYPE || type === REACT_STRICT_MODE_TYPE || type === REACT_SUSPENSE_TYPE || typeof type === 'object' && type !== null && (type.$$typeof === REACT_LAZY_TYPE || type.$$typeof === REACT_MEMO_TYPE || type.$$typeof === REACT_PROVIDER_TYPE || type.$$typeof === REACT_CONTEXT_TYPE || type.$$typeof === REACT_FORWARD_REF_TYPE);\n}\n\n/**\n * Forked from fbjs/warning:\n * https://github.com/facebook/fbjs/blob/e66ba20ad5be433eb54423f2b097d829324d9de6/packages/fbjs/src/__forks__/warning.js\n *\n * Only change is we use console.warn instead of console.error,\n * and do nothing when 'console' is not supported.\n * This really simplifies the code.\n * ---\n * Similar to invariant but only logs a warning if the condition is not met.\n * This can be used to log issues in development environments in critical\n * paths. Removing the logging code for production environments will keep the\n * same logic and follow the same code paths.\n */\n\nvar lowPriorityWarning = function () {};\n\n{\n var printWarning = function (format) {\n for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n var argIndex = 0;\n var message = 'Warning: ' + format.replace(/%s/g, function () {\n return args[argIndex++];\n });\n if (typeof console !== 'undefined') {\n console.warn(message);\n }\n try {\n // --- Welcome to debugging React ---\n // This error was thrown as a convenience so that you can use this stack\n // to find the callsite that caused this warning to fire.\n throw new Error(message);\n } catch (x) {}\n };\n\n lowPriorityWarning = function (condition, format) {\n if (format === undefined) {\n throw new Error('`lowPriorityWarning(condition, format, ...args)` requires a warning ' + 'message argument');\n }\n if (!condition) {\n for (var _len2 = arguments.length, args = Array(_len2 > 2 ? _len2 - 2 : 0), _key2 = 2; _key2 < _len2; _key2++) {\n args[_key2 - 2] = arguments[_key2];\n }\n\n printWarning.apply(undefined, [format].concat(args));\n }\n };\n}\n\nvar lowPriorityWarning$1 = lowPriorityWarning;\n\nfunction typeOf(object) {\n if (typeof object === 'object' && object !== null) {\n var $$typeof = object.$$typeof;\n switch ($$typeof) {\n case REACT_ELEMENT_TYPE:\n var type = object.type;\n\n switch (type) {\n case REACT_ASYNC_MODE_TYPE:\n case REACT_CONCURRENT_MODE_TYPE:\n case REACT_FRAGMENT_TYPE:\n case REACT_PROFILER_TYPE:\n case REACT_STRICT_MODE_TYPE:\n case REACT_SUSPENSE_TYPE:\n return type;\n default:\n var $$typeofType = type && type.$$typeof;\n\n switch ($$typeofType) {\n case REACT_CONTEXT_TYPE:\n case REACT_FORWARD_REF_TYPE:\n case REACT_PROVIDER_TYPE:\n return $$typeofType;\n default:\n return $$typeof;\n }\n }\n case REACT_LAZY_TYPE:\n case REACT_MEMO_TYPE:\n case REACT_PORTAL_TYPE:\n return $$typeof;\n }\n }\n\n return undefined;\n}\n\n// AsyncMode is deprecated along with isAsyncMode\nvar AsyncMode = REACT_ASYNC_MODE_TYPE;\nvar ConcurrentMode = REACT_CONCURRENT_MODE_TYPE;\nvar ContextConsumer = REACT_CONTEXT_TYPE;\nvar ContextProvider = REACT_PROVIDER_TYPE;\nvar Element = REACT_ELEMENT_TYPE;\nvar ForwardRef = REACT_FORWARD_REF_TYPE;\nvar Fragment = REACT_FRAGMENT_TYPE;\nvar Lazy = REACT_LAZY_TYPE;\nvar Memo = REACT_MEMO_TYPE;\nvar Portal = REACT_PORTAL_TYPE;\nvar Profiler = REACT_PROFILER_TYPE;\nvar StrictMode = REACT_STRICT_MODE_TYPE;\nvar Suspense = REACT_SUSPENSE_TYPE;\n\nvar hasWarnedAboutDeprecatedIsAsyncMode = false;\n\n// AsyncMode should be deprecated\nfunction isAsyncMode(object) {\n {\n if (!hasWarnedAboutDeprecatedIsAsyncMode) {\n hasWarnedAboutDeprecatedIsAsyncMode = true;\n lowPriorityWarning$1(false, 'The ReactIs.isAsyncMode() alias has been deprecated, ' + 'and will be removed in React 17+. Update your code to use ' + 'ReactIs.isConcurrentMode() instead. It has the exact same API.');\n }\n }\n return isConcurrentMode(object) || typeOf(object) === REACT_ASYNC_MODE_TYPE;\n}\nfunction isConcurrentMode(object) {\n return typeOf(object) === REACT_CONCURRENT_MODE_TYPE;\n}\nfunction isContextConsumer(object) {\n return typeOf(object) === REACT_CONTEXT_TYPE;\n}\nfunction isContextProvider(object) {\n return typeOf(object) === REACT_PROVIDER_TYPE;\n}\nfunction isElement(object) {\n return typeof object === 'object' && object !== null && object.$$typeof === REACT_ELEMENT_TYPE;\n}\nfunction isForwardRef(object) {\n return typeOf(object) === REACT_FORWARD_REF_TYPE;\n}\nfunction isFragment(object) {\n return typeOf(object) === REACT_FRAGMENT_TYPE;\n}\nfunction isLazy(object) {\n return typeOf(object) === REACT_LAZY_TYPE;\n}\nfunction isMemo(object) {\n return typeOf(object) === REACT_MEMO_TYPE;\n}\nfunction isPortal(object) {\n return typeOf(object) === REACT_PORTAL_TYPE;\n}\nfunction isProfiler(object) {\n return typeOf(object) === REACT_PROFILER_TYPE;\n}\nfunction isStrictMode(object) {\n return typeOf(object) === REACT_STRICT_MODE_TYPE;\n}\nfunction isSuspense(object) {\n return typeOf(object) === REACT_SUSPENSE_TYPE;\n}\n\nexports.typeOf = typeOf;\nexports.AsyncMode = AsyncMode;\nexports.ConcurrentMode = ConcurrentMode;\nexports.ContextConsumer = ContextConsumer;\nexports.ContextProvider = ContextProvider;\nexports.Element = Element;\nexports.ForwardRef = ForwardRef;\nexports.Fragment = Fragment;\nexports.Lazy = Lazy;\nexports.Memo = Memo;\nexports.Portal = Portal;\nexports.Profiler = Profiler;\nexports.StrictMode = StrictMode;\nexports.Suspense = Suspense;\nexports.isValidElementType = isValidElementType;\nexports.isAsyncMode = isAsyncMode;\nexports.isConcurrentMode = isConcurrentMode;\nexports.isContextConsumer = isContextConsumer;\nexports.isContextProvider = isContextProvider;\nexports.isElement = isElement;\nexports.isForwardRef = isForwardRef;\nexports.isFragment = isFragment;\nexports.isLazy = isLazy;\nexports.isMemo = isMemo;\nexports.isPortal = isPortal;\nexports.isProfiler = isProfiler;\nexports.isStrictMode = isStrictMode;\nexports.isSuspense = isSuspense;\n })();\n}\n});\n\nunwrapExports(reactIs_development);\nvar reactIs_development_1 = reactIs_development.typeOf;\nvar reactIs_development_2 = reactIs_development.AsyncMode;\nvar reactIs_development_3 = reactIs_development.ConcurrentMode;\nvar reactIs_development_4 = reactIs_development.ContextConsumer;\nvar reactIs_development_5 = reactIs_development.ContextProvider;\nvar reactIs_development_6 = reactIs_development.Element;\nvar reactIs_development_7 = reactIs_development.ForwardRef;\nvar reactIs_development_8 = reactIs_development.Fragment;\nvar reactIs_development_9 = reactIs_development.Lazy;\nvar reactIs_development_10 = reactIs_development.Memo;\nvar reactIs_development_11 = reactIs_development.Portal;\nvar reactIs_development_12 = reactIs_development.Profiler;\nvar reactIs_development_13 = reactIs_development.StrictMode;\nvar reactIs_development_14 = reactIs_development.Suspense;\nvar reactIs_development_15 = reactIs_development.isValidElementType;\nvar reactIs_development_16 = reactIs_development.isAsyncMode;\nvar reactIs_development_17 = reactIs_development.isConcurrentMode;\nvar reactIs_development_18 = reactIs_development.isContextConsumer;\nvar reactIs_development_19 = reactIs_development.isContextProvider;\nvar reactIs_development_20 = reactIs_development.isElement;\nvar reactIs_development_21 = reactIs_development.isForwardRef;\nvar reactIs_development_22 = reactIs_development.isFragment;\nvar reactIs_development_23 = reactIs_development.isLazy;\nvar reactIs_development_24 = reactIs_development.isMemo;\nvar reactIs_development_25 = reactIs_development.isPortal;\nvar reactIs_development_26 = reactIs_development.isProfiler;\nvar reactIs_development_27 = reactIs_development.isStrictMode;\nvar reactIs_development_28 = reactIs_development.isSuspense;\n\nvar reactIs = createCommonjsModule(function (module) {\n\n{\n module.exports = reactIs_development;\n}\n});\n\n/*\nobject-assign\n(c) Sindre Sorhus\n@license MIT\n*/\n/* eslint-disable no-unused-vars */\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar hasOwnProperty$1 = Object.prototype.hasOwnProperty;\nvar propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\nfunction toObject(val) {\n\tif (val === null || val === undefined) {\n\t\tthrow new TypeError('Object.assign cannot be called with null or undefined');\n\t}\n\n\treturn Object(val);\n}\n\nfunction shouldUseNative() {\n\ttry {\n\t\tif (!Object.assign) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Detect buggy property enumeration order in older V8 versions.\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=4118\n\t\tvar test1 = new String('abc'); // eslint-disable-line no-new-wrappers\n\t\ttest1[5] = 'de';\n\t\tif (Object.getOwnPropertyNames(test1)[0] === '5') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test2 = {};\n\t\tfor (var i = 0; i < 10; i++) {\n\t\t\ttest2['_' + String.fromCharCode(i)] = i;\n\t\t}\n\t\tvar order2 = Object.getOwnPropertyNames(test2).map(function (n) {\n\t\t\treturn test2[n];\n\t\t});\n\t\tif (order2.join('') !== '0123456789') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test3 = {};\n\t\t'abcdefghijklmnopqrst'.split('').forEach(function (letter) {\n\t\t\ttest3[letter] = letter;\n\t\t});\n\t\tif (Object.keys(Object.assign({}, test3)).join('') !==\n\t\t\t\t'abcdefghijklmnopqrst') {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (err) {\n\t\t// We don't expect any of the above to throw, but better to be safe.\n\t\treturn false;\n\t}\n}\n\nvar objectAssign = shouldUseNative() ? Object.assign : function (target, source) {\n\tvar from;\n\tvar to = toObject(target);\n\tvar symbols;\n\n\tfor (var s = 1; s < arguments.length; s++) {\n\t\tfrom = Object(arguments[s]);\n\n\t\tfor (var key in from) {\n\t\t\tif (hasOwnProperty$1.call(from, key)) {\n\t\t\t\tto[key] = from[key];\n\t\t\t}\n\t\t}\n\n\t\tif (getOwnPropertySymbols) {\n\t\t\tsymbols = getOwnPropertySymbols(from);\n\t\t\tfor (var i = 0; i < symbols.length; i++) {\n\t\t\t\tif (propIsEnumerable.call(from, symbols[i])) {\n\t\t\t\t\tto[symbols[i]] = from[symbols[i]];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn to;\n};\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\nvar ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';\n\nvar ReactPropTypesSecret_1 = ReactPropTypesSecret;\n\nvar printWarning = function() {};\n\n{\n var ReactPropTypesSecret$1 = ReactPropTypesSecret_1;\n var loggedTypeFailures = {};\n var has = Function.call.bind(Object.prototype.hasOwnProperty);\n\n printWarning = function(text) {\n var message = 'Warning: ' + text;\n if (typeof console !== 'undefined') {\n console.error(message);\n }\n try {\n // --- Welcome to debugging React ---\n // This error was thrown as a convenience so that you can use this stack\n // to find the callsite that caused this warning to fire.\n throw new Error(message);\n } catch (x) {}\n };\n}\n\n/**\n * Assert that the values match with the type specs.\n * Error messages are memorized and will only be shown once.\n *\n * @param {object} typeSpecs Map of name to a ReactPropType\n * @param {object} values Runtime values that need to be type-checked\n * @param {string} location e.g. \"prop\", \"context\", \"child context\"\n * @param {string} componentName Name of the component for error messages.\n * @param {?Function} getStack Returns the component stack.\n * @private\n */\nfunction checkPropTypes(typeSpecs, values, location, componentName, getStack) {\n {\n for (var typeSpecName in typeSpecs) {\n if (has(typeSpecs, typeSpecName)) {\n var error;\n // Prop type validation may throw. In case they do, we don't want to\n // fail the render phase where it didn't fail before. So we log it.\n // After these have been cleaned up, we'll let them throw.\n try {\n // This is intentionally an invariant that gets caught. It's the same\n // behavior as without this statement except with a better message.\n if (typeof typeSpecs[typeSpecName] !== 'function') {\n var err = Error(\n (componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' +\n 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.'\n );\n err.name = 'Invariant Violation';\n throw err;\n }\n error = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, ReactPropTypesSecret$1);\n } catch (ex) {\n error = ex;\n }\n if (error && !(error instanceof Error)) {\n printWarning(\n (componentName || 'React class') + ': type specification of ' +\n location + ' `' + typeSpecName + '` is invalid; the type checker ' +\n 'function must return `null` or an `Error` but returned a ' + typeof error + '. ' +\n 'You may have forgotten to pass an argument to the type checker ' +\n 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' +\n 'shape all require an argument).'\n );\n }\n if (error instanceof Error && !(error.message in loggedTypeFailures)) {\n // Only monitor this failure once because there tends to be a lot of the\n // same error.\n loggedTypeFailures[error.message] = true;\n\n var stack = getStack ? getStack() : '';\n\n printWarning(\n 'Failed ' + location + ' type: ' + error.message + (stack != null ? stack : '')\n );\n }\n }\n }\n }\n}\n\n/**\n * Resets warning cache when testing.\n *\n * @private\n */\ncheckPropTypes.resetWarningCache = function() {\n {\n loggedTypeFailures = {};\n }\n};\n\nvar checkPropTypes_1 = checkPropTypes;\n\nvar has$1 = Function.call.bind(Object.prototype.hasOwnProperty);\nvar printWarning$1 = function() {};\n\n{\n printWarning$1 = function(text) {\n var message = 'Warning: ' + text;\n if (typeof console !== 'undefined') {\n console.error(message);\n }\n try {\n // --- Welcome to debugging React ---\n // This error was thrown as a convenience so that you can use this stack\n // to find the callsite that caused this warning to fire.\n throw new Error(message);\n } catch (x) {}\n };\n}\n\nfunction emptyFunctionThatReturnsNull() {\n return null;\n}\n\nvar factoryWithTypeCheckers = function(isValidElement, throwOnDirectAccess) {\n /* global Symbol */\n var ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator;\n var FAUX_ITERATOR_SYMBOL = '@@iterator'; // Before Symbol spec.\n\n /**\n * Returns the iterator method function contained on the iterable object.\n *\n * Be sure to invoke the function with the iterable as context:\n *\n * var iteratorFn = getIteratorFn(myIterable);\n * if (iteratorFn) {\n * var iterator = iteratorFn.call(myIterable);\n * ...\n * }\n *\n * @param {?object} maybeIterable\n * @return {?function}\n */\n function getIteratorFn(maybeIterable) {\n var iteratorFn = maybeIterable && (ITERATOR_SYMBOL && maybeIterable[ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]);\n if (typeof iteratorFn === 'function') {\n return iteratorFn;\n }\n }\n\n /**\n * Collection of methods that allow declaration and validation of props that are\n * supplied to React components. Example usage:\n *\n * var Props = require('ReactPropTypes');\n * var MyArticle = React.createClass({\n * propTypes: {\n * // An optional string prop named \"description\".\n * description: Props.string,\n *\n * // A required enum prop named \"category\".\n * category: Props.oneOf(['News','Photos']).isRequired,\n *\n * // A prop named \"dialog\" that requires an instance of Dialog.\n * dialog: Props.instanceOf(Dialog).isRequired\n * },\n * render: function() { ... }\n * });\n *\n * A more formal specification of how these methods are used:\n *\n * type := array|bool|func|object|number|string|oneOf([...])|instanceOf(...)\n * decl := ReactPropTypes.{type}(.isRequired)?\n *\n * Each and every declaration produces a function with the same signature. This\n * allows the creation of custom validation functions. For example:\n *\n * var MyLink = React.createClass({\n * propTypes: {\n * // An optional string or URI prop named \"href\".\n * href: function(props, propName, componentName) {\n * var propValue = props[propName];\n * if (propValue != null && typeof propValue !== 'string' &&\n * !(propValue instanceof URI)) {\n * return new Error(\n * 'Expected a string or an URI for ' + propName + ' in ' +\n * componentName\n * );\n * }\n * }\n * },\n * render: function() {...}\n * });\n *\n * @internal\n */\n\n var ANONYMOUS = '<

>';\n\n // Important!\n // Keep this list in sync with production version in `./factoryWithThrowingShims.js`.\n var ReactPropTypes = {\n array: createPrimitiveTypeChecker('array'),\n bool: createPrimitiveTypeChecker('boolean'),\n func: createPrimitiveTypeChecker('function'),\n number: createPrimitiveTypeChecker('number'),\n object: createPrimitiveTypeChecker('object'),\n string: createPrimitiveTypeChecker('string'),\n symbol: createPrimitiveTypeChecker('symbol'),\n\n any: createAnyTypeChecker(),\n arrayOf: createArrayOfTypeChecker,\n element: createElementTypeChecker(),\n elementType: createElementTypeTypeChecker(),\n instanceOf: createInstanceTypeChecker,\n node: createNodeChecker(),\n objectOf: createObjectOfTypeChecker,\n oneOf: createEnumTypeChecker,\n oneOfType: createUnionTypeChecker,\n shape: createShapeTypeChecker,\n exact: createStrictShapeTypeChecker,\n };\n\n /**\n * inlined Object.is polyfill to avoid requiring consumers ship their own\n * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is\n */\n /*eslint-disable no-self-compare*/\n function is(x, y) {\n // SameValue algorithm\n if (x === y) {\n // Steps 1-5, 7-10\n // Steps 6.b-6.e: +0 != -0\n return x !== 0 || 1 / x === 1 / y;\n } else {\n // Step 6.a: NaN == NaN\n return x !== x && y !== y;\n }\n }\n /*eslint-enable no-self-compare*/\n\n /**\n * We use an Error-like object for backward compatibility as people may call\n * PropTypes directly and inspect their output. However, we don't use real\n * Errors anymore. We don't inspect their stack anyway, and creating them\n * is prohibitively expensive if they are created too often, such as what\n * happens in oneOfType() for any type before the one that matched.\n */\n function PropTypeError(message) {\n this.message = message;\n this.stack = '';\n }\n // Make `instanceof Error` still work for returned errors.\n PropTypeError.prototype = Error.prototype;\n\n function createChainableTypeChecker(validate) {\n {\n var manualPropTypeCallCache = {};\n var manualPropTypeWarningCount = 0;\n }\n function checkType(isRequired, props, propName, componentName, location, propFullName, secret) {\n componentName = componentName || ANONYMOUS;\n propFullName = propFullName || propName;\n\n if (secret !== ReactPropTypesSecret_1) {\n if (throwOnDirectAccess) {\n // New behavior only for users of `prop-types` package\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 } else if (typeof console !== 'undefined') {\n // Old behavior for people using React.PropTypes\n var cacheKey = componentName + ':' + propName;\n if (\n !manualPropTypeCallCache[cacheKey] &&\n // Avoid spamming the console because they are often not actionable except for lib authors\n manualPropTypeWarningCount < 3\n ) {\n printWarning$1(\n 'You are manually calling a React.PropTypes validation ' +\n 'function for the `' + propFullName + '` prop on `' + componentName + '`. This is deprecated ' +\n 'and will throw in the standalone `prop-types` package. ' +\n 'You may be seeing this warning due to a third-party PropTypes ' +\n 'library. See https://fb.me/react-warning-dont-call-proptypes ' + 'for details.'\n );\n manualPropTypeCallCache[cacheKey] = true;\n manualPropTypeWarningCount++;\n }\n }\n }\n if (props[propName] == null) {\n if (isRequired) {\n if (props[propName] === null) {\n return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required ' + ('in `' + componentName + '`, but its value is `null`.'));\n }\n return new PropTypeError('The ' + location + ' `' + propFullName + '` is marked as required in ' + ('`' + componentName + '`, but its value is `undefined`.'));\n }\n return null;\n } else {\n return validate(props, propName, componentName, location, propFullName);\n }\n }\n\n var chainedCheckType = checkType.bind(null, false);\n chainedCheckType.isRequired = checkType.bind(null, true);\n\n return chainedCheckType;\n }\n\n function createPrimitiveTypeChecker(expectedType) {\n function validate(props, propName, componentName, location, propFullName, secret) {\n var propValue = props[propName];\n var propType = getPropType(propValue);\n if (propType !== expectedType) {\n // `propValue` being instance of, say, date/regexp, pass the 'object'\n // check, but we can offer a more precise error message here rather than\n // 'of type `object`'.\n var preciseType = getPreciseType(propValue);\n\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + preciseType + '` supplied to `' + componentName + '`, expected ') + ('`' + expectedType + '`.'));\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createAnyTypeChecker() {\n return createChainableTypeChecker(emptyFunctionThatReturnsNull);\n }\n\n function createArrayOfTypeChecker(typeChecker) {\n function validate(props, propName, componentName, location, propFullName) {\n if (typeof typeChecker !== 'function') {\n return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside arrayOf.');\n }\n var propValue = props[propName];\n if (!Array.isArray(propValue)) {\n var propType = getPropType(propValue);\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an array.'));\n }\n for (var i = 0; i < propValue.length; i++) {\n var error = typeChecker(propValue, i, componentName, location, propFullName + '[' + i + ']', ReactPropTypesSecret_1);\n if (error instanceof Error) {\n return error;\n }\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createElementTypeChecker() {\n function validate(props, propName, componentName, location, propFullName) {\n var propValue = props[propName];\n if (!isValidElement(propValue)) {\n var propType = getPropType(propValue);\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected a single ReactElement.'));\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createElementTypeTypeChecker() {\n function validate(props, propName, componentName, location, propFullName) {\n var propValue = props[propName];\n if (!reactIs.isValidElementType(propValue)) {\n var propType = getPropType(propValue);\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected a single ReactElement type.'));\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createInstanceTypeChecker(expectedClass) {\n function validate(props, propName, componentName, location, propFullName) {\n if (!(props[propName] instanceof expectedClass)) {\n var expectedClassName = expectedClass.name || ANONYMOUS;\n var actualClassName = getClassName(props[propName]);\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + actualClassName + '` supplied to `' + componentName + '`, expected ') + ('instance of `' + expectedClassName + '`.'));\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createEnumTypeChecker(expectedValues) {\n if (!Array.isArray(expectedValues)) {\n {\n if (arguments.length > 1) {\n printWarning$1(\n 'Invalid arguments supplied to oneOf, expected an array, got ' + arguments.length + ' arguments. ' +\n 'A common mistake is to write oneOf(x, y, z) instead of oneOf([x, y, z]).'\n );\n } else {\n printWarning$1('Invalid argument supplied to oneOf, expected an array.');\n }\n }\n return emptyFunctionThatReturnsNull;\n }\n\n function validate(props, propName, componentName, location, propFullName) {\n var propValue = props[propName];\n for (var i = 0; i < expectedValues.length; i++) {\n if (is(propValue, expectedValues[i])) {\n return null;\n }\n }\n\n var valuesString = JSON.stringify(expectedValues, function replacer(key, value) {\n var type = getPreciseType(value);\n if (type === 'symbol') {\n return String(value);\n }\n return value;\n });\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of value `' + String(propValue) + '` ' + ('supplied to `' + componentName + '`, expected one of ' + valuesString + '.'));\n }\n return createChainableTypeChecker(validate);\n }\n\n function createObjectOfTypeChecker(typeChecker) {\n function validate(props, propName, componentName, location, propFullName) {\n if (typeof typeChecker !== 'function') {\n return new PropTypeError('Property `' + propFullName + '` of component `' + componentName + '` has invalid PropType notation inside objectOf.');\n }\n var propValue = props[propName];\n var propType = getPropType(propValue);\n if (propType !== 'object') {\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type ' + ('`' + propType + '` supplied to `' + componentName + '`, expected an object.'));\n }\n for (var key in propValue) {\n if (has$1(propValue, key)) {\n var error = typeChecker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret_1);\n if (error instanceof Error) {\n return error;\n }\n }\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createUnionTypeChecker(arrayOfTypeCheckers) {\n if (!Array.isArray(arrayOfTypeCheckers)) {\n printWarning$1('Invalid argument supplied to oneOfType, expected an instance of array.');\n return emptyFunctionThatReturnsNull;\n }\n\n for (var i = 0; i < arrayOfTypeCheckers.length; i++) {\n var checker = arrayOfTypeCheckers[i];\n if (typeof checker !== 'function') {\n printWarning$1(\n 'Invalid argument supplied to oneOfType. Expected an array of check functions, but ' +\n 'received ' + getPostfixForTypeWarning(checker) + ' at index ' + i + '.'\n );\n return emptyFunctionThatReturnsNull;\n }\n }\n\n function validate(props, propName, componentName, location, propFullName) {\n for (var i = 0; i < arrayOfTypeCheckers.length; i++) {\n var checker = arrayOfTypeCheckers[i];\n if (checker(props, propName, componentName, location, propFullName, ReactPropTypesSecret_1) == null) {\n return null;\n }\n }\n\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`.'));\n }\n return createChainableTypeChecker(validate);\n }\n\n function createNodeChecker() {\n function validate(props, propName, componentName, location, propFullName) {\n if (!isNode(props[propName])) {\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` supplied to ' + ('`' + componentName + '`, expected a ReactNode.'));\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createShapeTypeChecker(shapeTypes) {\n function validate(props, propName, componentName, location, propFullName) {\n var propValue = props[propName];\n var propType = getPropType(propValue);\n if (propType !== 'object') {\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.'));\n }\n for (var key in shapeTypes) {\n var checker = shapeTypes[key];\n if (!checker) {\n continue;\n }\n var error = checker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret_1);\n if (error) {\n return error;\n }\n }\n return null;\n }\n return createChainableTypeChecker(validate);\n }\n\n function createStrictShapeTypeChecker(shapeTypes) {\n function validate(props, propName, componentName, location, propFullName) {\n var propValue = props[propName];\n var propType = getPropType(propValue);\n if (propType !== 'object') {\n return new PropTypeError('Invalid ' + location + ' `' + propFullName + '` of type `' + propType + '` ' + ('supplied to `' + componentName + '`, expected `object`.'));\n }\n // We need to check all keys in case some are required but missing from\n // props.\n var allKeys = objectAssign({}, props[propName], shapeTypes);\n for (var key in allKeys) {\n var checker = shapeTypes[key];\n if (!checker) {\n return new PropTypeError(\n 'Invalid ' + location + ' `' + propFullName + '` key `' + key + '` supplied to `' + componentName + '`.' +\n '\\nBad object: ' + JSON.stringify(props[propName], null, ' ') +\n '\\nValid keys: ' + JSON.stringify(Object.keys(shapeTypes), null, ' ')\n );\n }\n var error = checker(propValue, key, componentName, location, propFullName + '.' + key, ReactPropTypesSecret_1);\n if (error) {\n return error;\n }\n }\n return null;\n }\n\n return createChainableTypeChecker(validate);\n }\n\n function isNode(propValue) {\n switch (typeof propValue) {\n case 'number':\n case 'string':\n case 'undefined':\n return true;\n case 'boolean':\n return !propValue;\n case 'object':\n if (Array.isArray(propValue)) {\n return propValue.every(isNode);\n }\n if (propValue === null || isValidElement(propValue)) {\n return true;\n }\n\n var iteratorFn = getIteratorFn(propValue);\n if (iteratorFn) {\n var iterator = iteratorFn.call(propValue);\n var step;\n if (iteratorFn !== propValue.entries) {\n while (!(step = iterator.next()).done) {\n if (!isNode(step.value)) {\n return false;\n }\n }\n } else {\n // Iterator will provide entry [k,v] tuples rather than values.\n while (!(step = iterator.next()).done) {\n var entry = step.value;\n if (entry) {\n if (!isNode(entry[1])) {\n return false;\n }\n }\n }\n }\n } else {\n return false;\n }\n\n return true;\n default:\n return false;\n }\n }\n\n function isSymbol(propType, propValue) {\n // Native Symbol.\n if (propType === 'symbol') {\n return true;\n }\n\n // falsy value can't be a Symbol\n if (!propValue) {\n return false;\n }\n\n // 19.4.3.5 Symbol.prototype[@@toStringTag] === 'Symbol'\n if (propValue['@@toStringTag'] === 'Symbol') {\n return true;\n }\n\n // Fallback for non-spec compliant Symbols which are polyfilled.\n if (typeof Symbol === 'function' && propValue instanceof Symbol) {\n return true;\n }\n\n return false;\n }\n\n // Equivalent of `typeof` but with special handling for array and regexp.\n function getPropType(propValue) {\n var propType = typeof propValue;\n if (Array.isArray(propValue)) {\n return 'array';\n }\n if (propValue instanceof RegExp) {\n // Old webkits (at least until Android 4.0) return 'function' rather than\n // 'object' for typeof a RegExp. We'll normalize this here so that /bla/\n // passes PropTypes.object.\n return 'object';\n }\n if (isSymbol(propType, propValue)) {\n return 'symbol';\n }\n return propType;\n }\n\n // This handles more types than `getPropType`. Only used for error messages.\n // See `createPrimitiveTypeChecker`.\n function getPreciseType(propValue) {\n if (typeof propValue === 'undefined' || propValue === null) {\n return '' + propValue;\n }\n var propType = getPropType(propValue);\n if (propType === 'object') {\n if (propValue instanceof Date) {\n return 'date';\n } else if (propValue instanceof RegExp) {\n return 'regexp';\n }\n }\n return propType;\n }\n\n // Returns a string that is postfixed to a warning about an invalid type.\n // For example, \"undefined\" or \"of type array\"\n function getPostfixForTypeWarning(value) {\n var type = getPreciseType(value);\n switch (type) {\n case 'array':\n case 'object':\n return 'an ' + type;\n case 'boolean':\n case 'date':\n case 'regexp':\n return 'a ' + type;\n default:\n return type;\n }\n }\n\n // Returns class name of the object, if any.\n function getClassName(propValue) {\n if (!propValue.constructor || !propValue.constructor.name) {\n return ANONYMOUS;\n }\n return propValue.constructor.name;\n }\n\n ReactPropTypes.checkPropTypes = checkPropTypes_1;\n ReactPropTypes.resetWarningCache = checkPropTypes_1.resetWarningCache;\n ReactPropTypes.PropTypes = ReactPropTypes;\n\n return ReactPropTypes;\n};\n\nvar propTypes = createCommonjsModule(function (module) {\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{\n var ReactIs = reactIs;\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 = factoryWithTypeCheckers(ReactIs.isElement, throwOnDirectAccess);\n}\n});\n\nexports.$export = _export;\nexports.$keys = _objectKeys;\nexports.DESCRIPTORS = _descriptors;\nexports.IObject = _iobject;\nexports.LIBRARY = _library;\nexports.PropTypes = propTypes;\nexports._inheritsLoose = inheritsLoose;\nexports.aFunction = _aFunction;\nexports.anObject = _anObject;\nexports.cel = _domCreate;\nexports.core = _core;\nexports.create = _objectCreate;\nexports.createCommonjsModule = createCommonjsModule;\nexports.ctx = _ctx;\nexports.dP = _objectDp;\nexports.defined = _defined;\nexports.descriptor = _propertyDesc;\nexports.fails = _fails;\nexports.global = _global;\nexports.has = _has;\nexports.hide = _hide;\nexports.html = _html;\nexports.isObject = _isObject;\nexports.require$$0 = _shared;\nexports.require$$0$1 = _sharedKey;\nexports.require$$1 = _cof;\nexports.styleInject = styleInject;\nexports.toIObject = _toIobject;\nexports.toInteger = _toInteger;\nexports.toLength = _toLength;\nexports.uid = _uid;\n//# sourceMappingURL=chunk-05d514b3.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/comments/lib/chunk-05d514b3.js\n// module id = 1\n// module chunks = 0\n//# sourceURL=webpack:///./~/comments/lib/chunk-05d514b3.js?");},[147,90],function(module,exports,__webpack_require__){eval("'use strict';\n\nvar bind = __webpack_require__(32);\nvar isBuffer = __webpack_require__(67);\n\n/*global toString:true*/\n\n// utils is a library of generic helper functions non-specific to axios\n\nvar toString = Object.prototype.toString;\n\n/**\n * Determine if a value is an Array\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an Array, otherwise false\n */\nfunction isArray(val) {\n return toString.call(val) === '[object Array]';\n}\n\n/**\n * Determine if a value is an ArrayBuffer\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an ArrayBuffer, otherwise false\n */\nfunction isArrayBuffer(val) {\n return toString.call(val) === '[object ArrayBuffer]';\n}\n\n/**\n * Determine if a value is a FormData\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an FormData, otherwise false\n */\nfunction isFormData(val) {\n return (typeof FormData !== 'undefined') && (val instanceof FormData);\n}\n\n/**\n * Determine if a value is a view on an ArrayBuffer\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false\n */\nfunction isArrayBufferView(val) {\n var result;\n if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {\n result = ArrayBuffer.isView(val);\n } else {\n result = (val) && (val.buffer) && (val.buffer instanceof ArrayBuffer);\n }\n return result;\n}\n\n/**\n * Determine if a value is a String\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a String, otherwise false\n */\nfunction isString(val) {\n return typeof val === 'string';\n}\n\n/**\n * Determine if a value is a Number\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Number, otherwise false\n */\nfunction isNumber(val) {\n return typeof val === 'number';\n}\n\n/**\n * Determine if a value is undefined\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if the value is undefined, otherwise false\n */\nfunction isUndefined(val) {\n return typeof val === 'undefined';\n}\n\n/**\n * Determine if a value is an Object\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an Object, otherwise false\n */\nfunction isObject(val) {\n return val !== null && typeof val === 'object';\n}\n\n/**\n * Determine if a value is a Date\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Date, otherwise false\n */\nfunction isDate(val) {\n return toString.call(val) === '[object Date]';\n}\n\n/**\n * Determine if a value is a File\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a File, otherwise false\n */\nfunction isFile(val) {\n return toString.call(val) === '[object File]';\n}\n\n/**\n * Determine if a value is a Blob\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Blob, otherwise false\n */\nfunction isBlob(val) {\n return toString.call(val) === '[object Blob]';\n}\n\n/**\n * Determine if a value is a Function\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Function, otherwise false\n */\nfunction isFunction(val) {\n return toString.call(val) === '[object Function]';\n}\n\n/**\n * Determine if a value is a Stream\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Stream, otherwise false\n */\nfunction isStream(val) {\n return isObject(val) && isFunction(val.pipe);\n}\n\n/**\n * Determine if a value is a URLSearchParams object\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a URLSearchParams object, otherwise false\n */\nfunction isURLSearchParams(val) {\n return typeof URLSearchParams !== 'undefined' && val instanceof URLSearchParams;\n}\n\n/**\n * Trim excess whitespace off the beginning and end of a string\n *\n * @param {String} str The String to trim\n * @returns {String} The String freed of excess whitespace\n */\nfunction trim(str) {\n return str.replace(/^\\s*/, '').replace(/\\s*$/, '');\n}\n\n/**\n * Determine if we're running in a standard browser environment\n *\n * This allows axios to run in a web worker, and react-native.\n * Both environments support XMLHttpRequest, but not fully standard globals.\n *\n * web workers:\n * typeof window -> undefined\n * typeof document -> undefined\n *\n * react-native:\n * navigator.product -> 'ReactNative'\n */\nfunction isStandardBrowserEnv() {\n if (typeof navigator !== 'undefined' && navigator.product === 'ReactNative') {\n return false;\n }\n return (\n typeof window !== 'undefined' &&\n typeof document !== 'undefined'\n );\n}\n\n/**\n * Iterate over an Array or an Object invoking a function for each item.\n *\n * If `obj` is an Array callback will be called passing\n * the value, index, and complete array for each item.\n *\n * If 'obj' is an Object callback will be called passing\n * the value, key, and complete object for each property.\n *\n * @param {Object|Array} obj The object to iterate\n * @param {Function} fn The callback to invoke for each item\n */\nfunction forEach(obj, fn) {\n // Don't bother if no value provided\n if (obj === null || typeof obj === 'undefined') {\n return;\n }\n\n // Force an array if not already something iterable\n if (typeof obj !== 'object') {\n /*eslint no-param-reassign:0*/\n obj = [obj];\n }\n\n if (isArray(obj)) {\n // Iterate over array values\n for (var i = 0, l = obj.length; i < l; i++) {\n fn.call(null, obj[i], i, obj);\n }\n } else {\n // Iterate over object keys\n for (var key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n fn.call(null, obj[key], key, obj);\n }\n }\n }\n}\n\n/**\n * Accepts varargs expecting each argument to be an object, then\n * immutably merges the properties of each object and returns result.\n *\n * When multiple objects contain the same key the later object in\n * the arguments list will take precedence.\n *\n * Example:\n *\n * ```js\n * var result = merge({foo: 123}, {foo: 456});\n * console.log(result.foo); // outputs 456\n * ```\n *\n * @param {Object} obj1 Object to merge\n * @returns {Object} Result of all merge properties\n */\nfunction merge(/* obj1, obj2, obj3, ... */) {\n var result = {};\n function assignValue(val, key) {\n if (typeof result[key] === 'object' && typeof val === 'object') {\n result[key] = merge(result[key], val);\n } else {\n result[key] = val;\n }\n }\n\n for (var i = 0, l = arguments.length; i < l; i++) {\n forEach(arguments[i], assignValue);\n }\n return result;\n}\n\n/**\n * Extends object a by mutably adding to it the properties of object b.\n *\n * @param {Object} a The object to be extended\n * @param {Object} b The object to copy properties from\n * @param {Object} thisArg The object to bind function to\n * @return {Object} The resulting value of object a\n */\nfunction extend(a, b, thisArg) {\n forEach(b, function assignValue(val, key) {\n if (thisArg && typeof val === 'function') {\n a[key] = bind(val, thisArg);\n } else {\n a[key] = val;\n }\n });\n return a;\n}\n\nmodule.exports = {\n isArray: isArray,\n isArrayBuffer: isArrayBuffer,\n isBuffer: isBuffer,\n isFormData: isFormData,\n isArrayBufferView: isArrayBufferView,\n isString: isString,\n isNumber: isNumber,\n isObject: isObject,\n isUndefined: isUndefined,\n isDate: isDate,\n isFile: isFile,\n isBlob: isBlob,\n isFunction: isFunction,\n isStream: isStream,\n isURLSearchParams: isURLSearchParams,\n isStandardBrowserEnv: isStandardBrowserEnv,\n forEach: forEach,\n merge: merge,\n extend: extend,\n trim: trim\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/axios/lib/utils.js\n// module id = 3\n// module chunks = 0\n//# sourceURL=webpack:///./~/axios/lib/utils.js?")},function(module,exports,__webpack_require__){eval("'use strict';\n\nvar __chunk_1 = __webpack_require__(1);\n\nvar classnames = __chunk_1.createCommonjsModule(function (module) {\n/*!\n Copyright (c) 2017 Jed Watson.\n Licensed under the MIT License (MIT), see\n http://jedwatson.github.io/classnames\n*/\n/* global define */\n\n(function () {\n\n\tvar hasOwn = {}.hasOwnProperty;\n\n\tfunction classNames () {\n\t\tvar classes = [];\n\n\t\tfor (var i = 0; i < arguments.length; i++) {\n\t\t\tvar arg = arguments[i];\n\t\t\tif (!arg) continue;\n\n\t\t\tvar argType = typeof arg;\n\n\t\t\tif (argType === 'string' || argType === 'number') {\n\t\t\t\tclasses.push(arg);\n\t\t\t} else if (Array.isArray(arg) && arg.length) {\n\t\t\t\tvar inner = classNames.apply(null, arg);\n\t\t\t\tif (inner) {\n\t\t\t\t\tclasses.push(inner);\n\t\t\t\t}\n\t\t\t} else if (argType === 'object') {\n\t\t\t\tfor (var key in arg) {\n\t\t\t\t\tif (hasOwn.call(arg, key) && arg[key]) {\n\t\t\t\t\t\tclasses.push(key);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn classes.join(' ');\n\t}\n\n\tif (module.exports) {\n\t\tclassNames.default = classNames;\n\t\tmodule.exports = classNames;\n\t} else {\n\t\twindow.classNames = classNames;\n\t}\n}());\n});\n\nexports.classnames = classnames;\n//# sourceMappingURL=chunk-29c0e492.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/comments/lib/chunk-29c0e492.js\n// module id = 4\n// module chunks = 0\n//# sourceURL=webpack:///./~/comments/lib/chunk-29c0e492.js?")},function(module,exports,__webpack_require__){eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\n * JavaScript Cookie v2.2.1\n * https://github.com/js-cookie/js-cookie\n *\n * Copyright 2006, 2015 Klaus Hartl & Fagner Brack\n * Released under the MIT license\n */\n;(function (factory) {\n\tvar registeredInModuleLoader;\n\tif (true) {\n\t\t!(__WEBPACK_AMD_DEFINE_FACTORY__ = (factory), __WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ? (__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) : __WEBPACK_AMD_DEFINE_FACTORY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t\tregisteredInModuleLoader = true;\n\t}\n\tif (true) {\n\t\tmodule.exports = factory();\n\t\tregisteredInModuleLoader = true;\n\t}\n\tif (!registeredInModuleLoader) {\n\t\tvar OldCookies = window.Cookies;\n\t\tvar api = window.Cookies = factory();\n\t\tapi.noConflict = function () {\n\t\t\twindow.Cookies = OldCookies;\n\t\t\treturn api;\n\t\t};\n\t}\n}(function () {\n\tfunction extend () {\n\t\tvar i = 0;\n\t\tvar result = {};\n\t\tfor (; i < arguments.length; i++) {\n\t\t\tvar attributes = arguments[ i ];\n\t\t\tfor (var key in attributes) {\n\t\t\t\tresult[key] = attributes[key];\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\tfunction decode (s) {\n\t\treturn s.replace(/(%[0-9A-Z]{2})+/g, decodeURIComponent);\n\t}\n\n\tfunction init (converter) {\n\t\tfunction api() {}\n\n\t\tfunction set (key, value, attributes) {\n\t\t\tif (typeof document === 'undefined') {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tattributes = extend({\n\t\t\t\tpath: '/'\n\t\t\t}, api.defaults, attributes);\n\n\t\t\tif (typeof attributes.expires === 'number') {\n\t\t\t\tattributes.expires = new Date(new Date() * 1 + attributes.expires * 864e+5);\n\t\t\t}\n\n\t\t\t// We're using \"expires\" because \"max-age\" is not supported by IE\n\t\t\tattributes.expires = attributes.expires ? attributes.expires.toUTCString() : '';\n\n\t\t\ttry {\n\t\t\t\tvar result = JSON.stringify(value);\n\t\t\t\tif (/^[\\{\\[]/.test(result)) {\n\t\t\t\t\tvalue = result;\n\t\t\t\t}\n\t\t\t} catch (e) {}\n\n\t\t\tvalue = converter.write ?\n\t\t\t\tconverter.write(value, key) :\n\t\t\t\tencodeURIComponent(String(value))\n\t\t\t\t\t.replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g, decodeURIComponent);\n\n\t\t\tkey = encodeURIComponent(String(key))\n\t\t\t\t.replace(/%(23|24|26|2B|5E|60|7C)/g, decodeURIComponent)\n\t\t\t\t.replace(/[\\(\\)]/g, escape);\n\n\t\t\tvar stringifiedAttributes = '';\n\t\t\tfor (var attributeName in attributes) {\n\t\t\t\tif (!attributes[attributeName]) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tstringifiedAttributes += '; ' + attributeName;\n\t\t\t\tif (attributes[attributeName] === true) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Considers RFC 6265 section 5.2:\n\t\t\t\t// ...\n\t\t\t\t// 3. If the remaining unparsed-attributes contains a %x3B (\";\")\n\t\t\t\t// character:\n\t\t\t\t// Consume the characters of the unparsed-attributes up to,\n\t\t\t\t// not including, the first %x3B (\";\") character.\n\t\t\t\t// ...\n\t\t\t\tstringifiedAttributes += '=' + attributes[attributeName].split(';')[0];\n\t\t\t}\n\n\t\t\treturn (document.cookie = key + '=' + value + stringifiedAttributes);\n\t\t}\n\n\t\tfunction get (key, json) {\n\t\t\tif (typeof document === 'undefined') {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar jar = {};\n\t\t\t// To prevent the for loop in the first place assign an empty array\n\t\t\t// in case there are no cookies at all.\n\t\t\tvar cookies = document.cookie ? document.cookie.split('; ') : [];\n\t\t\tvar i = 0;\n\n\t\t\tfor (; i < cookies.length; i++) {\n\t\t\t\tvar parts = cookies[i].split('=');\n\t\t\t\tvar cookie = parts.slice(1).join('=');\n\n\t\t\t\tif (!json && cookie.charAt(0) === '\"') {\n\t\t\t\t\tcookie = cookie.slice(1, -1);\n\t\t\t\t}\n\n\t\t\t\ttry {\n\t\t\t\t\tvar name = decode(parts[0]);\n\t\t\t\t\tcookie = (converter.read || converter)(cookie, name) ||\n\t\t\t\t\t\tdecode(cookie);\n\n\t\t\t\t\tif (json) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tcookie = JSON.parse(cookie);\n\t\t\t\t\t\t} catch (e) {}\n\t\t\t\t\t}\n\n\t\t\t\t\tjar[name] = cookie;\n\n\t\t\t\t\tif (key === name) {\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t} catch (e) {}\n\t\t\t}\n\n\t\t\treturn key ? jar[key] : jar;\n\t\t}\n\n\t\tapi.set = set;\n\t\tapi.get = function (key) {\n\t\t\treturn get(key, false /* read as raw */);\n\t\t};\n\t\tapi.getJSON = function (key) {\n\t\t\treturn get(key, true /* read as json */);\n\t\t};\n\t\tapi.remove = function (key, attributes) {\n\t\t\tset(key, '', extend(attributes, {\n\t\t\t\texpires: -1\n\t\t\t}));\n\t\t};\n\n\t\tapi.defaults = {};\n\n\t\tapi.withConverter = init;\n\n\t\treturn api;\n\t}\n\n\treturn init(function () {});\n}));\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/js-cookie/src/js.cookie.js\n// module id = 5\n// module chunks = 0\n//# sourceURL=webpack:///./~/js-cookie/src/js.cookie.js?")},function(module,exports,__webpack_require__){eval("'use strict';\n\nvar __chunk_1 = __webpack_require__(1);\n\nvar f = Object.getOwnPropertySymbols;\n\nvar _objectGops = {\n\tf: f\n};\n\nvar f$1 = {}.propertyIsEnumerable;\n\nvar _objectPie = {\n\tf: f$1\n};\n\n// 7.1.13 ToObject(argument)\n\nvar _toObject = function (it) {\n return Object(__chunk_1.defined(it));\n};\n\n// 19.1.2.1 Object.assign(target, source, ...)\n\n\n\n\n\n\nvar $assign = Object.assign;\n\n// should work with symbols and should have deterministic property order (V8 bug)\nvar _objectAssign = !$assign || __chunk_1.fails(function () {\n var A = {};\n var B = {};\n // eslint-disable-next-line no-undef\n var S = Symbol();\n var K = 'abcdefghijklmnopqrst';\n A[S] = 7;\n K.split('').forEach(function (k) { B[k] = k; });\n return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K;\n}) ? function assign(target, source) { // eslint-disable-line no-unused-vars\n var T = _toObject(target);\n var aLen = arguments.length;\n var index = 1;\n var getSymbols = _objectGops.f;\n var isEnum = _objectPie.f;\n while (aLen > index) {\n var S = __chunk_1.IObject(arguments[index++]);\n var keys = getSymbols ? __chunk_1.$keys(S).concat(getSymbols(S)) : __chunk_1.$keys(S);\n var length = keys.length;\n var j = 0;\n var key;\n while (length > j) {\n key = keys[j++];\n if (!__chunk_1.DESCRIPTORS || isEnum.call(S, key)) T[key] = S[key];\n }\n } return T;\n} : $assign;\n\n// 19.1.3.1 Object.assign(target, source)\n\n\n__chunk_1.$export(__chunk_1.$export.S + __chunk_1.$export.F, 'Object', { assign: _objectAssign });\n\nvar assign = __chunk_1.core.Object.assign;\n\nvar assign$1 = assign;\n\n// most Object methods by ES6 should accept primitives\n\n\n\nvar _objectSap = function (KEY, exec) {\n var fn = (__chunk_1.core.Object || {})[KEY] || Object[KEY];\n var exp = {};\n exp[KEY] = exec(fn);\n __chunk_1.$export(__chunk_1.$export.S + __chunk_1.$export.F * __chunk_1.fails(function () { fn(1); }), 'Object', exp);\n};\n\n// 19.1.2.14 Object.keys(O)\n\n\n\n_objectSap('keys', function () {\n return function keys(it) {\n return __chunk_1.$keys(_toObject(it));\n };\n});\n\nvar keys = __chunk_1.core.Object.keys;\n\nvar keys$1 = keys;\n\nexports._Object$assign = assign$1;\nexports._Object$keys = keys$1;\nexports.assign = assign$1;\nexports.toObject = _toObject;\n//# sourceMappingURL=chunk-ff3464e9.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/comments/lib/chunk-ff3464e9.js\n// module id = 6\n// module chunks = 0\n//# sourceURL=webpack:///./~/comments/lib/chunk-ff3464e9.js?")},function(module,exports){eval("var cid = 1;\n\nfunction buildParams(params) {\n var result = [];\n\n for (var i in params) {\n result.push(encodeURIComponent(i) + '=' + encodeURIComponent(params[i]));\n }\n\n return result.join('&');\n}\n\nmodule.exports = function jsonpAdapter(config) {\n return new Promise(function(resolve, reject) {\n var script = document.createElement('script');\n var src = config.url;\n\n if (config.params) {\n var params = buildParams(config.params);\n\n if (params) {\n src += (src.indexOf('?') >= 0 ? '&' : '?') + params;\n }\n }\n\n script.async = true;\n\n function remove() {\n if (script) {\n script.onload = script.onreadystatechange = script.onerror = null;\n\n if (script.parentNode) {\n script.parentNode.removeChild(script);\n }\n\n script = null;\n }\n }\n\n var jsonp = 'axiosJsonpCallback' + cid++;\n var old = window[jsonp];\n var isAbort = false;\n\n window[jsonp] = function(responseData) {\n window[jsonp] = old;\n\n if (isAbort) {\n return;\n }\n \n var response = {\n data: responseData,\n status: 200\n }\n\n resolve(response);\n };\n\n var additionalParams = {\n _: (new Date().getTime())\n };\n \n additionalParams[config.callbackParamName || 'callback'] = jsonp;\n\n src += (src.indexOf('?') >= 0 ? '&' : '?') + buildParams(additionalParams);\n\n script.onload = script.onreadystatechange = function() {\n if (!script.readyState || /loaded|complete/.test(script.readyState)) {\n remove();\n }\n };\n\n script.onerror = function() {\n remove();\n\n reject(new Error('Network Error'));\n };\n\n if (config.cancelToken) {\n config.cancelToken.promise.then(function(cancel) {\n if (!script) {\n return;\n }\n\n isAbort = true;\n\n reject(cancel);\n });\n } \n\n script.src = src;\n\n document.head.appendChild(script);\n });\n};\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/axios-jsonp/lib/index.js\n// module id = 7\n// module chunks = 0\n//# sourceURL=webpack:///./~/axios-jsonp/lib/index.js?")},function(module,exports,__webpack_require__){eval("'use strict';\n\nvar __chunk_1 = __webpack_require__(1);\n\nvar $JSON = __chunk_1.core.JSON || (__chunk_1.core.JSON = { stringify: JSON.stringify });\nvar stringify = function stringify(it) { // eslint-disable-line no-unused-vars\n return $JSON.stringify.apply($JSON, arguments);\n};\n\nvar stringify$1 = stringify;\n\nexports._JSON$stringify = stringify$1;\n//# sourceMappingURL=chunk-77a36b54.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/comments/lib/chunk-77a36b54.js\n// module id = 8\n// module chunks = 0\n//# sourceURL=webpack:///./~/comments/lib/chunk-77a36b54.js?")},function(module,exports,__webpack_require__){eval("/* WEBPACK VAR INJECTION */(function(process) {'use strict';\n\nfunction _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }\n\nvar __chunk_1 = __webpack_require__(1);\nvar __chunk_2 = __webpack_require__(6);\nvar feUtils = __webpack_require__(10);\nvar Cookies = _interopDefault(__webpack_require__(5));\nvar jsonpAdapter = _interopDefault(__webpack_require__(7));\n\n// 7.2.2 IsArray(argument)\n\nvar _isArray = Array.isArray || function isArray(arg) {\n return __chunk_1.require$$1(arg) == 'Array';\n};\n\n// 22.1.2.2 / 15.4.3.2 Array.isArray(arg)\n\n\n__chunk_1.$export(__chunk_1.$export.S, 'Array', { isArray: _isArray });\n\nvar isArray = __chunk_1.core.Array.isArray;\n\nvar isArray$1 = isArray;\n\n// true -> String#at\n// false -> String#codePointAt\nvar _stringAt = function (TO_STRING) {\n return function (that, pos) {\n var s = String(__chunk_1.defined(that));\n var i = __chunk_1.toInteger(pos);\n var l = s.length;\n var a, b;\n if (i < 0 || i >= l) return TO_STRING ? '' : undefined;\n a = s.charCodeAt(i);\n return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff\n ? TO_STRING ? s.charAt(i) : a\n : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;\n };\n};\n\nvar _redefine = __chunk_1.hide;\n\nvar _iterators = {};\n\nvar _wks = __chunk_1.createCommonjsModule(function (module) {\nvar store = __chunk_1.require$$0('wks');\n\nvar Symbol = __chunk_1.global.Symbol;\nvar USE_SYMBOL = typeof Symbol == 'function';\n\nvar $exports = module.exports = function (name) {\n return store[name] || (store[name] =\n USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : __chunk_1.uid)('Symbol.' + name));\n};\n\n$exports.store = store;\n});\n\nvar def = __chunk_1.dP.f;\n\nvar TAG = _wks('toStringTag');\n\nvar _setToStringTag = function (it, tag, stat) {\n if (it && !__chunk_1.has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag });\n};\n\nvar IteratorPrototype = {};\n\n// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\n__chunk_1.hide(IteratorPrototype, _wks('iterator'), function () { return this; });\n\nvar _iterCreate = function (Constructor, NAME, next) {\n Constructor.prototype = __chunk_1.create(IteratorPrototype, { next: __chunk_1.descriptor(1, next) });\n _setToStringTag(Constructor, NAME + ' Iterator');\n};\n\n// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)\n\n\nvar IE_PROTO = __chunk_1.require$$0$1('IE_PROTO');\nvar ObjectProto = Object.prototype;\n\nvar _objectGpo = Object.getPrototypeOf || function (O) {\n O = __chunk_2.toObject(O);\n if (__chunk_1.has(O, IE_PROTO)) return O[IE_PROTO];\n if (typeof O.constructor == 'function' && O instanceof O.constructor) {\n return O.constructor.prototype;\n } return O instanceof Object ? ObjectProto : null;\n};\n\nvar ITERATOR = _wks('iterator');\nvar BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`\nvar FF_ITERATOR = '@@iterator';\nvar KEYS = 'keys';\nvar VALUES = 'values';\n\nvar returnThis = function () { return this; };\n\nvar _iterDefine = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {\n _iterCreate(Constructor, NAME, next);\n var getMethod = function (kind) {\n if (!BUGGY && kind in proto) return proto[kind];\n switch (kind) {\n case KEYS: return function keys() { return new Constructor(this, kind); };\n case VALUES: return function values() { return new Constructor(this, kind); };\n } return function entries() { return new Constructor(this, kind); };\n };\n var TAG = NAME + ' Iterator';\n var DEF_VALUES = DEFAULT == VALUES;\n var VALUES_BUG = false;\n var proto = Base.prototype;\n var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];\n var $default = $native || getMethod(DEFAULT);\n var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;\n var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;\n var methods, key, IteratorPrototype;\n // Fix native\n if ($anyNative) {\n IteratorPrototype = _objectGpo($anyNative.call(new Base()));\n if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {\n // Set @@toStringTag to native iterators\n _setToStringTag(IteratorPrototype, TAG, true);\n }\n }\n // fix Array#{values, @@iterator}.name in V8 / FF\n if (DEF_VALUES && $native && $native.name !== VALUES) {\n VALUES_BUG = true;\n $default = function values() { return $native.call(this); };\n }\n // Define iterator\n if ((FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {\n __chunk_1.hide(proto, ITERATOR, $default);\n }\n // Plug for library\n _iterators[NAME] = $default;\n _iterators[TAG] = returnThis;\n if (DEFAULT) {\n methods = {\n values: DEF_VALUES ? $default : getMethod(VALUES),\n keys: IS_SET ? $default : getMethod(KEYS),\n entries: $entries\n };\n if (FORCED) for (key in methods) {\n if (!(key in proto)) _redefine(proto, key, methods[key]);\n } else __chunk_1.$export(__chunk_1.$export.P + __chunk_1.$export.F * (BUGGY || VALUES_BUG), NAME, methods);\n }\n return methods;\n};\n\nvar $at = _stringAt(true);\n\n// 21.1.3.27 String.prototype[@@iterator]()\n_iterDefine(String, 'String', function (iterated) {\n this._t = String(iterated); // target\n this._i = 0; // next index\n// 21.1.5.2.1 %StringIteratorPrototype%.next()\n}, function () {\n var O = this._t;\n var index = this._i;\n var point;\n if (index >= O.length) return { value: undefined, done: true };\n point = $at(O, index);\n this._i += point.length;\n return { value: point, done: false };\n});\n\nvar _iterStep = function (done, value) {\n return { value: value, done: !!done };\n};\n\n// 22.1.3.4 Array.prototype.entries()\n// 22.1.3.13 Array.prototype.keys()\n// 22.1.3.29 Array.prototype.values()\n// 22.1.3.30 Array.prototype[@@iterator]()\nvar es6_array_iterator = _iterDefine(Array, 'Array', function (iterated, kind) {\n this._t = __chunk_1.toIObject(iterated); // target\n this._i = 0; // next index\n this._k = kind; // kind\n// 22.1.5.2.1 %ArrayIteratorPrototype%.next()\n}, function () {\n var O = this._t;\n var kind = this._k;\n var index = this._i++;\n if (!O || index >= O.length) {\n this._t = undefined;\n return _iterStep(1);\n }\n if (kind == 'keys') return _iterStep(0, index);\n if (kind == 'values') return _iterStep(0, O[index]);\n return _iterStep(0, [index, O[index]]);\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)\n_iterators.Arguments = _iterators.Array;\n\nvar TO_STRING_TAG = _wks('toStringTag');\n\nvar DOMIterables = ('CSSRuleList,CSSStyleDeclaration,CSSValueList,ClientRectList,DOMRectList,DOMStringList,' +\n 'DOMTokenList,DataTransferItemList,FileList,HTMLAllCollection,HTMLCollection,HTMLFormElement,HTMLSelectElement,' +\n 'MediaList,MimeTypeArray,NamedNodeMap,NodeList,PaintRequestList,Plugin,PluginArray,SVGLengthList,SVGNumberList,' +\n 'SVGPathSegList,SVGPointList,SVGStringList,SVGTransformList,SourceBufferList,StyleSheetList,TextTrackCueList,' +\n 'TextTrackList,TouchList').split(',');\n\nfor (var i = 0; i < DOMIterables.length; i++) {\n var NAME = DOMIterables[i];\n var Collection = __chunk_1.global[NAME];\n var proto = Collection && Collection.prototype;\n if (proto && !proto[TO_STRING_TAG]) __chunk_1.hide(proto, TO_STRING_TAG, NAME);\n _iterators[NAME] = _iterators.Array;\n}\n\n// getting tag from 19.1.3.6 Object.prototype.toString()\n\nvar TAG$1 = _wks('toStringTag');\n// ES3 wrong here\nvar ARG = __chunk_1.require$$1(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 (e) { /* empty */ }\n};\n\nvar _classof = function (it) {\n var O, T, B;\n return it === undefined ? 'Undefined' : it === null ? 'Null'\n // @@toStringTag case\n : typeof (T = tryGet(O = Object(it), TAG$1)) == 'string' ? T\n // builtinTag case\n : ARG ? __chunk_1.require$$1(O)\n // ES3 arguments fallback\n : (B = __chunk_1.require$$1(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;\n};\n\nvar _anInstance = function (it, Constructor, name, forbiddenField) {\n if (!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)) {\n throw TypeError(name + ': incorrect invocation!');\n } return it;\n};\n\n// call something on iterator step with safe closing on error\n\nvar _iterCall = function (iterator, fn, value, entries) {\n try {\n return entries ? fn(__chunk_1.anObject(value)[0], value[1]) : fn(value);\n // 7.4.6 IteratorClose(iterator, completion)\n } catch (e) {\n var ret = iterator['return'];\n if (ret !== undefined) __chunk_1.anObject(ret.call(iterator));\n throw e;\n }\n};\n\n// check on default Array iterator\n\nvar ITERATOR$1 = _wks('iterator');\nvar ArrayProto = Array.prototype;\n\nvar _isArrayIter = function (it) {\n return it !== undefined && (_iterators.Array === it || ArrayProto[ITERATOR$1] === it);\n};\n\nvar ITERATOR$2 = _wks('iterator');\n\nvar core_getIteratorMethod = __chunk_1.core.getIteratorMethod = function (it) {\n if (it != undefined) return it[ITERATOR$2]\n || it['@@iterator']\n || _iterators[_classof(it)];\n};\n\nvar _forOf = __chunk_1.createCommonjsModule(function (module) {\nvar BREAK = {};\nvar RETURN = {};\nvar exports = module.exports = function (iterable, entries, fn, that, ITERATOR) {\n var iterFn = ITERATOR ? function () { return iterable; } : core_getIteratorMethod(iterable);\n var f = __chunk_1.ctx(fn, that, entries ? 2 : 1);\n var index = 0;\n var length, step, iterator, result;\n if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!');\n // fast case for arrays with default iterator\n if (_isArrayIter(iterFn)) for (length = __chunk_1.toLength(iterable.length); length > index; index++) {\n result = entries ? f(__chunk_1.anObject(step = iterable[index])[0], step[1]) : f(iterable[index]);\n if (result === BREAK || result === RETURN) return result;\n } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) {\n result = _iterCall(iterator, f, step.value, entries);\n if (result === BREAK || result === RETURN) return result;\n }\n};\nexports.BREAK = BREAK;\nexports.RETURN = RETURN;\n});\n\n// 7.3.20 SpeciesConstructor(O, defaultConstructor)\n\n\nvar SPECIES = _wks('species');\nvar _speciesConstructor = function (O, D) {\n var C = __chunk_1.anObject(O).constructor;\n var S;\n return C === undefined || (S = __chunk_1.anObject(C)[SPECIES]) == undefined ? D : __chunk_1.aFunction(S);\n};\n\n// fast apply, http://jsperf.lnkit.com/fast-apply/5\nvar _invoke = function (fn, args, that) {\n var un = that === undefined;\n switch (args.length) {\n case 0: return un ? fn()\n : fn.call(that);\n case 1: return un ? fn(args[0])\n : fn.call(that, args[0]);\n case 2: return un ? fn(args[0], args[1])\n : fn.call(that, args[0], args[1]);\n case 3: return un ? fn(args[0], args[1], args[2])\n : fn.call(that, args[0], args[1], args[2]);\n case 4: return un ? fn(args[0], args[1], args[2], args[3])\n : fn.call(that, args[0], args[1], args[2], args[3]);\n } return fn.apply(that, args);\n};\n\nvar process$1 = __chunk_1.global.process;\nvar setTask = __chunk_1.global.setImmediate;\nvar clearTask = __chunk_1.global.clearImmediate;\nvar MessageChannel = __chunk_1.global.MessageChannel;\nvar Dispatch = __chunk_1.global.Dispatch;\nvar counter = 0;\nvar queue = {};\nvar ONREADYSTATECHANGE = 'onreadystatechange';\nvar defer, channel, port;\nvar run = function () {\n var id = +this;\n // eslint-disable-next-line no-prototype-builtins\n if (queue.hasOwnProperty(id)) {\n var fn = queue[id];\n delete queue[id];\n fn();\n }\n};\nvar listener = function (event) {\n run.call(event.data);\n};\n// Node.js 0.9+ & IE10+ has setImmediate, otherwise:\nif (!setTask || !clearTask) {\n setTask = function setImmediate(fn) {\n var args = [];\n var i = 1;\n while (arguments.length > i) args.push(arguments[i++]);\n queue[++counter] = function () {\n // eslint-disable-next-line no-new-func\n _invoke(typeof fn == 'function' ? fn : Function(fn), args);\n };\n defer(counter);\n return counter;\n };\n clearTask = function clearImmediate(id) {\n delete queue[id];\n };\n // Node.js 0.8-\n if (__chunk_1.require$$1(process$1) == 'process') {\n defer = function (id) {\n process$1.nextTick(__chunk_1.ctx(run, id, 1));\n };\n // Sphere (JS game engine) Dispatch API\n } else if (Dispatch && Dispatch.now) {\n defer = function (id) {\n Dispatch.now(__chunk_1.ctx(run, id, 1));\n };\n // Browsers with MessageChannel, includes WebWorkers\n } else if (MessageChannel) {\n channel = new MessageChannel();\n port = channel.port2;\n channel.port1.onmessage = listener;\n defer = __chunk_1.ctx(port.postMessage, port, 1);\n // Browsers with postMessage, skip WebWorkers\n // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'\n } else if (__chunk_1.global.addEventListener && typeof postMessage == 'function' && !__chunk_1.global.importScripts) {\n defer = function (id) {\n __chunk_1.global.postMessage(id + '', '*');\n };\n __chunk_1.global.addEventListener('message', listener, false);\n // IE8-\n } else if (ONREADYSTATECHANGE in __chunk_1.cel('script')) {\n defer = function (id) {\n __chunk_1.html.appendChild(__chunk_1.cel('script'))[ONREADYSTATECHANGE] = function () {\n __chunk_1.html.removeChild(this);\n run.call(id);\n };\n };\n // Rest old browsers\n } else {\n defer = function (id) {\n setTimeout(__chunk_1.ctx(run, id, 1), 0);\n };\n }\n}\nvar _task = {\n set: setTask,\n clear: clearTask\n};\n\nvar macrotask = _task.set;\nvar Observer = __chunk_1.global.MutationObserver || __chunk_1.global.WebKitMutationObserver;\nvar process$2 = __chunk_1.global.process;\nvar Promise = __chunk_1.global.Promise;\nvar isNode = __chunk_1.require$$1(process$2) == 'process';\n\nvar _microtask = function () {\n var head, last, notify;\n\n var flush = function () {\n var parent, fn;\n if (isNode && (parent = process$2.domain)) parent.exit();\n while (head) {\n fn = head.fn;\n head = head.next;\n try {\n fn();\n } catch (e) {\n if (head) notify();\n else last = undefined;\n throw e;\n }\n } last = undefined;\n if (parent) parent.enter();\n };\n\n // Node.js\n if (isNode) {\n notify = function () {\n process$2.nextTick(flush);\n };\n // browsers with MutationObserver, except iOS Safari - https://github.com/zloirock/core-js/issues/339\n } else if (Observer && !(__chunk_1.global.navigator && __chunk_1.global.navigator.standalone)) {\n var toggle = true;\n var node = document.createTextNode('');\n new Observer(flush).observe(node, { characterData: true }); // eslint-disable-line no-new\n notify = function () {\n node.data = toggle = !toggle;\n };\n // environments with maybe non-completely correct, but existent Promise\n } else if (Promise && Promise.resolve) {\n // Promise.resolve without an argument throws an error in LG WebOS 2\n var promise = Promise.resolve(undefined);\n notify = function () {\n promise.then(flush);\n };\n // for other environments - macrotask based on:\n // - setImmediate\n // - MessageChannel\n // - window.postMessag\n // - onreadystatechange\n // - setTimeout\n } else {\n notify = function () {\n // strange IE + webpack dev server bug - use .call(global)\n macrotask.call(__chunk_1.global, flush);\n };\n }\n\n return function (fn) {\n var task = { fn: fn, next: undefined };\n if (last) last.next = task;\n if (!head) {\n head = task;\n notify();\n } last = task;\n };\n};\n\n// 25.4.1.5 NewPromiseCapability(C)\n\n\nfunction PromiseCapability(C) {\n var resolve, reject;\n this.promise = new C(function ($$resolve, $$reject) {\n if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');\n resolve = $$resolve;\n reject = $$reject;\n });\n this.resolve = __chunk_1.aFunction(resolve);\n this.reject = __chunk_1.aFunction(reject);\n}\n\nvar f = function (C) {\n return new PromiseCapability(C);\n};\n\nvar _newPromiseCapability = {\n\tf: f\n};\n\nvar _perform = function (exec) {\n try {\n return { e: false, v: exec() };\n } catch (e) {\n return { e: true, v: e };\n }\n};\n\nvar navigator = __chunk_1.global.navigator;\n\nvar _userAgent = navigator && navigator.userAgent || '';\n\nvar _promiseResolve = function (C, x) {\n __chunk_1.anObject(C);\n if (__chunk_1.isObject(x) && x.constructor === C) return x;\n var promiseCapability = _newPromiseCapability.f(C);\n var resolve = promiseCapability.resolve;\n resolve(x);\n return promiseCapability.promise;\n};\n\nvar _redefineAll = function (target, src, safe) {\n for (var key in src) {\n if (safe && target[key]) target[key] = src[key];\n else __chunk_1.hide(target, key, src[key]);\n } return target;\n};\n\nvar SPECIES$1 = _wks('species');\n\nvar _setSpecies = function (KEY) {\n var C = typeof __chunk_1.core[KEY] == 'function' ? __chunk_1.core[KEY] : __chunk_1.global[KEY];\n if (__chunk_1.DESCRIPTORS && C && !C[SPECIES$1]) __chunk_1.dP.f(C, SPECIES$1, {\n configurable: true,\n get: function () { return this; }\n });\n};\n\nvar ITERATOR$3 = _wks('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n var riter = [7][ITERATOR$3]();\n riter['return'] = function () { SAFE_CLOSING = true; };\n} catch (e) { /* empty */ }\n\nvar _iterDetect = function (exec, skipClosing) {\n if (!skipClosing && !SAFE_CLOSING) return false;\n var safe = false;\n try {\n var arr = [7];\n var iter = arr[ITERATOR$3]();\n iter.next = function () { return { done: safe = true }; };\n arr[ITERATOR$3] = function () { return iter; };\n exec(arr);\n } catch (e) { /* empty */ }\n return safe;\n};\n\nvar task = _task.set;\nvar microtask = _microtask();\n\n\n\n\nvar PROMISE = 'Promise';\nvar TypeError$1 = __chunk_1.global.TypeError;\nvar process$3 = __chunk_1.global.process;\nvar versions = process$3 && process$3.versions;\nvar v8 = versions && versions.v8 || '';\nvar $Promise = __chunk_1.global[PROMISE];\nvar isNode$1 = _classof(process$3) == 'process';\nvar empty = function () { /* empty */ };\nvar Internal, newGenericPromiseCapability, OwnPromiseCapability, Wrapper;\nvar newPromiseCapability = newGenericPromiseCapability = _newPromiseCapability.f;\n\nvar USE_NATIVE = !!function () {\n try {\n // correct subclassing with @@species support\n var promise = $Promise.resolve(1);\n var FakePromise = (promise.constructor = {})[_wks('species')] = function (exec) {\n exec(empty, empty);\n };\n // unhandled rejections tracking support, NodeJS Promise without it fails @@species test\n return (isNode$1 || typeof PromiseRejectionEvent == 'function')\n && promise.then(empty) instanceof FakePromise\n // v8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables\n // https://bugs.chromium.org/p/chromium/issues/detail?id=830565\n // we can't detect it synchronously, so just check versions\n && v8.indexOf('6.6') !== 0\n && _userAgent.indexOf('Chrome/66') === -1;\n } catch (e) { /* empty */ }\n}();\n\n// helpers\nvar isThenable = function (it) {\n var then;\n return __chunk_1.isObject(it) && typeof (then = it.then) == 'function' ? then : false;\n};\nvar notify = function (promise, isReject) {\n if (promise._n) return;\n promise._n = true;\n var chain = promise._c;\n microtask(function () {\n var value = promise._v;\n var ok = promise._s == 1;\n var i = 0;\n var run = function (reaction) {\n var handler = ok ? reaction.ok : reaction.fail;\n var resolve = reaction.resolve;\n var reject = reaction.reject;\n var domain = reaction.domain;\n var result, then, exited;\n try {\n if (handler) {\n if (!ok) {\n if (promise._h == 2) onHandleUnhandled(promise);\n promise._h = 1;\n }\n if (handler === true) result = value;\n else {\n if (domain) domain.enter();\n result = handler(value); // may throw\n if (domain) {\n domain.exit();\n exited = true;\n }\n }\n if (result === reaction.promise) {\n reject(TypeError$1('Promise-chain cycle'));\n } else if (then = isThenable(result)) {\n then.call(result, resolve, reject);\n } else resolve(result);\n } else reject(value);\n } catch (e) {\n if (domain && !exited) domain.exit();\n reject(e);\n }\n };\n while (chain.length > i) run(chain[i++]); // variable length - can't use forEach\n promise._c = [];\n promise._n = false;\n if (isReject && !promise._h) onUnhandled(promise);\n });\n};\nvar onUnhandled = function (promise) {\n task.call(__chunk_1.global, function () {\n var value = promise._v;\n var unhandled = isUnhandled(promise);\n var result, handler, console;\n if (unhandled) {\n result = _perform(function () {\n if (isNode$1) {\n process$3.emit('unhandledRejection', value, promise);\n } else if (handler = __chunk_1.global.onunhandledrejection) {\n handler({ promise: promise, reason: value });\n } else if ((console = __chunk_1.global.console) && console.error) {\n console.error('Unhandled promise rejection', value);\n }\n });\n // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should\n promise._h = isNode$1 || isUnhandled(promise) ? 2 : 1;\n } promise._a = undefined;\n if (unhandled && result.e) throw result.v;\n });\n};\nvar isUnhandled = function (promise) {\n return promise._h !== 1 && (promise._a || promise._c).length === 0;\n};\nvar onHandleUnhandled = function (promise) {\n task.call(__chunk_1.global, function () {\n var handler;\n if (isNode$1) {\n process$3.emit('rejectionHandled', promise);\n } else if (handler = __chunk_1.global.onrejectionhandled) {\n handler({ promise: promise, reason: promise._v });\n }\n });\n};\nvar $reject = function (value) {\n var promise = this;\n if (promise._d) return;\n promise._d = true;\n promise = promise._w || promise; // unwrap\n promise._v = value;\n promise._s = 2;\n if (!promise._a) promise._a = promise._c.slice();\n notify(promise, true);\n};\nvar $resolve = function (value) {\n var promise = this;\n var then;\n if (promise._d) return;\n promise._d = true;\n promise = promise._w || promise; // unwrap\n try {\n if (promise === value) throw TypeError$1(\"Promise can't be resolved itself\");\n if (then = isThenable(value)) {\n microtask(function () {\n var wrapper = { _w: promise, _d: false }; // wrap\n try {\n then.call(value, __chunk_1.ctx($resolve, wrapper, 1), __chunk_1.ctx($reject, wrapper, 1));\n } catch (e) {\n $reject.call(wrapper, e);\n }\n });\n } else {\n promise._v = value;\n promise._s = 1;\n notify(promise, false);\n }\n } catch (e) {\n $reject.call({ _w: promise, _d: false }, e); // wrap\n }\n};\n\n// constructor polyfill\nif (!USE_NATIVE) {\n // 25.4.3.1 Promise(executor)\n $Promise = function Promise(executor) {\n _anInstance(this, $Promise, PROMISE, '_h');\n __chunk_1.aFunction(executor);\n Internal.call(this);\n try {\n executor(__chunk_1.ctx($resolve, this, 1), __chunk_1.ctx($reject, this, 1));\n } catch (err) {\n $reject.call(this, err);\n }\n };\n // eslint-disable-next-line no-unused-vars\n Internal = function Promise(executor) {\n this._c = []; // <- awaiting reactions\n this._a = undefined; // <- checked in isUnhandled reactions\n this._s = 0; // <- state\n this._d = false; // <- done\n this._v = undefined; // <- value\n this._h = 0; // <- rejection state, 0 - default, 1 - handled, 2 - unhandled\n this._n = false; // <- notify\n };\n Internal.prototype = _redefineAll($Promise.prototype, {\n // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected)\n then: function then(onFulfilled, onRejected) {\n var reaction = newPromiseCapability(_speciesConstructor(this, $Promise));\n reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;\n reaction.fail = typeof onRejected == 'function' && onRejected;\n reaction.domain = isNode$1 ? process$3.domain : undefined;\n this._c.push(reaction);\n if (this._a) this._a.push(reaction);\n if (this._s) notify(this, false);\n return reaction.promise;\n },\n // 25.4.5.1 Promise.prototype.catch(onRejected)\n 'catch': function (onRejected) {\n return this.then(undefined, onRejected);\n }\n });\n OwnPromiseCapability = function () {\n var promise = new Internal();\n this.promise = promise;\n this.resolve = __chunk_1.ctx($resolve, promise, 1);\n this.reject = __chunk_1.ctx($reject, promise, 1);\n };\n _newPromiseCapability.f = newPromiseCapability = function (C) {\n return C === $Promise || C === Wrapper\n ? new OwnPromiseCapability(C)\n : newGenericPromiseCapability(C);\n };\n}\n\n__chunk_1.$export(__chunk_1.$export.G + __chunk_1.$export.W + __chunk_1.$export.F * !USE_NATIVE, { Promise: $Promise });\n_setToStringTag($Promise, PROMISE);\n_setSpecies(PROMISE);\nWrapper = __chunk_1.core[PROMISE];\n\n// statics\n__chunk_1.$export(__chunk_1.$export.S + __chunk_1.$export.F * !USE_NATIVE, PROMISE, {\n // 25.4.4.5 Promise.reject(r)\n reject: function reject(r) {\n var capability = newPromiseCapability(this);\n var $$reject = capability.reject;\n $$reject(r);\n return capability.promise;\n }\n});\n__chunk_1.$export(__chunk_1.$export.S + __chunk_1.$export.F * (__chunk_1.LIBRARY), PROMISE, {\n // 25.4.4.6 Promise.resolve(x)\n resolve: function resolve(x) {\n return _promiseResolve(this === Wrapper ? $Promise : this, x);\n }\n});\n__chunk_1.$export(__chunk_1.$export.S + __chunk_1.$export.F * !(USE_NATIVE && _iterDetect(function (iter) {\n $Promise.all(iter)['catch'](empty);\n})), PROMISE, {\n // 25.4.4.1 Promise.all(iterable)\n all: function all(iterable) {\n var C = this;\n var capability = newPromiseCapability(C);\n var resolve = capability.resolve;\n var reject = capability.reject;\n var result = _perform(function () {\n var values = [];\n var index = 0;\n var remaining = 1;\n _forOf(iterable, false, function (promise) {\n var $index = index++;\n var alreadyCalled = false;\n values.push(undefined);\n remaining++;\n C.resolve(promise).then(function (value) {\n if (alreadyCalled) return;\n alreadyCalled = true;\n values[$index] = value;\n --remaining || resolve(values);\n }, reject);\n });\n --remaining || resolve(values);\n });\n if (result.e) reject(result.v);\n return capability.promise;\n },\n // 25.4.4.4 Promise.race(iterable)\n race: function race(iterable) {\n var C = this;\n var capability = newPromiseCapability(C);\n var reject = capability.reject;\n var result = _perform(function () {\n _forOf(iterable, false, function (promise) {\n C.resolve(promise).then(capability.resolve, reject);\n });\n });\n if (result.e) reject(result.v);\n return capability.promise;\n }\n});\n\n__chunk_1.$export(__chunk_1.$export.P + __chunk_1.$export.R, 'Promise', { 'finally': function (onFinally) {\n var C = _speciesConstructor(this, __chunk_1.core.Promise || __chunk_1.global.Promise);\n var isFunction = typeof onFinally == 'function';\n return this.then(\n isFunction ? function (x) {\n return _promiseResolve(C, onFinally()).then(function () { return x; });\n } : onFinally,\n isFunction ? function (e) {\n return _promiseResolve(C, onFinally()).then(function () { throw e; });\n } : onFinally\n );\n} });\n\n// https://github.com/tc39/proposal-promise-try\n\n\n\n\n__chunk_1.$export(__chunk_1.$export.S, 'Promise', { 'try': function (callbackfn) {\n var promiseCapability = _newPromiseCapability.f(this);\n var result = _perform(callbackfn);\n (result.e ? promiseCapability.reject : promiseCapability.resolve)(result.v);\n return promiseCapability.promise;\n} });\n\nvar promise = __chunk_1.core.Promise;\n\nvar promise$1 = promise;\n\nvar IS_DEV = process.env.STORYBOOK_IS_BUILDING;\n\nvar GenerateCommentsAPI = function GenerateCommentsAPI(action) {\n return function (paramsData, customHeaders) {\n // 设置接口地址\n var API_URL_PREFIX = '/j';\n API_URL_PREFIX = window._COMMENTS_CONFIG && window._COMMENTS_CONFIG.api; // 添加评论时,url 里需要带上 TARGET_ID\n\n var TARGET_ID = '';\n\n if (action === 'addComment' || action === 'addReply' || action === 'delete') {\n TARGET_ID = window._COMMENTS_CONFIG && window._COMMENTS_CONFIG.target.id;\n } // 自定义评论相关api\n\n\n var CUSTOM_API = window._COMMENTS_CONFIG && window._COMMENTS_CONFIG.customApi;\n\n if (CUSTOM_API) {\n for (var api in CUSTOM_API) {\n CUSTOM_API[api] = CUSTOM_API[api].replace(':id', TARGET_ID);\n }\n } // 设置 api 地址和 method\n\n\n var _API = '';\n var _method = 'GET';\n\n switch (action) {\n case 'addComment':\n _API = (CUSTOM_API === null || CUSTOM_API === void 0 ? void 0 : CUSTOM_API.addComment) || API_URL_PREFIX + \"/\" + TARGET_ID + \"/add_comment\";\n _method = 'POST';\n break;\n\n case 'addReply':\n _API = (CUSTOM_API === null || CUSTOM_API === void 0 ? void 0 : CUSTOM_API.addReply) || API_URL_PREFIX + \"/\" + TARGET_ID + \"/add_comment\";\n _method = 'POST';\n break;\n\n case 'getReplies':\n if (!paramsData.commentId) {\n console.error('缺少 commentId 参数');\n return;\n }\n\n _API = (CUSTOM_API === null || CUSTOM_API === void 0 ? void 0 : CUSTOM_API.getReplies) || API_URL_PREFIX + \"/comment/\" + paramsData.commentId + \"/replies\";\n _method = 'GET';\n delete paramsData.commentId; // 删掉 commentId,以免影响之后 get 时的 params\n\n break;\n\n case 'delete':\n _API = (CUSTOM_API === null || CUSTOM_API === void 0 ? void 0 : CUSTOM_API.delete) || API_URL_PREFIX + \"/\" + TARGET_ID + \"/remove_comment\";\n _method = 'POST';\n break;\n\n case 'getReportReasons':\n _API = (CUSTOM_API === null || CUSTOM_API === void 0 ? void 0 : CUSTOM_API.getReportReasons) || FRODO_API_PREFIX + \"/api/v2/report/reasons\";\n _method = 'GET';\n break;\n\n case 'submitReport':\n _API = window._COMMENTS_CONFIG && window._COMMENTS_CONFIG.api_report || 'https://www.douban.com/misc/audit_report';\n _method = 'POST';\n break;\n\n case 'getShuo':\n _API = \"https://api.douban.com/shuo/in/complete\";\n _method = 'GET';\n break;\n\n default:\n _API = '';\n } // 组装 data\n\n\n var defaultData = {\n resp_type: 'c_dict',\n ck: Cookies.get('ck')\n };\n\n var data = __chunk_2._Object$assign({}, defaultData, paramsData);\n\n var formData = new FormData();\n var dict = window._COMMENTS_CONFIG ? window._COMMENTS_CONFIG.customParamDict || '' : '';\n\n __chunk_2._Object$keys(data).forEach(function (key) {\n // 自定义评论接口字段\n // customParamDict: { rv_comment: 'text' }\n if (dict) {\n dict[key] && formData.append(dict[key], data[key]);\n }\n\n formData.append(key, data[key]);\n });\n\n var axiosConfig = {\n method: _method,\n url: _API,\n headers: customHeaders || {\n 'Accept': 'application/json, text/javascript, */*; q=0.01',\n 'X-Requested-With': 'XMLHttpRequest',\n 'Content-Type': 'application/json; charset=UTF-8'\n },\n withCredentials: true\n };\n\n if (_method.toLowerCase() === 'post') {\n axiosConfig.data = formData;\n }\n\n if (_method.toLowerCase() === 'get') {\n axiosConfig.params = paramsData;\n\n if (action === 'getShuo') {\n axiosConfig.adapter = jsonpAdapter;\n axiosConfig.headers = {\n 'Content-Type': 'application/x-www-form-urlencoded'\n };\n }\n } // eslint-disable-next-line consistent-return\n\n\n return new promise$1(function (resolve, reject) {\n feUtils.axios(axiosConfig).then(function (resp) {\n return resolve(resp.data);\n }).catch(function (error) {\n return reject(error);\n });\n });\n };\n};\n\nvar CommentsAPI = {\n addComment: GenerateCommentsAPI('addComment'),\n addReply: GenerateCommentsAPI('addReply'),\n delete: GenerateCommentsAPI('delete'),\n getReplies: GenerateCommentsAPI('getReplies'),\n getReportReasons: GenerateCommentsAPI('getReportReasons'),\n submitReport: GenerateCommentsAPI('submitReport'),\n getShuo: GenerateCommentsAPI('getShuo')\n};\nfunction escapeHTML(text) {\n if (!text) {\n return '';\n }\n\n return text.replace(/&/g, '&').replace(//g, '>').replace(/\"/g, '"');\n}\nfunction encodeURIStr(str) {\n // eslint-disable-next-line no-array-constructor\n var regexs = new Array(new RegExp('%', 'g'), new RegExp(',', 'g'), new RegExp('/', 'g'), new RegExp('\\\\?', 'g'), new RegExp(':', 'g'), new RegExp('@', 'g'), new RegExp('&', 'g'), new RegExp('=', 'g'), new RegExp('\\\\+', 'g'), new RegExp('\\\\$', 'g'), new RegExp('#', 'g')); // eslint-disable-next-line no-array-constructor\n\n var replaces = new Array('%25', '%2C', '%2F', '%3F', '%3A', '%40', '%26', '%3D', '%2B', '%24', '%23');\n regexs.forEach(function (reg, index) {\n str = str.replace(reg, replaces[index]);\n });\n return str;\n}\nfunction extractText(text, entities, needEscape) {\n if (needEscape === void 0) {\n needEscape = true;\n }\n\n var urls = entities.urls;\n var userMentions = entities.user_mentions;\n var topics = entities.topics;\n var htmlList = [];\n var entityList = [];\n var result_text = '';\n var start = 0;\n var end = 0;\n var begin = 0;\n var plaintext = '';\n\n var renderUserMentionsTpl = function renderUserMentionsTpl(entity) {\n var uid = entity.uid,\n screen_name = entity.screen_name;\n\n var _screen_name = needEscape ? escapeHTML(screen_name) : screen_name;\n\n var tmpl = \"\" + _screen_name + \"\";\n return tmpl;\n };\n\n var renderUrlsTpl = function renderUrlsTpl(entity) {\n var url = entity.url,\n expanded_url = entity.expanded_url;\n\n var _url = (needEscape ? escapeHTML(url) : url) || expanded_url;\n\n var tmpl = \"\" + _url + \"\";\n return tmpl;\n };\n\n var renderTopicTpl = function renderTopicTpl(entity) {\n var encoded_text = entity.encoded_text;\n\n var _encoded_text = encoded_text || (needEscape ? escapeHTML(text) : text);\n\n var tmpl = \"\" + _encoded_text + \"\";\n return tmpl;\n };\n\n if (urls && isArray$1(urls)) {\n entityList = urls;\n }\n\n if (userMentions && isArray$1(userMentions)) {\n entityList = entityList.concat(userMentions);\n }\n\n if (topics && isArray$1(topics)) {\n entityList = entityList.concat(topics);\n }\n\n entityList.sort(function (a, b) {\n return a.indices[0] - b.indices[0];\n });\n\n if (entityList.length === 0) {\n return needEscape ? escapeHTML(text) : text;\n }\n\n entityList.forEach(function (entity, index) {\n if (entity.uid) {\n htmlList[index] = renderUserMentionsTpl(entity);\n } else if (entity.url) {\n htmlList[index] = renderUrlsTpl(entity);\n } else {\n entity.encoded_text = entity.encoded_text || encodeURIStr(needEscape ? escapeHTML(entity.text) : entity.text);\n htmlList[index] = renderTopicTpl(entity);\n }\n\n begin = index ? end : 0; // eslint-disable-next-line prefer-destructuring\n\n start = entity.indices[0]; // eslint-disable-next-line prefer-destructuring\n\n end = entity.indices[1];\n plaintext = text.substring(begin, start);\n result_text = result_text + (needEscape ? escapeHTML(plaintext) : plaintext) + htmlList[index];\n\n if (index === entityList.length - 1) {\n result_text += needEscape ? escapeHTML(text.substring(end)) : text.substring(end);\n }\n });\n return result_text;\n}\n\n/*\n * @Author: hanjiyun\n * @Date: 2020-08-04 09:58:04\n * @Last Modified by: hanjiyun\n * @Last Modified time: 2022-03-28 17:32:52\n */\nvar MAX_STATUS_LENGTH = 140; // 转发到广播时,最多 140 字\n\nvar MAX_STATUS_COMMENTS_LENGTH = 280; // 广播下的回复,最多 280 字\n\nvar STATUS = 'status';\nvar HTTPS_SHORT_DOUBAN = 'https://douc.cc';\nvar URL_RE = /(http|https):\\/\\/[-._/a-zA-Z0-9~?%#=@:&;*+]+\\b[?#/*]*/;\nvar FRODO_API_PREFIX = IS_DEV ? '' : 'https://m.douban.com/rexxar';\n\nexports.CommentsAPI = CommentsAPI;\nexports.HTTPS_SHORT_DOUBAN = HTTPS_SHORT_DOUBAN;\nexports.IS_DEV = IS_DEV;\nexports.MAX_STATUS_COMMENTS_LENGTH = MAX_STATUS_COMMENTS_LENGTH;\nexports.MAX_STATUS_LENGTH = MAX_STATUS_LENGTH;\nexports.STATUS = STATUS;\nexports.URL_RE = URL_RE;\nexports.extractText = extractText;\n//# sourceMappingURL=chunk-f64b2c7b.js.map\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(27)))\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/comments/lib/chunk-f64b2c7b.js\n// module id = 9\n// module chunks = 0\n//# sourceURL=webpack:///./~/comments/lib/chunk-f64b2c7b.js?");},function(module,exports,__webpack_require__){eval('"use strict";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, "__esModule", { value: true });\n__exportStar(__webpack_require__(102), exports);\n__exportStar(__webpack_require__(113), exports);\n__exportStar(__webpack_require__(21), exports);\n__exportStar(__webpack_require__(104), exports);\n__exportStar(__webpack_require__(127), exports);\n//# sourceMappingURL=index.js.map\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/fe-utils/lib/index.js\n// module id = 10\n// module chunks = 0\n//# sourceURL=webpack:///./~/fe-utils/lib/index.js?')},function(module,exports){eval("'use strict';\n\n/*\n * @Author: hanjiyun\n * @Date: 2019-05-27 00:45:09\n * @Last Modified by: hanjiyun\n * @Last Modified time: 2019-05-27 00:45:43\n */\nvar DEFAULT = 'default';\nvar PENDING = 'pending';\nvar FAIL = 'fail';\nvar SUCCESS = 'success';\n\nexports.DEFAULT = DEFAULT;\nexports.FAIL = FAIL;\nexports.PENDING = PENDING;\nexports.SUCCESS = SUCCESS;\n//# sourceMappingURL=chunk-5571dd26.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/comments/lib/chunk-5571dd26.js\n// module id = 11\n// module chunks = 0\n//# sourceURL=webpack:///./~/comments/lib/chunk-5571dd26.js?")},function(module,exports,__webpack_require__){eval('\'use strict\';\n\nfunction _interopDefault (ex) { return (ex && (typeof ex === \'object\') && \'default\' in ex) ? ex[\'default\'] : ex; }\n\nvar __chunk_1 = __webpack_require__(1);\nvar React = __webpack_require__(2);\nvar React__default = _interopDefault(React);\nvar __chunk_3 = __webpack_require__(4);\nvar __chunk_4 = __webpack_require__(9);\nvar __chunk_6 = __webpack_require__(8);\n\nfunction _assertThisInitialized(self) {\n if (self === void 0) {\n throw new ReferenceError("this hasn\'t been initialised - super() hasn\'t been called");\n }\n\n return self;\n}\n\nvar assertThisInitialized = _assertThisInitialized;\n\nvar css = ".form-input-wrapper {\\n position: relative;\\n border: 1px solid #D9D9D9;\\n border-radius: 3px;\\n}\\n\\n.suggest-wrap {\\n position: absolute;\\n top: 30px;\\n min-width: 120px;\\n border: 1px solid #c5c7d2;\\n border-radius: 3px;\\n font-size: 13px;\\n background: #fff;\\n display: none;\\n z-index: 99;\\n}\\n.suggest-wrap.show {\\n display: block;\\n}\\n.suggest-wrap ul {\\n padding: 3px 0;\\n margin: 0;\\n}\\n.suggest-wrap li {\\n padding: 5px 7px;\\n line-height: 20px;\\n cursor: pointer;\\n text-align: left;\\n}\\n.suggest-wrap li a {\\n color: #333;\\n}\\n.suggest-wrap li a:hover {\\n background: transparent;\\n}\\n.suggest-wrap li.on {\\n background: #e9f0f8;\\n}\\n.suggest-wrap li img {\\n height: 20px;\\n width: 20px;\\n float: left;\\n margin-right: 5px;\\n vertical-align: middle;\\n}\\n\\n.form-pre {\\n position: absolute;\\n opacity: 0;\\n top: 0;\\n left: 0;\\n padding: 10px 8px;\\n margin: 0;\\n white-space: pre-wrap;\\n word-wrap: break-word;\\n overflow: auto;\\n z-index: -1;\\n font: 13px Helvetica, Arial, sans-serif;\\n color: #f00;\\n}\\n.form-pre code {\\n font: 13px Helvetica, Arial, sans-serif;\\n}\\n\\n.form-area {\\n display: block;\\n width: 100%;\\n border: 0;\\n box-sizing: border-box;\\n margin: 0;\\n padding: 10px 8px;\\n outline: none;\\n font-size: 13px;\\n}\\n\\n.form-input {\\n border: 0;\\n padding: 0;\\n flex: 1;\\n outline: none;\\n font-size: 13px;\\n}\\n\\n.img-uploader-wrapper {\\n cursor: pointer;\\n margin: 10px;\\n line-height: 1;\\n}\\n.img-uploader-wrapper .upload-icon {\\n display: inline-block;\\n width: 18px;\\n vertical-align: middle;\\n}\\n.img-uploader-wrapper label {\\n display: inline-block;\\n vertical-align: middle;\\n margin-left: 4px;\\n font-size: 13px;\\n color: #999;\\n line-height: 18px;\\n cursor: pointer;\\n}\\n.img-uploader-wrapper .img-upload-input {\\n position: absolute;\\n left: 0;\\n width: 80px;\\n opacity: 0;\\n z-index: 2;\\n}\\n.img-uploader-wrapper .remove-img {\\n vertical-align: middle;\\n color: #999;\\n}\\n.img-uploader-wrapper .img-preview {\\n display: inline-block;\\n margin-right: 5px;\\n overflow: hidden;\\n vertical-align: middle;\\n}\\n.img-uploader-wrapper .img-preview img {\\n max-height: 48px;\\n max-width: 48px;\\n vertical-align: middle;\\n}";\n__chunk_1.styleInject(css);\n\nvar userSelectPropTypes = {\n type: __chunk_1.PropTypes.string,\n inputType: __chunk_1.PropTypes.string,\n text: __chunk_1.PropTypes.string,\n maxLength: __chunk_1.PropTypes.number,\n username: __chunk_1.PropTypes.string,\n canAtSb: __chunk_1.PropTypes.bool,\n replyUsers: __chunk_1.PropTypes.array,\n handleChange: __chunk_1.PropTypes.func\n};\nvar userSelectDefaultProps = {\n type: \'comment\',\n // 区分是comment回复还是reply回复\n inputType: \'input\',\n // 区分是input=text 还是用的textarea\n text: \'\',\n maxLength: 0,\n // 最长回复,为 0 时不限制长度\n username: \'\',\n // input=text需要知道用户名\n canAtSb: false,\n // 是否能at某个人,目前仅话题可以\n replyUsers: [],\n // at某人时供选择的已过滤的用户列表\n handleSelectUser: function handleSelectUser() {}\n};\n\nvar UserSelect =\n/*#__PURE__*/\nfunction (_Component) {\n __chunk_1._inheritsLoose(UserSelect, _Component);\n\n function UserSelect(props) {\n var _this;\n\n _this = _Component.call(this, props) || this;\n _this.state = {\n text: props.text,\n // 文本框输入内容\n cursor_text: \'\',\n // 光标之前的文本,\n isShowTag: false,\n // @用户时,是否显示用户列表内容\n focusedIndex: 0,\n // @用户时,当前选中的用户\n replyUsers: props.replyUsers,\n // @用户时,用户列表\n objUsers: {},\n // 存放@用户的uid及次数、用户名\n pre_html: \'\',\n // 内容同输入框内容,主要获取当前鼠标位置\n posStyle: {\n // @用户时,用户列表的位置\n top: 0,\n left: 0\n },\n uploaded: props.uploaded,\n // 是否已经上传\n preview_img: \'\' // 上传图片后的预览图\n\n };\n _this.setPreRef = _this.setPreRef.bind(assertThisInitialized(_this));\n _this.setWrapperRef = _this.setWrapperRef.bind(assertThisInitialized(_this));\n _this.handleClickOutside = _this.handleClickOutside.bind(assertThisInitialized(_this));\n return _this;\n }\n\n var _proto = UserSelect.prototype;\n\n _proto.componentDidMount = function componentDidMount() {\n document.addEventListener(\'mousedown\', this.handleClickOutside); // 自动 focus 输入框\n\n if (this.props.type === \'reply\') {\n this._input.focus();\n }\n };\n\n _proto.componentWillUnmount = function componentWillUnmount() {\n document.removeEventListener(\'mousedown\', this.handleClickOutside);\n };\n\n _proto.componentDidUpdate = function componentDidUpdate(prevProps) {\n if (this.props.text !== prevProps.text) {\n this.setSelectPos();\n }\n };\n\n _proto.setPreRef = function setPreRef(node) {\n if (node) {\n this.preRef = node;\n }\n };\n\n _proto.setWrapperRef = function setWrapperRef(node) {\n this.wrapperRef = node;\n };\n\n _proto.setSelectPos = function setSelectPos() {\n var pos_top;\n var pos_left;\n var pre_top;\n var preEl = this.preRef;\n var code = preEl && preEl.querySelector(\'code\');\n var inputEl = this._input;\n pos_top = code && code.offsetTop || 0;\n pos_left = code && code.offsetLeft || 0;\n pre_top = inputEl && inputEl.scrollTop;\n var max_width = inputEl && inputEl.offsetWidth;\n\n if (max_width - pos_left < 120) {\n pos_left -= 120;\n }\n\n if (pre_top) {\n pos_top -= pre_top;\n }\n\n this.setState({\n posStyle: {\n top: pos_top + 20,\n left: pos_left + 5\n }\n });\n };\n\n _proto.handleClickOutside = function handleClickOutside(event) {\n if (this.wrapperRef && !this.wrapperRef.contains(event.target)) {\n this.setState({\n isShowTag: false,\n focusedIndex: 0\n });\n }\n };\n\n _proto.handleMouseEnter = function handleMouseEnter(index) {\n this.setState({\n focusedIndex: index\n });\n };\n\n _proto.handleSelectUser = function handleSelectUser() {\n var _this2 = this;\n var _this$state = this.state,\n text = _this$state.text,\n cursor_text = _this$state.cursor_text,\n replyUsers = _this$state.replyUsers,\n focusedIndex = _this$state.focusedIndex,\n objUsers = _this$state.objUsers;\n var selectedUser = replyUsers[focusedIndex];\n var uid = \'\';\n var username = \'\';\n var count = 0;\n var t;\n clearTimeout(t);\n\n if (!text) {\n return;\n }\n\n if (selectedUser) {\n uid = selectedUser.uid;\n username = selectedUser.username;\n count = objUsers[uid] && objUsers[uid].count;\n objUsers[uid] = {\n username: username,\n count: count ? count + 1 : 1\n };\n }\n\n var last_leadChar_pos = cursor_text.lastIndexOf(\'@\');\n var update_text = cursor_text.slice(0, last_leadChar_pos) + "@" + username + " ";\n var new_text = text.replace(cursor_text, update_text);\n this.setState({\n text: new_text,\n isShowTag: false,\n focusedIndex: 0,\n replyUsers: this.props.replyUsers,\n objUsers: objUsers\n });\n this.props.handleChange(new_text, objUsers);\n t = setTimeout(function () {\n _this2.setCursor(_this2._input, update_text.length);\n }, 50);\n };\n\n _proto.handleChangeText = function handleChangeText(e) {\n var _this3 = this;\n\n /**\n * 1、输入文字时可以@ 某人\n * 2、弹出窗显示位置\n * 3、回车、空格确定选中,并关闭弹窗\n * 4、上下键可选择user\n * 5、左右键移动作用在textarea上,\n * 6、删除用户@** 的位置时,重新展示@ 到光标 弹窗\n */\n var el = e.target;\n var val = el.value; //\n\n this.setState({\n text: val,\n pre_html: val,\n isShowTag: false,\n replyUsers: this.props.replyUsers || []\n });\n this.props.handleChange(val, this.state.objUsers);\n\n if (!val) {\n this.setState({\n isShowTag: false\n });\n return;\n }\n\n if (!this.props.canAtSb) {\n return;\n } // 最后一个@的位置到光标到距离,如果大于等于0,则显示下拉框\n\n\n var cur_pos = this.getCursor(e.target);\n var cursor_text = val.slice(0, cur_pos);\n var last_leadChar_pos = cursor_text.lastIndexOf(\'@\');\n var _this$state2 = this.state,\n canRequest = _this$state2.canRequest,\n replyUsers = _this$state2.replyUsers;\n this.setState({\n cursor_text: cursor_text,\n pre_html: cursor_text + "" + val.slice(cur_pos)\n });\n\n if (cursor_text.split(\' \').pop().indexOf(\'@\') < 0 || last_leadChar_pos < 0) {\n this.setState({\n canRequest: true\n });\n } else if (cur_pos - last_leadChar_pos === 1) {\n this.setState({\n isShowTag: !(replyUsers.length < 1),\n replyUsers: replyUsers,\n canRequest: true\n });\n } else if (cur_pos - last_leadChar_pos > 1) {\n if (!canRequest) {\n this.setState({\n isShowTag: false,\n canRequest: true\n });\n return;\n }\n\n var search_text = val.slice(last_leadChar_pos + 1, cur_pos);\n var obj = {\n word: search_text,\n count: 5,\n alt: \'xd\'\n };\n __chunk_4.CommentsAPI.getShuo(obj).then(function (res) {\n var reg_btag = /<(\\/|\\\\\\/)?b>/g;\n var users = res.users;\n var new_users = users.map(function (user) {\n return JSON.parse(__chunk_6._JSON$stringify(user).replace(reg_btag, \'\'));\n });\n\n if (users.length > 0) {\n _this3.setState({\n isShowTag: true,\n replyUsers: new_users,\n search_text: search_text\n });\n } else {\n _this3.setState({\n canRequest: false,\n isShowTag: false\n });\n }\n }).catch(function (err) {\n console.log(err);\n });\n }\n };\n\n _proto.handleKeyDown = function handleKeyDown(e) {\n var _this4 = this;\n\n var _this$state3 = this.state,\n text = _this$state3.text,\n replyUsers = _this$state3.replyUsers,\n isShowTag = _this$state3.isShowTag,\n objUsers = _this$state3.objUsers;\n var focusedIndex = this.state.focusedIndex;\n var newIndex = 0;\n var t;\n\n if (replyUsers.length < 1) {\n return;\n }\n\n (function () {\n switch (e.keyCode) {\n // delete\n case 8:\n clearTimeout(t);\n\n var cur_pos = _this4.getCursor(e.target);\n\n var cursor_text = text.slice(0, cur_pos);\n var last_leadChar_pos = cursor_text.lastIndexOf(\'@\');\n var last_user = cursor_text.slice(last_leadChar_pos + 1);\n var prev_text = cursor_text.slice(0, last_leadChar_pos);\n var new_text = text;\n var new_cursor_text = text;\n\n if (last_user) {\n for (var user in objUsers) {\n if (last_user === objUsers[user].username) {\n e.preventDefault();\n new_text = text.replace(cursor_text, prev_text);\n new_cursor_text = prev_text;\n\n if (--objUsers[user].count < 0) {\n delete objUsers[user];\n }\n\n t = setTimeout(function () {\n _this4.setCursor(_this4._input, prev_text.length);\n }, 100);\n }\n }\n\n _this4.setState({\n text: new_text,\n cursor_text: new_cursor_text,\n isShowTag: false,\n objUsers: objUsers\n });\n\n _this4.props.handleChange(new_text, objUsers);\n } else {\n _this4.setState({\n isShowTag: false\n });\n }\n\n break;\n // up arrow\n\n case 38:\n if (isShowTag) {\n e.preventDefault();\n\n if (focusedIndex > 0) {\n newIndex = focusedIndex - 1;\n } else {\n newIndex = replyUsers.length - 1;\n }\n\n _this4.setState({\n focusedIndex: newIndex\n });\n }\n\n break;\n // down arrow\n\n case 40:\n if (isShowTag) {\n e.preventDefault();\n\n if (focusedIndex < replyUsers.length - 1) {\n newIndex = focusedIndex + 1;\n } else {\n newIndex = 0;\n }\n\n _this4.setState({\n focusedIndex: newIndex\n });\n }\n\n break;\n // enter\n\n case 13:\n if (isShowTag) {\n e.preventDefault();\n\n _this4.handleSelectUser();\n }\n\n break;\n // space\n\n case 32:\n if (isShowTag) {\n e.preventDefault();\n\n _this4.handleSelectUser();\n }\n\n break;\n // esc\n\n case 27:\n e.preventDefault();\n\n _this4.hideTag();\n\n break;\n }\n })();\n };\n\n _proto.hideTag = function hideTag() {\n this.setState({\n isShowTag: false\n });\n };\n\n _proto.render = function render() {\n var _this5 = this;\n\n var _this$state4 = this.state,\n isShowTag = _this$state4.isShowTag,\n focusedIndex = _this$state4.focusedIndex,\n replyUsers = _this$state4.replyUsers,\n pre_html = _this$state4.pre_html,\n posStyle = _this$state4.posStyle; // type区分是reply(二级)或comment(一级), inputType显示输入框是text或textarea\n\n var _this$props = this.props,\n text = _this$props.text,\n _this$props$type = _this$props.type,\n type = _this$props$type === void 0 ? \'comment\' : _this$props$type,\n _this$props$username = _this$props.username,\n username = _this$props$username === void 0 ? \'\' : _this$props$username,\n _this$props$inputType = _this$props.inputType,\n inputType = _this$props$inputType === void 0 ? \'text\' : _this$props$inputType,\n maxLength = _this$props.maxLength;\n var pre_top = this._input && this._input.scrollTop;\n return React__default.createElement("div", {\n className: "form-input-wrapper",\n ref: this.setWrapperRef\n }, React__default.createElement("pre", {\n ref: this.setPreRef,\n className: "form-pre",\n style: {\n top: pre_top ? -pre_top : 0\n }\n }, pre_html), type === \'reply\' ? React__default.createElement("span", {\n className: "mention-user"\n }, "\\u56DE\\u5E94@" + username) : null, inputType === \'text\' ? React__default.createElement("input", {\n type: "text",\n className: "form-input",\n placeholder: type === \'comment\' ? "\\u56DE\\u5E94@" + username : \'\',\n autoFocus: true,\n ref: function ref(c) {\n _this5._input = c;\n },\n value: text // maxLength={maxLength || null}\n ,\n onChange: function onChange(e) {\n return _this5.handleChangeText(e);\n },\n onKeyDown: function onKeyDown(e) {\n return _this5.handleKeyDown(e);\n }\n }) : React__default.createElement("div", {\n className: "form-area-wrap"\n }, React__default.createElement("textarea", {\n className: "form-area",\n ref: function ref(c) {\n _this5._input = c;\n },\n placeholder: "\\u6DFB\\u52A0\\u56DE\\u5E94",\n rows: "4",\n cols: "64",\n value: text // maxLength={maxLength || null}\n ,\n onChange: function onChange(e) {\n return _this5.handleChangeText(e);\n },\n onKeyDown: function onKeyDown(e) {\n return _this5.handleKeyDown(e);\n }\n }), this.renderUploadImg()), React__default.createElement("div", {\n className: __chunk_3.classnames(\'suggest-wrap\', {\n show: isShowTag\n }),\n style: posStyle\n }, React__default.createElement("ul", null, replyUsers.map(function (user, index) {\n return React__default.createElement("li", {\n key: user.uid,\n className: index === focusedIndex ? \'on\' : \'\',\n onMouseEnter: function onMouseEnter() {\n return _this5.handleMouseEnter(index);\n },\n onClick: function onClick(e) {\n return _this5.handleSelectUser(e, user.uid);\n }\n }, React__default.createElement("a", {\n href: user.url\n }, React__default.createElement("img", {\n src: user.avatar\n }), React__default.createElement("span", null, user.name || user.username), "(", user.uid, ")"));\n }))));\n };\n\n _proto.renderUploadImg = function renderUploadImg() {\n var _this6 = this;\n\n if (!this.props.canUploadFile) {\n return null;\n }\n\n var uploaded = this.props.uploaded;\n var preview_img = this.state.preview_img;\n var upload_html = React__default.createElement("div", null, React__default.createElement("img", {\n src: "https://img9.doubanio.com/f/group/518ababc56ba6b380fb1fd357d6f28b967b0718e/pics/group/uploader.png",\n className: "upload-icon"\n }), React__default.createElement("label", {\n htmlFor: "img"\n }, "\\u6DFB\\u52A0\\u56FE\\u7247"), React__default.createElement("input", {\n type: "file",\n name: "img",\n ref: function ref(f) {\n _this6._file = f;\n },\n className: "img-upload-input",\n accept: "image/jpg,image/jpeg,image/bmp,image/gif,image/png",\n onChange: function onChange(e) {\n return _this6.handleChangeFile(e);\n }\n }));\n var uploaded_html = React__default.createElement("div", null, React__default.createElement("span", {\n className: "img-preview"\n }, React__default.createElement("img", {\n src: preview_img\n })), React__default.createElement("span", {\n className: "remove-img",\n onClick: function onClick() {\n return _this6.handleDeleteFile();\n }\n }, "\\u5220\\u9664\\u56FE\\u7247"));\n return React__default.createElement("div", {\n className: "img-uploader-wrapper"\n }, uploaded ? uploaded_html : upload_html);\n };\n\n _proto.getCursor = function getCursor(t) {\n if (document.selection) {\n // t.focus();\n var val = t.value;\n var r = t._saved_range || document.selection.createRange();\n var tr = t.createTextRange();\n var tr2 = tr.duplicate();\n tr2.moveToBookmark(r.getBookmark());\n tr.setEndPoint(\'EndToStart\', tr2);\n if (r == null || tr == null) return val.length; // for some reason IE doesn\'t always count the \\n and \\r in length\n\n var text_part = r.text.replace(/[\\r\\n]/g, \'.\');\n var text_whole = val.replace(/[\\r\\n]/g, \'.\');\n return text_whole.indexOf(text_part, tr.text.length);\n }\n\n return t.selectionStart;\n };\n\n _proto.setCursor = function setCursor(t, p) {\n this.selectRangeText(t, p, p);\n };\n\n _proto.selectRangeText = function selectRangeText(t, s, z) {\n if (document.selection) {\n var range = t.createTextRange();\n range.moveEnd(\'character\', -t.value.length);\n range.moveEnd(\'character\', z);\n range.moveStart(\'character\', s);\n range.select();\n } else {\n t.focus();\n t.setSelectionRange(s, z);\n }\n };\n\n _proto.handleChangeFile = function handleChangeFile(e) {\n var _this7 = this;\n\n if (!this._file.files.length || !window.FileReader) {\n this.props.handleChangeFile();\n return;\n }\n\n var file = this._file.files[0];\n var reader = new FileReader();\n\n reader.onload = function () {\n _this7.setState({\n uploaded: true,\n preview_img: reader.result\n });\n };\n\n reader.readAsDataURL(file);\n this.props.handleChangeFile(file);\n };\n\n _proto.handleDeleteFile = function handleDeleteFile() {\n this.setState({\n uploaded: false,\n preview_img: \'\'\n });\n this.props.handleChangeFile();\n };\n\n return UserSelect;\n}(React.Component);\n\nUserSelect.propTypes = userSelectPropTypes;\nUserSelect.defaultProps = userSelectDefaultProps;\n\nexports.UserSelect = UserSelect;\nexports._assertThisInitialized = assertThisInitialized;\nexports.userSelectDefaultProps = userSelectDefaultProps;\nexports.userSelectPropTypes = userSelectPropTypes;\n//# sourceMappingURL=user-select-b03f91d2.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/comments/lib/user-select-b03f91d2.js\n// module id = 12\n// module chunks = 0\n//# sourceURL=webpack:///./~/comments/lib/user-select-b03f91d2.js?')},function(module,exports){eval("/*\nobject-assign\n(c) Sindre Sorhus\n@license MIT\n*/\n\n'use strict';\n/* eslint-disable no-unused-vars */\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\nfunction toObject(val) {\n\tif (val === null || val === undefined) {\n\t\tthrow new TypeError('Object.assign cannot be called with null or undefined');\n\t}\n\n\treturn Object(val);\n}\n\nfunction shouldUseNative() {\n\ttry {\n\t\tif (!Object.assign) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Detect buggy property enumeration order in older V8 versions.\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=4118\n\t\tvar test1 = new String('abc'); // eslint-disable-line no-new-wrappers\n\t\ttest1[5] = 'de';\n\t\tif (Object.getOwnPropertyNames(test1)[0] === '5') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test2 = {};\n\t\tfor (var i = 0; i < 10; i++) {\n\t\t\ttest2['_' + String.fromCharCode(i)] = i;\n\t\t}\n\t\tvar order2 = Object.getOwnPropertyNames(test2).map(function (n) {\n\t\t\treturn test2[n];\n\t\t});\n\t\tif (order2.join('') !== '0123456789') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test3 = {};\n\t\t'abcdefghijklmnopqrst'.split('').forEach(function (letter) {\n\t\t\ttest3[letter] = letter;\n\t\t});\n\t\tif (Object.keys(Object.assign({}, test3)).join('') !==\n\t\t\t\t'abcdefghijklmnopqrst') {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (err) {\n\t\t// We don't expect any of the above to throw, but better to be safe.\n\t\treturn false;\n\t}\n}\n\nmodule.exports = shouldUseNative() ? Object.assign : function (target, source) {\n\tvar from;\n\tvar to = toObject(target);\n\tvar symbols;\n\n\tfor (var s = 1; s < arguments.length; s++) {\n\t\tfrom = Object(arguments[s]);\n\n\t\tfor (var key in from) {\n\t\t\tif (hasOwnProperty.call(from, key)) {\n\t\t\t\tto[key] = from[key];\n\t\t\t}\n\t\t}\n\n\t\tif (getOwnPropertySymbols) {\n\t\t\tsymbols = getOwnPropertySymbols(from);\n\t\t\tfor (var i = 0; i < symbols.length; i++) {\n\t\t\t\tif (propIsEnumerable.call(from, symbols[i])) {\n\t\t\t\t\tto[symbols[i]] = from[symbols[i]];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn to;\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/object-assign/index.js\n// module id = 13\n// module chunks = 0\n//# sourceURL=webpack:///./~/object-assign/index.js?")},function(module,exports,__webpack_require__){eval("'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\nfunction _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }\n\nvar __chunk_1 = __webpack_require__(1);\n__webpack_require__(6);\n__webpack_require__(10);\nvar React = __webpack_require__(2);\nvar React__default = _interopDefault(React);\nvar __chunk_3 = __webpack_require__(4);\n__webpack_require__(5);\nvar userSelect = __webpack_require__(12);\nvar __chunk_4 = __webpack_require__(9);\n__webpack_require__(7);\nvar __chunk_5 = __webpack_require__(11);\n__webpack_require__(8);\n\nvar css = \"@charset \\\"UTF-8\\\";\\n/**\\n * @Desc 回应编辑器\\n *\\n * @Author wangyanhong\\n * @Date 2019-05-15\\n */\\n.reply-editor {\\n position: relative;\\n display: flex;\\n padding-top: 5px;\\n padding-bottom: 10px;\\n}\\n.reply-editor form {\\n display: flex;\\n flex: 1;\\n}\\n.reply-editor .form-input-wrapper {\\n flex: 1;\\n display: flex;\\n align-items: center;\\n border: 1px solid #d9d9d9;\\n border-radius: 2px;\\n margin-right: 10px;\\n padding: 6px 10px;\\n line-height: 16px;\\n}\\n.reply-editor.show-captcha form {\\n flex-direction: column;\\n}\\n.reply-editor.show-captcha .form-input-wrapper {\\n width: 100%;\\n flex: none;\\n box-sizing: border-box;\\n margin: 0;\\n}\\n.reply-editor.show-captcha .reply-form-foot {\\n display: flex;\\n justify-content: flex-end;\\n margin-top: 10px;\\n padding-bottom: 30px;\\n}\\n.reply-editor.show-captcha .captcha-wrapper {\\n margin-right: 15px;\\n}\\n.reply-editor .limit-count {\\n position: absolute;\\n top: 100%;\\n right: 80px;\\n margin-top: -7px;\\n font-size: 11px;\\n}\\n.reply-editor .limit-count.overflow {\\n color: #c34;\\n}\\n.reply-editor .mention-user {\\n padding-right: 5px;\\n line-height: 1;\\n font-size: 13px;\\n color: #494949;\\n}\\n.reply-editor .form-input {\\n border: 0;\\n padding: 0;\\n flex: 1;\\n outline: none;\\n font-size: 13px;\\n}\";\n__chunk_1.styleInject(css);\n\nvar replyEditorPropTypes = {\n id: __chunk_1.PropTypes.string,\n type: __chunk_1.PropTypes.string,\n username: __chunk_1.PropTypes.string,\n // @某人\n btnText: __chunk_1.PropTypes.string,\n value: __chunk_1.PropTypes.string,\n canAtSb: __chunk_1.PropTypes.bool,\n maxLength: __chunk_1.PropTypes.number,\n replyUsers: __chunk_1.PropTypes.array,\n handleHideReplyEditor: __chunk_1.PropTypes.func,\n handleAddReply: __chunk_1.PropTypes.func\n};\nvar replyEditorDefaultProps = {\n id: '',\n type: 'comment',\n username: '',\n btnText: '加上去',\n value: '',\n canAtSb: false,\n maxLength: 0,\n replyUsers: [],\n handleHideReplyEditor: function handleHideReplyEditor() {},\n handleAddReply: function handleAddReply() {}\n};\n\nvar ReplyEditor =\n/*#__PURE__*/\nfunction (_Component) {\n __chunk_1._inheritsLoose(ReplyEditor, _Component);\n\n function ReplyEditor(props) {\n var _this;\n\n _this = _Component.call(this, props) || this;\n _this.state = {\n value: '',\n textWithTinyUrl: '',\n submittingStatus: __chunk_5.DEFAULT,\n showCaptcha: false,\n // 显示验证码\n captchaObj: null,\n captchaSolution: '',\n captchaErrorMsg: '',\n cursor_text: '',\n // 光标之前的文本,\n isShowTag: false,\n replyUsers: props.replyUsers,\n focusedIndex: 0,\n canRequest: true\n };\n _this.handleMouseAndKey = _this.handleMouseAndKey.bind(userSelect._assertThisInitialized(_this));\n return _this;\n }\n\n var _proto = ReplyEditor.prototype;\n\n _proto.componentDidMount = function componentDidMount() {\n document.addEventListener('mouseup', this.handleMouseAndKey, true);\n document.addEventListener('keydown', this.handleMouseAndKey, true);\n };\n\n _proto.componentWillUnmount = function componentWillUnmount() {\n document.removeEventListener('mouseup', this.handleMouseAndKey, true);\n document.removeEventListener('keydown', this.handleMouseAndKey, true);\n };\n\n _proto.handleMouseAndKey = function handleMouseAndKey(event) {\n // 没有写字的时候,鼠标点击空白处(没有选中文字之类)、或者按 esc 键,则收起输入框\n // 写了字,一直显示输入框\n var handleHideReplyEditor = this.props.handleHideReplyEditor;\n var isClickingBlank = !(['form-input', 'captcha-input', 'captcha-img', 'comment-form-btn', 'captcha-error-msg'].indexOf(event.target.className) > -1);\n var keyIsESC = event.keyCode && event.keyCode === 27;\n var selectedSomething = window.getSelection().toString().length > 0;\n\n if (this.valueIsEmpty() && (isClickingBlank && !selectedSomething || keyIsESC)) {\n handleHideReplyEditor();\n }\n };\n\n _proto.handleAddReply = function handleAddReply(e) {\n var _this2 = this;\n\n if (e) {\n e.preventDefault();\n e.stopPropagation();\n }\n\n var _this$state = this.state,\n value = _this$state.value,\n objUsers = _this$state.objUsers,\n showCaptcha = _this$state.showCaptcha,\n captchaObj = _this$state.captchaObj,\n captchaSolution = _this$state.captchaSolution,\n submittingStatus = _this$state.submittingStatus;\n var _this$props = this.props,\n id = _this$props.id,\n handleAddReply = _this$props.handleAddReply;\n\n if (submittingStatus === __chunk_5.PENDING) {\n return;\n }\n\n this.setState({\n submittingStatus: __chunk_5.PENDING\n });\n /*\n * 这里注释掉并且只保留了一个空的 successCallback 是因为\n * 提交成功后,整个 ReplyEditor 就消失了, unmount 了,组件里面的 state 被销毁了,\n * 再 setState 也没意义了,而且可能会报错。\n */\n\n var successCallback = function successCallback() {// 提交成功后,清空输入框、清空验证码相关、清空之前勾选的「转发到广播」\n // this.setState({\n // value: '',\n // showCaptcha: false, //\n // captchaObj: null,\n // captchaErrorMsg: '',\n // captchaSolution: '',\n // checked: false\n // })\n };\n\n var failCallback = function failCallback(code, data, errorMsg) {\n if (code === 1001 && data) {\n _this2.setState({\n submittingStatus: __chunk_5.FAIL,\n showCaptcha: true,\n captchaObj: data,\n captchaErrorMsg: errorMsg === '验证码错误' ? '' : errorMsg\n }); // 需要答题\n\n } else if (code === 1003 && data.exam_topic) {\n _this2.setState({\n submittingStatus: __chunk_5.FAIL\n }, function () {\n openExam && openExam(data.exam_topic, data.flow, _this2.handleAddReply.bind(_this2));\n });\n } else {\n _this2.setState({\n submittingStatus: __chunk_5.FAIL\n });\n }\n };\n\n var submit_text = value;\n\n for (var k in objUsers) {\n submit_text = submit_text.replace(new RegExp(\"@\" + objUsers[k].username + \" \", 'g'), \"@\" + k + \" \");\n }\n\n var newRelpy = {\n rv_comment: submit_text,\n ref_cid: id,\n // 被回应的 id\n sync_to_mb: false // 是否用同步到广播\n // 如果需要输入验证码,则附上验证码的输入结果和相应的 id\n\n };\n\n if (captchaObj || showCaptcha) {\n newRelpy['captcha-id'] = captchaObj.captcha_id;\n newRelpy['captcha-solution'] = captchaSolution;\n }\n\n handleAddReply(newRelpy, successCallback, failCallback);\n };\n\n _proto.handleChange = function handleChange(val, objUsers) {\n this.setState({\n value: val,\n objUsers: objUsers,\n textWithTinyUrl: val && val.replace(new RegExp(__chunk_4.URL_RE, 'gm'), __chunk_4.HTTPS_SHORT_DOUBAN + \"XXXXXX\") || ''\n });\n };\n\n _proto.valueIsEmpty = function valueIsEmpty() {\n var value = this.state.value;\n return !value || value.trim().length === 0;\n };\n\n _proto.handleCaptchaSolutionChange = function handleCaptchaSolutionChange(e) {\n this.setState({\n captchaSolution: e.target.value\n });\n };\n\n _proto.render = function render() {\n var _this$state2 = this.state,\n value = _this$state2.value,\n textWithTinyUrl = _this$state2.textWithTinyUrl,\n showCaptcha = _this$state2.showCaptcha,\n captchaObj = _this$state2.captchaObj,\n captchaSolution = _this$state2.captchaSolution,\n captchaErrorMsg = _this$state2.captchaErrorMsg,\n submittingStatus = _this$state2.submittingStatus,\n isShowTag = _this$state2.isShowTag,\n replyUsers = _this$state2.replyUsers,\n focusedIndex = _this$state2.focusedIndex;\n var _this$props2 = this.props,\n btnText = _this$props2.btnText,\n username = _this$props2.username,\n type = _this$props2.type,\n canAtSb = _this$props2.canAtSb,\n config = _this$props2.config,\n maxLength = _this$props2.maxLength;\n var cls = __chunk_3.classnames('reply-editor', {\n 'show-captcha': showCaptcha && captchaObj\n });\n var submitBtn = React__default.createElement(\"button\", {\n type: \"submit\",\n disabled: submittingStatus === __chunk_5.PENDING,\n className: __chunk_3.classnames('comment-form-btn', {\n disabled: submittingStatus === __chunk_5.PENDING\n })\n }, submittingStatus === __chunk_5.PENDING ? '提交中' : btnText);\n var maxLen = 0; // 广播下的回复字数最多 280,其他的不限字数\n\n if (config.service && config.service === __chunk_4.STATUS) {\n maxLen = __chunk_4.MAX_STATUS_COMMENTS_LENGTH;\n } else {\n maxLen = maxLength;\n }\n\n return React__default.createElement(\"div\", {\n className: cls\n }, React__default.createElement(\"form\", {\n onSubmit: this.handleAddReply.bind(this)\n }, React__default.createElement(userSelect.UserSelect, {\n type: type,\n inputType: \"text\",\n text: value,\n username: username,\n replyUsers: replyUsers,\n maxLength: maxLen,\n canAtSb: canAtSb,\n handleChange: this.handleChange.bind(this)\n }), showCaptcha && captchaObj ? React__default.createElement(\"div\", {\n className: \"reply-form-foot\"\n }, React__default.createElement(\"div\", {\n className: \"captcha-wrapper\"\n }, React__default.createElement(\"img\", {\n className: \"captcha-img\",\n src: captchaObj.captcha_img,\n onClick: this.handleAddReply.bind(this)\n }), React__default.createElement(\"input\", {\n type: \"text\",\n placeholder: \"\\u8BF7\\u8F93\\u5165\\u5DE6\\u56FE\\u7684\\u9A8C\\u8BC1\\u7801\",\n value: captchaSolution,\n className: \"captcha-input\",\n onChange: this.handleCaptchaSolutionChange.bind(this)\n }), React__default.createElement(\"div\", {\n className: \"captcha-error-msg\"\n }, captchaErrorMsg ? \"*\" + captchaErrorMsg : '')), submitBtn) : submitBtn, maxLen && maxLen - textWithTinyUrl.length < 20 && !(showCaptcha && captchaObj) ? React__default.createElement(\"div\", {\n className: __chunk_3.classnames('limit-count', {\n overflow: textWithTinyUrl.length >= maxLen\n })\n }, textWithTinyUrl.length, \"/\", maxLen) : null));\n };\n\n return ReplyEditor;\n}(React.Component);\n\nReplyEditor.propTypes = replyEditorPropTypes;\nReplyEditor.defaultProps = replyEditorDefaultProps;\n\nexports.default = ReplyEditor;\nexports.replyEditorDefaultProps = replyEditorDefaultProps;\nexports.replyEditorPropTypes = replyEditorPropTypes;\n//# sourceMappingURL=reply-editor.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/comments/lib/reply-editor.js\n// module id = 14\n// module chunks = 0\n//# sourceURL=webpack:///./~/comments/lib/reply-editor.js?");},function(module,exports,__webpack_require__){eval('\'use strict\';\n\nObject.defineProperty(exports, \'__esModule\', { value: true });\n\nfunction _interopDefault (ex) { return (ex && (typeof ex === \'object\') && \'default\' in ex) ? ex[\'default\'] : ex; }\n\nvar __chunk_1 = __webpack_require__(1);\n__webpack_require__(6);\n__webpack_require__(10);\nvar React = __webpack_require__(2);\nvar React__default = _interopDefault(React);\nvar __chunk_3 = __webpack_require__(4);\n__webpack_require__(5);\n__webpack_require__(12);\nvar replyEditor = __webpack_require__(14);\nvar __chunk_4 = __webpack_require__(9);\n__webpack_require__(7);\n__webpack_require__(11);\n__webpack_require__(8);\n\nvar css = "@charset \\"UTF-8\\";\\n/**\\n * @Desc 评论的相关操作动作,包括:回应、删除、投诉\\n *\\n * @Author wangyanhong\\n * @Date 2019-05-15\\n */\\n.comment-action-bar {\\n color: #bbb;\\n font-size: 13px;\\n text-align: right;\\n min-height: 21px;\\n}\\n\\n.comment-source,\\n.dev .comment-source {\\n float: left;\\n}\\n.comment-source a:link,\\n.dev .comment-source a:link {\\n color: #bbb;\\n}\\n.comment-source a:visited,\\n.dev .comment-source a:visited {\\n color: #bbb;\\n}\\n.comment-source a:hover,\\n.dev .comment-source a:hover {\\n background: #bbb;\\n color: #fff;\\n}\\n\\n.action-bar-group,\\n.dev .action-bar-group {\\n visibility: hidden;\\n}\\n.action-bar-group.hover,\\n.dev .action-bar-group.hover {\\n visibility: visible;\\n}\\n.action-bar-group a:link,\\n.dev .action-bar-group a:link {\\n margin-left: 10px;\\n color: #bbb;\\n cursor: pointer;\\n}\\n.action-bar-group a:hover,\\n.dev .action-bar-group a:hover {\\n color: #fff;\\n background: #bbb;\\n}";\n__chunk_1.styleInject(css);\n\nvar commentActionsPropTypes = {\n config: __chunk_1.PropTypes.object,\n comment: __chunk_1.PropTypes.object.isRequired,\n type: __chunk_1.PropTypes.string,\n isHovering: __chunk_1.PropTypes.bool,\n replyEditorVisible: __chunk_1.PropTypes.bool,\n canAtSb: __chunk_1.PropTypes.bool,\n maxLength: __chunk_1.PropTypes.number,\n replyUsers: __chunk_1.PropTypes.array,\n handleHideReplyEditor: __chunk_1.PropTypes.func,\n handleShowReplyEditor: __chunk_1.PropTypes.func,\n handleDeleteComment: __chunk_1.PropTypes.func,\n handleAddReply: __chunk_1.PropTypes.func,\n handleShowReportDialog: __chunk_1.PropTypes.func\n};\nvar commentActionsDefaultProps = {\n config: null,\n comment: null,\n type: \'comment\',\n // \'comment\' 或者 \'reply\',默认 \'comment\'\n isHovering: false,\n replyEditorVisible: true,\n canAtSb: false,\n maxLength: 0,\n replyUsers: [],\n handleHideReplyEditor: function handleHideReplyEditor() {},\n handleShowReplyEditor: function handleShowReplyEditor() {},\n handleDeleteComment: function handleDeleteComment() {},\n handleAddReply: function handleAddReply() {},\n handleShowReportDialog: function handleShowReportDialog() {}\n};\n\nvar ActionBar =\n/*#__PURE__*/\nfunction (_Component) {\n __chunk_1._inheritsLoose(ActionBar, _Component);\n\n function ActionBar() {\n return _Component.apply(this, arguments) || this;\n }\n\n var _proto = ActionBar.prototype;\n\n _proto.handleShowReportDialog = function handleShowReportDialog(e) {\n e.preventDefault();\n var _this$props = this.props,\n handleShowReportDialog = _this$props.handleShowReportDialog,\n id = _this$props.comment.id;\n handleShowReportDialog(id);\n };\n\n _proto.handleDeleteComment = function handleDeleteComment(e) {\n var _this$props2 = this.props,\n handleDeleteComment = _this$props2.handleDeleteComment,\n id = _this$props2.comment.id;\n handleDeleteComment(id);\n };\n\n _proto.render = function render() {\n var _this$props3 = this.props,\n config = _this$props3.config,\n comment = _this$props3.comment,\n isHovering = _this$props3.isHovering,\n replyEditorVisible = _this$props3.replyEditorVisible,\n canAtSb = _this$props3.canAtSb,\n replyUsers = _this$props3.replyUsers,\n handleShowReplyEditor = _this$props3.handleShowReplyEditor,\n handleHideReplyEditor = _this$props3.handleHideReplyEditor,\n handleAddReply = _this$props3.handleAddReply,\n type = _this$props3.type,\n maxLength = _this$props3.maxLength;\n\n if (!comment || !config) {\n return null;\n } // 用户未登录,不显示操作按钮\n\n\n var user = __chunk_4.IS_DEV ? config.user : window._COMMENTS_CONFIG ? window._COMMENTS_CONFIG.user : null;\n var author = comment.author,\n id = comment.id;\n var replyLimit = __chunk_4.IS_DEV ? config.target.reply_limit : window._COMMENTS_CONFIG.target.reply_limit;\n var canAddComment = __chunk_4.IS_DEV ? config.target.can_add_comment : window._COMMENTS_CONFIG.target.can_add_comment;\n return React__default.createElement("div", {\n className: "comment-action-bar"\n }, user ? React__default.createElement("div", {\n className: __chunk_3.classnames(\'action-bar-group\', {\n hover: isHovering\n })\n }, !canAddComment ? replyLimit === \'F\' && !author.is_friend ? React__default.createElement("span", null, "\\uFF08\\u4EC5\\u5141\\u8BB8\\u53D1\\u5E03\\u8005\\u5173\\u6CE8\\u4EBA\\u56DE\\u5E94\\uFF09") : React__default.createElement("span", null, "\\uFF08\\u5DF2\\u7ECF\\u7981\\u6B62\\u56DE\\u5E94\\uFF09") : React__default.createElement("a", {\n rel: "nofollow",\n title: "\\u56DE\\u5E94" + author.name,\n href: "javascript:;",\n style: {\n display: replyEditorVisible ? \'none\' : \'inline\'\n },\n onClick: handleShowReplyEditor\n }, "\\u56DE\\u5E94"), user.is_admin || user.id === author.id || user.can_delete_all_comments ? React__default.createElement("a", {\n rel: "nofollow",\n title: "\\u5220\\u9664",\n href: "javascript:;",\n onClick: this.handleDeleteComment.bind(this)\n }, "\\u5220\\u9664") : null, React__default.createElement("a", {\n rel: "nofollow",\n "data-cid": comment.id,\n title: "\\u6295\\u8BC9",\n href: "javascript:;",\n className: "report-comment-btn",\n onClick: this.handleShowReportDialog.bind(this)\n }, "\\u6295\\u8BC9")) : null, replyEditorVisible ? React__default.createElement(replyEditor.default, {\n id: id.toString(),\n config: config,\n username: author.name,\n type: type,\n canAtSb: canAtSb,\n maxLength: maxLength,\n replyUsers: replyUsers,\n handleHideReplyEditor: handleHideReplyEditor,\n handleAddReply: handleAddReply\n }) : null);\n };\n\n return ActionBar;\n}(React.Component);\n\nActionBar.propTypes = commentActionsPropTypes;\nActionBar.defaultProps = commentActionsDefaultProps;\n\nexports.commentActionsDefaultProps = commentActionsDefaultProps;\nexports.commentActionsPropTypes = commentActionsPropTypes;\nexports.default = ActionBar;\n//# sourceMappingURL=action-bar.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/comments/lib/action-bar.js\n// module id = 15\n// module chunks = 0\n//# sourceURL=webpack:///./~/comments/lib/action-bar.js?')},function(module,exports,__webpack_require__){eval("/**\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 printWarning = function() {};\n\nif (true) {\n var ReactPropTypesSecret = __webpack_require__(45);\n var loggedTypeFailures = {};\n var has = __webpack_require__(46);\n\n printWarning = function(text) {\n var message = 'Warning: ' + text;\n if (typeof console !== 'undefined') {\n console.error(message);\n }\n try {\n // --- Welcome to debugging React ---\n // This error was thrown as a convenience so that you can use this stack\n // to find the callsite that caused this warning to fire.\n throw new Error(message);\n } catch (x) { /**/ }\n };\n}\n\n/**\n * Assert that the values match with the type specs.\n * Error messages are memorized and will only be shown once.\n *\n * @param {object} typeSpecs Map of name to a ReactPropType\n * @param {object} values Runtime values that need to be type-checked\n * @param {string} location e.g. \"prop\", \"context\", \"child context\"\n * @param {string} componentName Name of the component for error messages.\n * @param {?Function} getStack Returns the component stack.\n * @private\n */\nfunction checkPropTypes(typeSpecs, values, location, componentName, getStack) {\n if (true) {\n for (var typeSpecName in typeSpecs) {\n if (has(typeSpecs, typeSpecName)) {\n var error;\n // Prop type validation may throw. In case they do, we don't want to\n // fail the render phase where it didn't fail before. So we log it.\n // After these have been cleaned up, we'll let them throw.\n try {\n // This is intentionally an invariant that gets caught. It's the same\n // behavior as without this statement except with a better message.\n if (typeof typeSpecs[typeSpecName] !== 'function') {\n var err = Error(\n (componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' +\n 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.' +\n 'This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.'\n );\n err.name = 'Invariant Violation';\n throw err;\n }\n error = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, ReactPropTypesSecret);\n } catch (ex) {\n error = ex;\n }\n if (error && !(error instanceof Error)) {\n printWarning(\n (componentName || 'React class') + ': type specification of ' +\n location + ' `' + typeSpecName + '` is invalid; the type checker ' +\n 'function must return `null` or an `Error` but returned a ' + typeof error + '. ' +\n 'You may have forgotten to pass an argument to the type checker ' +\n 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' +\n 'shape all require an argument).'\n );\n }\n if (error instanceof Error && !(error.message in loggedTypeFailures)) {\n // Only monitor this failure once because there tends to be a lot of the\n // same error.\n loggedTypeFailures[error.message] = true;\n\n var stack = getStack ? getStack() : '';\n\n printWarning(\n 'Failed ' + location + ' type: ' + error.message + (stack != null ? stack : '')\n );\n }\n }\n }\n }\n}\n\n/**\n * Resets warning cache when testing.\n *\n * @private\n */\ncheckPropTypes.resetWarningCache = function() {\n if (true) {\n loggedTypeFailures = {};\n }\n}\n\nmodule.exports = checkPropTypes;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/prop-types/checkPropTypes.js\n// module id = 16\n// module chunks = 0\n//# sourceURL=webpack:///./~/prop-types/checkPropTypes.js?")},function(module,exports,__webpack_require__){eval('\'use strict\';\n\nObject.defineProperty(exports, \'__esModule\', { value: true });\n\nfunction _interopDefault (ex) { return (ex && (typeof ex === \'object\') && \'default\' in ex) ? ex[\'default\'] : ex; }\n\nvar __chunk_1 = __webpack_require__(1);\n__webpack_require__(6);\n__webpack_require__(10);\nvar React = __webpack_require__(2);\nvar React__default = _interopDefault(React);\nvar __chunk_3 = __webpack_require__(4);\nvar actionBar = __webpack_require__(15);\n__webpack_require__(5);\n__webpack_require__(12);\n__webpack_require__(14);\nvar __chunk_4 = __webpack_require__(9);\n__webpack_require__(7);\n__webpack_require__(11);\nvar __chunk_6 = __webpack_require__(8);\n\nvar css = "/*\\n* @Author: hanjiyun\\n* @Date: 2019-05-13 22:55:26\\n* @Last Modified by: hanjiyun\\n* @Last Modified time: 2019-06-19 21:00:10\\n*/\\n/*\\n* @Author: hanjiyun\\n* @Date: 2019-05-14 21:32:06\\n* @Last Modified by: hanjiyun\\n* @Last Modified time: 2022-03-30 16:32:26\\n*/\\n.comment-item .reply-item {\\n padding-top: 5px;\\n}\\n.comment-item .reply-item .avatar-small {\\n height: 24px;\\n width: 24px;\\n margin-right: 10px;\\n}\\n.comment-item .reply-item .meta-header {\\n background: none;\\n padding: 3px 0;\\n margin-bottom: 0;\\n}\\n.comment-item .reply-item .mention-user {\\n margin-right: 5px;\\n}";\n__chunk_1.styleInject(css);\n\nvar replyItemPropTypes = {\n config: __chunk_1.PropTypes.object,\n commentId: __chunk_1.PropTypes.string,\n type: __chunk_1.PropTypes.string,\n target: __chunk_1.PropTypes.object,\n reply: __chunk_1.PropTypes.object,\n canAtSb: __chunk_1.PropTypes.bool,\n replyUsers: __chunk_1.PropTypes.array,\n handleAddReply: __chunk_1.PropTypes.func,\n handleDeleteReply: __chunk_1.PropTypes.func,\n handleShowReportDialog: __chunk_1.PropTypes.func,\n needEscape: __chunk_1.PropTypes.bool\n};\nvar replyItemDefaultProps = {\n config: null,\n commentId: \'\',\n type: \'reply\',\n target: null,\n reply: null,\n canAtSb: false,\n replyUsers: [],\n handleAddReply: function handleAddReply() {},\n handleDeleteReply: function handleDeleteReply() {},\n handleShowReportDialog: function handleShowReportDialog() {},\n needEscape: true\n};\n\nvar ReplyItem =\n/*#__PURE__*/\nfunction (_Component) {\n __chunk_1._inheritsLoose(ReplyItem, _Component);\n\n function ReplyItem(props) {\n var _this;\n\n _this = _Component.call(this, props) || this;\n _this.state = {\n reply: props.reply,\n isShowActions: true,\n isHover: false,\n replyEditorVisible: false,\n addedNewItem: false,\n // 一级评论下是否添加了新的二级回应\n isFolded: props.reply && props.reply.is_folded // 是否展开被折叠的评论\n\n };\n return _this;\n }\n\n ReplyItem.getDerivedStateFromProps = function getDerivedStateFromProps(nextProps, prevState) {\n if (__chunk_6._JSON$stringify(nextProps.reply) !== __chunk_6._JSON$stringify(prevState.reply)) {\n return {\n reply: nextProps.reply\n };\n }\n\n return null;\n };\n\n var _proto = ReplyItem.prototype;\n\n _proto.handleShowReplyEditor = function handleShowReplyEditor() {\n this.setState({\n replyEditorVisible: true\n });\n };\n\n _proto.handleHideReplyEditor = function handleHideReplyEditor() {\n this.setState({\n replyEditorVisible: false\n });\n } // 添加回应\n // 隐藏输入框,附带上当前回应列表所属的 comment id ,传给上级\n ;\n\n _proto.handleAddReply = function handleAddReply(newRelpy, successCallback, failCallback) {\n var _this2 = this;\n\n var handleAddReply = this.props.handleAddReply;\n\n var hideReplyListEditorCallback = function hideReplyListEditorCallback() {\n _this2.handleHideReplyEditor();\n };\n\n handleAddReply(newRelpy, successCallback, failCallback, hideReplyListEditorCallback);\n };\n\n _proto.handleDeleteComment = function handleDeleteComment() {\n var reply = this.state.reply;\n var handleDeleteReply = this.props.handleDeleteReply;\n\n if (window.confirm("\\u771F\\u7684\\u8981\\u5220\\u9664" + reply.author.name + "\\u7684\\u8FD9\\u6761\\u56DE\\u5E94\\u5417\\uFF1F")) {\n handleDeleteReply(reply.id);\n this.setState({\n isShowActions: false\n });\n }\n };\n\n _proto.handleHover = function handleHover(e) {\n e.stopPropagation();\n this.setState({\n isHover: true\n });\n };\n\n _proto.handleLeave = function handleLeave(e) {\n e.stopPropagation();\n this.setState({\n isHover: false\n });\n };\n\n _proto.handleFold = function handleFold() {\n this.setState({\n isFolded: false\n });\n };\n\n _proto.render = function render() {\n var _this$props = this.props,\n target = _this$props.target,\n commentId = _this$props.commentId,\n needEscape = _this$props.needEscape;\n var _this$state = this.state,\n reply = _this$state.reply,\n isFolded = _this$state.isFolded;\n\n if (!reply) {\n return null;\n }\n\n var text = reply.text,\n create_time = reply.create_time,\n is_folded = reply.is_folded,\n author = reply.author,\n has_ref = reply.has_ref,\n ref_comment = reply.ref_comment,\n entities = reply.entities,\n folded_reason_text = reply.folded_reason_text,\n folded_reason_url = reply.folded_reason_url;\n var cls = __chunk_3.classnames(\'item\', \'reply-item\', {\n \'latest-reply\': reply.is_latest\n }); // data-*的作用用于 antispam获取值,https://github.intra.douban.com/antispam/hyjal/blob/master/static/js/app/raikiri/comment.js#L187\n\n return React__default.createElement("div", {\n className: cls,\n "data-cid": reply.id,\n "data-target_id": target.id,\n "data-target_kind": target.kind\n }, React__default.createElement("div", {\n className: "comment-item-body",\n onMouseOver: this.handleHover.bind(this),\n onMouseOut: this.handleLeave.bind(this)\n }, React__default.createElement("div", {\n className: "author-avatar avatar-small"\n }, React__default.createElement("a", {\n href: author.url,\n title: author.name\n }, React__default.createElement("img", {\n src: author.avatar,\n alt: author.name\n }))), React__default.createElement("div", {\n className: "comment-main"\n }, React__default.createElement("div", {\n className: "meta-header"\n }, React__default.createElement("a", {\n href: author.url,\n title: author.name\n }, author.name), author.signature ? React__default.createElement("span", null, "(" + author.signature + ")") : null, React__default.createElement("time", {\n dateTime: create_time\n }, create_time)), React__default.createElement("div", {\n className: __chunk_3.classnames("comment-content", {\n hide: isFolded\n })\n }, ref_comment && ref_comment.author && ref_comment.id !== commentId && !reply.is_deleted ? React__default.createElement("a", {\n href: ref_comment.author.url,\n title: ref_comment.author.name,\n className: "mention-user"\n }, "@", ref_comment.author.name) : null, !reply.is_deleted ? React__default.createElement("span", {\n dangerouslySetInnerHTML: {\n __html: __chunk_4.extractText(text, entities, needEscape)\n }\n }) : \'[该回复已被删除]\', is_folded ? React__default.createElement("div", {\n className: "folded-text"\n }, folded_reason_text, folded_reason_url ? React__default.createElement(React.Fragment, null, "\\uFF0C", React__default.createElement("a", {\n target: "_blank",\n href: folded_reason_url,\n className: "folded-reason-url"\n }, "\\u4E86\\u89E3\\u89C4\\u5219")) : null) : null), isFolded ? React__default.createElement("p", {\n className: "comment-folded"\n }, React__default.createElement("span", null, "[\\u8BE5\\u56DE\\u590D\\u5DF2\\u88AB\\u6298\\u53E0]"), React__default.createElement("a", {\n href: "javascript:;",\n onClick: this.handleFold.bind(this)\n }, "\\u5C55\\u5F00")) : null, this.renderActions())));\n };\n\n _proto.renderActions = function renderActions() {\n var _this$state2 = this.state,\n isHover = _this$state2.isHover,\n replyEditorVisible = _this$state2.replyEditorVisible,\n isShowActions = _this$state2.isShowActions,\n reply = _this$state2.reply;\n var _this$props2 = this.props,\n config = _this$props2.config,\n type = _this$props2.type,\n canAtSb = _this$props2.canAtSb,\n replyUsers = _this$props2.replyUsers,\n handleShowReportDialog = _this$props2.handleShowReportDialog;\n\n if (!isShowActions || reply.is_folded || reply.is_deleted) {\n return null;\n }\n\n return React__default.createElement(actionBar.default, {\n config: config,\n type: type,\n isHovering: isHover,\n comment: reply,\n replyEditorVisible: replyEditorVisible,\n canAtSb: canAtSb,\n replyUsers: replyUsers,\n handleHideReplyEditor: this.handleHideReplyEditor.bind(this),\n handleShowReplyEditor: this.handleShowReplyEditor.bind(this),\n handleDeleteComment: this.handleDeleteComment.bind(this),\n handleAddReply: this.handleAddReply.bind(this),\n handleShowReportDialog: handleShowReportDialog\n });\n };\n\n return ReplyItem;\n}(React.Component);\n\nReplyItem.propTypes = replyItemPropTypes;\nReplyItem.defaultProps = replyItemDefaultProps;\n\nexports.default = ReplyItem;\nexports.replyItemDefaultProps = replyItemDefaultProps;\nexports.replyItemPropTypes = replyItemPropTypes;\n//# sourceMappingURL=reply-item.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/comments/lib/reply-item.js\n// module id = 17\n// module chunks = 0\n//# sourceURL=webpack:///./~/comments/lib/reply-item.js?')},[146,78],function(module,exports,__webpack_require__){eval("var ReactDOM = __webpack_require__(83);\nvar scroll = __webpack_require__(142);\n\nfunction calculateScrollOffset(element, offset, alignment) {\n var body = document.body,\n html = document.documentElement;\n var elementRect = element.getBoundingClientRect();\n var clientHeight = html.clientHeight;\n var documentHeight = Math.max( body.scrollHeight, body.offsetHeight, \n html.clientHeight, html.scrollHeight, html.offsetHeight );\n offset = offset || 0; // additional offset to top\n var scrollPosition;\n switch(alignment) {\n case 'top': scrollPosition = elementRect.top; break;\n case 'middle': scrollPosition = elementRect.bottom - clientHeight / 2 - elementRect.height / 2; break;\n case 'bottom': scrollPosition = elementRect.bottom - clientHeight; break;\n default: scrollPosition = elementRect.bottom - clientHeight / 2 - elementRect.height / 2; break; //defaul to middle\n }\n var maxScrollPosition = documentHeight - clientHeight;\n return Math.min(scrollPosition + offset + window.pageYOffset,\n maxScrollPosition);\n}\n\nmodule.exports = function (ref, options) {\n options = options || {\n offset: 0,\n align: 'middle'\n };\n var element = ReactDOM.findDOMNode(ref);\n if (element === null) return 0;\n return scroll(0, calculateScrollOffset(element, options.offset, options.align), options);\n};\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/comments/~/react-scroll-to-component/index.js\n// module id = 19\n// module chunks = 0\n//# sourceURL=webpack:///./~/comments/~/react-scroll-to-component/index.js?")},function(module,exports,__webpack_require__){eval('\'use strict\';\n\nObject.defineProperty(exports, \'__esModule\', { value: true });\n\nfunction _interopDefault (ex) { return (ex && (typeof ex === \'object\') && \'default\' in ex) ? ex[\'default\'] : ex; }\n\nvar __chunk_1 = __webpack_require__(1);\n__webpack_require__(6);\n__webpack_require__(10);\nvar React = __webpack_require__(2);\nvar React__default = _interopDefault(React);\nvar __chunk_3 = __webpack_require__(4);\nvar ReactDOM = _interopDefault(__webpack_require__(18));\nvar scrollToComponent = _interopDefault(__webpack_require__(19));\n__webpack_require__(15);\n__webpack_require__(5);\n__webpack_require__(12);\n__webpack_require__(14);\nvar __chunk_4 = __webpack_require__(9);\n__webpack_require__(7);\n__webpack_require__(11);\n__webpack_require__(8);\nvar replyItem = __webpack_require__(17);\n\nvar css = "/*\\n* @Author: hanjiyun\\n* @Date: 2019-05-14 21:32:06\\n* @Last Modified by: hanjiyun\\n* @Last Modified time: 2022-03-30 16:32:26\\n*/\\n.replies-list-control-btn, .replies-list-control .fold-btn, .replies-list-control .give-me-more {\\n height: 20px;\\n padding: 1px 3px 1px 0;\\n line-height: 1;\\n color: #37A;\\n border: 0;\\n outline: none;\\n font-size: 13px;\\n cursor: pointer;\\n background-color: transparent;\\n}\\n.replies-list-control-btn::after, .replies-list-control .fold-btn::after, .replies-list-control .give-me-more::after {\\n border: solid #37a;\\n border-width: 0 1px 1px 0;\\n display: inline-block;\\n padding: 3px;\\n transform: rotate(45deg);\\n content: \\"\\";\\n display: inline-block;\\n margin-left: 6px;\\n margin-top: -4px;\\n vertical-align: middle;\\n}\\n.replies-list-control-btn:hover, .replies-list-control .fold-btn:hover, .replies-list-control .give-me-more:hover {\\n color: #fff;\\n background: #37a;\\n}\\n.replies-list-control-btn:hover::after, .replies-list-control .fold-btn:hover::after, .replies-list-control .give-me-more:hover::after {\\n border-color: #fff;\\n}\\n\\n.reply-list {\\n padding-left: 68px;\\n}\\n\\n.replies-list-control {\\n display: flex;\\n height: 20px;\\n justify-content: space-between;\\n align-items: center;\\n padding-top: 5px;\\n}\\n.replies-list-control .give-me-more.invisible {\\n visibility: hidden;\\n}\\n.replies-list-control .fold-btn {\\n display: flex;\\n justify-content: center;\\n align-items: center;\\n}\\n.replies-list-control .fold-btn::after {\\n border: solid #37a;\\n border-width: 0 1px 1px 0;\\n display: inline-block;\\n padding: 3px;\\n transform: rotate(-135deg);\\n margin-top: 2px;\\n}\\n.replies-list-control .fold-btn.fixed {\\n position: fixed;\\n bottom: 10px;\\n height: 30px;\\n width: 90px;\\n z-index: 2;\\n background: #f7f7f7;\\n border-radius: 3px;\\n border: 1px solid #dfdfdf;\\n}\\n.replies-list-control .fold-btn.fixed:hover {\\n background: #f1f1f1;\\n color: #37a;\\n}\\n.replies-list-control .fold-btn.fixed:hover::after {\\n border-color: #37a;\\n}";\n__chunk_1.styleInject(css);\n\nvar replyListPropTypes = {\n config: __chunk_1.PropTypes.object,\n commentId: __chunk_1.PropTypes.string.isRequired,\n target: __chunk_1.PropTypes.object,\n replies: __chunk_1.PropTypes.array,\n canAtSb: __chunk_1.PropTypes.bool,\n replyUsers: __chunk_1.PropTypes.array,\n total: __chunk_1.PropTypes.number,\n // replies 总数\n count: __chunk_1.PropTypes.number,\n // 展开请求更多回应时,每次请求多少条\n truncation: __chunk_1.PropTypes.number,\n // replies 超过 n 条时,只显示 n 条,其余需要手动展开\n upThreshold: __chunk_1.PropTypes.number,\n // 超过第 n 条时,显示「收起回应」\n downThreshold: __chunk_1.PropTypes.number,\n // 小于第 n 条时,一拿才那个「收起回应」\n handleAddReply: __chunk_1.PropTypes.func,\n handleDelete: __chunk_1.PropTypes.func,\n handleLoadMoreReplies: __chunk_1.PropTypes.func,\n handleFoldReplies: __chunk_1.PropTypes.func,\n handleShowReportDialog: __chunk_1.PropTypes.func,\n needEscape: __chunk_1.PropTypes.bool\n};\nvar replyListDefaultProps = {\n config: null,\n commentId: \'\',\n target: null,\n replies: [],\n total: 0,\n canAtSb: false,\n replyUsers: [],\n truncation: 3,\n // 默认最多展示 3 条\n count: __chunk_4.IS_DEV ? 5 : 50,\n // 每次加载多少条\n upThreshold: 10,\n // 页面向上滚动时,回应列表的第 10 条出现后时显示「收起回应」\n downThreshold: 5,\n // 页面向下滚动时,回应列表的第 5 条出现后时隐藏「收起回应」\n handleAddReply: function handleAddReply() {},\n handleDelete: function handleDelete() {},\n handleLoadMoreReplies: function handleLoadMoreReplies() {},\n handleFoldReplies: function handleFoldReplies() {},\n handleShowReportDialog: function handleShowReportDialog() {},\n needEscape: false\n};\n\nvar ReplyList =\n/*#__PURE__*/\nfunction (_Component) {\n __chunk_1._inheritsLoose(ReplyList, _Component);\n\n function ReplyList(props) {\n var _this;\n\n _this = _Component.call(this, props) || this;\n _this.listRef = null;\n _this.listHeightBeforeLoading = 0;\n _this.increasedListHeight = 0;\n _this.controlBarRef = null;\n _this.downSensorItemRef = React__default.createRef();\n _this.state = {\n total: props.total,\n remaining: props.total + props.replies.filter(function (reply) {\n return reply.is_deleted;\n }).length - props.truncation,\n repliesStart: props.truncation,\n // 默认从第 3 条开始取\n isLoadingReplies: false,\n foldRepliesBtnVisible: false // 是否显示「收起回应」按钮\n\n };\n return _this;\n }\n\n var _proto = ReplyList.prototype;\n\n _proto.render = function render() {\n var _this2 = this;\n\n var _this$state = this.state,\n total = _this$state.total,\n remaining = _this$state.remaining,\n isLoadingReplies = _this$state.isLoadingReplies,\n foldRepliesBtnVisible = _this$state.foldRepliesBtnVisible,\n foldRepliesBtnOutofViewport = _this$state.foldRepliesBtnOutofViewport;\n var _this$props = this.props,\n replies = _this$props.replies,\n truncation = _this$props.truncation,\n upThreshold = _this$props.upThreshold;\n\n if (!replies || replies.length === 0) {\n return null;\n }\n\n return React__default.createElement("div", {\n className: "reply-list",\n ref: function ref(ele) {\n _this2.listRef = ele; // 存一下展开前的列表高度\n\n setTimeout(function () {\n _this2.listHeightBeforeLoading = _this2.geListDomHeight();\n }, 150);\n }\n }, this.renderList(), total >= truncation && remaining > 0 || foldRepliesBtnVisible ? // 暂时去掉\n // \n React__default.createElement("div", {\n className: "replies-list-control",\n ref: function ref(ele) {\n _this2.controlBarRef = ele;\n }\n }, isLoadingReplies ? React__default.createElement("div", null, "\\u52A0\\u8F7D\\u4E2D") : this.renderRepliesLoader(), foldRepliesBtnVisible && replies.length > upThreshold ? React__default.createElement("button", {\n className: __chunk_3.classnames(\'fold-btn\', {\n // 如果按钮没有隐藏,且没在窗口内,并且没有被滚动出顶部(在窗口底部以下)\n fixed: foldRepliesBtnVisible && !foldRepliesBtnOutofViewport && this.controlBarRef && this.controlBarRef.getBoundingClientRect().top > 0\n }),\n style: {\n left: this.controlBarRef ? this.controlBarRef.getBoundingClientRect().left + this.controlBarRef.getBoundingClientRect().width - 90 : 0 // 90 是按钮自身的宽度\n\n },\n onClick: this.handleFoldReplies.bind(this)\n }, "\\u6536\\u8D77\\u56DE\\u5E94") : null) // \n : null);\n };\n\n _proto.renderList = function renderList() {\n var _this3 = this;\n\n var _this$props2 = this.props,\n config = _this$props2.config,\n commentId = _this$props2.commentId,\n target = _this$props2.target,\n replies = _this$props2.replies,\n canAtSb = _this$props2.canAtSb,\n replyUsers = _this$props2.replyUsers,\n upThreshold = _this$props2.upThreshold,\n downThreshold = _this$props2.downThreshold,\n handleAddReply = _this$props2.handleAddReply,\n handleShowReportDialog = _this$props2.handleShowReportDialog,\n needEscape = _this$props2.needEscape;\n return replies.map(function (reply, index) {\n /* 2021-12-10 暂时去掉 VisibilitySensor\n // 监测第 5 、 11 条的显示状态\n const isScrollUpSensorItem = index + 1 === upThreshold\n const isScrollDownSensorItem = index + 1 === downThreshold\n if (isScrollUpSensorItem || isScrollDownSensorItem) {\n const onChange = isScrollUpSensorItem ? this.upSensorItemInViewport.bind(this, reply) : isScrollDownSensorItem ? this.downSensorItemInViewport.bind(this, reply) : () => {}\n return (\n \n \n \n )\n }\n */\n return React__default.createElement(replyItem.default, {\n config: config,\n commentId: commentId,\n type: "reply",\n key: "_" + reply.id + "_reply_" + index,\n target: target,\n reply: reply,\n canAtSb: canAtSb,\n replyUsers: replyUsers,\n handleAddReply: handleAddReply,\n handleDeleteReply: _this3.handleDeleteReply.bind(_this3),\n handleShowReportDialog: handleShowReportDialog,\n needEscape: needEscape\n });\n });\n } // 计算回应列表的高度\n ;\n\n _proto.geListDomHeight = function geListDomHeight() {\n return this.listRef ? ReactDOM.findDOMNode(this.listRef).getBoundingClientRect().height : 0;\n } // TODO 需要优化\n // 计算当前回应列表中有多少条没有被删除的回应\n ;\n\n _proto.getSurvivedReplisNum = function getSurvivedReplisNum() {\n var _this$state2 = this.state,\n total = _this$state2.total,\n repliesStart = _this$state2.repliesStart;\n var _this$props3 = this.props,\n replies = _this$props3.replies,\n truncation = _this$props3.truncation;\n var deleted = replies.filter(function (reply) {\n return reply.is_deleted;\n }).length;\n return total + deleted - repliesStart;\n } // 删除某条回应后,需要重新计算「展开更多 n 条」回应\n ;\n\n _proto.handleDeleteReply = function handleDeleteReply(id) {\n var _this$state3 = this.state,\n total = _this$state3.total,\n repliesStart = _this$state3.repliesStart;\n var _this$props4 = this.props,\n handleDelete = _this$props4.handleDelete,\n commentId = _this$props4.commentId,\n count = _this$props4.count;\n var parentCommentId = commentId;\n handleDelete(id, parentCommentId);\n } // 渲染「展开更多 n 条回应」按钮\n ;\n\n _proto.renderRepliesLoader = function renderRepliesLoader() {\n var count = this.props.count;\n var remaining = this.state.remaining;\n var cls = __chunk_3.classnames(\'give-me-more\', {\n invisible: remaining <= 0\n });\n return React__default.createElement("button", {\n className: cls,\n onClick: this.showMoreReplies.bind(this)\n }, "\\u5C55\\u5F00\\u66F4\\u591A" + remaining + "\\u6761\\u56DE\\u5E94");\n } // 点击按钮,展开更多回应\n ;\n\n _proto.showMoreReplies = function showMoreReplies() {\n var _this4 = this;\n\n var _this$props5 = this.props,\n commentId = _this$props5.commentId,\n count = _this$props5.count,\n handleLoadMoreReplies = _this$props5.handleLoadMoreReplies,\n replies = _this$props5.replies,\n truncation = _this$props5.truncation;\n var _this$state4 = this.state,\n repliesStart = _this$state4.repliesStart,\n isLoadingReplies = _this$state4.isLoadingReplies;\n\n if (isLoadingReplies) {\n return;\n }\n\n this.setState({\n isLoadingReplies: true\n });\n var params = {\n start: this.state.repliesStart,\n count: count\n };\n\n var successCallback = function successCallback(data) {\n _this4.setState({\n isLoadingReplies: false,\n repliesStart: repliesStart + count,\n remaining: data.total - _this4.props.replies.length,\n total: data.total // 这里重新拿一遍 total,因为这期间可能新增了 reply\n\n }); // 存一下展开后的列表高度\n\n\n var listHeightAfterLoading = _this4.geListDomHeight(); // 两者相减,得到这次新增数据后回应列表的高度\n // 用于点击「收起回应」后页面的定位\n\n\n _this4.increasedListHeight = _this4.increasedListHeight + (listHeightAfterLoading - _this4.listHeightBeforeLoading);\n };\n\n var failCallback = function failCallback(error) {\n _this4.setState({\n isLoadingReplies: false\n });\n };\n\n handleLoadMoreReplies(commentId, params, successCallback, failCallback);\n } // 「收起回应」\n ;\n\n _proto.handleFoldReplies = function handleFoldReplies(e) {\n e.preventDefault();\n var _this$props6 = this.props,\n commentId = _this$props6.commentId,\n replies = _this$props6.replies,\n truncation = _this$props6.truncation,\n handleFoldReplies = _this$props6.handleFoldReplies;\n var total = this.state.total; // TODO: 如果在收起回应之前,新加了回应,可能需要重新计算一下当前页面的 total,然后改写 remaining\n\n handleFoldReplies(commentId); // 滚动到主贴位置(listRef的父节点)\n\n scrollToComponent(this.listRef.parentNode, {\n offset: -20,\n // 再补上 -20 距离\n align: \'top\',\n duration: 500\n });\n this.setState({\n remaining: total - truncation,\n repliesStart: truncation,\n // 起点回到第三条\n foldRepliesBtnVisible: false // 隐藏收起恢复\n\n }); // 需要用滚动高度减去之前load回来的新回应列表高度\n // 否则 safari 里会定位不到点击收起之前时的位置\n\n window.scrollTo(0, document.body.scrollTop + document.documentElement.scrollTop - this.increasedListHeight); // 重置\n\n this.increasedListHeight = 0;\n } // 控制条出现在视区内\n ;\n\n _proto.listControlBarInViewport = function listControlBarInViewport(isVisible) {\n this.setState({\n foldRepliesBtnOutofViewport: isVisible\n });\n } // 第 upThreshold + 1 条回应出现在视区内时,显示「收起回应」\n ;\n\n _proto.upSensorItemInViewport = function upSensorItemInViewport(comment, upSensorItemIsVisible) {\n var foldRepliesBtnVisible = this.state.foldRepliesBtnVisible;\n\n if (upSensorItemIsVisible && !foldRepliesBtnVisible) {\n this.setState({\n foldRepliesBtnVisible: true\n });\n }\n } // 第 downThreshold 条回应出现时,隐藏「收起回应」\n ;\n\n _proto.downSensorItemInViewport = function downSensorItemInViewport(comment, downSensorItemIsVisible) {\n var foldRepliesBtnVisible = this.state.foldRepliesBtnVisible;\n var downThresholdTop = ReactDOM.findDOMNode(this.downSensorItemRef.current).getBoundingClientRect().top;\n\n if (!downSensorItemIsVisible && foldRepliesBtnVisible && downThresholdTop > 0) {\n this.setState({\n foldRepliesBtnVisible: false\n });\n }\n };\n\n return ReplyList;\n}(React.Component);\n\nReplyList.propTypes = replyListPropTypes;\nReplyList.defaultProps = replyListDefaultProps;\n\nexports.default = ReplyList;\nexports.replyListDefaultProps = replyListDefaultProps;\nexports.replyListPropTypes = replyListPropTypes;\n//# sourceMappingURL=reply-list.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/comments/lib/reply-list.js\n// module id = 20\n// module chunks = 0\n//# sourceURL=webpack:///./~/comments/lib/reply-list.js?');},function(module,exports,__webpack_require__){eval('"use strict";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, "__esModule", { value: true });\n__exportStar(__webpack_require__(124), exports);\n__exportStar(__webpack_require__(120), exports);\n__exportStar(__webpack_require__(26), exports);\n__exportStar(__webpack_require__(122), exports);\n__exportStar(__webpack_require__(123), exports);\n__exportStar(__webpack_require__(121), exports);\n__exportStar(__webpack_require__(118), exports);\n__exportStar(__webpack_require__(119), exports);\n__exportStar(__webpack_require__(43), exports);\n//# sourceMappingURL=index.js.map\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/fe-utils/lib/lang/index.js\n// module id = 21\n// module chunks = 0\n//# sourceURL=webpack:///./~/fe-utils/lib/lang/index.js?')},function(module,exports,__webpack_require__){eval("/* WEBPACK VAR INJECTION */(function(process) {'use strict';\n\nvar utils = __webpack_require__(3);\nvar normalizeHeaderName = __webpack_require__(64);\n\nvar DEFAULT_CONTENT_TYPE = {\n 'Content-Type': 'application/x-www-form-urlencoded'\n};\n\nfunction setContentTypeIfUnset(headers, value) {\n if (!utils.isUndefined(headers) && utils.isUndefined(headers['Content-Type'])) {\n headers['Content-Type'] = value;\n }\n}\n\nfunction getDefaultAdapter() {\n var adapter;\n if (typeof XMLHttpRequest !== 'undefined') {\n // For browsers use XHR adapter\n adapter = __webpack_require__(28);\n } else if (typeof process !== 'undefined') {\n // For node use HTTP adapter\n adapter = __webpack_require__(28);\n }\n return adapter;\n}\n\nvar defaults = {\n adapter: getDefaultAdapter(),\n\n transformRequest: [function transformRequest(data, headers) {\n normalizeHeaderName(headers, 'Content-Type');\n if (utils.isFormData(data) ||\n utils.isArrayBuffer(data) ||\n utils.isBuffer(data) ||\n utils.isStream(data) ||\n utils.isFile(data) ||\n utils.isBlob(data)\n ) {\n return data;\n }\n if (utils.isArrayBufferView(data)) {\n return data.buffer;\n }\n if (utils.isURLSearchParams(data)) {\n setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8');\n return data.toString();\n }\n if (utils.isObject(data)) {\n setContentTypeIfUnset(headers, 'application/json;charset=utf-8');\n return JSON.stringify(data);\n }\n return data;\n }],\n\n transformResponse: [function transformResponse(data) {\n /*eslint no-param-reassign:0*/\n if (typeof data === 'string') {\n try {\n data = JSON.parse(data);\n } catch (e) { /* Ignore */ }\n }\n return data;\n }],\n\n /**\n * A timeout in milliseconds to abort a request. If set to 0 (default) a\n * timeout is not created.\n */\n timeout: 0,\n\n xsrfCookieName: 'XSRF-TOKEN',\n xsrfHeaderName: 'X-XSRF-TOKEN',\n\n maxContentLength: -1,\n\n validateStatus: function validateStatus(status) {\n return status >= 200 && status < 300;\n }\n};\n\ndefaults.headers = {\n common: {\n 'Accept': 'application/json, text/plain, */*'\n }\n};\n\nutils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) {\n defaults.headers[method] = {};\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE);\n});\n\nmodule.exports = defaults;\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(27)))\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/axios/lib/defaults.js\n// module id = 22\n// module chunks = 0\n//# sourceURL=webpack:///./~/axios/lib/defaults.js?")},function(module,exports,__webpack_require__){eval('\'use strict\';\n\nObject.defineProperty(exports, \'__esModule\', { value: true });\n\nfunction _interopDefault (ex) { return (ex && (typeof ex === \'object\') && \'default\' in ex) ? ex[\'default\'] : ex; }\n\nvar __chunk_1 = __webpack_require__(1);\n__webpack_require__(6);\n__webpack_require__(10);\nvar React = __webpack_require__(2);\nvar React__default = _interopDefault(React);\nvar __chunk_3 = __webpack_require__(4);\nvar ReactDOM = _interopDefault(__webpack_require__(18));\nvar scrollToComponent = _interopDefault(__webpack_require__(19));\nvar actionBar = __webpack_require__(15);\n__webpack_require__(5);\n__webpack_require__(12);\n__webpack_require__(14);\nvar __chunk_4 = __webpack_require__(9);\n__webpack_require__(7);\n__webpack_require__(11);\n__webpack_require__(8);\nvar replyList = __webpack_require__(20);\n__webpack_require__(17);\n\nvar _stringWs = \'\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\' +\n \'\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF\';\n\nvar space = \'[\' + _stringWs + \']\';\nvar non = \'\\u200b\\u0085\';\nvar ltrim = RegExp(\'^\' + space + space + \'*\');\nvar rtrim = RegExp(space + space + \'*$\');\n\nvar exporter = function (KEY, exec, ALIAS) {\n var exp = {};\n var FORCE = __chunk_1.fails(function () {\n return !!_stringWs[KEY]() || non[KEY]() != non;\n });\n var fn = exp[KEY] = FORCE ? exec(trim) : _stringWs[KEY];\n if (ALIAS) exp[ALIAS] = fn;\n __chunk_1.$export(__chunk_1.$export.P + __chunk_1.$export.F * FORCE, \'String\', exp);\n};\n\n// 1 -> String#trimLeft\n// 2 -> String#trimRight\n// 3 -> String#trim\nvar trim = exporter.trim = function (string, TYPE) {\n string = String(__chunk_1.defined(string));\n if (TYPE & 1) string = string.replace(ltrim, \'\');\n if (TYPE & 2) string = string.replace(rtrim, \'\');\n return string;\n};\n\nvar _stringTrim = exporter;\n\nvar $parseInt = __chunk_1.global.parseInt;\nvar $trim = _stringTrim.trim;\n\nvar hex = /^[-+]?0[xX]/;\n\nvar _parseInt = $parseInt(_stringWs + \'08\') !== 8 || $parseInt(_stringWs + \'0x16\') !== 22 ? function parseInt(str, radix) {\n var string = $trim(String(str), 3);\n return $parseInt(string, (radix >>> 0) || (hex.test(string) ? 16 : 10));\n} : $parseInt;\n\n// 18.2.5 parseInt(string, radix)\n__chunk_1.$export(__chunk_1.$export.G + __chunk_1.$export.F * (parseInt != _parseInt), { parseInt: _parseInt });\n\nvar _parseInt$1 = __chunk_1.core.parseInt;\n\nvar _parseInt$2 = _parseInt$1;\n\nvar css = "/*\\n* @Author: hanjiyun\\n* @Date: 2019-05-13 22:55:26\\n * @Last Modified by: hanjiyun\\n * @Last Modified time: 2021-06-08 19:11:35\\n*/\\n/*\\n* @Author: hanjiyun\\n* @Date: 2019-05-14 21:32:06\\n* @Last Modified by: hanjiyun\\n* @Last Modified time: 2022-03-30 16:32:26\\n*/\\n.comment-item-body {\\n display: flex;\\n}\\n.comment-item-body img {\\n display: block;\\n max-width: 100%;\\n}\\n.comment-item-body .comment-content {\\n padding: 5px 0;\\n word-wrap: break-word;\\n word-break: break-word;\\n white-space: pre-wrap;\\n}\\n.comment-item-body .comment-content .folded-text {\\n padding: 5px 0;\\n color: #c0c0c0;\\n}\\n.comment-item-body .comment-content a.folded-reason-url {\\n color: #c0c0c0;\\n border-bottom: 1px solid #c0c0c0;\\n}\\n.comment-item-body .comment-content a.folded-reason-url:hover {\\n background: #bbb;\\n color: #fff;\\n border: 0;\\n}\\n.comment-item-body .comment-folded {\\n margin-top: 10px;\\n color: #c0c0c0;\\n}\\n.comment-item-body .comment-folded a {\\n color: #c0c0c0;\\n float: right;\\n}\\n.comment-item-body .comment-folded a:hover {\\n background: #bbb;\\n color: #fff;\\n}\\n\\n.comment-item {\\n margin-bottom: 15px;\\n overflow: visible;\\n}\\n.comment-item .author-avatar {\\n width: 48px;\\n height: 48px;\\n margin-right: 20px;\\n}\\n.comment-item .author-avatar img {\\n display: block;\\n max-width: 100%;\\n}\\n\\n.comment-main {\\n flex: 1;\\n}\\n\\n.meta-header {\\n background: #F3F5F7;\\n padding: 3px 5px;\\n margin-bottom: 5px;\\n color: #999;\\n}\\n.meta-header span,\\n.meta-header time {\\n padding-left: 8px;\\n}\\n.meta-header time {\\n font-size: 12px;\\n}";\n__chunk_1.styleInject(css);\n\nvar baseItemPropTypes = {\n config: __chunk_1.PropTypes.object,\n bgColor: __chunk_1.PropTypes.string,\n type: __chunk_1.PropTypes.string,\n target: __chunk_1.PropTypes.object,\n comment: __chunk_1.PropTypes.object,\n canAtSb: __chunk_1.PropTypes.bool,\n maxLength: __chunk_1.PropTypes.number,\n replyUsers: __chunk_1.PropTypes.array,\n handleAddReply: __chunk_1.PropTypes.func,\n handleDelete: __chunk_1.PropTypes.func,\n handleLoadMoreReplies: __chunk_1.PropTypes.func,\n handleShowReportDialog: __chunk_1.PropTypes.func,\n needEscape: __chunk_1.PropTypes.bool\n};\nvar baseItemDefaultProps = {\n config: null,\n bgColor: \'\',\n type: \'comment\',\n target: null,\n comment: null,\n canAtSb: false,\n maxLength: 0,\n replyUsers: [],\n handleAddReply: function handleAddReply() {},\n handleDelete: function handleDelete() {},\n handleLoadMoreReplies: function handleLoadMoreReplies() {},\n handleShowReportDialog: function handleShowReportDialog() {},\n needEscape: true\n};\n\nvar BaseItem =\n/*#__PURE__*/\nfunction (_Component) {\n __chunk_1._inheritsLoose(BaseItem, _Component);\n\n function BaseItem(props) {\n var _this;\n\n _this = _Component.call(this, props) || this;\n _this.replyListRef = React__default.createRef();\n _this.state = {\n comment: props.comment,\n isShowActions: true,\n isHover: false,\n replyEditorVisible: false,\n isFolded: props.comment && props.comment.is_folded // 是否展开被折叠的评论\n\n };\n return _this;\n }\n\n var _proto = BaseItem.prototype;\n\n _proto.handleShowReplyEditor = function handleShowReplyEditor() {\n this.setState({\n replyEditorVisible: true\n });\n };\n\n _proto.handleHideReplyEditor = function handleHideReplyEditor() {\n this.setState({\n replyEditorVisible: false\n });\n } // 滚动定位到刚刚发布那条二级回应\n ;\n\n _proto.scrollToLatestReply = function scrollToLatestReply() {\n var replyListNode = ReactDOM.findDOMNode(this.replyListRef.current);\n\n if (replyListNode instanceof HTMLElement) {\n var latestReplyNode = replyListNode.querySelector(\'.latest-reply\');\n scrollToComponent(latestReplyNode, {\n // offset: -20, // 再补上 -20 距离\n align: \'middle\',\n duration: 400\n });\n }\n };\n\n _proto.handleAddReply = function handleAddReply(newRelpy, successCallback, failCallback, hideReplyListEditorCallback) {\n var _this2 = this;\n\n var _this$props = this.props,\n handleAddReply = _this$props.handleAddReply,\n comment = _this$props.comment;\n var commentId = comment.id; // 用于提交成功后隐藏输入框的回调\n\n var hideReplyEditorCallback = function hideReplyEditorCallback() {\n _this2.handleHideReplyEditor(); // 如果需要隐藏回应列表中的输入框\n // eslint-disable-next-line no-unused-expressions\n\n\n hideReplyListEditorCallback && hideReplyListEditorCallback();\n }; // 用于滚动定位到刚刚发布那条二级回应的回调\n\n\n var scrollToLatestReplyCallback = function scrollToLatestReplyCallback() {// this.scrollToLatestReply()\n };\n\n handleAddReply(newRelpy, successCallback, failCallback, commentId, hideReplyEditorCallback, scrollToLatestReplyCallback);\n };\n\n _proto.handleDeleteComment = function handleDeleteComment() {\n var _this$props2 = this.props,\n comment = _this$props2.comment,\n handleDelete = _this$props2.handleDelete;\n\n if (window.confirm("\\u771F\\u7684\\u8981\\u5220\\u9664" + comment.author.name + "\\u7684\\u8FD9\\u6761\\u56DE\\u5E94\\u5417\\uFF1F")) {\n handleDelete(comment.id);\n }\n };\n\n _proto.handleHover = function handleHover(e) {\n e.stopPropagation();\n this.setState({\n isHover: true\n });\n };\n\n _proto.handleLeave = function handleLeave(e) {\n e.stopPropagation();\n this.setState({\n isHover: false\n });\n };\n\n _proto.handleFold = function handleFold() {\n this.setState({\n isFolded: false\n });\n };\n\n _proto.render = function render() {\n var isFolded = this.state.isFolded;\n var _this$props3 = this.props,\n target = _this$props3.target,\n comment = _this$props3.comment,\n bgColor = _this$props3.bgColor,\n needEscape = _this$props3.needEscape; // 被标记为了已删除,并且下面没有 replis, 不显示\n\n if (!comment || comment.is_deleted && comment.total_replies === 0 && comment.replies.length === 0) {\n return null;\n }\n\n var text = comment.text,\n create_time = comment.create_time,\n is_folded = comment.is_folded,\n author = comment.author,\n ref_comment = comment.ref_comment,\n entities = comment.entities,\n folded_reason_text = comment.folded_reason_text,\n folded_reason_url = comment.folded_reason_url;\n var cls = __chunk_3.classnames(\'item\', \'comment-item\', {\n \'latest-comment\': comment.is_latest\n }); // data-*的作用用于 antispam获取值,https://github.intra.douban.com/antispam/hyjal/blob/master/static/js/app/raikiri/comment.js#L187\n\n return React__default.createElement("div", {\n className: cls,\n "data-cid": comment.id,\n "data-target_id": target.id,\n "data-target_kind": target.kind\n }, React__default.createElement("div", {\n className: "comment-item-body",\n onMouseOver: this.handleHover.bind(this),\n onMouseOut: this.handleLeave.bind(this)\n }, React__default.createElement("div", {\n className: "author-avatar"\n }, React__default.createElement("a", {\n href: author.url,\n title: author.name\n }, React__default.createElement("img", {\n src: author.avatar,\n alt: author.name\n }))), React__default.createElement("div", {\n className: "comment-main"\n }, React__default.createElement("div", {\n className: "meta-header",\n style: {\n backgroundColor: bgColor\n }\n }, React__default.createElement("a", {\n href: "https://www.douban.com/people/" + author.id,\n title: author.name\n }, author.name), author.signature ? React__default.createElement("span", null, "(" + author.signature + ")") : null, React__default.createElement("time", {\n dateTime: create_time\n }, create_time)), React__default.createElement("div", {\n className: __chunk_3.classnames("comment-content", {\n hide: isFolded\n })\n }, ref_comment && ref_comment.author ? React__default.createElement("a", {\n href: ref_comment.author.url,\n title: ref_comment.author.name,\n className: "mention-user"\n }, "@", ref_comment.author.name) : null, !comment.is_deleted ? React__default.createElement("span", {\n dangerouslySetInnerHTML: {\n __html: __chunk_4.extractText(text, entities, needEscape)\n }\n }) : \'[该回复已被删除]\', is_folded ? React__default.createElement("div", {\n className: "folded-text"\n }, folded_reason_text, folded_reason_url ? React__default.createElement(React.Fragment, null, "\\uFF0C", React__default.createElement("a", {\n target: "_blank",\n href: folded_reason_url,\n className: "folded-reason-url"\n }, "\\u4E86\\u89E3\\u89C4\\u5219")) : null) : null), isFolded ? React__default.createElement("p", {\n className: "comment-folded"\n }, React__default.createElement("span", null, "[\\u8BE5\\u56DE\\u590D\\u5DF2\\u88AB\\u6298\\u53E0]"), React__default.createElement("a", {\n href: "javascript:;",\n onClick: this.handleFold.bind(this)\n }, "\\u5C55\\u5F00")) : null, this.renderActions())), this.renderReplyList());\n };\n\n _proto.renderActions = function renderActions() {\n var _this$state = this.state,\n isHover = _this$state.isHover,\n replyEditorVisible = _this$state.replyEditorVisible,\n isShowActions = _this$state.isShowActions;\n var _this$props4 = this.props,\n config = _this$props4.config,\n type = _this$props4.type,\n handleShowReportDialog = _this$props4.handleShowReportDialog,\n comment = _this$props4.comment,\n canAtSb = _this$props4.canAtSb,\n replyUsers = _this$props4.replyUsers,\n maxLength = _this$props4.maxLength;\n\n if (!isShowActions || comment.is_folded || comment.is_deleted) {\n return null;\n }\n\n return React__default.createElement(actionBar.default, {\n config: config,\n type: type,\n isHovering: isHover,\n comment: comment,\n replyEditorVisible: replyEditorVisible,\n canAtSb: canAtSb,\n maxLength: maxLength,\n replyUsers: replyUsers,\n handleHideReplyEditor: this.handleHideReplyEditor.bind(this),\n handleShowReplyEditor: this.handleShowReplyEditor.bind(this),\n handleDeleteComment: this.handleDeleteComment.bind(this),\n handleAddReply: this.handleAddReply.bind(this),\n handleShowReportDialog: handleShowReportDialog\n });\n };\n\n _proto.renderReplyList = function renderReplyList() {\n var _this$props5 = this.props,\n config = _this$props5.config,\n target = _this$props5.target,\n comment = _this$props5.comment,\n truncation = _this$props5.truncation,\n type = _this$props5.type,\n canAtSb = _this$props5.canAtSb,\n replyUsers = _this$props5.replyUsers,\n handleDelete = _this$props5.handleDelete,\n handleLoadMoreReplies = _this$props5.handleLoadMoreReplies,\n handleFoldReplies = _this$props5.handleFoldReplies,\n handleShowReportDialog = _this$props5.handleShowReportDialog,\n needEscape = _this$props5.needEscape;\n\n if (type === \'reply\') {\n return null;\n }\n\n return React__default.createElement(replyList.default, {\n config: config,\n ref: this.replyListRef,\n commentId: comment.id.toString(),\n target: target,\n replies: comment.replies,\n truncation: truncation,\n total: _parseInt$2(comment.total_replies, 10),\n canAtSb: canAtSb,\n replyUsers: replyUsers,\n handleAddReply: this.handleAddReply.bind(this),\n handleDelete: handleDelete,\n handleFoldReplies: handleFoldReplies,\n handleLoadMoreReplies: handleLoadMoreReplies,\n handleShowReportDialog: handleShowReportDialog,\n needEscape: needEscape\n });\n };\n\n return BaseItem;\n}(React.Component);\n\nBaseItem.propTypes = baseItemPropTypes;\nBaseItem.defaultProps = baseItemDefaultProps;\n\nexports.baseItemDefaultProps = baseItemDefaultProps;\nexports.baseItemPropTypes = baseItemPropTypes;\nexports.default = BaseItem;\n//# sourceMappingURL=base-item.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/comments/lib/base-item.js\n// module id = 23\n// module chunks = 0\n//# sourceURL=webpack:///./~/comments/lib/base-item.js?')},function(module,exports,__webpack_require__){eval("'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _propTypes = __webpack_require__(44);\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = {\n message: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.element]).isRequired,\n action: _propTypes2.default.oneOfType([_propTypes2.default.bool, _propTypes2.default.string, _propTypes2.default.node]),\n onClick: _propTypes2.default.func,\n style: _propTypes2.default.bool,\n actionStyle: _propTypes2.default.object,\n titleStyle: _propTypes2.default.object,\n barStyle: _propTypes2.default.object,\n activeBarStyle: _propTypes2.default.object,\n dismissAfter: _propTypes2.default.oneOfType([_propTypes2.default.bool, _propTypes2.default.number]),\n onDismiss: _propTypes2.default.func,\n className: _propTypes2.default.string,\n activeClassName: _propTypes2.default.string,\n isActive: _propTypes2.default.bool,\n title: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.node])\n};\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/comments/~/react-notification/dist/defaultPropTypes.js\n// module id = 24\n// module chunks = 0\n//# sourceURL=webpack:///./~/comments/~/react-notification/dist/defaultPropTypes.js?")},[147,81],function(module,exports){eval("\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Is = exports.isArray = exports.isEmpty = exports.isFn = exports.isBool = exports.isNil = exports.isUndefined = exports.isNull = exports.isStr = exports.isObj = exports.isNum = void 0;\n/**\n * is primitive number\n * @param val\n */\nfunction isNum(val) {\n return typeof val === 'number';\n}\nexports.isNum = isNum;\n/**\n * is object (not null)\n * @param val\n */\nfunction isObj(val) {\n return typeof val === 'object' && val !== null;\n}\nexports.isObj = isObj;\n/**\n * is primitive string\n * @param val\n */\nfunction isStr(val) {\n return typeof val === 'string';\n}\nexports.isStr = isStr;\n/**\n * is null\n * @param val\n */\nfunction isNull(val) {\n return val === null;\n}\nexports.isNull = isNull;\n/**\n * is undefined\n * @param val\n */\nfunction isUndefined(val) {\n return typeof val === 'undefined';\n}\nexports.isUndefined = isUndefined;\n/**\n * is null or undefined\n * @param val\n */\nfunction isNil(val) {\n return isNull(val) || isUndefined(val);\n}\nexports.isNil = isNil;\n/**\n * is primitive boolean\n * @param val\n */\nfunction isBool(val) {\n return typeof val === 'boolean';\n}\nexports.isBool = isBool;\n/**\n * is primitive function\n * @param val\n */\nfunction isFn(val) {\n return typeof val === 'function';\n}\nexports.isFn = isFn;\n/**\n * is empty string/array or null or undefined\n * @param val\n */\nfunction isEmpty(val) {\n if (exports.isArray(val) || isStr(val)) {\n return !val.length;\n }\n else if (isNil(val)) {\n return true;\n }\n return false;\n}\nexports.isEmpty = isEmpty;\n/**\n * alias to Array.isArray\n */\nexports.isArray = Array.isArray.bind(Array);\n/**\n * js 变量类型判断工具函数\n */\nexports.Is = {\n isArray: exports.isArray,\n isNum: isNum,\n isObj: isObj,\n isStr: isStr,\n isNull: isNull,\n isUndefined: isUndefined,\n isNil: isNil,\n isBool: isBool,\n isEmpty: isEmpty,\n isFn: isFn,\n};\n//# sourceMappingURL=is.js.map\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/fe-utils/lib/lang/is.js\n// module id = 26\n// module chunks = 0\n//# sourceURL=webpack:///./~/fe-utils/lib/lang/is.js?")},function(module,exports){eval("// 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;\n\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\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\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\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}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\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}\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 = {};\n\nfunction noop() {}\n\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;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/process/browser.js\n// module id = 27\n// module chunks = 0\n//# sourceURL=webpack:///./~/process/browser.js?")},function(module,exports,__webpack_require__){eval("'use strict';\n\nvar utils = __webpack_require__(3);\nvar settle = __webpack_require__(57);\nvar buildURL = __webpack_require__(59);\nvar parseHeaders = __webpack_require__(65);\nvar isURLSameOrigin = __webpack_require__(63);\nvar createError = __webpack_require__(31);\n\nmodule.exports = function xhrAdapter(config) {\n return new Promise(function dispatchXhrRequest(resolve, reject) {\n var requestData = config.data;\n var requestHeaders = config.headers;\n\n if (utils.isFormData(requestData)) {\n delete requestHeaders['Content-Type']; // Let the browser set it\n }\n\n var request = new XMLHttpRequest();\n\n // HTTP basic authentication\n if (config.auth) {\n var username = config.auth.username || '';\n var password = config.auth.password || '';\n requestHeaders.Authorization = 'Basic ' + btoa(username + ':' + password);\n }\n\n request.open(config.method.toUpperCase(), buildURL(config.url, config.params, config.paramsSerializer), true);\n\n // Set the request timeout in MS\n request.timeout = config.timeout;\n\n // Listen for ready state\n request.onreadystatechange = function handleLoad() {\n if (!request || request.readyState !== 4) {\n return;\n }\n\n // The request errored out and we didn't get a response, this will be\n // handled by onerror instead\n // With one exception: request that using file: protocol, most browsers\n // will return status as 0 even though it's a successful request\n if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {\n return;\n }\n\n // Prepare the response\n var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null;\n var responseData = !config.responseType || config.responseType === 'text' ? request.responseText : request.response;\n var response = {\n data: responseData,\n status: request.status,\n statusText: request.statusText,\n headers: responseHeaders,\n config: config,\n request: request\n };\n\n settle(resolve, reject, response);\n\n // Clean up request\n request = null;\n };\n\n // Handle low level network errors\n request.onerror = function handleError() {\n // Real errors are hidden from us by the browser\n // onerror should only fire if it's a network error\n reject(createError('Network Error', config, null, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle timeout\n request.ontimeout = function handleTimeout() {\n reject(createError('timeout of ' + config.timeout + 'ms exceeded', config, 'ECONNABORTED',\n request));\n\n // Clean up request\n request = null;\n };\n\n // Add xsrf header\n // This is only done if running in a standard browser environment.\n // Specifically not if we're in a web worker, or react-native.\n if (utils.isStandardBrowserEnv()) {\n var cookies = __webpack_require__(61);\n\n // Add xsrf header\n var xsrfValue = (config.withCredentials || isURLSameOrigin(config.url)) && config.xsrfCookieName ?\n cookies.read(config.xsrfCookieName) :\n undefined;\n\n if (xsrfValue) {\n requestHeaders[config.xsrfHeaderName] = xsrfValue;\n }\n }\n\n // Add headers to the request\n if ('setRequestHeader' in request) {\n utils.forEach(requestHeaders, function setRequestHeader(val, key) {\n if (typeof requestData === 'undefined' && key.toLowerCase() === 'content-type') {\n // Remove Content-Type if data is undefined\n delete requestHeaders[key];\n } else {\n // Otherwise add header to the request\n request.setRequestHeader(key, val);\n }\n });\n }\n\n // Add withCredentials to request if needed\n if (config.withCredentials) {\n request.withCredentials = true;\n }\n\n // Add responseType to request if needed\n if (config.responseType) {\n try {\n request.responseType = config.responseType;\n } catch (e) {\n // Expected DOMException thrown by browsers not compatible XMLHttpRequest Level 2.\n // But, this can be suppressed for 'json' type as it can be parsed by default 'transformResponse' function.\n if (config.responseType !== 'json') {\n throw e;\n }\n }\n }\n\n // Handle progress if needed\n if (typeof config.onDownloadProgress === 'function') {\n request.addEventListener('progress', config.onDownloadProgress);\n }\n\n // Not all browsers support upload events\n if (typeof config.onUploadProgress === 'function' && request.upload) {\n request.upload.addEventListener('progress', config.onUploadProgress);\n }\n\n if (config.cancelToken) {\n // Handle cancellation\n config.cancelToken.promise.then(function onCanceled(cancel) {\n if (!request) {\n return;\n }\n\n request.abort();\n reject(cancel);\n // Clean up request\n request = null;\n });\n }\n\n if (requestData === undefined) {\n requestData = null;\n }\n\n // Send the request\n request.send(requestData);\n });\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/axios/lib/adapters/xhr.js\n// module id = 28\n// module chunks = 0\n//# sourceURL=webpack:///./~/axios/lib/adapters/xhr.js?");},function(module,exports){eval("'use strict';\n\n/**\n * A `Cancel` is an object that is thrown when an operation is canceled.\n *\n * @class\n * @param {string=} message The message.\n */\nfunction Cancel(message) {\n this.message = message;\n}\n\nCancel.prototype.toString = function toString() {\n return 'Cancel' + (this.message ? ': ' + this.message : '');\n};\n\nCancel.prototype.__CANCEL__ = true;\n\nmodule.exports = Cancel;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/axios/lib/cancel/Cancel.js\n// module id = 29\n// module chunks = 0\n//# sourceURL=webpack:///./~/axios/lib/cancel/Cancel.js?")},function(module,exports){eval("'use strict';\n\nmodule.exports = function isCancel(value) {\n return !!(value && value.__CANCEL__);\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/axios/lib/cancel/isCancel.js\n// module id = 30\n// module chunks = 0\n//# sourceURL=webpack:///./~/axios/lib/cancel/isCancel.js?")},function(module,exports,__webpack_require__){eval("'use strict';\n\nvar enhanceError = __webpack_require__(56);\n\n/**\n * Create an Error with the specified message, config, error code, request and response.\n *\n * @param {string} message The error message.\n * @param {Object} config The config.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n * @returns {Error} The created error.\n */\nmodule.exports = function createError(message, config, code, request, response) {\n var error = new Error(message);\n return enhanceError(error, config, code, request, response);\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/axios/lib/core/createError.js\n// module id = 31\n// module chunks = 0\n//# sourceURL=webpack:///./~/axios/lib/core/createError.js?")},function(module,exports){eval("'use strict';\n\nmodule.exports = function bind(fn, thisArg) {\n return function wrap() {\n var args = new Array(arguments.length);\n for (var i = 0; i < args.length; i++) {\n args[i] = arguments[i];\n }\n return fn.apply(thisArg, args);\n };\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/axios/lib/helpers/bind.js\n// module id = 32\n// module chunks = 0\n//# sourceURL=webpack:///./~/axios/lib/helpers/bind.js?")},function(module,exports,__webpack_require__){eval("'use strict';\n\n/**\n * Module dependenices\n */\n\nconst clone = __webpack_require__(143);\nconst typeOf = __webpack_require__(75);\nconst isPlainObject = __webpack_require__(130);\n\nfunction cloneDeep(val, instanceClone) {\n switch (typeOf(val)) {\n case 'object':\n return cloneObjectDeep(val, instanceClone);\n case 'array':\n return cloneArrayDeep(val, instanceClone);\n default: {\n return clone(val);\n }\n }\n}\n\nfunction cloneObjectDeep(val, instanceClone) {\n if (typeof instanceClone === 'function') {\n return instanceClone(val);\n }\n if (instanceClone || isPlainObject(val)) {\n const res = new val.constructor();\n for (let key in val) {\n res[key] = cloneDeep(val[key], instanceClone);\n }\n return res;\n }\n return val;\n}\n\nfunction cloneArrayDeep(val, instanceClone) {\n const res = new val.constructor(val.length);\n for (let i = 0; i < val.length; i++) {\n res[i] = cloneDeep(val[i], instanceClone);\n }\n return res;\n}\n\n/**\n * Expose `cloneDeep`\n */\n\nmodule.exports = cloneDeep;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/clone-deep/index.js\n// module id = 33\n// module chunks = 0\n//# sourceURL=webpack:///./~/clone-deep/index.js?")},function(module,exports,__webpack_require__){eval('\'use strict\';\n\nObject.defineProperty(exports, \'__esModule\', { value: true });\n\nfunction _interopDefault (ex) { return (ex && (typeof ex === \'object\') && \'default\' in ex) ? ex[\'default\'] : ex; }\n\nvar __chunk_1 = __webpack_require__(1);\n__webpack_require__(6);\n__webpack_require__(10);\nvar React = __webpack_require__(2);\nvar React__default = _interopDefault(React);\nvar __chunk_3 = __webpack_require__(4);\n__webpack_require__(5);\nvar userSelect = __webpack_require__(12);\nvar __chunk_4 = __webpack_require__(9);\n__webpack_require__(7);\nvar __chunk_5 = __webpack_require__(11);\n__webpack_require__(8);\n\nvar css = "@charset \\"UTF-8\\";\\n/**\\n * @Desc 添加评论\\n *\\n * @Author wangyanhong\\n * @Date 2019-05-16\\n */\\ntextarea {\\n resize: none;\\n}\\n\\nul, li {\\n list-style: none;\\n}\\n\\n.hide {\\n display: none;\\n}\\n\\n.comment-editor {\\n display: flex;\\n}\\n.comment-editor .form-field {\\n flex: 1;\\n margin-left: 20px;\\n position: relative;\\n}\\n.comment-editor .form-foot {\\n display: flex;\\n justify-content: space-between;\\n margin-top: 10px;\\n}\\n.comment-editor .form-foot-item:nth-child(1) {\\n display: flex;\\n justify-content: flex-start;\\n align-items: center;\\n}\\n.comment-editor .form-foot-item:nth-child(1) label {\\n cursor: pointer;\\n display: flex;\\n align-items: center;\\n}\\n.comment-editor .form-foot-item:nth-child(1) input[name=sync_to_mb] {\\n margin: 0 5px 0 0;\\n cursor: pointer;\\n}\\n.comment-editor .form-foot-item:nth-child(2).limit-count {\\n margin-left: 15px;\\n display: flex;\\n align-items: center;\\n color: #ccc;\\n}\\n.comment-editor .form-foot-item:nth-child(2).limit-count.overflow {\\n color: #c34;\\n}\\n.comment-editor .form-foot-item:nth-child(3) {\\n flex: 1;\\n display: flex;\\n justify-content: flex-end;\\n align-items: center;\\n}\\n.comment-editor .form-foot-item:last-child {\\n margin-left: 15px;\\n}\\n.comment-editor textarea {\\n font: 13px Helvetica, Arial, sans-serif;\\n}\\n\\n.no-add-comment {\\n height: 80px;\\n line-height: 80px;\\n color: #c0c0c0;\\n text-align: center;\\n background: #f7f7f7;\\n}";\n__chunk_1.styleInject(css);\n\nvar css$1 = "/*\\n* @Author: hanjiyun\\n* @Date: 2019-05-28 17:02:10\\n* @Last Modified by: hanjiyun\\n* @Last Modified time: 2019-05-28 17:03:05\\n*/\\n.comment-author-avatar img {\\n display: block;\\n}";\n__chunk_1.styleInject(css$1);\n\nvar avatarPropTypes = {\n url: __chunk_1.PropTypes.string,\n avatar: __chunk_1.PropTypes.string,\n size: __chunk_1.PropTypes.number\n};\nvar avatarDefaultProps = {\n url: \'\',\n avatar: \'https://img9.doubanio.com/icon/user_normal.jpg\',\n size: 48\n};\n\nvar Avatar =\n/*#__PURE__*/\nfunction (_Component) {\n __chunk_1._inheritsLoose(Avatar, _Component);\n\n function Avatar() {\n return _Component.apply(this, arguments) || this;\n }\n\n var _proto = Avatar.prototype;\n\n _proto.render = function render() {\n var _this$props = this.props,\n url = _this$props.url,\n avatar = _this$props.avatar,\n size = _this$props.size;\n return React__default.createElement("div", {\n className: "comment-author-avatar"\n }, React__default.createElement("a", {\n href: url\n }, React__default.createElement("img", {\n src: avatar,\n height: size,\n width: size\n })));\n };\n\n return Avatar;\n}(React.Component);\n\nAvatar.propTypes = avatarPropTypes;\nAvatar.defaultProps = avatarDefaultProps;\n\nvar commentEditorPropTypes = {\n config: __chunk_1.PropTypes.object,\n btnText: __chunk_1.PropTypes.string,\n user: __chunk_1.PropTypes.object,\n author: __chunk_1.PropTypes.object,\n maxLength: __chunk_1.PropTypes.number,\n enableSyncToStatus: __chunk_1.PropTypes.bool,\n // 是否开启「同步到广播」功能\n canComment: __chunk_1.PropTypes.bool,\n // 能否评论\n forbiddenCommentMessage: __chunk_1.PropTypes.string,\n // 不能评论时,展示的文案\n onlyFriendCanComment: __chunk_1.PropTypes.bool,\n // 仅好友可评论\n canAtSb: __chunk_1.PropTypes.bool,\n // 能否at某人\n replyUsers: __chunk_1.PropTypes.array,\n handleAddComment: __chunk_1.PropTypes.func\n};\nvar commentEditorDefaultProps = {\n config: null,\n btnText: \'加上去\',\n forbiddenCommentMessage: \'已禁止回应\',\n user: null,\n author: null,\n maxLength: 0,\n enableSyncToStatus: false,\n canComment: true,\n onlyFriendCanComment: false,\n canAtSb: false,\n replyUsers: null,\n handleAddComment: function handleAddComment() {}\n};\n\nvar CommentEditor =\n/*#__PURE__*/\nfunction (_Component) {\n __chunk_1._inheritsLoose(CommentEditor, _Component);\n\n function CommentEditor(props) {\n var _this;\n\n _this = _Component.call(this, props) || this;\n _this.state = {\n text: \'\',\n // 文本框输入内容\n textWithTinyUrl: \'\',\n // 链接替换为短链后,用于计算文本长度\n upload_file: null,\n // 如果可以上传图片,图片地址\n checked: false,\n showCaptcha: false,\n // 显示验证码\n captchaObj: null,\n captchaSolution: \'\',\n captchaErrorMsg: \'\',\n submittingStatus: __chunk_5.DEFAULT,\n replyUsers: props.replyUsers,\n objUsers: {},\n uploaded: false\n };\n return _this;\n }\n\n var _proto = CommentEditor.prototype;\n\n _proto.handleAddComment = function handleAddComment(e) {\n var _this2 = this;\n\n if (e) {\n e.preventDefault();\n }\n\n if (window._USER_ABNORMAL) {\n window.show_abnormal && window.show_abnormal();\n return;\n }\n\n var _this$state = this.state,\n text = _this$state.text,\n checked = _this$state.checked,\n showCaptcha = _this$state.showCaptcha,\n captchaObj = _this$state.captchaObj,\n captchaSolution = _this$state.captchaSolution,\n submittingStatus = _this$state.submittingStatus,\n objUsers = _this$state.objUsers,\n upload_file = _this$state.upload_file;\n\n if (submittingStatus === __chunk_5.PENDING) {\n return;\n }\n\n this.setState({\n submittingStatus: __chunk_5.PENDING\n });\n\n var successCallback = function successCallback() {\n // 提交成功后,清空输入框、清空验证码相关、清空之前勾选的「转发到广播」\n _this2.setState({\n text: \'\',\n textWithTinyUrl: \'\',\n showCaptcha: false,\n captchaObj: null,\n captchaErrorMsg: \'\',\n captchaSolution: \'\',\n checked: false,\n submittingStatus: __chunk_5.SUCCESS,\n replyUsers: _this2.props.replyUsers,\n uploaded: false\n });\n };\n\n var failCallback = function failCallback(code, data, errorMsg) {\n if (code === 1001 && data) {\n _this2.setState({\n submittingStatus: __chunk_5.FAIL,\n showCaptcha: true,\n captchaObj: data,\n captchaErrorMsg: errorMsg === \'验证码错误\' ? \'\' : errorMsg\n }); // 需要答题\n\n } else if (code === 1003 && data.exam_topic) {\n _this2.setState({\n submittingStatus: __chunk_5.FAIL\n }, function () {\n openExam && openExam(data.exam_topic, data.flow, _this2.handleAddComment.bind(_this2));\n });\n } else {\n _this2.setState({\n submittingStatus: __chunk_5.FAIL\n });\n }\n };\n\n var submit_text = text;\n\n for (var k in objUsers) {\n submit_text = submit_text.replace(new RegExp("@" + objUsers[k].username + " ", \'g\'), "@" + k + " ");\n }\n\n var newComment = {\n rv_comment: submit_text,\n // ref_cid: \'\', // 回应的 id,因为是一级回应,所以不需要此字段\n sync_to_mb: checked ? \'on\' : \'\' // 是否用同步到广播 (后端的判断是:传 \'on\' 就转发,不是 true false 或者 off)\n // 如果需要输入验证码,则附上验证码的输入结果和相应的 id\n\n };\n\n if (captchaObj || showCaptcha) {\n /*\n * 这里本来是打算做下前端拦截的,结果发现点击验证码图片后刷新\n * 验证码的逻辑是:直接重新提交一次数据,根据返回的错误来刷新验证码\n * 所以这里如果有前端判断拦截,就会拦住请求,导致拿不到新的验证码,所以\n * 校验都交给后端了\n */\n // if (captchaSolution.length === 0) {\n // this.setState({\n // captchaErrorMsg: \'请输入图片中的单词\'\n // })\n // return\n // }\n newComment[\'captcha-id\'] = captchaObj.captcha_id;\n newComment[\'captcha-solution\'] = captchaSolution;\n }\n\n if (this.props.canUploadFile && upload_file) {\n newComment.upload_file = upload_file;\n }\n\n this.props.handleAddComment(newComment, successCallback, failCallback);\n };\n\n _proto.handleChange = function handleChange(val, objUsers) {\n this.setState({\n text: val,\n objUsers: objUsers,\n textWithTinyUrl: val && val.replace(new RegExp(__chunk_4.URL_RE, \'gm\'), __chunk_4.HTTPS_SHORT_DOUBAN + "XXXXXX") || \'\'\n });\n };\n\n _proto.handleChecked = function handleChecked() {\n this.setState({\n checked: !this.state.checked\n });\n };\n\n _proto.handleCaptchaSolutionChange = function handleCaptchaSolutionChange(e) {\n this.setState({\n captchaSolution: e.target.value\n });\n };\n\n _proto.handleChangeFile = function handleChangeFile(file) {\n this.setState({\n upload_file: file || null,\n uploaded: !!file\n });\n };\n\n _proto.render = function render() {\n var _this3 = this;\n\n var _this$props = this.props,\n btnText = _this$props.btnText,\n user = _this$props.user,\n author = _this$props.author,\n canAtSb = _this$props.canAtSb,\n replyUsers = _this$props.replyUsers,\n enableSyncToStatus = _this$props.enableSyncToStatus,\n canComment = _this$props.canComment,\n forbiddenCommentMessage = _this$props.forbiddenCommentMessage,\n onlyFriendCanComment = _this$props.onlyFriendCanComment,\n canUploadFile = _this$props.canUploadFile,\n maxLength = _this$props.maxLength,\n config = _this$props.config;\n var _this$state2 = this.state,\n text = _this$state2.text,\n textWithTinyUrl = _this$state2.textWithTinyUrl,\n upload_file = _this$state2.upload_file,\n uploaded = _this$state2.uploaded,\n checked = _this$state2.checked,\n showCaptcha = _this$state2.showCaptcha,\n captchaObj = _this$state2.captchaObj,\n captchaSolution = _this$state2.captchaSolution,\n captchaErrorMsg = _this$state2.captchaErrorMsg,\n submittingStatus = _this$state2.submittingStatus;\n\n if (!user) {\n return React__default.createElement("a", {\n className: "show_login",\n href: "https://accounts.douban.com/passport/login?redir=" + encodeURIComponent(window.location.href)\n }, "> \\u6211\\u6765\\u56DE\\u5E94");\n }\n\n var disabled = !canComment || submittingStatus === __chunk_5.PENDING;\n var submitBtn = React__default.createElement("button", {\n type: "submit",\n disabled: disabled,\n className: __chunk_3.classnames(\'comment-form-btn\', {\n disabled: disabled\n })\n }, submittingStatus === __chunk_5.PENDING ? \'提交中\' : btnText);\n var maxLen = 0; // 如果要转发到广播,最多 140\n\n if (checked) {\n maxLen = __chunk_4.MAX_STATUS_LENGTH; // 广播下的回复字数最多 280,其他的不限字数\n } else if (config.service && config.service === __chunk_4.STATUS) {\n maxLen = __chunk_4.MAX_STATUS_COMMENTS_LENGTH;\n } else {\n maxLen = maxLength;\n }\n\n return React__default.createElement("div", {\n className: "comment-editor"\n }, React__default.createElement(Avatar, {\n url: "https://www.douban.com/people/" + user.id,\n avatar: user.avatar,\n size: 48\n }), canComment ? React__default.createElement("form", {\n className: "form-field",\n onSubmit: this.handleAddComment.bind(this)\n }, React__default.createElement(userSelect.UserSelect, {\n inputType: "area",\n text: text,\n maxLength: maxLen,\n uploadFile: upload_file,\n uploaded: uploaded,\n replyUsers: replyUsers,\n canAtSb: canAtSb,\n canUploadFile: canUploadFile,\n handleChange: this.handleChange.bind(this),\n handleChangeFile: this.handleChangeFile.bind(this)\n }), React__default.createElement("div", {\n className: "form-foot"\n }, React__default.createElement("div", {\n className: "form-foot-item"\n }, enableSyncToStatus ? React__default.createElement("label", null, React__default.createElement("input", {\n type: "checkbox",\n name: "sync_to_mb",\n checked: checked,\n onChange: function onChange() {\n return _this3.handleChecked();\n }\n }), "\\u8F6C\\u53D1\\u5230\\u5E7F\\u64AD") : null), React__default.createElement("div", {\n className: __chunk_3.classnames(\'form-foot-item\', \'limit-count\', {\n overflow: text.length >= maxLen\n })\n }, maxLen && maxLen - textWithTinyUrl.length < 20 ? React__default.createElement("span", null, textWithTinyUrl && textWithTinyUrl.length ? textWithTinyUrl.length + "/" : null, maxLen) : null), React__default.createElement("div", {\n className: "form-foot-item"\n }, showCaptcha && captchaObj ? React__default.createElement("div", {\n className: "captcha-wrapper"\n }, React__default.createElement("img", {\n className: "captcha-img",\n src: captchaObj.captcha_img,\n onClick: this.handleAddComment.bind(this)\n }), React__default.createElement("input", {\n type: "text",\n placeholder: "\\u8BF7\\u8F93\\u5165\\u5DE6\\u56FE\\u7684\\u9A8C\\u8BC1\\u7801",\n value: captchaSolution,\n className: "captcha-input",\n onChange: this.handleCaptchaSolutionChange.bind(this)\n }), React__default.createElement("div", {\n className: "captcha-error-msg"\n }, captchaErrorMsg ? "*" + captchaErrorMsg : \'\')) : null), React__default.createElement("div", {\n className: "form-foot-item"\n }, submitBtn))) : !author.is_friend && onlyFriendCanComment ? React__default.createElement("div", {\n className: "form-field no-add-comment"\n }, "\\u53D1\\u5E03\\u8005\\u8FD8\\u6CA1\\u5173\\u6CE8\\u4F60\\uFF0C\\u4EC5\\u5141\\u8BB8\\u53D1\\u5E03\\u8005\\u5173\\u6CE8\\u7684\\u4EBA\\u56DE\\u5E94") : React__default.createElement("div", {\n className: "form-field no-add-comment"\n }, forbiddenCommentMessage || \'已禁止回应\'));\n };\n\n return CommentEditor;\n}(React.Component);\n\nCommentEditor.propTypes = commentEditorPropTypes;\nCommentEditor.defaultProps = commentEditorDefaultProps;\n\nexports.commentEditorDefaultProps = commentEditorDefaultProps;\nexports.commentEditorPropTypes = commentEditorPropTypes;\nexports.default = CommentEditor;\n//# sourceMappingURL=comment-editor.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/comments/lib/comment-editor.js\n// module id = 34\n// module chunks = 0\n//# sourceURL=webpack:///./~/comments/lib/comment-editor.js?')},function(module,exports,__webpack_require__){eval("'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\nfunction _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }\n\nvar __chunk_1 = __webpack_require__(1);\n__webpack_require__(6);\n__webpack_require__(10);\nvar React = __webpack_require__(2);\nvar React__default = _interopDefault(React);\n__webpack_require__(4);\nvar baseItem = __webpack_require__(23);\n__webpack_require__(18);\n__webpack_require__(19);\n__webpack_require__(15);\n__webpack_require__(5);\n__webpack_require__(12);\n__webpack_require__(14);\n__webpack_require__(9);\n__webpack_require__(7);\n__webpack_require__(11);\n__webpack_require__(8);\n__webpack_require__(20);\n__webpack_require__(17);\n\nvar css = \"/*\\n* @Author: hanjiyun\\n* @Date: 2019-05-13 19:19:53\\n* @Last Modified by: hanjiyun\\n* @Last Modified time: 2019-05-25 23:05:47\\n*/\";\n__chunk_1.styleInject(css);\n\nvar commentListPropTypes = {\n config: __chunk_1.PropTypes.object.isRequired,\n bgColor: __chunk_1.PropTypes.string,\n target: __chunk_1.PropTypes.object,\n comments: __chunk_1.PropTypes.array,\n canAtSb: __chunk_1.PropTypes.bool,\n maxLength: __chunk_1.PropTypes.number,\n replyUsers: __chunk_1.PropTypes.array,\n handleAddReply: __chunk_1.PropTypes.func,\n handleDelete: __chunk_1.PropTypes.func,\n handleLoadMoreReplies: __chunk_1.PropTypes.func,\n handleShowReportDialog: __chunk_1.PropTypes.func,\n needEscape: __chunk_1.PropTypes.bool\n};\nvar commentListDefaultProps = {\n config: null,\n bgColor: '',\n target: null,\n comments: [],\n canAtSb: false,\n maxLength: 0,\n replyUsers: [],\n handleAddReply: function handleAddReply() {},\n handleDelete: function handleDelete() {},\n handleLoadMoreReplies: function handleLoadMoreReplies() {},\n handleShowReportDialog: function handleShowReportDialog() {},\n needEscape: true\n};\n\nvar CommentList =\n/*#__PURE__*/\nfunction (_Component) {\n __chunk_1._inheritsLoose(CommentList, _Component);\n\n function CommentList() {\n return _Component.apply(this, arguments) || this;\n }\n\n var _proto = CommentList.prototype;\n\n _proto.render = function render() {\n var _this$props = this.props,\n config = _this$props.config,\n bgColor = _this$props.bgColor,\n target = _this$props.target,\n comments = _this$props.comments,\n canAtSb = _this$props.canAtSb,\n maxLength = _this$props.maxLength,\n replyUsers = _this$props.replyUsers,\n truncation = _this$props.truncation,\n handleAddReply = _this$props.handleAddReply,\n handleDelete = _this$props.handleDelete,\n handleLoadMoreReplies = _this$props.handleLoadMoreReplies,\n handleFoldReplies = _this$props.handleFoldReplies,\n handleShowReportDialog = _this$props.handleShowReportDialog,\n needEscape = _this$props.needEscape;\n\n if (!comments || comments.length === 0) {\n return null;\n }\n\n return React__default.createElement(\"div\", {\n className: \"comment-list-wrapper\"\n }, comments.map(function (comment, index) {\n return React__default.createElement(baseItem.default, {\n config: config,\n key: \"_comment_\" + index,\n type: \"comment\",\n bgColor: bgColor,\n target: target,\n comment: comment,\n canAtSb: canAtSb,\n maxLength: maxLength,\n replyUsers: replyUsers,\n truncation: truncation,\n handleAddReply: handleAddReply,\n handleDelete: handleDelete,\n handleFoldReplies: handleFoldReplies,\n handleLoadMoreReplies: handleLoadMoreReplies,\n handleShowReportDialog: handleShowReportDialog,\n needEscape: needEscape\n });\n }));\n };\n\n return CommentList;\n}(React.Component);\n\nCommentList.propTypes = commentListPropTypes;\nCommentList.defaultProps = commentListDefaultProps;\n\nexports.commentListDefaultProps = commentListDefaultProps;\nexports.commentListPropTypes = commentListPropTypes;\nexports.default = CommentList;\n//# sourceMappingURL=comment-list.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/comments/lib/comment-list.js\n// module id = 35\n// module chunks = 0\n//# sourceURL=webpack:///./~/comments/lib/comment-list.js?")},function(module,exports,__webpack_require__){eval('\'use strict\';\n\nObject.defineProperty(exports, \'__esModule\', { value: true });\n\nfunction _interopDefault (ex) { return (ex && (typeof ex === \'object\') && \'default\' in ex) ? ex[\'default\'] : ex; }\n\nvar __chunk_1 = __webpack_require__(1);\nvar React = __webpack_require__(2);\nvar React__default = _interopDefault(React);\n__webpack_require__(4);\n\nvar css = ".paginator {\\n color: #aaa;\\n margin: 20px 0;\\n text-align: center;\\n font-size: 14px;\\n}\\n.paginator a {\\n padding: 0 4px;\\n margin: 2px;\\n}\\n.paginator .prev {\\n margin-right: 20px;\\n}\\n.paginator .next {\\n margin-left: 20px;\\n}\\n.paginator .thispage {\\n padding: 0px 4px;\\n margin: 2px;\\n color: #fff;\\n background: #83BF73;\\n}";\n__chunk_1.styleInject(css);\n\nvar paginatorPropTypes = {\n app: __chunk_1.PropTypes.string,\n service: __chunk_1.PropTypes.string,\n total: __chunk_1.PropTypes.number,\n start: __chunk_1.PropTypes.number,\n count: __chunk_1.PropTypes.number,\n prevText: __chunk_1.PropTypes.string,\n nextText: __chunk_1.PropTypes.string\n};\nvar paginatorDefaultProps = {\n app: \'movie\',\n service: \'review\',\n total: 0,\n start: 0,\n count: 0,\n prevText: \'<前页\',\n nextText: \'后页>\'\n};\n\nvar Paginator =\n/*#__PURE__*/\nfunction (_Component) {\n __chunk_1._inheritsLoose(Paginator, _Component);\n\n function Paginator() {\n return _Component.apply(this, arguments) || this;\n }\n\n var _proto = Paginator.prototype;\n\n _proto.getTotalPages = function getTotalPages() {\n var _this$props = this.props,\n count = _this$props.count,\n total = _this$props.total;\n return Math.floor(total / count) + (total % count > 0 ? 1 : 0);\n };\n\n _proto.updateUrl = function updateUrl(newPage) {\n var _window = window,\n location = _window.location;\n var origin = location.origin;\n var pathname = location.pathname;\n var hash = location.hash;\n return "" + origin + pathname + "?start=" + newPage + (hash || \'#comments\');\n };\n\n _proto.renderItem = function renderItem(page) {\n var count = this.props.count; // TODO:\n // 1. 可以根据 app 和 service 组合出 url,但要考虑到有的业务线 app 名称不是直接用做二级域名\n // 小组: https://www.douban.com/group/topic/111111\n // 相册: https://www.douban.com/photos/album/68394634/?start=18\n // 2. query 可以用 getQuery() 动态获取后设置,而不是像这样写死,比如可能会有其他的参数\n // 长评: https://movie.douban.com/review/9832773/?tab=comments#comments\n\n var pageLink = this.updateUrl((page - 1) * count);\n return React__default.createElement("a", {\n href: pageLink,\n key: "_page_" + page\n }, page);\n };\n\n _proto.renderItems = function renderItems(currentPage) {\n var winglen = 4;\n var total = this.getTotalPages();\n var break1 = currentPage > winglen * 2 + 2;\n var break2 = total - currentPage > winglen * 2 + 1;\n var start = break1 ? Math.min(currentPage - winglen, total - winglen * 2) : 1;\n var end = break2 ? Math.max(currentPage + winglen, winglen * 2 + 1) : total;\n var pageItemList = [];\n\n if (break1) {\n pageItemList.push(this.renderItem(1));\n pageItemList.push(this.renderItem(2));\n pageItemList.push(React__default.createElement("span", {\n className: "break",\n key: "break_1"\n }, "..."));\n }\n\n for (var i = start; i < end + 1; i++) {\n if (currentPage === i) {\n pageItemList.push(React__default.createElement("span", {\n className: "thispage",\n key: "_page_" + i\n }, i));\n } else {\n pageItemList.push(this.renderItem(i));\n }\n }\n\n if (break2) {\n pageItemList.push(React__default.createElement("span", {\n className: "break",\n key: "break_2"\n }, "..."));\n pageItemList.push(this.renderItem(total - 1));\n pageItemList.push(this.renderItem(total));\n }\n\n return pageItemList;\n };\n\n _proto.render = function render() {\n var _this$props2 = this.props,\n start = _this$props2.start,\n count = _this$props2.count,\n prevText = _this$props2.prevText,\n nextText = _this$props2.nextText;\n var current = Math.floor(start / count) + 1;\n var total = this.getTotalPages();\n\n if (!total) {\n return null;\n }\n\n if (current >= total) {\n current = total;\n } // TODO: use getQuery()\n\n\n var prevLink = this.updateUrl((current - 2) * count);\n var nextLink = this.updateUrl(current * count);\n return React__default.createElement("div", {\n className: "paginator"\n }, current !== 1 ? React__default.createElement("a", {\n className: "prev",\n href: prevLink\n }, prevText) : React__default.createElement("span", {\n className: "prev"\n }, prevText), this.renderItems(current), current !== total ? React__default.createElement("a", {\n className: "next",\n href: nextLink\n }, nextText) : React__default.createElement("span", {\n className: "next"\n }, nextText));\n };\n\n return Paginator;\n}(React.Component);\n\nPaginator.propTypes = paginatorPropTypes;\nPaginator.defaultProps = paginatorDefaultProps;\n\nexports.default = Paginator;\nexports.paginatorDefaultProps = paginatorDefaultProps;\nexports.paginatorPropTypes = paginatorPropTypes;\n//# sourceMappingURL=paginator.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/comments/lib/paginator.js\n// module id = 36\n// module chunks = 0\n//# sourceURL=webpack:///./~/comments/lib/paginator.js?')},function(module,exports,__webpack_require__){eval('\'use strict\';\n\nObject.defineProperty(exports, \'__esModule\', { value: true });\n\nfunction _interopDefault (ex) { return (ex && (typeof ex === \'object\') && \'default\' in ex) ? ex[\'default\'] : ex; }\n\nvar __chunk_1 = __webpack_require__(1);\nvar __chunk_2 = __webpack_require__(6);\nvar React = __webpack_require__(2);\nvar React__default = _interopDefault(React);\nvar __chunk_3 = __webpack_require__(4);\n\nvar css = "@charset \\"UTF-8\\";\\n/**\\n * @Desc 投诉弹窗\\n *\\n * @Author wangyanhong\\n * @Date 2019-05-15\\n */\\n.report-dialog {\\n width: 380px;\\n position: fixed;\\n top: 50%;\\n left: 50%;\\n transform: translate(-50%, -50%);\\n z-index: 999;\\n}\\n.report-dialog-shd {\\n border-radius: 5px;\\n position: absolute;\\n left: -8px;\\n top: -8px;\\n width: 100%;\\n height: 100%;\\n padding: 8px;\\n background: #666;\\n opacity: 0.4;\\n}\\n.report-dialog-content {\\n position: relative;\\n z-index: 2;\\n background: #fff;\\n border: 1px solid #bbb;\\n border-radius: 4px;\\n}\\n.report-dialog-close {\\n position: absolute;\\n top: 13px;\\n right: 12px;\\n padding: 0 3px;\\n z-index: 1;\\n font: 11px/1.2 \\"Comic Sans MS\\", sans-serif;\\n}\\n.report-hd {\\n padding: 10px 10px 6px;\\n background: #ebf5eb;\\n font-size: 14px;\\n -moz-border-radius: 4px;\\n border-radius: 4px 4px 0 0;\\n}\\n.report-hd h3 {\\n margin: 0;\\n line-height: 1.8;\\n color: #072;\\n font-size: 15px;\\n font-weight: normal;\\n background: none;\\n}\\n.report-bd {\\n padding: 20px 20px 20px 40px;\\n font-size: 13px;\\n color: #0E0E0E;\\n}\\n.report-bd ul, .report-bd li {\\n padding: 0;\\n margin: 0;\\n}\\n.report-bd a {\\n text-decoration: none;\\n}\\n.report-bd a:hover {\\n background: transparent;\\n}\\n.report-bd .extra-options {\\n border-top: 1px solid #dfdfdf;\\n margin-top: 16px;\\n padding-top: 16px;\\n}\\n.report-bd .extra-options .link {\\n color: #0E0E0E;\\n font-size: 13px;\\n height: 18px;\\n line-height: 18px;\\n}\\n.report-bd .extra-options .link:after {\\n content: \\"\\";\\n display: inline-block;\\n vertical-align: middle;\\n width: 18px;\\n height: 18px;\\n margin-top: -1px;\\n margin-left: 4px;\\n background: url(\\"https://img9.doubanio.com/f/shire/c0c3478524c9338ace2ea316b6a74d1dc493d748/pics/icon/more@2x.png\\") no-repeat center;\\n background-size: contain;\\n}\\n.report-bd .extra-options .desc {\\n font-size: 13px;\\n color: #9B9B9B;\\n}\\n.report .bn-flat {\\n text-align: center;\\n}\\n.report .bn-flat .btn-report {\\n display: inline-block;\\n height: 25px;\\n border-width: 1px;\\n border-style: solid;\\n border-color: #bbb #bbb #999;\\n padding: 0 14px;\\n color: #333;\\n font-size: 12px;\\n line-height: 25px;\\n cursor: pointer;\\n border-radius: 3px;\\n -webkit-appearance: none;\\n background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #fcfcfc), color-stop(1, #e9e9e9));\\n}\\n\\n.loading-wrapper {\\n display: flex;\\n align-items: center;\\n}\\n\\n.loading-icon {\\n display: inline-block;\\n width: 16px;\\n height: 16px;\\n margin-right: 10px;\\n background: url(\\"//img3.doubanio.com/img/files/file-1578038285.gif\\") center center no-repeat;\\n background-size: 16px;\\n}";\n__chunk_1.styleInject(css);\n\nvar reportPropTypes = {\n isShowDialog: __chunk_1.PropTypes.bool,\n isFetchingReportReasons: __chunk_1.PropTypes.bool,\n handleHideReportDialog: __chunk_1.PropTypes.func,\n handleSubmitReport: __chunk_1.PropTypes.func\n};\nvar reportDefaultProps = {\n isShowDialog: false,\n isFetchingReportReasons: false,\n reasons: [],\n handleHideReportDialog: function handleHideReportDialog() {},\n handleSubmitReport: function handleSubmitReport() {}\n};\n\nvar Report =\n/*#__PURE__*/\nfunction (_Component) {\n __chunk_1._inheritsLoose(Report, _Component);\n\n function Report() {\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 = _Component.call.apply(_Component, [this].concat(args)) || this;\n _this.state = {\n hd: \'选择投诉原因\',\n bd: \'\',\n selected: 0\n };\n return _this;\n }\n\n var _proto = Report.prototype;\n\n _proto.hideReportDialog = function hideReportDialog(e) {\n e.preventDefault();\n this.props.handleHideReportDialog();\n };\n\n _proto.handleSubmitReport = function handleSubmitReport(e) {\n e.preventDefault();\n var selected = this.state.selected;\n this.props.handleSubmitReport(selected);\n return false;\n };\n\n _proto.handleChange = function handleChange(e) {\n this.setState({\n selected: e.target.value\n });\n };\n\n _proto.renderReportHtml = function renderReportHtml() {\n var _this2 = this;\n\n var _this$props = this.props,\n reasons = _this$props.reasons,\n isFetchingReportReasons = _this$props.isFetchingReportReasons;\n\n if (isFetchingReportReasons) {\n return React__default.createElement("div", {\n className: "loading-wrapper"\n }, React__default.createElement("i", {\n className: "loading-icon"\n }), "\\u52A0\\u8F7D\\u4E2D");\n }\n\n var REASON_SORT_BY = [3, 7, 0, 1, 13, 2, 6, 10, 9, 12];\n var REASONS = {};\n reasons.map(function (reason, i) {\n var _Object$assign2;\n\n REASONS = __chunk_2._Object$assign(REASONS, (_Object$assign2 = {}, _Object$assign2[reason.id] = reason.name, _Object$assign2));\n });\n\n if (this.props.reportType.indexOf(\'subject\') > -1) {\n REASONS = __chunk_2._Object$assign(REASONS, {\n 11: \'与作品或讨论区主题无关\'\n });\n }\n\n var showableReasons = __chunk_2._Object$keys(REASONS).sort(function (k_a, k_b) {\n var i_a = REASON_SORT_BY.indexOf(Number(k_a));\n var i_b = REASON_SORT_BY.indexOf(Number(k_b));\n\n if (i_a === -1) {\n return 1;\n }\n\n if (i_b === -1) {\n return -1;\n }\n\n return i_a - i_b;\n }).map(function (key) {\n return {\n name: REASONS[key],\n key: key\n };\n }).concat({\n name: \'其他原因\',\n key: \'other\'\n });\n\n return React__default.createElement("ul", null, showableReasons.map(function (reason) {\n return React__default.createElement("li", {\n key: reason.key\n }, React__default.createElement("label", null, React__default.createElement("input", {\n type: "radio",\n name: "reason",\n value: reason.key,\n checked: _this2.state.selected == reason.key,\n onChange: function onChange(e) {\n return _this2.handleChange(e);\n }\n }), reason.name));\n }));\n };\n\n _proto.renderReportSuccess = function renderReportSuccess() {\n return React__default.createElement("div", null, "\\u6295\\u8BC9\\u5DF2\\u7ECF\\u63D0\\u4EA4\\u7ED9\\u7BA1\\u7406\\u5458\\uFF0C\\u6211\\u4EEC\\u4F1A\\u5C3D\\u5FEB\\u5904\\u7406\\u3002");\n };\n\n _proto.render = function render() {\n var _this3 = this;\n\n var _this$props2 = this.props,\n isShowDialog = _this$props2.isShowDialog,\n isReported = _this$props2.isReported,\n handleHideReportDialog = _this$props2.handleHideReportDialog;\n return React__default.createElement("div", {\n className: __chunk_3.classnames(\'report-dialog\', {\n hide: !isShowDialog\n })\n }, React__default.createElement("span", {\n className: "report-dialog-shd"\n }), React__default.createElement("div", {\n className: "report-dialog-content"\n }, React__default.createElement("a", {\n href: "javascript:;",\n className: "report-dialog-close",\n onClick: handleHideReportDialog\n }, "X"), React__default.createElement("div", {\n className: "report-hd"\n }, React__default.createElement("h3", null, isReported ? \'提交成功\' : \'选择投诉原因\')), React__default.createElement("div", {\n className: "report-bd"\n }, isReported ? this.renderReportSuccess() : React__default.createElement("form", {\n onSubmit: function onSubmit(e) {\n return _this3.handleSubmitReport(e);\n }\n }, this.renderReportHtml(), React__default.createElement("div", {\n className: "extra-options"\n }, React__default.createElement("a", {\n href: "https://help.douban.com/complaint/",\n target: "_blank",\n className: "link"\n }, "\\u4FB5\\u72AF\\u6211\\u7684\\u6743\\u76CA"), React__default.createElement("p", {\n className: "desc"\n }, "\\u6284\\u88AD\\u6216\\u672A\\u7ECF\\u6388\\u6743\\u8F6C\\u8F7D\\u6211\\u7684\\u5185\\u5BB9\\u3001\\u4FB5\\u72AF\\u6211\\u7684\\u4E2A\\u4EBA\\u6743\\u76CA\\u3001\\u4FB5\\u72AF\\u6211\\u7684\\u4F01\\u4E1A\\u6743\\u76CA")), React__default.createElement("div", {\n className: "report-btns"\n }, React__default.createElement("button", {\n className: "report-btn comment-form-btn"\n }, "\\u6295\\u8BC9"))))));\n };\n\n return Report;\n}(React.Component);\n\nReport.propTypes = reportPropTypes;\nReport.defaultProps = reportDefaultProps;\n\nexports.default = Report;\nexports.reportDefaultProps = reportDefaultProps;\nexports.reportPropTypes = reportPropTypes;\n//# sourceMappingURL=report.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/comments/lib/report.js\n// module id = 37\n// module chunks = 0\n//# sourceURL=webpack:///./~/comments/lib/report.js?');},function(module,exports,__webpack_require__){eval("'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _notification = __webpack_require__(39);\n\nObject.defineProperty(exports, 'Notification', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_notification).default;\n }\n});\n\nvar _notificationStack = __webpack_require__(79);\n\nObject.defineProperty(exports, 'NotificationStack', {\n enumerable: true,\n get: function get() {\n return _interopRequireDefault(_notificationStack).default;\n }\n});\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/comments/~/react-notification/dist/index.js\n// module id = 38\n// module chunks = 0\n//# sourceURL=webpack:///./~/comments/~/react-notification/dist/index.js?")},function(module,exports,__webpack_require__){eval("'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _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 _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _react = __webpack_require__(25);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _defaultPropTypes = __webpack_require__(24);\n\nvar _defaultPropTypes2 = _interopRequireDefault(_defaultPropTypes);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\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; } /* linting temp disabled while working on updates */\n/* eslint-disable */\n\n\nvar Notification = function (_Component) {\n _inherits(Notification, _Component);\n\n function Notification(props) {\n _classCallCheck(this, Notification);\n\n var _this = _possibleConstructorReturn(this, (Notification.__proto__ || Object.getPrototypeOf(Notification)).call(this, props));\n\n _this.getBarStyle = _this.getBarStyle.bind(_this);\n _this.getActionStyle = _this.getActionStyle.bind(_this);\n _this.getTitleStyle = _this.getTitleStyle.bind(_this);\n _this.handleClick = _this.handleClick.bind(_this);\n\n if (props.onDismiss && props.isActive) {\n _this.dismissTimeout = setTimeout(props.onDismiss, props.dismissAfter);\n }\n return _this;\n }\n\n _createClass(Notification, [{\n key: 'componentWillReceiveProps',\n value: function componentWillReceiveProps(nextProps) {\n if (nextProps.dismissAfter === false) return;\n\n // See http://eslint.org/docs/rules/no-prototype-builtins\n if (!{}.hasOwnProperty.call(nextProps, 'isLast')) {\n clearTimeout(this.dismissTimeout);\n }\n\n if (nextProps.onDismiss) {\n if (nextProps.isActive && !this.props.isActive || nextProps.dismissAfter && this.props.dismissAfter === false) {\n this.dismissTimeout = setTimeout(nextProps.onDismiss, nextProps.dismissAfter);\n }\n }\n }\n }, {\n key: 'componentWillUnmount',\n value: function componentWillUnmount() {\n if (this.props.dismissAfter) clearTimeout(this.dismissTimeout);\n }\n\n /*\n * @description Dynamically get the styles for the bar.\n * @returns {object} result The style.\n */\n\n }, {\n key: 'getBarStyle',\n value: function getBarStyle() {\n if (this.props.style === false) return {};\n\n var _props = this.props,\n isActive = _props.isActive,\n barStyle = _props.barStyle,\n activeBarStyle = _props.activeBarStyle;\n\n\n var baseStyle = {\n position: 'fixed',\n bottom: '2rem',\n left: '-100%',\n width: 'auto',\n padding: '1rem',\n margin: 0,\n color: '#fafafa',\n font: '1rem normal Roboto, sans-serif',\n borderRadius: '5px',\n background: '#212121',\n borderSizing: 'border-box',\n boxShadow: '0 0 1px 1px rgba(10, 10, 11, .125)',\n cursor: 'default',\n WebKitTransition: '.5s cubic-bezier(0.89, 0.01, 0.5, 1.1)',\n MozTransition: '.5s cubic-bezier(0.89, 0.01, 0.5, 1.1)',\n msTransition: '.5s cubic-bezier(0.89, 0.01, 0.5, 1.1)',\n OTransition: '.5s cubic-bezier(0.89, 0.01, 0.5, 1.1)',\n transition: '.5s cubic-bezier(0.89, 0.01, 0.5, 1.1)',\n WebkitTransform: 'translatez(0)',\n MozTransform: 'translatez(0)',\n msTransform: 'translatez(0)',\n OTransform: 'translatez(0)',\n transform: 'translatez(0)'\n };\n\n return isActive ? _extends({}, baseStyle, { left: '1rem' }, barStyle, activeBarStyle) : _extends({}, baseStyle, barStyle);\n }\n\n /*\n * @function getActionStyle\n * @description Dynamically get the styles for the action text.\n * @returns {object} result The style.\n */\n\n }, {\n key: 'getActionStyle',\n value: function getActionStyle() {\n return this.props.style !== false ? _extends({}, {\n padding: '0.125rem',\n marginLeft: '1rem',\n color: '#f44336',\n font: '.75rem normal Roboto, sans-serif',\n lineHeight: '1rem',\n letterSpacing: '.125ex',\n textTransform: 'uppercase',\n borderRadius: '5px',\n cursor: 'pointer'\n }, this.props.actionStyle) : {};\n }\n\n /*\n * @function getTitleStyle\n * @description Dynamically get the styles for the title.\n * @returns {object} result The style.\n */\n\n }, {\n key: 'getTitleStyle',\n value: function getTitleStyle() {\n return this.props.style !== false ? _extends({}, {\n fontWeight: '700',\n marginRight: '.5rem'\n }, this.props.titleStyle) : {};\n }\n\n /*\n * @function handleClick\n * @description Handle click events on the action button.\n */\n\n }, {\n key: 'handleClick',\n value: function handleClick() {\n if (this.props.onClick && typeof this.props.onClick === 'function') {\n return this.props.onClick();\n }\n }\n }, {\n key: 'render',\n value: function render() {\n var className = 'notification-bar';\n\n if (this.props.isActive) className += ' ' + this.props.activeClassName;\n if (this.props.className) className += ' ' + this.props.className;\n\n return _react2.default.createElement(\n 'div',\n { className: className, style: this.getBarStyle() },\n _react2.default.createElement(\n 'div',\n { className: 'notification-bar-wrapper' },\n this.props.title ? _react2.default.createElement(\n 'span',\n {\n className: 'notification-bar-title',\n style: this.getTitleStyle()\n },\n this.props.title\n ) : null,\n _react2.default.createElement(\n 'span',\n { className: 'notification-bar-message' },\n this.props.message\n ),\n this.props.action ? _react2.default.createElement(\n 'span',\n {\n className: 'notification-bar-action',\n onClick: this.handleClick,\n style: this.getActionStyle()\n },\n this.props.action\n ) : null\n )\n );\n }\n }]);\n\n return Notification;\n}(_react.Component);\n\nNotification.propTypes = _defaultPropTypes2.default;\n\nNotification.defaultProps = {\n isActive: false,\n dismissAfter: 2000,\n activeClassName: 'notification-bar-active'\n};\n\nexports.default = Notification;\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/comments/~/react-notification/dist/notification.js\n// module id = 39\n// module chunks = 0\n//# sourceURL=webpack:///./~/comments/~/react-notification/dist/notification.js?")},function(module,exports){eval("/**\n * toString ref.\n */\n\nvar toString = Object.prototype.toString;\n\n/**\n * Return the type of `val`.\n *\n * @param {Mixed} val\n * @return {String}\n * @api public\n */\n\nmodule.exports = function(val){\n switch (toString.call(val)) {\n case '[object Date]': return 'date';\n case '[object RegExp]': return 'regexp';\n case '[object Arguments]': return 'arguments';\n case '[object Array]': return 'array';\n case '[object Error]': return 'error';\n }\n\n if (val === null) return 'null';\n if (val === undefined) return 'undefined';\n if (val !== val) return 'nan';\n if (val && val.nodeType === 1) return 'element';\n\n if (isBuffer(val)) return 'buffer';\n\n val = val.valueOf\n ? val.valueOf()\n : Object.prototype.valueOf.apply(val);\n\n return typeof val;\n};\n\n// code borrowed from https://github.com/feross/is-buffer/blob/master/index.js\nfunction isBuffer(obj) {\n return !!(obj != null &&\n (obj._isBuffer || // For Safari 5-7 (missing Object.prototype.constructor)\n (obj.constructor &&\n typeof obj.constructor.isBuffer === 'function' &&\n obj.constructor.isBuffer(obj))\n ))\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/component-clone/~/component-type/index.js\n// module id = 40\n// module chunks = 0\n//# sourceURL=webpack:///./~/component-clone/~/component-type/index.js?")},function(module,exports){eval("\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.AsyncStatus = exports.ASYNC_STATUS = exports.SUCCESS = exports.FAIL = exports.PENDING = exports.DEFAULT = void 0;\nexports.DEFAULT = 'default';\nexports.PENDING = 'pending';\nexports.FAIL = 'fail';\nexports.SUCCESS = 'success';\nexports.ASYNC_STATUS = [exports.DEFAULT, exports.PENDING, exports.FAIL, exports.SUCCESS];\nexports.AsyncStatus = {\n DEFAULT: exports.DEFAULT,\n PENDING: exports.PENDING,\n FAIL: exports.FAIL,\n SUCCESS: exports.SUCCESS,\n};\n//# sourceMappingURL=async-status.js.map\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/fe-utils/lib/async/async-status.js\n// module id = 41\n// module chunks = 0\n//# sourceURL=webpack:///./~/fe-utils/lib/async/async-status.js?")},function(module,exports,__webpack_require__){eval("\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Job = void 0;\nvar shallow_equal_1 = __webpack_require__(43);\nvar is_1 = __webpack_require__(26);\nvar mitt_1 = __importDefault(__webpack_require__(133));\n/**\n * 异步任务工具类\n * 主要使用场景:\n * 1. 一个或者多个异步任务(如请求)依赖另一个异步任务的状态和返回数据\n * 2. 对异步任务的执行进行更精细化的控制,比如在多个地方都有可能调用,但是只需要执行一次,第二次可以复用,可以使用 job.once();又或者根据参数状态(参考 react 的 deps)是否变化决定是否执行还是复用上一次的结果\n * @example\n * const fetchLoginUserJob = new Job(() => ...)\n * const fetchDataJob = new Job(async () => {\n * const data = await fetchData()\n * let user = await fetchLoginUserJob.wait() // 等待 fetchLoginUserJob 执行完成\n * // handle data & user, e.g. log data & user.id\n * log('viewpage', { id: data.id, userId: user && user.id})\n * })\n * // 同时执行两个异步函数,\n * fetchLoginUserJob.call()\n * fetchDataJob.call()\n *\n */\nvar Job = /** @class */ (function () {\n function Job(_job) {\n this._job = _job;\n this._lastDeps = [];\n this._mitt = mitt_1.default();\n }\n Object.defineProperty(Job.prototype, \"result\", {\n get: function () {\n return this._result;\n },\n enumerable: false,\n configurable: true\n });\n /**\n * 等待执行结果,该方法不会触发执行, 但是会返回一个只有调用过 once/call 才会 resolve 的 Promise\n */\n Job.prototype.wait = function () {\n var _this = this;\n if (this._result) {\n return this._result;\n }\n return new Promise(function (res) {\n var cb = function (r) {\n _this.off('exec', cb);\n res(r);\n };\n _this.on('exec', cb);\n });\n };\n Job.prototype.on = function (event, cb) {\n this._mitt.on(event, cb);\n };\n Job.prototype.off = function (event, cb) {\n this._mitt.off(event, cb);\n };\n /** 如果已经执行过,则直接返回上一次执行的 Promise, 否则先执行再返回 Promise */\n Job.prototype.once = function () {\n if (!this._result) {\n this.call();\n }\n return this._result;\n };\n Job.prototype.only = function (job, deps) {\n if (is_1.isFn(job)) {\n this._job = job;\n deps = deps || [];\n }\n else {\n deps = job;\n }\n if (shallow_equal_1.shallowEqualArrays(this._lastDeps, deps)) {\n return this.once();\n }\n this._lastDeps = deps;\n return this.call();\n };\n /** 执行并返回 Promise */\n Job.prototype.call = function () {\n this._result = Promise.resolve(this._job());\n this._mitt.emit('exec', this._result);\n return this._result;\n };\n return Job;\n}());\nexports.Job = Job;\n//# sourceMappingURL=job.js.map\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/fe-utils/lib/async/job.js\n// module id = 42\n// module chunks = 0\n//# sourceURL=webpack:///./~/fe-utils/lib/async/job.js?")},function(module,exports,__webpack_require__){eval('"use strict";\nObject.defineProperty(exports, "__esModule", { value: true });\nexports.shallowEqualArrays = exports.shallowEqualObjects = void 0;\nvar shallowEqual = __webpack_require__(145);\n/**\n * 用于 React 的浅比较对象\n * @param a\n * @param b\n */\nfunction shallowEqualObjects(a, b) {\n return shallowEqual.shallowEqualObjects(a, b);\n}\nexports.shallowEqualObjects = shallowEqualObjects;\n/**\n * 用于 React 的浅比较数组\n * @param a\n * @param b\n */\nfunction shallowEqualArrays(a, b) {\n return shallowEqual.shallowEqualArrays(a, b);\n}\nexports.shallowEqualArrays = shallowEqualArrays;\n//# sourceMappingURL=shallow-equal.js.map\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/fe-utils/lib/lang/shallow-equal.js\n// module id = 43\n// module chunks = 0\n//# sourceURL=webpack:///./~/fe-utils/lib/lang/shallow-equal.js?')},function(module,exports,__webpack_require__){eval("/**\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 (true) {\n var ReactIs = __webpack_require__(48);\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 = __webpack_require__(134)(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\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/prop-types/index.js\n// module id = 44\n// module chunks = 0\n//# sourceURL=webpack:///./~/prop-types/index.js?")},function(module,exports){eval("/**\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\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/prop-types/lib/ReactPropTypesSecret.js\n// module id = 45\n// module chunks = 0\n//# sourceURL=webpack:///./~/prop-types/lib/ReactPropTypesSecret.js?")},function(module,exports){eval("module.exports = Function.call.bind(Object.prototype.hasOwnProperty);\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/prop-types/lib/has.js\n// module id = 46\n// module chunks = 0\n//# sourceURL=webpack:///./~/prop-types/lib/has.js?")},[146,135],function(module,exports,__webpack_require__){eval("'use strict';\n\nif (false) {\n module.exports = require('./cjs/react-is.production.min.js');\n} else {\n module.exports = __webpack_require__(136);\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/react-is/index.js\n// module id = 48\n// module chunks = 0\n//# sourceURL=webpack:///./~/react-is/index.js?")},[147,137],function(module,exports,__webpack_require__){eval("module.exports = __webpack_require__(51);\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/axios/index.js\n// module id = 50\n// module chunks = 0\n//# sourceURL=webpack:///./~/axios/index.js?")},function(module,exports,__webpack_require__){eval("'use strict';\n\nvar utils = __webpack_require__(3);\nvar bind = __webpack_require__(32);\nvar Axios = __webpack_require__(53);\nvar defaults = __webpack_require__(22);\n\n/**\n * Create an instance of Axios\n *\n * @param {Object} defaultConfig The default config for the instance\n * @return {Axios} A new instance of Axios\n */\nfunction createInstance(defaultConfig) {\n var context = new Axios(defaultConfig);\n var instance = bind(Axios.prototype.request, context);\n\n // Copy axios.prototype to instance\n utils.extend(instance, Axios.prototype, context);\n\n // Copy context to instance\n utils.extend(instance, context);\n\n return instance;\n}\n\n// Create the default instance to be exported\nvar axios = createInstance(defaults);\n\n// Expose Axios class to allow class inheritance\naxios.Axios = Axios;\n\n// Factory for creating new instances\naxios.create = function create(instanceConfig) {\n return createInstance(utils.merge(defaults, instanceConfig));\n};\n\n// Expose Cancel & CancelToken\naxios.Cancel = __webpack_require__(29);\naxios.CancelToken = __webpack_require__(52);\naxios.isCancel = __webpack_require__(30);\n\n// Expose all/spread\naxios.all = function all(promises) {\n return Promise.all(promises);\n};\naxios.spread = __webpack_require__(66);\n\nmodule.exports = axios;\n\n// Allow use of default import syntax in TypeScript\nmodule.exports.default = axios;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/axios/lib/axios.js\n// module id = 51\n// module chunks = 0\n//# sourceURL=webpack:///./~/axios/lib/axios.js?")},function(module,exports,__webpack_require__){eval("'use strict';\n\nvar Cancel = __webpack_require__(29);\n\n/**\n * A `CancelToken` is an object that can be used to request cancellation of an operation.\n *\n * @class\n * @param {Function} executor The executor function.\n */\nfunction CancelToken(executor) {\n if (typeof executor !== 'function') {\n throw new TypeError('executor must be a function.');\n }\n\n var resolvePromise;\n this.promise = new Promise(function promiseExecutor(resolve) {\n resolvePromise = resolve;\n });\n\n var token = this;\n executor(function cancel(message) {\n if (token.reason) {\n // Cancellation has already been requested\n return;\n }\n\n token.reason = new Cancel(message);\n resolvePromise(token.reason);\n });\n}\n\n/**\n * Throws a `Cancel` if cancellation has been requested.\n */\nCancelToken.prototype.throwIfRequested = function throwIfRequested() {\n if (this.reason) {\n throw this.reason;\n }\n};\n\n/**\n * Returns an object that contains a new `CancelToken` and a function that, when called,\n * cancels the `CancelToken`.\n */\nCancelToken.source = function source() {\n var cancel;\n var token = new CancelToken(function executor(c) {\n cancel = c;\n });\n return {\n token: token,\n cancel: cancel\n };\n};\n\nmodule.exports = CancelToken;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/axios/lib/cancel/CancelToken.js\n// module id = 52\n// module chunks = 0\n//# sourceURL=webpack:///./~/axios/lib/cancel/CancelToken.js?")},function(module,exports,__webpack_require__){eval("'use strict';\n\nvar defaults = __webpack_require__(22);\nvar utils = __webpack_require__(3);\nvar InterceptorManager = __webpack_require__(54);\nvar dispatchRequest = __webpack_require__(55);\n\n/**\n * Create a new instance of Axios\n *\n * @param {Object} instanceConfig The default config for the instance\n */\nfunction Axios(instanceConfig) {\n this.defaults = instanceConfig;\n this.interceptors = {\n request: new InterceptorManager(),\n response: new InterceptorManager()\n };\n}\n\n/**\n * Dispatch a request\n *\n * @param {Object} config The config specific for this request (merged with this.defaults)\n */\nAxios.prototype.request = function request(config) {\n /*eslint no-param-reassign:0*/\n // Allow for axios('example/url'[, config]) a la fetch API\n if (typeof config === 'string') {\n config = utils.merge({\n url: arguments[0]\n }, arguments[1]);\n }\n\n config = utils.merge(defaults, {method: 'get'}, this.defaults, config);\n config.method = config.method.toLowerCase();\n\n // Hook up interceptors middleware\n var chain = [dispatchRequest, undefined];\n var promise = Promise.resolve(config);\n\n this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\n chain.unshift(interceptor.fulfilled, interceptor.rejected);\n });\n\n this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\n chain.push(interceptor.fulfilled, interceptor.rejected);\n });\n\n while (chain.length) {\n promise = promise.then(chain.shift(), chain.shift());\n }\n\n return promise;\n};\n\n// Provide aliases for supported request methods\nutils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function(url, config) {\n return this.request(utils.merge(config || {}, {\n method: method,\n url: url\n }));\n };\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function(url, data, config) {\n return this.request(utils.merge(config || {}, {\n method: method,\n url: url,\n data: data\n }));\n };\n});\n\nmodule.exports = Axios;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/axios/lib/core/Axios.js\n// module id = 53\n// module chunks = 0\n//# sourceURL=webpack:///./~/axios/lib/core/Axios.js?")},function(module,exports,__webpack_require__){eval("'use strict';\n\nvar utils = __webpack_require__(3);\n\nfunction InterceptorManager() {\n this.handlers = [];\n}\n\n/**\n * Add a new interceptor to the stack\n *\n * @param {Function} fulfilled The function to handle `then` for a `Promise`\n * @param {Function} rejected The function to handle `reject` for a `Promise`\n *\n * @return {Number} An ID used to remove interceptor later\n */\nInterceptorManager.prototype.use = function use(fulfilled, rejected) {\n this.handlers.push({\n fulfilled: fulfilled,\n rejected: rejected\n });\n return this.handlers.length - 1;\n};\n\n/**\n * Remove an interceptor from the stack\n *\n * @param {Number} id The ID that was returned by `use`\n */\nInterceptorManager.prototype.eject = function eject(id) {\n if (this.handlers[id]) {\n this.handlers[id] = null;\n }\n};\n\n/**\n * Iterate over all the registered interceptors\n *\n * This method is particularly useful for skipping over any\n * interceptors that may have become `null` calling `eject`.\n *\n * @param {Function} fn The function to call for each interceptor\n */\nInterceptorManager.prototype.forEach = function forEach(fn) {\n utils.forEach(this.handlers, function forEachHandler(h) {\n if (h !== null) {\n fn(h);\n }\n });\n};\n\nmodule.exports = InterceptorManager;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/axios/lib/core/InterceptorManager.js\n// module id = 54\n// module chunks = 0\n//# sourceURL=webpack:///./~/axios/lib/core/InterceptorManager.js?")},function(module,exports,__webpack_require__){eval("'use strict';\n\nvar utils = __webpack_require__(3);\nvar transformData = __webpack_require__(58);\nvar isCancel = __webpack_require__(30);\nvar defaults = __webpack_require__(22);\nvar isAbsoluteURL = __webpack_require__(62);\nvar combineURLs = __webpack_require__(60);\n\n/**\n * Throws a `Cancel` if cancellation has been requested.\n */\nfunction throwIfCancellationRequested(config) {\n if (config.cancelToken) {\n config.cancelToken.throwIfRequested();\n }\n}\n\n/**\n * Dispatch a request to the server using the configured adapter.\n *\n * @param {object} config The config that is to be used for the request\n * @returns {Promise} The Promise to be fulfilled\n */\nmodule.exports = function dispatchRequest(config) {\n throwIfCancellationRequested(config);\n\n // Support baseURL config\n if (config.baseURL && !isAbsoluteURL(config.url)) {\n config.url = combineURLs(config.baseURL, config.url);\n }\n\n // Ensure headers exist\n config.headers = config.headers || {};\n\n // Transform request data\n config.data = transformData(\n config.data,\n config.headers,\n config.transformRequest\n );\n\n // Flatten headers\n config.headers = utils.merge(\n config.headers.common || {},\n config.headers[config.method] || {},\n config.headers || {}\n );\n\n utils.forEach(\n ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],\n function cleanHeaderConfig(method) {\n delete config.headers[method];\n }\n );\n\n var adapter = config.adapter || defaults.adapter;\n\n return adapter(config).then(function onAdapterResolution(response) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n response.data = transformData(\n response.data,\n response.headers,\n config.transformResponse\n );\n\n return response;\n }, function onAdapterRejection(reason) {\n if (!isCancel(reason)) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n if (reason && reason.response) {\n reason.response.data = transformData(\n reason.response.data,\n reason.response.headers,\n config.transformResponse\n );\n }\n }\n\n return Promise.reject(reason);\n });\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/axios/lib/core/dispatchRequest.js\n// module id = 55\n// module chunks = 0\n//# sourceURL=webpack:///./~/axios/lib/core/dispatchRequest.js?")},function(module,exports){eval("'use strict';\n\n/**\n * Update an Error with the specified config, error code, and response.\n *\n * @param {Error} error The error to update.\n * @param {Object} config The config.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n * @returns {Error} The error.\n */\nmodule.exports = function enhanceError(error, config, code, request, response) {\n error.config = config;\n if (code) {\n error.code = code;\n }\n error.request = request;\n error.response = response;\n return error;\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/axios/lib/core/enhanceError.js\n// module id = 56\n// module chunks = 0\n//# sourceURL=webpack:///./~/axios/lib/core/enhanceError.js?")},function(module,exports,__webpack_require__){eval("'use strict';\n\nvar createError = __webpack_require__(31);\n\n/**\n * Resolve or reject a Promise based on response status.\n *\n * @param {Function} resolve A function that resolves the promise.\n * @param {Function} reject A function that rejects the promise.\n * @param {object} response The response.\n */\nmodule.exports = function settle(resolve, reject, response) {\n var validateStatus = response.config.validateStatus;\n // Note: status is not exposed by XDomainRequest\n if (!response.status || !validateStatus || validateStatus(response.status)) {\n resolve(response);\n } else {\n reject(createError(\n 'Request failed with status code ' + response.status,\n response.config,\n null,\n response.request,\n response\n ));\n }\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/axios/lib/core/settle.js\n// module id = 57\n// module chunks = 0\n//# sourceURL=webpack:///./~/axios/lib/core/settle.js?")},function(module,exports,__webpack_require__){eval("'use strict';\n\nvar utils = __webpack_require__(3);\n\n/**\n * Transform the data for a request or a response\n *\n * @param {Object|String} data The data to be transformed\n * @param {Array} headers The headers for the request or response\n * @param {Array|Function} fns A single function or Array of functions\n * @returns {*} The resulting transformed data\n */\nmodule.exports = function transformData(data, headers, fns) {\n /*eslint no-param-reassign:0*/\n utils.forEach(fns, function transform(fn) {\n data = fn(data, headers);\n });\n\n return data;\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/axios/lib/core/transformData.js\n// module id = 58\n// module chunks = 0\n//# sourceURL=webpack:///./~/axios/lib/core/transformData.js?")},function(module,exports,__webpack_require__){eval("'use strict';\n\nvar utils = __webpack_require__(3);\n\nfunction encode(val) {\n return encodeURIComponent(val).\n replace(/%40/gi, '@').\n replace(/%3A/gi, ':').\n replace(/%24/g, '$').\n replace(/%2C/gi, ',').\n replace(/%20/g, '+').\n replace(/%5B/gi, '[').\n replace(/%5D/gi, ']');\n}\n\n/**\n * Build a URL by appending params to the end\n *\n * @param {string} url The base of the url (e.g., http://www.google.com)\n * @param {object} [params] The params to be appended\n * @returns {string} The formatted url\n */\nmodule.exports = function buildURL(url, params, paramsSerializer) {\n /*eslint no-param-reassign:0*/\n if (!params) {\n return url;\n }\n\n var serializedParams;\n if (paramsSerializer) {\n serializedParams = paramsSerializer(params);\n } else if (utils.isURLSearchParams(params)) {\n serializedParams = params.toString();\n } else {\n var parts = [];\n\n utils.forEach(params, function serialize(val, key) {\n if (val === null || typeof val === 'undefined') {\n return;\n }\n\n if (utils.isArray(val)) {\n key = key + '[]';\n } else {\n val = [val];\n }\n\n utils.forEach(val, function parseValue(v) {\n if (utils.isDate(v)) {\n v = v.toISOString();\n } else if (utils.isObject(v)) {\n v = JSON.stringify(v);\n }\n parts.push(encode(key) + '=' + encode(v));\n });\n });\n\n serializedParams = parts.join('&');\n }\n\n if (serializedParams) {\n url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;\n }\n\n return url;\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/axios/lib/helpers/buildURL.js\n// module id = 59\n// module chunks = 0\n//# sourceURL=webpack:///./~/axios/lib/helpers/buildURL.js?");},function(module,exports){eval("'use strict';\n\n/**\n * Creates a new URL by combining the specified URLs\n *\n * @param {string} baseURL The base URL\n * @param {string} relativeURL The relative URL\n * @returns {string} The combined URL\n */\nmodule.exports = function combineURLs(baseURL, relativeURL) {\n return relativeURL\n ? baseURL.replace(/\\/+$/, '') + '/' + relativeURL.replace(/^\\/+/, '')\n : baseURL;\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/axios/lib/helpers/combineURLs.js\n// module id = 60\n// module chunks = 0\n//# sourceURL=webpack:///./~/axios/lib/helpers/combineURLs.js?")},function(module,exports,__webpack_require__){eval("'use strict';\n\nvar utils = __webpack_require__(3);\n\nmodule.exports = (\n utils.isStandardBrowserEnv() ?\n\n // Standard browser envs support document.cookie\n (function standardBrowserEnv() {\n return {\n write: function write(name, value, expires, path, domain, secure) {\n var cookie = [];\n cookie.push(name + '=' + encodeURIComponent(value));\n\n if (utils.isNumber(expires)) {\n cookie.push('expires=' + new Date(expires).toGMTString());\n }\n\n if (utils.isString(path)) {\n cookie.push('path=' + path);\n }\n\n if (utils.isString(domain)) {\n cookie.push('domain=' + domain);\n }\n\n if (secure === true) {\n cookie.push('secure');\n }\n\n document.cookie = cookie.join('; ');\n },\n\n read: function read(name) {\n var match = document.cookie.match(new RegExp('(^|;\\\\s*)(' + name + ')=([^;]*)'));\n return (match ? decodeURIComponent(match[3]) : null);\n },\n\n remove: function remove(name) {\n this.write(name, '', Date.now() - 86400000);\n }\n };\n })() :\n\n // Non standard browser env (web workers, react-native) lack needed support.\n (function nonStandardBrowserEnv() {\n return {\n write: function write() {},\n read: function read() { return null; },\n remove: function remove() {}\n };\n })()\n);\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/axios/lib/helpers/cookies.js\n// module id = 61\n// module chunks = 0\n//# sourceURL=webpack:///./~/axios/lib/helpers/cookies.js?")},function(module,exports){eval('\'use strict\';\n\n/**\n * Determines whether the specified URL is absolute\n *\n * @param {string} url The URL to test\n * @returns {boolean} True if the specified URL is absolute, otherwise false\n */\nmodule.exports = function isAbsoluteURL(url) {\n // A URL is considered absolute if it begins with "://" or "//" (protocol-relative URL).\n // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\n // by any combination of letters, digits, plus, period, or hyphen.\n return /^([a-z][a-z\\d\\+\\-\\.]*:)?\\/\\//i.test(url);\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/axios/lib/helpers/isAbsoluteURL.js\n// module id = 62\n// module chunks = 0\n//# sourceURL=webpack:///./~/axios/lib/helpers/isAbsoluteURL.js?')},function(module,exports,__webpack_require__){eval("'use strict';\n\nvar utils = __webpack_require__(3);\n\nmodule.exports = (\n utils.isStandardBrowserEnv() ?\n\n // Standard browser envs have full support of the APIs needed to test\n // whether the request URL is of the same origin as current location.\n (function standardBrowserEnv() {\n var msie = /(msie|trident)/i.test(navigator.userAgent);\n var urlParsingNode = document.createElement('a');\n var originURL;\n\n /**\n * Parse a URL to discover it's components\n *\n * @param {String} url The URL to be parsed\n * @returns {Object}\n */\n function resolveURL(url) {\n var href = url;\n\n if (msie) {\n // IE needs attribute set twice to normalize properties\n urlParsingNode.setAttribute('href', href);\n href = urlParsingNode.href;\n }\n\n urlParsingNode.setAttribute('href', href);\n\n // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils\n return {\n href: urlParsingNode.href,\n protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',\n host: urlParsingNode.host,\n search: urlParsingNode.search ? urlParsingNode.search.replace(/^\\?/, '') : '',\n hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',\n hostname: urlParsingNode.hostname,\n port: urlParsingNode.port,\n pathname: (urlParsingNode.pathname.charAt(0) === '/') ?\n urlParsingNode.pathname :\n '/' + urlParsingNode.pathname\n };\n }\n\n originURL = resolveURL(window.location.href);\n\n /**\n * Determine if a URL shares the same origin as the current location\n *\n * @param {String} requestURL The URL to test\n * @returns {boolean} True if URL shares the same origin, otherwise false\n */\n return function isURLSameOrigin(requestURL) {\n var parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL;\n return (parsed.protocol === originURL.protocol &&\n parsed.host === originURL.host);\n };\n })() :\n\n // Non standard browser envs (web workers, react-native) lack needed support.\n (function nonStandardBrowserEnv() {\n return function isURLSameOrigin() {\n return true;\n };\n })()\n);\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/axios/lib/helpers/isURLSameOrigin.js\n// module id = 63\n// module chunks = 0\n//# sourceURL=webpack:///./~/axios/lib/helpers/isURLSameOrigin.js?")},function(module,exports,__webpack_require__){eval("'use strict';\n\nvar utils = __webpack_require__(3);\n\nmodule.exports = function normalizeHeaderName(headers, normalizedName) {\n utils.forEach(headers, function processHeader(value, name) {\n if (name !== normalizedName && name.toUpperCase() === normalizedName.toUpperCase()) {\n headers[normalizedName] = value;\n delete headers[name];\n }\n });\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/axios/lib/helpers/normalizeHeaderName.js\n// module id = 64\n// module chunks = 0\n//# sourceURL=webpack:///./~/axios/lib/helpers/normalizeHeaderName.js?")},function(module,exports,__webpack_require__){eval("'use strict';\n\nvar utils = __webpack_require__(3);\n\n// Headers whose duplicates are ignored by node\n// c.f. https://nodejs.org/api/http.html#http_message_headers\nvar ignoreDuplicateOf = [\n 'age', 'authorization', 'content-length', 'content-type', 'etag',\n 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',\n 'last-modified', 'location', 'max-forwards', 'proxy-authorization',\n 'referer', 'retry-after', 'user-agent'\n];\n\n/**\n * Parse headers into an object\n *\n * ```\n * Date: Wed, 27 Aug 2014 08:58:49 GMT\n * Content-Type: application/json\n * Connection: keep-alive\n * Transfer-Encoding: chunked\n * ```\n *\n * @param {String} headers Headers needing to be parsed\n * @returns {Object} Headers parsed into an object\n */\nmodule.exports = function parseHeaders(headers) {\n var parsed = {};\n var key;\n var val;\n var i;\n\n if (!headers) { return parsed; }\n\n utils.forEach(headers.split('\\n'), function parser(line) {\n i = line.indexOf(':');\n key = utils.trim(line.substr(0, i)).toLowerCase();\n val = utils.trim(line.substr(i + 1));\n\n if (key) {\n if (parsed[key] && ignoreDuplicateOf.indexOf(key) >= 0) {\n return;\n }\n if (key === 'set-cookie') {\n parsed[key] = (parsed[key] ? parsed[key] : []).concat([val]);\n } else {\n parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\n }\n }\n });\n\n return parsed;\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/axios/lib/helpers/parseHeaders.js\n// module id = 65\n// module chunks = 0\n//# sourceURL=webpack:///./~/axios/lib/helpers/parseHeaders.js?")},function(module,exports){eval("'use strict';\n\n/**\n * Syntactic sugar for invoking a function and expanding an array for arguments.\n *\n * Common use case would be to use `Function.prototype.apply`.\n *\n * ```js\n * function f(x, y, z) {}\n * var args = [1, 2, 3];\n * f.apply(null, args);\n * ```\n *\n * With `spread` this example can be re-written.\n *\n * ```js\n * spread(function(x, y, z) {})([1, 2, 3]);\n * ```\n *\n * @param {Function} callback\n * @returns {Function}\n */\nmodule.exports = function spread(callback) {\n return function wrap(arr) {\n return callback.apply(null, arr);\n };\n};\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/axios/lib/helpers/spread.js\n// module id = 66\n// module chunks = 0\n//# sourceURL=webpack:///./~/axios/lib/helpers/spread.js?")},function(module,exports){eval("/*!\n * Determine if an object is a Buffer\n *\n * @author Feross Aboukhadijeh \n * @license MIT\n */\n\nmodule.exports = function isBuffer (obj) {\n return obj != null && obj.constructor != null &&\n typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj)\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/axios/~/is-buffer/index.js\n// module id = 67\n// module chunks = 0\n//# sourceURL=webpack:///./~/axios/~/is-buffer/index.js?")},function(module,exports,__webpack_require__){eval("'use strict';\n\nvar _react = __webpack_require__(49);\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactDom = __webpack_require__(47);\n\nvar _reactDom2 = _interopRequireDefault(_reactDom);\n\nvar _comments = __webpack_require__(77);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nmodule.exports = function () {\n if (window._COMMENTS_CONFIG) {\n _reactDom2.default.render(_react2.default.createElement(_comments.CommentApp, { config: window._COMMENTS_CONFIG || {} }), document.getElementById('comments'));\n }\n};\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/js/_comment.js\n// module id = 68\n// module chunks = 0\n//# sourceURL=webpack:///./src/js/_comment.js?")},,function(module,exports){eval("'use strict';\n\n/* global $, alert, get_cookie */\n\nvar initVote = function initVote() {\n var CONST_REVIEW_VOTE = {\n 'useful_count': ['有用', '/j/review/{REVIEW_ID}/useful'],\n 'useless_count': ['没用', '/j/review/{REVIEW_ID}/useless'],\n 'spoiler': ['剧透提醒已提交,谢谢', '/j/review/{REVIEW_ID}/spoiler']\n };\n\n var regDisabled = /disabled/,\n regVoteType = /(\\w+_count)/,\n regSpoiler = /spoiler/,\n ck = get_cookie('ck');\n\n var votePanels = document.querySelectorAll('.main-panel-useful'),\n votePanel = null,\n rid = '';\n\n var isAuthor = function isAuthor(votePanel) {\n return votePanel && votePanel.getAttribute('data-is_owner') === 'true';\n };\n\n var canVote = function canVote(votePanel) {\n return votePanel && votePanel.getAttribute('data-can_vote') === 'true';\n };\n\n var isTV = function isTV(votePanel) {\n return votePanel && votePanel.getAttribute('data-is_tv') === 'true';\n };\n\n var handleVote = function handleVote(e) {\n if (!ck) {\n return;\n }\n e.stopPropagation();\n if (window._USER_ABNORMAL) {\n window.show_abnormal && window.show_abnormal();\n return;\n }\n\n var target = e.target;\n var cn = target.className;\n var match = cn.match(regVoteType) || cn.match(regSpoiler);\n var type = '';\n var API_VOTE = '';\n var voteTxt = '';\n\n if (cn.match(regDisabled)) {\n return;\n }\n\n if (match) {\n if (isAuthor(e.currentTarget)) {\n return alert('不能给自己投票噢');\n }\n\n if (!canVote(e.currentTarget)) {\n var txt = isTV(e.currentTarget) ? '该剧尚未播出,不能投票噢' : '该电影还未上映,不能投票噢';\n return alert(txt);\n }\n\n type = match[0]; // 'useful', 'useless', 'spoiler'\n voteTxt = CONST_REVIEW_VOTE[type][0];\n API_VOTE = CONST_REVIEW_VOTE[type][1];\n rid = e.currentTarget.getAttribute('data-rid');\n API_VOTE = API_VOTE.replace('{REVIEW_ID}', rid);\n } else if (!match || !rid) {\n return;\n }\n\n var voteReq = $.post(API_VOTE, { 'ck': ck }, function (res) {\n if (res.r == 0) {\n if (type === 'spoiler') {\n return handleSpoiler();\n }\n countVote(res, type);\n }\n });\n\n voteReq.fail(function () {\n alert('网络错误');\n }).always(function () {\n // console.log('vote ')\n });\n };\n\n var handleSpoiler = function handleSpoiler(type) {\n // 在 列表 中,通过 `review-${rid}-content` 寻找对应的节点\n var reviewElem = document.getElementById('review-' + rid + '-content') || document.getElementById(rid);\n var spoilerElem = reviewElem.querySelector('.spoiler');\n spoilerElem.innerText = CONST_REVIEW_VOTE['spoiler'][0];\n spoilerElem.className = spoilerElem.className.replace('not-reported', 'disabled');\n };\n\n var countVote = function countVote(res, type) {\n var reviewElem = document.getElementById('review-' + rid + '-content') || document.getElementById(rid);\n for (var i in CONST_REVIEW_VOTE) {\n if (res[i] !== undefined) {\n var countTxt = CONST_REVIEW_VOTE[i][0] + ' ' + res[i];\n var countElem = reviewElem.querySelector('.' + i);\n var _cn = countElem.className;\n\n // 从没投过票 || 已经投票过\n if (i === type) {\n countElem.classList.add('disabled');\n } else {\n countElem.classList.remove('disabled');\n }\n countElem.innerHTML = countTxt;\n }\n }\n };\n\n var len = votePanels.length;\n if (len === 1) {\n votePanel = votePanels[0];\n rid = votePanel.getAttribute('data-rid');\n votePanel && votePanel.addEventListener('click', handleVote, false);\n } else {\n for (var i = 0; i < len; i++) {\n votePanel = votePanels[i];\n votePanel && votePanel.addEventListener('click', handleVote, false);\n }\n }\n};\n\nmodule.exports = initVote;\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/js/_vote.js\n// module id = 70\n// module chunks = 0\n//# sourceURL=webpack:///./src/js/_vote.js?")},function(module,exports){eval("'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n/**\n * copy frodo/talion/static/js/card\n */\n\nvar DEFAULT_SLOTS = ['dale_movie_review_comment_feed'];\n\nvar DEFAULT_CONFIG = {\n name: 'AdInsert',\n slots: DEFAULT_SLOTS\n};\n\nvar AdInsert = function () {\n function AdInsert() {\n var config = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : DEFAULT_CONFIG;\n\n _classCallCheck(this, AdInsert);\n\n var name = config.name,\n slots = config.slots;\n\n this.current = slots[0];\n this.name = name;\n this.slots = slots || [];\n }\n\n _createClass(AdInsert, [{\n key: 'html',\n value: function html() {\n var config = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n var _config$tag = config.tag,\n tag = _config$tag === undefined ? 'div' : _config$tag,\n _config$className = config.className,\n className = _config$className === undefined ? 'Theme-item Advertisement' : _config$className,\n _config$style = config.style,\n style = _config$style === undefined ? '' : _config$style,\n _config$postFix = config.postFix,\n postFix = _config$postFix === undefined ? '' : _config$postFix;\n\n var slotName = this.current;\n var slotDiv = '<' + tag + ' class=\"' + className + '\" id=\"' + slotName + '\" style=\"' + style + '\">' + tag + '>';\n return slotDiv;\n }\n }, {\n key: 'getAd',\n value: function getAd() {\n var slotName = this.current;\n if (window.getDoubanAD) {\n try {\n var slots = this.slots;\n var slotNameIndex = slots.indexOf(slotName);\n var nextSlotIndex = slots.length > slotNameIndex + 1 ? slotNameIndex + 1 : 0;\n var nextSlotName = slots[nextSlotIndex];\n window.getDoubanAD(slotName);\n this.current = nextSlotName;\n } catch (e) {\n console && console.log(e);\n }\n }\n }\n }]);\n\n return AdInsert;\n}();\n\nexports.default = AdInsert;\n\n//////////////////\n// WEBPACK FOOTER\n// ./src/js/ad_insert.js\n// module id = 71\n// module chunks = 0\n//# sourceURL=webpack:///./src/js/ad_insert.js?")},function(module,exports){eval("'use strict'\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n lookup[i] = code[i]\n revLookup[code.charCodeAt(i)] = i\n}\n\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction getLens (b64) {\n var len = b64.length\n\n if (len % 4 > 0) {\n throw new Error('Invalid string. Length must be a multiple of 4')\n }\n\n // Trim off extra bytes after placeholder bytes are found\n // See: https://github.com/beatgammit/base64-js/issues/42\n var validLen = b64.indexOf('=')\n if (validLen === -1) validLen = len\n\n var placeHoldersLen = validLen === len\n ? 0\n : 4 - (validLen % 4)\n\n return [validLen, placeHoldersLen]\n}\n\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength (b64) {\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction _byteLength (b64, validLen, placeHoldersLen) {\n return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction toByteArray (b64) {\n var tmp\n var lens = getLens(b64)\n var validLen = lens[0]\n var placeHoldersLen = lens[1]\n\n var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\n\n var curByte = 0\n\n // if there are placeholders, only get up to the last complete 4 chars\n var len = placeHoldersLen > 0\n ? validLen - 4\n : validLen\n\n for (var i = 0; i < len; i += 4) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 18) |\n (revLookup[b64.charCodeAt(i + 1)] << 12) |\n (revLookup[b64.charCodeAt(i + 2)] << 6) |\n revLookup[b64.charCodeAt(i + 3)]\n arr[curByte++] = (tmp >> 16) & 0xFF\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 2) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 2) |\n (revLookup[b64.charCodeAt(i + 1)] >> 4)\n arr[curByte++] = tmp & 0xFF\n }\n\n if (placeHoldersLen === 1) {\n tmp =\n (revLookup[b64.charCodeAt(i)] << 10) |\n (revLookup[b64.charCodeAt(i + 1)] << 4) |\n (revLookup[b64.charCodeAt(i + 2)] >> 2)\n arr[curByte++] = (tmp >> 8) & 0xFF\n arr[curByte++] = tmp & 0xFF\n }\n\n return arr\n}\n\nfunction tripletToBase64 (num) {\n return lookup[num >> 18 & 0x3F] +\n lookup[num >> 12 & 0x3F] +\n lookup[num >> 6 & 0x3F] +\n lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n var tmp\n var output = []\n for (var i = start; i < end; i += 3) {\n tmp =\n ((uint8[i] << 16) & 0xFF0000) +\n ((uint8[i + 1] << 8) & 0xFF00) +\n (uint8[i + 2] & 0xFF)\n output.push(tripletToBase64(tmp))\n }\n return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n var tmp\n var len = uint8.length\n var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n var parts = []\n var maxChunkLength = 16383 // must be multiple of 3\n\n // go through the array every three bytes, we'll deal with trailing stuff later\n for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n parts.push(encodeChunk(\n uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)\n ))\n }\n\n // pad the end with zeros, but make sure to not forget the extra bytes\n if (extraBytes === 1) {\n tmp = uint8[len - 1]\n parts.push(\n lookup[tmp >> 2] +\n lookup[(tmp << 4) & 0x3F] +\n '=='\n )\n } else if (extraBytes === 2) {\n tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n parts.push(\n lookup[tmp >> 10] +\n lookup[(tmp >> 4) & 0x3F] +\n lookup[(tmp << 2) & 0x3F] +\n '='\n )\n }\n\n return parts.join('')\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/base64-js/index.js\n// module id = 72\n// module chunks = 0\n//# sourceURL=webpack:///./~/base64-js/index.js?")},function(module,exports,__webpack_require__){eval("/* WEBPACK VAR INJECTION */(function(global) {/*!\n * The buffer module from node.js, for the browser.\n *\n * @author Feross Aboukhadijeh \n * @license MIT\n */\n/* eslint-disable no-proto */\n\n'use strict'\n\nvar base64 = __webpack_require__(72)\nvar ieee754 = __webpack_require__(129)\nvar isArray = __webpack_require__(131)\n\nexports.Buffer = Buffer\nexports.SlowBuffer = SlowBuffer\nexports.INSPECT_MAX_BYTES = 50\n\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n * === true Use Uint8Array implementation (fastest)\n * === false Use Object implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * Due to various browser bugs, sometimes the Object implementation will be used even\n * when the browser supports typed arrays.\n *\n * Note:\n *\n * - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances,\n * See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.\n *\n * - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.\n *\n * - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of\n * incorrect length in some situations.\n\n * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they\n * get the Object implementation, which is slower but behaves correctly.\n */\nBuffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined\n ? global.TYPED_ARRAY_SUPPORT\n : typedArraySupport()\n\n/*\n * Export kMaxLength after typed array support is determined.\n */\nexports.kMaxLength = kMaxLength()\n\nfunction typedArraySupport () {\n try {\n var arr = new Uint8Array(1)\n arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }}\n return arr.foo() === 42 && // typed array instances can be augmented\n typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray`\n arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray`\n } catch (e) {\n return false\n }\n}\n\nfunction kMaxLength () {\n return Buffer.TYPED_ARRAY_SUPPORT\n ? 0x7fffffff\n : 0x3fffffff\n}\n\nfunction createBuffer (that, length) {\n if (kMaxLength() < length) {\n throw new RangeError('Invalid typed array length')\n }\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n // Return an augmented `Uint8Array` instance, for best performance\n that = new Uint8Array(length)\n that.__proto__ = Buffer.prototype\n } else {\n // Fallback: Return an object instance of the Buffer class\n if (that === null) {\n that = new Buffer(length)\n }\n that.length = length\n }\n\n return that\n}\n\n/**\n * The Buffer constructor returns instances of `Uint8Array` that have their\n * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of\n * `Uint8Array`, so the returned instances will have all the node `Buffer` methods\n * and the `Uint8Array` methods. Square bracket notation works as expected -- it\n * returns a single octet.\n *\n * The `Uint8Array` prototype remains unmodified.\n */\n\nfunction Buffer (arg, encodingOrOffset, length) {\n if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) {\n return new Buffer(arg, encodingOrOffset, length)\n }\n\n // Common case.\n if (typeof arg === 'number') {\n if (typeof encodingOrOffset === 'string') {\n throw new Error(\n 'If encoding is specified then the first argument must be a string'\n )\n }\n return allocUnsafe(this, arg)\n }\n return from(this, arg, encodingOrOffset, length)\n}\n\nBuffer.poolSize = 8192 // not used by this implementation\n\n// TODO: Legacy, not needed anymore. Remove in next major version.\nBuffer._augment = function (arr) {\n arr.__proto__ = Buffer.prototype\n return arr\n}\n\nfunction from (that, value, encodingOrOffset, length) {\n if (typeof value === 'number') {\n throw new TypeError('\"value\" argument must not be a number')\n }\n\n if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) {\n return fromArrayBuffer(that, value, encodingOrOffset, length)\n }\n\n if (typeof value === 'string') {\n return fromString(that, value, encodingOrOffset)\n }\n\n return fromObject(that, value)\n}\n\n/**\n * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError\n * if value is a number.\n * Buffer.from(str[, encoding])\n * Buffer.from(array)\n * Buffer.from(buffer)\n * Buffer.from(arrayBuffer[, byteOffset[, length]])\n **/\nBuffer.from = function (value, encodingOrOffset, length) {\n return from(null, value, encodingOrOffset, length)\n}\n\nif (Buffer.TYPED_ARRAY_SUPPORT) {\n Buffer.prototype.__proto__ = Uint8Array.prototype\n Buffer.__proto__ = Uint8Array\n if (typeof Symbol !== 'undefined' && Symbol.species &&\n Buffer[Symbol.species] === Buffer) {\n // Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97\n Object.defineProperty(Buffer, Symbol.species, {\n value: null,\n configurable: true\n })\n }\n}\n\nfunction assertSize (size) {\n if (typeof size !== 'number') {\n throw new TypeError('\"size\" argument must be a number')\n } else if (size < 0) {\n throw new RangeError('\"size\" argument must not be negative')\n }\n}\n\nfunction alloc (that, size, fill, encoding) {\n assertSize(size)\n if (size <= 0) {\n return createBuffer(that, size)\n }\n if (fill !== undefined) {\n // Only pay attention to encoding if it's a string. This\n // prevents accidentally sending in a number that would\n // be interpretted as a start offset.\n return typeof encoding === 'string'\n ? createBuffer(that, size).fill(fill, encoding)\n : createBuffer(that, size).fill(fill)\n }\n return createBuffer(that, size)\n}\n\n/**\n * Creates a new filled Buffer instance.\n * alloc(size[, fill[, encoding]])\n **/\nBuffer.alloc = function (size, fill, encoding) {\n return alloc(null, size, fill, encoding)\n}\n\nfunction allocUnsafe (that, size) {\n assertSize(size)\n that = createBuffer(that, size < 0 ? 0 : checked(size) | 0)\n if (!Buffer.TYPED_ARRAY_SUPPORT) {\n for (var i = 0; i < size; ++i) {\n that[i] = 0\n }\n }\n return that\n}\n\n/**\n * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.\n * */\nBuffer.allocUnsafe = function (size) {\n return allocUnsafe(null, size)\n}\n/**\n * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.\n */\nBuffer.allocUnsafeSlow = function (size) {\n return allocUnsafe(null, size)\n}\n\nfunction fromString (that, string, encoding) {\n if (typeof encoding !== 'string' || encoding === '') {\n encoding = 'utf8'\n }\n\n if (!Buffer.isEncoding(encoding)) {\n throw new TypeError('\"encoding\" must be a valid string encoding')\n }\n\n var length = byteLength(string, encoding) | 0\n that = createBuffer(that, length)\n\n var actual = that.write(string, encoding)\n\n if (actual !== length) {\n // Writing a hex string, for example, that contains invalid characters will\n // cause everything after the first invalid character to be ignored. (e.g.\n // 'abxxcd' will be treated as 'ab')\n that = that.slice(0, actual)\n }\n\n return that\n}\n\nfunction fromArrayLike (that, array) {\n var length = array.length < 0 ? 0 : checked(array.length) | 0\n that = createBuffer(that, length)\n for (var i = 0; i < length; i += 1) {\n that[i] = array[i] & 255\n }\n return that\n}\n\nfunction fromArrayBuffer (that, array, byteOffset, length) {\n array.byteLength // this throws if `array` is not a valid ArrayBuffer\n\n if (byteOffset < 0 || array.byteLength < byteOffset) {\n throw new RangeError('\\'offset\\' is out of bounds')\n }\n\n if (array.byteLength < byteOffset + (length || 0)) {\n throw new RangeError('\\'length\\' is out of bounds')\n }\n\n if (byteOffset === undefined && length === undefined) {\n array = new Uint8Array(array)\n } else if (length === undefined) {\n array = new Uint8Array(array, byteOffset)\n } else {\n array = new Uint8Array(array, byteOffset, length)\n }\n\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n // Return an augmented `Uint8Array` instance, for best performance\n that = array\n that.__proto__ = Buffer.prototype\n } else {\n // Fallback: Return an object instance of the Buffer class\n that = fromArrayLike(that, array)\n }\n return that\n}\n\nfunction fromObject (that, obj) {\n if (Buffer.isBuffer(obj)) {\n var len = checked(obj.length) | 0\n that = createBuffer(that, len)\n\n if (that.length === 0) {\n return that\n }\n\n obj.copy(that, 0, 0, len)\n return that\n }\n\n if (obj) {\n if ((typeof ArrayBuffer !== 'undefined' &&\n obj.buffer instanceof ArrayBuffer) || 'length' in obj) {\n if (typeof obj.length !== 'number' || isnan(obj.length)) {\n return createBuffer(that, 0)\n }\n return fromArrayLike(that, obj)\n }\n\n if (obj.type === 'Buffer' && isArray(obj.data)) {\n return fromArrayLike(that, obj.data)\n }\n }\n\n throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.')\n}\n\nfunction checked (length) {\n // Note: cannot use `length < kMaxLength()` here because that fails when\n // length is NaN (which is otherwise coerced to zero.)\n if (length >= kMaxLength()) {\n throw new RangeError('Attempt to allocate Buffer larger than maximum ' +\n 'size: 0x' + kMaxLength().toString(16) + ' bytes')\n }\n return length | 0\n}\n\nfunction SlowBuffer (length) {\n if (+length != length) { // eslint-disable-line eqeqeq\n length = 0\n }\n return Buffer.alloc(+length)\n}\n\nBuffer.isBuffer = function isBuffer (b) {\n return !!(b != null && b._isBuffer)\n}\n\nBuffer.compare = function compare (a, b) {\n if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {\n throw new TypeError('Arguments must be Buffers')\n }\n\n if (a === b) return 0\n\n var x = a.length\n var y = b.length\n\n for (var i = 0, len = Math.min(x, y); i < len; ++i) {\n if (a[i] !== b[i]) {\n x = a[i]\n y = b[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\nBuffer.isEncoding = function isEncoding (encoding) {\n switch (String(encoding).toLowerCase()) {\n case 'hex':\n case 'utf8':\n case 'utf-8':\n case 'ascii':\n case 'latin1':\n case 'binary':\n case 'base64':\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return true\n default:\n return false\n }\n}\n\nBuffer.concat = function concat (list, length) {\n if (!isArray(list)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n }\n\n if (list.length === 0) {\n return Buffer.alloc(0)\n }\n\n var i\n if (length === undefined) {\n length = 0\n for (i = 0; i < list.length; ++i) {\n length += list[i].length\n }\n }\n\n var buffer = Buffer.allocUnsafe(length)\n var pos = 0\n for (i = 0; i < list.length; ++i) {\n var buf = list[i]\n if (!Buffer.isBuffer(buf)) {\n throw new TypeError('\"list\" argument must be an Array of Buffers')\n }\n buf.copy(buffer, pos)\n pos += buf.length\n }\n return buffer\n}\n\nfunction byteLength (string, encoding) {\n if (Buffer.isBuffer(string)) {\n return string.length\n }\n if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' &&\n (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) {\n return string.byteLength\n }\n if (typeof string !== 'string') {\n string = '' + string\n }\n\n var len = string.length\n if (len === 0) return 0\n\n // Use a for loop to avoid recursion\n var loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'ascii':\n case 'latin1':\n case 'binary':\n return len\n case 'utf8':\n case 'utf-8':\n case undefined:\n return utf8ToBytes(string).length\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return len * 2\n case 'hex':\n return len >>> 1\n case 'base64':\n return base64ToBytes(string).length\n default:\n if (loweredCase) return utf8ToBytes(string).length // assume utf8\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\nBuffer.byteLength = byteLength\n\nfunction slowToString (encoding, start, end) {\n var loweredCase = false\n\n // No need to verify that \"this.length <= MAX_UINT32\" since it's a read-only\n // property of a typed array.\n\n // This behaves neither like String nor Uint8Array in that we set start/end\n // to their upper/lower bounds if the value passed is out of range.\n // undefined is handled specially as per ECMA-262 6th Edition,\n // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.\n if (start === undefined || start < 0) {\n start = 0\n }\n // Return early if start > this.length. Done here to prevent potential uint32\n // coercion fail below.\n if (start > this.length) {\n return ''\n }\n\n if (end === undefined || end > this.length) {\n end = this.length\n }\n\n if (end <= 0) {\n return ''\n }\n\n // Force coersion to uint32. This will also coerce falsey/NaN values to 0.\n end >>>= 0\n start >>>= 0\n\n if (end <= start) {\n return ''\n }\n\n if (!encoding) encoding = 'utf8'\n\n while (true) {\n switch (encoding) {\n case 'hex':\n return hexSlice(this, start, end)\n\n case 'utf8':\n case 'utf-8':\n return utf8Slice(this, start, end)\n\n case 'ascii':\n return asciiSlice(this, start, end)\n\n case 'latin1':\n case 'binary':\n return latin1Slice(this, start, end)\n\n case 'base64':\n return base64Slice(this, start, end)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return utf16leSlice(this, start, end)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = (encoding + '').toLowerCase()\n loweredCase = true\n }\n }\n}\n\n// The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect\n// Buffer instances.\nBuffer.prototype._isBuffer = true\n\nfunction swap (b, n, m) {\n var i = b[n]\n b[n] = b[m]\n b[m] = i\n}\n\nBuffer.prototype.swap16 = function swap16 () {\n var len = this.length\n if (len % 2 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 16-bits')\n }\n for (var i = 0; i < len; i += 2) {\n swap(this, i, i + 1)\n }\n return this\n}\n\nBuffer.prototype.swap32 = function swap32 () {\n var len = this.length\n if (len % 4 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 32-bits')\n }\n for (var i = 0; i < len; i += 4) {\n swap(this, i, i + 3)\n swap(this, i + 1, i + 2)\n }\n return this\n}\n\nBuffer.prototype.swap64 = function swap64 () {\n var len = this.length\n if (len % 8 !== 0) {\n throw new RangeError('Buffer size must be a multiple of 64-bits')\n }\n for (var i = 0; i < len; i += 8) {\n swap(this, i, i + 7)\n swap(this, i + 1, i + 6)\n swap(this, i + 2, i + 5)\n swap(this, i + 3, i + 4)\n }\n return this\n}\n\nBuffer.prototype.toString = function toString () {\n var length = this.length | 0\n if (length === 0) return ''\n if (arguments.length === 0) return utf8Slice(this, 0, length)\n return slowToString.apply(this, arguments)\n}\n\nBuffer.prototype.equals = function equals (b) {\n if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')\n if (this === b) return true\n return Buffer.compare(this, b) === 0\n}\n\nBuffer.prototype.inspect = function inspect () {\n var str = ''\n var max = exports.INSPECT_MAX_BYTES\n if (this.length > 0) {\n str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')\n if (this.length > max) str += ' ... '\n }\n return ''\n}\n\nBuffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {\n if (!Buffer.isBuffer(target)) {\n throw new TypeError('Argument must be a Buffer')\n }\n\n if (start === undefined) {\n start = 0\n }\n if (end === undefined) {\n end = target ? target.length : 0\n }\n if (thisStart === undefined) {\n thisStart = 0\n }\n if (thisEnd === undefined) {\n thisEnd = this.length\n }\n\n if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {\n throw new RangeError('out of range index')\n }\n\n if (thisStart >= thisEnd && start >= end) {\n return 0\n }\n if (thisStart >= thisEnd) {\n return -1\n }\n if (start >= end) {\n return 1\n }\n\n start >>>= 0\n end >>>= 0\n thisStart >>>= 0\n thisEnd >>>= 0\n\n if (this === target) return 0\n\n var x = thisEnd - thisStart\n var y = end - start\n var len = Math.min(x, y)\n\n var thisCopy = this.slice(thisStart, thisEnd)\n var targetCopy = target.slice(start, end)\n\n for (var i = 0; i < len; ++i) {\n if (thisCopy[i] !== targetCopy[i]) {\n x = thisCopy[i]\n y = targetCopy[i]\n break\n }\n }\n\n if (x < y) return -1\n if (y < x) return 1\n return 0\n}\n\n// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,\n// OR the last index of `val` in `buffer` at offset <= `byteOffset`.\n//\n// Arguments:\n// - buffer - a Buffer to search\n// - val - a string, Buffer, or number\n// - byteOffset - an index into `buffer`; will be clamped to an int32\n// - encoding - an optional encoding, relevant is val is a string\n// - dir - true for indexOf, false for lastIndexOf\nfunction bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {\n // Empty buffer means no match\n if (buffer.length === 0) return -1\n\n // Normalize byteOffset\n if (typeof byteOffset === 'string') {\n encoding = byteOffset\n byteOffset = 0\n } else if (byteOffset > 0x7fffffff) {\n byteOffset = 0x7fffffff\n } else if (byteOffset < -0x80000000) {\n byteOffset = -0x80000000\n }\n byteOffset = +byteOffset // Coerce to Number.\n if (isNaN(byteOffset)) {\n // byteOffset: it it's undefined, null, NaN, \"foo\", etc, search whole buffer\n byteOffset = dir ? 0 : (buffer.length - 1)\n }\n\n // Normalize byteOffset: negative offsets start from the end of the buffer\n if (byteOffset < 0) byteOffset = buffer.length + byteOffset\n if (byteOffset >= buffer.length) {\n if (dir) return -1\n else byteOffset = buffer.length - 1\n } else if (byteOffset < 0) {\n if (dir) byteOffset = 0\n else return -1\n }\n\n // Normalize val\n if (typeof val === 'string') {\n val = Buffer.from(val, encoding)\n }\n\n // Finally, search either indexOf (if dir is true) or lastIndexOf\n if (Buffer.isBuffer(val)) {\n // Special case: looking for empty string/buffer always fails\n if (val.length === 0) {\n return -1\n }\n return arrayIndexOf(buffer, val, byteOffset, encoding, dir)\n } else if (typeof val === 'number') {\n val = val & 0xFF // Search for a byte value [0-255]\n if (Buffer.TYPED_ARRAY_SUPPORT &&\n typeof Uint8Array.prototype.indexOf === 'function') {\n if (dir) {\n return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)\n } else {\n return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)\n }\n }\n return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir)\n }\n\n throw new TypeError('val must be string, number or Buffer')\n}\n\nfunction arrayIndexOf (arr, val, byteOffset, encoding, dir) {\n var indexSize = 1\n var arrLength = arr.length\n var valLength = val.length\n\n if (encoding !== undefined) {\n encoding = String(encoding).toLowerCase()\n if (encoding === 'ucs2' || encoding === 'ucs-2' ||\n encoding === 'utf16le' || encoding === 'utf-16le') {\n if (arr.length < 2 || val.length < 2) {\n return -1\n }\n indexSize = 2\n arrLength /= 2\n valLength /= 2\n byteOffset /= 2\n }\n }\n\n function read (buf, i) {\n if (indexSize === 1) {\n return buf[i]\n } else {\n return buf.readUInt16BE(i * indexSize)\n }\n }\n\n var i\n if (dir) {\n var foundIndex = -1\n for (i = byteOffset; i < arrLength; i++) {\n if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {\n if (foundIndex === -1) foundIndex = i\n if (i - foundIndex + 1 === valLength) return foundIndex * indexSize\n } else {\n if (foundIndex !== -1) i -= i - foundIndex\n foundIndex = -1\n }\n }\n } else {\n if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength\n for (i = byteOffset; i >= 0; i--) {\n var found = true\n for (var j = 0; j < valLength; j++) {\n if (read(arr, i + j) !== read(val, j)) {\n found = false\n break\n }\n }\n if (found) return i\n }\n }\n\n return -1\n}\n\nBuffer.prototype.includes = function includes (val, byteOffset, encoding) {\n return this.indexOf(val, byteOffset, encoding) !== -1\n}\n\nBuffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, true)\n}\n\nBuffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {\n return bidirectionalIndexOf(this, val, byteOffset, encoding, false)\n}\n\nfunction hexWrite (buf, string, offset, length) {\n offset = Number(offset) || 0\n var remaining = buf.length - offset\n if (!length) {\n length = remaining\n } else {\n length = Number(length)\n if (length > remaining) {\n length = remaining\n }\n }\n\n // must be an even number of digits\n var strLen = string.length\n if (strLen % 2 !== 0) throw new TypeError('Invalid hex string')\n\n if (length > strLen / 2) {\n length = strLen / 2\n }\n for (var i = 0; i < length; ++i) {\n var parsed = parseInt(string.substr(i * 2, 2), 16)\n if (isNaN(parsed)) return i\n buf[offset + i] = parsed\n }\n return i\n}\n\nfunction utf8Write (buf, string, offset, length) {\n return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nfunction asciiWrite (buf, string, offset, length) {\n return blitBuffer(asciiToBytes(string), buf, offset, length)\n}\n\nfunction latin1Write (buf, string, offset, length) {\n return asciiWrite(buf, string, offset, length)\n}\n\nfunction base64Write (buf, string, offset, length) {\n return blitBuffer(base64ToBytes(string), buf, offset, length)\n}\n\nfunction ucs2Write (buf, string, offset, length) {\n return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nBuffer.prototype.write = function write (string, offset, length, encoding) {\n // Buffer#write(string)\n if (offset === undefined) {\n encoding = 'utf8'\n length = this.length\n offset = 0\n // Buffer#write(string, encoding)\n } else if (length === undefined && typeof offset === 'string') {\n encoding = offset\n length = this.length\n offset = 0\n // Buffer#write(string, offset[, length][, encoding])\n } else if (isFinite(offset)) {\n offset = offset | 0\n if (isFinite(length)) {\n length = length | 0\n if (encoding === undefined) encoding = 'utf8'\n } else {\n encoding = length\n length = undefined\n }\n // legacy write(string, encoding, offset, length) - remove in v0.13\n } else {\n throw new Error(\n 'Buffer.write(string, encoding, offset[, length]) is no longer supported'\n )\n }\n\n var remaining = this.length - offset\n if (length === undefined || length > remaining) length = remaining\n\n if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {\n throw new RangeError('Attempt to write outside buffer bounds')\n }\n\n if (!encoding) encoding = 'utf8'\n\n var loweredCase = false\n for (;;) {\n switch (encoding) {\n case 'hex':\n return hexWrite(this, string, offset, length)\n\n case 'utf8':\n case 'utf-8':\n return utf8Write(this, string, offset, length)\n\n case 'ascii':\n return asciiWrite(this, string, offset, length)\n\n case 'latin1':\n case 'binary':\n return latin1Write(this, string, offset, length)\n\n case 'base64':\n // Warning: maxLength not taken into account in base64Write\n return base64Write(this, string, offset, length)\n\n case 'ucs2':\n case 'ucs-2':\n case 'utf16le':\n case 'utf-16le':\n return ucs2Write(this, string, offset, length)\n\n default:\n if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n encoding = ('' + encoding).toLowerCase()\n loweredCase = true\n }\n }\n}\n\nBuffer.prototype.toJSON = function toJSON () {\n return {\n type: 'Buffer',\n data: Array.prototype.slice.call(this._arr || this, 0)\n }\n}\n\nfunction base64Slice (buf, start, end) {\n if (start === 0 && end === buf.length) {\n return base64.fromByteArray(buf)\n } else {\n return base64.fromByteArray(buf.slice(start, end))\n }\n}\n\nfunction utf8Slice (buf, start, end) {\n end = Math.min(buf.length, end)\n var res = []\n\n var i = start\n while (i < end) {\n var firstByte = buf[i]\n var codePoint = null\n var bytesPerSequence = (firstByte > 0xEF) ? 4\n : (firstByte > 0xDF) ? 3\n : (firstByte > 0xBF) ? 2\n : 1\n\n if (i + bytesPerSequence <= end) {\n var secondByte, thirdByte, fourthByte, tempCodePoint\n\n switch (bytesPerSequence) {\n case 1:\n if (firstByte < 0x80) {\n codePoint = firstByte\n }\n break\n case 2:\n secondByte = buf[i + 1]\n if ((secondByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)\n if (tempCodePoint > 0x7F) {\n codePoint = tempCodePoint\n }\n }\n break\n case 3:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)\n if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {\n codePoint = tempCodePoint\n }\n }\n break\n case 4:\n secondByte = buf[i + 1]\n thirdByte = buf[i + 2]\n fourthByte = buf[i + 3]\n if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)\n if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {\n codePoint = tempCodePoint\n }\n }\n }\n }\n\n if (codePoint === null) {\n // we did not generate a valid codePoint so insert a\n // replacement char (U+FFFD) and advance only 1 byte\n codePoint = 0xFFFD\n bytesPerSequence = 1\n } else if (codePoint > 0xFFFF) {\n // encode to utf16 (surrogate pair dance)\n codePoint -= 0x10000\n res.push(codePoint >>> 10 & 0x3FF | 0xD800)\n codePoint = 0xDC00 | codePoint & 0x3FF\n }\n\n res.push(codePoint)\n i += bytesPerSequence\n }\n\n return decodeCodePointsArray(res)\n}\n\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nvar MAX_ARGUMENTS_LENGTH = 0x1000\n\nfunction decodeCodePointsArray (codePoints) {\n var len = codePoints.length\n if (len <= MAX_ARGUMENTS_LENGTH) {\n return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\n }\n\n // Decode in chunks to avoid \"call stack size exceeded\".\n var res = ''\n var i = 0\n while (i < len) {\n res += String.fromCharCode.apply(\n String,\n codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)\n )\n }\n return res\n}\n\nfunction asciiSlice (buf, start, end) {\n var ret = ''\n end = Math.min(buf.length, end)\n\n for (var i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i] & 0x7F)\n }\n return ret\n}\n\nfunction latin1Slice (buf, start, end) {\n var ret = ''\n end = Math.min(buf.length, end)\n\n for (var i = start; i < end; ++i) {\n ret += String.fromCharCode(buf[i])\n }\n return ret\n}\n\nfunction hexSlice (buf, start, end) {\n var len = buf.length\n\n if (!start || start < 0) start = 0\n if (!end || end < 0 || end > len) end = len\n\n var out = ''\n for (var i = start; i < end; ++i) {\n out += toHex(buf[i])\n }\n return out\n}\n\nfunction utf16leSlice (buf, start, end) {\n var bytes = buf.slice(start, end)\n var res = ''\n for (var i = 0; i < bytes.length; i += 2) {\n res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256)\n }\n return res\n}\n\nBuffer.prototype.slice = function slice (start, end) {\n var len = this.length\n start = ~~start\n end = end === undefined ? len : ~~end\n\n if (start < 0) {\n start += len\n if (start < 0) start = 0\n } else if (start > len) {\n start = len\n }\n\n if (end < 0) {\n end += len\n if (end < 0) end = 0\n } else if (end > len) {\n end = len\n }\n\n if (end < start) end = start\n\n var newBuf\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n newBuf = this.subarray(start, end)\n newBuf.__proto__ = Buffer.prototype\n } else {\n var sliceLen = end - start\n newBuf = new Buffer(sliceLen, undefined)\n for (var i = 0; i < sliceLen; ++i) {\n newBuf[i] = this[i + start]\n }\n }\n\n return newBuf\n}\n\n/*\n * Need to make sure that buffer isn't trying to write out of bounds.\n */\nfunction checkOffset (offset, ext, length) {\n if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')\n if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')\n}\n\nBuffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n var val = this[offset]\n var mul = 1\n var i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) {\n checkOffset(offset, byteLength, this.length)\n }\n\n var val = this[offset + --byteLength]\n var mul = 1\n while (byteLength > 0 && (mul *= 0x100)) {\n val += this[offset + --byteLength] * mul\n }\n\n return val\n}\n\nBuffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 1, this.length)\n return this[offset]\n}\n\nBuffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 2, this.length)\n return this[offset] | (this[offset + 1] << 8)\n}\n\nBuffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 2, this.length)\n return (this[offset] << 8) | this[offset + 1]\n}\n\nBuffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return ((this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16)) +\n (this[offset + 3] * 0x1000000)\n}\n\nBuffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] * 0x1000000) +\n ((this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n this[offset + 3])\n}\n\nBuffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n var val = this[offset]\n var mul = 1\n var i = 0\n while (++i < byteLength && (mul *= 0x100)) {\n val += this[offset + i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n var i = byteLength\n var mul = 1\n var val = this[offset + --i]\n while (i > 0 && (mul *= 0x100)) {\n val += this[offset + --i] * mul\n }\n mul *= 0x80\n\n if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n return val\n}\n\nBuffer.prototype.readInt8 = function readInt8 (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 1, this.length)\n if (!(this[offset] & 0x80)) return (this[offset])\n return ((0xff - this[offset] + 1) * -1)\n}\n\nBuffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 2, this.length)\n var val = this[offset] | (this[offset + 1] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 2, this.length)\n var val = this[offset + 1] | (this[offset] << 8)\n return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset]) |\n (this[offset + 1] << 8) |\n (this[offset + 2] << 16) |\n (this[offset + 3] << 24)\n}\n\nBuffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n\n return (this[offset] << 24) |\n (this[offset + 1] << 16) |\n (this[offset + 2] << 8) |\n (this[offset + 3])\n}\n\nBuffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, true, 23, 4)\n}\n\nBuffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 4, this.length)\n return ieee754.read(this, offset, false, 23, 4)\n}\n\nBuffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, true, 52, 8)\n}\n\nBuffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {\n if (!noAssert) checkOffset(offset, 8, this.length)\n return ieee754.read(this, offset, false, 52, 8)\n}\n\nfunction checkInt (buf, value, offset, ext, max, min) {\n if (!Buffer.isBuffer(buf)) throw new TypeError('\"buffer\" argument must be a Buffer instance')\n if (value > max || value < min) throw new RangeError('\"value\" argument is out of bounds')\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n}\n\nBuffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) {\n var maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n var mul = 1\n var i = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset | 0\n byteLength = byteLength | 0\n if (!noAssert) {\n var maxBytes = Math.pow(2, 8 * byteLength) - 1\n checkInt(this, value, offset, byteLength, maxBytes, 0)\n }\n\n var i = byteLength - 1\n var mul = 1\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n this[offset + i] = (value / mul) & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)\n if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nfunction objectWriteUInt16 (buf, value, offset, littleEndian) {\n if (value < 0) value = 0xffff + value + 1\n for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) {\n buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>\n (littleEndian ? i : 1 - i) * 8\n }\n}\n\nBuffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n } else {\n objectWriteUInt16(this, value, offset, true)\n }\n return offset + 2\n}\n\nBuffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n } else {\n objectWriteUInt16(this, value, offset, false)\n }\n return offset + 2\n}\n\nfunction objectWriteUInt32 (buf, value, offset, littleEndian) {\n if (value < 0) value = 0xffffffff + value + 1\n for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) {\n buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff\n }\n}\n\nBuffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset + 3] = (value >>> 24)\n this[offset + 2] = (value >>> 16)\n this[offset + 1] = (value >>> 8)\n this[offset] = (value & 0xff)\n } else {\n objectWriteUInt32(this, value, offset, true)\n }\n return offset + 4\n}\n\nBuffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n } else {\n objectWriteUInt32(this, value, offset, false)\n }\n return offset + 4\n}\n\nBuffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) {\n var limit = Math.pow(2, 8 * byteLength - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n var i = 0\n var mul = 1\n var sub = 0\n this[offset] = value & 0xFF\n while (++i < byteLength && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) {\n var limit = Math.pow(2, 8 * byteLength - 1)\n\n checkInt(this, value, offset, byteLength, limit - 1, -limit)\n }\n\n var i = byteLength - 1\n var mul = 1\n var sub = 0\n this[offset + i] = value & 0xFF\n while (--i >= 0 && (mul *= 0x100)) {\n if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {\n sub = 1\n }\n this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n }\n\n return offset + byteLength\n}\n\nBuffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)\n if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)\n if (value < 0) value = 0xff + value + 1\n this[offset] = (value & 0xff)\n return offset + 1\n}\n\nBuffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n } else {\n objectWriteUInt16(this, value, offset, true)\n }\n return offset + 2\n}\n\nBuffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value >>> 8)\n this[offset + 1] = (value & 0xff)\n } else {\n objectWriteUInt16(this, value, offset, false)\n }\n return offset + 2\n}\n\nBuffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value & 0xff)\n this[offset + 1] = (value >>> 8)\n this[offset + 2] = (value >>> 16)\n this[offset + 3] = (value >>> 24)\n } else {\n objectWriteUInt32(this, value, offset, true)\n }\n return offset + 4\n}\n\nBuffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {\n value = +value\n offset = offset | 0\n if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n if (value < 0) value = 0xffffffff + value + 1\n if (Buffer.TYPED_ARRAY_SUPPORT) {\n this[offset] = (value >>> 24)\n this[offset + 1] = (value >>> 16)\n this[offset + 2] = (value >>> 8)\n this[offset + 3] = (value & 0xff)\n } else {\n objectWriteUInt32(this, value, offset, false)\n }\n return offset + 4\n}\n\nfunction checkIEEE754 (buf, value, offset, ext, max, min) {\n if (offset + ext > buf.length) throw new RangeError('Index out of range')\n if (offset < 0) throw new RangeError('Index out of range')\n}\n\nfunction writeFloat (buf, value, offset, littleEndian, noAssert) {\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)\n }\n ieee754.write(buf, value, offset, littleEndian, 23, 4)\n return offset + 4\n}\n\nBuffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {\n return writeFloat(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {\n return writeFloat(this, value, offset, false, noAssert)\n}\n\nfunction writeDouble (buf, value, offset, littleEndian, noAssert) {\n if (!noAssert) {\n checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)\n }\n ieee754.write(buf, value, offset, littleEndian, 52, 8)\n return offset + 8\n}\n\nBuffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {\n return writeDouble(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {\n return writeDouble(this, value, offset, false, noAssert)\n}\n\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function copy (target, targetStart, start, end) {\n if (!start) start = 0\n if (!end && end !== 0) end = this.length\n if (targetStart >= target.length) targetStart = target.length\n if (!targetStart) targetStart = 0\n if (end > 0 && end < start) end = start\n\n // Copy 0 bytes; we're done\n if (end === start) return 0\n if (target.length === 0 || this.length === 0) return 0\n\n // Fatal error conditions\n if (targetStart < 0) {\n throw new RangeError('targetStart out of bounds')\n }\n if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds')\n if (end < 0) throw new RangeError('sourceEnd out of bounds')\n\n // Are we oob?\n if (end > this.length) end = this.length\n if (target.length - targetStart < end - start) {\n end = target.length - targetStart + start\n }\n\n var len = end - start\n var i\n\n if (this === target && start < targetStart && targetStart < end) {\n // descending copy from end\n for (i = len - 1; i >= 0; --i) {\n target[i + targetStart] = this[i + start]\n }\n } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {\n // ascending copy from start\n for (i = 0; i < len; ++i) {\n target[i + targetStart] = this[i + start]\n }\n } else {\n Uint8Array.prototype.set.call(\n target,\n this.subarray(start, start + len),\n targetStart\n )\n }\n\n return len\n}\n\n// Usage:\n// buffer.fill(number[, offset[, end]])\n// buffer.fill(buffer[, offset[, end]])\n// buffer.fill(string[, offset[, end]][, encoding])\nBuffer.prototype.fill = function fill (val, start, end, encoding) {\n // Handle string cases:\n if (typeof val === 'string') {\n if (typeof start === 'string') {\n encoding = start\n start = 0\n end = this.length\n } else if (typeof end === 'string') {\n encoding = end\n end = this.length\n }\n if (val.length === 1) {\n var code = val.charCodeAt(0)\n if (code < 256) {\n val = code\n }\n }\n if (encoding !== undefined && typeof encoding !== 'string') {\n throw new TypeError('encoding must be a string')\n }\n if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {\n throw new TypeError('Unknown encoding: ' + encoding)\n }\n } else if (typeof val === 'number') {\n val = val & 255\n }\n\n // Invalid ranges are not set to a default, so can range check early.\n if (start < 0 || this.length < start || this.length < end) {\n throw new RangeError('Out of range index')\n }\n\n if (end <= start) {\n return this\n }\n\n start = start >>> 0\n end = end === undefined ? this.length : end >>> 0\n\n if (!val) val = 0\n\n var i\n if (typeof val === 'number') {\n for (i = start; i < end; ++i) {\n this[i] = val\n }\n } else {\n var bytes = Buffer.isBuffer(val)\n ? val\n : utf8ToBytes(new Buffer(val, encoding).toString())\n var len = bytes.length\n for (i = 0; i < end - start; ++i) {\n this[i + start] = bytes[i % len]\n }\n }\n\n return this\n}\n\n// HELPER FUNCTIONS\n// ================\n\nvar INVALID_BASE64_RE = /[^+\\/0-9A-Za-z-_]/g\n\nfunction base64clean (str) {\n // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n str = stringtrim(str).replace(INVALID_BASE64_RE, '')\n // Node converts strings with length < 2 to ''\n if (str.length < 2) return ''\n // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n while (str.length % 4 !== 0) {\n str = str + '='\n }\n return str\n}\n\nfunction stringtrim (str) {\n if (str.trim) return str.trim()\n return str.replace(/^\\s+|\\s+$/g, '')\n}\n\nfunction toHex (n) {\n if (n < 16) return '0' + n.toString(16)\n return n.toString(16)\n}\n\nfunction utf8ToBytes (string, units) {\n units = units || Infinity\n var codePoint\n var length = string.length\n var leadSurrogate = null\n var bytes = []\n\n for (var i = 0; i < length; ++i) {\n codePoint = string.charCodeAt(i)\n\n // is surrogate component\n if (codePoint > 0xD7FF && codePoint < 0xE000) {\n // last char was a lead\n if (!leadSurrogate) {\n // no lead yet\n if (codePoint > 0xDBFF) {\n // unexpected trail\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n } else if (i + 1 === length) {\n // unpaired lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n continue\n }\n\n // valid lead\n leadSurrogate = codePoint\n\n continue\n }\n\n // 2 leads in a row\n if (codePoint < 0xDC00) {\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n leadSurrogate = codePoint\n continue\n }\n\n // valid surrogate pair\n codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000\n } else if (leadSurrogate) {\n // valid bmp char, but last char was a lead\n if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n }\n\n leadSurrogate = null\n\n // encode utf8\n if (codePoint < 0x80) {\n if ((units -= 1) < 0) break\n bytes.push(codePoint)\n } else if (codePoint < 0x800) {\n if ((units -= 2) < 0) break\n bytes.push(\n codePoint >> 0x6 | 0xC0,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x10000) {\n if ((units -= 3) < 0) break\n bytes.push(\n codePoint >> 0xC | 0xE0,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else if (codePoint < 0x110000) {\n if ((units -= 4) < 0) break\n bytes.push(\n codePoint >> 0x12 | 0xF0,\n codePoint >> 0xC & 0x3F | 0x80,\n codePoint >> 0x6 & 0x3F | 0x80,\n codePoint & 0x3F | 0x80\n )\n } else {\n throw new Error('Invalid code point')\n }\n }\n\n return bytes\n}\n\nfunction asciiToBytes (str) {\n var byteArray = []\n for (var i = 0; i < str.length; ++i) {\n // Node's code seems to be doing this and not & 0x7F..\n byteArray.push(str.charCodeAt(i) & 0xFF)\n }\n return byteArray\n}\n\nfunction utf16leToBytes (str, units) {\n var c, hi, lo\n var byteArray = []\n for (var i = 0; i < str.length; ++i) {\n if ((units -= 2) < 0) break\n\n c = str.charCodeAt(i)\n hi = c >> 8\n lo = c % 256\n byteArray.push(lo)\n byteArray.push(hi)\n }\n\n return byteArray\n}\n\nfunction base64ToBytes (str) {\n return base64.toByteArray(base64clean(str))\n}\n\nfunction blitBuffer (src, dst, offset, length) {\n for (var i = 0; i < length; ++i) {\n if ((i + offset >= dst.length) || (i >= src.length)) break\n dst[i + offset] = src[i]\n }\n return i\n}\n\nfunction isnan (val) {\n return val !== val // eslint-disable-line no-self-compare\n}\n\n/* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/buffer/index.js\n// module id = 73\n// module chunks = 0\n//# sourceURL=webpack:///./~/buffer/index.js?");},function(module,exports,__webpack_require__){eval("var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*!\n Copyright (c) 2018 Jed Watson.\n Licensed under the MIT License (MIT), see\n http://jedwatson.github.io/classnames\n*/\n/* global define */\n\n(function () {\n\t'use strict';\n\n\tvar hasOwn = {}.hasOwnProperty;\n\n\tfunction classNames() {\n\t\tvar classes = [];\n\n\t\tfor (var i = 0; i < arguments.length; i++) {\n\t\t\tvar arg = arguments[i];\n\t\t\tif (!arg) continue;\n\n\t\t\tvar argType = typeof arg;\n\n\t\t\tif (argType === 'string' || argType === 'number') {\n\t\t\t\tclasses.push(arg);\n\t\t\t} else if (Array.isArray(arg)) {\n\t\t\t\tif (arg.length) {\n\t\t\t\t\tvar inner = classNames.apply(null, arg);\n\t\t\t\t\tif (inner) {\n\t\t\t\t\t\tclasses.push(inner);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (argType === 'object') {\n\t\t\t\tif (arg.toString === Object.prototype.toString) {\n\t\t\t\t\tfor (var key in arg) {\n\t\t\t\t\t\tif (hasOwn.call(arg, key) && arg[key]) {\n\t\t\t\t\t\t\tclasses.push(key);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tclasses.push(arg.toString());\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn classes.join(' ');\n\t}\n\n\tif (typeof module !== 'undefined' && module.exports) {\n\t\tclassNames.default = classNames;\n\t\tmodule.exports = classNames;\n\t} else if (true) {\n\t\t// register as 'classnames', consistent with npm package name\n\t\t!(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = function () {\n\t\t\treturn classNames;\n\t\t}.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__));\n\t} else {\n\t\twindow.classNames = classNames;\n\t}\n}());\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/classnames/index.js\n// module id = 74\n// module chunks = 0\n//# sourceURL=webpack:///./~/classnames/index.js?")},function(module,exports){eval("var toString = Object.prototype.toString;\n\nmodule.exports = function kindOf(val) {\n if (val === void 0) return 'undefined';\n if (val === null) return 'null';\n\n var type = typeof val;\n if (type === 'boolean') return 'boolean';\n if (type === 'string') return 'string';\n if (type === 'number') return 'number';\n if (type === 'symbol') return 'symbol';\n if (type === 'function') {\n return isGeneratorFn(val) ? 'generatorfunction' : 'function';\n }\n\n if (isArray(val)) return 'array';\n if (isBuffer(val)) return 'buffer';\n if (isArguments(val)) return 'arguments';\n if (isDate(val)) return 'date';\n if (isError(val)) return 'error';\n if (isRegexp(val)) return 'regexp';\n\n switch (ctorName(val)) {\n case 'Symbol': return 'symbol';\n case 'Promise': return 'promise';\n\n // Set, Map, WeakSet, WeakMap\n case 'WeakMap': return 'weakmap';\n case 'WeakSet': return 'weakset';\n case 'Map': return 'map';\n case 'Set': return 'set';\n\n // 8-bit typed arrays\n case 'Int8Array': return 'int8array';\n case 'Uint8Array': return 'uint8array';\n case 'Uint8ClampedArray': return 'uint8clampedarray';\n\n // 16-bit typed arrays\n case 'Int16Array': return 'int16array';\n case 'Uint16Array': return 'uint16array';\n\n // 32-bit typed arrays\n case 'Int32Array': return 'int32array';\n case 'Uint32Array': return 'uint32array';\n case 'Float32Array': return 'float32array';\n case 'Float64Array': return 'float64array';\n }\n\n if (isGeneratorObj(val)) {\n return 'generator';\n }\n\n // Non-plain objects\n type = toString.call(val);\n switch (type) {\n case '[object Object]': return 'object';\n // iterators\n case '[object Map Iterator]': return 'mapiterator';\n case '[object Set Iterator]': return 'setiterator';\n case '[object String Iterator]': return 'stringiterator';\n case '[object Array Iterator]': return 'arrayiterator';\n }\n\n // other\n return type.slice(8, -1).toLowerCase().replace(/\\s/g, '');\n};\n\nfunction ctorName(val) {\n return val.constructor ? val.constructor.name : null;\n}\n\nfunction isArray(val) {\n if (Array.isArray) return Array.isArray(val);\n return val instanceof Array;\n}\n\nfunction isError(val) {\n return val instanceof Error || (typeof val.message === 'string' && val.constructor && typeof val.constructor.stackTraceLimit === 'number');\n}\n\nfunction isDate(val) {\n if (val instanceof Date) return true;\n return typeof val.toDateString === 'function'\n && typeof val.getDate === 'function'\n && typeof val.setDate === 'function';\n}\n\nfunction isRegexp(val) {\n if (val instanceof RegExp) return true;\n return typeof val.flags === 'string'\n && typeof val.ignoreCase === 'boolean'\n && typeof val.multiline === 'boolean'\n && typeof val.global === 'boolean';\n}\n\nfunction isGeneratorFn(name, val) {\n return ctorName(name) === 'GeneratorFunction';\n}\n\nfunction isGeneratorObj(val) {\n return typeof val.throw === 'function'\n && typeof val.return === 'function'\n && typeof val.next === 'function';\n}\n\nfunction isArguments(val) {\n try {\n if (typeof val.length === 'number' && typeof val.callee === 'function') {\n return true;\n }\n } catch (err) {\n if (err.message.indexOf('callee') !== -1) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * If you need to support Safari 5-7 (8-10 yr-old browser),\n * take a look at https://github.com/feross/is-buffer\n */\n\nfunction isBuffer(val) {\n if (val.constructor && typeof val.constructor.isBuffer === 'function') {\n return val.constructor.isBuffer(val);\n }\n return false;\n}\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/clone-deep/~/kind-of/index.js\n// module id = 75\n// module chunks = 0\n//# sourceURL=webpack:///./~/clone-deep/~/kind-of/index.js?")},function(module,exports,__webpack_require__){eval("'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\nfunction _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }\n\nvar __chunk_1 = __webpack_require__(1);\nvar __chunk_2 = __webpack_require__(6);\n__webpack_require__(10);\nvar React = __webpack_require__(2);\nvar React__default = _interopDefault(React);\nvar __chunk_3 = __webpack_require__(4);\nvar cloneDeep = _interopDefault(__webpack_require__(33));\nvar reactNotification = __webpack_require__(38);\nvar commentList = __webpack_require__(35);\n__webpack_require__(23);\n__webpack_require__(18);\n__webpack_require__(19);\n__webpack_require__(15);\n__webpack_require__(5);\n__webpack_require__(12);\n__webpack_require__(14);\nvar __chunk_4 = __webpack_require__(9);\n__webpack_require__(7);\nvar __chunk_5 = __webpack_require__(11);\n__webpack_require__(8);\n__webpack_require__(20);\n__webpack_require__(17);\nvar commentEditor = __webpack_require__(34);\nvar paginator = __webpack_require__(36);\nvar report = __webpack_require__(37);\n\nvar _extends_1 = __chunk_1.createCommonjsModule(function (module) {\nfunction _extends() {\n module.exports = _extends = __chunk_2.assign || function (target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i];\n\n for (var key in source) {\n if (Object.prototype.hasOwnProperty.call(source, key)) {\n target[key] = source[key];\n }\n }\n }\n\n return target;\n };\n\n return _extends.apply(this, arguments);\n}\n\nmodule.exports = _extends;\n});\n\nvar css = \"@charset \\\"UTF-8\\\";\\n.comments-app-wrapper {\\n font: 13px Helvetica, Arial, sans-serif;\\n line-height: 1.62;\\n color: #111;\\n}\\n.comments-app-wrapper.dev {\\n width: 675px;\\n}\\n.comments-app-wrapper.dev a:link {\\n color: #37a;\\n text-decoration: none;\\n}\\n.comments-app-wrapper.dev a:visited {\\n color: #669;\\n text-decoration: none;\\n}\\n.comments-app-wrapper.dev a:hover {\\n color: #fff;\\n text-decoration: none;\\n background: #37a;\\n}\\n.comments-app-wrapper.dev a:active {\\n color: #fff;\\n text-decoration: none;\\n background: #f93;\\n}\\n.comments-app-wrapper.dev .comment-folded a {\\n color: #c0c0c0;\\n}\\n.comments-app-wrapper.dev .comment-folded a:hover {\\n background: #bbb;\\n color: #fff;\\n border: 0;\\n}\\n.comments-app-wrapper textarea {\\n resize: none;\\n}\\n.comments-app-wrapper ul, .comments-app-wrapper li {\\n list-style: none;\\n}\\n.comments-app-wrapper .hide {\\n display: none;\\n}\\n\\n.comment-tips {\\n margin: 0 0 10px;\\n color: #999;\\n font-size: 12px;\\n}\\n\\n.comment-notification-bar {\\n position: fixed;\\n top: 0;\\n left: 50%;\\n transform: translate3d(-50%, -200px, 0);\\n z-index: 3;\\n text-align: center;\\n transition: transform 0.3s;\\n}\\n.comment-notification-bar.actived {\\n transform: translate3d(-50%, 20px, 0);\\n}\\n.comment-notification-bar.actived .notification-bar-wrapper {\\n padding: 10px;\\n}\\n.comment-notification-bar .notification-bar-wrapper {\\n background: #c34;\\n background: rgba(204, 51, 68, 0.9);\\n color: #fff;\\n border-radius: 3px;\\n line-height: 1;\\n font-size: 13px;\\n}\\n\\n.show_login {\\n font-size: 14px;\\n}\\n\\n.report-dialog {\\n top: 50% !important;\\n left: 50% !important;\\n}\\n\\n/* 验证码 */\\n.captcha-wrapper {\\n position: relative;\\n display: flex;\\n}\\n.captcha-wrapper img {\\n display: block;\\n height: 30px;\\n cursor: pointer;\\n}\\n.captcha-wrapper .captcha-input {\\n margin-left: 5px;\\n border: 1px solid #d9d9d9;\\n border-radius: 2px;\\n padding: 6px 10px;\\n line-height: 16px;\\n font-size: 13px;\\n outline: none;\\n}\\n.captcha-wrapper .captcha-error-msg {\\n position: absolute;\\n right: 0;\\n top: 35px;\\n color: #c34;\\n}\\n\\n/* 提交按钮 */\\n.comment-form-btn {\\n height: 30px;\\n line-height: 28px;\\n padding: 0;\\n width: 66px;\\n border-radius: 3px;\\n border: 1px solid #c0c0c0;\\n background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #fcfcfc), color-stop(1, #e9e9e9));\\n outline: none;\\n cursor: pointer;\\n}\\n.comment-form-btn:hover {\\n opacity: 0.8;\\n}\\n.comment-form-btn:active {\\n border: 1px solid #b4b4b4;\\n background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #f6f6f6), color-stop(1, #dfdfdf));\\n}\\n.comment-form-btn.disabled, .comment-form-btn:disabled {\\n background: #dfdfdf;\\n}\";\n__chunk_1.styleInject(css);\n\nvar commentAppPropTypes = {\n config: __chunk_1.PropTypes.object.isRequired\n};\nvar commentAppDefaultProps = {\n config: null\n};\n\nvar CommentApp =\n/*#__PURE__*/\nfunction (_Component) {\n __chunk_1._inheritsLoose(CommentApp, _Component);\n\n function CommentApp(props) {\n var _this;\n\n _this = _Component.call(this, props) || this;\n _this.state = {\n comments: props.config.comments.slice(0, props.config.count),\n isShowDialog: false,\n truncation: 3,\n submitReportStatus: __chunk_5.DEFAULT,\n addCommentStatus: __chunk_5.DEFAULT,\n addReplyStatus: __chunk_5.DEFAULT,\n loadMoreReplies: __chunk_5.DEFAULT,\n notificationVisible: false,\n notificationMsg: '',\n isReported: false,\n isFetchingReportReasons: false,\n reportReasons: [],\n reportId: '',\n replyUsers: null\n };\n _this.timer = null;\n return _this;\n }\n\n var _proto = CommentApp.prototype;\n\n _proto.componentDidMount = function componentDidMount() {};\n\n _proto.componentWillUnmount = function componentWillUnmount() {} // 投诉\n ;\n\n _proto.handleShowReportDialog = function handleShowReportDialog(reportId) {\n var _this2 = this;\n\n var options = this.props.config.options;\n this.setState({\n isShowDialog: true,\n isFetchingReportReasons: true,\n reportId: reportId\n }); // 请求接口获取report列表,因目前接口返回是html文件,不可在react下进行操作,故先用report文件下写的固定的内容\n // 第二个参数 {} 是防止自定义 header 导致触发 preflight\n\n __chunk_4.CommentsAPI.getReportReasons({\n types: options.report_type\n }, {}).then(function (resp) {\n _this2.setState({\n isFetchingReportReasons: false,\n reportReasons: resp.items\n });\n });\n };\n\n _proto.handleHideReportDialog = function handleHideReportDialog() {\n clearTimeout(this.timer);\n this.setState({\n isShowDialog: false,\n isReported: false\n });\n };\n\n _proto.handleHideNotification = function handleHideNotification() {\n this.setState({\n notificationVisible: false\n });\n };\n\n _proto.handleSubmitReport = function handleSubmitReport(reason) {\n var _this3 = this;\n\n // 因调用的接口返回的是html页,暂无法判断失败的情况\n var _this$state = this.state,\n reportId = _this$state.reportId,\n submitReportStatus = _this$state.submitReportStatus;\n\n if (submitReportStatus === __chunk_5.PENDING) {\n return;\n } // TODO: 提交投诉数据\n\n\n var reportObj = {\n url: \"\" + window.location.origin + window.location.pathname + \"?comment_id=\" + reportId,\n reason: reason,\n extra_msg: '' // 第二个参数 {} 是防止自定义 header 导致触发 preflight\n\n };\n __chunk_4.CommentsAPI.submitReport(reportObj, {}).then(function (resp) {\n _this3.setState({\n isReported: true\n });\n\n _this3.timer = setTimeout(function () {\n _this3.handleHideReportDialog();\n }, 3000);\n });\n } // 新增一级回应\n ;\n\n _proto.handleAddComment = function handleAddComment(newComment, successCallback, failCallback) {\n var _this4 = this;\n\n // 需要知道回应的上层id,及回应内容\n var count = this.props.count;\n var _this$state2 = this.state,\n comments = _this$state2.comments,\n addCommentStatus = _this$state2.addCommentStatus;\n\n if (addCommentStatus === __chunk_5.PENDING) {\n return;\n }\n\n if (window._USER_ABNORMAL) {\n // eslint-disable-next-line no-unused-expressions\n window.show_abnormal && window.show_abnormal();\n return;\n }\n\n __chunk_4.CommentsAPI.addComment(newComment).then(function (resp) {\n // 提交成功\n if (resp.code === 0) {\n // 标记为最新回应,用于滚动定位\n // 不过暂时没有用到,因为一级回应的输入框在最下面\n // 提交后结果马上就出现在输入框上方\n var latestComment = resp.data || resp;\n latestComment.is_latest = true; // 清除列表中其他的 is_latest 标记\n\n var _comments = comments.map(function (comment) {\n var _comment = _extends_1({}, comment);\n\n delete _comment.is_latest;\n return _comment;\n }).concat(latestComment);\n\n _this4.setState({\n addCommentStatus: __chunk_5.SUCCESS,\n comments: _comments\n });\n\n if (typeof successCallback === 'function') {\n successCallback();\n }\n\n if (_comments.length > count) ; // TODO: 自动跳到下一页\n // 1001 需要输入验证码\n\n } else if (resp.code === 1001) {\n _this4.setState({\n addCommentStatus: __chunk_5.FAIL\n });\n\n if (typeof failCallback === 'function') {\n failCallback(resp.code, resp.data, resp.msg);\n } // 1002 需要跳转到审核页面\n\n } else if (resp.code === 1002) {\n _this4.setState({\n addCommentStatus: __chunk_5.FAIL\n });\n\n setTimeout(function () {\n window.location.href = resp.data.url;\n }, 500); // 1003 需要答题\n } else if (resp.code === 1003 && resp.data.exam_topic) {\n _this4.setState({\n addCommentStatus: __chunk_5.FAIL\n });\n\n if (typeof failCallback === 'function') {\n failCallback(resp.code, resp.data, resp.msg);\n } // 1000 回应内容不能为空 || 回应包含被禁止的内容\n // 1003 没有回应权限\n\n } else {\n if (typeof failCallback === 'function') {\n failCallback(resp.code, resp.data, resp.msg);\n }\n\n throw resp.msg;\n }\n }).catch(function (error) {\n console.error('出错了!', error);\n\n if (typeof failCallback === 'function') {\n failCallback(error);\n }\n\n _this4.setState({\n addCommentStatus: __chunk_5.FAIL,\n notificationVisible: true,\n notificationMsg: typeof error === 'string' ? error : '添加回应出错了'\n });\n });\n } // 新增二级回应\n // 如果有 commentId ,说明新增的 reply 是针对 comment 的回应,\n // 而不是针对comment 下面 reply 的回应\n ;\n\n _proto.handleAddReply = function handleAddReply(newReply, successCallback, failCallback, commentId, hideReplyEditorCallback, scrollToLatestReplyCallback) {\n var _this5 = this;\n\n var _this$state3 = this.state,\n addReplyStatus = _this$state3.addReplyStatus,\n comments = _this$state3.comments;\n\n if (addReplyStatus === __chunk_5.PENDING) {\n return;\n }\n\n if (window._USER_ABNORMAL) {\n if (typeof window.show_abnormal === 'function') {\n window.show_abnormal();\n }\n\n return;\n }\n\n __chunk_4.CommentsAPI.addReply(newReply).then(function (resp) {\n // 提交成功\n if (resp.code === 0) {\n // 提交成功后,刷新页面\n // 标记为最新回应,用于滚动定位\n var latestReply = resp.data || resp;\n latestReply.is_latest = true; // 暂时占位用\n\n latestReply.is_temporary = true;\n\n var _comments = comments.map(function (comment, index) {\n // 先全部清除一遍标记\n comment.replies.map(function (reply) {\n var _reply = _extends_1({}, reply);\n\n delete _reply.is_latest;\n return _reply;\n }); // 再添加\n\n if (comment.id === commentId) {\n comment.replies.push(latestReply);\n return comment;\n }\n\n return comment;\n });\n\n _this5.setState({\n addReplyStatus: __chunk_5.SUCCESS,\n comments: _comments\n });\n\n if (typeof successCallback === 'function') {\n successCallback();\n }\n\n if (typeof hideReplyEditorCallback === 'function') {\n hideReplyEditorCallback();\n } // 不再定位到最后的回复\n // setTimeout(() => {\n // if (typeof scrollToLatestReplyCallback === 'function') {\n // scrollToLatestReplyCallback()\n // }\n // }, 400)\n // 1001 需要输入验证码\n\n } else if (resp.code === 1001) {\n _this5.setState({\n addReplyStatus: __chunk_5.FAIL\n });\n\n console.warn('出错了', resp.msg);\n\n if (typeof failCallback === 'function') {\n failCallback(resp.code, resp.data, resp.msg);\n } // 1002 需要跳转到审核页面\n\n } else if (resp.code === 1002) {\n console.warn('出错了', resp.msg);\n\n _this5.setState({\n addReplyStatus: __chunk_5.FAIL\n });\n\n setTimeout(function () {\n window.location.href = resp.data.url;\n }, 500); // 1003 需答题\n } else if (resp.code === 1003 && resp.data.exam_topic) {\n _this5.setState({\n addReplyStatus: __chunk_5.FAIL\n });\n\n if (typeof failCallback === 'function') {\n failCallback(resp.code, resp.data, resp.msg);\n } // 1000 回应内容不能为空 || 回应包含被禁止的内容\n // 1003 没有回应权限\n\n } else {\n console.warn('出错了', resp.msg);\n\n if (typeof failCallback === 'function') {\n failCallback(resp.code, resp.data, resp.msg);\n }\n\n throw resp.msg;\n }\n }).catch(function (error) {\n console.error('出错了!', error);\n\n if (typeof failCallback === 'function') {\n failCallback(error);\n }\n\n _this5.setState({\n addReplyStatus: __chunk_5.FAIL,\n notificationVisible: true,\n notificationMsg: typeof error === 'string' ? error : '添加回应出错了'\n });\n });\n } // 删除一级和二级回应, 如果有 parentCommentId ,说明删除的是二级回应 reply\n ;\n\n _proto.handleDelete = function handleDelete(id, parentCommentId) {\n var _this6 = this;\n\n var _this$state4 = this.state,\n comments = _this$state4.comments,\n truncation = _this$state4.truncation;\n\n if (window._USER_ABNORMAL && typeof window.show_abnormal === 'function') {\n window.show_abnormal();\n return;\n }\n\n __chunk_4.CommentsAPI.delete({\n cid: id\n }).then(function (resp) {\n // 新版接口都是返回 code,这个接口是旧的,返回的还是 resp.r, 所以做下兼容处理\n if (resp.code === 0 || resp.r === 0) {\n var _comments = comments;\n\n if (!parentCommentId) {\n _comments = comments.map(function (comment) {\n var _comment = _extends_1({}, comment);\n\n if (_comment.id === id) {\n if (comment.total_replies > 0) {\n _comment.text = '「该回应已被删除」';\n }\n\n _comment.is_deleted = true;\n return _comment;\n }\n\n return _comment;\n });\n } else {\n _comments = comments.map(function (comment) {\n if (comment.id === parentCommentId) {\n var _replies = comment.replies.map(function (reply) {\n var _reply = _extends_1({}, reply);\n\n if (_reply.id === id) {\n // 不管这条回应有没有被再次回应过,都直接删掉\n // reply.text = '「该回应已被删除」'\n _reply.is_deleted = true;\n }\n\n return _reply;\n });\n\n comment.replies = cloneDeep(_replies);\n return comment;\n }\n\n return comment;\n });\n }\n\n _this6.setState({\n comments: _comments,\n truncation: truncation - 1\n });\n }\n }).catch(function (error) {\n console.error('删除失败', error);\n\n _this6.setState({\n notificationVisible: true,\n notificationMsg: typeof error === 'string' ? error : '删除出错了'\n });\n });\n } // 收起回应\n ;\n\n _proto.handleFoldReplies = function handleFoldReplies(commentId, callback) {\n var _this$state5 = this.state,\n comments = _this$state5.comments,\n truncation = _this$state5.truncation;\n\n var _comments = comments.map(function (comment) {\n var _comment = _extends_1({}, comment);\n\n if (_comment.id === commentId) {\n // 重新回到 3 条\n _comment.replies = _comment.replies.slice(0, truncation);\n return _comment;\n }\n\n return _comment;\n });\n\n this.setState({\n comments: _comments\n });\n\n if (typeof callback === 'function') {\n callback();\n }\n } // 展开更多回应\n ;\n\n _proto.handleLoadMoreReplies = function handleLoadMoreReplies(commentId, params, successCallback, failCallback) {\n var _this7 = this;\n\n var comments = this.state.comments;\n __chunk_4.CommentsAPI.getReplies(_extends_1({\n commentId: commentId\n }, params)).then(function (data) {\n // 这个接口没有返回 code,所以直接判断 data 了\n if (data) {\n var _comments = comments.map(function (comment) {\n var _comment = _extends_1({}, comment);\n\n if (_comment.id === commentId) {\n // TODO: 如果之前新增了回应,需要把刚拿到的 replies 插入到新增回应的上方,以保持新增回应一直在最下。(好像是有这么个需求??)\n\n /*\n * 有这么一个情况:\n * 如果有「展开更多」时,添加了的回应,然后再\n * 点击「展开更多」拿到新的数据后,需要把之前添加的回应从旧的 replies\n * 列表里过滤掉,否则旧的里有刚加的回应、新数据\n * 也里有刚加的回应,就重复了。\n */\n _comment.replies = _comment.replies.filter(function (reply) {\n return !reply.is_temporary;\n }).concat(data.replies || []);\n return _comment;\n }\n\n return _comment;\n });\n\n _this7.setState({\n comments: _comments\n });\n\n successCallback(data);\n }\n }).catch(function (error) {\n console.error('请求更多回应时加载失败', error);\n\n _this7.setState({\n notificationVisible: true,\n notificationMsg: typeof error === 'string' ? error : '请求出错了'\n });\n\n failCallback(error);\n });\n };\n\n _proto.render = function render() {\n var config = this.props.config;\n var _this$state6 = this.state,\n comments = _this$state6.comments,\n truncation = _this$state6.truncation,\n isShowDialog = _this$state6.isShowDialog,\n notificationVisible = _this$state6.notificationVisible,\n notificationMsg = _this$state6.notificationMsg,\n isReported = _this$state6.isReported,\n reportReasons = _this$state6.reportReasons,\n isFetchingReportReasons = _this$state6.isFetchingReportReasons;\n\n if (!config) {\n return null;\n }\n\n var app = config.app,\n service = config.service,\n total = config.total,\n start = config.start,\n count = config.count,\n target = config.target,\n options = config.options,\n needEscape = config.needEscape;\n var defaultBgColor = {\n note: 'f1faf1',\n movie: '#f3f5f7',\n book: '#f8f8f4',\n music: '#f4f7f3'\n };\n var bgColor = options.bg_color ? options.bg_color : defaultBgColor[app] || '#f3f5f7';\n return React__default.createElement(\"div\", {\n className: __chunk_3.classnames('comments-app-wrapper', {\n dev: __chunk_4.IS_DEV\n })\n }, target.hidden_nonfriend_comments ? React__default.createElement(\"div\", {\n className: \"comment-tips\"\n }, \"\\u7531\\u4E8E\\u53D1\\u5E03\\u8005\\u7684\\u8BBE\\u7F6E\\uFF0C\\u4E0D\\u5C55\\u793A\\u6240\\u6709\\u4EBA\\u7684\\u56DE\\u5E94\") : null, React__default.createElement(commentList.default, {\n config: config,\n bgColor: bgColor,\n target: target,\n comments: comments,\n needEscape: needEscape,\n canAtSb: options.can_at_sb,\n maxLength: options.max_length,\n replyUsers: this.getReplyUsers(),\n truncation: truncation,\n handleAddComment: this.handleAddComment.bind(this),\n handleAddReply: this.handleAddReply.bind(this),\n handleDelete: this.handleDelete.bind(this),\n handleFoldReplies: this.handleFoldReplies.bind(this),\n handleLoadMoreReplies: this.handleLoadMoreReplies.bind(this),\n handleShowReportDialog: this.handleShowReportDialog.bind(this)\n }), total > count ? React__default.createElement(paginator.default, {\n app: app,\n service: service,\n total: total,\n start: start,\n count: count\n }) : null, this.renderCommentEditor(), React__default.createElement(report.default, {\n reasons: reportReasons,\n isShowDialog: isShowDialog,\n isFetchingReportReasons: isFetchingReportReasons,\n isReported: isReported,\n reportType: options.report_type || 'comment',\n handleHideReportDialog: this.handleHideReportDialog.bind(this),\n handleSubmitReport: this.handleSubmitReport.bind(this)\n }), React__default.createElement(reactNotification.Notification, {\n style: false,\n className: \"comment-notification-bar\",\n activeClassName: \"actived\",\n action: \"\",\n isActive: notificationVisible,\n message: typeof notificationMsg === 'string' ? notificationMsg : '服务器开小差',\n dismissAfter: 1500,\n title: \"\",\n onDismiss: this.handleHideNotification.bind(this)\n }));\n };\n\n _proto.renderCommentEditor = function renderCommentEditor() {\n var config = this.props.config;\n var total = config.total,\n start = config.start,\n count = config.count,\n user = config.user,\n author = config.author,\n target = config.target,\n options = config.options;\n var currentPage = Math.floor(start / count) + 1; // 当前页数\n\n var totalPage = Math.floor(total / count) + (total % count > 0 ? 1 : 0); // 总页数\n\n var currentPageIsTheEndPage = currentPage >= totalPage; // 如果设置了只在末页显示输入框,但当前页并不是末页,则不显示输入框\n\n if (options.only_comment_at_the_end_of_pages && !currentPageIsTheEndPage) {\n return null;\n }\n\n return React__default.createElement(commentEditor.default, {\n config: config,\n author: author,\n enableSyncToStatus: options.enable_comment_sync_to_status,\n user: user,\n maxLength: options.max_length || 0,\n canComment: target.can_add_comment,\n forbiddenCommentMessage: target.forbidden_comment_message,\n canAtSb: options.can_at_sb,\n replyUsers: this.getReplyUsers(),\n onlyFriendCanComment: target.reply_limit === 'F',\n canUploadFile: options.can_upload_file,\n handleAddComment: this.handleAddComment.bind(this)\n });\n };\n\n _proto.getReplyUsers = function getReplyUsers() {\n var _this$props$config = this.props.config,\n user = _this$props$config.user,\n comments = _this$props$config.comments;\n\n if (!user || !comments) {\n return [];\n }\n\n var replyUsers = [];\n var pushed = {};\n var userItem;\n pushed[user.uid] = 1;\n comments.forEach(function (comment) {\n // comment = comments[index]\n if (replyUsers.length > 5) return;\n userItem = comment.author;\n\n if (userItem) {\n var _userItem = userItem,\n uid = _userItem.uid,\n name = _userItem.name,\n avatar = _userItem.avatar;\n\n if (!(uid in pushed)) {\n replyUsers.push({\n uid: uid,\n username: name,\n avatar: avatar\n });\n pushed[uid] = 1;\n }\n }\n });\n return replyUsers;\n };\n\n return CommentApp;\n}(React.Component);\n\nCommentApp.propTypes = commentAppPropTypes;\nCommentApp.defaultProps = commentAppDefaultProps;\n\nexports.commentAppDefaultProps = commentAppDefaultProps;\nexports.commentAppPropTypes = commentAppPropTypes;\nexports.default = CommentApp;\n//# sourceMappingURL=comment-app.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/comments/lib/comment-app.js\n// module id = 76\n// module chunks = 0\n//# sourceURL=webpack:///./~/comments/lib/comment-app.js?")},function(module,exports,__webpack_require__){eval("'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\n__webpack_require__(1);\n__webpack_require__(6);\nvar commentApp = __webpack_require__(76);\n__webpack_require__(10);\n__webpack_require__(2);\n__webpack_require__(4);\n__webpack_require__(33);\n__webpack_require__(38);\nvar commentList = __webpack_require__(35);\nvar baseItem = __webpack_require__(23);\n__webpack_require__(18);\n__webpack_require__(19);\nvar actionBar = __webpack_require__(15);\n__webpack_require__(5);\nvar userSelect = __webpack_require__(12);\nvar replyEditor = __webpack_require__(14);\n__webpack_require__(9);\n__webpack_require__(7);\n__webpack_require__(11);\n__webpack_require__(8);\nvar replyList = __webpack_require__(20);\nvar replyItem = __webpack_require__(17);\nvar commentEditor = __webpack_require__(34);\nvar paginator = __webpack_require__(36);\nvar report = __webpack_require__(37);\n\n/*\n * @Author: hanjiyun\n * @Date: 2019-05-13 12:48:47\n * @Last Modified by: hanjiyun\n * @Last Modified time: 2019-05-26 04:23:37\n */\n\nexports.CommentApp = commentApp.default;\nexports.commentAppDefaultProps = commentApp.commentAppDefaultProps;\nexports.commentAppPropTypes = commentApp.commentAppPropTypes;\nexports.CommentList = commentList.default;\nexports.commentListDefaultProps = commentList.commentListDefaultProps;\nexports.commentListPropTypes = commentList.commentListPropTypes;\nexports.BaseItem = baseItem.default;\nexports.baseItemDefaultProps = baseItem.baseItemDefaultProps;\nexports.baseItemPropTypes = baseItem.baseItemPropTypes;\nexports.ActionBar = actionBar.default;\nexports.commentActionsDefaultProps = actionBar.commentActionsDefaultProps;\nexports.commentActionsPropTypes = actionBar.commentActionsPropTypes;\nexports.UserSelect = userSelect.UserSelect;\nexports.userSelectDefaultProps = userSelect.userSelectDefaultProps;\nexports.userSelectPropTypes = userSelect.userSelectPropTypes;\nexports.ReplyEditor = replyEditor.default;\nexports.replyEditorDefaultProps = replyEditor.replyEditorDefaultProps;\nexports.replyEditorPropTypes = replyEditor.replyEditorPropTypes;\nexports.ReplyList = replyList.default;\nexports.replyListDefaultProps = replyList.replyListDefaultProps;\nexports.replyListPropTypes = replyList.replyListPropTypes;\nexports.ReplyItem = replyItem.default;\nexports.replyItemDefaultProps = replyItem.replyItemDefaultProps;\nexports.replyItemPropTypes = replyItem.replyItemPropTypes;\nexports.CommentEditor = commentEditor.default;\nexports.commentEditorDefaultProps = commentEditor.commentEditorDefaultProps;\nexports.commentEditorPropTypes = commentEditor.commentEditorPropTypes;\nexports.Paginator = paginator.default;\nexports.paginatorDefaultProps = paginator.paginatorDefaultProps;\nexports.paginatorPropTypes = paginator.paginatorPropTypes;\nexports.Report = report.default;\nexports.reportDefaultProps = report.reportDefaultProps;\nexports.reportPropTypes = report.reportPropTypes;\n//# sourceMappingURL=index.js.map\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./~/comments/lib/index.js\n// module id = 77\n// module chunks = 0\n//# sourceURL=webpack:///./~/comments/lib/index.js?");},function(module,exports,__webpack_require__){eval("/** @license React v17.0.2\n * react-dom.development.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';\n\nif (true) {\n (function() {\n'use strict';\n\nvar React = __webpack_require__(2);\nvar _assign = __webpack_require__(13);\nvar Scheduler = __webpack_require__(93);\nvar tracing = __webpack_require__(94);\n\nvar ReactSharedInternals = React.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;\n\n// by calls to these methods by a Babel plugin.\n//\n// In PROD (or in packages without access to React internals),\n// they are left as they are instead.\n\nfunction warn(format) {\n {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n printWarning('warn', format, args);\n }\n}\nfunction error(format) {\n {\n for (var _len2 = arguments.length, args = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {\n args[_key2 - 1] = arguments[_key2];\n }\n\n printWarning('error', format, args);\n }\n}\n\nfunction printWarning(level, format, args) {\n // When changing this logic, you might want to also\n // update consoleWithStackDev.www.js as well.\n {\n var ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;\n var stack = ReactDebugCurrentFrame.getStackAddendum();\n\n if (stack !== '') {\n format += '%s';\n args = args.concat([stack]);\n }\n\n var argsWithFormat = args.map(function (item) {\n return '' + item;\n }); // Careful: RN currently depends on this prefix\n\n argsWithFormat.unshift('Warning: ' + format); // We intentionally don't use spread (or .apply) directly because it\n // breaks IE9: https://github.com/facebook/react/issues/13610\n // eslint-disable-next-line react-internal/no-production-logging\n\n Function.prototype.apply.call(console[level], console, argsWithFormat);\n }\n}\n\nif (!React) {\n {\n throw Error( \"ReactDOM was loaded before React. Make sure you load the React package before loading ReactDOM.\" );\n }\n}\n\nvar FunctionComponent = 0;\nvar ClassComponent = 1;\nvar IndeterminateComponent = 2; // Before we know whether it is function or class\n\nvar HostRoot = 3; // Root of a host tree. Could be nested inside another node.\n\nvar HostPortal = 4; // A subtree. Could be an entry point to a different renderer.\n\nvar HostComponent = 5;\nvar HostText = 6;\nvar Fragment = 7;\nvar Mode = 8;\nvar ContextConsumer = 9;\nvar ContextProvider = 10;\nvar ForwardRef = 11;\nvar Profiler = 12;\nvar SuspenseComponent = 13;\nvar MemoComponent = 14;\nvar SimpleMemoComponent = 15;\nvar LazyComponent = 16;\nvar IncompleteClassComponent = 17;\nvar DehydratedFragment = 18;\nvar SuspenseListComponent = 19;\nvar FundamentalComponent = 20;\nvar ScopeComponent = 21;\nvar Block = 22;\nvar OffscreenComponent = 23;\nvar LegacyHiddenComponent = 24;\n\n// Filter certain DOM attributes (e.g. src, href) if their values are empty strings.\n\nvar enableProfilerTimer = true; // Record durations for commit and passive effects phases.\n\nvar enableFundamentalAPI = false; // Experimental Scope support.\nvar enableNewReconciler = false; // Errors that are thrown while unmounting (or after in the case of passive effects)\nvar warnAboutStringRefs = false;\n\nvar allNativeEvents = new Set();\n/**\n * Mapping from registration name to event name\n */\n\n\nvar registrationNameDependencies = {};\n/**\n * Mapping from lowercase registration names to the properly cased version,\n * used to warn in the case of missing event handlers. Available\n * only in true.\n * @type {Object}\n */\n\nvar possibleRegistrationNames = {} ; // Trust the developer to only use possibleRegistrationNames in true\n\nfunction registerTwoPhaseEvent(registrationName, dependencies) {\n registerDirectEvent(registrationName, dependencies);\n registerDirectEvent(registrationName + 'Capture', dependencies);\n}\nfunction registerDirectEvent(registrationName, dependencies) {\n {\n if (registrationNameDependencies[registrationName]) {\n error('EventRegistry: More than one plugin attempted to publish the same ' + 'registration name, `%s`.', registrationName);\n }\n }\n\n registrationNameDependencies[registrationName] = dependencies;\n\n {\n var lowerCasedName = registrationName.toLowerCase();\n possibleRegistrationNames[lowerCasedName] = registrationName;\n\n if (registrationName === 'onDoubleClick') {\n possibleRegistrationNames.ondblclick = registrationName;\n }\n }\n\n for (var i = 0; i < dependencies.length; i++) {\n allNativeEvents.add(dependencies[i]);\n }\n}\n\nvar canUseDOM = !!(typeof window !== 'undefined' && typeof window.document !== 'undefined' && typeof window.document.createElement !== 'undefined');\n\n// A reserved attribute.\n// It is handled by React separately and shouldn't be written to the DOM.\nvar RESERVED = 0; // A simple string attribute.\n// Attributes that aren't in the filter are presumed to have this type.\n\nvar STRING = 1; // A string attribute that accepts booleans in React. In HTML, these are called\n// \"enumerated\" attributes with \"true\" and \"false\" as possible values.\n// When true, it should be set to a \"true\" string.\n// When false, it should be set to a \"false\" string.\n\nvar BOOLEANISH_STRING = 2; // A real boolean attribute.\n// When true, it should be present (set either to an empty string or its name).\n// When false, it should be omitted.\n\nvar BOOLEAN = 3; // An attribute that can be used as a flag as well as with a value.\n// When true, it should be present (set either to an empty string or its name).\n// When false, it should be omitted.\n// For any other value, should be present with that value.\n\nvar OVERLOADED_BOOLEAN = 4; // An attribute that must be numeric or parse as a numeric.\n// When falsy, it should be removed.\n\nvar NUMERIC = 5; // An attribute that must be positive numeric or parse as a positive numeric.\n// When falsy, it should be removed.\n\nvar POSITIVE_NUMERIC = 6;\n\n/* eslint-disable max-len */\nvar ATTRIBUTE_NAME_START_CHAR = \":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\";\n/* eslint-enable max-len */\n\nvar ATTRIBUTE_NAME_CHAR = ATTRIBUTE_NAME_START_CHAR + \"\\\\-.0-9\\\\u00B7\\\\u0300-\\\\u036F\\\\u203F-\\\\u2040\";\nvar ROOT_ATTRIBUTE_NAME = 'data-reactroot';\nvar VALID_ATTRIBUTE_NAME_REGEX = new RegExp('^[' + ATTRIBUTE_NAME_START_CHAR + '][' + ATTRIBUTE_NAME_CHAR + ']*$');\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar illegalAttributeNameCache = {};\nvar validatedAttributeNameCache = {};\nfunction isAttributeNameSafe(attributeName) {\n if (hasOwnProperty.call(validatedAttributeNameCache, attributeName)) {\n return true;\n }\n\n if (hasOwnProperty.call(illegalAttributeNameCache, attributeName)) {\n return false;\n }\n\n if (VALID_ATTRIBUTE_NAME_REGEX.test(attributeName)) {\n validatedAttributeNameCache[attributeName] = true;\n return true;\n }\n\n illegalAttributeNameCache[attributeName] = true;\n\n {\n error('Invalid attribute name: `%s`', attributeName);\n }\n\n return false;\n}\nfunction shouldIgnoreAttribute(name, propertyInfo, isCustomComponentTag) {\n if (propertyInfo !== null) {\n return propertyInfo.type === RESERVED;\n }\n\n if (isCustomComponentTag) {\n return false;\n }\n\n if (name.length > 2 && (name[0] === 'o' || name[0] === 'O') && (name[1] === 'n' || name[1] === 'N')) {\n return true;\n }\n\n return false;\n}\nfunction shouldRemoveAttributeWithWarning(name, value, propertyInfo, isCustomComponentTag) {\n if (propertyInfo !== null && propertyInfo.type === RESERVED) {\n return false;\n }\n\n switch (typeof value) {\n case 'function': // $FlowIssue symbol is perfectly valid here\n\n case 'symbol':\n // eslint-disable-line\n return true;\n\n case 'boolean':\n {\n if (isCustomComponentTag) {\n return false;\n }\n\n if (propertyInfo !== null) {\n return !propertyInfo.acceptsBooleans;\n } else {\n var prefix = name.toLowerCase().slice(0, 5);\n return prefix !== 'data-' && prefix !== 'aria-';\n }\n }\n\n default:\n return false;\n }\n}\nfunction shouldRemoveAttribute(name, value, propertyInfo, isCustomComponentTag) {\n if (value === null || typeof value === 'undefined') {\n return true;\n }\n\n if (shouldRemoveAttributeWithWarning(name, value, propertyInfo, isCustomComponentTag)) {\n return true;\n }\n\n if (isCustomComponentTag) {\n return false;\n }\n\n if (propertyInfo !== null) {\n\n switch (propertyInfo.type) {\n case BOOLEAN:\n return !value;\n\n case OVERLOADED_BOOLEAN:\n return value === false;\n\n case NUMERIC:\n return isNaN(value);\n\n case POSITIVE_NUMERIC:\n return isNaN(value) || value < 1;\n }\n }\n\n return false;\n}\nfunction getPropertyInfo(name) {\n return properties.hasOwnProperty(name) ? properties[name] : null;\n}\n\nfunction PropertyInfoRecord(name, type, mustUseProperty, attributeName, attributeNamespace, sanitizeURL, removeEmptyString) {\n this.acceptsBooleans = type === BOOLEANISH_STRING || type === BOOLEAN || type === OVERLOADED_BOOLEAN;\n this.attributeName = attributeName;\n this.attributeNamespace = attributeNamespace;\n this.mustUseProperty = mustUseProperty;\n this.propertyName = name;\n this.type = type;\n this.sanitizeURL = sanitizeURL;\n this.removeEmptyString = removeEmptyString;\n} // When adding attributes to this list, be sure to also add them to\n// the `possibleStandardNames` module to ensure casing and incorrect\n// name warnings.\n\n\nvar properties = {}; // These props are reserved by React. They shouldn't be written to the DOM.\n\nvar reservedProps = ['children', 'dangerouslySetInnerHTML', // TODO: This prevents the assignment of defaultValue to regular\n// elements (not just inputs). Now that ReactDOMInput assigns to the\n// defaultValue property -- do we need this?\n'defaultValue', 'defaultChecked', 'innerHTML', 'suppressContentEditableWarning', 'suppressHydrationWarning', 'style'];\nreservedProps.forEach(function (name) {\n properties[name] = new PropertyInfoRecord(name, RESERVED, false, // mustUseProperty\n name, // attributeName\n null, // attributeNamespace\n false, // sanitizeURL\n false);\n}); // A few React string attributes have a different name.\n// This is a mapping from React prop names to the attribute names.\n\n[['acceptCharset', 'accept-charset'], ['className', 'class'], ['htmlFor', 'for'], ['httpEquiv', 'http-equiv']].forEach(function (_ref) {\n var name = _ref[0],\n attributeName = _ref[1];\n properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty\n attributeName, // attributeName\n null, // attributeNamespace\n false, // sanitizeURL\n false);\n}); // These are \"enumerated\" HTML attributes that accept \"true\" and \"false\".\n// In React, we let users pass `true` and `false` even though technically\n// these aren't boolean attributes (they are coerced to strings).\n\n['contentEditable', 'draggable', 'spellCheck', 'value'].forEach(function (name) {\n properties[name] = new PropertyInfoRecord(name, BOOLEANISH_STRING, false, // mustUseProperty\n name.toLowerCase(), // attributeName\n null, // attributeNamespace\n false, // sanitizeURL\n false);\n}); // These are \"enumerated\" SVG attributes that accept \"true\" and \"false\".\n// In React, we let users pass `true` and `false` even though technically\n// these aren't boolean attributes (they are coerced to strings).\n// Since these are SVG attributes, their attribute names are case-sensitive.\n\n['autoReverse', 'externalResourcesRequired', 'focusable', 'preserveAlpha'].forEach(function (name) {\n properties[name] = new PropertyInfoRecord(name, BOOLEANISH_STRING, false, // mustUseProperty\n name, // attributeName\n null, // attributeNamespace\n false, // sanitizeURL\n false);\n}); // These are HTML boolean attributes.\n\n['allowFullScreen', 'async', // Note: there is a special case that prevents it from being written to the DOM\n// on the client side because the browsers are inconsistent. Instead we call focus().\n'autoFocus', 'autoPlay', 'controls', 'default', 'defer', 'disabled', 'disablePictureInPicture', 'disableRemotePlayback', 'formNoValidate', 'hidden', 'loop', 'noModule', 'noValidate', 'open', 'playsInline', 'readOnly', 'required', 'reversed', 'scoped', 'seamless', // Microdata\n'itemScope'].forEach(function (name) {\n properties[name] = new PropertyInfoRecord(name, BOOLEAN, false, // mustUseProperty\n name.toLowerCase(), // attributeName\n null, // attributeNamespace\n false, // sanitizeURL\n false);\n}); // These are the few React props that we set as DOM properties\n// rather than attributes. These are all booleans.\n\n['checked', // Note: `option.selected` is not updated if `select.multiple` is\n// disabled with `removeAttribute`. We have special logic for handling this.\n'multiple', 'muted', 'selected' // NOTE: if you add a camelCased prop to this list,\n// you'll need to set attributeName to name.toLowerCase()\n// instead in the assignment below.\n].forEach(function (name) {\n properties[name] = new PropertyInfoRecord(name, BOOLEAN, true, // mustUseProperty\n name, // attributeName\n null, // attributeNamespace\n false, // sanitizeURL\n false);\n}); // These are HTML attributes that are \"overloaded booleans\": they behave like\n// booleans, but can also accept a string value.\n\n['capture', 'download' // NOTE: if you add a camelCased prop to this list,\n// you'll need to set attributeName to name.toLowerCase()\n// instead in the assignment below.\n].forEach(function (name) {\n properties[name] = new PropertyInfoRecord(name, OVERLOADED_BOOLEAN, false, // mustUseProperty\n name, // attributeName\n null, // attributeNamespace\n false, // sanitizeURL\n false);\n}); // These are HTML attributes that must be positive numbers.\n\n['cols', 'rows', 'size', 'span' // NOTE: if you add a camelCased prop to this list,\n// you'll need to set attributeName to name.toLowerCase()\n// instead in the assignment below.\n].forEach(function (name) {\n properties[name] = new PropertyInfoRecord(name, POSITIVE_NUMERIC, false, // mustUseProperty\n name, // attributeName\n null, // attributeNamespace\n false, // sanitizeURL\n false);\n}); // These are HTML attributes that must be numbers.\n\n['rowSpan', 'start'].forEach(function (name) {\n properties[name] = new PropertyInfoRecord(name, NUMERIC, false, // mustUseProperty\n name.toLowerCase(), // attributeName\n null, // attributeNamespace\n false, // sanitizeURL\n false);\n});\nvar CAMELIZE = /[\\-\\:]([a-z])/g;\n\nvar capitalize = function (token) {\n return token[1].toUpperCase();\n}; // This is a list of all SVG attributes that need special casing, namespacing,\n// or boolean value assignment. Regular attributes that just accept strings\n// and have the same names are omitted, just like in the HTML attribute filter.\n// Some of these attributes can be hard to find. This list was created by\n// scraping the MDN documentation.\n\n\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' // NOTE: if you add a camelCased prop to this list,\n// you'll need to set attributeName to name.toLowerCase()\n// instead in the assignment below.\n].forEach(function (attributeName) {\n var name = attributeName.replace(CAMELIZE, capitalize);\n properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty\n attributeName, null, // attributeNamespace\n false, // sanitizeURL\n false);\n}); // String SVG attributes with the xlink namespace.\n\n['xlink:actuate', 'xlink:arcrole', 'xlink:role', 'xlink:show', 'xlink:title', 'xlink:type' // NOTE: if you add a camelCased prop to this list,\n// you'll need to set attributeName to name.toLowerCase()\n// instead in the assignment below.\n].forEach(function (attributeName) {\n var name = attributeName.replace(CAMELIZE, capitalize);\n properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty\n attributeName, 'http://www.w3.org/1999/xlink', false, // sanitizeURL\n false);\n}); // String SVG attributes with the xml namespace.\n\n['xml:base', 'xml:lang', 'xml:space' // NOTE: if you add a camelCased prop to this list,\n// you'll need to set attributeName to name.toLowerCase()\n// instead in the assignment below.\n].forEach(function (attributeName) {\n var name = attributeName.replace(CAMELIZE, capitalize);\n properties[name] = new PropertyInfoRecord(name, STRING, false, // mustUseProperty\n attributeName, 'http://www.w3.org/XML/1998/namespace', false, // sanitizeURL\n false);\n}); // These attribute exists both in HTML and SVG.\n// The attribute name is case-sensitive in SVG so we can't just use\n// the React name like we do for attributes that exist only in HTML.\n\n['tabIndex', 'crossOrigin'].forEach(function (attributeName) {\n properties[attributeName] = new PropertyInfoRecord(attributeName, STRING, false, // mustUseProperty\n attributeName.toLowerCase(), // attributeName\n null, // attributeNamespace\n false, // sanitizeURL\n false);\n}); // These attributes accept URLs. These must not allow javascript: URLS.\n// These will also need to accept Trusted Types object in the future.\n\nvar xlinkHref = 'xlinkHref';\nproperties[xlinkHref] = new PropertyInfoRecord('xlinkHref', STRING, false, // mustUseProperty\n'xlink:href', 'http://www.w3.org/1999/xlink', true, // sanitizeURL\nfalse);\n['src', 'href', 'action', 'formAction'].forEach(function (attributeName) {\n properties[attributeName] = new PropertyInfoRecord(attributeName, STRING, false, // mustUseProperty\n attributeName.toLowerCase(), // attributeName\n null, // attributeNamespace\n true, // sanitizeURL\n true);\n});\n\n// and any newline or tab are filtered out as if they're not part of the URL.\n// https://url.spec.whatwg.org/#url-parsing\n// Tab or newline are defined as \\r\\n\\t:\n// https://infra.spec.whatwg.org/#ascii-tab-or-newline\n// A C0 control is a code point in the range \\u0000 NULL to \\u001F\n// INFORMATION SEPARATOR ONE, inclusive:\n// https://infra.spec.whatwg.org/#c0-control-or-space\n\n/* eslint-disable max-len */\n\nvar isJavaScriptProtocol = /^[\\u0000-\\u001F ]*j[\\r\\n\\t]*a[\\r\\n\\t]*v[\\r\\n\\t]*a[\\r\\n\\t]*s[\\r\\n\\t]*c[\\r\\n\\t]*r[\\r\\n\\t]*i[\\r\\n\\t]*p[\\r\\n\\t]*t[\\r\\n\\t]*\\:/i;\nvar didWarn = false;\n\nfunction sanitizeURL(url) {\n {\n if (!didWarn && isJavaScriptProtocol.test(url)) {\n didWarn = true;\n\n error('A future version of React will block javascript: URLs as a security precaution. ' + 'Use event handlers instead if you can. If you need to generate unsafe HTML try ' + 'using dangerouslySetInnerHTML instead. React was passed %s.', JSON.stringify(url));\n }\n }\n}\n\n/**\n * Get the value for a property on a node. Only used in DEV for SSR validation.\n * The \"expected\" argument is used as a hint of what the expected value is.\n * Some properties have multiple equivalent values.\n */\nfunction getValueForProperty(node, name, expected, propertyInfo) {\n {\n if (propertyInfo.mustUseProperty) {\n var propertyName = propertyInfo.propertyName;\n return node[propertyName];\n } else {\n if ( propertyInfo.sanitizeURL) {\n // If we haven't fully disabled javascript: URLs, and if\n // the hydration is successful of a javascript: URL, we\n // still want to warn on the client.\n sanitizeURL('' + expected);\n }\n\n var attributeName = propertyInfo.attributeName;\n var stringValue = null;\n\n if (propertyInfo.type === OVERLOADED_BOOLEAN) {\n if (node.hasAttribute(attributeName)) {\n var value = node.getAttribute(attributeName);\n\n if (value === '') {\n return true;\n }\n\n if (shouldRemoveAttribute(name, expected, propertyInfo, false)) {\n return value;\n }\n\n if (value === '' + expected) {\n return expected;\n }\n\n return value;\n }\n } else if (node.hasAttribute(attributeName)) {\n if (shouldRemoveAttribute(name, expected, propertyInfo, false)) {\n // We had an attribute but shouldn't have had one, so read it\n // for the error message.\n return node.getAttribute(attributeName);\n }\n\n if (propertyInfo.type === BOOLEAN) {\n // If this was a boolean, it doesn't matter what the value is\n // the fact that we have it is the same as the expected.\n return expected;\n } // Even if this property uses a namespace we use getAttribute\n // because we assume its namespaced name is the same as our config.\n // To use getAttributeNS we need the local name which we don't have\n // in our config atm.\n\n\n stringValue = node.getAttribute(attributeName);\n }\n\n if (shouldRemoveAttribute(name, expected, propertyInfo, false)) {\n return stringValue === null ? expected : stringValue;\n } else if (stringValue === '' + expected) {\n return expected;\n } else {\n return stringValue;\n }\n }\n }\n}\n/**\n * Get the value for a attribute on a node. Only used in DEV for SSR validation.\n * The third argument is used as a hint of what the expected value is. Some\n * attributes have multiple equivalent values.\n */\n\nfunction getValueForAttribute(node, name, expected) {\n {\n if (!isAttributeNameSafe(name)) {\n return;\n } // If the object is an opaque reference ID, it's expected that\n // the next prop is different than the server value, so just return\n // expected\n\n\n if (isOpaqueHydratingObject(expected)) {\n return expected;\n }\n\n if (!node.hasAttribute(name)) {\n return expected === undefined ? undefined : null;\n }\n\n var value = node.getAttribute(name);\n\n if (value === '' + expected) {\n return expected;\n }\n\n return value;\n }\n}\n/**\n * Sets the value for a property on a node.\n *\n * @param {DOMElement} node\n * @param {string} name\n * @param {*} value\n */\n\nfunction setValueForProperty(node, name, value, isCustomComponentTag) {\n var propertyInfo = getPropertyInfo(name);\n\n if (shouldIgnoreAttribute(name, propertyInfo, isCustomComponentTag)) {\n return;\n }\n\n if (shouldRemoveAttribute(name, value, propertyInfo, isCustomComponentTag)) {\n value = null;\n } // If the prop isn't in the special list, treat it as a simple attribute.\n\n\n if (isCustomComponentTag || propertyInfo === null) {\n if (isAttributeNameSafe(name)) {\n var _attributeName = name;\n\n if (value === null) {\n node.removeAttribute(_attributeName);\n } else {\n node.setAttribute(_attributeName, '' + value);\n }\n }\n\n return;\n }\n\n var mustUseProperty = propertyInfo.mustUseProperty;\n\n if (mustUseProperty) {\n var propertyName = propertyInfo.propertyName;\n\n if (value === null) {\n var type = propertyInfo.type;\n node[propertyName] = type === BOOLEAN ? false : '';\n } else {\n // Contrary to `setAttribute`, object properties are properly\n // `toString`ed by IE8/9.\n node[propertyName] = value;\n }\n\n return;\n } // The rest are treated as attributes with special cases.\n\n\n var attributeName = propertyInfo.attributeName,\n attributeNamespace = propertyInfo.attributeNamespace;\n\n if (value === null) {\n node.removeAttribute(attributeName);\n } else {\n var _type = propertyInfo.type;\n var attributeValue;\n\n if (_type === BOOLEAN || _type === OVERLOADED_BOOLEAN && value === true) {\n // If attribute type is boolean, we know for sure it won't be an execution sink\n // and we won't require Trusted Type here.\n attributeValue = '';\n } else {\n // `setAttribute` with objects becomes only `[object]` in IE8/9,\n // ('' + value) makes it output the correct toString()-value.\n {\n attributeValue = '' + value;\n }\n\n if (propertyInfo.sanitizeURL) {\n sanitizeURL(attributeValue.toString());\n }\n }\n\n if (attributeNamespace) {\n node.setAttributeNS(attributeNamespace, attributeName, attributeValue);\n } else {\n node.setAttribute(attributeName, attributeValue);\n }\n }\n}\n\n// ATTENTION\n// When adding new symbols to this file,\n// Please consider also adding to 'react-devtools-shared/src/backend/ReactSymbols'\n// The Symbol used to tag the ReactElement-like types. If there is no native Symbol\n// nor polyfill, then a plain number is used for performance.\nvar REACT_ELEMENT_TYPE = 0xeac7;\nvar REACT_PORTAL_TYPE = 0xeaca;\nvar REACT_FRAGMENT_TYPE = 0xeacb;\nvar REACT_STRICT_MODE_TYPE = 0xeacc;\nvar REACT_PROFILER_TYPE = 0xead2;\nvar REACT_PROVIDER_TYPE = 0xeacd;\nvar REACT_CONTEXT_TYPE = 0xeace;\nvar REACT_FORWARD_REF_TYPE = 0xead0;\nvar REACT_SUSPENSE_TYPE = 0xead1;\nvar REACT_SUSPENSE_LIST_TYPE = 0xead8;\nvar REACT_MEMO_TYPE = 0xead3;\nvar REACT_LAZY_TYPE = 0xead4;\nvar REACT_BLOCK_TYPE = 0xead9;\nvar REACT_SERVER_BLOCK_TYPE = 0xeada;\nvar REACT_FUNDAMENTAL_TYPE = 0xead5;\nvar REACT_SCOPE_TYPE = 0xead7;\nvar REACT_OPAQUE_ID_TYPE = 0xeae0;\nvar REACT_DEBUG_TRACING_MODE_TYPE = 0xeae1;\nvar REACT_OFFSCREEN_TYPE = 0xeae2;\nvar REACT_LEGACY_HIDDEN_TYPE = 0xeae3;\n\nif (typeof Symbol === 'function' && Symbol.for) {\n var symbolFor = Symbol.for;\n REACT_ELEMENT_TYPE = symbolFor('react.element');\n REACT_PORTAL_TYPE = symbolFor('react.portal');\n REACT_FRAGMENT_TYPE = symbolFor('react.fragment');\n REACT_STRICT_MODE_TYPE = symbolFor('react.strict_mode');\n REACT_PROFILER_TYPE = symbolFor('react.profiler');\n REACT_PROVIDER_TYPE = symbolFor('react.provider');\n REACT_CONTEXT_TYPE = symbolFor('react.context');\n REACT_FORWARD_REF_TYPE = symbolFor('react.forward_ref');\n REACT_SUSPENSE_TYPE = symbolFor('react.suspense');\n REACT_SUSPENSE_LIST_TYPE = symbolFor('react.suspense_list');\n REACT_MEMO_TYPE = symbolFor('react.memo');\n REACT_LAZY_TYPE = symbolFor('react.lazy');\n REACT_BLOCK_TYPE = symbolFor('react.block');\n REACT_SERVER_BLOCK_TYPE = symbolFor('react.server.block');\n REACT_FUNDAMENTAL_TYPE = symbolFor('react.fundamental');\n REACT_SCOPE_TYPE = symbolFor('react.scope');\n REACT_OPAQUE_ID_TYPE = symbolFor('react.opaque.id');\n REACT_DEBUG_TRACING_MODE_TYPE = symbolFor('react.debug_trace_mode');\n REACT_OFFSCREEN_TYPE = symbolFor('react.offscreen');\n REACT_LEGACY_HIDDEN_TYPE = symbolFor('react.legacy_hidden');\n}\n\nvar MAYBE_ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator;\nvar FAUX_ITERATOR_SYMBOL = '@@iterator';\nfunction getIteratorFn(maybeIterable) {\n if (maybeIterable === null || typeof maybeIterable !== 'object') {\n return null;\n }\n\n var maybeIterator = MAYBE_ITERATOR_SYMBOL && maybeIterable[MAYBE_ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL];\n\n if (typeof maybeIterator === 'function') {\n return maybeIterator;\n }\n\n return null;\n}\n\n// Helpers to patch console.logs to avoid logging during side-effect free\n// replaying on render function. This currently only patches the object\n// lazily which won't cover if the log function was extracted eagerly.\n// We could also eagerly patch the method.\nvar disabledDepth = 0;\nvar prevLog;\nvar prevInfo;\nvar prevWarn;\nvar prevError;\nvar prevGroup;\nvar prevGroupCollapsed;\nvar prevGroupEnd;\n\nfunction disabledLog() {}\n\ndisabledLog.__reactDisabledLog = true;\nfunction disableLogs() {\n {\n if (disabledDepth === 0) {\n /* eslint-disable react-internal/no-production-logging */\n prevLog = console.log;\n prevInfo = console.info;\n prevWarn = console.warn;\n prevError = console.error;\n prevGroup = console.group;\n prevGroupCollapsed = console.groupCollapsed;\n prevGroupEnd = console.groupEnd; // https://github.com/facebook/react/issues/19099\n\n var props = {\n configurable: true,\n enumerable: true,\n value: disabledLog,\n writable: true\n }; // $FlowFixMe Flow thinks console is immutable.\n\n Object.defineProperties(console, {\n info: props,\n log: props,\n warn: props,\n error: props,\n group: props,\n groupCollapsed: props,\n groupEnd: props\n });\n /* eslint-enable react-internal/no-production-logging */\n }\n\n disabledDepth++;\n }\n}\nfunction reenableLogs() {\n {\n disabledDepth--;\n\n if (disabledDepth === 0) {\n /* eslint-disable react-internal/no-production-logging */\n var props = {\n configurable: true,\n enumerable: true,\n writable: true\n }; // $FlowFixMe Flow thinks console is immutable.\n\n Object.defineProperties(console, {\n log: _assign({}, props, {\n value: prevLog\n }),\n info: _assign({}, props, {\n value: prevInfo\n }),\n warn: _assign({}, props, {\n value: prevWarn\n }),\n error: _assign({}, props, {\n value: prevError\n }),\n group: _assign({}, props, {\n value: prevGroup\n }),\n groupCollapsed: _assign({}, props, {\n value: prevGroupCollapsed\n }),\n groupEnd: _assign({}, props, {\n value: prevGroupEnd\n })\n });\n /* eslint-enable react-internal/no-production-logging */\n }\n\n if (disabledDepth < 0) {\n error('disabledDepth fell below zero. ' + 'This is a bug in React. Please file an issue.');\n }\n }\n}\n\nvar ReactCurrentDispatcher = ReactSharedInternals.ReactCurrentDispatcher;\nvar prefix;\nfunction describeBuiltInComponentFrame(name, source, ownerFn) {\n {\n if (prefix === undefined) {\n // Extract the VM specific prefix used by each line.\n try {\n throw Error();\n } catch (x) {\n var match = x.stack.trim().match(/\\n( *(at )?)/);\n prefix = match && match[1] || '';\n }\n } // We use the prefix to ensure our stacks line up with native stack frames.\n\n\n return '\\n' + prefix + name;\n }\n}\nvar reentry = false;\nvar componentFrameCache;\n\n{\n var PossiblyWeakMap = typeof WeakMap === 'function' ? WeakMap : Map;\n componentFrameCache = new PossiblyWeakMap();\n}\n\nfunction describeNativeComponentFrame(fn, construct) {\n // If something asked for a stack inside a fake render, it should get ignored.\n if (!fn || reentry) {\n return '';\n }\n\n {\n var frame = componentFrameCache.get(fn);\n\n if (frame !== undefined) {\n return frame;\n }\n }\n\n var control;\n reentry = true;\n var previousPrepareStackTrace = Error.prepareStackTrace; // $FlowFixMe It does accept undefined.\n\n Error.prepareStackTrace = undefined;\n var previousDispatcher;\n\n {\n previousDispatcher = ReactCurrentDispatcher.current; // Set the dispatcher in DEV because this might be call in the render function\n // for warnings.\n\n ReactCurrentDispatcher.current = null;\n disableLogs();\n }\n\n try {\n // This should throw.\n if (construct) {\n // Something should be setting the props in the constructor.\n var Fake = function () {\n throw Error();\n }; // $FlowFixMe\n\n\n Object.defineProperty(Fake.prototype, 'props', {\n set: function () {\n // We use a throwing setter instead of frozen or non-writable props\n // because that won't throw in a non-strict mode function.\n throw Error();\n }\n });\n\n if (typeof Reflect === 'object' && Reflect.construct) {\n // We construct a different control for this case to include any extra\n // frames added by the construct call.\n try {\n Reflect.construct(Fake, []);\n } catch (x) {\n control = x;\n }\n\n Reflect.construct(fn, [], Fake);\n } else {\n try {\n Fake.call();\n } catch (x) {\n control = x;\n }\n\n fn.call(Fake.prototype);\n }\n } else {\n try {\n throw Error();\n } catch (x) {\n control = x;\n }\n\n fn();\n }\n } catch (sample) {\n // This is inlined manually because closure doesn't do it for us.\n if (sample && control && typeof sample.stack === 'string') {\n // This extracts the first frame from the sample that isn't also in the control.\n // Skipping one frame that we assume is the frame that calls the two.\n var sampleLines = sample.stack.split('\\n');\n var controlLines = control.stack.split('\\n');\n var s = sampleLines.length - 1;\n var c = controlLines.length - 1;\n\n while (s >= 1 && c >= 0 && sampleLines[s] !== controlLines[c]) {\n // We expect at least one stack frame to be shared.\n // Typically this will be the root most one. However, stack frames may be\n // cut off due to maximum stack limits. In this case, one maybe cut off\n // earlier than the other. We assume that the sample is longer or the same\n // and there for cut off earlier. So we should find the root most frame in\n // the sample somewhere in the control.\n c--;\n }\n\n for (; s >= 1 && c >= 0; s--, c--) {\n // Next we find the first one that isn't the same which should be the\n // frame that called our sample function and the control.\n if (sampleLines[s] !== controlLines[c]) {\n // In V8, the first line is describing the message but other VMs don't.\n // If we're about to return the first line, and the control is also on the same\n // line, that's a pretty good indicator that our sample threw at same line as\n // the control. I.e. before we entered the sample frame. So we ignore this result.\n // This can happen if you passed a class to function component, or non-function.\n if (s !== 1 || c !== 1) {\n do {\n s--;\n c--; // We may still have similar intermediate frames from the construct call.\n // The next one that isn't the same should be our match though.\n\n if (c < 0 || sampleLines[s] !== controlLines[c]) {\n // V8 adds a \"new\" prefix for native classes. Let's remove it to make it prettier.\n var _frame = '\\n' + sampleLines[s].replace(' at new ', ' at ');\n\n {\n if (typeof fn === 'function') {\n componentFrameCache.set(fn, _frame);\n }\n } // Return the line we found.\n\n\n return _frame;\n }\n } while (s >= 1 && c >= 0);\n }\n\n break;\n }\n }\n }\n } finally {\n reentry = false;\n\n {\n ReactCurrentDispatcher.current = previousDispatcher;\n reenableLogs();\n }\n\n Error.prepareStackTrace = previousPrepareStackTrace;\n } // Fallback to just using the name if we couldn't make it throw.\n\n\n var name = fn ? fn.displayName || fn.name : '';\n var syntheticFrame = name ? describeBuiltInComponentFrame(name) : '';\n\n {\n if (typeof fn === 'function') {\n componentFrameCache.set(fn, syntheticFrame);\n }\n }\n\n return syntheticFrame;\n}\n\nfunction describeClassComponentFrame(ctor, source, ownerFn) {\n {\n return describeNativeComponentFrame(ctor, true);\n }\n}\nfunction describeFunctionComponentFrame(fn, source, ownerFn) {\n {\n return describeNativeComponentFrame(fn, false);\n }\n}\n\nfunction shouldConstruct(Component) {\n var prototype = Component.prototype;\n return !!(prototype && prototype.isReactComponent);\n}\n\nfunction describeUnknownElementTypeFrameInDEV(type, source, ownerFn) {\n\n if (type == null) {\n return '';\n }\n\n if (typeof type === 'function') {\n {\n return describeNativeComponentFrame(type, shouldConstruct(type));\n }\n }\n\n if (typeof type === 'string') {\n return describeBuiltInComponentFrame(type);\n }\n\n switch (type) {\n case REACT_SUSPENSE_TYPE:\n return describeBuiltInComponentFrame('Suspense');\n\n case REACT_SUSPENSE_LIST_TYPE:\n return describeBuiltInComponentFrame('SuspenseList');\n }\n\n if (typeof type === 'object') {\n switch (type.$$typeof) {\n case REACT_FORWARD_REF_TYPE:\n return describeFunctionComponentFrame(type.render);\n\n case REACT_MEMO_TYPE:\n // Memo may contain any component type so we recursively resolve it.\n return describeUnknownElementTypeFrameInDEV(type.type, source, ownerFn);\n\n case REACT_BLOCK_TYPE:\n return describeFunctionComponentFrame(type._render);\n\n case REACT_LAZY_TYPE:\n {\n var lazyComponent = type;\n var payload = lazyComponent._payload;\n var init = lazyComponent._init;\n\n try {\n // Lazy may contain any component type so we recursively resolve it.\n return describeUnknownElementTypeFrameInDEV(init(payload), source, ownerFn);\n } catch (x) {}\n }\n }\n }\n\n return '';\n}\n\nfunction describeFiber(fiber) {\n var owner = fiber._debugOwner ? fiber._debugOwner.type : null ;\n var source = fiber._debugSource ;\n\n switch (fiber.tag) {\n case HostComponent:\n return describeBuiltInComponentFrame(fiber.type);\n\n case LazyComponent:\n return describeBuiltInComponentFrame('Lazy');\n\n case SuspenseComponent:\n return describeBuiltInComponentFrame('Suspense');\n\n case SuspenseListComponent:\n return describeBuiltInComponentFrame('SuspenseList');\n\n case FunctionComponent:\n case IndeterminateComponent:\n case SimpleMemoComponent:\n return describeFunctionComponentFrame(fiber.type);\n\n case ForwardRef:\n return describeFunctionComponentFrame(fiber.type.render);\n\n case Block:\n return describeFunctionComponentFrame(fiber.type._render);\n\n case ClassComponent:\n return describeClassComponentFrame(fiber.type);\n\n default:\n return '';\n }\n}\n\nfunction getStackByFiberInDevAndProd(workInProgress) {\n try {\n var info = '';\n var node = workInProgress;\n\n do {\n info += describeFiber(node);\n node = node.return;\n } while (node);\n\n return info;\n } catch (x) {\n return '\\nError generating stack: ' + x.message + '\\n' + x.stack;\n }\n}\n\nfunction getWrappedName(outerType, innerType, wrapperName) {\n var functionName = innerType.displayName || innerType.name || '';\n return outerType.displayName || (functionName !== '' ? wrapperName + \"(\" + functionName + \")\" : wrapperName);\n}\n\nfunction getContextName(type) {\n return type.displayName || 'Context';\n}\n\nfunction getComponentName(type) {\n if (type == null) {\n // Host root, text node or just invalid type.\n return null;\n }\n\n {\n if (typeof type.tag === 'number') {\n error('Received an unexpected object in getComponentName(). ' + 'This is likely a bug in React. Please file an issue.');\n }\n }\n\n if (typeof type === 'function') {\n return type.displayName || type.name || null;\n }\n\n if (typeof type === 'string') {\n return type;\n }\n\n switch (type) {\n case REACT_FRAGMENT_TYPE:\n return 'Fragment';\n\n case REACT_PORTAL_TYPE:\n return 'Portal';\n\n case REACT_PROFILER_TYPE:\n return 'Profiler';\n\n case REACT_STRICT_MODE_TYPE:\n return 'StrictMode';\n\n case REACT_SUSPENSE_TYPE:\n return 'Suspense';\n\n case REACT_SUSPENSE_LIST_TYPE:\n return 'SuspenseList';\n }\n\n if (typeof type === 'object') {\n switch (type.$$typeof) {\n case REACT_CONTEXT_TYPE:\n var context = type;\n return getContextName(context) + '.Consumer';\n\n case REACT_PROVIDER_TYPE:\n var provider = type;\n return getContextName(provider._context) + '.Provider';\n\n case REACT_FORWARD_REF_TYPE:\n return getWrappedName(type, type.render, 'ForwardRef');\n\n case REACT_MEMO_TYPE:\n return getComponentName(type.type);\n\n case REACT_BLOCK_TYPE:\n return getComponentName(type._render);\n\n case REACT_LAZY_TYPE:\n {\n var lazyComponent = type;\n var payload = lazyComponent._payload;\n var init = lazyComponent._init;\n\n try {\n return getComponentName(init(payload));\n } catch (x) {\n return null;\n }\n }\n }\n }\n\n return null;\n}\n\nvar ReactDebugCurrentFrame = ReactSharedInternals.ReactDebugCurrentFrame;\nvar current = null;\nvar isRendering = false;\nfunction getCurrentFiberOwnerNameInDevOrNull() {\n {\n if (current === null) {\n return null;\n }\n\n var owner = current._debugOwner;\n\n if (owner !== null && typeof owner !== 'undefined') {\n return getComponentName(owner.type);\n }\n }\n\n return null;\n}\n\nfunction getCurrentFiberStackInDev() {\n {\n if (current === null) {\n return '';\n } // Safe because if current fiber exists, we are reconciling,\n // and it is guaranteed to be the work-in-progress version.\n\n\n return getStackByFiberInDevAndProd(current);\n }\n}\n\nfunction resetCurrentFiber() {\n {\n ReactDebugCurrentFrame.getCurrentStack = null;\n current = null;\n isRendering = false;\n }\n}\nfunction setCurrentFiber(fiber) {\n {\n ReactDebugCurrentFrame.getCurrentStack = getCurrentFiberStackInDev;\n current = fiber;\n isRendering = false;\n }\n}\nfunction setIsRendering(rendering) {\n {\n isRendering = rendering;\n }\n}\nfunction getIsRendering() {\n {\n return isRendering;\n }\n}\n\n// Flow does not allow string concatenation of most non-string types. To work\n// around this limitation, we use an opaque type that can only be obtained by\n// passing the value through getToStringValue first.\nfunction toString(value) {\n return '' + value;\n}\nfunction getToStringValue(value) {\n switch (typeof value) {\n case 'boolean':\n case 'number':\n case 'object':\n case 'string':\n case 'undefined':\n return value;\n\n default:\n // function, symbol are assigned as empty strings\n return '';\n }\n}\n\nvar hasReadOnlyValue = {\n button: true,\n checkbox: true,\n image: true,\n hidden: true,\n radio: true,\n reset: true,\n submit: true\n};\nfunction checkControlledValueProps(tagName, props) {\n {\n if (!(hasReadOnlyValue[props.type] || props.onChange || props.onInput || props.readOnly || props.disabled || props.value == null)) {\n error('You provided a `value` prop to a form field without an ' + '`onChange` handler. This will render a read-only field. If ' + 'the field should be mutable use `defaultValue`. Otherwise, ' + 'set either `onChange` or `readOnly`.');\n }\n\n if (!(props.onChange || props.readOnly || props.disabled || props.checked == null)) {\n error('You provided a `checked` prop to a form field without an ' + '`onChange` handler. This will render a read-only field. If ' + 'the field should be mutable use `defaultChecked`. Otherwise, ' + 'set either `onChange` or `readOnly`.');\n }\n }\n}\n\nfunction isCheckable(elem) {\n var type = elem.type;\n var nodeName = elem.nodeName;\n return nodeName && nodeName.toLowerCase() === 'input' && (type === 'checkbox' || type === 'radio');\n}\n\nfunction getTracker(node) {\n return node._valueTracker;\n}\n\nfunction detachTracker(node) {\n node._valueTracker = null;\n}\n\nfunction getValueFromNode(node) {\n var value = '';\n\n if (!node) {\n return value;\n }\n\n if (isCheckable(node)) {\n value = node.checked ? 'true' : 'false';\n } else {\n value = node.value;\n }\n\n return value;\n}\n\nfunction trackValueOnNode(node) {\n var valueField = isCheckable(node) ? 'checked' : 'value';\n var descriptor = Object.getOwnPropertyDescriptor(node.constructor.prototype, valueField);\n var currentValue = '' + node[valueField]; // if someone has already defined a value or Safari, then bail\n // and don't track value will cause over reporting of changes,\n // but it's better then a hard failure\n // (needed for certain tests that spyOn input values and Safari)\n\n if (node.hasOwnProperty(valueField) || typeof descriptor === 'undefined' || typeof descriptor.get !== 'function' || typeof descriptor.set !== 'function') {\n return;\n }\n\n var get = descriptor.get,\n set = descriptor.set;\n Object.defineProperty(node, valueField, {\n configurable: true,\n get: function () {\n return get.call(this);\n },\n set: function (value) {\n currentValue = '' + value;\n set.call(this, value);\n }\n }); // We could've passed this the first time\n // but it triggers a bug in IE11 and Edge 14/15.\n // Calling defineProperty() again should be equivalent.\n // https://github.com/facebook/react/issues/11768\n\n Object.defineProperty(node, valueField, {\n enumerable: descriptor.enumerable\n });\n var tracker = {\n getValue: function () {\n return currentValue;\n },\n setValue: function (value) {\n currentValue = '' + value;\n },\n stopTracking: function () {\n detachTracker(node);\n delete node[valueField];\n }\n };\n return tracker;\n}\n\nfunction track(node) {\n if (getTracker(node)) {\n return;\n } // TODO: Once it's just Fiber we can move this to node._wrapperState\n\n\n node._valueTracker = trackValueOnNode(node);\n}\nfunction updateValueIfChanged(node) {\n if (!node) {\n return false;\n }\n\n var tracker = getTracker(node); // if there is no tracker at this point it's unlikely\n // that trying again will succeed\n\n if (!tracker) {\n return true;\n }\n\n var lastValue = tracker.getValue();\n var nextValue = getValueFromNode(node);\n\n if (nextValue !== lastValue) {\n tracker.setValue(nextValue);\n return true;\n }\n\n return false;\n}\n\nfunction getActiveElement(doc) {\n doc = doc || (typeof document !== 'undefined' ? document : undefined);\n\n if (typeof doc === 'undefined') {\n return null;\n }\n\n try {\n return doc.activeElement || doc.body;\n } catch (e) {\n return doc.body;\n }\n}\n\nvar didWarnValueDefaultValue = false;\nvar didWarnCheckedDefaultChecked = false;\nvar didWarnControlledToUncontrolled = false;\nvar didWarnUncontrolledToControlled = false;\n\nfunction isControlled(props) {\n var usesChecked = props.type === 'checkbox' || props.type === 'radio';\n return usesChecked ? props.checked != null : props.value != null;\n}\n/**\n * Implements an host component that allows setting these optional\n * props: `checked`, `value`, `defaultChecked`, and `defaultValue`.\n *\n * If `checked` or `value` are not supplied (or null/undefined), user actions\n * that affect the checked state or value will trigger updates to the element.\n *\n * If they are supplied (and not null/undefined), the rendered element will not\n * trigger updates to the element. Instead, the props must change in order for\n * the rendered element to be updated.\n *\n * The rendered element will be initialized as unchecked (or `defaultChecked`)\n * with an empty value (or `defaultValue`).\n *\n * See http://www.w3.org/TR/2012/WD-html5-20121025/the-input-element.html\n */\n\n\nfunction getHostProps(element, props) {\n var node = element;\n var checked = props.checked;\n\n var hostProps = _assign({}, props, {\n defaultChecked: undefined,\n defaultValue: undefined,\n value: undefined,\n checked: checked != null ? checked : node._wrapperState.initialChecked\n });\n\n return hostProps;\n}\nfunction initWrapperState(element, props) {\n {\n checkControlledValueProps('input', props);\n\n if (props.checked !== undefined && props.defaultChecked !== undefined && !didWarnCheckedDefaultChecked) {\n error('%s contains an input of type %s with both checked and defaultChecked props. ' + 'Input elements must be either controlled or uncontrolled ' + '(specify either the checked prop, or the defaultChecked prop, but not ' + 'both). Decide between using a controlled or uncontrolled input ' + 'element and remove one of these props. More info: ' + 'https://reactjs.org/link/controlled-components', getCurrentFiberOwnerNameInDevOrNull() || 'A component', props.type);\n\n didWarnCheckedDefaultChecked = true;\n }\n\n if (props.value !== undefined && props.defaultValue !== undefined && !didWarnValueDefaultValue) {\n error('%s contains an input of type %s with both value and defaultValue props. ' + 'Input elements must be either controlled or uncontrolled ' + '(specify either the value prop, or the defaultValue prop, but not ' + 'both). Decide between using a controlled or uncontrolled input ' + 'element and remove one of these props. More info: ' + 'https://reactjs.org/link/controlled-components', getCurrentFiberOwnerNameInDevOrNull() || 'A component', props.type);\n\n didWarnValueDefaultValue = true;\n }\n }\n\n var node = element;\n var defaultValue = props.defaultValue == null ? '' : props.defaultValue;\n node._wrapperState = {\n initialChecked: props.checked != null ? props.checked : props.defaultChecked,\n initialValue: getToStringValue(props.value != null ? props.value : defaultValue),\n controlled: isControlled(props)\n };\n}\nfunction updateChecked(element, props) {\n var node = element;\n var checked = props.checked;\n\n if (checked != null) {\n setValueForProperty(node, 'checked', checked, false);\n }\n}\nfunction updateWrapper(element, props) {\n var node = element;\n\n {\n var controlled = isControlled(props);\n\n if (!node._wrapperState.controlled && controlled && !didWarnUncontrolledToControlled) {\n error('A component is changing an uncontrolled input to be controlled. ' + 'This is likely caused by the value changing from undefined to ' + 'a defined value, which should not happen. ' + 'Decide between using a controlled or uncontrolled input ' + 'element for the lifetime of the component. More info: https://reactjs.org/link/controlled-components');\n\n didWarnUncontrolledToControlled = true;\n }\n\n if (node._wrapperState.controlled && !controlled && !didWarnControlledToUncontrolled) {\n error('A component is changing a controlled input to be uncontrolled. ' + 'This is likely caused by the value changing from a defined to ' + 'undefined, which should not happen. ' + 'Decide between using a controlled or uncontrolled input ' + 'element for the lifetime of the component. More info: https://reactjs.org/link/controlled-components');\n\n didWarnControlledToUncontrolled = true;\n }\n }\n\n updateChecked(element, props);\n var value = getToStringValue(props.value);\n var type = props.type;\n\n if (value != null) {\n if (type === 'number') {\n if (value === 0 && node.value === '' || // We explicitly want to coerce to number here if possible.\n // eslint-disable-next-line\n node.value != value) {\n node.value = toString(value);\n }\n } else if (node.value !== toString(value)) {\n node.value = toString(value);\n }\n } else if (type === 'submit' || type === 'reset') {\n // Submit/reset inputs need the attribute removed completely to avoid\n // blank-text buttons.\n node.removeAttribute('value');\n return;\n }\n\n {\n // When syncing the value attribute, the value comes from a cascade of\n // properties:\n // 1. The value React property\n // 2. The defaultValue React property\n // 3. Otherwise there should be no change\n if (props.hasOwnProperty('value')) {\n setDefaultValue(node, props.type, value);\n } else if (props.hasOwnProperty('defaultValue')) {\n setDefaultValue(node, props.type, getToStringValue(props.defaultValue));\n }\n }\n\n {\n // When syncing the checked attribute, it only changes when it needs\n // to be removed, such as transitioning from a checkbox into a text input\n if (props.checked == null && props.defaultChecked != null) {\n node.defaultChecked = !!props.defaultChecked;\n }\n }\n}\nfunction postMountWrapper(element, props, isHydrating) {\n var node = element; // Do not assign value if it is already set. This prevents user text input\n // from being lost during SSR hydration.\n\n if (props.hasOwnProperty('value') || props.hasOwnProperty('defaultValue')) {\n var type = props.type;\n var isButton = type === 'submit' || type === 'reset'; // Avoid setting value attribute on submit/reset inputs as it overrides the\n // default value provided by the browser. See: #12872\n\n if (isButton && (props.value === undefined || props.value === null)) {\n return;\n }\n\n var initialValue = toString(node._wrapperState.initialValue); // Do not assign value if it is already set. This prevents user text input\n // from being lost during SSR hydration.\n\n if (!isHydrating) {\n {\n // When syncing the value attribute, the value property should use\n // the wrapperState._initialValue property. This uses:\n //\n // 1. The value React property when present\n // 2. The defaultValue React property when present\n // 3. An empty string\n if (initialValue !== node.value) {\n node.value = initialValue;\n }\n }\n }\n\n {\n // Otherwise, the value attribute is synchronized to the property,\n // so we assign defaultValue to the same thing as the value property\n // assignment step above.\n node.defaultValue = initialValue;\n }\n } // Normally, we'd just do `node.checked = node.checked` upon initial mount, less this bug\n // this is needed to work around a chrome bug where setting defaultChecked\n // will sometimes influence the value of checked (even after detachment).\n // Reference: https://bugs.chromium.org/p/chromium/issues/detail?id=608416\n // We need to temporarily unset name to avoid disrupting radio button groups.\n\n\n var name = node.name;\n\n if (name !== '') {\n node.name = '';\n }\n\n {\n // When syncing the checked attribute, both the checked property and\n // attribute are assigned at the same time using defaultChecked. This uses:\n //\n // 1. The checked React property when present\n // 2. The defaultChecked React property when present\n // 3. Otherwise, false\n node.defaultChecked = !node.defaultChecked;\n node.defaultChecked = !!node._wrapperState.initialChecked;\n }\n\n if (name !== '') {\n node.name = name;\n }\n}\nfunction restoreControlledState(element, props) {\n var node = element;\n updateWrapper(node, props);\n updateNamedCousins(node, props);\n}\n\nfunction updateNamedCousins(rootNode, props) {\n var name = props.name;\n\n if (props.type === 'radio' && name != null) {\n var queryRoot = rootNode;\n\n while (queryRoot.parentNode) {\n queryRoot = queryRoot.parentNode;\n } // If `rootNode.form` was non-null, then we could try `form.elements`,\n // but that sometimes behaves strangely in IE8. We could also try using\n // `form.getElementsByName`, but that will only return direct children\n // and won't include inputs that use the HTML5 `form=` attribute. Since\n // the input might not even be in a form. It might not even be in the\n // document. Let's just use the local `querySelectorAll` to ensure we don't\n // miss anything.\n\n\n var group = queryRoot.querySelectorAll('input[name=' + JSON.stringify('' + name) + '][type=\"radio\"]');\n\n for (var i = 0; i < group.length; i++) {\n var otherNode = group[i];\n\n if (otherNode === rootNode || otherNode.form !== rootNode.form) {\n continue;\n } // This will throw if radio buttons rendered by different copies of React\n // and the same name are rendered into the same form (same as #1939).\n // That's probably okay; we don't support it just as we don't support\n // mixing React radio buttons with non-React ones.\n\n\n var otherProps = getFiberCurrentPropsFromNode(otherNode);\n\n if (!otherProps) {\n {\n throw Error( \"ReactDOMInput: Mixing React and non-React radio inputs with the same `name` is not supported.\" );\n }\n } // We need update the tracked value on the named cousin since the value\n // was changed but the input saw no event or value set\n\n\n updateValueIfChanged(otherNode); // If this is a controlled radio button group, forcing the input that\n // was previously checked to update will cause it to be come re-checked\n // as appropriate.\n\n updateWrapper(otherNode, otherProps);\n }\n }\n} // In Chrome, assigning defaultValue to certain input types triggers input validation.\n// For number inputs, the display value loses trailing decimal points. For email inputs,\n// Chrome raises \"The specified value is not a valid email address\".\n//\n// Here we check to see if the defaultValue has actually changed, avoiding these problems\n// when the user is inputting text\n//\n// https://github.com/facebook/react/issues/7253\n\n\nfunction setDefaultValue(node, type, value) {\n if ( // Focused number inputs synchronize on blur. See ChangeEventPlugin.js\n type !== 'number' || getActiveElement(node.ownerDocument) !== node) {\n if (value == null) {\n node.defaultValue = toString(node._wrapperState.initialValue);\n } else if (node.defaultValue !== toString(value)) {\n node.defaultValue = toString(value);\n }\n }\n}\n\nvar didWarnSelectedSetOnOption = false;\nvar didWarnInvalidChild = false;\n\nfunction flattenChildren(children) {\n var content = ''; // Flatten children. We'll warn if they are invalid\n // during validateProps() which runs for hydration too.\n // Note that this would throw on non-element objects.\n // Elements are stringified (which is normally irrelevant\n // but matters for ).\n\n React.Children.forEach(children, function (child) {\n if (child == null) {\n return;\n }\n\n content += child; // Note: we don't warn about invalid children here.\n // Instead, this is done separately below so that\n // it happens during the hydration code path too.\n });\n return content;\n}\n/**\n * Implements an

Videos

1. Bob Dylan 1986 - Its Alright Ma , (Im Only Bleeding)
(KULP11)
2. "He not busy being born. Is busy dying"
(Hare Krsna)
3. He not busy being born is busy dying The Most Popular Collection of dancery jazz
(dancery)
4. It's Alright Ma (I'm Only Bleeding) - Bob Dylan (5/7/65) Bootleg
(Ryan Hostetler)
5. He Not Busy Being Born is Busy Dying
(William Tomaselli)
6. he who is not being born is busy dying
(apedog999)

You might also like

Latest Posts

Article information

Author: Prof. An Powlowski

Last Updated: 07/27/2022

Views: 5910

Rating: 4.3 / 5 (64 voted)

Reviews: 95% of readers found this page helpful

Author information

Name: Prof. An Powlowski

Birthday: 1992-09-29

Address: Apt. 994 8891 Orval Hill, Brittnyburgh, AZ 41023-0398

Phone: +26417467956738

Job: District Marketing Strategist

Hobby: Embroidery, Bodybuilding, Motor sports, Amateur radio, Wood carving, Whittling, Air sports

Introduction: My name is Prof. An Powlowski, I am a charming, helpful, attractive, good, graceful, thoughtful, vast person who loves writing and wants to share my knowledge and understanding with you.