1{"version":3,"sources":["../node_modules/react-popper/lib/react-popper.js","components/dialog/create-folder-dialog.js","../node_modules/chart.js/dist/Chart.js","../node_modules/lodash/isEqual.js","../node_modules/lodash/_baseIsEqualDeep.js","../node_modules/lodash/_listCacheClear.js","../node_modules/lodash/_listCacheDelete.js","../node_modules/lodash/_listCacheGet.js","../node_modules/lodash/_listCacheHas.js","../node_modules/lodash/_listCacheSet.js","../node_modules/lodash/_stackClear.js","../node_modules/lodash/_stackDelete.js","../node_modules/lodash/_stackGet.js","../node_modules/lodash/_stackHas.js","../node_modules/lodash/_stackSet.js","../node_modules/lodash/_baseIsNative.js","../node_modules/lodash/_getRawTag.js","../node_modules/lodash/_objectToString.js","../node_modules/lodash/_isMasked.js","../node_modules/lodash/_coreJsData.js","../node_modules/lodash/_getValue.js","../node_modules/lodash/_mapCacheClear.js","../node_modules/lodash/_Hash.js","../node_modules/lodash/_hashClear.js","../node_modules/lodash/_hashDelete.js","../node_modules/lodash/_hashGet.js","../node_modules/lodash/_hashHas.js","../node_modules/lodash/_hashSet.js","../node_modules/lodash/_mapCacheDelete.js","../node_modules/lodash/_isKeyable.js","../node_modules/lodash/_mapCacheGet.js","../node_modules/lodash/_mapCacheHas.js","../node_modules/lodash/_mapCacheSet.js","../node_modules/lodash/_SetCache.js","../node_modules/lodash/_setCacheAdd.js","../node_modules/lodash/_setCacheHas.js","../node_modules/lodash/_arraySome.js","../node_modules/lodash/_cacheHas.js","../node_modules/lodash/_equalByTag.js","../node_modules/lodash/_Uint8Array.js","../node_modules/lodash/_mapToArray.js","../node_modules/lodash/_setToArray.js","../node_modules/lodash/_equalObjects.js","../node_modules/lodash/_getAllKeys.js","../node_modules/lodash/_baseGetAllKeys.js","../node_modules/lodash/_arrayPush.js","../node_modules/lodash/_getSymbols.js","../node_modules/lodash/_arrayFilter.js","../node_modules/lodash/stubArray.js","../node_modules/lodash/_arrayLikeKeys.js","../node_modules/lodash/_baseTimes.js","../node_modules/lodash/_baseIsArguments.js","../node_modules/lodash/stubFalse.js","../node_modules/lodash/_baseIsTypedArray.js","../node_modules/lodash/_baseUnary.js","../node_modules/lodash/_root.js","../node_modules/lodash/_nodeUtil.js","../node_modules/lodash/_baseKeys.js","../node_modules/lodash/_isPrototype.js","../node_modules/lodash/_nativeKeys.js","../node_modules/lodash/_overArg.js","../node_modules/lodash/_getTag.js","../node_modules/lodash/_DataView.js","../node_modules/lodash/_Promise.js","../node_modules/lodash/_Set.js","../node_modules/lodash/_WeakMap.js","../node_modules/lodash/isArray.js","../node_modules/lodash/keyBy.js","../node_modules/lodash/_baseAssignValue.js","../node_modules/lodash/_defineProperty.js","../node_modules/lodash/_createAggregator.js","../node_modules/lodash/_arrayAggregator.js","../node_modules/lodash/_baseAggregator.js","../node_modules/lodash/_baseEach.js","../node_modules/lodash/_baseForOwn.js","../node_modules/lodash/_baseFor.js","../node_modules/lodash/_createBaseFor.js","../node_modules/lodash/_createBaseEach.js","../node_modules/lodash/_baseIteratee.js","../node_modules/lodash/_baseMatches.js","../node_modules/lodash/_baseIsMatch.js","../node_modules/lodash/_getMatchData.js","../node_modules/lodash/_baseMatchesProperty.js","../node_modules/lodash/get.js","../node_modules/lodash/_stringToPath.js","../node_modules/lodash/_memoizeCapped.js","../node_modules/lodash/memoize.js","../node_modules/lodash/toString.js","../node_modules/lodash/_baseToString.js","../node_modules/lodash/_arrayMap.js","../node_modules/lodash/hasIn.js","../node_modules/lodash/_baseHasIn.js","../node_modules/lodash/_hasPath.js","../node_modules/lodash/identity.js","../node_modules/lodash/property.js","../node_modules/lodash/_baseProperty.js","../node_modules/lodash/_basePropertyDeep.js","pages/sys-admin/side-panel.js","pages/sys-admin/main-panel.js","pages/sys-admin/main-panel-topbar.js","pages/sys-admin/info.js","pages/sys-admin/statistic/statistic-nav.js","pages/sys-admin/statistic/picker.js","pages/sys-admin/statistic/statistic-common-tool.js","pages/sys-admin/statistic/statistic-chart.js","pages/sys-admin/statistic/statistic-file.js","pages/sys-admin/statistic/statistic-storage.js","pages/sys-admin/statistic/traffic-table.js","pages/sys-admin/statistic/traffic-table-body.js","pages/sys-admin/statistic/statistic-traffic-orgs.js","pages/sys-admin/statistic/statistic-traffic-users.js","pages/sys-admin/statistic/statistic-traffic.js","pages/sys-admin/statistic/statistic-users.js","pages/sys-admin/statistic/statistic-reports.js","pages/sys-admin/devices/devices-nav.js","components/dialog/sysadmin-dialog/sysadmin-unlink-device-dialog.js","pages/sys-admin/devices/devices-by-platform.js","pages/sys-admin/devices/desktop-devices.js","pages/sys-admin/devices/mobile-devices.js","pages/sys-admin/user-link.js","pages/sys-admin/devices/devices-errors.js","pages/sys-admin/abuse-reports.js","components/dialog/sysadmin-dialog/set-quota.js","components/dialog/sysadmin-dialog/sysadmin-import-user-dialog.js","components/select-editor/sysadmin-user-role-editor.js","components/dialog/sysadmin-dialog/sysadmin-add-user-dialog.js","components/dialog/sysadmin-dialog/sysadmin-batch-add-admin-dialog.js","components/dialog/common-operation-confirmation-dialog.js","models/sysadmin-user.js","models/sysadmin-admin-user.js","pages/sys-admin/search.js","pages/sys-admin/users/users-nav.js","components/select-editor/sysadmin-user-status-editor.js","components/dialog/op-menu.js","pages/sys-admin/users/users-content.js","pages/sys-admin/users/users.js","pages/sys-admin/users/admin-users.js","pages/sys-admin/users/ldap-imported-users.js","pages/sys-admin/users/ldap-users.js","pages/sys-admin/users/search-users.js","components/dialog/sysadmin-dialog/update-user.js","pages/sys-admin/users/user-nav.js","pages/sys-admin/users/user-info.js","pages/sys-admin/users/user-repos.js","pages/sys-admin/users/user-shared-repos.js","pages/sys-admin/users/user-links.js","pages/sys-admin/users/user-groups.js","components/dialog/sysadmin-dialog/sysadmin-create-repo-dialog.js","pages/sys-admin/repos/repos-nav.js","components/dialog/sysadmin-dialog/sysadmin-share-to-user.js","components/dialog/sysadmin-dialog/sysadmin-share-to-group.js","components/dialog/sysadmin-dialog/sysadmin-share-dialog.js","components/dialog/sysadmin-dialog/sysadmin-lib-history-setting-dialog.js","pages/sys-admin/repos/repos.js","pages/sys-admin/repos/all-repos.js","pages/sys-admin/repos/system-repo.js","pages/sys-admin/repos/trash-repos.js","pages/sys-admin/repos/search-repos.js","models/system-admin/dirent.js","pages/sys-admin/repos/dir-path-bar.js","pages/sys-admin/repos/dir-content.js","pages/sys-admin/repos/dir-view.js","components/dialog/sysadmin-dialog/sysadmin-create-group-dialog.js","components/dialog/sysadmin-dialog/sysadmin-group-transfer-dialog.js","pages/sys-admin/groups/groups-content.js","pages/sys-admin/groups/groups.js","pages/sys-admin/groups/search-groups.js","pages/sys-admin/groups/group-nav.js","pages/sys-admin/groups/group-repos.js","components/dialog/sysadmin-dialog/sysadmin-group-add-member-dialog.js","components/select-editor/sysadmin-group-role-editor.js","pages/sys-admin/groups/group-members.js","pages/sys-admin/departments/departments.js","components/dialog/sysadmin-dialog/sysadmin-add-department-dialog.js","components/dialog/sysadmin-dialog/sysadmin-delete-department-dialog.js","components/dialog/sysadmin-dialog/sysadmin-set-group-quota-dialog.js","components/dialog/sysadmin-dialog/sysadmin-rename-department-dialog.js","pages/sys-admin/departments/group-item.js","pages/sys-admin/departments/departments-list.js","components/dialog/sysadmin-dialog/sysadmin-add-member-dialog.js","components/dialog/sysadmin-dialog/sysadmin-delete-member-dialog.js","components/dialog/sysadmin-dialog/sysadmin-add-repo-dialog.js","components/dialog/sysadmin-dialog/sysadmin-delete-repo-dialog.js","pages/sys-admin/departments/member-item.js","pages/sys-admin/departments/repo-item.js","pages/sys-admin/departments/department-detail.js","pages/sys-admin/links/links-nav.js","pages/sys-admin/links/share-links.js","pages/sys-admin/links/upload-links.js","components/dialog/sysadmin-dialog/sysadmin-add-org-dialog.js","pages/sys-admin/orgs/orgs-content.js","pages/sys-admin/orgs/orgs.js","pages/sys-admin/orgs/search-orgs.js","components/dialog/sysadmin-dialog/sysadmin-set-org-name-dialog.js","components/dialog/sysadmin-dialog/sysadmin-set-org-max-user-number-dialog.js","pages/sys-admin/orgs/org-nav.js","pages/sys-admin/orgs/org-info.js","components/select-editor/sysadmin-user-membership-editor.js","pages/sys-admin/orgs/org-users.js","pages/sys-admin/orgs/org-groups.js","pages/sys-admin/orgs/org-repos.js","components/dialog/sysadmin-dialog/sysadmin-add-institution-dialog.js","pages/sys-admin/institutions/institutions.js","pages/sys-admin/institutions/institution-nav.js","pages/sys-admin/institutions/institution-info.js","components/dialog/sysadmin-dialog/sysadmin-add-institution-member-dialog.js","pages/sys-admin/institutions/institution-users.js","pages/sys-admin/institutions/institution-admins.js","pages/sys-admin/logs-page/logs-nav.js","components/dialog/sysadmin-dialog/sysadmin-logs-export-excel-dialog.js","pages/sys-admin/logs-page/login-logs.js","pages/sys-admin/logs-page/file-access-item-menu.js","pages/sys-admin/logs-page/file-access-toggle-filter.js","pages/sys-admin/logs-page/file-access-logs.js","pages/sys-admin/logs-page/file-update-logs.js","pages/sys-admin/logs-page/share-permission-logs.js","pages/sys-admin/web-settings/section.js","pages/sys-admin/web-settings/setting-item-base.js","pages/sys-admin/web-settings/input-item.js","pages/sys-admin/web-settings/file-item.js","pages/sys-admin/web-settings/checkbox-item.js","pages/sys-admin/web-settings/web-settings.js","components/dialog/sysadmin-dialog/sysadmin-add-sys-notification-dialog.js","pages/sys-admin/notifications/notifications.js","pages/sys-admin/file-scan-records.js","pages/sys-admin/work-weixin/work-weixin-department-members-list.js","pages/sys-admin/work-weixin/work-weixin-departments-tree-node.js","pages/sys-admin/work-weixin/work-weixin-departments-tree-panel.js","components/dialog/import-work-weixin-department-dialog.js","pages/sys-admin/work-weixin-departments.js","pages/sys-admin/dingtalk/dingtalk-department-members-list.js","pages/sys-admin/dingtalk/dingtalk-departments-tree-node.js","pages/sys-admin/dingtalk/dingtalk-departments-tree-panel.js","components/dialog/import-dingtalk-department-dialog.js","pages/sys-admin/dingtalk-departments.js","pages/sys-admin/invitations/invitations.js","components/dialog/terms-editor-dialog.js","components/dialog/sysadmin-dialog/sysadmin-add-or-update-term-dialog.js","utils/markdown-utils.js","components/dialog/terms-preview-dialog.js","pages/sys-admin/terms-and-conditions/item.js","pages/sys-admin/terms-and-conditions/content.js","pages/sys-admin/terms-and-conditions/terms-and-conditions.js","pages/sys-admin/virus-scan/nav.js","pages/sys-admin/virus-scan/all-virus-files.js","pages/sys-admin/virus-scan/unhandled-virus-files.js","pages/sys-admin/admin-logs/logs-nav.js","pages/sys-admin/admin-logs/operation-logs.js","pages/sys-admin/admin-logs/login-logs.js","pages/sys-admin/index.js","../node_modules/lodash/_getNative.js","components/dialog/share-admin-link.js","../../src/utils.js","../../src/Container.js","../../src/Row.js","../../src/Col.js","../../src/Navbar.js","../../src/NavbarBrand.js","../../src/NavbarToggler.js","../../src/Nav.js","../../src/NavItem.js","../../src/Dropdown.js","../../src/NavLink.js","../../src/Breadcrumb.js","../../src/BreadcrumbItem.js","../../src/Button.js","../../src/ButtonDropdown.js","../../src/ButtonGroup.js","../../src/ButtonToolbar.js","../../src/DropdownItem.js","../../src/DropdownMenu.js","../../src/DropdownToggle.js","../../node_modules/react-transition-group/utils/PropTypes.js","../../node_modules/react-transition-group/Transition.js","../../src/Fade.js","../../src/Badge.js","../../src/Card.js","../../src/CardGroup.js","../../src/CardDeck.js","../../src/CardColumns.js","../../src/CardBody.js","../../src/CardLink.js","../../src/CardFooter.js","../../src/CardHeader.js","../../src/CardImg.js","../../src/CardImgOverlay.js","../../src/CarouselItem.js","../../src/Carousel.js","../../src/CarouselControl.js","../../src/CarouselIndicators.js","../../src/CarouselCaption.js","../../src/UncontrolledCarousel.js","../../src/CardSubtitle.js","../../src/CardText.js","../../src/CardTitle.js","../../src/PopperContent.js","../../src/PopperTargetHelper.js","../../src/Popover.js","../../src/PopoverHeader.js","../../src/PopoverBody.js","../../src/Progress.js","../../src/Portal.js","../../src/Modal.js","../../src/ModalHeader.js","../../src/ModalBody.js","../../src/ModalFooter.js","../../src/Tooltip.js","../../src/Table.js","../../src/ListGroup.js","../../src/Form.js","../../src/FormFeedback.js","../../src/FormGroup.js","../../src/FormText.js","../../src/Input.js","../../src/InputGroup.js","../../src/InputGroupText.js","../../src/InputGroupAddon.js","../../src/InputGroupButton.js","../../src/InputGroupButtonDropdown.js","../../src/Label.js","../../src/Media.js","../../src/Pagination.js","../../src/PaginationItem.js","../../src/PaginationLink.js","../../src/TabContent.js","../../src/TabPane.js","../../src/Jumbotron.js","../../src/Alert.js","../../src/Collapse.js","../../src/ListGroupItem.js","../../src/ListGroupItemHeading.js","../../src/ListGroupItemText.js","../../src/UncontrolledAlert.js","../../src/UncontrolledButtonDropdown.js","../../src/UncontrolledDropdown.js","../../src/UncontrolledTooltip.js","components/empty-tip.js","../node_modules/lodash/_baseGetTag.js","../node_modules/lodash/isObjectLike.js","../node_modules/is-url/index.js","components/dialog/commit-details.js","../node_modules/@seafile/seafile-editor/dist/components/topbar-component/header-list.js","../node_modules/@seafile/seafile-editor/dist/components/topbar-component/button-group.js","../node_modules/@seafile/seafile-editor/dist/components/topbar-component/icon-button.js","../node_modules/@seafile/seafile-editor/dist/components/add-link-dialog.js","../node_modules/@seafile/seafile-editor/dist/components/add-image-dialog.js","../node_modules/@seafile/seafile-editor/dist/components/add-formula-dialog.js","../node_modules/@seafile/seafile-editor/dist/components/topbar-component/table-toolbar.js","../node_modules/@seafile/seafile-editor/dist/components/topbar-component/upload-img.js","../node_modules/@seafile/seafile-editor/dist/components/toolbar.js","../../src/history.ts","../../src/history-command.ts","../../src/history-editor.ts","../../src/with-history.ts","../node_modules/@seafile/seafile-editor/dist/editor/editor-utils/range-utils.js","../node_modules/@seafile/seafile-editor/dist/editor/editor-component/textlink-hovermenu.js","../node_modules/@seafile/seafile-editor/dist/components/context-menu.js","../node_modules/@seafile/seafile-editor/dist/editor/element-model/link.js","../node_modules/@seafile/seafile-editor/dist/editor/element-model/image.js","../node_modules/@seafile/seafile-editor/dist/editor/controller/block-element-controller.js","../node_modules/@seafile/seafile-editor/dist/editor/controller/inline-element-controller.js","../node_modules/@seafile/seafile-editor/dist/editor/controller/void-element-controller.js","../node_modules/@seafile/seafile-editor/dist/editor/editor-utils/text-utils.js","../node_modules/@seafile/seafile-editor/dist/editor/controller/shortcut-controller.js","../node_modules/@seafile/seafile-editor/dist/editor/controller/normalize-controller.js","../node_modules/@seafile/seafile-editor/dist/editor/custom/set-event-transfer.js","../node_modules/@seafile/seafile-editor/dist/editor/editor-plugin.js","../node_modules/@seafile/seafile-editor/dist/components/shortcut-dialog.js","../node_modules/@seafile/seafile-editor/dist/editor/simple-editor.js","../node_modules/@seafile/seafile-editor/dist/components/user-help.js","../node_modules/@seafile/seafile-editor/dist/components/comment-dialog.js","../node_modules/@seafile/seafile-editor/dist/components/participants-list.js","../node_modules/@seafile/seafile-editor/dist/css/react-mentions-default-style.js","../node_modules/@seafile/seafile-editor/dist/components/comment-panel.js","../node_modules/@seafile/seafile-editor/dist/components/detail-list-view.js","../node_modules/@seafile/seafile-editor/dist/components/side-panel.js","../node_modules/@seafile/seafile-editor/dist/editor/rich-markdown-editor.js","../node_modules/@seafile/seafile-editor/dist/editor/plain-markdown-editor.js","../node_modules/@seafile/seafile-editor/dist/editor/seafile-editor.js","../node_modules/@seafile/seafile-editor/dist/editor/editor.js","../node_modules/lodash/_ListCache.js","../node_modules/lodash/_assocIndexOf.js","../node_modules/lodash/_Symbol.js","../node_modules/lodash/_nativeCreate.js","../node_modules/lodash/_getMapData.js","../node_modules/lodash/_toKey.js","../node_modules/react-popper/lib/Manager.js","../node_modules/react-popper/lib/Target.js","../node_modules/react-popper/lib/Popper.js","../node_modules/react-popper/lib/Arrow.js","../node_modules/codemirror/mode/markdown/markdown.js","../node_modules/codemirror/mode/meta.js","../node_modules/lodash/_baseIsEqual.js","../node_modules/lodash/_Map.js","../node_modules/lodash/isObject.js","../node_modules/lodash/_MapCache.js","../node_modules/lodash/keys.js","../node_modules/lodash/isLength.js","../node_modules/lodash/_isKey.js","../node_modules/lodash/isSymbol.js","../node_modules/@seafile/seafile-editor/dist/components/toast/alert.js","../node_modules/@seafile/seafile-editor/dist/components/toast/toast.js","../node_modules/@seafile/seafile-editor/dist/components/toast/toastManager.js","../node_modules/@seafile/seafile-editor/dist/components/toast/toaster.js","../node_modules/@seafile/seafile-editor/dist/components/toast/index.js","../node_modules/lodash/_Stack.js","../node_modules/lodash/eq.js","../node_modules/lodash/isFunction.js","../node_modules/lodash/_freeGlobal.js","../node_modules/lodash/_toSource.js","../node_modules/lodash/_equalArrays.js","../node_modules/lodash/isArguments.js","../node_modules/lodash/isBuffer.js","../node_modules/lodash/_isIndex.js","../node_modules/lodash/isTypedArray.js","../node_modules/lodash/isArrayLike.js","../node_modules/lodash/_isStrictComparable.js","../node_modules/lodash/_matchesStrictComparable.js","../node_modules/lodash/_baseGet.js","../node_modules/lodash/_castPath.js","../node_modules/react-chartjs-2/es/index.js"],"names":["Object","defineProperty","exports","value","Arrow","Popper","Target","Manager","undefined","_Manager3","_interopRequireDefault","require","_Target3","_Popper3","_Arrow3","obj","__esModule","default","CreateForder","props","handleChange","e","target","trim","setState","isSubmitBtnActive","childName","handleSubmit","state","newName","checkDuplicatedName","errMessage","gettext","replace","Utils","HTMLescape","path","parentPath","onAddFolder","handleKeyPress","key","preventDefault","toggle","addFolderCancel","newInput","React","createRef","this","length","focus","setSelectionRange","isOpen","for","id","innerRef","input","onKeyPress","onChange","color","className","onClick","disabled","Component","module","moment","createCommonjsModule","fn","getCjsExportFromNamespace","n","hasOwnProperty","colorName","conversions","reverseKeywords","convert","rgb","channels","labels","hsl","hsv","hwb","cmyk","xyz","lab","lch","hex","keyword","ansi16","ansi256","hcg","apple","gray","model","Error","comparativeDistance","x","y","Math","pow","h","l","r","g","b","min","max","delta","rdif","gdif","bdif","s","v","diff","diffc","c","k","reversed","currentClosestKeyword","currentClosestDistance","Infinity","distance","z","t1","t2","t3","val","i","smin","lmin","hi","floor","f","p","q","t","sl","vmin","wh","bl","ratio","m","y2","x2","z2","a","atan2","PI","sqrt","hr","cos","sin","args","arguments","round","ansi","mult","rem","string","toString","toUpperCase","substring","match","colorString","split","map","char","join","integer","parseInt","hue","chroma","pure","w","mg","buildGraph","graph","models","keys","len","parent","deriveBFS","fromModel","queue","current","pop","adjacents","adjacent","node","unshift","link","from","to","wrapConversion","toModel","cur","conversion","route","wrapRaw","wrappedFn","Array","prototype","slice","call","wrapRounded","result","forEach","routes","raw","colorConvert","colorName$1","getRgba","getHsla","getRgb","getHsl","getHwb","getAlpha","hexString","rgbString","rgbaString","percentString","percentaString","hslString","hslaString","hwbString","abbr","rgba","per","hexAlpha","parseFloat","scale","alpha","isNaN","hsla","vals","hexDouble","reverseNames","num","str","name","Color","valid","values","setValues","red","lightness","whiteness","cyan","isValid","setSpace","rgbArray","hslArray","hsvArray","hwbArray","concat","cmykArray","rgbaArray","hslaArray","setChannel","green","blue","saturation","saturationv","blackness","magenta","yellow","black","rgbNumber","luminosity","lum","chan","contrast","color2","lum1","lum2","level","contrastRatio","dark","light","negate","lighten","darken","saturate","desaturate","whiten","blacken","greyscale","clearer","opaquer","rotate","degrees","mix","mixinColor","weight","color1","w1","w2","toJSON","clone","type","source","prop","console","error","spaces","maxes","getValues","space","charAt","capped","chans","sname","index","svalues","window","chartjsColor","isValidKey","indexOf","helpers","noop","uid","isNullOrUndef","isArray","substr","isObject","isFinite","Number","valueOrDefault","defaultValue","valueAtIndexOrDefault","callback","thisArg","apply","each","loopable","reverse","arrayEquals","a0","a1","ilen","v0","v1","create","klen","_merger","options","tval","sval","merge","_mergerIf","mergeIf","sources","merger","extend","assign","dst","src","inherits","extensions","me","ChartElement","constructor","Surrogate","__super__","_deprecated","scope","previous","warn","helpers_core","callCallback","array","item","fromIndex","getValueOrDefault","getValueAtIndexOrDefault","effects","linear","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","easeInSine","easeOutSine","easeInOutSine","easeInExpo","easeOutExpo","easeInOutExpo","easeInCirc","easeOutCirc","easeInOutCirc","easeInElastic","asin","easeOutElastic","easeInOutElastic","easeInBack","easeOutBack","easeInOutBack","easeInBounce","easeOutBounce","easeInOutBounce","helpers_easing","easingEffects","RAD_PER_DEG","DOUBLE_PI","HALF_PI","QUARTER_PI","TWO_THIRDS_PI","exports$1","clear","chart","ctx","clearRect","width","height","roundedRect","radius","left","top","right","bottom","moveTo","arc","closePath","rect","drawPoint","style","rotation","xOffset","yOffset","size","cornerRadius","rad","save","translate","drawImage","restore","beginPath","lineTo","SQRT1_2","fill","stroke","_isPointInArea","point","area","epsilon","clipArea","clip","unclipArea","flip","stepped","steppedLine","midpoint","tension","bezierCurveTo","controlPointPreviousX","controlPointNextX","controlPointPreviousY","controlPointNextY","helpers_canvas","drawRoundedRectangle","defaults","_set","defaultColor","defaultFontColor","defaultFontFamily","defaultFontSize","defaultFontStyle","defaultLineHeight","showLines","core_defaults","toFontString","font","family","helpers_options","toLineHeight","matches","toPadding","_parseFont","globalDefaults","global","fontSize","fontFamily","lineHeight","fontStyle","resolve","inputs","context","info","cacheable","exports$2","_factorize","push","sort","log10","exponent","log","LOG10E","powerOf10","helpers_math","getRtlAdapter","rectX","setWidth","textAlign","align","xPlus","leftForLtr","itemWidth","getLtrAdapter","_itemWidth","helpers$1","easing","canvas","math","rtl","overrideTextDirection","direction","original","getPropertyValue","getPropertyPriority","setProperty","prevTextDirection","restoreTextDirection","interpolate","start","view","ease","actual","origin","c0","c1","Element","configuration","initialize","_type","hidden","pivot","_view","_model","_start","transition","tooltipPosition","hasValue","isNumber","core_element","exports$3","currentStep","numSteps","render","onAnimationProgress","onAnimationComplete","core_animation","get","set","animation","duration","onProgress","onComplete","core_animations","animations","request","addAnimation","lazy","startTime","Date","now","animating","requestAnimationFrame","cancelAnimation","findIndex","splice","requestAnimFrame","startDigest","advance","nextStep","arrayEvents","listenArrayEvents","listener","_chartjs","listeners","configurable","enumerable","method","base","res","object","unlistenArrayEvents","stub","DatasetController","datasetIndex","datasetElementType","dataElementType","_datasetElementOptions","_dataElementOptions","linkScales","addElements","getMeta","updateIndex","meta","scales","dataset","getDataset","scalesOpts","xAxisID","xAxes","yAxisID","yAxes","data","datasets","getDatasetMeta","getScaleForId","scaleID","_getValueScaleId","_getIndexScaleId","_getValueScale","_getIndexScale","reset","_update","destroy","_data","createMetaDataset","_chart","_datasetIndex","createMetaData","_index","metaData","addElementAndReset","element","updateElement","buildOrUpdateElements","isExtensible","resyncElements","_configure","_config","_cachedDataOpts","update","easingValue","elements","draw","getStyle","_resolveDatasetElementOptions","_resolveDataElementOptions","backgroundColor","borderColor","hover","readKey","datasetOpts","custom","elementOptions","cached","dataIndex","freeze","removeHoverStyle","$previousStyle","setHoverStyle","getHoverColor","borderWidth","hoverBackgroundColor","hoverBorderColor","hoverBorderWidth","_removeDatasetHoverStyle","_setDatasetHoverStyle","hoverOptions","prev","numMeta","numData","insertElements","count","onDataPush","onDataPop","onDataShift","shift","onDataSplice","onDataUnshift","core_datasetController","TAU","clipArc","startAngle","endAngle","pixelMargin","angleMargin","outerRadius","innerRadius","drawFullCircleBorders","vm","inner","fullCircles","drawBorder","borderAlign","lineWidth","lineJoin","element_arc","inLabelRange","mouseX","hoverRadius","inRange","chartX","chartY","pointRelativePosition","getAngleFromPoint","angle","betweenAngles","withinRadius","getCenterPoint","halfAngle","halfRadius","getArea","centreAngle","rangeFromCentre","circumference","fillStyle","strokeStyle","valueOrDefault$1","line","borderCapStyle","borderDash","borderDashOffset","borderJoinStyle","capBezierPoints","element_line","currentVM","spanGaps","points","_children","globalOptionLineElements","lastDrawnIndex","_loop","previousItem","skip","lineCap","setLineDash","lineDashOffset","valueOrDefault$2","defaultColor$1","xRange","abs","hitRadius","yRange","mouseY","pointStyle","element_point","inXRange","inYRange","padding","chartArea","defaultColor$2","isVertical","getBarBounds","x1","y1","half","swap","orig","v2","parseBorderSkipped","edge","borderSkipped","horizontal","parseBorderWidth","maxW","maxH","boundingRects","bounds","border","outer","skipX","skipY","rectangle","element_rectangle","rects","fillRect","Arc","Line","Point","Rectangle","deprecated","valueOrDefault$3","computeMinSampleSize","pixels","curr","_length","getTicks","getPixelForTick","computeFitCategoryTraits","ruler","thickness","barThickness","stackCount","categoryPercentage","barPercentage","chunk","computeFlexCategoryTraits","next","percent","end","mode","offset","gridLines","offsetGridLines","bar","controller_bar","scaleOpts","stack","minBarLength","maxBarThickness","_ruler","getRuler","_xScale","_yScale","datasetLabel","label","_updateElementGeometry","vscale","getBasePixel","isHorizontal","vpixels","calculateBarValuePixels","ipixels","calculateBarIndexPixels","head","center","_getStacks","last","metasets","_getMatchingVisibleMetas","stacked","stacks","getStackCount","getStackIndex","getPixelForValue","_startPixel","_endPixel","imeta","ivalue","stackLength","_parseValue","range","stackIndex","indexOpts","valueOpts","valueOrDefault$4","resolve$1","position","tooltips","callbacks","title","dataPoint","xLabel","yLabel","controller_bubble","xScale","yScale","dsIndex","getPixelForDecimal","NaN","_options","valueOrDefault$5","PI$1","DOUBLE_PI$1","HALF_PI$1","animateRotate","animateScale","legendCallback","listItem","list","document","createElement","setAttribute","appendChild","createTextNode","outerHTML","legend","generateLabels","controller","text","legendItem","cutoutPercentage","tooltipItem","dataLabel","controller_doughnut","getRingIndex","ringIndex","j","isDatasetVisible","maxWidth","maxHeight","opts","ratioX","ratioY","offsetX","offsetY","arcs","cutout","chartWeight","_getRingWeight","startX","startY","endX","endY","contains0","contains90","contains270","minX","minY","maxX","maxY","getMaxBorderWidth","radiusLength","_getVisibleDatasetWeightTotal","total","calculateTotal","_getRingWeightOffset","animationOpts","centerX","centerY","calculateCircumference","hoverWidth","ringWeightOffset","dataSetIndex","axis","horizontalBar","controller_horizontalBar","valueOrDefault$6","resolve$2","isPointInArea","scaleClip","halfBorderWidth","tickOpts","ticks","defaultClip","toClip","controller_line","config","showLine","_showLine","lineTension","_scale","updateBezierControlPoints","lineModel","calculatePointY","lineOptions","ds","dsMeta","stackedRightValue","rightValue","sumPos","sumNeg","getRightValue","_getSortedVisibleDatasetMetas","controlPoints","capControlPoint","pt","filter","cubicInterpolationMode","splineCurveMonotone","splineCurve","nextItem","resolve$3","angleLines","display","circular","pointLabels","beginAtZero","controller_polarArea","starts","_starts","angles","_angles","_updateRadius","countVisibleElements","_computeAngle","minSize","getVisibleDatasetCount","xCenter","yCenter","datasetStartAngle","getDistanceFromCenterForValue","resetRadius","doughnut","controller_pie","valueOrDefault$7","controller_radar","pointPosition","getPointPositionForValue","scatter","controllers","bubble","polarArea","pie","radar","getRelativePosition","native","parseVisibleItems","handler","metadata","jlen","getIntersectItems","getNearestItems","intersect","distanceMetric","minDistance","POSITIVE_INFINITY","nearestItems","getDistanceMetricForAxis","useX","useY","pt1","pt2","deltaX","deltaY","indexMode","items","core_interaction","modes","single","nearest","intersectsItem","filterByPosition","where","pos","sortByWeight","wrapBoxes","boxes","box","layoutBoxes","setLayoutDims","layouts","params","layout","fullWidth","availableWidth","vBoxMaxWidth","hBoxMaxHeight","buildLayoutBoxes","leftAndTop","rightAndBottom","vertical","getCombinedMax","maxPadding","updateDims","newWidth","newHeight","getPadding","boxPadding","outerWidth","outerHeight","sizes","handleMaxPadding","updatePos","change","getMargins","marginForPositions","positions","margin","fitBoxes","refit","changed","refitBoxes","placeBoxes","userPadding","core_layouts","addBox","_layers","removeBox","layoutItem","configure","layoutOptions","availableHeight","verticalBoxes","horizontalBoxes","platform_basic","acquireContext","getContext","platform_dom","stylesheet","__proto__","EXPANDO_KEY","CSS_PREFIX","CSS_SIZE_MONITOR","CSS_RENDER_MONITOR","CSS_RENDER_ANIMATION","ANIMATION_START_EVENTS","EVENT_TYPES","touchstart","touchmove","touchend","pointerenter","pointerdown","pointermove","pointerup","pointerleave","pointerout","readUsedSize","property","initCanvas","renderHeight","getAttribute","renderWidth","initial","displayWidth","aspectRatio","displayHeight","eventListenerOptions","supports","addEventListener","passive","addListener","removeListener","removeEventListener","createEvent","nativeEvent","fromNativeEvent","event","throttled","ticking","createDiv","cls","el","createResizer","maxSize","resizer","expand","shrink","_reset","scrollLeft","scrollTop","onScroll","bind","watchForRender","expando","proxy","renderProxy","animationName","reflow","offsetParent","classList","add","unwatchForRender","remove","addResizeListener","container","maintainAspectRatio","parentNode","clientWidth","insertBefore","firstChild","removeResizeListener","removeChild","injectCSS","rootNode","css","containsStyles","platform_dom$2","disableCSSInjection","_enabled","_ensureLoaded","root","getRootNode","host","getElementById","releaseContext","removeAttribute","proxies","addEvent","removeEvent","implementation","platform","plugins","core_plugins","_plugins","_cacheId","register","plugin","unregister","idx","getAll","notify","hook","descriptor","descriptors","cache","$plugins","_invalidate","core_scaleService","constructors","registerScaleType","scaleConstructor","scaleDefaults","getScaleConstructor","getScaleDefaults","updateScaleDefaults","additions","addScalesToLayout","valueOrDefault$8","getRtlHelper","enabled","titleFontStyle","titleSpacing","titleMarginBottom","titleFontColor","titleAlign","bodySpacing","bodyFontColor","bodyAlign","footerFontStyle","footerSpacing","footerMarginTop","footerFontColor","footerAlign","yPadding","xPadding","caretPadding","caretSize","multiKeyBackground","displayColors","beforeTitle","tooltipItems","labelCount","afterTitle","beforeBody","beforeLabel","labelColor","labelTextColor","afterLabel","afterBody","beforeFooter","footer","afterFooter","positioners","average","eventPosition","nearestElement","d","distanceBetweenPoints","tp","pushOrConcat","toPush","splitNewlines","String","createTooltipItem","indexScale","valueScale","getLabelForIndex","getBaseModel","tooltipOpts","xAlign","yAlign","textDirection","_bodyFontFamily","bodyFontFamily","_bodyFontStyle","bodyFontStyle","_bodyAlign","bodyFontSize","_titleFontFamily","titleFontFamily","_titleFontStyle","titleFontSize","_titleAlign","_footerFontFamily","footerFontFamily","_footerFontStyle","footerFontSize","_footerAlign","opacity","legendColorBackground","getTooltipSize","tooltip","body","combinedBodyLength","reduce","bodyItem","before","lines","after","titleLineCount","footerLineCount","widthPadding","maxLineWidth","measureText","fontString","determineAlignment","lf","rf","olf","orf","yf","midX","midY","getBackgroundPoint","alignment","paddingAndSize","radiusAndPadding","getAlignedX","getBeforeAfterBodyLines","exports$4","_lastActive","getTitle","getBeforeBody","getBody","bodyItems","getAfterBody","getFooter","existingModel","active","_active","backgroundPoint","tooltipSize","caretX","caretY","labelColors","labelTextColors","_eventPosition","itemSort","dataPoints","drawCaret","tooltipPoint","caretPosition","getCaretPosition","x3","y3","ptX","ptY","tmp","drawTitle","rtlHelper","textBaseline","fillText","drawBody","textColor","drawColorBoxes","xLinePadding","colorX","fillLineOfText","bodyAlignForCalculation","rtlColorX","strokeRect","drawFooter","drawBackground","quadraticCurveTo","hasTooltipContent","globalAlpha","handleEvent","getElementsAtEventForMode","positioners_1","core_tooltip","valueOrDefault$9","mergeScaleConfig","slen","mergeConfig","initConfig","updateConfig","newOptions","ensureScalesHaveIDs","buildOrUpdateScales","nextAvailableScaleId","axesOpts","prefix","hasId","positionIsHorizontal","compare2Level","l1","l2","events","onHover","animationDuration","responsive","responsiveAnimationDuration","Chart","construct","_bufferedRender","instances","retinaScale","devicePixelRatio","bindEvents","resize","initToolTip","stop","silent","getMaximumWidth","getMaximumHeight","newSize","onResize","scalesOptions","scaleOptions","xAxisOptions","yAxisOptions","updated","dtype","dposition","isDefault","scaleType","scaleClass","mergeTicksOptions","hasUpdated","buildOrUpdateControllers","newControllers","destroyDatasetMeta","order","ControllerClass","resetElements","updateLayout","updateDatasets","lastActive","_bufferedRequest","_idx","updateDataset","animationOptions","animationObject","easingFunction","stepDecimal","layers","drawDatasets","_drawTooltip","_getSortedDatasetMetas","filterVisible","drawDataset","getElementAtEvent","getElementsAtEvent","getElementsAtXAxis","getDatasetAtEvent","_meta","generateLegend","unbindEvents","toBase64Image","toDataURL","_chartInstance","_listeners","eventHandler","updateHoverStyle","bufferedRequest","core_controller","Controller","types","configMerge","scaleMerge","core_helpers","parseMaxStyle","styleValue","parentProperty","valueInPixels","isConstrainedValue","getConstraintDimension","domNode","maxStyle","percentageProperty","defaultView","_getParentNode","constrainedNode","getComputedStyle","constrainedContainer","hasCNode","hasCContainer","infinity","collection","filterCallback","filtered","findNextWhere","arrayToSearch","startIndex","currentItem","findPreviousWhere","almostEquals","almostWhole","rounded","NEGATIVE_INFINITY","sign","toRadians","toDegrees","radians","_decimalPlaces","centrePoint","anglePoint","distanceFromXCenter","distanceFromYCenter","radialDistanceFromCenter","aliasPixel","pixelWidth","_alignPixel","pixel","currentDevicePixelRatio","halfWidth","firstPoint","middlePoint","afterPoint","d01","d12","s01","s12","fa","fb","EPSILON","pointBefore","pointCurrent","pointAfter","alphaK","betaK","tauK","squaredMagnitude","pointsWithTangents","deltaK","mK","pointsLen","slopeDeltaX","loop","niceNum","fraction","webkitRequestAnimationFrame","mozRequestAnimationFrame","oRequestAnimationFrame","msRequestAnimationFrame","setTimeout","evt","originalEvent","srcElement","boundingRect","getBoundingClientRect","touches","clientX","clientY","paddingLeft","paddingTop","paddingRight","paddingBottom","getConstraintWidth","getConstraintHeight","_calculatePadding","parentDimension","cw","clientHeight","ch","currentStyle","forceRatio","pixelRatio","pixelSize","longestText","arrayOfThings","gc","garbageCollect","thing","nestedThing","longest","gcLen","textWidth","numberOfLabelLines","numberOfLines","CanvasGradient","colorValue","CanvasPattern","abstract","DateAdapter","formats","parse","format","startOf","endOf","_create","override","members","core_adapters","_date","core_ticks","formatters","tickValue","logDelta","tickString","logTick","numExponential","toExponential","numDecimal","toFixed","logarithmic","remain","valueOrDefault$a","sample","arr","numItems","increment","getPixelForGridLine","validIndex","lineValue","caches","computeLabelSizes","tickFonts","tickFont","nestedLabel","widest","highest","widths","heights","offsets","widestLabelSize","highestLabelSize","major","minor","valueAt","first","getTickMarkLength","drawTicks","tickMarkLength","getScaleLabelHeight","parseFontOptions","nestedOpts","fontColor","parseTickFontOptions","nonSkipped","ticksToFilter","getEvenSpacing","calculateSpacing","majorIndices","axisLength","ticksLimit","factors","factor","evenMajorSpacing","spacing","getMajorIndices","skipMajors","tick","ceil","majorStart","majorEnd","drawOnChartArea","zeroLineWidth","zeroLineColor","zeroLineBorderDash","zeroLineBorderDashOffset","scaleLabel","labelString","minRotation","maxRotation","mirror","autoSkip","autoSkipPadding","labelOffset","Scale","zeroLineIndex","_ticks","_getLabels","xLabels","yLabels","beforeUpdate","margins","samplingEnabled","sampleSize","_labelSizes","_maxLabelLines","longestLabelWidth","longestTextCache","_gridLineItems","_labelItems","beforeSetDimensions","setDimensions","afterSetDimensions","beforeDataLimits","determineDataLimits","afterDataLimits","beforeBuildTicks","buildTicks","afterBuildTicks","_convertTicksToLabels","beforeCalculateTickRotation","calculateTickRotation","afterCalculateTickRotation","beforeFit","fit","afterFit","_ticksToDraw","_autoSkip","afterUpdate","startPixel","endPixel","reversePixels","_reversePixels","beforeTickToLabelConversion","convertTicksToLabels","userCallback","afterTickToLabelConversion","labelSizes","maxLabelWidth","maxLabelHeight","tickWidth","maxLabelDiagonal","numTicks","labelRotation","_isVisible","_getLabelSizes","scaleLabelOpts","gridLineOpts","isBottom","firstLabelSize","lastLabelSize","lineSpace","tickPadding","isRotated","angleRadians","cosRotation","sinRotation","labelHeight","offsetLeft","offsetRight","labelWidth","handleMargins","isFullWidth","rawValue","_getScaleLabel","getValueForPixel","decimal","getDecimalForPixel","getBaseValue","avgMajorSpacing","maxTicksLimit","_tickSize","numMajorIndices","optionTicks","rot","_computeGridLineItems","borderValue","alignedLineValue","tx1","ty1","tx2","ty2","lineColor","ticksLength","tl","axisWidth","axisHalfWidth","alignPixel","alignBorderValue","_computeLabelItems","lineCount","textOffset","isMirrored","fonts","_drawGrid","firstLineWidth","lastLineWidth","_drawLabels","_drawTitle","scaleLabelX","scaleLabelY","scaleLabelFontColor","scaleLabelFont","scaleLabelPadding","halfLineHeight","isLeft","tz","gz","_draw","core_scale","isNullOrUndef$1","defaultConfig","scale_category","ticksOpts","minIndex","maxIndex","_startValue","_valueRange","valueCategory","_defaults","isNullOrUndef$2","generateTicks","generationOptions","dataRange","niceMin","niceMax","numSpaces","MIN_SPACING","stepSize","unit","maxNumSpaces","maxTicks","precision","rmin","rmax","scale_linearbase","handleTickRangeOptions","minSign","maxSign","setMin","suggestedMin","setMax","suggestedMax","getTickLimit","_computeTickLimit","handleDirectionalChanges","numericGeneratorOptions","fixedStepSize","ticksAsNumbers","_endValue","defaultConfig$1","DEFAULT_MIN","DEFAULT_MAX","getOrCreateStack","neg","stackData","relativePoints","updateMinMax","scale_linear","hasStacks","stackValues","_defaults$1","valueOrDefault$b","generateTicks$1","exp","significand","tickVal","endExp","endSignificand","minNotZero","lastTick","defaultConfig$2","nonNegativeOrDefault","scale_logarithmic","IDMatches","valuesPerStack","valuesForType","minVal","maxVal","tickValues","_getFirstTickValue","_valueOffset","_defaults$2","valueOrDefault$c","valueAtIndexOrDefault$1","resolve$4","defaultConfig$3","animate","showLabelBackdrop","backdropColor","backdropPaddingY","backdropPaddingX","getTickBackdropHeight","measureLabelSize","determineLimits","fitWithPointLabels","textSize","plFont","furthestLimits","furthestAngles","_pointLabelSizes","valueCount","getPointPosition","drawingArea","getIndexAngle","hLimits","vLimits","setReductions","getTextAlignForAngle","adjustPointPositionForLabelHeight","drawPointLabels","pointLabelOpts","tickBackdropHeight","outerDistance","extra","pointLabelPosition","pointLabelFontColor","drawRadiusLine","numberOrZero","param","scale_radialLinear","setCenterPoint","largestPossibleRadius","radiusReductionLeft","radiusReductionRight","radiusReductionTop","radiusReductionBottom","leftMovement","rightMovement","topMovement","bottomMovement","maxRight","maxLeft","maxTop","maxBottom","scalingFactor","distanceFromCenter","thisAngle","getBasePosition","angleLineOpts","tickFontColor","_defaults$3","deprecated$1","resolve$5","valueOrDefault$d","MIN_INTEGER","MIN_SAFE_INTEGER","MAX_INTEGER","MAX_SAFE_INTEGER","INTERVALS","millisecond","common","steps","second","minute","hour","day","week","month","quarter","year","UNITS","sorter","arrayUnique","hash","out","getMin","time","getMax","buildLookupTable","timestamps","distribution","table","lookup","mid","i0","i1","lo","interpolate$1","skey","tkey","span","toTimestamp","adapter","_adapter","parser","determineUnitForAutoTicks","minUnit","capacity","interval","determineUnitForFormatting","determineMajorUnit","generate","timeOpts","unitStepSize","weekday","isoWeekday","computeOffsets","setMajorTicks","majorUnit","ticksFromTimestamps","defaultConfig$4","adapters","displayFormat","displayFormats","scale_time","date","timestamp","labelsAdded","dataLabels","_table","_timestamps","getLabelCapacity","_unit","_majorUnit","_offsets","tooltipFormat","datetime","tickFormatFunction","minorFormat","majorFormat","nestedTickOpts","formatter","getPixelForOffset","_getLabelSize","tickLabelWidth","tickFontSize","getLabelWidth","exampleTime","exampleLabel","_defaults$4","category","radialLinear","FORMATS","_id","valueOf","amount","filler","propagate","mappers","boundary","decodeFill","computeLinearBoundary","scaleBottom","scaleTop","scaleZero","computeCircularBoundary","cx","cy","computeBoundary","resolveTarget","visited","visible","createMapper","isDrawable","drawArea","curve0","curve1","len0","len1","doFill","mapper","p0","p1","d0","d1","loopOffset","plugin_filler","afterDatasetsUpdate","$filler","beforeDatasetsDraw","getRtlHelper$1","noop$1","valueOrDefault$e","getBoxWidth","labelOpts","usePointStyle","boxWidth","ci","onLeave","lineDash","Legend","legendHitBoxes","_hoveredItem","doughnutMode","beforeBuildLabels","buildLabels","afterBuildLabels","legendItems","labelFont","hitboxes","lineWidths","totalHeight","vPadding","columnWidths","columnHeights","totalWidth","currentColWidth","currentColHeight","lineDefault","legendHeight","legendWidth","cursor","drawLegendBox","SQRT2","halfFontSize","xLeft","yMiddle","alignmentOffset","dimension","blockSize","itemHeight","realX","_getLegendItemAt","hitBox","lh","hoveredItem","createNewLegendAndAttach","legendOpts","plugin_legend","_element","beforeInit","afterEvent","noop$2","Title","titleX","titleY","fontOpts","createNewTitleBlockAndAttach","titleOpts","titleBlock","_adapters","Animation","animationService","Interaction","scaleService","Ticks","Tooltip","pluginService","PluginBase","canvasHelpers","layoutService","LinearScaleBase","klass","cfg","toLowerCase","factory","baseIsEqual","other","Stack","equalArrays","equalByTag","equalObjects","getTag","isBuffer","isTypedArray","argsTag","arrayTag","objectTag","bitmask","customizer","equalFunc","objIsArr","othIsArr","objTag","othTag","objIsObj","othIsObj","isSameTag","objIsWrapped","othIsWrapped","objUnwrapped","othUnwrapped","__data__","assocIndexOf","ListCache","has","Map","MapCache","pairs","LARGE_ARRAY_SIZE","isFunction","isMasked","toSource","reIsHostCtor","funcProto","Function","objectProto","funcToString","reIsNative","RegExp","test","Symbol","nativeObjectToString","symToStringTag","toStringTag","isOwn","tag","unmasked","coreJsData","maskSrcKey","exec","IE_PROTO","func","Hash","hashClear","hashDelete","hashGet","hashHas","hashSet","entries","entry","nativeCreate","getMapData","setCacheAdd","setCacheHas","SetCache","predicate","Uint8Array","eq","mapToArray","setToArray","symbolProto","symbolValueOf","byteLength","byteOffset","buffer","message","isPartial","getAllKeys","objProps","objLength","objStacked","othStacked","skipCtor","objValue","othValue","compared","objCtor","othCtor","baseGetAllKeys","getSymbols","arrayPush","keysFunc","symbolsFunc","arrayFilter","stubArray","propertyIsEnumerable","nativeGetSymbols","getOwnPropertySymbols","symbol","resIndex","baseTimes","isArguments","isIndex","inherited","isArr","isArg","isBuff","isType","skipIndexes","iteratee","baseGetTag","isObjectLike","isLength","typedArrayTags","freeGlobal","freeSelf","self","freeExports","nodeType","freeModule","freeProcess","process","nodeUtil","binding","isPrototype","nativeKeys","Ctor","overArg","transform","arg","DataView","Promise","Set","WeakMap","mapTag","promiseTag","setTag","weakMapTag","dataViewTag","dataViewCtorString","mapCtorString","promiseCtorString","setCtorString","weakMapCtorString","ArrayBuffer","ctorString","getNative","baseAssignValue","keyBy","createAggregator","arrayAggregator","baseAggregator","baseIteratee","setter","initializer","accumulator","baseEach","baseForOwn","createBaseEach","baseFor","createBaseFor","fromRight","iterable","isArrayLike","eachFunc","baseMatches","baseMatchesProperty","identity","baseIsMatch","getMatchData","matchesStrictComparable","matchData","noCustomizer","srcValue","COMPARE_PARTIAL_FLAG","isStrictComparable","hasIn","isKey","toKey","baseGet","memoizeCapped","rePropName","reEscapeChar","stringToPath","charCodeAt","number","quote","subString","memoize","resolver","TypeError","memoized","Cache","baseToString","arrayMap","isSymbol","symbolToString","baseHasIn","hasPath","castPath","hasFunc","baseProperty","basePropertyDeep","SidePanel","getActiveClass","tab","currentTab","isSidePanelClosed","onCloseSidePanel","canViewSystemInfo","siteRoot","tabItemClick","aria-hidden","isPro","canViewStatistic","otherPermission","constanceEnabled","canConfigSystem","canManageLibrary","canManageUser","canManageGroup","multiTenancy","multiInstitution","sysadminExtraEnabled","canViewUserLog","enableFileScan","enableGuestInvitation","enableTermsAndConditions","canViewAdminLog","enableWorkWeixin","enableDingtalk","enableShareLinkReportAbuse","MainPanel","children","MainPanelTopbar","search","isAdminPanel","Info","uploadLicenseFile","fileInput","files","file","seafileAPI","sysAdminUploadLicense","then","sysInfo","with_license","catch","errMsg","getErrorMsg","toaster","danger","openFileInput","click","renderLicenseDescString","license_mode","license_to","license_expiration","app","lang","loading","errorMsg","sysAdminGetSysInfo","org_count","repos_count","total_files_count","total_storage","total_devices_count","current_connected_devices_count","license_maxusers","multi_tenancy_enabled","active_users_count","users_count","groups_count","isDefaultAdmin","ref","href","bytesToSize","Nav","navItems","urlPart","propsTypes","disabledDate","PropTypes","isRequired","FORMAT","Picker","defaultCalendarValue","locale","calendar","translateCalendar","placeholder","tabIndex","readOnly","StatisticCommonTool","changeActive","statisticTypeName","statisticType","endTime","subtract","getActiviesFiles","disabledStartDate","startValue","today","endValue","isBefore","disabledEndDate","field","onSubmit","StatisticChart","titleCallback","ticksCallback","opations","filesData","isTitleCallback","isTicksCallback","suggestedMaxNumbers","isLegendStatus","chartTitle","_this","nextProps","StatisticFile","groupBy","sysAdminStatisticFiles","added","deleted","modified","addedData","visitedData","modifiedData","deletedData","isLoading","err","StatisticStorage","sysAdminStatisticStorages","totalStorage","TrafficTable","sortBy","sortIcon","sortOrder","sortItems","TrafficTableBody","trafficName","userTrafficItem","email","org_name","syncUploadSize","sync_file_upload","syncDownloadSize","sync_file_download","webUploadSize","web_file_upload","webDownloadSize","web_file_download","linkUploadSize","link_file_upload","linkDownloadSize","link_file_download","OrgsTraffic","getPreviousPage","getTrafficList","currentPage","getNextPage","errorMessage","initPage","blur","page","perPage","orderBy","sysAdminListOrgTraffic","orgTrafficList","org_monthly_traffic_list","hasNextPage","has_next_page","resetPerPage","newPerPage","initMonth","urlParams","URL","location","searchParams","gotoPreviousPage","gotoNextPage","curPerPage","UsersTraffic","sysAdminListUserTraffic","userTrafficList","user_monthly_traffic_list","StatisticTraffic","changeTabActive","activeName","tabActive","sysAdminStatisticTraffic","total_upload","total_download","link_upload","link_download","sync_upload","sync_download","web_upload","web_download","linkData","syncData","webData","renderCommonTool","StatisticUsers","sysAdminStatisticActiveUsers","userCount","StatisticReports","onGenerateReports","url","SysAdminUnlinkDevice","handleInputChange","inputChecked","checked","unlinkDevice","toggleDialog","htmlFor","Content","getPreviousPageDevicesList","getDevicesListByPage","pageInfo","current_page","getNextPageDevicesList","emptyTip","Item","handleMouseOver","isOpIconShown","handleMouseOut","handleUnlink","is_desktop_client","toggleUnlinkDeviceDialog","isUnlinkDeviceDialogOpen","deleteFiles","device_id","user","sysAdminUnlinkDevice","unlinked","success","onMouseEnter","onMouseLeave","user_name","client_version","device_name","last_login_ip","last_accessed","fromNow","DevicesByPlatform","devicesPlatform","per_page","sysAdminListDevices","devicesData","devices","page_info","DesktopDevices","MobileDevices","UserLink","encodeURIComponent","device_ip","repo_id","repo_name","error_msg","error_time","DeviceErrors","clean","sysAdminClearDeviceErrors","devicesErrors","isCleanBtnShown","sysAdminListDeviceErrors","AbuseReports","listAbuseReports","sysAdminListAbuseReports","abuseReportList","abuse_report_list","handleError","updateAbuseReport","handled","abuseReportId","sysAdminUpdateAbuseReport","response","detail","isDesktop","AbuseReportList","fileUrl","file_path","reporter","abuse_type","description","SetQuotaDialog","handleQuotaChange","quota","updateQuota","addonType","SysAdminImportUserDialog","fileInputRef","uploadFile","fileName","lastIndexOf","importUserInBatch","SysAdminUserRoleEditor","translateRoles","role","isTextMode","isEditIconShow","roleOptions","currentOption","currentRole","onOptionChanged","onRoleChanged","translateOption","SysAdminAddUserDialog","checkSubmitBtnActive","password","passwordAgain","btnActive","togglePasswordVisible","isPasswordVisible","inputPassword","passwd","inputPasswordAgain","generatePassword","inputEmail","inputName","updateRole","showRole","addUser","dialogTitle","autoComplete","availableRoles","SysAdminBatchAddAdminDialog","handleSelectChange","addAdminInBatch","isMulti","onSelectChange","CommonOperationConfirmationDialog","executeOperation","confirmBtnText","dangerouslySetInnerHTML","__html","SysAdminUser","contact_email","login_id","last_login","last_access_time","create_time","is_active","is_staff","reference_id","department","quota_total","quota_usage","institution","org_id","isSelected","SysAdminAdminUser","admin_role","Search","submit","haveLDAP","SysAdminUserStatusEditor","translateStatus","status","statusOptions","currentStatus","onStatusChanged","OpMenu","onMenuItemClick","operation","getEventData","onDropdownToggleClick","toggleOperationMenu","isItemMenuShow","onFreezedItem","onUnfreezedItem","operations","translateOperations","data-toggle","aria-expanded","data-op","sysadmin","pageOptions","availableAdminRoles","institutions","isItemFreezed","getListByPage","sortByQuotaUsage","isAdmin","isAllUsersSelected","columns","spaceText","spaceEl","colSpaceText","colNameText","colCreatedText","toggleSelectAllUsers","updateUser","deleteUser","updateAdminRole","revokeAdmin","onUserSelected","isLDAPImported","isSearchResult","handleMouseEnter","highlight","handleMouseLeave","isOpIconShow","toggleSetQuotaDialog","isSetQuotaDialogOpen","toggleDeleteUserDialog","isDeleteUserDialogOpen","toggleResetUserPasswordDialog","isResetUserPasswordDialogOpen","toggleRevokeAdminDialog","isRevokeAdminDialogOpen","updateStatus","isActive","translateAdminRole","updateInstitution","translateInstitution","inst","resetPassword","sysAdminResetUserPassword","reset_tip","getMenuOperations","translateResult","itemName","deleteDialogMsg","resetPasswordDialogMsg","revokeAdminDialogMsg","username","Users","toggleImportUserDialog","isImportUserDialogOpen","toggleAddUserDialog","isAddUserDialogOpen","toggleBatchSetQuotaDialog","isBatchSetQuotaDialogOpen","toggleBatchDeleteUserDialog","isBatchDeleteUserDialogOpen","hasUserSelected","selectedUserList","users","userList","thisuser","getUserList","sysAdminListAdmins","admin_user_list","getUsersListByPage","sysAdminListUsers","total_count","URLSearchParams","navigate","sysAdminDeleteUser","newUserList","setUserQuotaInBatch","quotaTotal","emails","sysAdminSetUserQuotaInBatch","resultUser","deleteUserInBatch","sysAdminDeleteUserInBatch","oldUser","some","deletedUser","msg","failed","sysAdminImportUserViaFile","sysAdminAddUser","add_user_tip","sysAdminUpdateUser","update_status_tip","sysAdminUpdateAdminRole","getOperationsForAll","toggleBatchAddAdminDialog","getCurrentNavItem","isBatchAddAdminDialogOpen","sysAdminAddAdminInBatch","getSearch","searchItems","AdminUsers","LDAPImportedUsers","sysAdminListLDAPUsers","ldap_user_list","SearchUsers","getItems","sysAdminSearchUsers","query","user_list","getPreviousPageList","getNextPageList","row","sm","UpdateUser","updateValue","userName","twoFactorAuthEnabled","currentKey","isUpdateUserDialogOpen","toggleSetNameDialog","toggleSetUserLoginIDDialog","toggleSetUserComtactEmailDialog","toggleSetUserReferenceIDDialog","toggleUpdateUserDialog","showEditIcon","action","userInfo","avatar_url","alt","has_default_device","disable2FA","check","is_force_2fa","toggleForce2fa","User","sysAdminDeleteTwoFactorAuth","sysAdminSetForceTwoFactorAuth","sysAdminGetUser","enableSysAdminViewRepo","deleteRepo","transferRepo","toggleDeleteDialog","isDeleteDialogOpen","toggleTransferDialog","isTransferDialogOpen","owner","renderRepoName","repo","encrypted","iconUrl","getLibIconUrl","iconTitle","getLibIconTitle","last_modified","canTransferToDept","Repos","repoID","sysAdminDeleteRepo","newRepoList","repoList","sysAdminTransferRepo","sysAdminListReposByOwner","repos","getOwnerLink","owner_email","owner_name","groupID","last_modify","sysAdminListShareInRepos","repo_list","deleteItem","toggleLinkDialog","isLinkDialogOpen","getRoleText","roleText","getIconUrl","is_dir","getFolderIconUrl","getFileIconUrl","obj_name","view_cnt","Links","token","sysAdminDeleteShareLink","shareLinkItems","sysAdminDeleteUploadLink","uploadLinkItems","sysAdminListShareLinksByUser","share_link_list","sysAdminListUploadLinksByUser","upload_link_list","parent_group_id","created_at","Groups","sysAdminDismissGroupByID","sysAdminListGroupsJoinedByUser","group_list","SysAdminCreateRepoDialog","handleRepoNameChange","repoName","ownerEmail","createRepo","option","UserItem","isOperationShow","deleteShareItem","user_email","onChangeUserPermission","permission","currentPermission","is_admin","permissions","onPermissionChanged","UserList","SysAdminShareToUser","selectedOption","setPermission","shareToUser","sysAdminAddRepoSharedItem","newItems","sharedItems","refs","userSelect","clearSelect","useremail","sysAdminDeleteRepoSharedItem","userEmail","sysAdminUpdateRepoSharedItemPermission","updateSharedItems","sharedItem","sharedItemUsername","sysAdminListRepoSharedItems","colSpan","GroupItem","group_id","group_name","GroupList","NoOptionsMessage","innerProps","SysAdminShareToGroup","loadOptions","shareableGroups","listSharedGroups","shareToGroup","groups","sharedItemGroupID","components","makeAnimated","maxMenuHeight","inputId","SysAdminShareDialog","getInitialActiveTab","activeTab","renderDirContent","enableDirPrivateShare","isGroupOwnedRepo","pills","tabId","itemType","itemPath","isRepoOwner","SysAdminLibHistorySettingDialog","days","keepDays","autoHistory","expireDays","sysAdminUpdateRepoHistorySetting","keep_days","errorInfo","setLimitDays","allHistory","noHistory","sysAdminGetRepoHistorySetting","onKeyDown","sortByFileCount","sortBySize","initialSortIcon","onDeleteRepo","onTransferRepo","isRepoDeleted","toggleShareDialog","toggleHistorySettingDialog","isShareDialogOpen","isHistorySettingDialogOpen","getOperations","departmentID","file_count","repoEncrypted","userPerm","AllRepos","toggleCreateRepoDialog","isCreateRepoDialogOpen","getReposByPage","sysAdminListAllRepos","Owner","sysAdminCreateRepo","targetRepo","searchRepos","SystemRepo","sysAdminGetSystemRepoInfo","trashReposExpireDays","onRestoreRepo","sysAdminDeleteTrashRepo","sysAdminRestoreTrashRepo","toggleDeleteRepoDialog","isDeleteRepoDialogOpen","toggleRestoreRepoDialog","isRestoreRepoDialogOpen","delete_time","TrashRepos","toggleCleanTrashDialog","isCleanTrashDialogOpen","sysAdminListTrashRepos","cleanTrash","sysAdminCleanTrashRepos","sysAdminSearchTrashRepos","SearchRepos","getRepos","sysAdminSearchRepos","handleNameInputChange","Dirent","mtime","last_update","file_size","is_file","DirPath","onPathClick","turnPathToLink","pathList","nodePath","data-path","isSystemRepo","currentPath","pathElem","DirentItem","openFolder","dirent","deleteDirent","downloadDirent","fromSystemRepo","getDirentIcon","DirContent","direntList","DirView","loadDirentList","toggleNewFolderDialog","isNewFolderDialogOpen","createNewFolder","folderName","getFileName","sysAdminCreateSysRepoFolder","new_dirent","direntPath","joinPath","sysAdminListRepoDirents","is_system_library","dirent_list","encodePath","history","replaceState","sysAdminDeleteRepoDirent","sysAdminGetRepoFileDownloadURL","download_url","onFileInputChange","sydAdminGetSysRepoItemUploadURL","formData","FormData","append","post","upload_link","fileObj","newDirent","getTime","dirs","SysAdminCreateGroupDialog","groupName","createGroup","SysAdminTransferGroupDialog","submitBtnDisabled","receiver","transferGroup","deleteGroup","groupUrl","toggleCreateGroupDialog","isCreateGroupDialogOpen","getGroupListByPage","sysAdminListAllGroups","groupList","OnwerEmail","sysAdminCreateNewGroup","newGroupList","receiverEmail","sysAdminTransferGroup","searchGroups","SearchGroups","getGroups","sysAdminSearchGroups","unshareRepo","toggleUnshareRepoDialog","isUnshareRepoDialogOpen","dialogMsg","shared_by","shared_by_name","GroupRepos","sysAdminUnshareRepoFromGroup","sysAdminListGroupRepos","libraries","SysAdminGroupAddMemberDialog","selectedOptions","isSubmitBtnDisabled","addMembers","SysAdminGroupRoleEditor","removeMember","updateMemberRole","GroupMembers","sysAdminListGroupMembers","memberList","toggleAddMemgerDialog","isAddMemberDialogOpen","sysAdminAddGroupMember","newMemberList","sysAdminDeleteGroupMember","sysAdminUpdateGroupMemberRole","Departments","AddDepartDialog","validateName","parentGroup","parentGroupID","sysAdminAddNewDepartment","departName","onDepartChanged","header","DeleteDepartDialog","deleteDepart","sysAdminDeleteDepartment","tipMessage","SetGroupQuotaDialog","setGroupQuota","newQuota","sysAdminUpdateDepartmentQuota","RenameDepartmentDialog","sysAdminRenameDepartment","departmentName","onDepartmentNameChanged","select","group","toggleRenameDialog","showDeleteDepartDialog","isRenameDialogOpen","newHref","showSetGroupQuotaDialog","DepartmentsList","listDepartGroups","sysAdminListAllDepartments","toggleAddDepartDialog","isShowAddDepartDialog","toggleCancel","dept","topbarChildren","AddMemberDialog","orgSelect","onMemberChanged","DeleteMemberDialog","deleteMember","member","AddRepoDialog","sysAdminAddRepoInDepartment","onRepoChanged","DeleteRepoDialog","sysAdminDeleteRepoInDepartment","MemberItem","toggleMemberRoleMenu","showRoleMenu","onChangeUserRole","roles","toggleItemFreezed","showDeleteMemberDialog","RepoItem","showDeleteRepoDialog","DepartmentDetail","listGroupRepo","getDepartmentInfo","sysAdminGetDepartmentInfo","ancestorGroups","ancestor_groups","listMembers","membersPageInfo","membersErrorMsg","membersPerPage","listSubDepartGroups","onSubDepartChanged","onSubDepartmentNameChanged","isFreezed","deletedMember","deletedRepo","toggleRenameDepartmentDialog","isShowRenameDepartmentDialog","toggleAddRepoDialog","isShowAddRepoDialog","toggleAddMemberDialog","isShowAddMemberDialog","subGroup","subGroupID","subGroupName","membersPage","topBtn","ancestor","getShareLinksByPage","sortByTime","sortByCount","deleteShareLink","renderExpiration","expire_date","expire_time","is_expired","deleteIcon","onMouseOver","onMouseOut","creator_email","creator_name","ctime","ShareLinks","sysAdminListShareLinks","shareLinkList","linkToken","newShareLinkList","getUploadLinksByPage","deleteUploadLink","UploadLinks","sysAdminListAllUploadLinks","uploadLinkList","newUploadLinkList","SysAdminAddOrgDialog","orgName","addOrg","deleteOrg","sysAdminGetOrg","repoCount","Orgs","getItemsByPage","sysAdminListOrgs","orgList","organizations","toggleAddOrgDialog","isAddOrgDialogOpen","orgID","orgInfo","sysAdminUpdateOrg","newOrgList","org","sysAdminAddOrg","sysAdminDeleteOrg","SearchOrgs","sysAdminSearchOrgs","organization_list","SysAdminSetOrgNameDialog","updateName","SysAdminSetOrgMaxUserNumberDialog","isSetNameDialogOpen","toggleSetMaxUserNumberDialog","isSetMaxUserNumberDialogOpen","max_user_number","updateMaxUserNumber","OrgInfo","newOrgInfo","newValue","maxUserNumber","SysAdminUserMembershipEditor","updateMembership","toggleResetPasswordDialog","isResetPasswordDialogOpen","statusValue","membershipValue","is_org_staff","OrgUsers","newUserInfo","sysAdminAddOrgUser","sysAdminDeleteOrgUser","sysAdminUpdateOrgUser","isOrgStaff","sysAdminListOrgUsers","OrgGroups","sysAdminListOrgGroups","OrgRepos","sysAdminListOrgRepos","SysAdminAddInstitutionDialog","addInstitution","getInstitutionsByPage","deleteInstitution","institutionName","Institutions","sysAdminListInstitutions","institutionList","institution_list","toggleAddInstitutionDialog","isAddInstitutionDialogOpen","sysAdminAddInstitution","institutionID","sysAdminDeleteInstitution","institutionInfo","user_count","quota_used","InstitutionInfo","sysAdminUpdateInstitution","newInstitutionInfo","sysAdminGetInstitution","getInstitutionUsersByPage","setAdmin","toggleSetAdminDialog","isSetAdminDialogOpen","is_institution_admin","InstitutionUsers","sysAdminListInstitutionUsers","sysAdminUpdateInstitutionUser","sysAdminAddInstitutionUserBatch","successArray","failedArray","sysAdminDeleteInstitutionUser","InstitutionAdmins","sysAdminListInstitutionAdmins","LogsExportExcelDialog","downloadExcel","isValidDateStr","startDateStr","endDateStr","logType","handleStartChange","handleEndChange","getLogsByPage","login_ip","log_success","login_time","LoginLogs","toggleExportExcelDialog","isExportExcelDialogOpen","sysAdminListLoginLogs","logList","login_log_list","FilterMenu","toggleMenu","isMenuShown","toggleFreezeItem","onItemClick","filterItems","filterBy","ToggleFilter","toggleFilter","toggleFilterByUser","filterByUser","toggleFilterByRepo","filterByRepo","freezed","userFilteredBy","repoFilteredBy","isHighlighted","event_type","ip","device","file_or_dir_name","FileAccessLogs","sysAdminListFileAccessLogs","file_access_log_list","updateURL","delete","toggleCommitDetailsDialog","isCommitDetailsDialogOpen","showCommitDetails","file_operation","repo_encrypted","commitID","commit_id","commitTime","FileUpdateLogs","sysAdminListFileUpdateLogs","file_update_log_list","getActionTextByEType","etype","getShareTo","share_type","to_user_email","to_user_name","to_group_id","to_group_name","from_user_email","from_user_name","sharePerms","folder","SharePermissionLogs","sysAdminListSharePermissionLogs","share_permission_log_list","Section","headingText","SettingItemBase","helpTip","displayName","mainContent","extraContent","md","WebSettingInput","toggleBtns","isBtnsShown","hideBtns","onInputChange","saveSetting","keyText","inputType","onFocus","onBlur","onMouseDown","WebSettingFile","postFile","filePath","fileWidth","fileHeight","WebSettingCheckbox","valueToNum","WebSettings","sysAdminSetSysSettingInfo","config_dict","fileType","sysAdminUpdateLogo","sysAdminUpdateFavicon","sysAdminUpdateLoginBG","logoPath","logo_path","faviconPath","favicon_path","loginBGPath","login_bg_image_path","mediaUrl","sysAdminGetSysSettingInfo","SysAdminAddSysNotificationDialog","addNotification","deleteNotification","setToCurrent","is_current","Notifications","toggleAddNotificationDialog","isAddNotificationDialogOpen","sysAdminAddSysNotification","notificationList","notification","sysAdminDeleteSysNotification","sysAdminSetSysNotificationToCurrent","sysAdminListAllSysNotifications","notifications","Table","records","record","suggestion","FileScanRecords","listFileScanRecords","record_list","Fragment","WorkWeixinDepartmentMembersList","newUsersTempObj","checkedDepartmentId","isMembersListLoading","canCheckUserIds","membersList","avatar","onUserChecked","userid","mobile","isCheckedAll","onAllUsersChecked","WorkWeixinDepartmentsTreeNode","toggleChildren","stopPropagation","isChildrenShow","dropdownToggle","dropdownOpen","importDepartmentDialogToggle","depart","renderTreeNodes","departmentsTree","onChangeDepartment","changeDept","toggleClass","classNames","nodeInnerClass","WorkWeixinDepartmentsTreePanel","isTreeLoading","ImportWorkWeixinDepartmentDialog","onImportDepartmentSubmit","departmentsCount","membersCount","WorkWeixinDepartments","getDepartmentsTree","childIds","parentIds","parentid","intersection","rootIds","cloneData","_","cloneDeep","father","branchArr","child","getWorkWeixinDepartmentsList","adminListWorkWeixinDepartments","importDepartmentChildrenCount","importDepartmentMembersCount","membersTempObj","getWorkWeixinDepartmentMembersList","department_id","adminListWorkWeixinDepartmentMembers","fetch_child","userlist","getCanCheckUserIds","userIds","newUsersTempList","JSON","stringify","adminAddWorkWeixinUsersBatch","handleSubmitSuccess","fails","departmentId","importDepartment","isImportDepartmentDialogShow","adminImportWorkWeixinDepartment","handleImportDepartmentSubmitSuccess","handleImportDepartmentSubmitFailed","successes","successMsg","department_name","api_user_name","fail","failName","btnClass","canImportDepartment","renderNav","DingtalkDepartmentMembersList","DingtalkDepartmentsTreeNode","DingtalkDepartmentsTreePanel","ImportDingtalkDepartmentDialog","DingtalkDepartments","getDingtalkDepartmentsList","adminListDingtalkDepartments","getDingtalkDepartmentMembersList","adminListDingtalkDepartmentMembers","adminAddDingtalkUsersBatch","adminImportDingtalkDepartment","getInviteTypeText","invite_type","inviter_email","inviter_name","accept_time","accepter_email","accepter_name","invite_time","Invitations","sysAdminListInvitations","invitation_list","targetItem","sysAdminDeleteInvitation","deleteItemInBatch","sysAdminDeleteExpiredInvitations","prevItems","totalItemCount","TermsEditorDialog","isContentChanged","currentContent","getCurrentContent","onCommit","onCloseEditorDialog","simpleEditor","hasContentChange","getMarkdown","setSimpleEditorRef","editor","content","wrapClassName","contentClassName","onRef","defaultProps","AddOrUpdateTermDialog","handleNameChange","handleVersionNumberChange","versionNumber","handleTextChange","setActive","setInActive","addTerm","isUpdate","updateTerm","onContentClick","isConditionsEditorDialogShow","onUpdateContent","oldTermObj","version_number","activate_time","hrefReg","imageReg1","imageReg2","linkReg1","linkReg2","getPreviewContent","markdownContent","previewText","newMarkdownContent","hrefs","hrefObj","links","images","imageSrcs","imageSrcs1","getLinks","TermsPreviewDialog","onClosePreviewDialog","toggleUpdateDialog","isUpdateDialogOpen","toggleTermsContentDialog","isTermsPerviewDialogOpen","deleteTerm","itemContent","mdFile","processor","innerHtml","previewContent","TermsAndConditions","toggleAddTermDialog","isAddTermDialogOpen","sysAdminAddTermAndCondition","reload","termID","sysAdminUpdateTermAndCondition","termList","sysAdminDeleteTermAndCondition","sysAdminListTermsAndConditions","term_and_condition_list","VirusFileItem","handleFile","virusFile","virus_id","fileStatus","fileOpList","has_deleted","has_ignored","repo_owner","virusFiles","AllVirusFiles","listVirusFiles","virus_file_list","virusID","op","deleteVirusFile","toggleIgnoreVirusFile","virus_file","toggleItemSelected","isAllItemsSelected","toggleAllSelected","UnhandledVirusFiles","prevState","handleSelectedItems","virusIDs","batchProcessVirusFiles","fileList","find","deleteSelectedItems","ignoreSelectedItems","selectedItems","LogsNav","getOperationText","operationType","getOperationDetail","ownerPageUrl","userPageUrl","detailText","repoPageUrl","groupPageUrl","AdminOperationLogs","sysAdminListAdminLogs","login_success","AdminLoginLogs","sysAdminListAdminLoginLogs","SysAdmin","getCurrentTabForPageList","pageList","urlPartList","urlBase","tmpTab","ReactDOM","baseIsNative","getValue","ShareAdminLink","copyToClipboard","copy","getScrollbarWidth","scrollDiv","scrollbarWidth","setScrollbarWidth","isBodyOverflowing","getOriginalBodyPadding","conditionallyUpdateScrollbar","fixedContent","bodyPadding","globalCssModule","mapToCssModules","cssModule","omit","omitKeys","pick","pickKeys","warned","warnOnce","propType","explanation","propName","componentName","rest","DOMElement","getTarget","selection","TransitionTimeouts","TransitionPropTypeKeys","TransitionStatuses","keyCodes","PopperPlacements","canUseDOM","propTypes","Container","fluid","Tag","attributes","classes","Row","noGutters","stringOrNumberProp","columnProps","getColumnSizeClass","isXs","colWidth","colSize","Col","colClasses","columnProp","isobject","colSizeInterfix","colClass","toggleableToExpand","Navbar","toggleable","inverse","fixed","sticky","getExpandClass","getToggleableClass","NavbarBrand","NavbarToggler","tabs","justified","navbar","card","getVerticalClass","NavItem","bool","childContextTypes","Dropdown","inNavbar","prevProps","menuClass","itemClass","disabledClass","dropup","nav","attrs","any","NavLink","Breadcrumb","BreadcrumbItem","Button","block","outline","ButtonDropdown","ButtonGroup","ButtonToolbar","contextTypes","DropdownItem","divider","noFlipModifier","directionPositionMap","DropdownMenu","position1","position2","DropdownToggle","caret","ariaLabel","timeoutPropName","transitionType","enabledPropName","_propTypes2","oneOfType","shape","newObj","_interopRequireWildcard","_react2","_reactDom2","UNMOUNTED","EXITED","ENTERING","ENTERED","EXITING","Transition","_React$Component","instance","ReferenceError","_possibleConstructorReturn","appear","initialStatus","superClass","subClass","writable","transitionGroup","pendingState","timeout","exit","enter","mounting","nextStatus","unmountOnExit","_this2","appearing","timeouts","_this3","nextCallback","nextState","_this4","setNextCallback","_this5","_props","childProps","_objectWithoutProperties","Fade","baseClass","baseClassActive","otherProps","transitionProps","Badge","pill","Card","CardGroup","CardDeck","CardColumns","CardBody","CardLink","CardFooter","CardHeader","CardImg","cardImgClassName","CardImgOverlay","CarouselItem","isAppearing","startAnimation","offsetHeight","CustomEvent","isIn","slide","onExited","directionClassName","orderClassName","itemClasses","Carousel","ride","activeIndex","indicatorClicked","setInterval","pause","carouselItems","outerClasses","innerClasses","every","controlLeft","controlRight","indicators","wrappedIndicators","onClickHandler","CarouselControl","directionText","anchorClasses","iconClasses","screenReaderClasses","CarouselIndicators","listClasses","indicatorClasses","CarouselCaption","captionHeader","captionText","UncontrolledCarousel","nextIndex","newIndex","autoPlay","controls","goToIndex","slides","CardSubtitle","CardText","CardTitle","PopperContent","getTargetNode","placement","childNodes","fallbackPlacement","placementPrefix","hideArrow","modifiers","arrowClassName","popperClassName","extendedModifiers","behavior","handlePlacementChange","component","PopperTargetHelper","show","hide","DEFAULT_DELAYS","Popover","delay","getDelay","_target","contains","_popover","popperClasses","PopoverHeader","PopoverBody","Progress","barClassName","animated","striped","multi","toNumber","progressClasses","progressBarClasses","ProgressBar","Portal","FadePropTypes","propsToOmit","Modal","autoFocus","modalTransition","onEntered","_dialog","backdrop","modalOpenClassName","modalOpenClassNameRegex","dialogBaseClass","modalClassName","backdropClassName","labelledBy","external","modalAttributes","hasTransition","backdropTransition","ModalHeader","closeButton","WrapTag","closeAriaLabel","aria-label","ModalBody","ModalFooter","onMouseLeaveTooltipContent","bordered","ResponsiveTag","responsiveClassName","ListGroup","flush","Form","inline","FormFeedback","FormGroup","FormText","Input","bsSize","invalid","addon","staticInput","plaintext","checkInput","isNotaNumber","formControlClass","InputGroup","InputGroupText","InputGroupAddon","Label","Pagination","PaginationItem","PaginationLink","defaultAriaLabel","defaultCaret","TabContent","TabPane","Jumbotron","Alert","closeClassName","closeClasses","in","Collapse","transitionStatusToClassHash","getHeight","collapseClass","getTransitionClass","handleDisabledOnClick","ListGroupItem","ListGroupItemHeading","ListGroupItemText","UncontrolledAlert","UncontrolledButtonDropdown","UncontrolledDropdown","UncontrolledTooltip","EmptyTip","forDialog","getRawTag","objectToString","protocolAndDomainRE","everythingAfterProtocol","localhostDomainRE","nonLocalhostDomainRE","CommitDetails","getCommitDetails","commitDetails","centered","renderDetails","detailsData","showDesc","cmt_desc","HeaderList","_React$PureComponent","_inherits","_super","_createSuper","_classCallCheck","handleClick","getContainer","_createClass","findDOMNode","headerType","onClickHeader","PureComponent","withTranslation","IconButton","tooltipOpen","that","_assertThisInitialized","getClassName","isRichEditor","icon","AddLinkDialog","setInitialValue","editorUtils","getSelectedText","isLinkActive","linkNode","getCurrentLinkNode","getLinkText","handleUrlChange","handleTitleChange","setLink","editorSelection","insertLink","EditorUtils","AddImageDialog","insertImage","onToggleImageDialog","AddFormulaDialog","nodes","Editor","formula","formulaNode","handleFormulaChange","renderFormula","formulaPreviewer","innerHTML","dom","MathJax","tex2svg","setFormula","at","onAddFormula","toggleFormulaDialog","_ref","TableToolBar","DropList","handle","onSetAlign","onInsertColumn","onRemoveColumn","onInsertRow","onRemoveRow","onRemoveTable","_React$PureComponent2","_super2","marginRight","UploadImg","_len","_key","imgtoggle","uploadLocalImage","editorApi","onInsertImage","handleFileChange","onInputFile","stopImmediatePropagation","isSimpleEditor","insertRepoFile","accept","ToolBar","onToggleLink","unwrapLink","onToggleLinkDialog","toolbarStatus","isTableActive","isHeadActive","isCodeActive","isBoldActive","isItalicActive","isInlineCodeActive","isBlockquoteActive","isOrderedListActive","isUnorderedListActive","isCheckListActive","isFormulaActive","isListActive","onClickMark","onClickBlock","onToggleCheckItem","onAddTable","canInsertFormula","onToggleFormulaDialog","hasSidePanel","isShowSidePanel","toggleSidePanel","isShowLinkDialog","isShowFormulaDialog","isShowImageDialog","History","isPlainObject","Operation","HistoryCommand","Command","SAVING","MERGING","HistoryEditor","isHistoryEditor","isMerging","isSaving","withoutMerging","withoutSaving","withHistory","undos","redos","command","batch","inverseOps","lastBatch","lastOp","overwrite","shouldOverwrite","shouldSave","shouldMerge","shouldClear","Path","isRangeCollapsed","Range","isCollapsed","TextLinkHoverMenu","saveRef","refDom","getLinkUrl","linkUrl","setMenuPosition","getSelection","anchorOffset","focusOffset","getRangeAt","navigator","userAgent","collapsed","startOffset","setEnd","endContainer","setStart","startContainer","getClientRects","zIndex","componentDidMount","componentWillUnmount","componentWillMount","ContextMenu","menuHeight","menu","contextStyle","tableUtils","contextMenuPosition","insertRow","insertColumn","removeRow","removeColumn","Link","generateLinkElement","Image","generateImage","withBlock","listUtils","ListUtils","codeUtils","CodeUtils","TableUtils","blockquoteUtils","BlockquoteUtils","formulaUtils","FormulaUtils","setNodes","_getEventTransfer","getEventTransfer","fragment","html","isUrl","isInCodeBlock","endsWith","img","generateImageElement","insertNodes","isInternalFileLink","decodeURIComponent","SfEditor","isInternalDirLink","dirName","isInTable","pasteContentInTable","isInlist","pasteContentInList","pasteContentInCodeBlock","isInBlockquote","pasteContentInBlockquote","insertText","_Editor$match","_Editor$match2","_slicedToArray","currentBlock","insertFragment","isEmptyParagraph","_fragment","htmlDeserializer","newText","wrapBlockquote","unwrapBlockquote","wrapList","unwrapList","getCurrentListItem","nearestItem","_step","listItems","_iterator","_createForOfIteratorHelper","done","wrapCodeBlock","unwrapCodeBlock","splitNodes","always","anchor","_toConsumableArray","insertTable","removeTable","setAlign","exitTable","insertFormula","withInline","isInline","elementData","wrapNodes","collapse","unwrapNodes","removeNodes","newNodeLink","linkPath","voids","includes","withVoid","isVoid","VOID_ELEMENTS","BOLDITALICREG","BOLDREG","ITALICREG","CODEREG","TextUtils","_editor","getTextInfoBeforeSelection","_Editor$nodes","beforeText","setTextMarkByShortCut","marks","markText","matched","_Editor$node","_Editor$node2","textNode","textPath","lastChart","BOLD","ITALIC","CODE","_objectSpread","selectedPath","SHORTCUTS","withMarkdownShortcut","textUtils","_node","isEnd","_Editor$nodes3","image","imagePath","imageIndex","_Editor$nodes5","Node","_node2","getNodesByTypeAtRange","splitNodesAtPoint","splitCodeLine","_textUtils$getTextInf","_block","_textUtils$getTextInf2","_beforeText","_range","increaseListDepth","_Editor$nodes7","_block2","blockDepth","_Editor$nodes9","listNode","codeBlock","_block3","blockPath","blockNode","normalizeNode","_ref2","previousSibling","currentNodeIndex","mergeNodes","nextSiblings","childPath","Text","isText","TRANSFER_TYPES","setEventTransfer","mime","transfer","dataTransfer","clipboardData","encodedContent","btoa","setData","texts","textItem","getData","Plugin","keyCode","isHotKey","onSave","properties","byKey","richMarkdownEditor","voidNode","anchorPoint","focusPoint","anchorCodeBlock","focusCodeBlock","equals","onCut","onCopy","getSelectedTableCells","codeLine","controlKey","KeyboardShortcuts","renderShortcut","renderContainer","shortcutData","_this$props","toggleShortcutDialog","userHelp","userHelpData","SimpleEditor","isShowContextMenu","o","contentChanged","foucsEditor","editorRef","focusText","focusEnd","onContextMenu","isShowShortcutDialog","withReact","createEditor","deserialize","isShowBigImage","serialize","_this$state","getToolbarStatus","_this$props2","selectionCollapsed","Slate","Editable","renderElement","renderNode","renderLeaf","decorate","decorationNode","ModalPortal","returnObjects","ShortCut","platfrom","shortcutName","ShortCutRight","shortcuts","shortcut","shortcutFirKey","shortcutSecnKey","HelpShortcutList","_super3","shortcutType","dataList","liArr","shortcutKeyArr","UserHelpDialog","_React$PureComponent3","_super4","hideHelpDialog","CommentDialog","handleCommentChange","comment","submitComment","commentPosition","detailJSON","postComment","onCommentAdded","setQuoteText","mdQuote","toggleCommentDialog","ParticipantsList","openDialogs","tooltipToggle","participants","Participant","_React$Component2","toggleAvatarTooltip","showAvatarTooltip","defaultStyle","control","fontWeight","highlighter","overflow","minHeight","borderRadius","overfflowY","outlineOffset","outlineColor","outlineStyle","outlineWidth","suggestions","overflowX","borderBottom","CommentPanel","toggleResolvedComment","showResolvedComment","listComments","isScroll","commentsList","comments","scrollTo","resolveComment","updateComment","deleteComment","editComment","commentID","newComment","listRepoRelatedUsers","showParticipants","relatedUsers","addComment","addParticipant","toBeAddedParticipant","addFileParticipants","onParticipantsChange","checkParticipant","participant","renderUserSuggestion","highlightedDisplay","focused","relistComment","oldTime","CommentItem","scrollToQuote","MentionsInput","Mention","trigger","displayTransform","renderSuggestion","onAdd","appendSpaceOnAdd","clos","rows","warp","toggleDropDownMenu","convertComment","toggleEditComment","editable","resolved","DetailListView","onEditFileTagToggle","onListRelatedFileToggle","bytes","fileTagList","relatedFiles","fileInfo","_this$props$editorApi","serviceUrl","fileTag","tag_color","tag_name","relatedFile","rel","navItem","onOutlineClick","toggleCommentBtn","onMarkdownHintClick","onDetailClick","onCommentsPanelClick","openMarkdownHint","issues","issue_list","outlineActive","commentsPanel","detailList","OutlineView","getDomNodeByPath","querySelector","setBtnPosition","showCommentBtn","timmer","commentbtn","clearTimeout","focusNodePath","focusNode","offsetTop","initialSidePanel","mainPanelWidth","getCookie","scrollToNode","editorContainer","encodeURI","showHelpDialog","isShowHelpDialog","insertRepoImage","onResizeMouseUp","resizeFlag","setCookie","onResizeMouseDown","onResizeMouseMove","movementX","innerWidth","handleCommentOpen","cookie","getQuote","showCommentDialog","ca","ReactEditor","toDOMNode","addLink","isImage","leftNavMode","resetRichValue","collabUsers","ele","is_editing","myself","warning","_this$state2","onResizeMove","mainPanelClass","mainPanelStyle","onMouseMove","onMouseUp","onSelect","lodash","CodeMirror","isFocused","codeMirror","focusChanged","onFocusChange","cursorActivity","cm","onCursorActivity","scrollChanged","getScrollInfo","codemirrorValueChanged","doc","codeMirrorInstance","getCodeMirrorInstance","fromTextArea","textareaNode","on","toTextArea","initialValue","preserveScrollPosition","prevScrollPosition","setValue","editorClassName","PlainMarkdownEditor","leftIsBindScroll","rightIsBindScroll","scrollData","scrollPercentage","leftPanel","rightPanel","updateCode","newCode","onLeftScroll","scrollHeight","onRightScroll","onEnterLeftPanel","onLeaveLeftPanel","onEnterRightPanel","onLeaveRightPanel","onHotKey","isHotkey","lineNumbers","lineWrapping","scrollbarStyle","setContent","throttle","vfile","Prism","highlightAll","typesetPromise","querySelectorAll","SeafileEditor","switchToPlainTextEditor","editorMode","richValue","setEditorMode","initialPlainValue","collabServer","emitSwitchEditor","switchToRichTextEditor","onUnload","confirmationMessage","clearTimer","deleteDraft","returnValue","setDraftValue","onContentChanged","autoSave","autoSaveDraft","saveContent","onSaving","lastModifyTime","getFileInfo","setFileInfoMtime","addParticipants","isParticipant","onRichEditorSave","onPlainEditorSave","resetContentChanged","isEditMode","isDraft","seafileEditor","isTreeDataLoaded","firstNode","RichMarkdownEditor","saving","switchToMarkDownViewer","toggleStar","draftID","SimpleEditorWithErrorBoundary","forceUpdate","SeafileEditorWithErrorBundary","LoadScript","scriptSource","listCacheClear","listCacheDelete","listCacheGet","listCacheHas","listCacheSet","isKeyable","defineProperties","Constructor","protoProps","staticProps","_react","_propTypes","_Component","_temp","getPrototypeOf","_setTargetNode","_targetNode","_getTargetNode","setPrototypeOf","popperManager","setTargetNode","restProps","_extends","_props$component","targetRef","targetProps","componentProps","_popper2","_setArrowNode","_arrowNode","_getOffsets","_isDataDirty","_updateStateModifier","_getPopperStyle","_popper","popper","styles","pointerEvents","_getPopperPlacement","_getPopperHide","_getArrowStyle","arrow","_this$state$data$offs","_handlePopperRef","_popperNode","_createPopper","_destroyPopper","_scheduleUpdate","scheduleUpdate","setArrowNode","getArrowStyle","lastProps","eventsEnabled","applyStyle","updateState","_props2","popperStyle","popperPlacement","popperHide","popperProps","oneOf","placements","arrowRef","arrowStyle","arrowProps","defineMode","cmCfg","modeCfg","htmlMode","getMode","htmlModeMissing","findModeByName","found","mimes","highlightFormatting","maxBlockquoteDepth","taskLists","strikethrough","emoji","fencedCodeBlockHighlighting","fencedCodeBlockDefaultMode","xml","tokenTypeOverrides","tokenTypes","code","list1","list2","list3","imageAltText","imageMarker","formatting","linkInline","linkEmail","linkText","linkHref","em","strong","tokenType","hrRE","listRE","taskListRE","atxHeaderRE","allowAtxHeaderWithoutSpace","setextHeaderRE","textRE","fencedCodeRE","linkDefRE","punctuation","expandedTab","switchInline","stream","switchBlock","lineIsEmpty","blankLine","linkTitle","indentedCode","htmlBlock","innerMode","htmlState","tagStart","tokenize","isInText","inlineNormal","blockNormal","trailingSpace","trailingSpaceNewLine","prevLine","thisLine","firstTokenOnLine","column","indentation","prevLineLineIsEmpty","prevLineIsIndentedCode","prevLineIsHr","prevLineIsList","maxNonCodeIndentation","listStack","lineIndentation","indentationDiff","allowsInlineContinuation","fencedCodeEnd","isHr","skipToEnd","eatSpace","getType","eat","setext","listType","taskList","fencedEndRE","localMode","localState","startState","local","lookAhead","peek","footnoteLink","md_inside","returnType","currListInd","hasExitedList","maxFencedEndInd","taskOpen","taskClosed","listMod","handleText","matchCh","regex","previousFormatting","eatWhile","formattingEscape","atts","backUp","leftFlanking","rightFlanking","setEm","setStrong","retType","getLinkHrefInside","linkRE","endChar","returnState","footnoteLinkInside","footnoteUrl","copyState","indent","textAfter","Pass","blockCommentStart","blockCommentEnd","closeBrackets","fold","defineMIME","mod","modeInfo","ext","alias","findModeByMIME","findModeByExtension","findModeByFileName","filename","dot","baseIsEqualDeep","mapCacheClear","mapCacheDelete","mapCacheGet","mapCacheHas","mapCacheSet","arrayLikeKeys","baseKeys","reIsDeepProp","reIsPlainProp","containerStyle","boxSizing","boxShadow","justifyContent","flexDirection","containerBorderSuccess","borderLeft","containerBorderWarn","containerBorderDanger","containerBorderNotify","toastTextTitle","toastTextChild","toastClose","marginLeft","toastIcon","intent","borderStyle","iconColor","iconClass","toastStyle","getContainerStyle","toastTextContainer","onRemove","animationEasing","openAnimation","keyframes","closeAnimation","animationStyles","alignItems","Toast","isShown","close","clearCloseTimer","startCloseTimer","closeTimer","marginBottom","isRemoveable","hasCloseButton","wrapperClass","hasCustomId","settings","ToastManager","getToasts","toasts","closeAll","toast","startsWith","closeToast","createToastInstance","previousState","uniqueId","idCounter","removeToast","bindNotify","bindGetToasts","bindCloseAll","isBrowser","Toaster","_bindNotify","notifyHandler","_bindGetToasts","getToastsHandler","_bindCloseAll","closeAllHandler","stackClear","stackDelete","stackGet","stackHas","stackSet","arraySome","cacheHas","arrLength","othLength","arrStacked","seen","arrValue","othIndex","baseIsArguments","stubFalse","Buffer","reIsUint","baseIsTypedArray","baseUnary","nodeIsTypedArray","Scatter","Bubble","Polar","Radar","HorizontalBar","Bar","Pie","Doughnut","_isEqual","_keyBy","_typeof","iterator","excluded","sourceKeys","_objectWithoutPropertiesLoose","sourceSymbolKeys","ownKeys","enumerableOnly","symbols","sym","getOwnPropertyDescriptor","_defineProperty","getOwnPropertyDescriptors","_defineProperties","_setPrototypeOf","Derived","hasNativeReflectConstruct","Reflect","sham","Proxy","_isNativeReflectConstruct","Super","_getPrototypeOf","NewTarget","NODE_ENV","ChartComponent","chartInstance","onElementsClick","renderChart","redraw","destroyChart","updateChart","nextData","transformDataProp","shadowDataProp","saveCurrentDatasets","isDev","usingCustomKeyProvider","datasetKeyProvider","getLabelAsKey","multipleDatasets","shouldWarn","getCurrentDatasets","memoizeDataProps","currentDatasets","nextDatasets","checkDatasets","currentDatasetsIndexed","pid","_this$props3","_this$props4","handleOnClick","arrayOf","_default","_React$Component3","_React$Component4","_this6","_ref3","_React$Component5","_super5","_this7","_ref4","_React$Component6","_super6","_this8","_ref5","_React$Component7","_super7","_this9","_ref6","_React$Component8","_super8","_this10","_ref7","_React$Component9","_super9","_this11","_ref8","_React$Component10","_super10","_this12","_ref9"],"mappings":"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","file":"static/js/sysAdmin.chunk.js","sourcesContent":["'use strict';\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.Arrow = exports.Popper = exports.Target = exports.Manager = undefined;\n\nvar _Manager2 = require('./Manager');\n\nvar _Manager3 = _interopRequireDefault(_Manager2);\n\nvar _Target2 = require('./Target');\n\nvar _Target3 = _interopRequireDefault(_Target2);\n\nvar _Popper2 = require('./Popper');\n\nvar _Popper3 = _interopRequireDefault(_Popper2);\n\nvar _Arrow2 = require('./Arrow');\n\nvar _Arrow3 = _interopRequireDefault(_Arrow2);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.Manager = _Manager3.default;\nexports.Target = _Target3.default;\nexports.Popper = _Popper3.default;\nexports.Arrow = _Arrow3.default;","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Button, Modal, ModalHeader, Input, ModalBody, ModalFooter, Form, FormGroup, Label, Alert } from 'reactstrap';\nimport { gettext } from '../../utils/constants';\nimport { Utils } from '../../utils/utils';\n\nconst propTypes = {\n  fileType: PropTypes.string,\n  parentPath: PropTypes.string.isRequired,\n  onAddFolder: PropTypes.func.isRequired,\n  checkDuplicatedName: PropTypes.func.isRequired,\n  addFolderCancel: PropTypes.func.isRequired,\n};\n\nclass CreateForder extends React.Component {\n  constructor(props) {\n    super(props);\n    this.state = {\n      parentPath: '',\n      childName: '',\n      errMessage: '',\n      isSubmitBtnActive: false,\n    };\n    this.newInput = React.createRef();\n  }\n\n  componentDidMount() {\n    let parentPath = this.props.parentPath;\n    if (parentPath[parentPath.length - 1] === '/') {  // mainPanel\n      this.setState({parentPath: parentPath});\n    } else {\n      this.setState({parentPath: parentPath + '/'}); // sidePanel\n    }\n    this.newInput.focus();\n    this.newInput.setSelectionRange(0,0);\n  }\n\n  handleChange = (e) => {\n    if (!e.target.value.trim()) {\n      this.setState({isSubmitBtnActive: false});\n    } else {\n      this.setState({isSubmitBtnActive: true});\n    }\n\n    this.setState({childName: e.target.value});\n  }\n\n  handleSubmit = () => {\n    if (!this.state.isSubmitBtnActive) {\n      return;\n    }\n\n    let newName = this.state.childName;\n    let isDuplicated = this.checkDuplicatedName();\n\n    if (isDuplicated) {\n      let errMessage = gettext('The name \"{name}\" is already taken. Please choose a different name.');\n      errMessage = errMessage.replace('{name}', Utils.HTMLescape(newName));\n      this.setState({errMessage: errMessage});\n    } else {\n      let path = this.state.parentPath + newName;\n      this.props.onAddFolder(path);\n    }\n  }\n\n  handleKeyPress = (e) => {\n    if (e.key === 'Enter') {\n      this.handleSubmit();\n      e.preventDefault();\n    }\n  }\n\n  toggle = () => {\n    this.props.addFolderCancel();\n  }\n\n  checkDuplicatedName = () => {\n    let isDuplicated = this.props.checkDuplicatedName(this.state.childName);\n    return isDuplicated;\n  }\n\n  render() {\n    return (\n      <Modal isOpen={true} toggle={this.toggle}>\n        <ModalHeader toggle={this.toggle}>{gettext('New Folder')}</ModalHeader>\n        <ModalBody>\n          <Form>\n            <FormGroup>\n              <Label for=\"folderName\">{gettext('Name')}</Label>\n              <Input\n                id=\"folderName\"\n                value={this.state.childName}\n                innerRef={input => {this.newInput = input;}}\n                onKeyPress={this.handleKeyPress}\n                onChange={this.handleChange}\n              />\n            </FormGroup>\n          </Form>\n          {this.state.errMessage && <Alert color=\"danger\" className=\"mt-2\">{this.state.errMessage}</Alert>}\n        </ModalBody>\n        <ModalFooter>\n          <Button color=\"secondary\" onClick={this.toggle}>{gettext('Cancel')}</Button>\n          <Button color=\"primary\" onClick={this.handleSubmit} disabled={!this.state.isSubmitBtnActive}>{gettext('Submit')}</Button>\n        </ModalFooter>\n      </Modal>\n    );\n  }\n}\n\nCreateForder.propTypes = propTypes;\n\nexport default CreateForder;\n","/*!\n * Chart.js v2.9.4\n * https://www.chartjs.org\n * (c) 2020 Chart.js Contributors\n * Released under the MIT License\n */\n(function (global, factory) {\ntypeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(function() { try { return require('moment'); } catch(e) { } }()) :\ntypeof define === 'function' && define.amd ? define(['require'], function(require) { return factory(function() { try { return require('moment'); } catch(e) { } }()); }) :\n(global = global || self, global.Chart = factory(global.moment));\n}(this, (function (moment) { 'use strict';\n\nmoment = moment && moment.hasOwnProperty('default') ? moment['default'] : moment;\n\nfunction createCommonjsModule(fn, module) {\n\treturn module = { exports: {} }, fn(module, module.exports), module.exports;\n}\n\nfunction getCjsExportFromNamespace (n) {\n\treturn n && n['default'] || n;\n}\n\nvar colorName = {\r\n\t\"aliceblue\": [240, 248, 255],\r\n\t\"antiquewhite\": [250, 235, 215],\r\n\t\"aqua\": [0, 255, 255],\r\n\t\"aquamarine\": [127, 255, 212],\r\n\t\"azure\": [240, 255, 255],\r\n\t\"beige\": [245, 245, 220],\r\n\t\"bisque\": [255, 228, 196],\r\n\t\"black\": [0, 0, 0],\r\n\t\"blanchedalmond\": [255, 235, 205],\r\n\t\"blue\": [0, 0, 255],\r\n\t\"blueviolet\": [138, 43, 226],\r\n\t\"brown\": [165, 42, 42],\r\n\t\"burlywood\": [222, 184, 135],\r\n\t\"cadetblue\": [95, 158, 160],\r\n\t\"chartreuse\": [127, 255, 0],\r\n\t\"chocolate\": [210, 105, 30],\r\n\t\"coral\": [255, 127, 80],\r\n\t\"cornflowerblue\": [100, 149, 237],\r\n\t\"cornsilk\": [255, 248, 220],\r\n\t\"crimson\": [220, 20, 60],\r\n\t\"cyan\": [0, 255, 255],\r\n\t\"darkblue\": [0, 0, 139],\r\n\t\"darkcyan\": [0, 139, 139],\r\n\t\"darkgoldenrod\": [184, 134, 11],\r\n\t\"darkgray\": [169, 169, 169],\r\n\t\"darkgreen\": [0, 100, 0],\r\n\t\"darkgrey\": [169, 169, 169],\r\n\t\"darkkhaki\": [189, 183, 107],\r\n\t\"darkmagenta\": [139, 0, 139],\r\n\t\"darkolivegreen\": [85, 107, 47],\r\n\t\"darkorange\": [255, 140, 0],\r\n\t\"darkorchid\": [153, 50, 204],\r\n\t\"darkred\": [139, 0, 0],\r\n\t\"darksalmon\": [233, 150, 122],\r\n\t\"darkseagreen\": [143, 188, 143],\r\n\t\"darkslateblue\": [72, 61, 139],\r\n\t\"darkslategray\": [47, 79, 79],\r\n\t\"darkslategrey\": [47, 79, 79],\r\n\t\"darkturquoise\": [0, 206, 209],\r\n\t\"darkviolet\": [148, 0, 211],\r\n\t\"deeppink\": [255, 20, 147],\r\n\t\"deepskyblue\": [0, 191, 255],\r\n\t\"dimgray\": [105, 105, 105],\r\n\t\"dimgrey\": [105, 105, 105],\r\n\t\"dodgerblue\": [30, 144, 255],\r\n\t\"firebrick\": [178, 34, 34],\r\n\t\"floralwhite\": [255, 250, 240],\r\n\t\"forestgreen\": [34, 139, 34],\r\n\t\"fuchsia\": [255, 0, 255],\r\n\t\"gainsboro\": [220, 220, 220],\r\n\t\"ghostwhite\": [248, 248, 255],\r\n\t\"gold\": [255, 215, 0],\r\n\t\"goldenrod\": [218, 165, 32],\r\n\t\"gray\": [128, 128, 128],\r\n\t\"green\": [0, 128, 0],\r\n\t\"greenyellow\": [173, 255, 47],\r\n\t\"grey\": [128, 128, 128],\r\n\t\"honeydew\": [240, 255, 240],\r\n\t\"hotpink\": [255, 105, 180],\r\n\t\"indianred\": [205, 92, 92],\r\n\t\"indigo\": [75, 0, 130],\r\n\t\"ivory\": [255, 255, 240],\r\n\t\"khaki\": [240, 230, 140],\r\n\t\"lavender\": [230, 230, 250],\r\n\t\"lavenderblush\": [255, 240, 245],\r\n\t\"lawngreen\": [124, 252, 0],\r\n\t\"lemonchiffon\": [255, 250, 205],\r\n\t\"lightblue\": [173, 216, 230],\r\n\t\"lightcoral\": [240, 128, 128],\r\n\t\"lightcyan\": [224, 255, 255],\r\n\t\"lightgoldenrodyellow\": [250, 250, 210],\r\n\t\"lightgray\": [211, 211, 211],\r\n\t\"lightgreen\": [144, 238, 144],\r\n\t\"lightgrey\": [211, 211, 211],\r\n\t\"lightpink\": [255, 182, 193],\r\n\t\"lightsalmon\": [255, 160, 122],\r\n\t\"lightseagreen\": [32, 178, 170],\r\n\t\"lightskyblue\": [135, 206, 250],\r\n\t\"lightslategray\": [119, 136, 153],\r\n\t\"lightslategrey\": [119, 136, 153],\r\n\t\"lightsteelblue\": [176, 196, 222],\r\n\t\"lightyellow\": [255, 255, 224],\r\n\t\"lime\": [0, 255, 0],\r\n\t\"limegreen\": [50, 205, 50],\r\n\t\"linen\": [250, 240, 230],\r\n\t\"magenta\": [255, 0, 255],\r\n\t\"maroon\": [128, 0, 0],\r\n\t\"mediumaquamarine\": [102, 205, 170],\r\n\t\"mediumblue\": [0, 0, 205],\r\n\t\"mediumorchid\": [186, 85, 211],\r\n\t\"mediumpurple\": [147, 112, 219],\r\n\t\"mediumseagreen\": [60, 179, 113],\r\n\t\"mediumslateblue\": [123, 104, 238],\r\n\t\"mediumspringgreen\": [0, 250, 154],\r\n\t\"mediumturquoise\": [72, 209, 204],\r\n\t\"mediumvioletred\": [199, 21, 133],\r\n\t\"midnightblue\": [25, 25, 112],\r\n\t\"mintcream\": [245, 255, 250],\r\n\t\"mistyrose\": [255, 228, 225],\r\n\t\"moccasin\": [255, 228, 181],\r\n\t\"navajowhite\": [255, 222, 173],\r\n\t\"navy\": [0, 0, 128],\r\n\t\"oldlace\": [253, 245, 230],\r\n\t\"olive\": [128, 128, 0],\r\n\t\"olivedrab\": [107, 142, 35],\r\n\t\"orange\": [255, 165, 0],\r\n\t\"orangered\": [255, 69, 0],\r\n\t\"orchid\": [218, 112, 214],\r\n\t\"palegoldenrod\": [238, 232, 170],\r\n\t\"palegreen\": [152, 251, 152],\r\n\t\"paleturquoise\": [175, 238, 238],\r\n\t\"palevioletred\": [219, 112, 147],\r\n\t\"papayawhip\": [255, 239, 213],\r\n\t\"peachpuff\": [255, 218, 185],\r\n\t\"peru\": [205, 133, 63],\r\n\t\"pink\": [255, 192, 203],\r\n\t\"plum\": [221, 160, 221],\r\n\t\"powderblue\": [176, 224, 230],\r\n\t\"purple\": [128, 0, 128],\r\n\t\"rebeccapurple\": [102, 51, 153],\r\n\t\"red\": [255, 0, 0],\r\n\t\"rosybrown\": [188, 143, 143],\r\n\t\"royalblue\": [65, 105, 225],\r\n\t\"saddlebrown\": [139, 69, 19],\r\n\t\"salmon\": [250, 128, 114],\r\n\t\"sandybrown\": [244, 164, 96],\r\n\t\"seagreen\": [46, 139, 87],\r\n\t\"seashell\": [255, 245, 238],\r\n\t\"sienna\": [160, 82, 45],\r\n\t\"silver\": [192, 192, 192],\r\n\t\"skyblue\": [135, 206, 235],\r\n\t\"slateblue\": [106, 90, 205],\r\n\t\"slategray\": [112, 128, 144],\r\n\t\"slategrey\": [112, 128, 144],\r\n\t\"snow\": [255, 250, 250],\r\n\t\"springgreen\": [0, 255, 127],\r\n\t\"steelblue\": [70, 130, 180],\r\n\t\"tan\": [210, 180, 140],\r\n\t\"teal\": [0, 128, 128],\r\n\t\"thistle\": [216, 191, 216],\r\n\t\"tomato\": [255, 99, 71],\r\n\t\"turquoise\": [64, 224, 208],\r\n\t\"violet\": [238, 130, 238],\r\n\t\"wheat\": [245, 222, 179],\r\n\t\"white\": [255, 255, 255],\r\n\t\"whitesmoke\": [245, 245, 245],\r\n\t\"yellow\": [255, 255, 0],\r\n\t\"yellowgreen\": [154, 205, 50]\r\n};\n\nvar conversions = createCommonjsModule(function (module) {\n/* MIT license */\n\n\n// NOTE: conversions should only return primitive values (i.e. arrays, or\n//       values that give correct `typeof` results).\n//       do not use box values types (i.e. Number(), String(), etc.)\n\nvar reverseKeywords = {};\nfor (var key in colorName) {\n\tif (colorName.hasOwnProperty(key)) {\n\t\treverseKeywords[colorName[key]] = key;\n\t}\n}\n\nvar convert = module.exports = {\n\trgb: {channels: 3, labels: 'rgb'},\n\thsl: {channels: 3, labels: 'hsl'},\n\thsv: {channels: 3, labels: 'hsv'},\n\thwb: {channels: 3, labels: 'hwb'},\n\tcmyk: {channels: 4, labels: 'cmyk'},\n\txyz: {channels: 3, labels: 'xyz'},\n\tlab: {channels: 3, labels: 'lab'},\n\tlch: {channels: 3, labels: 'lch'},\n\thex: {channels: 1, labels: ['hex']},\n\tkeyword: {channels: 1, labels: ['keyword']},\n\tansi16: {channels: 1, labels: ['ansi16']},\n\tansi256: {channels: 1, labels: ['ansi256']},\n\thcg: {channels: 3, labels: ['h', 'c', 'g']},\n\tapple: {channels: 3, labels: ['r16', 'g16', 'b16']},\n\tgray: {channels: 1, labels: ['gray']}\n};\n\n// hide .channels and .labels properties\nfor (var model in convert) {\n\tif (convert.hasOwnProperty(model)) {\n\t\tif (!('channels' in convert[model])) {\n\t\t\tthrow new Error('missing channels property: ' + model);\n\t\t}\n\n\t\tif (!('labels' in convert[model])) {\n\t\t\tthrow new Error('missing channel labels property: ' + model);\n\t\t}\n\n\t\tif (convert[model].labels.length !== convert[model].channels) {\n\t\t\tthrow new Error('channel and label counts mismatch: ' + model);\n\t\t}\n\n\t\tvar channels = convert[model].channels;\n\t\tvar labels = convert[model].labels;\n\t\tdelete convert[model].channels;\n\t\tdelete convert[model].labels;\n\t\tObject.defineProperty(convert[model], 'channels', {value: channels});\n\t\tObject.defineProperty(convert[model], 'labels', {value: labels});\n\t}\n}\n\nconvert.rgb.hsl = function (rgb) {\n\tvar r = rgb[0] / 255;\n\tvar g = rgb[1] / 255;\n\tvar b = rgb[2] / 255;\n\tvar min = Math.min(r, g, b);\n\tvar max = Math.max(r, g, b);\n\tvar delta = max - min;\n\tvar h;\n\tvar s;\n\tvar l;\n\n\tif (max === min) {\n\t\th = 0;\n\t} else if (r === max) {\n\t\th = (g - b) / delta;\n\t} else if (g === max) {\n\t\th = 2 + (b - r) / delta;\n\t} else if (b === max) {\n\t\th = 4 + (r - g) / delta;\n\t}\n\n\th = Math.min(h * 60, 360);\n\n\tif (h < 0) {\n\t\th += 360;\n\t}\n\n\tl = (min + max) / 2;\n\n\tif (max === min) {\n\t\ts = 0;\n\t} else if (l <= 0.5) {\n\t\ts = delta / (max + min);\n\t} else {\n\t\ts = delta / (2 - max - min);\n\t}\n\n\treturn [h, s * 100, l * 100];\n};\n\nconvert.rgb.hsv = function (rgb) {\n\tvar rdif;\n\tvar gdif;\n\tvar bdif;\n\tvar h;\n\tvar s;\n\n\tvar r = rgb[0] / 255;\n\tvar g = rgb[1] / 255;\n\tvar b = rgb[2] / 255;\n\tvar v = Math.max(r, g, b);\n\tvar diff = v - Math.min(r, g, b);\n\tvar diffc = function (c) {\n\t\treturn (v - c) / 6 / diff + 1 / 2;\n\t};\n\n\tif (diff === 0) {\n\t\th = s = 0;\n\t} else {\n\t\ts = diff / v;\n\t\trdif = diffc(r);\n\t\tgdif = diffc(g);\n\t\tbdif = diffc(b);\n\n\t\tif (r === v) {\n\t\t\th = bdif - gdif;\n\t\t} else if (g === v) {\n\t\t\th = (1 / 3) + rdif - bdif;\n\t\t} else if (b === v) {\n\t\t\th = (2 / 3) + gdif - rdif;\n\t\t}\n\t\tif (h < 0) {\n\t\t\th += 1;\n\t\t} else if (h > 1) {\n\t\t\th -= 1;\n\t\t}\n\t}\n\n\treturn [\n\t\th * 360,\n\t\ts * 100,\n\t\tv * 100\n\t];\n};\n\nconvert.rgb.hwb = function (rgb) {\n\tvar r = rgb[0];\n\tvar g = rgb[1];\n\tvar b = rgb[2];\n\tvar h = convert.rgb.hsl(rgb)[0];\n\tvar w = 1 / 255 * Math.min(r, Math.min(g, b));\n\n\tb = 1 - 1 / 255 * Math.max(r, Math.max(g, b));\n\n\treturn [h, w * 100, b * 100];\n};\n\nconvert.rgb.cmyk = function (rgb) {\n\tvar r = rgb[0] / 255;\n\tvar g = rgb[1] / 255;\n\tvar b = rgb[2] / 255;\n\tvar c;\n\tvar m;\n\tvar y;\n\tvar k;\n\n\tk = Math.min(1 - r, 1 - g, 1 - b);\n\tc = (1 - r - k) / (1 - k) || 0;\n\tm = (1 - g - k) / (1 - k) || 0;\n\ty = (1 - b - k) / (1 - k) || 0;\n\n\treturn [c * 100, m * 100, y * 100, k * 100];\n};\n\n/**\n * See https://en.m.wikipedia.org/wiki/Euclidean_distance#Squared_Euclidean_distance\n * */\nfunction comparativeDistance(x, y) {\n\treturn (\n\t\tMath.pow(x[0] - y[0], 2) +\n\t\tMath.pow(x[1] - y[1], 2) +\n\t\tMath.pow(x[2] - y[2], 2)\n\t);\n}\n\nconvert.rgb.keyword = function (rgb) {\n\tvar reversed = reverseKeywords[rgb];\n\tif (reversed) {\n\t\treturn reversed;\n\t}\n\n\tvar currentClosestDistance = Infinity;\n\tvar currentClosestKeyword;\n\n\tfor (var keyword in colorName) {\n\t\tif (colorName.hasOwnProperty(keyword)) {\n\t\t\tvar value = colorName[keyword];\n\n\t\t\t// Compute comparative distance\n\t\t\tvar distance = comparativeDistance(rgb, value);\n\n\t\t\t// Check if its less, if so set as closest\n\t\t\tif (distance < currentClosestDistance) {\n\t\t\t\tcurrentClosestDistance = distance;\n\t\t\t\tcurrentClosestKeyword = keyword;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn currentClosestKeyword;\n};\n\nconvert.keyword.rgb = function (keyword) {\n\treturn colorName[keyword];\n};\n\nconvert.rgb.xyz = function (rgb) {\n\tvar r = rgb[0] / 255;\n\tvar g = rgb[1] / 255;\n\tvar b = rgb[2] / 255;\n\n\t// assume sRGB\n\tr = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92);\n\tg = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92);\n\tb = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92);\n\n\tvar x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805);\n\tvar y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722);\n\tvar z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505);\n\n\treturn [x * 100, y * 100, z * 100];\n};\n\nconvert.rgb.lab = function (rgb) {\n\tvar xyz = convert.rgb.xyz(rgb);\n\tvar x = xyz[0];\n\tvar y = xyz[1];\n\tvar z = xyz[2];\n\tvar l;\n\tvar a;\n\tvar b;\n\n\tx /= 95.047;\n\ty /= 100;\n\tz /= 108.883;\n\n\tx = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116);\n\ty = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116);\n\tz = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116);\n\n\tl = (116 * y) - 16;\n\ta = 500 * (x - y);\n\tb = 200 * (y - z);\n\n\treturn [l, a, b];\n};\n\nconvert.hsl.rgb = function (hsl) {\n\tvar h = hsl[0] / 360;\n\tvar s = hsl[1] / 100;\n\tvar l = hsl[2] / 100;\n\tvar t1;\n\tvar t2;\n\tvar t3;\n\tvar rgb;\n\tvar val;\n\n\tif (s === 0) {\n\t\tval = l * 255;\n\t\treturn [val, val, val];\n\t}\n\n\tif (l < 0.5) {\n\t\tt2 = l * (1 + s);\n\t} else {\n\t\tt2 = l + s - l * s;\n\t}\n\n\tt1 = 2 * l - t2;\n\n\trgb = [0, 0, 0];\n\tfor (var i = 0; i < 3; i++) {\n\t\tt3 = h + 1 / 3 * -(i - 1);\n\t\tif (t3 < 0) {\n\t\t\tt3++;\n\t\t}\n\t\tif (t3 > 1) {\n\t\t\tt3--;\n\t\t}\n\n\t\tif (6 * t3 < 1) {\n\t\t\tval = t1 + (t2 - t1) * 6 * t3;\n\t\t} else if (2 * t3 < 1) {\n\t\t\tval = t2;\n\t\t} else if (3 * t3 < 2) {\n\t\t\tval = t1 + (t2 - t1) * (2 / 3 - t3) * 6;\n\t\t} else {\n\t\t\tval = t1;\n\t\t}\n\n\t\trgb[i] = val * 255;\n\t}\n\n\treturn rgb;\n};\n\nconvert.hsl.hsv = function (hsl) {\n\tvar h = hsl[0];\n\tvar s = hsl[1] / 100;\n\tvar l = hsl[2] / 100;\n\tvar smin = s;\n\tvar lmin = Math.max(l, 0.01);\n\tvar sv;\n\tvar v;\n\n\tl *= 2;\n\ts *= (l <= 1) ? l : 2 - l;\n\tsmin *= lmin <= 1 ? lmin : 2 - lmin;\n\tv = (l + s) / 2;\n\tsv = l === 0 ? (2 * smin) / (lmin + smin) : (2 * s) / (l + s);\n\n\treturn [h, sv * 100, v * 100];\n};\n\nconvert.hsv.rgb = function (hsv) {\n\tvar h = hsv[0] / 60;\n\tvar s = hsv[1] / 100;\n\tvar v = hsv[2] / 100;\n\tvar hi = Math.floor(h) % 6;\n\n\tvar f = h - Math.floor(h);\n\tvar p = 255 * v * (1 - s);\n\tvar q = 255 * v * (1 - (s * f));\n\tvar t = 255 * v * (1 - (s * (1 - f)));\n\tv *= 255;\n\n\tswitch (hi) {\n\t\tcase 0:\n\t\t\treturn [v, t, p];\n\t\tcase 1:\n\t\t\treturn [q, v, p];\n\t\tcase 2:\n\t\t\treturn [p, v, t];\n\t\tcase 3:\n\t\t\treturn [p, q, v];\n\t\tcase 4:\n\t\t\treturn [t, p, v];\n\t\tcase 5:\n\t\t\treturn [v, p, q];\n\t}\n};\n\nconvert.hsv.hsl = function (hsv) {\n\tvar h = hsv[0];\n\tvar s = hsv[1] / 100;\n\tvar v = hsv[2] / 100;\n\tvar vmin = Math.max(v, 0.01);\n\tvar lmin;\n\tvar sl;\n\tvar l;\n\n\tl = (2 - s) * v;\n\tlmin = (2 - s) * vmin;\n\tsl = s * vmin;\n\tsl /= (lmin <= 1) ? lmin : 2 - lmin;\n\tsl = sl || 0;\n\tl /= 2;\n\n\treturn [h, sl * 100, l * 100];\n};\n\n// http://dev.w3.org/csswg/css-color/#hwb-to-rgb\nconvert.hwb.rgb = function (hwb) {\n\tvar h = hwb[0] / 360;\n\tvar wh = hwb[1] / 100;\n\tvar bl = hwb[2] / 100;\n\tvar ratio = wh + bl;\n\tvar i;\n\tvar v;\n\tvar f;\n\tvar n;\n\n\t// wh + bl cant be > 1\n\tif (ratio > 1) {\n\t\twh /= ratio;\n\t\tbl /= ratio;\n\t}\n\n\ti = Math.floor(6 * h);\n\tv = 1 - bl;\n\tf = 6 * h - i;\n\n\tif ((i & 0x01) !== 0) {\n\t\tf = 1 - f;\n\t}\n\n\tn = wh + f * (v - wh); // linear interpolation\n\n\tvar r;\n\tvar g;\n\tvar b;\n\tswitch (i) {\n\t\tdefault:\n\t\tcase 6:\n\t\tcase 0: r = v; g = n; b = wh; break;\n\t\tcase 1: r = n; g = v; b = wh; break;\n\t\tcase 2: r = wh; g = v; b = n; break;\n\t\tcase 3: r = wh; g = n; b = v; break;\n\t\tcase 4: r = n; g = wh; b = v; break;\n\t\tcase 5: r = v; g = wh; b = n; break;\n\t}\n\n\treturn [r * 255, g * 255, b * 255];\n};\n\nconvert.cmyk.rgb = function (cmyk) {\n\tvar c = cmyk[0] / 100;\n\tvar m = cmyk[1] / 100;\n\tvar y = cmyk[2] / 100;\n\tvar k = cmyk[3] / 100;\n\tvar r;\n\tvar g;\n\tvar b;\n\n\tr = 1 - Math.min(1, c * (1 - k) + k);\n\tg = 1 - Math.min(1, m * (1 - k) + k);\n\tb = 1 - Math.min(1, y * (1 - k) + k);\n\n\treturn [r * 255, g * 255, b * 255];\n};\n\nconvert.xyz.rgb = function (xyz) {\n\tvar x = xyz[0] / 100;\n\tvar y = xyz[1] / 100;\n\tvar z = xyz[2] / 100;\n\tvar r;\n\tvar g;\n\tvar b;\n\n\tr = (x * 3.2406) + (y * -1.5372) + (z * -0.4986);\n\tg = (x * -0.9689) + (y * 1.8758) + (z * 0.0415);\n\tb = (x * 0.0557) + (y * -0.2040) + (z * 1.0570);\n\n\t// assume sRGB\n\tr = r > 0.0031308\n\t\t? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055)\n\t\t: r * 12.92;\n\n\tg = g > 0.0031308\n\t\t? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055)\n\t\t: g * 12.92;\n\n\tb = b > 0.0031308\n\t\t? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055)\n\t\t: b * 12.92;\n\n\tr = Math.min(Math.max(0, r), 1);\n\tg = Math.min(Math.max(0, g), 1);\n\tb = Math.min(Math.max(0, b), 1);\n\n\treturn [r * 255, g * 255, b * 255];\n};\n\nconvert.xyz.lab = function (xyz) {\n\tvar x = xyz[0];\n\tvar y = xyz[1];\n\tvar z = xyz[2];\n\tvar l;\n\tvar a;\n\tvar b;\n\n\tx /= 95.047;\n\ty /= 100;\n\tz /= 108.883;\n\n\tx = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116);\n\ty = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116);\n\tz = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116);\n\n\tl = (116 * y) - 16;\n\ta = 500 * (x - y);\n\tb = 200 * (y - z);\n\n\treturn [l, a, b];\n};\n\nconvert.lab.xyz = function (lab) {\n\tvar l = lab[0];\n\tvar a = lab[1];\n\tvar b = lab[2];\n\tvar x;\n\tvar y;\n\tvar z;\n\n\ty = (l + 16) / 116;\n\tx = a / 500 + y;\n\tz = y - b / 200;\n\n\tvar y2 = Math.pow(y, 3);\n\tvar x2 = Math.pow(x, 3);\n\tvar z2 = Math.pow(z, 3);\n\ty = y2 > 0.008856 ? y2 : (y - 16 / 116) / 7.787;\n\tx = x2 > 0.008856 ? x2 : (x - 16 / 116) / 7.787;\n\tz = z2 > 0.008856 ? z2 : (z - 16 / 116) / 7.787;\n\n\tx *= 95.047;\n\ty *= 100;\n\tz *= 108.883;\n\n\treturn [x, y, z];\n};\n\nconvert.lab.lch = function (lab) {\n\tvar l = lab[0];\n\tvar a = lab[1];\n\tvar b = lab[2];\n\tvar hr;\n\tvar h;\n\tvar c;\n\n\thr = Math.atan2(b, a);\n\th = hr * 360 / 2 / Math.PI;\n\n\tif (h < 0) {\n\t\th += 360;\n\t}\n\n\tc = Math.sqrt(a * a + b * b);\n\n\treturn [l, c, h];\n};\n\nconvert.lch.lab = function (lch) {\n\tvar l = lch[0];\n\tvar c = lch[1];\n\tvar h = lch[2];\n\tvar a;\n\tvar b;\n\tvar hr;\n\n\thr = h / 360 * 2 * Math.PI;\n\ta = c * Math.cos(hr);\n\tb = c * Math.sin(hr);\n\n\treturn [l, a, b];\n};\n\nconvert.rgb.ansi16 = function (args) {\n\tvar r = args[0];\n\tvar g = args[1];\n\tvar b = args[2];\n\tvar value = 1 in arguments ? arguments[1] : convert.rgb.hsv(args)[2]; // hsv -> ansi16 optimization\n\n\tvalue = Math.round(value / 50);\n\n\tif (value === 0) {\n\t\treturn 30;\n\t}\n\n\tvar ansi = 30\n\t\t+ ((Math.round(b / 255) << 2)\n\t\t| (Math.round(g / 255) << 1)\n\t\t| Math.round(r / 255));\n\n\tif (value === 2) {\n\t\tansi += 60;\n\t}\n\n\treturn ansi;\n};\n\nconvert.hsv.ansi16 = function (args) {\n\t// optimization here; we already know the value and don't need to get\n\t// it converted for us.\n\treturn convert.rgb.ansi16(convert.hsv.rgb(args), args[2]);\n};\n\nconvert.rgb.ansi256 = function (args) {\n\tvar r = args[0];\n\tvar g = args[1];\n\tvar b = args[2];\n\n\t// we use the extended greyscale palette here, with the exception of\n\t// black and white. normal palette only has 4 greyscale shades.\n\tif (r === g && g === b) {\n\t\tif (r < 8) {\n\t\t\treturn 16;\n\t\t}\n\n\t\tif (r > 248) {\n\t\t\treturn 231;\n\t\t}\n\n\t\treturn Math.round(((r - 8) / 247) * 24) + 232;\n\t}\n\n\tvar ansi = 16\n\t\t+ (36 * Math.round(r / 255 * 5))\n\t\t+ (6 * Math.round(g / 255 * 5))\n\t\t+ Math.round(b / 255 * 5);\n\n\treturn ansi;\n};\n\nconvert.ansi16.rgb = function (args) {\n\tvar color = args % 10;\n\n\t// handle greyscale\n\tif (color === 0 || color === 7) {\n\t\tif (args > 50) {\n\t\t\tcolor += 3.5;\n\t\t}\n\n\t\tcolor = color / 10.5 * 255;\n\n\t\treturn [color, color, color];\n\t}\n\n\tvar mult = (~~(args > 50) + 1) * 0.5;\n\tvar r = ((color & 1) * mult) * 255;\n\tvar g = (((color >> 1) & 1) * mult) * 255;\n\tvar b = (((color >> 2) & 1) * mult) * 255;\n\n\treturn [r, g, b];\n};\n\nconvert.ansi256.rgb = function (args) {\n\t// handle greyscale\n\tif (args >= 232) {\n\t\tvar c = (args - 232) * 10 + 8;\n\t\treturn [c, c, c];\n\t}\n\n\targs -= 16;\n\n\tvar rem;\n\tvar r = Math.floor(args / 36) / 5 * 255;\n\tvar g = Math.floor((rem = args % 36) / 6) / 5 * 255;\n\tvar b = (rem % 6) / 5 * 255;\n\n\treturn [r, g, b];\n};\n\nconvert.rgb.hex = function (args) {\n\tvar integer = ((Math.round(args[0]) & 0xFF) << 16)\n\t\t+ ((Math.round(args[1]) & 0xFF) << 8)\n\t\t+ (Math.round(args[2]) & 0xFF);\n\n\tvar string = integer.toString(16).toUpperCase();\n\treturn '000000'.substring(string.length) + string;\n};\n\nconvert.hex.rgb = function (args) {\n\tvar match = args.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);\n\tif (!match) {\n\t\treturn [0, 0, 0];\n\t}\n\n\tvar colorString = match[0];\n\n\tif (match[0].length === 3) {\n\t\tcolorString = colorString.split('').map(function (char) {\n\t\t\treturn char + char;\n\t\t}).join('');\n\t}\n\n\tvar integer = parseInt(colorString, 16);\n\tvar r = (integer >> 16) & 0xFF;\n\tvar g = (integer >> 8) & 0xFF;\n\tvar b = integer & 0xFF;\n\n\treturn [r, g, b];\n};\n\nconvert.rgb.hcg = function (rgb) {\n\tvar r = rgb[0] / 255;\n\tvar g = rgb[1] / 255;\n\tvar b = rgb[2] / 255;\n\tvar max = Math.max(Math.max(r, g), b);\n\tvar min = Math.min(Math.min(r, g), b);\n\tvar chroma = (max - min);\n\tvar grayscale;\n\tvar hue;\n\n\tif (chroma < 1) {\n\t\tgrayscale = min / (1 - chroma);\n\t} else {\n\t\tgrayscale = 0;\n\t}\n\n\tif (chroma <= 0) {\n\t\thue = 0;\n\t} else\n\tif (max === r) {\n\t\thue = ((g - b) / chroma) % 6;\n\t} else\n\tif (max === g) {\n\t\thue = 2 + (b - r) / chroma;\n\t} else {\n\t\thue = 4 + (r - g) / chroma + 4;\n\t}\n\n\thue /= 6;\n\thue %= 1;\n\n\treturn [hue * 360, chroma * 100, grayscale * 100];\n};\n\nconvert.hsl.hcg = function (hsl) {\n\tvar s = hsl[1] / 100;\n\tvar l = hsl[2] / 100;\n\tvar c = 1;\n\tvar f = 0;\n\n\tif (l < 0.5) {\n\t\tc = 2.0 * s * l;\n\t} else {\n\t\tc = 2.0 * s * (1.0 - l);\n\t}\n\n\tif (c < 1.0) {\n\t\tf = (l - 0.5 * c) / (1.0 - c);\n\t}\n\n\treturn [hsl[0], c * 100, f * 100];\n};\n\nconvert.hsv.hcg = function (hsv) {\n\tvar s = hsv[1] / 100;\n\tvar v = hsv[2] / 100;\n\n\tvar c = s * v;\n\tvar f = 0;\n\n\tif (c < 1.0) {\n\t\tf = (v - c) / (1 - c);\n\t}\n\n\treturn [hsv[0], c * 100, f * 100];\n};\n\nconvert.hcg.rgb = function (hcg) {\n\tvar h = hcg[0] / 360;\n\tvar c = hcg[1] / 100;\n\tvar g = hcg[2] / 100;\n\n\tif (c === 0.0) {\n\t\treturn [g * 255, g * 255, g * 255];\n\t}\n\n\tvar pure = [0, 0, 0];\n\tvar hi = (h % 1) * 6;\n\tvar v = hi % 1;\n\tvar w = 1 - v;\n\tvar mg = 0;\n\n\tswitch (Math.floor(hi)) {\n\t\tcase 0:\n\t\t\tpure[0] = 1; pure[1] = v; pure[2] = 0; break;\n\t\tcase 1:\n\t\t\tpure[0] = w; pure[1] = 1; pure[2] = 0; break;\n\t\tcase 2:\n\t\t\tpure[0] = 0; pure[1] = 1; pure[2] = v; break;\n\t\tcase 3:\n\t\t\tpure[0] = 0; pure[1] = w; pure[2] = 1; break;\n\t\tcase 4:\n\t\t\tpure[0] = v; pure[1] = 0; pure[2] = 1; break;\n\t\tdefault:\n\t\t\tpure[0] = 1; pure[1] = 0; pure[2] = w;\n\t}\n\n\tmg = (1.0 - c) * g;\n\n\treturn [\n\t\t(c * pure[0] + mg) * 255,\n\t\t(c * pure[1] + mg) * 255,\n\t\t(c * pure[2] + mg) * 255\n\t];\n};\n\nconvert.hcg.hsv = function (hcg) {\n\tvar c = hcg[1] / 100;\n\tvar g = hcg[2] / 100;\n\n\tvar v = c + g * (1.0 - c);\n\tvar f = 0;\n\n\tif (v > 0.0) {\n\t\tf = c / v;\n\t}\n\n\treturn [hcg[0], f * 100, v * 100];\n};\n\nconvert.hcg.hsl = function (hcg) {\n\tvar c = hcg[1] / 100;\n\tvar g = hcg[2] / 100;\n\n\tvar l = g * (1.0 - c) + 0.5 * c;\n\tvar s = 0;\n\n\tif (l > 0.0 && l < 0.5) {\n\t\ts = c / (2 * l);\n\t} else\n\tif (l >= 0.5 && l < 1.0) {\n\t\ts = c / (2 * (1 - l));\n\t}\n\n\treturn [hcg[0], s * 100, l * 100];\n};\n\nconvert.hcg.hwb = function (hcg) {\n\tvar c = hcg[1] / 100;\n\tvar g = hcg[2] / 100;\n\tvar v = c + g * (1.0 - c);\n\treturn [hcg[0], (v - c) * 100, (1 - v) * 100];\n};\n\nconvert.hwb.hcg = function (hwb) {\n\tvar w = hwb[1] / 100;\n\tvar b = hwb[2] / 100;\n\tvar v = 1 - b;\n\tvar c = v - w;\n\tvar g = 0;\n\n\tif (c < 1) {\n\t\tg = (v - c) / (1 - c);\n\t}\n\n\treturn [hwb[0], c * 100, g * 100];\n};\n\nconvert.apple.rgb = function (apple) {\n\treturn [(apple[0] / 65535) * 255, (apple[1] / 65535) * 255, (apple[2] / 65535) * 255];\n};\n\nconvert.rgb.apple = function (rgb) {\n\treturn [(rgb[0] / 255) * 65535, (rgb[1] / 255) * 65535, (rgb[2] / 255) * 65535];\n};\n\nconvert.gray.rgb = function (args) {\n\treturn [args[0] / 100 * 255, args[0] / 100 * 255, args[0] / 100 * 255];\n};\n\nconvert.gray.hsl = convert.gray.hsv = function (args) {\n\treturn [0, 0, args[0]];\n};\n\nconvert.gray.hwb = function (gray) {\n\treturn [0, 100, gray[0]];\n};\n\nconvert.gray.cmyk = function (gray) {\n\treturn [0, 0, 0, gray[0]];\n};\n\nconvert.gray.lab = function (gray) {\n\treturn [gray[0], 0, 0];\n};\n\nconvert.gray.hex = function (gray) {\n\tvar val = Math.round(gray[0] / 100 * 255) & 0xFF;\n\tvar integer = (val << 16) + (val << 8) + val;\n\n\tvar string = integer.toString(16).toUpperCase();\n\treturn '000000'.substring(string.length) + string;\n};\n\nconvert.rgb.gray = function (rgb) {\n\tvar val = (rgb[0] + rgb[1] + rgb[2]) / 3;\n\treturn [val / 255 * 100];\n};\n});\nvar conversions_1 = conversions.rgb;\nvar conversions_2 = conversions.hsl;\nvar conversions_3 = conversions.hsv;\nvar conversions_4 = conversions.hwb;\nvar conversions_5 = conversions.cmyk;\nvar conversions_6 = conversions.xyz;\nvar conversions_7 = conversions.lab;\nvar conversions_8 = conversions.lch;\nvar conversions_9 = conversions.hex;\nvar conversions_10 = conversions.keyword;\nvar conversions_11 = conversions.ansi16;\nvar conversions_12 = conversions.ansi256;\nvar conversions_13 = conversions.hcg;\nvar conversions_14 = conversions.apple;\nvar conversions_15 = conversions.gray;\n\n/*\n\tthis function routes a model to all other models.\n\n\tall functions that are routed have a property `.conversion` attached\n\tto the returned synthetic function. This property is an array\n\tof strings, each with the steps in between the 'from' and 'to'\n\tcolor models (inclusive).\n\n\tconversions that are not possible simply are not included.\n*/\n\nfunction buildGraph() {\n\tvar graph = {};\n\t// https://jsperf.com/object-keys-vs-for-in-with-closure/3\n\tvar models = Object.keys(conversions);\n\n\tfor (var len = models.length, i = 0; i < len; i++) {\n\t\tgraph[models[i]] = {\n\t\t\t// http://jsperf.com/1-vs-infinity\n\t\t\t// micro-opt, but this is simple.\n\t\t\tdistance: -1,\n\t\t\tparent: null\n\t\t};\n\t}\n\n\treturn graph;\n}\n\n// https://en.wikipedia.org/wiki/Breadth-first_search\nfunction deriveBFS(fromModel) {\n\tvar graph = buildGraph();\n\tvar queue = [fromModel]; // unshift -> queue -> pop\n\n\tgraph[fromModel].distance = 0;\n\n\twhile (queue.length) {\n\t\tvar current = queue.pop();\n\t\tvar adjacents = Object.keys(conversions[current]);\n\n\t\tfor (var len = adjacents.length, i = 0; i < len; i++) {\n\t\t\tvar adjacent = adjacents[i];\n\t\t\tvar node = graph[adjacent];\n\n\t\t\tif (node.distance === -1) {\n\t\t\t\tnode.distance = graph[current].distance + 1;\n\t\t\t\tnode.parent = current;\n\t\t\t\tqueue.unshift(adjacent);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn graph;\n}\n\nfunction link(from, to) {\n\treturn function (args) {\n\t\treturn to(from(args));\n\t};\n}\n\nfunction wrapConversion(toModel, graph) {\n\tvar path = [graph[toModel].parent, toModel];\n\tvar fn = conversions[graph[toModel].parent][toModel];\n\n\tvar cur = graph[toModel].parent;\n\twhile (graph[cur].parent) {\n\t\tpath.unshift(graph[cur].parent);\n\t\tfn = link(conversions[graph[cur].parent][cur], fn);\n\t\tcur = graph[cur].parent;\n\t}\n\n\tfn.conversion = path;\n\treturn fn;\n}\n\nvar route = function (fromModel) {\n\tvar graph = deriveBFS(fromModel);\n\tvar conversion = {};\n\n\tvar models = Object.keys(graph);\n\tfor (var len = models.length, i = 0; i < len; i++) {\n\t\tvar toModel = models[i];\n\t\tvar node = graph[toModel];\n\n\t\tif (node.parent === null) {\n\t\t\t// no possible conversion, or this node is the source model.\n\t\t\tcontinue;\n\t\t}\n\n\t\tconversion[toModel] = wrapConversion(toModel, graph);\n\t}\n\n\treturn conversion;\n};\n\nvar convert = {};\n\nvar models = Object.keys(conversions);\n\nfunction wrapRaw(fn) {\n\tvar wrappedFn = function (args) {\n\t\tif (args === undefined || args === null) {\n\t\t\treturn args;\n\t\t}\n\n\t\tif (arguments.length > 1) {\n\t\t\targs = Array.prototype.slice.call(arguments);\n\t\t}\n\n\t\treturn fn(args);\n\t};\n\n\t// preserve .conversion property if there is one\n\tif ('conversion' in fn) {\n\t\twrappedFn.conversion = fn.conversion;\n\t}\n\n\treturn wrappedFn;\n}\n\nfunction wrapRounded(fn) {\n\tvar wrappedFn = function (args) {\n\t\tif (args === undefined || args === null) {\n\t\t\treturn args;\n\t\t}\n\n\t\tif (arguments.length > 1) {\n\t\t\targs = Array.prototype.slice.call(arguments);\n\t\t}\n\n\t\tvar result = fn(args);\n\n\t\t// we're assuming the result is an array here.\n\t\t// see notice in conversions.js; don't use box types\n\t\t// in conversion functions.\n\t\tif (typeof result === 'object') {\n\t\t\tfor (var len = result.length, i = 0; i < len; i++) {\n\t\t\t\tresult[i] = Math.round(result[i]);\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t};\n\n\t// preserve .conversion property if there is one\n\tif ('conversion' in fn) {\n\t\twrappedFn.conversion = fn.conversion;\n\t}\n\n\treturn wrappedFn;\n}\n\nmodels.forEach(function (fromModel) {\n\tconvert[fromModel] = {};\n\n\tObject.defineProperty(convert[fromModel], 'channels', {value: conversions[fromModel].channels});\n\tObject.defineProperty(convert[fromModel], 'labels', {value: conversions[fromModel].labels});\n\n\tvar routes = route(fromModel);\n\tvar routeModels = Object.keys(routes);\n\n\trouteModels.forEach(function (toModel) {\n\t\tvar fn = routes[toModel];\n\n\t\tconvert[fromModel][toModel] = wrapRounded(fn);\n\t\tconvert[fromModel][toModel].raw = wrapRaw(fn);\n\t});\n});\n\nvar colorConvert = convert;\n\nvar colorName$1 = {\r\n\t\"aliceblue\": [240, 248, 255],\r\n\t\"antiquewhite\": [250, 235, 215],\r\n\t\"aqua\": [0, 255, 255],\r\n\t\"aquamarine\": [127, 255, 212],\r\n\t\"azure\": [240, 255, 255],\r\n\t\"beige\": [245, 245, 220],\r\n\t\"bisque\": [255, 228, 196],\r\n\t\"black\": [0, 0, 0],\r\n\t\"blanchedalmond\": [255, 235, 205],\r\n\t\"blue\": [0, 0, 255],\r\n\t\"blueviolet\": [138, 43, 226],\r\n\t\"brown\": [165, 42, 42],\r\n\t\"burlywood\": [222, 184, 135],\r\n\t\"cadetblue\": [95, 158, 160],\r\n\t\"chartreuse\": [127, 255, 0],\r\n\t\"chocolate\": [210, 105, 30],\r\n\t\"coral\": [255, 127, 80],\r\n\t\"cornflowerblue\": [100, 149, 237],\r\n\t\"cornsilk\": [255, 248, 220],\r\n\t\"crimson\": [220, 20, 60],\r\n\t\"cyan\": [0, 255, 255],\r\n\t\"darkblue\": [0, 0, 139],\r\n\t\"darkcyan\": [0, 139, 139],\r\n\t\"darkgoldenrod\": [184, 134, 11],\r\n\t\"darkgray\": [169, 169, 169],\r\n\t\"darkgreen\": [0, 100, 0],\r\n\t\"darkgrey\": [169, 169, 169],\r\n\t\"darkkhaki\": [189, 183, 107],\r\n\t\"darkmagenta\": [139, 0, 139],\r\n\t\"darkolivegreen\": [85, 107, 47],\r\n\t\"darkorange\": [255, 140, 0],\r\n\t\"darkorchid\": [153, 50, 204],\r\n\t\"darkred\": [139, 0, 0],\r\n\t\"darksalmon\": [233, 150, 122],\r\n\t\"darkseagreen\": [143, 188, 143],\r\n\t\"darkslateblue\": [72, 61, 139],\r\n\t\"darkslategray\": [47, 79, 79],\r\n\t\"darkslategrey\": [47, 79, 79],\r\n\t\"darkturquoise\": [0, 206, 209],\r\n\t\"darkviolet\": [148, 0, 211],\r\n\t\"deeppink\": [255, 20, 147],\r\n\t\"deepskyblue\": [0, 191, 255],\r\n\t\"dimgray\": [105, 105, 105],\r\n\t\"dimgrey\": [105, 105, 105],\r\n\t\"dodgerblue\": [30, 144, 255],\r\n\t\"firebrick\": [178, 34, 34],\r\n\t\"floralwhite\": [255, 250, 240],\r\n\t\"forestgreen\": [34, 139, 34],\r\n\t\"fuchsia\": [255, 0, 255],\r\n\t\"gainsboro\": [220, 220, 220],\r\n\t\"ghostwhite\": [248, 248, 255],\r\n\t\"gold\": [255, 215, 0],\r\n\t\"goldenrod\": [218, 165, 32],\r\n\t\"gray\": [128, 128, 128],\r\n\t\"green\": [0, 128, 0],\r\n\t\"greenyellow\": [173, 255, 47],\r\n\t\"grey\": [128, 128, 128],\r\n\t\"honeydew\": [240, 255, 240],\r\n\t\"hotpink\": [255, 105, 180],\r\n\t\"indianred\": [205, 92, 92],\r\n\t\"indigo\": [75, 0, 130],\r\n\t\"ivory\": [255, 255, 240],\r\n\t\"khaki\": [240, 230, 140],\r\n\t\"lavender\": [230, 230, 250],\r\n\t\"lavenderblush\": [255, 240, 245],\r\n\t\"lawngreen\": [124, 252, 0],\r\n\t\"lemonchiffon\": [255, 250, 205],\r\n\t\"lightblue\": [173, 216, 230],\r\n\t\"lightcoral\": [240, 128, 128],\r\n\t\"lightcyan\": [224, 255, 255],\r\n\t\"lightgoldenrodyellow\": [250, 250, 210],\r\n\t\"lightgray\": [211, 211, 211],\r\n\t\"lightgreen\": [144, 238, 144],\r\n\t\"lightgrey\": [211, 211, 211],\r\n\t\"lightpink\": [255, 182, 193],\r\n\t\"lightsalmon\": [255, 160, 122],\r\n\t\"lightseagreen\": [32, 178, 170],\r\n\t\"lightskyblue\": [135, 206, 250],\r\n\t\"lightslategray\": [119, 136, 153],\r\n\t\"lightslategrey\": [119, 136, 153],\r\n\t\"lightsteelblue\": [176, 196, 222],\r\n\t\"lightyellow\": [255, 255, 224],\r\n\t\"lime\": [0, 255, 0],\r\n\t\"limegreen\": [50, 205, 50],\r\n\t\"linen\": [250, 240, 230],\r\n\t\"magenta\": [255, 0, 255],\r\n\t\"maroon\": [128, 0, 0],\r\n\t\"mediumaquamarine\": [102, 205, 170],\r\n\t\"mediumblue\": [0, 0, 205],\r\n\t\"mediumorchid\": [186, 85, 211],\r\n\t\"mediumpurple\": [147, 112, 219],\r\n\t\"mediumseagreen\": [60, 179, 113],\r\n\t\"mediumslateblue\": [123, 104, 238],\r\n\t\"mediumspringgreen\": [0, 250, 154],\r\n\t\"mediumturquoise\": [72, 209, 204],\r\n\t\"mediumvioletred\": [199, 21, 133],\r\n\t\"midnightblue\": [25, 25, 112],\r\n\t\"mintcream\": [245, 255, 250],\r\n\t\"mistyrose\": [255, 228, 225],\r\n\t\"moccasin\": [255, 228, 181],\r\n\t\"navajowhite\": [255, 222, 173],\r\n\t\"navy\": [0, 0, 128],\r\n\t\"oldlace\": [253, 245, 230],\r\n\t\"olive\": [128, 128, 0],\r\n\t\"olivedrab\": [107, 142, 35],\r\n\t\"orange\": [255, 165, 0],\r\n\t\"orangered\": [255, 69, 0],\r\n\t\"orchid\": [218, 112, 214],\r\n\t\"palegoldenrod\": [238, 232, 170],\r\n\t\"palegreen\": [152, 251, 152],\r\n\t\"paleturquoise\": [175, 238, 238],\r\n\t\"palevioletred\": [219, 112, 147],\r\n\t\"papayawhip\": [255, 239, 213],\r\n\t\"peachpuff\": [255, 218, 185],\r\n\t\"peru\": [205, 133, 63],\r\n\t\"pink\": [255, 192, 203],\r\n\t\"plum\": [221, 160, 221],\r\n\t\"powderblue\": [176, 224, 230],\r\n\t\"purple\": [128, 0, 128],\r\n\t\"rebeccapurple\": [102, 51, 153],\r\n\t\"red\": [255, 0, 0],\r\n\t\"rosybrown\": [188, 143, 143],\r\n\t\"royalblue\": [65, 105, 225],\r\n\t\"saddlebrown\": [139, 69, 19],\r\n\t\"salmon\": [250, 128, 114],\r\n\t\"sandybrown\": [244, 164, 96],\r\n\t\"seagreen\": [46, 139, 87],\r\n\t\"seashell\": [255, 245, 238],\r\n\t\"sienna\": [160, 82, 45],\r\n\t\"silver\": [192, 192, 192],\r\n\t\"skyblue\": [135, 206, 235],\r\n\t\"slateblue\": [106, 90, 205],\r\n\t\"slategray\": [112, 128, 144],\r\n\t\"slategrey\": [112, 128, 144],\r\n\t\"snow\": [255, 250, 250],\r\n\t\"springgreen\": [0, 255, 127],\r\n\t\"steelblue\": [70, 130, 180],\r\n\t\"tan\": [210, 180, 140],\r\n\t\"teal\": [0, 128, 128],\r\n\t\"thistle\": [216, 191, 216],\r\n\t\"tomato\": [255, 99, 71],\r\n\t\"turquoise\": [64, 224, 208],\r\n\t\"violet\": [238, 130, 238],\r\n\t\"wheat\": [245, 222, 179],\r\n\t\"white\": [255, 255, 255],\r\n\t\"whitesmoke\": [245, 245, 245],\r\n\t\"yellow\": [255, 255, 0],\r\n\t\"yellowgreen\": [154, 205, 50]\r\n};\n\n/* MIT license */\n\n\nvar colorString = {\n   getRgba: getRgba,\n   getHsla: getHsla,\n   getRgb: getRgb,\n   getHsl: getHsl,\n   getHwb: getHwb,\n   getAlpha: getAlpha,\n\n   hexString: hexString,\n   rgbString: rgbString,\n   rgbaString: rgbaString,\n   percentString: percentString,\n   percentaString: percentaString,\n   hslString: hslString,\n   hslaString: hslaString,\n   hwbString: hwbString,\n   keyword: keyword\n};\n\nfunction getRgba(string) {\n   if (!string) {\n      return;\n   }\n   var abbr =  /^#([a-fA-F0-9]{3,4})$/i,\n       hex =  /^#([a-fA-F0-9]{6}([a-fA-F0-9]{2})?)$/i,\n       rgba = /^rgba?\\(\\s*([+-]?\\d+)\\s*,\\s*([+-]?\\d+)\\s*,\\s*([+-]?\\d+)\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)$/i,\n       per = /^rgba?\\(\\s*([+-]?[\\d\\.]+)\\%\\s*,\\s*([+-]?[\\d\\.]+)\\%\\s*,\\s*([+-]?[\\d\\.]+)\\%\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)$/i,\n       keyword = /(\\w+)/;\n\n   var rgb = [0, 0, 0],\n       a = 1,\n       match = string.match(abbr),\n       hexAlpha = \"\";\n   if (match) {\n      match = match[1];\n      hexAlpha = match[3];\n      for (var i = 0; i < rgb.length; i++) {\n         rgb[i] = parseInt(match[i] + match[i], 16);\n      }\n      if (hexAlpha) {\n         a = Math.round((parseInt(hexAlpha + hexAlpha, 16) / 255) * 100) / 100;\n      }\n   }\n   else if (match = string.match(hex)) {\n      hexAlpha = match[2];\n      match = match[1];\n      for (var i = 0; i < rgb.length; i++) {\n         rgb[i] = parseInt(match.slice(i * 2, i * 2 + 2), 16);\n      }\n      if (hexAlpha) {\n         a = Math.round((parseInt(hexAlpha, 16) / 255) * 100) / 100;\n      }\n   }\n   else if (match = string.match(rgba)) {\n      for (var i = 0; i < rgb.length; i++) {\n         rgb[i] = parseInt(match[i + 1]);\n      }\n      a = parseFloat(match[4]);\n   }\n   else if (match = string.match(per)) {\n      for (var i = 0; i < rgb.length; i++) {\n         rgb[i] = Math.round(parseFloat(match[i + 1]) * 2.55);\n      }\n      a = parseFloat(match[4]);\n   }\n   else if (match = string.match(keyword)) {\n      if (match[1] == \"transparent\") {\n         return [0, 0, 0, 0];\n      }\n      rgb = colorName$1[match[1]];\n      if (!rgb) {\n         return;\n      }\n   }\n\n   for (var i = 0; i < rgb.length; i++) {\n      rgb[i] = scale(rgb[i], 0, 255);\n   }\n   if (!a && a != 0) {\n      a = 1;\n   }\n   else {\n      a = scale(a, 0, 1);\n   }\n   rgb[3] = a;\n   return rgb;\n}\n\nfunction getHsla(string) {\n   if (!string) {\n      return;\n   }\n   var hsl = /^hsla?\\(\\s*([+-]?\\d+)(?:deg)?\\s*,\\s*([+-]?[\\d\\.]+)%\\s*,\\s*([+-]?[\\d\\.]+)%\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)/;\n   var match = string.match(hsl);\n   if (match) {\n      var alpha = parseFloat(match[4]);\n      var h = scale(parseInt(match[1]), 0, 360),\n          s = scale(parseFloat(match[2]), 0, 100),\n          l = scale(parseFloat(match[3]), 0, 100),\n          a = scale(isNaN(alpha) ? 1 : alpha, 0, 1);\n      return [h, s, l, a];\n   }\n}\n\nfunction getHwb(string) {\n   if (!string) {\n      return;\n   }\n   var hwb = /^hwb\\(\\s*([+-]?\\d+)(?:deg)?\\s*,\\s*([+-]?[\\d\\.]+)%\\s*,\\s*([+-]?[\\d\\.]+)%\\s*(?:,\\s*([+-]?[\\d\\.]+)\\s*)?\\)/;\n   var match = string.match(hwb);\n   if (match) {\n    var alpha = parseFloat(match[4]);\n      var h = scale(parseInt(match[1]), 0, 360),\n          w = scale(parseFloat(match[2]), 0, 100),\n          b = scale(parseFloat(match[3]), 0, 100),\n          a = scale(isNaN(alpha) ? 1 : alpha, 0, 1);\n      return [h, w, b, a];\n   }\n}\n\nfunction getRgb(string) {\n   var rgba = getRgba(string);\n   return rgba && rgba.slice(0, 3);\n}\n\nfunction getHsl(string) {\n  var hsla = getHsla(string);\n  return hsla && hsla.slice(0, 3);\n}\n\nfunction getAlpha(string) {\n   var vals = getRgba(string);\n   if (vals) {\n      return vals[3];\n   }\n   else if (vals = getHsla(string)) {\n      return vals[3];\n   }\n   else if (vals = getHwb(string)) {\n      return vals[3];\n   }\n}\n\n// generators\nfunction hexString(rgba, a) {\n   var a = (a !== undefined && rgba.length === 3) ? a : rgba[3];\n   return \"#\" + hexDouble(rgba[0]) \n              + hexDouble(rgba[1])\n              + hexDouble(rgba[2])\n              + (\n                 (a >= 0 && a < 1)\n                 ? hexDouble(Math.round(a * 255))\n                 : \"\"\n              );\n}\n\nfunction rgbString(rgba, alpha) {\n   if (alpha < 1 || (rgba[3] && rgba[3] < 1)) {\n      return rgbaString(rgba, alpha);\n   }\n   return \"rgb(\" + rgba[0] + \", \" + rgba[1] + \", \" + rgba[2] + \")\";\n}\n\nfunction rgbaString(rgba, alpha) {\n   if (alpha === undefined) {\n      alpha = (rgba[3] !== undefined ? rgba[3] : 1);\n   }\n   return \"rgba(\" + rgba[0] + \", \" + rgba[1] + \", \" + rgba[2]\n           + \", \" + alpha + \")\";\n}\n\nfunction percentString(rgba, alpha) {\n   if (alpha < 1 || (rgba[3] && rgba[3] < 1)) {\n      return percentaString(rgba, alpha);\n   }\n   var r = Math.round(rgba[0]/255 * 100),\n       g = Math.round(rgba[1]/255 * 100),\n       b = Math.round(rgba[2]/255 * 100);\n\n   return \"rgb(\" + r + \"%, \" + g + \"%, \" + b + \"%)\";\n}\n\nfunction percentaString(rgba, alpha) {\n   var r = Math.round(rgba[0]/255 * 100),\n       g = Math.round(rgba[1]/255 * 100),\n       b = Math.round(rgba[2]/255 * 100);\n   return \"rgba(\" + r + \"%, \" + g + \"%, \" + b + \"%, \" + (alpha || rgba[3] || 1) + \")\";\n}\n\nfunction hslString(hsla, alpha) {\n   if (alpha < 1 || (hsla[3] && hsla[3] < 1)) {\n      return hslaString(hsla, alpha);\n   }\n   return \"hsl(\" + hsla[0] + \", \" + hsla[1] + \"%, \" + hsla[2] + \"%)\";\n}\n\nfunction hslaString(hsla, alpha) {\n   if (alpha === undefined) {\n      alpha = (hsla[3] !== undefined ? hsla[3] : 1);\n   }\n   return \"hsla(\" + hsla[0] + \", \" + hsla[1] + \"%, \" + hsla[2] + \"%, \"\n           + alpha + \")\";\n}\n\n// hwb is a bit different than rgb(a) & hsl(a) since there is no alpha specific syntax\n// (hwb have alpha optional & 1 is default value)\nfunction hwbString(hwb, alpha) {\n   if (alpha === undefined) {\n      alpha = (hwb[3] !== undefined ? hwb[3] : 1);\n   }\n   return \"hwb(\" + hwb[0] + \", \" + hwb[1] + \"%, \" + hwb[2] + \"%\"\n           + (alpha !== undefined && alpha !== 1 ? \", \" + alpha : \"\") + \")\";\n}\n\nfunction keyword(rgb) {\n  return reverseNames[rgb.slice(0, 3)];\n}\n\n// helpers\nfunction scale(num, min, max) {\n   return Math.min(Math.max(min, num), max);\n}\n\nfunction hexDouble(num) {\n  var str = num.toString(16).toUpperCase();\n  return (str.length < 2) ? \"0\" + str : str;\n}\n\n\n//create a list of reverse color names\nvar reverseNames = {};\nfor (var name in colorName$1) {\n   reverseNames[colorName$1[name]] = name;\n}\n\n/* MIT license */\n\n\n\nvar Color = function (obj) {\n\tif (obj instanceof Color) {\n\t\treturn obj;\n\t}\n\tif (!(this instanceof Color)) {\n\t\treturn new Color(obj);\n\t}\n\n\tthis.valid = false;\n\tthis.values = {\n\t\trgb: [0, 0, 0],\n\t\thsl: [0, 0, 0],\n\t\thsv: [0, 0, 0],\n\t\thwb: [0, 0, 0],\n\t\tcmyk: [0, 0, 0, 0],\n\t\talpha: 1\n\t};\n\n\t// parse Color() argument\n\tvar vals;\n\tif (typeof obj === 'string') {\n\t\tvals = colorString.getRgba(obj);\n\t\tif (vals) {\n\t\t\tthis.setValues('rgb', vals);\n\t\t} else if (vals = colorString.getHsla(obj)) {\n\t\t\tthis.setValues('hsl', vals);\n\t\t} else if (vals = colorString.getHwb(obj)) {\n\t\t\tthis.setValues('hwb', vals);\n\t\t}\n\t} else if (typeof obj === 'object') {\n\t\tvals = obj;\n\t\tif (vals.r !== undefined || vals.red !== undefined) {\n\t\t\tthis.setValues('rgb', vals);\n\t\t} else if (vals.l !== undefined || vals.lightness !== undefined) {\n\t\t\tthis.setValues('hsl', vals);\n\t\t} else if (vals.v !== undefined || vals.value !== undefined) {\n\t\t\tthis.setValues('hsv', vals);\n\t\t} else if (vals.w !== undefined || vals.whiteness !== undefined) {\n\t\t\tthis.setValues('hwb', vals);\n\t\t} else if (vals.c !== undefined || vals.cyan !== undefined) {\n\t\t\tthis.setValues('cmyk', vals);\n\t\t}\n\t}\n};\n\nColor.prototype = {\n\tisValid: function () {\n\t\treturn this.valid;\n\t},\n\trgb: function () {\n\t\treturn this.setSpace('rgb', arguments);\n\t},\n\thsl: function () {\n\t\treturn this.setSpace('hsl', arguments);\n\t},\n\thsv: function () {\n\t\treturn this.setSpace('hsv', arguments);\n\t},\n\thwb: function () {\n\t\treturn this.setSpace('hwb', arguments);\n\t},\n\tcmyk: function () {\n\t\treturn this.setSpace('cmyk', arguments);\n\t},\n\n\trgbArray: function () {\n\t\treturn this.values.rgb;\n\t},\n\thslArray: function () {\n\t\treturn this.values.hsl;\n\t},\n\thsvArray: function () {\n\t\treturn this.values.hsv;\n\t},\n\thwbArray: function () {\n\t\tvar values = this.values;\n\t\tif (values.alpha !== 1) {\n\t\t\treturn values.hwb.concat([values.alpha]);\n\t\t}\n\t\treturn values.hwb;\n\t},\n\tcmykArray: function () {\n\t\treturn this.values.cmyk;\n\t},\n\trgbaArray: function () {\n\t\tvar values = this.values;\n\t\treturn values.rgb.concat([values.alpha]);\n\t},\n\thslaArray: function () {\n\t\tvar values = this.values;\n\t\treturn values.hsl.concat([values.alpha]);\n\t},\n\talpha: function (val) {\n\t\tif (val === undefined) {\n\t\t\treturn this.values.alpha;\n\t\t}\n\t\tthis.setValues('alpha', val);\n\t\treturn this;\n\t},\n\n\tred: function (val) {\n\t\treturn this.setChannel('rgb', 0, val);\n\t},\n\tgreen: function (val) {\n\t\treturn this.setChannel('rgb', 1, val);\n\t},\n\tblue: function (val) {\n\t\treturn this.setChannel('rgb', 2, val);\n\t},\n\thue: function (val) {\n\t\tif (val) {\n\t\t\tval %= 360;\n\t\t\tval = val < 0 ? 360 + val : val;\n\t\t}\n\t\treturn this.setChannel('hsl', 0, val);\n\t},\n\tsaturation: function (val) {\n\t\treturn this.setChannel('hsl', 1, val);\n\t},\n\tlightness: function (val) {\n\t\treturn this.setChannel('hsl', 2, val);\n\t},\n\tsaturationv: function (val) {\n\t\treturn this.setChannel('hsv', 1, val);\n\t},\n\twhiteness: function (val) {\n\t\treturn this.setChannel('hwb', 1, val);\n\t},\n\tblackness: function (val) {\n\t\treturn this.setChannel('hwb', 2, val);\n\t},\n\tvalue: function (val) {\n\t\treturn this.setChannel('hsv', 2, val);\n\t},\n\tcyan: function (val) {\n\t\treturn this.setChannel('cmyk', 0, val);\n\t},\n\tmagenta: function (val) {\n\t\treturn this.setChannel('cmyk', 1, val);\n\t},\n\tyellow: function (val) {\n\t\treturn this.setChannel('cmyk', 2, val);\n\t},\n\tblack: function (val) {\n\t\treturn this.setChannel('cmyk', 3, val);\n\t},\n\n\thexString: function () {\n\t\treturn colorString.hexString(this.values.rgb);\n\t},\n\trgbString: function () {\n\t\treturn colorString.rgbString(this.values.rgb, this.values.alpha);\n\t},\n\trgbaString: function () {\n\t\treturn colorString.rgbaString(this.values.rgb, this.values.alpha);\n\t},\n\tpercentString: function () {\n\t\treturn colorString.percentString(this.values.rgb, this.values.alpha);\n\t},\n\thslString: function () {\n\t\treturn colorString.hslString(this.values.hsl, this.values.alpha);\n\t},\n\thslaString: function () {\n\t\treturn colorString.hslaString(this.values.hsl, this.values.alpha);\n\t},\n\thwbString: function () {\n\t\treturn colorString.hwbString(this.values.hwb, this.values.alpha);\n\t},\n\tkeyword: function () {\n\t\treturn colorString.keyword(this.values.rgb, this.values.alpha);\n\t},\n\n\trgbNumber: function () {\n\t\tvar rgb = this.values.rgb;\n\t\treturn (rgb[0] << 16) | (rgb[1] << 8) | rgb[2];\n\t},\n\n\tluminosity: function () {\n\t\t// http://www.w3.org/TR/WCAG20/#relativeluminancedef\n\t\tvar rgb = this.values.rgb;\n\t\tvar lum = [];\n\t\tfor (var i = 0; i < rgb.length; i++) {\n\t\t\tvar chan = rgb[i] / 255;\n\t\t\tlum[i] = (chan <= 0.03928) ? chan / 12.92 : Math.pow(((chan + 0.055) / 1.055), 2.4);\n\t\t}\n\t\treturn 0.2126 * lum[0] + 0.7152 * lum[1] + 0.0722 * lum[2];\n\t},\n\n\tcontrast: function (color2) {\n\t\t// http://www.w3.org/TR/WCAG20/#contrast-ratiodef\n\t\tvar lum1 = this.luminosity();\n\t\tvar lum2 = color2.luminosity();\n\t\tif (lum1 > lum2) {\n\t\t\treturn (lum1 + 0.05) / (lum2 + 0.05);\n\t\t}\n\t\treturn (lum2 + 0.05) / (lum1 + 0.05);\n\t},\n\n\tlevel: function (color2) {\n\t\tvar contrastRatio = this.contrast(color2);\n\t\tif (contrastRatio >= 7.1) {\n\t\t\treturn 'AAA';\n\t\t}\n\n\t\treturn (contrastRatio >= 4.5) ? 'AA' : '';\n\t},\n\n\tdark: function () {\n\t\t// YIQ equation from http://24ways.org/2010/calculating-color-contrast\n\t\tvar rgb = this.values.rgb;\n\t\tvar yiq = (rgb[0] * 299 + rgb[1] * 587 + rgb[2] * 114) / 1000;\n\t\treturn yiq < 128;\n\t},\n\n\tlight: function () {\n\t\treturn !this.dark();\n\t},\n\n\tnegate: function () {\n\t\tvar rgb = [];\n\t\tfor (var i = 0; i < 3; i++) {\n\t\t\trgb[i] = 255 - this.values.rgb[i];\n\t\t}\n\t\tthis.setValues('rgb', rgb);\n\t\treturn this;\n\t},\n\n\tlighten: function (ratio) {\n\t\tvar hsl = this.values.hsl;\n\t\thsl[2] += hsl[2] * ratio;\n\t\tthis.setValues('hsl', hsl);\n\t\treturn this;\n\t},\n\n\tdarken: function (ratio) {\n\t\tvar hsl = this.values.hsl;\n\t\thsl[2] -= hsl[2] * ratio;\n\t\tthis.setValues('hsl', hsl);\n\t\treturn this;\n\t},\n\n\tsaturate: function (ratio) {\n\t\tvar hsl = this.values.hsl;\n\t\thsl[1] += hsl[1] * ratio;\n\t\tthis.setValues('hsl', hsl);\n\t\treturn this;\n\t},\n\n\tdesaturate: function (ratio) {\n\t\tvar hsl = this.values.hsl;\n\t\thsl[1] -= hsl[1] * ratio;\n\t\tthis.setValues('hsl', hsl);\n\t\treturn this;\n\t},\n\n\twhiten: function (ratio) {\n\t\tvar hwb = this.values.hwb;\n\t\thwb[1] += hwb[1] * ratio;\n\t\tthis.setValues('hwb', hwb);\n\t\treturn this;\n\t},\n\n\tblacken: function (ratio) {\n\t\tvar hwb = this.values.hwb;\n\t\thwb[2] += hwb[2] * ratio;\n\t\tthis.setValues('hwb', hwb);\n\t\treturn this;\n\t},\n\n\tgreyscale: function () {\n\t\tvar rgb = this.values.rgb;\n\t\t// http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale\n\t\tvar val = rgb[0] * 0.3 + rgb[1] * 0.59 + rgb[2] * 0.11;\n\t\tthis.setValues('rgb', [val, val, val]);\n\t\treturn this;\n\t},\n\n\tclearer: function (ratio) {\n\t\tvar alpha = this.values.alpha;\n\t\tthis.setValues('alpha', alpha - (alpha * ratio));\n\t\treturn this;\n\t},\n\n\topaquer: function (ratio) {\n\t\tvar alpha = this.values.alpha;\n\t\tthis.setValues('alpha', alpha + (alpha * ratio));\n\t\treturn this;\n\t},\n\n\trotate: function (degrees) {\n\t\tvar hsl = this.values.hsl;\n\t\tvar hue = (hsl[0] + degrees) % 360;\n\t\thsl[0] = hue < 0 ? 360 + hue : hue;\n\t\tthis.setValues('hsl', hsl);\n\t\treturn this;\n\t},\n\n\t/**\n\t * Ported from sass implementation in C\n\t * https://github.com/sass/libsass/blob/0e6b4a2850092356aa3ece07c6b249f0221caced/functions.cpp#L209\n\t */\n\tmix: function (mixinColor, weight) {\n\t\tvar color1 = this;\n\t\tvar color2 = mixinColor;\n\t\tvar p = weight === undefined ? 0.5 : weight;\n\n\t\tvar w = 2 * p - 1;\n\t\tvar a = color1.alpha() - color2.alpha();\n\n\t\tvar w1 = (((w * a === -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n\t\tvar w2 = 1 - w1;\n\n\t\treturn this\n\t\t\t.rgb(\n\t\t\t\tw1 * color1.red() + w2 * color2.red(),\n\t\t\t\tw1 * color1.green() + w2 * color2.green(),\n\t\t\t\tw1 * color1.blue() + w2 * color2.blue()\n\t\t\t)\n\t\t\t.alpha(color1.alpha() * p + color2.alpha() * (1 - p));\n\t},\n\n\ttoJSON: function () {\n\t\treturn this.rgb();\n\t},\n\n\tclone: function () {\n\t\t// NOTE(SB): using node-clone creates a dependency to Buffer when using browserify,\n\t\t// making the final build way to big to embed in Chart.js. So let's do it manually,\n\t\t// assuming that values to clone are 1 dimension arrays containing only numbers,\n\t\t// except 'alpha' which is a number.\n\t\tvar result = new Color();\n\t\tvar source = this.values;\n\t\tvar target = result.values;\n\t\tvar value, type;\n\n\t\tfor (var prop in source) {\n\t\t\tif (source.hasOwnProperty(prop)) {\n\t\t\t\tvalue = source[prop];\n\t\t\t\ttype = ({}).toString.call(value);\n\t\t\t\tif (type === '[object Array]') {\n\t\t\t\t\ttarget[prop] = value.slice(0);\n\t\t\t\t} else if (type === '[object Number]') {\n\t\t\t\t\ttarget[prop] = value;\n\t\t\t\t} else {\n\t\t\t\t\tconsole.error('unexpected color value:', value);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}\n};\n\nColor.prototype.spaces = {\n\trgb: ['red', 'green', 'blue'],\n\thsl: ['hue', 'saturation', 'lightness'],\n\thsv: ['hue', 'saturation', 'value'],\n\thwb: ['hue', 'whiteness', 'blackness'],\n\tcmyk: ['cyan', 'magenta', 'yellow', 'black']\n};\n\nColor.prototype.maxes = {\n\trgb: [255, 255, 255],\n\thsl: [360, 100, 100],\n\thsv: [360, 100, 100],\n\thwb: [360, 100, 100],\n\tcmyk: [100, 100, 100, 100]\n};\n\nColor.prototype.getValues = function (space) {\n\tvar values = this.values;\n\tvar vals = {};\n\n\tfor (var i = 0; i < space.length; i++) {\n\t\tvals[space.charAt(i)] = values[space][i];\n\t}\n\n\tif (values.alpha !== 1) {\n\t\tvals.a = values.alpha;\n\t}\n\n\t// {r: 255, g: 255, b: 255, a: 0.4}\n\treturn vals;\n};\n\nColor.prototype.setValues = function (space, vals) {\n\tvar values = this.values;\n\tvar spaces = this.spaces;\n\tvar maxes = this.maxes;\n\tvar alpha = 1;\n\tvar i;\n\n\tthis.valid = true;\n\n\tif (space === 'alpha') {\n\t\talpha = vals;\n\t} else if (vals.length) {\n\t\t// [10, 10, 10]\n\t\tvalues[space] = vals.slice(0, space.length);\n\t\talpha = vals[space.length];\n\t} else if (vals[space.charAt(0)] !== undefined) {\n\t\t// {r: 10, g: 10, b: 10}\n\t\tfor (i = 0; i < space.length; i++) {\n\t\t\tvalues[space][i] = vals[space.charAt(i)];\n\t\t}\n\n\t\talpha = vals.a;\n\t} else if (vals[spaces[space][0]] !== undefined) {\n\t\t// {red: 10, green: 10, blue: 10}\n\t\tvar chans = spaces[space];\n\n\t\tfor (i = 0; i < space.length; i++) {\n\t\t\tvalues[space][i] = vals[chans[i]];\n\t\t}\n\n\t\talpha = vals.alpha;\n\t}\n\n\tvalues.alpha = Math.max(0, Math.min(1, (alpha === undefined ? values.alpha : alpha)));\n\n\tif (space === 'alpha') {\n\t\treturn false;\n\t}\n\n\tvar capped;\n\n\t// cap values of the space prior converting all values\n\tfor (i = 0; i < space.length; i++) {\n\t\tcapped = Math.max(0, Math.min(maxes[space][i], values[space][i]));\n\t\tvalues[space][i] = Math.round(capped);\n\t}\n\n\t// convert to all the other color spaces\n\tfor (var sname in spaces) {\n\t\tif (sname !== space) {\n\t\t\tvalues[sname] = colorConvert[space][sname](values[space]);\n\t\t}\n\t}\n\n\treturn true;\n};\n\nColor.prototype.setSpace = function (space, args) {\n\tvar vals = args[0];\n\n\tif (vals === undefined) {\n\t\t// color.rgb()\n\t\treturn this.getValues(space);\n\t}\n\n\t// color.rgb(10, 10, 10)\n\tif (typeof vals === 'number') {\n\t\tvals = Array.prototype.slice.call(args);\n\t}\n\n\tthis.setValues(space, vals);\n\treturn this;\n};\n\nColor.prototype.setChannel = function (space, index, val) {\n\tvar svalues = this.values[space];\n\tif (val === undefined) {\n\t\t// color.red()\n\t\treturn svalues[index];\n\t} else if (val === svalues[index]) {\n\t\t// color.red(color.red())\n\t\treturn this;\n\t}\n\n\t// color.red(100)\n\tsvalues[index] = val;\n\tthis.setValues(space, svalues);\n\n\treturn this;\n};\n\nif (typeof window !== 'undefined') {\n\twindow.Color = Color;\n}\n\nvar chartjsColor = Color;\n\nfunction isValidKey(key) {\r\n\treturn ['__proto__', 'prototype', 'constructor'].indexOf(key) === -1;\r\n}\r\n\r\n/**\r\n * @namespace Chart.helpers\r\n */\r\nvar helpers = {\r\n\t/**\r\n\t * An empty function that can be used, for example, for optional callback.\r\n\t */\r\n\tnoop: function() {},\r\n\r\n\t/**\r\n\t * Returns a unique id, sequentially generated from a global variable.\r\n\t * @returns {number}\r\n\t * @function\r\n\t */\r\n\tuid: (function() {\r\n\t\tvar id = 0;\r\n\t\treturn function() {\r\n\t\t\treturn id++;\r\n\t\t};\r\n\t}()),\r\n\r\n\t/**\r\n\t * Returns true if `value` is neither null nor undefined, else returns false.\r\n\t * @param {*} value - The value to test.\r\n\t * @returns {boolean}\r\n\t * @since 2.7.0\r\n\t */\r\n\tisNullOrUndef: function(value) {\r\n\t\treturn value === null || typeof value === 'undefined';\r\n\t},\r\n\r\n\t/**\r\n\t * Returns true if `value` is an array (including typed arrays), else returns false.\r\n\t * @param {*} value - The value to test.\r\n\t * @returns {boolean}\r\n\t * @function\r\n\t */\r\n\tisArray: function(value) {\r\n\t\tif (Array.isArray && Array.isArray(value)) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\tvar type = Object.prototype.toString.call(value);\r\n\t\tif (type.substr(0, 7) === '[object' && type.substr(-6) === 'Array]') {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\treturn false;\r\n\t},\r\n\r\n\t/**\r\n\t * Returns true if `value` is an object (excluding null), else returns false.\r\n\t * @param {*} value - The value to test.\r\n\t * @returns {boolean}\r\n\t * @since 2.7.0\r\n\t */\r\n\tisObject: function(value) {\r\n\t\treturn value !== null && Object.prototype.toString.call(value) === '[object Object]';\r\n\t},\r\n\r\n\t/**\r\n\t * Returns true if `value` is a finite number, else returns false\r\n\t * @param {*} value  - The value to test.\r\n\t * @returns {boolean}\r\n\t */\r\n\tisFinite: function(value) {\r\n\t\treturn (typeof value === 'number' || value instanceof Number) && isFinite(value);\r\n\t},\r\n\r\n\t/**\r\n\t * Returns `value` if defined, else returns `defaultValue`.\r\n\t * @param {*} value - The value to return if defined.\r\n\t * @param {*} defaultValue - The value to return if `value` is undefined.\r\n\t * @returns {*}\r\n\t */\r\n\tvalueOrDefault: function(value, defaultValue) {\r\n\t\treturn typeof value === 'undefined' ? defaultValue : value;\r\n\t},\r\n\r\n\t/**\r\n\t * Returns value at the given `index` in array if defined, else returns `defaultValue`.\r\n\t * @param {Array} value - The array to lookup for value at `index`.\r\n\t * @param {number} index - The index in `value` to lookup for value.\r\n\t * @param {*} defaultValue - The value to return if `value[index]` is undefined.\r\n\t * @returns {*}\r\n\t */\r\n\tvalueAtIndexOrDefault: function(value, index, defaultValue) {\r\n\t\treturn helpers.valueOrDefault(helpers.isArray(value) ? value[index] : value, defaultValue);\r\n\t},\r\n\r\n\t/**\r\n\t * Calls `fn` with the given `args` in the scope defined by `thisArg` and returns the\r\n\t * value returned by `fn`. If `fn` is not a function, this method returns undefined.\r\n\t * @param {function} fn - The function to call.\r\n\t * @param {Array|undefined|null} args - The arguments with which `fn` should be called.\r\n\t * @param {object} [thisArg] - The value of `this` provided for the call to `fn`.\r\n\t * @returns {*}\r\n\t */\r\n\tcallback: function(fn, args, thisArg) {\r\n\t\tif (fn && typeof fn.call === 'function') {\r\n\t\t\treturn fn.apply(thisArg, args);\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Note(SB) for performance sake, this method should only be used when loopable type\r\n\t * is unknown or in none intensive code (not called often and small loopable). Else\r\n\t * it's preferable to use a regular for() loop and save extra function calls.\r\n\t * @param {object|Array} loopable - The object or array to be iterated.\r\n\t * @param {function} fn - The function to call for each item.\r\n\t * @param {object} [thisArg] - The value of `this` provided for the call to `fn`.\r\n\t * @param {boolean} [reverse] - If true, iterates backward on the loopable.\r\n\t */\r\n\teach: function(loopable, fn, thisArg, reverse) {\r\n\t\tvar i, len, keys;\r\n\t\tif (helpers.isArray(loopable)) {\r\n\t\t\tlen = loopable.length;\r\n\t\t\tif (reverse) {\r\n\t\t\t\tfor (i = len - 1; i >= 0; i--) {\r\n\t\t\t\t\tfn.call(thisArg, loopable[i], i);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tfor (i = 0; i < len; i++) {\r\n\t\t\t\t\tfn.call(thisArg, loopable[i], i);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} else if (helpers.isObject(loopable)) {\r\n\t\t\tkeys = Object.keys(loopable);\r\n\t\t\tlen = keys.length;\r\n\t\t\tfor (i = 0; i < len; i++) {\r\n\t\t\t\tfn.call(thisArg, loopable[keys[i]], keys[i]);\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Returns true if the `a0` and `a1` arrays have the same content, else returns false.\r\n\t * @see https://stackoverflow.com/a/14853974\r\n\t * @param {Array} a0 - The array to compare\r\n\t * @param {Array} a1 - The array to compare\r\n\t * @returns {boolean}\r\n\t */\r\n\tarrayEquals: function(a0, a1) {\r\n\t\tvar i, ilen, v0, v1;\r\n\r\n\t\tif (!a0 || !a1 || a0.length !== a1.length) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tfor (i = 0, ilen = a0.length; i < ilen; ++i) {\r\n\t\t\tv0 = a0[i];\r\n\t\t\tv1 = a1[i];\r\n\r\n\t\t\tif (v0 instanceof Array && v1 instanceof Array) {\r\n\t\t\t\tif (!helpers.arrayEquals(v0, v1)) {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t} else if (v0 !== v1) {\r\n\t\t\t\t// NOTE: two different object instances will never be equal: {x:20} != {x:20}\r\n\t\t\t\treturn false;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t},\r\n\r\n\t/**\r\n\t * Returns a deep copy of `source` without keeping references on objects and arrays.\r\n\t * @param {*} source - The value to clone.\r\n\t * @returns {*}\r\n\t */\r\n\tclone: function(source) {\r\n\t\tif (helpers.isArray(source)) {\r\n\t\t\treturn source.map(helpers.clone);\r\n\t\t}\r\n\r\n\t\tif (helpers.isObject(source)) {\r\n\t\t\tvar target = Object.create(source);\r\n\t\t\tvar keys = Object.keys(source);\r\n\t\t\tvar klen = keys.length;\r\n\t\t\tvar k = 0;\r\n\r\n\t\t\tfor (; k < klen; ++k) {\r\n\t\t\t\ttarget[keys[k]] = helpers.clone(source[keys[k]]);\r\n\t\t\t}\r\n\r\n\t\t\treturn target;\r\n\t\t}\r\n\r\n\t\treturn source;\r\n\t},\r\n\r\n\t/**\r\n\t * The default merger when Chart.helpers.merge is called without merger option.\r\n\t * Note(SB): also used by mergeConfig and mergeScaleConfig as fallback.\r\n\t * @private\r\n\t */\r\n\t_merger: function(key, target, source, options) {\r\n\t\tif (!isValidKey(key)) {\r\n\t\t\t// We want to ensure we do not copy prototypes over\r\n\t\t\t// as this can pollute global namespaces\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tvar tval = target[key];\r\n\t\tvar sval = source[key];\r\n\r\n\t\tif (helpers.isObject(tval) && helpers.isObject(sval)) {\r\n\t\t\thelpers.merge(tval, sval, options);\r\n\t\t} else {\r\n\t\t\ttarget[key] = helpers.clone(sval);\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Merges source[key] in target[key] only if target[key] is undefined.\r\n\t * @private\r\n\t */\r\n\t_mergerIf: function(key, target, source) {\r\n\t\tif (!isValidKey(key)) {\r\n\t\t\t// We want to ensure we do not copy prototypes over\r\n\t\t\t// as this can pollute global namespaces\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tvar tval = target[key];\r\n\t\tvar sval = source[key];\r\n\r\n\t\tif (helpers.isObject(tval) && helpers.isObject(sval)) {\r\n\t\t\thelpers.mergeIf(tval, sval);\r\n\t\t} else if (!target.hasOwnProperty(key)) {\r\n\t\t\ttarget[key] = helpers.clone(sval);\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Recursively deep copies `source` properties into `target` with the given `options`.\r\n\t * IMPORTANT: `target` is not cloned and will be updated with `source` properties.\r\n\t * @param {object} target - The target object in which all sources are merged into.\r\n\t * @param {object|object[]} source - Object(s) to merge into `target`.\r\n\t * @param {object} [options] - Merging options:\r\n\t * @param {function} [options.merger] - The merge method (key, target, source, options)\r\n\t * @returns {object} The `target` object.\r\n\t */\r\n\tmerge: function(target, source, options) {\r\n\t\tvar sources = helpers.isArray(source) ? source : [source];\r\n\t\tvar ilen = sources.length;\r\n\t\tvar merge, i, keys, klen, k;\r\n\r\n\t\tif (!helpers.isObject(target)) {\r\n\t\t\treturn target;\r\n\t\t}\r\n\r\n\t\toptions = options || {};\r\n\t\tmerge = options.merger || helpers._merger;\r\n\r\n\t\tfor (i = 0; i < ilen; ++i) {\r\n\t\t\tsource = sources[i];\r\n\t\t\tif (!helpers.isObject(source)) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tkeys = Object.keys(source);\r\n\t\t\tfor (k = 0, klen = keys.length; k < klen; ++k) {\r\n\t\t\t\tmerge(keys[k], target, source, options);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn target;\r\n\t},\r\n\r\n\t/**\r\n\t * Recursively deep copies `source` properties into `target` *only* if not defined in target.\r\n\t * IMPORTANT: `target` is not cloned and will be updated with `source` properties.\r\n\t * @param {object} target - The target object in which all sources are merged into.\r\n\t * @param {object|object[]} source - Object(s) to merge into `target`.\r\n\t * @returns {object} The `target` object.\r\n\t */\r\n\tmergeIf: function(target, source) {\r\n\t\treturn helpers.merge(target, source, {merger: helpers._mergerIf});\r\n\t},\r\n\r\n\t/**\r\n\t * Applies the contents of two or more objects together into the first object.\r\n\t * @param {object} target - The target object in which all objects are merged into.\r\n\t * @param {object} arg1 - Object containing additional properties to merge in target.\r\n\t * @param {object} argN - Additional objects containing properties to merge in target.\r\n\t * @returns {object} The `target` object.\r\n\t */\r\n\textend: Object.assign || function(target) {\r\n\t\treturn helpers.merge(target, [].slice.call(arguments, 1), {\r\n\t\t\tmerger: function(key, dst, src) {\r\n\t\t\t\tdst[key] = src[key];\r\n\t\t\t}\r\n\t\t});\r\n\t},\r\n\r\n\t/**\r\n\t * Basic javascript inheritance based on the model created in Backbone.js\r\n\t */\r\n\tinherits: function(extensions) {\r\n\t\tvar me = this;\r\n\t\tvar ChartElement = (extensions && extensions.hasOwnProperty('constructor')) ? extensions.constructor : function() {\r\n\t\t\treturn me.apply(this, arguments);\r\n\t\t};\r\n\r\n\t\tvar Surrogate = function() {\r\n\t\t\tthis.constructor = ChartElement;\r\n\t\t};\r\n\r\n\t\tSurrogate.prototype = me.prototype;\r\n\t\tChartElement.prototype = new Surrogate();\r\n\t\tChartElement.extend = helpers.inherits;\r\n\r\n\t\tif (extensions) {\r\n\t\t\thelpers.extend(ChartElement.prototype, extensions);\r\n\t\t}\r\n\r\n\t\tChartElement.__super__ = me.prototype;\r\n\t\treturn ChartElement;\r\n\t},\r\n\r\n\t_deprecated: function(scope, value, previous, current) {\r\n\t\tif (value !== undefined) {\r\n\t\t\tconsole.warn(scope + ': \"' + previous +\r\n\t\t\t\t'\" is deprecated. Please use \"' + current + '\" instead');\r\n\t\t}\r\n\t}\r\n};\r\n\r\nvar helpers_core = helpers;\r\n\r\n// DEPRECATIONS\r\n\r\n/**\r\n * Provided for backward compatibility, use Chart.helpers.callback instead.\r\n * @function Chart.helpers.callCallback\r\n * @deprecated since version 2.6.0\r\n * @todo remove at version 3\r\n * @private\r\n */\r\nhelpers.callCallback = helpers.callback;\r\n\r\n/**\r\n * Provided for backward compatibility, use Array.prototype.indexOf instead.\r\n * Array.prototype.indexOf compatibility: Chrome, Opera, Safari, FF1.5+, IE9+\r\n * @function Chart.helpers.indexOf\r\n * @deprecated since version 2.7.0\r\n * @todo remove at version 3\r\n * @private\r\n */\r\nhelpers.indexOf = function(array, item, fromIndex) {\r\n\treturn Array.prototype.indexOf.call(array, item, fromIndex);\r\n};\r\n\r\n/**\r\n * Provided for backward compatibility, use Chart.helpers.valueOrDefault instead.\r\n * @function Chart.helpers.getValueOrDefault\r\n * @deprecated since version 2.7.0\r\n * @todo remove at version 3\r\n * @private\r\n */\r\nhelpers.getValueOrDefault = helpers.valueOrDefault;\r\n\r\n/**\r\n * Provided for backward compatibility, use Chart.helpers.valueAtIndexOrDefault instead.\r\n * @function Chart.helpers.getValueAtIndexOrDefault\r\n * @deprecated since version 2.7.0\r\n * @todo remove at version 3\r\n * @private\r\n */\r\nhelpers.getValueAtIndexOrDefault = helpers.valueAtIndexOrDefault;\n\n/**\r\n * Easing functions adapted from Robert Penner's easing equations.\r\n * @namespace Chart.helpers.easingEffects\r\n * @see http://www.robertpenner.com/easing/\r\n */\r\nvar effects = {\r\n\tlinear: function(t) {\r\n\t\treturn t;\r\n\t},\r\n\r\n\teaseInQuad: function(t) {\r\n\t\treturn t * t;\r\n\t},\r\n\r\n\teaseOutQuad: function(t) {\r\n\t\treturn -t * (t - 2);\r\n\t},\r\n\r\n\teaseInOutQuad: function(t) {\r\n\t\tif ((t /= 0.5) < 1) {\r\n\t\t\treturn 0.5 * t * t;\r\n\t\t}\r\n\t\treturn -0.5 * ((--t) * (t - 2) - 1);\r\n\t},\r\n\r\n\teaseInCubic: function(t) {\r\n\t\treturn t * t * t;\r\n\t},\r\n\r\n\teaseOutCubic: function(t) {\r\n\t\treturn (t = t - 1) * t * t + 1;\r\n\t},\r\n\r\n\teaseInOutCubic: function(t) {\r\n\t\tif ((t /= 0.5) < 1) {\r\n\t\t\treturn 0.5 * t * t * t;\r\n\t\t}\r\n\t\treturn 0.5 * ((t -= 2) * t * t + 2);\r\n\t},\r\n\r\n\teaseInQuart: function(t) {\r\n\t\treturn t * t * t * t;\r\n\t},\r\n\r\n\teaseOutQuart: function(t) {\r\n\t\treturn -((t = t - 1) * t * t * t - 1);\r\n\t},\r\n\r\n\teaseInOutQuart: function(t) {\r\n\t\tif ((t /= 0.5) < 1) {\r\n\t\t\treturn 0.5 * t * t * t * t;\r\n\t\t}\r\n\t\treturn -0.5 * ((t -= 2) * t * t * t - 2);\r\n\t},\r\n\r\n\teaseInQuint: function(t) {\r\n\t\treturn t * t * t * t * t;\r\n\t},\r\n\r\n\teaseOutQuint: function(t) {\r\n\t\treturn (t = t - 1) * t * t * t * t + 1;\r\n\t},\r\n\r\n\teaseInOutQuint: function(t) {\r\n\t\tif ((t /= 0.5) < 1) {\r\n\t\t\treturn 0.5 * t * t * t * t * t;\r\n\t\t}\r\n\t\treturn 0.5 * ((t -= 2) * t * t * t * t + 2);\r\n\t},\r\n\r\n\teaseInSine: function(t) {\r\n\t\treturn -Math.cos(t * (Math.PI / 2)) + 1;\r\n\t},\r\n\r\n\teaseOutSine: function(t) {\r\n\t\treturn Math.sin(t * (Math.PI / 2));\r\n\t},\r\n\r\n\teaseInOutSine: function(t) {\r\n\t\treturn -0.5 * (Math.cos(Math.PI * t) - 1);\r\n\t},\r\n\r\n\teaseInExpo: function(t) {\r\n\t\treturn (t === 0) ? 0 : Math.pow(2, 10 * (t - 1));\r\n\t},\r\n\r\n\teaseOutExpo: function(t) {\r\n\t\treturn (t === 1) ? 1 : -Math.pow(2, -10 * t) + 1;\r\n\t},\r\n\r\n\teaseInOutExpo: function(t) {\r\n\t\tif (t === 0) {\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t\tif (t === 1) {\r\n\t\t\treturn 1;\r\n\t\t}\r\n\t\tif ((t /= 0.5) < 1) {\r\n\t\t\treturn 0.5 * Math.pow(2, 10 * (t - 1));\r\n\t\t}\r\n\t\treturn 0.5 * (-Math.pow(2, -10 * --t) + 2);\r\n\t},\r\n\r\n\teaseInCirc: function(t) {\r\n\t\tif (t >= 1) {\r\n\t\t\treturn t;\r\n\t\t}\r\n\t\treturn -(Math.sqrt(1 - t * t) - 1);\r\n\t},\r\n\r\n\teaseOutCirc: function(t) {\r\n\t\treturn Math.sqrt(1 - (t = t - 1) * t);\r\n\t},\r\n\r\n\teaseInOutCirc: function(t) {\r\n\t\tif ((t /= 0.5) < 1) {\r\n\t\t\treturn -0.5 * (Math.sqrt(1 - t * t) - 1);\r\n\t\t}\r\n\t\treturn 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1);\r\n\t},\r\n\r\n\teaseInElastic: function(t) {\r\n\t\tvar s = 1.70158;\r\n\t\tvar p = 0;\r\n\t\tvar a = 1;\r\n\t\tif (t === 0) {\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t\tif (t === 1) {\r\n\t\t\treturn 1;\r\n\t\t}\r\n\t\tif (!p) {\r\n\t\t\tp = 0.3;\r\n\t\t}\r\n\t\tif (a < 1) {\r\n\t\t\ta = 1;\r\n\t\t\ts = p / 4;\r\n\t\t} else {\r\n\t\t\ts = p / (2 * Math.PI) * Math.asin(1 / a);\r\n\t\t}\r\n\t\treturn -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p));\r\n\t},\r\n\r\n\teaseOutElastic: function(t) {\r\n\t\tvar s = 1.70158;\r\n\t\tvar p = 0;\r\n\t\tvar a = 1;\r\n\t\tif (t === 0) {\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t\tif (t === 1) {\r\n\t\t\treturn 1;\r\n\t\t}\r\n\t\tif (!p) {\r\n\t\t\tp = 0.3;\r\n\t\t}\r\n\t\tif (a < 1) {\r\n\t\t\ta = 1;\r\n\t\t\ts = p / 4;\r\n\t\t} else {\r\n\t\t\ts = p / (2 * Math.PI) * Math.asin(1 / a);\r\n\t\t}\r\n\t\treturn a * Math.pow(2, -10 * t) * Math.sin((t - s) * (2 * Math.PI) / p) + 1;\r\n\t},\r\n\r\n\teaseInOutElastic: function(t) {\r\n\t\tvar s = 1.70158;\r\n\t\tvar p = 0;\r\n\t\tvar a = 1;\r\n\t\tif (t === 0) {\r\n\t\t\treturn 0;\r\n\t\t}\r\n\t\tif ((t /= 0.5) === 2) {\r\n\t\t\treturn 1;\r\n\t\t}\r\n\t\tif (!p) {\r\n\t\t\tp = 0.45;\r\n\t\t}\r\n\t\tif (a < 1) {\r\n\t\t\ta = 1;\r\n\t\t\ts = p / 4;\r\n\t\t} else {\r\n\t\t\ts = p / (2 * Math.PI) * Math.asin(1 / a);\r\n\t\t}\r\n\t\tif (t < 1) {\r\n\t\t\treturn -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p));\r\n\t\t}\r\n\t\treturn a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p) * 0.5 + 1;\r\n\t},\r\n\teaseInBack: function(t) {\r\n\t\tvar s = 1.70158;\r\n\t\treturn t * t * ((s + 1) * t - s);\r\n\t},\r\n\r\n\teaseOutBack: function(t) {\r\n\t\tvar s = 1.70158;\r\n\t\treturn (t = t - 1) * t * ((s + 1) * t + s) + 1;\r\n\t},\r\n\r\n\teaseInOutBack: function(t) {\r\n\t\tvar s = 1.70158;\r\n\t\tif ((t /= 0.5) < 1) {\r\n\t\t\treturn 0.5 * (t * t * (((s *= (1.525)) + 1) * t - s));\r\n\t\t}\r\n\t\treturn 0.5 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2);\r\n\t},\r\n\r\n\teaseInBounce: function(t) {\r\n\t\treturn 1 - effects.easeOutBounce(1 - t);\r\n\t},\r\n\r\n\teaseOutBounce: function(t) {\r\n\t\tif (t < (1 / 2.75)) {\r\n\t\t\treturn 7.5625 * t * t;\r\n\t\t}\r\n\t\tif (t < (2 / 2.75)) {\r\n\t\t\treturn 7.5625 * (t -= (1.5 / 2.75)) * t + 0.75;\r\n\t\t}\r\n\t\tif (t < (2.5 / 2.75)) {\r\n\t\t\treturn 7.5625 * (t -= (2.25 / 2.75)) * t + 0.9375;\r\n\t\t}\r\n\t\treturn 7.5625 * (t -= (2.625 / 2.75)) * t + 0.984375;\r\n\t},\r\n\r\n\teaseInOutBounce: function(t) {\r\n\t\tif (t < 0.5) {\r\n\t\t\treturn effects.easeInBounce(t * 2) * 0.5;\r\n\t\t}\r\n\t\treturn effects.easeOutBounce(t * 2 - 1) * 0.5 + 0.5;\r\n\t}\r\n};\r\n\r\nvar helpers_easing = {\r\n\teffects: effects\r\n};\r\n\r\n// DEPRECATIONS\r\n\r\n/**\r\n * Provided for backward compatibility, use Chart.helpers.easing.effects instead.\r\n * @function Chart.helpers.easingEffects\r\n * @deprecated since version 2.7.0\r\n * @todo remove at version 3\r\n * @private\r\n */\r\nhelpers_core.easingEffects = effects;\n\nvar PI = Math.PI;\r\nvar RAD_PER_DEG = PI / 180;\r\nvar DOUBLE_PI = PI * 2;\r\nvar HALF_PI = PI / 2;\r\nvar QUARTER_PI = PI / 4;\r\nvar TWO_THIRDS_PI = PI * 2 / 3;\r\n\r\n/**\r\n * @namespace Chart.helpers.canvas\r\n */\r\nvar exports$1 = {\r\n\t/**\r\n\t * Clears the entire canvas associated to the given `chart`.\r\n\t * @param {Chart} chart - The chart for which to clear the canvas.\r\n\t */\r\n\tclear: function(chart) {\r\n\t\tchart.ctx.clearRect(0, 0, chart.width, chart.height);\r\n\t},\r\n\r\n\t/**\r\n\t * Creates a \"path\" for a rectangle with rounded corners at position (x, y) with a\r\n\t * given size (width, height) and the same `radius` for all corners.\r\n\t * @param {CanvasRenderingContext2D} ctx - The canvas 2D Context.\r\n\t * @param {number} x - The x axis of the coordinate for the rectangle starting point.\r\n\t * @param {number} y - The y axis of the coordinate for the rectangle starting point.\r\n\t * @param {number} width - The rectangle's width.\r\n\t * @param {number} height - The rectangle's height.\r\n\t * @param {number} radius - The rounded amount (in pixels) for the four corners.\r\n\t * @todo handle `radius` as top-left, top-right, bottom-right, bottom-left array/object?\r\n\t */\r\n\troundedRect: function(ctx, x, y, width, height, radius) {\r\n\t\tif (radius) {\r\n\t\t\tvar r = Math.min(radius, height / 2, width / 2);\r\n\t\t\tvar left = x + r;\r\n\t\t\tvar top = y + r;\r\n\t\t\tvar right = x + width - r;\r\n\t\t\tvar bottom = y + height - r;\r\n\r\n\t\t\tctx.moveTo(x, top);\r\n\t\t\tif (left < right && top < bottom) {\r\n\t\t\t\tctx.arc(left, top, r, -PI, -HALF_PI);\r\n\t\t\t\tctx.arc(right, top, r, -HALF_PI, 0);\r\n\t\t\t\tctx.arc(right, bottom, r, 0, HALF_PI);\r\n\t\t\t\tctx.arc(left, bottom, r, HALF_PI, PI);\r\n\t\t\t} else if (left < right) {\r\n\t\t\t\tctx.moveTo(left, y);\r\n\t\t\t\tctx.arc(right, top, r, -HALF_PI, HALF_PI);\r\n\t\t\t\tctx.arc(left, top, r, HALF_PI, PI + HALF_PI);\r\n\t\t\t} else if (top < bottom) {\r\n\t\t\t\tctx.arc(left, top, r, -PI, 0);\r\n\t\t\t\tctx.arc(left, bottom, r, 0, PI);\r\n\t\t\t} else {\r\n\t\t\t\tctx.arc(left, top, r, -PI, PI);\r\n\t\t\t}\r\n\t\t\tctx.closePath();\r\n\t\t\tctx.moveTo(x, y);\r\n\t\t} else {\r\n\t\t\tctx.rect(x, y, width, height);\r\n\t\t}\r\n\t},\r\n\r\n\tdrawPoint: function(ctx, style, radius, x, y, rotation) {\r\n\t\tvar type, xOffset, yOffset, size, cornerRadius;\r\n\t\tvar rad = (rotation || 0) * RAD_PER_DEG;\r\n\r\n\t\tif (style && typeof style === 'object') {\r\n\t\t\ttype = style.toString();\r\n\t\t\tif (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') {\r\n\t\t\t\tctx.save();\r\n\t\t\t\tctx.translate(x, y);\r\n\t\t\t\tctx.rotate(rad);\r\n\t\t\t\tctx.drawImage(style, -style.width / 2, -style.height / 2, style.width, style.height);\r\n\t\t\t\tctx.restore();\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (isNaN(radius) || radius <= 0) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tctx.beginPath();\r\n\r\n\t\tswitch (style) {\r\n\t\t// Default includes circle\r\n\t\tdefault:\r\n\t\t\tctx.arc(x, y, radius, 0, DOUBLE_PI);\r\n\t\t\tctx.closePath();\r\n\t\t\tbreak;\r\n\t\tcase 'triangle':\r\n\t\t\tctx.moveTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius);\r\n\t\t\trad += TWO_THIRDS_PI;\r\n\t\t\tctx.lineTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius);\r\n\t\t\trad += TWO_THIRDS_PI;\r\n\t\t\tctx.lineTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius);\r\n\t\t\tctx.closePath();\r\n\t\t\tbreak;\r\n\t\tcase 'rectRounded':\r\n\t\t\t// NOTE: the rounded rect implementation changed to use `arc` instead of\r\n\t\t\t// `quadraticCurveTo` since it generates better results when rect is\r\n\t\t\t// almost a circle. 0.516 (instead of 0.5) produces results with visually\r\n\t\t\t// closer proportion to the previous impl and it is inscribed in the\r\n\t\t\t// circle with `radius`. For more details, see the following PRs:\r\n\t\t\t// https://github.com/chartjs/Chart.js/issues/5597\r\n\t\t\t// https://github.com/chartjs/Chart.js/issues/5858\r\n\t\t\tcornerRadius = radius * 0.516;\r\n\t\t\tsize = radius - cornerRadius;\r\n\t\t\txOffset = Math.cos(rad + QUARTER_PI) * size;\r\n\t\t\tyOffset = Math.sin(rad + QUARTER_PI) * size;\r\n\t\t\tctx.arc(x - xOffset, y - yOffset, cornerRadius, rad - PI, rad - HALF_PI);\r\n\t\t\tctx.arc(x + yOffset, y - xOffset, cornerRadius, rad - HALF_PI, rad);\r\n\t\t\tctx.arc(x + xOffset, y + yOffset, cornerRadius, rad, rad + HALF_PI);\r\n\t\t\tctx.arc(x - yOffset, y + xOffset, cornerRadius, rad + HALF_PI, rad + PI);\r\n\t\t\tctx.closePath();\r\n\t\t\tbreak;\r\n\t\tcase 'rect':\r\n\t\t\tif (!rotation) {\r\n\t\t\t\tsize = Math.SQRT1_2 * radius;\r\n\t\t\t\tctx.rect(x - size, y - size, 2 * size, 2 * size);\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t\trad += QUARTER_PI;\r\n\t\t\t/* falls through */\r\n\t\tcase 'rectRot':\r\n\t\t\txOffset = Math.cos(rad) * radius;\r\n\t\t\tyOffset = Math.sin(rad) * radius;\r\n\t\t\tctx.moveTo(x - xOffset, y - yOffset);\r\n\t\t\tctx.lineTo(x + yOffset, y - xOffset);\r\n\t\t\tctx.lineTo(x + xOffset, y + yOffset);\r\n\t\t\tctx.lineTo(x - yOffset, y + xOffset);\r\n\t\t\tctx.closePath();\r\n\t\t\tbreak;\r\n\t\tcase 'crossRot':\r\n\t\t\trad += QUARTER_PI;\r\n\t\t\t/* falls through */\r\n\t\tcase 'cross':\r\n\t\t\txOffset = Math.cos(rad) * radius;\r\n\t\t\tyOffset = Math.sin(rad) * radius;\r\n\t\t\tctx.moveTo(x - xOffset, y - yOffset);\r\n\t\t\tctx.lineTo(x + xOffset, y + yOffset);\r\n\t\t\tctx.moveTo(x + yOffset, y - xOffset);\r\n\t\t\tctx.lineTo(x - yOffset, y + xOffset);\r\n\t\t\tbreak;\r\n\t\tcase 'star':\r\n\t\t\txOffset = Math.cos(rad) * radius;\r\n\t\t\tyOffset = Math.sin(rad) * radius;\r\n\t\t\tctx.moveTo(x - xOffset, y - yOffset);\r\n\t\t\tctx.lineTo(x + xOffset, y + yOffset);\r\n\t\t\tctx.moveTo(x + yOffset, y - xOffset);\r\n\t\t\tctx.lineTo(x - yOffset, y + xOffset);\r\n\t\t\trad += QUARTER_PI;\r\n\t\t\txOffset = Math.cos(rad) * radius;\r\n\t\t\tyOffset = Math.sin(rad) * radius;\r\n\t\t\tctx.moveTo(x - xOffset, y - yOffset);\r\n\t\t\tctx.lineTo(x + xOffset, y + yOffset);\r\n\t\t\tctx.moveTo(x + yOffset, y - xOffset);\r\n\t\t\tctx.lineTo(x - yOffset, y + xOffset);\r\n\t\t\tbreak;\r\n\t\tcase 'line':\r\n\t\t\txOffset = Math.cos(rad) * radius;\r\n\t\t\tyOffset = Math.sin(rad) * radius;\r\n\t\t\tctx.moveTo(x - xOffset, y - yOffset);\r\n\t\t\tctx.lineTo(x + xOffset, y + yOffset);\r\n\t\t\tbreak;\r\n\t\tcase 'dash':\r\n\t\t\tctx.moveTo(x, y);\r\n\t\t\tctx.lineTo(x + Math.cos(rad) * radius, y + Math.sin(rad) * radius);\r\n\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\tctx.fill();\r\n\t\tctx.stroke();\r\n\t},\r\n\r\n\t/**\r\n\t * Returns true if the point is inside the rectangle\r\n\t * @param {object} point - The point to test\r\n\t * @param {object} area - The rectangle\r\n\t * @returns {boolean}\r\n\t * @private\r\n\t */\r\n\t_isPointInArea: function(point, area) {\r\n\t\tvar epsilon = 1e-6; // 1e-6 is margin in pixels for accumulated error.\r\n\r\n\t\treturn point.x > area.left - epsilon && point.x < area.right + epsilon &&\r\n\t\t\tpoint.y > area.top - epsilon && point.y < area.bottom + epsilon;\r\n\t},\r\n\r\n\tclipArea: function(ctx, area) {\r\n\t\tctx.save();\r\n\t\tctx.beginPath();\r\n\t\tctx.rect(area.left, area.top, area.right - area.left, area.bottom - area.top);\r\n\t\tctx.clip();\r\n\t},\r\n\r\n\tunclipArea: function(ctx) {\r\n\t\tctx.restore();\r\n\t},\r\n\r\n\tlineTo: function(ctx, previous, target, flip) {\r\n\t\tvar stepped = target.steppedLine;\r\n\t\tif (stepped) {\r\n\t\t\tif (stepped === 'middle') {\r\n\t\t\t\tvar midpoint = (previous.x + target.x) / 2.0;\r\n\t\t\t\tctx.lineTo(midpoint, flip ? target.y : previous.y);\r\n\t\t\t\tctx.lineTo(midpoint, flip ? previous.y : target.y);\r\n\t\t\t} else if ((stepped === 'after' && !flip) || (stepped !== 'after' && flip)) {\r\n\t\t\t\tctx.lineTo(previous.x, target.y);\r\n\t\t\t} else {\r\n\t\t\t\tctx.lineTo(target.x, previous.y);\r\n\t\t\t}\r\n\t\t\tctx.lineTo(target.x, target.y);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (!target.tension) {\r\n\t\t\tctx.lineTo(target.x, target.y);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tctx.bezierCurveTo(\r\n\t\t\tflip ? previous.controlPointPreviousX : previous.controlPointNextX,\r\n\t\t\tflip ? previous.controlPointPreviousY : previous.controlPointNextY,\r\n\t\t\tflip ? target.controlPointNextX : target.controlPointPreviousX,\r\n\t\t\tflip ? target.controlPointNextY : target.controlPointPreviousY,\r\n\t\t\ttarget.x,\r\n\t\t\ttarget.y);\r\n\t}\r\n};\r\n\r\nvar helpers_canvas = exports$1;\r\n\r\n// DEPRECATIONS\r\n\r\n/**\r\n * Provided for backward compatibility, use Chart.helpers.canvas.clear instead.\r\n * @namespace Chart.helpers.clear\r\n * @deprecated since version 2.7.0\r\n * @todo remove at version 3\r\n * @private\r\n */\r\nhelpers_core.clear = exports$1.clear;\r\n\r\n/**\r\n * Provided for backward compatibility, use Chart.helpers.canvas.roundedRect instead.\r\n * @namespace Chart.helpers.drawRoundedRectangle\r\n * @deprecated since version 2.7.0\r\n * @todo remove at version 3\r\n * @private\r\n */\r\nhelpers_core.drawRoundedRectangle = function(ctx) {\r\n\tctx.beginPath();\r\n\texports$1.roundedRect.apply(exports$1, arguments);\r\n};\n\nvar defaults = {\r\n\t/**\r\n\t * @private\r\n\t */\r\n\t_set: function(scope, values) {\r\n\t\treturn helpers_core.merge(this[scope] || (this[scope] = {}), values);\r\n\t}\r\n};\r\n\r\n// TODO(v3): remove 'global' from namespace.  all default are global and\r\n// there's inconsistency around which options are under 'global'\r\ndefaults._set('global', {\r\n\tdefaultColor: 'rgba(0,0,0,0.1)',\r\n\tdefaultFontColor: '#666',\r\n\tdefaultFontFamily: \"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif\",\r\n\tdefaultFontSize: 12,\r\n\tdefaultFontStyle: 'normal',\r\n\tdefaultLineHeight: 1.2,\r\n\tshowLines: true\r\n});\r\n\r\nvar core_defaults = defaults;\n\nvar valueOrDefault = helpers_core.valueOrDefault;\r\n\r\n/**\r\n * Converts the given font object into a CSS font string.\r\n * @param {object} font - A font object.\r\n * @return {string} The CSS font string. See https://developer.mozilla.org/en-US/docs/Web/CSS/font\r\n * @private\r\n */\r\nfunction toFontString(font) {\r\n\tif (!font || helpers_core.isNullOrUndef(font.size) || helpers_core.isNullOrUndef(font.family)) {\r\n\t\treturn null;\r\n\t}\r\n\r\n\treturn (font.style ? font.style + ' ' : '')\r\n\t\t+ (font.weight ? font.weight + ' ' : '')\r\n\t\t+ font.size + 'px '\r\n\t\t+ font.family;\r\n}\r\n\r\n/**\r\n * @alias Chart.helpers.options\r\n * @namespace\r\n */\r\nvar helpers_options = {\r\n\t/**\r\n\t * Converts the given line height `value` in pixels for a specific font `size`.\r\n\t * @param {number|string} value - The lineHeight to parse (eg. 1.6, '14px', '75%', '1.6em').\r\n\t * @param {number} size - The font size (in pixels) used to resolve relative `value`.\r\n\t * @returns {number} The effective line height in pixels (size * 1.2 if value is invalid).\r\n\t * @see https://developer.mozilla.org/en-US/docs/Web/CSS/line-height\r\n\t * @since 2.7.0\r\n\t */\r\n\ttoLineHeight: function(value, size) {\r\n\t\tvar matches = ('' + value).match(/^(normal|(\\d+(?:\\.\\d+)?)(px|em|%)?)$/);\r\n\t\tif (!matches || matches[1] === 'normal') {\r\n\t\t\treturn size * 1.2;\r\n\t\t}\r\n\r\n\t\tvalue = +matches[2];\r\n\r\n\t\tswitch (matches[3]) {\r\n\t\tcase 'px':\r\n\t\t\treturn value;\r\n\t\tcase '%':\r\n\t\t\tvalue /= 100;\r\n\t\t\tbreak;\r\n\t\t}\r\n\r\n\t\treturn size * value;\r\n\t},\r\n\r\n\t/**\r\n\t * Converts the given value into a padding object with pre-computed width/height.\r\n\t * @param {number|object} value - If a number, set the value to all TRBL component,\r\n\t *  else, if and object, use defined properties and sets undefined ones to 0.\r\n\t * @returns {object} The padding values (top, right, bottom, left, width, height)\r\n\t * @since 2.7.0\r\n\t */\r\n\ttoPadding: function(value) {\r\n\t\tvar t, r, b, l;\r\n\r\n\t\tif (helpers_core.isObject(value)) {\r\n\t\t\tt = +value.top || 0;\r\n\t\t\tr = +value.right || 0;\r\n\t\t\tb = +value.bottom || 0;\r\n\t\t\tl = +value.left || 0;\r\n\t\t} else {\r\n\t\t\tt = r = b = l = +value || 0;\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\ttop: t,\r\n\t\t\tright: r,\r\n\t\t\tbottom: b,\r\n\t\t\tleft: l,\r\n\t\t\theight: t + b,\r\n\t\t\twidth: l + r\r\n\t\t};\r\n\t},\r\n\r\n\t/**\r\n\t * Parses font options and returns the font object.\r\n\t * @param {object} options - A object that contains font options to be parsed.\r\n\t * @return {object} The font object.\r\n\t * @todo Support font.* options and renamed to toFont().\r\n\t * @private\r\n\t */\r\n\t_parseFont: function(options) {\r\n\t\tvar globalDefaults = core_defaults.global;\r\n\t\tvar size = valueOrDefault(options.fontSize, globalDefaults.defaultFontSize);\r\n\t\tvar font = {\r\n\t\t\tfamily: valueOrDefault(options.fontFamily, globalDefaults.defaultFontFamily),\r\n\t\t\tlineHeight: helpers_core.options.toLineHeight(valueOrDefault(options.lineHeight, globalDefaults.defaultLineHeight), size),\r\n\t\t\tsize: size,\r\n\t\t\tstyle: valueOrDefault(options.fontStyle, globalDefaults.defaultFontStyle),\r\n\t\t\tweight: null,\r\n\t\t\tstring: ''\r\n\t\t};\r\n\r\n\t\tfont.string = toFontString(font);\r\n\t\treturn font;\r\n\t},\r\n\r\n\t/**\r\n\t * Evaluates the given `inputs` sequentially and returns the first defined value.\r\n\t * @param {Array} inputs - An array of values, falling back to the last value.\r\n\t * @param {object} [context] - If defined and the current value is a function, the value\r\n\t * is called with `context` as first argument and the result becomes the new input.\r\n\t * @param {number} [index] - If defined and the current value is an array, the value\r\n\t * at `index` become the new input.\r\n\t * @param {object} [info] - object to return information about resolution in\r\n\t * @param {boolean} [info.cacheable] - Will be set to `false` if option is not cacheable.\r\n\t * @since 2.7.0\r\n\t */\r\n\tresolve: function(inputs, context, index, info) {\r\n\t\tvar cacheable = true;\r\n\t\tvar i, ilen, value;\r\n\r\n\t\tfor (i = 0, ilen = inputs.length; i < ilen; ++i) {\r\n\t\t\tvalue = inputs[i];\r\n\t\t\tif (value === undefined) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t\tif (context !== undefined && typeof value === 'function') {\r\n\t\t\t\tvalue = value(context);\r\n\t\t\t\tcacheable = false;\r\n\t\t\t}\r\n\t\t\tif (index !== undefined && helpers_core.isArray(value)) {\r\n\t\t\t\tvalue = value[index];\r\n\t\t\t\tcacheable = false;\r\n\t\t\t}\r\n\t\t\tif (value !== undefined) {\r\n\t\t\t\tif (info && !cacheable) {\r\n\t\t\t\t\tinfo.cacheable = false;\r\n\t\t\t\t}\r\n\t\t\t\treturn value;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n};\n\n/**\r\n * @alias Chart.helpers.math\r\n * @namespace\r\n */\r\nvar exports$2 = {\r\n\t/**\r\n\t * Returns an array of factors sorted from 1 to sqrt(value)\r\n\t * @private\r\n\t */\r\n\t_factorize: function(value) {\r\n\t\tvar result = [];\r\n\t\tvar sqrt = Math.sqrt(value);\r\n\t\tvar i;\r\n\r\n\t\tfor (i = 1; i < sqrt; i++) {\r\n\t\t\tif (value % i === 0) {\r\n\t\t\t\tresult.push(i);\r\n\t\t\t\tresult.push(value / i);\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (sqrt === (sqrt | 0)) { // if value is a square number\r\n\t\t\tresult.push(sqrt);\r\n\t\t}\r\n\r\n\t\tresult.sort(function(a, b) {\r\n\t\t\treturn a - b;\r\n\t\t}).pop();\r\n\t\treturn result;\r\n\t},\r\n\r\n\tlog10: Math.log10 || function(x) {\r\n\t\tvar exponent = Math.log(x) * Math.LOG10E; // Math.LOG10E = 1 / Math.LN10.\r\n\t\t// Check for whole powers of 10,\r\n\t\t// which due to floating point rounding error should be corrected.\r\n\t\tvar powerOf10 = Math.round(exponent);\r\n\t\tvar isPowerOf10 = x === Math.pow(10, powerOf10);\r\n\r\n\t\treturn isPowerOf10 ? powerOf10 : exponent;\r\n\t}\r\n};\r\n\r\nvar helpers_math = exports$2;\r\n\r\n// DEPRECATIONS\r\n\r\n/**\r\n * Provided for backward compatibility, use Chart.helpers.math.log10 instead.\r\n * @namespace Chart.helpers.log10\r\n * @deprecated since version 2.9.0\r\n * @todo remove at version 3\r\n * @private\r\n */\r\nhelpers_core.log10 = exports$2.log10;\n\nvar getRtlAdapter = function(rectX, width) {\r\n\treturn {\r\n\t\tx: function(x) {\r\n\t\t\treturn rectX + rectX + width - x;\r\n\t\t},\r\n\t\tsetWidth: function(w) {\r\n\t\t\twidth = w;\r\n\t\t},\r\n\t\ttextAlign: function(align) {\r\n\t\t\tif (align === 'center') {\r\n\t\t\t\treturn align;\r\n\t\t\t}\r\n\t\t\treturn align === 'right' ? 'left' : 'right';\r\n\t\t},\r\n\t\txPlus: function(x, value) {\r\n\t\t\treturn x - value;\r\n\t\t},\r\n\t\tleftForLtr: function(x, itemWidth) {\r\n\t\t\treturn x - itemWidth;\r\n\t\t},\r\n\t};\r\n};\r\n\r\nvar getLtrAdapter = function() {\r\n\treturn {\r\n\t\tx: function(x) {\r\n\t\t\treturn x;\r\n\t\t},\r\n\t\tsetWidth: function(w) { // eslint-disable-line no-unused-vars\r\n\t\t},\r\n\t\ttextAlign: function(align) {\r\n\t\t\treturn align;\r\n\t\t},\r\n\t\txPlus: function(x, value) {\r\n\t\t\treturn x + value;\r\n\t\t},\r\n\t\tleftForLtr: function(x, _itemWidth) { // eslint-disable-line no-unused-vars\r\n\t\t\treturn x;\r\n\t\t},\r\n\t};\r\n};\r\n\r\nvar getAdapter = function(rtl, rectX, width) {\r\n\treturn rtl ? getRtlAdapter(rectX, width) : getLtrAdapter();\r\n};\r\n\r\nvar overrideTextDirection = function(ctx, direction) {\r\n\tvar style, original;\r\n\tif (direction === 'ltr' || direction === 'rtl') {\r\n\t\tstyle = ctx.canvas.style;\r\n\t\toriginal = [\r\n\t\t\tstyle.getPropertyValue('direction'),\r\n\t\t\tstyle.getPropertyPriority('direction'),\r\n\t\t];\r\n\r\n\t\tstyle.setProperty('direction', direction, 'important');\r\n\t\tctx.prevTextDirection = original;\r\n\t}\r\n};\r\n\r\nvar restoreTextDirection = function(ctx) {\r\n\tvar original = ctx.prevTextDirection;\r\n\tif (original !== undefined) {\r\n\t\tdelete ctx.prevTextDirection;\r\n\t\tctx.canvas.style.setProperty('direction', original[0], original[1]);\r\n\t}\r\n};\r\n\r\nvar helpers_rtl = {\r\n\tgetRtlAdapter: getAdapter,\r\n\toverrideTextDirection: overrideTextDirection,\r\n\trestoreTextDirection: restoreTextDirection,\r\n};\n\nvar helpers$1 = helpers_core;\r\nvar easing = helpers_easing;\r\nvar canvas = helpers_canvas;\r\nvar options = helpers_options;\r\nvar math = helpers_math;\r\nvar rtl = helpers_rtl;\nhelpers$1.easing = easing;\nhelpers$1.canvas = canvas;\nhelpers$1.options = options;\nhelpers$1.math = math;\nhelpers$1.rtl = rtl;\n\nfunction interpolate(start, view, model, ease) {\r\n\tvar keys = Object.keys(model);\r\n\tvar i, ilen, key, actual, origin, target, type, c0, c1;\r\n\r\n\tfor (i = 0, ilen = keys.length; i < ilen; ++i) {\r\n\t\tkey = keys[i];\r\n\r\n\t\ttarget = model[key];\r\n\r\n\t\t// if a value is added to the model after pivot() has been called, the view\r\n\t\t// doesn't contain it, so let's initialize the view to the target value.\r\n\t\tif (!view.hasOwnProperty(key)) {\r\n\t\t\tview[key] = target;\r\n\t\t}\r\n\r\n\t\tactual = view[key];\r\n\r\n\t\tif (actual === target || key[0] === '_') {\r\n\t\t\tcontinue;\r\n\t\t}\r\n\r\n\t\tif (!start.hasOwnProperty(key)) {\r\n\t\t\tstart[key] = actual;\r\n\t\t}\r\n\r\n\t\torigin = start[key];\r\n\r\n\t\ttype = typeof target;\r\n\r\n\t\tif (type === typeof origin) {\r\n\t\t\tif (type === 'string') {\r\n\t\t\t\tc0 = chartjsColor(origin);\r\n\t\t\t\tif (c0.valid) {\r\n\t\t\t\t\tc1 = chartjsColor(target);\r\n\t\t\t\t\tif (c1.valid) {\r\n\t\t\t\t\t\tview[key] = c1.mix(c0, ease).rgbString();\r\n\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t} else if (helpers$1.isFinite(origin) && helpers$1.isFinite(target)) {\r\n\t\t\t\tview[key] = origin + (target - origin) * ease;\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tview[key] = target;\r\n\t}\r\n}\r\n\r\nvar Element = function(configuration) {\r\n\thelpers$1.extend(this, configuration);\r\n\tthis.initialize.apply(this, arguments);\r\n};\r\n\r\nhelpers$1.extend(Element.prototype, {\r\n\t_type: undefined,\r\n\r\n\tinitialize: function() {\r\n\t\tthis.hidden = false;\r\n\t},\r\n\r\n\tpivot: function() {\r\n\t\tvar me = this;\r\n\t\tif (!me._view) {\r\n\t\t\tme._view = helpers$1.extend({}, me._model);\r\n\t\t}\r\n\t\tme._start = {};\r\n\t\treturn me;\r\n\t},\r\n\r\n\ttransition: function(ease) {\r\n\t\tvar me = this;\r\n\t\tvar model = me._model;\r\n\t\tvar start = me._start;\r\n\t\tvar view = me._view;\r\n\r\n\t\t// No animation -> No Transition\r\n\t\tif (!model || ease === 1) {\r\n\t\t\tme._view = helpers$1.extend({}, model);\r\n\t\t\tme._start = null;\r\n\t\t\treturn me;\r\n\t\t}\r\n\r\n\t\tif (!view) {\r\n\t\t\tview = me._view = {};\r\n\t\t}\r\n\r\n\t\tif (!start) {\r\n\t\t\tstart = me._start = {};\r\n\t\t}\r\n\r\n\t\tinterpolate(start, view, model, ease);\r\n\r\n\t\treturn me;\r\n\t},\r\n\r\n\ttooltipPosition: function() {\r\n\t\treturn {\r\n\t\t\tx: this._model.x,\r\n\t\t\ty: this._model.y\r\n\t\t};\r\n\t},\r\n\r\n\thasValue: function() {\r\n\t\treturn helpers$1.isNumber(this._model.x) && helpers$1.isNumber(this._model.y);\r\n\t}\r\n});\r\n\r\nElement.extend = helpers$1.inherits;\r\n\r\nvar core_element = Element;\n\nvar exports$3 = core_element.extend({\r\n\tchart: null, // the animation associated chart instance\r\n\tcurrentStep: 0, // the current animation step\r\n\tnumSteps: 60, // default number of steps\r\n\teasing: '', // the easing to use for this animation\r\n\trender: null, // render function used by the animation service\r\n\r\n\tonAnimationProgress: null, // user specified callback to fire on each step of the animation\r\n\tonAnimationComplete: null, // user specified callback to fire when the animation finishes\r\n});\r\n\r\nvar core_animation = exports$3;\r\n\r\n// DEPRECATIONS\r\n\r\n/**\r\n * Provided for backward compatibility, use Chart.Animation instead\r\n * @prop Chart.Animation#animationObject\r\n * @deprecated since version 2.6.0\r\n * @todo remove at version 3\r\n */\r\nObject.defineProperty(exports$3.prototype, 'animationObject', {\r\n\tget: function() {\r\n\t\treturn this;\r\n\t}\r\n});\r\n\r\n/**\r\n * Provided for backward compatibility, use Chart.Animation#chart instead\r\n * @prop Chart.Animation#chartInstance\r\n * @deprecated since version 2.6.0\r\n * @todo remove at version 3\r\n */\r\nObject.defineProperty(exports$3.prototype, 'chartInstance', {\r\n\tget: function() {\r\n\t\treturn this.chart;\r\n\t},\r\n\tset: function(value) {\r\n\t\tthis.chart = value;\r\n\t}\r\n});\n\ncore_defaults._set('global', {\r\n\tanimation: {\r\n\t\tduration: 1000,\r\n\t\teasing: 'easeOutQuart',\r\n\t\tonProgress: helpers$1.noop,\r\n\t\tonComplete: helpers$1.noop\r\n\t}\r\n});\r\n\r\nvar core_animations = {\r\n\tanimations: [],\r\n\trequest: null,\r\n\r\n\t/**\r\n\t * @param {Chart} chart - The chart to animate.\r\n\t * @param {Chart.Animation} animation - The animation that we will animate.\r\n\t * @param {number} duration - The animation duration in ms.\r\n\t * @param {boolean} lazy - if true, the chart is not marked as animating to enable more responsive interactions\r\n\t */\r\n\taddAnimation: function(chart, animation, duration, lazy) {\r\n\t\tvar animations = this.animations;\r\n\t\tvar i, ilen;\r\n\r\n\t\tanimation.chart = chart;\r\n\t\tanimation.startTime = Date.now();\r\n\t\tanimation.duration = duration;\r\n\r\n\t\tif (!lazy) {\r\n\t\t\tchart.animating = true;\r\n\t\t}\r\n\r\n\t\tfor (i = 0, ilen = animations.length; i < ilen; ++i) {\r\n\t\t\tif (animations[i].chart === chart) {\r\n\t\t\t\tanimations[i] = animation;\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tanimations.push(animation);\r\n\r\n\t\t// If there are no animations queued, manually kickstart a digest, for lack of a better word\r\n\t\tif (animations.length === 1) {\r\n\t\t\tthis.requestAnimationFrame();\r\n\t\t}\r\n\t},\r\n\r\n\tcancelAnimation: function(chart) {\r\n\t\tvar index = helpers$1.findIndex(this.animations, function(animation) {\r\n\t\t\treturn animation.chart === chart;\r\n\t\t});\r\n\r\n\t\tif (index !== -1) {\r\n\t\t\tthis.animations.splice(index, 1);\r\n\t\t\tchart.animating = false;\r\n\t\t}\r\n\t},\r\n\r\n\trequestAnimationFrame: function() {\r\n\t\tvar me = this;\r\n\t\tif (me.request === null) {\r\n\t\t\t// Skip animation frame requests until the active one is executed.\r\n\t\t\t// This can happen when processing mouse events, e.g. 'mousemove'\r\n\t\t\t// and 'mouseout' events will trigger multiple renders.\r\n\t\t\tme.request = helpers$1.requestAnimFrame.call(window, function() {\r\n\t\t\t\tme.request = null;\r\n\t\t\t\tme.startDigest();\r\n\t\t\t});\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n\tstartDigest: function() {\r\n\t\tvar me = this;\r\n\r\n\t\tme.advance();\r\n\r\n\t\t// Do we have more stuff to animate?\r\n\t\tif (me.animations.length > 0) {\r\n\t\t\tme.requestAnimationFrame();\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n\tadvance: function() {\r\n\t\tvar animations = this.animations;\r\n\t\tvar animation, chart, numSteps, nextStep;\r\n\t\tvar i = 0;\r\n\r\n\t\t// 1 animation per chart, so we are looping charts here\r\n\t\twhile (i < animations.length) {\r\n\t\t\tanimation = animations[i];\r\n\t\t\tchart = animation.chart;\r\n\t\t\tnumSteps = animation.numSteps;\r\n\r\n\t\t\t// Make sure that currentStep starts at 1\r\n\t\t\t// https://github.com/chartjs/Chart.js/issues/6104\r\n\t\t\tnextStep = Math.floor((Date.now() - animation.startTime) / animation.duration * numSteps) + 1;\r\n\t\t\tanimation.currentStep = Math.min(nextStep, numSteps);\r\n\r\n\t\t\thelpers$1.callback(animation.render, [chart, animation], chart);\r\n\t\t\thelpers$1.callback(animation.onAnimationProgress, [animation], chart);\r\n\r\n\t\t\tif (animation.currentStep >= numSteps) {\r\n\t\t\t\thelpers$1.callback(animation.onAnimationComplete, [animation], chart);\r\n\t\t\t\tchart.animating = false;\r\n\t\t\t\tanimations.splice(i, 1);\r\n\t\t\t} else {\r\n\t\t\t\t++i;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n};\n\nvar resolve = helpers$1.options.resolve;\r\n\r\nvar arrayEvents = ['push', 'pop', 'shift', 'splice', 'unshift'];\r\n\r\n/**\r\n * Hooks the array methods that add or remove values ('push', pop', 'shift', 'splice',\r\n * 'unshift') and notify the listener AFTER the array has been altered. Listeners are\r\n * called on the 'onData*' callbacks (e.g. onDataPush, etc.) with same arguments.\r\n */\r\nfunction listenArrayEvents(array, listener) {\r\n\tif (array._chartjs) {\r\n\t\tarray._chartjs.listeners.push(listener);\r\n\t\treturn;\r\n\t}\r\n\r\n\tObject.defineProperty(array, '_chartjs', {\r\n\t\tconfigurable: true,\r\n\t\tenumerable: false,\r\n\t\tvalue: {\r\n\t\t\tlisteners: [listener]\r\n\t\t}\r\n\t});\r\n\r\n\tarrayEvents.forEach(function(key) {\r\n\t\tvar method = 'onData' + key.charAt(0).toUpperCase() + key.slice(1);\r\n\t\tvar base = array[key];\r\n\r\n\t\tObject.defineProperty(array, key, {\r\n\t\t\tconfigurable: true,\r\n\t\t\tenumerable: false,\r\n\t\t\tvalue: function() {\r\n\t\t\t\tvar args = Array.prototype.slice.call(arguments);\r\n\t\t\t\tvar res = base.apply(this, args);\r\n\r\n\t\t\t\thelpers$1.each(array._chartjs.listeners, function(object) {\r\n\t\t\t\t\tif (typeof object[method] === 'function') {\r\n\t\t\t\t\t\tobject[method].apply(object, args);\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\r\n\t\t\t\treturn res;\r\n\t\t\t}\r\n\t\t});\r\n\t});\r\n}\r\n\r\n/**\r\n * Removes the given array event listener and cleanup extra attached properties (such as\r\n * the _chartjs stub and overridden methods) if array doesn't have any more listeners.\r\n */\r\nfunction unlistenArrayEvents(array, listener) {\r\n\tvar stub = array._chartjs;\r\n\tif (!stub) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tvar listeners = stub.listeners;\r\n\tvar index = listeners.indexOf(listener);\r\n\tif (index !== -1) {\r\n\t\tlisteners.splice(index, 1);\r\n\t}\r\n\r\n\tif (listeners.length > 0) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tarrayEvents.forEach(function(key) {\r\n\t\tdelete array[key];\r\n\t});\r\n\r\n\tdelete array._chartjs;\r\n}\r\n\r\n// Base class for all dataset controllers (line, bar, etc)\r\nvar DatasetController = function(chart, datasetIndex) {\r\n\tthis.initialize(chart, datasetIndex);\r\n};\r\n\r\nhelpers$1.extend(DatasetController.prototype, {\r\n\r\n\t/**\r\n\t * Element type used to generate a meta dataset (e.g. Chart.element.Line).\r\n\t * @type {Chart.core.element}\r\n\t */\r\n\tdatasetElementType: null,\r\n\r\n\t/**\r\n\t * Element type used to generate a meta data (e.g. Chart.element.Point).\r\n\t * @type {Chart.core.element}\r\n\t */\r\n\tdataElementType: null,\r\n\r\n\t/**\r\n\t * Dataset element option keys to be resolved in _resolveDatasetElementOptions.\r\n\t * A derived controller may override this to resolve controller-specific options.\r\n\t * The keys defined here are for backward compatibility for legend styles.\r\n\t * @private\r\n\t */\r\n\t_datasetElementOptions: [\r\n\t\t'backgroundColor',\r\n\t\t'borderCapStyle',\r\n\t\t'borderColor',\r\n\t\t'borderDash',\r\n\t\t'borderDashOffset',\r\n\t\t'borderJoinStyle',\r\n\t\t'borderWidth'\r\n\t],\r\n\r\n\t/**\r\n\t * Data element option keys to be resolved in _resolveDataElementOptions.\r\n\t * A derived controller may override this to resolve controller-specific options.\r\n\t * The keys defined here are for backward compatibility for legend styles.\r\n\t * @private\r\n\t */\r\n\t_dataElementOptions: [\r\n\t\t'backgroundColor',\r\n\t\t'borderColor',\r\n\t\t'borderWidth',\r\n\t\t'pointStyle'\r\n\t],\r\n\r\n\tinitialize: function(chart, datasetIndex) {\r\n\t\tvar me = this;\r\n\t\tme.chart = chart;\r\n\t\tme.index = datasetIndex;\r\n\t\tme.linkScales();\r\n\t\tme.addElements();\r\n\t\tme._type = me.getMeta().type;\r\n\t},\r\n\r\n\tupdateIndex: function(datasetIndex) {\r\n\t\tthis.index = datasetIndex;\r\n\t},\r\n\r\n\tlinkScales: function() {\r\n\t\tvar me = this;\r\n\t\tvar meta = me.getMeta();\r\n\t\tvar chart = me.chart;\r\n\t\tvar scales = chart.scales;\r\n\t\tvar dataset = me.getDataset();\r\n\t\tvar scalesOpts = chart.options.scales;\r\n\r\n\t\tif (meta.xAxisID === null || !(meta.xAxisID in scales) || dataset.xAxisID) {\r\n\t\t\tmeta.xAxisID = dataset.xAxisID || scalesOpts.xAxes[0].id;\r\n\t\t}\r\n\t\tif (meta.yAxisID === null || !(meta.yAxisID in scales) || dataset.yAxisID) {\r\n\t\t\tmeta.yAxisID = dataset.yAxisID || scalesOpts.yAxes[0].id;\r\n\t\t}\r\n\t},\r\n\r\n\tgetDataset: function() {\r\n\t\treturn this.chart.data.datasets[this.index];\r\n\t},\r\n\r\n\tgetMeta: function() {\r\n\t\treturn this.chart.getDatasetMeta(this.index);\r\n\t},\r\n\r\n\tgetScaleForId: function(scaleID) {\r\n\t\treturn this.chart.scales[scaleID];\r\n\t},\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n\t_getValueScaleId: function() {\r\n\t\treturn this.getMeta().yAxisID;\r\n\t},\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n\t_getIndexScaleId: function() {\r\n\t\treturn this.getMeta().xAxisID;\r\n\t},\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n\t_getValueScale: function() {\r\n\t\treturn this.getScaleForId(this._getValueScaleId());\r\n\t},\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n\t_getIndexScale: function() {\r\n\t\treturn this.getScaleForId(this._getIndexScaleId());\r\n\t},\r\n\r\n\treset: function() {\r\n\t\tthis._update(true);\r\n\t},\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n\tdestroy: function() {\r\n\t\tif (this._data) {\r\n\t\t\tunlistenArrayEvents(this._data, this);\r\n\t\t}\r\n\t},\r\n\r\n\tcreateMetaDataset: function() {\r\n\t\tvar me = this;\r\n\t\tvar type = me.datasetElementType;\r\n\t\treturn type && new type({\r\n\t\t\t_chart: me.chart,\r\n\t\t\t_datasetIndex: me.index\r\n\t\t});\r\n\t},\r\n\r\n\tcreateMetaData: function(index) {\r\n\t\tvar me = this;\r\n\t\tvar type = me.dataElementType;\r\n\t\treturn type && new type({\r\n\t\t\t_chart: me.chart,\r\n\t\t\t_datasetIndex: me.index,\r\n\t\t\t_index: index\r\n\t\t});\r\n\t},\r\n\r\n\taddElements: function() {\r\n\t\tvar me = this;\r\n\t\tvar meta = me.getMeta();\r\n\t\tvar data = me.getDataset().data || [];\r\n\t\tvar metaData = meta.data;\r\n\t\tvar i, ilen;\r\n\r\n\t\tfor (i = 0, ilen = data.length; i < ilen; ++i) {\r\n\t\t\tmetaData[i] = metaData[i] || me.createMetaData(i);\r\n\t\t}\r\n\r\n\t\tmeta.dataset = meta.dataset || me.createMetaDataset();\r\n\t},\r\n\r\n\taddElementAndReset: function(index) {\r\n\t\tvar element = this.createMetaData(index);\r\n\t\tthis.getMeta().data.splice(index, 0, element);\r\n\t\tthis.updateElement(element, index, true);\r\n\t},\r\n\r\n\tbuildOrUpdateElements: function() {\r\n\t\tvar me = this;\r\n\t\tvar dataset = me.getDataset();\r\n\t\tvar data = dataset.data || (dataset.data = []);\r\n\r\n\t\t// In order to correctly handle data addition/deletion animation (an thus simulate\r\n\t\t// real-time charts), we need to monitor these data modifications and synchronize\r\n\t\t// the internal meta data accordingly.\r\n\t\tif (me._data !== data) {\r\n\t\t\tif (me._data) {\r\n\t\t\t\t// This case happens when the user replaced the data array instance.\r\n\t\t\t\tunlistenArrayEvents(me._data, me);\r\n\t\t\t}\r\n\r\n\t\t\tif (data && Object.isExtensible(data)) {\r\n\t\t\t\tlistenArrayEvents(data, me);\r\n\t\t\t}\r\n\t\t\tme._data = data;\r\n\t\t}\r\n\r\n\t\t// Re-sync meta data in case the user replaced the data array or if we missed\r\n\t\t// any updates and so make sure that we handle number of datapoints changing.\r\n\t\tme.resyncElements();\r\n\t},\r\n\r\n\t/**\r\n\t * Returns the merged user-supplied and default dataset-level options\r\n\t * @private\r\n\t */\r\n\t_configure: function() {\r\n\t\tvar me = this;\r\n\t\tme._config = helpers$1.merge(Object.create(null), [\r\n\t\t\tme.chart.options.datasets[me._type],\r\n\t\t\tme.getDataset(),\r\n\t\t], {\r\n\t\t\tmerger: function(key, target, source) {\r\n\t\t\t\tif (key !== '_meta' && key !== 'data') {\r\n\t\t\t\t\thelpers$1._merger(key, target, source);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\t},\r\n\r\n\t_update: function(reset) {\r\n\t\tvar me = this;\r\n\t\tme._configure();\r\n\t\tme._cachedDataOpts = null;\r\n\t\tme.update(reset);\r\n\t},\r\n\r\n\tupdate: helpers$1.noop,\r\n\r\n\ttransition: function(easingValue) {\r\n\t\tvar meta = this.getMeta();\r\n\t\tvar elements = meta.data || [];\r\n\t\tvar ilen = elements.length;\r\n\t\tvar i = 0;\r\n\r\n\t\tfor (; i < ilen; ++i) {\r\n\t\t\telements[i].transition(easingValue);\r\n\t\t}\r\n\r\n\t\tif (meta.dataset) {\r\n\t\t\tmeta.dataset.transition(easingValue);\r\n\t\t}\r\n\t},\r\n\r\n\tdraw: function() {\r\n\t\tvar meta = this.getMeta();\r\n\t\tvar elements = meta.data || [];\r\n\t\tvar ilen = elements.length;\r\n\t\tvar i = 0;\r\n\r\n\t\tif (meta.dataset) {\r\n\t\t\tmeta.dataset.draw();\r\n\t\t}\r\n\r\n\t\tfor (; i < ilen; ++i) {\r\n\t\t\telements[i].draw();\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Returns a set of predefined style properties that should be used to represent the dataset\r\n\t * or the data if the index is specified\r\n\t * @param {number} index - data index\r\n\t * @return {IStyleInterface} style object\r\n\t */\r\n\tgetStyle: function(index) {\r\n\t\tvar me = this;\r\n\t\tvar meta = me.getMeta();\r\n\t\tvar dataset = meta.dataset;\r\n\t\tvar style;\r\n\r\n\t\tme._configure();\r\n\t\tif (dataset && index === undefined) {\r\n\t\t\tstyle = me._resolveDatasetElementOptions(dataset || {});\r\n\t\t} else {\r\n\t\t\tindex = index || 0;\r\n\t\t\tstyle = me._resolveDataElementOptions(meta.data[index] || {}, index);\r\n\t\t}\r\n\r\n\t\tif (style.fill === false || style.fill === null) {\r\n\t\t\tstyle.backgroundColor = style.borderColor;\r\n\t\t}\r\n\r\n\t\treturn style;\r\n\t},\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n\t_resolveDatasetElementOptions: function(element, hover) {\r\n\t\tvar me = this;\r\n\t\tvar chart = me.chart;\r\n\t\tvar datasetOpts = me._config;\r\n\t\tvar custom = element.custom || {};\r\n\t\tvar options = chart.options.elements[me.datasetElementType.prototype._type] || {};\r\n\t\tvar elementOptions = me._datasetElementOptions;\r\n\t\tvar values = {};\r\n\t\tvar i, ilen, key, readKey;\r\n\r\n\t\t// Scriptable options\r\n\t\tvar context = {\r\n\t\t\tchart: chart,\r\n\t\t\tdataset: me.getDataset(),\r\n\t\t\tdatasetIndex: me.index,\r\n\t\t\thover: hover\r\n\t\t};\r\n\r\n\t\tfor (i = 0, ilen = elementOptions.length; i < ilen; ++i) {\r\n\t\t\tkey = elementOptions[i];\r\n\t\t\treadKey = hover ? 'hover' + key.charAt(0).toUpperCase() + key.slice(1) : key;\r\n\t\t\tvalues[key] = resolve([\r\n\t\t\t\tcustom[readKey],\r\n\t\t\t\tdatasetOpts[readKey],\r\n\t\t\t\toptions[readKey]\r\n\t\t\t], context);\r\n\t\t}\r\n\r\n\t\treturn values;\r\n\t},\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n\t_resolveDataElementOptions: function(element, index) {\r\n\t\tvar me = this;\r\n\t\tvar custom = element && element.custom;\r\n\t\tvar cached = me._cachedDataOpts;\r\n\t\tif (cached && !custom) {\r\n\t\t\treturn cached;\r\n\t\t}\r\n\t\tvar chart = me.chart;\r\n\t\tvar datasetOpts = me._config;\r\n\t\tvar options = chart.options.elements[me.dataElementType.prototype._type] || {};\r\n\t\tvar elementOptions = me._dataElementOptions;\r\n\t\tvar values = {};\r\n\r\n\t\t// Scriptable options\r\n\t\tvar context = {\r\n\t\t\tchart: chart,\r\n\t\t\tdataIndex: index,\r\n\t\t\tdataset: me.getDataset(),\r\n\t\t\tdatasetIndex: me.index\r\n\t\t};\r\n\r\n\t\t// `resolve` sets cacheable to `false` if any option is indexed or scripted\r\n\t\tvar info = {cacheable: !custom};\r\n\r\n\t\tvar keys, i, ilen, key;\r\n\r\n\t\tcustom = custom || {};\r\n\r\n\t\tif (helpers$1.isArray(elementOptions)) {\r\n\t\t\tfor (i = 0, ilen = elementOptions.length; i < ilen; ++i) {\r\n\t\t\t\tkey = elementOptions[i];\r\n\t\t\t\tvalues[key] = resolve([\r\n\t\t\t\t\tcustom[key],\r\n\t\t\t\t\tdatasetOpts[key],\r\n\t\t\t\t\toptions[key]\r\n\t\t\t\t], context, index, info);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tkeys = Object.keys(elementOptions);\r\n\t\t\tfor (i = 0, ilen = keys.length; i < ilen; ++i) {\r\n\t\t\t\tkey = keys[i];\r\n\t\t\t\tvalues[key] = resolve([\r\n\t\t\t\t\tcustom[key],\r\n\t\t\t\t\tdatasetOpts[elementOptions[key]],\r\n\t\t\t\t\tdatasetOpts[key],\r\n\t\t\t\t\toptions[key]\r\n\t\t\t\t], context, index, info);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (info.cacheable) {\r\n\t\t\tme._cachedDataOpts = Object.freeze(values);\r\n\t\t}\r\n\r\n\t\treturn values;\r\n\t},\r\n\r\n\tremoveHoverStyle: function(element) {\r\n\t\thelpers$1.merge(element._model, element.$previousStyle || {});\r\n\t\tdelete element.$previousStyle;\r\n\t},\r\n\r\n\tsetHoverStyle: function(element) {\r\n\t\tvar dataset = this.chart.data.datasets[element._datasetIndex];\r\n\t\tvar index = element._index;\r\n\t\tvar custom = element.custom || {};\r\n\t\tvar model = element._model;\r\n\t\tvar getHoverColor = helpers$1.getHoverColor;\r\n\r\n\t\telement.$previousStyle = {\r\n\t\t\tbackgroundColor: model.backgroundColor,\r\n\t\t\tborderColor: model.borderColor,\r\n\t\t\tborderWidth: model.borderWidth\r\n\t\t};\r\n\r\n\t\tmodel.backgroundColor = resolve([custom.hoverBackgroundColor, dataset.hoverBackgroundColor, getHoverColor(model.backgroundColor)], undefined, index);\r\n\t\tmodel.borderColor = resolve([custom.hoverBorderColor, dataset.hoverBorderColor, getHoverColor(model.borderColor)], undefined, index);\r\n\t\tmodel.borderWidth = resolve([custom.hoverBorderWidth, dataset.hoverBorderWidth, model.borderWidth], undefined, index);\r\n\t},\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n\t_removeDatasetHoverStyle: function() {\r\n\t\tvar element = this.getMeta().dataset;\r\n\r\n\t\tif (element) {\r\n\t\t\tthis.removeHoverStyle(element);\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n\t_setDatasetHoverStyle: function() {\r\n\t\tvar element = this.getMeta().dataset;\r\n\t\tvar prev = {};\r\n\t\tvar i, ilen, key, keys, hoverOptions, model;\r\n\r\n\t\tif (!element) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tmodel = element._model;\r\n\t\thoverOptions = this._resolveDatasetElementOptions(element, true);\r\n\r\n\t\tkeys = Object.keys(hoverOptions);\r\n\t\tfor (i = 0, ilen = keys.length; i < ilen; ++i) {\r\n\t\t\tkey = keys[i];\r\n\t\t\tprev[key] = model[key];\r\n\t\t\tmodel[key] = hoverOptions[key];\r\n\t\t}\r\n\r\n\t\telement.$previousStyle = prev;\r\n\t},\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n\tresyncElements: function() {\r\n\t\tvar me = this;\r\n\t\tvar meta = me.getMeta();\r\n\t\tvar data = me.getDataset().data;\r\n\t\tvar numMeta = meta.data.length;\r\n\t\tvar numData = data.length;\r\n\r\n\t\tif (numData < numMeta) {\r\n\t\t\tmeta.data.splice(numData, numMeta - numData);\r\n\t\t} else if (numData > numMeta) {\r\n\t\t\tme.insertElements(numMeta, numData - numMeta);\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n\tinsertElements: function(start, count) {\r\n\t\tfor (var i = 0; i < count; ++i) {\r\n\t\t\tthis.addElementAndReset(start + i);\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n\tonDataPush: function() {\r\n\t\tvar count = arguments.length;\r\n\t\tthis.insertElements(this.getDataset().data.length - count, count);\r\n\t},\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n\tonDataPop: function() {\r\n\t\tthis.getMeta().data.pop();\r\n\t},\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n\tonDataShift: function() {\r\n\t\tthis.getMeta().data.shift();\r\n\t},\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n\tonDataSplice: function(start, count) {\r\n\t\tthis.getMeta().data.splice(start, count);\r\n\t\tthis.insertElements(start, arguments.length - 2);\r\n\t},\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n\tonDataUnshift: function() {\r\n\t\tthis.insertElements(0, arguments.length);\r\n\t}\r\n});\r\n\r\nDatasetController.extend = helpers$1.inherits;\r\n\r\nvar core_datasetController = DatasetController;\n\nvar TAU = Math.PI * 2;\r\n\r\ncore_defaults._set('global', {\r\n\telements: {\r\n\t\tarc: {\r\n\t\t\tbackgroundColor: core_defaults.global.defaultColor,\r\n\t\t\tborderColor: '#fff',\r\n\t\t\tborderWidth: 2,\r\n\t\t\tborderAlign: 'center'\r\n\t\t}\r\n\t}\r\n});\r\n\r\nfunction clipArc(ctx, arc) {\r\n\tvar startAngle = arc.startAngle;\r\n\tvar endAngle = arc.endAngle;\r\n\tvar pixelMargin = arc.pixelMargin;\r\n\tvar angleMargin = pixelMargin / arc.outerRadius;\r\n\tvar x = arc.x;\r\n\tvar y = arc.y;\r\n\r\n\t// Draw an inner border by cliping the arc and drawing a double-width border\r\n\t// Enlarge the clipping arc by 0.33 pixels to eliminate glitches between borders\r\n\tctx.beginPath();\r\n\tctx.arc(x, y, arc.outerRadius, startAngle - angleMargin, endAngle + angleMargin);\r\n\tif (arc.innerRadius > pixelMargin) {\r\n\t\tangleMargin = pixelMargin / arc.innerRadius;\r\n\t\tctx.arc(x, y, arc.innerRadius - pixelMargin, endAngle + angleMargin, startAngle - angleMargin, true);\r\n\t} else {\r\n\t\tctx.arc(x, y, pixelMargin, endAngle + Math.PI / 2, startAngle - Math.PI / 2);\r\n\t}\r\n\tctx.closePath();\r\n\tctx.clip();\r\n}\r\n\r\nfunction drawFullCircleBorders(ctx, vm, arc, inner) {\r\n\tvar endAngle = arc.endAngle;\r\n\tvar i;\r\n\r\n\tif (inner) {\r\n\t\tarc.endAngle = arc.startAngle + TAU;\r\n\t\tclipArc(ctx, arc);\r\n\t\tarc.endAngle = endAngle;\r\n\t\tif (arc.endAngle === arc.startAngle && arc.fullCircles) {\r\n\t\t\tarc.endAngle += TAU;\r\n\t\t\tarc.fullCircles--;\r\n\t\t}\r\n\t}\r\n\r\n\tctx.beginPath();\r\n\tctx.arc(arc.x, arc.y, arc.innerRadius, arc.startAngle + TAU, arc.startAngle, true);\r\n\tfor (i = 0; i < arc.fullCircles; ++i) {\r\n\t\tctx.stroke();\r\n\t}\r\n\r\n\tctx.beginPath();\r\n\tctx.arc(arc.x, arc.y, vm.outerRadius, arc.startAngle, arc.startAngle + TAU);\r\n\tfor (i = 0; i < arc.fullCircles; ++i) {\r\n\t\tctx.stroke();\r\n\t}\r\n}\r\n\r\nfunction drawBorder(ctx, vm, arc) {\r\n\tvar inner = vm.borderAlign === 'inner';\r\n\r\n\tif (inner) {\r\n\t\tctx.lineWidth = vm.borderWidth * 2;\r\n\t\tctx.lineJoin = 'round';\r\n\t} else {\r\n\t\tctx.lineWidth = vm.borderWidth;\r\n\t\tctx.lineJoin = 'bevel';\r\n\t}\r\n\r\n\tif (arc.fullCircles) {\r\n\t\tdrawFullCircleBorders(ctx, vm, arc, inner);\r\n\t}\r\n\r\n\tif (inner) {\r\n\t\tclipArc(ctx, arc);\r\n\t}\r\n\r\n\tctx.beginPath();\r\n\tctx.arc(arc.x, arc.y, vm.outerRadius, arc.startAngle, arc.endAngle);\r\n\tctx.arc(arc.x, arc.y, arc.innerRadius, arc.endAngle, arc.startAngle, true);\r\n\tctx.closePath();\r\n\tctx.stroke();\r\n}\r\n\r\nvar element_arc = core_element.extend({\r\n\t_type: 'arc',\r\n\r\n\tinLabelRange: function(mouseX) {\r\n\t\tvar vm = this._view;\r\n\r\n\t\tif (vm) {\r\n\t\t\treturn (Math.pow(mouseX - vm.x, 2) < Math.pow(vm.radius + vm.hoverRadius, 2));\r\n\t\t}\r\n\t\treturn false;\r\n\t},\r\n\r\n\tinRange: function(chartX, chartY) {\r\n\t\tvar vm = this._view;\r\n\r\n\t\tif (vm) {\r\n\t\t\tvar pointRelativePosition = helpers$1.getAngleFromPoint(vm, {x: chartX, y: chartY});\r\n\t\t\tvar angle = pointRelativePosition.angle;\r\n\t\t\tvar distance = pointRelativePosition.distance;\r\n\r\n\t\t\t// Sanitise angle range\r\n\t\t\tvar startAngle = vm.startAngle;\r\n\t\t\tvar endAngle = vm.endAngle;\r\n\t\t\twhile (endAngle < startAngle) {\r\n\t\t\t\tendAngle += TAU;\r\n\t\t\t}\r\n\t\t\twhile (angle > endAngle) {\r\n\t\t\t\tangle -= TAU;\r\n\t\t\t}\r\n\t\t\twhile (angle < startAngle) {\r\n\t\t\t\tangle += TAU;\r\n\t\t\t}\r\n\r\n\t\t\t// Check if within the range of the open/close angle\r\n\t\t\tvar betweenAngles = (angle >= startAngle && angle <= endAngle);\r\n\t\t\tvar withinRadius = (distance >= vm.innerRadius && distance <= vm.outerRadius);\r\n\r\n\t\t\treturn (betweenAngles && withinRadius);\r\n\t\t}\r\n\t\treturn false;\r\n\t},\r\n\r\n\tgetCenterPoint: function() {\r\n\t\tvar vm = this._view;\r\n\t\tvar halfAngle = (vm.startAngle + vm.endAngle) / 2;\r\n\t\tvar halfRadius = (vm.innerRadius + vm.outerRadius) / 2;\r\n\t\treturn {\r\n\t\t\tx: vm.x + Math.cos(halfAngle) * halfRadius,\r\n\t\t\ty: vm.y + Math.sin(halfAngle) * halfRadius\r\n\t\t};\r\n\t},\r\n\r\n\tgetArea: function() {\r\n\t\tvar vm = this._view;\r\n\t\treturn Math.PI * ((vm.endAngle - vm.startAngle) / (2 * Math.PI)) * (Math.pow(vm.outerRadius, 2) - Math.pow(vm.innerRadius, 2));\r\n\t},\r\n\r\n\ttooltipPosition: function() {\r\n\t\tvar vm = this._view;\r\n\t\tvar centreAngle = vm.startAngle + ((vm.endAngle - vm.startAngle) / 2);\r\n\t\tvar rangeFromCentre = (vm.outerRadius - vm.innerRadius) / 2 + vm.innerRadius;\r\n\r\n\t\treturn {\r\n\t\t\tx: vm.x + (Math.cos(centreAngle) * rangeFromCentre),\r\n\t\t\ty: vm.y + (Math.sin(centreAngle) * rangeFromCentre)\r\n\t\t};\r\n\t},\r\n\r\n\tdraw: function() {\r\n\t\tvar ctx = this._chart.ctx;\r\n\t\tvar vm = this._view;\r\n\t\tvar pixelMargin = (vm.borderAlign === 'inner') ? 0.33 : 0;\r\n\t\tvar arc = {\r\n\t\t\tx: vm.x,\r\n\t\t\ty: vm.y,\r\n\t\t\tinnerRadius: vm.innerRadius,\r\n\t\t\touterRadius: Math.max(vm.outerRadius - pixelMargin, 0),\r\n\t\t\tpixelMargin: pixelMargin,\r\n\t\t\tstartAngle: vm.startAngle,\r\n\t\t\tendAngle: vm.endAngle,\r\n\t\t\tfullCircles: Math.floor(vm.circumference / TAU)\r\n\t\t};\r\n\t\tvar i;\r\n\r\n\t\tctx.save();\r\n\r\n\t\tctx.fillStyle = vm.backgroundColor;\r\n\t\tctx.strokeStyle = vm.borderColor;\r\n\r\n\t\tif (arc.fullCircles) {\r\n\t\t\tarc.endAngle = arc.startAngle + TAU;\r\n\t\t\tctx.beginPath();\r\n\t\t\tctx.arc(arc.x, arc.y, arc.outerRadius, arc.startAngle, arc.endAngle);\r\n\t\t\tctx.arc(arc.x, arc.y, arc.innerRadius, arc.endAngle, arc.startAngle, true);\r\n\t\t\tctx.closePath();\r\n\t\t\tfor (i = 0; i < arc.fullCircles; ++i) {\r\n\t\t\t\tctx.fill();\r\n\t\t\t}\r\n\t\t\tarc.endAngle = arc.startAngle + vm.circumference % TAU;\r\n\t\t}\r\n\r\n\t\tctx.beginPath();\r\n\t\tctx.arc(arc.x, arc.y, arc.outerRadius, arc.startAngle, arc.endAngle);\r\n\t\tctx.arc(arc.x, arc.y, arc.innerRadius, arc.endAngle, arc.startAngle, true);\r\n\t\tctx.closePath();\r\n\t\tctx.fill();\r\n\r\n\t\tif (vm.borderWidth) {\r\n\t\t\tdrawBorder(ctx, vm, arc);\r\n\t\t}\r\n\r\n\t\tctx.restore();\r\n\t}\r\n});\n\nvar valueOrDefault$1 = helpers$1.valueOrDefault;\r\n\r\nvar defaultColor = core_defaults.global.defaultColor;\r\n\r\ncore_defaults._set('global', {\r\n\telements: {\r\n\t\tline: {\r\n\t\t\ttension: 0.4,\r\n\t\t\tbackgroundColor: defaultColor,\r\n\t\t\tborderWidth: 3,\r\n\t\t\tborderColor: defaultColor,\r\n\t\t\tborderCapStyle: 'butt',\r\n\t\t\tborderDash: [],\r\n\t\t\tborderDashOffset: 0.0,\r\n\t\t\tborderJoinStyle: 'miter',\r\n\t\t\tcapBezierPoints: true,\r\n\t\t\tfill: true, // do we fill in the area between the line and its base axis\r\n\t\t}\r\n\t}\r\n});\r\n\r\nvar element_line = core_element.extend({\r\n\t_type: 'line',\r\n\r\n\tdraw: function() {\r\n\t\tvar me = this;\r\n\t\tvar vm = me._view;\r\n\t\tvar ctx = me._chart.ctx;\r\n\t\tvar spanGaps = vm.spanGaps;\r\n\t\tvar points = me._children.slice(); // clone array\r\n\t\tvar globalDefaults = core_defaults.global;\r\n\t\tvar globalOptionLineElements = globalDefaults.elements.line;\r\n\t\tvar lastDrawnIndex = -1;\r\n\t\tvar closePath = me._loop;\r\n\t\tvar index, previous, currentVM;\r\n\r\n\t\tif (!points.length) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (me._loop) {\r\n\t\t\tfor (index = 0; index < points.length; ++index) {\r\n\t\t\t\tprevious = helpers$1.previousItem(points, index);\r\n\t\t\t\t// If the line has an open path, shift the point array\r\n\t\t\t\tif (!points[index]._view.skip && previous._view.skip) {\r\n\t\t\t\t\tpoints = points.slice(index).concat(points.slice(0, index));\r\n\t\t\t\t\tclosePath = spanGaps;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t// If the line has a close path, add the first point again\r\n\t\t\tif (closePath) {\r\n\t\t\t\tpoints.push(points[0]);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tctx.save();\r\n\r\n\t\t// Stroke Line Options\r\n\t\tctx.lineCap = vm.borderCapStyle || globalOptionLineElements.borderCapStyle;\r\n\r\n\t\t// IE 9 and 10 do not support line dash\r\n\t\tif (ctx.setLineDash) {\r\n\t\t\tctx.setLineDash(vm.borderDash || globalOptionLineElements.borderDash);\r\n\t\t}\r\n\r\n\t\tctx.lineDashOffset = valueOrDefault$1(vm.borderDashOffset, globalOptionLineElements.borderDashOffset);\r\n\t\tctx.lineJoin = vm.borderJoinStyle || globalOptionLineElements.borderJoinStyle;\r\n\t\tctx.lineWidth = valueOrDefault$1(vm.borderWidth, globalOptionLineElements.borderWidth);\r\n\t\tctx.strokeStyle = vm.borderColor || globalDefaults.defaultColor;\r\n\r\n\t\t// Stroke Line\r\n\t\tctx.beginPath();\r\n\r\n\t\t// First point moves to it's starting position no matter what\r\n\t\tcurrentVM = points[0]._view;\r\n\t\tif (!currentVM.skip) {\r\n\t\t\tctx.moveTo(currentVM.x, currentVM.y);\r\n\t\t\tlastDrawnIndex = 0;\r\n\t\t}\r\n\r\n\t\tfor (index = 1; index < points.length; ++index) {\r\n\t\t\tcurrentVM = points[index]._view;\r\n\t\t\tprevious = lastDrawnIndex === -1 ? helpers$1.previousItem(points, index) : points[lastDrawnIndex];\r\n\r\n\t\t\tif (!currentVM.skip) {\r\n\t\t\t\tif ((lastDrawnIndex !== (index - 1) && !spanGaps) || lastDrawnIndex === -1) {\r\n\t\t\t\t\t// There was a gap and this is the first point after the gap\r\n\t\t\t\t\tctx.moveTo(currentVM.x, currentVM.y);\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// Line to next point\r\n\t\t\t\t\thelpers$1.canvas.lineTo(ctx, previous._view, currentVM);\r\n\t\t\t\t}\r\n\t\t\t\tlastDrawnIndex = index;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (closePath) {\r\n\t\t\tctx.closePath();\r\n\t\t}\r\n\r\n\t\tctx.stroke();\r\n\t\tctx.restore();\r\n\t}\r\n});\n\nvar valueOrDefault$2 = helpers$1.valueOrDefault;\r\n\r\nvar defaultColor$1 = core_defaults.global.defaultColor;\r\n\r\ncore_defaults._set('global', {\r\n\telements: {\r\n\t\tpoint: {\r\n\t\t\tradius: 3,\r\n\t\t\tpointStyle: 'circle',\r\n\t\t\tbackgroundColor: defaultColor$1,\r\n\t\t\tborderColor: defaultColor$1,\r\n\t\t\tborderWidth: 1,\r\n\t\t\t// Hover\r\n\t\t\thitRadius: 1,\r\n\t\t\thoverRadius: 4,\r\n\t\t\thoverBorderWidth: 1\r\n\t\t}\r\n\t}\r\n});\r\n\r\nfunction xRange(mouseX) {\r\n\tvar vm = this._view;\r\n\treturn vm ? (Math.abs(mouseX - vm.x) < vm.radius + vm.hitRadius) : false;\r\n}\r\n\r\nfunction yRange(mouseY) {\r\n\tvar vm = this._view;\r\n\treturn vm ? (Math.abs(mouseY - vm.y) < vm.radius + vm.hitRadius) : false;\r\n}\r\n\r\nvar element_point = core_element.extend({\r\n\t_type: 'point',\r\n\r\n\tinRange: function(mouseX, mouseY) {\r\n\t\tvar vm = this._view;\r\n\t\treturn vm ? ((Math.pow(mouseX - vm.x, 2) + Math.pow(mouseY - vm.y, 2)) < Math.pow(vm.hitRadius + vm.radius, 2)) : false;\r\n\t},\r\n\r\n\tinLabelRange: xRange,\r\n\tinXRange: xRange,\r\n\tinYRange: yRange,\r\n\r\n\tgetCenterPoint: function() {\r\n\t\tvar vm = this._view;\r\n\t\treturn {\r\n\t\t\tx: vm.x,\r\n\t\t\ty: vm.y\r\n\t\t};\r\n\t},\r\n\r\n\tgetArea: function() {\r\n\t\treturn Math.PI * Math.pow(this._view.radius, 2);\r\n\t},\r\n\r\n\ttooltipPosition: function() {\r\n\t\tvar vm = this._view;\r\n\t\treturn {\r\n\t\t\tx: vm.x,\r\n\t\t\ty: vm.y,\r\n\t\t\tpadding: vm.radius + vm.borderWidth\r\n\t\t};\r\n\t},\r\n\r\n\tdraw: function(chartArea) {\r\n\t\tvar vm = this._view;\r\n\t\tvar ctx = this._chart.ctx;\r\n\t\tvar pointStyle = vm.pointStyle;\r\n\t\tvar rotation = vm.rotation;\r\n\t\tvar radius = vm.radius;\r\n\t\tvar x = vm.x;\r\n\t\tvar y = vm.y;\r\n\t\tvar globalDefaults = core_defaults.global;\r\n\t\tvar defaultColor = globalDefaults.defaultColor; // eslint-disable-line no-shadow\r\n\r\n\t\tif (vm.skip) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Clipping for Points.\r\n\t\tif (chartArea === undefined || helpers$1.canvas._isPointInArea(vm, chartArea)) {\r\n\t\t\tctx.strokeStyle = vm.borderColor || defaultColor;\r\n\t\t\tctx.lineWidth = valueOrDefault$2(vm.borderWidth, globalDefaults.elements.point.borderWidth);\r\n\t\t\tctx.fillStyle = vm.backgroundColor || defaultColor;\r\n\t\t\thelpers$1.canvas.drawPoint(ctx, pointStyle, radius, x, y, rotation);\r\n\t\t}\r\n\t}\r\n});\n\nvar defaultColor$2 = core_defaults.global.defaultColor;\r\n\r\ncore_defaults._set('global', {\r\n\telements: {\r\n\t\trectangle: {\r\n\t\t\tbackgroundColor: defaultColor$2,\r\n\t\t\tborderColor: defaultColor$2,\r\n\t\t\tborderSkipped: 'bottom',\r\n\t\t\tborderWidth: 0\r\n\t\t}\r\n\t}\r\n});\r\n\r\nfunction isVertical(vm) {\r\n\treturn vm && vm.width !== undefined;\r\n}\r\n\r\n/**\r\n * Helper function to get the bounds of the bar regardless of the orientation\r\n * @param bar {Chart.Element.Rectangle} the bar\r\n * @return {Bounds} bounds of the bar\r\n * @private\r\n */\r\nfunction getBarBounds(vm) {\r\n\tvar x1, x2, y1, y2, half;\r\n\r\n\tif (isVertical(vm)) {\r\n\t\thalf = vm.width / 2;\r\n\t\tx1 = vm.x - half;\r\n\t\tx2 = vm.x + half;\r\n\t\ty1 = Math.min(vm.y, vm.base);\r\n\t\ty2 = Math.max(vm.y, vm.base);\r\n\t} else {\r\n\t\thalf = vm.height / 2;\r\n\t\tx1 = Math.min(vm.x, vm.base);\r\n\t\tx2 = Math.max(vm.x, vm.base);\r\n\t\ty1 = vm.y - half;\r\n\t\ty2 = vm.y + half;\r\n\t}\r\n\r\n\treturn {\r\n\t\tleft: x1,\r\n\t\ttop: y1,\r\n\t\tright: x2,\r\n\t\tbottom: y2\r\n\t};\r\n}\r\n\r\nfunction swap(orig, v1, v2) {\r\n\treturn orig === v1 ? v2 : orig === v2 ? v1 : orig;\r\n}\r\n\r\nfunction parseBorderSkipped(vm) {\r\n\tvar edge = vm.borderSkipped;\r\n\tvar res = {};\r\n\r\n\tif (!edge) {\r\n\t\treturn res;\r\n\t}\r\n\r\n\tif (vm.horizontal) {\r\n\t\tif (vm.base > vm.x) {\r\n\t\t\tedge = swap(edge, 'left', 'right');\r\n\t\t}\r\n\t} else if (vm.base < vm.y) {\r\n\t\tedge = swap(edge, 'bottom', 'top');\r\n\t}\r\n\r\n\tres[edge] = true;\r\n\treturn res;\r\n}\r\n\r\nfunction parseBorderWidth(vm, maxW, maxH) {\r\n\tvar value = vm.borderWidth;\r\n\tvar skip = parseBorderSkipped(vm);\r\n\tvar t, r, b, l;\r\n\r\n\tif (helpers$1.isObject(value)) {\r\n\t\tt = +value.top || 0;\r\n\t\tr = +value.right || 0;\r\n\t\tb = +value.bottom || 0;\r\n\t\tl = +value.left || 0;\r\n\t} else {\r\n\t\tt = r = b = l = +value || 0;\r\n\t}\r\n\r\n\treturn {\r\n\t\tt: skip.top || (t < 0) ? 0 : t > maxH ? maxH : t,\r\n\t\tr: skip.right || (r < 0) ? 0 : r > maxW ? maxW : r,\r\n\t\tb: skip.bottom || (b < 0) ? 0 : b > maxH ? maxH : b,\r\n\t\tl: skip.left || (l < 0) ? 0 : l > maxW ? maxW : l\r\n\t};\r\n}\r\n\r\nfunction boundingRects(vm) {\r\n\tvar bounds = getBarBounds(vm);\r\n\tvar width = bounds.right - bounds.left;\r\n\tvar height = bounds.bottom - bounds.top;\r\n\tvar border = parseBorderWidth(vm, width / 2, height / 2);\r\n\r\n\treturn {\r\n\t\touter: {\r\n\t\t\tx: bounds.left,\r\n\t\t\ty: bounds.top,\r\n\t\t\tw: width,\r\n\t\t\th: height\r\n\t\t},\r\n\t\tinner: {\r\n\t\t\tx: bounds.left + border.l,\r\n\t\t\ty: bounds.top + border.t,\r\n\t\t\tw: width - border.l - border.r,\r\n\t\t\th: height - border.t - border.b\r\n\t\t}\r\n\t};\r\n}\r\n\r\nfunction inRange(vm, x, y) {\r\n\tvar skipX = x === null;\r\n\tvar skipY = y === null;\r\n\tvar bounds = !vm || (skipX && skipY) ? false : getBarBounds(vm);\r\n\r\n\treturn bounds\r\n\t\t&& (skipX || x >= bounds.left && x <= bounds.right)\r\n\t\t&& (skipY || y >= bounds.top && y <= bounds.bottom);\r\n}\r\n\r\nvar element_rectangle = core_element.extend({\r\n\t_type: 'rectangle',\r\n\r\n\tdraw: function() {\r\n\t\tvar ctx = this._chart.ctx;\r\n\t\tvar vm = this._view;\r\n\t\tvar rects = boundingRects(vm);\r\n\t\tvar outer = rects.outer;\r\n\t\tvar inner = rects.inner;\r\n\r\n\t\tctx.fillStyle = vm.backgroundColor;\r\n\t\tctx.fillRect(outer.x, outer.y, outer.w, outer.h);\r\n\r\n\t\tif (outer.w === inner.w && outer.h === inner.h) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tctx.save();\r\n\t\tctx.beginPath();\r\n\t\tctx.rect(outer.x, outer.y, outer.w, outer.h);\r\n\t\tctx.clip();\r\n\t\tctx.fillStyle = vm.borderColor;\r\n\t\tctx.rect(inner.x, inner.y, inner.w, inner.h);\r\n\t\tctx.fill('evenodd');\r\n\t\tctx.restore();\r\n\t},\r\n\r\n\theight: function() {\r\n\t\tvar vm = this._view;\r\n\t\treturn vm.base - vm.y;\r\n\t},\r\n\r\n\tinRange: function(mouseX, mouseY) {\r\n\t\treturn inRange(this._view, mouseX, mouseY);\r\n\t},\r\n\r\n\tinLabelRange: function(mouseX, mouseY) {\r\n\t\tvar vm = this._view;\r\n\t\treturn isVertical(vm)\r\n\t\t\t? inRange(vm, mouseX, null)\r\n\t\t\t: inRange(vm, null, mouseY);\r\n\t},\r\n\r\n\tinXRange: function(mouseX) {\r\n\t\treturn inRange(this._view, mouseX, null);\r\n\t},\r\n\r\n\tinYRange: function(mouseY) {\r\n\t\treturn inRange(this._view, null, mouseY);\r\n\t},\r\n\r\n\tgetCenterPoint: function() {\r\n\t\tvar vm = this._view;\r\n\t\tvar x, y;\r\n\t\tif (isVertical(vm)) {\r\n\t\t\tx = vm.x;\r\n\t\t\ty = (vm.y + vm.base) / 2;\r\n\t\t} else {\r\n\t\t\tx = (vm.x + vm.base) / 2;\r\n\t\t\ty = vm.y;\r\n\t\t}\r\n\r\n\t\treturn {x: x, y: y};\r\n\t},\r\n\r\n\tgetArea: function() {\r\n\t\tvar vm = this._view;\r\n\r\n\t\treturn isVertical(vm)\r\n\t\t\t? vm.width * Math.abs(vm.y - vm.base)\r\n\t\t\t: vm.height * Math.abs(vm.x - vm.base);\r\n\t},\r\n\r\n\ttooltipPosition: function() {\r\n\t\tvar vm = this._view;\r\n\t\treturn {\r\n\t\t\tx: vm.x,\r\n\t\t\ty: vm.y\r\n\t\t};\r\n\t}\r\n});\n\nvar elements = {};\r\nvar Arc = element_arc;\r\nvar Line = element_line;\r\nvar Point = element_point;\r\nvar Rectangle = element_rectangle;\nelements.Arc = Arc;\nelements.Line = Line;\nelements.Point = Point;\nelements.Rectangle = Rectangle;\n\nvar deprecated = helpers$1._deprecated;\r\nvar valueOrDefault$3 = helpers$1.valueOrDefault;\r\n\r\ncore_defaults._set('bar', {\r\n\thover: {\r\n\t\tmode: 'label'\r\n\t},\r\n\r\n\tscales: {\r\n\t\txAxes: [{\r\n\t\t\ttype: 'category',\r\n\t\t\toffset: true,\r\n\t\t\tgridLines: {\r\n\t\t\t\toffsetGridLines: true\r\n\t\t\t}\r\n\t\t}],\r\n\r\n\t\tyAxes: [{\r\n\t\t\ttype: 'linear'\r\n\t\t}]\r\n\t}\r\n});\r\n\r\ncore_defaults._set('global', {\r\n\tdatasets: {\r\n\t\tbar: {\r\n\t\t\tcategoryPercentage: 0.8,\r\n\t\t\tbarPercentage: 0.9\r\n\t\t}\r\n\t}\r\n});\r\n\r\n/**\r\n * Computes the \"optimal\" sample size to maintain bars equally sized while preventing overlap.\r\n * @private\r\n */\r\nfunction computeMinSampleSize(scale, pixels) {\r\n\tvar min = scale._length;\r\n\tvar prev, curr, i, ilen;\r\n\r\n\tfor (i = 1, ilen = pixels.length; i < ilen; ++i) {\r\n\t\tmin = Math.min(min, Math.abs(pixels[i] - pixels[i - 1]));\r\n\t}\r\n\r\n\tfor (i = 0, ilen = scale.getTicks().length; i < ilen; ++i) {\r\n\t\tcurr = scale.getPixelForTick(i);\r\n\t\tmin = i > 0 ? Math.min(min, Math.abs(curr - prev)) : min;\r\n\t\tprev = curr;\r\n\t}\r\n\r\n\treturn min;\r\n}\r\n\r\n/**\r\n * Computes an \"ideal\" category based on the absolute bar thickness or, if undefined or null,\r\n * uses the smallest interval (see computeMinSampleSize) that prevents bar overlapping. This\r\n * mode currently always generates bars equally sized (until we introduce scriptable options?).\r\n * @private\r\n */\r\nfunction computeFitCategoryTraits(index, ruler, options) {\r\n\tvar thickness = options.barThickness;\r\n\tvar count = ruler.stackCount;\r\n\tvar curr = ruler.pixels[index];\r\n\tvar min = helpers$1.isNullOrUndef(thickness)\r\n\t\t? computeMinSampleSize(ruler.scale, ruler.pixels)\r\n\t\t: -1;\r\n\tvar size, ratio;\r\n\r\n\tif (helpers$1.isNullOrUndef(thickness)) {\r\n\t\tsize = min * options.categoryPercentage;\r\n\t\tratio = options.barPercentage;\r\n\t} else {\r\n\t\t// When bar thickness is enforced, category and bar percentages are ignored.\r\n\t\t// Note(SB): we could add support for relative bar thickness (e.g. barThickness: '50%')\r\n\t\t// and deprecate barPercentage since this value is ignored when thickness is absolute.\r\n\t\tsize = thickness * count;\r\n\t\tratio = 1;\r\n\t}\r\n\r\n\treturn {\r\n\t\tchunk: size / count,\r\n\t\tratio: ratio,\r\n\t\tstart: curr - (size / 2)\r\n\t};\r\n}\r\n\r\n/**\r\n * Computes an \"optimal\" category that globally arranges bars side by side (no gap when\r\n * percentage options are 1), based on the previous and following categories. This mode\r\n * generates bars with different widths when data are not evenly spaced.\r\n * @private\r\n */\r\nfunction computeFlexCategoryTraits(index, ruler, options) {\r\n\tvar pixels = ruler.pixels;\r\n\tvar curr = pixels[index];\r\n\tvar prev = index > 0 ? pixels[index - 1] : null;\r\n\tvar next = index < pixels.length - 1 ? pixels[index + 1] : null;\r\n\tvar percent = options.categoryPercentage;\r\n\tvar start, size;\r\n\r\n\tif (prev === null) {\r\n\t\t// first data: its size is double based on the next point or,\r\n\t\t// if it's also the last data, we use the scale size.\r\n\t\tprev = curr - (next === null ? ruler.end - ruler.start : next - curr);\r\n\t}\r\n\r\n\tif (next === null) {\r\n\t\t// last data: its size is also double based on the previous point.\r\n\t\tnext = curr + curr - prev;\r\n\t}\r\n\r\n\tstart = curr - (curr - Math.min(prev, next)) / 2 * percent;\r\n\tsize = Math.abs(next - prev) / 2 * percent;\r\n\r\n\treturn {\r\n\t\tchunk: size / ruler.stackCount,\r\n\t\tratio: options.barPercentage,\r\n\t\tstart: start\r\n\t};\r\n}\r\n\r\nvar controller_bar = core_datasetController.extend({\r\n\r\n\tdataElementType: elements.Rectangle,\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n\t_dataElementOptions: [\r\n\t\t'backgroundColor',\r\n\t\t'borderColor',\r\n\t\t'borderSkipped',\r\n\t\t'borderWidth',\r\n\t\t'barPercentage',\r\n\t\t'barThickness',\r\n\t\t'categoryPercentage',\r\n\t\t'maxBarThickness',\r\n\t\t'minBarLength'\r\n\t],\r\n\r\n\tinitialize: function() {\r\n\t\tvar me = this;\r\n\t\tvar meta, scaleOpts;\r\n\r\n\t\tcore_datasetController.prototype.initialize.apply(me, arguments);\r\n\r\n\t\tmeta = me.getMeta();\r\n\t\tmeta.stack = me.getDataset().stack;\r\n\t\tmeta.bar = true;\r\n\r\n\t\tscaleOpts = me._getIndexScale().options;\r\n\t\tdeprecated('bar chart', scaleOpts.barPercentage, 'scales.[x/y]Axes.barPercentage', 'dataset.barPercentage');\r\n\t\tdeprecated('bar chart', scaleOpts.barThickness, 'scales.[x/y]Axes.barThickness', 'dataset.barThickness');\r\n\t\tdeprecated('bar chart', scaleOpts.categoryPercentage, 'scales.[x/y]Axes.categoryPercentage', 'dataset.categoryPercentage');\r\n\t\tdeprecated('bar chart', me._getValueScale().options.minBarLength, 'scales.[x/y]Axes.minBarLength', 'dataset.minBarLength');\r\n\t\tdeprecated('bar chart', scaleOpts.maxBarThickness, 'scales.[x/y]Axes.maxBarThickness', 'dataset.maxBarThickness');\r\n\t},\r\n\r\n\tupdate: function(reset) {\r\n\t\tvar me = this;\r\n\t\tvar rects = me.getMeta().data;\r\n\t\tvar i, ilen;\r\n\r\n\t\tme._ruler = me.getRuler();\r\n\r\n\t\tfor (i = 0, ilen = rects.length; i < ilen; ++i) {\r\n\t\t\tme.updateElement(rects[i], i, reset);\r\n\t\t}\r\n\t},\r\n\r\n\tupdateElement: function(rectangle, index, reset) {\r\n\t\tvar me = this;\r\n\t\tvar meta = me.getMeta();\r\n\t\tvar dataset = me.getDataset();\r\n\t\tvar options = me._resolveDataElementOptions(rectangle, index);\r\n\r\n\t\trectangle._xScale = me.getScaleForId(meta.xAxisID);\r\n\t\trectangle._yScale = me.getScaleForId(meta.yAxisID);\r\n\t\trectangle._datasetIndex = me.index;\r\n\t\trectangle._index = index;\r\n\t\trectangle._model = {\r\n\t\t\tbackgroundColor: options.backgroundColor,\r\n\t\t\tborderColor: options.borderColor,\r\n\t\t\tborderSkipped: options.borderSkipped,\r\n\t\t\tborderWidth: options.borderWidth,\r\n\t\t\tdatasetLabel: dataset.label,\r\n\t\t\tlabel: me.chart.data.labels[index]\r\n\t\t};\r\n\r\n\t\tif (helpers$1.isArray(dataset.data[index])) {\r\n\t\t\trectangle._model.borderSkipped = null;\r\n\t\t}\r\n\r\n\t\tme._updateElementGeometry(rectangle, index, reset, options);\r\n\r\n\t\trectangle.pivot();\r\n\t},\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n\t_updateElementGeometry: function(rectangle, index, reset, options) {\r\n\t\tvar me = this;\r\n\t\tvar model = rectangle._model;\r\n\t\tvar vscale = me._getValueScale();\r\n\t\tvar base = vscale.getBasePixel();\r\n\t\tvar horizontal = vscale.isHorizontal();\r\n\t\tvar ruler = me._ruler || me.getRuler();\r\n\t\tvar vpixels = me.calculateBarValuePixels(me.index, index, options);\r\n\t\tvar ipixels = me.calculateBarIndexPixels(me.index, index, ruler, options);\r\n\r\n\t\tmodel.horizontal = horizontal;\r\n\t\tmodel.base = reset ? base : vpixels.base;\r\n\t\tmodel.x = horizontal ? reset ? base : vpixels.head : ipixels.center;\r\n\t\tmodel.y = horizontal ? ipixels.center : reset ? base : vpixels.head;\r\n\t\tmodel.height = horizontal ? ipixels.size : undefined;\r\n\t\tmodel.width = horizontal ? undefined : ipixels.size;\r\n\t},\r\n\r\n\t/**\r\n\t * Returns the stacks based on groups and bar visibility.\r\n\t * @param {number} [last] - The dataset index\r\n\t * @returns {string[]} The list of stack IDs\r\n\t * @private\r\n\t */\r\n\t_getStacks: function(last) {\r\n\t\tvar me = this;\r\n\t\tvar scale = me._getIndexScale();\r\n\t\tvar metasets = scale._getMatchingVisibleMetas(me._type);\r\n\t\tvar stacked = scale.options.stacked;\r\n\t\tvar ilen = metasets.length;\r\n\t\tvar stacks = [];\r\n\t\tvar i, meta;\r\n\r\n\t\tfor (i = 0; i < ilen; ++i) {\r\n\t\t\tmeta = metasets[i];\r\n\t\t\t// stacked   | meta.stack\r\n\t\t\t//           | found | not found | undefined\r\n\t\t\t// false     |   x   |     x     |     x\r\n\t\t\t// true      |       |     x     |\r\n\t\t\t// undefined |       |     x     |     x\r\n\t\t\tif (stacked === false || stacks.indexOf(meta.stack) === -1 ||\r\n\t\t\t\t(stacked === undefined && meta.stack === undefined)) {\r\n\t\t\t\tstacks.push(meta.stack);\r\n\t\t\t}\r\n\t\t\tif (meta.index === last) {\r\n\t\t\t\tbreak;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn stacks;\r\n\t},\r\n\r\n\t/**\r\n\t * Returns the effective number of stacks based on groups and bar visibility.\r\n\t * @private\r\n\t */\r\n\tgetStackCount: function() {\r\n\t\treturn this._getStacks().length;\r\n\t},\r\n\r\n\t/**\r\n\t * Returns the stack index for the given dataset based on groups and bar visibility.\r\n\t * @param {number} [datasetIndex] - The dataset index\r\n\t * @param {string} [name] - The stack name to find\r\n\t * @returns {number} The stack index\r\n\t * @private\r\n\t */\r\n\tgetStackIndex: function(datasetIndex, name) {\r\n\t\tvar stacks = this._getStacks(datasetIndex);\r\n\t\tvar index = (name !== undefined)\r\n\t\t\t? stacks.indexOf(name)\r\n\t\t\t: -1; // indexOf returns -1 if element is not present\r\n\r\n\t\treturn (index === -1)\r\n\t\t\t? stacks.length - 1\r\n\t\t\t: index;\r\n\t},\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n\tgetRuler: function() {\r\n\t\tvar me = this;\r\n\t\tvar scale = me._getIndexScale();\r\n\t\tvar pixels = [];\r\n\t\tvar i, ilen;\r\n\r\n\t\tfor (i = 0, ilen = me.getMeta().data.length; i < ilen; ++i) {\r\n\t\t\tpixels.push(scale.getPixelForValue(null, i, me.index));\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\tpixels: pixels,\r\n\t\t\tstart: scale._startPixel,\r\n\t\t\tend: scale._endPixel,\r\n\t\t\tstackCount: me.getStackCount(),\r\n\t\t\tscale: scale\r\n\t\t};\r\n\t},\r\n\r\n\t/**\r\n\t * Note: pixel values are not clamped to the scale area.\r\n\t * @private\r\n\t */\r\n\tcalculateBarValuePixels: function(datasetIndex, index, options) {\r\n\t\tvar me = this;\r\n\t\tvar chart = me.chart;\r\n\t\tvar scale = me._getValueScale();\r\n\t\tvar isHorizontal = scale.isHorizontal();\r\n\t\tvar datasets = chart.data.datasets;\r\n\t\tvar metasets = scale._getMatchingVisibleMetas(me._type);\r\n\t\tvar value = scale._parseValue(datasets[datasetIndex].data[index]);\r\n\t\tvar minBarLength = options.minBarLength;\r\n\t\tvar stacked = scale.options.stacked;\r\n\t\tvar stack = me.getMeta().stack;\r\n\t\tvar start = value.start === undefined ? 0 : value.max >= 0 && value.min >= 0 ? value.min : value.max;\r\n\t\tvar length = value.start === undefined ? value.end : value.max >= 0 && value.min >= 0 ? value.max - value.min : value.min - value.max;\r\n\t\tvar ilen = metasets.length;\r\n\t\tvar i, imeta, ivalue, base, head, size, stackLength;\r\n\r\n\t\tif (stacked || (stacked === undefined && stack !== undefined)) {\r\n\t\t\tfor (i = 0; i < ilen; ++i) {\r\n\t\t\t\timeta = metasets[i];\r\n\r\n\t\t\t\tif (imeta.index === datasetIndex) {\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (imeta.stack === stack) {\r\n\t\t\t\t\tstackLength = scale._parseValue(datasets[imeta.index].data[index]);\r\n\t\t\t\t\tivalue = stackLength.start === undefined ? stackLength.end : stackLength.min >= 0 && stackLength.max >= 0 ? stackLength.max : stackLength.min;\r\n\r\n\t\t\t\t\tif ((value.min < 0 && ivalue < 0) || (value.max >= 0 && ivalue > 0)) {\r\n\t\t\t\t\t\tstart += ivalue;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tbase = scale.getPixelForValue(start);\r\n\t\thead = scale.getPixelForValue(start + length);\r\n\t\tsize = head - base;\r\n\r\n\t\tif (minBarLength !== undefined && Math.abs(size) < minBarLength) {\r\n\t\t\tsize = minBarLength;\r\n\t\t\tif (length >= 0 && !isHorizontal || length < 0 && isHorizontal) {\r\n\t\t\t\thead = base - minBarLength;\r\n\t\t\t} else {\r\n\t\t\t\thead = base + minBarLength;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\tsize: size,\r\n\t\t\tbase: base,\r\n\t\t\thead: head,\r\n\t\t\tcenter: head + size / 2\r\n\t\t};\r\n\t},\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n\tcalculateBarIndexPixels: function(datasetIndex, index, ruler, options) {\r\n\t\tvar me = this;\r\n\t\tvar range = options.barThickness === 'flex'\r\n\t\t\t? computeFlexCategoryTraits(index, ruler, options)\r\n\t\t\t: computeFitCategoryTraits(index, ruler, options);\r\n\r\n\t\tvar stackIndex = me.getStackIndex(datasetIndex, me.getMeta().stack);\r\n\t\tvar center = range.start + (range.chunk * stackIndex) + (range.chunk / 2);\r\n\t\tvar size = Math.min(\r\n\t\t\tvalueOrDefault$3(options.maxBarThickness, Infinity),\r\n\t\t\trange.chunk * range.ratio);\r\n\r\n\t\treturn {\r\n\t\t\tbase: center - size / 2,\r\n\t\t\thead: center + size / 2,\r\n\t\t\tcenter: center,\r\n\t\t\tsize: size\r\n\t\t};\r\n\t},\r\n\r\n\tdraw: function() {\r\n\t\tvar me = this;\r\n\t\tvar chart = me.chart;\r\n\t\tvar scale = me._getValueScale();\r\n\t\tvar rects = me.getMeta().data;\r\n\t\tvar dataset = me.getDataset();\r\n\t\tvar ilen = rects.length;\r\n\t\tvar i = 0;\r\n\r\n\t\thelpers$1.canvas.clipArea(chart.ctx, chart.chartArea);\r\n\r\n\t\tfor (; i < ilen; ++i) {\r\n\t\t\tvar val = scale._parseValue(dataset.data[i]);\r\n\t\t\tif (!isNaN(val.min) && !isNaN(val.max)) {\r\n\t\t\t\trects[i].draw();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\thelpers$1.canvas.unclipArea(chart.ctx);\r\n\t},\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n\t_resolveDataElementOptions: function() {\r\n\t\tvar me = this;\r\n\t\tvar values = helpers$1.extend({}, core_datasetController.prototype._resolveDataElementOptions.apply(me, arguments));\r\n\t\tvar indexOpts = me._getIndexScale().options;\r\n\t\tvar valueOpts = me._getValueScale().options;\r\n\r\n\t\tvalues.barPercentage = valueOrDefault$3(indexOpts.barPercentage, values.barPercentage);\r\n\t\tvalues.barThickness = valueOrDefault$3(indexOpts.barThickness, values.barThickness);\r\n\t\tvalues.categoryPercentage = valueOrDefault$3(indexOpts.categoryPercentage, values.categoryPercentage);\r\n\t\tvalues.maxBarThickness = valueOrDefault$3(indexOpts.maxBarThickness, values.maxBarThickness);\r\n\t\tvalues.minBarLength = valueOrDefault$3(valueOpts.minBarLength, values.minBarLength);\r\n\r\n\t\treturn values;\r\n\t}\r\n\r\n});\n\nvar valueOrDefault$4 = helpers$1.valueOrDefault;\r\nvar resolve$1 = helpers$1.options.resolve;\r\n\r\ncore_defaults._set('bubble', {\r\n\thover: {\r\n\t\tmode: 'single'\r\n\t},\r\n\r\n\tscales: {\r\n\t\txAxes: [{\r\n\t\t\ttype: 'linear', // bubble should probably use a linear scale by default\r\n\t\t\tposition: 'bottom',\r\n\t\t\tid: 'x-axis-0' // need an ID so datasets can reference the scale\r\n\t\t}],\r\n\t\tyAxes: [{\r\n\t\t\ttype: 'linear',\r\n\t\t\tposition: 'left',\r\n\t\t\tid: 'y-axis-0'\r\n\t\t}]\r\n\t},\r\n\r\n\ttooltips: {\r\n\t\tcallbacks: {\r\n\t\t\ttitle: function() {\r\n\t\t\t\t// Title doesn't make sense for scatter since we format the data as a point\r\n\t\t\t\treturn '';\r\n\t\t\t},\r\n\t\t\tlabel: function(item, data) {\r\n\t\t\t\tvar datasetLabel = data.datasets[item.datasetIndex].label || '';\r\n\t\t\t\tvar dataPoint = data.datasets[item.datasetIndex].data[item.index];\r\n\t\t\t\treturn datasetLabel + ': (' + item.xLabel + ', ' + item.yLabel + ', ' + dataPoint.r + ')';\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n});\r\n\r\nvar controller_bubble = core_datasetController.extend({\r\n\t/**\r\n\t * @protected\r\n\t */\r\n\tdataElementType: elements.Point,\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n\t_dataElementOptions: [\r\n\t\t'backgroundColor',\r\n\t\t'borderColor',\r\n\t\t'borderWidth',\r\n\t\t'hoverBackgroundColor',\r\n\t\t'hoverBorderColor',\r\n\t\t'hoverBorderWidth',\r\n\t\t'hoverRadius',\r\n\t\t'hitRadius',\r\n\t\t'pointStyle',\r\n\t\t'rotation'\r\n\t],\r\n\r\n\t/**\r\n\t * @protected\r\n\t */\r\n\tupdate: function(reset) {\r\n\t\tvar me = this;\r\n\t\tvar meta = me.getMeta();\r\n\t\tvar points = meta.data;\r\n\r\n\t\t// Update Points\r\n\t\thelpers$1.each(points, function(point, index) {\r\n\t\t\tme.updateElement(point, index, reset);\r\n\t\t});\r\n\t},\r\n\r\n\t/**\r\n\t * @protected\r\n\t */\r\n\tupdateElement: function(point, index, reset) {\r\n\t\tvar me = this;\r\n\t\tvar meta = me.getMeta();\r\n\t\tvar custom = point.custom || {};\r\n\t\tvar xScale = me.getScaleForId(meta.xAxisID);\r\n\t\tvar yScale = me.getScaleForId(meta.yAxisID);\r\n\t\tvar options = me._resolveDataElementOptions(point, index);\r\n\t\tvar data = me.getDataset().data[index];\r\n\t\tvar dsIndex = me.index;\r\n\r\n\t\tvar x = reset ? xScale.getPixelForDecimal(0.5) : xScale.getPixelForValue(typeof data === 'object' ? data : NaN, index, dsIndex);\r\n\t\tvar y = reset ? yScale.getBasePixel() : yScale.getPixelForValue(data, index, dsIndex);\r\n\r\n\t\tpoint._xScale = xScale;\r\n\t\tpoint._yScale = yScale;\r\n\t\tpoint._options = options;\r\n\t\tpoint._datasetIndex = dsIndex;\r\n\t\tpoint._index = index;\r\n\t\tpoint._model = {\r\n\t\t\tbackgroundColor: options.backgroundColor,\r\n\t\t\tborderColor: options.borderColor,\r\n\t\t\tborderWidth: options.borderWidth,\r\n\t\t\thitRadius: options.hitRadius,\r\n\t\t\tpointStyle: options.pointStyle,\r\n\t\t\trotation: options.rotation,\r\n\t\t\tradius: reset ? 0 : options.radius,\r\n\t\t\tskip: custom.skip || isNaN(x) || isNaN(y),\r\n\t\t\tx: x,\r\n\t\t\ty: y,\r\n\t\t};\r\n\r\n\t\tpoint.pivot();\r\n\t},\r\n\r\n\t/**\r\n\t * @protected\r\n\t */\r\n\tsetHoverStyle: function(point) {\r\n\t\tvar model = point._model;\r\n\t\tvar options = point._options;\r\n\t\tvar getHoverColor = helpers$1.getHoverColor;\r\n\r\n\t\tpoint.$previousStyle = {\r\n\t\t\tbackgroundColor: model.backgroundColor,\r\n\t\t\tborderColor: model.borderColor,\r\n\t\t\tborderWidth: model.borderWidth,\r\n\t\t\tradius: model.radius\r\n\t\t};\r\n\r\n\t\tmodel.backgroundColor = valueOrDefault$4(options.hoverBackgroundColor, getHoverColor(options.backgroundColor));\r\n\t\tmodel.borderColor = valueOrDefault$4(options.hoverBorderColor, getHoverColor(options.borderColor));\r\n\t\tmodel.borderWidth = valueOrDefault$4(options.hoverBorderWidth, options.borderWidth);\r\n\t\tmodel.radius = options.radius + options.hoverRadius;\r\n\t},\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n\t_resolveDataElementOptions: function(point, index) {\r\n\t\tvar me = this;\r\n\t\tvar chart = me.chart;\r\n\t\tvar dataset = me.getDataset();\r\n\t\tvar custom = point.custom || {};\r\n\t\tvar data = dataset.data[index] || {};\r\n\t\tvar values = core_datasetController.prototype._resolveDataElementOptions.apply(me, arguments);\r\n\r\n\t\t// Scriptable options\r\n\t\tvar context = {\r\n\t\t\tchart: chart,\r\n\t\t\tdataIndex: index,\r\n\t\t\tdataset: dataset,\r\n\t\t\tdatasetIndex: me.index\r\n\t\t};\r\n\r\n\t\t// In case values were cached (and thus frozen), we need to clone the values\r\n\t\tif (me._cachedDataOpts === values) {\r\n\t\t\tvalues = helpers$1.extend({}, values);\r\n\t\t}\r\n\r\n\t\t// Custom radius resolution\r\n\t\tvalues.radius = resolve$1([\r\n\t\t\tcustom.radius,\r\n\t\t\tdata.r,\r\n\t\t\tme._config.radius,\r\n\t\t\tchart.options.elements.point.radius\r\n\t\t], context, index);\r\n\r\n\t\treturn values;\r\n\t}\r\n});\n\nvar valueOrDefault$5 = helpers$1.valueOrDefault;\r\n\r\nvar PI$1 = Math.PI;\r\nvar DOUBLE_PI$1 = PI$1 * 2;\r\nvar HALF_PI$1 = PI$1 / 2;\r\n\r\ncore_defaults._set('doughnut', {\r\n\tanimation: {\r\n\t\t// Boolean - Whether we animate the rotation of the Doughnut\r\n\t\tanimateRotate: true,\r\n\t\t// Boolean - Whether we animate scaling the Doughnut from the centre\r\n\t\tanimateScale: false\r\n\t},\r\n\thover: {\r\n\t\tmode: 'single'\r\n\t},\r\n\tlegendCallback: function(chart) {\r\n\t\tvar list = document.createElement('ul');\r\n\t\tvar data = chart.data;\r\n\t\tvar datasets = data.datasets;\r\n\t\tvar labels = data.labels;\r\n\t\tvar i, ilen, listItem, listItemSpan;\r\n\r\n\t\tlist.setAttribute('class', chart.id + '-legend');\r\n\t\tif (datasets.length) {\r\n\t\t\tfor (i = 0, ilen = datasets[0].data.length; i < ilen; ++i) {\r\n\t\t\t\tlistItem = list.appendChild(document.createElement('li'));\r\n\t\t\t\tlistItemSpan = listItem.appendChild(document.createElement('span'));\r\n\t\t\t\tlistItemSpan.style.backgroundColor = datasets[0].backgroundColor[i];\r\n\t\t\t\tif (labels[i]) {\r\n\t\t\t\t\tlistItem.appendChild(document.createTextNode(labels[i]));\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn list.outerHTML;\r\n\t},\r\n\tlegend: {\r\n\t\tlabels: {\r\n\t\t\tgenerateLabels: function(chart) {\r\n\t\t\t\tvar data = chart.data;\r\n\t\t\t\tif (data.labels.length && data.datasets.length) {\r\n\t\t\t\t\treturn data.labels.map(function(label, i) {\r\n\t\t\t\t\t\tvar meta = chart.getDatasetMeta(0);\r\n\t\t\t\t\t\tvar style = meta.controller.getStyle(i);\r\n\r\n\t\t\t\t\t\treturn {\r\n\t\t\t\t\t\t\ttext: label,\r\n\t\t\t\t\t\t\tfillStyle: style.backgroundColor,\r\n\t\t\t\t\t\t\tstrokeStyle: style.borderColor,\r\n\t\t\t\t\t\t\tlineWidth: style.borderWidth,\r\n\t\t\t\t\t\t\thidden: isNaN(data.datasets[0].data[i]) || meta.data[i].hidden,\r\n\r\n\t\t\t\t\t\t\t// Extra data used for toggling the correct item\r\n\t\t\t\t\t\t\tindex: i\r\n\t\t\t\t\t\t};\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t\treturn [];\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tonClick: function(e, legendItem) {\r\n\t\t\tvar index = legendItem.index;\r\n\t\t\tvar chart = this.chart;\r\n\t\t\tvar i, ilen, meta;\r\n\r\n\t\t\tfor (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) {\r\n\t\t\t\tmeta = chart.getDatasetMeta(i);\r\n\t\t\t\t// toggle visibility of index if exists\r\n\t\t\t\tif (meta.data[index]) {\r\n\t\t\t\t\tmeta.data[index].hidden = !meta.data[index].hidden;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tchart.update();\r\n\t\t}\r\n\t},\r\n\r\n\t// The percentage of the chart that we cut out of the middle.\r\n\tcutoutPercentage: 50,\r\n\r\n\t// The rotation of the chart, where the first data arc begins.\r\n\trotation: -HALF_PI$1,\r\n\r\n\t// The total circumference of the chart.\r\n\tcircumference: DOUBLE_PI$1,\r\n\r\n\t// Need to override these to give a nice default\r\n\ttooltips: {\r\n\t\tcallbacks: {\r\n\t\t\ttitle: function() {\r\n\t\t\t\treturn '';\r\n\t\t\t},\r\n\t\t\tlabel: function(tooltipItem, data) {\r\n\t\t\t\tvar dataLabel = data.labels[tooltipItem.index];\r\n\t\t\t\tvar value = ': ' + data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index];\r\n\r\n\t\t\t\tif (helpers$1.isArray(dataLabel)) {\r\n\t\t\t\t\t// show value on first line of multiline label\r\n\t\t\t\t\t// need to clone because we are changing the value\r\n\t\t\t\t\tdataLabel = dataLabel.slice();\r\n\t\t\t\t\tdataLabel[0] += value;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tdataLabel += value;\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn dataLabel;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n});\r\n\r\nvar controller_doughnut = core_datasetController.extend({\r\n\r\n\tdataElementType: elements.Arc,\r\n\r\n\tlinkScales: helpers$1.noop,\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n\t_dataElementOptions: [\r\n\t\t'backgroundColor',\r\n\t\t'borderColor',\r\n\t\t'borderWidth',\r\n\t\t'borderAlign',\r\n\t\t'hoverBackgroundColor',\r\n\t\t'hoverBorderColor',\r\n\t\t'hoverBorderWidth',\r\n\t],\r\n\r\n\t// Get index of the dataset in relation to the visible datasets. This allows determining the inner and outer radius correctly\r\n\tgetRingIndex: function(datasetIndex) {\r\n\t\tvar ringIndex = 0;\r\n\r\n\t\tfor (var j = 0; j < datasetIndex; ++j) {\r\n\t\t\tif (this.chart.isDatasetVisible(j)) {\r\n\t\t\t\t++ringIndex;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn ringIndex;\r\n\t},\r\n\r\n\tupdate: function(reset) {\r\n\t\tvar me = this;\r\n\t\tvar chart = me.chart;\r\n\t\tvar chartArea = chart.chartArea;\r\n\t\tvar opts = chart.options;\r\n\t\tvar ratioX = 1;\r\n\t\tvar ratioY = 1;\r\n\t\tvar offsetX = 0;\r\n\t\tvar offsetY = 0;\r\n\t\tvar meta = me.getMeta();\r\n\t\tvar arcs = meta.data;\r\n\t\tvar cutout = opts.cutoutPercentage / 100 || 0;\r\n\t\tvar circumference = opts.circumference;\r\n\t\tvar chartWeight = me._getRingWeight(me.index);\r\n\t\tvar maxWidth, maxHeight, i, ilen;\r\n\r\n\t\t// If the chart's circumference isn't a full circle, calculate size as a ratio of the width/height of the arc\r\n\t\tif (circumference < DOUBLE_PI$1) {\r\n\t\t\tvar startAngle = opts.rotation % DOUBLE_PI$1;\r\n\t\t\tstartAngle += startAngle >= PI$1 ? -DOUBLE_PI$1 : startAngle < -PI$1 ? DOUBLE_PI$1 : 0;\r\n\t\t\tvar endAngle = startAngle + circumference;\r\n\t\t\tvar startX = Math.cos(startAngle);\r\n\t\t\tvar startY = Math.sin(startAngle);\r\n\t\t\tvar endX = Math.cos(endAngle);\r\n\t\t\tvar endY = Math.sin(endAngle);\r\n\t\t\tvar contains0 = (startAngle <= 0 && endAngle >= 0) || endAngle >= DOUBLE_PI$1;\r\n\t\t\tvar contains90 = (startAngle <= HALF_PI$1 && endAngle >= HALF_PI$1) || endAngle >= DOUBLE_PI$1 + HALF_PI$1;\r\n\t\t\tvar contains180 = startAngle === -PI$1 || endAngle >= PI$1;\r\n\t\t\tvar contains270 = (startAngle <= -HALF_PI$1 && endAngle >= -HALF_PI$1) || endAngle >= PI$1 + HALF_PI$1;\r\n\t\t\tvar minX = contains180 ? -1 : Math.min(startX, startX * cutout, endX, endX * cutout);\r\n\t\t\tvar minY = contains270 ? -1 : Math.min(startY, startY * cutout, endY, endY * cutout);\r\n\t\t\tvar maxX = contains0 ? 1 : Math.max(startX, startX * cutout, endX, endX * cutout);\r\n\t\t\tvar maxY = contains90 ? 1 : Math.max(startY, startY * cutout, endY, endY * cutout);\r\n\t\t\tratioX = (maxX - minX) / 2;\r\n\t\t\tratioY = (maxY - minY) / 2;\r\n\t\t\toffsetX = -(maxX + minX) / 2;\r\n\t\t\toffsetY = -(maxY + minY) / 2;\r\n\t\t}\r\n\r\n\t\tfor (i = 0, ilen = arcs.length; i < ilen; ++i) {\r\n\t\t\tarcs[i]._options = me._resolveDataElementOptions(arcs[i], i);\r\n\t\t}\r\n\r\n\t\tchart.borderWidth = me.getMaxBorderWidth();\r\n\t\tmaxWidth = (chartArea.right - chartArea.left - chart.borderWidth) / ratioX;\r\n\t\tmaxHeight = (chartArea.bottom - chartArea.top - chart.borderWidth) / ratioY;\r\n\t\tchart.outerRadius = Math.max(Math.min(maxWidth, maxHeight) / 2, 0);\r\n\t\tchart.innerRadius = Math.max(chart.outerRadius * cutout, 0);\r\n\t\tchart.radiusLength = (chart.outerRadius - chart.innerRadius) / (me._getVisibleDatasetWeightTotal() || 1);\r\n\t\tchart.offsetX = offsetX * chart.outerRadius;\r\n\t\tchart.offsetY = offsetY * chart.outerRadius;\r\n\r\n\t\tmeta.total = me.calculateTotal();\r\n\r\n\t\tme.outerRadius = chart.outerRadius - chart.radiusLength * me._getRingWeightOffset(me.index);\r\n\t\tme.innerRadius = Math.max(me.outerRadius - chart.radiusLength * chartWeight, 0);\r\n\r\n\t\tfor (i = 0, ilen = arcs.length; i < ilen; ++i) {\r\n\t\t\tme.updateElement(arcs[i], i, reset);\r\n\t\t}\r\n\t},\r\n\r\n\tupdateElement: function(arc, index, reset) {\r\n\t\tvar me = this;\r\n\t\tvar chart = me.chart;\r\n\t\tvar chartArea = chart.chartArea;\r\n\t\tvar opts = chart.options;\r\n\t\tvar animationOpts = opts.animation;\r\n\t\tvar centerX = (chartArea.left + chartArea.right) / 2;\r\n\t\tvar centerY = (chartArea.top + chartArea.bottom) / 2;\r\n\t\tvar startAngle = opts.rotation; // non reset case handled later\r\n\t\tvar endAngle = opts.rotation; // non reset case handled later\r\n\t\tvar dataset = me.getDataset();\r\n\t\tvar circumference = reset && animationOpts.animateRotate ? 0 : arc.hidden ? 0 : me.calculateCircumference(dataset.data[index]) * (opts.circumference / DOUBLE_PI$1);\r\n\t\tvar innerRadius = reset && animationOpts.animateScale ? 0 : me.innerRadius;\r\n\t\tvar outerRadius = reset && animationOpts.animateScale ? 0 : me.outerRadius;\r\n\t\tvar options = arc._options || {};\r\n\r\n\t\thelpers$1.extend(arc, {\r\n\t\t\t// Utility\r\n\t\t\t_datasetIndex: me.index,\r\n\t\t\t_index: index,\r\n\r\n\t\t\t// Desired view properties\r\n\t\t\t_model: {\r\n\t\t\t\tbackgroundColor: options.backgroundColor,\r\n\t\t\t\tborderColor: options.borderColor,\r\n\t\t\t\tborderWidth: options.borderWidth,\r\n\t\t\t\tborderAlign: options.borderAlign,\r\n\t\t\t\tx: centerX + chart.offsetX,\r\n\t\t\t\ty: centerY + chart.offsetY,\r\n\t\t\t\tstartAngle: startAngle,\r\n\t\t\t\tendAngle: endAngle,\r\n\t\t\t\tcircumference: circumference,\r\n\t\t\t\touterRadius: outerRadius,\r\n\t\t\t\tinnerRadius: innerRadius,\r\n\t\t\t\tlabel: helpers$1.valueAtIndexOrDefault(dataset.label, index, chart.data.labels[index])\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tvar model = arc._model;\r\n\r\n\t\t// Set correct angles if not resetting\r\n\t\tif (!reset || !animationOpts.animateRotate) {\r\n\t\t\tif (index === 0) {\r\n\t\t\t\tmodel.startAngle = opts.rotation;\r\n\t\t\t} else {\r\n\t\t\t\tmodel.startAngle = me.getMeta().data[index - 1]._model.endAngle;\r\n\t\t\t}\r\n\r\n\t\t\tmodel.endAngle = model.startAngle + model.circumference;\r\n\t\t}\r\n\r\n\t\tarc.pivot();\r\n\t},\r\n\r\n\tcalculateTotal: function() {\r\n\t\tvar dataset = this.getDataset();\r\n\t\tvar meta = this.getMeta();\r\n\t\tvar total = 0;\r\n\t\tvar value;\r\n\r\n\t\thelpers$1.each(meta.data, function(element, index) {\r\n\t\t\tvalue = dataset.data[index];\r\n\t\t\tif (!isNaN(value) && !element.hidden) {\r\n\t\t\t\ttotal += Math.abs(value);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t/* if (total === 0) {\r\n\t\t\ttotal = NaN;\r\n\t\t}*/\r\n\r\n\t\treturn total;\r\n\t},\r\n\r\n\tcalculateCircumference: function(value) {\r\n\t\tvar total = this.getMeta().total;\r\n\t\tif (total > 0 && !isNaN(value)) {\r\n\t\t\treturn DOUBLE_PI$1 * (Math.abs(value) / total);\r\n\t\t}\r\n\t\treturn 0;\r\n\t},\r\n\r\n\t// gets the max border or hover width to properly scale pie charts\r\n\tgetMaxBorderWidth: function(arcs) {\r\n\t\tvar me = this;\r\n\t\tvar max = 0;\r\n\t\tvar chart = me.chart;\r\n\t\tvar i, ilen, meta, arc, controller, options, borderWidth, hoverWidth;\r\n\r\n\t\tif (!arcs) {\r\n\t\t\t// Find the outmost visible dataset\r\n\t\t\tfor (i = 0, ilen = chart.data.datasets.length; i < ilen; ++i) {\r\n\t\t\t\tif (chart.isDatasetVisible(i)) {\r\n\t\t\t\t\tmeta = chart.getDatasetMeta(i);\r\n\t\t\t\t\tarcs = meta.data;\r\n\t\t\t\t\tif (i !== me.index) {\r\n\t\t\t\t\t\tcontroller = meta.controller;\r\n\t\t\t\t\t}\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (!arcs) {\r\n\t\t\treturn 0;\r\n\t\t}\r\n\r\n\t\tfor (i = 0, ilen = arcs.length; i < ilen; ++i) {\r\n\t\t\tarc = arcs[i];\r\n\t\t\tif (controller) {\r\n\t\t\t\tcontroller._configure();\r\n\t\t\t\toptions = controller._resolveDataElementOptions(arc, i);\r\n\t\t\t} else {\r\n\t\t\t\toptions = arc._options;\r\n\t\t\t}\r\n\t\t\tif (options.borderAlign !== 'inner') {\r\n\t\t\t\tborderWidth = options.borderWidth;\r\n\t\t\t\thoverWidth = options.hoverBorderWidth;\r\n\r\n\t\t\t\tmax = borderWidth > max ? borderWidth : max;\r\n\t\t\t\tmax = hoverWidth > max ? hoverWidth : max;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn max;\r\n\t},\r\n\r\n\t/**\r\n\t * @protected\r\n\t */\r\n\tsetHoverStyle: function(arc) {\r\n\t\tvar model = arc._model;\r\n\t\tvar options = arc._options;\r\n\t\tvar getHoverColor = helpers$1.getHoverColor;\r\n\r\n\t\tarc.$previousStyle = {\r\n\t\t\tbackgroundColor: model.backgroundColor,\r\n\t\t\tborderColor: model.borderColor,\r\n\t\t\tborderWidth: model.borderWidth,\r\n\t\t};\r\n\r\n\t\tmodel.backgroundColor = valueOrDefault$5(options.hoverBackgroundColor, getHoverColor(options.backgroundColor));\r\n\t\tmodel.borderColor = valueOrDefault$5(options.hoverBorderColor, getHoverColor(options.borderColor));\r\n\t\tmodel.borderWidth = valueOrDefault$5(options.hoverBorderWidth, options.borderWidth);\r\n\t},\r\n\r\n\t/**\r\n\t * Get radius length offset of the dataset in relation to the visible datasets weights. This allows determining the inner and outer radius correctly\r\n\t * @private\r\n\t */\r\n\t_getRingWeightOffset: function(datasetIndex) {\r\n\t\tvar ringWeightOffset = 0;\r\n\r\n\t\tfor (var i = 0; i < datasetIndex; ++i) {\r\n\t\t\tif (this.chart.isDatasetVisible(i)) {\r\n\t\t\t\tringWeightOffset += this._getRingWeight(i);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn ringWeightOffset;\r\n\t},\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n\t_getRingWeight: function(dataSetIndex) {\r\n\t\treturn Math.max(valueOrDefault$5(this.chart.data.datasets[dataSetIndex].weight, 1), 0);\r\n\t},\r\n\r\n\t/**\r\n\t * Returns the sum of all visibile data set weights.  This value can be 0.\r\n\t * @private\r\n\t */\r\n\t_getVisibleDatasetWeightTotal: function() {\r\n\t\treturn this._getRingWeightOffset(this.chart.data.datasets.length);\r\n\t}\r\n});\n\ncore_defaults._set('horizontalBar', {\r\n\thover: {\r\n\t\tmode: 'index',\r\n\t\taxis: 'y'\r\n\t},\r\n\r\n\tscales: {\r\n\t\txAxes: [{\r\n\t\t\ttype: 'linear',\r\n\t\t\tposition: 'bottom'\r\n\t\t}],\r\n\r\n\t\tyAxes: [{\r\n\t\t\ttype: 'category',\r\n\t\t\tposition: 'left',\r\n\t\t\toffset: true,\r\n\t\t\tgridLines: {\r\n\t\t\t\toffsetGridLines: true\r\n\t\t\t}\r\n\t\t}]\r\n\t},\r\n\r\n\telements: {\r\n\t\trectangle: {\r\n\t\t\tborderSkipped: 'left'\r\n\t\t}\r\n\t},\r\n\r\n\ttooltips: {\r\n\t\tmode: 'index',\r\n\t\taxis: 'y'\r\n\t}\r\n});\r\n\r\ncore_defaults._set('global', {\r\n\tdatasets: {\r\n\t\thorizontalBar: {\r\n\t\t\tcategoryPercentage: 0.8,\r\n\t\t\tbarPercentage: 0.9\r\n\t\t}\r\n\t}\r\n});\r\n\r\nvar controller_horizontalBar = controller_bar.extend({\r\n\t/**\r\n\t * @private\r\n\t */\r\n\t_getValueScaleId: function() {\r\n\t\treturn this.getMeta().xAxisID;\r\n\t},\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n\t_getIndexScaleId: function() {\r\n\t\treturn this.getMeta().yAxisID;\r\n\t}\r\n});\n\nvar valueOrDefault$6 = helpers$1.valueOrDefault;\r\nvar resolve$2 = helpers$1.options.resolve;\r\nvar isPointInArea = helpers$1.canvas._isPointInArea;\r\n\r\ncore_defaults._set('line', {\r\n\tshowLines: true,\r\n\tspanGaps: false,\r\n\r\n\thover: {\r\n\t\tmode: 'label'\r\n\t},\r\n\r\n\tscales: {\r\n\t\txAxes: [{\r\n\t\t\ttype: 'category',\r\n\t\t\tid: 'x-axis-0'\r\n\t\t}],\r\n\t\tyAxes: [{\r\n\t\t\ttype: 'linear',\r\n\t\t\tid: 'y-axis-0'\r\n\t\t}]\r\n\t}\r\n});\r\n\r\nfunction scaleClip(scale, halfBorderWidth) {\r\n\tvar tickOpts = scale && scale.options.ticks || {};\r\n\tvar reverse = tickOpts.reverse;\r\n\tvar min = tickOpts.min === undefined ? halfBorderWidth : 0;\r\n\tvar max = tickOpts.max === undefined ? halfBorderWidth : 0;\r\n\treturn {\r\n\t\tstart: reverse ? max : min,\r\n\t\tend: reverse ? min : max\r\n\t};\r\n}\r\n\r\nfunction defaultClip(xScale, yScale, borderWidth) {\r\n\tvar halfBorderWidth = borderWidth / 2;\r\n\tvar x = scaleClip(xScale, halfBorderWidth);\r\n\tvar y = scaleClip(yScale, halfBorderWidth);\r\n\r\n\treturn {\r\n\t\ttop: y.end,\r\n\t\tright: x.end,\r\n\t\tbottom: y.start,\r\n\t\tleft: x.start\r\n\t};\r\n}\r\n\r\nfunction toClip(value) {\r\n\tvar t, r, b, l;\r\n\r\n\tif (helpers$1.isObject(value)) {\r\n\t\tt = value.top;\r\n\t\tr = value.right;\r\n\t\tb = value.bottom;\r\n\t\tl = value.left;\r\n\t} else {\r\n\t\tt = r = b = l = value;\r\n\t}\r\n\r\n\treturn {\r\n\t\ttop: t,\r\n\t\tright: r,\r\n\t\tbottom: b,\r\n\t\tleft: l\r\n\t};\r\n}\r\n\r\n\r\nvar controller_line = core_datasetController.extend({\r\n\r\n\tdatasetElementType: elements.Line,\r\n\r\n\tdataElementType: elements.Point,\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n\t_datasetElementOptions: [\r\n\t\t'backgroundColor',\r\n\t\t'borderCapStyle',\r\n\t\t'borderColor',\r\n\t\t'borderDash',\r\n\t\t'borderDashOffset',\r\n\t\t'borderJoinStyle',\r\n\t\t'borderWidth',\r\n\t\t'cubicInterpolationMode',\r\n\t\t'fill'\r\n\t],\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n\t_dataElementOptions: {\r\n\t\tbackgroundColor: 'pointBackgroundColor',\r\n\t\tborderColor: 'pointBorderColor',\r\n\t\tborderWidth: 'pointBorderWidth',\r\n\t\thitRadius: 'pointHitRadius',\r\n\t\thoverBackgroundColor: 'pointHoverBackgroundColor',\r\n\t\thoverBorderColor: 'pointHoverBorderColor',\r\n\t\thoverBorderWidth: 'pointHoverBorderWidth',\r\n\t\thoverRadius: 'pointHoverRadius',\r\n\t\tpointStyle: 'pointStyle',\r\n\t\tradius: 'pointRadius',\r\n\t\trotation: 'pointRotation'\r\n\t},\r\n\r\n\tupdate: function(reset) {\r\n\t\tvar me = this;\r\n\t\tvar meta = me.getMeta();\r\n\t\tvar line = meta.dataset;\r\n\t\tvar points = meta.data || [];\r\n\t\tvar options = me.chart.options;\r\n\t\tvar config = me._config;\r\n\t\tvar showLine = me._showLine = valueOrDefault$6(config.showLine, options.showLines);\r\n\t\tvar i, ilen;\r\n\r\n\t\tme._xScale = me.getScaleForId(meta.xAxisID);\r\n\t\tme._yScale = me.getScaleForId(meta.yAxisID);\r\n\r\n\t\t// Update Line\r\n\t\tif (showLine) {\r\n\t\t\t// Compatibility: If the properties are defined with only the old name, use those values\r\n\t\t\tif (config.tension !== undefined && config.lineTension === undefined) {\r\n\t\t\t\tconfig.lineTension = config.tension;\r\n\t\t\t}\r\n\r\n\t\t\t// Utility\r\n\t\t\tline._scale = me._yScale;\r\n\t\t\tline._datasetIndex = me.index;\r\n\t\t\t// Data\r\n\t\t\tline._children = points;\r\n\t\t\t// Model\r\n\t\t\tline._model = me._resolveDatasetElementOptions(line);\r\n\r\n\t\t\tline.pivot();\r\n\t\t}\r\n\r\n\t\t// Update Points\r\n\t\tfor (i = 0, ilen = points.length; i < ilen; ++i) {\r\n\t\t\tme.updateElement(points[i], i, reset);\r\n\t\t}\r\n\r\n\t\tif (showLine && line._model.tension !== 0) {\r\n\t\t\tme.updateBezierControlPoints();\r\n\t\t}\r\n\r\n\t\t// Now pivot the point for animation\r\n\t\tfor (i = 0, ilen = points.length; i < ilen; ++i) {\r\n\t\t\tpoints[i].pivot();\r\n\t\t}\r\n\t},\r\n\r\n\tupdateElement: function(point, index, reset) {\r\n\t\tvar me = this;\r\n\t\tvar meta = me.getMeta();\r\n\t\tvar custom = point.custom || {};\r\n\t\tvar dataset = me.getDataset();\r\n\t\tvar datasetIndex = me.index;\r\n\t\tvar value = dataset.data[index];\r\n\t\tvar xScale = me._xScale;\r\n\t\tvar yScale = me._yScale;\r\n\t\tvar lineModel = meta.dataset._model;\r\n\t\tvar x, y;\r\n\r\n\t\tvar options = me._resolveDataElementOptions(point, index);\r\n\r\n\t\tx = xScale.getPixelForValue(typeof value === 'object' ? value : NaN, index, datasetIndex);\r\n\t\ty = reset ? yScale.getBasePixel() : me.calculatePointY(value, index, datasetIndex);\r\n\r\n\t\t// Utility\r\n\t\tpoint._xScale = xScale;\r\n\t\tpoint._yScale = yScale;\r\n\t\tpoint._options = options;\r\n\t\tpoint._datasetIndex = datasetIndex;\r\n\t\tpoint._index = index;\r\n\r\n\t\t// Desired view properties\r\n\t\tpoint._model = {\r\n\t\t\tx: x,\r\n\t\t\ty: y,\r\n\t\t\tskip: custom.skip || isNaN(x) || isNaN(y),\r\n\t\t\t// Appearance\r\n\t\t\tradius: options.radius,\r\n\t\t\tpointStyle: options.pointStyle,\r\n\t\t\trotation: options.rotation,\r\n\t\t\tbackgroundColor: options.backgroundColor,\r\n\t\t\tborderColor: options.borderColor,\r\n\t\t\tborderWidth: options.borderWidth,\r\n\t\t\ttension: valueOrDefault$6(custom.tension, lineModel ? lineModel.tension : 0),\r\n\t\t\tsteppedLine: lineModel ? lineModel.steppedLine : false,\r\n\t\t\t// Tooltip\r\n\t\t\thitRadius: options.hitRadius\r\n\t\t};\r\n\t},\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n\t_resolveDatasetElementOptions: function(element) {\r\n\t\tvar me = this;\r\n\t\tvar config = me._config;\r\n\t\tvar custom = element.custom || {};\r\n\t\tvar options = me.chart.options;\r\n\t\tvar lineOptions = options.elements.line;\r\n\t\tvar values = core_datasetController.prototype._resolveDatasetElementOptions.apply(me, arguments);\r\n\r\n\t\t// The default behavior of lines is to break at null values, according\r\n\t\t// to https://github.com/chartjs/Chart.js/issues/2435#issuecomment-216718158\r\n\t\t// This option gives lines the ability to span gaps\r\n\t\tvalues.spanGaps = valueOrDefault$6(config.spanGaps, options.spanGaps);\r\n\t\tvalues.tension = valueOrDefault$6(config.lineTension, lineOptions.tension);\r\n\t\tvalues.steppedLine = resolve$2([custom.steppedLine, config.steppedLine, lineOptions.stepped]);\r\n\t\tvalues.clip = toClip(valueOrDefault$6(config.clip, defaultClip(me._xScale, me._yScale, values.borderWidth)));\r\n\r\n\t\treturn values;\r\n\t},\r\n\r\n\tcalculatePointY: function(value, index, datasetIndex) {\r\n\t\tvar me = this;\r\n\t\tvar chart = me.chart;\r\n\t\tvar yScale = me._yScale;\r\n\t\tvar sumPos = 0;\r\n\t\tvar sumNeg = 0;\r\n\t\tvar i, ds, dsMeta, stackedRightValue, rightValue, metasets, ilen;\r\n\r\n\t\tif (yScale.options.stacked) {\r\n\t\t\trightValue = +yScale.getRightValue(value);\r\n\t\t\tmetasets = chart._getSortedVisibleDatasetMetas();\r\n\t\t\tilen = metasets.length;\r\n\r\n\t\t\tfor (i = 0; i < ilen; ++i) {\r\n\t\t\t\tdsMeta = metasets[i];\r\n\t\t\t\tif (dsMeta.index === datasetIndex) {\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tds = chart.data.datasets[dsMeta.index];\r\n\t\t\t\tif (dsMeta.type === 'line' && dsMeta.yAxisID === yScale.id) {\r\n\t\t\t\t\tstackedRightValue = +yScale.getRightValue(ds.data[index]);\r\n\t\t\t\t\tif (stackedRightValue < 0) {\r\n\t\t\t\t\t\tsumNeg += stackedRightValue || 0;\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tsumPos += stackedRightValue || 0;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tif (rightValue < 0) {\r\n\t\t\t\treturn yScale.getPixelForValue(sumNeg + rightValue);\r\n\t\t\t}\r\n\t\t\treturn yScale.getPixelForValue(sumPos + rightValue);\r\n\t\t}\r\n\t\treturn yScale.getPixelForValue(value);\r\n\t},\r\n\r\n\tupdateBezierControlPoints: function() {\r\n\t\tvar me = this;\r\n\t\tvar chart = me.chart;\r\n\t\tvar meta = me.getMeta();\r\n\t\tvar lineModel = meta.dataset._model;\r\n\t\tvar area = chart.chartArea;\r\n\t\tvar points = meta.data || [];\r\n\t\tvar i, ilen, model, controlPoints;\r\n\r\n\t\t// Only consider points that are drawn in case the spanGaps option is used\r\n\t\tif (lineModel.spanGaps) {\r\n\t\t\tpoints = points.filter(function(pt) {\r\n\t\t\t\treturn !pt._model.skip;\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tfunction capControlPoint(pt, min, max) {\r\n\t\t\treturn Math.max(Math.min(pt, max), min);\r\n\t\t}\r\n\r\n\t\tif (lineModel.cubicInterpolationMode === 'monotone') {\r\n\t\t\thelpers$1.splineCurveMonotone(points);\r\n\t\t} else {\r\n\t\t\tfor (i = 0, ilen = points.length; i < ilen; ++i) {\r\n\t\t\t\tmodel = points[i]._model;\r\n\t\t\t\tcontrolPoints = helpers$1.splineCurve(\r\n\t\t\t\t\thelpers$1.previousItem(points, i)._model,\r\n\t\t\t\t\tmodel,\r\n\t\t\t\t\thelpers$1.nextItem(points, i)._model,\r\n\t\t\t\t\tlineModel.tension\r\n\t\t\t\t);\r\n\t\t\t\tmodel.controlPointPreviousX = controlPoints.previous.x;\r\n\t\t\t\tmodel.controlPointPreviousY = controlPoints.previous.y;\r\n\t\t\t\tmodel.controlPointNextX = controlPoints.next.x;\r\n\t\t\t\tmodel.controlPointNextY = controlPoints.next.y;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (chart.options.elements.line.capBezierPoints) {\r\n\t\t\tfor (i = 0, ilen = points.length; i < ilen; ++i) {\r\n\t\t\t\tmodel = points[i]._model;\r\n\t\t\t\tif (isPointInArea(model, area)) {\r\n\t\t\t\t\tif (i > 0 && isPointInArea(points[i - 1]._model, area)) {\r\n\t\t\t\t\t\tmodel.controlPointPreviousX = capControlPoint(model.controlPointPreviousX, area.left, area.right);\r\n\t\t\t\t\t\tmodel.controlPointPreviousY = capControlPoint(model.controlPointPreviousY, area.top, area.bottom);\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (i < points.length - 1 && isPointInArea(points[i + 1]._model, area)) {\r\n\t\t\t\t\t\tmodel.controlPointNextX = capControlPoint(model.controlPointNextX, area.left, area.right);\r\n\t\t\t\t\t\tmodel.controlPointNextY = capControlPoint(model.controlPointNextY, area.top, area.bottom);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\tdraw: function() {\r\n\t\tvar me = this;\r\n\t\tvar chart = me.chart;\r\n\t\tvar meta = me.getMeta();\r\n\t\tvar points = meta.data || [];\r\n\t\tvar area = chart.chartArea;\r\n\t\tvar canvas = chart.canvas;\r\n\t\tvar i = 0;\r\n\t\tvar ilen = points.length;\r\n\t\tvar clip;\r\n\r\n\t\tif (me._showLine) {\r\n\t\t\tclip = meta.dataset._model.clip;\r\n\r\n\t\t\thelpers$1.canvas.clipArea(chart.ctx, {\r\n\t\t\t\tleft: clip.left === false ? 0 : area.left - clip.left,\r\n\t\t\t\tright: clip.right === false ? canvas.width : area.right + clip.right,\r\n\t\t\t\ttop: clip.top === false ? 0 : area.top - clip.top,\r\n\t\t\t\tbottom: clip.bottom === false ? canvas.height : area.bottom + clip.bottom\r\n\t\t\t});\r\n\r\n\t\t\tmeta.dataset.draw();\r\n\r\n\t\t\thelpers$1.canvas.unclipArea(chart.ctx);\r\n\t\t}\r\n\r\n\t\t// Draw the points\r\n\t\tfor (; i < ilen; ++i) {\r\n\t\t\tpoints[i].draw(area);\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * @protected\r\n\t */\r\n\tsetHoverStyle: function(point) {\r\n\t\tvar model = point._model;\r\n\t\tvar options = point._options;\r\n\t\tvar getHoverColor = helpers$1.getHoverColor;\r\n\r\n\t\tpoint.$previousStyle = {\r\n\t\t\tbackgroundColor: model.backgroundColor,\r\n\t\t\tborderColor: model.borderColor,\r\n\t\t\tborderWidth: model.borderWidth,\r\n\t\t\tradius: model.radius\r\n\t\t};\r\n\r\n\t\tmodel.backgroundColor = valueOrDefault$6(options.hoverBackgroundColor, getHoverColor(options.backgroundColor));\r\n\t\tmodel.borderColor = valueOrDefault$6(options.hoverBorderColor, getHoverColor(options.borderColor));\r\n\t\tmodel.borderWidth = valueOrDefault$6(options.hoverBorderWidth, options.borderWidth);\r\n\t\tmodel.radius = valueOrDefault$6(options.hoverRadius, options.radius);\r\n\t},\r\n});\n\nvar resolve$3 = helpers$1.options.resolve;\r\n\r\ncore_defaults._set('polarArea', {\r\n\tscale: {\r\n\t\ttype: 'radialLinear',\r\n\t\tangleLines: {\r\n\t\t\tdisplay: false\r\n\t\t},\r\n\t\tgridLines: {\r\n\t\t\tcircular: true\r\n\t\t},\r\n\t\tpointLabels: {\r\n\t\t\tdisplay: false\r\n\t\t},\r\n\t\tticks: {\r\n\t\t\tbeginAtZero: true\r\n\t\t}\r\n\t},\r\n\r\n\t// Boolean - Whether to animate the rotation of the chart\r\n\tanimation: {\r\n\t\tanimateRotate: true,\r\n\t\tanimateScale: true\r\n\t},\r\n\r\n\tstartAngle: -0.5 * Math.PI,\r\n\tlegendCallback: function(chart) {\r\n\t\tvar list = document.createElement('ul');\r\n\t\tvar data = chart.data;\r\n\t\tvar datasets = data.datasets;\r\n\t\tvar labels = data.labels;\r\n\t\tvar i, ilen, listItem, listItemSpan;\r\n\r\n\t\tlist.setAttribute('class', chart.id + '-legend');\r\n\t\tif (datasets.length) {\r\n\t\t\tfor (i = 0, ilen = datasets[0].data.length; i < ilen; ++i) {\r\n\t\t\t\tlistItem = list.appendChild(document.createElement('li'));\r\n\t\t\t\tlistItemSpan = listItem.appendChild(document.createElement('span'));\r\n\t\t\t\tlistItemSpan.style.backgroundColor = datasets[0].backgroundColor[i];\r\n\t\t\t\tif (labels[i]) {\r\n\t\t\t\t\tlistItem.appendChild(document.createTextNode(labels[i]));\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn list.outerHTML;\r\n\t},\r\n\tlegend: {\r\n\t\tlabels: {\r\n\t\t\tgenerateLabels: function(chart) {\r\n\t\t\t\tvar data = chart.data;\r\n\t\t\t\tif (data.labels.length && data.datasets.length) {\r\n\t\t\t\t\treturn data.labels.map(function(label, i) {\r\n\t\t\t\t\t\tvar meta = chart.getDatasetMeta(0);\r\n\t\t\t\t\t\tvar style = meta.controller.getStyle(i);\r\n\r\n\t\t\t\t\t\treturn {\r\n\t\t\t\t\t\t\ttext: label,\r\n\t\t\t\t\t\t\tfillStyle: style.backgroundColor,\r\n\t\t\t\t\t\t\tstrokeStyle: style.borderColor,\r\n\t\t\t\t\t\t\tlineWidth: style.borderWidth,\r\n\t\t\t\t\t\t\thidden: isNaN(data.datasets[0].data[i]) || meta.data[i].hidden,\r\n\r\n\t\t\t\t\t\t\t// Extra data used for toggling the correct item\r\n\t\t\t\t\t\t\tindex: i\r\n\t\t\t\t\t\t};\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t\treturn [];\r\n\t\t\t}\r\n\t\t},\r\n\r\n\t\tonClick: function(e, legendItem) {\r\n\t\t\tvar index = legendItem.index;\r\n\t\t\tvar chart = this.chart;\r\n\t\t\tvar i, ilen, meta;\r\n\r\n\t\t\tfor (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) {\r\n\t\t\t\tmeta = chart.getDatasetMeta(i);\r\n\t\t\t\tmeta.data[index].hidden = !meta.data[index].hidden;\r\n\t\t\t}\r\n\r\n\t\t\tchart.update();\r\n\t\t}\r\n\t},\r\n\r\n\t// Need to override these to give a nice default\r\n\ttooltips: {\r\n\t\tcallbacks: {\r\n\t\t\ttitle: function() {\r\n\t\t\t\treturn '';\r\n\t\t\t},\r\n\t\t\tlabel: function(item, data) {\r\n\t\t\t\treturn data.labels[item.index] + ': ' + item.yLabel;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n});\r\n\r\nvar controller_polarArea = core_datasetController.extend({\r\n\r\n\tdataElementType: elements.Arc,\r\n\r\n\tlinkScales: helpers$1.noop,\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n\t_dataElementOptions: [\r\n\t\t'backgroundColor',\r\n\t\t'borderColor',\r\n\t\t'borderWidth',\r\n\t\t'borderAlign',\r\n\t\t'hoverBackgroundColor',\r\n\t\t'hoverBorderColor',\r\n\t\t'hoverBorderWidth',\r\n\t],\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n\t_getIndexScaleId: function() {\r\n\t\treturn this.chart.scale.id;\r\n\t},\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n\t_getValueScaleId: function() {\r\n\t\treturn this.chart.scale.id;\r\n\t},\r\n\r\n\tupdate: function(reset) {\r\n\t\tvar me = this;\r\n\t\tvar dataset = me.getDataset();\r\n\t\tvar meta = me.getMeta();\r\n\t\tvar start = me.chart.options.startAngle || 0;\r\n\t\tvar starts = me._starts = [];\r\n\t\tvar angles = me._angles = [];\r\n\t\tvar arcs = meta.data;\r\n\t\tvar i, ilen, angle;\r\n\r\n\t\tme._updateRadius();\r\n\r\n\t\tmeta.count = me.countVisibleElements();\r\n\r\n\t\tfor (i = 0, ilen = dataset.data.length; i < ilen; i++) {\r\n\t\t\tstarts[i] = start;\r\n\t\t\tangle = me._computeAngle(i);\r\n\t\t\tangles[i] = angle;\r\n\t\t\tstart += angle;\r\n\t\t}\r\n\r\n\t\tfor (i = 0, ilen = arcs.length; i < ilen; ++i) {\r\n\t\t\tarcs[i]._options = me._resolveDataElementOptions(arcs[i], i);\r\n\t\t\tme.updateElement(arcs[i], i, reset);\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n\t_updateRadius: function() {\r\n\t\tvar me = this;\r\n\t\tvar chart = me.chart;\r\n\t\tvar chartArea = chart.chartArea;\r\n\t\tvar opts = chart.options;\r\n\t\tvar minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top);\r\n\r\n\t\tchart.outerRadius = Math.max(minSize / 2, 0);\r\n\t\tchart.innerRadius = Math.max(opts.cutoutPercentage ? (chart.outerRadius / 100) * (opts.cutoutPercentage) : 1, 0);\r\n\t\tchart.radiusLength = (chart.outerRadius - chart.innerRadius) / chart.getVisibleDatasetCount();\r\n\r\n\t\tme.outerRadius = chart.outerRadius - (chart.radiusLength * me.index);\r\n\t\tme.innerRadius = me.outerRadius - chart.radiusLength;\r\n\t},\r\n\r\n\tupdateElement: function(arc, index, reset) {\r\n\t\tvar me = this;\r\n\t\tvar chart = me.chart;\r\n\t\tvar dataset = me.getDataset();\r\n\t\tvar opts = chart.options;\r\n\t\tvar animationOpts = opts.animation;\r\n\t\tvar scale = chart.scale;\r\n\t\tvar labels = chart.data.labels;\r\n\r\n\t\tvar centerX = scale.xCenter;\r\n\t\tvar centerY = scale.yCenter;\r\n\r\n\t\t// var negHalfPI = -0.5 * Math.PI;\r\n\t\tvar datasetStartAngle = opts.startAngle;\r\n\t\tvar distance = arc.hidden ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]);\r\n\t\tvar startAngle = me._starts[index];\r\n\t\tvar endAngle = startAngle + (arc.hidden ? 0 : me._angles[index]);\r\n\r\n\t\tvar resetRadius = animationOpts.animateScale ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]);\r\n\t\tvar options = arc._options || {};\r\n\r\n\t\thelpers$1.extend(arc, {\r\n\t\t\t// Utility\r\n\t\t\t_datasetIndex: me.index,\r\n\t\t\t_index: index,\r\n\t\t\t_scale: scale,\r\n\r\n\t\t\t// Desired view properties\r\n\t\t\t_model: {\r\n\t\t\t\tbackgroundColor: options.backgroundColor,\r\n\t\t\t\tborderColor: options.borderColor,\r\n\t\t\t\tborderWidth: options.borderWidth,\r\n\t\t\t\tborderAlign: options.borderAlign,\r\n\t\t\t\tx: centerX,\r\n\t\t\t\ty: centerY,\r\n\t\t\t\tinnerRadius: 0,\r\n\t\t\t\touterRadius: reset ? resetRadius : distance,\r\n\t\t\t\tstartAngle: reset && animationOpts.animateRotate ? datasetStartAngle : startAngle,\r\n\t\t\t\tendAngle: reset && animationOpts.animateRotate ? datasetStartAngle : endAngle,\r\n\t\t\t\tlabel: helpers$1.valueAtIndexOrDefault(labels, index, labels[index])\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tarc.pivot();\r\n\t},\r\n\r\n\tcountVisibleElements: function() {\r\n\t\tvar dataset = this.getDataset();\r\n\t\tvar meta = this.getMeta();\r\n\t\tvar count = 0;\r\n\r\n\t\thelpers$1.each(meta.data, function(element, index) {\r\n\t\t\tif (!isNaN(dataset.data[index]) && !element.hidden) {\r\n\t\t\t\tcount++;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\treturn count;\r\n\t},\r\n\r\n\t/**\r\n\t * @protected\r\n\t */\r\n\tsetHoverStyle: function(arc) {\r\n\t\tvar model = arc._model;\r\n\t\tvar options = arc._options;\r\n\t\tvar getHoverColor = helpers$1.getHoverColor;\r\n\t\tvar valueOrDefault = helpers$1.valueOrDefault;\r\n\r\n\t\tarc.$previousStyle = {\r\n\t\t\tbackgroundColor: model.backgroundColor,\r\n\t\t\tborderColor: model.borderColor,\r\n\t\t\tborderWidth: model.borderWidth,\r\n\t\t};\r\n\r\n\t\tmodel.backgroundColor = valueOrDefault(options.hoverBackgroundColor, getHoverColor(options.backgroundColor));\r\n\t\tmodel.borderColor = valueOrDefault(options.hoverBorderColor, getHoverColor(options.borderColor));\r\n\t\tmodel.borderWidth = valueOrDefault(options.hoverBorderWidth, options.borderWidth);\r\n\t},\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n\t_computeAngle: function(index) {\r\n\t\tvar me = this;\r\n\t\tvar count = this.getMeta().count;\r\n\t\tvar dataset = me.getDataset();\r\n\t\tvar meta = me.getMeta();\r\n\r\n\t\tif (isNaN(dataset.data[index]) || meta.data[index].hidden) {\r\n\t\t\treturn 0;\r\n\t\t}\r\n\r\n\t\t// Scriptable options\r\n\t\tvar context = {\r\n\t\t\tchart: me.chart,\r\n\t\t\tdataIndex: index,\r\n\t\t\tdataset: dataset,\r\n\t\t\tdatasetIndex: me.index\r\n\t\t};\r\n\r\n\t\treturn resolve$3([\r\n\t\t\tme.chart.options.elements.arc.angle,\r\n\t\t\t(2 * Math.PI) / count\r\n\t\t], context, index);\r\n\t}\r\n});\n\ncore_defaults._set('pie', helpers$1.clone(core_defaults.doughnut));\r\ncore_defaults._set('pie', {\r\n\tcutoutPercentage: 0\r\n});\r\n\r\n// Pie charts are Doughnut chart with different defaults\r\nvar controller_pie = controller_doughnut;\n\nvar valueOrDefault$7 = helpers$1.valueOrDefault;\r\n\r\ncore_defaults._set('radar', {\r\n\tspanGaps: false,\r\n\tscale: {\r\n\t\ttype: 'radialLinear'\r\n\t},\r\n\telements: {\r\n\t\tline: {\r\n\t\t\tfill: 'start',\r\n\t\t\ttension: 0 // no bezier in radar\r\n\t\t}\r\n\t}\r\n});\r\n\r\nvar controller_radar = core_datasetController.extend({\r\n\tdatasetElementType: elements.Line,\r\n\r\n\tdataElementType: elements.Point,\r\n\r\n\tlinkScales: helpers$1.noop,\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n\t_datasetElementOptions: [\r\n\t\t'backgroundColor',\r\n\t\t'borderWidth',\r\n\t\t'borderColor',\r\n\t\t'borderCapStyle',\r\n\t\t'borderDash',\r\n\t\t'borderDashOffset',\r\n\t\t'borderJoinStyle',\r\n\t\t'fill'\r\n\t],\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n\t_dataElementOptions: {\r\n\t\tbackgroundColor: 'pointBackgroundColor',\r\n\t\tborderColor: 'pointBorderColor',\r\n\t\tborderWidth: 'pointBorderWidth',\r\n\t\thitRadius: 'pointHitRadius',\r\n\t\thoverBackgroundColor: 'pointHoverBackgroundColor',\r\n\t\thoverBorderColor: 'pointHoverBorderColor',\r\n\t\thoverBorderWidth: 'pointHoverBorderWidth',\r\n\t\thoverRadius: 'pointHoverRadius',\r\n\t\tpointStyle: 'pointStyle',\r\n\t\tradius: 'pointRadius',\r\n\t\trotation: 'pointRotation'\r\n\t},\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n\t_getIndexScaleId: function() {\r\n\t\treturn this.chart.scale.id;\r\n\t},\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n\t_getValueScaleId: function() {\r\n\t\treturn this.chart.scale.id;\r\n\t},\r\n\r\n\tupdate: function(reset) {\r\n\t\tvar me = this;\r\n\t\tvar meta = me.getMeta();\r\n\t\tvar line = meta.dataset;\r\n\t\tvar points = meta.data || [];\r\n\t\tvar scale = me.chart.scale;\r\n\t\tvar config = me._config;\r\n\t\tvar i, ilen;\r\n\r\n\t\t// Compatibility: If the properties are defined with only the old name, use those values\r\n\t\tif (config.tension !== undefined && config.lineTension === undefined) {\r\n\t\t\tconfig.lineTension = config.tension;\r\n\t\t}\r\n\r\n\t\t// Utility\r\n\t\tline._scale = scale;\r\n\t\tline._datasetIndex = me.index;\r\n\t\t// Data\r\n\t\tline._children = points;\r\n\t\tline._loop = true;\r\n\t\t// Model\r\n\t\tline._model = me._resolveDatasetElementOptions(line);\r\n\r\n\t\tline.pivot();\r\n\r\n\t\t// Update Points\r\n\t\tfor (i = 0, ilen = points.length; i < ilen; ++i) {\r\n\t\t\tme.updateElement(points[i], i, reset);\r\n\t\t}\r\n\r\n\t\t// Update bezier control points\r\n\t\tme.updateBezierControlPoints();\r\n\r\n\t\t// Now pivot the point for animation\r\n\t\tfor (i = 0, ilen = points.length; i < ilen; ++i) {\r\n\t\t\tpoints[i].pivot();\r\n\t\t}\r\n\t},\r\n\r\n\tupdateElement: function(point, index, reset) {\r\n\t\tvar me = this;\r\n\t\tvar custom = point.custom || {};\r\n\t\tvar dataset = me.getDataset();\r\n\t\tvar scale = me.chart.scale;\r\n\t\tvar pointPosition = scale.getPointPositionForValue(index, dataset.data[index]);\r\n\t\tvar options = me._resolveDataElementOptions(point, index);\r\n\t\tvar lineModel = me.getMeta().dataset._model;\r\n\t\tvar x = reset ? scale.xCenter : pointPosition.x;\r\n\t\tvar y = reset ? scale.yCenter : pointPosition.y;\r\n\r\n\t\t// Utility\r\n\t\tpoint._scale = scale;\r\n\t\tpoint._options = options;\r\n\t\tpoint._datasetIndex = me.index;\r\n\t\tpoint._index = index;\r\n\r\n\t\t// Desired view properties\r\n\t\tpoint._model = {\r\n\t\t\tx: x, // value not used in dataset scale, but we want a consistent API between scales\r\n\t\t\ty: y,\r\n\t\t\tskip: custom.skip || isNaN(x) || isNaN(y),\r\n\t\t\t// Appearance\r\n\t\t\tradius: options.radius,\r\n\t\t\tpointStyle: options.pointStyle,\r\n\t\t\trotation: options.rotation,\r\n\t\t\tbackgroundColor: options.backgroundColor,\r\n\t\t\tborderColor: options.borderColor,\r\n\t\t\tborderWidth: options.borderWidth,\r\n\t\t\ttension: valueOrDefault$7(custom.tension, lineModel ? lineModel.tension : 0),\r\n\r\n\t\t\t// Tooltip\r\n\t\t\thitRadius: options.hitRadius\r\n\t\t};\r\n\t},\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n\t_resolveDatasetElementOptions: function() {\r\n\t\tvar me = this;\r\n\t\tvar config = me._config;\r\n\t\tvar options = me.chart.options;\r\n\t\tvar values = core_datasetController.prototype._resolveDatasetElementOptions.apply(me, arguments);\r\n\r\n\t\tvalues.spanGaps = valueOrDefault$7(config.spanGaps, options.spanGaps);\r\n\t\tvalues.tension = valueOrDefault$7(config.lineTension, options.elements.line.tension);\r\n\r\n\t\treturn values;\r\n\t},\r\n\r\n\tupdateBezierControlPoints: function() {\r\n\t\tvar me = this;\r\n\t\tvar meta = me.getMeta();\r\n\t\tvar area = me.chart.chartArea;\r\n\t\tvar points = meta.data || [];\r\n\t\tvar i, ilen, model, controlPoints;\r\n\r\n\t\t// Only consider points that are drawn in case the spanGaps option is used\r\n\t\tif (meta.dataset._model.spanGaps) {\r\n\t\t\tpoints = points.filter(function(pt) {\r\n\t\t\t\treturn !pt._model.skip;\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tfunction capControlPoint(pt, min, max) {\r\n\t\t\treturn Math.max(Math.min(pt, max), min);\r\n\t\t}\r\n\r\n\t\tfor (i = 0, ilen = points.length; i < ilen; ++i) {\r\n\t\t\tmodel = points[i]._model;\r\n\t\t\tcontrolPoints = helpers$1.splineCurve(\r\n\t\t\t\thelpers$1.previousItem(points, i, true)._model,\r\n\t\t\t\tmodel,\r\n\t\t\t\thelpers$1.nextItem(points, i, true)._model,\r\n\t\t\t\tmodel.tension\r\n\t\t\t);\r\n\r\n\t\t\t// Prevent the bezier going outside of the bounds of the graph\r\n\t\t\tmodel.controlPointPreviousX = capControlPoint(controlPoints.previous.x, area.left, area.right);\r\n\t\t\tmodel.controlPointPreviousY = capControlPoint(controlPoints.previous.y, area.top, area.bottom);\r\n\t\t\tmodel.controlPointNextX = capControlPoint(controlPoints.next.x, area.left, area.right);\r\n\t\t\tmodel.controlPointNextY = capControlPoint(controlPoints.next.y, area.top, area.bottom);\r\n\t\t}\r\n\t},\r\n\r\n\tsetHoverStyle: function(point) {\r\n\t\tvar model = point._model;\r\n\t\tvar options = point._options;\r\n\t\tvar getHoverColor = helpers$1.getHoverColor;\r\n\r\n\t\tpoint.$previousStyle = {\r\n\t\t\tbackgroundColor: model.backgroundColor,\r\n\t\t\tborderColor: model.borderColor,\r\n\t\t\tborderWidth: model.borderWidth,\r\n\t\t\tradius: model.radius\r\n\t\t};\r\n\r\n\t\tmodel.backgroundColor = valueOrDefault$7(options.hoverBackgroundColor, getHoverColor(options.backgroundColor));\r\n\t\tmodel.borderColor = valueOrDefault$7(options.hoverBorderColor, getHoverColor(options.borderColor));\r\n\t\tmodel.borderWidth = valueOrDefault$7(options.hoverBorderWidth, options.borderWidth);\r\n\t\tmodel.radius = valueOrDefault$7(options.hoverRadius, options.radius);\r\n\t}\r\n});\n\ncore_defaults._set('scatter', {\r\n\thover: {\r\n\t\tmode: 'single'\r\n\t},\r\n\r\n\tscales: {\r\n\t\txAxes: [{\r\n\t\t\tid: 'x-axis-1',    // need an ID so datasets can reference the scale\r\n\t\t\ttype: 'linear',    // scatter should not use a category axis\r\n\t\t\tposition: 'bottom'\r\n\t\t}],\r\n\t\tyAxes: [{\r\n\t\t\tid: 'y-axis-1',\r\n\t\t\ttype: 'linear',\r\n\t\t\tposition: 'left'\r\n\t\t}]\r\n\t},\r\n\r\n\ttooltips: {\r\n\t\tcallbacks: {\r\n\t\t\ttitle: function() {\r\n\t\t\t\treturn '';     // doesn't make sense for scatter since data are formatted as a point\r\n\t\t\t},\r\n\t\t\tlabel: function(item) {\r\n\t\t\t\treturn '(' + item.xLabel + ', ' + item.yLabel + ')';\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n});\r\n\r\ncore_defaults._set('global', {\r\n\tdatasets: {\r\n\t\tscatter: {\r\n\t\t\tshowLine: false\r\n\t\t}\r\n\t}\r\n});\r\n\r\n// Scatter charts use line controllers\r\nvar controller_scatter = controller_line;\n\n// NOTE export a map in which the key represents the controller type, not\r\n// the class, and so must be CamelCase in order to be correctly retrieved\r\n// by the controller in core.controller.js (`controllers[meta.type]`).\r\n\r\nvar controllers = {\r\n\tbar: controller_bar,\r\n\tbubble: controller_bubble,\r\n\tdoughnut: controller_doughnut,\r\n\thorizontalBar: controller_horizontalBar,\r\n\tline: controller_line,\r\n\tpolarArea: controller_polarArea,\r\n\tpie: controller_pie,\r\n\tradar: controller_radar,\r\n\tscatter: controller_scatter\r\n};\n\n/**\r\n * Helper function to get relative position for an event\r\n * @param {Event|IEvent} event - The event to get the position for\r\n * @param {Chart} chart - The chart\r\n * @returns {object} the event position\r\n */\r\nfunction getRelativePosition(e, chart) {\r\n\tif (e.native) {\r\n\t\treturn {\r\n\t\t\tx: e.x,\r\n\t\t\ty: e.y\r\n\t\t};\r\n\t}\r\n\r\n\treturn helpers$1.getRelativePosition(e, chart);\r\n}\r\n\r\n/**\r\n * Helper function to traverse all of the visible elements in the chart\r\n * @param {Chart} chart - the chart\r\n * @param {function} handler - the callback to execute for each visible item\r\n */\r\nfunction parseVisibleItems(chart, handler) {\r\n\tvar metasets = chart._getSortedVisibleDatasetMetas();\r\n\tvar metadata, i, j, ilen, jlen, element;\r\n\r\n\tfor (i = 0, ilen = metasets.length; i < ilen; ++i) {\r\n\t\tmetadata = metasets[i].data;\r\n\t\tfor (j = 0, jlen = metadata.length; j < jlen; ++j) {\r\n\t\t\telement = metadata[j];\r\n\t\t\tif (!element._view.skip) {\r\n\t\t\t\thandler(element);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/**\r\n * Helper function to get the items that intersect the event position\r\n * @param {ChartElement[]} items - elements to filter\r\n * @param {object} position - the point to be nearest to\r\n * @return {ChartElement[]} the nearest items\r\n */\r\nfunction getIntersectItems(chart, position) {\r\n\tvar elements = [];\r\n\r\n\tparseVisibleItems(chart, function(element) {\r\n\t\tif (element.inRange(position.x, position.y)) {\r\n\t\t\telements.push(element);\r\n\t\t}\r\n\t});\r\n\r\n\treturn elements;\r\n}\r\n\r\n/**\r\n * Helper function to get the items nearest to the event position considering all visible items in teh chart\r\n * @param {Chart} chart - the chart to look at elements from\r\n * @param {object} position - the point to be nearest to\r\n * @param {boolean} intersect - if true, only consider items that intersect the position\r\n * @param {function} distanceMetric - function to provide the distance between points\r\n * @return {ChartElement[]} the nearest items\r\n */\r\nfunction getNearestItems(chart, position, intersect, distanceMetric) {\r\n\tvar minDistance = Number.POSITIVE_INFINITY;\r\n\tvar nearestItems = [];\r\n\r\n\tparseVisibleItems(chart, function(element) {\r\n\t\tif (intersect && !element.inRange(position.x, position.y)) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tvar center = element.getCenterPoint();\r\n\t\tvar distance = distanceMetric(position, center);\r\n\t\tif (distance < minDistance) {\r\n\t\t\tnearestItems = [element];\r\n\t\t\tminDistance = distance;\r\n\t\t} else if (distance === minDistance) {\r\n\t\t\t// Can have multiple items at the same distance in which case we sort by size\r\n\t\t\tnearestItems.push(element);\r\n\t\t}\r\n\t});\r\n\r\n\treturn nearestItems;\r\n}\r\n\r\n/**\r\n * Get a distance metric function for two points based on the\r\n * axis mode setting\r\n * @param {string} axis - the axis mode. x|y|xy\r\n */\r\nfunction getDistanceMetricForAxis(axis) {\r\n\tvar useX = axis.indexOf('x') !== -1;\r\n\tvar useY = axis.indexOf('y') !== -1;\r\n\r\n\treturn function(pt1, pt2) {\r\n\t\tvar deltaX = useX ? Math.abs(pt1.x - pt2.x) : 0;\r\n\t\tvar deltaY = useY ? Math.abs(pt1.y - pt2.y) : 0;\r\n\t\treturn Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2));\r\n\t};\r\n}\r\n\r\nfunction indexMode(chart, e, options) {\r\n\tvar position = getRelativePosition(e, chart);\r\n\t// Default axis for index mode is 'x' to match old behaviour\r\n\toptions.axis = options.axis || 'x';\r\n\tvar distanceMetric = getDistanceMetricForAxis(options.axis);\r\n\tvar items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false, distanceMetric);\r\n\tvar elements = [];\r\n\r\n\tif (!items.length) {\r\n\t\treturn [];\r\n\t}\r\n\r\n\tchart._getSortedVisibleDatasetMetas().forEach(function(meta) {\r\n\t\tvar element = meta.data[items[0]._index];\r\n\r\n\t\t// don't count items that are skipped (null data)\r\n\t\tif (element && !element._view.skip) {\r\n\t\t\telements.push(element);\r\n\t\t}\r\n\t});\r\n\r\n\treturn elements;\r\n}\r\n\r\n/**\r\n * @interface IInteractionOptions\r\n */\r\n/**\r\n * If true, only consider items that intersect the point\r\n * @name IInterfaceOptions#boolean\r\n * @type Boolean\r\n */\r\n\r\n/**\r\n * Contains interaction related functions\r\n * @namespace Chart.Interaction\r\n */\r\nvar core_interaction = {\r\n\t// Helper function for different modes\r\n\tmodes: {\r\n\t\tsingle: function(chart, e) {\r\n\t\t\tvar position = getRelativePosition(e, chart);\r\n\t\t\tvar elements = [];\r\n\r\n\t\t\tparseVisibleItems(chart, function(element) {\r\n\t\t\t\tif (element.inRange(position.x, position.y)) {\r\n\t\t\t\t\telements.push(element);\r\n\t\t\t\t\treturn elements;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\treturn elements.slice(0, 1);\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * @function Chart.Interaction.modes.label\r\n\t\t * @deprecated since version 2.4.0\r\n\t\t * @todo remove at version 3\r\n\t\t * @private\r\n\t\t */\r\n\t\tlabel: indexMode,\r\n\r\n\t\t/**\r\n\t\t * Returns items at the same index. If the options.intersect parameter is true, we only return items if we intersect something\r\n\t\t * If the options.intersect mode is false, we find the nearest item and return the items at the same index as that item\r\n\t\t * @function Chart.Interaction.modes.index\r\n\t\t * @since v2.4.0\r\n\t\t * @param {Chart} chart - the chart we are returning items from\r\n\t\t * @param {Event} e - the event we are find things at\r\n\t\t * @param {IInteractionOptions} options - options to use during interaction\r\n\t\t * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\r\n\t\t */\r\n\t\tindex: indexMode,\r\n\r\n\t\t/**\r\n\t\t * Returns items in the same dataset. If the options.intersect parameter is true, we only return items if we intersect something\r\n\t\t * If the options.intersect is false, we find the nearest item and return the items in that dataset\r\n\t\t * @function Chart.Interaction.modes.dataset\r\n\t\t * @param {Chart} chart - the chart we are returning items from\r\n\t\t * @param {Event} e - the event we are find things at\r\n\t\t * @param {IInteractionOptions} options - options to use during interaction\r\n\t\t * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\r\n\t\t */\r\n\t\tdataset: function(chart, e, options) {\r\n\t\t\tvar position = getRelativePosition(e, chart);\r\n\t\t\toptions.axis = options.axis || 'xy';\r\n\t\t\tvar distanceMetric = getDistanceMetricForAxis(options.axis);\r\n\t\t\tvar items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false, distanceMetric);\r\n\r\n\t\t\tif (items.length > 0) {\r\n\t\t\t\titems = chart.getDatasetMeta(items[0]._datasetIndex).data;\r\n\t\t\t}\r\n\r\n\t\t\treturn items;\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * @function Chart.Interaction.modes.x-axis\r\n\t\t * @deprecated since version 2.4.0. Use index mode and intersect == true\r\n\t\t * @todo remove at version 3\r\n\t\t * @private\r\n\t\t */\r\n\t\t'x-axis': function(chart, e) {\r\n\t\t\treturn indexMode(chart, e, {intersect: false});\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Point mode returns all elements that hit test based on the event position\r\n\t\t * of the event\r\n\t\t * @function Chart.Interaction.modes.intersect\r\n\t\t * @param {Chart} chart - the chart we are returning items from\r\n\t\t * @param {Event} e - the event we are find things at\r\n\t\t * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\r\n\t\t */\r\n\t\tpoint: function(chart, e) {\r\n\t\t\tvar position = getRelativePosition(e, chart);\r\n\t\t\treturn getIntersectItems(chart, position);\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * nearest mode returns the element closest to the point\r\n\t\t * @function Chart.Interaction.modes.intersect\r\n\t\t * @param {Chart} chart - the chart we are returning items from\r\n\t\t * @param {Event} e - the event we are find things at\r\n\t\t * @param {IInteractionOptions} options - options to use\r\n\t\t * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\r\n\t\t */\r\n\t\tnearest: function(chart, e, options) {\r\n\t\t\tvar position = getRelativePosition(e, chart);\r\n\t\t\toptions.axis = options.axis || 'xy';\r\n\t\t\tvar distanceMetric = getDistanceMetricForAxis(options.axis);\r\n\t\t\treturn getNearestItems(chart, position, options.intersect, distanceMetric);\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * x mode returns the elements that hit-test at the current x coordinate\r\n\t\t * @function Chart.Interaction.modes.x\r\n\t\t * @param {Chart} chart - the chart we are returning items from\r\n\t\t * @param {Event} e - the event we are find things at\r\n\t\t * @param {IInteractionOptions} options - options to use\r\n\t\t * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\r\n\t\t */\r\n\t\tx: function(chart, e, options) {\r\n\t\t\tvar position = getRelativePosition(e, chart);\r\n\t\t\tvar items = [];\r\n\t\t\tvar intersectsItem = false;\r\n\r\n\t\t\tparseVisibleItems(chart, function(element) {\r\n\t\t\t\tif (element.inXRange(position.x)) {\r\n\t\t\t\t\titems.push(element);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (element.inRange(position.x, position.y)) {\r\n\t\t\t\t\tintersectsItem = true;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\t// If we want to trigger on an intersect and we don't have any items\r\n\t\t\t// that intersect the position, return nothing\r\n\t\t\tif (options.intersect && !intersectsItem) {\r\n\t\t\t\titems = [];\r\n\t\t\t}\r\n\t\t\treturn items;\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * y mode returns the elements that hit-test at the current y coordinate\r\n\t\t * @function Chart.Interaction.modes.y\r\n\t\t * @param {Chart} chart - the chart we are returning items from\r\n\t\t * @param {Event} e - the event we are find things at\r\n\t\t * @param {IInteractionOptions} options - options to use\r\n\t\t * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned\r\n\t\t */\r\n\t\ty: function(chart, e, options) {\r\n\t\t\tvar position = getRelativePosition(e, chart);\r\n\t\t\tvar items = [];\r\n\t\t\tvar intersectsItem = false;\r\n\r\n\t\t\tparseVisibleItems(chart, function(element) {\r\n\t\t\t\tif (element.inYRange(position.y)) {\r\n\t\t\t\t\titems.push(element);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (element.inRange(position.x, position.y)) {\r\n\t\t\t\t\tintersectsItem = true;\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t\t// If we want to trigger on an intersect and we don't have any items\r\n\t\t\t// that intersect the position, return nothing\r\n\t\t\tif (options.intersect && !intersectsItem) {\r\n\t\t\t\titems = [];\r\n\t\t\t}\r\n\t\t\treturn items;\r\n\t\t}\r\n\t}\r\n};\n\nvar extend = helpers$1.extend;\r\n\r\nfunction filterByPosition(array, position) {\r\n\treturn helpers$1.where(array, function(v) {\r\n\t\treturn v.pos === position;\r\n\t});\r\n}\r\n\r\nfunction sortByWeight(array, reverse) {\r\n\treturn array.sort(function(a, b) {\r\n\t\tvar v0 = reverse ? b : a;\r\n\t\tvar v1 = reverse ? a : b;\r\n\t\treturn v0.weight === v1.weight ?\r\n\t\t\tv0.index - v1.index :\r\n\t\t\tv0.weight - v1.weight;\r\n\t});\r\n}\r\n\r\nfunction wrapBoxes(boxes) {\r\n\tvar layoutBoxes = [];\r\n\tvar i, ilen, box;\r\n\r\n\tfor (i = 0, ilen = (boxes || []).length; i < ilen; ++i) {\r\n\t\tbox = boxes[i];\r\n\t\tlayoutBoxes.push({\r\n\t\t\tindex: i,\r\n\t\t\tbox: box,\r\n\t\t\tpos: box.position,\r\n\t\t\thorizontal: box.isHorizontal(),\r\n\t\t\tweight: box.weight\r\n\t\t});\r\n\t}\r\n\treturn layoutBoxes;\r\n}\r\n\r\nfunction setLayoutDims(layouts, params) {\r\n\tvar i, ilen, layout;\r\n\tfor (i = 0, ilen = layouts.length; i < ilen; ++i) {\r\n\t\tlayout = layouts[i];\r\n\t\t// store width used instead of chartArea.w in fitBoxes\r\n\t\tlayout.width = layout.horizontal\r\n\t\t\t? layout.box.fullWidth && params.availableWidth\r\n\t\t\t: params.vBoxMaxWidth;\r\n\t\t// store height used instead of chartArea.h in fitBoxes\r\n\t\tlayout.height = layout.horizontal && params.hBoxMaxHeight;\r\n\t}\r\n}\r\n\r\nfunction buildLayoutBoxes(boxes) {\r\n\tvar layoutBoxes = wrapBoxes(boxes);\r\n\tvar left = sortByWeight(filterByPosition(layoutBoxes, 'left'), true);\r\n\tvar right = sortByWeight(filterByPosition(layoutBoxes, 'right'));\r\n\tvar top = sortByWeight(filterByPosition(layoutBoxes, 'top'), true);\r\n\tvar bottom = sortByWeight(filterByPosition(layoutBoxes, 'bottom'));\r\n\r\n\treturn {\r\n\t\tleftAndTop: left.concat(top),\r\n\t\trightAndBottom: right.concat(bottom),\r\n\t\tchartArea: filterByPosition(layoutBoxes, 'chartArea'),\r\n\t\tvertical: left.concat(right),\r\n\t\thorizontal: top.concat(bottom)\r\n\t};\r\n}\r\n\r\nfunction getCombinedMax(maxPadding, chartArea, a, b) {\r\n\treturn Math.max(maxPadding[a], chartArea[a]) + Math.max(maxPadding[b], chartArea[b]);\r\n}\r\n\r\nfunction updateDims(chartArea, params, layout) {\r\n\tvar box = layout.box;\r\n\tvar maxPadding = chartArea.maxPadding;\r\n\tvar newWidth, newHeight;\r\n\r\n\tif (layout.size) {\r\n\t\t// this layout was already counted for, lets first reduce old size\r\n\t\tchartArea[layout.pos] -= layout.size;\r\n\t}\r\n\tlayout.size = layout.horizontal ? box.height : box.width;\r\n\tchartArea[layout.pos] += layout.size;\r\n\r\n\tif (box.getPadding) {\r\n\t\tvar boxPadding = box.getPadding();\r\n\t\tmaxPadding.top = Math.max(maxPadding.top, boxPadding.top);\r\n\t\tmaxPadding.left = Math.max(maxPadding.left, boxPadding.left);\r\n\t\tmaxPadding.bottom = Math.max(maxPadding.bottom, boxPadding.bottom);\r\n\t\tmaxPadding.right = Math.max(maxPadding.right, boxPadding.right);\r\n\t}\r\n\r\n\tnewWidth = params.outerWidth - getCombinedMax(maxPadding, chartArea, 'left', 'right');\r\n\tnewHeight = params.outerHeight - getCombinedMax(maxPadding, chartArea, 'top', 'bottom');\r\n\r\n\tif (newWidth !== chartArea.w || newHeight !== chartArea.h) {\r\n\t\tchartArea.w = newWidth;\r\n\t\tchartArea.h = newHeight;\r\n\r\n\t\t// return true if chart area changed in layout's direction\r\n\t\tvar sizes = layout.horizontal ? [newWidth, chartArea.w] : [newHeight, chartArea.h];\r\n\t\treturn sizes[0] !== sizes[1] && (!isNaN(sizes[0]) || !isNaN(sizes[1]));\r\n\t}\r\n}\r\n\r\nfunction handleMaxPadding(chartArea) {\r\n\tvar maxPadding = chartArea.maxPadding;\r\n\r\n\tfunction updatePos(pos) {\r\n\t\tvar change = Math.max(maxPadding[pos] - chartArea[pos], 0);\r\n\t\tchartArea[pos] += change;\r\n\t\treturn change;\r\n\t}\r\n\tchartArea.y += updatePos('top');\r\n\tchartArea.x += updatePos('left');\r\n\tupdatePos('right');\r\n\tupdatePos('bottom');\r\n}\r\n\r\nfunction getMargins(horizontal, chartArea) {\r\n\tvar maxPadding = chartArea.maxPadding;\r\n\r\n\tfunction marginForPositions(positions) {\r\n\t\tvar margin = {left: 0, top: 0, right: 0, bottom: 0};\r\n\t\tpositions.forEach(function(pos) {\r\n\t\t\tmargin[pos] = Math.max(chartArea[pos], maxPadding[pos]);\r\n\t\t});\r\n\t\treturn margin;\r\n\t}\r\n\r\n\treturn horizontal\r\n\t\t? marginForPositions(['left', 'right'])\r\n\t\t: marginForPositions(['top', 'bottom']);\r\n}\r\n\r\nfunction fitBoxes(boxes, chartArea, params) {\r\n\tvar refitBoxes = [];\r\n\tvar i, ilen, layout, box, refit, changed;\r\n\r\n\tfor (i = 0, ilen = boxes.length; i < ilen; ++i) {\r\n\t\tlayout = boxes[i];\r\n\t\tbox = layout.box;\r\n\r\n\t\tbox.update(\r\n\t\t\tlayout.width || chartArea.w,\r\n\t\t\tlayout.height || chartArea.h,\r\n\t\t\tgetMargins(layout.horizontal, chartArea)\r\n\t\t);\r\n\t\tif (updateDims(chartArea, params, layout)) {\r\n\t\t\tchanged = true;\r\n\t\t\tif (refitBoxes.length) {\r\n\t\t\t\t// Dimensions changed and there were non full width boxes before this\r\n\t\t\t\t// -> we have to refit those\r\n\t\t\t\trefit = true;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (!box.fullWidth) { // fullWidth boxes don't need to be re-fitted in any case\r\n\t\t\trefitBoxes.push(layout);\r\n\t\t}\r\n\t}\r\n\r\n\treturn refit ? fitBoxes(refitBoxes, chartArea, params) || changed : changed;\r\n}\r\n\r\nfunction placeBoxes(boxes, chartArea, params) {\r\n\tvar userPadding = params.padding;\r\n\tvar x = chartArea.x;\r\n\tvar y = chartArea.y;\r\n\tvar i, ilen, layout, box;\r\n\r\n\tfor (i = 0, ilen = boxes.length; i < ilen; ++i) {\r\n\t\tlayout = boxes[i];\r\n\t\tbox = layout.box;\r\n\t\tif (layout.horizontal) {\r\n\t\t\tbox.left = box.fullWidth ? userPadding.left : chartArea.left;\r\n\t\t\tbox.right = box.fullWidth ? params.outerWidth - userPadding.right : chartArea.left + chartArea.w;\r\n\t\t\tbox.top = y;\r\n\t\t\tbox.bottom = y + box.height;\r\n\t\t\tbox.width = box.right - box.left;\r\n\t\t\ty = box.bottom;\r\n\t\t} else {\r\n\t\t\tbox.left = x;\r\n\t\t\tbox.right = x + box.width;\r\n\t\t\tbox.top = chartArea.top;\r\n\t\t\tbox.bottom = chartArea.top + chartArea.h;\r\n\t\t\tbox.height = box.bottom - box.top;\r\n\t\t\tx = box.right;\r\n\t\t}\r\n\t}\r\n\r\n\tchartArea.x = x;\r\n\tchartArea.y = y;\r\n}\r\n\r\ncore_defaults._set('global', {\r\n\tlayout: {\r\n\t\tpadding: {\r\n\t\t\ttop: 0,\r\n\t\t\tright: 0,\r\n\t\t\tbottom: 0,\r\n\t\t\tleft: 0\r\n\t\t}\r\n\t}\r\n});\r\n\r\n/**\r\n * @interface ILayoutItem\r\n * @prop {string} position - The position of the item in the chart layout. Possible values are\r\n * 'left', 'top', 'right', 'bottom', and 'chartArea'\r\n * @prop {number} weight - The weight used to sort the item. Higher weights are further away from the chart area\r\n * @prop {boolean} fullWidth - if true, and the item is horizontal, then push vertical boxes down\r\n * @prop {function} isHorizontal - returns true if the layout item is horizontal (ie. top or bottom)\r\n * @prop {function} update - Takes two parameters: width and height. Returns size of item\r\n * @prop {function} getPadding -  Returns an object with padding on the edges\r\n * @prop {number} width - Width of item. Must be valid after update()\r\n * @prop {number} height - Height of item. Must be valid after update()\r\n * @prop {number} left - Left edge of the item. Set by layout system and cannot be used in update\r\n * @prop {number} top - Top edge of the item. Set by layout system and cannot be used in update\r\n * @prop {number} right - Right edge of the item. Set by layout system and cannot be used in update\r\n * @prop {number} bottom - Bottom edge of the item. Set by layout system and cannot be used in update\r\n */\r\n\r\n// The layout service is very self explanatory.  It's responsible for the layout within a chart.\r\n// Scales, Legends and Plugins all rely on the layout service and can easily register to be placed anywhere they need\r\n// It is this service's responsibility of carrying out that layout.\r\nvar core_layouts = {\r\n\tdefaults: {},\r\n\r\n\t/**\r\n\t * Register a box to a chart.\r\n\t * A box is simply a reference to an object that requires layout. eg. Scales, Legend, Title.\r\n\t * @param {Chart} chart - the chart to use\r\n\t * @param {ILayoutItem} item - the item to add to be layed out\r\n\t */\r\n\taddBox: function(chart, item) {\r\n\t\tif (!chart.boxes) {\r\n\t\t\tchart.boxes = [];\r\n\t\t}\r\n\r\n\t\t// initialize item with default values\r\n\t\titem.fullWidth = item.fullWidth || false;\r\n\t\titem.position = item.position || 'top';\r\n\t\titem.weight = item.weight || 0;\r\n\t\titem._layers = item._layers || function() {\r\n\t\t\treturn [{\r\n\t\t\t\tz: 0,\r\n\t\t\t\tdraw: function() {\r\n\t\t\t\t\titem.draw.apply(item, arguments);\r\n\t\t\t\t}\r\n\t\t\t}];\r\n\t\t};\r\n\r\n\t\tchart.boxes.push(item);\r\n\t},\r\n\r\n\t/**\r\n\t * Remove a layoutItem from a chart\r\n\t * @param {Chart} chart - the chart to remove the box from\r\n\t * @param {ILayoutItem} layoutItem - the item to remove from the layout\r\n\t */\r\n\tremoveBox: function(chart, layoutItem) {\r\n\t\tvar index = chart.boxes ? chart.boxes.indexOf(layoutItem) : -1;\r\n\t\tif (index !== -1) {\r\n\t\t\tchart.boxes.splice(index, 1);\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Sets (or updates) options on the given `item`.\r\n\t * @param {Chart} chart - the chart in which the item lives (or will be added to)\r\n\t * @param {ILayoutItem} item - the item to configure with the given options\r\n\t * @param {object} options - the new item options.\r\n\t */\r\n\tconfigure: function(chart, item, options) {\r\n\t\tvar props = ['fullWidth', 'position', 'weight'];\r\n\t\tvar ilen = props.length;\r\n\t\tvar i = 0;\r\n\t\tvar prop;\r\n\r\n\t\tfor (; i < ilen; ++i) {\r\n\t\t\tprop = props[i];\r\n\t\t\tif (options.hasOwnProperty(prop)) {\r\n\t\t\t\titem[prop] = options[prop];\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Fits boxes of the given chart into the given size by having each box measure itself\r\n\t * then running a fitting algorithm\r\n\t * @param {Chart} chart - the chart\r\n\t * @param {number} width - the width to fit into\r\n\t * @param {number} height - the height to fit into\r\n\t */\r\n\tupdate: function(chart, width, height) {\r\n\t\tif (!chart) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tvar layoutOptions = chart.options.layout || {};\r\n\t\tvar padding = helpers$1.options.toPadding(layoutOptions.padding);\r\n\r\n\t\tvar availableWidth = width - padding.width;\r\n\t\tvar availableHeight = height - padding.height;\r\n\t\tvar boxes = buildLayoutBoxes(chart.boxes);\r\n\t\tvar verticalBoxes = boxes.vertical;\r\n\t\tvar horizontalBoxes = boxes.horizontal;\r\n\r\n\t\t// Essentially we now have any number of boxes on each of the 4 sides.\r\n\t\t// Our canvas looks like the following.\r\n\t\t// The areas L1 and L2 are the left axes. R1 is the right axis, T1 is the top axis and\r\n\t\t// B1 is the bottom axis\r\n\t\t// There are also 4 quadrant-like locations (left to right instead of clockwise) reserved for chart overlays\r\n\t\t// These locations are single-box locations only, when trying to register a chartArea location that is already taken,\r\n\t\t// an error will be thrown.\r\n\t\t//\r\n\t\t// |----------------------------------------------------|\r\n\t\t// |                  T1 (Full Width)                   |\r\n\t\t// |----------------------------------------------------|\r\n\t\t// |    |    |                 T2                  |    |\r\n\t\t// |    |----|-------------------------------------|----|\r\n\t\t// |    |    | C1 |                           | C2 |    |\r\n\t\t// |    |    |----|                           |----|    |\r\n\t\t// |    |    |                                     |    |\r\n\t\t// | L1 | L2 |           ChartArea (C0)            | R1 |\r\n\t\t// |    |    |                                     |    |\r\n\t\t// |    |    |----|                           |----|    |\r\n\t\t// |    |    | C3 |                           | C4 |    |\r\n\t\t// |    |----|-------------------------------------|----|\r\n\t\t// |    |    |                 B1                  |    |\r\n\t\t// |----------------------------------------------------|\r\n\t\t// |                  B2 (Full Width)                   |\r\n\t\t// |----------------------------------------------------|\r\n\t\t//\r\n\r\n\t\tvar params = Object.freeze({\r\n\t\t\touterWidth: width,\r\n\t\t\touterHeight: height,\r\n\t\t\tpadding: padding,\r\n\t\t\tavailableWidth: availableWidth,\r\n\t\t\tvBoxMaxWidth: availableWidth / 2 / verticalBoxes.length,\r\n\t\t\thBoxMaxHeight: availableHeight / 2\r\n\t\t});\r\n\t\tvar chartArea = extend({\r\n\t\t\tmaxPadding: extend({}, padding),\r\n\t\t\tw: availableWidth,\r\n\t\t\th: availableHeight,\r\n\t\t\tx: padding.left,\r\n\t\t\ty: padding.top\r\n\t\t}, padding);\r\n\r\n\t\tsetLayoutDims(verticalBoxes.concat(horizontalBoxes), params);\r\n\r\n\t\t// First fit vertical boxes\r\n\t\tfitBoxes(verticalBoxes, chartArea, params);\r\n\r\n\t\t// Then fit horizontal boxes\r\n\t\tif (fitBoxes(horizontalBoxes, chartArea, params)) {\r\n\t\t\t// if the area changed, re-fit vertical boxes\r\n\t\t\tfitBoxes(verticalBoxes, chartArea, params);\r\n\t\t}\r\n\r\n\t\thandleMaxPadding(chartArea);\r\n\r\n\t\t// Finally place the boxes to correct coordinates\r\n\t\tplaceBoxes(boxes.leftAndTop, chartArea, params);\r\n\r\n\t\t// Move to opposite side of chart\r\n\t\tchartArea.x += chartArea.w;\r\n\t\tchartArea.y += chartArea.h;\r\n\r\n\t\tplaceBoxes(boxes.rightAndBottom, chartArea, params);\r\n\r\n\t\tchart.chartArea = {\r\n\t\t\tleft: chartArea.left,\r\n\t\t\ttop: chartArea.top,\r\n\t\t\tright: chartArea.left + chartArea.w,\r\n\t\t\tbottom: chartArea.top + chartArea.h\r\n\t\t};\r\n\r\n\t\t// Finally update boxes in chartArea (radial scale for example)\r\n\t\thelpers$1.each(boxes.chartArea, function(layout) {\r\n\t\t\tvar box = layout.box;\r\n\t\t\textend(box, chart.chartArea);\r\n\t\t\tbox.update(chartArea.w, chartArea.h);\r\n\t\t});\r\n\t}\r\n};\n\n/**\r\n * Platform fallback implementation (minimal).\r\n * @see https://github.com/chartjs/Chart.js/pull/4591#issuecomment-319575939\r\n */\r\n\r\nvar platform_basic = {\r\n\tacquireContext: function(item) {\r\n\t\tif (item && item.canvas) {\r\n\t\t\t// Support for any object associated to a canvas (including a context2d)\r\n\t\t\titem = item.canvas;\r\n\t\t}\r\n\r\n\t\treturn item && item.getContext('2d') || null;\r\n\t}\r\n};\n\nvar platform_dom = \"/*\\r\\n * DOM element rendering detection\\r\\n * https://davidwalsh.name/detect-node-insertion\\r\\n */\\r\\n@keyframes chartjs-render-animation {\\r\\n\\tfrom { opacity: 0.99; }\\r\\n\\tto { opacity: 1; }\\r\\n}\\r\\n\\r\\n.chartjs-render-monitor {\\r\\n\\tanimation: chartjs-render-animation 0.001s;\\r\\n}\\r\\n\\r\\n/*\\r\\n * DOM element resizing detection\\r\\n * https://github.com/marcj/css-element-queries\\r\\n */\\r\\n.chartjs-size-monitor,\\r\\n.chartjs-size-monitor-expand,\\r\\n.chartjs-size-monitor-shrink {\\r\\n\\tposition: absolute;\\r\\n\\tdirection: ltr;\\r\\n\\tleft: 0;\\r\\n\\ttop: 0;\\r\\n\\tright: 0;\\r\\n\\tbottom: 0;\\r\\n\\toverflow: hidden;\\r\\n\\tpointer-events: none;\\r\\n\\tvisibility: hidden;\\r\\n\\tz-index: -1;\\r\\n}\\r\\n\\r\\n.chartjs-size-monitor-expand > div {\\r\\n\\tposition: absolute;\\r\\n\\twidth: 1000000px;\\r\\n\\theight: 1000000px;\\r\\n\\tleft: 0;\\r\\n\\ttop: 0;\\r\\n}\\r\\n\\r\\n.chartjs-size-monitor-shrink > div {\\r\\n\\tposition: absolute;\\r\\n\\twidth: 200%;\\r\\n\\theight: 200%;\\r\\n\\tleft: 0;\\r\\n\\ttop: 0;\\r\\n}\\r\\n\";\n\nvar platform_dom$1 = /*#__PURE__*/Object.freeze({\n__proto__: null,\n'default': platform_dom\n});\n\nvar stylesheet = getCjsExportFromNamespace(platform_dom$1);\n\nvar EXPANDO_KEY = '$chartjs';\r\nvar CSS_PREFIX = 'chartjs-';\r\nvar CSS_SIZE_MONITOR = CSS_PREFIX + 'size-monitor';\r\nvar CSS_RENDER_MONITOR = CSS_PREFIX + 'render-monitor';\r\nvar CSS_RENDER_ANIMATION = CSS_PREFIX + 'render-animation';\r\nvar ANIMATION_START_EVENTS = ['animationstart', 'webkitAnimationStart'];\r\n\r\n/**\r\n * DOM event types -> Chart.js event types.\r\n * Note: only events with different types are mapped.\r\n * @see https://developer.mozilla.org/en-US/docs/Web/Events\r\n */\r\nvar EVENT_TYPES = {\r\n\ttouchstart: 'mousedown',\r\n\ttouchmove: 'mousemove',\r\n\ttouchend: 'mouseup',\r\n\tpointerenter: 'mouseenter',\r\n\tpointerdown: 'mousedown',\r\n\tpointermove: 'mousemove',\r\n\tpointerup: 'mouseup',\r\n\tpointerleave: 'mouseout',\r\n\tpointerout: 'mouseout'\r\n};\r\n\r\n/**\r\n * The \"used\" size is the final value of a dimension property after all calculations have\r\n * been performed. This method uses the computed style of `element` but returns undefined\r\n * if the computed style is not expressed in pixels. That can happen in some cases where\r\n * `element` has a size relative to its parent and this last one is not yet displayed,\r\n * for example because of `display: none` on a parent node.\r\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/used_value\r\n * @returns {number} Size in pixels or undefined if unknown.\r\n */\r\nfunction readUsedSize(element, property) {\r\n\tvar value = helpers$1.getStyle(element, property);\r\n\tvar matches = value && value.match(/^(\\d+)(\\.\\d+)?px$/);\r\n\treturn matches ? Number(matches[1]) : undefined;\r\n}\r\n\r\n/**\r\n * Initializes the canvas style and render size without modifying the canvas display size,\r\n * since responsiveness is handled by the controller.resize() method. The config is used\r\n * to determine the aspect ratio to apply in case no explicit height has been specified.\r\n */\r\nfunction initCanvas(canvas, config) {\r\n\tvar style = canvas.style;\r\n\r\n\t// NOTE(SB) canvas.getAttribute('width') !== canvas.width: in the first case it\r\n\t// returns null or '' if no explicit value has been set to the canvas attribute.\r\n\tvar renderHeight = canvas.getAttribute('height');\r\n\tvar renderWidth = canvas.getAttribute('width');\r\n\r\n\t// Chart.js modifies some canvas values that we want to restore on destroy\r\n\tcanvas[EXPANDO_KEY] = {\r\n\t\tinitial: {\r\n\t\t\theight: renderHeight,\r\n\t\t\twidth: renderWidth,\r\n\t\t\tstyle: {\r\n\t\t\t\tdisplay: style.display,\r\n\t\t\t\theight: style.height,\r\n\t\t\t\twidth: style.width\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\t// Force canvas to display as block to avoid extra space caused by inline\r\n\t// elements, which would interfere with the responsive resize process.\r\n\t// https://github.com/chartjs/Chart.js/issues/2538\r\n\tstyle.display = style.display || 'block';\r\n\r\n\tif (renderWidth === null || renderWidth === '') {\r\n\t\tvar displayWidth = readUsedSize(canvas, 'width');\r\n\t\tif (displayWidth !== undefined) {\r\n\t\t\tcanvas.width = displayWidth;\r\n\t\t}\r\n\t}\r\n\r\n\tif (renderHeight === null || renderHeight === '') {\r\n\t\tif (canvas.style.height === '') {\r\n\t\t\t// If no explicit render height and style height, let's apply the aspect ratio,\r\n\t\t\t// which one can be specified by the user but also by charts as default option\r\n\t\t\t// (i.e. options.aspectRatio). If not specified, use canvas aspect ratio of 2.\r\n\t\t\tcanvas.height = canvas.width / (config.options.aspectRatio || 2);\r\n\t\t} else {\r\n\t\t\tvar displayHeight = readUsedSize(canvas, 'height');\r\n\t\t\tif (displayWidth !== undefined) {\r\n\t\t\t\tcanvas.height = displayHeight;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\treturn canvas;\r\n}\r\n\r\n/**\r\n * Detects support for options object argument in addEventListener.\r\n * https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Safely_detecting_option_support\r\n * @private\r\n */\r\nvar supportsEventListenerOptions = (function() {\r\n\tvar supports = false;\r\n\ttry {\r\n\t\tvar options = Object.defineProperty({}, 'passive', {\r\n\t\t\t// eslint-disable-next-line getter-return\r\n\t\t\tget: function() {\r\n\t\t\t\tsupports = true;\r\n\t\t\t}\r\n\t\t});\r\n\t\twindow.addEventListener('e', null, options);\r\n\t} catch (e) {\r\n\t\t// continue regardless of error\r\n\t}\r\n\treturn supports;\r\n}());\r\n\r\n// Default passive to true as expected by Chrome for 'touchstart' and 'touchend' events.\r\n// https://github.com/chartjs/Chart.js/issues/4287\r\nvar eventListenerOptions = supportsEventListenerOptions ? {passive: true} : false;\r\n\r\nfunction addListener(node, type, listener) {\r\n\tnode.addEventListener(type, listener, eventListenerOptions);\r\n}\r\n\r\nfunction removeListener(node, type, listener) {\r\n\tnode.removeEventListener(type, listener, eventListenerOptions);\r\n}\r\n\r\nfunction createEvent(type, chart, x, y, nativeEvent) {\r\n\treturn {\r\n\t\ttype: type,\r\n\t\tchart: chart,\r\n\t\tnative: nativeEvent || null,\r\n\t\tx: x !== undefined ? x : null,\r\n\t\ty: y !== undefined ? y : null,\r\n\t};\r\n}\r\n\r\nfunction fromNativeEvent(event, chart) {\r\n\tvar type = EVENT_TYPES[event.type] || event.type;\r\n\tvar pos = helpers$1.getRelativePosition(event, chart);\r\n\treturn createEvent(type, chart, pos.x, pos.y, event);\r\n}\r\n\r\nfunction throttled(fn, thisArg) {\r\n\tvar ticking = false;\r\n\tvar args = [];\r\n\r\n\treturn function() {\r\n\t\targs = Array.prototype.slice.call(arguments);\r\n\t\tthisArg = thisArg || this;\r\n\r\n\t\tif (!ticking) {\r\n\t\t\tticking = true;\r\n\t\t\thelpers$1.requestAnimFrame.call(window, function() {\r\n\t\t\t\tticking = false;\r\n\t\t\t\tfn.apply(thisArg, args);\r\n\t\t\t});\r\n\t\t}\r\n\t};\r\n}\r\n\r\nfunction createDiv(cls) {\r\n\tvar el = document.createElement('div');\r\n\tel.className = cls || '';\r\n\treturn el;\r\n}\r\n\r\n// Implementation based on https://github.com/marcj/css-element-queries\r\nfunction createResizer(handler) {\r\n\tvar maxSize = 1000000;\r\n\r\n\t// NOTE(SB) Don't use innerHTML because it could be considered unsafe.\r\n\t// https://github.com/chartjs/Chart.js/issues/5902\r\n\tvar resizer = createDiv(CSS_SIZE_MONITOR);\r\n\tvar expand = createDiv(CSS_SIZE_MONITOR + '-expand');\r\n\tvar shrink = createDiv(CSS_SIZE_MONITOR + '-shrink');\r\n\r\n\texpand.appendChild(createDiv());\r\n\tshrink.appendChild(createDiv());\r\n\r\n\tresizer.appendChild(expand);\r\n\tresizer.appendChild(shrink);\r\n\tresizer._reset = function() {\r\n\t\texpand.scrollLeft = maxSize;\r\n\t\texpand.scrollTop = maxSize;\r\n\t\tshrink.scrollLeft = maxSize;\r\n\t\tshrink.scrollTop = maxSize;\r\n\t};\r\n\r\n\tvar onScroll = function() {\r\n\t\tresizer._reset();\r\n\t\thandler();\r\n\t};\r\n\r\n\taddListener(expand, 'scroll', onScroll.bind(expand, 'expand'));\r\n\taddListener(shrink, 'scroll', onScroll.bind(shrink, 'shrink'));\r\n\r\n\treturn resizer;\r\n}\r\n\r\n// https://davidwalsh.name/detect-node-insertion\r\nfunction watchForRender(node, handler) {\r\n\tvar expando = node[EXPANDO_KEY] || (node[EXPANDO_KEY] = {});\r\n\tvar proxy = expando.renderProxy = function(e) {\r\n\t\tif (e.animationName === CSS_RENDER_ANIMATION) {\r\n\t\t\thandler();\r\n\t\t}\r\n\t};\r\n\r\n\thelpers$1.each(ANIMATION_START_EVENTS, function(type) {\r\n\t\taddListener(node, type, proxy);\r\n\t});\r\n\r\n\t// #4737: Chrome might skip the CSS animation when the CSS_RENDER_MONITOR class\r\n\t// is removed then added back immediately (same animation frame?). Accessing the\r\n\t// `offsetParent` property will force a reflow and re-evaluate the CSS animation.\r\n\t// https://gist.github.com/paulirish/5d52fb081b3570c81e3a#box-metrics\r\n\t// https://github.com/chartjs/Chart.js/issues/4737\r\n\texpando.reflow = !!node.offsetParent;\r\n\r\n\tnode.classList.add(CSS_RENDER_MONITOR);\r\n}\r\n\r\nfunction unwatchForRender(node) {\r\n\tvar expando = node[EXPANDO_KEY] || {};\r\n\tvar proxy = expando.renderProxy;\r\n\r\n\tif (proxy) {\r\n\t\thelpers$1.each(ANIMATION_START_EVENTS, function(type) {\r\n\t\t\tremoveListener(node, type, proxy);\r\n\t\t});\r\n\r\n\t\tdelete expando.renderProxy;\r\n\t}\r\n\r\n\tnode.classList.remove(CSS_RENDER_MONITOR);\r\n}\r\n\r\nfunction addResizeListener(node, listener, chart) {\r\n\tvar expando = node[EXPANDO_KEY] || (node[EXPANDO_KEY] = {});\r\n\r\n\t// Let's keep track of this added resizer and thus avoid DOM query when removing it.\r\n\tvar resizer = expando.resizer = createResizer(throttled(function() {\r\n\t\tif (expando.resizer) {\r\n\t\t\tvar container = chart.options.maintainAspectRatio && node.parentNode;\r\n\t\t\tvar w = container ? container.clientWidth : 0;\r\n\t\t\tlistener(createEvent('resize', chart));\r\n\t\t\tif (container && container.clientWidth < w && chart.canvas) {\r\n\t\t\t\t// If the container size shrank during chart resize, let's assume\r\n\t\t\t\t// scrollbar appeared. So we resize again with the scrollbar visible -\r\n\t\t\t\t// effectively making chart smaller and the scrollbar hidden again.\r\n\t\t\t\t// Because we are inside `throttled`, and currently `ticking`, scroll\r\n\t\t\t\t// events are ignored during this whole 2 resize process.\r\n\t\t\t\t// If we assumed wrong and something else happened, we are resizing\r\n\t\t\t\t// twice in a frame (potential performance issue)\r\n\t\t\t\tlistener(createEvent('resize', chart));\r\n\t\t\t}\r\n\t\t}\r\n\t}));\r\n\r\n\t// The resizer needs to be attached to the node parent, so we first need to be\r\n\t// sure that `node` is attached to the DOM before injecting the resizer element.\r\n\twatchForRender(node, function() {\r\n\t\tif (expando.resizer) {\r\n\t\t\tvar container = node.parentNode;\r\n\t\t\tif (container && container !== resizer.parentNode) {\r\n\t\t\t\tcontainer.insertBefore(resizer, container.firstChild);\r\n\t\t\t}\r\n\r\n\t\t\t// The container size might have changed, let's reset the resizer state.\r\n\t\t\tresizer._reset();\r\n\t\t}\r\n\t});\r\n}\r\n\r\nfunction removeResizeListener(node) {\r\n\tvar expando = node[EXPANDO_KEY] || {};\r\n\tvar resizer = expando.resizer;\r\n\r\n\tdelete expando.resizer;\r\n\tunwatchForRender(node);\r\n\r\n\tif (resizer && resizer.parentNode) {\r\n\t\tresizer.parentNode.removeChild(resizer);\r\n\t}\r\n}\r\n\r\n/**\r\n * Injects CSS styles inline if the styles are not already present.\r\n * @param {HTMLDocument|ShadowRoot} rootNode - the node to contain the <style>.\r\n * @param {string} css - the CSS to be injected.\r\n */\r\nfunction injectCSS(rootNode, css) {\r\n\t// https://stackoverflow.com/q/3922139\r\n\tvar expando = rootNode[EXPANDO_KEY] || (rootNode[EXPANDO_KEY] = {});\r\n\tif (!expando.containsStyles) {\r\n\t\texpando.containsStyles = true;\r\n\t\tcss = '/* Chart.js */\\n' + css;\r\n\t\tvar style = document.createElement('style');\r\n\t\tstyle.setAttribute('type', 'text/css');\r\n\t\tstyle.appendChild(document.createTextNode(css));\r\n\t\trootNode.appendChild(style);\r\n\t}\r\n}\r\n\r\nvar platform_dom$2 = {\r\n\t/**\r\n\t * When `true`, prevents the automatic injection of the stylesheet required to\r\n\t * correctly detect when the chart is added to the DOM and then resized. This\r\n\t * switch has been added to allow external stylesheet (`dist/Chart(.min)?.js`)\r\n\t * to be manually imported to make this library compatible with any CSP.\r\n\t * See https://github.com/chartjs/Chart.js/issues/5208\r\n\t */\r\n\tdisableCSSInjection: false,\r\n\r\n\t/**\r\n\t * This property holds whether this platform is enabled for the current environment.\r\n\t * Currently used by platform.js to select the proper implementation.\r\n\t * @private\r\n\t */\r\n\t_enabled: typeof window !== 'undefined' && typeof document !== 'undefined',\r\n\r\n\t/**\r\n\t * Initializes resources that depend on platform options.\r\n\t * @param {HTMLCanvasElement} canvas - The Canvas element.\r\n\t * @private\r\n\t */\r\n\t_ensureLoaded: function(canvas) {\r\n\t\tif (!this.disableCSSInjection) {\r\n\t\t\t// If the canvas is in a shadow DOM, then the styles must also be inserted\r\n\t\t\t// into the same shadow DOM.\r\n\t\t\t// https://github.com/chartjs/Chart.js/issues/5763\r\n\t\t\tvar root = canvas.getRootNode ? canvas.getRootNode() : document;\r\n\t\t\tvar targetNode = root.host ? root : document.head;\r\n\t\t\tinjectCSS(targetNode, stylesheet);\r\n\t\t}\r\n\t},\r\n\r\n\tacquireContext: function(item, config) {\r\n\t\tif (typeof item === 'string') {\r\n\t\t\titem = document.getElementById(item);\r\n\t\t} else if (item.length) {\r\n\t\t\t// Support for array based queries (such as jQuery)\r\n\t\t\titem = item[0];\r\n\t\t}\r\n\r\n\t\tif (item && item.canvas) {\r\n\t\t\t// Support for any object associated to a canvas (including a context2d)\r\n\t\t\titem = item.canvas;\r\n\t\t}\r\n\r\n\t\t// To prevent canvas fingerprinting, some add-ons undefine the getContext\r\n\t\t// method, for example: https://github.com/kkapsner/CanvasBlocker\r\n\t\t// https://github.com/chartjs/Chart.js/issues/2807\r\n\t\tvar context = item && item.getContext && item.getContext('2d');\r\n\r\n\t\t// `instanceof HTMLCanvasElement/CanvasRenderingContext2D` fails when the item is\r\n\t\t// inside an iframe or when running in a protected environment. We could guess the\r\n\t\t// types from their toString() value but let's keep things flexible and assume it's\r\n\t\t// a sufficient condition if the item has a context2D which has item as `canvas`.\r\n\t\t// https://github.com/chartjs/Chart.js/issues/3887\r\n\t\t// https://github.com/chartjs/Chart.js/issues/4102\r\n\t\t// https://github.com/chartjs/Chart.js/issues/4152\r\n\t\tif (context && context.canvas === item) {\r\n\t\t\t// Load platform resources on first chart creation, to make it possible to\r\n\t\t\t// import the library before setting platform options.\r\n\t\t\tthis._ensureLoaded(item);\r\n\t\t\tinitCanvas(item, config);\r\n\t\t\treturn context;\r\n\t\t}\r\n\r\n\t\treturn null;\r\n\t},\r\n\r\n\treleaseContext: function(context) {\r\n\t\tvar canvas = context.canvas;\r\n\t\tif (!canvas[EXPANDO_KEY]) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tvar initial = canvas[EXPANDO_KEY].initial;\r\n\t\t['height', 'width'].forEach(function(prop) {\r\n\t\t\tvar value = initial[prop];\r\n\t\t\tif (helpers$1.isNullOrUndef(value)) {\r\n\t\t\t\tcanvas.removeAttribute(prop);\r\n\t\t\t} else {\r\n\t\t\t\tcanvas.setAttribute(prop, value);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\thelpers$1.each(initial.style || {}, function(value, key) {\r\n\t\t\tcanvas.style[key] = value;\r\n\t\t});\r\n\r\n\t\t// The canvas render size might have been changed (and thus the state stack discarded),\r\n\t\t// we can't use save() and restore() to restore the initial state. So make sure that at\r\n\t\t// least the canvas context is reset to the default state by setting the canvas width.\r\n\t\t// https://www.w3.org/TR/2011/WD-html5-20110525/the-canvas-element.html\r\n\t\t// eslint-disable-next-line no-self-assign\r\n\t\tcanvas.width = canvas.width;\r\n\r\n\t\tdelete canvas[EXPANDO_KEY];\r\n\t},\r\n\r\n\taddEventListener: function(chart, type, listener) {\r\n\t\tvar canvas = chart.canvas;\r\n\t\tif (type === 'resize') {\r\n\t\t\t// Note: the resize event is not supported on all browsers.\r\n\t\t\taddResizeListener(canvas, listener, chart);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tvar expando = listener[EXPANDO_KEY] || (listener[EXPANDO_KEY] = {});\r\n\t\tvar proxies = expando.proxies || (expando.proxies = {});\r\n\t\tvar proxy = proxies[chart.id + '_' + type] = function(event) {\r\n\t\t\tlistener(fromNativeEvent(event, chart));\r\n\t\t};\r\n\r\n\t\taddListener(canvas, type, proxy);\r\n\t},\r\n\r\n\tremoveEventListener: function(chart, type, listener) {\r\n\t\tvar canvas = chart.canvas;\r\n\t\tif (type === 'resize') {\r\n\t\t\t// Note: the resize event is not supported on all browsers.\r\n\t\t\tremoveResizeListener(canvas);\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tvar expando = listener[EXPANDO_KEY] || {};\r\n\t\tvar proxies = expando.proxies || {};\r\n\t\tvar proxy = proxies[chart.id + '_' + type];\r\n\t\tif (!proxy) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tremoveListener(canvas, type, proxy);\r\n\t}\r\n};\r\n\r\n// DEPRECATIONS\r\n\r\n/**\r\n * Provided for backward compatibility, use EventTarget.addEventListener instead.\r\n * EventTarget.addEventListener compatibility: Chrome, Opera 7, Safari, FF1.5+, IE9+\r\n * @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener\r\n * @function Chart.helpers.addEvent\r\n * @deprecated since version 2.7.0\r\n * @todo remove at version 3\r\n * @private\r\n */\r\nhelpers$1.addEvent = addListener;\r\n\r\n/**\r\n * Provided for backward compatibility, use EventTarget.removeEventListener instead.\r\n * EventTarget.removeEventListener compatibility: Chrome, Opera 7, Safari, FF1.5+, IE9+\r\n * @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/removeEventListener\r\n * @function Chart.helpers.removeEvent\r\n * @deprecated since version 2.7.0\r\n * @todo remove at version 3\r\n * @private\r\n */\r\nhelpers$1.removeEvent = removeListener;\n\n// @TODO Make possible to select another platform at build time.\r\nvar implementation = platform_dom$2._enabled ? platform_dom$2 : platform_basic;\r\n\r\n/**\r\n * @namespace Chart.platform\r\n * @see https://chartjs.gitbooks.io/proposals/content/Platform.html\r\n * @since 2.4.0\r\n */\r\nvar platform = helpers$1.extend({\r\n\t/**\r\n\t * @since 2.7.0\r\n\t */\r\n\tinitialize: function() {},\r\n\r\n\t/**\r\n\t * Called at chart construction time, returns a context2d instance implementing\r\n\t * the [W3C Canvas 2D Context API standard]{@link https://www.w3.org/TR/2dcontext/}.\r\n\t * @param {*} item - The native item from which to acquire context (platform specific)\r\n\t * @param {object} options - The chart options\r\n\t * @returns {CanvasRenderingContext2D} context2d instance\r\n\t */\r\n\tacquireContext: function() {},\r\n\r\n\t/**\r\n\t * Called at chart destruction time, releases any resources associated to the context\r\n\t * previously returned by the acquireContext() method.\r\n\t * @param {CanvasRenderingContext2D} context - The context2d instance\r\n\t * @returns {boolean} true if the method succeeded, else false\r\n\t */\r\n\treleaseContext: function() {},\r\n\r\n\t/**\r\n\t * Registers the specified listener on the given chart.\r\n\t * @param {Chart} chart - Chart from which to listen for event\r\n\t * @param {string} type - The ({@link IEvent}) type to listen for\r\n\t * @param {function} listener - Receives a notification (an object that implements\r\n\t * the {@link IEvent} interface) when an event of the specified type occurs.\r\n\t */\r\n\taddEventListener: function() {},\r\n\r\n\t/**\r\n\t * Removes the specified listener previously registered with addEventListener.\r\n\t * @param {Chart} chart - Chart from which to remove the listener\r\n\t * @param {string} type - The ({@link IEvent}) type to remove\r\n\t * @param {function} listener - The listener function to remove from the event target.\r\n\t */\r\n\tremoveEventListener: function() {}\r\n\r\n}, implementation);\n\ncore_defaults._set('global', {\r\n\tplugins: {}\r\n});\r\n\r\n/**\r\n * The plugin service singleton\r\n * @namespace Chart.plugins\r\n * @since 2.1.0\r\n */\r\nvar core_plugins = {\r\n\t/**\r\n\t * Globally registered plugins.\r\n\t * @private\r\n\t */\r\n\t_plugins: [],\r\n\r\n\t/**\r\n\t * This identifier is used to invalidate the descriptors cache attached to each chart\r\n\t * when a global plugin is registered or unregistered. In this case, the cache ID is\r\n\t * incremented and descriptors are regenerated during following API calls.\r\n\t * @private\r\n\t */\r\n\t_cacheId: 0,\r\n\r\n\t/**\r\n\t * Registers the given plugin(s) if not already registered.\r\n\t * @param {IPlugin[]|IPlugin} plugins plugin instance(s).\r\n\t */\r\n\tregister: function(plugins) {\r\n\t\tvar p = this._plugins;\r\n\t\t([]).concat(plugins).forEach(function(plugin) {\r\n\t\t\tif (p.indexOf(plugin) === -1) {\r\n\t\t\t\tp.push(plugin);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tthis._cacheId++;\r\n\t},\r\n\r\n\t/**\r\n\t * Unregisters the given plugin(s) only if registered.\r\n\t * @param {IPlugin[]|IPlugin} plugins plugin instance(s).\r\n\t */\r\n\tunregister: function(plugins) {\r\n\t\tvar p = this._plugins;\r\n\t\t([]).concat(plugins).forEach(function(plugin) {\r\n\t\t\tvar idx = p.indexOf(plugin);\r\n\t\t\tif (idx !== -1) {\r\n\t\t\t\tp.splice(idx, 1);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tthis._cacheId++;\r\n\t},\r\n\r\n\t/**\r\n\t * Remove all registered plugins.\r\n\t * @since 2.1.5\r\n\t */\r\n\tclear: function() {\r\n\t\tthis._plugins = [];\r\n\t\tthis._cacheId++;\r\n\t},\r\n\r\n\t/**\r\n\t * Returns the number of registered plugins?\r\n\t * @returns {number}\r\n\t * @since 2.1.5\r\n\t */\r\n\tcount: function() {\r\n\t\treturn this._plugins.length;\r\n\t},\r\n\r\n\t/**\r\n\t * Returns all registered plugin instances.\r\n\t * @returns {IPlugin[]} array of plugin objects.\r\n\t * @since 2.1.5\r\n\t */\r\n\tgetAll: function() {\r\n\t\treturn this._plugins;\r\n\t},\r\n\r\n\t/**\r\n\t * Calls enabled plugins for `chart` on the specified hook and with the given args.\r\n\t * This method immediately returns as soon as a plugin explicitly returns false. The\r\n\t * returned value can be used, for instance, to interrupt the current action.\r\n\t * @param {Chart} chart - The chart instance for which plugins should be called.\r\n\t * @param {string} hook - The name of the plugin method to call (e.g. 'beforeUpdate').\r\n\t * @param {Array} [args] - Extra arguments to apply to the hook call.\r\n\t * @returns {boolean} false if any of the plugins return false, else returns true.\r\n\t */\r\n\tnotify: function(chart, hook, args) {\r\n\t\tvar descriptors = this.descriptors(chart);\r\n\t\tvar ilen = descriptors.length;\r\n\t\tvar i, descriptor, plugin, params, method;\r\n\r\n\t\tfor (i = 0; i < ilen; ++i) {\r\n\t\t\tdescriptor = descriptors[i];\r\n\t\t\tplugin = descriptor.plugin;\r\n\t\t\tmethod = plugin[hook];\r\n\t\t\tif (typeof method === 'function') {\r\n\t\t\t\tparams = [chart].concat(args || []);\r\n\t\t\t\tparams.push(descriptor.options);\r\n\t\t\t\tif (method.apply(plugin, params) === false) {\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn true;\r\n\t},\r\n\r\n\t/**\r\n\t * Returns descriptors of enabled plugins for the given chart.\r\n\t * @returns {object[]} [{ plugin, options }]\r\n\t * @private\r\n\t */\r\n\tdescriptors: function(chart) {\r\n\t\tvar cache = chart.$plugins || (chart.$plugins = {});\r\n\t\tif (cache.id === this._cacheId) {\r\n\t\t\treturn cache.descriptors;\r\n\t\t}\r\n\r\n\t\tvar plugins = [];\r\n\t\tvar descriptors = [];\r\n\t\tvar config = (chart && chart.config) || {};\r\n\t\tvar options = (config.options && config.options.plugins) || {};\r\n\r\n\t\tthis._plugins.concat(config.plugins || []).forEach(function(plugin) {\r\n\t\t\tvar idx = plugins.indexOf(plugin);\r\n\t\t\tif (idx !== -1) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tvar id = plugin.id;\r\n\t\t\tvar opts = options[id];\r\n\t\t\tif (opts === false) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\tif (opts === true) {\r\n\t\t\t\topts = helpers$1.clone(core_defaults.global.plugins[id]);\r\n\t\t\t}\r\n\r\n\t\t\tplugins.push(plugin);\r\n\t\t\tdescriptors.push({\r\n\t\t\t\tplugin: plugin,\r\n\t\t\t\toptions: opts || {}\r\n\t\t\t});\r\n\t\t});\r\n\r\n\t\tcache.descriptors = descriptors;\r\n\t\tcache.id = this._cacheId;\r\n\t\treturn descriptors;\r\n\t},\r\n\r\n\t/**\r\n\t * Invalidates cache for the given chart: descriptors hold a reference on plugin option,\r\n\t * but in some cases, this reference can be changed by the user when updating options.\r\n\t * https://github.com/chartjs/Chart.js/issues/5111#issuecomment-355934167\r\n\t * @private\r\n\t */\r\n\t_invalidate: function(chart) {\r\n\t\tdelete chart.$plugins;\r\n\t}\r\n};\n\nvar core_scaleService = {\r\n\t// Scale registration object. Extensions can register new scale types (such as log or DB scales) and then\r\n\t// use the new chart options to grab the correct scale\r\n\tconstructors: {},\r\n\t// Use a registration function so that we can move to an ES6 map when we no longer need to support\r\n\t// old browsers\r\n\r\n\t// Scale config defaults\r\n\tdefaults: {},\r\n\tregisterScaleType: function(type, scaleConstructor, scaleDefaults) {\r\n\t\tthis.constructors[type] = scaleConstructor;\r\n\t\tthis.defaults[type] = helpers$1.clone(scaleDefaults);\r\n\t},\r\n\tgetScaleConstructor: function(type) {\r\n\t\treturn this.constructors.hasOwnProperty(type) ? this.constructors[type] : undefined;\r\n\t},\r\n\tgetScaleDefaults: function(type) {\r\n\t\t// Return the scale defaults merged with the global settings so that we always use the latest ones\r\n\t\treturn this.defaults.hasOwnProperty(type) ? helpers$1.merge(Object.create(null), [core_defaults.scale, this.defaults[type]]) : {};\r\n\t},\r\n\tupdateScaleDefaults: function(type, additions) {\r\n\t\tvar me = this;\r\n\t\tif (me.defaults.hasOwnProperty(type)) {\r\n\t\t\tme.defaults[type] = helpers$1.extend(me.defaults[type], additions);\r\n\t\t}\r\n\t},\r\n\taddScalesToLayout: function(chart) {\r\n\t\t// Adds each scale to the chart.boxes array to be sized accordingly\r\n\t\thelpers$1.each(chart.scales, function(scale) {\r\n\t\t\t// Set ILayoutItem parameters for backwards compatibility\r\n\t\t\tscale.fullWidth = scale.options.fullWidth;\r\n\t\t\tscale.position = scale.options.position;\r\n\t\t\tscale.weight = scale.options.weight;\r\n\t\t\tcore_layouts.addBox(chart, scale);\r\n\t\t});\r\n\t}\r\n};\n\nvar valueOrDefault$8 = helpers$1.valueOrDefault;\r\nvar getRtlHelper = helpers$1.rtl.getRtlAdapter;\r\n\r\ncore_defaults._set('global', {\r\n\ttooltips: {\r\n\t\tenabled: true,\r\n\t\tcustom: null,\r\n\t\tmode: 'nearest',\r\n\t\tposition: 'average',\r\n\t\tintersect: true,\r\n\t\tbackgroundColor: 'rgba(0,0,0,0.8)',\r\n\t\ttitleFontStyle: 'bold',\r\n\t\ttitleSpacing: 2,\r\n\t\ttitleMarginBottom: 6,\r\n\t\ttitleFontColor: '#fff',\r\n\t\ttitleAlign: 'left',\r\n\t\tbodySpacing: 2,\r\n\t\tbodyFontColor: '#fff',\r\n\t\tbodyAlign: 'left',\r\n\t\tfooterFontStyle: 'bold',\r\n\t\tfooterSpacing: 2,\r\n\t\tfooterMarginTop: 6,\r\n\t\tfooterFontColor: '#fff',\r\n\t\tfooterAlign: 'left',\r\n\t\tyPadding: 6,\r\n\t\txPadding: 6,\r\n\t\tcaretPadding: 2,\r\n\t\tcaretSize: 5,\r\n\t\tcornerRadius: 6,\r\n\t\tmultiKeyBackground: '#fff',\r\n\t\tdisplayColors: true,\r\n\t\tborderColor: 'rgba(0,0,0,0)',\r\n\t\tborderWidth: 0,\r\n\t\tcallbacks: {\r\n\t\t\t// Args are: (tooltipItems, data)\r\n\t\t\tbeforeTitle: helpers$1.noop,\r\n\t\t\ttitle: function(tooltipItems, data) {\r\n\t\t\t\tvar title = '';\r\n\t\t\t\tvar labels = data.labels;\r\n\t\t\t\tvar labelCount = labels ? labels.length : 0;\r\n\r\n\t\t\t\tif (tooltipItems.length > 0) {\r\n\t\t\t\t\tvar item = tooltipItems[0];\r\n\t\t\t\t\tif (item.label) {\r\n\t\t\t\t\t\ttitle = item.label;\r\n\t\t\t\t\t} else if (item.xLabel) {\r\n\t\t\t\t\t\ttitle = item.xLabel;\r\n\t\t\t\t\t} else if (labelCount > 0 && item.index < labelCount) {\r\n\t\t\t\t\t\ttitle = labels[item.index];\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn title;\r\n\t\t\t},\r\n\t\t\tafterTitle: helpers$1.noop,\r\n\r\n\t\t\t// Args are: (tooltipItems, data)\r\n\t\t\tbeforeBody: helpers$1.noop,\r\n\r\n\t\t\t// Args are: (tooltipItem, data)\r\n\t\t\tbeforeLabel: helpers$1.noop,\r\n\t\t\tlabel: function(tooltipItem, data) {\r\n\t\t\t\tvar label = data.datasets[tooltipItem.datasetIndex].label || '';\r\n\r\n\t\t\t\tif (label) {\r\n\t\t\t\t\tlabel += ': ';\r\n\t\t\t\t}\r\n\t\t\t\tif (!helpers$1.isNullOrUndef(tooltipItem.value)) {\r\n\t\t\t\t\tlabel += tooltipItem.value;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tlabel += tooltipItem.yLabel;\r\n\t\t\t\t}\r\n\t\t\t\treturn label;\r\n\t\t\t},\r\n\t\t\tlabelColor: function(tooltipItem, chart) {\r\n\t\t\t\tvar meta = chart.getDatasetMeta(tooltipItem.datasetIndex);\r\n\t\t\t\tvar activeElement = meta.data[tooltipItem.index];\r\n\t\t\t\tvar view = activeElement._view;\r\n\t\t\t\treturn {\r\n\t\t\t\t\tborderColor: view.borderColor,\r\n\t\t\t\t\tbackgroundColor: view.backgroundColor\r\n\t\t\t\t};\r\n\t\t\t},\r\n\t\t\tlabelTextColor: function() {\r\n\t\t\t\treturn this._options.bodyFontColor;\r\n\t\t\t},\r\n\t\t\tafterLabel: helpers$1.noop,\r\n\r\n\t\t\t// Args are: (tooltipItems, data)\r\n\t\t\tafterBody: helpers$1.noop,\r\n\r\n\t\t\t// Args are: (tooltipItems, data)\r\n\t\t\tbeforeFooter: helpers$1.noop,\r\n\t\t\tfooter: helpers$1.noop,\r\n\t\t\tafterFooter: helpers$1.noop\r\n\t\t}\r\n\t}\r\n});\r\n\r\nvar positioners = {\r\n\t/**\r\n\t * Average mode places the tooltip at the average position of the elements shown\r\n\t * @function Chart.Tooltip.positioners.average\r\n\t * @param elements {ChartElement[]} the elements being displayed in the tooltip\r\n\t * @returns {object} tooltip position\r\n\t */\r\n\taverage: function(elements) {\r\n\t\tif (!elements.length) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tvar i, len;\r\n\t\tvar x = 0;\r\n\t\tvar y = 0;\r\n\t\tvar count = 0;\r\n\r\n\t\tfor (i = 0, len = elements.length; i < len; ++i) {\r\n\t\t\tvar el = elements[i];\r\n\t\t\tif (el && el.hasValue()) {\r\n\t\t\t\tvar pos = el.tooltipPosition();\r\n\t\t\t\tx += pos.x;\r\n\t\t\t\ty += pos.y;\r\n\t\t\t\t++count;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\tx: x / count,\r\n\t\t\ty: y / count\r\n\t\t};\r\n\t},\r\n\r\n\t/**\r\n\t * Gets the tooltip position nearest of the item nearest to the event position\r\n\t * @function Chart.Tooltip.positioners.nearest\r\n\t * @param elements {Chart.Element[]} the tooltip elements\r\n\t * @param eventPosition {object} the position of the event in canvas coordinates\r\n\t * @returns {object} the tooltip position\r\n\t */\r\n\tnearest: function(elements, eventPosition) {\r\n\t\tvar x = eventPosition.x;\r\n\t\tvar y = eventPosition.y;\r\n\t\tvar minDistance = Number.POSITIVE_INFINITY;\r\n\t\tvar i, len, nearestElement;\r\n\r\n\t\tfor (i = 0, len = elements.length; i < len; ++i) {\r\n\t\t\tvar el = elements[i];\r\n\t\t\tif (el && el.hasValue()) {\r\n\t\t\t\tvar center = el.getCenterPoint();\r\n\t\t\t\tvar d = helpers$1.distanceBetweenPoints(eventPosition, center);\r\n\r\n\t\t\t\tif (d < minDistance) {\r\n\t\t\t\t\tminDistance = d;\r\n\t\t\t\t\tnearestElement = el;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (nearestElement) {\r\n\t\t\tvar tp = nearestElement.tooltipPosition();\r\n\t\t\tx = tp.x;\r\n\t\t\ty = tp.y;\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\tx: x,\r\n\t\t\ty: y\r\n\t\t};\r\n\t}\r\n};\r\n\r\n// Helper to push or concat based on if the 2nd parameter is an array or not\r\nfunction pushOrConcat(base, toPush) {\r\n\tif (toPush) {\r\n\t\tif (helpers$1.isArray(toPush)) {\r\n\t\t\t// base = base.concat(toPush);\r\n\t\t\tArray.prototype.push.apply(base, toPush);\r\n\t\t} else {\r\n\t\t\tbase.push(toPush);\r\n\t\t}\r\n\t}\r\n\r\n\treturn base;\r\n}\r\n\r\n/**\r\n * Returns array of strings split by newline\r\n * @param {string} value - The value to split by newline.\r\n * @returns {string[]} value if newline present - Returned from String split() method\r\n * @function\r\n */\r\nfunction splitNewlines(str) {\r\n\tif ((typeof str === 'string' || str instanceof String) && str.indexOf('\\n') > -1) {\r\n\t\treturn str.split('\\n');\r\n\t}\r\n\treturn str;\r\n}\r\n\r\n\r\n/**\r\n * Private helper to create a tooltip item model\r\n * @param element - the chart element (point, arc, bar) to create the tooltip item for\r\n * @return new tooltip item\r\n */\r\nfunction createTooltipItem(element) {\r\n\tvar xScale = element._xScale;\r\n\tvar yScale = element._yScale || element._scale; // handle radar || polarArea charts\r\n\tvar index = element._index;\r\n\tvar datasetIndex = element._datasetIndex;\r\n\tvar controller = element._chart.getDatasetMeta(datasetIndex).controller;\r\n\tvar indexScale = controller._getIndexScale();\r\n\tvar valueScale = controller._getValueScale();\r\n\r\n\treturn {\r\n\t\txLabel: xScale ? xScale.getLabelForIndex(index, datasetIndex) : '',\r\n\t\tyLabel: yScale ? yScale.getLabelForIndex(index, datasetIndex) : '',\r\n\t\tlabel: indexScale ? '' + indexScale.getLabelForIndex(index, datasetIndex) : '',\r\n\t\tvalue: valueScale ? '' + valueScale.getLabelForIndex(index, datasetIndex) : '',\r\n\t\tindex: index,\r\n\t\tdatasetIndex: datasetIndex,\r\n\t\tx: element._model.x,\r\n\t\ty: element._model.y\r\n\t};\r\n}\r\n\r\n/**\r\n * Helper to get the reset model for the tooltip\r\n * @param tooltipOpts {object} the tooltip options\r\n */\r\nfunction getBaseModel(tooltipOpts) {\r\n\tvar globalDefaults = core_defaults.global;\r\n\r\n\treturn {\r\n\t\t// Positioning\r\n\t\txPadding: tooltipOpts.xPadding,\r\n\t\tyPadding: tooltipOpts.yPadding,\r\n\t\txAlign: tooltipOpts.xAlign,\r\n\t\tyAlign: tooltipOpts.yAlign,\r\n\r\n\t\t// Drawing direction and text direction\r\n\t\trtl: tooltipOpts.rtl,\r\n\t\ttextDirection: tooltipOpts.textDirection,\r\n\r\n\t\t// Body\r\n\t\tbodyFontColor: tooltipOpts.bodyFontColor,\r\n\t\t_bodyFontFamily: valueOrDefault$8(tooltipOpts.bodyFontFamily, globalDefaults.defaultFontFamily),\r\n\t\t_bodyFontStyle: valueOrDefault$8(tooltipOpts.bodyFontStyle, globalDefaults.defaultFontStyle),\r\n\t\t_bodyAlign: tooltipOpts.bodyAlign,\r\n\t\tbodyFontSize: valueOrDefault$8(tooltipOpts.bodyFontSize, globalDefaults.defaultFontSize),\r\n\t\tbodySpacing: tooltipOpts.bodySpacing,\r\n\r\n\t\t// Title\r\n\t\ttitleFontColor: tooltipOpts.titleFontColor,\r\n\t\t_titleFontFamily: valueOrDefault$8(tooltipOpts.titleFontFamily, globalDefaults.defaultFontFamily),\r\n\t\t_titleFontStyle: valueOrDefault$8(tooltipOpts.titleFontStyle, globalDefaults.defaultFontStyle),\r\n\t\ttitleFontSize: valueOrDefault$8(tooltipOpts.titleFontSize, globalDefaults.defaultFontSize),\r\n\t\t_titleAlign: tooltipOpts.titleAlign,\r\n\t\ttitleSpacing: tooltipOpts.titleSpacing,\r\n\t\ttitleMarginBottom: tooltipOpts.titleMarginBottom,\r\n\r\n\t\t// Footer\r\n\t\tfooterFontColor: tooltipOpts.footerFontColor,\r\n\t\t_footerFontFamily: valueOrDefault$8(tooltipOpts.footerFontFamily, globalDefaults.defaultFontFamily),\r\n\t\t_footerFontStyle: valueOrDefault$8(tooltipOpts.footerFontStyle, globalDefaults.defaultFontStyle),\r\n\t\tfooterFontSize: valueOrDefault$8(tooltipOpts.footerFontSize, globalDefaults.defaultFontSize),\r\n\t\t_footerAlign: tooltipOpts.footerAlign,\r\n\t\tfooterSpacing: tooltipOpts.footerSpacing,\r\n\t\tfooterMarginTop: tooltipOpts.footerMarginTop,\r\n\r\n\t\t// Appearance\r\n\t\tcaretSize: tooltipOpts.caretSize,\r\n\t\tcornerRadius: tooltipOpts.cornerRadius,\r\n\t\tbackgroundColor: tooltipOpts.backgroundColor,\r\n\t\topacity: 0,\r\n\t\tlegendColorBackground: tooltipOpts.multiKeyBackground,\r\n\t\tdisplayColors: tooltipOpts.displayColors,\r\n\t\tborderColor: tooltipOpts.borderColor,\r\n\t\tborderWidth: tooltipOpts.borderWidth\r\n\t};\r\n}\r\n\r\n/**\r\n * Get the size of the tooltip\r\n */\r\nfunction getTooltipSize(tooltip, model) {\r\n\tvar ctx = tooltip._chart.ctx;\r\n\r\n\tvar height = model.yPadding * 2; // Tooltip Padding\r\n\tvar width = 0;\r\n\r\n\t// Count of all lines in the body\r\n\tvar body = model.body;\r\n\tvar combinedBodyLength = body.reduce(function(count, bodyItem) {\r\n\t\treturn count + bodyItem.before.length + bodyItem.lines.length + bodyItem.after.length;\r\n\t}, 0);\r\n\tcombinedBodyLength += model.beforeBody.length + model.afterBody.length;\r\n\r\n\tvar titleLineCount = model.title.length;\r\n\tvar footerLineCount = model.footer.length;\r\n\tvar titleFontSize = model.titleFontSize;\r\n\tvar bodyFontSize = model.bodyFontSize;\r\n\tvar footerFontSize = model.footerFontSize;\r\n\r\n\theight += titleLineCount * titleFontSize; // Title Lines\r\n\theight += titleLineCount ? (titleLineCount - 1) * model.titleSpacing : 0; // Title Line Spacing\r\n\theight += titleLineCount ? model.titleMarginBottom : 0; // Title's bottom Margin\r\n\theight += combinedBodyLength * bodyFontSize; // Body Lines\r\n\theight += combinedBodyLength ? (combinedBodyLength - 1) * model.bodySpacing : 0; // Body Line Spacing\r\n\theight += footerLineCount ? model.footerMarginTop : 0; // Footer Margin\r\n\theight += footerLineCount * (footerFontSize); // Footer Lines\r\n\theight += footerLineCount ? (footerLineCount - 1) * model.footerSpacing : 0; // Footer Line Spacing\r\n\r\n\t// Title width\r\n\tvar widthPadding = 0;\r\n\tvar maxLineWidth = function(line) {\r\n\t\twidth = Math.max(width, ctx.measureText(line).width + widthPadding);\r\n\t};\r\n\r\n\tctx.font = helpers$1.fontString(titleFontSize, model._titleFontStyle, model._titleFontFamily);\r\n\thelpers$1.each(model.title, maxLineWidth);\r\n\r\n\t// Body width\r\n\tctx.font = helpers$1.fontString(bodyFontSize, model._bodyFontStyle, model._bodyFontFamily);\r\n\thelpers$1.each(model.beforeBody.concat(model.afterBody), maxLineWidth);\r\n\r\n\t// Body lines may include some extra width due to the color box\r\n\twidthPadding = model.displayColors ? (bodyFontSize + 2) : 0;\r\n\thelpers$1.each(body, function(bodyItem) {\r\n\t\thelpers$1.each(bodyItem.before, maxLineWidth);\r\n\t\thelpers$1.each(bodyItem.lines, maxLineWidth);\r\n\t\thelpers$1.each(bodyItem.after, maxLineWidth);\r\n\t});\r\n\r\n\t// Reset back to 0\r\n\twidthPadding = 0;\r\n\r\n\t// Footer width\r\n\tctx.font = helpers$1.fontString(footerFontSize, model._footerFontStyle, model._footerFontFamily);\r\n\thelpers$1.each(model.footer, maxLineWidth);\r\n\r\n\t// Add padding\r\n\twidth += 2 * model.xPadding;\r\n\r\n\treturn {\r\n\t\twidth: width,\r\n\t\theight: height\r\n\t};\r\n}\r\n\r\n/**\r\n * Helper to get the alignment of a tooltip given the size\r\n */\r\nfunction determineAlignment(tooltip, size) {\r\n\tvar model = tooltip._model;\r\n\tvar chart = tooltip._chart;\r\n\tvar chartArea = tooltip._chart.chartArea;\r\n\tvar xAlign = 'center';\r\n\tvar yAlign = 'center';\r\n\r\n\tif (model.y < size.height) {\r\n\t\tyAlign = 'top';\r\n\t} else if (model.y > (chart.height - size.height)) {\r\n\t\tyAlign = 'bottom';\r\n\t}\r\n\r\n\tvar lf, rf; // functions to determine left, right alignment\r\n\tvar olf, orf; // functions to determine if left/right alignment causes tooltip to go outside chart\r\n\tvar yf; // function to get the y alignment if the tooltip goes outside of the left or right edges\r\n\tvar midX = (chartArea.left + chartArea.right) / 2;\r\n\tvar midY = (chartArea.top + chartArea.bottom) / 2;\r\n\r\n\tif (yAlign === 'center') {\r\n\t\tlf = function(x) {\r\n\t\t\treturn x <= midX;\r\n\t\t};\r\n\t\trf = function(x) {\r\n\t\t\treturn x > midX;\r\n\t\t};\r\n\t} else {\r\n\t\tlf = function(x) {\r\n\t\t\treturn x <= (size.width / 2);\r\n\t\t};\r\n\t\trf = function(x) {\r\n\t\t\treturn x >= (chart.width - (size.width / 2));\r\n\t\t};\r\n\t}\r\n\r\n\tolf = function(x) {\r\n\t\treturn x + size.width + model.caretSize + model.caretPadding > chart.width;\r\n\t};\r\n\torf = function(x) {\r\n\t\treturn x - size.width - model.caretSize - model.caretPadding < 0;\r\n\t};\r\n\tyf = function(y) {\r\n\t\treturn y <= midY ? 'top' : 'bottom';\r\n\t};\r\n\r\n\tif (lf(model.x)) {\r\n\t\txAlign = 'left';\r\n\r\n\t\t// Is tooltip too wide and goes over the right side of the chart.?\r\n\t\tif (olf(model.x)) {\r\n\t\t\txAlign = 'center';\r\n\t\t\tyAlign = yf(model.y);\r\n\t\t}\r\n\t} else if (rf(model.x)) {\r\n\t\txAlign = 'right';\r\n\r\n\t\t// Is tooltip too wide and goes outside left edge of canvas?\r\n\t\tif (orf(model.x)) {\r\n\t\t\txAlign = 'center';\r\n\t\t\tyAlign = yf(model.y);\r\n\t\t}\r\n\t}\r\n\r\n\tvar opts = tooltip._options;\r\n\treturn {\r\n\t\txAlign: opts.xAlign ? opts.xAlign : xAlign,\r\n\t\tyAlign: opts.yAlign ? opts.yAlign : yAlign\r\n\t};\r\n}\r\n\r\n/**\r\n * Helper to get the location a tooltip needs to be placed at given the initial position (via the vm) and the size and alignment\r\n */\r\nfunction getBackgroundPoint(vm, size, alignment, chart) {\r\n\t// Background Position\r\n\tvar x = vm.x;\r\n\tvar y = vm.y;\r\n\r\n\tvar caretSize = vm.caretSize;\r\n\tvar caretPadding = vm.caretPadding;\r\n\tvar cornerRadius = vm.cornerRadius;\r\n\tvar xAlign = alignment.xAlign;\r\n\tvar yAlign = alignment.yAlign;\r\n\tvar paddingAndSize = caretSize + caretPadding;\r\n\tvar radiusAndPadding = cornerRadius + caretPadding;\r\n\r\n\tif (xAlign === 'right') {\r\n\t\tx -= size.width;\r\n\t} else if (xAlign === 'center') {\r\n\t\tx -= (size.width / 2);\r\n\t\tif (x + size.width > chart.width) {\r\n\t\t\tx = chart.width - size.width;\r\n\t\t}\r\n\t\tif (x < 0) {\r\n\t\t\tx = 0;\r\n\t\t}\r\n\t}\r\n\r\n\tif (yAlign === 'top') {\r\n\t\ty += paddingAndSize;\r\n\t} else if (yAlign === 'bottom') {\r\n\t\ty -= size.height + paddingAndSize;\r\n\t} else {\r\n\t\ty -= (size.height / 2);\r\n\t}\r\n\r\n\tif (yAlign === 'center') {\r\n\t\tif (xAlign === 'left') {\r\n\t\t\tx += paddingAndSize;\r\n\t\t} else if (xAlign === 'right') {\r\n\t\t\tx -= paddingAndSize;\r\n\t\t}\r\n\t} else if (xAlign === 'left') {\r\n\t\tx -= radiusAndPadding;\r\n\t} else if (xAlign === 'right') {\r\n\t\tx += radiusAndPadding;\r\n\t}\r\n\r\n\treturn {\r\n\t\tx: x,\r\n\t\ty: y\r\n\t};\r\n}\r\n\r\nfunction getAlignedX(vm, align) {\r\n\treturn align === 'center'\r\n\t\t? vm.x + vm.width / 2\r\n\t\t: align === 'right'\r\n\t\t\t? vm.x + vm.width - vm.xPadding\r\n\t\t\t: vm.x + vm.xPadding;\r\n}\r\n\r\n/**\r\n * Helper to build before and after body lines\r\n */\r\nfunction getBeforeAfterBodyLines(callback) {\r\n\treturn pushOrConcat([], splitNewlines(callback));\r\n}\r\n\r\nvar exports$4 = core_element.extend({\r\n\tinitialize: function() {\r\n\t\tthis._model = getBaseModel(this._options);\r\n\t\tthis._lastActive = [];\r\n\t},\r\n\r\n\t// Get the title\r\n\t// Args are: (tooltipItem, data)\r\n\tgetTitle: function() {\r\n\t\tvar me = this;\r\n\t\tvar opts = me._options;\r\n\t\tvar callbacks = opts.callbacks;\r\n\r\n\t\tvar beforeTitle = callbacks.beforeTitle.apply(me, arguments);\r\n\t\tvar title = callbacks.title.apply(me, arguments);\r\n\t\tvar afterTitle = callbacks.afterTitle.apply(me, arguments);\r\n\r\n\t\tvar lines = [];\r\n\t\tlines = pushOrConcat(lines, splitNewlines(beforeTitle));\r\n\t\tlines = pushOrConcat(lines, splitNewlines(title));\r\n\t\tlines = pushOrConcat(lines, splitNewlines(afterTitle));\r\n\r\n\t\treturn lines;\r\n\t},\r\n\r\n\t// Args are: (tooltipItem, data)\r\n\tgetBeforeBody: function() {\r\n\t\treturn getBeforeAfterBodyLines(this._options.callbacks.beforeBody.apply(this, arguments));\r\n\t},\r\n\r\n\t// Args are: (tooltipItem, data)\r\n\tgetBody: function(tooltipItems, data) {\r\n\t\tvar me = this;\r\n\t\tvar callbacks = me._options.callbacks;\r\n\t\tvar bodyItems = [];\r\n\r\n\t\thelpers$1.each(tooltipItems, function(tooltipItem) {\r\n\t\t\tvar bodyItem = {\r\n\t\t\t\tbefore: [],\r\n\t\t\t\tlines: [],\r\n\t\t\t\tafter: []\r\n\t\t\t};\r\n\t\t\tpushOrConcat(bodyItem.before, splitNewlines(callbacks.beforeLabel.call(me, tooltipItem, data)));\r\n\t\t\tpushOrConcat(bodyItem.lines, callbacks.label.call(me, tooltipItem, data));\r\n\t\t\tpushOrConcat(bodyItem.after, splitNewlines(callbacks.afterLabel.call(me, tooltipItem, data)));\r\n\r\n\t\t\tbodyItems.push(bodyItem);\r\n\t\t});\r\n\r\n\t\treturn bodyItems;\r\n\t},\r\n\r\n\t// Args are: (tooltipItem, data)\r\n\tgetAfterBody: function() {\r\n\t\treturn getBeforeAfterBodyLines(this._options.callbacks.afterBody.apply(this, arguments));\r\n\t},\r\n\r\n\t// Get the footer and beforeFooter and afterFooter lines\r\n\t// Args are: (tooltipItem, data)\r\n\tgetFooter: function() {\r\n\t\tvar me = this;\r\n\t\tvar callbacks = me._options.callbacks;\r\n\r\n\t\tvar beforeFooter = callbacks.beforeFooter.apply(me, arguments);\r\n\t\tvar footer = callbacks.footer.apply(me, arguments);\r\n\t\tvar afterFooter = callbacks.afterFooter.apply(me, arguments);\r\n\r\n\t\tvar lines = [];\r\n\t\tlines = pushOrConcat(lines, splitNewlines(beforeFooter));\r\n\t\tlines = pushOrConcat(lines, splitNewlines(footer));\r\n\t\tlines = pushOrConcat(lines, splitNewlines(afterFooter));\r\n\r\n\t\treturn lines;\r\n\t},\r\n\r\n\tupdate: function(changed) {\r\n\t\tvar me = this;\r\n\t\tvar opts = me._options;\r\n\r\n\t\t// Need to regenerate the model because its faster than using extend and it is necessary due to the optimization in Chart.Element.transition\r\n\t\t// that does _view = _model if ease === 1. This causes the 2nd tooltip update to set properties in both the view and model at the same time\r\n\t\t// which breaks any animations.\r\n\t\tvar existingModel = me._model;\r\n\t\tvar model = me._model = getBaseModel(opts);\r\n\t\tvar active = me._active;\r\n\r\n\t\tvar data = me._data;\r\n\r\n\t\t// In the case where active.length === 0 we need to keep these at existing values for good animations\r\n\t\tvar alignment = {\r\n\t\t\txAlign: existingModel.xAlign,\r\n\t\t\tyAlign: existingModel.yAlign\r\n\t\t};\r\n\t\tvar backgroundPoint = {\r\n\t\t\tx: existingModel.x,\r\n\t\t\ty: existingModel.y\r\n\t\t};\r\n\t\tvar tooltipSize = {\r\n\t\t\twidth: existingModel.width,\r\n\t\t\theight: existingModel.height\r\n\t\t};\r\n\t\tvar tooltipPosition = {\r\n\t\t\tx: existingModel.caretX,\r\n\t\t\ty: existingModel.caretY\r\n\t\t};\r\n\r\n\t\tvar i, len;\r\n\r\n\t\tif (active.length) {\r\n\t\t\tmodel.opacity = 1;\r\n\r\n\t\t\tvar labelColors = [];\r\n\t\t\tvar labelTextColors = [];\r\n\t\t\ttooltipPosition = positioners[opts.position].call(me, active, me._eventPosition);\r\n\r\n\t\t\tvar tooltipItems = [];\r\n\t\t\tfor (i = 0, len = active.length; i < len; ++i) {\r\n\t\t\t\ttooltipItems.push(createTooltipItem(active[i]));\r\n\t\t\t}\r\n\r\n\t\t\t// If the user provided a filter function, use it to modify the tooltip items\r\n\t\t\tif (opts.filter) {\r\n\t\t\t\ttooltipItems = tooltipItems.filter(function(a) {\r\n\t\t\t\t\treturn opts.filter(a, data);\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\t// If the user provided a sorting function, use it to modify the tooltip items\r\n\t\t\tif (opts.itemSort) {\r\n\t\t\t\ttooltipItems = tooltipItems.sort(function(a, b) {\r\n\t\t\t\t\treturn opts.itemSort(a, b, data);\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\t// Determine colors for boxes\r\n\t\t\thelpers$1.each(tooltipItems, function(tooltipItem) {\r\n\t\t\t\tlabelColors.push(opts.callbacks.labelColor.call(me, tooltipItem, me._chart));\r\n\t\t\t\tlabelTextColors.push(opts.callbacks.labelTextColor.call(me, tooltipItem, me._chart));\r\n\t\t\t});\r\n\r\n\r\n\t\t\t// Build the Text Lines\r\n\t\t\tmodel.title = me.getTitle(tooltipItems, data);\r\n\t\t\tmodel.beforeBody = me.getBeforeBody(tooltipItems, data);\r\n\t\t\tmodel.body = me.getBody(tooltipItems, data);\r\n\t\t\tmodel.afterBody = me.getAfterBody(tooltipItems, data);\r\n\t\t\tmodel.footer = me.getFooter(tooltipItems, data);\r\n\r\n\t\t\t// Initial positioning and colors\r\n\t\t\tmodel.x = tooltipPosition.x;\r\n\t\t\tmodel.y = tooltipPosition.y;\r\n\t\t\tmodel.caretPadding = opts.caretPadding;\r\n\t\t\tmodel.labelColors = labelColors;\r\n\t\t\tmodel.labelTextColors = labelTextColors;\r\n\r\n\t\t\t// data points\r\n\t\t\tmodel.dataPoints = tooltipItems;\r\n\r\n\t\t\t// We need to determine alignment of the tooltip\r\n\t\t\ttooltipSize = getTooltipSize(this, model);\r\n\t\t\talignment = determineAlignment(this, tooltipSize);\r\n\t\t\t// Final Size and Position\r\n\t\t\tbackgroundPoint = getBackgroundPoint(model, tooltipSize, alignment, me._chart);\r\n\t\t} else {\r\n\t\t\tmodel.opacity = 0;\r\n\t\t}\r\n\r\n\t\tmodel.xAlign = alignment.xAlign;\r\n\t\tmodel.yAlign = alignment.yAlign;\r\n\t\tmodel.x = backgroundPoint.x;\r\n\t\tmodel.y = backgroundPoint.y;\r\n\t\tmodel.width = tooltipSize.width;\r\n\t\tmodel.height = tooltipSize.height;\r\n\r\n\t\t// Point where the caret on the tooltip points to\r\n\t\tmodel.caretX = tooltipPosition.x;\r\n\t\tmodel.caretY = tooltipPosition.y;\r\n\r\n\t\tme._model = model;\r\n\r\n\t\tif (changed && opts.custom) {\r\n\t\t\topts.custom.call(me, model);\r\n\t\t}\r\n\r\n\t\treturn me;\r\n\t},\r\n\r\n\tdrawCaret: function(tooltipPoint, size) {\r\n\t\tvar ctx = this._chart.ctx;\r\n\t\tvar vm = this._view;\r\n\t\tvar caretPosition = this.getCaretPosition(tooltipPoint, size, vm);\r\n\r\n\t\tctx.lineTo(caretPosition.x1, caretPosition.y1);\r\n\t\tctx.lineTo(caretPosition.x2, caretPosition.y2);\r\n\t\tctx.lineTo(caretPosition.x3, caretPosition.y3);\r\n\t},\r\n\tgetCaretPosition: function(tooltipPoint, size, vm) {\r\n\t\tvar x1, x2, x3, y1, y2, y3;\r\n\t\tvar caretSize = vm.caretSize;\r\n\t\tvar cornerRadius = vm.cornerRadius;\r\n\t\tvar xAlign = vm.xAlign;\r\n\t\tvar yAlign = vm.yAlign;\r\n\t\tvar ptX = tooltipPoint.x;\r\n\t\tvar ptY = tooltipPoint.y;\r\n\t\tvar width = size.width;\r\n\t\tvar height = size.height;\r\n\r\n\t\tif (yAlign === 'center') {\r\n\t\t\ty2 = ptY + (height / 2);\r\n\r\n\t\t\tif (xAlign === 'left') {\r\n\t\t\t\tx1 = ptX;\r\n\t\t\t\tx2 = x1 - caretSize;\r\n\t\t\t\tx3 = x1;\r\n\r\n\t\t\t\ty1 = y2 + caretSize;\r\n\t\t\t\ty3 = y2 - caretSize;\r\n\t\t\t} else {\r\n\t\t\t\tx1 = ptX + width;\r\n\t\t\t\tx2 = x1 + caretSize;\r\n\t\t\t\tx3 = x1;\r\n\r\n\t\t\t\ty1 = y2 - caretSize;\r\n\t\t\t\ty3 = y2 + caretSize;\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tif (xAlign === 'left') {\r\n\t\t\t\tx2 = ptX + cornerRadius + (caretSize);\r\n\t\t\t\tx1 = x2 - caretSize;\r\n\t\t\t\tx3 = x2 + caretSize;\r\n\t\t\t} else if (xAlign === 'right') {\r\n\t\t\t\tx2 = ptX + width - cornerRadius - caretSize;\r\n\t\t\t\tx1 = x2 - caretSize;\r\n\t\t\t\tx3 = x2 + caretSize;\r\n\t\t\t} else {\r\n\t\t\t\tx2 = vm.caretX;\r\n\t\t\t\tx1 = x2 - caretSize;\r\n\t\t\t\tx3 = x2 + caretSize;\r\n\t\t\t}\r\n\t\t\tif (yAlign === 'top') {\r\n\t\t\t\ty1 = ptY;\r\n\t\t\t\ty2 = y1 - caretSize;\r\n\t\t\t\ty3 = y1;\r\n\t\t\t} else {\r\n\t\t\t\ty1 = ptY + height;\r\n\t\t\t\ty2 = y1 + caretSize;\r\n\t\t\t\ty3 = y1;\r\n\t\t\t\t// invert drawing order\r\n\t\t\t\tvar tmp = x3;\r\n\t\t\t\tx3 = x1;\r\n\t\t\t\tx1 = tmp;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn {x1: x1, x2: x2, x3: x3, y1: y1, y2: y2, y3: y3};\r\n\t},\r\n\r\n\tdrawTitle: function(pt, vm, ctx) {\r\n\t\tvar title = vm.title;\r\n\t\tvar length = title.length;\r\n\t\tvar titleFontSize, titleSpacing, i;\r\n\r\n\t\tif (length) {\r\n\t\t\tvar rtlHelper = getRtlHelper(vm.rtl, vm.x, vm.width);\r\n\r\n\t\t\tpt.x = getAlignedX(vm, vm._titleAlign);\r\n\r\n\t\t\tctx.textAlign = rtlHelper.textAlign(vm._titleAlign);\r\n\t\t\tctx.textBaseline = 'middle';\r\n\r\n\t\t\ttitleFontSize = vm.titleFontSize;\r\n\t\t\ttitleSpacing = vm.titleSpacing;\r\n\r\n\t\t\tctx.fillStyle = vm.titleFontColor;\r\n\t\t\tctx.font = helpers$1.fontString(titleFontSize, vm._titleFontStyle, vm._titleFontFamily);\r\n\r\n\t\t\tfor (i = 0; i < length; ++i) {\r\n\t\t\t\tctx.fillText(title[i], rtlHelper.x(pt.x), pt.y + titleFontSize / 2);\r\n\t\t\t\tpt.y += titleFontSize + titleSpacing; // Line Height and spacing\r\n\r\n\t\t\t\tif (i + 1 === length) {\r\n\t\t\t\t\tpt.y += vm.titleMarginBottom - titleSpacing; // If Last, add margin, remove spacing\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\tdrawBody: function(pt, vm, ctx) {\r\n\t\tvar bodyFontSize = vm.bodyFontSize;\r\n\t\tvar bodySpacing = vm.bodySpacing;\r\n\t\tvar bodyAlign = vm._bodyAlign;\r\n\t\tvar body = vm.body;\r\n\t\tvar drawColorBoxes = vm.displayColors;\r\n\t\tvar xLinePadding = 0;\r\n\t\tvar colorX = drawColorBoxes ? getAlignedX(vm, 'left') : 0;\r\n\r\n\t\tvar rtlHelper = getRtlHelper(vm.rtl, vm.x, vm.width);\r\n\r\n\t\tvar fillLineOfText = function(line) {\r\n\t\t\tctx.fillText(line, rtlHelper.x(pt.x + xLinePadding), pt.y + bodyFontSize / 2);\r\n\t\t\tpt.y += bodyFontSize + bodySpacing;\r\n\t\t};\r\n\r\n\t\tvar bodyItem, textColor, labelColors, lines, i, j, ilen, jlen;\r\n\t\tvar bodyAlignForCalculation = rtlHelper.textAlign(bodyAlign);\r\n\r\n\t\tctx.textAlign = bodyAlign;\r\n\t\tctx.textBaseline = 'middle';\r\n\t\tctx.font = helpers$1.fontString(bodyFontSize, vm._bodyFontStyle, vm._bodyFontFamily);\r\n\r\n\t\tpt.x = getAlignedX(vm, bodyAlignForCalculation);\r\n\r\n\t\t// Before body lines\r\n\t\tctx.fillStyle = vm.bodyFontColor;\r\n\t\thelpers$1.each(vm.beforeBody, fillLineOfText);\r\n\r\n\t\txLinePadding = drawColorBoxes && bodyAlignForCalculation !== 'right'\r\n\t\t\t? bodyAlign === 'center' ? (bodyFontSize / 2 + 1) : (bodyFontSize + 2)\r\n\t\t\t: 0;\r\n\r\n\t\t// Draw body lines now\r\n\t\tfor (i = 0, ilen = body.length; i < ilen; ++i) {\r\n\t\t\tbodyItem = body[i];\r\n\t\t\ttextColor = vm.labelTextColors[i];\r\n\t\t\tlabelColors = vm.labelColors[i];\r\n\r\n\t\t\tctx.fillStyle = textColor;\r\n\t\t\thelpers$1.each(bodyItem.before, fillLineOfText);\r\n\r\n\t\t\tlines = bodyItem.lines;\r\n\t\t\tfor (j = 0, jlen = lines.length; j < jlen; ++j) {\r\n\t\t\t\t// Draw Legend-like boxes if needed\r\n\t\t\t\tif (drawColorBoxes) {\r\n\t\t\t\t\tvar rtlColorX = rtlHelper.x(colorX);\r\n\r\n\t\t\t\t\t// Fill a white rect so that colours merge nicely if the opacity is < 1\r\n\t\t\t\t\tctx.fillStyle = vm.legendColorBackground;\r\n\t\t\t\t\tctx.fillRect(rtlHelper.leftForLtr(rtlColorX, bodyFontSize), pt.y, bodyFontSize, bodyFontSize);\r\n\r\n\t\t\t\t\t// Border\r\n\t\t\t\t\tctx.lineWidth = 1;\r\n\t\t\t\t\tctx.strokeStyle = labelColors.borderColor;\r\n\t\t\t\t\tctx.strokeRect(rtlHelper.leftForLtr(rtlColorX, bodyFontSize), pt.y, bodyFontSize, bodyFontSize);\r\n\r\n\t\t\t\t\t// Inner square\r\n\t\t\t\t\tctx.fillStyle = labelColors.backgroundColor;\r\n\t\t\t\t\tctx.fillRect(rtlHelper.leftForLtr(rtlHelper.xPlus(rtlColorX, 1), bodyFontSize - 2), pt.y + 1, bodyFontSize - 2, bodyFontSize - 2);\r\n\t\t\t\t\tctx.fillStyle = textColor;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfillLineOfText(lines[j]);\r\n\t\t\t}\r\n\r\n\t\t\thelpers$1.each(bodyItem.after, fillLineOfText);\r\n\t\t}\r\n\r\n\t\t// Reset back to 0 for after body\r\n\t\txLinePadding = 0;\r\n\r\n\t\t// After body lines\r\n\t\thelpers$1.each(vm.afterBody, fillLineOfText);\r\n\t\tpt.y -= bodySpacing; // Remove last body spacing\r\n\t},\r\n\r\n\tdrawFooter: function(pt, vm, ctx) {\r\n\t\tvar footer = vm.footer;\r\n\t\tvar length = footer.length;\r\n\t\tvar footerFontSize, i;\r\n\r\n\t\tif (length) {\r\n\t\t\tvar rtlHelper = getRtlHelper(vm.rtl, vm.x, vm.width);\r\n\r\n\t\t\tpt.x = getAlignedX(vm, vm._footerAlign);\r\n\t\t\tpt.y += vm.footerMarginTop;\r\n\r\n\t\t\tctx.textAlign = rtlHelper.textAlign(vm._footerAlign);\r\n\t\t\tctx.textBaseline = 'middle';\r\n\r\n\t\t\tfooterFontSize = vm.footerFontSize;\r\n\r\n\t\t\tctx.fillStyle = vm.footerFontColor;\r\n\t\t\tctx.font = helpers$1.fontString(footerFontSize, vm._footerFontStyle, vm._footerFontFamily);\r\n\r\n\t\t\tfor (i = 0; i < length; ++i) {\r\n\t\t\t\tctx.fillText(footer[i], rtlHelper.x(pt.x), pt.y + footerFontSize / 2);\r\n\t\t\t\tpt.y += footerFontSize + vm.footerSpacing;\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\tdrawBackground: function(pt, vm, ctx, tooltipSize) {\r\n\t\tctx.fillStyle = vm.backgroundColor;\r\n\t\tctx.strokeStyle = vm.borderColor;\r\n\t\tctx.lineWidth = vm.borderWidth;\r\n\t\tvar xAlign = vm.xAlign;\r\n\t\tvar yAlign = vm.yAlign;\r\n\t\tvar x = pt.x;\r\n\t\tvar y = pt.y;\r\n\t\tvar width = tooltipSize.width;\r\n\t\tvar height = tooltipSize.height;\r\n\t\tvar radius = vm.cornerRadius;\r\n\r\n\t\tctx.beginPath();\r\n\t\tctx.moveTo(x + radius, y);\r\n\t\tif (yAlign === 'top') {\r\n\t\t\tthis.drawCaret(pt, tooltipSize);\r\n\t\t}\r\n\t\tctx.lineTo(x + width - radius, y);\r\n\t\tctx.quadraticCurveTo(x + width, y, x + width, y + radius);\r\n\t\tif (yAlign === 'center' && xAlign === 'right') {\r\n\t\t\tthis.drawCaret(pt, tooltipSize);\r\n\t\t}\r\n\t\tctx.lineTo(x + width, y + height - radius);\r\n\t\tctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height);\r\n\t\tif (yAlign === 'bottom') {\r\n\t\t\tthis.drawCaret(pt, tooltipSize);\r\n\t\t}\r\n\t\tctx.lineTo(x + radius, y + height);\r\n\t\tctx.quadraticCurveTo(x, y + height, x, y + height - radius);\r\n\t\tif (yAlign === 'center' && xAlign === 'left') {\r\n\t\t\tthis.drawCaret(pt, tooltipSize);\r\n\t\t}\r\n\t\tctx.lineTo(x, y + radius);\r\n\t\tctx.quadraticCurveTo(x, y, x + radius, y);\r\n\t\tctx.closePath();\r\n\r\n\t\tctx.fill();\r\n\r\n\t\tif (vm.borderWidth > 0) {\r\n\t\t\tctx.stroke();\r\n\t\t}\r\n\t},\r\n\r\n\tdraw: function() {\r\n\t\tvar ctx = this._chart.ctx;\r\n\t\tvar vm = this._view;\r\n\r\n\t\tif (vm.opacity === 0) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tvar tooltipSize = {\r\n\t\t\twidth: vm.width,\r\n\t\t\theight: vm.height\r\n\t\t};\r\n\t\tvar pt = {\r\n\t\t\tx: vm.x,\r\n\t\t\ty: vm.y\r\n\t\t};\r\n\r\n\t\t// IE11/Edge does not like very small opacities, so snap to 0\r\n\t\tvar opacity = Math.abs(vm.opacity < 1e-3) ? 0 : vm.opacity;\r\n\r\n\t\t// Truthy/falsey value for empty tooltip\r\n\t\tvar hasTooltipContent = vm.title.length || vm.beforeBody.length || vm.body.length || vm.afterBody.length || vm.footer.length;\r\n\r\n\t\tif (this._options.enabled && hasTooltipContent) {\r\n\t\t\tctx.save();\r\n\t\t\tctx.globalAlpha = opacity;\r\n\r\n\t\t\t// Draw Background\r\n\t\t\tthis.drawBackground(pt, vm, ctx, tooltipSize);\r\n\r\n\t\t\t// Draw Title, Body, and Footer\r\n\t\t\tpt.y += vm.yPadding;\r\n\r\n\t\t\thelpers$1.rtl.overrideTextDirection(ctx, vm.textDirection);\r\n\r\n\t\t\t// Titles\r\n\t\t\tthis.drawTitle(pt, vm, ctx);\r\n\r\n\t\t\t// Body\r\n\t\t\tthis.drawBody(pt, vm, ctx);\r\n\r\n\t\t\t// Footer\r\n\t\t\tthis.drawFooter(pt, vm, ctx);\r\n\r\n\t\t\thelpers$1.rtl.restoreTextDirection(ctx, vm.textDirection);\r\n\r\n\t\t\tctx.restore();\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Handle an event\r\n\t * @private\r\n\t * @param {IEvent} event - The event to handle\r\n\t * @returns {boolean} true if the tooltip changed\r\n\t */\r\n\thandleEvent: function(e) {\r\n\t\tvar me = this;\r\n\t\tvar options = me._options;\r\n\t\tvar changed = false;\r\n\r\n\t\tme._lastActive = me._lastActive || [];\r\n\r\n\t\t// Find Active Elements for tooltips\r\n\t\tif (e.type === 'mouseout') {\r\n\t\t\tme._active = [];\r\n\t\t} else {\r\n\t\t\tme._active = me._chart.getElementsAtEventForMode(e, options.mode, options);\r\n\t\t\tif (options.reverse) {\r\n\t\t\t\tme._active.reverse();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Remember Last Actives\r\n\t\tchanged = !helpers$1.arrayEquals(me._active, me._lastActive);\r\n\r\n\t\t// Only handle target event on tooltip change\r\n\t\tif (changed) {\r\n\t\t\tme._lastActive = me._active;\r\n\r\n\t\t\tif (options.enabled || options.custom) {\r\n\t\t\t\tme._eventPosition = {\r\n\t\t\t\t\tx: e.x,\r\n\t\t\t\t\ty: e.y\r\n\t\t\t\t};\r\n\r\n\t\t\t\tme.update(true);\r\n\t\t\t\tme.pivot();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn changed;\r\n\t}\r\n});\r\n\r\n/**\r\n * @namespace Chart.Tooltip.positioners\r\n */\r\nvar positioners_1 = positioners;\r\n\r\nvar core_tooltip = exports$4;\ncore_tooltip.positioners = positioners_1;\n\nvar valueOrDefault$9 = helpers$1.valueOrDefault;\r\n\r\ncore_defaults._set('global', {\r\n\telements: {},\r\n\tevents: [\r\n\t\t'mousemove',\r\n\t\t'mouseout',\r\n\t\t'click',\r\n\t\t'touchstart',\r\n\t\t'touchmove'\r\n\t],\r\n\thover: {\r\n\t\tonHover: null,\r\n\t\tmode: 'nearest',\r\n\t\tintersect: true,\r\n\t\tanimationDuration: 400\r\n\t},\r\n\tonClick: null,\r\n\tmaintainAspectRatio: true,\r\n\tresponsive: true,\r\n\tresponsiveAnimationDuration: 0\r\n});\r\n\r\n/**\r\n * Recursively merge the given config objects representing the `scales` option\r\n * by incorporating scale defaults in `xAxes` and `yAxes` array items, then\r\n * returns a deep copy of the result, thus doesn't alter inputs.\r\n */\r\nfunction mergeScaleConfig(/* config objects ... */) {\r\n\treturn helpers$1.merge(Object.create(null), [].slice.call(arguments), {\r\n\t\tmerger: function(key, target, source, options) {\r\n\t\t\tif (key === 'xAxes' || key === 'yAxes') {\r\n\t\t\t\tvar slen = source[key].length;\r\n\t\t\t\tvar i, type, scale;\r\n\r\n\t\t\t\tif (!target[key]) {\r\n\t\t\t\t\ttarget[key] = [];\r\n\t\t\t\t}\r\n\r\n\t\t\t\tfor (i = 0; i < slen; ++i) {\r\n\t\t\t\t\tscale = source[key][i];\r\n\t\t\t\t\ttype = valueOrDefault$9(scale.type, key === 'xAxes' ? 'category' : 'linear');\r\n\r\n\t\t\t\t\tif (i >= target[key].length) {\r\n\t\t\t\t\t\ttarget[key].push({});\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (!target[key][i].type || (scale.type && scale.type !== target[key][i].type)) {\r\n\t\t\t\t\t\t// new/untyped scale or type changed: let's apply the new defaults\r\n\t\t\t\t\t\t// then merge source scale to correctly overwrite the defaults.\r\n\t\t\t\t\t\thelpers$1.merge(target[key][i], [core_scaleService.getScaleDefaults(type), scale]);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\t// scales type are the same\r\n\t\t\t\t\t\thelpers$1.merge(target[key][i], scale);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\thelpers$1._merger(key, target, source, options);\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n}\r\n\r\n/**\r\n * Recursively merge the given config objects as the root options by handling\r\n * default scale options for the `scales` and `scale` properties, then returns\r\n * a deep copy of the result, thus doesn't alter inputs.\r\n */\r\nfunction mergeConfig(/* config objects ... */) {\r\n\treturn helpers$1.merge(Object.create(null), [].slice.call(arguments), {\r\n\t\tmerger: function(key, target, source, options) {\r\n\t\t\tvar tval = target[key] || Object.create(null);\r\n\t\t\tvar sval = source[key];\r\n\r\n\t\t\tif (key === 'scales') {\r\n\t\t\t\t// scale config merging is complex. Add our own function here for that\r\n\t\t\t\ttarget[key] = mergeScaleConfig(tval, sval);\r\n\t\t\t} else if (key === 'scale') {\r\n\t\t\t\t// used in polar area & radar charts since there is only one scale\r\n\t\t\t\ttarget[key] = helpers$1.merge(tval, [core_scaleService.getScaleDefaults(sval.type), sval]);\r\n\t\t\t} else {\r\n\t\t\t\thelpers$1._merger(key, target, source, options);\r\n\t\t\t}\r\n\t\t}\r\n\t});\r\n}\r\n\r\nfunction initConfig(config) {\r\n\tconfig = config || Object.create(null);\r\n\r\n\t// Do NOT use mergeConfig for the data object because this method merges arrays\r\n\t// and so would change references to labels and datasets, preventing data updates.\r\n\tvar data = config.data = config.data || {};\r\n\tdata.datasets = data.datasets || [];\r\n\tdata.labels = data.labels || [];\r\n\r\n\tconfig.options = mergeConfig(\r\n\t\tcore_defaults.global,\r\n\t\tcore_defaults[config.type],\r\n\t\tconfig.options || {});\r\n\r\n\treturn config;\r\n}\r\n\r\nfunction updateConfig(chart) {\r\n\tvar newOptions = chart.options;\r\n\r\n\thelpers$1.each(chart.scales, function(scale) {\r\n\t\tcore_layouts.removeBox(chart, scale);\r\n\t});\r\n\r\n\tnewOptions = mergeConfig(\r\n\t\tcore_defaults.global,\r\n\t\tcore_defaults[chart.config.type],\r\n\t\tnewOptions);\r\n\r\n\tchart.options = chart.config.options = newOptions;\r\n\tchart.ensureScalesHaveIDs();\r\n\tchart.buildOrUpdateScales();\r\n\r\n\t// Tooltip\r\n\tchart.tooltip._options = newOptions.tooltips;\r\n\tchart.tooltip.initialize();\r\n}\r\n\r\nfunction nextAvailableScaleId(axesOpts, prefix, index) {\r\n\tvar id;\r\n\tvar hasId = function(obj) {\r\n\t\treturn obj.id === id;\r\n\t};\r\n\r\n\tdo {\r\n\t\tid = prefix + index++;\r\n\t} while (helpers$1.findIndex(axesOpts, hasId) >= 0);\r\n\r\n\treturn id;\r\n}\r\n\r\nfunction positionIsHorizontal(position) {\r\n\treturn position === 'top' || position === 'bottom';\r\n}\r\n\r\nfunction compare2Level(l1, l2) {\r\n\treturn function(a, b) {\r\n\t\treturn a[l1] === b[l1]\r\n\t\t\t? a[l2] - b[l2]\r\n\t\t\t: a[l1] - b[l1];\r\n\t};\r\n}\r\n\r\nvar Chart = function(item, config) {\r\n\tthis.construct(item, config);\r\n\treturn this;\r\n};\r\n\r\nhelpers$1.extend(Chart.prototype, /** @lends Chart */ {\r\n\t/**\r\n\t * @private\r\n\t */\r\n\tconstruct: function(item, config) {\r\n\t\tvar me = this;\r\n\r\n\t\tconfig = initConfig(config);\r\n\r\n\t\tvar context = platform.acquireContext(item, config);\r\n\t\tvar canvas = context && context.canvas;\r\n\t\tvar height = canvas && canvas.height;\r\n\t\tvar width = canvas && canvas.width;\r\n\r\n\t\tme.id = helpers$1.uid();\r\n\t\tme.ctx = context;\r\n\t\tme.canvas = canvas;\r\n\t\tme.config = config;\r\n\t\tme.width = width;\r\n\t\tme.height = height;\r\n\t\tme.aspectRatio = height ? width / height : null;\r\n\t\tme.options = config.options;\r\n\t\tme._bufferedRender = false;\r\n\t\tme._layers = [];\r\n\r\n\t\t/**\r\n\t\t * Provided for backward compatibility, Chart and Chart.Controller have been merged,\r\n\t\t * the \"instance\" still need to be defined since it might be called from plugins.\r\n\t\t * @prop Chart#chart\r\n\t\t * @deprecated since version 2.6.0\r\n\t\t * @todo remove at version 3\r\n\t\t * @private\r\n\t\t */\r\n\t\tme.chart = me;\r\n\t\tme.controller = me; // chart.chart.controller #inception\r\n\r\n\t\t// Add the chart instance to the global namespace\r\n\t\tChart.instances[me.id] = me;\r\n\r\n\t\t// Define alias to the config data: `chart.data === chart.config.data`\r\n\t\tObject.defineProperty(me, 'data', {\r\n\t\t\tget: function() {\r\n\t\t\t\treturn me.config.data;\r\n\t\t\t},\r\n\t\t\tset: function(value) {\r\n\t\t\t\tme.config.data = value;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tif (!context || !canvas) {\r\n\t\t\t// The given item is not a compatible context2d element, let's return before finalizing\r\n\t\t\t// the chart initialization but after setting basic chart / controller properties that\r\n\t\t\t// can help to figure out that the chart is not valid (e.g chart.canvas !== null);\r\n\t\t\t// https://github.com/chartjs/Chart.js/issues/2807\r\n\t\t\tconsole.error(\"Failed to create chart: can't acquire context from the given item\");\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tme.initialize();\r\n\t\tme.update();\r\n\t},\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n\tinitialize: function() {\r\n\t\tvar me = this;\r\n\r\n\t\t// Before init plugin notification\r\n\t\tcore_plugins.notify(me, 'beforeInit');\r\n\r\n\t\thelpers$1.retinaScale(me, me.options.devicePixelRatio);\r\n\r\n\t\tme.bindEvents();\r\n\r\n\t\tif (me.options.responsive) {\r\n\t\t\t// Initial resize before chart draws (must be silent to preserve initial animations).\r\n\t\t\tme.resize(true);\r\n\t\t}\r\n\r\n\t\tme.initToolTip();\r\n\r\n\t\t// After init plugin notification\r\n\t\tcore_plugins.notify(me, 'afterInit');\r\n\r\n\t\treturn me;\r\n\t},\r\n\r\n\tclear: function() {\r\n\t\thelpers$1.canvas.clear(this);\r\n\t\treturn this;\r\n\t},\r\n\r\n\tstop: function() {\r\n\t\t// Stops any current animation loop occurring\r\n\t\tcore_animations.cancelAnimation(this);\r\n\t\treturn this;\r\n\t},\r\n\r\n\tresize: function(silent) {\r\n\t\tvar me = this;\r\n\t\tvar options = me.options;\r\n\t\tvar canvas = me.canvas;\r\n\t\tvar aspectRatio = (options.maintainAspectRatio && me.aspectRatio) || null;\r\n\r\n\t\t// the canvas render width and height will be casted to integers so make sure that\r\n\t\t// the canvas display style uses the same integer values to avoid blurring effect.\r\n\r\n\t\t// Set to 0 instead of canvas.size because the size defaults to 300x150 if the element is collapsed\r\n\t\tvar newWidth = Math.max(0, Math.floor(helpers$1.getMaximumWidth(canvas)));\r\n\t\tvar newHeight = Math.max(0, Math.floor(aspectRatio ? newWidth / aspectRatio : helpers$1.getMaximumHeight(canvas)));\r\n\r\n\t\tif (me.width === newWidth && me.height === newHeight) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tcanvas.width = me.width = newWidth;\r\n\t\tcanvas.height = me.height = newHeight;\r\n\t\tcanvas.style.width = newWidth + 'px';\r\n\t\tcanvas.style.height = newHeight + 'px';\r\n\r\n\t\thelpers$1.retinaScale(me, options.devicePixelRatio);\r\n\r\n\t\tif (!silent) {\r\n\t\t\t// Notify any plugins about the resize\r\n\t\t\tvar newSize = {width: newWidth, height: newHeight};\r\n\t\t\tcore_plugins.notify(me, 'resize', [newSize]);\r\n\r\n\t\t\t// Notify of resize\r\n\t\t\tif (options.onResize) {\r\n\t\t\t\toptions.onResize(me, newSize);\r\n\t\t\t}\r\n\r\n\t\t\tme.stop();\r\n\t\t\tme.update({\r\n\t\t\t\tduration: options.responsiveAnimationDuration\r\n\t\t\t});\r\n\t\t}\r\n\t},\r\n\r\n\tensureScalesHaveIDs: function() {\r\n\t\tvar options = this.options;\r\n\t\tvar scalesOptions = options.scales || {};\r\n\t\tvar scaleOptions = options.scale;\r\n\r\n\t\thelpers$1.each(scalesOptions.xAxes, function(xAxisOptions, index) {\r\n\t\t\tif (!xAxisOptions.id) {\r\n\t\t\t\txAxisOptions.id = nextAvailableScaleId(scalesOptions.xAxes, 'x-axis-', index);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\thelpers$1.each(scalesOptions.yAxes, function(yAxisOptions, index) {\r\n\t\t\tif (!yAxisOptions.id) {\r\n\t\t\t\tyAxisOptions.id = nextAvailableScaleId(scalesOptions.yAxes, 'y-axis-', index);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tif (scaleOptions) {\r\n\t\t\tscaleOptions.id = scaleOptions.id || 'scale';\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Builds a map of scale ID to scale object for future lookup.\r\n\t */\r\n\tbuildOrUpdateScales: function() {\r\n\t\tvar me = this;\r\n\t\tvar options = me.options;\r\n\t\tvar scales = me.scales || {};\r\n\t\tvar items = [];\r\n\t\tvar updated = Object.keys(scales).reduce(function(obj, id) {\r\n\t\t\tobj[id] = false;\r\n\t\t\treturn obj;\r\n\t\t}, {});\r\n\r\n\t\tif (options.scales) {\r\n\t\t\titems = items.concat(\r\n\t\t\t\t(options.scales.xAxes || []).map(function(xAxisOptions) {\r\n\t\t\t\t\treturn {options: xAxisOptions, dtype: 'category', dposition: 'bottom'};\r\n\t\t\t\t}),\r\n\t\t\t\t(options.scales.yAxes || []).map(function(yAxisOptions) {\r\n\t\t\t\t\treturn {options: yAxisOptions, dtype: 'linear', dposition: 'left'};\r\n\t\t\t\t})\r\n\t\t\t);\r\n\t\t}\r\n\r\n\t\tif (options.scale) {\r\n\t\t\titems.push({\r\n\t\t\t\toptions: options.scale,\r\n\t\t\t\tdtype: 'radialLinear',\r\n\t\t\t\tisDefault: true,\r\n\t\t\t\tdposition: 'chartArea'\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\thelpers$1.each(items, function(item) {\r\n\t\t\tvar scaleOptions = item.options;\r\n\t\t\tvar id = scaleOptions.id;\r\n\t\t\tvar scaleType = valueOrDefault$9(scaleOptions.type, item.dtype);\r\n\r\n\t\t\tif (positionIsHorizontal(scaleOptions.position) !== positionIsHorizontal(item.dposition)) {\r\n\t\t\t\tscaleOptions.position = item.dposition;\r\n\t\t\t}\r\n\r\n\t\t\tupdated[id] = true;\r\n\t\t\tvar scale = null;\r\n\t\t\tif (id in scales && scales[id].type === scaleType) {\r\n\t\t\t\tscale = scales[id];\r\n\t\t\t\tscale.options = scaleOptions;\r\n\t\t\t\tscale.ctx = me.ctx;\r\n\t\t\t\tscale.chart = me;\r\n\t\t\t} else {\r\n\t\t\t\tvar scaleClass = core_scaleService.getScaleConstructor(scaleType);\r\n\t\t\t\tif (!scaleClass) {\r\n\t\t\t\t\treturn;\r\n\t\t\t\t}\r\n\t\t\t\tscale = new scaleClass({\r\n\t\t\t\t\tid: id,\r\n\t\t\t\t\ttype: scaleType,\r\n\t\t\t\t\toptions: scaleOptions,\r\n\t\t\t\t\tctx: me.ctx,\r\n\t\t\t\t\tchart: me\r\n\t\t\t\t});\r\n\t\t\t\tscales[scale.id] = scale;\r\n\t\t\t}\r\n\r\n\t\t\tscale.mergeTicksOptions();\r\n\r\n\t\t\t// TODO(SB): I think we should be able to remove this custom case (options.scale)\r\n\t\t\t// and consider it as a regular scale part of the \"scales\"\" map only! This would\r\n\t\t\t// make the logic easier and remove some useless? custom code.\r\n\t\t\tif (item.isDefault) {\r\n\t\t\t\tme.scale = scale;\r\n\t\t\t}\r\n\t\t});\r\n\t\t// clear up discarded scales\r\n\t\thelpers$1.each(updated, function(hasUpdated, id) {\r\n\t\t\tif (!hasUpdated) {\r\n\t\t\t\tdelete scales[id];\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tme.scales = scales;\r\n\r\n\t\tcore_scaleService.addScalesToLayout(this);\r\n\t},\r\n\r\n\tbuildOrUpdateControllers: function() {\r\n\t\tvar me = this;\r\n\t\tvar newControllers = [];\r\n\t\tvar datasets = me.data.datasets;\r\n\t\tvar i, ilen;\r\n\r\n\t\tfor (i = 0, ilen = datasets.length; i < ilen; i++) {\r\n\t\t\tvar dataset = datasets[i];\r\n\t\t\tvar meta = me.getDatasetMeta(i);\r\n\t\t\tvar type = dataset.type || me.config.type;\r\n\r\n\t\t\tif (meta.type && meta.type !== type) {\r\n\t\t\t\tme.destroyDatasetMeta(i);\r\n\t\t\t\tmeta = me.getDatasetMeta(i);\r\n\t\t\t}\r\n\t\t\tmeta.type = type;\r\n\t\t\tmeta.order = dataset.order || 0;\r\n\t\t\tmeta.index = i;\r\n\r\n\t\t\tif (meta.controller) {\r\n\t\t\t\tmeta.controller.updateIndex(i);\r\n\t\t\t\tmeta.controller.linkScales();\r\n\t\t\t} else {\r\n\t\t\t\tvar ControllerClass = controllers[meta.type];\r\n\t\t\t\tif (ControllerClass === undefined) {\r\n\t\t\t\t\tthrow new Error('\"' + meta.type + '\" is not a chart type.');\r\n\t\t\t\t}\r\n\r\n\t\t\t\tmeta.controller = new ControllerClass(me, i);\r\n\t\t\t\tnewControllers.push(meta.controller);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn newControllers;\r\n\t},\r\n\r\n\t/**\r\n\t * Reset the elements of all datasets\r\n\t * @private\r\n\t */\r\n\tresetElements: function() {\r\n\t\tvar me = this;\r\n\t\thelpers$1.each(me.data.datasets, function(dataset, datasetIndex) {\r\n\t\t\tme.getDatasetMeta(datasetIndex).controller.reset();\r\n\t\t}, me);\r\n\t},\r\n\r\n\t/**\r\n\t* Resets the chart back to it's state before the initial animation\r\n\t*/\r\n\treset: function() {\r\n\t\tthis.resetElements();\r\n\t\tthis.tooltip.initialize();\r\n\t},\r\n\r\n\tupdate: function(config) {\r\n\t\tvar me = this;\r\n\t\tvar i, ilen;\r\n\r\n\t\tif (!config || typeof config !== 'object') {\r\n\t\t\t// backwards compatibility\r\n\t\t\tconfig = {\r\n\t\t\t\tduration: config,\r\n\t\t\t\tlazy: arguments[1]\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tupdateConfig(me);\r\n\r\n\t\t// plugins options references might have change, let's invalidate the cache\r\n\t\t// https://github.com/chartjs/Chart.js/issues/5111#issuecomment-355934167\r\n\t\tcore_plugins._invalidate(me);\r\n\r\n\t\tif (core_plugins.notify(me, 'beforeUpdate') === false) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// In case the entire data object changed\r\n\t\tme.tooltip._data = me.data;\r\n\r\n\t\t// Make sure dataset controllers are updated and new controllers are reset\r\n\t\tvar newControllers = me.buildOrUpdateControllers();\r\n\r\n\t\t// Make sure all dataset controllers have correct meta data counts\r\n\t\tfor (i = 0, ilen = me.data.datasets.length; i < ilen; i++) {\r\n\t\t\tme.getDatasetMeta(i).controller.buildOrUpdateElements();\r\n\t\t}\r\n\r\n\t\tme.updateLayout();\r\n\r\n\t\t// Can only reset the new controllers after the scales have been updated\r\n\t\tif (me.options.animation && me.options.animation.duration) {\r\n\t\t\thelpers$1.each(newControllers, function(controller) {\r\n\t\t\t\tcontroller.reset();\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tme.updateDatasets();\r\n\r\n\t\t// Need to reset tooltip in case it is displayed with elements that are removed\r\n\t\t// after update.\r\n\t\tme.tooltip.initialize();\r\n\r\n\t\t// Last active contains items that were previously in the tooltip.\r\n\t\t// When we reset the tooltip, we need to clear it\r\n\t\tme.lastActive = [];\r\n\r\n\t\t// Do this before render so that any plugins that need final scale updates can use it\r\n\t\tcore_plugins.notify(me, 'afterUpdate');\r\n\r\n\t\tme._layers.sort(compare2Level('z', '_idx'));\r\n\r\n\t\tif (me._bufferedRender) {\r\n\t\t\tme._bufferedRequest = {\r\n\t\t\t\tduration: config.duration,\r\n\t\t\t\teasing: config.easing,\r\n\t\t\t\tlazy: config.lazy\r\n\t\t\t};\r\n\t\t} else {\r\n\t\t\tme.render(config);\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Updates the chart layout unless a plugin returns `false` to the `beforeLayout`\r\n\t * hook, in which case, plugins will not be called on `afterLayout`.\r\n\t * @private\r\n\t */\r\n\tupdateLayout: function() {\r\n\t\tvar me = this;\r\n\r\n\t\tif (core_plugins.notify(me, 'beforeLayout') === false) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tcore_layouts.update(this, this.width, this.height);\r\n\r\n\t\tme._layers = [];\r\n\t\thelpers$1.each(me.boxes, function(box) {\r\n\t\t\t// _configure is called twice, once in core.scale.update and once here.\r\n\t\t\t// Here the boxes are fully updated and at their final positions.\r\n\t\t\tif (box._configure) {\r\n\t\t\t\tbox._configure();\r\n\t\t\t}\r\n\t\t\tme._layers.push.apply(me._layers, box._layers());\r\n\t\t}, me);\r\n\r\n\t\tme._layers.forEach(function(item, index) {\r\n\t\t\titem._idx = index;\r\n\t\t});\r\n\r\n\t\t/**\r\n\t\t * Provided for backward compatibility, use `afterLayout` instead.\r\n\t\t * @method IPlugin#afterScaleUpdate\r\n\t\t * @deprecated since version 2.5.0\r\n\t\t * @todo remove at version 3\r\n\t\t * @private\r\n\t\t */\r\n\t\tcore_plugins.notify(me, 'afterScaleUpdate');\r\n\t\tcore_plugins.notify(me, 'afterLayout');\r\n\t},\r\n\r\n\t/**\r\n\t * Updates all datasets unless a plugin returns `false` to the `beforeDatasetsUpdate`\r\n\t * hook, in which case, plugins will not be called on `afterDatasetsUpdate`.\r\n\t * @private\r\n\t */\r\n\tupdateDatasets: function() {\r\n\t\tvar me = this;\r\n\r\n\t\tif (core_plugins.notify(me, 'beforeDatasetsUpdate') === false) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tfor (var i = 0, ilen = me.data.datasets.length; i < ilen; ++i) {\r\n\t\t\tme.updateDataset(i);\r\n\t\t}\r\n\r\n\t\tcore_plugins.notify(me, 'afterDatasetsUpdate');\r\n\t},\r\n\r\n\t/**\r\n\t * Updates dataset at index unless a plugin returns `false` to the `beforeDatasetUpdate`\r\n\t * hook, in which case, plugins will not be called on `afterDatasetUpdate`.\r\n\t * @private\r\n\t */\r\n\tupdateDataset: function(index) {\r\n\t\tvar me = this;\r\n\t\tvar meta = me.getDatasetMeta(index);\r\n\t\tvar args = {\r\n\t\t\tmeta: meta,\r\n\t\t\tindex: index\r\n\t\t};\r\n\r\n\t\tif (core_plugins.notify(me, 'beforeDatasetUpdate', [args]) === false) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tmeta.controller._update();\r\n\r\n\t\tcore_plugins.notify(me, 'afterDatasetUpdate', [args]);\r\n\t},\r\n\r\n\trender: function(config) {\r\n\t\tvar me = this;\r\n\r\n\t\tif (!config || typeof config !== 'object') {\r\n\t\t\t// backwards compatibility\r\n\t\t\tconfig = {\r\n\t\t\t\tduration: config,\r\n\t\t\t\tlazy: arguments[1]\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\tvar animationOptions = me.options.animation;\r\n\t\tvar duration = valueOrDefault$9(config.duration, animationOptions && animationOptions.duration);\r\n\t\tvar lazy = config.lazy;\r\n\r\n\t\tif (core_plugins.notify(me, 'beforeRender') === false) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tvar onComplete = function(animation) {\r\n\t\t\tcore_plugins.notify(me, 'afterRender');\r\n\t\t\thelpers$1.callback(animationOptions && animationOptions.onComplete, [animation], me);\r\n\t\t};\r\n\r\n\t\tif (animationOptions && duration) {\r\n\t\t\tvar animation = new core_animation({\r\n\t\t\t\tnumSteps: duration / 16.66, // 60 fps\r\n\t\t\t\teasing: config.easing || animationOptions.easing,\r\n\r\n\t\t\t\trender: function(chart, animationObject) {\r\n\t\t\t\t\tvar easingFunction = helpers$1.easing.effects[animationObject.easing];\r\n\t\t\t\t\tvar currentStep = animationObject.currentStep;\r\n\t\t\t\t\tvar stepDecimal = currentStep / animationObject.numSteps;\r\n\r\n\t\t\t\t\tchart.draw(easingFunction(stepDecimal), stepDecimal, currentStep);\r\n\t\t\t\t},\r\n\r\n\t\t\t\tonAnimationProgress: animationOptions.onProgress,\r\n\t\t\t\tonAnimationComplete: onComplete\r\n\t\t\t});\r\n\r\n\t\t\tcore_animations.addAnimation(me, animation, duration, lazy);\r\n\t\t} else {\r\n\t\t\tme.draw();\r\n\r\n\t\t\t// See https://github.com/chartjs/Chart.js/issues/3781\r\n\t\t\tonComplete(new core_animation({numSteps: 0, chart: me}));\r\n\t\t}\r\n\r\n\t\treturn me;\r\n\t},\r\n\r\n\tdraw: function(easingValue) {\r\n\t\tvar me = this;\r\n\t\tvar i, layers;\r\n\r\n\t\tme.clear();\r\n\r\n\t\tif (helpers$1.isNullOrUndef(easingValue)) {\r\n\t\t\teasingValue = 1;\r\n\t\t}\r\n\r\n\t\tme.transition(easingValue);\r\n\r\n\t\tif (me.width <= 0 || me.height <= 0) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tif (core_plugins.notify(me, 'beforeDraw', [easingValue]) === false) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Because of plugin hooks (before/afterDatasetsDraw), datasets can't\r\n\t\t// currently be part of layers. Instead, we draw\r\n\t\t// layers <= 0 before(default, backward compat), and the rest after\r\n\t\tlayers = me._layers;\r\n\t\tfor (i = 0; i < layers.length && layers[i].z <= 0; ++i) {\r\n\t\t\tlayers[i].draw(me.chartArea);\r\n\t\t}\r\n\r\n\t\tme.drawDatasets(easingValue);\r\n\r\n\t\t// Rest of layers\r\n\t\tfor (; i < layers.length; ++i) {\r\n\t\t\tlayers[i].draw(me.chartArea);\r\n\t\t}\r\n\r\n\t\tme._drawTooltip(easingValue);\r\n\r\n\t\tcore_plugins.notify(me, 'afterDraw', [easingValue]);\r\n\t},\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n\ttransition: function(easingValue) {\r\n\t\tvar me = this;\r\n\r\n\t\tfor (var i = 0, ilen = (me.data.datasets || []).length; i < ilen; ++i) {\r\n\t\t\tif (me.isDatasetVisible(i)) {\r\n\t\t\t\tme.getDatasetMeta(i).controller.transition(easingValue);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tme.tooltip.transition(easingValue);\r\n\t},\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n\t_getSortedDatasetMetas: function(filterVisible) {\r\n\t\tvar me = this;\r\n\t\tvar datasets = me.data.datasets || [];\r\n\t\tvar result = [];\r\n\t\tvar i, ilen;\r\n\r\n\t\tfor (i = 0, ilen = datasets.length; i < ilen; ++i) {\r\n\t\t\tif (!filterVisible || me.isDatasetVisible(i)) {\r\n\t\t\t\tresult.push(me.getDatasetMeta(i));\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tresult.sort(compare2Level('order', 'index'));\r\n\r\n\t\treturn result;\r\n\t},\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n\t_getSortedVisibleDatasetMetas: function() {\r\n\t\treturn this._getSortedDatasetMetas(true);\r\n\t},\r\n\r\n\t/**\r\n\t * Draws all datasets unless a plugin returns `false` to the `beforeDatasetsDraw`\r\n\t * hook, in which case, plugins will not be called on `afterDatasetsDraw`.\r\n\t * @private\r\n\t */\r\n\tdrawDatasets: function(easingValue) {\r\n\t\tvar me = this;\r\n\t\tvar metasets, i;\r\n\r\n\t\tif (core_plugins.notify(me, 'beforeDatasetsDraw', [easingValue]) === false) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tmetasets = me._getSortedVisibleDatasetMetas();\r\n\t\tfor (i = metasets.length - 1; i >= 0; --i) {\r\n\t\t\tme.drawDataset(metasets[i], easingValue);\r\n\t\t}\r\n\r\n\t\tcore_plugins.notify(me, 'afterDatasetsDraw', [easingValue]);\r\n\t},\r\n\r\n\t/**\r\n\t * Draws dataset at index unless a plugin returns `false` to the `beforeDatasetDraw`\r\n\t * hook, in which case, plugins will not be called on `afterDatasetDraw`.\r\n\t * @private\r\n\t */\r\n\tdrawDataset: function(meta, easingValue) {\r\n\t\tvar me = this;\r\n\t\tvar args = {\r\n\t\t\tmeta: meta,\r\n\t\t\tindex: meta.index,\r\n\t\t\teasingValue: easingValue\r\n\t\t};\r\n\r\n\t\tif (core_plugins.notify(me, 'beforeDatasetDraw', [args]) === false) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tmeta.controller.draw(easingValue);\r\n\r\n\t\tcore_plugins.notify(me, 'afterDatasetDraw', [args]);\r\n\t},\r\n\r\n\t/**\r\n\t * Draws tooltip unless a plugin returns `false` to the `beforeTooltipDraw`\r\n\t * hook, in which case, plugins will not be called on `afterTooltipDraw`.\r\n\t * @private\r\n\t */\r\n\t_drawTooltip: function(easingValue) {\r\n\t\tvar me = this;\r\n\t\tvar tooltip = me.tooltip;\r\n\t\tvar args = {\r\n\t\t\ttooltip: tooltip,\r\n\t\t\teasingValue: easingValue\r\n\t\t};\r\n\r\n\t\tif (core_plugins.notify(me, 'beforeTooltipDraw', [args]) === false) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\ttooltip.draw();\r\n\r\n\t\tcore_plugins.notify(me, 'afterTooltipDraw', [args]);\r\n\t},\r\n\r\n\t/**\r\n\t * Get the single element that was clicked on\r\n\t * @return An object containing the dataset index and element index of the matching element. Also contains the rectangle that was draw\r\n\t */\r\n\tgetElementAtEvent: function(e) {\r\n\t\treturn core_interaction.modes.single(this, e);\r\n\t},\r\n\r\n\tgetElementsAtEvent: function(e) {\r\n\t\treturn core_interaction.modes.label(this, e, {intersect: true});\r\n\t},\r\n\r\n\tgetElementsAtXAxis: function(e) {\r\n\t\treturn core_interaction.modes['x-axis'](this, e, {intersect: true});\r\n\t},\r\n\r\n\tgetElementsAtEventForMode: function(e, mode, options) {\r\n\t\tvar method = core_interaction.modes[mode];\r\n\t\tif (typeof method === 'function') {\r\n\t\t\treturn method(this, e, options);\r\n\t\t}\r\n\r\n\t\treturn [];\r\n\t},\r\n\r\n\tgetDatasetAtEvent: function(e) {\r\n\t\treturn core_interaction.modes.dataset(this, e, {intersect: true});\r\n\t},\r\n\r\n\tgetDatasetMeta: function(datasetIndex) {\r\n\t\tvar me = this;\r\n\t\tvar dataset = me.data.datasets[datasetIndex];\r\n\t\tif (!dataset._meta) {\r\n\t\t\tdataset._meta = {};\r\n\t\t}\r\n\r\n\t\tvar meta = dataset._meta[me.id];\r\n\t\tif (!meta) {\r\n\t\t\tmeta = dataset._meta[me.id] = {\r\n\t\t\t\ttype: null,\r\n\t\t\t\tdata: [],\r\n\t\t\t\tdataset: null,\r\n\t\t\t\tcontroller: null,\r\n\t\t\t\thidden: null,\t\t\t// See isDatasetVisible() comment\r\n\t\t\t\txAxisID: null,\r\n\t\t\t\tyAxisID: null,\r\n\t\t\t\torder: dataset.order || 0,\r\n\t\t\t\tindex: datasetIndex\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\treturn meta;\r\n\t},\r\n\r\n\tgetVisibleDatasetCount: function() {\r\n\t\tvar count = 0;\r\n\t\tfor (var i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\r\n\t\t\tif (this.isDatasetVisible(i)) {\r\n\t\t\t\tcount++;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn count;\r\n\t},\r\n\r\n\tisDatasetVisible: function(datasetIndex) {\r\n\t\tvar meta = this.getDatasetMeta(datasetIndex);\r\n\r\n\t\t// meta.hidden is a per chart dataset hidden flag override with 3 states: if true or false,\r\n\t\t// the dataset.hidden value is ignored, else if null, the dataset hidden state is returned.\r\n\t\treturn typeof meta.hidden === 'boolean' ? !meta.hidden : !this.data.datasets[datasetIndex].hidden;\r\n\t},\r\n\r\n\tgenerateLegend: function() {\r\n\t\treturn this.options.legendCallback(this);\r\n\t},\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n\tdestroyDatasetMeta: function(datasetIndex) {\r\n\t\tvar id = this.id;\r\n\t\tvar dataset = this.data.datasets[datasetIndex];\r\n\t\tvar meta = dataset._meta && dataset._meta[id];\r\n\r\n\t\tif (meta) {\r\n\t\t\tmeta.controller.destroy();\r\n\t\t\tdelete dataset._meta[id];\r\n\t\t}\r\n\t},\r\n\r\n\tdestroy: function() {\r\n\t\tvar me = this;\r\n\t\tvar canvas = me.canvas;\r\n\t\tvar i, ilen;\r\n\r\n\t\tme.stop();\r\n\r\n\t\t// dataset controllers need to cleanup associated data\r\n\t\tfor (i = 0, ilen = me.data.datasets.length; i < ilen; ++i) {\r\n\t\t\tme.destroyDatasetMeta(i);\r\n\t\t}\r\n\r\n\t\tif (canvas) {\r\n\t\t\tme.unbindEvents();\r\n\t\t\thelpers$1.canvas.clear(me);\r\n\t\t\tplatform.releaseContext(me.ctx);\r\n\t\t\tme.canvas = null;\r\n\t\t\tme.ctx = null;\r\n\t\t}\r\n\r\n\t\tcore_plugins.notify(me, 'destroy');\r\n\r\n\t\tdelete Chart.instances[me.id];\r\n\t},\r\n\r\n\ttoBase64Image: function() {\r\n\t\treturn this.canvas.toDataURL.apply(this.canvas, arguments);\r\n\t},\r\n\r\n\tinitToolTip: function() {\r\n\t\tvar me = this;\r\n\t\tme.tooltip = new core_tooltip({\r\n\t\t\t_chart: me,\r\n\t\t\t_chartInstance: me, // deprecated, backward compatibility\r\n\t\t\t_data: me.data,\r\n\t\t\t_options: me.options.tooltips\r\n\t\t}, me);\r\n\t},\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n\tbindEvents: function() {\r\n\t\tvar me = this;\r\n\t\tvar listeners = me._listeners = {};\r\n\t\tvar listener = function() {\r\n\t\t\tme.eventHandler.apply(me, arguments);\r\n\t\t};\r\n\r\n\t\thelpers$1.each(me.options.events, function(type) {\r\n\t\t\tplatform.addEventListener(me, type, listener);\r\n\t\t\tlisteners[type] = listener;\r\n\t\t});\r\n\r\n\t\t// Elements used to detect size change should not be injected for non responsive charts.\r\n\t\t// See https://github.com/chartjs/Chart.js/issues/2210\r\n\t\tif (me.options.responsive) {\r\n\t\t\tlistener = function() {\r\n\t\t\t\tme.resize();\r\n\t\t\t};\r\n\r\n\t\t\tplatform.addEventListener(me, 'resize', listener);\r\n\t\t\tlisteners.resize = listener;\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n\tunbindEvents: function() {\r\n\t\tvar me = this;\r\n\t\tvar listeners = me._listeners;\r\n\t\tif (!listeners) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tdelete me._listeners;\r\n\t\thelpers$1.each(listeners, function(listener, type) {\r\n\t\t\tplatform.removeEventListener(me, type, listener);\r\n\t\t});\r\n\t},\r\n\r\n\tupdateHoverStyle: function(elements, mode, enabled) {\r\n\t\tvar prefix = enabled ? 'set' : 'remove';\r\n\t\tvar element, i, ilen;\r\n\r\n\t\tfor (i = 0, ilen = elements.length; i < ilen; ++i) {\r\n\t\t\telement = elements[i];\r\n\t\t\tif (element) {\r\n\t\t\t\tthis.getDatasetMeta(element._datasetIndex).controller[prefix + 'HoverStyle'](element);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (mode === 'dataset') {\r\n\t\t\tthis.getDatasetMeta(elements[0]._datasetIndex).controller['_' + prefix + 'DatasetHoverStyle']();\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n\teventHandler: function(e) {\r\n\t\tvar me = this;\r\n\t\tvar tooltip = me.tooltip;\r\n\r\n\t\tif (core_plugins.notify(me, 'beforeEvent', [e]) === false) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Buffer any update calls so that renders do not occur\r\n\t\tme._bufferedRender = true;\r\n\t\tme._bufferedRequest = null;\r\n\r\n\t\tvar changed = me.handleEvent(e);\r\n\t\t// for smooth tooltip animations issue #4989\r\n\t\t// the tooltip should be the source of change\r\n\t\t// Animation check workaround:\r\n\t\t// tooltip._start will be null when tooltip isn't animating\r\n\t\tif (tooltip) {\r\n\t\t\tchanged = tooltip._start\r\n\t\t\t\t? tooltip.handleEvent(e)\r\n\t\t\t\t: changed | tooltip.handleEvent(e);\r\n\t\t}\r\n\r\n\t\tcore_plugins.notify(me, 'afterEvent', [e]);\r\n\r\n\t\tvar bufferedRequest = me._bufferedRequest;\r\n\t\tif (bufferedRequest) {\r\n\t\t\t// If we have an update that was triggered, we need to do a normal render\r\n\t\t\tme.render(bufferedRequest);\r\n\t\t} else if (changed && !me.animating) {\r\n\t\t\t// If entering, leaving, or changing elements, animate the change via pivot\r\n\t\t\tme.stop();\r\n\r\n\t\t\t// We only need to render at this point. Updating will cause scales to be\r\n\t\t\t// recomputed generating flicker & using more memory than necessary.\r\n\t\t\tme.render({\r\n\t\t\t\tduration: me.options.hover.animationDuration,\r\n\t\t\t\tlazy: true\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tme._bufferedRender = false;\r\n\t\tme._bufferedRequest = null;\r\n\r\n\t\treturn me;\r\n\t},\r\n\r\n\t/**\r\n\t * Handle an event\r\n\t * @private\r\n\t * @param {IEvent} event the event to handle\r\n\t * @return {boolean} true if the chart needs to re-render\r\n\t */\r\n\thandleEvent: function(e) {\r\n\t\tvar me = this;\r\n\t\tvar options = me.options || {};\r\n\t\tvar hoverOptions = options.hover;\r\n\t\tvar changed = false;\r\n\r\n\t\tme.lastActive = me.lastActive || [];\r\n\r\n\t\t// Find Active Elements for hover and tooltips\r\n\t\tif (e.type === 'mouseout') {\r\n\t\t\tme.active = [];\r\n\t\t} else {\r\n\t\t\tme.active = me.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions);\r\n\t\t}\r\n\r\n\t\t// Invoke onHover hook\r\n\t\t// Need to call with native event here to not break backwards compatibility\r\n\t\thelpers$1.callback(options.onHover || options.hover.onHover, [e.native, me.active], me);\r\n\r\n\t\tif (e.type === 'mouseup' || e.type === 'click') {\r\n\t\t\tif (options.onClick) {\r\n\t\t\t\t// Use e.native here for backwards compatibility\r\n\t\t\t\toptions.onClick.call(me, e.native, me.active);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Remove styling for last active (even if it may still be active)\r\n\t\tif (me.lastActive.length) {\r\n\t\t\tme.updateHoverStyle(me.lastActive, hoverOptions.mode, false);\r\n\t\t}\r\n\r\n\t\t// Built in hover styling\r\n\t\tif (me.active.length && hoverOptions.mode) {\r\n\t\t\tme.updateHoverStyle(me.active, hoverOptions.mode, true);\r\n\t\t}\r\n\r\n\t\tchanged = !helpers$1.arrayEquals(me.active, me.lastActive);\r\n\r\n\t\t// Remember Last Actives\r\n\t\tme.lastActive = me.active;\r\n\r\n\t\treturn changed;\r\n\t}\r\n});\r\n\r\n/**\r\n * NOTE(SB) We actually don't use this container anymore but we need to keep it\r\n * for backward compatibility. Though, it can still be useful for plugins that\r\n * would need to work on multiple charts?!\r\n */\r\nChart.instances = {};\r\n\r\nvar core_controller = Chart;\r\n\r\n// DEPRECATIONS\r\n\r\n/**\r\n * Provided for backward compatibility, use Chart instead.\r\n * @class Chart.Controller\r\n * @deprecated since version 2.6\r\n * @todo remove at version 3\r\n * @private\r\n */\r\nChart.Controller = Chart;\r\n\r\n/**\r\n * Provided for backward compatibility, not available anymore.\r\n * @namespace Chart\r\n * @deprecated since version 2.8\r\n * @todo remove at version 3\r\n * @private\r\n */\r\nChart.types = {};\r\n\r\n/**\r\n * Provided for backward compatibility, not available anymore.\r\n * @namespace Chart.helpers.configMerge\r\n * @deprecated since version 2.8.0\r\n * @todo remove at version 3\r\n * @private\r\n */\r\nhelpers$1.configMerge = mergeConfig;\r\n\r\n/**\r\n * Provided for backward compatibility, not available anymore.\r\n * @namespace Chart.helpers.scaleMerge\r\n * @deprecated since version 2.8.0\r\n * @todo remove at version 3\r\n * @private\r\n */\r\nhelpers$1.scaleMerge = mergeScaleConfig;\n\nvar core_helpers = function() {\r\n\r\n\t// -- Basic js utility methods\r\n\r\n\thelpers$1.where = function(collection, filterCallback) {\r\n\t\tif (helpers$1.isArray(collection) && Array.prototype.filter) {\r\n\t\t\treturn collection.filter(filterCallback);\r\n\t\t}\r\n\t\tvar filtered = [];\r\n\r\n\t\thelpers$1.each(collection, function(item) {\r\n\t\t\tif (filterCallback(item)) {\r\n\t\t\t\tfiltered.push(item);\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\treturn filtered;\r\n\t};\r\n\thelpers$1.findIndex = Array.prototype.findIndex ?\r\n\t\tfunction(array, callback, scope) {\r\n\t\t\treturn array.findIndex(callback, scope);\r\n\t\t} :\r\n\t\tfunction(array, callback, scope) {\r\n\t\t\tscope = scope === undefined ? array : scope;\r\n\t\t\tfor (var i = 0, ilen = array.length; i < ilen; ++i) {\r\n\t\t\t\tif (callback.call(scope, array[i], i, array)) {\r\n\t\t\t\t\treturn i;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn -1;\r\n\t\t};\r\n\thelpers$1.findNextWhere = function(arrayToSearch, filterCallback, startIndex) {\r\n\t\t// Default to start of the array\r\n\t\tif (helpers$1.isNullOrUndef(startIndex)) {\r\n\t\t\tstartIndex = -1;\r\n\t\t}\r\n\t\tfor (var i = startIndex + 1; i < arrayToSearch.length; i++) {\r\n\t\t\tvar currentItem = arrayToSearch[i];\r\n\t\t\tif (filterCallback(currentItem)) {\r\n\t\t\t\treturn currentItem;\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\thelpers$1.findPreviousWhere = function(arrayToSearch, filterCallback, startIndex) {\r\n\t\t// Default to end of the array\r\n\t\tif (helpers$1.isNullOrUndef(startIndex)) {\r\n\t\t\tstartIndex = arrayToSearch.length;\r\n\t\t}\r\n\t\tfor (var i = startIndex - 1; i >= 0; i--) {\r\n\t\t\tvar currentItem = arrayToSearch[i];\r\n\t\t\tif (filterCallback(currentItem)) {\r\n\t\t\t\treturn currentItem;\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\r\n\t// -- Math methods\r\n\thelpers$1.isNumber = function(n) {\r\n\t\treturn !isNaN(parseFloat(n)) && isFinite(n);\r\n\t};\r\n\thelpers$1.almostEquals = function(x, y, epsilon) {\r\n\t\treturn Math.abs(x - y) < epsilon;\r\n\t};\r\n\thelpers$1.almostWhole = function(x, epsilon) {\r\n\t\tvar rounded = Math.round(x);\r\n\t\treturn ((rounded - epsilon) <= x) && ((rounded + epsilon) >= x);\r\n\t};\r\n\thelpers$1.max = function(array) {\r\n\t\treturn array.reduce(function(max, value) {\r\n\t\t\tif (!isNaN(value)) {\r\n\t\t\t\treturn Math.max(max, value);\r\n\t\t\t}\r\n\t\t\treturn max;\r\n\t\t}, Number.NEGATIVE_INFINITY);\r\n\t};\r\n\thelpers$1.min = function(array) {\r\n\t\treturn array.reduce(function(min, value) {\r\n\t\t\tif (!isNaN(value)) {\r\n\t\t\t\treturn Math.min(min, value);\r\n\t\t\t}\r\n\t\t\treturn min;\r\n\t\t}, Number.POSITIVE_INFINITY);\r\n\t};\r\n\thelpers$1.sign = Math.sign ?\r\n\t\tfunction(x) {\r\n\t\t\treturn Math.sign(x);\r\n\t\t} :\r\n\t\tfunction(x) {\r\n\t\t\tx = +x; // convert to a number\r\n\t\t\tif (x === 0 || isNaN(x)) {\r\n\t\t\t\treturn x;\r\n\t\t\t}\r\n\t\t\treturn x > 0 ? 1 : -1;\r\n\t\t};\r\n\thelpers$1.toRadians = function(degrees) {\r\n\t\treturn degrees * (Math.PI / 180);\r\n\t};\r\n\thelpers$1.toDegrees = function(radians) {\r\n\t\treturn radians * (180 / Math.PI);\r\n\t};\r\n\r\n\t/**\r\n\t * Returns the number of decimal places\r\n\t * i.e. the number of digits after the decimal point, of the value of this Number.\r\n\t * @param {number} x - A number.\r\n\t * @returns {number} The number of decimal places.\r\n\t * @private\r\n\t */\r\n\thelpers$1._decimalPlaces = function(x) {\r\n\t\tif (!helpers$1.isFinite(x)) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tvar e = 1;\r\n\t\tvar p = 0;\r\n\t\twhile (Math.round(x * e) / e !== x) {\r\n\t\t\te *= 10;\r\n\t\t\tp++;\r\n\t\t}\r\n\t\treturn p;\r\n\t};\r\n\r\n\t// Gets the angle from vertical upright to the point about a centre.\r\n\thelpers$1.getAngleFromPoint = function(centrePoint, anglePoint) {\r\n\t\tvar distanceFromXCenter = anglePoint.x - centrePoint.x;\r\n\t\tvar distanceFromYCenter = anglePoint.y - centrePoint.y;\r\n\t\tvar radialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter);\r\n\r\n\t\tvar angle = Math.atan2(distanceFromYCenter, distanceFromXCenter);\r\n\r\n\t\tif (angle < (-0.5 * Math.PI)) {\r\n\t\t\tangle += 2.0 * Math.PI; // make sure the returned angle is in the range of (-PI/2, 3PI/2]\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\tangle: angle,\r\n\t\t\tdistance: radialDistanceFromCenter\r\n\t\t};\r\n\t};\r\n\thelpers$1.distanceBetweenPoints = function(pt1, pt2) {\r\n\t\treturn Math.sqrt(Math.pow(pt2.x - pt1.x, 2) + Math.pow(pt2.y - pt1.y, 2));\r\n\t};\r\n\r\n\t/**\r\n\t * Provided for backward compatibility, not available anymore\r\n\t * @function Chart.helpers.aliasPixel\r\n\t * @deprecated since version 2.8.0\r\n\t * @todo remove at version 3\r\n\t */\r\n\thelpers$1.aliasPixel = function(pixelWidth) {\r\n\t\treturn (pixelWidth % 2 === 0) ? 0 : 0.5;\r\n\t};\r\n\r\n\t/**\r\n\t * Returns the aligned pixel value to avoid anti-aliasing blur\r\n\t * @param {Chart} chart - The chart instance.\r\n\t * @param {number} pixel - A pixel value.\r\n\t * @param {number} width - The width of the element.\r\n\t * @returns {number} The aligned pixel value.\r\n\t * @private\r\n\t */\r\n\thelpers$1._alignPixel = function(chart, pixel, width) {\r\n\t\tvar devicePixelRatio = chart.currentDevicePixelRatio;\r\n\t\tvar halfWidth = width / 2;\r\n\t\treturn Math.round((pixel - halfWidth) * devicePixelRatio) / devicePixelRatio + halfWidth;\r\n\t};\r\n\r\n\thelpers$1.splineCurve = function(firstPoint, middlePoint, afterPoint, t) {\r\n\t\t// Props to Rob Spencer at scaled innovation for his post on splining between points\r\n\t\t// http://scaledinnovation.com/analytics/splines/aboutSplines.html\r\n\r\n\t\t// This function must also respect \"skipped\" points\r\n\r\n\t\tvar previous = firstPoint.skip ? middlePoint : firstPoint;\r\n\t\tvar current = middlePoint;\r\n\t\tvar next = afterPoint.skip ? middlePoint : afterPoint;\r\n\r\n\t\tvar d01 = Math.sqrt(Math.pow(current.x - previous.x, 2) + Math.pow(current.y - previous.y, 2));\r\n\t\tvar d12 = Math.sqrt(Math.pow(next.x - current.x, 2) + Math.pow(next.y - current.y, 2));\r\n\r\n\t\tvar s01 = d01 / (d01 + d12);\r\n\t\tvar s12 = d12 / (d01 + d12);\r\n\r\n\t\t// If all points are the same, s01 & s02 will be inf\r\n\t\ts01 = isNaN(s01) ? 0 : s01;\r\n\t\ts12 = isNaN(s12) ? 0 : s12;\r\n\r\n\t\tvar fa = t * s01; // scaling factor for triangle Ta\r\n\t\tvar fb = t * s12;\r\n\r\n\t\treturn {\r\n\t\t\tprevious: {\r\n\t\t\t\tx: current.x - fa * (next.x - previous.x),\r\n\t\t\t\ty: current.y - fa * (next.y - previous.y)\r\n\t\t\t},\r\n\t\t\tnext: {\r\n\t\t\t\tx: current.x + fb * (next.x - previous.x),\r\n\t\t\t\ty: current.y + fb * (next.y - previous.y)\r\n\t\t\t}\r\n\t\t};\r\n\t};\r\n\thelpers$1.EPSILON = Number.EPSILON || 1e-14;\r\n\thelpers$1.splineCurveMonotone = function(points) {\r\n\t\t// This function calculates Bézier control points in a similar way than |splineCurve|,\r\n\t\t// but preserves monotonicity of the provided data and ensures no local extremums are added\r\n\t\t// between the dataset discrete points due to the interpolation.\r\n\t\t// See : https://en.wikipedia.org/wiki/Monotone_cubic_interpolation\r\n\r\n\t\tvar pointsWithTangents = (points || []).map(function(point) {\r\n\t\t\treturn {\r\n\t\t\t\tmodel: point._model,\r\n\t\t\t\tdeltaK: 0,\r\n\t\t\t\tmK: 0\r\n\t\t\t};\r\n\t\t});\r\n\r\n\t\t// Calculate slopes (deltaK) and initialize tangents (mK)\r\n\t\tvar pointsLen = pointsWithTangents.length;\r\n\t\tvar i, pointBefore, pointCurrent, pointAfter;\r\n\t\tfor (i = 0; i < pointsLen; ++i) {\r\n\t\t\tpointCurrent = pointsWithTangents[i];\r\n\t\t\tif (pointCurrent.model.skip) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tpointBefore = i > 0 ? pointsWithTangents[i - 1] : null;\r\n\t\t\tpointAfter = i < pointsLen - 1 ? pointsWithTangents[i + 1] : null;\r\n\t\t\tif (pointAfter && !pointAfter.model.skip) {\r\n\t\t\t\tvar slopeDeltaX = (pointAfter.model.x - pointCurrent.model.x);\r\n\r\n\t\t\t\t// In the case of two points that appear at the same x pixel, slopeDeltaX is 0\r\n\t\t\t\tpointCurrent.deltaK = slopeDeltaX !== 0 ? (pointAfter.model.y - pointCurrent.model.y) / slopeDeltaX : 0;\r\n\t\t\t}\r\n\r\n\t\t\tif (!pointBefore || pointBefore.model.skip) {\r\n\t\t\t\tpointCurrent.mK = pointCurrent.deltaK;\r\n\t\t\t} else if (!pointAfter || pointAfter.model.skip) {\r\n\t\t\t\tpointCurrent.mK = pointBefore.deltaK;\r\n\t\t\t} else if (this.sign(pointBefore.deltaK) !== this.sign(pointCurrent.deltaK)) {\r\n\t\t\t\tpointCurrent.mK = 0;\r\n\t\t\t} else {\r\n\t\t\t\tpointCurrent.mK = (pointBefore.deltaK + pointCurrent.deltaK) / 2;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Adjust tangents to ensure monotonic properties\r\n\t\tvar alphaK, betaK, tauK, squaredMagnitude;\r\n\t\tfor (i = 0; i < pointsLen - 1; ++i) {\r\n\t\t\tpointCurrent = pointsWithTangents[i];\r\n\t\t\tpointAfter = pointsWithTangents[i + 1];\r\n\t\t\tif (pointCurrent.model.skip || pointAfter.model.skip) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tif (helpers$1.almostEquals(pointCurrent.deltaK, 0, this.EPSILON)) {\r\n\t\t\t\tpointCurrent.mK = pointAfter.mK = 0;\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\talphaK = pointCurrent.mK / pointCurrent.deltaK;\r\n\t\t\tbetaK = pointAfter.mK / pointCurrent.deltaK;\r\n\t\t\tsquaredMagnitude = Math.pow(alphaK, 2) + Math.pow(betaK, 2);\r\n\t\t\tif (squaredMagnitude <= 9) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\ttauK = 3 / Math.sqrt(squaredMagnitude);\r\n\t\t\tpointCurrent.mK = alphaK * tauK * pointCurrent.deltaK;\r\n\t\t\tpointAfter.mK = betaK * tauK * pointCurrent.deltaK;\r\n\t\t}\r\n\r\n\t\t// Compute control points\r\n\t\tvar deltaX;\r\n\t\tfor (i = 0; i < pointsLen; ++i) {\r\n\t\t\tpointCurrent = pointsWithTangents[i];\r\n\t\t\tif (pointCurrent.model.skip) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tpointBefore = i > 0 ? pointsWithTangents[i - 1] : null;\r\n\t\t\tpointAfter = i < pointsLen - 1 ? pointsWithTangents[i + 1] : null;\r\n\t\t\tif (pointBefore && !pointBefore.model.skip) {\r\n\t\t\t\tdeltaX = (pointCurrent.model.x - pointBefore.model.x) / 3;\r\n\t\t\t\tpointCurrent.model.controlPointPreviousX = pointCurrent.model.x - deltaX;\r\n\t\t\t\tpointCurrent.model.controlPointPreviousY = pointCurrent.model.y - deltaX * pointCurrent.mK;\r\n\t\t\t}\r\n\t\t\tif (pointAfter && !pointAfter.model.skip) {\r\n\t\t\t\tdeltaX = (pointAfter.model.x - pointCurrent.model.x) / 3;\r\n\t\t\t\tpointCurrent.model.controlPointNextX = pointCurrent.model.x + deltaX;\r\n\t\t\t\tpointCurrent.model.controlPointNextY = pointCurrent.model.y + deltaX * pointCurrent.mK;\r\n\t\t\t}\r\n\t\t}\r\n\t};\r\n\thelpers$1.nextItem = function(collection, index, loop) {\r\n\t\tif (loop) {\r\n\t\t\treturn index >= collection.length - 1 ? collection[0] : collection[index + 1];\r\n\t\t}\r\n\t\treturn index >= collection.length - 1 ? collection[collection.length - 1] : collection[index + 1];\r\n\t};\r\n\thelpers$1.previousItem = function(collection, index, loop) {\r\n\t\tif (loop) {\r\n\t\t\treturn index <= 0 ? collection[collection.length - 1] : collection[index - 1];\r\n\t\t}\r\n\t\treturn index <= 0 ? collection[0] : collection[index - 1];\r\n\t};\r\n\t// Implementation of the nice number algorithm used in determining where axis labels will go\r\n\thelpers$1.niceNum = function(range, round) {\r\n\t\tvar exponent = Math.floor(helpers$1.log10(range));\r\n\t\tvar fraction = range / Math.pow(10, exponent);\r\n\t\tvar niceFraction;\r\n\r\n\t\tif (round) {\r\n\t\t\tif (fraction < 1.5) {\r\n\t\t\t\tniceFraction = 1;\r\n\t\t\t} else if (fraction < 3) {\r\n\t\t\t\tniceFraction = 2;\r\n\t\t\t} else if (fraction < 7) {\r\n\t\t\t\tniceFraction = 5;\r\n\t\t\t} else {\r\n\t\t\t\tniceFraction = 10;\r\n\t\t\t}\r\n\t\t} else if (fraction <= 1.0) {\r\n\t\t\tniceFraction = 1;\r\n\t\t} else if (fraction <= 2) {\r\n\t\t\tniceFraction = 2;\r\n\t\t} else if (fraction <= 5) {\r\n\t\t\tniceFraction = 5;\r\n\t\t} else {\r\n\t\t\tniceFraction = 10;\r\n\t\t}\r\n\r\n\t\treturn niceFraction * Math.pow(10, exponent);\r\n\t};\r\n\t// Request animation polyfill - https://www.paulirish.com/2011/requestanimationframe-for-smart-animating/\r\n\thelpers$1.requestAnimFrame = (function() {\r\n\t\tif (typeof window === 'undefined') {\r\n\t\t\treturn function(callback) {\r\n\t\t\t\tcallback();\r\n\t\t\t};\r\n\t\t}\r\n\t\treturn window.requestAnimationFrame ||\r\n\t\t\twindow.webkitRequestAnimationFrame ||\r\n\t\t\twindow.mozRequestAnimationFrame ||\r\n\t\t\twindow.oRequestAnimationFrame ||\r\n\t\t\twindow.msRequestAnimationFrame ||\r\n\t\t\tfunction(callback) {\r\n\t\t\t\treturn window.setTimeout(callback, 1000 / 60);\r\n\t\t\t};\r\n\t}());\r\n\t// -- DOM methods\r\n\thelpers$1.getRelativePosition = function(evt, chart) {\r\n\t\tvar mouseX, mouseY;\r\n\t\tvar e = evt.originalEvent || evt;\r\n\t\tvar canvas = evt.target || evt.srcElement;\r\n\t\tvar boundingRect = canvas.getBoundingClientRect();\r\n\r\n\t\tvar touches = e.touches;\r\n\t\tif (touches && touches.length > 0) {\r\n\t\t\tmouseX = touches[0].clientX;\r\n\t\t\tmouseY = touches[0].clientY;\r\n\r\n\t\t} else {\r\n\t\t\tmouseX = e.clientX;\r\n\t\t\tmouseY = e.clientY;\r\n\t\t}\r\n\r\n\t\t// Scale mouse coordinates into canvas coordinates\r\n\t\t// by following the pattern laid out by 'jerryj' in the comments of\r\n\t\t// https://www.html5canvastutorials.com/advanced/html5-canvas-mouse-coordinates/\r\n\t\tvar paddingLeft = parseFloat(helpers$1.getStyle(canvas, 'padding-left'));\r\n\t\tvar paddingTop = parseFloat(helpers$1.getStyle(canvas, 'padding-top'));\r\n\t\tvar paddingRight = parseFloat(helpers$1.getStyle(canvas, 'padding-right'));\r\n\t\tvar paddingBottom = parseFloat(helpers$1.getStyle(canvas, 'padding-bottom'));\r\n\t\tvar width = boundingRect.right - boundingRect.left - paddingLeft - paddingRight;\r\n\t\tvar height = boundingRect.bottom - boundingRect.top - paddingTop - paddingBottom;\r\n\r\n\t\t// We divide by the current device pixel ratio, because the canvas is scaled up by that amount in each direction. However\r\n\t\t// the backend model is in unscaled coordinates. Since we are going to deal with our model coordinates, we go back here\r\n\t\tmouseX = Math.round((mouseX - boundingRect.left - paddingLeft) / (width) * canvas.width / chart.currentDevicePixelRatio);\r\n\t\tmouseY = Math.round((mouseY - boundingRect.top - paddingTop) / (height) * canvas.height / chart.currentDevicePixelRatio);\r\n\r\n\t\treturn {\r\n\t\t\tx: mouseX,\r\n\t\t\ty: mouseY\r\n\t\t};\r\n\r\n\t};\r\n\r\n\t// Private helper function to convert max-width/max-height values that may be percentages into a number\r\n\tfunction parseMaxStyle(styleValue, node, parentProperty) {\r\n\t\tvar valueInPixels;\r\n\t\tif (typeof styleValue === 'string') {\r\n\t\t\tvalueInPixels = parseInt(styleValue, 10);\r\n\r\n\t\t\tif (styleValue.indexOf('%') !== -1) {\r\n\t\t\t\t// percentage * size in dimension\r\n\t\t\t\tvalueInPixels = valueInPixels / 100 * node.parentNode[parentProperty];\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tvalueInPixels = styleValue;\r\n\t\t}\r\n\r\n\t\treturn valueInPixels;\r\n\t}\r\n\r\n\t/**\r\n\t * Returns if the given value contains an effective constraint.\r\n\t * @private\r\n\t */\r\n\tfunction isConstrainedValue(value) {\r\n\t\treturn value !== undefined && value !== null && value !== 'none';\r\n\t}\r\n\r\n\t/**\r\n\t * Returns the max width or height of the given DOM node in a cross-browser compatible fashion\r\n\t * @param {HTMLElement} domNode - the node to check the constraint on\r\n\t * @param {string} maxStyle - the style that defines the maximum for the direction we are using ('max-width' / 'max-height')\r\n\t * @param {string} percentageProperty - property of parent to use when calculating width as a percentage\r\n\t * @see {@link https://www.nathanaeljones.com/blog/2013/reading-max-width-cross-browser}\r\n\t */\r\n\tfunction getConstraintDimension(domNode, maxStyle, percentageProperty) {\r\n\t\tvar view = document.defaultView;\r\n\t\tvar parentNode = helpers$1._getParentNode(domNode);\r\n\t\tvar constrainedNode = view.getComputedStyle(domNode)[maxStyle];\r\n\t\tvar constrainedContainer = view.getComputedStyle(parentNode)[maxStyle];\r\n\t\tvar hasCNode = isConstrainedValue(constrainedNode);\r\n\t\tvar hasCContainer = isConstrainedValue(constrainedContainer);\r\n\t\tvar infinity = Number.POSITIVE_INFINITY;\r\n\r\n\t\tif (hasCNode || hasCContainer) {\r\n\t\t\treturn Math.min(\r\n\t\t\t\thasCNode ? parseMaxStyle(constrainedNode, domNode, percentageProperty) : infinity,\r\n\t\t\t\thasCContainer ? parseMaxStyle(constrainedContainer, parentNode, percentageProperty) : infinity);\r\n\t\t}\r\n\r\n\t\treturn 'none';\r\n\t}\r\n\t// returns Number or undefined if no constraint\r\n\thelpers$1.getConstraintWidth = function(domNode) {\r\n\t\treturn getConstraintDimension(domNode, 'max-width', 'clientWidth');\r\n\t};\r\n\t// returns Number or undefined if no constraint\r\n\thelpers$1.getConstraintHeight = function(domNode) {\r\n\t\treturn getConstraintDimension(domNode, 'max-height', 'clientHeight');\r\n\t};\r\n\t/**\r\n\t * @private\r\n \t */\r\n\thelpers$1._calculatePadding = function(container, padding, parentDimension) {\r\n\t\tpadding = helpers$1.getStyle(container, padding);\r\n\r\n\t\treturn padding.indexOf('%') > -1 ? parentDimension * parseInt(padding, 10) / 100 : parseInt(padding, 10);\r\n\t};\r\n\t/**\r\n\t * @private\r\n\t */\r\n\thelpers$1._getParentNode = function(domNode) {\r\n\t\tvar parent = domNode.parentNode;\r\n\t\tif (parent && parent.toString() === '[object ShadowRoot]') {\r\n\t\t\tparent = parent.host;\r\n\t\t}\r\n\t\treturn parent;\r\n\t};\r\n\thelpers$1.getMaximumWidth = function(domNode) {\r\n\t\tvar container = helpers$1._getParentNode(domNode);\r\n\t\tif (!container) {\r\n\t\t\treturn domNode.clientWidth;\r\n\t\t}\r\n\r\n\t\tvar clientWidth = container.clientWidth;\r\n\t\tvar paddingLeft = helpers$1._calculatePadding(container, 'padding-left', clientWidth);\r\n\t\tvar paddingRight = helpers$1._calculatePadding(container, 'padding-right', clientWidth);\r\n\r\n\t\tvar w = clientWidth - paddingLeft - paddingRight;\r\n\t\tvar cw = helpers$1.getConstraintWidth(domNode);\r\n\t\treturn isNaN(cw) ? w : Math.min(w, cw);\r\n\t};\r\n\thelpers$1.getMaximumHeight = function(domNode) {\r\n\t\tvar container = helpers$1._getParentNode(domNode);\r\n\t\tif (!container) {\r\n\t\t\treturn domNode.clientHeight;\r\n\t\t}\r\n\r\n\t\tvar clientHeight = container.clientHeight;\r\n\t\tvar paddingTop = helpers$1._calculatePadding(container, 'padding-top', clientHeight);\r\n\t\tvar paddingBottom = helpers$1._calculatePadding(container, 'padding-bottom', clientHeight);\r\n\r\n\t\tvar h = clientHeight - paddingTop - paddingBottom;\r\n\t\tvar ch = helpers$1.getConstraintHeight(domNode);\r\n\t\treturn isNaN(ch) ? h : Math.min(h, ch);\r\n\t};\r\n\thelpers$1.getStyle = function(el, property) {\r\n\t\treturn el.currentStyle ?\r\n\t\t\tel.currentStyle[property] :\r\n\t\t\tdocument.defaultView.getComputedStyle(el, null).getPropertyValue(property);\r\n\t};\r\n\thelpers$1.retinaScale = function(chart, forceRatio) {\r\n\t\tvar pixelRatio = chart.currentDevicePixelRatio = forceRatio || (typeof window !== 'undefined' && window.devicePixelRatio) || 1;\r\n\t\tif (pixelRatio === 1) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tvar canvas = chart.canvas;\r\n\t\tvar height = chart.height;\r\n\t\tvar width = chart.width;\r\n\r\n\t\tcanvas.height = height * pixelRatio;\r\n\t\tcanvas.width = width * pixelRatio;\r\n\t\tchart.ctx.scale(pixelRatio, pixelRatio);\r\n\r\n\t\t// If no style has been set on the canvas, the render size is used as display size,\r\n\t\t// making the chart visually bigger, so let's enforce it to the \"correct\" values.\r\n\t\t// See https://github.com/chartjs/Chart.js/issues/3575\r\n\t\tif (!canvas.style.height && !canvas.style.width) {\r\n\t\t\tcanvas.style.height = height + 'px';\r\n\t\t\tcanvas.style.width = width + 'px';\r\n\t\t}\r\n\t};\r\n\t// -- Canvas methods\r\n\thelpers$1.fontString = function(pixelSize, fontStyle, fontFamily) {\r\n\t\treturn fontStyle + ' ' + pixelSize + 'px ' + fontFamily;\r\n\t};\r\n\thelpers$1.longestText = function(ctx, font, arrayOfThings, cache) {\r\n\t\tcache = cache || {};\r\n\t\tvar data = cache.data = cache.data || {};\r\n\t\tvar gc = cache.garbageCollect = cache.garbageCollect || [];\r\n\r\n\t\tif (cache.font !== font) {\r\n\t\t\tdata = cache.data = {};\r\n\t\t\tgc = cache.garbageCollect = [];\r\n\t\t\tcache.font = font;\r\n\t\t}\r\n\r\n\t\tctx.font = font;\r\n\t\tvar longest = 0;\r\n\t\tvar ilen = arrayOfThings.length;\r\n\t\tvar i, j, jlen, thing, nestedThing;\r\n\t\tfor (i = 0; i < ilen; i++) {\r\n\t\t\tthing = arrayOfThings[i];\r\n\r\n\t\t\t// Undefined strings and arrays should not be measured\r\n\t\t\tif (thing !== undefined && thing !== null && helpers$1.isArray(thing) !== true) {\r\n\t\t\t\tlongest = helpers$1.measureText(ctx, data, gc, longest, thing);\r\n\t\t\t} else if (helpers$1.isArray(thing)) {\r\n\t\t\t\t// if it is an array lets measure each element\r\n\t\t\t\t// to do maybe simplify this function a bit so we can do this more recursively?\r\n\t\t\t\tfor (j = 0, jlen = thing.length; j < jlen; j++) {\r\n\t\t\t\t\tnestedThing = thing[j];\r\n\t\t\t\t\t// Undefined strings and arrays should not be measured\r\n\t\t\t\t\tif (nestedThing !== undefined && nestedThing !== null && !helpers$1.isArray(nestedThing)) {\r\n\t\t\t\t\t\tlongest = helpers$1.measureText(ctx, data, gc, longest, nestedThing);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvar gcLen = gc.length / 2;\r\n\t\tif (gcLen > arrayOfThings.length) {\r\n\t\t\tfor (i = 0; i < gcLen; i++) {\r\n\t\t\t\tdelete data[gc[i]];\r\n\t\t\t}\r\n\t\t\tgc.splice(0, gcLen);\r\n\t\t}\r\n\t\treturn longest;\r\n\t};\r\n\thelpers$1.measureText = function(ctx, data, gc, longest, string) {\r\n\t\tvar textWidth = data[string];\r\n\t\tif (!textWidth) {\r\n\t\t\ttextWidth = data[string] = ctx.measureText(string).width;\r\n\t\t\tgc.push(string);\r\n\t\t}\r\n\t\tif (textWidth > longest) {\r\n\t\t\tlongest = textWidth;\r\n\t\t}\r\n\t\treturn longest;\r\n\t};\r\n\r\n\t/**\r\n\t * @deprecated\r\n\t */\r\n\thelpers$1.numberOfLabelLines = function(arrayOfThings) {\r\n\t\tvar numberOfLines = 1;\r\n\t\thelpers$1.each(arrayOfThings, function(thing) {\r\n\t\t\tif (helpers$1.isArray(thing)) {\r\n\t\t\t\tif (thing.length > numberOfLines) {\r\n\t\t\t\t\tnumberOfLines = thing.length;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\t\treturn numberOfLines;\r\n\t};\r\n\r\n\thelpers$1.color = !chartjsColor ?\r\n\t\tfunction(value) {\r\n\t\t\tconsole.error('Color.js not found!');\r\n\t\t\treturn value;\r\n\t\t} :\r\n\t\tfunction(value) {\r\n\t\t\t/* global CanvasGradient */\r\n\t\t\tif (value instanceof CanvasGradient) {\r\n\t\t\t\tvalue = core_defaults.global.defaultColor;\r\n\t\t\t}\r\n\r\n\t\t\treturn chartjsColor(value);\r\n\t\t};\r\n\r\n\thelpers$1.getHoverColor = function(colorValue) {\r\n\t\t/* global CanvasPattern */\r\n\t\treturn (colorValue instanceof CanvasPattern || colorValue instanceof CanvasGradient) ?\r\n\t\t\tcolorValue :\r\n\t\t\thelpers$1.color(colorValue).saturate(0.5).darken(0.1).rgbString();\r\n\t};\r\n};\n\nfunction abstract() {\r\n\tthrow new Error(\r\n\t\t'This method is not implemented: either no adapter can ' +\r\n\t\t'be found or an incomplete integration was provided.'\r\n\t);\r\n}\r\n\r\n/**\r\n * Date adapter (current used by the time scale)\r\n * @namespace Chart._adapters._date\r\n * @memberof Chart._adapters\r\n * @private\r\n */\r\n\r\n/**\r\n * Currently supported unit string values.\r\n * @typedef {('millisecond'|'second'|'minute'|'hour'|'day'|'week'|'month'|'quarter'|'year')}\r\n * @memberof Chart._adapters._date\r\n * @name Unit\r\n */\r\n\r\n/**\r\n * @class\r\n */\r\nfunction DateAdapter(options) {\r\n\tthis.options = options || {};\r\n}\r\n\r\nhelpers$1.extend(DateAdapter.prototype, /** @lends DateAdapter */ {\r\n\t/**\r\n\t * Returns a map of time formats for the supported formatting units defined\r\n\t * in Unit as well as 'datetime' representing a detailed date/time string.\r\n\t * @returns {{string: string}}\r\n\t */\r\n\tformats: abstract,\r\n\r\n\t/**\r\n\t * Parses the given `value` and return the associated timestamp.\r\n\t * @param {any} value - the value to parse (usually comes from the data)\r\n\t * @param {string} [format] - the expected data format\r\n\t * @returns {(number|null)}\r\n\t * @function\r\n\t */\r\n\tparse: abstract,\r\n\r\n\t/**\r\n\t * Returns the formatted date in the specified `format` for a given `timestamp`.\r\n\t * @param {number} timestamp - the timestamp to format\r\n\t * @param {string} format - the date/time token\r\n\t * @return {string}\r\n\t * @function\r\n\t */\r\n\tformat: abstract,\r\n\r\n\t/**\r\n\t * Adds the specified `amount` of `unit` to the given `timestamp`.\r\n\t * @param {number} timestamp - the input timestamp\r\n\t * @param {number} amount - the amount to add\r\n\t * @param {Unit} unit - the unit as string\r\n\t * @return {number}\r\n\t * @function\r\n\t */\r\n\tadd: abstract,\r\n\r\n\t/**\r\n\t * Returns the number of `unit` between the given timestamps.\r\n\t * @param {number} max - the input timestamp (reference)\r\n\t * @param {number} min - the timestamp to substract\r\n\t * @param {Unit} unit - the unit as string\r\n\t * @return {number}\r\n\t * @function\r\n\t */\r\n\tdiff: abstract,\r\n\r\n\t/**\r\n\t * Returns start of `unit` for the given `timestamp`.\r\n\t * @param {number} timestamp - the input timestamp\r\n\t * @param {Unit} unit - the unit as string\r\n\t * @param {number} [weekday] - the ISO day of the week with 1 being Monday\r\n\t * and 7 being Sunday (only needed if param *unit* is `isoWeek`).\r\n\t * @function\r\n\t */\r\n\tstartOf: abstract,\r\n\r\n\t/**\r\n\t * Returns end of `unit` for the given `timestamp`.\r\n\t * @param {number} timestamp - the input timestamp\r\n\t * @param {Unit} unit - the unit as string\r\n\t * @function\r\n\t */\r\n\tendOf: abstract,\r\n\r\n\t// DEPRECATIONS\r\n\r\n\t/**\r\n\t * Provided for backward compatibility for scale.getValueForPixel(),\r\n\t * this method should be overridden only by the moment adapter.\r\n\t * @deprecated since version 2.8.0\r\n\t * @todo remove at version 3\r\n\t * @private\r\n\t */\r\n\t_create: function(value) {\r\n\t\treturn value;\r\n\t}\r\n});\r\n\r\nDateAdapter.override = function(members) {\r\n\thelpers$1.extend(DateAdapter.prototype, members);\r\n};\r\n\r\nvar _date = DateAdapter;\n\nvar core_adapters = {\n\t_date: _date\n};\n\n/**\r\n * Namespace to hold static tick generation functions\r\n * @namespace Chart.Ticks\r\n */\r\nvar core_ticks = {\r\n\t/**\r\n\t * Namespace to hold formatters for different types of ticks\r\n\t * @namespace Chart.Ticks.formatters\r\n\t */\r\n\tformatters: {\r\n\t\t/**\r\n\t\t * Formatter for value labels\r\n\t\t * @method Chart.Ticks.formatters.values\r\n\t\t * @param value the value to display\r\n\t\t * @return {string|string[]} the label to display\r\n\t\t */\r\n\t\tvalues: function(value) {\r\n\t\t\treturn helpers$1.isArray(value) ? value : '' + value;\r\n\t\t},\r\n\r\n\t\t/**\r\n\t\t * Formatter for linear numeric ticks\r\n\t\t * @method Chart.Ticks.formatters.linear\r\n\t\t * @param tickValue {number} the value to be formatted\r\n\t\t * @param index {number} the position of the tickValue parameter in the ticks array\r\n\t\t * @param ticks {number[]} the list of ticks being converted\r\n\t\t * @return {string} string representation of the tickValue parameter\r\n\t\t */\r\n\t\tlinear: function(tickValue, index, ticks) {\r\n\t\t\t// If we have lots of ticks, don't use the ones\r\n\t\t\tvar delta = ticks.length > 3 ? ticks[2] - ticks[1] : ticks[1] - ticks[0];\r\n\r\n\t\t\t// If we have a number like 2.5 as the delta, figure out how many decimal places we need\r\n\t\t\tif (Math.abs(delta) > 1) {\r\n\t\t\t\tif (tickValue !== Math.floor(tickValue)) {\r\n\t\t\t\t\t// not an integer\r\n\t\t\t\t\tdelta = tickValue - Math.floor(tickValue);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tvar logDelta = helpers$1.log10(Math.abs(delta));\r\n\t\t\tvar tickString = '';\r\n\r\n\t\t\tif (tickValue !== 0) {\r\n\t\t\t\tvar maxTick = Math.max(Math.abs(ticks[0]), Math.abs(ticks[ticks.length - 1]));\r\n\t\t\t\tif (maxTick < 1e-4) { // all ticks are small numbers; use scientific notation\r\n\t\t\t\t\tvar logTick = helpers$1.log10(Math.abs(tickValue));\r\n\t\t\t\t\tvar numExponential = Math.floor(logTick) - Math.floor(logDelta);\r\n\t\t\t\t\tnumExponential = Math.max(Math.min(numExponential, 20), 0);\r\n\t\t\t\t\ttickString = tickValue.toExponential(numExponential);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tvar numDecimal = -1 * Math.floor(logDelta);\r\n\t\t\t\t\tnumDecimal = Math.max(Math.min(numDecimal, 20), 0); // toFixed has a max of 20 decimal places\r\n\t\t\t\t\ttickString = tickValue.toFixed(numDecimal);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\ttickString = '0'; // never show decimal places for 0\r\n\t\t\t}\r\n\r\n\t\t\treturn tickString;\r\n\t\t},\r\n\r\n\t\tlogarithmic: function(tickValue, index, ticks) {\r\n\t\t\tvar remain = tickValue / (Math.pow(10, Math.floor(helpers$1.log10(tickValue))));\r\n\r\n\t\t\tif (tickValue === 0) {\r\n\t\t\t\treturn '0';\r\n\t\t\t} else if (remain === 1 || remain === 2 || remain === 5 || index === 0 || index === ticks.length - 1) {\r\n\t\t\t\treturn tickValue.toExponential();\r\n\t\t\t}\r\n\t\t\treturn '';\r\n\t\t}\r\n\t}\r\n};\n\nvar isArray = helpers$1.isArray;\r\nvar isNullOrUndef = helpers$1.isNullOrUndef;\r\nvar valueOrDefault$a = helpers$1.valueOrDefault;\r\nvar valueAtIndexOrDefault = helpers$1.valueAtIndexOrDefault;\r\n\r\ncore_defaults._set('scale', {\r\n\tdisplay: true,\r\n\tposition: 'left',\r\n\toffset: false,\r\n\r\n\t// grid line settings\r\n\tgridLines: {\r\n\t\tdisplay: true,\r\n\t\tcolor: 'rgba(0,0,0,0.1)',\r\n\t\tlineWidth: 1,\r\n\t\tdrawBorder: true,\r\n\t\tdrawOnChartArea: true,\r\n\t\tdrawTicks: true,\r\n\t\ttickMarkLength: 10,\r\n\t\tzeroLineWidth: 1,\r\n\t\tzeroLineColor: 'rgba(0,0,0,0.25)',\r\n\t\tzeroLineBorderDash: [],\r\n\t\tzeroLineBorderDashOffset: 0.0,\r\n\t\toffsetGridLines: false,\r\n\t\tborderDash: [],\r\n\t\tborderDashOffset: 0.0\r\n\t},\r\n\r\n\t// scale label\r\n\tscaleLabel: {\r\n\t\t// display property\r\n\t\tdisplay: false,\r\n\r\n\t\t// actual label\r\n\t\tlabelString: '',\r\n\r\n\t\t// top/bottom padding\r\n\t\tpadding: {\r\n\t\t\ttop: 4,\r\n\t\t\tbottom: 4\r\n\t\t}\r\n\t},\r\n\r\n\t// label settings\r\n\tticks: {\r\n\t\tbeginAtZero: false,\r\n\t\tminRotation: 0,\r\n\t\tmaxRotation: 50,\r\n\t\tmirror: false,\r\n\t\tpadding: 0,\r\n\t\treverse: false,\r\n\t\tdisplay: true,\r\n\t\tautoSkip: true,\r\n\t\tautoSkipPadding: 0,\r\n\t\tlabelOffset: 0,\r\n\t\t// We pass through arrays to be rendered as multiline labels, we convert Others to strings here.\r\n\t\tcallback: core_ticks.formatters.values,\r\n\t\tminor: {},\r\n\t\tmajor: {}\r\n\t}\r\n});\r\n\r\n/** Returns a new array containing numItems from arr */\r\nfunction sample(arr, numItems) {\r\n\tvar result = [];\r\n\tvar increment = arr.length / numItems;\r\n\tvar i = 0;\r\n\tvar len = arr.length;\r\n\r\n\tfor (; i < len; i += increment) {\r\n\t\tresult.push(arr[Math.floor(i)]);\r\n\t}\r\n\treturn result;\r\n}\r\n\r\nfunction getPixelForGridLine(scale, index, offsetGridLines) {\r\n\tvar length = scale.getTicks().length;\r\n\tvar validIndex = Math.min(index, length - 1);\r\n\tvar lineValue = scale.getPixelForTick(validIndex);\r\n\tvar start = scale._startPixel;\r\n\tvar end = scale._endPixel;\r\n\tvar epsilon = 1e-6; // 1e-6 is margin in pixels for accumulated error.\r\n\tvar offset;\r\n\r\n\tif (offsetGridLines) {\r\n\t\tif (length === 1) {\r\n\t\t\toffset = Math.max(lineValue - start, end - lineValue);\r\n\t\t} else if (index === 0) {\r\n\t\t\toffset = (scale.getPixelForTick(1) - lineValue) / 2;\r\n\t\t} else {\r\n\t\t\toffset = (lineValue - scale.getPixelForTick(validIndex - 1)) / 2;\r\n\t\t}\r\n\t\tlineValue += validIndex < index ? offset : -offset;\r\n\r\n\t\t// Return undefined if the pixel is out of the range\r\n\t\tif (lineValue < start - epsilon || lineValue > end + epsilon) {\r\n\t\t\treturn;\r\n\t\t}\r\n\t}\r\n\treturn lineValue;\r\n}\r\n\r\nfunction garbageCollect(caches, length) {\r\n\thelpers$1.each(caches, function(cache) {\r\n\t\tvar gc = cache.gc;\r\n\t\tvar gcLen = gc.length / 2;\r\n\t\tvar i;\r\n\t\tif (gcLen > length) {\r\n\t\t\tfor (i = 0; i < gcLen; ++i) {\r\n\t\t\t\tdelete cache.data[gc[i]];\r\n\t\t\t}\r\n\t\t\tgc.splice(0, gcLen);\r\n\t\t}\r\n\t});\r\n}\r\n\r\n/**\r\n * Returns {width, height, offset} objects for the first, last, widest, highest tick\r\n * labels where offset indicates the anchor point offset from the top in pixels.\r\n */\r\nfunction computeLabelSizes(ctx, tickFonts, ticks, caches) {\r\n\tvar length = ticks.length;\r\n\tvar widths = [];\r\n\tvar heights = [];\r\n\tvar offsets = [];\r\n\tvar widestLabelSize = 0;\r\n\tvar highestLabelSize = 0;\r\n\tvar i, j, jlen, label, tickFont, fontString, cache, lineHeight, width, height, nestedLabel, widest, highest;\r\n\r\n\tfor (i = 0; i < length; ++i) {\r\n\t\tlabel = ticks[i].label;\r\n\t\ttickFont = ticks[i].major ? tickFonts.major : tickFonts.minor;\r\n\t\tctx.font = fontString = tickFont.string;\r\n\t\tcache = caches[fontString] = caches[fontString] || {data: {}, gc: []};\r\n\t\tlineHeight = tickFont.lineHeight;\r\n\t\twidth = height = 0;\r\n\t\t// Undefined labels and arrays should not be measured\r\n\t\tif (!isNullOrUndef(label) && !isArray(label)) {\r\n\t\t\twidth = helpers$1.measureText(ctx, cache.data, cache.gc, width, label);\r\n\t\t\theight = lineHeight;\r\n\t\t} else if (isArray(label)) {\r\n\t\t\t// if it is an array let's measure each element\r\n\t\t\tfor (j = 0, jlen = label.length; j < jlen; ++j) {\r\n\t\t\t\tnestedLabel = label[j];\r\n\t\t\t\t// Undefined labels and arrays should not be measured\r\n\t\t\t\tif (!isNullOrUndef(nestedLabel) && !isArray(nestedLabel)) {\r\n\t\t\t\t\twidth = helpers$1.measureText(ctx, cache.data, cache.gc, width, nestedLabel);\r\n\t\t\t\t\theight += lineHeight;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\twidths.push(width);\r\n\t\theights.push(height);\r\n\t\toffsets.push(lineHeight / 2);\r\n\t\twidestLabelSize = Math.max(width, widestLabelSize);\r\n\t\thighestLabelSize = Math.max(height, highestLabelSize);\r\n\t}\r\n\tgarbageCollect(caches, length);\r\n\r\n\twidest = widths.indexOf(widestLabelSize);\r\n\thighest = heights.indexOf(highestLabelSize);\r\n\r\n\tfunction valueAt(idx) {\r\n\t\treturn {\r\n\t\t\twidth: widths[idx] || 0,\r\n\t\t\theight: heights[idx] || 0,\r\n\t\t\toffset: offsets[idx] || 0\r\n\t\t};\r\n\t}\r\n\r\n\treturn {\r\n\t\tfirst: valueAt(0),\r\n\t\tlast: valueAt(length - 1),\r\n\t\twidest: valueAt(widest),\r\n\t\thighest: valueAt(highest)\r\n\t};\r\n}\r\n\r\nfunction getTickMarkLength(options) {\r\n\treturn options.drawTicks ? options.tickMarkLength : 0;\r\n}\r\n\r\nfunction getScaleLabelHeight(options) {\r\n\tvar font, padding;\r\n\r\n\tif (!options.display) {\r\n\t\treturn 0;\r\n\t}\r\n\r\n\tfont = helpers$1.options._parseFont(options);\r\n\tpadding = helpers$1.options.toPadding(options.padding);\r\n\r\n\treturn font.lineHeight + padding.height;\r\n}\r\n\r\nfunction parseFontOptions(options, nestedOpts) {\r\n\treturn helpers$1.extend(helpers$1.options._parseFont({\r\n\t\tfontFamily: valueOrDefault$a(nestedOpts.fontFamily, options.fontFamily),\r\n\t\tfontSize: valueOrDefault$a(nestedOpts.fontSize, options.fontSize),\r\n\t\tfontStyle: valueOrDefault$a(nestedOpts.fontStyle, options.fontStyle),\r\n\t\tlineHeight: valueOrDefault$a(nestedOpts.lineHeight, options.lineHeight)\r\n\t}), {\r\n\t\tcolor: helpers$1.options.resolve([nestedOpts.fontColor, options.fontColor, core_defaults.global.defaultFontColor])\r\n\t});\r\n}\r\n\r\nfunction parseTickFontOptions(options) {\r\n\tvar minor = parseFontOptions(options, options.minor);\r\n\tvar major = options.major.enabled ? parseFontOptions(options, options.major) : minor;\r\n\r\n\treturn {minor: minor, major: major};\r\n}\r\n\r\nfunction nonSkipped(ticksToFilter) {\r\n\tvar filtered = [];\r\n\tvar item, index, len;\r\n\tfor (index = 0, len = ticksToFilter.length; index < len; ++index) {\r\n\t\titem = ticksToFilter[index];\r\n\t\tif (typeof item._index !== 'undefined') {\r\n\t\t\tfiltered.push(item);\r\n\t\t}\r\n\t}\r\n\treturn filtered;\r\n}\r\n\r\nfunction getEvenSpacing(arr) {\r\n\tvar len = arr.length;\r\n\tvar i, diff;\r\n\r\n\tif (len < 2) {\r\n\t\treturn false;\r\n\t}\r\n\r\n\tfor (diff = arr[0], i = 1; i < len; ++i) {\r\n\t\tif (arr[i] - arr[i - 1] !== diff) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t}\r\n\treturn diff;\r\n}\r\n\r\nfunction calculateSpacing(majorIndices, ticks, axisLength, ticksLimit) {\r\n\tvar evenMajorSpacing = getEvenSpacing(majorIndices);\r\n\tvar spacing = (ticks.length - 1) / ticksLimit;\r\n\tvar factors, factor, i, ilen;\r\n\r\n\t// If the major ticks are evenly spaced apart, place the minor ticks\r\n\t// so that they divide the major ticks into even chunks\r\n\tif (!evenMajorSpacing) {\r\n\t\treturn Math.max(spacing, 1);\r\n\t}\r\n\r\n\tfactors = helpers$1.math._factorize(evenMajorSpacing);\r\n\tfor (i = 0, ilen = factors.length - 1; i < ilen; i++) {\r\n\t\tfactor = factors[i];\r\n\t\tif (factor > spacing) {\r\n\t\t\treturn factor;\r\n\t\t}\r\n\t}\r\n\treturn Math.max(spacing, 1);\r\n}\r\n\r\nfunction getMajorIndices(ticks) {\r\n\tvar result = [];\r\n\tvar i, ilen;\r\n\tfor (i = 0, ilen = ticks.length; i < ilen; i++) {\r\n\t\tif (ticks[i].major) {\r\n\t\t\tresult.push(i);\r\n\t\t}\r\n\t}\r\n\treturn result;\r\n}\r\n\r\nfunction skipMajors(ticks, majorIndices, spacing) {\r\n\tvar count = 0;\r\n\tvar next = majorIndices[0];\r\n\tvar i, tick;\r\n\r\n\tspacing = Math.ceil(spacing);\r\n\tfor (i = 0; i < ticks.length; i++) {\r\n\t\ttick = ticks[i];\r\n\t\tif (i === next) {\r\n\t\t\ttick._index = i;\r\n\t\t\tcount++;\r\n\t\t\tnext = majorIndices[count * spacing];\r\n\t\t} else {\r\n\t\t\tdelete tick.label;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nfunction skip(ticks, spacing, majorStart, majorEnd) {\r\n\tvar start = valueOrDefault$a(majorStart, 0);\r\n\tvar end = Math.min(valueOrDefault$a(majorEnd, ticks.length), ticks.length);\r\n\tvar count = 0;\r\n\tvar length, i, tick, next;\r\n\r\n\tspacing = Math.ceil(spacing);\r\n\tif (majorEnd) {\r\n\t\tlength = majorEnd - majorStart;\r\n\t\tspacing = length / Math.floor(length / spacing);\r\n\t}\r\n\r\n\tnext = start;\r\n\r\n\twhile (next < 0) {\r\n\t\tcount++;\r\n\t\tnext = Math.round(start + count * spacing);\r\n\t}\r\n\r\n\tfor (i = Math.max(start, 0); i < end; i++) {\r\n\t\ttick = ticks[i];\r\n\t\tif (i === next) {\r\n\t\t\ttick._index = i;\r\n\t\t\tcount++;\r\n\t\t\tnext = Math.round(start + count * spacing);\r\n\t\t} else {\r\n\t\t\tdelete tick.label;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nvar Scale = core_element.extend({\r\n\r\n\tzeroLineIndex: 0,\r\n\r\n\t/**\r\n\t * Get the padding needed for the scale\r\n\t * @method getPadding\r\n\t * @private\r\n\t * @returns {Padding} the necessary padding\r\n\t */\r\n\tgetPadding: function() {\r\n\t\tvar me = this;\r\n\t\treturn {\r\n\t\t\tleft: me.paddingLeft || 0,\r\n\t\t\ttop: me.paddingTop || 0,\r\n\t\t\tright: me.paddingRight || 0,\r\n\t\t\tbottom: me.paddingBottom || 0\r\n\t\t};\r\n\t},\r\n\r\n\t/**\r\n\t * Returns the scale tick objects ({label, major})\r\n\t * @since 2.7\r\n\t */\r\n\tgetTicks: function() {\r\n\t\treturn this._ticks;\r\n\t},\r\n\r\n\t/**\r\n\t* @private\r\n\t*/\r\n\t_getLabels: function() {\r\n\t\tvar data = this.chart.data;\r\n\t\treturn this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels || [];\r\n\t},\r\n\r\n\t// These methods are ordered by lifecyle. Utilities then follow.\r\n\t// Any function defined here is inherited by all scale types.\r\n\t// Any function can be extended by the scale type\r\n\r\n\t/**\r\n\t * Provided for backward compatibility, not available anymore\r\n\t * @function Chart.Scale.mergeTicksOptions\r\n\t * @deprecated since version 2.8.0\r\n\t * @todo remove at version 3\r\n\t */\r\n\tmergeTicksOptions: function() {\r\n\t\t// noop\r\n\t},\r\n\r\n\tbeforeUpdate: function() {\r\n\t\thelpers$1.callback(this.options.beforeUpdate, [this]);\r\n\t},\r\n\r\n\t/**\r\n\t * @param {number} maxWidth - the max width in pixels\r\n\t * @param {number} maxHeight - the max height in pixels\r\n\t * @param {object} margins - the space between the edge of the other scales and edge of the chart\r\n\t *   This space comes from two sources:\r\n\t *     - padding - space that's required to show the labels at the edges of the scale\r\n\t *     - thickness of scales or legends in another orientation\r\n\t */\r\n\tupdate: function(maxWidth, maxHeight, margins) {\r\n\t\tvar me = this;\r\n\t\tvar tickOpts = me.options.ticks;\r\n\t\tvar sampleSize = tickOpts.sampleSize;\r\n\t\tvar i, ilen, labels, ticks, samplingEnabled;\r\n\r\n\t\t// Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)\r\n\t\tme.beforeUpdate();\r\n\r\n\t\t// Absorb the master measurements\r\n\t\tme.maxWidth = maxWidth;\r\n\t\tme.maxHeight = maxHeight;\r\n\t\tme.margins = helpers$1.extend({\r\n\t\t\tleft: 0,\r\n\t\t\tright: 0,\r\n\t\t\ttop: 0,\r\n\t\t\tbottom: 0\r\n\t\t}, margins);\r\n\r\n\t\tme._ticks = null;\r\n\t\tme.ticks = null;\r\n\t\tme._labelSizes = null;\r\n\t\tme._maxLabelLines = 0;\r\n\t\tme.longestLabelWidth = 0;\r\n\t\tme.longestTextCache = me.longestTextCache || {};\r\n\t\tme._gridLineItems = null;\r\n\t\tme._labelItems = null;\r\n\r\n\t\t// Dimensions\r\n\t\tme.beforeSetDimensions();\r\n\t\tme.setDimensions();\r\n\t\tme.afterSetDimensions();\r\n\r\n\t\t// Data min/max\r\n\t\tme.beforeDataLimits();\r\n\t\tme.determineDataLimits();\r\n\t\tme.afterDataLimits();\r\n\r\n\t\t// Ticks - `this.ticks` is now DEPRECATED!\r\n\t\t// Internal ticks are now stored as objects in the PRIVATE `this._ticks` member\r\n\t\t// and must not be accessed directly from outside this class. `this.ticks` being\r\n\t\t// around for long time and not marked as private, we can't change its structure\r\n\t\t// without unexpected breaking changes. If you need to access the scale ticks,\r\n\t\t// use scale.getTicks() instead.\r\n\r\n\t\tme.beforeBuildTicks();\r\n\r\n\t\t// New implementations should return an array of objects but for BACKWARD COMPAT,\r\n\t\t// we still support no return (`this.ticks` internally set by calling this method).\r\n\t\tticks = me.buildTicks() || [];\r\n\r\n\t\t// Allow modification of ticks in callback.\r\n\t\tticks = me.afterBuildTicks(ticks) || ticks;\r\n\r\n\t\t// Ensure ticks contains ticks in new tick format\r\n\t\tif ((!ticks || !ticks.length) && me.ticks) {\r\n\t\t\tticks = [];\r\n\t\t\tfor (i = 0, ilen = me.ticks.length; i < ilen; ++i) {\r\n\t\t\t\tticks.push({\r\n\t\t\t\t\tvalue: me.ticks[i],\r\n\t\t\t\t\tmajor: false\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tme._ticks = ticks;\r\n\r\n\t\t// Compute tick rotation and fit using a sampled subset of labels\r\n\t\t// We generally don't need to compute the size of every single label for determining scale size\r\n\t\tsamplingEnabled = sampleSize < ticks.length;\r\n\t\tlabels = me._convertTicksToLabels(samplingEnabled ? sample(ticks, sampleSize) : ticks);\r\n\r\n\t\t// _configure is called twice, once here, once from core.controller.updateLayout.\r\n\t\t// Here we haven't been positioned yet, but dimensions are correct.\r\n\t\t// Variables set in _configure are needed for calculateTickRotation, and\r\n\t\t// it's ok that coordinates are not correct there, only dimensions matter.\r\n\t\tme._configure();\r\n\r\n\t\t// Tick Rotation\r\n\t\tme.beforeCalculateTickRotation();\r\n\t\tme.calculateTickRotation();\r\n\t\tme.afterCalculateTickRotation();\r\n\r\n\t\tme.beforeFit();\r\n\t\tme.fit();\r\n\t\tme.afterFit();\r\n\r\n\t\t// Auto-skip\r\n\t\tme._ticksToDraw = tickOpts.display && (tickOpts.autoSkip || tickOpts.source === 'auto') ? me._autoSkip(ticks) : ticks;\r\n\r\n\t\tif (samplingEnabled) {\r\n\t\t\t// Generate labels using all non-skipped ticks\r\n\t\t\tlabels = me._convertTicksToLabels(me._ticksToDraw);\r\n\t\t}\r\n\r\n\t\tme.ticks = labels;   // BACKWARD COMPATIBILITY\r\n\r\n\t\t// IMPORTANT: after this point, we consider that `this.ticks` will NEVER change!\r\n\r\n\t\tme.afterUpdate();\r\n\r\n\t\t// TODO(v3): remove minSize as a public property and return value from all layout boxes. It is unused\r\n\t\t// make maxWidth and maxHeight private\r\n\t\treturn me.minSize;\r\n\t},\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n\t_configure: function() {\r\n\t\tvar me = this;\r\n\t\tvar reversePixels = me.options.ticks.reverse;\r\n\t\tvar startPixel, endPixel;\r\n\r\n\t\tif (me.isHorizontal()) {\r\n\t\t\tstartPixel = me.left;\r\n\t\t\tendPixel = me.right;\r\n\t\t} else {\r\n\t\t\tstartPixel = me.top;\r\n\t\t\tendPixel = me.bottom;\r\n\t\t\t// by default vertical scales are from bottom to top, so pixels are reversed\r\n\t\t\treversePixels = !reversePixels;\r\n\t\t}\r\n\t\tme._startPixel = startPixel;\r\n\t\tme._endPixel = endPixel;\r\n\t\tme._reversePixels = reversePixels;\r\n\t\tme._length = endPixel - startPixel;\r\n\t},\r\n\r\n\tafterUpdate: function() {\r\n\t\thelpers$1.callback(this.options.afterUpdate, [this]);\r\n\t},\r\n\r\n\t//\r\n\r\n\tbeforeSetDimensions: function() {\r\n\t\thelpers$1.callback(this.options.beforeSetDimensions, [this]);\r\n\t},\r\n\tsetDimensions: function() {\r\n\t\tvar me = this;\r\n\t\t// Set the unconstrained dimension before label rotation\r\n\t\tif (me.isHorizontal()) {\r\n\t\t\t// Reset position before calculating rotation\r\n\t\t\tme.width = me.maxWidth;\r\n\t\t\tme.left = 0;\r\n\t\t\tme.right = me.width;\r\n\t\t} else {\r\n\t\t\tme.height = me.maxHeight;\r\n\r\n\t\t\t// Reset position before calculating rotation\r\n\t\t\tme.top = 0;\r\n\t\t\tme.bottom = me.height;\r\n\t\t}\r\n\r\n\t\t// Reset padding\r\n\t\tme.paddingLeft = 0;\r\n\t\tme.paddingTop = 0;\r\n\t\tme.paddingRight = 0;\r\n\t\tme.paddingBottom = 0;\r\n\t},\r\n\tafterSetDimensions: function() {\r\n\t\thelpers$1.callback(this.options.afterSetDimensions, [this]);\r\n\t},\r\n\r\n\t// Data limits\r\n\tbeforeDataLimits: function() {\r\n\t\thelpers$1.callback(this.options.beforeDataLimits, [this]);\r\n\t},\r\n\tdetermineDataLimits: helpers$1.noop,\r\n\tafterDataLimits: function() {\r\n\t\thelpers$1.callback(this.options.afterDataLimits, [this]);\r\n\t},\r\n\r\n\t//\r\n\tbeforeBuildTicks: function() {\r\n\t\thelpers$1.callback(this.options.beforeBuildTicks, [this]);\r\n\t},\r\n\tbuildTicks: helpers$1.noop,\r\n\tafterBuildTicks: function(ticks) {\r\n\t\tvar me = this;\r\n\t\t// ticks is empty for old axis implementations here\r\n\t\tif (isArray(ticks) && ticks.length) {\r\n\t\t\treturn helpers$1.callback(me.options.afterBuildTicks, [me, ticks]);\r\n\t\t}\r\n\t\t// Support old implementations (that modified `this.ticks` directly in buildTicks)\r\n\t\tme.ticks = helpers$1.callback(me.options.afterBuildTicks, [me, me.ticks]) || me.ticks;\r\n\t\treturn ticks;\r\n\t},\r\n\r\n\tbeforeTickToLabelConversion: function() {\r\n\t\thelpers$1.callback(this.options.beforeTickToLabelConversion, [this]);\r\n\t},\r\n\tconvertTicksToLabels: function() {\r\n\t\tvar me = this;\r\n\t\t// Convert ticks to strings\r\n\t\tvar tickOpts = me.options.ticks;\r\n\t\tme.ticks = me.ticks.map(tickOpts.userCallback || tickOpts.callback, this);\r\n\t},\r\n\tafterTickToLabelConversion: function() {\r\n\t\thelpers$1.callback(this.options.afterTickToLabelConversion, [this]);\r\n\t},\r\n\r\n\t//\r\n\r\n\tbeforeCalculateTickRotation: function() {\r\n\t\thelpers$1.callback(this.options.beforeCalculateTickRotation, [this]);\r\n\t},\r\n\tcalculateTickRotation: function() {\r\n\t\tvar me = this;\r\n\t\tvar options = me.options;\r\n\t\tvar tickOpts = options.ticks;\r\n\t\tvar numTicks = me.getTicks().length;\r\n\t\tvar minRotation = tickOpts.minRotation || 0;\r\n\t\tvar maxRotation = tickOpts.maxRotation;\r\n\t\tvar labelRotation = minRotation;\r\n\t\tvar labelSizes, maxLabelWidth, maxLabelHeight, maxWidth, tickWidth, maxHeight, maxLabelDiagonal;\r\n\r\n\t\tif (!me._isVisible() || !tickOpts.display || minRotation >= maxRotation || numTicks <= 1 || !me.isHorizontal()) {\r\n\t\t\tme.labelRotation = minRotation;\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlabelSizes = me._getLabelSizes();\r\n\t\tmaxLabelWidth = labelSizes.widest.width;\r\n\t\tmaxLabelHeight = labelSizes.highest.height - labelSizes.highest.offset;\r\n\r\n\t\t// Estimate the width of each grid based on the canvas width, the maximum\r\n\t\t// label width and the number of tick intervals\r\n\t\tmaxWidth = Math.min(me.maxWidth, me.chart.width - maxLabelWidth);\r\n\t\ttickWidth = options.offset ? me.maxWidth / numTicks : maxWidth / (numTicks - 1);\r\n\r\n\t\t// Allow 3 pixels x2 padding either side for label readability\r\n\t\tif (maxLabelWidth + 6 > tickWidth) {\r\n\t\t\ttickWidth = maxWidth / (numTicks - (options.offset ? 0.5 : 1));\r\n\t\t\tmaxHeight = me.maxHeight - getTickMarkLength(options.gridLines)\r\n\t\t\t\t- tickOpts.padding - getScaleLabelHeight(options.scaleLabel);\r\n\t\t\tmaxLabelDiagonal = Math.sqrt(maxLabelWidth * maxLabelWidth + maxLabelHeight * maxLabelHeight);\r\n\t\t\tlabelRotation = helpers$1.toDegrees(Math.min(\r\n\t\t\t\tMath.asin(Math.min((labelSizes.highest.height + 6) / tickWidth, 1)),\r\n\t\t\t\tMath.asin(Math.min(maxHeight / maxLabelDiagonal, 1)) - Math.asin(maxLabelHeight / maxLabelDiagonal)\r\n\t\t\t));\r\n\t\t\tlabelRotation = Math.max(minRotation, Math.min(maxRotation, labelRotation));\r\n\t\t}\r\n\r\n\t\tme.labelRotation = labelRotation;\r\n\t},\r\n\tafterCalculateTickRotation: function() {\r\n\t\thelpers$1.callback(this.options.afterCalculateTickRotation, [this]);\r\n\t},\r\n\r\n\t//\r\n\r\n\tbeforeFit: function() {\r\n\t\thelpers$1.callback(this.options.beforeFit, [this]);\r\n\t},\r\n\tfit: function() {\r\n\t\tvar me = this;\r\n\t\t// Reset\r\n\t\tvar minSize = me.minSize = {\r\n\t\t\twidth: 0,\r\n\t\t\theight: 0\r\n\t\t};\r\n\r\n\t\tvar chart = me.chart;\r\n\t\tvar opts = me.options;\r\n\t\tvar tickOpts = opts.ticks;\r\n\t\tvar scaleLabelOpts = opts.scaleLabel;\r\n\t\tvar gridLineOpts = opts.gridLines;\r\n\t\tvar display = me._isVisible();\r\n\t\tvar isBottom = opts.position === 'bottom';\r\n\t\tvar isHorizontal = me.isHorizontal();\r\n\r\n\t\t// Width\r\n\t\tif (isHorizontal) {\r\n\t\t\tminSize.width = me.maxWidth;\r\n\t\t} else if (display) {\r\n\t\t\tminSize.width = getTickMarkLength(gridLineOpts) + getScaleLabelHeight(scaleLabelOpts);\r\n\t\t}\r\n\r\n\t\t// height\r\n\t\tif (!isHorizontal) {\r\n\t\t\tminSize.height = me.maxHeight; // fill all the height\r\n\t\t} else if (display) {\r\n\t\t\tminSize.height = getTickMarkLength(gridLineOpts) + getScaleLabelHeight(scaleLabelOpts);\r\n\t\t}\r\n\r\n\t\t// Don't bother fitting the ticks if we are not showing the labels\r\n\t\tif (tickOpts.display && display) {\r\n\t\t\tvar tickFonts = parseTickFontOptions(tickOpts);\r\n\t\t\tvar labelSizes = me._getLabelSizes();\r\n\t\t\tvar firstLabelSize = labelSizes.first;\r\n\t\t\tvar lastLabelSize = labelSizes.last;\r\n\t\t\tvar widestLabelSize = labelSizes.widest;\r\n\t\t\tvar highestLabelSize = labelSizes.highest;\r\n\t\t\tvar lineSpace = tickFonts.minor.lineHeight * 0.4;\r\n\t\t\tvar tickPadding = tickOpts.padding;\r\n\r\n\t\t\tif (isHorizontal) {\r\n\t\t\t\t// A horizontal axis is more constrained by the height.\r\n\t\t\t\tvar isRotated = me.labelRotation !== 0;\r\n\t\t\t\tvar angleRadians = helpers$1.toRadians(me.labelRotation);\r\n\t\t\t\tvar cosRotation = Math.cos(angleRadians);\r\n\t\t\t\tvar sinRotation = Math.sin(angleRadians);\r\n\r\n\t\t\t\tvar labelHeight = sinRotation * widestLabelSize.width\r\n\t\t\t\t\t+ cosRotation * (highestLabelSize.height - (isRotated ? highestLabelSize.offset : 0))\r\n\t\t\t\t\t+ (isRotated ? 0 : lineSpace); // padding\r\n\r\n\t\t\t\tminSize.height = Math.min(me.maxHeight, minSize.height + labelHeight + tickPadding);\r\n\r\n\t\t\t\tvar offsetLeft = me.getPixelForTick(0) - me.left;\r\n\t\t\t\tvar offsetRight = me.right - me.getPixelForTick(me.getTicks().length - 1);\r\n\t\t\t\tvar paddingLeft, paddingRight;\r\n\r\n\t\t\t\t// Ensure that our ticks are always inside the canvas. When rotated, ticks are right aligned\r\n\t\t\t\t// which means that the right padding is dominated by the font height\r\n\t\t\t\tif (isRotated) {\r\n\t\t\t\t\tpaddingLeft = isBottom ?\r\n\t\t\t\t\t\tcosRotation * firstLabelSize.width + sinRotation * firstLabelSize.offset :\r\n\t\t\t\t\t\tsinRotation * (firstLabelSize.height - firstLabelSize.offset);\r\n\t\t\t\t\tpaddingRight = isBottom ?\r\n\t\t\t\t\t\tsinRotation * (lastLabelSize.height - lastLabelSize.offset) :\r\n\t\t\t\t\t\tcosRotation * lastLabelSize.width + sinRotation * lastLabelSize.offset;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tpaddingLeft = firstLabelSize.width / 2;\r\n\t\t\t\t\tpaddingRight = lastLabelSize.width / 2;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Adjust padding taking into account changes in offsets\r\n\t\t\t\t// and add 3 px to move away from canvas edges\r\n\t\t\t\tme.paddingLeft = Math.max((paddingLeft - offsetLeft) * me.width / (me.width - offsetLeft), 0) + 3;\r\n\t\t\t\tme.paddingRight = Math.max((paddingRight - offsetRight) * me.width / (me.width - offsetRight), 0) + 3;\r\n\t\t\t} else {\r\n\t\t\t\t// A vertical axis is more constrained by the width. Labels are the\r\n\t\t\t\t// dominant factor here, so get that length first and account for padding\r\n\t\t\t\tvar labelWidth = tickOpts.mirror ? 0 :\r\n\t\t\t\t\t// use lineSpace for consistency with horizontal axis\r\n\t\t\t\t\t// tickPadding is not implemented for horizontal\r\n\t\t\t\t\twidestLabelSize.width + tickPadding + lineSpace;\r\n\r\n\t\t\t\tminSize.width = Math.min(me.maxWidth, minSize.width + labelWidth);\r\n\r\n\t\t\t\tme.paddingTop = firstLabelSize.height / 2;\r\n\t\t\t\tme.paddingBottom = lastLabelSize.height / 2;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tme.handleMargins();\r\n\r\n\t\tif (isHorizontal) {\r\n\t\t\tme.width = me._length = chart.width - me.margins.left - me.margins.right;\r\n\t\t\tme.height = minSize.height;\r\n\t\t} else {\r\n\t\t\tme.width = minSize.width;\r\n\t\t\tme.height = me._length = chart.height - me.margins.top - me.margins.bottom;\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Handle margins and padding interactions\r\n\t * @private\r\n\t */\r\n\thandleMargins: function() {\r\n\t\tvar me = this;\r\n\t\tif (me.margins) {\r\n\t\t\tme.margins.left = Math.max(me.paddingLeft, me.margins.left);\r\n\t\t\tme.margins.top = Math.max(me.paddingTop, me.margins.top);\r\n\t\t\tme.margins.right = Math.max(me.paddingRight, me.margins.right);\r\n\t\t\tme.margins.bottom = Math.max(me.paddingBottom, me.margins.bottom);\r\n\t\t}\r\n\t},\r\n\r\n\tafterFit: function() {\r\n\t\thelpers$1.callback(this.options.afterFit, [this]);\r\n\t},\r\n\r\n\t// Shared Methods\r\n\tisHorizontal: function() {\r\n\t\tvar pos = this.options.position;\r\n\t\treturn pos === 'top' || pos === 'bottom';\r\n\t},\r\n\tisFullWidth: function() {\r\n\t\treturn this.options.fullWidth;\r\n\t},\r\n\r\n\t// Get the correct value. NaN bad inputs, If the value type is object get the x or y based on whether we are horizontal or not\r\n\tgetRightValue: function(rawValue) {\r\n\t\t// Null and undefined values first\r\n\t\tif (isNullOrUndef(rawValue)) {\r\n\t\t\treturn NaN;\r\n\t\t}\r\n\t\t// isNaN(object) returns true, so make sure NaN is checking for a number; Discard Infinite values\r\n\t\tif ((typeof rawValue === 'number' || rawValue instanceof Number) && !isFinite(rawValue)) {\r\n\t\t\treturn NaN;\r\n\t\t}\r\n\r\n\t\t// If it is in fact an object, dive in one more level\r\n\t\tif (rawValue) {\r\n\t\t\tif (this.isHorizontal()) {\r\n\t\t\t\tif (rawValue.x !== undefined) {\r\n\t\t\t\t\treturn this.getRightValue(rawValue.x);\r\n\t\t\t\t}\r\n\t\t\t} else if (rawValue.y !== undefined) {\r\n\t\t\t\treturn this.getRightValue(rawValue.y);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// Value is good, return it\r\n\t\treturn rawValue;\r\n\t},\r\n\r\n\t_convertTicksToLabels: function(ticks) {\r\n\t\tvar me = this;\r\n\t\tvar labels, i, ilen;\r\n\r\n\t\tme.ticks = ticks.map(function(tick) {\r\n\t\t\treturn tick.value;\r\n\t\t});\r\n\r\n\t\tme.beforeTickToLabelConversion();\r\n\r\n\t\t// New implementations should return the formatted tick labels but for BACKWARD\r\n\t\t// COMPAT, we still support no return (`this.ticks` internally changed by calling\r\n\t\t// this method and supposed to contain only string values).\r\n\t\tlabels = me.convertTicksToLabels(ticks) || me.ticks;\r\n\r\n\t\tme.afterTickToLabelConversion();\r\n\r\n\t\t// BACKWARD COMPAT: synchronize `_ticks` with labels (so potentially `this.ticks`)\r\n\t\tfor (i = 0, ilen = ticks.length; i < ilen; ++i) {\r\n\t\t\tticks[i].label = labels[i];\r\n\t\t}\r\n\r\n\t\treturn labels;\r\n\t},\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n\t_getLabelSizes: function() {\r\n\t\tvar me = this;\r\n\t\tvar labelSizes = me._labelSizes;\r\n\r\n\t\tif (!labelSizes) {\r\n\t\t\tme._labelSizes = labelSizes = computeLabelSizes(me.ctx, parseTickFontOptions(me.options.ticks), me.getTicks(), me.longestTextCache);\r\n\t\t\tme.longestLabelWidth = labelSizes.widest.width;\r\n\t\t}\r\n\r\n\t\treturn labelSizes;\r\n\t},\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n\t_parseValue: function(value) {\r\n\t\tvar start, end, min, max;\r\n\r\n\t\tif (isArray(value)) {\r\n\t\t\tstart = +this.getRightValue(value[0]);\r\n\t\t\tend = +this.getRightValue(value[1]);\r\n\t\t\tmin = Math.min(start, end);\r\n\t\t\tmax = Math.max(start, end);\r\n\t\t} else {\r\n\t\t\tvalue = +this.getRightValue(value);\r\n\t\t\tstart = undefined;\r\n\t\t\tend = value;\r\n\t\t\tmin = value;\r\n\t\t\tmax = value;\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\tmin: min,\r\n\t\t\tmax: max,\r\n\t\t\tstart: start,\r\n\t\t\tend: end\r\n\t\t};\r\n\t},\r\n\r\n\t/**\r\n\t* @private\r\n\t*/\r\n\t_getScaleLabel: function(rawValue) {\r\n\t\tvar v = this._parseValue(rawValue);\r\n\t\tif (v.start !== undefined) {\r\n\t\t\treturn '[' + v.start + ', ' + v.end + ']';\r\n\t\t}\r\n\r\n\t\treturn +this.getRightValue(rawValue);\r\n\t},\r\n\r\n\t/**\r\n\t * Used to get the value to display in the tooltip for the data at the given index\r\n\t * @param index\r\n\t * @param datasetIndex\r\n\t */\r\n\tgetLabelForIndex: helpers$1.noop,\r\n\r\n\t/**\r\n\t * Returns the location of the given data point. Value can either be an index or a numerical value\r\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\r\n\t * @param value\r\n\t * @param index\r\n\t * @param datasetIndex\r\n\t */\r\n\tgetPixelForValue: helpers$1.noop,\r\n\r\n\t/**\r\n\t * Used to get the data value from a given pixel. This is the inverse of getPixelForValue\r\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\r\n\t * @param pixel\r\n\t */\r\n\tgetValueForPixel: helpers$1.noop,\r\n\r\n\t/**\r\n\t * Returns the location of the tick at the given index\r\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\r\n\t */\r\n\tgetPixelForTick: function(index) {\r\n\t\tvar me = this;\r\n\t\tvar offset = me.options.offset;\r\n\t\tvar numTicks = me._ticks.length;\r\n\t\tvar tickWidth = 1 / Math.max(numTicks - (offset ? 0 : 1), 1);\r\n\r\n\t\treturn index < 0 || index > numTicks - 1\r\n\t\t\t? null\r\n\t\t\t: me.getPixelForDecimal(index * tickWidth + (offset ? tickWidth / 2 : 0));\r\n\t},\r\n\r\n\t/**\r\n\t * Utility for getting the pixel location of a percentage of scale\r\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\r\n\t */\r\n\tgetPixelForDecimal: function(decimal) {\r\n\t\tvar me = this;\r\n\r\n\t\tif (me._reversePixels) {\r\n\t\t\tdecimal = 1 - decimal;\r\n\t\t}\r\n\r\n\t\treturn me._startPixel + decimal * me._length;\r\n\t},\r\n\r\n\tgetDecimalForPixel: function(pixel) {\r\n\t\tvar decimal = (pixel - this._startPixel) / this._length;\r\n\t\treturn this._reversePixels ? 1 - decimal : decimal;\r\n\t},\r\n\r\n\t/**\r\n\t * Returns the pixel for the minimum chart value\r\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\r\n\t */\r\n\tgetBasePixel: function() {\r\n\t\treturn this.getPixelForValue(this.getBaseValue());\r\n\t},\r\n\r\n\tgetBaseValue: function() {\r\n\t\tvar me = this;\r\n\t\tvar min = me.min;\r\n\t\tvar max = me.max;\r\n\r\n\t\treturn me.beginAtZero ? 0 :\r\n\t\t\tmin < 0 && max < 0 ? max :\r\n\t\t\tmin > 0 && max > 0 ? min :\r\n\t\t\t0;\r\n\t},\r\n\r\n\t/**\r\n\t * Returns a subset of ticks to be plotted to avoid overlapping labels.\r\n\t * @private\r\n\t */\r\n\t_autoSkip: function(ticks) {\r\n\t\tvar me = this;\r\n\t\tvar tickOpts = me.options.ticks;\r\n\t\tvar axisLength = me._length;\r\n\t\tvar ticksLimit = tickOpts.maxTicksLimit || axisLength / me._tickSize() + 1;\r\n\t\tvar majorIndices = tickOpts.major.enabled ? getMajorIndices(ticks) : [];\r\n\t\tvar numMajorIndices = majorIndices.length;\r\n\t\tvar first = majorIndices[0];\r\n\t\tvar last = majorIndices[numMajorIndices - 1];\r\n\t\tvar i, ilen, spacing, avgMajorSpacing;\r\n\r\n\t\t// If there are too many major ticks to display them all\r\n\t\tif (numMajorIndices > ticksLimit) {\r\n\t\t\tskipMajors(ticks, majorIndices, numMajorIndices / ticksLimit);\r\n\t\t\treturn nonSkipped(ticks);\r\n\t\t}\r\n\r\n\t\tspacing = calculateSpacing(majorIndices, ticks, axisLength, ticksLimit);\r\n\r\n\t\tif (numMajorIndices > 0) {\r\n\t\t\tfor (i = 0, ilen = numMajorIndices - 1; i < ilen; i++) {\r\n\t\t\t\tskip(ticks, spacing, majorIndices[i], majorIndices[i + 1]);\r\n\t\t\t}\r\n\t\t\tavgMajorSpacing = numMajorIndices > 1 ? (last - first) / (numMajorIndices - 1) : null;\r\n\t\t\tskip(ticks, spacing, helpers$1.isNullOrUndef(avgMajorSpacing) ? 0 : first - avgMajorSpacing, first);\r\n\t\t\tskip(ticks, spacing, last, helpers$1.isNullOrUndef(avgMajorSpacing) ? ticks.length : last + avgMajorSpacing);\r\n\t\t\treturn nonSkipped(ticks);\r\n\t\t}\r\n\t\tskip(ticks, spacing);\r\n\t\treturn nonSkipped(ticks);\r\n\t},\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n\t_tickSize: function() {\r\n\t\tvar me = this;\r\n\t\tvar optionTicks = me.options.ticks;\r\n\r\n\t\t// Calculate space needed by label in axis direction.\r\n\t\tvar rot = helpers$1.toRadians(me.labelRotation);\r\n\t\tvar cos = Math.abs(Math.cos(rot));\r\n\t\tvar sin = Math.abs(Math.sin(rot));\r\n\r\n\t\tvar labelSizes = me._getLabelSizes();\r\n\t\tvar padding = optionTicks.autoSkipPadding || 0;\r\n\t\tvar w = labelSizes ? labelSizes.widest.width + padding : 0;\r\n\t\tvar h = labelSizes ? labelSizes.highest.height + padding : 0;\r\n\r\n\t\t// Calculate space needed for 1 tick in axis direction.\r\n\t\treturn me.isHorizontal()\r\n\t\t\t? h * cos > w * sin ? w / cos : h / sin\r\n\t\t\t: h * sin < w * cos ? h / cos : w / sin;\r\n\t},\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n\t_isVisible: function() {\r\n\t\tvar me = this;\r\n\t\tvar chart = me.chart;\r\n\t\tvar display = me.options.display;\r\n\t\tvar i, ilen, meta;\r\n\r\n\t\tif (display !== 'auto') {\r\n\t\t\treturn !!display;\r\n\t\t}\r\n\r\n\t\t// When 'auto', the scale is visible if at least one associated dataset is visible.\r\n\t\tfor (i = 0, ilen = chart.data.datasets.length; i < ilen; ++i) {\r\n\t\t\tif (chart.isDatasetVisible(i)) {\r\n\t\t\t\tmeta = chart.getDatasetMeta(i);\r\n\t\t\t\tif (meta.xAxisID === me.id || meta.yAxisID === me.id) {\r\n\t\t\t\t\treturn true;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\t},\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n\t_computeGridLineItems: function(chartArea) {\r\n\t\tvar me = this;\r\n\t\tvar chart = me.chart;\r\n\t\tvar options = me.options;\r\n\t\tvar gridLines = options.gridLines;\r\n\t\tvar position = options.position;\r\n\t\tvar offsetGridLines = gridLines.offsetGridLines;\r\n\t\tvar isHorizontal = me.isHorizontal();\r\n\t\tvar ticks = me._ticksToDraw;\r\n\t\tvar ticksLength = ticks.length + (offsetGridLines ? 1 : 0);\r\n\r\n\t\tvar tl = getTickMarkLength(gridLines);\r\n\t\tvar items = [];\r\n\t\tvar axisWidth = gridLines.drawBorder ? valueAtIndexOrDefault(gridLines.lineWidth, 0, 0) : 0;\r\n\t\tvar axisHalfWidth = axisWidth / 2;\r\n\t\tvar alignPixel = helpers$1._alignPixel;\r\n\t\tvar alignBorderValue = function(pixel) {\r\n\t\t\treturn alignPixel(chart, pixel, axisWidth);\r\n\t\t};\r\n\t\tvar borderValue, i, tick, lineValue, alignedLineValue;\r\n\t\tvar tx1, ty1, tx2, ty2, x1, y1, x2, y2, lineWidth, lineColor, borderDash, borderDashOffset;\r\n\r\n\t\tif (position === 'top') {\r\n\t\t\tborderValue = alignBorderValue(me.bottom);\r\n\t\t\tty1 = me.bottom - tl;\r\n\t\t\tty2 = borderValue - axisHalfWidth;\r\n\t\t\ty1 = alignBorderValue(chartArea.top) + axisHalfWidth;\r\n\t\t\ty2 = chartArea.bottom;\r\n\t\t} else if (position === 'bottom') {\r\n\t\t\tborderValue = alignBorderValue(me.top);\r\n\t\t\ty1 = chartArea.top;\r\n\t\t\ty2 = alignBorderValue(chartArea.bottom) - axisHalfWidth;\r\n\t\t\tty1 = borderValue + axisHalfWidth;\r\n\t\t\tty2 = me.top + tl;\r\n\t\t} else if (position === 'left') {\r\n\t\t\tborderValue = alignBorderValue(me.right);\r\n\t\t\ttx1 = me.right - tl;\r\n\t\t\ttx2 = borderValue - axisHalfWidth;\r\n\t\t\tx1 = alignBorderValue(chartArea.left) + axisHalfWidth;\r\n\t\t\tx2 = chartArea.right;\r\n\t\t} else {\r\n\t\t\tborderValue = alignBorderValue(me.left);\r\n\t\t\tx1 = chartArea.left;\r\n\t\t\tx2 = alignBorderValue(chartArea.right) - axisHalfWidth;\r\n\t\t\ttx1 = borderValue + axisHalfWidth;\r\n\t\t\ttx2 = me.left + tl;\r\n\t\t}\r\n\r\n\t\tfor (i = 0; i < ticksLength; ++i) {\r\n\t\t\ttick = ticks[i] || {};\r\n\r\n\t\t\t// autoskipper skipped this tick (#4635)\r\n\t\t\tif (isNullOrUndef(tick.label) && i < ticks.length) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tif (i === me.zeroLineIndex && options.offset === offsetGridLines) {\r\n\t\t\t\t// Draw the first index specially\r\n\t\t\t\tlineWidth = gridLines.zeroLineWidth;\r\n\t\t\t\tlineColor = gridLines.zeroLineColor;\r\n\t\t\t\tborderDash = gridLines.zeroLineBorderDash || [];\r\n\t\t\t\tborderDashOffset = gridLines.zeroLineBorderDashOffset || 0.0;\r\n\t\t\t} else {\r\n\t\t\t\tlineWidth = valueAtIndexOrDefault(gridLines.lineWidth, i, 1);\r\n\t\t\t\tlineColor = valueAtIndexOrDefault(gridLines.color, i, 'rgba(0,0,0,0.1)');\r\n\t\t\t\tborderDash = gridLines.borderDash || [];\r\n\t\t\t\tborderDashOffset = gridLines.borderDashOffset || 0.0;\r\n\t\t\t}\r\n\r\n\t\t\tlineValue = getPixelForGridLine(me, tick._index || i, offsetGridLines);\r\n\r\n\t\t\t// Skip if the pixel is out of the range\r\n\t\t\tif (lineValue === undefined) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\talignedLineValue = alignPixel(chart, lineValue, lineWidth);\r\n\r\n\t\t\tif (isHorizontal) {\r\n\t\t\t\ttx1 = tx2 = x1 = x2 = alignedLineValue;\r\n\t\t\t} else {\r\n\t\t\t\tty1 = ty2 = y1 = y2 = alignedLineValue;\r\n\t\t\t}\r\n\r\n\t\t\titems.push({\r\n\t\t\t\ttx1: tx1,\r\n\t\t\t\tty1: ty1,\r\n\t\t\t\ttx2: tx2,\r\n\t\t\t\tty2: ty2,\r\n\t\t\t\tx1: x1,\r\n\t\t\t\ty1: y1,\r\n\t\t\t\tx2: x2,\r\n\t\t\t\ty2: y2,\r\n\t\t\t\twidth: lineWidth,\r\n\t\t\t\tcolor: lineColor,\r\n\t\t\t\tborderDash: borderDash,\r\n\t\t\t\tborderDashOffset: borderDashOffset,\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\titems.ticksLength = ticksLength;\r\n\t\titems.borderValue = borderValue;\r\n\r\n\t\treturn items;\r\n\t},\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n\t_computeLabelItems: function() {\r\n\t\tvar me = this;\r\n\t\tvar options = me.options;\r\n\t\tvar optionTicks = options.ticks;\r\n\t\tvar position = options.position;\r\n\t\tvar isMirrored = optionTicks.mirror;\r\n\t\tvar isHorizontal = me.isHorizontal();\r\n\t\tvar ticks = me._ticksToDraw;\r\n\t\tvar fonts = parseTickFontOptions(optionTicks);\r\n\t\tvar tickPadding = optionTicks.padding;\r\n\t\tvar tl = getTickMarkLength(options.gridLines);\r\n\t\tvar rotation = -helpers$1.toRadians(me.labelRotation);\r\n\t\tvar items = [];\r\n\t\tvar i, ilen, tick, label, x, y, textAlign, pixel, font, lineHeight, lineCount, textOffset;\r\n\r\n\t\tif (position === 'top') {\r\n\t\t\ty = me.bottom - tl - tickPadding;\r\n\t\t\ttextAlign = !rotation ? 'center' : 'left';\r\n\t\t} else if (position === 'bottom') {\r\n\t\t\ty = me.top + tl + tickPadding;\r\n\t\t\ttextAlign = !rotation ? 'center' : 'right';\r\n\t\t} else if (position === 'left') {\r\n\t\t\tx = me.right - (isMirrored ? 0 : tl) - tickPadding;\r\n\t\t\ttextAlign = isMirrored ? 'left' : 'right';\r\n\t\t} else {\r\n\t\t\tx = me.left + (isMirrored ? 0 : tl) + tickPadding;\r\n\t\t\ttextAlign = isMirrored ? 'right' : 'left';\r\n\t\t}\r\n\r\n\t\tfor (i = 0, ilen = ticks.length; i < ilen; ++i) {\r\n\t\t\ttick = ticks[i];\r\n\t\t\tlabel = tick.label;\r\n\r\n\t\t\t// autoskipper skipped this tick (#4635)\r\n\t\t\tif (isNullOrUndef(label)) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tpixel = me.getPixelForTick(tick._index || i) + optionTicks.labelOffset;\r\n\t\t\tfont = tick.major ? fonts.major : fonts.minor;\r\n\t\t\tlineHeight = font.lineHeight;\r\n\t\t\tlineCount = isArray(label) ? label.length : 1;\r\n\r\n\t\t\tif (isHorizontal) {\r\n\t\t\t\tx = pixel;\r\n\t\t\t\ttextOffset = position === 'top'\r\n\t\t\t\t\t? ((!rotation ? 0.5 : 1) - lineCount) * lineHeight\r\n\t\t\t\t\t: (!rotation ? 0.5 : 0) * lineHeight;\r\n\t\t\t} else {\r\n\t\t\t\ty = pixel;\r\n\t\t\t\ttextOffset = (1 - lineCount) * lineHeight / 2;\r\n\t\t\t}\r\n\r\n\t\t\titems.push({\r\n\t\t\t\tx: x,\r\n\t\t\t\ty: y,\r\n\t\t\t\trotation: rotation,\r\n\t\t\t\tlabel: label,\r\n\t\t\t\tfont: font,\r\n\t\t\t\ttextOffset: textOffset,\r\n\t\t\t\ttextAlign: textAlign\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\treturn items;\r\n\t},\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n\t_drawGrid: function(chartArea) {\r\n\t\tvar me = this;\r\n\t\tvar gridLines = me.options.gridLines;\r\n\r\n\t\tif (!gridLines.display) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tvar ctx = me.ctx;\r\n\t\tvar chart = me.chart;\r\n\t\tvar alignPixel = helpers$1._alignPixel;\r\n\t\tvar axisWidth = gridLines.drawBorder ? valueAtIndexOrDefault(gridLines.lineWidth, 0, 0) : 0;\r\n\t\tvar items = me._gridLineItems || (me._gridLineItems = me._computeGridLineItems(chartArea));\r\n\t\tvar width, color, i, ilen, item;\r\n\r\n\t\tfor (i = 0, ilen = items.length; i < ilen; ++i) {\r\n\t\t\titem = items[i];\r\n\t\t\twidth = item.width;\r\n\t\t\tcolor = item.color;\r\n\r\n\t\t\tif (width && color) {\r\n\t\t\t\tctx.save();\r\n\t\t\t\tctx.lineWidth = width;\r\n\t\t\t\tctx.strokeStyle = color;\r\n\t\t\t\tif (ctx.setLineDash) {\r\n\t\t\t\t\tctx.setLineDash(item.borderDash);\r\n\t\t\t\t\tctx.lineDashOffset = item.borderDashOffset;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tctx.beginPath();\r\n\r\n\t\t\t\tif (gridLines.drawTicks) {\r\n\t\t\t\t\tctx.moveTo(item.tx1, item.ty1);\r\n\t\t\t\t\tctx.lineTo(item.tx2, item.ty2);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (gridLines.drawOnChartArea) {\r\n\t\t\t\t\tctx.moveTo(item.x1, item.y1);\r\n\t\t\t\t\tctx.lineTo(item.x2, item.y2);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tctx.stroke();\r\n\t\t\t\tctx.restore();\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (axisWidth) {\r\n\t\t\t// Draw the line at the edge of the axis\r\n\t\t\tvar firstLineWidth = axisWidth;\r\n\t\t\tvar lastLineWidth = valueAtIndexOrDefault(gridLines.lineWidth, items.ticksLength - 1, 1);\r\n\t\t\tvar borderValue = items.borderValue;\r\n\t\t\tvar x1, x2, y1, y2;\r\n\r\n\t\t\tif (me.isHorizontal()) {\r\n\t\t\t\tx1 = alignPixel(chart, me.left, firstLineWidth) - firstLineWidth / 2;\r\n\t\t\t\tx2 = alignPixel(chart, me.right, lastLineWidth) + lastLineWidth / 2;\r\n\t\t\t\ty1 = y2 = borderValue;\r\n\t\t\t} else {\r\n\t\t\t\ty1 = alignPixel(chart, me.top, firstLineWidth) - firstLineWidth / 2;\r\n\t\t\t\ty2 = alignPixel(chart, me.bottom, lastLineWidth) + lastLineWidth / 2;\r\n\t\t\t\tx1 = x2 = borderValue;\r\n\t\t\t}\r\n\r\n\t\t\tctx.lineWidth = axisWidth;\r\n\t\t\tctx.strokeStyle = valueAtIndexOrDefault(gridLines.color, 0);\r\n\t\t\tctx.beginPath();\r\n\t\t\tctx.moveTo(x1, y1);\r\n\t\t\tctx.lineTo(x2, y2);\r\n\t\t\tctx.stroke();\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n\t_drawLabels: function() {\r\n\t\tvar me = this;\r\n\t\tvar optionTicks = me.options.ticks;\r\n\r\n\t\tif (!optionTicks.display) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tvar ctx = me.ctx;\r\n\t\tvar items = me._labelItems || (me._labelItems = me._computeLabelItems());\r\n\t\tvar i, j, ilen, jlen, item, tickFont, label, y;\r\n\r\n\t\tfor (i = 0, ilen = items.length; i < ilen; ++i) {\r\n\t\t\titem = items[i];\r\n\t\t\ttickFont = item.font;\r\n\r\n\t\t\t// Make sure we draw text in the correct color and font\r\n\t\t\tctx.save();\r\n\t\t\tctx.translate(item.x, item.y);\r\n\t\t\tctx.rotate(item.rotation);\r\n\t\t\tctx.font = tickFont.string;\r\n\t\t\tctx.fillStyle = tickFont.color;\r\n\t\t\tctx.textBaseline = 'middle';\r\n\t\t\tctx.textAlign = item.textAlign;\r\n\r\n\t\t\tlabel = item.label;\r\n\t\t\ty = item.textOffset;\r\n\t\t\tif (isArray(label)) {\r\n\t\t\t\tfor (j = 0, jlen = label.length; j < jlen; ++j) {\r\n\t\t\t\t\t// We just make sure the multiline element is a string here..\r\n\t\t\t\t\tctx.fillText('' + label[j], 0, y);\r\n\t\t\t\t\ty += tickFont.lineHeight;\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tctx.fillText(label, 0, y);\r\n\t\t\t}\r\n\t\t\tctx.restore();\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n\t_drawTitle: function() {\r\n\t\tvar me = this;\r\n\t\tvar ctx = me.ctx;\r\n\t\tvar options = me.options;\r\n\t\tvar scaleLabel = options.scaleLabel;\r\n\r\n\t\tif (!scaleLabel.display) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tvar scaleLabelFontColor = valueOrDefault$a(scaleLabel.fontColor, core_defaults.global.defaultFontColor);\r\n\t\tvar scaleLabelFont = helpers$1.options._parseFont(scaleLabel);\r\n\t\tvar scaleLabelPadding = helpers$1.options.toPadding(scaleLabel.padding);\r\n\t\tvar halfLineHeight = scaleLabelFont.lineHeight / 2;\r\n\t\tvar position = options.position;\r\n\t\tvar rotation = 0;\r\n\t\tvar scaleLabelX, scaleLabelY;\r\n\r\n\t\tif (me.isHorizontal()) {\r\n\t\t\tscaleLabelX = me.left + me.width / 2; // midpoint of the width\r\n\t\t\tscaleLabelY = position === 'bottom'\r\n\t\t\t\t? me.bottom - halfLineHeight - scaleLabelPadding.bottom\r\n\t\t\t\t: me.top + halfLineHeight + scaleLabelPadding.top;\r\n\t\t} else {\r\n\t\t\tvar isLeft = position === 'left';\r\n\t\t\tscaleLabelX = isLeft\r\n\t\t\t\t? me.left + halfLineHeight + scaleLabelPadding.top\r\n\t\t\t\t: me.right - halfLineHeight - scaleLabelPadding.top;\r\n\t\t\tscaleLabelY = me.top + me.height / 2;\r\n\t\t\trotation = isLeft ? -0.5 * Math.PI : 0.5 * Math.PI;\r\n\t\t}\r\n\r\n\t\tctx.save();\r\n\t\tctx.translate(scaleLabelX, scaleLabelY);\r\n\t\tctx.rotate(rotation);\r\n\t\tctx.textAlign = 'center';\r\n\t\tctx.textBaseline = 'middle';\r\n\t\tctx.fillStyle = scaleLabelFontColor; // render in correct colour\r\n\t\tctx.font = scaleLabelFont.string;\r\n\t\tctx.fillText(scaleLabel.labelString, 0, 0);\r\n\t\tctx.restore();\r\n\t},\r\n\r\n\tdraw: function(chartArea) {\r\n\t\tvar me = this;\r\n\r\n\t\tif (!me._isVisible()) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tme._drawGrid(chartArea);\r\n\t\tme._drawTitle();\r\n\t\tme._drawLabels();\r\n\t},\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n\t_layers: function() {\r\n\t\tvar me = this;\r\n\t\tvar opts = me.options;\r\n\t\tvar tz = opts.ticks && opts.ticks.z || 0;\r\n\t\tvar gz = opts.gridLines && opts.gridLines.z || 0;\r\n\r\n\t\tif (!me._isVisible() || tz === gz || me.draw !== me._draw) {\r\n\t\t\t// backward compatibility: draw has been overridden by custom scale\r\n\t\t\treturn [{\r\n\t\t\t\tz: tz,\r\n\t\t\t\tdraw: function() {\r\n\t\t\t\t\tme.draw.apply(me, arguments);\r\n\t\t\t\t}\r\n\t\t\t}];\r\n\t\t}\r\n\r\n\t\treturn [{\r\n\t\t\tz: gz,\r\n\t\t\tdraw: function() {\r\n\t\t\t\tme._drawGrid.apply(me, arguments);\r\n\t\t\t\tme._drawTitle.apply(me, arguments);\r\n\t\t\t}\r\n\t\t}, {\r\n\t\t\tz: tz,\r\n\t\t\tdraw: function() {\r\n\t\t\t\tme._drawLabels.apply(me, arguments);\r\n\t\t\t}\r\n\t\t}];\r\n\t},\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n\t_getMatchingVisibleMetas: function(type) {\r\n\t\tvar me = this;\r\n\t\tvar isHorizontal = me.isHorizontal();\r\n\t\treturn me.chart._getSortedVisibleDatasetMetas()\r\n\t\t\t.filter(function(meta) {\r\n\t\t\t\treturn (!type || meta.type === type)\r\n\t\t\t\t\t&& (isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id);\r\n\t\t\t});\r\n\t}\r\n});\r\n\r\nScale.prototype._draw = Scale.prototype.draw;\r\n\r\nvar core_scale = Scale;\n\nvar isNullOrUndef$1 = helpers$1.isNullOrUndef;\r\n\r\nvar defaultConfig = {\r\n\tposition: 'bottom'\r\n};\r\n\r\nvar scale_category = core_scale.extend({\r\n\tdetermineDataLimits: function() {\r\n\t\tvar me = this;\r\n\t\tvar labels = me._getLabels();\r\n\t\tvar ticksOpts = me.options.ticks;\r\n\t\tvar min = ticksOpts.min;\r\n\t\tvar max = ticksOpts.max;\r\n\t\tvar minIndex = 0;\r\n\t\tvar maxIndex = labels.length - 1;\r\n\t\tvar findIndex;\r\n\r\n\t\tif (min !== undefined) {\r\n\t\t\t// user specified min value\r\n\t\t\tfindIndex = labels.indexOf(min);\r\n\t\t\tif (findIndex >= 0) {\r\n\t\t\t\tminIndex = findIndex;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (max !== undefined) {\r\n\t\t\t// user specified max value\r\n\t\t\tfindIndex = labels.indexOf(max);\r\n\t\t\tif (findIndex >= 0) {\r\n\t\t\t\tmaxIndex = findIndex;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tme.minIndex = minIndex;\r\n\t\tme.maxIndex = maxIndex;\r\n\t\tme.min = labels[minIndex];\r\n\t\tme.max = labels[maxIndex];\r\n\t},\r\n\r\n\tbuildTicks: function() {\r\n\t\tvar me = this;\r\n\t\tvar labels = me._getLabels();\r\n\t\tvar minIndex = me.minIndex;\r\n\t\tvar maxIndex = me.maxIndex;\r\n\r\n\t\t// If we are viewing some subset of labels, slice the original array\r\n\t\tme.ticks = (minIndex === 0 && maxIndex === labels.length - 1) ? labels : labels.slice(minIndex, maxIndex + 1);\r\n\t},\r\n\r\n\tgetLabelForIndex: function(index, datasetIndex) {\r\n\t\tvar me = this;\r\n\t\tvar chart = me.chart;\r\n\r\n\t\tif (chart.getDatasetMeta(datasetIndex).controller._getValueScaleId() === me.id) {\r\n\t\t\treturn me.getRightValue(chart.data.datasets[datasetIndex].data[index]);\r\n\t\t}\r\n\r\n\t\treturn me._getLabels()[index];\r\n\t},\r\n\r\n\t_configure: function() {\r\n\t\tvar me = this;\r\n\t\tvar offset = me.options.offset;\r\n\t\tvar ticks = me.ticks;\r\n\r\n\t\tcore_scale.prototype._configure.call(me);\r\n\r\n\t\tif (!me.isHorizontal()) {\r\n\t\t\t// For backward compatibility, vertical category scale reverse is inverted.\r\n\t\t\tme._reversePixels = !me._reversePixels;\r\n\t\t}\r\n\r\n\t\tif (!ticks) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tme._startValue = me.minIndex - (offset ? 0.5 : 0);\r\n\t\tme._valueRange = Math.max(ticks.length - (offset ? 0 : 1), 1);\r\n\t},\r\n\r\n\t// Used to get data value locations.  Value can either be an index or a numerical value\r\n\tgetPixelForValue: function(value, index, datasetIndex) {\r\n\t\tvar me = this;\r\n\t\tvar valueCategory, labels, idx;\r\n\r\n\t\tif (!isNullOrUndef$1(index) && !isNullOrUndef$1(datasetIndex)) {\r\n\t\t\tvalue = me.chart.data.datasets[datasetIndex].data[index];\r\n\t\t}\r\n\r\n\t\t// If value is a data object, then index is the index in the data array,\r\n\t\t// not the index of the scale. We need to change that.\r\n\t\tif (!isNullOrUndef$1(value)) {\r\n\t\t\tvalueCategory = me.isHorizontal() ? value.x : value.y;\r\n\t\t}\r\n\t\tif (valueCategory !== undefined || (value !== undefined && isNaN(index))) {\r\n\t\t\tlabels = me._getLabels();\r\n\t\t\tvalue = helpers$1.valueOrDefault(valueCategory, value);\r\n\t\t\tidx = labels.indexOf(value);\r\n\t\t\tindex = idx !== -1 ? idx : index;\r\n\t\t\tif (isNaN(index)) {\r\n\t\t\t\tindex = value;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn me.getPixelForDecimal((index - me._startValue) / me._valueRange);\r\n\t},\r\n\r\n\tgetPixelForTick: function(index) {\r\n\t\tvar ticks = this.ticks;\r\n\t\treturn index < 0 || index > ticks.length - 1\r\n\t\t\t? null\r\n\t\t\t: this.getPixelForValue(ticks[index], index + this.minIndex);\r\n\t},\r\n\r\n\tgetValueForPixel: function(pixel) {\r\n\t\tvar me = this;\r\n\t\tvar value = Math.round(me._startValue + me.getDecimalForPixel(pixel) * me._valueRange);\r\n\t\treturn Math.min(Math.max(value, 0), me.ticks.length - 1);\r\n\t},\r\n\r\n\tgetBasePixel: function() {\r\n\t\treturn this.bottom;\r\n\t}\r\n});\r\n\r\n// INTERNAL: static default options, registered in src/index.js\r\nvar _defaults = defaultConfig;\nscale_category._defaults = _defaults;\n\nvar noop = helpers$1.noop;\r\nvar isNullOrUndef$2 = helpers$1.isNullOrUndef;\r\n\r\n/**\r\n * Generate a set of linear ticks\r\n * @param generationOptions the options used to generate the ticks\r\n * @param dataRange the range of the data\r\n * @returns {number[]} array of tick values\r\n */\r\nfunction generateTicks(generationOptions, dataRange) {\r\n\tvar ticks = [];\r\n\t// To get a \"nice\" value for the tick spacing, we will use the appropriately named\r\n\t// \"nice number\" algorithm. See https://stackoverflow.com/questions/8506881/nice-label-algorithm-for-charts-with-minimum-ticks\r\n\t// for details.\r\n\r\n\tvar MIN_SPACING = 1e-14;\r\n\tvar stepSize = generationOptions.stepSize;\r\n\tvar unit = stepSize || 1;\r\n\tvar maxNumSpaces = generationOptions.maxTicks - 1;\r\n\tvar min = generationOptions.min;\r\n\tvar max = generationOptions.max;\r\n\tvar precision = generationOptions.precision;\r\n\tvar rmin = dataRange.min;\r\n\tvar rmax = dataRange.max;\r\n\tvar spacing = helpers$1.niceNum((rmax - rmin) / maxNumSpaces / unit) * unit;\r\n\tvar factor, niceMin, niceMax, numSpaces;\r\n\r\n\t// Beyond MIN_SPACING floating point numbers being to lose precision\r\n\t// such that we can't do the math necessary to generate ticks\r\n\tif (spacing < MIN_SPACING && isNullOrUndef$2(min) && isNullOrUndef$2(max)) {\r\n\t\treturn [rmin, rmax];\r\n\t}\r\n\r\n\tnumSpaces = Math.ceil(rmax / spacing) - Math.floor(rmin / spacing);\r\n\tif (numSpaces > maxNumSpaces) {\r\n\t\t// If the calculated num of spaces exceeds maxNumSpaces, recalculate it\r\n\t\tspacing = helpers$1.niceNum(numSpaces * spacing / maxNumSpaces / unit) * unit;\r\n\t}\r\n\r\n\tif (stepSize || isNullOrUndef$2(precision)) {\r\n\t\t// If a precision is not specified, calculate factor based on spacing\r\n\t\tfactor = Math.pow(10, helpers$1._decimalPlaces(spacing));\r\n\t} else {\r\n\t\t// If the user specified a precision, round to that number of decimal places\r\n\t\tfactor = Math.pow(10, precision);\r\n\t\tspacing = Math.ceil(spacing * factor) / factor;\r\n\t}\r\n\r\n\tniceMin = Math.floor(rmin / spacing) * spacing;\r\n\tniceMax = Math.ceil(rmax / spacing) * spacing;\r\n\r\n\t// If min, max and stepSize is set and they make an evenly spaced scale use it.\r\n\tif (stepSize) {\r\n\t\t// If very close to our whole number, use it.\r\n\t\tif (!isNullOrUndef$2(min) && helpers$1.almostWhole(min / spacing, spacing / 1000)) {\r\n\t\t\tniceMin = min;\r\n\t\t}\r\n\t\tif (!isNullOrUndef$2(max) && helpers$1.almostWhole(max / spacing, spacing / 1000)) {\r\n\t\t\tniceMax = max;\r\n\t\t}\r\n\t}\r\n\r\n\tnumSpaces = (niceMax - niceMin) / spacing;\r\n\t// If very close to our rounded value, use it.\r\n\tif (helpers$1.almostEquals(numSpaces, Math.round(numSpaces), spacing / 1000)) {\r\n\t\tnumSpaces = Math.round(numSpaces);\r\n\t} else {\r\n\t\tnumSpaces = Math.ceil(numSpaces);\r\n\t}\r\n\r\n\tniceMin = Math.round(niceMin * factor) / factor;\r\n\tniceMax = Math.round(niceMax * factor) / factor;\r\n\tticks.push(isNullOrUndef$2(min) ? niceMin : min);\r\n\tfor (var j = 1; j < numSpaces; ++j) {\r\n\t\tticks.push(Math.round((niceMin + j * spacing) * factor) / factor);\r\n\t}\r\n\tticks.push(isNullOrUndef$2(max) ? niceMax : max);\r\n\r\n\treturn ticks;\r\n}\r\n\r\nvar scale_linearbase = core_scale.extend({\r\n\tgetRightValue: function(value) {\r\n\t\tif (typeof value === 'string') {\r\n\t\t\treturn +value;\r\n\t\t}\r\n\t\treturn core_scale.prototype.getRightValue.call(this, value);\r\n\t},\r\n\r\n\thandleTickRangeOptions: function() {\r\n\t\tvar me = this;\r\n\t\tvar opts = me.options;\r\n\t\tvar tickOpts = opts.ticks;\r\n\r\n\t\t// If we are forcing it to begin at 0, but 0 will already be rendered on the chart,\r\n\t\t// do nothing since that would make the chart weird. If the user really wants a weird chart\r\n\t\t// axis, they can manually override it\r\n\t\tif (tickOpts.beginAtZero) {\r\n\t\t\tvar minSign = helpers$1.sign(me.min);\r\n\t\t\tvar maxSign = helpers$1.sign(me.max);\r\n\r\n\t\t\tif (minSign < 0 && maxSign < 0) {\r\n\t\t\t\t// move the top up to 0\r\n\t\t\t\tme.max = 0;\r\n\t\t\t} else if (minSign > 0 && maxSign > 0) {\r\n\t\t\t\t// move the bottom down to 0\r\n\t\t\t\tme.min = 0;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tvar setMin = tickOpts.min !== undefined || tickOpts.suggestedMin !== undefined;\r\n\t\tvar setMax = tickOpts.max !== undefined || tickOpts.suggestedMax !== undefined;\r\n\r\n\t\tif (tickOpts.min !== undefined) {\r\n\t\t\tme.min = tickOpts.min;\r\n\t\t} else if (tickOpts.suggestedMin !== undefined) {\r\n\t\t\tif (me.min === null) {\r\n\t\t\t\tme.min = tickOpts.suggestedMin;\r\n\t\t\t} else {\r\n\t\t\t\tme.min = Math.min(me.min, tickOpts.suggestedMin);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (tickOpts.max !== undefined) {\r\n\t\t\tme.max = tickOpts.max;\r\n\t\t} else if (tickOpts.suggestedMax !== undefined) {\r\n\t\t\tif (me.max === null) {\r\n\t\t\t\tme.max = tickOpts.suggestedMax;\r\n\t\t\t} else {\r\n\t\t\t\tme.max = Math.max(me.max, tickOpts.suggestedMax);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (setMin !== setMax) {\r\n\t\t\t// We set the min or the max but not both.\r\n\t\t\t// So ensure that our range is good\r\n\t\t\t// Inverted or 0 length range can happen when\r\n\t\t\t// ticks.min is set, and no datasets are visible\r\n\t\t\tif (me.min >= me.max) {\r\n\t\t\t\tif (setMin) {\r\n\t\t\t\t\tme.max = me.min + 1;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tme.min = me.max - 1;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (me.min === me.max) {\r\n\t\t\tme.max++;\r\n\r\n\t\t\tif (!tickOpts.beginAtZero) {\r\n\t\t\t\tme.min--;\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\tgetTickLimit: function() {\r\n\t\tvar me = this;\r\n\t\tvar tickOpts = me.options.ticks;\r\n\t\tvar stepSize = tickOpts.stepSize;\r\n\t\tvar maxTicksLimit = tickOpts.maxTicksLimit;\r\n\t\tvar maxTicks;\r\n\r\n\t\tif (stepSize) {\r\n\t\t\tmaxTicks = Math.ceil(me.max / stepSize) - Math.floor(me.min / stepSize) + 1;\r\n\t\t} else {\r\n\t\t\tmaxTicks = me._computeTickLimit();\r\n\t\t\tmaxTicksLimit = maxTicksLimit || 11;\r\n\t\t}\r\n\r\n\t\tif (maxTicksLimit) {\r\n\t\t\tmaxTicks = Math.min(maxTicksLimit, maxTicks);\r\n\t\t}\r\n\r\n\t\treturn maxTicks;\r\n\t},\r\n\r\n\t_computeTickLimit: function() {\r\n\t\treturn Number.POSITIVE_INFINITY;\r\n\t},\r\n\r\n\thandleDirectionalChanges: noop,\r\n\r\n\tbuildTicks: function() {\r\n\t\tvar me = this;\r\n\t\tvar opts = me.options;\r\n\t\tvar tickOpts = opts.ticks;\r\n\r\n\t\t// Figure out what the max number of ticks we can support it is based on the size of\r\n\t\t// the axis area. For now, we say that the minimum tick spacing in pixels must be 40\r\n\t\t// We also limit the maximum number of ticks to 11 which gives a nice 10 squares on\r\n\t\t// the graph. Make sure we always have at least 2 ticks\r\n\t\tvar maxTicks = me.getTickLimit();\r\n\t\tmaxTicks = Math.max(2, maxTicks);\r\n\r\n\t\tvar numericGeneratorOptions = {\r\n\t\t\tmaxTicks: maxTicks,\r\n\t\t\tmin: tickOpts.min,\r\n\t\t\tmax: tickOpts.max,\r\n\t\t\tprecision: tickOpts.precision,\r\n\t\t\tstepSize: helpers$1.valueOrDefault(tickOpts.fixedStepSize, tickOpts.stepSize)\r\n\t\t};\r\n\t\tvar ticks = me.ticks = generateTicks(numericGeneratorOptions, me);\r\n\r\n\t\tme.handleDirectionalChanges();\r\n\r\n\t\t// At this point, we need to update our max and min given the tick values since we have expanded the\r\n\t\t// range of the scale\r\n\t\tme.max = helpers$1.max(ticks);\r\n\t\tme.min = helpers$1.min(ticks);\r\n\r\n\t\tif (tickOpts.reverse) {\r\n\t\t\tticks.reverse();\r\n\r\n\t\t\tme.start = me.max;\r\n\t\t\tme.end = me.min;\r\n\t\t} else {\r\n\t\t\tme.start = me.min;\r\n\t\t\tme.end = me.max;\r\n\t\t}\r\n\t},\r\n\r\n\tconvertTicksToLabels: function() {\r\n\t\tvar me = this;\r\n\t\tme.ticksAsNumbers = me.ticks.slice();\r\n\t\tme.zeroLineIndex = me.ticks.indexOf(0);\r\n\r\n\t\tcore_scale.prototype.convertTicksToLabels.call(me);\r\n\t},\r\n\r\n\t_configure: function() {\r\n\t\tvar me = this;\r\n\t\tvar ticks = me.getTicks();\r\n\t\tvar start = me.min;\r\n\t\tvar end = me.max;\r\n\t\tvar offset;\r\n\r\n\t\tcore_scale.prototype._configure.call(me);\r\n\r\n\t\tif (me.options.offset && ticks.length) {\r\n\t\t\toffset = (end - start) / Math.max(ticks.length - 1, 1) / 2;\r\n\t\t\tstart -= offset;\r\n\t\t\tend += offset;\r\n\t\t}\r\n\t\tme._startValue = start;\r\n\t\tme._endValue = end;\r\n\t\tme._valueRange = end - start;\r\n\t}\r\n});\n\nvar defaultConfig$1 = {\r\n\tposition: 'left',\r\n\tticks: {\r\n\t\tcallback: core_ticks.formatters.linear\r\n\t}\r\n};\r\n\r\nvar DEFAULT_MIN = 0;\r\nvar DEFAULT_MAX = 1;\r\n\r\nfunction getOrCreateStack(stacks, stacked, meta) {\r\n\tvar key = [\r\n\t\tmeta.type,\r\n\t\t// we have a separate stack for stack=undefined datasets when the opts.stacked is undefined\r\n\t\tstacked === undefined && meta.stack === undefined ? meta.index : '',\r\n\t\tmeta.stack\r\n\t].join('.');\r\n\r\n\tif (stacks[key] === undefined) {\r\n\t\tstacks[key] = {\r\n\t\t\tpos: [],\r\n\t\t\tneg: []\r\n\t\t};\r\n\t}\r\n\r\n\treturn stacks[key];\r\n}\r\n\r\nfunction stackData(scale, stacks, meta, data) {\r\n\tvar opts = scale.options;\r\n\tvar stacked = opts.stacked;\r\n\tvar stack = getOrCreateStack(stacks, stacked, meta);\r\n\tvar pos = stack.pos;\r\n\tvar neg = stack.neg;\r\n\tvar ilen = data.length;\r\n\tvar i, value;\r\n\r\n\tfor (i = 0; i < ilen; ++i) {\r\n\t\tvalue = scale._parseValue(data[i]);\r\n\t\tif (isNaN(value.min) || isNaN(value.max) || meta.data[i].hidden) {\r\n\t\t\tcontinue;\r\n\t\t}\r\n\r\n\t\tpos[i] = pos[i] || 0;\r\n\t\tneg[i] = neg[i] || 0;\r\n\r\n\t\tif (opts.relativePoints) {\r\n\t\t\tpos[i] = 100;\r\n\t\t} else if (value.min < 0 || value.max < 0) {\r\n\t\t\tneg[i] += value.min;\r\n\t\t} else {\r\n\t\t\tpos[i] += value.max;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nfunction updateMinMax(scale, meta, data) {\r\n\tvar ilen = data.length;\r\n\tvar i, value;\r\n\r\n\tfor (i = 0; i < ilen; ++i) {\r\n\t\tvalue = scale._parseValue(data[i]);\r\n\t\tif (isNaN(value.min) || isNaN(value.max) || meta.data[i].hidden) {\r\n\t\t\tcontinue;\r\n\t\t}\r\n\r\n\t\tscale.min = Math.min(scale.min, value.min);\r\n\t\tscale.max = Math.max(scale.max, value.max);\r\n\t}\r\n}\r\n\r\nvar scale_linear = scale_linearbase.extend({\r\n\tdetermineDataLimits: function() {\r\n\t\tvar me = this;\r\n\t\tvar opts = me.options;\r\n\t\tvar chart = me.chart;\r\n\t\tvar datasets = chart.data.datasets;\r\n\t\tvar metasets = me._getMatchingVisibleMetas();\r\n\t\tvar hasStacks = opts.stacked;\r\n\t\tvar stacks = {};\r\n\t\tvar ilen = metasets.length;\r\n\t\tvar i, meta, data, values;\r\n\r\n\t\tme.min = Number.POSITIVE_INFINITY;\r\n\t\tme.max = Number.NEGATIVE_INFINITY;\r\n\r\n\t\tif (hasStacks === undefined) {\r\n\t\t\tfor (i = 0; !hasStacks && i < ilen; ++i) {\r\n\t\t\t\tmeta = metasets[i];\r\n\t\t\t\thasStacks = meta.stack !== undefined;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tfor (i = 0; i < ilen; ++i) {\r\n\t\t\tmeta = metasets[i];\r\n\t\t\tdata = datasets[meta.index].data;\r\n\t\t\tif (hasStacks) {\r\n\t\t\t\tstackData(me, stacks, meta, data);\r\n\t\t\t} else {\r\n\t\t\t\tupdateMinMax(me, meta, data);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\thelpers$1.each(stacks, function(stackValues) {\r\n\t\t\tvalues = stackValues.pos.concat(stackValues.neg);\r\n\t\t\tme.min = Math.min(me.min, helpers$1.min(values));\r\n\t\t\tme.max = Math.max(me.max, helpers$1.max(values));\r\n\t\t});\r\n\r\n\t\tme.min = helpers$1.isFinite(me.min) && !isNaN(me.min) ? me.min : DEFAULT_MIN;\r\n\t\tme.max = helpers$1.isFinite(me.max) && !isNaN(me.max) ? me.max : DEFAULT_MAX;\r\n\r\n\t\t// Common base implementation to handle ticks.min, ticks.max, ticks.beginAtZero\r\n\t\tme.handleTickRangeOptions();\r\n\t},\r\n\r\n\t// Returns the maximum number of ticks based on the scale dimension\r\n\t_computeTickLimit: function() {\r\n\t\tvar me = this;\r\n\t\tvar tickFont;\r\n\r\n\t\tif (me.isHorizontal()) {\r\n\t\t\treturn Math.ceil(me.width / 40);\r\n\t\t}\r\n\t\ttickFont = helpers$1.options._parseFont(me.options.ticks);\r\n\t\treturn Math.ceil(me.height / tickFont.lineHeight);\r\n\t},\r\n\r\n\t// Called after the ticks are built. We need\r\n\thandleDirectionalChanges: function() {\r\n\t\tif (!this.isHorizontal()) {\r\n\t\t\t// We are in a vertical orientation. The top value is the highest. So reverse the array\r\n\t\t\tthis.ticks.reverse();\r\n\t\t}\r\n\t},\r\n\r\n\tgetLabelForIndex: function(index, datasetIndex) {\r\n\t\treturn this._getScaleLabel(this.chart.data.datasets[datasetIndex].data[index]);\r\n\t},\r\n\r\n\t// Utils\r\n\tgetPixelForValue: function(value) {\r\n\t\tvar me = this;\r\n\t\treturn me.getPixelForDecimal((+me.getRightValue(value) - me._startValue) / me._valueRange);\r\n\t},\r\n\r\n\tgetValueForPixel: function(pixel) {\r\n\t\treturn this._startValue + this.getDecimalForPixel(pixel) * this._valueRange;\r\n\t},\r\n\r\n\tgetPixelForTick: function(index) {\r\n\t\tvar ticks = this.ticksAsNumbers;\r\n\t\tif (index < 0 || index > ticks.length - 1) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\treturn this.getPixelForValue(ticks[index]);\r\n\t}\r\n});\r\n\r\n// INTERNAL: static default options, registered in src/index.js\r\nvar _defaults$1 = defaultConfig$1;\nscale_linear._defaults = _defaults$1;\n\nvar valueOrDefault$b = helpers$1.valueOrDefault;\r\nvar log10 = helpers$1.math.log10;\r\n\r\n/**\r\n * Generate a set of logarithmic ticks\r\n * @param generationOptions the options used to generate the ticks\r\n * @param dataRange the range of the data\r\n * @returns {number[]} array of tick values\r\n */\r\nfunction generateTicks$1(generationOptions, dataRange) {\r\n\tvar ticks = [];\r\n\r\n\tvar tickVal = valueOrDefault$b(generationOptions.min, Math.pow(10, Math.floor(log10(dataRange.min))));\r\n\r\n\tvar endExp = Math.floor(log10(dataRange.max));\r\n\tvar endSignificand = Math.ceil(dataRange.max / Math.pow(10, endExp));\r\n\tvar exp, significand;\r\n\r\n\tif (tickVal === 0) {\r\n\t\texp = Math.floor(log10(dataRange.minNotZero));\r\n\t\tsignificand = Math.floor(dataRange.minNotZero / Math.pow(10, exp));\r\n\r\n\t\tticks.push(tickVal);\r\n\t\ttickVal = significand * Math.pow(10, exp);\r\n\t} else {\r\n\t\texp = Math.floor(log10(tickVal));\r\n\t\tsignificand = Math.floor(tickVal / Math.pow(10, exp));\r\n\t}\r\n\tvar precision = exp < 0 ? Math.pow(10, Math.abs(exp)) : 1;\r\n\r\n\tdo {\r\n\t\tticks.push(tickVal);\r\n\r\n\t\t++significand;\r\n\t\tif (significand === 10) {\r\n\t\t\tsignificand = 1;\r\n\t\t\t++exp;\r\n\t\t\tprecision = exp >= 0 ? 1 : precision;\r\n\t\t}\r\n\r\n\t\ttickVal = Math.round(significand * Math.pow(10, exp) * precision) / precision;\r\n\t} while (exp < endExp || (exp === endExp && significand < endSignificand));\r\n\r\n\tvar lastTick = valueOrDefault$b(generationOptions.max, tickVal);\r\n\tticks.push(lastTick);\r\n\r\n\treturn ticks;\r\n}\r\n\r\nvar defaultConfig$2 = {\r\n\tposition: 'left',\r\n\r\n\t// label settings\r\n\tticks: {\r\n\t\tcallback: core_ticks.formatters.logarithmic\r\n\t}\r\n};\r\n\r\n// TODO(v3): change this to positiveOrDefault\r\nfunction nonNegativeOrDefault(value, defaultValue) {\r\n\treturn helpers$1.isFinite(value) && value >= 0 ? value : defaultValue;\r\n}\r\n\r\nvar scale_logarithmic = core_scale.extend({\r\n\tdetermineDataLimits: function() {\r\n\t\tvar me = this;\r\n\t\tvar opts = me.options;\r\n\t\tvar chart = me.chart;\r\n\t\tvar datasets = chart.data.datasets;\r\n\t\tvar isHorizontal = me.isHorizontal();\r\n\t\tfunction IDMatches(meta) {\r\n\t\t\treturn isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id;\r\n\t\t}\r\n\t\tvar datasetIndex, meta, value, data, i, ilen;\r\n\r\n\t\t// Calculate Range\r\n\t\tme.min = Number.POSITIVE_INFINITY;\r\n\t\tme.max = Number.NEGATIVE_INFINITY;\r\n\t\tme.minNotZero = Number.POSITIVE_INFINITY;\r\n\r\n\t\tvar hasStacks = opts.stacked;\r\n\t\tif (hasStacks === undefined) {\r\n\t\t\tfor (datasetIndex = 0; datasetIndex < datasets.length; datasetIndex++) {\r\n\t\t\t\tmeta = chart.getDatasetMeta(datasetIndex);\r\n\t\t\t\tif (chart.isDatasetVisible(datasetIndex) && IDMatches(meta) &&\r\n\t\t\t\t\tmeta.stack !== undefined) {\r\n\t\t\t\t\thasStacks = true;\r\n\t\t\t\t\tbreak;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (opts.stacked || hasStacks) {\r\n\t\t\tvar valuesPerStack = {};\r\n\r\n\t\t\tfor (datasetIndex = 0; datasetIndex < datasets.length; datasetIndex++) {\r\n\t\t\t\tmeta = chart.getDatasetMeta(datasetIndex);\r\n\t\t\t\tvar key = [\r\n\t\t\t\t\tmeta.type,\r\n\t\t\t\t\t// we have a separate stack for stack=undefined datasets when the opts.stacked is undefined\r\n\t\t\t\t\t((opts.stacked === undefined && meta.stack === undefined) ? datasetIndex : ''),\r\n\t\t\t\t\tmeta.stack\r\n\t\t\t\t].join('.');\r\n\r\n\t\t\t\tif (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {\r\n\t\t\t\t\tif (valuesPerStack[key] === undefined) {\r\n\t\t\t\t\t\tvaluesPerStack[key] = [];\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tdata = datasets[datasetIndex].data;\r\n\t\t\t\t\tfor (i = 0, ilen = data.length; i < ilen; i++) {\r\n\t\t\t\t\t\tvar values = valuesPerStack[key];\r\n\t\t\t\t\t\tvalue = me._parseValue(data[i]);\r\n\t\t\t\t\t\t// invalid, hidden and negative values are ignored\r\n\t\t\t\t\t\tif (isNaN(value.min) || isNaN(value.max) || meta.data[i].hidden || value.min < 0 || value.max < 0) {\r\n\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tvalues[i] = values[i] || 0;\r\n\t\t\t\t\t\tvalues[i] += value.max;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\thelpers$1.each(valuesPerStack, function(valuesForType) {\r\n\t\t\t\tif (valuesForType.length > 0) {\r\n\t\t\t\t\tvar minVal = helpers$1.min(valuesForType);\r\n\t\t\t\t\tvar maxVal = helpers$1.max(valuesForType);\r\n\t\t\t\t\tme.min = Math.min(me.min, minVal);\r\n\t\t\t\t\tme.max = Math.max(me.max, maxVal);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\r\n\t\t} else {\r\n\t\t\tfor (datasetIndex = 0; datasetIndex < datasets.length; datasetIndex++) {\r\n\t\t\t\tmeta = chart.getDatasetMeta(datasetIndex);\r\n\t\t\t\tif (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) {\r\n\t\t\t\t\tdata = datasets[datasetIndex].data;\r\n\t\t\t\t\tfor (i = 0, ilen = data.length; i < ilen; i++) {\r\n\t\t\t\t\t\tvalue = me._parseValue(data[i]);\r\n\t\t\t\t\t\t// invalid, hidden and negative values are ignored\r\n\t\t\t\t\t\tif (isNaN(value.min) || isNaN(value.max) || meta.data[i].hidden || value.min < 0 || value.max < 0) {\r\n\t\t\t\t\t\t\tcontinue;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tme.min = Math.min(value.min, me.min);\r\n\t\t\t\t\t\tme.max = Math.max(value.max, me.max);\r\n\r\n\t\t\t\t\t\tif (value.min !== 0) {\r\n\t\t\t\t\t\t\tme.minNotZero = Math.min(value.min, me.minNotZero);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tme.min = helpers$1.isFinite(me.min) ? me.min : null;\r\n\t\tme.max = helpers$1.isFinite(me.max) ? me.max : null;\r\n\t\tme.minNotZero = helpers$1.isFinite(me.minNotZero) ? me.minNotZero : null;\r\n\r\n\t\t// Common base implementation to handle ticks.min, ticks.max\r\n\t\tthis.handleTickRangeOptions();\r\n\t},\r\n\r\n\thandleTickRangeOptions: function() {\r\n\t\tvar me = this;\r\n\t\tvar tickOpts = me.options.ticks;\r\n\t\tvar DEFAULT_MIN = 1;\r\n\t\tvar DEFAULT_MAX = 10;\r\n\r\n\t\tme.min = nonNegativeOrDefault(tickOpts.min, me.min);\r\n\t\tme.max = nonNegativeOrDefault(tickOpts.max, me.max);\r\n\r\n\t\tif (me.min === me.max) {\r\n\t\t\tif (me.min !== 0 && me.min !== null) {\r\n\t\t\t\tme.min = Math.pow(10, Math.floor(log10(me.min)) - 1);\r\n\t\t\t\tme.max = Math.pow(10, Math.floor(log10(me.max)) + 1);\r\n\t\t\t} else {\r\n\t\t\t\tme.min = DEFAULT_MIN;\r\n\t\t\t\tme.max = DEFAULT_MAX;\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (me.min === null) {\r\n\t\t\tme.min = Math.pow(10, Math.floor(log10(me.max)) - 1);\r\n\t\t}\r\n\t\tif (me.max === null) {\r\n\t\t\tme.max = me.min !== 0\r\n\t\t\t\t? Math.pow(10, Math.floor(log10(me.min)) + 1)\r\n\t\t\t\t: DEFAULT_MAX;\r\n\t\t}\r\n\t\tif (me.minNotZero === null) {\r\n\t\t\tif (me.min > 0) {\r\n\t\t\t\tme.minNotZero = me.min;\r\n\t\t\t} else if (me.max < 1) {\r\n\t\t\t\tme.minNotZero = Math.pow(10, Math.floor(log10(me.max)));\r\n\t\t\t} else {\r\n\t\t\t\tme.minNotZero = DEFAULT_MIN;\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\tbuildTicks: function() {\r\n\t\tvar me = this;\r\n\t\tvar tickOpts = me.options.ticks;\r\n\t\tvar reverse = !me.isHorizontal();\r\n\r\n\t\tvar generationOptions = {\r\n\t\t\tmin: nonNegativeOrDefault(tickOpts.min),\r\n\t\t\tmax: nonNegativeOrDefault(tickOpts.max)\r\n\t\t};\r\n\t\tvar ticks = me.ticks = generateTicks$1(generationOptions, me);\r\n\r\n\t\t// At this point, we need to update our max and min given the tick values since we have expanded the\r\n\t\t// range of the scale\r\n\t\tme.max = helpers$1.max(ticks);\r\n\t\tme.min = helpers$1.min(ticks);\r\n\r\n\t\tif (tickOpts.reverse) {\r\n\t\t\treverse = !reverse;\r\n\t\t\tme.start = me.max;\r\n\t\t\tme.end = me.min;\r\n\t\t} else {\r\n\t\t\tme.start = me.min;\r\n\t\t\tme.end = me.max;\r\n\t\t}\r\n\t\tif (reverse) {\r\n\t\t\tticks.reverse();\r\n\t\t}\r\n\t},\r\n\r\n\tconvertTicksToLabels: function() {\r\n\t\tthis.tickValues = this.ticks.slice();\r\n\r\n\t\tcore_scale.prototype.convertTicksToLabels.call(this);\r\n\t},\r\n\r\n\t// Get the correct tooltip label\r\n\tgetLabelForIndex: function(index, datasetIndex) {\r\n\t\treturn this._getScaleLabel(this.chart.data.datasets[datasetIndex].data[index]);\r\n\t},\r\n\r\n\tgetPixelForTick: function(index) {\r\n\t\tvar ticks = this.tickValues;\r\n\t\tif (index < 0 || index > ticks.length - 1) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\treturn this.getPixelForValue(ticks[index]);\r\n\t},\r\n\r\n\t/**\r\n\t * Returns the value of the first tick.\r\n\t * @param {number} value - The minimum not zero value.\r\n\t * @return {number} The first tick value.\r\n\t * @private\r\n\t */\r\n\t_getFirstTickValue: function(value) {\r\n\t\tvar exp = Math.floor(log10(value));\r\n\t\tvar significand = Math.floor(value / Math.pow(10, exp));\r\n\r\n\t\treturn significand * Math.pow(10, exp);\r\n\t},\r\n\r\n\t_configure: function() {\r\n\t\tvar me = this;\r\n\t\tvar start = me.min;\r\n\t\tvar offset = 0;\r\n\r\n\t\tcore_scale.prototype._configure.call(me);\r\n\r\n\t\tif (start === 0) {\r\n\t\t\tstart = me._getFirstTickValue(me.minNotZero);\r\n\t\t\toffset = valueOrDefault$b(me.options.ticks.fontSize, core_defaults.global.defaultFontSize) / me._length;\r\n\t\t}\r\n\r\n\t\tme._startValue = log10(start);\r\n\t\tme._valueOffset = offset;\r\n\t\tme._valueRange = (log10(me.max) - log10(start)) / (1 - offset);\r\n\t},\r\n\r\n\tgetPixelForValue: function(value) {\r\n\t\tvar me = this;\r\n\t\tvar decimal = 0;\r\n\r\n\t\tvalue = +me.getRightValue(value);\r\n\r\n\t\tif (value > me.min && value > 0) {\r\n\t\t\tdecimal = (log10(value) - me._startValue) / me._valueRange + me._valueOffset;\r\n\t\t}\r\n\t\treturn me.getPixelForDecimal(decimal);\r\n\t},\r\n\r\n\tgetValueForPixel: function(pixel) {\r\n\t\tvar me = this;\r\n\t\tvar decimal = me.getDecimalForPixel(pixel);\r\n\t\treturn decimal === 0 && me.min === 0\r\n\t\t\t? 0\r\n\t\t\t: Math.pow(10, me._startValue + (decimal - me._valueOffset) * me._valueRange);\r\n\t}\r\n});\r\n\r\n// INTERNAL: static default options, registered in src/index.js\r\nvar _defaults$2 = defaultConfig$2;\nscale_logarithmic._defaults = _defaults$2;\n\nvar valueOrDefault$c = helpers$1.valueOrDefault;\r\nvar valueAtIndexOrDefault$1 = helpers$1.valueAtIndexOrDefault;\r\nvar resolve$4 = helpers$1.options.resolve;\r\n\r\nvar defaultConfig$3 = {\r\n\tdisplay: true,\r\n\r\n\t// Boolean - Whether to animate scaling the chart from the centre\r\n\tanimate: true,\r\n\tposition: 'chartArea',\r\n\r\n\tangleLines: {\r\n\t\tdisplay: true,\r\n\t\tcolor: 'rgba(0,0,0,0.1)',\r\n\t\tlineWidth: 1,\r\n\t\tborderDash: [],\r\n\t\tborderDashOffset: 0.0\r\n\t},\r\n\r\n\tgridLines: {\r\n\t\tcircular: false\r\n\t},\r\n\r\n\t// label settings\r\n\tticks: {\r\n\t\t// Boolean - Show a backdrop to the scale label\r\n\t\tshowLabelBackdrop: true,\r\n\r\n\t\t// String - The colour of the label backdrop\r\n\t\tbackdropColor: 'rgba(255,255,255,0.75)',\r\n\r\n\t\t// Number - The backdrop padding above & below the label in pixels\r\n\t\tbackdropPaddingY: 2,\r\n\r\n\t\t// Number - The backdrop padding to the side of the label in pixels\r\n\t\tbackdropPaddingX: 2,\r\n\r\n\t\tcallback: core_ticks.formatters.linear\r\n\t},\r\n\r\n\tpointLabels: {\r\n\t\t// Boolean - if true, show point labels\r\n\t\tdisplay: true,\r\n\r\n\t\t// Number - Point label font size in pixels\r\n\t\tfontSize: 10,\r\n\r\n\t\t// Function - Used to convert point labels\r\n\t\tcallback: function(label) {\r\n\t\t\treturn label;\r\n\t\t}\r\n\t}\r\n};\r\n\r\nfunction getTickBackdropHeight(opts) {\r\n\tvar tickOpts = opts.ticks;\r\n\r\n\tif (tickOpts.display && opts.display) {\r\n\t\treturn valueOrDefault$c(tickOpts.fontSize, core_defaults.global.defaultFontSize) + tickOpts.backdropPaddingY * 2;\r\n\t}\r\n\treturn 0;\r\n}\r\n\r\nfunction measureLabelSize(ctx, lineHeight, label) {\r\n\tif (helpers$1.isArray(label)) {\r\n\t\treturn {\r\n\t\t\tw: helpers$1.longestText(ctx, ctx.font, label),\r\n\t\t\th: label.length * lineHeight\r\n\t\t};\r\n\t}\r\n\r\n\treturn {\r\n\t\tw: ctx.measureText(label).width,\r\n\t\th: lineHeight\r\n\t};\r\n}\r\n\r\nfunction determineLimits(angle, pos, size, min, max) {\r\n\tif (angle === min || angle === max) {\r\n\t\treturn {\r\n\t\t\tstart: pos - (size / 2),\r\n\t\t\tend: pos + (size / 2)\r\n\t\t};\r\n\t} else if (angle < min || angle > max) {\r\n\t\treturn {\r\n\t\t\tstart: pos - size,\r\n\t\t\tend: pos\r\n\t\t};\r\n\t}\r\n\r\n\treturn {\r\n\t\tstart: pos,\r\n\t\tend: pos + size\r\n\t};\r\n}\r\n\r\n/**\r\n * Helper function to fit a radial linear scale with point labels\r\n */\r\nfunction fitWithPointLabels(scale) {\r\n\r\n\t// Right, this is really confusing and there is a lot of maths going on here\r\n\t// The gist of the problem is here: https://gist.github.com/nnnick/696cc9c55f4b0beb8fe9\r\n\t//\r\n\t// Reaction: https://dl.dropboxusercontent.com/u/34601363/toomuchscience.gif\r\n\t//\r\n\t// Solution:\r\n\t//\r\n\t// We assume the radius of the polygon is half the size of the canvas at first\r\n\t// at each index we check if the text overlaps.\r\n\t//\r\n\t// Where it does, we store that angle and that index.\r\n\t//\r\n\t// After finding the largest index and angle we calculate how much we need to remove\r\n\t// from the shape radius to move the point inwards by that x.\r\n\t//\r\n\t// We average the left and right distances to get the maximum shape radius that can fit in the box\r\n\t// along with labels.\r\n\t//\r\n\t// Once we have that, we can find the centre point for the chart, by taking the x text protrusion\r\n\t// on each side, removing that from the size, halving it and adding the left x protrusion width.\r\n\t//\r\n\t// This will mean we have a shape fitted to the canvas, as large as it can be with the labels\r\n\t// and position it in the most space efficient manner\r\n\t//\r\n\t// https://dl.dropboxusercontent.com/u/34601363/yeahscience.gif\r\n\r\n\tvar plFont = helpers$1.options._parseFont(scale.options.pointLabels);\r\n\r\n\t// Get maximum radius of the polygon. Either half the height (minus the text width) or half the width.\r\n\t// Use this to calculate the offset + change. - Make sure L/R protrusion is at least 0 to stop issues with centre points\r\n\tvar furthestLimits = {\r\n\t\tl: 0,\r\n\t\tr: scale.width,\r\n\t\tt: 0,\r\n\t\tb: scale.height - scale.paddingTop\r\n\t};\r\n\tvar furthestAngles = {};\r\n\tvar i, textSize, pointPosition;\r\n\r\n\tscale.ctx.font = plFont.string;\r\n\tscale._pointLabelSizes = [];\r\n\r\n\tvar valueCount = scale.chart.data.labels.length;\r\n\tfor (i = 0; i < valueCount; i++) {\r\n\t\tpointPosition = scale.getPointPosition(i, scale.drawingArea + 5);\r\n\t\ttextSize = measureLabelSize(scale.ctx, plFont.lineHeight, scale.pointLabels[i]);\r\n\t\tscale._pointLabelSizes[i] = textSize;\r\n\r\n\t\t// Add quarter circle to make degree 0 mean top of circle\r\n\t\tvar angleRadians = scale.getIndexAngle(i);\r\n\t\tvar angle = helpers$1.toDegrees(angleRadians) % 360;\r\n\t\tvar hLimits = determineLimits(angle, pointPosition.x, textSize.w, 0, 180);\r\n\t\tvar vLimits = determineLimits(angle, pointPosition.y, textSize.h, 90, 270);\r\n\r\n\t\tif (hLimits.start < furthestLimits.l) {\r\n\t\t\tfurthestLimits.l = hLimits.start;\r\n\t\t\tfurthestAngles.l = angleRadians;\r\n\t\t}\r\n\r\n\t\tif (hLimits.end > furthestLimits.r) {\r\n\t\t\tfurthestLimits.r = hLimits.end;\r\n\t\t\tfurthestAngles.r = angleRadians;\r\n\t\t}\r\n\r\n\t\tif (vLimits.start < furthestLimits.t) {\r\n\t\t\tfurthestLimits.t = vLimits.start;\r\n\t\t\tfurthestAngles.t = angleRadians;\r\n\t\t}\r\n\r\n\t\tif (vLimits.end > furthestLimits.b) {\r\n\t\t\tfurthestLimits.b = vLimits.end;\r\n\t\t\tfurthestAngles.b = angleRadians;\r\n\t\t}\r\n\t}\r\n\r\n\tscale.setReductions(scale.drawingArea, furthestLimits, furthestAngles);\r\n}\r\n\r\nfunction getTextAlignForAngle(angle) {\r\n\tif (angle === 0 || angle === 180) {\r\n\t\treturn 'center';\r\n\t} else if (angle < 180) {\r\n\t\treturn 'left';\r\n\t}\r\n\r\n\treturn 'right';\r\n}\r\n\r\nfunction fillText(ctx, text, position, lineHeight) {\r\n\tvar y = position.y + lineHeight / 2;\r\n\tvar i, ilen;\r\n\r\n\tif (helpers$1.isArray(text)) {\r\n\t\tfor (i = 0, ilen = text.length; i < ilen; ++i) {\r\n\t\t\tctx.fillText(text[i], position.x, y);\r\n\t\t\ty += lineHeight;\r\n\t\t}\r\n\t} else {\r\n\t\tctx.fillText(text, position.x, y);\r\n\t}\r\n}\r\n\r\nfunction adjustPointPositionForLabelHeight(angle, textSize, position) {\r\n\tif (angle === 90 || angle === 270) {\r\n\t\tposition.y -= (textSize.h / 2);\r\n\t} else if (angle > 270 || angle < 90) {\r\n\t\tposition.y -= textSize.h;\r\n\t}\r\n}\r\n\r\nfunction drawPointLabels(scale) {\r\n\tvar ctx = scale.ctx;\r\n\tvar opts = scale.options;\r\n\tvar pointLabelOpts = opts.pointLabels;\r\n\tvar tickBackdropHeight = getTickBackdropHeight(opts);\r\n\tvar outerDistance = scale.getDistanceFromCenterForValue(opts.ticks.reverse ? scale.min : scale.max);\r\n\tvar plFont = helpers$1.options._parseFont(pointLabelOpts);\r\n\r\n\tctx.save();\r\n\r\n\tctx.font = plFont.string;\r\n\tctx.textBaseline = 'middle';\r\n\r\n\tfor (var i = scale.chart.data.labels.length - 1; i >= 0; i--) {\r\n\t\t// Extra pixels out for some label spacing\r\n\t\tvar extra = (i === 0 ? tickBackdropHeight / 2 : 0);\r\n\t\tvar pointLabelPosition = scale.getPointPosition(i, outerDistance + extra + 5);\r\n\r\n\t\t// Keep this in loop since we may support array properties here\r\n\t\tvar pointLabelFontColor = valueAtIndexOrDefault$1(pointLabelOpts.fontColor, i, core_defaults.global.defaultFontColor);\r\n\t\tctx.fillStyle = pointLabelFontColor;\r\n\r\n\t\tvar angleRadians = scale.getIndexAngle(i);\r\n\t\tvar angle = helpers$1.toDegrees(angleRadians);\r\n\t\tctx.textAlign = getTextAlignForAngle(angle);\r\n\t\tadjustPointPositionForLabelHeight(angle, scale._pointLabelSizes[i], pointLabelPosition);\r\n\t\tfillText(ctx, scale.pointLabels[i], pointLabelPosition, plFont.lineHeight);\r\n\t}\r\n\tctx.restore();\r\n}\r\n\r\nfunction drawRadiusLine(scale, gridLineOpts, radius, index) {\r\n\tvar ctx = scale.ctx;\r\n\tvar circular = gridLineOpts.circular;\r\n\tvar valueCount = scale.chart.data.labels.length;\r\n\tvar lineColor = valueAtIndexOrDefault$1(gridLineOpts.color, index - 1);\r\n\tvar lineWidth = valueAtIndexOrDefault$1(gridLineOpts.lineWidth, index - 1);\r\n\tvar pointPosition;\r\n\r\n\tif ((!circular && !valueCount) || !lineColor || !lineWidth) {\r\n\t\treturn;\r\n\t}\r\n\r\n\tctx.save();\r\n\tctx.strokeStyle = lineColor;\r\n\tctx.lineWidth = lineWidth;\r\n\tif (ctx.setLineDash) {\r\n\t\tctx.setLineDash(gridLineOpts.borderDash || []);\r\n\t\tctx.lineDashOffset = gridLineOpts.borderDashOffset || 0.0;\r\n\t}\r\n\r\n\tctx.beginPath();\r\n\tif (circular) {\r\n\t\t// Draw circular arcs between the points\r\n\t\tctx.arc(scale.xCenter, scale.yCenter, radius, 0, Math.PI * 2);\r\n\t} else {\r\n\t\t// Draw straight lines connecting each index\r\n\t\tpointPosition = scale.getPointPosition(0, radius);\r\n\t\tctx.moveTo(pointPosition.x, pointPosition.y);\r\n\r\n\t\tfor (var i = 1; i < valueCount; i++) {\r\n\t\t\tpointPosition = scale.getPointPosition(i, radius);\r\n\t\t\tctx.lineTo(pointPosition.x, pointPosition.y);\r\n\t\t}\r\n\t}\r\n\tctx.closePath();\r\n\tctx.stroke();\r\n\tctx.restore();\r\n}\r\n\r\nfunction numberOrZero(param) {\r\n\treturn helpers$1.isNumber(param) ? param : 0;\r\n}\r\n\r\nvar scale_radialLinear = scale_linearbase.extend({\r\n\tsetDimensions: function() {\r\n\t\tvar me = this;\r\n\r\n\t\t// Set the unconstrained dimension before label rotation\r\n\t\tme.width = me.maxWidth;\r\n\t\tme.height = me.maxHeight;\r\n\t\tme.paddingTop = getTickBackdropHeight(me.options) / 2;\r\n\t\tme.xCenter = Math.floor(me.width / 2);\r\n\t\tme.yCenter = Math.floor((me.height - me.paddingTop) / 2);\r\n\t\tme.drawingArea = Math.min(me.height - me.paddingTop, me.width) / 2;\r\n\t},\r\n\r\n\tdetermineDataLimits: function() {\r\n\t\tvar me = this;\r\n\t\tvar chart = me.chart;\r\n\t\tvar min = Number.POSITIVE_INFINITY;\r\n\t\tvar max = Number.NEGATIVE_INFINITY;\r\n\r\n\t\thelpers$1.each(chart.data.datasets, function(dataset, datasetIndex) {\r\n\t\t\tif (chart.isDatasetVisible(datasetIndex)) {\r\n\t\t\t\tvar meta = chart.getDatasetMeta(datasetIndex);\r\n\r\n\t\t\t\thelpers$1.each(dataset.data, function(rawValue, index) {\r\n\t\t\t\t\tvar value = +me.getRightValue(rawValue);\r\n\t\t\t\t\tif (isNaN(value) || meta.data[index].hidden) {\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tmin = Math.min(value, min);\r\n\t\t\t\t\tmax = Math.max(value, max);\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\tme.min = (min === Number.POSITIVE_INFINITY ? 0 : min);\r\n\t\tme.max = (max === Number.NEGATIVE_INFINITY ? 0 : max);\r\n\r\n\t\t// Common base implementation to handle ticks.min, ticks.max, ticks.beginAtZero\r\n\t\tme.handleTickRangeOptions();\r\n\t},\r\n\r\n\t// Returns the maximum number of ticks based on the scale dimension\r\n\t_computeTickLimit: function() {\r\n\t\treturn Math.ceil(this.drawingArea / getTickBackdropHeight(this.options));\r\n\t},\r\n\r\n\tconvertTicksToLabels: function() {\r\n\t\tvar me = this;\r\n\r\n\t\tscale_linearbase.prototype.convertTicksToLabels.call(me);\r\n\r\n\t\t// Point labels\r\n\t\tme.pointLabels = me.chart.data.labels.map(function() {\r\n\t\t\tvar label = helpers$1.callback(me.options.pointLabels.callback, arguments, me);\r\n\t\t\treturn label || label === 0 ? label : '';\r\n\t\t});\r\n\t},\r\n\r\n\tgetLabelForIndex: function(index, datasetIndex) {\r\n\t\treturn +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]);\r\n\t},\r\n\r\n\tfit: function() {\r\n\t\tvar me = this;\r\n\t\tvar opts = me.options;\r\n\r\n\t\tif (opts.display && opts.pointLabels.display) {\r\n\t\t\tfitWithPointLabels(me);\r\n\t\t} else {\r\n\t\t\tme.setCenterPoint(0, 0, 0, 0);\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * Set radius reductions and determine new radius and center point\r\n\t * @private\r\n\t */\r\n\tsetReductions: function(largestPossibleRadius, furthestLimits, furthestAngles) {\r\n\t\tvar me = this;\r\n\t\tvar radiusReductionLeft = furthestLimits.l / Math.sin(furthestAngles.l);\r\n\t\tvar radiusReductionRight = Math.max(furthestLimits.r - me.width, 0) / Math.sin(furthestAngles.r);\r\n\t\tvar radiusReductionTop = -furthestLimits.t / Math.cos(furthestAngles.t);\r\n\t\tvar radiusReductionBottom = -Math.max(furthestLimits.b - (me.height - me.paddingTop), 0) / Math.cos(furthestAngles.b);\r\n\r\n\t\tradiusReductionLeft = numberOrZero(radiusReductionLeft);\r\n\t\tradiusReductionRight = numberOrZero(radiusReductionRight);\r\n\t\tradiusReductionTop = numberOrZero(radiusReductionTop);\r\n\t\tradiusReductionBottom = numberOrZero(radiusReductionBottom);\r\n\r\n\t\tme.drawingArea = Math.min(\r\n\t\t\tMath.floor(largestPossibleRadius - (radiusReductionLeft + radiusReductionRight) / 2),\r\n\t\t\tMath.floor(largestPossibleRadius - (radiusReductionTop + radiusReductionBottom) / 2));\r\n\t\tme.setCenterPoint(radiusReductionLeft, radiusReductionRight, radiusReductionTop, radiusReductionBottom);\r\n\t},\r\n\r\n\tsetCenterPoint: function(leftMovement, rightMovement, topMovement, bottomMovement) {\r\n\t\tvar me = this;\r\n\t\tvar maxRight = me.width - rightMovement - me.drawingArea;\r\n\t\tvar maxLeft = leftMovement + me.drawingArea;\r\n\t\tvar maxTop = topMovement + me.drawingArea;\r\n\t\tvar maxBottom = (me.height - me.paddingTop) - bottomMovement - me.drawingArea;\r\n\r\n\t\tme.xCenter = Math.floor(((maxLeft + maxRight) / 2) + me.left);\r\n\t\tme.yCenter = Math.floor(((maxTop + maxBottom) / 2) + me.top + me.paddingTop);\r\n\t},\r\n\r\n\tgetIndexAngle: function(index) {\r\n\t\tvar chart = this.chart;\r\n\t\tvar angleMultiplier = 360 / chart.data.labels.length;\r\n\t\tvar options = chart.options || {};\r\n\t\tvar startAngle = options.startAngle || 0;\r\n\r\n\t\t// Start from the top instead of right, so remove a quarter of the circle\r\n\t\tvar angle = (index * angleMultiplier + startAngle) % 360;\r\n\r\n\t\treturn (angle < 0 ? angle + 360 : angle) * Math.PI * 2 / 360;\r\n\t},\r\n\r\n\tgetDistanceFromCenterForValue: function(value) {\r\n\t\tvar me = this;\r\n\r\n\t\tif (helpers$1.isNullOrUndef(value)) {\r\n\t\t\treturn NaN;\r\n\t\t}\r\n\r\n\t\t// Take into account half font size + the yPadding of the top value\r\n\t\tvar scalingFactor = me.drawingArea / (me.max - me.min);\r\n\t\tif (me.options.ticks.reverse) {\r\n\t\t\treturn (me.max - value) * scalingFactor;\r\n\t\t}\r\n\t\treturn (value - me.min) * scalingFactor;\r\n\t},\r\n\r\n\tgetPointPosition: function(index, distanceFromCenter) {\r\n\t\tvar me = this;\r\n\t\tvar thisAngle = me.getIndexAngle(index) - (Math.PI / 2);\r\n\t\treturn {\r\n\t\t\tx: Math.cos(thisAngle) * distanceFromCenter + me.xCenter,\r\n\t\t\ty: Math.sin(thisAngle) * distanceFromCenter + me.yCenter\r\n\t\t};\r\n\t},\r\n\r\n\tgetPointPositionForValue: function(index, value) {\r\n\t\treturn this.getPointPosition(index, this.getDistanceFromCenterForValue(value));\r\n\t},\r\n\r\n\tgetBasePosition: function(index) {\r\n\t\tvar me = this;\r\n\t\tvar min = me.min;\r\n\t\tvar max = me.max;\r\n\r\n\t\treturn me.getPointPositionForValue(index || 0,\r\n\t\t\tme.beginAtZero ? 0 :\r\n\t\t\tmin < 0 && max < 0 ? max :\r\n\t\t\tmin > 0 && max > 0 ? min :\r\n\t\t\t0);\r\n\t},\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n\t_drawGrid: function() {\r\n\t\tvar me = this;\r\n\t\tvar ctx = me.ctx;\r\n\t\tvar opts = me.options;\r\n\t\tvar gridLineOpts = opts.gridLines;\r\n\t\tvar angleLineOpts = opts.angleLines;\r\n\t\tvar lineWidth = valueOrDefault$c(angleLineOpts.lineWidth, gridLineOpts.lineWidth);\r\n\t\tvar lineColor = valueOrDefault$c(angleLineOpts.color, gridLineOpts.color);\r\n\t\tvar i, offset, position;\r\n\r\n\t\tif (opts.pointLabels.display) {\r\n\t\t\tdrawPointLabels(me);\r\n\t\t}\r\n\r\n\t\tif (gridLineOpts.display) {\r\n\t\t\thelpers$1.each(me.ticks, function(label, index) {\r\n\t\t\t\tif (index !== 0) {\r\n\t\t\t\t\toffset = me.getDistanceFromCenterForValue(me.ticksAsNumbers[index]);\r\n\t\t\t\t\tdrawRadiusLine(me, gridLineOpts, offset, index);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tif (angleLineOpts.display && lineWidth && lineColor) {\r\n\t\t\tctx.save();\r\n\t\t\tctx.lineWidth = lineWidth;\r\n\t\t\tctx.strokeStyle = lineColor;\r\n\t\t\tif (ctx.setLineDash) {\r\n\t\t\t\tctx.setLineDash(resolve$4([angleLineOpts.borderDash, gridLineOpts.borderDash, []]));\r\n\t\t\t\tctx.lineDashOffset = resolve$4([angleLineOpts.borderDashOffset, gridLineOpts.borderDashOffset, 0.0]);\r\n\t\t\t}\r\n\r\n\t\t\tfor (i = me.chart.data.labels.length - 1; i >= 0; i--) {\r\n\t\t\t\toffset = me.getDistanceFromCenterForValue(opts.ticks.reverse ? me.min : me.max);\r\n\t\t\t\tposition = me.getPointPosition(i, offset);\r\n\t\t\t\tctx.beginPath();\r\n\t\t\t\tctx.moveTo(me.xCenter, me.yCenter);\r\n\t\t\t\tctx.lineTo(position.x, position.y);\r\n\t\t\t\tctx.stroke();\r\n\t\t\t}\r\n\r\n\t\t\tctx.restore();\r\n\t\t}\r\n\t},\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n\t_drawLabels: function() {\r\n\t\tvar me = this;\r\n\t\tvar ctx = me.ctx;\r\n\t\tvar opts = me.options;\r\n\t\tvar tickOpts = opts.ticks;\r\n\r\n\t\tif (!tickOpts.display) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tvar startAngle = me.getIndexAngle(0);\r\n\t\tvar tickFont = helpers$1.options._parseFont(tickOpts);\r\n\t\tvar tickFontColor = valueOrDefault$c(tickOpts.fontColor, core_defaults.global.defaultFontColor);\r\n\t\tvar offset, width;\r\n\r\n\t\tctx.save();\r\n\t\tctx.font = tickFont.string;\r\n\t\tctx.translate(me.xCenter, me.yCenter);\r\n\t\tctx.rotate(startAngle);\r\n\t\tctx.textAlign = 'center';\r\n\t\tctx.textBaseline = 'middle';\r\n\r\n\t\thelpers$1.each(me.ticks, function(label, index) {\r\n\t\t\tif (index === 0 && !tickOpts.reverse) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\toffset = me.getDistanceFromCenterForValue(me.ticksAsNumbers[index]);\r\n\r\n\t\t\tif (tickOpts.showLabelBackdrop) {\r\n\t\t\t\twidth = ctx.measureText(label).width;\r\n\t\t\t\tctx.fillStyle = tickOpts.backdropColor;\r\n\r\n\t\t\t\tctx.fillRect(\r\n\t\t\t\t\t-width / 2 - tickOpts.backdropPaddingX,\r\n\t\t\t\t\t-offset - tickFont.size / 2 - tickOpts.backdropPaddingY,\r\n\t\t\t\t\twidth + tickOpts.backdropPaddingX * 2,\r\n\t\t\t\t\ttickFont.size + tickOpts.backdropPaddingY * 2\r\n\t\t\t\t);\r\n\t\t\t}\r\n\r\n\t\t\tctx.fillStyle = tickFontColor;\r\n\t\t\tctx.fillText(label, 0, -offset);\r\n\t\t});\r\n\r\n\t\tctx.restore();\r\n\t},\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n\t_drawTitle: helpers$1.noop\r\n});\r\n\r\n// INTERNAL: static default options, registered in src/index.js\r\nvar _defaults$3 = defaultConfig$3;\nscale_radialLinear._defaults = _defaults$3;\n\nvar deprecated$1 = helpers$1._deprecated;\r\nvar resolve$5 = helpers$1.options.resolve;\r\nvar valueOrDefault$d = helpers$1.valueOrDefault;\r\n\r\n// Integer constants are from the ES6 spec.\r\nvar MIN_INTEGER = Number.MIN_SAFE_INTEGER || -9007199254740991;\r\nvar MAX_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991;\r\n\r\nvar INTERVALS = {\r\n\tmillisecond: {\r\n\t\tcommon: true,\r\n\t\tsize: 1,\r\n\t\tsteps: 1000\r\n\t},\r\n\tsecond: {\r\n\t\tcommon: true,\r\n\t\tsize: 1000,\r\n\t\tsteps: 60\r\n\t},\r\n\tminute: {\r\n\t\tcommon: true,\r\n\t\tsize: 60000,\r\n\t\tsteps: 60\r\n\t},\r\n\thour: {\r\n\t\tcommon: true,\r\n\t\tsize: 3600000,\r\n\t\tsteps: 24\r\n\t},\r\n\tday: {\r\n\t\tcommon: true,\r\n\t\tsize: 86400000,\r\n\t\tsteps: 30\r\n\t},\r\n\tweek: {\r\n\t\tcommon: false,\r\n\t\tsize: 604800000,\r\n\t\tsteps: 4\r\n\t},\r\n\tmonth: {\r\n\t\tcommon: true,\r\n\t\tsize: 2.628e9,\r\n\t\tsteps: 12\r\n\t},\r\n\tquarter: {\r\n\t\tcommon: false,\r\n\t\tsize: 7.884e9,\r\n\t\tsteps: 4\r\n\t},\r\n\tyear: {\r\n\t\tcommon: true,\r\n\t\tsize: 3.154e10\r\n\t}\r\n};\r\n\r\nvar UNITS = Object.keys(INTERVALS);\r\n\r\nfunction sorter(a, b) {\r\n\treturn a - b;\r\n}\r\n\r\nfunction arrayUnique(items) {\r\n\tvar hash = {};\r\n\tvar out = [];\r\n\tvar i, ilen, item;\r\n\r\n\tfor (i = 0, ilen = items.length; i < ilen; ++i) {\r\n\t\titem = items[i];\r\n\t\tif (!hash[item]) {\r\n\t\t\thash[item] = true;\r\n\t\t\tout.push(item);\r\n\t\t}\r\n\t}\r\n\r\n\treturn out;\r\n}\r\n\r\nfunction getMin(options) {\r\n\treturn helpers$1.valueOrDefault(options.time.min, options.ticks.min);\r\n}\r\n\r\nfunction getMax(options) {\r\n\treturn helpers$1.valueOrDefault(options.time.max, options.ticks.max);\r\n}\r\n\r\n/**\r\n * Returns an array of {time, pos} objects used to interpolate a specific `time` or position\r\n * (`pos`) on the scale, by searching entries before and after the requested value. `pos` is\r\n * a decimal between 0 and 1: 0 being the start of the scale (left or top) and 1 the other\r\n * extremity (left + width or top + height). Note that it would be more optimized to directly\r\n * store pre-computed pixels, but the scale dimensions are not guaranteed at the time we need\r\n * to create the lookup table. The table ALWAYS contains at least two items: min and max.\r\n *\r\n * @param {number[]} timestamps - timestamps sorted from lowest to highest.\r\n * @param {string} distribution - If 'linear', timestamps will be spread linearly along the min\r\n * and max range, so basically, the table will contains only two items: {min, 0} and {max, 1}.\r\n * If 'series', timestamps will be positioned at the same distance from each other. In this\r\n * case, only timestamps that break the time linearity are registered, meaning that in the\r\n * best case, all timestamps are linear, the table contains only min and max.\r\n */\r\nfunction buildLookupTable(timestamps, min, max, distribution) {\r\n\tif (distribution === 'linear' || !timestamps.length) {\r\n\t\treturn [\r\n\t\t\t{time: min, pos: 0},\r\n\t\t\t{time: max, pos: 1}\r\n\t\t];\r\n\t}\r\n\r\n\tvar table = [];\r\n\tvar items = [min];\r\n\tvar i, ilen, prev, curr, next;\r\n\r\n\tfor (i = 0, ilen = timestamps.length; i < ilen; ++i) {\r\n\t\tcurr = timestamps[i];\r\n\t\tif (curr > min && curr < max) {\r\n\t\t\titems.push(curr);\r\n\t\t}\r\n\t}\r\n\r\n\titems.push(max);\r\n\r\n\tfor (i = 0, ilen = items.length; i < ilen; ++i) {\r\n\t\tnext = items[i + 1];\r\n\t\tprev = items[i - 1];\r\n\t\tcurr = items[i];\r\n\r\n\t\t// only add points that breaks the scale linearity\r\n\t\tif (prev === undefined || next === undefined || Math.round((next + prev) / 2) !== curr) {\r\n\t\t\ttable.push({time: curr, pos: i / (ilen - 1)});\r\n\t\t}\r\n\t}\r\n\r\n\treturn table;\r\n}\r\n\r\n// @see adapted from https://www.anujgakhar.com/2014/03/01/binary-search-in-javascript/\r\nfunction lookup(table, key, value) {\r\n\tvar lo = 0;\r\n\tvar hi = table.length - 1;\r\n\tvar mid, i0, i1;\r\n\r\n\twhile (lo >= 0 && lo <= hi) {\r\n\t\tmid = (lo + hi) >> 1;\r\n\t\ti0 = table[mid - 1] || null;\r\n\t\ti1 = table[mid];\r\n\r\n\t\tif (!i0) {\r\n\t\t\t// given value is outside table (before first item)\r\n\t\t\treturn {lo: null, hi: i1};\r\n\t\t} else if (i1[key] < value) {\r\n\t\t\tlo = mid + 1;\r\n\t\t} else if (i0[key] > value) {\r\n\t\t\thi = mid - 1;\r\n\t\t} else {\r\n\t\t\treturn {lo: i0, hi: i1};\r\n\t\t}\r\n\t}\r\n\r\n\t// given value is outside table (after last item)\r\n\treturn {lo: i1, hi: null};\r\n}\r\n\r\n/**\r\n * Linearly interpolates the given source `value` using the table items `skey` values and\r\n * returns the associated `tkey` value. For example, interpolate(table, 'time', 42, 'pos')\r\n * returns the position for a timestamp equal to 42. If value is out of bounds, values at\r\n * index [0, 1] or [n - 1, n] are used for the interpolation.\r\n */\r\nfunction interpolate$1(table, skey, sval, tkey) {\r\n\tvar range = lookup(table, skey, sval);\r\n\r\n\t// Note: the lookup table ALWAYS contains at least 2 items (min and max)\r\n\tvar prev = !range.lo ? table[0] : !range.hi ? table[table.length - 2] : range.lo;\r\n\tvar next = !range.lo ? table[1] : !range.hi ? table[table.length - 1] : range.hi;\r\n\r\n\tvar span = next[skey] - prev[skey];\r\n\tvar ratio = span ? (sval - prev[skey]) / span : 0;\r\n\tvar offset = (next[tkey] - prev[tkey]) * ratio;\r\n\r\n\treturn prev[tkey] + offset;\r\n}\r\n\r\nfunction toTimestamp(scale, input) {\r\n\tvar adapter = scale._adapter;\r\n\tvar options = scale.options.time;\r\n\tvar parser = options.parser;\r\n\tvar format = parser || options.format;\r\n\tvar value = input;\r\n\r\n\tif (typeof parser === 'function') {\r\n\t\tvalue = parser(value);\r\n\t}\r\n\r\n\t// Only parse if its not a timestamp already\r\n\tif (!helpers$1.isFinite(value)) {\r\n\t\tvalue = typeof format === 'string'\r\n\t\t\t? adapter.parse(value, format)\r\n\t\t\t: adapter.parse(value);\r\n\t}\r\n\r\n\tif (value !== null) {\r\n\t\treturn +value;\r\n\t}\r\n\r\n\t// Labels are in an incompatible format and no `parser` has been provided.\r\n\t// The user might still use the deprecated `format` option for parsing.\r\n\tif (!parser && typeof format === 'function') {\r\n\t\tvalue = format(input);\r\n\r\n\t\t// `format` could return something else than a timestamp, if so, parse it\r\n\t\tif (!helpers$1.isFinite(value)) {\r\n\t\t\tvalue = adapter.parse(value);\r\n\t\t}\r\n\t}\r\n\r\n\treturn value;\r\n}\r\n\r\nfunction parse(scale, input) {\r\n\tif (helpers$1.isNullOrUndef(input)) {\r\n\t\treturn null;\r\n\t}\r\n\r\n\tvar options = scale.options.time;\r\n\tvar value = toTimestamp(scale, scale.getRightValue(input));\r\n\tif (value === null) {\r\n\t\treturn value;\r\n\t}\r\n\r\n\tif (options.round) {\r\n\t\tvalue = +scale._adapter.startOf(value, options.round);\r\n\t}\r\n\r\n\treturn value;\r\n}\r\n\r\n/**\r\n * Figures out what unit results in an appropriate number of auto-generated ticks\r\n */\r\nfunction determineUnitForAutoTicks(minUnit, min, max, capacity) {\r\n\tvar ilen = UNITS.length;\r\n\tvar i, interval, factor;\r\n\r\n\tfor (i = UNITS.indexOf(minUnit); i < ilen - 1; ++i) {\r\n\t\tinterval = INTERVALS[UNITS[i]];\r\n\t\tfactor = interval.steps ? interval.steps : MAX_INTEGER;\r\n\r\n\t\tif (interval.common && Math.ceil((max - min) / (factor * interval.size)) <= capacity) {\r\n\t\t\treturn UNITS[i];\r\n\t\t}\r\n\t}\r\n\r\n\treturn UNITS[ilen - 1];\r\n}\r\n\r\n/**\r\n * Figures out what unit to format a set of ticks with\r\n */\r\nfunction determineUnitForFormatting(scale, numTicks, minUnit, min, max) {\r\n\tvar i, unit;\r\n\r\n\tfor (i = UNITS.length - 1; i >= UNITS.indexOf(minUnit); i--) {\r\n\t\tunit = UNITS[i];\r\n\t\tif (INTERVALS[unit].common && scale._adapter.diff(max, min, unit) >= numTicks - 1) {\r\n\t\t\treturn unit;\r\n\t\t}\r\n\t}\r\n\r\n\treturn UNITS[minUnit ? UNITS.indexOf(minUnit) : 0];\r\n}\r\n\r\nfunction determineMajorUnit(unit) {\r\n\tfor (var i = UNITS.indexOf(unit) + 1, ilen = UNITS.length; i < ilen; ++i) {\r\n\t\tif (INTERVALS[UNITS[i]].common) {\r\n\t\t\treturn UNITS[i];\r\n\t\t}\r\n\t}\r\n}\r\n\r\n/**\r\n * Generates a maximum of `capacity` timestamps between min and max, rounded to the\r\n * `minor` unit using the given scale time `options`.\r\n * Important: this method can return ticks outside the min and max range, it's the\r\n * responsibility of the calling code to clamp values if needed.\r\n */\r\nfunction generate(scale, min, max, capacity) {\r\n\tvar adapter = scale._adapter;\r\n\tvar options = scale.options;\r\n\tvar timeOpts = options.time;\r\n\tvar minor = timeOpts.unit || determineUnitForAutoTicks(timeOpts.minUnit, min, max, capacity);\r\n\tvar stepSize = resolve$5([timeOpts.stepSize, timeOpts.unitStepSize, 1]);\r\n\tvar weekday = minor === 'week' ? timeOpts.isoWeekday : false;\r\n\tvar first = min;\r\n\tvar ticks = [];\r\n\tvar time;\r\n\r\n\t// For 'week' unit, handle the first day of week option\r\n\tif (weekday) {\r\n\t\tfirst = +adapter.startOf(first, 'isoWeek', weekday);\r\n\t}\r\n\r\n\t// Align first ticks on unit\r\n\tfirst = +adapter.startOf(first, weekday ? 'day' : minor);\r\n\r\n\t// Prevent browser from freezing in case user options request millions of milliseconds\r\n\tif (adapter.diff(max, min, minor) > 100000 * stepSize) {\r\n\t\tthrow min + ' and ' + max + ' are too far apart with stepSize of ' + stepSize + ' ' + minor;\r\n\t}\r\n\r\n\tfor (time = first; time < max; time = +adapter.add(time, stepSize, minor)) {\r\n\t\tticks.push(time);\r\n\t}\r\n\r\n\tif (time === max || options.bounds === 'ticks') {\r\n\t\tticks.push(time);\r\n\t}\r\n\r\n\treturn ticks;\r\n}\r\n\r\n/**\r\n * Returns the start and end offsets from edges in the form of {start, end}\r\n * where each value is a relative width to the scale and ranges between 0 and 1.\r\n * They add extra margins on the both sides by scaling down the original scale.\r\n * Offsets are added when the `offset` option is true.\r\n */\r\nfunction computeOffsets(table, ticks, min, max, options) {\r\n\tvar start = 0;\r\n\tvar end = 0;\r\n\tvar first, last;\r\n\r\n\tif (options.offset && ticks.length) {\r\n\t\tfirst = interpolate$1(table, 'time', ticks[0], 'pos');\r\n\t\tif (ticks.length === 1) {\r\n\t\t\tstart = 1 - first;\r\n\t\t} else {\r\n\t\t\tstart = (interpolate$1(table, 'time', ticks[1], 'pos') - first) / 2;\r\n\t\t}\r\n\t\tlast = interpolate$1(table, 'time', ticks[ticks.length - 1], 'pos');\r\n\t\tif (ticks.length === 1) {\r\n\t\t\tend = last;\r\n\t\t} else {\r\n\t\t\tend = (last - interpolate$1(table, 'time', ticks[ticks.length - 2], 'pos')) / 2;\r\n\t\t}\r\n\t}\r\n\r\n\treturn {start: start, end: end, factor: 1 / (start + 1 + end)};\r\n}\r\n\r\nfunction setMajorTicks(scale, ticks, map, majorUnit) {\r\n\tvar adapter = scale._adapter;\r\n\tvar first = +adapter.startOf(ticks[0].value, majorUnit);\r\n\tvar last = ticks[ticks.length - 1].value;\r\n\tvar major, index;\r\n\r\n\tfor (major = first; major <= last; major = +adapter.add(major, 1, majorUnit)) {\r\n\t\tindex = map[major];\r\n\t\tif (index >= 0) {\r\n\t\t\tticks[index].major = true;\r\n\t\t}\r\n\t}\r\n\treturn ticks;\r\n}\r\n\r\nfunction ticksFromTimestamps(scale, values, majorUnit) {\r\n\tvar ticks = [];\r\n\tvar map = {};\r\n\tvar ilen = values.length;\r\n\tvar i, value;\r\n\r\n\tfor (i = 0; i < ilen; ++i) {\r\n\t\tvalue = values[i];\r\n\t\tmap[value] = i;\r\n\r\n\t\tticks.push({\r\n\t\t\tvalue: value,\r\n\t\t\tmajor: false\r\n\t\t});\r\n\t}\r\n\r\n\t// We set the major ticks separately from the above loop because calling startOf for every tick\r\n\t// is expensive when there is a large number of ticks\r\n\treturn (ilen === 0 || !majorUnit) ? ticks : setMajorTicks(scale, ticks, map, majorUnit);\r\n}\r\n\r\nvar defaultConfig$4 = {\r\n\tposition: 'bottom',\r\n\r\n\t/**\r\n\t * Data distribution along the scale:\r\n\t * - 'linear': data are spread according to their time (distances can vary),\r\n\t * - 'series': data are spread at the same distance from each other.\r\n\t * @see https://github.com/chartjs/Chart.js/pull/4507\r\n\t * @since 2.7.0\r\n\t */\r\n\tdistribution: 'linear',\r\n\r\n\t/**\r\n\t * Scale boundary strategy (bypassed by min/max time options)\r\n\t * - `data`: make sure data are fully visible, ticks outside are removed\r\n\t * - `ticks`: make sure ticks are fully visible, data outside are truncated\r\n\t * @see https://github.com/chartjs/Chart.js/pull/4556\r\n\t * @since 2.7.0\r\n\t */\r\n\tbounds: 'data',\r\n\r\n\tadapters: {},\r\n\ttime: {\r\n\t\tparser: false, // false == a pattern string from https://momentjs.com/docs/#/parsing/string-format/ or a custom callback that converts its argument to a moment\r\n\t\tunit: false, // false == automatic or override with week, month, year, etc.\r\n\t\tround: false, // none, or override with week, month, year, etc.\r\n\t\tdisplayFormat: false, // DEPRECATED\r\n\t\tisoWeekday: false, // override week start day - see https://momentjs.com/docs/#/get-set/iso-weekday/\r\n\t\tminUnit: 'millisecond',\r\n\t\tdisplayFormats: {}\r\n\t},\r\n\tticks: {\r\n\t\tautoSkip: false,\r\n\r\n\t\t/**\r\n\t\t * Ticks generation input values:\r\n\t\t * - 'auto': generates \"optimal\" ticks based on scale size and time options.\r\n\t\t * - 'data': generates ticks from data (including labels from data {t|x|y} objects).\r\n\t\t * - 'labels': generates ticks from user given `data.labels` values ONLY.\r\n\t\t * @see https://github.com/chartjs/Chart.js/pull/4507\r\n\t\t * @since 2.7.0\r\n\t\t */\r\n\t\tsource: 'auto',\r\n\r\n\t\tmajor: {\r\n\t\t\tenabled: false\r\n\t\t}\r\n\t}\r\n};\r\n\r\nvar scale_time = core_scale.extend({\r\n\tinitialize: function() {\r\n\t\tthis.mergeTicksOptions();\r\n\t\tcore_scale.prototype.initialize.call(this);\r\n\t},\r\n\r\n\tupdate: function() {\r\n\t\tvar me = this;\r\n\t\tvar options = me.options;\r\n\t\tvar time = options.time || (options.time = {});\r\n\t\tvar adapter = me._adapter = new core_adapters._date(options.adapters.date);\r\n\r\n\t\t// DEPRECATIONS: output a message only one time per update\r\n\t\tdeprecated$1('time scale', time.format, 'time.format', 'time.parser');\r\n\t\tdeprecated$1('time scale', time.min, 'time.min', 'ticks.min');\r\n\t\tdeprecated$1('time scale', time.max, 'time.max', 'ticks.max');\r\n\r\n\t\t// Backward compatibility: before introducing adapter, `displayFormats` was\r\n\t\t// supposed to contain *all* unit/string pairs but this can't be resolved\r\n\t\t// when loading the scale (adapters are loaded afterward), so let's populate\r\n\t\t// missing formats on update\r\n\t\thelpers$1.mergeIf(time.displayFormats, adapter.formats());\r\n\r\n\t\treturn core_scale.prototype.update.apply(me, arguments);\r\n\t},\r\n\r\n\t/**\r\n\t * Allows data to be referenced via 't' attribute\r\n\t */\r\n\tgetRightValue: function(rawValue) {\r\n\t\tif (rawValue && rawValue.t !== undefined) {\r\n\t\t\trawValue = rawValue.t;\r\n\t\t}\r\n\t\treturn core_scale.prototype.getRightValue.call(this, rawValue);\r\n\t},\r\n\r\n\tdetermineDataLimits: function() {\r\n\t\tvar me = this;\r\n\t\tvar chart = me.chart;\r\n\t\tvar adapter = me._adapter;\r\n\t\tvar options = me.options;\r\n\t\tvar unit = options.time.unit || 'day';\r\n\t\tvar min = MAX_INTEGER;\r\n\t\tvar max = MIN_INTEGER;\r\n\t\tvar timestamps = [];\r\n\t\tvar datasets = [];\r\n\t\tvar labels = [];\r\n\t\tvar i, j, ilen, jlen, data, timestamp, labelsAdded;\r\n\t\tvar dataLabels = me._getLabels();\r\n\r\n\t\tfor (i = 0, ilen = dataLabels.length; i < ilen; ++i) {\r\n\t\t\tlabels.push(parse(me, dataLabels[i]));\r\n\t\t}\r\n\r\n\t\tfor (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) {\r\n\t\t\tif (chart.isDatasetVisible(i)) {\r\n\t\t\t\tdata = chart.data.datasets[i].data;\r\n\r\n\t\t\t\t// Let's consider that all data have the same format.\r\n\t\t\t\tif (helpers$1.isObject(data[0])) {\r\n\t\t\t\t\tdatasets[i] = [];\r\n\r\n\t\t\t\t\tfor (j = 0, jlen = data.length; j < jlen; ++j) {\r\n\t\t\t\t\t\ttimestamp = parse(me, data[j]);\r\n\t\t\t\t\t\ttimestamps.push(timestamp);\r\n\t\t\t\t\t\tdatasets[i][j] = timestamp;\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tdatasets[i] = labels.slice(0);\r\n\t\t\t\t\tif (!labelsAdded) {\r\n\t\t\t\t\t\ttimestamps = timestamps.concat(labels);\r\n\t\t\t\t\t\tlabelsAdded = true;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tdatasets[i] = [];\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tif (labels.length) {\r\n\t\t\tmin = Math.min(min, labels[0]);\r\n\t\t\tmax = Math.max(max, labels[labels.length - 1]);\r\n\t\t}\r\n\r\n\t\tif (timestamps.length) {\r\n\t\t\ttimestamps = ilen > 1 ? arrayUnique(timestamps).sort(sorter) : timestamps.sort(sorter);\r\n\t\t\tmin = Math.min(min, timestamps[0]);\r\n\t\t\tmax = Math.max(max, timestamps[timestamps.length - 1]);\r\n\t\t}\r\n\r\n\t\tmin = parse(me, getMin(options)) || min;\r\n\t\tmax = parse(me, getMax(options)) || max;\r\n\r\n\t\t// In case there is no valid min/max, set limits based on unit time option\r\n\t\tmin = min === MAX_INTEGER ? +adapter.startOf(Date.now(), unit) : min;\r\n\t\tmax = max === MIN_INTEGER ? +adapter.endOf(Date.now(), unit) + 1 : max;\r\n\r\n\t\t// Make sure that max is strictly higher than min (required by the lookup table)\r\n\t\tme.min = Math.min(min, max);\r\n\t\tme.max = Math.max(min + 1, max);\r\n\r\n\t\t// PRIVATE\r\n\t\tme._table = [];\r\n\t\tme._timestamps = {\r\n\t\t\tdata: timestamps,\r\n\t\t\tdatasets: datasets,\r\n\t\t\tlabels: labels\r\n\t\t};\r\n\t},\r\n\r\n\tbuildTicks: function() {\r\n\t\tvar me = this;\r\n\t\tvar min = me.min;\r\n\t\tvar max = me.max;\r\n\t\tvar options = me.options;\r\n\t\tvar tickOpts = options.ticks;\r\n\t\tvar timeOpts = options.time;\r\n\t\tvar timestamps = me._timestamps;\r\n\t\tvar ticks = [];\r\n\t\tvar capacity = me.getLabelCapacity(min);\r\n\t\tvar source = tickOpts.source;\r\n\t\tvar distribution = options.distribution;\r\n\t\tvar i, ilen, timestamp;\r\n\r\n\t\tif (source === 'data' || (source === 'auto' && distribution === 'series')) {\r\n\t\t\ttimestamps = timestamps.data;\r\n\t\t} else if (source === 'labels') {\r\n\t\t\ttimestamps = timestamps.labels;\r\n\t\t} else {\r\n\t\t\ttimestamps = generate(me, min, max, capacity);\r\n\t\t}\r\n\r\n\t\tif (options.bounds === 'ticks' && timestamps.length) {\r\n\t\t\tmin = timestamps[0];\r\n\t\t\tmax = timestamps[timestamps.length - 1];\r\n\t\t}\r\n\r\n\t\t// Enforce limits with user min/max options\r\n\t\tmin = parse(me, getMin(options)) || min;\r\n\t\tmax = parse(me, getMax(options)) || max;\r\n\r\n\t\t// Remove ticks outside the min/max range\r\n\t\tfor (i = 0, ilen = timestamps.length; i < ilen; ++i) {\r\n\t\t\ttimestamp = timestamps[i];\r\n\t\t\tif (timestamp >= min && timestamp <= max) {\r\n\t\t\t\tticks.push(timestamp);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tme.min = min;\r\n\t\tme.max = max;\r\n\r\n\t\t// PRIVATE\r\n\t\t// determineUnitForFormatting relies on the number of ticks so we don't use it when\r\n\t\t// autoSkip is enabled because we don't yet know what the final number of ticks will be\r\n\t\tme._unit = timeOpts.unit || (tickOpts.autoSkip\r\n\t\t\t? determineUnitForAutoTicks(timeOpts.minUnit, me.min, me.max, capacity)\r\n\t\t\t: determineUnitForFormatting(me, ticks.length, timeOpts.minUnit, me.min, me.max));\r\n\t\tme._majorUnit = !tickOpts.major.enabled || me._unit === 'year' ? undefined\r\n\t\t\t: determineMajorUnit(me._unit);\r\n\t\tme._table = buildLookupTable(me._timestamps.data, min, max, distribution);\r\n\t\tme._offsets = computeOffsets(me._table, ticks, min, max, options);\r\n\r\n\t\tif (tickOpts.reverse) {\r\n\t\t\tticks.reverse();\r\n\t\t}\r\n\r\n\t\treturn ticksFromTimestamps(me, ticks, me._majorUnit);\r\n\t},\r\n\r\n\tgetLabelForIndex: function(index, datasetIndex) {\r\n\t\tvar me = this;\r\n\t\tvar adapter = me._adapter;\r\n\t\tvar data = me.chart.data;\r\n\t\tvar timeOpts = me.options.time;\r\n\t\tvar label = data.labels && index < data.labels.length ? data.labels[index] : '';\r\n\t\tvar value = data.datasets[datasetIndex].data[index];\r\n\r\n\t\tif (helpers$1.isObject(value)) {\r\n\t\t\tlabel = me.getRightValue(value);\r\n\t\t}\r\n\t\tif (timeOpts.tooltipFormat) {\r\n\t\t\treturn adapter.format(toTimestamp(me, label), timeOpts.tooltipFormat);\r\n\t\t}\r\n\t\tif (typeof label === 'string') {\r\n\t\t\treturn label;\r\n\t\t}\r\n\t\treturn adapter.format(toTimestamp(me, label), timeOpts.displayFormats.datetime);\r\n\t},\r\n\r\n\t/**\r\n\t * Function to format an individual tick mark\r\n\t * @private\r\n\t */\r\n\ttickFormatFunction: function(time, index, ticks, format) {\r\n\t\tvar me = this;\r\n\t\tvar adapter = me._adapter;\r\n\t\tvar options = me.options;\r\n\t\tvar formats = options.time.displayFormats;\r\n\t\tvar minorFormat = formats[me._unit];\r\n\t\tvar majorUnit = me._majorUnit;\r\n\t\tvar majorFormat = formats[majorUnit];\r\n\t\tvar tick = ticks[index];\r\n\t\tvar tickOpts = options.ticks;\r\n\t\tvar major = majorUnit && majorFormat && tick && tick.major;\r\n\t\tvar label = adapter.format(time, format ? format : major ? majorFormat : minorFormat);\r\n\t\tvar nestedTickOpts = major ? tickOpts.major : tickOpts.minor;\r\n\t\tvar formatter = resolve$5([\r\n\t\t\tnestedTickOpts.callback,\r\n\t\t\tnestedTickOpts.userCallback,\r\n\t\t\ttickOpts.callback,\r\n\t\t\ttickOpts.userCallback\r\n\t\t]);\r\n\r\n\t\treturn formatter ? formatter(label, index, ticks) : label;\r\n\t},\r\n\r\n\tconvertTicksToLabels: function(ticks) {\r\n\t\tvar labels = [];\r\n\t\tvar i, ilen;\r\n\r\n\t\tfor (i = 0, ilen = ticks.length; i < ilen; ++i) {\r\n\t\t\tlabels.push(this.tickFormatFunction(ticks[i].value, i, ticks));\r\n\t\t}\r\n\r\n\t\treturn labels;\r\n\t},\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n\tgetPixelForOffset: function(time) {\r\n\t\tvar me = this;\r\n\t\tvar offsets = me._offsets;\r\n\t\tvar pos = interpolate$1(me._table, 'time', time, 'pos');\r\n\t\treturn me.getPixelForDecimal((offsets.start + pos) * offsets.factor);\r\n\t},\r\n\r\n\tgetPixelForValue: function(value, index, datasetIndex) {\r\n\t\tvar me = this;\r\n\t\tvar time = null;\r\n\r\n\t\tif (index !== undefined && datasetIndex !== undefined) {\r\n\t\t\ttime = me._timestamps.datasets[datasetIndex][index];\r\n\t\t}\r\n\r\n\t\tif (time === null) {\r\n\t\t\ttime = parse(me, value);\r\n\t\t}\r\n\r\n\t\tif (time !== null) {\r\n\t\t\treturn me.getPixelForOffset(time);\r\n\t\t}\r\n\t},\r\n\r\n\tgetPixelForTick: function(index) {\r\n\t\tvar ticks = this.getTicks();\r\n\t\treturn index >= 0 && index < ticks.length ?\r\n\t\t\tthis.getPixelForOffset(ticks[index].value) :\r\n\t\t\tnull;\r\n\t},\r\n\r\n\tgetValueForPixel: function(pixel) {\r\n\t\tvar me = this;\r\n\t\tvar offsets = me._offsets;\r\n\t\tvar pos = me.getDecimalForPixel(pixel) / offsets.factor - offsets.end;\r\n\t\tvar time = interpolate$1(me._table, 'pos', pos, 'time');\r\n\r\n\t\t// DEPRECATION, we should return time directly\r\n\t\treturn me._adapter._create(time);\r\n\t},\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n\t_getLabelSize: function(label) {\r\n\t\tvar me = this;\r\n\t\tvar ticksOpts = me.options.ticks;\r\n\t\tvar tickLabelWidth = me.ctx.measureText(label).width;\r\n\t\tvar angle = helpers$1.toRadians(me.isHorizontal() ? ticksOpts.maxRotation : ticksOpts.minRotation);\r\n\t\tvar cosRotation = Math.cos(angle);\r\n\t\tvar sinRotation = Math.sin(angle);\r\n\t\tvar tickFontSize = valueOrDefault$d(ticksOpts.fontSize, core_defaults.global.defaultFontSize);\r\n\r\n\t\treturn {\r\n\t\t\tw: (tickLabelWidth * cosRotation) + (tickFontSize * sinRotation),\r\n\t\t\th: (tickLabelWidth * sinRotation) + (tickFontSize * cosRotation)\r\n\t\t};\r\n\t},\r\n\r\n\t/**\r\n\t * Crude approximation of what the label width might be\r\n\t * @private\r\n\t */\r\n\tgetLabelWidth: function(label) {\r\n\t\treturn this._getLabelSize(label).w;\r\n\t},\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n\tgetLabelCapacity: function(exampleTime) {\r\n\t\tvar me = this;\r\n\t\tvar timeOpts = me.options.time;\r\n\t\tvar displayFormats = timeOpts.displayFormats;\r\n\r\n\t\t// pick the longest format (milliseconds) for guestimation\r\n\t\tvar format = displayFormats[timeOpts.unit] || displayFormats.millisecond;\r\n\t\tvar exampleLabel = me.tickFormatFunction(exampleTime, 0, ticksFromTimestamps(me, [exampleTime], me._majorUnit), format);\r\n\t\tvar size = me._getLabelSize(exampleLabel);\r\n\t\tvar capacity = Math.floor(me.isHorizontal() ? me.width / size.w : me.height / size.h);\r\n\r\n\t\tif (me.options.offset) {\r\n\t\t\tcapacity--;\r\n\t\t}\r\n\r\n\t\treturn capacity > 0 ? capacity : 1;\r\n\t}\r\n});\r\n\r\n// INTERNAL: static default options, registered in src/index.js\r\nvar _defaults$4 = defaultConfig$4;\nscale_time._defaults = _defaults$4;\n\nvar scales = {\r\n\tcategory: scale_category,\r\n\tlinear: scale_linear,\r\n\tlogarithmic: scale_logarithmic,\r\n\tradialLinear: scale_radialLinear,\r\n\ttime: scale_time\r\n};\n\nvar FORMATS = {\r\n\tdatetime: 'MMM D, YYYY, h:mm:ss a',\r\n\tmillisecond: 'h:mm:ss.SSS a',\r\n\tsecond: 'h:mm:ss a',\r\n\tminute: 'h:mm a',\r\n\thour: 'hA',\r\n\tday: 'MMM D',\r\n\tweek: 'll',\r\n\tmonth: 'MMM YYYY',\r\n\tquarter: '[Q]Q - YYYY',\r\n\tyear: 'YYYY'\r\n};\r\n\r\ncore_adapters._date.override(typeof moment === 'function' ? {\r\n\t_id: 'moment', // DEBUG ONLY\r\n\r\n\tformats: function() {\r\n\t\treturn FORMATS;\r\n\t},\r\n\r\n\tparse: function(value, format) {\r\n\t\tif (typeof value === 'string' && typeof format === 'string') {\r\n\t\t\tvalue = moment(value, format);\r\n\t\t} else if (!(value instanceof moment)) {\r\n\t\t\tvalue = moment(value);\r\n\t\t}\r\n\t\treturn value.isValid() ? value.valueOf() : null;\r\n\t},\r\n\r\n\tformat: function(time, format) {\r\n\t\treturn moment(time).format(format);\r\n\t},\r\n\r\n\tadd: function(time, amount, unit) {\r\n\t\treturn moment(time).add(amount, unit).valueOf();\r\n\t},\r\n\r\n\tdiff: function(max, min, unit) {\r\n\t\treturn moment(max).diff(moment(min), unit);\r\n\t},\r\n\r\n\tstartOf: function(time, unit, weekday) {\r\n\t\ttime = moment(time);\r\n\t\tif (unit === 'isoWeek') {\r\n\t\t\treturn time.isoWeekday(weekday).valueOf();\r\n\t\t}\r\n\t\treturn time.startOf(unit).valueOf();\r\n\t},\r\n\r\n\tendOf: function(time, unit) {\r\n\t\treturn moment(time).endOf(unit).valueOf();\r\n\t},\r\n\r\n\t// DEPRECATIONS\r\n\r\n\t/**\r\n\t * Provided for backward compatibility with scale.getValueForPixel().\r\n\t * @deprecated since version 2.8.0\r\n\t * @todo remove at version 3\r\n\t * @private\r\n\t */\r\n\t_create: function(time) {\r\n\t\treturn moment(time);\r\n\t},\r\n} : {});\n\ncore_defaults._set('global', {\r\n\tplugins: {\r\n\t\tfiller: {\r\n\t\t\tpropagate: true\r\n\t\t}\r\n\t}\r\n});\r\n\r\nvar mappers = {\r\n\tdataset: function(source) {\r\n\t\tvar index = source.fill;\r\n\t\tvar chart = source.chart;\r\n\t\tvar meta = chart.getDatasetMeta(index);\r\n\t\tvar visible = meta && chart.isDatasetVisible(index);\r\n\t\tvar points = (visible && meta.dataset._children) || [];\r\n\t\tvar length = points.length || 0;\r\n\r\n\t\treturn !length ? null : function(point, i) {\r\n\t\t\treturn (i < length && points[i]._view) || null;\r\n\t\t};\r\n\t},\r\n\r\n\tboundary: function(source) {\r\n\t\tvar boundary = source.boundary;\r\n\t\tvar x = boundary ? boundary.x : null;\r\n\t\tvar y = boundary ? boundary.y : null;\r\n\r\n\t\tif (helpers$1.isArray(boundary)) {\r\n\t\t\treturn function(point, i) {\r\n\t\t\t\treturn boundary[i];\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\treturn function(point) {\r\n\t\t\treturn {\r\n\t\t\t\tx: x === null ? point.x : x,\r\n\t\t\t\ty: y === null ? point.y : y,\r\n\t\t\t};\r\n\t\t};\r\n\t}\r\n};\r\n\r\n// @todo if (fill[0] === '#')\r\nfunction decodeFill(el, index, count) {\r\n\tvar model = el._model || {};\r\n\tvar fill = model.fill;\r\n\tvar target;\r\n\r\n\tif (fill === undefined) {\r\n\t\tfill = !!model.backgroundColor;\r\n\t}\r\n\r\n\tif (fill === false || fill === null) {\r\n\t\treturn false;\r\n\t}\r\n\r\n\tif (fill === true) {\r\n\t\treturn 'origin';\r\n\t}\r\n\r\n\ttarget = parseFloat(fill, 10);\r\n\tif (isFinite(target) && Math.floor(target) === target) {\r\n\t\tif (fill[0] === '-' || fill[0] === '+') {\r\n\t\t\ttarget = index + target;\r\n\t\t}\r\n\r\n\t\tif (target === index || target < 0 || target >= count) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\treturn target;\r\n\t}\r\n\r\n\tswitch (fill) {\r\n\t// compatibility\r\n\tcase 'bottom':\r\n\t\treturn 'start';\r\n\tcase 'top':\r\n\t\treturn 'end';\r\n\tcase 'zero':\r\n\t\treturn 'origin';\r\n\t// supported boundaries\r\n\tcase 'origin':\r\n\tcase 'start':\r\n\tcase 'end':\r\n\t\treturn fill;\r\n\t// invalid fill values\r\n\tdefault:\r\n\t\treturn false;\r\n\t}\r\n}\r\n\r\nfunction computeLinearBoundary(source) {\r\n\tvar model = source.el._model || {};\r\n\tvar scale = source.el._scale || {};\r\n\tvar fill = source.fill;\r\n\tvar target = null;\r\n\tvar horizontal;\r\n\r\n\tif (isFinite(fill)) {\r\n\t\treturn null;\r\n\t}\r\n\r\n\t// Backward compatibility: until v3, we still need to support boundary values set on\r\n\t// the model (scaleTop, scaleBottom and scaleZero) because some external plugins and\r\n\t// controllers might still use it (e.g. the Smith chart).\r\n\r\n\tif (fill === 'start') {\r\n\t\ttarget = model.scaleBottom === undefined ? scale.bottom : model.scaleBottom;\r\n\t} else if (fill === 'end') {\r\n\t\ttarget = model.scaleTop === undefined ? scale.top : model.scaleTop;\r\n\t} else if (model.scaleZero !== undefined) {\r\n\t\ttarget = model.scaleZero;\r\n\t} else if (scale.getBasePixel) {\r\n\t\ttarget = scale.getBasePixel();\r\n\t}\r\n\r\n\tif (target !== undefined && target !== null) {\r\n\t\tif (target.x !== undefined && target.y !== undefined) {\r\n\t\t\treturn target;\r\n\t\t}\r\n\r\n\t\tif (helpers$1.isFinite(target)) {\r\n\t\t\thorizontal = scale.isHorizontal();\r\n\t\t\treturn {\r\n\t\t\t\tx: horizontal ? target : null,\r\n\t\t\t\ty: horizontal ? null : target\r\n\t\t\t};\r\n\t\t}\r\n\t}\r\n\r\n\treturn null;\r\n}\r\n\r\nfunction computeCircularBoundary(source) {\r\n\tvar scale = source.el._scale;\r\n\tvar options = scale.options;\r\n\tvar length = scale.chart.data.labels.length;\r\n\tvar fill = source.fill;\r\n\tvar target = [];\r\n\tvar start, end, center, i, point;\r\n\r\n\tif (!length) {\r\n\t\treturn null;\r\n\t}\r\n\r\n\tstart = options.ticks.reverse ? scale.max : scale.min;\r\n\tend = options.ticks.reverse ? scale.min : scale.max;\r\n\tcenter = scale.getPointPositionForValue(0, start);\r\n\tfor (i = 0; i < length; ++i) {\r\n\t\tpoint = fill === 'start' || fill === 'end'\r\n\t\t\t? scale.getPointPositionForValue(i, fill === 'start' ? start : end)\r\n\t\t\t: scale.getBasePosition(i);\r\n\t\tif (options.gridLines.circular) {\r\n\t\t\tpoint.cx = center.x;\r\n\t\t\tpoint.cy = center.y;\r\n\t\t\tpoint.angle = scale.getIndexAngle(i) - Math.PI / 2;\r\n\t\t}\r\n\t\ttarget.push(point);\r\n\t}\r\n\treturn target;\r\n}\r\n\r\nfunction computeBoundary(source) {\r\n\tvar scale = source.el._scale || {};\r\n\r\n\tif (scale.getPointPositionForValue) {\r\n\t\treturn computeCircularBoundary(source);\r\n\t}\r\n\treturn computeLinearBoundary(source);\r\n}\r\n\r\nfunction resolveTarget(sources, index, propagate) {\r\n\tvar source = sources[index];\r\n\tvar fill = source.fill;\r\n\tvar visited = [index];\r\n\tvar target;\r\n\r\n\tif (!propagate) {\r\n\t\treturn fill;\r\n\t}\r\n\r\n\twhile (fill !== false && visited.indexOf(fill) === -1) {\r\n\t\tif (!isFinite(fill)) {\r\n\t\t\treturn fill;\r\n\t\t}\r\n\r\n\t\ttarget = sources[fill];\r\n\t\tif (!target) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tif (target.visible) {\r\n\t\t\treturn fill;\r\n\t\t}\r\n\r\n\t\tvisited.push(fill);\r\n\t\tfill = target.fill;\r\n\t}\r\n\r\n\treturn false;\r\n}\r\n\r\nfunction createMapper(source) {\r\n\tvar fill = source.fill;\r\n\tvar type = 'dataset';\r\n\r\n\tif (fill === false) {\r\n\t\treturn null;\r\n\t}\r\n\r\n\tif (!isFinite(fill)) {\r\n\t\ttype = 'boundary';\r\n\t}\r\n\r\n\treturn mappers[type](source);\r\n}\r\n\r\nfunction isDrawable(point) {\r\n\treturn point && !point.skip;\r\n}\r\n\r\nfunction drawArea(ctx, curve0, curve1, len0, len1) {\r\n\tvar i, cx, cy, r;\r\n\r\n\tif (!len0 || !len1) {\r\n\t\treturn;\r\n\t}\r\n\r\n\t// building first area curve (normal)\r\n\tctx.moveTo(curve0[0].x, curve0[0].y);\r\n\tfor (i = 1; i < len0; ++i) {\r\n\t\thelpers$1.canvas.lineTo(ctx, curve0[i - 1], curve0[i]);\r\n\t}\r\n\r\n\tif (curve1[0].angle !== undefined) {\r\n\t\tcx = curve1[0].cx;\r\n\t\tcy = curve1[0].cy;\r\n\t\tr = Math.sqrt(Math.pow(curve1[0].x - cx, 2) + Math.pow(curve1[0].y - cy, 2));\r\n\t\tfor (i = len1 - 1; i > 0; --i) {\r\n\t\t\tctx.arc(cx, cy, r, curve1[i].angle, curve1[i - 1].angle, true);\r\n\t\t}\r\n\t\treturn;\r\n\t}\r\n\r\n\t// joining the two area curves\r\n\tctx.lineTo(curve1[len1 - 1].x, curve1[len1 - 1].y);\r\n\r\n\t// building opposite area curve (reverse)\r\n\tfor (i = len1 - 1; i > 0; --i) {\r\n\t\thelpers$1.canvas.lineTo(ctx, curve1[i], curve1[i - 1], true);\r\n\t}\r\n}\r\n\r\nfunction doFill(ctx, points, mapper, view, color, loop) {\r\n\tvar count = points.length;\r\n\tvar span = view.spanGaps;\r\n\tvar curve0 = [];\r\n\tvar curve1 = [];\r\n\tvar len0 = 0;\r\n\tvar len1 = 0;\r\n\tvar i, ilen, index, p0, p1, d0, d1, loopOffset;\r\n\r\n\tctx.beginPath();\r\n\r\n\tfor (i = 0, ilen = count; i < ilen; ++i) {\r\n\t\tindex = i % count;\r\n\t\tp0 = points[index]._view;\r\n\t\tp1 = mapper(p0, index, view);\r\n\t\td0 = isDrawable(p0);\r\n\t\td1 = isDrawable(p1);\r\n\r\n\t\tif (loop && loopOffset === undefined && d0) {\r\n\t\t\tloopOffset = i + 1;\r\n\t\t\tilen = count + loopOffset;\r\n\t\t}\r\n\r\n\t\tif (d0 && d1) {\r\n\t\t\tlen0 = curve0.push(p0);\r\n\t\t\tlen1 = curve1.push(p1);\r\n\t\t} else if (len0 && len1) {\r\n\t\t\tif (!span) {\r\n\t\t\t\tdrawArea(ctx, curve0, curve1, len0, len1);\r\n\t\t\t\tlen0 = len1 = 0;\r\n\t\t\t\tcurve0 = [];\r\n\t\t\t\tcurve1 = [];\r\n\t\t\t} else {\r\n\t\t\t\tif (d0) {\r\n\t\t\t\t\tcurve0.push(p0);\r\n\t\t\t\t}\r\n\t\t\t\tif (d1) {\r\n\t\t\t\t\tcurve1.push(p1);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\tdrawArea(ctx, curve0, curve1, len0, len1);\r\n\r\n\tctx.closePath();\r\n\tctx.fillStyle = color;\r\n\tctx.fill();\r\n}\r\n\r\nvar plugin_filler = {\r\n\tid: 'filler',\r\n\r\n\tafterDatasetsUpdate: function(chart, options) {\r\n\t\tvar count = (chart.data.datasets || []).length;\r\n\t\tvar propagate = options.propagate;\r\n\t\tvar sources = [];\r\n\t\tvar meta, i, el, source;\r\n\r\n\t\tfor (i = 0; i < count; ++i) {\r\n\t\t\tmeta = chart.getDatasetMeta(i);\r\n\t\t\tel = meta.dataset;\r\n\t\t\tsource = null;\r\n\r\n\t\t\tif (el && el._model && el instanceof elements.Line) {\r\n\t\t\t\tsource = {\r\n\t\t\t\t\tvisible: chart.isDatasetVisible(i),\r\n\t\t\t\t\tfill: decodeFill(el, i, count),\r\n\t\t\t\t\tchart: chart,\r\n\t\t\t\t\tel: el\r\n\t\t\t\t};\r\n\t\t\t}\r\n\r\n\t\t\tmeta.$filler = source;\r\n\t\t\tsources.push(source);\r\n\t\t}\r\n\r\n\t\tfor (i = 0; i < count; ++i) {\r\n\t\t\tsource = sources[i];\r\n\t\t\tif (!source) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tsource.fill = resolveTarget(sources, i, propagate);\r\n\t\t\tsource.boundary = computeBoundary(source);\r\n\t\t\tsource.mapper = createMapper(source);\r\n\t\t}\r\n\t},\r\n\r\n\tbeforeDatasetsDraw: function(chart) {\r\n\t\tvar metasets = chart._getSortedVisibleDatasetMetas();\r\n\t\tvar ctx = chart.ctx;\r\n\t\tvar meta, i, el, view, points, mapper, color;\r\n\r\n\t\tfor (i = metasets.length - 1; i >= 0; --i) {\r\n\t\t\tmeta = metasets[i].$filler;\r\n\r\n\t\t\tif (!meta || !meta.visible) {\r\n\t\t\t\tcontinue;\r\n\t\t\t}\r\n\r\n\t\t\tel = meta.el;\r\n\t\t\tview = el._view;\r\n\t\t\tpoints = el._children || [];\r\n\t\t\tmapper = meta.mapper;\r\n\t\t\tcolor = view.backgroundColor || core_defaults.global.defaultColor;\r\n\r\n\t\t\tif (mapper && color && points.length) {\r\n\t\t\t\thelpers$1.canvas.clipArea(ctx, chart.chartArea);\r\n\t\t\t\tdoFill(ctx, points, mapper, view, color, el._loop);\r\n\t\t\t\thelpers$1.canvas.unclipArea(ctx);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n};\n\nvar getRtlHelper$1 = helpers$1.rtl.getRtlAdapter;\r\nvar noop$1 = helpers$1.noop;\r\nvar valueOrDefault$e = helpers$1.valueOrDefault;\r\n\r\ncore_defaults._set('global', {\r\n\tlegend: {\r\n\t\tdisplay: true,\r\n\t\tposition: 'top',\r\n\t\talign: 'center',\r\n\t\tfullWidth: true,\r\n\t\treverse: false,\r\n\t\tweight: 1000,\r\n\r\n\t\t// a callback that will handle\r\n\t\tonClick: function(e, legendItem) {\r\n\t\t\tvar index = legendItem.datasetIndex;\r\n\t\t\tvar ci = this.chart;\r\n\t\t\tvar meta = ci.getDatasetMeta(index);\r\n\r\n\t\t\t// See controller.isDatasetVisible comment\r\n\t\t\tmeta.hidden = meta.hidden === null ? !ci.data.datasets[index].hidden : null;\r\n\r\n\t\t\t// We hid a dataset ... rerender the chart\r\n\t\t\tci.update();\r\n\t\t},\r\n\r\n\t\tonHover: null,\r\n\t\tonLeave: null,\r\n\r\n\t\tlabels: {\r\n\t\t\tboxWidth: 40,\r\n\t\t\tpadding: 10,\r\n\t\t\t// Generates labels shown in the legend\r\n\t\t\t// Valid properties to return:\r\n\t\t\t// text : text to display\r\n\t\t\t// fillStyle : fill of coloured box\r\n\t\t\t// strokeStyle: stroke of coloured box\r\n\t\t\t// hidden : if this legend item refers to a hidden item\r\n\t\t\t// lineCap : cap style for line\r\n\t\t\t// lineDash\r\n\t\t\t// lineDashOffset :\r\n\t\t\t// lineJoin :\r\n\t\t\t// lineWidth :\r\n\t\t\tgenerateLabels: function(chart) {\r\n\t\t\t\tvar datasets = chart.data.datasets;\r\n\t\t\t\tvar options = chart.options.legend || {};\r\n\t\t\t\tvar usePointStyle = options.labels && options.labels.usePointStyle;\r\n\r\n\t\t\t\treturn chart._getSortedDatasetMetas().map(function(meta) {\r\n\t\t\t\t\tvar style = meta.controller.getStyle(usePointStyle ? 0 : undefined);\r\n\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\ttext: datasets[meta.index].label,\r\n\t\t\t\t\t\tfillStyle: style.backgroundColor,\r\n\t\t\t\t\t\thidden: !chart.isDatasetVisible(meta.index),\r\n\t\t\t\t\t\tlineCap: style.borderCapStyle,\r\n\t\t\t\t\t\tlineDash: style.borderDash,\r\n\t\t\t\t\t\tlineDashOffset: style.borderDashOffset,\r\n\t\t\t\t\t\tlineJoin: style.borderJoinStyle,\r\n\t\t\t\t\t\tlineWidth: style.borderWidth,\r\n\t\t\t\t\t\tstrokeStyle: style.borderColor,\r\n\t\t\t\t\t\tpointStyle: style.pointStyle,\r\n\t\t\t\t\t\trotation: style.rotation,\r\n\r\n\t\t\t\t\t\t// Below is extra data used for toggling the datasets\r\n\t\t\t\t\t\tdatasetIndex: meta.index\r\n\t\t\t\t\t};\r\n\t\t\t\t}, this);\r\n\t\t\t}\r\n\t\t}\r\n\t},\r\n\r\n\tlegendCallback: function(chart) {\r\n\t\tvar list = document.createElement('ul');\r\n\t\tvar datasets = chart.data.datasets;\r\n\t\tvar i, ilen, listItem, listItemSpan;\r\n\r\n\t\tlist.setAttribute('class', chart.id + '-legend');\r\n\r\n\t\tfor (i = 0, ilen = datasets.length; i < ilen; i++) {\r\n\t\t\tlistItem = list.appendChild(document.createElement('li'));\r\n\t\t\tlistItemSpan = listItem.appendChild(document.createElement('span'));\r\n\t\t\tlistItemSpan.style.backgroundColor = datasets[i].backgroundColor;\r\n\t\t\tif (datasets[i].label) {\r\n\t\t\t\tlistItem.appendChild(document.createTextNode(datasets[i].label));\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn list.outerHTML;\r\n\t}\r\n});\r\n\r\n/**\r\n * Helper function to get the box width based on the usePointStyle option\r\n * @param {object} labelopts - the label options on the legend\r\n * @param {number} fontSize - the label font size\r\n * @return {number} width of the color box area\r\n */\r\nfunction getBoxWidth(labelOpts, fontSize) {\r\n\treturn labelOpts.usePointStyle && labelOpts.boxWidth > fontSize ?\r\n\t\tfontSize :\r\n\t\tlabelOpts.boxWidth;\r\n}\r\n\r\n/**\r\n * IMPORTANT: this class is exposed publicly as Chart.Legend, backward compatibility required!\r\n */\r\nvar Legend = core_element.extend({\r\n\r\n\tinitialize: function(config) {\r\n\t\tvar me = this;\r\n\t\thelpers$1.extend(me, config);\r\n\r\n\t\t// Contains hit boxes for each dataset (in dataset order)\r\n\t\tme.legendHitBoxes = [];\r\n\r\n\t\t/**\r\n \t\t * @private\r\n \t\t */\r\n\t\tme._hoveredItem = null;\r\n\r\n\t\t// Are we in doughnut mode which has a different data type\r\n\t\tme.doughnutMode = false;\r\n\t},\r\n\r\n\t// These methods are ordered by lifecycle. Utilities then follow.\r\n\t// Any function defined here is inherited by all legend types.\r\n\t// Any function can be extended by the legend type\r\n\r\n\tbeforeUpdate: noop$1,\r\n\tupdate: function(maxWidth, maxHeight, margins) {\r\n\t\tvar me = this;\r\n\r\n\t\t// Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)\r\n\t\tme.beforeUpdate();\r\n\r\n\t\t// Absorb the master measurements\r\n\t\tme.maxWidth = maxWidth;\r\n\t\tme.maxHeight = maxHeight;\r\n\t\tme.margins = margins;\r\n\r\n\t\t// Dimensions\r\n\t\tme.beforeSetDimensions();\r\n\t\tme.setDimensions();\r\n\t\tme.afterSetDimensions();\r\n\t\t// Labels\r\n\t\tme.beforeBuildLabels();\r\n\t\tme.buildLabels();\r\n\t\tme.afterBuildLabels();\r\n\r\n\t\t// Fit\r\n\t\tme.beforeFit();\r\n\t\tme.fit();\r\n\t\tme.afterFit();\r\n\t\t//\r\n\t\tme.afterUpdate();\r\n\r\n\t\treturn me.minSize;\r\n\t},\r\n\tafterUpdate: noop$1,\r\n\r\n\t//\r\n\r\n\tbeforeSetDimensions: noop$1,\r\n\tsetDimensions: function() {\r\n\t\tvar me = this;\r\n\t\t// Set the unconstrained dimension before label rotation\r\n\t\tif (me.isHorizontal()) {\r\n\t\t\t// Reset position before calculating rotation\r\n\t\t\tme.width = me.maxWidth;\r\n\t\t\tme.left = 0;\r\n\t\t\tme.right = me.width;\r\n\t\t} else {\r\n\t\t\tme.height = me.maxHeight;\r\n\r\n\t\t\t// Reset position before calculating rotation\r\n\t\t\tme.top = 0;\r\n\t\t\tme.bottom = me.height;\r\n\t\t}\r\n\r\n\t\t// Reset padding\r\n\t\tme.paddingLeft = 0;\r\n\t\tme.paddingTop = 0;\r\n\t\tme.paddingRight = 0;\r\n\t\tme.paddingBottom = 0;\r\n\r\n\t\t// Reset minSize\r\n\t\tme.minSize = {\r\n\t\t\twidth: 0,\r\n\t\t\theight: 0\r\n\t\t};\r\n\t},\r\n\tafterSetDimensions: noop$1,\r\n\r\n\t//\r\n\r\n\tbeforeBuildLabels: noop$1,\r\n\tbuildLabels: function() {\r\n\t\tvar me = this;\r\n\t\tvar labelOpts = me.options.labels || {};\r\n\t\tvar legendItems = helpers$1.callback(labelOpts.generateLabels, [me.chart], me) || [];\r\n\r\n\t\tif (labelOpts.filter) {\r\n\t\t\tlegendItems = legendItems.filter(function(item) {\r\n\t\t\t\treturn labelOpts.filter(item, me.chart.data);\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tif (me.options.reverse) {\r\n\t\t\tlegendItems.reverse();\r\n\t\t}\r\n\r\n\t\tme.legendItems = legendItems;\r\n\t},\r\n\tafterBuildLabels: noop$1,\r\n\r\n\t//\r\n\r\n\tbeforeFit: noop$1,\r\n\tfit: function() {\r\n\t\tvar me = this;\r\n\t\tvar opts = me.options;\r\n\t\tvar labelOpts = opts.labels;\r\n\t\tvar display = opts.display;\r\n\r\n\t\tvar ctx = me.ctx;\r\n\r\n\t\tvar labelFont = helpers$1.options._parseFont(labelOpts);\r\n\t\tvar fontSize = labelFont.size;\r\n\r\n\t\t// Reset hit boxes\r\n\t\tvar hitboxes = me.legendHitBoxes = [];\r\n\r\n\t\tvar minSize = me.minSize;\r\n\t\tvar isHorizontal = me.isHorizontal();\r\n\r\n\t\tif (isHorizontal) {\r\n\t\t\tminSize.width = me.maxWidth; // fill all the width\r\n\t\t\tminSize.height = display ? 10 : 0;\r\n\t\t} else {\r\n\t\t\tminSize.width = display ? 10 : 0;\r\n\t\t\tminSize.height = me.maxHeight; // fill all the height\r\n\t\t}\r\n\r\n\t\t// Increase sizes here\r\n\t\tif (!display) {\r\n\t\t\tme.width = minSize.width = me.height = minSize.height = 0;\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tctx.font = labelFont.string;\r\n\r\n\t\tif (isHorizontal) {\r\n\t\t\t// Labels\r\n\r\n\t\t\t// Width of each line of legend boxes. Labels wrap onto multiple lines when there are too many to fit on one\r\n\t\t\tvar lineWidths = me.lineWidths = [0];\r\n\t\t\tvar totalHeight = 0;\r\n\r\n\t\t\tctx.textAlign = 'left';\r\n\t\t\tctx.textBaseline = 'middle';\r\n\r\n\t\t\thelpers$1.each(me.legendItems, function(legendItem, i) {\r\n\t\t\t\tvar boxWidth = getBoxWidth(labelOpts, fontSize);\r\n\t\t\t\tvar width = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;\r\n\r\n\t\t\t\tif (i === 0 || lineWidths[lineWidths.length - 1] + width + 2 * labelOpts.padding > minSize.width) {\r\n\t\t\t\t\ttotalHeight += fontSize + labelOpts.padding;\r\n\t\t\t\t\tlineWidths[lineWidths.length - (i > 0 ? 0 : 1)] = 0;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Store the hitbox width and height here. Final position will be updated in `draw`\r\n\t\t\t\thitboxes[i] = {\r\n\t\t\t\t\tleft: 0,\r\n\t\t\t\t\ttop: 0,\r\n\t\t\t\t\twidth: width,\r\n\t\t\t\t\theight: fontSize\r\n\t\t\t\t};\r\n\r\n\t\t\t\tlineWidths[lineWidths.length - 1] += width + labelOpts.padding;\r\n\t\t\t});\r\n\r\n\t\t\tminSize.height += totalHeight;\r\n\r\n\t\t} else {\r\n\t\t\tvar vPadding = labelOpts.padding;\r\n\t\t\tvar columnWidths = me.columnWidths = [];\r\n\t\t\tvar columnHeights = me.columnHeights = [];\r\n\t\t\tvar totalWidth = labelOpts.padding;\r\n\t\t\tvar currentColWidth = 0;\r\n\t\t\tvar currentColHeight = 0;\r\n\r\n\t\t\thelpers$1.each(me.legendItems, function(legendItem, i) {\r\n\t\t\t\tvar boxWidth = getBoxWidth(labelOpts, fontSize);\r\n\t\t\t\tvar itemWidth = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;\r\n\r\n\t\t\t\t// If too tall, go to new column\r\n\t\t\t\tif (i > 0 && currentColHeight + fontSize + 2 * vPadding > minSize.height) {\r\n\t\t\t\t\ttotalWidth += currentColWidth + labelOpts.padding;\r\n\t\t\t\t\tcolumnWidths.push(currentColWidth); // previous column width\r\n\t\t\t\t\tcolumnHeights.push(currentColHeight);\r\n\t\t\t\t\tcurrentColWidth = 0;\r\n\t\t\t\t\tcurrentColHeight = 0;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Get max width\r\n\t\t\t\tcurrentColWidth = Math.max(currentColWidth, itemWidth);\r\n\t\t\t\tcurrentColHeight += fontSize + vPadding;\r\n\r\n\t\t\t\t// Store the hitbox width and height here. Final position will be updated in `draw`\r\n\t\t\t\thitboxes[i] = {\r\n\t\t\t\t\tleft: 0,\r\n\t\t\t\t\ttop: 0,\r\n\t\t\t\t\twidth: itemWidth,\r\n\t\t\t\t\theight: fontSize\r\n\t\t\t\t};\r\n\t\t\t});\r\n\r\n\t\t\ttotalWidth += currentColWidth;\r\n\t\t\tcolumnWidths.push(currentColWidth);\r\n\t\t\tcolumnHeights.push(currentColHeight);\r\n\t\t\tminSize.width += totalWidth;\r\n\t\t}\r\n\r\n\t\tme.width = minSize.width;\r\n\t\tme.height = minSize.height;\r\n\t},\r\n\tafterFit: noop$1,\r\n\r\n\t// Shared Methods\r\n\tisHorizontal: function() {\r\n\t\treturn this.options.position === 'top' || this.options.position === 'bottom';\r\n\t},\r\n\r\n\t// Actually draw the legend on the canvas\r\n\tdraw: function() {\r\n\t\tvar me = this;\r\n\t\tvar opts = me.options;\r\n\t\tvar labelOpts = opts.labels;\r\n\t\tvar globalDefaults = core_defaults.global;\r\n\t\tvar defaultColor = globalDefaults.defaultColor;\r\n\t\tvar lineDefault = globalDefaults.elements.line;\r\n\t\tvar legendHeight = me.height;\r\n\t\tvar columnHeights = me.columnHeights;\r\n\t\tvar legendWidth = me.width;\r\n\t\tvar lineWidths = me.lineWidths;\r\n\r\n\t\tif (!opts.display) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tvar rtlHelper = getRtlHelper$1(opts.rtl, me.left, me.minSize.width);\r\n\t\tvar ctx = me.ctx;\r\n\t\tvar fontColor = valueOrDefault$e(labelOpts.fontColor, globalDefaults.defaultFontColor);\r\n\t\tvar labelFont = helpers$1.options._parseFont(labelOpts);\r\n\t\tvar fontSize = labelFont.size;\r\n\t\tvar cursor;\r\n\r\n\t\t// Canvas setup\r\n\t\tctx.textAlign = rtlHelper.textAlign('left');\r\n\t\tctx.textBaseline = 'middle';\r\n\t\tctx.lineWidth = 0.5;\r\n\t\tctx.strokeStyle = fontColor; // for strikethrough effect\r\n\t\tctx.fillStyle = fontColor; // render in correct colour\r\n\t\tctx.font = labelFont.string;\r\n\r\n\t\tvar boxWidth = getBoxWidth(labelOpts, fontSize);\r\n\t\tvar hitboxes = me.legendHitBoxes;\r\n\r\n\t\t// current position\r\n\t\tvar drawLegendBox = function(x, y, legendItem) {\r\n\t\t\tif (isNaN(boxWidth) || boxWidth <= 0) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\r\n\t\t\t// Set the ctx for the box\r\n\t\t\tctx.save();\r\n\r\n\t\t\tvar lineWidth = valueOrDefault$e(legendItem.lineWidth, lineDefault.borderWidth);\r\n\t\t\tctx.fillStyle = valueOrDefault$e(legendItem.fillStyle, defaultColor);\r\n\t\t\tctx.lineCap = valueOrDefault$e(legendItem.lineCap, lineDefault.borderCapStyle);\r\n\t\t\tctx.lineDashOffset = valueOrDefault$e(legendItem.lineDashOffset, lineDefault.borderDashOffset);\r\n\t\t\tctx.lineJoin = valueOrDefault$e(legendItem.lineJoin, lineDefault.borderJoinStyle);\r\n\t\t\tctx.lineWidth = lineWidth;\r\n\t\t\tctx.strokeStyle = valueOrDefault$e(legendItem.strokeStyle, defaultColor);\r\n\r\n\t\t\tif (ctx.setLineDash) {\r\n\t\t\t\t// IE 9 and 10 do not support line dash\r\n\t\t\t\tctx.setLineDash(valueOrDefault$e(legendItem.lineDash, lineDefault.borderDash));\r\n\t\t\t}\r\n\r\n\t\t\tif (labelOpts && labelOpts.usePointStyle) {\r\n\t\t\t\t// Recalculate x and y for drawPoint() because its expecting\r\n\t\t\t\t// x and y to be center of figure (instead of top left)\r\n\t\t\t\tvar radius = boxWidth * Math.SQRT2 / 2;\r\n\t\t\t\tvar centerX = rtlHelper.xPlus(x, boxWidth / 2);\r\n\t\t\t\tvar centerY = y + fontSize / 2;\r\n\r\n\t\t\t\t// Draw pointStyle as legend symbol\r\n\t\t\t\thelpers$1.canvas.drawPoint(ctx, legendItem.pointStyle, radius, centerX, centerY, legendItem.rotation);\r\n\t\t\t} else {\r\n\t\t\t\t// Draw box as legend symbol\r\n\t\t\t\tctx.fillRect(rtlHelper.leftForLtr(x, boxWidth), y, boxWidth, fontSize);\r\n\t\t\t\tif (lineWidth !== 0) {\r\n\t\t\t\t\tctx.strokeRect(rtlHelper.leftForLtr(x, boxWidth), y, boxWidth, fontSize);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tctx.restore();\r\n\t\t};\r\n\r\n\t\tvar fillText = function(x, y, legendItem, textWidth) {\r\n\t\t\tvar halfFontSize = fontSize / 2;\r\n\t\t\tvar xLeft = rtlHelper.xPlus(x, boxWidth + halfFontSize);\r\n\t\t\tvar yMiddle = y + halfFontSize;\r\n\r\n\t\t\tctx.fillText(legendItem.text, xLeft, yMiddle);\r\n\r\n\t\t\tif (legendItem.hidden) {\r\n\t\t\t\t// Strikethrough the text if hidden\r\n\t\t\t\tctx.beginPath();\r\n\t\t\t\tctx.lineWidth = 2;\r\n\t\t\t\tctx.moveTo(xLeft, yMiddle);\r\n\t\t\t\tctx.lineTo(rtlHelper.xPlus(xLeft, textWidth), yMiddle);\r\n\t\t\t\tctx.stroke();\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tvar alignmentOffset = function(dimension, blockSize) {\r\n\t\t\tswitch (opts.align) {\r\n\t\t\tcase 'start':\r\n\t\t\t\treturn labelOpts.padding;\r\n\t\t\tcase 'end':\r\n\t\t\t\treturn dimension - blockSize;\r\n\t\t\tdefault: // center\r\n\t\t\t\treturn (dimension - blockSize + labelOpts.padding) / 2;\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\t// Horizontal\r\n\t\tvar isHorizontal = me.isHorizontal();\r\n\t\tif (isHorizontal) {\r\n\t\t\tcursor = {\r\n\t\t\t\tx: me.left + alignmentOffset(legendWidth, lineWidths[0]),\r\n\t\t\t\ty: me.top + labelOpts.padding,\r\n\t\t\t\tline: 0\r\n\t\t\t};\r\n\t\t} else {\r\n\t\t\tcursor = {\r\n\t\t\t\tx: me.left + labelOpts.padding,\r\n\t\t\t\ty: me.top + alignmentOffset(legendHeight, columnHeights[0]),\r\n\t\t\t\tline: 0\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\thelpers$1.rtl.overrideTextDirection(me.ctx, opts.textDirection);\r\n\r\n\t\tvar itemHeight = fontSize + labelOpts.padding;\r\n\t\thelpers$1.each(me.legendItems, function(legendItem, i) {\r\n\t\t\tvar textWidth = ctx.measureText(legendItem.text).width;\r\n\t\t\tvar width = boxWidth + (fontSize / 2) + textWidth;\r\n\t\t\tvar x = cursor.x;\r\n\t\t\tvar y = cursor.y;\r\n\r\n\t\t\trtlHelper.setWidth(me.minSize.width);\r\n\r\n\t\t\t// Use (me.left + me.minSize.width) and (me.top + me.minSize.height)\r\n\t\t\t// instead of me.right and me.bottom because me.width and me.height\r\n\t\t\t// may have been changed since me.minSize was calculated\r\n\t\t\tif (isHorizontal) {\r\n\t\t\t\tif (i > 0 && x + width + labelOpts.padding > me.left + me.minSize.width) {\r\n\t\t\t\t\ty = cursor.y += itemHeight;\r\n\t\t\t\t\tcursor.line++;\r\n\t\t\t\t\tx = cursor.x = me.left + alignmentOffset(legendWidth, lineWidths[cursor.line]);\r\n\t\t\t\t}\r\n\t\t\t} else if (i > 0 && y + itemHeight > me.top + me.minSize.height) {\r\n\t\t\t\tx = cursor.x = x + me.columnWidths[cursor.line] + labelOpts.padding;\r\n\t\t\t\tcursor.line++;\r\n\t\t\t\ty = cursor.y = me.top + alignmentOffset(legendHeight, columnHeights[cursor.line]);\r\n\t\t\t}\r\n\r\n\t\t\tvar realX = rtlHelper.x(x);\r\n\r\n\t\t\tdrawLegendBox(realX, y, legendItem);\r\n\r\n\t\t\thitboxes[i].left = rtlHelper.leftForLtr(realX, hitboxes[i].width);\r\n\t\t\thitboxes[i].top = y;\r\n\r\n\t\t\t// Fill the actual label\r\n\t\t\tfillText(realX, y, legendItem, textWidth);\r\n\r\n\t\t\tif (isHorizontal) {\r\n\t\t\t\tcursor.x += width + labelOpts.padding;\r\n\t\t\t} else {\r\n\t\t\t\tcursor.y += itemHeight;\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\thelpers$1.rtl.restoreTextDirection(me.ctx, opts.textDirection);\r\n\t},\r\n\r\n\t/**\r\n\t * @private\r\n\t */\r\n\t_getLegendItemAt: function(x, y) {\r\n\t\tvar me = this;\r\n\t\tvar i, hitBox, lh;\r\n\r\n\t\tif (x >= me.left && x <= me.right && y >= me.top && y <= me.bottom) {\r\n\t\t\t// See if we are touching one of the dataset boxes\r\n\t\t\tlh = me.legendHitBoxes;\r\n\t\t\tfor (i = 0; i < lh.length; ++i) {\r\n\t\t\t\thitBox = lh[i];\r\n\r\n\t\t\t\tif (x >= hitBox.left && x <= hitBox.left + hitBox.width && y >= hitBox.top && y <= hitBox.top + hitBox.height) {\r\n\t\t\t\t\t// Touching an element\r\n\t\t\t\t\treturn me.legendItems[i];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn null;\r\n\t},\r\n\r\n\t/**\r\n\t * Handle an event\r\n\t * @private\r\n\t * @param {IEvent} event - The event to handle\r\n\t */\r\n\thandleEvent: function(e) {\r\n\t\tvar me = this;\r\n\t\tvar opts = me.options;\r\n\t\tvar type = e.type === 'mouseup' ? 'click' : e.type;\r\n\t\tvar hoveredItem;\r\n\r\n\t\tif (type === 'mousemove') {\r\n\t\t\tif (!opts.onHover && !opts.onLeave) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t} else if (type === 'click') {\r\n\t\t\tif (!opts.onClick) {\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\t// Chart event already has relative position in it\r\n\t\thoveredItem = me._getLegendItemAt(e.x, e.y);\r\n\r\n\t\tif (type === 'click') {\r\n\t\t\tif (hoveredItem && opts.onClick) {\r\n\t\t\t\t// use e.native for backwards compatibility\r\n\t\t\t\topts.onClick.call(me, e.native, hoveredItem);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tif (opts.onLeave && hoveredItem !== me._hoveredItem) {\r\n\t\t\t\tif (me._hoveredItem) {\r\n\t\t\t\t\topts.onLeave.call(me, e.native, me._hoveredItem);\r\n\t\t\t\t}\r\n\t\t\t\tme._hoveredItem = hoveredItem;\r\n\t\t\t}\r\n\r\n\t\t\tif (opts.onHover && hoveredItem) {\r\n\t\t\t\t// use e.native for backwards compatibility\r\n\t\t\t\topts.onHover.call(me, e.native, hoveredItem);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n});\r\n\r\nfunction createNewLegendAndAttach(chart, legendOpts) {\r\n\tvar legend = new Legend({\r\n\t\tctx: chart.ctx,\r\n\t\toptions: legendOpts,\r\n\t\tchart: chart\r\n\t});\r\n\r\n\tcore_layouts.configure(chart, legend, legendOpts);\r\n\tcore_layouts.addBox(chart, legend);\r\n\tchart.legend = legend;\r\n}\r\n\r\nvar plugin_legend = {\r\n\tid: 'legend',\r\n\r\n\t/**\r\n\t * Backward compatibility: since 2.1.5, the legend is registered as a plugin, making\r\n\t * Chart.Legend obsolete. To avoid a breaking change, we export the Legend as part of\r\n\t * the plugin, which one will be re-exposed in the chart.js file.\r\n\t * https://github.com/chartjs/Chart.js/pull/2640\r\n\t * @private\r\n\t */\r\n\t_element: Legend,\r\n\r\n\tbeforeInit: function(chart) {\r\n\t\tvar legendOpts = chart.options.legend;\r\n\r\n\t\tif (legendOpts) {\r\n\t\t\tcreateNewLegendAndAttach(chart, legendOpts);\r\n\t\t}\r\n\t},\r\n\r\n\tbeforeUpdate: function(chart) {\r\n\t\tvar legendOpts = chart.options.legend;\r\n\t\tvar legend = chart.legend;\r\n\r\n\t\tif (legendOpts) {\r\n\t\t\thelpers$1.mergeIf(legendOpts, core_defaults.global.legend);\r\n\r\n\t\t\tif (legend) {\r\n\t\t\t\tcore_layouts.configure(chart, legend, legendOpts);\r\n\t\t\t\tlegend.options = legendOpts;\r\n\t\t\t} else {\r\n\t\t\t\tcreateNewLegendAndAttach(chart, legendOpts);\r\n\t\t\t}\r\n\t\t} else if (legend) {\r\n\t\t\tcore_layouts.removeBox(chart, legend);\r\n\t\t\tdelete chart.legend;\r\n\t\t}\r\n\t},\r\n\r\n\tafterEvent: function(chart, e) {\r\n\t\tvar legend = chart.legend;\r\n\t\tif (legend) {\r\n\t\t\tlegend.handleEvent(e);\r\n\t\t}\r\n\t}\r\n};\n\nvar noop$2 = helpers$1.noop;\r\n\r\ncore_defaults._set('global', {\r\n\ttitle: {\r\n\t\tdisplay: false,\r\n\t\tfontStyle: 'bold',\r\n\t\tfullWidth: true,\r\n\t\tpadding: 10,\r\n\t\tposition: 'top',\r\n\t\ttext: '',\r\n\t\tweight: 2000         // by default greater than legend (1000) to be above\r\n\t}\r\n});\r\n\r\n/**\r\n * IMPORTANT: this class is exposed publicly as Chart.Legend, backward compatibility required!\r\n */\r\nvar Title = core_element.extend({\r\n\tinitialize: function(config) {\r\n\t\tvar me = this;\r\n\t\thelpers$1.extend(me, config);\r\n\r\n\t\t// Contains hit boxes for each dataset (in dataset order)\r\n\t\tme.legendHitBoxes = [];\r\n\t},\r\n\r\n\t// These methods are ordered by lifecycle. Utilities then follow.\r\n\r\n\tbeforeUpdate: noop$2,\r\n\tupdate: function(maxWidth, maxHeight, margins) {\r\n\t\tvar me = this;\r\n\r\n\t\t// Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)\r\n\t\tme.beforeUpdate();\r\n\r\n\t\t// Absorb the master measurements\r\n\t\tme.maxWidth = maxWidth;\r\n\t\tme.maxHeight = maxHeight;\r\n\t\tme.margins = margins;\r\n\r\n\t\t// Dimensions\r\n\t\tme.beforeSetDimensions();\r\n\t\tme.setDimensions();\r\n\t\tme.afterSetDimensions();\r\n\t\t// Labels\r\n\t\tme.beforeBuildLabels();\r\n\t\tme.buildLabels();\r\n\t\tme.afterBuildLabels();\r\n\r\n\t\t// Fit\r\n\t\tme.beforeFit();\r\n\t\tme.fit();\r\n\t\tme.afterFit();\r\n\t\t//\r\n\t\tme.afterUpdate();\r\n\r\n\t\treturn me.minSize;\r\n\r\n\t},\r\n\tafterUpdate: noop$2,\r\n\r\n\t//\r\n\r\n\tbeforeSetDimensions: noop$2,\r\n\tsetDimensions: function() {\r\n\t\tvar me = this;\r\n\t\t// Set the unconstrained dimension before label rotation\r\n\t\tif (me.isHorizontal()) {\r\n\t\t\t// Reset position before calculating rotation\r\n\t\t\tme.width = me.maxWidth;\r\n\t\t\tme.left = 0;\r\n\t\t\tme.right = me.width;\r\n\t\t} else {\r\n\t\t\tme.height = me.maxHeight;\r\n\r\n\t\t\t// Reset position before calculating rotation\r\n\t\t\tme.top = 0;\r\n\t\t\tme.bottom = me.height;\r\n\t\t}\r\n\r\n\t\t// Reset padding\r\n\t\tme.paddingLeft = 0;\r\n\t\tme.paddingTop = 0;\r\n\t\tme.paddingRight = 0;\r\n\t\tme.paddingBottom = 0;\r\n\r\n\t\t// Reset minSize\r\n\t\tme.minSize = {\r\n\t\t\twidth: 0,\r\n\t\t\theight: 0\r\n\t\t};\r\n\t},\r\n\tafterSetDimensions: noop$2,\r\n\r\n\t//\r\n\r\n\tbeforeBuildLabels: noop$2,\r\n\tbuildLabels: noop$2,\r\n\tafterBuildLabels: noop$2,\r\n\r\n\t//\r\n\r\n\tbeforeFit: noop$2,\r\n\tfit: function() {\r\n\t\tvar me = this;\r\n\t\tvar opts = me.options;\r\n\t\tvar minSize = me.minSize = {};\r\n\t\tvar isHorizontal = me.isHorizontal();\r\n\t\tvar lineCount, textSize;\r\n\r\n\t\tif (!opts.display) {\r\n\t\t\tme.width = minSize.width = me.height = minSize.height = 0;\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tlineCount = helpers$1.isArray(opts.text) ? opts.text.length : 1;\r\n\t\ttextSize = lineCount * helpers$1.options._parseFont(opts).lineHeight + opts.padding * 2;\r\n\r\n\t\tme.width = minSize.width = isHorizontal ? me.maxWidth : textSize;\r\n\t\tme.height = minSize.height = isHorizontal ? textSize : me.maxHeight;\r\n\t},\r\n\tafterFit: noop$2,\r\n\r\n\t// Shared Methods\r\n\tisHorizontal: function() {\r\n\t\tvar pos = this.options.position;\r\n\t\treturn pos === 'top' || pos === 'bottom';\r\n\t},\r\n\r\n\t// Actually draw the title block on the canvas\r\n\tdraw: function() {\r\n\t\tvar me = this;\r\n\t\tvar ctx = me.ctx;\r\n\t\tvar opts = me.options;\r\n\r\n\t\tif (!opts.display) {\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\tvar fontOpts = helpers$1.options._parseFont(opts);\r\n\t\tvar lineHeight = fontOpts.lineHeight;\r\n\t\tvar offset = lineHeight / 2 + opts.padding;\r\n\t\tvar rotation = 0;\r\n\t\tvar top = me.top;\r\n\t\tvar left = me.left;\r\n\t\tvar bottom = me.bottom;\r\n\t\tvar right = me.right;\r\n\t\tvar maxWidth, titleX, titleY;\r\n\r\n\t\tctx.fillStyle = helpers$1.valueOrDefault(opts.fontColor, core_defaults.global.defaultFontColor); // render in correct colour\r\n\t\tctx.font = fontOpts.string;\r\n\r\n\t\t// Horizontal\r\n\t\tif (me.isHorizontal()) {\r\n\t\t\ttitleX = left + ((right - left) / 2); // midpoint of the width\r\n\t\t\ttitleY = top + offset;\r\n\t\t\tmaxWidth = right - left;\r\n\t\t} else {\r\n\t\t\ttitleX = opts.position === 'left' ? left + offset : right - offset;\r\n\t\t\ttitleY = top + ((bottom - top) / 2);\r\n\t\t\tmaxWidth = bottom - top;\r\n\t\t\trotation = Math.PI * (opts.position === 'left' ? -0.5 : 0.5);\r\n\t\t}\r\n\r\n\t\tctx.save();\r\n\t\tctx.translate(titleX, titleY);\r\n\t\tctx.rotate(rotation);\r\n\t\tctx.textAlign = 'center';\r\n\t\tctx.textBaseline = 'middle';\r\n\r\n\t\tvar text = opts.text;\r\n\t\tif (helpers$1.isArray(text)) {\r\n\t\t\tvar y = 0;\r\n\t\t\tfor (var i = 0; i < text.length; ++i) {\r\n\t\t\t\tctx.fillText(text[i], 0, y, maxWidth);\r\n\t\t\t\ty += lineHeight;\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tctx.fillText(text, 0, 0, maxWidth);\r\n\t\t}\r\n\r\n\t\tctx.restore();\r\n\t}\r\n});\r\n\r\nfunction createNewTitleBlockAndAttach(chart, titleOpts) {\r\n\tvar title = new Title({\r\n\t\tctx: chart.ctx,\r\n\t\toptions: titleOpts,\r\n\t\tchart: chart\r\n\t});\r\n\r\n\tcore_layouts.configure(chart, title, titleOpts);\r\n\tcore_layouts.addBox(chart, title);\r\n\tchart.titleBlock = title;\r\n}\r\n\r\nvar plugin_title = {\r\n\tid: 'title',\r\n\r\n\t/**\r\n\t * Backward compatibility: since 2.1.5, the title is registered as a plugin, making\r\n\t * Chart.Title obsolete. To avoid a breaking change, we export the Title as part of\r\n\t * the plugin, which one will be re-exposed in the chart.js file.\r\n\t * https://github.com/chartjs/Chart.js/pull/2640\r\n\t * @private\r\n\t */\r\n\t_element: Title,\r\n\r\n\tbeforeInit: function(chart) {\r\n\t\tvar titleOpts = chart.options.title;\r\n\r\n\t\tif (titleOpts) {\r\n\t\t\tcreateNewTitleBlockAndAttach(chart, titleOpts);\r\n\t\t}\r\n\t},\r\n\r\n\tbeforeUpdate: function(chart) {\r\n\t\tvar titleOpts = chart.options.title;\r\n\t\tvar titleBlock = chart.titleBlock;\r\n\r\n\t\tif (titleOpts) {\r\n\t\t\thelpers$1.mergeIf(titleOpts, core_defaults.global.title);\r\n\r\n\t\t\tif (titleBlock) {\r\n\t\t\t\tcore_layouts.configure(chart, titleBlock, titleOpts);\r\n\t\t\t\ttitleBlock.options = titleOpts;\r\n\t\t\t} else {\r\n\t\t\t\tcreateNewTitleBlockAndAttach(chart, titleOpts);\r\n\t\t\t}\r\n\t\t} else if (titleBlock) {\r\n\t\t\tcore_layouts.removeBox(chart, titleBlock);\r\n\t\t\tdelete chart.titleBlock;\r\n\t\t}\r\n\t}\r\n};\n\nvar plugins = {};\r\nvar filler = plugin_filler;\r\nvar legend = plugin_legend;\r\nvar title = plugin_title;\nplugins.filler = filler;\nplugins.legend = legend;\nplugins.title = title;\n\n/**\r\n * @namespace Chart\r\n */\r\n\r\n\r\ncore_controller.helpers = helpers$1;\r\n\r\n// @todo dispatch these helpers into appropriated helpers/helpers.* file and write unit tests!\r\ncore_helpers();\r\n\r\ncore_controller._adapters = core_adapters;\r\ncore_controller.Animation = core_animation;\r\ncore_controller.animationService = core_animations;\r\ncore_controller.controllers = controllers;\r\ncore_controller.DatasetController = core_datasetController;\r\ncore_controller.defaults = core_defaults;\r\ncore_controller.Element = core_element;\r\ncore_controller.elements = elements;\r\ncore_controller.Interaction = core_interaction;\r\ncore_controller.layouts = core_layouts;\r\ncore_controller.platform = platform;\r\ncore_controller.plugins = core_plugins;\r\ncore_controller.Scale = core_scale;\r\ncore_controller.scaleService = core_scaleService;\r\ncore_controller.Ticks = core_ticks;\r\ncore_controller.Tooltip = core_tooltip;\r\n\r\n// Register built-in scales\r\n\r\ncore_controller.helpers.each(scales, function(scale, type) {\r\n\tcore_controller.scaleService.registerScaleType(type, scale, scale._defaults);\r\n});\r\n\r\n// Load to register built-in adapters (as side effects)\r\n\r\n\r\n// Loading built-in plugins\r\n\r\nfor (var k in plugins) {\r\n\tif (plugins.hasOwnProperty(k)) {\r\n\t\tcore_controller.plugins.register(plugins[k]);\r\n\t}\r\n}\r\n\r\ncore_controller.platform.initialize();\r\n\r\nvar src = core_controller;\r\nif (typeof window !== 'undefined') {\r\n\twindow.Chart = core_controller;\r\n}\r\n\r\n// DEPRECATIONS\r\n\r\n/**\r\n * Provided for backward compatibility, not available anymore\r\n * @namespace Chart.Chart\r\n * @deprecated since version 2.8.0\r\n * @todo remove at version 3\r\n * @private\r\n */\r\ncore_controller.Chart = core_controller;\r\n\r\n/**\r\n * Provided for backward compatibility, not available anymore\r\n * @namespace Chart.Legend\r\n * @deprecated since version 2.1.5\r\n * @todo remove at version 3\r\n * @private\r\n */\r\ncore_controller.Legend = plugins.legend._element;\r\n\r\n/**\r\n * Provided for backward compatibility, not available anymore\r\n * @namespace Chart.Title\r\n * @deprecated since version 2.1.5\r\n * @todo remove at version 3\r\n * @private\r\n */\r\ncore_controller.Title = plugins.title._element;\r\n\r\n/**\r\n * Provided for backward compatibility, use Chart.plugins instead\r\n * @namespace Chart.pluginService\r\n * @deprecated since version 2.1.5\r\n * @todo remove at version 3\r\n * @private\r\n */\r\ncore_controller.pluginService = core_controller.plugins;\r\n\r\n/**\r\n * Provided for backward compatibility, inheriting from Chart.PlugingBase has no\r\n * effect, instead simply create/register plugins via plain JavaScript objects.\r\n * @interface Chart.PluginBase\r\n * @deprecated since version 2.5.0\r\n * @todo remove at version 3\r\n * @private\r\n */\r\ncore_controller.PluginBase = core_controller.Element.extend({});\r\n\r\n/**\r\n * Provided for backward compatibility, use Chart.helpers.canvas instead.\r\n * @namespace Chart.canvasHelpers\r\n * @deprecated since version 2.6.0\r\n * @todo remove at version 3\r\n * @private\r\n */\r\ncore_controller.canvasHelpers = core_controller.helpers.canvas;\r\n\r\n/**\r\n * Provided for backward compatibility, use Chart.layouts instead.\r\n * @namespace Chart.layoutService\r\n * @deprecated since version 2.7.3\r\n * @todo remove at version 3\r\n * @private\r\n */\r\ncore_controller.layoutService = core_controller.layouts;\r\n\r\n/**\r\n * Provided for backward compatibility, not available anymore.\r\n * @namespace Chart.LinearScaleBase\r\n * @deprecated since version 2.8\r\n * @todo remove at version 3\r\n * @private\r\n */\r\ncore_controller.LinearScaleBase = scale_linearbase;\r\n\r\n/**\r\n * Provided for backward compatibility, instead we should create a new Chart\r\n * by setting the type in the config (`new Chart(id, {type: '{chart-type}'}`).\r\n * @deprecated since version 2.8.0\r\n * @todo remove at version 3\r\n */\r\ncore_controller.helpers.each(\r\n\t[\r\n\t\t'Bar',\r\n\t\t'Bubble',\r\n\t\t'Doughnut',\r\n\t\t'Line',\r\n\t\t'PolarArea',\r\n\t\t'Radar',\r\n\t\t'Scatter'\r\n\t],\r\n\tfunction(klass) {\r\n\t\tcore_controller[klass] = function(ctx, cfg) {\r\n\t\t\treturn new core_controller(ctx, core_controller.helpers.merge(cfg || {}, {\r\n\t\t\t\ttype: klass.charAt(0).toLowerCase() + klass.slice(1)\r\n\t\t\t}));\r\n\t\t};\r\n\t}\r\n);\n\nreturn src;\n\n})));\n","var baseIsEqual = require('./_baseIsEqual');\n\n/**\n * Performs a deep comparison between two values to determine if they are\n * equivalent.\n *\n * **Note:** This method supports comparing arrays, array buffers, booleans,\n * date objects, error objects, maps, numbers, `Object` objects, regexes,\n * sets, strings, symbols, and typed arrays. `Object` objects are compared\n * by their own, not inherited, enumerable properties. Functions and DOM\n * nodes are compared by strict equality, i.e. `===`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.isEqual(object, other);\n * // => true\n *\n * object === other;\n * // => false\n */\nfunction isEqual(value, other) {\n  return baseIsEqual(value, other);\n}\n\nmodule.exports = isEqual;\n","var Stack = require('./_Stack'),\n    equalArrays = require('./_equalArrays'),\n    equalByTag = require('./_equalByTag'),\n    equalObjects = require('./_equalObjects'),\n    getTag = require('./_getTag'),\n    isArray = require('./isArray'),\n    isBuffer = require('./isBuffer'),\n    isTypedArray = require('./isTypedArray');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n    arrayTag = '[object Array]',\n    objectTag = '[object Object]';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqual` for arrays and objects which performs\n * deep comparisons and tracks traversed objects enabling objects with circular\n * references to be compared.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n  var objIsArr = isArray(object),\n      othIsArr = isArray(other),\n      objTag = objIsArr ? arrayTag : getTag(object),\n      othTag = othIsArr ? arrayTag : getTag(other);\n\n  objTag = objTag == argsTag ? objectTag : objTag;\n  othTag = othTag == argsTag ? objectTag : othTag;\n\n  var objIsObj = objTag == objectTag,\n      othIsObj = othTag == objectTag,\n      isSameTag = objTag == othTag;\n\n  if (isSameTag && isBuffer(object)) {\n    if (!isBuffer(other)) {\n      return false;\n    }\n    objIsArr = true;\n    objIsObj = false;\n  }\n  if (isSameTag && !objIsObj) {\n    stack || (stack = new Stack);\n    return (objIsArr || isTypedArray(object))\n      ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n      : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);\n  }\n  if (!(bitmask & COMPARE_PARTIAL_FLAG)) {\n    var objIsWrapped = objIsObj && hasOwnProperty.call(object, '__wrapped__'),\n        othIsWrapped = othIsObj && hasOwnProperty.call(other, '__wrapped__');\n\n    if (objIsWrapped || othIsWrapped) {\n      var objUnwrapped = objIsWrapped ? object.value() : object,\n          othUnwrapped = othIsWrapped ? other.value() : other;\n\n      stack || (stack = new Stack);\n      return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);\n    }\n  }\n  if (!isSameTag) {\n    return false;\n  }\n  stack || (stack = new Stack);\n  return equalObjects(object, other, bitmask, customizer, equalFunc, stack);\n}\n\nmodule.exports = baseIsEqualDeep;\n","/**\n * Removes all key-value entries from the list cache.\n *\n * @private\n * @name clear\n * @memberOf ListCache\n */\nfunction listCacheClear() {\n  this.__data__ = [];\n  this.size = 0;\n}\n\nmodule.exports = listCacheClear;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/** Used for built-in method references. */\nvar arrayProto = Array.prototype;\n\n/** Built-in value references. */\nvar splice = arrayProto.splice;\n\n/**\n * Removes `key` and its value from the list cache.\n *\n * @private\n * @name delete\n * @memberOf ListCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction listCacheDelete(key) {\n  var data = this.__data__,\n      index = assocIndexOf(data, key);\n\n  if (index < 0) {\n    return false;\n  }\n  var lastIndex = data.length - 1;\n  if (index == lastIndex) {\n    data.pop();\n  } else {\n    splice.call(data, index, 1);\n  }\n  --this.size;\n  return true;\n}\n\nmodule.exports = listCacheDelete;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Gets the list cache value for `key`.\n *\n * @private\n * @name get\n * @memberOf ListCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction listCacheGet(key) {\n  var data = this.__data__,\n      index = assocIndexOf(data, key);\n\n  return index < 0 ? undefined : data[index][1];\n}\n\nmodule.exports = listCacheGet;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Checks if a list cache value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf ListCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction listCacheHas(key) {\n  return assocIndexOf(this.__data__, key) > -1;\n}\n\nmodule.exports = listCacheHas;\n","var assocIndexOf = require('./_assocIndexOf');\n\n/**\n * Sets the list cache `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf ListCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the list cache instance.\n */\nfunction listCacheSet(key, value) {\n  var data = this.__data__,\n      index = assocIndexOf(data, key);\n\n  if (index < 0) {\n    ++this.size;\n    data.push([key, value]);\n  } else {\n    data[index][1] = value;\n  }\n  return this;\n}\n\nmodule.exports = listCacheSet;\n","var ListCache = require('./_ListCache');\n\n/**\n * Removes all key-value entries from the stack.\n *\n * @private\n * @name clear\n * @memberOf Stack\n */\nfunction stackClear() {\n  this.__data__ = new ListCache;\n  this.size = 0;\n}\n\nmodule.exports = stackClear;\n","/**\n * Removes `key` and its value from the stack.\n *\n * @private\n * @name delete\n * @memberOf Stack\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction stackDelete(key) {\n  var data = this.__data__,\n      result = data['delete'](key);\n\n  this.size = data.size;\n  return result;\n}\n\nmodule.exports = stackDelete;\n","/**\n * Gets the stack value for `key`.\n *\n * @private\n * @name get\n * @memberOf Stack\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction stackGet(key) {\n  return this.__data__.get(key);\n}\n\nmodule.exports = stackGet;\n","/**\n * Checks if a stack value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Stack\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction stackHas(key) {\n  return this.__data__.has(key);\n}\n\nmodule.exports = stackHas;\n","var ListCache = require('./_ListCache'),\n    Map = require('./_Map'),\n    MapCache = require('./_MapCache');\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * Sets the stack `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Stack\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the stack cache instance.\n */\nfunction stackSet(key, value) {\n  var data = this.__data__;\n  if (data instanceof ListCache) {\n    var pairs = data.__data__;\n    if (!Map || (pairs.length < LARGE_ARRAY_SIZE - 1)) {\n      pairs.push([key, value]);\n      this.size = ++data.size;\n      return this;\n    }\n    data = this.__data__ = new MapCache(pairs);\n  }\n  data.set(key, value);\n  this.size = data.size;\n  return this;\n}\n\nmodule.exports = stackSet;\n","var isFunction = require('./isFunction'),\n    isMasked = require('./_isMasked'),\n    isObject = require('./isObject'),\n    toSource = require('./_toSource');\n\n/**\n * Used to match `RegExp`\n * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n */\nvar reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g;\n\n/** Used to detect host constructors (Safari). */\nvar reIsHostCtor = /^\\[object .+?Constructor\\]$/;\n\n/** Used for built-in method references. */\nvar funcProto = Function.prototype,\n    objectProto = Object.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Used to detect if a method is native. */\nvar reIsNative = RegExp('^' +\n  funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\\\$&')\n  .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') + '$'\n);\n\n/**\n * The base implementation of `_.isNative` without bad shim checks.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a native function,\n *  else `false`.\n */\nfunction baseIsNative(value) {\n  if (!isObject(value) || isMasked(value)) {\n    return false;\n  }\n  var pattern = isFunction(value) ? reIsNative : reIsHostCtor;\n  return pattern.test(toSource(value));\n}\n\nmodule.exports = baseIsNative;\n","var Symbol = require('./_Symbol');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the raw `toStringTag`.\n */\nfunction getRawTag(value) {\n  var isOwn = hasOwnProperty.call(value, symToStringTag),\n      tag = value[symToStringTag];\n\n  try {\n    value[symToStringTag] = undefined;\n    var unmasked = true;\n  } catch (e) {}\n\n  var result = nativeObjectToString.call(value);\n  if (unmasked) {\n    if (isOwn) {\n      value[symToStringTag] = tag;\n    } else {\n      delete value[symToStringTag];\n    }\n  }\n  return result;\n}\n\nmodule.exports = getRawTag;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar nativeObjectToString = objectProto.toString;\n\n/**\n * Converts `value` to a string using `Object.prototype.toString`.\n *\n * @private\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n */\nfunction objectToString(value) {\n  return nativeObjectToString.call(value);\n}\n\nmodule.exports = objectToString;\n","var coreJsData = require('./_coreJsData');\n\n/** Used to detect methods masquerading as native. */\nvar maskSrcKey = (function() {\n  var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');\n  return uid ? ('Symbol(src)_1.' + uid) : '';\n}());\n\n/**\n * Checks if `func` has its source masked.\n *\n * @private\n * @param {Function} func The function to check.\n * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n */\nfunction isMasked(func) {\n  return !!maskSrcKey && (maskSrcKey in func);\n}\n\nmodule.exports = isMasked;\n","var root = require('./_root');\n\n/** Used to detect overreaching core-js shims. */\nvar coreJsData = root['__core-js_shared__'];\n\nmodule.exports = coreJsData;\n","/**\n * Gets the value at `key` of `object`.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {string} key The key of the property to get.\n * @returns {*} Returns the property value.\n */\nfunction getValue(object, key) {\n  return object == null ? undefined : object[key];\n}\n\nmodule.exports = getValue;\n","var Hash = require('./_Hash'),\n    ListCache = require('./_ListCache'),\n    Map = require('./_Map');\n\n/**\n * Removes all key-value entries from the map.\n *\n * @private\n * @name clear\n * @memberOf MapCache\n */\nfunction mapCacheClear() {\n  this.size = 0;\n  this.__data__ = {\n    'hash': new Hash,\n    'map': new (Map || ListCache),\n    'string': new Hash\n  };\n}\n\nmodule.exports = mapCacheClear;\n","var hashClear = require('./_hashClear'),\n    hashDelete = require('./_hashDelete'),\n    hashGet = require('./_hashGet'),\n    hashHas = require('./_hashHas'),\n    hashSet = require('./_hashSet');\n\n/**\n * Creates a hash object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Hash(entries) {\n  var index = -1,\n      length = entries == null ? 0 : entries.length;\n\n  this.clear();\n  while (++index < length) {\n    var entry = entries[index];\n    this.set(entry[0], entry[1]);\n  }\n}\n\n// Add methods to `Hash`.\nHash.prototype.clear = hashClear;\nHash.prototype['delete'] = hashDelete;\nHash.prototype.get = hashGet;\nHash.prototype.has = hashHas;\nHash.prototype.set = hashSet;\n\nmodule.exports = Hash;\n","var nativeCreate = require('./_nativeCreate');\n\n/**\n * Removes all key-value entries from the hash.\n *\n * @private\n * @name clear\n * @memberOf Hash\n */\nfunction hashClear() {\n  this.__data__ = nativeCreate ? nativeCreate(null) : {};\n  this.size = 0;\n}\n\nmodule.exports = hashClear;\n","/**\n * Removes `key` and its value from the hash.\n *\n * @private\n * @name delete\n * @memberOf Hash\n * @param {Object} hash The hash to modify.\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction hashDelete(key) {\n  var result = this.has(key) && delete this.__data__[key];\n  this.size -= result ? 1 : 0;\n  return result;\n}\n\nmodule.exports = hashDelete;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Gets the hash value for `key`.\n *\n * @private\n * @name get\n * @memberOf Hash\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction hashGet(key) {\n  var data = this.__data__;\n  if (nativeCreate) {\n    var result = data[key];\n    return result === HASH_UNDEFINED ? undefined : result;\n  }\n  return hasOwnProperty.call(data, key) ? data[key] : undefined;\n}\n\nmodule.exports = hashGet;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Checks if a hash value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf Hash\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction hashHas(key) {\n  var data = this.__data__;\n  return nativeCreate ? (data[key] !== undefined) : hasOwnProperty.call(data, key);\n}\n\nmodule.exports = hashHas;\n","var nativeCreate = require('./_nativeCreate');\n\n/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Sets the hash `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf Hash\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the hash instance.\n */\nfunction hashSet(key, value) {\n  var data = this.__data__;\n  this.size += this.has(key) ? 0 : 1;\n  data[key] = (nativeCreate && value === undefined) ? HASH_UNDEFINED : value;\n  return this;\n}\n\nmodule.exports = hashSet;\n","var getMapData = require('./_getMapData');\n\n/**\n * Removes `key` and its value from the map.\n *\n * @private\n * @name delete\n * @memberOf MapCache\n * @param {string} key The key of the value to remove.\n * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n */\nfunction mapCacheDelete(key) {\n  var result = getMapData(this, key)['delete'](key);\n  this.size -= result ? 1 : 0;\n  return result;\n}\n\nmodule.exports = mapCacheDelete;\n","/**\n * Checks if `value` is suitable for use as unique object key.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n */\nfunction isKeyable(value) {\n  var type = typeof value;\n  return (type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean')\n    ? (value !== '__proto__')\n    : (value === null);\n}\n\nmodule.exports = isKeyable;\n","var getMapData = require('./_getMapData');\n\n/**\n * Gets the map value for `key`.\n *\n * @private\n * @name get\n * @memberOf MapCache\n * @param {string} key The key of the value to get.\n * @returns {*} Returns the entry value.\n */\nfunction mapCacheGet(key) {\n  return getMapData(this, key).get(key);\n}\n\nmodule.exports = mapCacheGet;\n","var getMapData = require('./_getMapData');\n\n/**\n * Checks if a map value for `key` exists.\n *\n * @private\n * @name has\n * @memberOf MapCache\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction mapCacheHas(key) {\n  return getMapData(this, key).has(key);\n}\n\nmodule.exports = mapCacheHas;\n","var getMapData = require('./_getMapData');\n\n/**\n * Sets the map `key` to `value`.\n *\n * @private\n * @name set\n * @memberOf MapCache\n * @param {string} key The key of the value to set.\n * @param {*} value The value to set.\n * @returns {Object} Returns the map cache instance.\n */\nfunction mapCacheSet(key, value) {\n  var data = getMapData(this, key),\n      size = data.size;\n\n  data.set(key, value);\n  this.size += data.size == size ? 0 : 1;\n  return this;\n}\n\nmodule.exports = mapCacheSet;\n","var MapCache = require('./_MapCache'),\n    setCacheAdd = require('./_setCacheAdd'),\n    setCacheHas = require('./_setCacheHas');\n\n/**\n *\n * Creates an array cache object to store unique values.\n *\n * @private\n * @constructor\n * @param {Array} [values] The values to cache.\n */\nfunction SetCache(values) {\n  var index = -1,\n      length = values == null ? 0 : values.length;\n\n  this.__data__ = new MapCache;\n  while (++index < length) {\n    this.add(values[index]);\n  }\n}\n\n// Add methods to `SetCache`.\nSetCache.prototype.add = SetCache.prototype.push = setCacheAdd;\nSetCache.prototype.has = setCacheHas;\n\nmodule.exports = SetCache;\n","/** Used to stand-in for `undefined` hash values. */\nvar HASH_UNDEFINED = '__lodash_hash_undefined__';\n\n/**\n * Adds `value` to the array cache.\n *\n * @private\n * @name add\n * @memberOf SetCache\n * @alias push\n * @param {*} value The value to cache.\n * @returns {Object} Returns the cache instance.\n */\nfunction setCacheAdd(value) {\n  this.__data__.set(value, HASH_UNDEFINED);\n  return this;\n}\n\nmodule.exports = setCacheAdd;\n","/**\n * Checks if `value` is in the array cache.\n *\n * @private\n * @name has\n * @memberOf SetCache\n * @param {*} value The value to search for.\n * @returns {number} Returns `true` if `value` is found, else `false`.\n */\nfunction setCacheHas(value) {\n  return this.__data__.has(value);\n}\n\nmodule.exports = setCacheHas;\n","/**\n * A specialized version of `_.some` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n *  else `false`.\n */\nfunction arraySome(array, predicate) {\n  var index = -1,\n      length = array == null ? 0 : array.length;\n\n  while (++index < length) {\n    if (predicate(array[index], index, array)) {\n      return true;\n    }\n  }\n  return false;\n}\n\nmodule.exports = arraySome;\n","/**\n * Checks if a `cache` value for `key` exists.\n *\n * @private\n * @param {Object} cache The cache to query.\n * @param {string} key The key of the entry to check.\n * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n */\nfunction cacheHas(cache, key) {\n  return cache.has(key);\n}\n\nmodule.exports = cacheHas;\n","var Symbol = require('./_Symbol'),\n    Uint8Array = require('./_Uint8Array'),\n    eq = require('./eq'),\n    equalArrays = require('./_equalArrays'),\n    mapToArray = require('./_mapToArray'),\n    setToArray = require('./_setToArray');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n    COMPARE_UNORDERED_FLAG = 2;\n\n/** `Object#toString` result references. */\nvar boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    errorTag = '[object Error]',\n    mapTag = '[object Map]',\n    numberTag = '[object Number]',\n    regexpTag = '[object RegExp]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    symbolTag = '[object Symbol]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    dataViewTag = '[object DataView]';\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n    symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;\n\n/**\n * A specialized version of `baseIsEqualDeep` for comparing objects of\n * the same `toStringTag`.\n *\n * **Note:** This function only supports comparing values with tags of\n * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {string} tag The `toStringTag` of the objects to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n  switch (tag) {\n    case dataViewTag:\n      if ((object.byteLength != other.byteLength) ||\n          (object.byteOffset != other.byteOffset)) {\n        return false;\n      }\n      object = object.buffer;\n      other = other.buffer;\n\n    case arrayBufferTag:\n      if ((object.byteLength != other.byteLength) ||\n          !equalFunc(new Uint8Array(object), new Uint8Array(other))) {\n        return false;\n      }\n      return true;\n\n    case boolTag:\n    case dateTag:\n    case numberTag:\n      // Coerce booleans to `1` or `0` and dates to milliseconds.\n      // Invalid dates are coerced to `NaN`.\n      return eq(+object, +other);\n\n    case errorTag:\n      return object.name == other.name && object.message == other.message;\n\n    case regexpTag:\n    case stringTag:\n      // Coerce regexes to strings and treat strings, primitives and objects,\n      // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n      // for more details.\n      return object == (other + '');\n\n    case mapTag:\n      var convert = mapToArray;\n\n    case setTag:\n      var isPartial = bitmask & COMPARE_PARTIAL_FLAG;\n      convert || (convert = setToArray);\n\n      if (object.size != other.size && !isPartial) {\n        return false;\n      }\n      // Assume cyclic values are equal.\n      var stacked = stack.get(object);\n      if (stacked) {\n        return stacked == other;\n      }\n      bitmask |= COMPARE_UNORDERED_FLAG;\n\n      // Recursively compare objects (susceptible to call stack limits).\n      stack.set(object, other);\n      var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);\n      stack['delete'](object);\n      return result;\n\n    case symbolTag:\n      if (symbolValueOf) {\n        return symbolValueOf.call(object) == symbolValueOf.call(other);\n      }\n  }\n  return false;\n}\n\nmodule.exports = equalByTag;\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Uint8Array = root.Uint8Array;\n\nmodule.exports = Uint8Array;\n","/**\n * Converts `map` to its key-value pairs.\n *\n * @private\n * @param {Object} map The map to convert.\n * @returns {Array} Returns the key-value pairs.\n */\nfunction mapToArray(map) {\n  var index = -1,\n      result = Array(map.size);\n\n  map.forEach(function(value, key) {\n    result[++index] = [key, value];\n  });\n  return result;\n}\n\nmodule.exports = mapToArray;\n","/**\n * Converts `set` to an array of its values.\n *\n * @private\n * @param {Object} set The set to convert.\n * @returns {Array} Returns the values.\n */\nfunction setToArray(set) {\n  var index = -1,\n      result = Array(set.size);\n\n  set.forEach(function(value) {\n    result[++index] = value;\n  });\n  return result;\n}\n\nmodule.exports = setToArray;\n","var getAllKeys = require('./_getAllKeys');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1;\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * A specialized version of `baseIsEqualDeep` for objects with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `object` and `other` objects.\n * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n */\nfunction equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n  var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n      objProps = getAllKeys(object),\n      objLength = objProps.length,\n      othProps = getAllKeys(other),\n      othLength = othProps.length;\n\n  if (objLength != othLength && !isPartial) {\n    return false;\n  }\n  var index = objLength;\n  while (index--) {\n    var key = objProps[index];\n    if (!(isPartial ? key in other : hasOwnProperty.call(other, key))) {\n      return false;\n    }\n  }\n  // Check that cyclic values are equal.\n  var objStacked = stack.get(object);\n  var othStacked = stack.get(other);\n  if (objStacked && othStacked) {\n    return objStacked == other && othStacked == object;\n  }\n  var result = true;\n  stack.set(object, other);\n  stack.set(other, object);\n\n  var skipCtor = isPartial;\n  while (++index < objLength) {\n    key = objProps[index];\n    var objValue = object[key],\n        othValue = other[key];\n\n    if (customizer) {\n      var compared = isPartial\n        ? customizer(othValue, objValue, key, other, object, stack)\n        : customizer(objValue, othValue, key, object, other, stack);\n    }\n    // Recursively compare objects (susceptible to call stack limits).\n    if (!(compared === undefined\n          ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))\n          : compared\n        )) {\n      result = false;\n      break;\n    }\n    skipCtor || (skipCtor = key == 'constructor');\n  }\n  if (result && !skipCtor) {\n    var objCtor = object.constructor,\n        othCtor = other.constructor;\n\n    // Non `Object` object instances with different constructors are not equal.\n    if (objCtor != othCtor &&\n        ('constructor' in object && 'constructor' in other) &&\n        !(typeof objCtor == 'function' && objCtor instanceof objCtor &&\n          typeof othCtor == 'function' && othCtor instanceof othCtor)) {\n      result = false;\n    }\n  }\n  stack['delete'](object);\n  stack['delete'](other);\n  return result;\n}\n\nmodule.exports = equalObjects;\n","var baseGetAllKeys = require('./_baseGetAllKeys'),\n    getSymbols = require('./_getSymbols'),\n    keys = require('./keys');\n\n/**\n * Creates an array of own enumerable property names and symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction getAllKeys(object) {\n  return baseGetAllKeys(object, keys, getSymbols);\n}\n\nmodule.exports = getAllKeys;\n","var arrayPush = require('./_arrayPush'),\n    isArray = require('./isArray');\n\n/**\n * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n * symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @param {Function} symbolsFunc The function to get the symbols of `object`.\n * @returns {Array} Returns the array of property names and symbols.\n */\nfunction baseGetAllKeys(object, keysFunc, symbolsFunc) {\n  var result = keysFunc(object);\n  return isArray(object) ? result : arrayPush(result, symbolsFunc(object));\n}\n\nmodule.exports = baseGetAllKeys;\n","/**\n * Appends the elements of `values` to `array`.\n *\n * @private\n * @param {Array} array The array to modify.\n * @param {Array} values The values to append.\n * @returns {Array} Returns `array`.\n */\nfunction arrayPush(array, values) {\n  var index = -1,\n      length = values.length,\n      offset = array.length;\n\n  while (++index < length) {\n    array[offset + index] = values[index];\n  }\n  return array;\n}\n\nmodule.exports = arrayPush;\n","var arrayFilter = require('./_arrayFilter'),\n    stubArray = require('./stubArray');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeGetSymbols = Object.getOwnPropertySymbols;\n\n/**\n * Creates an array of the own enumerable symbols of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of symbols.\n */\nvar getSymbols = !nativeGetSymbols ? stubArray : function(object) {\n  if (object == null) {\n    return [];\n  }\n  object = Object(object);\n  return arrayFilter(nativeGetSymbols(object), function(symbol) {\n    return propertyIsEnumerable.call(object, symbol);\n  });\n};\n\nmodule.exports = getSymbols;\n","/**\n * A specialized version of `_.filter` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n */\nfunction arrayFilter(array, predicate) {\n  var index = -1,\n      length = array == null ? 0 : array.length,\n      resIndex = 0,\n      result = [];\n\n  while (++index < length) {\n    var value = array[index];\n    if (predicate(value, index, array)) {\n      result[resIndex++] = value;\n    }\n  }\n  return result;\n}\n\nmodule.exports = arrayFilter;\n","/**\n * This method returns a new empty array.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {Array} Returns the new empty array.\n * @example\n *\n * var arrays = _.times(2, _.stubArray);\n *\n * console.log(arrays);\n * // => [[], []]\n *\n * console.log(arrays[0] === arrays[1]);\n * // => false\n */\nfunction stubArray() {\n  return [];\n}\n\nmodule.exports = stubArray;\n","var baseTimes = require('./_baseTimes'),\n    isArguments = require('./isArguments'),\n    isArray = require('./isArray'),\n    isBuffer = require('./isBuffer'),\n    isIndex = require('./_isIndex'),\n    isTypedArray = require('./isTypedArray');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates an array of the enumerable property names of the array-like `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @param {boolean} inherited Specify returning inherited property names.\n * @returns {Array} Returns the array of property names.\n */\nfunction arrayLikeKeys(value, inherited) {\n  var isArr = isArray(value),\n      isArg = !isArr && isArguments(value),\n      isBuff = !isArr && !isArg && isBuffer(value),\n      isType = !isArr && !isArg && !isBuff && isTypedArray(value),\n      skipIndexes = isArr || isArg || isBuff || isType,\n      result = skipIndexes ? baseTimes(value.length, String) : [],\n      length = result.length;\n\n  for (var key in value) {\n    if ((inherited || hasOwnProperty.call(value, key)) &&\n        !(skipIndexes && (\n           // Safari 9 has enumerable `arguments.length` in strict mode.\n           key == 'length' ||\n           // Node.js 0.10 has enumerable non-index properties on buffers.\n           (isBuff && (key == 'offset' || key == 'parent')) ||\n           // PhantomJS 2 has enumerable non-index properties on typed arrays.\n           (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n           // Skip index properties.\n           isIndex(key, length)\n        ))) {\n      result.push(key);\n    }\n  }\n  return result;\n}\n\nmodule.exports = arrayLikeKeys;\n","/**\n * The base implementation of `_.times` without support for iteratee shorthands\n * or max array length checks.\n *\n * @private\n * @param {number} n The number of times to invoke `iteratee`.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the array of results.\n */\nfunction baseTimes(n, iteratee) {\n  var index = -1,\n      result = Array(n);\n\n  while (++index < n) {\n    result[index] = iteratee(index);\n  }\n  return result;\n}\n\nmodule.exports = baseTimes;\n","var baseGetTag = require('./_baseGetTag'),\n    isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]';\n\n/**\n * The base implementation of `_.isArguments`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n */\nfunction baseIsArguments(value) {\n  return isObjectLike(value) && baseGetTag(value) == argsTag;\n}\n\nmodule.exports = baseIsArguments;\n","/**\n * This method returns `false`.\n *\n * @static\n * @memberOf _\n * @since 4.13.0\n * @category Util\n * @returns {boolean} Returns `false`.\n * @example\n *\n * _.times(2, _.stubFalse);\n * // => [false, false]\n */\nfunction stubFalse() {\n  return false;\n}\n\nmodule.exports = stubFalse;\n","var baseGetTag = require('./_baseGetTag'),\n    isLength = require('./isLength'),\n    isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar argsTag = '[object Arguments]',\n    arrayTag = '[object Array]',\n    boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    errorTag = '[object Error]',\n    funcTag = '[object Function]',\n    mapTag = '[object Map]',\n    numberTag = '[object Number]',\n    objectTag = '[object Object]',\n    regexpTag = '[object RegExp]',\n    setTag = '[object Set]',\n    stringTag = '[object String]',\n    weakMapTag = '[object WeakMap]';\n\nvar arrayBufferTag = '[object ArrayBuffer]',\n    dataViewTag = '[object DataView]',\n    float32Tag = '[object Float32Array]',\n    float64Tag = '[object Float64Array]',\n    int8Tag = '[object Int8Array]',\n    int16Tag = '[object Int16Array]',\n    int32Tag = '[object Int32Array]',\n    uint8Tag = '[object Uint8Array]',\n    uint8ClampedTag = '[object Uint8ClampedArray]',\n    uint16Tag = '[object Uint16Array]',\n    uint32Tag = '[object Uint32Array]';\n\n/** Used to identify `toStringTag` values of typed arrays. */\nvar typedArrayTags = {};\ntypedArrayTags[float32Tag] = typedArrayTags[float64Tag] =\ntypedArrayTags[int8Tag] = typedArrayTags[int16Tag] =\ntypedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =\ntypedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =\ntypedArrayTags[uint32Tag] = true;\ntypedArrayTags[argsTag] = typedArrayTags[arrayTag] =\ntypedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =\ntypedArrayTags[dataViewTag] = typedArrayTags[dateTag] =\ntypedArrayTags[errorTag] = typedArrayTags[funcTag] =\ntypedArrayTags[mapTag] = typedArrayTags[numberTag] =\ntypedArrayTags[objectTag] = typedArrayTags[regexpTag] =\ntypedArrayTags[setTag] = typedArrayTags[stringTag] =\ntypedArrayTags[weakMapTag] = false;\n\n/**\n * The base implementation of `_.isTypedArray` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n */\nfunction baseIsTypedArray(value) {\n  return isObjectLike(value) &&\n    isLength(value.length) && !!typedArrayTags[baseGetTag(value)];\n}\n\nmodule.exports = baseIsTypedArray;\n","/**\n * The base implementation of `_.unary` without support for storing metadata.\n *\n * @private\n * @param {Function} func The function to cap arguments for.\n * @returns {Function} Returns the new capped function.\n */\nfunction baseUnary(func) {\n  return function(value) {\n    return func(value);\n  };\n}\n\nmodule.exports = baseUnary;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\nmodule.exports = root;\n","var freeGlobal = require('./_freeGlobal');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Detect free variable `process` from Node.js. */\nvar freeProcess = moduleExports && freeGlobal.process;\n\n/** Used to access faster Node.js helpers. */\nvar nodeUtil = (function() {\n  try {\n    // Use `util.types` for Node.js 10+.\n    var types = freeModule && freeModule.require && freeModule.require('util').types;\n\n    if (types) {\n      return types;\n    }\n\n    // Legacy `process.binding('util')` for Node.js < 10.\n    return freeProcess && freeProcess.binding && freeProcess.binding('util');\n  } catch (e) {}\n}());\n\nmodule.exports = nodeUtil;\n","var isPrototype = require('./_isPrototype'),\n    nativeKeys = require('./_nativeKeys');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n */\nfunction baseKeys(object) {\n  if (!isPrototype(object)) {\n    return nativeKeys(object);\n  }\n  var result = [];\n  for (var key in Object(object)) {\n    if (hasOwnProperty.call(object, key) && key != 'constructor') {\n      result.push(key);\n    }\n  }\n  return result;\n}\n\nmodule.exports = baseKeys;\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Checks if `value` is likely a prototype object.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n */\nfunction isPrototype(value) {\n  var Ctor = value && value.constructor,\n      proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;\n\n  return value === proto;\n}\n\nmodule.exports = isPrototype;\n","var overArg = require('./_overArg');\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeKeys = overArg(Object.keys, Object);\n\nmodule.exports = nativeKeys;\n","/**\n * Creates a unary function that invokes `func` with its argument transformed.\n *\n * @private\n * @param {Function} func The function to wrap.\n * @param {Function} transform The argument transform.\n * @returns {Function} Returns the new function.\n */\nfunction overArg(func, transform) {\n  return function(arg) {\n    return func(transform(arg));\n  };\n}\n\nmodule.exports = overArg;\n","var DataView = require('./_DataView'),\n    Map = require('./_Map'),\n    Promise = require('./_Promise'),\n    Set = require('./_Set'),\n    WeakMap = require('./_WeakMap'),\n    baseGetTag = require('./_baseGetTag'),\n    toSource = require('./_toSource');\n\n/** `Object#toString` result references. */\nvar mapTag = '[object Map]',\n    objectTag = '[object Object]',\n    promiseTag = '[object Promise]',\n    setTag = '[object Set]',\n    weakMapTag = '[object WeakMap]';\n\nvar dataViewTag = '[object DataView]';\n\n/** Used to detect maps, sets, and weakmaps. */\nvar dataViewCtorString = toSource(DataView),\n    mapCtorString = toSource(Map),\n    promiseCtorString = toSource(Promise),\n    setCtorString = toSource(Set),\n    weakMapCtorString = toSource(WeakMap);\n\n/**\n * Gets the `toStringTag` of `value`.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nvar getTag = baseGetTag;\n\n// Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\nif ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||\n    (Map && getTag(new Map) != mapTag) ||\n    (Promise && getTag(Promise.resolve()) != promiseTag) ||\n    (Set && getTag(new Set) != setTag) ||\n    (WeakMap && getTag(new WeakMap) != weakMapTag)) {\n  getTag = function(value) {\n    var result = baseGetTag(value),\n        Ctor = result == objectTag ? value.constructor : undefined,\n        ctorString = Ctor ? toSource(Ctor) : '';\n\n    if (ctorString) {\n      switch (ctorString) {\n        case dataViewCtorString: return dataViewTag;\n        case mapCtorString: return mapTag;\n        case promiseCtorString: return promiseTag;\n        case setCtorString: return setTag;\n        case weakMapCtorString: return weakMapTag;\n      }\n    }\n    return result;\n  };\n}\n\nmodule.exports = getTag;\n","var getNative = require('./_getNative'),\n    root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar DataView = getNative(root, 'DataView');\n\nmodule.exports = DataView;\n","var getNative = require('./_getNative'),\n    root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Promise = getNative(root, 'Promise');\n\nmodule.exports = Promise;\n","var getNative = require('./_getNative'),\n    root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Set = getNative(root, 'Set');\n\nmodule.exports = Set;\n","var getNative = require('./_getNative'),\n    root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar WeakMap = getNative(root, 'WeakMap');\n\nmodule.exports = WeakMap;\n","/**\n * Checks if `value` is classified as an `Array` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n * @example\n *\n * _.isArray([1, 2, 3]);\n * // => true\n *\n * _.isArray(document.body.children);\n * // => false\n *\n * _.isArray('abc');\n * // => false\n *\n * _.isArray(_.noop);\n * // => false\n */\nvar isArray = Array.isArray;\n\nmodule.exports = isArray;\n","var baseAssignValue = require('./_baseAssignValue'),\n    createAggregator = require('./_createAggregator');\n\n/**\n * Creates an object composed of keys generated from the results of running\n * each element of `collection` thru `iteratee`. The corresponding value of\n * each key is the last element responsible for generating the key. The\n * iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n * @returns {Object} Returns the composed aggregate object.\n * @example\n *\n * var array = [\n *   { 'dir': 'left', 'code': 97 },\n *   { 'dir': 'right', 'code': 100 }\n * ];\n *\n * _.keyBy(array, function(o) {\n *   return String.fromCharCode(o.code);\n * });\n * // => { 'a': { 'dir': 'left', 'code': 97 }, 'd': { 'dir': 'right', 'code': 100 } }\n *\n * _.keyBy(array, 'dir');\n * // => { 'left': { 'dir': 'left', 'code': 97 }, 'right': { 'dir': 'right', 'code': 100 } }\n */\nvar keyBy = createAggregator(function(result, value, key) {\n  baseAssignValue(result, key, value);\n});\n\nmodule.exports = keyBy;\n","var defineProperty = require('./_defineProperty');\n\n/**\n * The base implementation of `assignValue` and `assignMergeValue` without\n * value checks.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {string} key The key of the property to assign.\n * @param {*} value The value to assign.\n */\nfunction baseAssignValue(object, key, value) {\n  if (key == '__proto__' && defineProperty) {\n    defineProperty(object, key, {\n      'configurable': true,\n      'enumerable': true,\n      'value': value,\n      'writable': true\n    });\n  } else {\n    object[key] = value;\n  }\n}\n\nmodule.exports = baseAssignValue;\n","var getNative = require('./_getNative');\n\nvar defineProperty = (function() {\n  try {\n    var func = getNative(Object, 'defineProperty');\n    func({}, '', {});\n    return func;\n  } catch (e) {}\n}());\n\nmodule.exports = defineProperty;\n","var arrayAggregator = require('./_arrayAggregator'),\n    baseAggregator = require('./_baseAggregator'),\n    baseIteratee = require('./_baseIteratee'),\n    isArray = require('./isArray');\n\n/**\n * Creates a function like `_.groupBy`.\n *\n * @private\n * @param {Function} setter The function to set accumulator values.\n * @param {Function} [initializer] The accumulator object initializer.\n * @returns {Function} Returns the new aggregator function.\n */\nfunction createAggregator(setter, initializer) {\n  return function(collection, iteratee) {\n    var func = isArray(collection) ? arrayAggregator : baseAggregator,\n        accumulator = initializer ? initializer() : {};\n\n    return func(collection, setter, baseIteratee(iteratee, 2), accumulator);\n  };\n}\n\nmodule.exports = createAggregator;\n","/**\n * A specialized version of `baseAggregator` for arrays.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} setter The function to set `accumulator` values.\n * @param {Function} iteratee The iteratee to transform keys.\n * @param {Object} accumulator The initial aggregated object.\n * @returns {Function} Returns `accumulator`.\n */\nfunction arrayAggregator(array, setter, iteratee, accumulator) {\n  var index = -1,\n      length = array == null ? 0 : array.length;\n\n  while (++index < length) {\n    var value = array[index];\n    setter(accumulator, value, iteratee(value), array);\n  }\n  return accumulator;\n}\n\nmodule.exports = arrayAggregator;\n","var baseEach = require('./_baseEach');\n\n/**\n * Aggregates elements of `collection` on `accumulator` with keys transformed\n * by `iteratee` and values set by `setter`.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} setter The function to set `accumulator` values.\n * @param {Function} iteratee The iteratee to transform keys.\n * @param {Object} accumulator The initial aggregated object.\n * @returns {Function} Returns `accumulator`.\n */\nfunction baseAggregator(collection, setter, iteratee, accumulator) {\n  baseEach(collection, function(value, key, collection) {\n    setter(accumulator, value, iteratee(value), collection);\n  });\n  return accumulator;\n}\n\nmodule.exports = baseAggregator;\n","var baseForOwn = require('./_baseForOwn'),\n    createBaseEach = require('./_createBaseEach');\n\n/**\n * The base implementation of `_.forEach` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array|Object} Returns `collection`.\n */\nvar baseEach = createBaseEach(baseForOwn);\n\nmodule.exports = baseEach;\n","var baseFor = require('./_baseFor'),\n    keys = require('./keys');\n\n/**\n * The base implementation of `_.forOwn` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Object} Returns `object`.\n */\nfunction baseForOwn(object, iteratee) {\n  return object && baseFor(object, iteratee, keys);\n}\n\nmodule.exports = baseForOwn;\n","var createBaseFor = require('./_createBaseFor');\n\n/**\n * The base implementation of `baseForOwn` which iterates over `object`\n * properties returned by `keysFunc` and invokes `iteratee` for each property.\n * Iteratee functions may exit iteration early by explicitly returning `false`.\n *\n * @private\n * @param {Object} object The object to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @param {Function} keysFunc The function to get the keys of `object`.\n * @returns {Object} Returns `object`.\n */\nvar baseFor = createBaseFor();\n\nmodule.exports = baseFor;\n","/**\n * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseFor(fromRight) {\n  return function(object, iteratee, keysFunc) {\n    var index = -1,\n        iterable = Object(object),\n        props = keysFunc(object),\n        length = props.length;\n\n    while (length--) {\n      var key = props[fromRight ? length : ++index];\n      if (iteratee(iterable[key], key, iterable) === false) {\n        break;\n      }\n    }\n    return object;\n  };\n}\n\nmodule.exports = createBaseFor;\n","var isArrayLike = require('./isArrayLike');\n\n/**\n * Creates a `baseEach` or `baseEachRight` function.\n *\n * @private\n * @param {Function} eachFunc The function to iterate over a collection.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new base function.\n */\nfunction createBaseEach(eachFunc, fromRight) {\n  return function(collection, iteratee) {\n    if (collection == null) {\n      return collection;\n    }\n    if (!isArrayLike(collection)) {\n      return eachFunc(collection, iteratee);\n    }\n    var length = collection.length,\n        index = fromRight ? length : -1,\n        iterable = Object(collection);\n\n    while ((fromRight ? index-- : ++index < length)) {\n      if (iteratee(iterable[index], index, iterable) === false) {\n        break;\n      }\n    }\n    return collection;\n  };\n}\n\nmodule.exports = createBaseEach;\n","var baseMatches = require('./_baseMatches'),\n    baseMatchesProperty = require('./_baseMatchesProperty'),\n    identity = require('./identity'),\n    isArray = require('./isArray'),\n    property = require('./property');\n\n/**\n * The base implementation of `_.iteratee`.\n *\n * @private\n * @param {*} [value=_.identity] The value to convert to an iteratee.\n * @returns {Function} Returns the iteratee.\n */\nfunction baseIteratee(value) {\n  // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\n  // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\n  if (typeof value == 'function') {\n    return value;\n  }\n  if (value == null) {\n    return identity;\n  }\n  if (typeof value == 'object') {\n    return isArray(value)\n      ? baseMatchesProperty(value[0], value[1])\n      : baseMatches(value);\n  }\n  return property(value);\n}\n\nmodule.exports = baseIteratee;\n","var baseIsMatch = require('./_baseIsMatch'),\n    getMatchData = require('./_getMatchData'),\n    matchesStrictComparable = require('./_matchesStrictComparable');\n\n/**\n * The base implementation of `_.matches` which doesn't clone `source`.\n *\n * @private\n * @param {Object} source The object of property values to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatches(source) {\n  var matchData = getMatchData(source);\n  if (matchData.length == 1 && matchData[0][2]) {\n    return matchesStrictComparable(matchData[0][0], matchData[0][1]);\n  }\n  return function(object) {\n    return object === source || baseIsMatch(object, source, matchData);\n  };\n}\n\nmodule.exports = baseMatches;\n","var Stack = require('./_Stack'),\n    baseIsEqual = require('./_baseIsEqual');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n    COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * The base implementation of `_.isMatch` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The object to inspect.\n * @param {Object} source The object of property values to match.\n * @param {Array} matchData The property names, values, and compare flags to match.\n * @param {Function} [customizer] The function to customize comparisons.\n * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n */\nfunction baseIsMatch(object, source, matchData, customizer) {\n  var index = matchData.length,\n      length = index,\n      noCustomizer = !customizer;\n\n  if (object == null) {\n    return !length;\n  }\n  object = Object(object);\n  while (index--) {\n    var data = matchData[index];\n    if ((noCustomizer && data[2])\n          ? data[1] !== object[data[0]]\n          : !(data[0] in object)\n        ) {\n      return false;\n    }\n  }\n  while (++index < length) {\n    data = matchData[index];\n    var key = data[0],\n        objValue = object[key],\n        srcValue = data[1];\n\n    if (noCustomizer && data[2]) {\n      if (objValue === undefined && !(key in object)) {\n        return false;\n      }\n    } else {\n      var stack = new Stack;\n      if (customizer) {\n        var result = customizer(objValue, srcValue, key, object, source, stack);\n      }\n      if (!(result === undefined\n            ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG, customizer, stack)\n            : result\n          )) {\n        return false;\n      }\n    }\n  }\n  return true;\n}\n\nmodule.exports = baseIsMatch;\n","var isStrictComparable = require('./_isStrictComparable'),\n    keys = require('./keys');\n\n/**\n * Gets the property names, values, and compare flags of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @returns {Array} Returns the match data of `object`.\n */\nfunction getMatchData(object) {\n  var result = keys(object),\n      length = result.length;\n\n  while (length--) {\n    var key = result[length],\n        value = object[key];\n\n    result[length] = [key, value, isStrictComparable(value)];\n  }\n  return result;\n}\n\nmodule.exports = getMatchData;\n","var baseIsEqual = require('./_baseIsEqual'),\n    get = require('./get'),\n    hasIn = require('./hasIn'),\n    isKey = require('./_isKey'),\n    isStrictComparable = require('./_isStrictComparable'),\n    matchesStrictComparable = require('./_matchesStrictComparable'),\n    toKey = require('./_toKey');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n    COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\n *\n * @private\n * @param {string} path The path of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction baseMatchesProperty(path, srcValue) {\n  if (isKey(path) && isStrictComparable(srcValue)) {\n    return matchesStrictComparable(toKey(path), srcValue);\n  }\n  return function(object) {\n    var objValue = get(object, path);\n    return (objValue === undefined && objValue === srcValue)\n      ? hasIn(object, path)\n      : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG);\n  };\n}\n\nmodule.exports = baseMatchesProperty;\n","var baseGet = require('./_baseGet');\n\n/**\n * Gets the value at `path` of `object`. If the resolved value is\n * `undefined`, the `defaultValue` is returned in its place.\n *\n * @static\n * @memberOf _\n * @since 3.7.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n * @returns {*} Returns the resolved value.\n * @example\n *\n * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n *\n * _.get(object, 'a[0].b.c');\n * // => 3\n *\n * _.get(object, ['a', '0', 'b', 'c']);\n * // => 3\n *\n * _.get(object, 'a.b.c', 'default');\n * // => 'default'\n */\nfunction get(object, path, defaultValue) {\n  var result = object == null ? undefined : baseGet(object, path);\n  return result === undefined ? defaultValue : result;\n}\n\nmodule.exports = get;\n","var memoizeCapped = require('./_memoizeCapped');\n\n/** Used to match property names within property paths. */\nvar rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g;\n\n/** Used to match backslashes in property paths. */\nvar reEscapeChar = /\\\\(\\\\)?/g;\n\n/**\n * Converts `string` to a property path array.\n *\n * @private\n * @param {string} string The string to convert.\n * @returns {Array} Returns the property path array.\n */\nvar stringToPath = memoizeCapped(function(string) {\n  var result = [];\n  if (string.charCodeAt(0) === 46 /* . */) {\n    result.push('');\n  }\n  string.replace(rePropName, function(match, number, quote, subString) {\n    result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));\n  });\n  return result;\n});\n\nmodule.exports = stringToPath;\n","var memoize = require('./memoize');\n\n/** Used as the maximum memoize cache size. */\nvar MAX_MEMOIZE_SIZE = 500;\n\n/**\n * A specialized version of `_.memoize` which clears the memoized function's\n * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n *\n * @private\n * @param {Function} func The function to have its output memoized.\n * @returns {Function} Returns the new memoized function.\n */\nfunction memoizeCapped(func) {\n  var result = memoize(func, function(key) {\n    if (cache.size === MAX_MEMOIZE_SIZE) {\n      cache.clear();\n    }\n    return key;\n  });\n\n  var cache = result.cache;\n  return result;\n}\n\nmodule.exports = memoizeCapped;\n","var MapCache = require('./_MapCache');\n\n/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a function that memoizes the result of `func`. If `resolver` is\n * provided, it determines the cache key for storing the result based on the\n * arguments provided to the memoized function. By default, the first argument\n * provided to the memoized function is used as the map cache key. The `func`\n * is invoked with the `this` binding of the memoized function.\n *\n * **Note:** The cache is exposed as the `cache` property on the memoized\n * function. Its creation may be customized by replacing the `_.memoize.Cache`\n * constructor with one whose instances implement the\n * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to have its output memoized.\n * @param {Function} [resolver] The function to resolve the cache key.\n * @returns {Function} Returns the new memoized function.\n * @example\n *\n * var object = { 'a': 1, 'b': 2 };\n * var other = { 'c': 3, 'd': 4 };\n *\n * var values = _.memoize(_.values);\n * values(object);\n * // => [1, 2]\n *\n * values(other);\n * // => [3, 4]\n *\n * object.a = 2;\n * values(object);\n * // => [1, 2]\n *\n * // Modify the result cache.\n * values.cache.set(object, ['a', 'b']);\n * values(object);\n * // => ['a', 'b']\n *\n * // Replace `_.memoize.Cache`.\n * _.memoize.Cache = WeakMap;\n */\nfunction memoize(func, resolver) {\n  if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n    throw new TypeError(FUNC_ERROR_TEXT);\n  }\n  var memoized = function() {\n    var args = arguments,\n        key = resolver ? resolver.apply(this, args) : args[0],\n        cache = memoized.cache;\n\n    if (cache.has(key)) {\n      return cache.get(key);\n    }\n    var result = func.apply(this, args);\n    memoized.cache = cache.set(key, result) || cache;\n    return result;\n  };\n  memoized.cache = new (memoize.Cache || MapCache);\n  return memoized;\n}\n\n// Expose `MapCache`.\nmemoize.Cache = MapCache;\n\nmodule.exports = memoize;\n","var baseToString = require('./_baseToString');\n\n/**\n * Converts `value` to a string. An empty string is returned for `null`\n * and `undefined` values. The sign of `-0` is preserved.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {string} Returns the converted string.\n * @example\n *\n * _.toString(null);\n * // => ''\n *\n * _.toString(-0);\n * // => '-0'\n *\n * _.toString([1, 2, 3]);\n * // => '1,2,3'\n */\nfunction toString(value) {\n  return value == null ? '' : baseToString(value);\n}\n\nmodule.exports = toString;\n","var Symbol = require('./_Symbol'),\n    arrayMap = require('./_arrayMap'),\n    isArray = require('./isArray'),\n    isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/** Used to convert symbols to primitives and strings. */\nvar symbolProto = Symbol ? Symbol.prototype : undefined,\n    symbolToString = symbolProto ? symbolProto.toString : undefined;\n\n/**\n * The base implementation of `_.toString` which doesn't convert nullish\n * values to empty strings.\n *\n * @private\n * @param {*} value The value to process.\n * @returns {string} Returns the string.\n */\nfunction baseToString(value) {\n  // Exit early for strings to avoid a performance hit in some environments.\n  if (typeof value == 'string') {\n    return value;\n  }\n  if (isArray(value)) {\n    // Recursively convert values (susceptible to call stack limits).\n    return arrayMap(value, baseToString) + '';\n  }\n  if (isSymbol(value)) {\n    return symbolToString ? symbolToString.call(value) : '';\n  }\n  var result = (value + '');\n  return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = baseToString;\n","/**\n * A specialized version of `_.map` for arrays without support for iteratee\n * shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction arrayMap(array, iteratee) {\n  var index = -1,\n      length = array == null ? 0 : array.length,\n      result = Array(length);\n\n  while (++index < length) {\n    result[index] = iteratee(array[index], index, array);\n  }\n  return result;\n}\n\nmodule.exports = arrayMap;\n","var baseHasIn = require('./_baseHasIn'),\n    hasPath = require('./_hasPath');\n\n/**\n * Checks if `path` is a direct or inherited property of `object`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.hasIn(object, 'a');\n * // => true\n *\n * _.hasIn(object, 'a.b');\n * // => true\n *\n * _.hasIn(object, ['a', 'b']);\n * // => true\n *\n * _.hasIn(object, 'b');\n * // => false\n */\nfunction hasIn(object, path) {\n  return object != null && hasPath(object, path, baseHasIn);\n}\n\nmodule.exports = hasIn;\n","/**\n * The base implementation of `_.hasIn` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\nfunction baseHasIn(object, key) {\n  return object != null && key in Object(object);\n}\n\nmodule.exports = baseHasIn;\n","var castPath = require('./_castPath'),\n    isArguments = require('./isArguments'),\n    isArray = require('./isArray'),\n    isIndex = require('./_isIndex'),\n    isLength = require('./isLength'),\n    toKey = require('./_toKey');\n\n/**\n * Checks if `path` exists on `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @param {Function} hasFunc The function to check properties.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n */\nfunction hasPath(object, path, hasFunc) {\n  path = castPath(path, object);\n\n  var index = -1,\n      length = path.length,\n      result = false;\n\n  while (++index < length) {\n    var key = toKey(path[index]);\n    if (!(result = object != null && hasFunc(object, key))) {\n      break;\n    }\n    object = object[key];\n  }\n  if (result || ++index != length) {\n    return result;\n  }\n  length = object == null ? 0 : object.length;\n  return !!length && isLength(length) && isIndex(key, length) &&\n    (isArray(object) || isArguments(object));\n}\n\nmodule.exports = hasPath;\n","/**\n * This method returns the first argument it receives.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {*} value Any value.\n * @returns {*} Returns `value`.\n * @example\n *\n * var object = { 'a': 1 };\n *\n * console.log(_.identity(object) === object);\n * // => true\n */\nfunction identity(value) {\n  return value;\n}\n\nmodule.exports = identity;\n","var baseProperty = require('./_baseProperty'),\n    basePropertyDeep = require('./_basePropertyDeep'),\n    isKey = require('./_isKey'),\n    toKey = require('./_toKey');\n\n/**\n * Creates a function that returns the value at `path` of a given object.\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Util\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n * @example\n *\n * var objects = [\n *   { 'a': { 'b': 2 } },\n *   { 'a': { 'b': 1 } }\n * ];\n *\n * _.map(objects, _.property('a.b'));\n * // => [2, 1]\n *\n * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');\n * // => [1, 2]\n */\nfunction property(path) {\n  return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);\n}\n\nmodule.exports = property;\n","/**\n * The base implementation of `_.property` without support for deep paths.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction baseProperty(key) {\n  return function(object) {\n    return object == null ? undefined : object[key];\n  };\n}\n\nmodule.exports = baseProperty;\n","var baseGet = require('./_baseGet');\n\n/**\n * A specialized version of `baseProperty` which supports deep paths.\n *\n * @private\n * @param {Array|string} path The path of the property to get.\n * @returns {Function} Returns the new accessor function.\n */\nfunction basePropertyDeep(path) {\n  return function(object) {\n    return baseGet(object, path);\n  };\n}\n\nmodule.exports = basePropertyDeep;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Link } from '@reach/router';\nimport Logo from '../../components/logo';\nimport { gettext, siteRoot, isPro, otherPermission, canViewSystemInfo, canViewStatistic,\n  canConfigSystem, canManageLibrary, canManageUser, canManageGroup, canViewUserLog,\n  canViewAdminLog, constanceEnabled, multiTenancy, multiInstitution, sysadminExtraEnabled,\n  enableGuestInvitation, enableTermsAndConditions, enableFileScan, enableWorkWeixin, enableDingtalk,\n  enableShareLinkReportAbuse } from '../../utils/constants';\n\nconst propTypes = {\n  isSidePanelClosed: PropTypes.bool.isRequired,\n  onCloseSidePanel: PropTypes.func.isRequired,\n  currentTab: PropTypes.string.isRequired,\n  tabItemClick: PropTypes.func.isRequired\n};\n\nclass SidePanel extends React.Component {\n\n  getActiveClass = (tab) => {\n    return this.props.currentTab == tab ? 'active' : '';\n  }\n\n  render() {\n    return (\n      <div className={`side-panel ${this.props.isSidePanelClosed ? '' : 'left-zero'}`}>\n        <div className=\"side-panel-north\">\n          <Logo onCloseSidePanel={this.props.onCloseSidePanel}/>\n        </div>\n        <div className=\"side-panel-center\">\n          <div className=\"side-nav\">\n            <div className=\"side-nav-con\">\n              <h3 className=\"sf-heading\">{gettext('System Admin')}</h3>\n              <ul className=\"nav nav-pills flex-column nav-container\">\n                {canViewSystemInfo &&\n                <li className=\"nav-item\">\n                  <Link\n                    className={`nav-link ellipsis ${this.getActiveClass('info')}`}\n                    to={siteRoot + 'sys/info/'}\n                    onClick={() => this.props.tabItemClick('info')}\n                  >\n                    <span className=\"sf2-icon-info\" aria-hidden=\"true\"></span>\n                    <span className=\"nav-text\">{gettext('Info')}</span>\n                  </Link>\n                </li>\n                }\n                {isPro && canViewStatistic &&\n                  <li className=\"nav-item\">\n                    <Link className={`nav-link ellipsis ${this.getActiveClass('statistic')}`}\n                      to={siteRoot + 'sys/statistics/file/'}\n                      onClick={() => this.props.tabItemClick('statistic')}\n                    >\n                      <span className=\"sf2-icon-histogram\" aria-hidden=\"true\"></span>\n                      <span className=\"nav-text\">{gettext('Statistic')}</span>\n                    </Link>\n                  </li>\n                }\n                {otherPermission &&\n                  <li className=\"nav-item\">\n                    <Link\n                      className={`nav-link ellipsis ${this.getActiveClass('devices')}`}\n                      to={siteRoot + 'sys/desktop-devices/'}\n                      onClick={() => this.props.tabItemClick('devices')}\n                    >\n                      <span className=\"sf2-icon-monitor\" aria-hidden=\"true\"></span>\n                      <span className=\"nav-text\">{gettext('Devices')}</span>\n                    </Link>\n                  </li>\n                }\n                {constanceEnabled && canConfigSystem &&\n                  <li className=\"nav-item\">\n                    <Link\n                      className={`nav-link ellipsis ${this.getActiveClass('web-settings')}`}\n                      to={siteRoot + 'sys/web-settings/'}\n                      onClick={() => this.props.tabItemClick('web-settings')}\n                    >\n                      <span className=\"sf2-icon-cog2\" aria-hidden=\"true\"></span>\n                      <span className=\"nav-text\">{gettext('Settings')}</span>\n                    </Link>\n                  </li>\n                }\n                {canManageLibrary &&\n                  <li className=\"nav-item\">\n                    <Link\n                      className={`nav-link ellipsis ${this.getActiveClass('libraries')}`}\n                      to={siteRoot + 'sys/all-libraries/'}\n                      onClick={() => this.props.tabItemClick('libraries')}\n                    >\n                      <span className=\"sf2-icon-library\" aria-hidden=\"true\"></span>\n                      <span className=\"nav-text\">{gettext('Libraries')}</span>\n                    </Link>\n                  </li>\n                }\n                {canManageUser &&\n                  <li className=\"nav-item\">\n                    <Link\n                      className={`nav-link ellipsis ${this.getActiveClass('users')}`}\n                      to={siteRoot + 'sys/users/'}\n                      onClick={() => this.props.tabItemClick('users')}\n                    >\n                      <span className=\"sf2-icon-user\" aria-hidden=\"true\"></span>\n                      <span className=\"nav-text\">{gettext('Users')}</span>\n                    </Link>\n                  </li>\n                }\n                {canManageGroup &&\n                  <li className=\"nav-item\">\n                    <Link\n                      className={`nav-link ellipsis ${this.getActiveClass('groups')}`}\n                      to={siteRoot + 'sys/groups/'}\n                      onClick={() => this.props.tabItemClick('groups')}\n                    >\n                      <span className=\"sf2-icon-group\" aria-hidden=\"true\"></span>\n                      <span className=\"nav-text\">{gettext('Groups')}</span>\n                    </Link>\n                  </li>\n                }\n                {isPro && canManageGroup &&\n                  <li className=\"nav-item\">\n                    <Link\n                      className={`nav-link ellipsis ${this.getActiveClass('departments')}`}\n                      to={siteRoot + 'sys/departments/'}\n                      onClick={() => this.props.tabItemClick('departments')}\n                    >\n                      <span className=\"sf2-icon-organization\" aria-hidden=\"true\"></span>\n                      <span className=\"nav-text\">{gettext('Departments')}</span>\n                    </Link>\n                  </li>\n                }\n                {multiTenancy && otherPermission &&\n                  <li className=\"nav-item\">\n                    <Link\n                      className={`nav-link ellipsis ${this.getActiveClass('organizations')}`}\n                      to={siteRoot + 'sys/organizations/'}\n                      onClick={() => this.props.tabItemClick('organizations')}\n                    >\n                      <span className=\"sf2-icon-organization\" aria-hidden=\"true\"></span>\n                      <span className=\"nav-text\">{gettext('Organizations')}</span>\n                    </Link>\n                  </li>\n                }\n                {multiInstitution && otherPermission &&\n                  <li className=\"nav-item\">\n                    <Link\n                      className={`nav-link ellipsis ${this.getActiveClass('institutions')}`}\n                      to={siteRoot + 'sys/institutions/'}\n                      onClick={() => this.props.tabItemClick('institutions')}\n                    >\n                      <span className=\"sf2-icon-organization\" aria-hidden=\"true\"></span>\n                      <span className=\"nav-text\">{gettext('Institutions')}</span>\n                    </Link>\n                  </li>\n                }\n                {otherPermission &&\n                  <li className=\"nav-item\">\n                    <Link\n                      className={`nav-link ellipsis ${this.getActiveClass('notifications')}`}\n                      to={siteRoot + 'sys/notifications/'}\n                      onClick={() => this.props.tabItemClick('notifications')}\n                    >\n                      <span className=\"sf2-icon-msgs\" aria-hidden=\"true\"></span>\n                      <span className=\"nav-text\">{gettext('Notifications')}</span>\n                    </Link>\n                  </li>\n                }\n                {otherPermission &&\n                  <li className=\"nav-item\">\n                    <Link\n                      className={`nav-link ellipsis ${this.getActiveClass('links')}`}\n                      to={siteRoot + 'sys/share-links/'}\n                      onClick={() => this.props.tabItemClick('links')}\n                    >\n                      <span className=\"sf2-icon-link\" aria-hidden=\"true\"></span>\n                      <span className=\"nav-text\">{gettext('Links')}</span>\n                    </Link>\n                  </li>\n                }\n                {sysadminExtraEnabled && canViewUserLog &&\n                  <li className=\"nav-item\">\n                    <Link\n                      className={`nav-link ellipsis ${this.getActiveClass('logs')}`}\n                      to={siteRoot + 'sys/logs/login'}\n                      onClick={() => this.props.tabItemClick('logs')}\n                    >\n                      <span className=\"sf2-icon-clock\" aria-hidden=\"true\"></span>\n                      <span className=\"nav-text\">{gettext('Logs')}</span>\n                    </Link>\n                  </li>\n                }\n                {isPro && otherPermission && enableFileScan &&\n                  <li className=\"nav-item\">\n                    <Link\n                      className={`nav-link ellipsis ${this.getActiveClass('file-scan-records')}`}\n                      to={siteRoot + 'sys/file-scan-records/'}\n                      onClick={() => this.props.tabItemClick('file-scan-records')}\n                    >\n                      <span className=\"sf2-icon-security\" aria-hidden=\"true\"></span>\n                      <span className=\"nav-text\">{gettext('File Scan')}</span>\n                    </Link>\n                  </li>\n                }\n                {isPro && otherPermission &&\n                  <li className=\"nav-item\">\n                    <Link\n                      className={`nav-link ellipsis ${this.getActiveClass('virus-files')}`}\n                      to={siteRoot + 'sys/virus-files/all/'}\n                      onClick={() => this.props.tabItemClick('virus-files')}\n                    >\n                      <span className=\"sf2-icon-security\" aria-hidden=\"true\"></span>\n                      <span className=\"nav-text\">{gettext('Virus Scan')}</span>\n                    </Link>\n                  </li>\n                }\n                {isPro && enableGuestInvitation && otherPermission &&\n                  <li className=\"nav-item\">\n                    <Link\n                      className={`nav-link ellipsis ${this.getActiveClass('invitations')}`}\n                      to={siteRoot + 'sys/invitations/'}\n                      onClick={() => this.props.tabItemClick('invitations')}\n                    >\n                      <span className=\"sf2-icon-invite\" aria-hidden=\"true\"></span>\n                      <span className=\"nav-text\">{gettext('Invitations')}</span>\n                    </Link>\n                  </li>\n                }\n                {otherPermission && enableTermsAndConditions &&\n                  <li className=\"nav-item\">\n                    <Link\n                      className={`nav-link ellipsis ${this.getActiveClass('termsandconditions')}`}\n                      to={siteRoot + 'sys/terms-and-conditions/'}\n                      onClick={() => this.props.tabItemClick('termsandconditions')}\n                    >\n                      <span className=\"sf2-icon-wiki\" aria-hidden=\"true\"></span>\n                      <span className=\"nav-text\">{gettext('Terms and Conditions')}</span>\n                    </Link>\n                  </li>\n                }\n                {isPro && canViewAdminLog &&\n                  <li className=\"nav-item\">\n                    <Link\n                      className={`nav-link ellipsis ${this.getActiveClass('adminLogs')}`}\n                      to={siteRoot + 'sys/admin-logs/operation'}\n                      onClick={() => this.props.tabItemClick('adminLogs')}\n                    >\n                      <span className=\"sf2-icon-admin-log\" aria-hidden=\"true\"></span>\n                      <span className=\"nav-text\">{gettext('Admin Logs')}</span>\n                    </Link>\n                  </li>\n                }\n                {otherPermission && enableWorkWeixin &&\n                  <li className=\"nav-item\">\n                    <Link\n                      className={`nav-link ellipsis ${this.getActiveClass('work-weixin')}`}\n                      to={siteRoot + 'sys/work-weixin/'}\n                      onClick={() => this.props.tabItemClick('work-weixin')}\n                    >\n                      <span className=\"sf3-font-enterprise-wechat sf3-font\" aria-hidden=\"true\"></span>\n                      <span className=\"nav-text\">{'企业微信集成'}</span>\n                    </Link>\n                  </li>\n                }\n\n                {otherPermission && enableDingtalk &&\n                  <li className=\"nav-item\">\n                    <Link\n                      className={`nav-link ellipsis ${this.getActiveClass('dingtalk')}`}\n                      to={siteRoot + 'sys/dingtalk/'}\n                      onClick={() => this.props.tabItemClick('dingtalk')}\n                    >\n                      <span className=\"sf3-font-dingtalk sf3-font\" aria-hidden=\"true\"></span>\n                      <span className=\"nav-text\">{'钉钉集成'}</span>\n                    </Link>\n                  </li>\n                }\n\n                {otherPermission && enableShareLinkReportAbuse &&\n                  <li className=\"nav-item\">\n                    <Link\n                      className={`nav-link ellipsis ${this.getActiveClass('abuse-reports')}`}\n                      to={siteRoot + 'sys/abuse-reports/'}\n                      onClick={() => this.props.tabItemClick('abuse-reports')}\n                    >\n                      <span className=\"sf2-icon-monitor\" aria-hidden=\"true\"></span>\n                      <span className=\"nav-text\">{gettext('Abuse Reports')}</span>\n                    </Link>\n                  </li>\n                }\n              </ul>\n            </div>\n          </div>\n        </div>\n      </div>\n    );\n  }\n}\n\nSidePanel.propTypes = propTypes;\n\nexport default SidePanel;\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\n\nconst propTypes = {\n  children: PropTypes.object.isRequired,\n};\n\nclass MainPanel extends Component {\n\n  render() {\n    return (\n      <div className=\"main-panel o-hidden\">\n        {this.props.children}\n      </div>\n    );\n  }\n}\n\nMainPanel.propTypes = propTypes;\n\nexport default MainPanel;\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport Account from '../../components/common/account';\n\nconst propTypes = {\n  children: PropTypes.object\n};\n\nclass MainPanelTopbar extends Component {\n\n  render() {\n    return (\n      <div className={`main-panel-north ${this.props.children ? 'border-left-show' : ''}`}>\n        <div className=\"cur-view-toolbar\">\n          <span className=\"sf2-icon-menu side-nav-toggle hidden-md-up d-md-none\" title=\"Side Nav Menu\"></span>\n          <div className=\"operation\">\n            {this.props.children}\n          </div>\n        </div>\n        <div className=\"common-toolbar\">\n          {this.props.search && this.props.search}\n          <Account isAdminPanel={true} />\n        </div>\n      </div>\n    );\n  }\n}\n\nMainPanelTopbar.propTypes = propTypes;\n\nexport default MainPanelTopbar;\n","import React, { Component, Fragment } from 'react';\nimport { Button } from 'reactstrap';\nimport { seafileAPI } from '../../utils/seafile-api';\nimport { gettext, isPro, isDefaultAdmin } from '../../utils/constants';\nimport toaster from '../../components/toast';\nimport { Utils } from '../../utils/utils';\nimport Loading from '../../components/loading';\nimport MainPanelTopbar from './main-panel-topbar';\n\nimport '../../css/system-info.css';\n\nclass Info extends Component {\n\n  constructor(props) {\n    super(props);\n    this.fileInput = React.createRef();\n    this.state = {\n      loading: true,\n      errorMsg: '',\n      sysInfo: {}\n    };\n  }\n\n  componentDidMount () {\n    seafileAPI.sysAdminGetSysInfo().then((res) => {\n      this.setState({\n        loading: false,\n        sysInfo: res.data\n      });\n    }).catch((error) => {\n      this.setState({\n        loading: false,\n        errorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403\n      });\n    });\n  }\n\n  uploadLicenseFile = (e) => {\n\n    // no file selected\n    if (!this.fileInput.current.files.length) {\n      return;\n    }\n    const file = this.fileInput.current.files[0];\n    seafileAPI.sysAdminUploadLicense(file).then((res) => {\n      let info = this.state.sysInfo;\n      Object.assign(info, res.data, {with_license: true});\n      this.setState({\n        sysInfo: info\n      });\n    }).catch((error) => {\n      let errMsg = Utils.getErrorMsg(error);\n      toaster.danger(errMsg);\n    });\n  }\n\n  openFileInput = () => {\n    this.fileInput.current.click();\n  }\n\n  renderLicenseDescString = (license_mode, license_to, license_expiration) => {\n    if (license_mode == 'life-time') {\n      if (window.app.config.lang == 'zh-cn') {\n        return '永久授权给 ' + license_to + ',技术支持服务至 ' + license_expiration + ' 到期';\n      } else {\n        return gettext('licensed to {placeholder_license_to}, upgrade service expired in {placeholder_license_expiration}')\n          .replace('{placeholder_license_to}', license_to).replace('{placeholder_license_expiration}', license_expiration);\n      }\n    } else {\n      return gettext('licensed to {placeholder_license_to}, expires on {placeholder_license_expiration}')\n        .replace('{placeholder_license_to}', license_to).replace('{placeholder_license_expiration}', license_expiration);\n    }\n  }\n\n  render() {\n    let { license_mode, license_to, license_expiration, org_count,\n      repos_count, total_files_count, total_storage, total_devices_count,\n      current_connected_devices_count, license_maxusers, multi_tenancy_enabled,\n      active_users_count, users_count, groups_count, with_license } = this.state.sysInfo;\n    let { loading, errorMsg } = this.state;\n\n    return (\n      <Fragment>\n        <MainPanelTopbar />\n        <div className=\"main-panel-center flex-row\">\n          <div className=\"cur-view-container system-admin-info\">\n            <h2 className=\"heading\">{gettext('Info')}</h2>\n            <div className=\"content\">\n              {loading && <Loading />}\n              {errorMsg && <p className=\"error text-center mt-4\">{errorMsg}</p>}\n              {(!loading && !errorMsg) &&\n              <dl className=\"flex-1 m-0\">\n                <dt className=\"info-item-heading\">{gettext('System Info')}</dt>\n                {isPro ?\n                  <dd className=\"info-item-content\">\n                    {gettext('Professional Edition')}\n                    {with_license &&\n                      ' ' + this.renderLicenseDescString(license_mode, license_to, license_expiration)\n                    }<br/>\n                    {isDefaultAdmin &&\n                      <Fragment>\n                        <Button type=\"button\" className=\"mt-2\" onClick={this.openFileInput}>{gettext('Upload license')}</Button>\n                        <input className=\"d-none\" type=\"file\" onChange={this.uploadLicenseFile} ref={this.fileInput} />\n                      </Fragment>\n                    }\n                  </dd> :\n                  <dd className=\"info-item-content\">\n                    {gettext('Community Edition')}\n                    <a className=\"ml-1\" href=\"https://download.seafile.com/published/seafile-manual/deploy_pro/migrate_from_seafile_community_server.md\" target=\"_blank\">{gettext('Upgrade to Pro Edition')}</a>\n                  </dd>\n                }\n                <dt className=\"info-item-heading\">{gettext('Libraries')} / {gettext('Files')}</dt>\n                <dd className=\"info-item-content\">{repos_count} / {total_files_count}</dd>\n\n                <dt className=\"info-item-heading\">{gettext('Storage Used')}</dt>\n                <dd className=\"info-item-content\">{Utils.bytesToSize(total_storage)}</dd>\n\n                <dt className=\"info-item-heading\">{gettext('Total Devices')} / {gettext('Current Connected Devices')}</dt>\n                <dd className=\"info-item-content\">{total_devices_count} / {current_connected_devices_count}</dd>\n\n                {isPro ?\n                  <Fragment>\n                    <dt className=\"info-item-heading\">{gettext('Activated Users')} / {gettext('Total Users')} / {gettext('Limits')}</dt>\n                    <dd className=\"info-item-content\">{active_users_count}{' / '}{users_count}{' / '}{with_license ? license_maxusers : '--'}</dd>\n                  </Fragment> :\n                  <Fragment>\n                    <dt className=\"info-item-heading\">{gettext('Activated Users')} / {gettext('Total Users')}</dt>\n                    <dd className=\"info-item-content\">{active_users_count} / {users_count}</dd>\n                  </Fragment>\n                }\n\n                <dt className=\"info-item-heading\">{gettext('Groups')}</dt>\n                <dd className=\"info-item-content\">{groups_count}</dd>\n\n                {multi_tenancy_enabled &&\n                  <Fragment>\n                    <dt className=\"info-item-heading\">{gettext('Organizations')}</dt>\n                    <dd className=\"info-item-content\">{org_count}</dd>\n                  </Fragment>\n                }\n              </dl>\n              }\n            </div>\n          </div>\n        </div>\n      </Fragment>\n    );\n  }\n}\n\nexport default Info;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Link } from '@reach/router';\nimport { siteRoot, gettext } from '../../../utils/constants';\n\nconst propTypes = {\n  currentItem: PropTypes.string.isRequired\n};\n\nclass Nav extends React.Component {\n\n  constructor(props) {\n    super(props);\n    this.navItems = [\n      {name: 'fileStatistic', urlPart: 'statistics/file', text: gettext('File')},\n      {name: 'storageStatistic', urlPart: 'statistics/storage', text: gettext('Storage')},\n      {name: 'usersStatistic', urlPart: 'statistics/user', text: gettext('Users')},\n      {name: 'trafficStatistic', urlPart: 'statistics/traffic', text: gettext('Traffic')},\n      {name: 'reportsStatistic', urlPart: 'statistics/reports', text: gettext('Reports')},\n    ];\n  }\n\n  render() {\n    const { currentItem } = this.props;\n    return (\n      <div className=\"cur-view-path tab-nav-container\">\n        <ul className=\"nav\">\n          {this.navItems.map((item, index) => {\n            return (\n              <li className=\"nav-item\" key={index}>\n                <Link to={`${siteRoot}sys/${item.urlPart}/`} className={`nav-link${currentItem == item.name ? ' active' : ''}`}>{item.text}</Link>\n              </li>\n            );\n          })}\n        </ul>\n      </div>\n    );\n  }\n}\n\nNav.propTypes = propTypes;\n\nexport default Nav;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport moment from 'moment';\nimport Calendar from '@seafile/seafile-calendar';\nimport DatePicker from '@seafile/seafile-calendar/lib/Picker';\nimport { translateCalendar } from '../../../utils/date-format-utils';\n\nimport '@seafile/seafile-calendar/assets/index.css';\n\nconst propsTypes = {\n  disabledDate: PropTypes.func.isRequired,\n  value: PropTypes.object,\n  onChange: PropTypes.func.isRequired,\n};\n\nconst FORMAT = 'YYYY-MM-DD';\n\nclass Picker extends React.Component {\n\n  constructor(props) {\n    super(props);\n    this.defaultCalendarValue = null;\n  }\n\n  componentDidMount() {\n    let lang = window.app.config.lang;\n    this.defaultCalendarValue = moment().locale(lang).clone();\n  }\n\n  render() {\n    const props = this.props;\n    const calendar = (<Calendar\n      defaultValue={this.defaultCalendarValue}\n      disabledDate={props.disabledDate}\n      format={FORMAT}\n      locale={translateCalendar()}\n    />);\n    return (\n      <DatePicker\n        calendar={calendar}\n        value={props.value}\n        onChange={props.onChange}\n      >\n        {\n          ({value}) => {\n            return (\n              <span>\n                <input\n                  placeholder=\"yyyy-mm-dd\"\n                  tabIndex=\"-1\"\n                  readOnly\n                  value={value && value.format(FORMAT) || ''}\n                  className=\"form-control system-statistic-input\"\n                />\n              </span>\n            );\n          }\n        }\n      </DatePicker>\n    );\n  }\n}\n\nPicker.propsTypes = propsTypes;\n\nexport default Picker;\n","import React, { Fragment } from 'react';\nimport PropTypes from 'prop-types';\nimport { Button } from 'reactstrap';\nimport moment from 'moment';\nimport { gettext } from '../../../utils/constants';\nimport Picker from './picker';\n\nconst propTypes = {\n  getActiviesFiles: PropTypes.func.isRequired,\n  children: PropTypes.object,\n};\n\nclass StatisticCommonTool extends React.Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      statisticType: 'oneWeek',\n      startValue: null,\n      endValue: null,\n    };\n  }\n\n  componentDidMount() {\n    let today = moment().format('YYYY-MM-DD 00:00:00');\n    let endTime = today;\n    let startTime = moment().subtract(6,'d').format('YYYY-MM-DD 00:00:00');\n    let group_by = 'day';\n    this.props.getActiviesFiles(startTime, endTime, group_by);\n  }\n\n  changeActive = (statisticTypeName) => {\n    let { statisticType } = this.state;\n    if (statisticType === statisticTypeName) {\n      return;\n    }\n    let today = moment().format('YYYY-MM-DD 00:00:00');\n    let endTime = today;\n    let startTime;\n    switch(statisticTypeName) {\n      case 'oneWeek' :\n        startTime = moment().subtract(6,'d').format('YYYY-MM-DD 00:00:00');\n        break;\n      case 'oneMonth' :\n        startTime = moment().subtract(29,'d').format('YYYY-MM-DD 00:00:00');\n        break;\n      case 'oneYear' :\n        startTime = moment().subtract(364,'d').format('YYYY-MM-DD 00:00:00');\n        break;\n    }\n    this.setState({\n      statisticType: statisticTypeName,\n    });\n    let group_by = 'day';\n    this.props.getActiviesFiles(startTime, endTime, group_by);\n  }\n\n  disabledStartDate = (startValue) => {\n    if (!startValue) {\n      return false;\n    }\n    let today = moment().format();\n\n    const endValue = this.state.endValue;\n    if (!endValue) {\n      let startTime = moment(startValue).format();\n      return today < startTime;\n    }\n    return endValue.isBefore(startValue) || moment(startValue).format() > today;\n  }\n\n  disabledEndDate = (endValue) => {\n    if (!endValue) {\n      return false;\n    }\n    let today = moment().format();\n    const startValue = this.state.startValue;\n    if (!startValue) {\n      let endTime = moment(endValue).format();\n      return today < endTime;\n    }\n    return endValue.isBefore(startValue) || moment(endValue).format() > today;\n  }\n\n  onChange = (field, value) => {\n    this.setState({\n      [field]: value,\n    });\n  }\n\n  onSubmit = () => {\n    let { startValue, endValue } = this.state;\n    if(!startValue || !endValue) {\n      return;\n    }\n    this.setState({\n      statisticType: 'itemButton',\n    });\n    let startTime = moment(startValue).format('YYYY-MM-DD 00:00:00');\n    let endTime = moment(endValue).format('YYYY-MM-DD 00:00:00');\n    let group_by = 'day';\n    this.props.getActiviesFiles(startTime, endTime, group_by);\n  }\n\n  render() {\n    let { statisticType, endValue, startValue } = this.state;\n    return(\n      <Fragment>\n        {this.props.children}\n        <div className=\"system-statistic-time-range\">\n          <div className=\"sys-stat-tool\">\n            <div className={`system-statistic-item border-right-0 rounded-left ${statisticType === 'oneWeek' ? 'item-active' : ''}`} onClick={this.changeActive.bind(this, 'oneWeek')}>{gettext('7 Days')}</div>\n            <div className={`system-statistic-item border-right-0 ${statisticType === 'oneMonth' ? 'item-active' : ''}`}  onClick={this.changeActive.bind(this, 'oneMonth')}>{gettext('30 Days')}</div>\n            <div className={`system-statistic-item rounded-right ${statisticType === 'oneYear' ? 'item-active' : ''}`}  onClick={this.changeActive.bind(this, 'oneYear')}>{gettext('1 Year')}</div>\n          </div>\n          <div className=\"system-statistic-input-container\">\n            <Picker\n              disabledDate={this.disabledStartDate}\n              value={startValue}\n              onChange={this.onChange.bind(this, 'startValue')}\n            />\n            <span className=\"system-statistic-connect\">-</span>\n            <Picker\n              disabledDate={this.disabledEndDate}\n              value={endValue}\n              onChange={this.onChange.bind(this, 'endValue')}\n            />\n            <Button className=\"operation-item system-statistic-button\" onClick={this.onSubmit}>{gettext('Submit')}</Button>\n          </div>\n        </div>\n      </Fragment>\n    );\n  }\n}\n\nStatisticCommonTool.propTypes = propTypes;\n\nexport default StatisticCommonTool;\n","import React from 'react';\nimport { Line } from 'react-chartjs-2';\nimport PropTypes from 'prop-types';\nimport { Utils } from '../../../utils/utils';\n\nconst propTypes = {\n  labels: PropTypes.array.isRequired,\n  filesData: PropTypes.array.isRequired,\n  suggestedMaxNumbers: PropTypes.number.isRequired,\n  isLegendStatus: PropTypes.bool.isRequired,\n  chartTitle: PropTypes.string.isRequired,\n  isTitleCallback: PropTypes.bool,\n  isTicksCallback: PropTypes.bool,\n};\n\nclass StatisticChart extends React.Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      data: {},\n      opations: {}\n    };\n  }\n\n  componentDidMount() {\n    let { labels, filesData, isTitleCallback, isTicksCallback, suggestedMaxNumbers, isLegendStatus, chartTitle } = this.props;\n    let _this = this;\n    let data = {\n      labels: labels,\n      datasets: filesData\n    };\n    let options = {\n      title: {\n        display: true,\n        fontSize: 14,\n        text: chartTitle,\n      },\n      elements: {\n        line: {\n          fill: false,\n          tension: 0, // disable bezier curves, i.e, draw straight lines\n          borderWidth: 2\n        }\n      },\n      legend: {\n        display: isLegendStatus,\n        labels: {\n          usePointStyle: true\n        }\n      },\n      tooltips: {\n        callbacks: {\n          label: function(tooltipItem, data) {\n            if (isTitleCallback) {\n              return _this.titleCallback(tooltipItem, data);\n            }\n            return data.datasets[tooltipItem.datasetIndex].label + ': ' + tooltipItem.yLabel;\n          }\n        }\n      },\n      layout: {\n        padding: {\n          right: 100,\n        }\n      },\n      scales: {\n        yAxes: [{\n          ticks: {\n            beginAtZero: true,\n            suggestedMax: suggestedMaxNumbers,\n            callback: function(value, index, values) {\n              if (isTicksCallback) {\n                return _this.ticksCallback(value, index, values);\n              }\n              return value;\n            }\n          }\n        }],\n        xAxes: [{\n          ticks: {\n            maxTicksLimit: 20\n          }\n        }]\n      }\n    };\n    this.setState({\n      data: data,\n      options: options\n    });\n  }\n\n  componentWillReceiveProps(nextProps) {\n    let data = {\n      labels: nextProps.labels,\n      datasets: nextProps.filesData\n    };\n    this.setState({data: data});\n  }\n\n  titleCallback = (tooltipItem, data) => {\n    return data.datasets[tooltipItem.datasetIndex].label + ': ' + Utils.bytesToSize(tooltipItem.yLabel);\n  }\n\n  ticksCallback = (value, index, values) => {\n    return Utils.bytesToSize(value);\n  }\n\n  render() {\n\n    let { data, options } = this.state;\n    return (\n      <Line\n        data={data}\n        options={options}\n      />\n    );\n  }\n}\n\nStatisticChart.propTypes = propTypes;\n\nexport default StatisticChart;\n","import React, { Fragment } from 'react';\nimport moment from 'moment';\nimport MainPanelTopbar from '../main-panel-topbar';\nimport StatisticNav from './statistic-nav';\nimport StatisticCommonTool from './statistic-common-tool';\nimport { seafileAPI } from '../../../utils/seafile-api';\nimport StatisticChart from './statistic-chart';\nimport Loading from '../../../components/loading';\nimport { gettext } from '../../../utils/constants';\nimport { Utils } from '../../../utils/utils';\nimport toaster from '../../../components/toast';\n\nimport '../../../css/system-stat.css';\n\nclass StatisticFile extends React.Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      filesData: [],\n      labels: [],\n      isLoading: true\n    };\n  }\n\n  getActiviesFiles = (startTime, endTime, groupBy) => {\n    let { filesData } = this.state;\n    seafileAPI.sysAdminStatisticFiles(startTime, endTime, groupBy).then((res) => {\n      let labels = [],\n        added = [],\n        deleted = [],\n        visited = [],\n        modified = [];\n      let data = res.data;\n      if (Array.isArray(data)) {\n        data.forEach(item => {\n          labels.push(moment(item.datetime).format('YYYY-MM-DD'));\n          added.push(item.added);\n          deleted.push(item.deleted);\n          modified.push(item.modified);\n          visited.push(item.visited);\n        });\n        let addedData = {\n          label: gettext('Added'),\n          data: added,\n          borderColor: '#57cd6b',\n          backgroundColor: '#57cd6b'};\n        let visitedData = {\n          label: gettext('Visited'),\n          data: visited,\n          borderColor: '#fd913a',\n          backgroundColor: '#fd913a'};\n        let modifiedData = {\n          label: gettext('Modified'),\n          data: modified,\n          borderColor: '#72c3fc',\n          backgroundColor: '#72c3fc'};\n        let deletedData = {\n          label: gettext('Deleted'),\n          data: deleted,\n          borderColor: '#f75356',\n          backgroundColor: '#f75356'};\n        filesData = [visitedData, addedData, modifiedData, deletedData];\n      }\n      this.setState({\n        filesData: filesData,\n        labels: labels,\n        isLoading: false\n      });\n    }).catch(err => {\n      let errMessage = Utils.getErrorMsg(err);\n      toaster.danger(errMessage);\n    });\n  }\n\n  render() {\n    let { labels, filesData, isLoading } = this.state;\n\n    return(\n      <Fragment>\n        <MainPanelTopbar />\n        <div className=\"cur-view-container\">\n          <StatisticNav currentItem=\"fileStatistic\" />\n          <div className=\"cur-view-content\">\n            <StatisticCommonTool getActiviesFiles={this.getActiviesFiles} />\n            {isLoading && <Loading />}\n            {!isLoading && labels.length > 0 &&\n              <StatisticChart\n                labels={labels}\n                filesData={filesData}\n                suggestedMaxNumbers={10}\n                isLegendStatus={true}\n                chartTitle={gettext('File Operations')}\n              />\n            }\n          </div>\n        </div>\n      </Fragment>\n    );\n  }\n}\n\nexport default StatisticFile;\n","import React, { Fragment } from 'react';\nimport moment from 'moment';\nimport MainPanelTopbar from '../main-panel-topbar';\nimport StatisticNav from './statistic-nav';\nimport StatisticCommonTool from './statistic-common-tool';\nimport { seafileAPI } from '../../../utils/seafile-api';\nimport StatisticChart from './statistic-chart';\nimport Loading from '../../../components/loading';\nimport { gettext } from '../../../utils/constants';\nimport { Utils } from '../../../utils/utils';\nimport toaster from '../../../components/toast';\n\nclass StatisticStorage extends React.Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      filesData: [],\n      labels: [],\n      isLoading: true\n    };\n  }\n\n  getActiviesFiles = (startTime, endTime, groupBy) => {\n    let { filesData } = this.state;\n    seafileAPI.sysAdminStatisticStorages(startTime, endTime, groupBy).then((res) => {\n      let labels = [],\n        totalStorage = [];\n      let data = res.data;\n      if (Array.isArray(data)) {\n        data.forEach(item => {\n          labels.push(moment(item.datetime).format('YYYY-MM-DD'));\n          totalStorage.push(item.total_storage);\n        });\n        let total_storage = {\n          label: gettext('Total Storage'),\n          data: totalStorage,\n          borderColor: '#fd913a',\n          backgroundColor: '#fd913a'};\n        filesData = [total_storage];\n      }\n      this.setState({\n        filesData: filesData,\n        labels: labels,\n        isLoading: false\n      });\n    }).catch(err => {\n      let errMessage = Utils.getErrorMsg(err);\n      toaster.danger(errMessage);\n    });\n  }\n\n  render() {\n    let { labels, filesData, isLoading } = this.state;\n    return(\n      <Fragment>\n        <MainPanelTopbar />\n        <div className=\"cur-view-container\">\n          <StatisticNav currentItem=\"storageStatistic\" />\n          <div className=\"cur-view-content\">\n            <StatisticCommonTool getActiviesFiles={this.getActiviesFiles} />\n            {isLoading && <Loading />}\n            {!isLoading && labels.length > 0 &&\n              <StatisticChart\n                labels={labels}\n                filesData={filesData}\n                suggestedMaxNumbers={10*1000*1000}\n                isTitleCallback={true}\n                isTicksCallback={true}\n                isLegendStatus={false}\n                chartTitle={gettext('Total Storage')}\n              />\n            }\n          </div>\n        </div>\n      </Fragment>\n    );\n  }\n}\n\nexport default StatisticStorage;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { gettext } from '../../../utils/constants';\n\nconst propTypes = {\n  type: PropTypes.string.isRequired,\n  sortBy: PropTypes.string.isRequired,\n  sortOrder: PropTypes.string.isRequired,\n  sortItems: PropTypes.func.isRequired,\n  children: PropTypes.oneOfType([PropTypes.bool, PropTypes.array]),\n};\n\nclass TrafficTable extends React.Component {\n\n  constructor(props) {\n    super(props);\n  }\n\n  render() {\n    const { type, sortBy, sortOrder } = this.props;\n    const sortIcon = sortOrder == 'asc' ? <span className=\"fas fa-caret-up\"></span> : <span className=\"fas fa-caret-down\"></span>;\n\n    return (\n      <table className=\"table-hover\">\n        <thead>\n          <tr>\n            <th width=\"16%\">{type == 'user' ? gettext('User') : gettext('Organization')}</th>\n            <th width=\"11%\"><div className=\"d-block table-sort-op cursor-pointer\" onClick={this.props.sortItems.bind(this, 'sync_file_upload')}>{gettext('Sync Upload')} {sortBy === 'sync_file_upload' && sortIcon}</div></th>\n            <th width=\"14%\"><div className=\"d-block table-sort-op cursor-pointer\" onClick={this.props.sortItems.bind(this, 'sync_file_download')}>{gettext('Sync Download')} {sortBy === 'sync_file_download' && sortIcon}</div></th>\n            <th width=\"11%\"><div className=\"d-block table-sort-op cursor-pointer\" onClick={this.props.sortItems.bind(this, 'web_file_upload')}>{gettext('Web Upload')} {sortBy === 'web_file_upload' && sortIcon}</div></th>\n            <th width=\"14%\"><div className=\"d-block table-sort-op cursor-pointer\" onClick={this.props.sortItems.bind(this, 'web_file_download')}>{gettext('Web Download')} {sortBy === 'web_file_download' && sortIcon}</div></th>\n            <th width=\"17%\"><div className=\"d-block table-sort-op cursor-pointer\" onClick={this.props.sortItems.bind(this, 'link_file_upload')}>{gettext('Share link upload')} {sortBy === 'link_file_upload' && sortIcon}</div></th>\n            <th width=\"17%\"><div className=\"d-block table-sort-op cursor-pointer\" onClick={this.props.sortItems.bind(this, 'link_file_download')}>{gettext('Share link download')} {sortBy === 'link_file_download' && sortIcon}</div></th>\n          </tr>\n        </thead>\n        <tbody>\n          {this.props.children}\n        </tbody>\n      </table>\n    );\n  }\n}\n\nTrafficTable.propTypes = propTypes;\n\nexport default TrafficTable;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Utils } from '../../../utils/utils';\nimport { siteRoot } from '../../../utils/constants';\n\nconst propTypes = {\n  type: PropTypes.string.isRequired,\n  userTrafficItem: PropTypes.object.isRequired,\n};\n\nclass TrafficTableBody extends React.Component {\n\n  trafficName = () => {\n    let { userTrafficItem, type } = this.props;\n    switch(type) {\n      case 'user':\n        if (userTrafficItem.name) {\n          return (\n            <a href={siteRoot + 'useradmin/info/' + userTrafficItem.email + '/'}>{userTrafficItem.name}</a>\n          );\n        }\n        return(<span>{'--'}</span>);\n      case 'org':\n        return(<span>{userTrafficItem.org_name}</span>);\n    }\n  }\n\n  render() {\n    let { userTrafficItem } = this.props;\n\n    let syncUploadSize = Utils.bytesToSize(userTrafficItem.sync_file_upload);\n    let syncDownloadSize = Utils.bytesToSize(userTrafficItem.sync_file_download);\n    let webUploadSize = Utils.bytesToSize(userTrafficItem.web_file_upload);\n    let webDownloadSize = Utils.bytesToSize(userTrafficItem.web_file_download);\n    let linkUploadSize = Utils.bytesToSize(userTrafficItem.link_file_upload);\n    let linkDownloadSize = Utils.bytesToSize(userTrafficItem.link_file_download);\n\n    return(\n      <tr>\n        <td>{this.trafficName()}</td>\n        <td>{syncUploadSize}</td>\n        <td>{syncDownloadSize}</td>\n        <td>{webUploadSize}</td>\n        <td>{webDownloadSize}</td>\n        <td>{linkUploadSize}</td>\n        <td>{linkDownloadSize}</td>\n      </tr>\n    );\n  }\n}\n\nTrafficTableBody.propTypes = propTypes;\n\nexport default TrafficTableBody;\n","import React, { Fragment } from 'react';\nimport { Input } from 'reactstrap';\nimport moment from 'moment';\nimport { gettext } from '../../../utils/constants';\nimport TrafficTable from './traffic-table';\nimport TrafficTableBody from './traffic-table-body';\nimport { seafileAPI } from '../../../utils/seafile-api';\nimport Paginator from '../../../components/paginator';\nimport Loading from '../../../components/loading';\nimport { Utils } from '../../../utils/utils';\nimport toaster from '../../../components/toast';\n\nclass OrgsTraffic extends React.Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      orgTrafficList: [],\n      perPage: 25,\n      currentPage: 1,\n      hasNextPage: false,\n      month: moment().format('YYYYMM'),\n      isLoading: false,\n      errorMessage: '',\n      sortBy: 'link_file_download',\n      sortOrder: 'desc'\n    };\n    this.initPage = 1;\n    this.initMonth = moment().format('YYYYMM');\n  }\n\n  componentDidMount() {\n    let urlParams = (new URL(window.location)).searchParams;\n    const { currentPage, perPage } = this.state;\n    this.setState({\n      perPage: parseInt(urlParams.get('per_page') || perPage),\n      currentPage: parseInt(urlParams.get('page') || currentPage)\n    }, () => {\n      this.getTrafficList(this.initMonth, this.state.currentPage);\n    });\n  }\n\n  getPreviousPage = () => {\n    this.getTrafficList(this.state.month, this.state.currentPage - 1);\n  }\n\n  getNextPage = () => {\n    this.getTrafficList(this.state.month, this.state.currentPage + 1);\n  }\n\n  handleChange = (e) => {\n    let month = e.target.value;\n    this.setState({\n      month: month\n    });\n  }\n\n  handleKeyPress = (e) => {\n    let { month } = this.state;\n    if (e.key === 'Enter') {\n      let pattern = /^([012]\\d{3})(0[1-9]|1[012])$/;\n      if (!pattern.test(month)) {\n        let errorMessage = gettext('Invalid month, should be yyyymm.');\n        this.setState({\n          errorMessage: errorMessage\n        });\n        return;\n      }\n      this.getTrafficList(month, this.initPage);\n      e.target.blur();\n      e.preventDefault();\n    }\n  }\n\n  getTrafficList = (month, page) => {\n    const { perPage, sortBy, sortOrder } = this.state;\n    const orderBy = sortOrder == 'asc' ? sortBy : `${sortBy}_${sortOrder}`;\n    this.setState({isLoading: true, errorMessage: ''});\n    seafileAPI.sysAdminListOrgTraffic(month, page, perPage, orderBy).then(res => {\n      let orgTrafficList = res.data.org_monthly_traffic_list.slice(0);\n      this.setState({\n        month: month,\n        currentPage: page,\n        orgTrafficList: orgTrafficList,\n        hasNextPage: res.data.has_next_page,\n        isLoading: false\n      });\n    }).catch(err => {\n      let errMessage = Utils.getErrorMsg(err);\n      toaster.danger(errMessage);\n    });\n  }\n\n  sortItems = (sortBy) => {\n    this.setState({\n      sortBy: sortBy,\n      sortOrder: this.state.sortOrder == 'asc' ? 'desc' : 'asc'\n    }, () => {\n      const { month, currentPage } = this.state;\n      this.getTrafficList(month, currentPage);\n    });\n  }\n\n  resetPerPage = (newPerPage) => {\n    this.setState({\n      perPage: newPerPage,\n    }, () => this.getTrafficList(this.initPage, this.initMonth));\n  }\n\n  render() {\n    const {\n      isLoading, errorMessage, orgTrafficList,\n      currentPage, hasNextPage, perPage,\n      sortBy, sortOrder\n    } = this.state;\n    return (\n      <Fragment>\n        <div className=\"d-flex align-items-center mt-4\">\n          <span className=\"statistic-reports-tip\">{gettext('Month:')}</span>\n          <Input\n            className=\"statistic-reports-input\"\n            defaultValue={moment().format('YYYYMM')}\n            onChange={this.handleChange}\n            onKeyPress={this.handleKeyPress}\n          />\n          {errorMessage && <div className=\"error\">{errorMessage}</div>}\n        </div>\n        {isLoading && <Loading />}\n        {!isLoading &&\n          <TrafficTable type={'org'} sortItems={this.sortItems} sortBy={sortBy} sortOrder={sortOrder}>\n            {orgTrafficList.length > 0 && orgTrafficList.map((item, index) => {\n              return(\n                <TrafficTableBody\n                  key={index}\n                  userTrafficItem={item}\n                  type={'org'}\n                />\n              );\n            })}\n          </TrafficTable>\n        }\n        <Paginator\n          gotoPreviousPage={this.getPreviousPage}\n          gotoNextPage={this.getNextPage}\n          currentPage={currentPage}\n          hasNextPage={hasNextPage}\n          curPerPage={perPage}\n          resetPerPage={this.resetPerPage}\n        />\n      </Fragment>\n    );\n  }\n}\n\nexport default OrgsTraffic;\n","import React, { Fragment } from 'react';\nimport { Input } from 'reactstrap';\nimport TrafficTable from './traffic-table';\nimport TrafficTableBody from './traffic-table-body';\nimport { seafileAPI } from '../../../utils/seafile-api';\nimport Paginator from '../../../components/paginator';\nimport moment from 'moment';\nimport Loading from '../../../components/loading';\nimport { gettext } from '../../../utils/constants';\nimport { Utils } from '../../../utils/utils';\nimport toaster from '../../../components/toast';\n\nclass UsersTraffic extends React.Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      userTrafficList: [],\n      hasNextPage: false,\n      perPage: 25,\n      currentPage: 1,\n      month: moment().format('YYYYMM'),\n      isLoading: false,\n      errorMessage: '',\n      sortBy: 'link_file_download',\n      sortOrder: 'desc'\n    };\n    this.initPage = 1;\n    this.initMonth = moment().format('YYYYMM');\n  }\n\n  componentDidMount() {\n    let urlParams = (new URL(window.location)).searchParams;\n    const { currentPage, perPage } = this.state;\n    this.setState({\n      perPage: parseInt(urlParams.get('per_page') || perPage),\n      currentPage: parseInt(urlParams.get('page') || currentPage)\n    }, () => {\n      this.getTrafficList(this.initMonth, this.state.currentPage);\n    });\n  }\n\n  getPreviousPage = () => {\n    this.getTrafficList(this.state.month, this.state.currentPage - 1);\n  }\n\n  getNextPage = () => {\n    this.getTrafficList(this.state.month, this.state.currentPage + 1);\n  }\n\n  handleChange = (e) => {\n    let month = e.target.value;\n    this.setState({\n      month: month\n    });\n  }\n\n  handleKeyPress = (e) => {\n    let { month } = this.state;\n    if (e.key === 'Enter') {\n      let pattern = /^([012]\\d{3})(0[1-9]|1[012])$/;\n      if (!pattern.test(month)) {\n        let errorMessage = gettext('Invalid month, should be yyyymm.');\n        this.setState({\n          errorMessage: errorMessage\n        });\n        return;\n      }\n      this.getTrafficList(month, this.initPage);\n      e.target.blur();\n      e.preventDefault();\n    }\n  }\n\n  getTrafficList = (month, page) => {\n    const { perPage, sortBy, sortOrder } = this.state;\n    const orderBy = sortOrder == 'asc' ? sortBy : `${sortBy}_${sortOrder}`;\n    this.setState({\n      isLoading: true,\n      errorMessage: ''\n    });\n    seafileAPI.sysAdminListUserTraffic(month, page, perPage, orderBy).then(res => {\n      let userTrafficList = res.data.user_monthly_traffic_list.slice(0);\n      this.setState({\n        month: month,\n        currentPage: page,\n        userTrafficList: userTrafficList,\n        hasNextPage: res.data.has_next_page,\n        isLoading: false\n      });\n    }).catch(err => {\n      let errMessage = Utils.getErrorMsg(err);\n      toaster.danger(errMessage);\n    });\n  }\n\n  sortItems = (sortBy) => {\n    this.setState({\n      sortBy: sortBy,\n      sortOrder: this.state.sortOrder == 'asc' ? 'desc' : 'asc'\n    }, () => {\n      const { month, currentPage } = this.state;\n      this.getTrafficList(month, currentPage);\n    });\n  }\n\n  resetPerPage = (newPerPage) => {\n    this.setState({\n      perPage: newPerPage,\n    }, () => this.getTrafficList(this.initMonth, this.initPage));\n  }\n\n  render() {\n    const {\n      isLoading, errorMessage, userTrafficList,\n      currentPage, hasNextPage, perPage,\n      sortBy, sortOrder\n    } = this.state;\n    return (\n      <Fragment>\n        <div className=\"d-flex align-items-center mt-4\">\n          <span className=\"statistic-reports-tip\">{gettext('Month:')}</span>\n          <Input\n            className=\"statistic-reports-input\"\n            defaultValue={moment().format('YYYYMM')}\n            onChange={this.handleChange}\n            onKeyPress={this.handleKeyPress}\n          />\n          {errorMessage && <div className=\"error\">{errorMessage}</div>}\n        </div>\n        {isLoading && <Loading />}\n        {!isLoading &&\n          <TrafficTable type={'user'} sortItems={this.sortItems} sortBy={sortBy} sortOrder={sortOrder}>\n            {userTrafficList.length > 0 && userTrafficList.map((item, index) => {\n              return(\n                <TrafficTableBody\n                  key={index}\n                  userTrafficItem={item}\n                  type={'user'}\n                />\n              );\n            })}\n          </TrafficTable>\n        }\n        <Paginator\n          gotoPreviousPage={this.getPreviousPage}\n          gotoNextPage={this.getNextPage}\n          currentPage={currentPage}\n          hasNextPage={hasNextPage}\n          curPerPage={perPage}\n          resetPerPage={this.resetPerPage}\n        />\n      </Fragment>\n    );\n  }\n}\n\nexport default UsersTraffic;\n","import React, { Fragment } from 'react';\nimport moment from 'moment';\nimport { gettext } from '../../../utils/constants';\nimport { seafileAPI } from '../../../utils/seafile-api';\nimport MainPanelTopbar from '../main-panel-topbar';\nimport StatisticNav from './statistic-nav';\nimport StatisticCommonTool from './statistic-common-tool';\nimport Loading from '../../../components/loading';\nimport OrgsTraffic from './statistic-traffic-orgs';\nimport UsersTraffic from './statistic-traffic-users';\nimport StatisticChart from './statistic-chart';\nimport { Utils } from '../../../utils/utils';\nimport toaster from '../../../components/toast';\n\nclass StatisticTraffic extends React.Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      filesData: [],\n      linkData: [],\n      syncData: [],\n      webData: [],\n      labels: [],\n      isLoading: true,\n      tabActive: 'system'\n    };\n  }\n\n  changeTabActive = activeName => {\n    this.setState({tabActive: activeName});\n  }\n\n  getActiviesFiles = (startTime, endTime, groupBy) => {\n    seafileAPI.sysAdminStatisticTraffic(startTime, endTime, groupBy).then((res) => {\n      let labels = [];\n      let total_upload = [],\n        total_download = [],\n        link_upload = [],\n        link_download = [],\n        sync_upload = [],\n        sync_download = [],\n        web_upload = [],\n        web_download = [];\n      let data = res.data;\n      if (Array.isArray(data)) {\n        data.forEach(item => {\n          labels.push(moment(item.datetime).format('YYYY-MM-DD'));\n          link_upload.push(item['link-file-upload']);\n          link_download.push(item['link-file-download']);\n          sync_upload.push(item['sync-file-upload']);\n          sync_download.push(item['sync-file-download']);\n          web_upload.push(item['web-file-upload']);\n          web_download.push(item['web-file-download']);\n          total_upload.push(item['link-file-upload'] + item['sync-file-upload'] + item['web-file-upload']);\n          total_download.push(item['link-file-download'] + item['sync-file-download'] + item['web-file-download']);\n        });\n        let linkUpload = {\n          label: gettext('Upload'),\n          data: link_upload,\n          borderColor: '#fd913a',\n          backgroundColor: '#fd913a'};\n        let linkDownload = {\n          label: gettext('Download'),\n          data: link_download,\n          borderColor: '#57cd6b',\n          backgroundColor: '#57cd6b'};\n        let syncUpload = {\n          label: gettext('Upload'),\n          data: sync_upload,\n          borderColor: '#fd913a',\n          backgroundColor: '#fd913a'};\n        let syncDownload = {\n          label: gettext('Download'),\n          data: sync_download,\n          borderColor: '#57cd6b',\n          backgroundColor: '#57cd6b'};\n        let webUpload = {\n          label: gettext('Upload'),\n          data: web_upload,\n          borderColor: '#fd913a',\n          backgroundColor: '#fd913a'};\n        let webDownload = {\n          label: gettext('Download'),\n          data: web_download,\n          borderColor: '#57cd6b',\n          backgroundColor: '#57cd6b'};\n        let totalUpload = {\n          label: gettext('Upload'),\n          data: total_upload,\n          borderColor: '#fd913a',\n          backgroundColor: '#fd913a'};\n        let totalDownload = {\n          label: gettext('Download'),\n          data: total_download,\n          borderColor: '#57cd6b',\n          backgroundColor: '#57cd6b'};\n        let linkData = [linkUpload, linkDownload];\n        let syncData = [syncUpload, syncDownload];\n        let webData = [webUpload, webDownload];\n        let filesData = [totalUpload, totalDownload];\n        this.setState({\n          linkData: linkData,\n          syncData: syncData,\n          webData: webData,\n          filesData: filesData,\n          labels: labels,\n          isLoading: false\n        });\n      }\n    }).catch(err => {\n      let errMessage = Utils.getErrorMsg(err);\n      toaster.danger(errMessage);\n    });\n  }\n\n  renderCommonTool = () => {\n    let { tabActive } = this.state;\n    if (tabActive === 'system') {\n      return (\n        <StatisticCommonTool getActiviesFiles={this.getActiviesFiles}>\n          <div className=\"statistic-traffic-tab\">\n            <div className={`statistic-traffic-tab-item ${tabActive === 'system' ? 'active' : ''}`} onClick={this.changeTabActive.bind(this, 'system')}>{gettext('System')}</div>\n            <div className={`statistic-traffic-tab-item ${tabActive === 'user' ? 'active' : ''}`} onClick={this.changeTabActive.bind(this, 'user')}>{gettext('Users')}</div>\n            <div className={`statistic-traffic-tab-item ${tabActive === 'organizations' ? 'active' : ''}`} onClick={this.changeTabActive.bind(this, 'organizations')}>{gettext('Organizations')}</div>\n          </div>\n        </StatisticCommonTool>\n      );\n    }\n    return (\n      <div className=\"statistic-traffic-tab\">\n        <div className={`statistic-traffic-tab-item ${tabActive === 'system' ? 'active' : ''}`} onClick={this.changeTabActive.bind(this, 'system')}>{gettext('System')}</div>\n        <div className={`statistic-traffic-tab-item ${tabActive === 'user' ? 'active' : ''}`} onClick={this.changeTabActive.bind(this, 'user')}>{gettext('Users')}</div>\n        <div className={`statistic-traffic-tab-item ${tabActive === 'organizations' ? 'active' : ''}`} onClick={this.changeTabActive.bind(this, 'organizations')}>{gettext('Organizations')}</div>\n      </div>\n    );\n  }\n\n  render() {\n    let { labels, filesData, linkData, syncData, webData, isLoading, tabActive } = this.state;\n\n    return (\n      <Fragment>\n        <MainPanelTopbar />\n        <div className=\"cur-view-container\">\n          <StatisticNav currentItem=\"trafficStatistic\" />\n          <div className=\"cur-view-content\">\n            {this.renderCommonTool()}\n            {isLoading && <Loading />}\n            {!isLoading && tabActive === 'system' &&\n              <div className=\"statistic-traffic-chart-container\">\n                <div className=\"mb-4\">\n                  {labels.length > 0 &&\n                    <StatisticChart\n                      labels={labels}\n                      filesData={filesData}\n                      chartTitle={gettext('Total Traffic')}\n                      suggestedMaxNumbers={10*1000*1000}\n                      isTitleCallback={true}\n                      isTicksCallback={true}\n                      isLegendStatus={true}\n                    />\n                  }\n                </div>\n                <div className=\"mb-4\">\n                  {labels.length > 0 &&\n                    <StatisticChart\n                      labels={labels}\n                      filesData={webData}\n                      chartTitle={gettext('Web Traffic')}\n                      suggestedMaxNumbers={10*1000*1000}\n                      isTitleCallback={true}\n                      isTicksCallback={true}\n                      isLegendStatus={true}\n                    />\n                  }\n                </div>\n                <div className=\"mb-4\">\n                  {labels.length > 0 &&\n                    <StatisticChart\n                      labels={labels}\n                      filesData={linkData}\n                      chartTitle={gettext('Share Link Traffic')}\n                      suggestedMaxNumbers={10*1000*1000}\n                      isTitleCallback={true}\n                      isTicksCallback={true}\n                      isLegendStatus={true}\n                    />\n                  }\n                </div>\n                <div className=\"mb-4\">\n                  {labels.length > 0 &&\n                    <StatisticChart\n                      labels={labels}\n                      filesData={syncData}\n                      chartTitle={gettext('Sync Traffic')}\n                      suggestedMaxNumbers={10*1000*1000}\n                      isTitleCallback={true}\n                      isTicksCallback={true}\n                      isLegendStatus={true}\n                    />\n                  }\n                </div>\n              </div>\n            }\n            {!isLoading && tabActive === 'user' &&\n              <UsersTraffic />\n            }\n            {!isLoading && tabActive === 'organizations' &&\n              <OrgsTraffic />\n            }\n          </div>\n        </div>\n      </Fragment>\n    );\n  }\n}\n\nexport default StatisticTraffic;\n","import React, { Fragment } from 'react';\nimport moment from 'moment';\nimport { gettext } from '../../../utils/constants';\nimport MainPanelTopbar from '../main-panel-topbar';\nimport StatisticNav from './statistic-nav';\nimport StatisticCommonTool from './statistic-common-tool';\nimport { seafileAPI } from '../../../utils/seafile-api';\nimport StatisticChart from './statistic-chart';\nimport Loading from '../../../components/loading';\nimport { Utils } from '../../../utils/utils';\nimport toaster from '../../../components/toast';\n\nclass StatisticUsers extends React.Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      filesData: [],\n      labels: [],\n      isLoading: true,\n    };\n  }\n\n  getActiviesFiles = (startTime, endTime, groupBy) => {\n    let { filesData } = this.state;\n    seafileAPI.sysAdminStatisticActiveUsers(startTime, endTime, groupBy).then((res) => {\n      let labels = [],\n        count = [];\n      let data = res.data;\n      if (Array.isArray(data)) {\n        data.forEach(item => {\n          labels.push(moment(item.datetime).format('YYYY-MM-DD'));\n          count.push(item.count);\n        });\n        let userCount = {\n          label: gettext('Active Users'),\n          data: count,\n          borderColor: '#fd913a',\n          backgroundColor: '#fd913a'};\n        filesData = [userCount];\n      }\n      this.setState({\n        filesData: filesData,\n        labels: labels,\n        isLoading: false\n      });\n    }).catch(err => {\n      let errMessage = Utils.getErrorMsg(err);\n      toaster.danger(errMessage);\n    });\n  }\n\n  render() {\n    let { labels, filesData, isLoading } = this.state;\n    return (\n      <Fragment>\n        <MainPanelTopbar />\n        <div className=\"cur-view-container\">\n          <StatisticNav currentItem=\"usersStatistic\" />\n          <div className=\"cur-view-content\">\n            <StatisticCommonTool getActiviesFiles={this.getActiviesFiles} />\n            {isLoading && <Loading />}\n            {!isLoading && labels.length > 0 &&\n              <StatisticChart\n                labels={labels}\n                filesData={filesData}\n                suggestedMaxNumbers={10}\n                isLegendStatus={false}\n                chartTitle={gettext('Active Users')}\n              />\n            }\n          </div>\n        </div>\n      </Fragment>\n    );\n  }\n}\n\nexport default StatisticUsers;\n","import React, { Fragment } from 'react';\nimport MainPanelTopbar from '../main-panel-topbar';\nimport moment from 'moment';\nimport StatisticNav from './statistic-nav';\nimport { Button, Input } from 'reactstrap';\nimport { siteRoot, gettext } from '../../../utils/constants';\n\nclass StatisticReports extends React.Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      month: moment().format('YYYYMM'),\n      errorMessage: ''\n    };\n  }\n\n  handleChange = (e) => {\n    let month = e.target.value;\n    this.setState({\n      month: month\n    });\n  }\n\n  onGenerateReports = (type) => {\n    let url = siteRoot + 'api/v2.1/admin/statistics/';\n    let { month } = this.state;\n    if (!month) {\n      let errorMessage = gettext('It is required.');\n      this.setState({\n        errorMessage: errorMessage\n      });\n      return;\n    }\n    if (type === 'month') {\n      let pattern = /^([012]\\d{3})(0[1-9]|1[012])$/;\n      if (!pattern.test(month)) {\n        let errorMessage = gettext('Invalid month, should be yyyymm.');\n        this.setState({\n          errorMessage: errorMessage\n        });\n        return;\n      }\n    }\n    switch(type) {\n      case 'month':\n        url += 'system-user-traffic/excel/?month=' + month;\n        break;\n      case 'storage':\n        url += 'system-user-storage/excel/?';\n        break;\n    }\n    this.setState({\n      errorMessage: ''\n    });\n    window.location.href = url;\n  }\n\n  render() {\n\n    let { errorMessage } = this.state;\n    return(\n      <Fragment>\n        <MainPanelTopbar />\n        <div className=\"cur-view-container\">\n          <StatisticNav currentItem=\"reportsStatistic\" />\n          <div className=\"cur-view-content\">\n            <div className=\"statistic-reports\">\n              <div className=\"statistic-reports-title\">{gettext('Monthly User Traffic')}</div>\n              <div className=\"d-flex align-items-center mt-4\">\n                <span className=\"statistic-reports-tip\">{gettext('Month:')}</span>\n                <Input className=\"statistic-reports-input\" defaultValue={moment().format('YYYYMM')} onChange={this.handleChange} />\n                <Button className=\"statistic-reports-submit operation-item\" onClick={this.onGenerateReports.bind(this, 'month')}>{gettext('Create Report')}</Button>\n              </div>\n              {errorMessage && <div className=\"error\">{errorMessage}</div>}\n            </div>\n            <div className=\"statistic-reports\">\n              <div className=\"statistic-reports-title\">{gettext('User Storage')}</div>\n              <Button className=\"mt-4 operation-item\" onClick={this.onGenerateReports.bind(this, 'storage')}>{gettext('Create Report')}</Button>\n            </div>\n          </div>\n        </div>\n      </Fragment>\n    );\n  }\n}\n\nexport default StatisticReports;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Link } from '@reach/router';\nimport { siteRoot, gettext, isPro } from '../../../utils/constants';\n\nconst propTypes = {\n  currentItem: PropTypes.string.isRequired\n};\n\nclass Nav extends React.Component {\n\n  constructor(props) {\n    super(props);\n    this.navItems = [\n      {name: 'desktop', urlPart:'desktop-devices', text: gettext('Desktop')},\n      {name: 'mobile', urlPart:'mobile-devices', text: gettext('Mobile')}\n    ];\n    if (isPro) {\n      this.navItems.push({name: 'errors', urlPart:'device-errors', text: gettext('Errors')});\n    }\n  }\n\n  render() {\n    const { currentItem } = this.props;\n    return (\n      <div className=\"cur-view-path tab-nav-container\">\n        <ul className=\"nav\">\n          {this.navItems.map((item, index) => {\n            return (\n              <li className=\"nav-item\" key={index}>\n                <Link to={`${siteRoot}sys/${item.urlPart}/`} className={`nav-link${currentItem == item.name ? ' active' : ''}`}>{item.text}</Link>\n              </li>\n            );\n          })}\n        </ul>\n      </div>\n    );\n  }\n}\n\nNav.propTypes = propTypes;\n\nexport default Nav;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { gettext, isPro } from '../../../utils/constants';\nimport { Button, Modal, ModalHeader, ModalBody, ModalFooter } from 'reactstrap';\n\nconst propTypes = {\n  unlinkDevice: PropTypes.func.isRequired,\n  toggleDialog: PropTypes.func.isRequired\n};\n\nclass SysAdminUnlinkDevice extends React.Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      inputChecked: false\n    };\n  }\n\n  handleInputChange = (e) => {\n    this.setState({\n      inputChecked: e.target.checked\n    });\n  }\n\n  unlinkDevice = () => {\n    this.props.toggleDialog();\n    this.props.unlinkDevice(this.state.inputChecked);\n  }\n\n  render() {\n    const { inputChecked } = this.state;\n    const toggle = this.props.toggleDialog;\n    return (\n      <Modal isOpen={true} toggle={toggle}>\n        <ModalHeader toggle={toggle}>{gettext('Unlink device')}</ModalHeader>\n        <ModalBody>\n          <p>{gettext('Are you sure you want to unlink this device?')}</p>\n          {isPro &&\n          <div className=\"d-flex align-items-center\">\n            <input id=\"delete-files\" className=\"mr-1\" type=\"checkbox\" checked={inputChecked} onChange={this.handleInputChange} />\n            <label htmlFor=\"delete-files\" className=\"m-0\">{gettext('Delete files from this device the next time it comes online.')}</label>\n          </div>\n          }\n        </ModalBody>\n        <ModalFooter>\n          <Button color=\"secondary\" onClick={toggle}>{gettext('Cancel')}</Button>\n          <Button color=\"primary\" onClick={this.unlinkDevice}>{gettext('Unlink')}</Button>\n        </ModalFooter>\n      </Modal>\n    );\n  }\n}\n\nSysAdminUnlinkDevice.propTypes = propTypes;\n\nexport default SysAdminUnlinkDevice;\n","import React, { Component, Fragment } from 'react';\nimport { seafileAPI } from '../../../utils/seafile-api';\nimport { gettext } from '../../../utils/constants';\nimport toaster from '../../../components/toast';\nimport { Utils } from '../../../utils/utils';\nimport EmptyTip from '../../../components/empty-tip';\nimport moment from 'moment';\nimport Loading from '../../../components/loading';\nimport Paginator from '../../../components/paginator';\nimport SysAdminUnlinkDevice from '../../../components/dialog/sysadmin-dialog/sysadmin-unlink-device-dialog';\n\nclass Content extends Component {\n\n  constructor(props) {\n    super(props);\n  }\n\n  getPreviousPageDevicesList = () => {\n    this.props.getDevicesListByPage(this.props.pageInfo.current_page - 1);\n  }\n\n  getNextPageDevicesList = () => {\n    this.props.getDevicesListByPage(this.props.pageInfo.current_page + 1);\n  }\n\n  render() {\n    const { loading, errorMsg, items, pageInfo, curPerPage } = this.props;\n    if (loading) {\n      return <Loading />;\n    } else if (errorMsg) {\n      return <p className=\"error text-center\">{errorMsg}</p>;\n    } else {\n      const emptyTip = (\n        <EmptyTip>\n          <h2>{gettext('No connected devices')}</h2>\n        </EmptyTip>\n      );\n      const table = (\n        <Fragment>\n          <table className=\"table-hover\">\n            <thead>\n              <tr>\n                <th width=\"19%\">{gettext('User')}</th>\n                <th width=\"19%\">{gettext('Platform')}{' / '}{gettext('Version')}</th>\n                <th width=\"19%\">{gettext('Device Name')}</th>\n                <th width=\"19%\">{gettext('IP')}</th>\n                <th width=\"19%\">{gettext('Last Access')}</th>\n                <th width=\"5%\">{/*Operations*/}</th>\n              </tr>\n            </thead>\n            <tbody>\n              {items.map((item, index) => {\n                return (<Item key={index} item={item} />);\n              })}\n            </tbody>\n          </table>\n          <Paginator\n            gotoPreviousPage={this.getPreviousPageDevicesList}\n            gotoNextPage={this.getNextPageDevicesList}\n            currentPage={pageInfo.current_page}\n            hasNextPage={pageInfo.has_next_page}\n            curPerPage={curPerPage}\n            resetPerPage={this.props.resetPerPage}\n          />\n        </Fragment>\n      );\n\n      return items.length ? table : emptyTip;\n    }\n  }\n}\n\nclass Item extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      unlinked: false,\n      isOpIconShown: false,\n      isUnlinkDeviceDialogOpen: false\n    };\n  }\n\n  handleMouseOver = () => {\n    this.setState({isOpIconShown: true});\n  }\n\n  handleMouseOut = () => {\n    this.setState({isOpIconShown: false});\n  }\n\n  handleUnlink = (e) => {\n    e.preventDefault();\n    if (this.props.item.is_desktop_client) {\n      this.toggleUnlinkDeviceDialog();\n    } else {\n      this.unlinkDevice(true);\n    }\n  }\n\n  toggleUnlinkDeviceDialog = () => {\n    this.setState({isUnlinkDeviceDialogOpen: !this.state.isUnlinkDeviceDialogOpen});\n  }\n\n  unlinkDevice = (deleteFiles) => {\n    const { platform, device_id, user } = this.props.item;\n    seafileAPI.sysAdminUnlinkDevice(platform, device_id, user, deleteFiles).then((res) => {\n      this.setState({unlinked: true});\n      let message = gettext('Successfully unlinked the device.');\n      toaster.success(message);\n    }).catch((error) => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  render() {\n    const item = this.props.item;\n    const { unlinked, isUnlinkDeviceDialogOpen, isOpIconShown } = this.state;\n\n    if (unlinked) {\n      return null;\n    }\n\n    return (\n      <Fragment>\n        <tr onMouseEnter={this.handleMouseOver} onMouseLeave={this.handleMouseOut}>\n          <td>{item.user_name}</td>\n          <td>{item.platform}{' / '}{item.client_version}</td>\n          <td>{item.device_name}</td>\n          <td>{item.last_login_ip}</td>\n          <td>\n            <span title={moment(item.last_accessed).format('llll')}>{moment(item.last_accessed).fromNow()}</span>\n          </td>\n          <td>\n            <a href=\"#\" className={`sf2-icon-delete action-icon ${isOpIconShown ? '' : 'invisible'}`} title={gettext('Unlink')} onClick={this.handleUnlink}></a>\n          </td>\n        </tr>\n        {isUnlinkDeviceDialogOpen &&\n          <SysAdminUnlinkDevice\n            unlinkDevice={this.unlinkDevice}\n            toggleDialog={this.toggleUnlinkDeviceDialog}\n          />\n        }\n      </Fragment>\n    );\n  }\n}\n\nclass DevicesByPlatform extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      loading: true,\n      errorMsg: '',\n      devicesData: {},\n      pageInfo: {},\n      perPage: 25\n    };\n  }\n\n  componentDidMount () {\n    let urlParams = (new URL(window.location)).searchParams;\n    const { currentPage = 1, perPage } = this.state;\n    this.setState({\n      perPage: parseInt(urlParams.get('per_page') || perPage),\n      currentPage: parseInt(urlParams.get('page') || currentPage)\n    }, () => {\n      this.getDevicesListByPage(this.state.currentPage);\n    });\n  }\n\n  getDevicesListByPage = (page) => {\n    let platform = this.props.devicesPlatform;\n    let per_page = this.state.perPage;\n    seafileAPI.sysAdminListDevices(platform, page, per_page).then((res) => {\n      this.setState({\n        devicesData: res.data.devices,\n        pageInfo: res.data.page_info,\n        loading: false\n      });\n    }).catch((error) => {\n      this.setState({\n        loading: false,\n        errorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403\n      });\n    });\n  }\n\n  resetPerPage = (perPage) => {\n    this.setState({\n      perPage: perPage\n    }, () => {\n      this.getDevicesListByPage(1);\n    });\n  }\n\n  render() {\n    return (\n      <div className=\"cur-view-content\">\n        <Content\n          loading={this.state.loading}\n          errorMsg={this.state.errorMsg}\n          items={this.state.devicesData}\n          getDevicesListByPage={this.getDevicesListByPage}\n          curPerPage={this.state.perPage}\n          resetPerPage={this.resetPerPage}\n          pageInfo={this.state.pageInfo}\n        />\n      </div>\n    );\n  }\n}\n\nexport default DevicesByPlatform;\n","import React, { Component, Fragment } from 'react';\nimport DevicesNav from './devices-nav';\nimport DevicesByPlatform from './devices-by-platform';\nimport MainPanelTopbar from '../main-panel-topbar';\n\nclass DesktopDevices extends Component {\n\n  constructor(props) {\n    super(props);\n  }\n\n  render() {\n    return (\n      <Fragment>\n        <MainPanelTopbar />\n        <div className=\"main-panel-center flex-row\">\n          <div className=\"cur-view-container\">\n            <DevicesNav currentItem=\"desktop\" />\n            <DevicesByPlatform\n              devicesPlatform={'desktop'}\n            />\n          </div>\n        </div>\n      </Fragment>\n    );\n  }\n}\n\nexport default DesktopDevices;\n","import React, { Component, Fragment } from 'react';\nimport DevicesNav from './devices-nav';\nimport DevicesByPlatform from './devices-by-platform';\nimport MainPanelTopbar from '../main-panel-topbar';\n\nclass MobileDevices extends Component {\n\n  constructor(props) {\n    super(props);\n  }\n\n  render() {\n    return (\n      <Fragment>\n        <MainPanelTopbar />\n        <div className=\"main-panel-center flex-row\">\n          <div className=\"cur-view-container\">\n            <DevicesNav currentItem=\"mobile\" />\n            <DevicesByPlatform\n              devicesPlatform={'mobile'}\n            />\n          </div>\n        </div>\n      </Fragment>\n    );\n  }\n}\n\nexport default MobileDevices;\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport { Link } from '@reach/router';\nimport { siteRoot } from '../../utils/constants';\n\nconst propTypes = {\n  email: PropTypes.string.isRequired,\n  name: PropTypes.string.isRequired\n};\n\nclass UserLink extends Component {\n\n  render() {\n    return <Link to={`${siteRoot}sys/users/${encodeURIComponent(this.props.email)}/`}>{this.props.name}</Link>;\n  }\n}\n\nUserLink.propTypes = propTypes;\n\nexport default UserLink;\n","import React, { Component, Fragment } from 'react';\nimport { Button } from 'reactstrap';\nimport { seafileAPI } from '../../../utils/seafile-api';\nimport { siteRoot, gettext } from '../../../utils/constants';\nimport toaster from '../../../components/toast';\nimport { Utils } from '../../../utils/utils';\nimport EmptyTip from '../../../components/empty-tip';\nimport moment from 'moment';\nimport Loading from '../../../components/loading';\nimport { Link } from '@reach/router';\nimport DevicesNav from './devices-nav';\nimport MainPanelTopbar from '../main-panel-topbar';\nimport UserLink from '../user-link';\n\nclass Content extends Component {\n\n  constructor(props) {\n    super(props);\n  }\n\n  render() {\n    const { loading, errorMsg, items } = this.props;\n    if (loading) {\n      return <Loading />;\n    } else if (errorMsg) {\n      return <p className=\"error text-center\">{errorMsg}</p>;\n    } else {\n      const emptyTip = (\n        <EmptyTip>\n          <h2>{gettext('No sync errors')}</h2>\n        </EmptyTip>\n      );\n      const table = (\n        <Fragment>\n          <table className=\"table-hover\">\n            <thead>\n              <tr>\n                <th width=\"16%\">{gettext('User')}</th>\n                <th width=\"20%\">{gettext('Device')}{' / '}{gettext('Version')}</th>\n                <th width=\"16%\">{gettext('IP')}</th>\n                <th width=\"16%\">{gettext('Library')}</th>\n                <th width=\"16%\">{gettext('Error')}</th>\n                <th width=\"16%\">{gettext('Time')}</th>\n              </tr>\n            </thead>\n            <tbody>\n              {items.map((item, index) => {\n                return (<Item key={index} item={item} />);\n              })}\n            </tbody>\n          </table>\n        </Fragment>\n      );\n      return items.length ? table : emptyTip;\n    }\n  }\n}\n\nclass Item extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      isOpIconShown: false,\n    };\n  }\n\n  handleMouseOver = () => {\n    this.setState({isOpIconShown: true});\n  }\n\n  handleMouseOut = () => {\n    this.setState({isOpIconShown: false});\n  }\n\n  render() {\n    let item = this.props.item;\n    return (\n      <tr onMouseEnter={this.handleMouseOver} onMouseLeave={this.handleMouseOut}>\n        <td><UserLink email={item.email} name={item.name} /></td>\n        <td>{item.device_name}{' / '}{item.client_version}</td>\n        <td>{item.device_ip}</td>\n        <td><Link to={`${siteRoot}sysadmin/#libs/${item.repo_id}`}>{item.repo_name}</Link></td>\n        <td>{item.error_msg}</td>\n        <td>\n          <span className=\"item-meta-info\" title={moment(item.last_accessed).format('llll')}>{moment(item.error_time).fromNow()}</span>\n        </td>\n      </tr>\n    );\n  }\n}\n\nclass DeviceErrors extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      loading: true,\n      errorMsg: '',\n      devicesErrors: [],\n      isCleanBtnShown: false\n    };\n  }\n\n  componentDidMount () {\n    seafileAPI.sysAdminListDeviceErrors().then((res) => {\n      this.setState({\n        loading: false,\n        devicesErrors: res.data,\n        isCleanBtnShown: res.data.length > 0\n      });\n    }).catch((error) => {\n      this.setState({\n        loading: false,\n        errorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403\n      });\n    });\n  }\n\n  clean = () => {\n    seafileAPI.sysAdminClearDeviceErrors().then((res) => {\n      this.setState({\n        devicesErrors: [],\n        isCleanBtnShown: false\n      });\n      let message = gettext('Successfully cleaned all errors.');\n      toaster.success(message);\n    }).catch((error) => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  render() {\n    return (\n      <Fragment>\n        {this.state.isCleanBtnShown ? (\n          <MainPanelTopbar>\n            <Button className=\"operation-item\" onClick={this.clean}>{gettext('Clean')}</Button>\n          </MainPanelTopbar>\n        ) : (\n          <MainPanelTopbar />\n        )}\n        <div className=\"main-panel-center flex-row\">\n          <div className=\"cur-view-container\">\n            <DevicesNav currentItem=\"errors\" />\n            <div className=\"cur-view-content\">\n              <Content\n                loading={this.state.loading}\n                errorMsg={this.state.errorMsg}\n                items={this.state.devicesErrors}\n              />\n            </div>\n          </div>\n        </div>\n      </Fragment>\n    );\n  }\n}\n\nexport default DeviceErrors;\n","import React, { Component, Fragment } from 'react';\nimport Account from '../../components/common/account';\nimport { gettext, siteRoot, mediaUrl } from '../../utils/constants';\nimport { Utils } from '../../utils/utils';\nimport { seafileAPI } from '../../utils/seafile-api';\nimport toaster from '../../components/toast';\nimport moment from 'moment';\n\nclass AbuseReports extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      abuseReportList: [],\n    };\n  }\n\n  listAbuseReports = () => {\n    seafileAPI.sysAdminListAbuseReports().then((res) => {\n      this.setState({\n        abuseReportList: res.data.abuse_report_list,\n      });\n    }).catch((error) => {\n      this.handleError(error);\n    });\n  };\n\n  updateAbuseReport = (handled, abuseReportId) => {\n    seafileAPI.sysAdminUpdateAbuseReport(handled, abuseReportId).then((res) => {\n      const abuseReportList = this.state.abuseReportList.map((item, index) => {\n        if (item.id === abuseReportId) {\n          item.handled = res.data.handled;\n        }\n        return item;\n      });\n      this.setState({\n        abuseReportList: abuseReportList,\n      });\n    }).catch((error) => {\n      this.handleError(error);\n    });\n  };\n\n  handleError = (e) => {\n    if (e.response) {\n      toaster.danger(e.response.data.error_msg || e.response.data.detail || gettext('Error'), {duration: 3});\n    } else {\n      toaster.danger(gettext('Please check the network.'), {duration: 3});\n    }\n  };\n\n  componentDidMount() {\n    this.listAbuseReports();\n  }\n\n  render() {\n    const isDesktop = Utils.isDesktop();\n    const AbuseReportList = this.state.abuseReportList.map((item, index) => {\n      const handled = (!item.handled).toString();\n      const abuseReportId = item.id;\n      const fileUrl = siteRoot + 'lib/' + item.repo_id + '/file' + item.file_path;\n      return (\n        <tr key={index}>\n          <td>{item.repo_name}</td>\n          <td><a href={fileUrl} target=\"_blank\">{item.file_path}</a></td>\n          <td>{item.reporter}</td>\n          <td>{item.abuse_type}</td>\n          <td>{item.description}</td>\n          <td>{moment(item.time).format('YYYY-MM-DD')}</td>\n          <td><p onClick={this.updateAbuseReport.bind(this, handled, abuseReportId)}\n            className=\"op-target ellipsis ellipsis-op-target cursor-pointer\"\n          >{gettext(item.handled.toString())}</p></td>\n        </tr>\n      );\n    });\n\n    return (\n      <Fragment>\n        <div className=\"main-panel-north\">\n          <div className=\"cur-view-toolbar\">\n            <span className=\"sf2-icon-menu side-nav-toggle hidden-md-up d-md-none\" title=\"Side Nav Menu\"></span>\n          </div>\n          <div className=\"common-toolbar\">\n            <Account isAdminPanel={true}/>\n          </div>\n        </div>\n        <div className=\"main-panel-center\">\n          <div className=\"cur-view-container\">\n            <div className=\"cur-view-path\">\n              <h3 className=\"sf-heading\">{gettext('Abuse Reports')}</h3>\n            </div>\n            <div className=\"cur-view-content\">\n              <table className={`table-hover${isDesktop ? '' : ' table-thead-hidden'}`}>\n                <thead>\n                  {isDesktop ?\n                    <tr>\n                      <th width=\"20%\">{gettext('Library')}</th>\n                      <th width=\"20%\">{gettext('File')}</th>\n                      <th width=\"10%\">{gettext('Reporter')}</th>\n                      <th width=\"15%\">{gettext('Abuse Type')}</th>\n                      <th width=\"20%\">{gettext('Description')}</th>\n                      <th width=\"10%\">{gettext('Time')}</th>\n                      <th width=\"5%\">{gettext('Handled')}</th>\n                    </tr>\n                    :\n                    <tr>\n                      <th width=\"92%\"></th>\n                      <th width=\"8%\"></th>\n                    </tr>\n                  }\n                </thead>\n                <tbody>\n                  {AbuseReportList}\n                </tbody>\n              </table>\n            </div>\n          </div>\n        </div>\n      </Fragment>\n    );\n  }\n}\n\nexport default AbuseReports;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Alert, Modal, ModalHeader, ModalBody, ModalFooter, Button, Form, FormGroup, Input, InputGroup, InputGroupAddon, InputGroupText } from 'reactstrap';\nimport { gettext } from '../../../utils/constants';\nimport { Utils } from '../../../utils/utils';\n\nconst propTypes = {\n  toggle: PropTypes.func.isRequired,\n  updateQuota: PropTypes.func.isRequired\n};\n\nclass SetQuotaDialog extends React.Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      quota: '',\n      isSubmitBtnActive: false\n    };\n  }\n\n  toggle = () => {\n    this.props.toggle();\n  }\n\n  handleQuotaChange = (e) => {\n    const value = e.target.value;\n    this.setState({\n      quota: value,\n      isSubmitBtnActive: value.trim() != ''\n    });\n  }\n\n  handleKeyPress = (e) => {\n    if (e.key == 'Enter') {\n      this.handleSubmit();\n      e.preventDefault();\n    }\n  }\n\n  handleSubmit = () => {\n    this.props.updateQuota(this.state.quota.trim());\n    this.toggle();\n  }\n\n  render() {\n    const { quota, isSubmitBtnActive } = this.state;\n    return (\n      <Modal isOpen={true} toggle={this.toggle}>\n        <ModalHeader toggle={this.toggle}>{gettext('Set Quota')}</ModalHeader>\n        <ModalBody>\n          <Form>\n            <FormGroup>\n              <InputGroup>\n                <Input\n                  type=\"text\"\n                  className=\"form-control\"\n                  value={quota}\n                  onKeyPress={this.handleKeyPress}\n                  onChange={this.handleQuotaChange}\n                />\n                <InputGroupAddon addonType=\"append\">\n                  <InputGroupText>MB</InputGroupText>\n                </InputGroupAddon>\n              </InputGroup>\n              <p className=\"small text-secondary mt-2 mb-2\">\n                {gettext('An integer that is greater than or equal to 0.')}\n                <br />\n                {gettext('Tip: 0 means default limit')}\n              </p>\n            </FormGroup>\n          </Form>\n        </ModalBody>\n        <ModalFooter>\n          <Button color=\"secondary\" onClick={this.toggle}>{gettext('Cancel')}</Button>\n          <Button color=\"primary\" onClick={this.handleSubmit} disabled={!isSubmitBtnActive}>{gettext('Submit')}</Button>\n        </ModalFooter>\n      </Modal>\n    );\n  }\n}\n\nSetQuotaDialog.propTypes = propTypes;\n\nexport default SetQuotaDialog;\n","\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport { Alert, Modal, ModalHeader, ModalBody, ModalFooter, Button } from 'reactstrap';\nimport { gettext, siteRoot } from '../../../utils/constants';\n\nconst propTypes = {\n  toggle: PropTypes.func.isRequired,\n  importUserInBatch: PropTypes.func.isRequired,\n};\n\nclass SysAdminImportUserDialog extends React.Component {\n  constructor(props) {\n    super(props);\n    this.fileInputRef = React.createRef();\n    this.state = {\n      errorMsg: ''\n    };\n  }\n\n  toggle = () => {\n    this.props.toggle();\n  }\n\n  openFileInput = () => {\n    this.fileInputRef.current.click();\n  }\n\n  uploadFile = (e) => {\n    // no file selected\n    if (!this.fileInputRef.current.files.length) {\n      return;\n    }\n    // check file extension\n    let fileName = this.fileInputRef.current.files[0].name;\n    if(fileName.substr(fileName.lastIndexOf('.') + 1) != 'xlsx') {\n      this.setState({\n        errorMsg: gettext('Please choose a .xlsx file.')\n      });\n      return;\n    }\n    const file = this.fileInputRef.current.files[0];\n    this.props.importUserInBatch(file);\n    this.toggle();\n  }\n\n  render() {\n    let { errorMsg } = this.state;\n    return (\n      <Modal isOpen={true} toggle={this.toggle}>\n        <ModalHeader toggle={this.toggle}>{gettext('Import users from a .xlsx file')}</ModalHeader>\n        <ModalBody>\n          <p><a className=\"text-secondary small\" href={`${siteRoot}useradmin/batchadduser/example/`}>{gettext('Download an example file')}</a></p>\n          <button className=\"btn btn-outline-primary\" onClick={this.openFileInput}>{gettext('Upload file')}</button>\n          <input className=\"d-none\" type=\"file\" onChange={this.uploadFile} ref={this.fileInputRef} />\n          {errorMsg && <Alert color=\"danger\">{errorMsg}</Alert>}\n        </ModalBody>\n        <ModalFooter>\n          <Button color=\"secondary\" onClick={this.toggle}>{gettext('Cancel')}</Button>\n        </ModalFooter>\n      </Modal>\n    );\n  }\n}\n\nSysAdminImportUserDialog.propTypes = propTypes;\n\nexport default SysAdminImportUserDialog;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { gettext } from '../../utils/constants';\nimport SelectEditor from './select-editor';\n\nconst propTypes = {\n  isTextMode: PropTypes.bool.isRequired,\n  isEditIconShow: PropTypes.bool.isRequired,\n  roleOptions: PropTypes.array.isRequired,\n  currentRole: PropTypes.string.isRequired,\n  onRoleChanged: PropTypes.func.isRequired\n};\n\nclass SysAdminUserRoleEditor extends React.Component {\n\n  translateRoles = (role) => {\n    switch (role) {\n      case 'default':\n        return gettext('Default');\n      case 'guest':\n        return gettext('Guest');\n      default:\n        return role;\n    }\n  }\n\n  render() {\n    return (\n      <SelectEditor\n        isTextMode={this.props.isTextMode}\n        isEditIconShow={this.props.isEditIconShow}\n        options={this.props.roleOptions}\n        currentOption={this.props.currentRole}\n        onOptionChanged={this.props.onRoleChanged}\n        translateOption={this.translateRoles}\n      />\n    );\n  }\n}\n\nSysAdminUserRoleEditor.propTypes = propTypes;\n\nexport default SysAdminUserRoleEditor;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Alert, Modal, ModalHeader, ModalBody, ModalFooter, Button, Form, FormGroup, Label, Input, InputGroup, InputGroupAddon } from 'reactstrap';\nimport { gettext } from '../../../utils/constants';\nimport { Utils } from '../../../utils/utils';\nimport SysAdminUserRoleEditor from '../../../components/select-editor/sysadmin-user-role-editor';\n\nconst propTypes = {\n  toggleDialog: PropTypes.func.isRequired,\n  addUser: PropTypes.func.isRequired\n};\n\nclass SysAdminAddUserDialog extends React.Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      errorMsg: '',\n      isPasswordVisible: false,\n      password: '',\n      passwordAgain: '',\n      email: '',\n      name: '',\n      role: 'default',\n      isSubmitBtnActive: false\n    };\n  }\n\n  checkSubmitBtnActive = () => {\n    const { email, password, passwordAgain } = this.state;\n    let btnActive = true;\n    if (email.trim() &&\n      password.trim() &&\n      passwordAgain.trim()) {\n      btnActive = true;\n    } else {\n      btnActive = false;\n    }\n    this.setState({\n      isSubmitBtnActive: btnActive\n    });\n  }\n\n  toggle = () => {\n    this.props.toggleDialog();\n  }\n\n  togglePasswordVisible = () => {\n    this.setState({isPasswordVisible: !this.state.isPasswordVisible});\n  }\n\n  inputPassword = (e) => {\n    let passwd = e.target.value;\n    this.setState({\n      password: passwd,\n      errorMsg: ''\n    }, this.checkSubmitBtnActive);\n  }\n\n  inputPasswordAgain = (e) => {\n    let passwd = e.target.value;\n    this.setState({\n      passwordAgain: passwd,\n      errorMsg: ''\n    }, this.checkSubmitBtnActive);\n  }\n\n  generatePassword = () => {\n    let val = Utils.generatePassword(8);\n    this.setState({\n      password: val,\n      passwordAgain: val\n    }, this.checkSubmitBtnActive);\n  }\n\n  inputEmail = (e) => {\n    let email = e.target.value;\n    this.setState({\n      email: email\n    }, this.checkSubmitBtnActive);\n  }\n\n  inputName = (e) => {\n    let name = e.target.value;\n    this.setState({\n      name: name\n    });\n  }\n\n  updateRole = (role) => {\n    this.setState({\n      role: role\n    });\n  }\n\n  handleSubmit = () => {\n    const { email, password, passwordAgain, name, role } = this.state;\n    if (password != passwordAgain) {\n      this.setState({errorMsg: gettext('Passwords do not match.')});\n      return;\n    }\n    let data = {\n      email: email.trim(),\n      name: name.trim(),\n      password: password.trim()\n    };\n    if (this.props.showRole) {\n      data.role = role;\n    }\n    this.props.addUser(data);\n    this.toggle();\n  }\n\n  render() {\n    const { dialogTitle, showRole } = this.props;\n    const {\n      errorMsg, isPasswordVisible,\n      email, name, role, password, passwordAgain,\n      isSubmitBtnActive\n    } = this.state;\n    return (\n      <Modal isOpen={true} toggle={this.toggle}>\n        <ModalHeader toggle={this.toggle}>{dialogTitle || gettext('Add Member')}</ModalHeader>\n        <ModalBody>\n          <Form autoComplete=\"off\">\n            <FormGroup>\n              <Label>{gettext('Email')}</Label>\n              <Input value={email} onChange={this.inputEmail} />\n            </FormGroup>\n            <FormGroup>\n              <Label>{gettext('Name(optional)')}</Label>\n              <Input type=\"text\" value={name} onChange={this.inputName} />\n            </FormGroup>\n            {showRole &&\n            <FormGroup>\n              <Label>\n                {gettext('Role')}\n                <span className=\"small text-secondary ml-1 fas fa-question-circle\" title={gettext('You can also add a user as a guest, who will not be allowed to create libraries and groups.')}></span>\n              </Label>\n              <SysAdminUserRoleEditor\n                isTextMode={false}\n                isEditIconShow={false}\n                currentRole={role}\n                roleOptions={this.props.availableRoles}\n                onRoleChanged={this.updateRole}\n              />\n            </FormGroup>\n            }\n            <FormGroup>\n              <Label>{gettext('Password')}</Label>\n              <InputGroup>\n                <Input autoComplete=\"new-password\" type={isPasswordVisible ? 'text' : 'password'} value={password || ''} onChange={this.inputPassword} />\n                <InputGroupAddon addonType=\"append\">\n                  <Button className=\"mt-0\" onClick={this.togglePasswordVisible}><i className={`link-operation-icon fas ${this.state.isPasswordVisible ? 'fa-eye': 'fa-eye-slash'}`}></i></Button>\n                  <Button className=\"mt-0\" onClick={this.generatePassword}><i className=\"link-operation-icon fas fa-magic\"></i></Button>\n                </InputGroupAddon>\n              </InputGroup>\n            </FormGroup>\n            <FormGroup>\n              <Label>{gettext('Password again')}</Label>\n              <Input type={isPasswordVisible ? 'text' : 'password'} value={passwordAgain || ''} onChange={this.inputPasswordAgain} />\n            </FormGroup>\n          </Form>\n          {errorMsg && <Alert color=\"danger\">{errorMsg}</Alert>}\n        </ModalBody>\n        <ModalFooter>\n          <Button color=\"secondary\" onClick={this.toggle}>{gettext('Cancel')}</Button>\n          <Button color=\"primary\" onClick={this.handleSubmit} disabled={!isSubmitBtnActive}>{gettext('Submit')}</Button>\n        </ModalFooter>\n      </Modal>\n    );\n  }\n}\n\nSysAdminAddUserDialog.propTypes = propTypes;\n\nexport default SysAdminAddUserDialog;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Modal, ModalHeader, ModalBody, ModalFooter, Button } from 'reactstrap';\nimport UserSelect from '../../user-select';\nimport { gettext } from '../../../utils/constants';\n\nconst propTypes = {\n  toggle: PropTypes.func.isRequired,\n  addAdminInBatch: PropTypes.func.isRequired,\n};\n\nclass SysAdminBatchAddAdminDialog extends React.Component {\n  constructor(props) {\n    super(props);\n    this.state = {\n      options: null,\n      isSubmitBtnActive: false\n    };\n  }\n\n  toggle = () => {\n    this.props.toggle();\n  }\n\n handleSelectChange = (options) => {\n   this.setState({\n     options: options,\n     isSubmitBtnActive: options.length > 0\n   });\n }\n\n handleSubmit = () => {\n   this.props.addAdminInBatch(this.state.options.map(item => item.email));\n   this.toggle();\n }\n\n  handleKeyPress = (e) => {\n    if (e.key === 'Enter') {\n      this.handleSubmit();\n      e.preventDefault();\n    }\n  }\n\n  render() {\n    return (\n      <Modal isOpen={true} toggle={this.toggle}>\n        <ModalHeader toggle={this.toggle}>{gettext('Add Admin')}</ModalHeader>\n        <ModalBody>\n          <UserSelect\n            isMulti={true}\n            className=\"reviewer-select\"\n            placeholder={gettext('Search users...')}\n            onSelectChange={this.handleSelectChange}\n          />\n        </ModalBody>\n        <ModalFooter>\n          <Button color=\"secondary\" onClick={this.toggle}>{gettext('Cancel')}</Button>\n          <Button color=\"primary\" onClick={this.handleSubmit} disabled={!this.state.isSubmitBtnActive}>{gettext('Submit')}</Button>\n        </ModalFooter>\n      </Modal>\n    );\n  }\n}\n\nSysAdminBatchAddAdminDialog.propTypes = propTypes;\n\nexport default SysAdminBatchAddAdminDialog;\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport { Modal, ModalHeader, ModalBody, ModalFooter, Button } from 'reactstrap';\nimport { gettext } from '../../utils/constants';\n\nconst propTypes = {\n  title: PropTypes.string.isRequired,\n  message: PropTypes.string.isRequired,\n  confirmBtnText: PropTypes.string,\n  executeOperation: PropTypes.func.isRequired,\n  toggleDialog: PropTypes.func.isRequired\n};\n\nclass CommonOperationConfirmationDialog extends Component {\n\n  toggle = () => {\n    this.props.toggleDialog();\n  }\n\n  executeOperation = () => {\n    this.toggle();\n    this.props.executeOperation();\n  }\n\n  render() {\n    let { title, message, confirmBtnText } = this.props;\n    return (\n      <Modal isOpen={true} toggle={this.toggle}>\n        <ModalHeader toggle={this.toggle}>{title}</ModalHeader>\n        <ModalBody>\n          <p dangerouslySetInnerHTML={{__html: message}}></p>\n        </ModalBody>\n        <ModalFooter>\n          <Button color=\"secondary\" onClick={this.toggle}>{gettext('Cancel')}</Button>\n          <Button color=\"primary\" onClick={this.executeOperation}>{confirmBtnText || gettext('Confirm')}</Button>\n        </ModalFooter>\n      </Modal>\n    );\n  }\n}\n\nCommonOperationConfirmationDialog.propTypes = propTypes;\n\nexport default CommonOperationConfirmationDialog;\n","class SysAdminUser {\n  constructor(object) {\n    this.email = object.email;\n    this.name = object.name;\n    this.contact_email = object.contact_email;\n    this.login_id = object.login_id;\n    this.last_login = object.last_login;\n    this.last_access_time = object.last_access_time;\n    this.create_time = object.create_time;\n    this.is_active = object.is_active;\n    this.is_staff = object.is_staff;\n    this.reference_id = object.reference_id;\n    this.department = object.department;\n    this.quota_total = object.quota_total;\n    this.quota_usage = object.quota_usage;\n    this.role = object.role;\n    this.institution = object.institution;\n    if (object.org_id) {\n      this.org_id = object.org_id;\n    }\n    if (object.org_name) {\n      this.org_name = object.org_name;\n    }\n    this.isSelected = false;\n  }\n}\n\nexport default SysAdminUser;\n","\nclass SysAdminAdminUser {\n  constructor(object) {\n    this.email = object.email;\n    this.name = object.name;\n    this.contact_email = object.contact_email;\n    this.login_id = object.login_id;\n    this.last_login = object.last_login;\n    this.last_access_time = object.last_access_time;\n    this.create_time = object.create_time;\n    this.is_active = object.is_active;\n    this.is_staff = object.is_staff;\n    this.quota_total = object.quota_total;\n    this.quota_usage = object.quota_usage;\n    this.admin_role = object.admin_role;\n    this.isSelected = false;\n  }\n}\n\nexport default SysAdminAdminUser;\n","import React from 'react';\nimport PropTypes from 'prop-types';\n\nconst propTypes = {\n  placeholder: PropTypes.string.isRequired,\n  submit: PropTypes.func.isRequired\n};\n\nclass Search extends React.Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      value: ''\n    };\n  }\n\n  handleInputChange = (e) => {\n    this.setState({\n      value: e.target.value\n    });\n  }\n\n  handleKeyPress = (e) => {\n    if (e.key == 'Enter') {\n      e.preventDefault();\n      this.handleSubmit();\n    }\n  }\n\n  handleSubmit = () => {\n    const value = this.state.value.trim();\n    if (!value) {\n      return false;\n    }\n    this.props.submit(value);\n  }\n\n  render() {\n    return (\n      <div className=\"input-icon\">\n        <i className=\"d-flex input-icon-addon fas fa-search\"></i>\n        <input\n          type=\"text\"\n          className=\"form-control search-input h-6 mr-1\"\n          style={{width: '15rem'}}\n          placeholder={this.props.placeholder}\n          value={this.state.value}\n          onChange={this.handleInputChange}\n          onKeyPress={this.handleKeyPress}\n          autoComplete=\"off\"\n        />\n      </div>\n    );\n  }\n}\n\nSearch.propTypes = propTypes;\n\nexport default Search;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Link } from '@reach/router';\nimport { siteRoot, gettext, haveLDAP, isDefaultAdmin } from '../../../utils/constants';\n\nconst propTypes = {\n  currentItem: PropTypes.string.isRequired\n};\n\nclass Nav extends React.Component {\n\n  constructor(props) {\n    super(props);\n    this.navItems = [\n      {name: 'database', urlPart: 'users', text: gettext('Database')}\n    ];\n    if (haveLDAP) {\n      this.navItems.push(\n        {name: 'ldap', urlPart: 'users/ldap', text: gettext('LDAP')},\n        {name: 'ldap-imported', urlPart: 'users/ldap-imported', text: gettext('LDAP(imported)')}\n      );\n    }\n    if (isDefaultAdmin) {\n      this.navItems.push(\n        {name: 'admin', urlPart: 'users/admins', text: gettext('Admin')}\n      );\n    }\n  }\n\n  render() {\n    const { currentItem } = this.props;\n    return (\n      <div className=\"cur-view-path tab-nav-container\">\n        <ul className=\"nav\">\n          {this.navItems.map((item, index) => {\n            return (\n              <li className=\"nav-item\" key={index}>\n                <Link to={`${siteRoot}sys/${item.urlPart}/`} className={`nav-link${currentItem == item.name ? ' active' : ''}`}>{item.text}</Link>\n              </li>\n            );\n          })}\n        </ul>\n      </div>\n    );\n  }\n}\n\nNav.propTypes = propTypes;\n\nexport default Nav;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { gettext } from '../../utils/constants';\nimport SelectEditor from './select-editor';\n\nconst propTypes = {\n  isTextMode: PropTypes.bool.isRequired,\n  isEditIconShow: PropTypes.bool.isRequired,\n  statusOptions: PropTypes.array.isRequired,\n  currentStatus: PropTypes.string.isRequired,\n  onStatusChanged: PropTypes.func.isRequired\n};\n\nclass SysAdminUserStatusEditor extends React.Component {\n\n  translateStatus = (status) => {\n    switch (status) {\n      case 'active':\n        return gettext('Active');\n      case 'inactive':\n        return gettext('Inactive');\n    }\n  }\n\n  render() {\n    return (\n      <SelectEditor\n        isTextMode={this.props.isTextMode}\n        isEditIconShow={this.props.isEditIconShow}\n        options={this.props.statusOptions}\n        currentOption={this.props.currentStatus}\n        onOptionChanged={this.props.onStatusChanged}\n        translateOption={this.translateStatus}\n      />\n    );\n  }\n}\n\nSysAdminUserStatusEditor.propTypes = propTypes;\n\nexport default SysAdminUserStatusEditor;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Dropdown, DropdownMenu, DropdownToggle, DropdownItem } from 'reactstrap';\nimport { gettext } from '../../utils/constants';\nimport { Utils } from '../../utils/utils';\n\nconst propTypes = {\n  onFreezedItem: PropTypes.func.isRequired,\n  onUnfreezedItem: PropTypes.func.isRequired,\n  onMenuItemClick: PropTypes.func.isRequired,\n  operations: PropTypes.array.isRequired,\n  translateOperations: PropTypes.func.isRequired\n};\n\nclass OpMenu extends React.Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      isItemMenuShow: false\n    };\n  }\n\n  onMenuItemClick = (e) => {\n    let operation = Utils.getEventData(e, 'op');\n    this.props.onMenuItemClick(operation);\n  }\n\n  onDropdownToggleClick = (e) => {\n    this.toggleOperationMenu(e);\n  }\n\n  toggleOperationMenu = (e) => {\n    this.setState(\n      {isItemMenuShow: !this.state.isItemMenuShow},\n      () => {\n        if (this.state.isItemMenuShow) {\n          this.props.onFreezedItem();\n        } else {\n          this.props.onUnfreezedItem();\n        }\n      }\n    );\n  }\n\n  render() {\n    const { operations, translateOperations } = this.props;\n    return (\n      <Dropdown isOpen={this.state.isItemMenuShow} toggle={this.toggleOperationMenu}>\n        <DropdownToggle\n          tag=\"i\"\n          className=\"d-flex w-5 h-5 align-items-center justify-content-center sf-dropdown-toggle fa fa-ellipsis-v\"\n          title={gettext('More Operations')}\n          data-toggle=\"dropdown\"\n          aria-expanded={this.state.isItemMenuShow}\n        />\n        <DropdownMenu className=\"my-1 mr-2\">\n          {operations.map((item, index )=> {\n            return (<DropdownItem key={index} data-op={item} onClick={this.onMenuItemClick}>{translateOperations(item)}</DropdownItem>);\n          })}\n        </DropdownMenu>\n      </Dropdown>\n    );\n  }\n}\n\nOpMenu.propTypes = propTypes;\n\nexport default OpMenu;\n","import React, { Component, Fragment } from 'react';\nimport moment from 'moment';\nimport { Link } from '@reach/router';\nimport { Utils } from '../../../utils/utils';\nimport { seafileAPI } from '../../../utils/seafile-api';\nimport { isPro, username, gettext, multiInstitution, siteRoot } from '../../../utils/constants';\nimport toaster from '../../../components/toast';\nimport EmptyTip from '../../../components/empty-tip';\nimport Loading from '../../../components/loading';\nimport Paginator from '../../../components/paginator';\nimport SysAdminUserStatusEditor from '../../../components/select-editor/sysadmin-user-status-editor';\nimport SysAdminUserRoleEditor from '../../../components/select-editor/sysadmin-user-role-editor';\nimport SelectEditor from '../../../components/select-editor/select-editor';\nimport OpMenu from '../../../components/dialog/op-menu';\nimport SysAdminUserSetQuotaDialog from '../../../components/dialog/sysadmin-dialog/set-quota';\nimport CommonOperationConfirmationDialog from '../../../components/dialog/common-operation-confirmation-dialog';\nimport UserLink from '../user-link';\n\nconst { availableRoles, availableAdminRoles, institutions } = window.sysadmin.pageOptions;\n\nclass Content extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      isItemFreezed: false\n    };\n  }\n\n  onFreezedItem = () => {\n    this.setState({isItemFreezed: true});\n  }\n\n  onUnfreezedItem = () => {\n    this.setState({isItemFreezed: false});\n  }\n\n  getPreviousPage = () => {\n    this.props.getListByPage(this.props.currentPage - 1);\n  }\n\n  getNextPage = () => {\n    this.props.getListByPage(this.props.currentPage + 1);\n  }\n\n  sortByQuotaUsage = (e) => {\n    e.preventDefault();\n    this.props.sortByQuotaUsage();\n  }\n\n  render() {\n    const {\n      isAdmin, loading, errorMsg, items, isAllUsersSelected,\n      curPerPage, hasNextPage, currentPage,\n      sortBy, sortOrder\n    } = this.props;\n    if (loading) {\n      return <Loading />;\n    } else if (errorMsg) {\n      return <p className=\"error text-center mt-4\">{errorMsg}</p>;\n    } else {\n      const emptyTip = (\n        <EmptyTip>\n          <h2>{gettext('No users')}</h2>\n        </EmptyTip>\n      );\n\n\n      let columns = [];\n\n      let sortIcon;\n      if (sortBy == '') {\n        // initial sort icon\n        sortIcon = <span className=\"fas fa-sort\"></span>;\n      } else {\n        sortIcon = <span className={`fas ${sortOrder == 'asc' ? 'fa-caret-up' : 'fa-caret-down'}`}></span>;\n      }\n      const spaceText = gettext('Space Used');\n      const spaceEl =\n        sortBy != undefined ? // only offer 'sort' for 'DB' & 'LDAPImported' users\n        <a className=\"d-inline-block table-sort-op\" href=\"#\" onClick={this.sortByQuotaUsage}>{spaceText} {sortIcon}</a> :\n          spaceText;\n      const colSpaceText = <Fragment>{spaceEl}{` / ${gettext('Quota')}`}</Fragment>;\n\n      const colNameText = `${gettext('Name')} / ${gettext('Contact Email')}`;\n      const colCreatedText = `${gettext('Created At')} / ${gettext('Last Login')} / ${gettext('Last Access')}`;\n      if (isPro) {\n        columns.push(\n          {width: '20%', text: colNameText},\n          {width: '15%', text: gettext('Status')},\n          {width: '15%', text: gettext('Role')}\n        );\n      } else {\n        columns.push(\n          {width: '30%', text: colNameText},\n          {width: '20%', text: gettext('Status')}\n        );\n      }\n      if (multiInstitution && !isAdmin) {\n        columns.push(\n          {width: '14%', text: colSpaceText},\n          {width: '14%', text: gettext('Institution')},\n          {width: '14%', text: colCreatedText},\n          {width: '5%', text: ''}\n        );\n      } else {\n        columns.push(\n          {width: '20%', text: colSpaceText},\n          {width: '22%', text: colCreatedText},\n          {width: '5%', text: ''}\n        );\n      }\n\n      const table = (\n        <Fragment>\n          <table>\n            <thead>\n              <tr>\n                <th width=\"3%\" className=\"pl-2\">\n                  <input type=\"checkbox\" className=\"vam\" onChange={this.props.toggleSelectAllUsers} checked={isAllUsersSelected} />\n                </th>\n                {columns.map((item, index) => {\n                  return <th width={item.width} key={index}>{item.text}</th>;\n                })}\n              </tr>\n            </thead>\n            <tbody>\n              {items.map((item, index) => {\n                return (<Item\n                  key={index}\n                  item={item}\n                  isItemFreezed={this.state.isItemFreezed}\n                  onFreezedItem={this.onFreezedItem}\n                  onUnfreezedItem={this.onUnfreezedItem}\n                  updateUser={this.props.updateUser}\n                  deleteUser={this.props.deleteUser}\n                  updateAdminRole={this.props.updateAdminRole}\n                  revokeAdmin={this.props.revokeAdmin}\n                  onUserSelected={this.props.onUserSelected}\n                  isAdmin={this.props.isAdmin}\n                  isLDAPImported={this.props.isLDAPImported}\n                />);\n              })}\n            </tbody>\n          </table>\n          {(!this.props.isAdmin && !this.props.isSearchResult) &&\n          <Paginator\n            gotoPreviousPage={this.getPreviousPage}\n            gotoNextPage={this.getNextPage}\n            currentPage={currentPage}\n            hasNextPage={hasNextPage}\n            curPerPage={curPerPage}\n            resetPerPage={this.props.resetPerPage}\n          />\n          }\n        </Fragment>\n      );\n\n      return items.length ? table : emptyTip;\n    }\n  }\n}\n\nclass Item extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      isOpIconShown: false,\n      highlight: false,\n      isSetQuotaDialogOpen: false,\n      isDeleteUserDialogOpen: false,\n      isResetUserPasswordDialogOpen: false,\n      isRevokeAdminDialogOpen: false\n    };\n  }\n\n  handleMouseEnter = () => {\n    if (!this.props.isItemFreezed) {\n      this.setState({\n        isOpIconShown: true,\n        highlight: true\n      });\n    }\n  }\n\n  handleMouseLeave = () => {\n    if (!this.props.isItemFreezed) {\n      this.setState({\n        isOpIconShown: false,\n        highlight: false\n      });\n    }\n  }\n\n  onUnfreezedItem = () => {\n    this.setState({\n      highlight: false,\n      isOpIconShow: false\n    });\n    this.props.onUnfreezedItem();\n  }\n\n  toggleSetQuotaDialog = () => {\n    this.setState({isSetQuotaDialogOpen: !this.state.isSetQuotaDialogOpen});\n  }\n\n  toggleDeleteUserDialog = () => {\n    this.setState({isDeleteUserDialogOpen: !this.state.isDeleteUserDialogOpen});\n  }\n\n  toggleResetUserPasswordDialog = () => {\n    this.setState({isResetUserPasswordDialogOpen: !this.state.isResetUserPasswordDialogOpen});\n  }\n\n  toggleRevokeAdminDialog = () => {\n    this.setState({isRevokeAdminDialogOpen: !this.state.isRevokeAdminDialogOpen});\n  }\n\n  onUserSelected = () => {\n    this.props.onUserSelected(this.props.item);\n  }\n\n  updateStatus= (value) => {\n    const isActive = value == 'active';\n    if (isActive) {\n      toaster.notify(gettext('It may take some time, please wait.'));\n    }\n    this.props.updateUser(this.props.item.email, 'is_active', isActive);\n  }\n\n  updateRole = (value) => {\n    this.props.updateUser(this.props.item.email, 'role', value);\n  }\n\n  updateAdminRole = (value) => {\n    this.props.updateAdminRole(this.props.item.email, value);\n  }\n\n  translateAdminRole = (role) => {\n    switch (role) {\n      case 'default_admin':\n        return gettext('Default Admin');\n      case 'system_admin':\n        return gettext('System Admin');\n      case 'daily_admin':\n        return gettext('Daily Admin');\n      case 'audit_admin':\n        return gettext('Audit Admin');\n      default:\n        return role;\n    }\n  }\n\n  updateInstitution = (value) => {\n    this.props.updateUser(this.props.item.email, 'institution', value);\n  }\n\n  translateInstitution = (inst) => {\n    return inst;\n  }\n\n  updateQuota = (value) => {\n    this.props.updateUser(this.props.item.email, 'quota_total', value);\n  }\n\n  deleteUser = () => {\n    toaster.notify(gettext('It may take some time, please wait.'));\n    this.props.deleteUser(this.props.item.email);\n  }\n\n  resetPassword = () => {\n    toaster.notify(gettext('It may take some time, please wait.'));\n    seafileAPI.sysAdminResetUserPassword(this.props.item.email).then(res => {\n      toaster.success(res.data.reset_tip);\n    }).catch((error) => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  revokeAdmin = () => {\n    const { item } = this.props;\n    this.props.revokeAdmin(item.email, item.name);\n  }\n\n  getMenuOperations = () => {\n    const {\n      isAdmin, isLDAPImported,\n      isSearchResult, item\n    } = this.props;\n    let list = ['Delete'];\n    if (!isLDAPImported ||\n      (isSearchResult && item.source == 'db')) {\n      list.push('Reset Password');\n    }\n    if (isAdmin) {\n      list = ['Revoke Admin'];\n    }\n    return list;\n  }\n\n  translateOperations = (item) => {\n    let translateResult = '';\n    switch (item) {\n      case 'Delete':\n        translateResult = gettext('Delete');\n        break;\n      case 'Reset Password':\n        translateResult = gettext('Reset Password');\n        break;\n      case 'Revoke Admin':\n        translateResult = gettext('Revoke Admin');\n        break;\n    }\n\n    return translateResult;\n  }\n\n  onMenuItemClick = (operation) => {\n    switch(operation) {\n      case 'Delete':\n        this.toggleDeleteUserDialog();\n        break;\n      case 'Reset Password':\n        this.toggleResetUserPasswordDialog();\n        break;\n      case 'Revoke Admin':\n        this.toggleRevokeAdminDialog();\n        break;\n      default:\n        break;\n    }\n  }\n\n  render() {\n    const { item, isAdmin } = this.props;\n    const {\n      isOpIconShown,\n      isSetQuotaDialogOpen,\n      isDeleteUserDialogOpen,\n      isResetUserPasswordDialogOpen,\n      isRevokeAdminDialogOpen\n    } = this.state;\n\n    const itemName = '<span class=\"op-target\">' + Utils.HTMLescape(item.name) + '</span>';\n    const deleteDialogMsg = gettext('Are you sure you want to delete {placeholder} ?').replace('{placeholder}', itemName);\n    const resetPasswordDialogMsg = gettext('Are you sure you want to reset the password of {placeholder} ?').replace('{placeholder}', itemName);\n    const revokeAdminDialogMsg = gettext('Are you sure you want to revoke the admin permission of {placeholder} ?').replace('{placeholder}', itemName);\n\n    return (\n      <Fragment>\n        <tr className={this.state.highlight ? 'tr-highlight' : ''} onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave}>\n          <td className=\"pl-2\">\n            <input type=\"checkbox\" className=\"vam\" onChange={this.onUserSelected} checked={item.isSelected} />\n          </td>\n          <td>\n            <UserLink email={item.email} name={item.name} />\n            {item.contact_email &&\n              <Fragment>\n                <br />\n                {item.contact_email}\n              </Fragment>}\n            {item.org_id &&\n              <Fragment>\n                <br />\n                <Link to={`${siteRoot}sys/organizations/${item.org_id}/info/`}>({item.org_name})</Link>\n              </Fragment>\n            }\n          </td>\n          <td>\n            <SysAdminUserStatusEditor\n              isTextMode={true}\n              isEditIconShow={isOpIconShown}\n              currentStatus={item.is_active ? 'active' : 'inactive'}\n              statusOptions={['active', 'inactive']}\n              onStatusChanged={this.updateStatus}\n            />\n          </td>\n          {isPro &&\n          <td>\n            {isAdmin ?\n              <SelectEditor\n                isTextMode={true}\n                isEditIconShow={isOpIconShown}\n                options={availableAdminRoles}\n                currentOption={item.admin_role}\n                onOptionChanged={this.updateAdminRole}\n                translateOption={this.translateAdminRole}\n              /> :\n              <SysAdminUserRoleEditor\n                isTextMode={true}\n                isEditIconShow={isOpIconShown}\n                currentRole={item.role}\n                roleOptions={availableRoles}\n                onRoleChanged={this.updateRole}\n              />\n            }\n          </td>\n          }\n          <td>\n            {`${Utils.bytesToSize(item.quota_usage)} / ${item.quota_total > 0 ? Utils.bytesToSize(item.quota_total) : '--'}`}\n            <span\n              title={gettext('Edit')}\n              className={`fa fa-pencil-alt attr-action-icon ${isOpIconShown ? '' : 'invisible'}`}\n              onClick={this.toggleSetQuotaDialog}>\n            </span>\n          </td>\n          {(multiInstitution && !isAdmin) &&\n            <td>\n              <SelectEditor\n                isTextMode={true}\n                isEditIconShow={isOpIconShown && institutions.length > 0}\n                options={institutions}\n                currentOption={item.institution}\n                onOptionChanged={this.updateInstitution}\n                translateOption={this.translateInstitution}\n              />\n            </td>\n          }\n          <td>\n            {`${item.create_time ? moment(item.create_time).format('YYYY-MM-DD HH:mm') : '--'} /`}\n            <br />\n            {`${item.last_login ? moment(item.last_login).fromNow() : '--'}`}\n            <br />\n            {`${item.last_access_time ? moment(item.last_access_time).fromNow() : '--'}`}\n          </td>\n          <td>\n            {(item.email != username && isOpIconShown) &&\n            <OpMenu\n              operations={this.getMenuOperations()}\n              translateOperations={this.translateOperations}\n              onMenuItemClick={this.onMenuItemClick}\n              onFreezedItem={this.props.onFreezedItem}\n              onUnfreezedItem={this.onUnfreezedItem}\n            />\n            }\n          </td>\n        </tr>\n        {isSetQuotaDialogOpen &&\n          <SysAdminUserSetQuotaDialog\n            toggle={this.toggleSetQuotaDialog}\n            updateQuota={this.updateQuota}\n          />\n        }\n        {isDeleteUserDialogOpen &&\n          <CommonOperationConfirmationDialog\n            title={gettext('Delete User')}\n            message={deleteDialogMsg}\n            executeOperation={this.deleteUser}\n            confirmBtnText={gettext('Delete')}\n            toggleDialog={this.toggleDeleteUserDialog}\n          />\n        }\n        {isResetUserPasswordDialogOpen &&\n          <CommonOperationConfirmationDialog\n            title={gettext('Reset Password')}\n            message={resetPasswordDialogMsg}\n            executeOperation={this.resetPassword}\n            confirmBtnText={gettext('Reset')}\n            toggleDialog={this.toggleResetUserPasswordDialog}\n          />\n        }\n        {isRevokeAdminDialogOpen &&\n          <CommonOperationConfirmationDialog\n            title={gettext('Revoke Admin')}\n            message={revokeAdminDialogMsg}\n            executeOperation={this.revokeAdmin}\n            confirmBtnText={gettext('Revoke')}\n            toggleDialog={this.toggleRevokeAdminDialog}\n          />\n        }\n      </Fragment>\n    );\n  }\n}\n\nexport default Content;\n","import React, { Component, Fragment } from 'react';\nimport { navigate } from '@reach/router';\nimport { Button } from 'reactstrap';\nimport PropTypes from 'prop-types';\nimport { Utils } from '../../../utils/utils';\nimport { seafileAPI } from '../../../utils/seafile-api';\nimport { isPro, gettext, siteRoot } from '../../../utils/constants';\nimport toaster from '../../../components/toast';\nimport SysAdminUserSetQuotaDialog from '../../../components/dialog/sysadmin-dialog/set-quota';\nimport SysAdminImportUserDialog from '../../../components/dialog/sysadmin-dialog/sysadmin-import-user-dialog';\nimport SysAdminAddUserDialog from '../../../components/dialog/sysadmin-dialog/sysadmin-add-user-dialog';\nimport SysAdminBatchAddAdminDialog from '../../../components/dialog/sysadmin-dialog/sysadmin-batch-add-admin-dialog';\nimport CommonOperationConfirmationDialog from '../../../components/dialog/common-operation-confirmation-dialog';\nimport SysAdminUser from '../../../models/sysadmin-user';\nimport SysAdminAdminUser from '../../../models/sysadmin-admin-user';\nimport MainPanelTopbar from '../main-panel-topbar';\nimport Search from '../search';\nimport UsersNav from './users-nav';\nimport Content from './users-content';\n\nconst { availableRoles } = window.sysadmin.pageOptions;\n\nconst propTypes = {\n  isAdmin: PropTypes.bool,\n  isLDAPImported: PropTypes.bool\n};\n\nclass Users extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      loading: true,\n      errorMsg: '',\n      userList: [],\n      hasNextPage: false,\n      currentPage: 1,\n      perPage: 25,\n      hasUserSelected: false,\n      selectedUserList: [],\n      isAllUsersSelected: false,\n      isImportUserDialogOpen: false,\n      isAddUserDialogOpen: false,\n      isBatchSetQuotaDialogOpen: false,\n      isBatchDeleteUserDialogOpen: false,\n      isBatchAddAdminDialogOpen: false\n    };\n  }\n\n  componentDidMount () {\n    if (this.props.isAdmin) { // 'Admin' page\n      this.getUserList(); // no pagination\n    } else {\n      let urlParams = (new URL(window.location)).searchParams;\n      const {\n        currentPage, perPage,\n        sortBy = '',\n        sortOrder = 'asc'\n      } = this.state;\n      this.setState({\n        perPage: parseInt(urlParams.get('per_page') || perPage),\n        currentPage: parseInt(urlParams.get('page') || currentPage),\n        sortBy: urlParams.get('order_by') || sortBy,\n        sortOrder: urlParams.get('direction') || sortOrder\n      }, () => {\n        this.getUsersListByPage(this.state.currentPage);\n      });\n    }\n  }\n\n  toggleImportUserDialog = () => {\n    this.setState({isImportUserDialogOpen: !this.state.isImportUserDialogOpen});\n  }\n\n  toggleAddUserDialog = () => {\n    this.setState({isAddUserDialogOpen: !this.state.isAddUserDialogOpen});\n  }\n\n  toggleBatchSetQuotaDialog = () => {\n    this.setState({isBatchSetQuotaDialogOpen: !this.state.isBatchSetQuotaDialogOpen});\n  }\n\n  toggleBatchDeleteUserDialog = () => {\n    this.setState({isBatchDeleteUserDialogOpen: !this.state.isBatchDeleteUserDialogOpen});\n  }\n\n  onUserSelected = (item) => {\n    let hasUserSelected = false;\n    let selectedUserList = [];\n    // traverse all users, toggle its selected status\n    let users = this.state.userList.map(user => {\n      // toggle status\n      if (user.email === item.email) {\n        user.isSelected = !user.isSelected;\n      }\n      // update selectedUserList\n      // if current user is now selected, push it to selectedUserList\n      // if current user is now not selected, drop it from selectedUserList\n      if (user.isSelected == true) {\n        hasUserSelected = true;\n        selectedUserList.push(user);\n      } else {\n        selectedUserList = selectedUserList.filter(thisuser => {\n          return thisuser.email != user.email;\n        });\n      }\n      return user;\n    });\n    // finally update state\n    this.setState({\n      userList: users,\n      hasUserSelected: hasUserSelected,\n      selectedUserList: selectedUserList,\n    });\n  }\n\n  toggleSelectAllUsers = () => {\n    if (this.state.isAllUsersSelected) {\n      // if previous state is allSelected, toggle to not select\n      let users = this.state.userList.map(user => {\n        user.isSelected = false;\n        return user;\n      });\n      this.setState({\n        userList: users,\n        hasUserSelected: false,\n        isAllUsersSelected: false,\n        selectedUserList: [],\n      });\n    } else {\n      // if previous state is not allSelected, toggle to selectAll\n      let users = this.state.userList.map(user => {\n        user.isSelected = true;\n        return user;\n      });\n      this.setState({\n        userList: users,\n        hasUserSelected: true,\n        isAllUsersSelected: true,\n        selectedUserList: users\n      });\n    }\n  }\n\n  getUserList = () => {\n  // get admins\n    seafileAPI.sysAdminListAdmins().then(res => {\n      let users = res.data.admin_user_list.map(user => {\n        return new SysAdminAdminUser(user);\n      });\n      this.setState({\n        userList: users,\n        loading: false\n      });\n    }).catch((error) => {\n      this.setState({\n        loading: false,\n        errorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403\n      });\n    });\n  }\n\n  getUsersListByPage = (page) => {\n    const { perPage, sortBy, sortOrder } = this.state;\n    const { isLDAPImported } = this.props;\n    seafileAPI.sysAdminListUsers(page, perPage, isLDAPImported, sortBy, sortOrder).then(res => {\n      let users = res.data.data.map(user => {return new SysAdminUser(user);});\n      this.setState({\n        userList: users,\n        loading: false,\n        hasNextPage: Utils.hasNextPage(page, perPage, res.data.total_count),\n        currentPage: page\n      });\n    }).catch((error) => {\n      this.setState({\n        loading: false,\n        errorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403\n      });\n    });\n  }\n\n  sortByQuotaUsage = () => {\n    this.setState({\n      sortBy: 'quota_usage',\n      sortOrder: this.state.sortOrder == 'asc' ? 'desc' : 'asc',\n      currentPage: 1\n    }, () => {\n      let url = new URL(location.href);\n      let searchParams = new URLSearchParams(url.search);\n      const { currentPage, sortBy, sortOrder } = this.state;\n      searchParams.set('page', currentPage);\n      searchParams.set('order_by', sortBy);\n      searchParams.set('direction', sortOrder);\n      url.search = searchParams.toString();\n      navigate(url.toString());\n      this.getUsersListByPage(currentPage);\n    });\n  }\n\n  deleteUser = (email) => {\n    seafileAPI.sysAdminDeleteUser(email).then(res => {\n      let newUserList = this.state.userList.filter(item => {\n        return item.email != email;\n      });\n      this.setState({userList: newUserList});\n      toaster.success(gettext('Successfully deleted 1 item.'));\n    }).catch((error) => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  setUserQuotaInBatch = (quotaTotal) => {\n    let emails = this.state.selectedUserList.map(user => {\n      return user.email;\n    });\n    seafileAPI.sysAdminSetUserQuotaInBatch(emails, quotaTotal).then(res => {\n      let userList = this.state.userList.map(item => {\n        res.data.success.map(resultUser => {\n          if (item.email == resultUser.email) {\n            item.quota_total = resultUser.quota_total;\n          }\n        });\n        return item;\n      });\n      this.setState({userList: userList});\n    }).catch((error) => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  deleteUserInBatch = () => {\n    let emails = this.state.selectedUserList.map(user => {\n      return user.email;\n    });\n    seafileAPI.sysAdminDeleteUserInBatch(emails).then(res => {\n      if (res.data.success.length) {\n        let oldUserList = this.state.userList;\n        let newUserList = oldUserList.filter(oldUser => {\n          return !res.data.success.some(deletedUser =>{\n            return deletedUser.email == oldUser.email;\n          });\n        });\n        this.setState({\n          userList: newUserList,\n          hasUserSelected: emails.length != res.data.success.length\n        });\n        const length = res.data.success.length;\n        const msg = length == 1 ?\n          gettext('Successfully deleted 1 user.') :\n          gettext('Successfully deleted {user_number_placeholder} users.')\n            .replace('{user_number_placeholder}', length);\n        toaster.success(msg);\n      }\n      res.data.failed.map(item => {\n        const msg = `${item.email}: ${item.error_msg}`;\n        toaster.danger(msg);\n      });\n    }).catch((error) => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  importUserInBatch = (file) => {\n    toaster.notify(gettext('It may take some time, please wait.'));\n    seafileAPI.sysAdminImportUserViaFile(file).then((res) => {\n      if (res.data.success.length) {\n        const users = res.data.success.map(item => {\n          if (item.institution == undefined) {\n            item.institution = '';\n          }\n          return new SysAdminUser(item);\n        });\n        this.setState({\n          userList: users.concat(this.state.userList)\n        });\n      }\n      res.data.failed.map(item => {\n        const msg = `${item.email}: ${item.error_msg}`;\n        toaster.danger(msg);\n      });\n    }).catch((error) => {\n      let errMsg = Utils.getErrorMsg(error);\n      toaster.danger(errMsg);\n    });\n  }\n\n  addUser = (data) => {\n    toaster.notify(gettext('It may take some time, please wait.'));\n    const { email, name, role, password } = data;\n    seafileAPI.sysAdminAddUser(email, name, role, password).then((res) => {\n      let userList = this.state.userList;\n      userList.unshift(res.data);\n      this.setState({\n        userList: userList\n      });\n      toaster.success(res.data.add_user_tip);\n    }).catch((error) => {\n      let errMsg = Utils.getErrorMsg(error);\n      toaster.danger(errMsg);\n    });\n  }\n\n  resetPerPage = (perPage) => {\n    this.setState({\n      perPage: perPage\n    }, () => {\n      this.getUsersListByPage(1);\n    });\n  }\n\n  updateUser = (email, key, value) => {\n    seafileAPI.sysAdminUpdateUser(email, key, value).then(res => {\n      let newUserList = this.state.userList.map(item => {\n        if (item.email == email) {\n          item[key]= res.data[key];\n        }\n        return item;\n      });\n      this.setState({userList: newUserList});\n      const msg = (key == 'is_active' && value) ?\n        res.data.update_status_tip : gettext('Edit succeeded');\n      toaster.success(msg);\n    }).catch((error) => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  updateAdminRole = (email, role) => {\n    seafileAPI.sysAdminUpdateAdminRole(email, role).then(res => {\n      let newUserList = this.state.userList.map(item => {\n        if (item.email == email) {\n          item.admin_role = res.data.role;\n        }\n        return item;\n      });\n      this.setState({userList: newUserList});\n      toaster.success(gettext('Edit succeeded'));\n    }).catch((error) => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  revokeAdmin = (email, name) => {\n    seafileAPI.sysAdminUpdateUser(email, 'is_staff', false).then(res => {\n      let userList = this.state.userList.filter(item => {\n        return item.email != email;\n      });\n      this.setState({\n        userList: userList\n      });\n      toaster.success(gettext('Successfully revoked the admin permission of {placeholder}.').replace('{placeholder}', name));\n    }).catch((error) => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  getOperationsForAll = () => {\n    const { isAdmin, isLDAPImported } = this.props;\n\n    if (isAdmin) {\n      return <Button className=\"btn btn-secondary operation-item\" onClick={this.toggleBatchAddAdminDialog}>{gettext('Add Admin')}</Button>;\n    }\n\n    if (isLDAPImported) {\n      return <a className=\"btn btn-secondary operation-item\" href={`${siteRoot}sys/useradmin/export-excel/`}>{gettext('Export Excel')}</a>;\n    }\n\n    // 'database'\n    return (\n      <Fragment>\n        <Button className=\"btn btn-secondary operation-item\" onClick={this.toggleImportUserDialog}>{gettext('Import Users')}</Button>\n        <Button className=\"btn btn-secondary operation-item\" onClick={this.toggleAddUserDialog}>{gettext('Add User')}</Button>\n        <a className=\"btn btn-secondary operation-item\" href={`${siteRoot}sys/useradmin/export-excel/`}>{gettext('Export Excel')}</a>\n      </Fragment>\n    );\n  }\n\n  getCurrentNavItem = () => {\n    const { isAdmin, isLDAPImported } = this.props;\n    let item = 'database';\n    if (isAdmin) {\n      item = 'admin';\n    } else if (isLDAPImported) {\n      item = 'ldap-imported';\n    }\n    return item;\n  }\n\n  toggleBatchAddAdminDialog = () => {\n    this.setState({isBatchAddAdminDialogOpen: !this.state.isBatchAddAdminDialogOpen});\n  }\n\n  addAdminInBatch = (emails) => {\n    seafileAPI.sysAdminAddAdminInBatch(emails).then(res => {\n      let users = res.data.success.map(user => {\n        return new SysAdminAdminUser(user);\n      });\n      this.setState({\n        userList: users.concat(this.state.userList)\n      });\n      res.data.failed.map(item => {\n        const msg = `${item.email}: ${item.error_msg}`;\n        toaster.danger(msg);\n      });\n    }).catch((error) => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  getSearch = () => {\n    if (this.props.isAdmin) {\n      return null;\n    }\n    // offer 'Search' for 'DB' & 'LDAPImported' users\n    return <Search\n      placeholder={gettext('Search users')}\n      submit={this.searchItems}\n    />;\n  }\n\n  searchItems = (keyword) => {\n    navigate(`${siteRoot}sys/search-users/?query=${encodeURIComponent(keyword)}`);\n  }\n\n  render() {\n    const { isAdmin, isLDAPImported } = this.props;\n    const {\n      hasUserSelected,\n      isImportUserDialogOpen,\n      isAddUserDialogOpen,\n      isBatchDeleteUserDialogOpen,\n      isBatchSetQuotaDialogOpen,\n      isBatchAddAdminDialogOpen\n    } = this.state;\n    return (\n      <Fragment>\n        <MainPanelTopbar search={this.getSearch()}>\n          {hasUserSelected ?\n            <Fragment>\n              <Button className=\"btn btn-secondary operation-item\" onClick={this.toggleBatchSetQuotaDialog}>{gettext('Set Quota')}</Button>\n              <Button className=\"btn btn-secondary operation-item\" onClick={this.toggleBatchDeleteUserDialog}>{gettext('Delete Users')}</Button>\n            </Fragment>\n            : this.getOperationsForAll()\n          }\n        </MainPanelTopbar>\n        <div className=\"main-panel-center flex-row\">\n          <div className=\"cur-view-container\">\n            <UsersNav currentItem={this.getCurrentNavItem()} />\n            <div className=\"cur-view-content\">\n              <Content\n                isAdmin={isAdmin}\n                isLDAPImported={isLDAPImported}\n                loading={this.state.loading}\n                errorMsg={this.state.errorMsg}\n                items={this.state.userList}\n                sortBy={this.state.sortBy}\n                sortOrder={this.state.sortOrder}\n                sortByQuotaUsage={this.sortByQuotaUsage}\n                currentPage={this.state.currentPage}\n                hasNextPage={this.state.hasNextPage}\n                curPerPage={this.state.perPage}\n                resetPerPage={this.resetPerPage}\n                getListByPage={this.getUsersListByPage}\n                updateUser={this.updateUser}\n                deleteUser={this.deleteUser}\n                updateAdminRole={this.updateAdminRole}\n                revokeAdmin={this.revokeAdmin}\n                onUserSelected={this.onUserSelected}\n                isAllUsersSelected={this.isAllUsersSelected}\n                toggleSelectAllUsers={this.toggleSelectAllUsers}\n              />\n            </div>\n          </div>\n        </div>\n        {isImportUserDialogOpen &&\n        <SysAdminImportUserDialog\n          toggle={this.toggleImportUserDialog}\n          importUserInBatch={this.importUserInBatch}\n        />\n        }\n        {isAddUserDialogOpen &&\n          <SysAdminAddUserDialog\n            dialogTitle={gettext('Add User')}\n            showRole={isPro}\n            availableRoles={availableRoles}\n            addUser={this.addUser}\n            toggleDialog={this.toggleAddUserDialog}\n          />\n        }\n        {isBatchSetQuotaDialogOpen &&\n          <SysAdminUserSetQuotaDialog\n            toggle={this.toggleBatchSetQuotaDialog}\n            updateQuota={this.setUserQuotaInBatch}\n          />\n        }\n        {isBatchDeleteUserDialogOpen &&\n          <CommonOperationConfirmationDialog\n            title={gettext('Delete Users')}\n            message={gettext('Are you sure you want to delete the selected user(s) ?')}\n            executeOperation={this.deleteUserInBatch}\n            confirmBtnText={gettext('Delete')}\n            toggleDialog={this.toggleBatchDeleteUserDialog}\n          />\n        }\n        {isBatchAddAdminDialogOpen &&\n          <SysAdminBatchAddAdminDialog\n            addAdminInBatch={this.addAdminInBatch}\n            toggle={this.toggleBatchAddAdminDialog}\n          />\n        }\n      </Fragment>\n    );\n  }\n}\n\nUsers.propTypes = propTypes;\n\nexport default Users;\n","import React, { Component, Fragment } from 'react';\nimport Users from './users';\n\nclass AdminUsers extends Component {\n\n  render() {\n    return <Users isAdmin={true} />;\n  }\n}\n\nexport default AdminUsers;\n","import React, { Component, Fragment } from 'react';\nimport Users from './users';\n\nclass LDAPImportedUsers extends Component {\n\n  render() {\n    return <Users isLDAPImported={true} />;\n  }\n}\n\nexport default LDAPImportedUsers;\n","import React, { Component, Fragment } from 'react';\nimport moment from 'moment';\nimport { Utils } from '../../../utils/utils';\nimport { seafileAPI } from '../../../utils/seafile-api';\nimport { gettext, siteRoot } from '../../../utils/constants';\nimport EmptyTip from '../../../components/empty-tip';\nimport Loading from '../../../components/loading';\nimport Paginator from '../../../components/paginator';\nimport UsersNav from './users-nav';\nimport MainPanelTopbar from '../main-panel-topbar';\nimport UserLink from '../user-link';\n\nclass Content extends Component {\n\n  constructor(props) {\n    super(props);\n  }\n\n  getPreviousPage = () => {\n    this.props.getListByPage(this.props.currentPage - 1);\n  }\n\n  getNextPage = () => {\n    this.props.getListByPage(this.props.currentPage + 1);\n  }\n\n  render() {\n    const { loading, errorMsg, items, curPerPage, hasNextPage, currentPage } = this.props;\n    if (loading) {\n      return <Loading />;\n    } else if (errorMsg) {\n      return <p className=\"error text-center mt-4\">{errorMsg}</p>;\n    } else {\n      const emptyTip = (\n        <EmptyTip>\n          <h2>{gettext('No users')}</h2>\n        </EmptyTip>\n      );\n      const table = (\n        <Fragment>\n          <table className=\"table-hover\">\n            <thead>\n              <tr>\n                <th width=\"40%\">{gettext('Email')}</th>\n                <th width=\"30%\">{gettext('Space Used')}{' / '}{gettext('Quota')}</th>\n                <th width=\"30%\">{gettext('Last Login')}</th>\n              </tr>\n            </thead>\n            <tbody>\n              {items.map((item, index) => {\n                return (<Item\n                  key={index}\n                  item={item}\n                />);\n              })}\n            </tbody>\n          </table>\n          <Paginator\n            gotoPreviousPage={this.getPreviousPage}\n            gotoNextPage={this.getNextPage}\n            currentPage={currentPage}\n            hasNextPage={hasNextPage}\n            curPerPage={curPerPage}\n            resetPerPage={this.props.resetPerPage}\n          />\n        </Fragment>\n      );\n\n      return items.length ? table : emptyTip;\n    }\n  }\n}\n\nclass Item extends Component {\n\n  constructor(props) {\n    super(props);\n  }\n\n  render() {\n    const { item } = this.props;\n    let email = '<span class=\"op-target\">' + Utils.HTMLescape(item.email) + '</span>';\n    return (\n      <Fragment>\n        <tr>\n          <td><UserLink email={item.email} name={item.email} /></td>\n          <td>\n            {`${Utils.bytesToSize(item.quota_usage)} / ${item.quota_total > 0 ? Utils.bytesToSize(item.quota_total) : '--'}`}\n          </td>\n          <td>\n            {item.last_login ? moment(item.last_login).fromNow() : '--'}\n          </td>\n        </tr>\n      </Fragment>\n    );\n  }\n}\n\nclass Users extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      loading: true,\n      errorMsg: '',\n      userList: {},\n      hasNextPage: false,\n      currentPage: 1,\n      perPage: 25\n    };\n  }\n\n  componentDidMount () {\n    let urlParams = (new URL(window.location)).searchParams;\n    const { currentPage, perPage } = this.state;\n    this.setState({\n      perPage: parseInt(urlParams.get('per_page') || perPage),\n      currentPage: parseInt(urlParams.get('page') || currentPage)\n    }, () => {\n      this.getUsersListByPage(this.state.currentPage);\n    });\n  }\n\n  getUsersListByPage = (page) => {\n    let { perPage } = this.state;\n    seafileAPI.sysAdminListLDAPUsers(page, perPage).then(res => {\n      this.setState({\n        loading: false,\n        userList: res.data.ldap_user_list,\n        hasNextPage: res.data.has_next_page,\n        currentPage: page\n      });\n    }).catch((error) => {\n      this.setState({\n        loading: false,\n        errorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403\n      });\n    });\n  }\n\n  resetPerPage = (perPage) => {\n    this.setState({\n      perPage: perPage\n    }, () => {\n      this.getUsersListByPage(1);\n    });\n  }\n\n  render() {\n    return (\n      <Fragment>\n        <MainPanelTopbar />\n        <div className=\"main-panel-center flex-row\">\n          <div className=\"cur-view-container\">\n            <UsersNav currentItem=\"ldap\" />\n            <div className=\"cur-view-content\">\n              <Content\n                resetPerPage={this.resetPerPage}\n                loading={this.state.loading}\n                errorMsg={this.state.errorMsg}\n                items={this.state.userList}\n                currentPage={this.state.currentPage}\n                hasNextPage={this.state.hasNextPage}\n                curPerPage={this.state.perPage}\n                getListByPage={this.getUsersListByPage}\n              />\n            </div>\n          </div>\n        </div>\n      </Fragment>\n    );\n  }\n}\n\nexport default Users;\n","import React, { Component, Fragment } from 'react';\nimport { Button, Form, FormGroup, Input, Col } from 'reactstrap';\nimport { Utils } from '../../../utils/utils';\nimport { seafileAPI } from '../../../utils/seafile-api';\nimport { gettext } from '../../../utils/constants';\nimport Paginator from '../../../components/paginator';\nimport toaster from '../../../components/toast';\nimport SysAdminUserSetQuotaDialog from '../../../components/dialog/sysadmin-dialog/set-quota';\nimport CommonOperationConfirmationDialog from '../../../components/dialog/common-operation-confirmation-dialog';\nimport MainPanelTopbar from '../main-panel-topbar';\nimport Content from './users-content';\n\n\nclass SearchUsers extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      query: '',\n      isSubmitBtnActive: false,\n      loading: true,\n      errorMsg: '',\n      userList: [],\n      pageInfo: {\n        has_next_page: false,\n        current_page: 1,\n      },\n      currentPage: 1,\n      perPage: 25,\n      hasUserSelected: false,\n      selectedUserList: [],\n      isAllUsersSelected: false,\n      isBatchSetQuotaDialogOpen: false,\n      isBatchDeleteUserDialogOpen: false\n    };\n  }\n\n  componentDidMount () {\n    let params = (new URL(document.location)).searchParams;\n    const { currentPage, perPage } = this.state;\n    this.setState({\n      query: params.get('query') || '',\n      currentPage: parseInt(params.get('page') || currentPage),\n      perPage: parseInt(params.get('per_page') || perPage)\n    }, () => {this.getItems(this.state.currentPage);});\n  }\n\n  toggleBatchSetQuotaDialog = () => {\n    this.setState({isBatchSetQuotaDialogOpen: !this.state.isBatchSetQuotaDialogOpen});\n  }\n\n  toggleBatchDeleteUserDialog = () => {\n    this.setState({isBatchDeleteUserDialogOpen: !this.state.isBatchDeleteUserDialogOpen});\n  }\n\n  onUserSelected = (item) => {\n    let hasUserSelected = false;\n    let selectedUserList = [];\n    // traverse all users, toggle its selected status\n    let users = this.state.userList.map(user => {\n      // toggle status\n      if (user.email === item.email) {\n        user.isSelected = !user.isSelected;\n      }\n      // update selectedUserList\n      // if current user is now selected, push it to selectedUserList\n      // if current user is now not selected, drop it from selectedUserList\n      if (user.isSelected == true) {\n        hasUserSelected = true;\n        selectedUserList.push(user);\n      } else {\n        selectedUserList = selectedUserList.filter(thisuser => {\n          return thisuser.email != user.email;\n        });\n      }\n      return user;\n    });\n    // finally update state\n    this.setState({\n      userList: users,\n      hasUserSelected: hasUserSelected,\n      selectedUserList: selectedUserList,\n    });\n  }\n\n  toggleSelectAllUsers = () => {\n    if (this.state.isAllUsersSelected) {\n      // if previous state is allSelected, toggle to not select\n      let users = this.state.userList.map(user => {\n        user.isSelected = false;\n        return user;\n      });\n      this.setState({\n        userList: users,\n        hasUserSelected: false,\n        isAllUsersSelected: false,\n        selectedUserList: [],\n      });\n    } else {\n      // if previous state is not allSelected, toggle to selectAll\n      let users = this.state.userList.map(user => {\n        user.isSelected = true;\n        return user;\n      });\n      this.setState({\n        userList: users,\n        hasUserSelected: true,\n        isAllUsersSelected: true,\n        selectedUserList: users\n      });\n    }\n  }\n\n  getItems = (page) => {\n    seafileAPI.sysAdminSearchUsers(this.state.query.trim(), page, this.state.perPage).then(res => {\n      this.setState({\n        userList: res.data.user_list,\n        loading: false,\n        pageInfo: res.data.page_info\n      });\n    }).catch((error) => {\n      this.setState({\n        loading: false,\n        errorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403\n      });\n    });\n  }\n\n  resetPerPage = (perPage) => {\n    this.setState({\n      perPage: perPage\n    }, () => {\n      this.getItems(1);\n    });\n  }\n\n  deleteUser = (email) => {\n    seafileAPI.sysAdminDeleteUser(email).then(res => {\n      let newUserList = this.state.userList.filter(item => {\n        return item.email != email;\n      });\n      this.setState({userList: newUserList});\n      toaster.success(gettext('Successfully deleted 1 item.'));\n    }).catch((error) => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  setUserQuotaInBatch = (quotaTotal) => {\n    let emails = this.state.selectedUserList.map(user => {\n      return user.email;\n    });\n    seafileAPI.sysAdminSetUserQuotaInBatch(emails, quotaTotal).then(res => {\n      let userList = this.state.userList.map(item => {\n        res.data.success.map(resultUser => {\n          if (item.email == resultUser.email) {\n            item.quota_total = resultUser.quota_total;\n          }\n        });\n        return item;\n      });\n      this.setState({userList: userList});\n    }).catch((error) => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  deleteUserInBatch = () => {\n    let emails = this.state.selectedUserList.map(user => {\n      return user.email;\n    });\n    seafileAPI.sysAdminDeleteUserInBatch(emails).then(res => {\n      if (res.data.success.length) {\n        let oldUserList = this.state.userList;\n        let newUserList = oldUserList.filter(oldUser => {\n          return !res.data.success.some(deletedUser =>{\n            return deletedUser.email == oldUser.email;\n          });\n        });\n        this.setState({\n          userList: newUserList,\n          hasUserSelected: emails.length != res.data.success.length\n        });\n        const length = res.data.success.length;\n        const msg = length == 1 ?\n          gettext('Successfully deleted 1 user.') :\n          gettext('Successfully deleted {user_number_placeholder} users.')\n            .replace('{user_number_placeholder}', length);\n        toaster.success(msg);\n      }\n      res.data.failed.map(item => {\n        const msg = `${item.email}: ${item.error_msg}`;\n        toaster.danger(msg);\n      });\n    }).catch((error) => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  updateUser = (email, key, value) => {\n    seafileAPI.sysAdminUpdateUser(email, key, value).then(res => {\n      let newUserList = this.state.userList.map(item => {\n        if (item.email == email) {\n          item[key]= res.data[key];\n        }\n        return item;\n      });\n      this.setState({userList: newUserList});\n      const msg = (key == 'is_active' && value) ?\n        res.data.update_status_tip : gettext('Edit succeeded');\n      toaster.success(msg);\n    }).catch((error) => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  updateAdminRole = (email, role) => {\n    seafileAPI.sysAdminUpdateAdminRole(email, role).then(res => {\n      let newUserList = this.state.userList.map(item => {\n        if (item.email == email) {\n          item.admin_role = res.data.role;\n        }\n        return item;\n      });\n      this.setState({userList: newUserList});\n      toaster.success(gettext('Edit succeeded'));\n    }).catch((error) => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  revokeAdmin = (email, name) => {\n    seafileAPI.sysAdminUpdateUser(email, 'is_staff', false).then(res => {\n      let userList = this.state.userList.filter(item => {\n        return item.email != email;\n      });\n      this.setState({\n        userList: userList\n      });\n      toaster.success(gettext('Successfully revoked the admin permission of {placeholder}.').replace('{placeholder}', name));\n    }).catch((error) => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  handleInputChange = (e) => {\n    this.setState({\n      query: e.target.value\n    }, this.checkSubmitBtnActive);\n  }\n\n  checkSubmitBtnActive = () => {\n    const { query } = this.state;\n    this.setState({\n      isSubmitBtnActive: query.trim()\n    });\n  }\n\n  getPreviousPageList = () => {\n    this.getItems(this.state.pageInfo.current_page - 1);\n  }\n\n  getNextPageList = () => {\n    this.getItems(this.state.pageInfo.current_page + 1);\n  }\n\n  render() {\n    const { query, isSubmitBtnActive } = this.state;\n    const {\n      hasUserSelected,\n      isBatchDeleteUserDialogOpen,\n      isBatchSetQuotaDialogOpen\n    } = this.state;\n    return (\n      <Fragment>\n        {hasUserSelected ?\n          <MainPanelTopbar>\n            <Fragment>\n              <Button className=\"btn btn-secondary operation-item\" onClick={this.toggleBatchSetQuotaDialog}>{gettext('Set Quota')}</Button>\n              <Button className=\"btn btn-secondary operation-item\" onClick={this.toggleBatchDeleteUserDialog}>{gettext('Delete Users')}</Button>\n            </Fragment>\n          </MainPanelTopbar> :\n          <MainPanelTopbar />\n        }\n        <div className=\"main-panel-center flex-row\">\n          <div className=\"cur-view-container\">\n            <div className=\"cur-view-path\">\n              <h3 className=\"sf-heading\">{gettext('Users')}</h3>\n            </div>\n            <div className=\"cur-view-content\">\n              <div className=\"mt-4 mb-6\">\n                <h4 className=\"border-bottom font-weight-normal mb-2 pb-1\">{gettext('Search Users')}</h4>\n                <Form>\n                  <FormGroup row>\n                    <Col sm={5}>\n                      <Input type=\"text\" name=\"query\" value={query} placeholder={gettext('Search users')} onChange={this.handleInputChange} />\n                    </Col>\n                  </FormGroup>\n                  <FormGroup row>\n                    <Col sm={{size: 5}}>\n                      <button className=\"btn btn-outline-primary\" disabled={!isSubmitBtnActive} onClick={this.getItems}>{gettext('Submit')}</button>\n                    </Col>\n                  </FormGroup>\n                </Form>\n              </div>\n              <div className=\"mt-4 mb-6\">\n                <h4 className=\"border-bottom font-weight-normal mb-2 pb-1\">{gettext('Result')}</h4>\n                <Content\n                  isLDAPImported={false}\n                  isAdmin={false}\n                  isSearchResult={true}\n                  loading={this.state.loading}\n                  errorMsg={this.state.errorMsg}\n                  items={this.state.userList}\n                  updateUser={this.updateUser}\n                  deleteUser={this.deleteUser}\n                  updateAdminRole={this.updateAdminRole}\n                  revokeAdmin={this.revokeAdmin}\n                  onUserSelected={this.onUserSelected}\n                  isAllUsersSelected={this.isAllUsersSelected}\n                  toggleSelectAllUsers={this.toggleSelectAllUsers}\n                />\n              </div>\n            </div>\n          </div>\n        </div>\n        {isBatchSetQuotaDialogOpen &&\n          <SysAdminUserSetQuotaDialog\n            toggle={this.toggleBatchSetQuotaDialog}\n            updateQuota={this.setUserQuotaInBatch}\n          />\n        }\n        {isBatchDeleteUserDialogOpen &&\n          <CommonOperationConfirmationDialog\n            title={gettext('Delete Users')}\n            message={gettext('Are you sure you want to delete the selected user(s) ?')}\n            executeOperation={this.deleteUserInBatch}\n            confirmBtnText={gettext('Delete')}\n            toggleDialog={this.toggleBatchDeleteUserDialog}\n          />\n        }\n        {this.state.pageInfo &&\n        <Paginator\n          gotoPreviousPage={this.getPreviousPageList}\n          gotoNextPage={this.getNextPageList}\n          currentPage={this.state.pageInfo.current_page}\n          hasNextPage={this.state.pageInfo.has_next_page}\n          curPerPage={this.state.perPage}\n          resetPerPage={this.resetPerPage}\n        />\n        }\n      </Fragment>\n    );\n  }\n}\n\nexport default SearchUsers;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Alert, Modal, ModalHeader, ModalBody, ModalFooter, Button, Form, FormGroup, Input, InputGroup, InputGroupAddon, InputGroupText } from 'reactstrap';\nimport { gettext } from '../../../utils/constants';\nimport { Utils } from '../../../utils/utils';\n\nconst propTypes = {\n  dialogTitle: PropTypes.string.isRequired,\n  updateValue: PropTypes.func.isRequired,\n  toggleDialog: PropTypes.func.isRequired\n};\n\nclass UpdateUser extends React.Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      value: this.props.value,\n      isSubmitBtnActive: false\n    };\n  }\n\n  handleInputChange = (e) => {\n    const value = e.target.value;\n    this.setState({\n      value: value\n    });\n  }\n\n  handleKeyPress = (e) => {\n    if (e.key == 'Enter') {\n      this.handleSubmit();\n      e.preventDefault();\n    }\n  }\n\n  handleSubmit = () => {\n    this.props.updateValue(this.state.value.trim());\n    this.props.toggleDialog();\n  }\n\n  render() {\n    const  { dialogTitle, toggleDialog } = this.props;\n    return (\n      <Modal isOpen={true} toggle={toggleDialog}>\n        <ModalHeader toggle={toggleDialog}>{this.props.dialogTitle}</ModalHeader>\n        <ModalBody>\n          <Form>\n            <FormGroup>\n              <Input\n                type=\"text\"\n                value={this.state.value}\n                onKeyPress={this.handleKeyPress}\n                onChange={this.handleInputChange}\n              />\n            </FormGroup>\n          </Form>\n        </ModalBody>\n        <ModalFooter>\n          <Button color=\"secondary\" onClick={toggleDialog}>{gettext('Cancel')}</Button>\n          <Button color=\"primary\" onClick={this.handleSubmit}>{gettext('Submit')}</Button>\n        </ModalFooter>\n      </Modal>\n    );\n  }\n}\n\nUpdateUser.propTypes = propTypes;\n\nexport default UpdateUser;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Link } from '@reach/router';\nimport { siteRoot, gettext } from '../../../utils/constants';\n\nconst propTypes = {\n  currentItem: PropTypes.string.isRequired\n};\n\nclass Nav extends React.Component {\n\n  constructor(props) {\n    super(props);\n    this.navItems = [\n      {name: 'info', urlPart: '', text: gettext('Info')},\n      {name: 'owned-repos', urlPart: 'owned-libraries', text: gettext('Owned Libraries')},\n      {name: 'shared-repos', urlPart: 'shared-libraries', text: gettext('Shared Libraries')},\n      {name: 'links', urlPart: 'shared-links', text: gettext('Shared Links')},\n      {name: 'groups', urlPart: 'groups', text: gettext('Groups')}\n    ];\n  }\n\n  render() {\n    const { currentItem, email, userName } = this.props;\n    return (\n      <div>\n        <div className=\"cur-view-path\">\n          <h3 className=\"sf-heading\"><Link to={`${siteRoot}sys/users/`}>{gettext('Users')}</Link> / {userName}</h3>\n        </div>\n        <ul className=\"nav border-bottom mx-4\">\n          {this.navItems.map((item, index) => {\n            return (\n              <li className=\"nav-item mr-2\" key={index}>\n                <Link to={`${siteRoot}sys/users/${encodeURIComponent(email)}/${item.urlPart}`} className={`nav-link ${currentItem == item.name ? ' active' : ''}`}>{item.text}</Link>\n              </li>\n            );\n          })}\n        </ul>\n      </div>\n    );\n  }\n}\n\nNav.propTypes = propTypes;\n\nexport default Nav;\n","import React, { Component, Fragment } from 'react';\nimport { FormGroup, Label, Input, Button } from 'reactstrap';\nimport { Utils } from '../../../utils/utils';\nimport { seafileAPI } from '../../../utils/seafile-api';\nimport { gettext } from '../../../utils/constants';\nimport toaster from '../../../components/toast';\nimport Loading from '../../../components/loading';\nimport SysAdminSetQuotaDialog from '../../../components/dialog/sysadmin-dialog/set-quota';\nimport SysAdminUpdateUserDialog from '../../../components/dialog/sysadmin-dialog/update-user';\nimport MainPanelTopbar from '../main-panel-topbar';\nimport Nav from './user-nav';\n\nconst { twoFactorAuthEnabled } = window.sysadmin.pageOptions;\n\nclass Content extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      currentKey: '',\n      dialogTitle: '',\n      isSetQuotaDialogOpen: false,\n      isUpdateUserDialogOpen: false\n    };\n  }\n\n  toggleSetQuotaDialog = () => {\n    this.setState({isSetQuotaDialogOpen: !this.state.isSetQuotaDialogOpen});\n  }\n\n  updateQuota = (value) => {\n    this.props.updateUser('quota_total', value);\n  }\n\n  toggleDialog = (key, dialogTitle) => {\n    this.setState({\n      currentKey: key,\n      dialogTitle: dialogTitle,\n      isUpdateUserDialogOpen: !this.state.isUpdateUserDialogOpen\n    });\n  }\n\n  toggleSetNameDialog = () => {\n    this.toggleDialog('name', gettext('Set Name'));\n  }\n\n  toggleSetUserLoginIDDialog = () => {\n    this.toggleDialog('login_id', gettext('Set Login ID'));\n  }\n\n toggleSetUserComtactEmailDialog = () => {\n   this.toggleDialog('contact_email', gettext('Set Contact Email'));\n }\n\n  toggleSetUserReferenceIDDialog = () => {\n    this.toggleDialog('reference_id', gettext('Set Reference ID'));\n  }\n\n  updateValue = (value) => {\n    this.props.updateUser(this.state.currentKey, value);\n  }\n\n  toggleUpdateUserDialog = () => {\n    this.toggleDialog('', '');\n  }\n\n  showEditIcon = (action) => {\n    return (\n      <span\n        title={gettext('Edit')}\n        className=\"fa fa-pencil-alt attr-action-icon\"\n        onClick={action}>\n      </span>\n    );\n  }\n\n  render() {\n    const { loading, errorMsg, userInfo } = this.props;\n    if (loading) {\n      return <Loading />;\n    } else if (errorMsg) {\n      return <p className=\"error text-center mt-4\">{errorMsg}</p>;\n    } else {\n      const user = this.props.userInfo;\n      const {\n        currentKey, dialogTitle,\n        isSetQuotaDialogOpen, isUpdateUserDialogOpen\n      } = this.state;\n      return (\n        <Fragment>\n          <dl className=\"m-0\">\n            <dt className=\"info-item-heading\">{gettext('Avatar')}</dt>\n            <dd className=\"info-item-content\">\n              <img src={user.avatar_url} alt={user.name} width=\"80\" className=\"rounded\"  />\n            </dd>\n\n            <dt className=\"info-item-heading\">{gettext('Email')}</dt>\n            <dd className=\"info-item-content\">{user.email}</dd>\n\n            {user.org_name &&\n              <Fragment>\n                <dt className=\"info-item-heading\">{gettext('Organization')}</dt>\n                <dd className=\"info-item-content\">{user.org_name}</dd>\n              </Fragment>\n            }\n\n            <dt className=\"info-item-heading\">{gettext('Name')}</dt>\n            <dd className=\"info-item-content\">\n              {user.name || '--'}\n              {this.showEditIcon(this.toggleSetNameDialog)}\n            </dd>\n\n            <dt className=\"info-item-heading\">{gettext('Login ID')}</dt>\n            <dd className=\"info-item-content\">\n              {user.login_id || '--'}\n              {this.showEditIcon(this.toggleSetUserLoginIDDialog)}\n            </dd>\n\n            <dt className=\"info-item-heading\">{gettext('Contact Email')}</dt>\n            <dd className=\"info-item-content\">\n              {user.contact_email || '--'}\n              {this.showEditIcon(this.toggleSetUserComtactEmailDialog)}\n            </dd>\n\n            <dt className=\"info-item-heading\">{gettext('Reference ID')}</dt>\n            <dd className=\"info-item-content\">\n              {user.reference_id|| '--'}\n              {this.showEditIcon(this.toggleSetUserReferenceIDDialog)}\n            </dd>\n\n            <dt className=\"info-item-heading\">{gettext('Space Used / Quota')}</dt>\n            <dd className=\"info-item-content\">\n              {`${Utils.bytesToSize(user.quota_usage)} / ${user.quota_total > 0 ? Utils.bytesToSize(user.quota_total) : '--'}`}\n              {this.showEditIcon(this.toggleSetQuotaDialog)}\n            </dd>\n\n            {twoFactorAuthEnabled &&\n              <Fragment>\n                <dt className=\"info-item-heading\">{gettext('Two-Factor Authentication')}</dt>\n                <dd className=\"info-item-content\">\n                  {user.has_default_device ?\n                    <FormGroup>\n                      <p className=\"mb-1\">{gettext('Status: enabled')}</p>\n                      <Button onClick={this.props.disable2FA}>{gettext('Disable Two-Factor Authentication')}</Button>\n                    </FormGroup> :\n                    <FormGroup>\n                      <Button disabled={true}>{gettext('Disable Two-Factor Authentication')}</Button>\n                    </FormGroup>\n                  }\n                  <FormGroup check>\n                    <Label check>\n                      <Input type=\"checkbox\" checked={user.is_force_2fa} onChange={this.props.toggleForce2fa} />\n                      <span>{gettext('Force Two-Factor Authentication')}</span>\n                    </Label>\n                  </FormGroup>\n                </dd>\n              </Fragment>\n            }\n          </dl>\n          {isSetQuotaDialogOpen &&\n          <SysAdminSetQuotaDialog\n            updateQuota={this.updateQuota}\n            toggle={this.toggleSetQuotaDialog}\n          />\n          }\n          {isUpdateUserDialogOpen &&\n          <SysAdminUpdateUserDialog\n            dialogTitle={dialogTitle}\n            value={user[currentKey]}\n            updateValue={this.updateValue}\n            toggleDialog={this.toggleUpdateUserDialog}\n          />\n          }\n        </Fragment>\n      );\n    }\n  }\n}\n\nclass User extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      loading: true,\n      errorMsg: '',\n      userInfo: {}\n    };\n  }\n\n  componentDidMount () {\n    // avatar size: 160\n    seafileAPI.sysAdminGetUser(this.props.email, 160).then((res) => {\n      this.setState({\n        loading: false,\n        userInfo: res.data\n      });\n    }).catch((error) => {\n      this.setState({\n        loading: false,\n        errorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403\n      });\n    });\n  }\n\n  updateUser = (key, value) => {\n    const email = this.state.userInfo.email;\n    seafileAPI.sysAdminUpdateUser(email, key, value).then(res => {\n      let userInfo = this.state.userInfo;\n      userInfo[key]= res.data[key];\n      this.setState({\n        userInfo: userInfo\n      });\n      toaster.success(gettext('Edit succeeded'));\n    }).catch((error) => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  disable2FA = () => {\n    const email = this.state.userInfo.email;\n    seafileAPI.sysAdminDeleteTwoFactorAuth(email).then(res => {\n      let userInfo = this.state.userInfo;\n      userInfo.has_default_device = false;\n      this.setState({\n        userInfo: userInfo\n      });\n    }).catch((error) => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  toggleForce2fa = (e) => {\n    const email = this.state.userInfo.email;\n    const checked = e.target.checked;\n    seafileAPI.sysAdminSetForceTwoFactorAuth(email, checked).then(res => {\n      let userInfo = this.state.userInfo;\n      userInfo.is_force_2fa = checked;\n      this.setState({\n        userInfo: userInfo\n      });\n    }).catch((error) => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  render() {\n    const { userInfo } = this.state;\n    return (\n      <Fragment>\n        <MainPanelTopbar />\n        <div className=\"main-panel-center flex-row\">\n          <div className=\"cur-view-container\">\n            <Nav currentItem=\"info\" email={this.props.email} userName={userInfo.name} />\n            <div className=\"cur-view-content\">\n              <Content\n                loading={this.state.loading}\n                errorMsg={this.state.errorMsg}\n                userInfo={this.state.userInfo}\n                updateUser={this.updateUser}\n                disable2FA={this.disable2FA}\n                toggleForce2fa={this.toggleForce2fa}\n              />\n            </div>\n          </div>\n        </div>\n      </Fragment>\n    );\n  }\n}\n\nexport default User;\n","import React, { Component, Fragment } from 'react';\nimport { Link } from '@reach/router';\nimport moment from 'moment';\nimport { Utils } from '../../../utils/utils';\nimport { seafileAPI } from '../../../utils/seafile-api';\nimport { isPro, siteRoot, gettext } from '../../../utils/constants';\nimport toaster from '../../../components/toast';\nimport EmptyTip from '../../../components/empty-tip';\nimport Loading from '../../../components/loading';\nimport CommonOperationConfirmationDialog from '../../../components/dialog/common-operation-confirmation-dialog';\nimport TransferDialog from '../../../components/dialog/transfer-dialog';\nimport OpMenu from '../../../components/dialog/op-menu';\nimport MainPanelTopbar from '../main-panel-topbar';\nimport Nav from './user-nav';\n\nconst { enableSysAdminViewRepo } = window.sysadmin.pageOptions;\n\nclass Content extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      isItemFreezed: false\n    };\n  }\n\n  onFreezedItem = () => {\n    this.setState({isItemFreezed: true});\n  }\n\n  onUnfreezedItem = () => {\n    this.setState({isItemFreezed: false});\n  }\n\n  render() {\n    const { loading, errorMsg, items } = this.props;\n    if (loading) {\n      return <Loading />;\n    } else if (errorMsg) {\n      return <p className=\"error text-center mt-4\">{errorMsg}</p>;\n    } else {\n      const emptyTip = (\n        <EmptyTip>\n          <h2>{gettext('No libraries')}</h2>\n        </EmptyTip>\n      );\n      const table = (\n        <Fragment>\n          <table>\n            <thead>\n              <tr>\n                <th width=\"5%\"></th>\n                <th width=\"35%\">{gettext('Name')}</th>\n                <th width=\"30%\">{gettext('Size')}</th>\n                <th width=\"25%\">{gettext('Last Update')}</th>\n                <th width=\"5%\">{/* Operations */}</th>\n              </tr>\n            </thead>\n            <tbody>\n              {items.map((item, index) => {\n                return (<Item\n                  key={index}\n                  item={item}\n                  isItemFreezed={this.state.isItemFreezed}\n                  onFreezedItem={this.onFreezedItem}\n                  onUnfreezedItem={this.onUnfreezedItem}\n                  deleteRepo={this.props.deleteRepo}\n                  transferRepo={this.props.transferRepo}\n                />);\n              })}\n            </tbody>\n          </table>\n        </Fragment>\n      );\n      return items.length ? table : emptyTip;\n    }\n  }\n}\n\nclass Item extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      isOpIconShown: false,\n      highlight: false,\n      isDeleteDialogOpen: false,\n      isTransferDialogOpen: false\n    };\n  }\n\n  handleMouseEnter = () => {\n    if (!this.props.isItemFreezed) {\n      this.setState({\n        isOpIconShown: true,\n        highlight: true\n      });\n    }\n  }\n\n  handleMouseLeave = () => {\n    if (!this.props.isItemFreezed) {\n      this.setState({\n        isOpIconShown: false,\n        highlight: false\n      });\n    }\n  }\n\n  onUnfreezedItem = () => {\n    this.setState({\n      highlight: false,\n      isOpIconShow: false\n    });\n    this.props.onUnfreezedItem();\n  }\n\n  toggleDeleteDialog = () => {\n    this.setState({isDeleteDialogOpen: !this.state.isDeleteDialogOpen});\n  }\n\n  deleteRepo = () => {\n    this.props.deleteRepo(this.props.item.id);\n  }\n\n  toggleTransferDialog = () => {\n    this.setState({isTransferDialogOpen: !this.state.isTransferDialogOpen});\n  }\n\n  transferRepo = (owner) => {\n    this.props.transferRepo(this.props.item.id, owner.email);\n    this.toggleTransferDialog();\n  }\n\n  renderRepoName = () => {\n    const { item } = this.props;\n    const repo = item;\n    if (repo.name) {\n      if (isPro && enableSysAdminViewRepo && !repo.encrypted) {\n        return <Link to={`${siteRoot}sys/libraries/${repo.id}/`}>{repo.name}</Link>;\n      } else {\n        return repo.name;\n      }\n    } else {\n      return gettext('Broken ({repo_id_placeholder})')\n        .replace('{repo_id_placeholder}', repo.id);\n    }\n  }\n\n  translateOperations = (item) => {\n    let translateResult = '';\n    switch (item) {\n      case 'Delete':\n        translateResult = gettext('Delete');\n        break;\n      case 'Transfer':\n        translateResult = gettext('Transfer');\n        break;\n    }\n\n    return translateResult;\n  }\n\n  onMenuItemClick = (operation) => {\n    switch(operation) {\n      case 'Delete':\n        this.toggleDeleteDialog();\n        break;\n      case 'Transfer':\n        this.toggleTransferDialog();\n        break;\n    }\n  }\n\n  render() {\n    const { item } = this.props;\n    const { isOpIconShown, isDeleteDialogOpen, isTransferDialogOpen } = this.state;\n\n    const iconUrl = Utils.getLibIconUrl(item);\n    const iconTitle = Utils.getLibIconTitle(item);\n\n    const itemName = '<span class=\"op-target\">' + Utils.HTMLescape(item.name) + '</span>';\n    const deleteDialogMsg = gettext('Are you sure you want to delete {placeholder} ?').replace('{placeholder}', itemName);\n\n    return (\n      <Fragment>\n        <tr className={this.state.highlight ? 'tr-highlight' : ''} onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave}>\n          <td><img src={iconUrl} title={iconTitle} alt={iconTitle} width=\"24\" /></td>\n          <td>{this.renderRepoName()}</td>\n          <td>{Utils.bytesToSize(item.size)}</td>\n          <td>{moment(item.last_modified).fromNow()}</td>\n          <td>\n            {isOpIconShown &&\n            <OpMenu\n              operations={['Delete', 'Transfer']}\n              translateOperations={this.translateOperations}\n              onMenuItemClick={this.onMenuItemClick}\n              onFreezedItem={this.props.onFreezedItem}\n              onUnfreezedItem={this.onUnfreezedItem}\n            />\n            }\n          </td>\n        </tr>\n        {isDeleteDialogOpen &&\n          <CommonOperationConfirmationDialog\n            title={gettext('Delete Library')}\n            message={deleteDialogMsg}\n            executeOperation={this.deleteRepo}\n            confirmBtnText={gettext('Delete')}\n            toggleDialog={this.toggleDeleteDialog}\n          />\n        }\n        {isTransferDialogOpen &&\n        <TransferDialog\n          itemName={item.name}\n          submit={this.transferRepo}\n          canTransferToDept={false}\n          toggleDialog={this.toggleTransferDialog}\n        />\n        }\n      </Fragment>\n    );\n  }\n}\n\nclass Repos extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      loading: true,\n      errorMsg: '',\n      userInfo: {},\n      repoList: []\n    };\n  }\n\n  componentDidMount () {\n    seafileAPI.sysAdminGetUser(this.props.email).then((res) => {\n      this.setState({\n        userInfo: res.data\n      });\n    });\n    seafileAPI.sysAdminListReposByOwner(this.props.email).then(res => {\n      this.setState({\n        loading: false,\n        repoList: res.data.repos\n      });\n    }).catch((error) => {\n      this.setState({\n        loading: false,\n        errorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403\n      });\n    });\n  }\n\n  deleteRepo = (repoID) => {\n    seafileAPI.sysAdminDeleteRepo(repoID).then(res => {\n      let newRepoList = this.state.repoList.filter(item => {\n        return item.id != repoID;\n      });\n      this.setState({repoList: newRepoList});\n      toaster.success(gettext('Successfully deleted 1 item.'));\n    }).catch((error) => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  transferRepo = (repoID, email) => {\n    seafileAPI.sysAdminTransferRepo(repoID, email).then((res) => {\n      let newRepoList = this.state.repoList.filter(item => {\n        return item.id != repoID;\n      });\n      this.setState({repoList: newRepoList});\n      let message = gettext('Successfully transferred the library.');\n      toaster.success(message);\n    }).catch(error => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  render() {\n    return (\n      <Fragment>\n        <MainPanelTopbar />\n        <div className=\"main-panel-center flex-row\">\n          <div className=\"cur-view-container\">\n            <Nav currentItem=\"owned-repos\" email={this.props.email} userName={this.state.userInfo.name} />\n            <div className=\"cur-view-content\">\n              <Content\n                loading={this.state.loading}\n                errorMsg={this.state.errorMsg}\n                items={this.state.repoList}\n                deleteRepo={this.deleteRepo}\n                transferRepo={this.transferRepo}\n              />\n            </div>\n          </div>\n        </div>\n      </Fragment>\n    );\n  }\n}\n\nexport default Repos;\n","import React, { Component, Fragment } from 'react';\nimport { Link } from '@reach/router';\nimport moment from 'moment';\nimport { Utils } from '../../../utils/utils';\nimport { seafileAPI } from '../../../utils/seafile-api';\nimport { isPro, siteRoot, gettext } from '../../../utils/constants';\nimport EmptyTip from '../../../components/empty-tip';\nimport Loading from '../../../components/loading';\nimport MainPanelTopbar from '../main-panel-topbar';\nimport UserLink from '../user-link';\nimport Nav from './user-nav';\n\nconst { enableSysAdminViewRepo } = window.sysadmin.pageOptions;\n\nclass Content extends Component {\n\n  constructor(props) {\n    super(props);\n  }\n\n  render() {\n    const { loading, errorMsg, items } = this.props;\n    if (loading) {\n      return <Loading />;\n    } else if (errorMsg) {\n      return <p className=\"error text-center mt-4\">{errorMsg}</p>;\n    } else {\n      const emptyTip = (\n        <EmptyTip>\n          <h2>{gettext('No libraries')}</h2>\n        </EmptyTip>\n      );\n      const table = (\n        <Fragment>\n          <table className=\"table-hover\">\n            <thead>\n              <tr>\n                <th width=\"5%\"></th>\n                <th width=\"35%\">{gettext('Name')}</th>\n                <th width=\"20%\">{gettext('Share From')}</th>\n                <th width=\"20%\">{gettext('Size')}</th>\n                <th width=\"20%\">{gettext('Last Update')}</th>\n              </tr>\n            </thead>\n            <tbody>\n              {items.map((item, index) => {\n                return (<Item\n                  key={index}\n                  item={item}\n                />);\n              })}\n            </tbody>\n          </table>\n        </Fragment>\n      );\n      return items.length ? table : emptyTip;\n    }\n  }\n}\n\nclass Item extends Component {\n\n  constructor(props) {\n    super(props);\n  }\n\n  renderRepoName = () => {\n    const { item } = this.props;\n    const repo = item;\n    if (repo.name) {\n      if (isPro && enableSysAdminViewRepo && !repo.encrypted) {\n        return <Link to={`${siteRoot}sys/libraries/${repo.id}/`}>{repo.name}</Link>;\n      } else {\n        return repo.name;\n      }\n    } else {\n      return gettext('Broken ({repo_id_placeholder})')\n        .replace('{repo_id_placeholder}', repo.id);\n    }\n  }\n\n  getOwnerLink = () => {\n    let link;\n    const { item } = this.props;\n    const index = item.owner_email.indexOf('@seafile_group');\n    if (index == -1) {\n      link = <UserLink email={item.owner_email} name={item.owner_name} />;\n    } else {\n      const groupID = item.owner_email.substring(0, index);\n      link = <Link to={`${siteRoot}sys/departments/${groupID}/`}>{item.owner_name}</Link>;\n    }\n    return link;\n  }\n\n  render() {\n    const { item } = this.props;\n    const iconUrl = Utils.getLibIconUrl(item);\n    const iconTitle = Utils.getLibIconTitle(item);\n    return (\n      <Fragment>\n        <tr>\n          <td><img src={iconUrl} title={iconTitle} alt={iconTitle} width=\"24\" /></td>\n          <td>{this.renderRepoName()}</td>\n          <td>{this.getOwnerLink()}</td>\n          <td>{Utils.bytesToSize(item.size)}</td>\n          <td>{moment(item.last_modify).fromNow()}</td>\n        </tr>\n      </Fragment>\n    );\n  }\n}\n\nclass Repos extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      loading: true,\n      errorMsg: '',\n      userInfo: {},\n      repoList: []\n    };\n  }\n\n  componentDidMount () {\n    seafileAPI.sysAdminGetUser(this.props.email).then((res) => {\n      this.setState({\n        userInfo: res.data\n      });\n    });\n    seafileAPI.sysAdminListShareInRepos(this.props.email).then(res => {\n      this.setState({\n        loading: false,\n        repoList: res.data.repo_list\n      });\n    }).catch((error) => {\n      this.setState({\n        loading: false,\n        errorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403\n      });\n    });\n  }\n\n  render() {\n    return (\n      <Fragment>\n        <MainPanelTopbar />\n        <div className=\"main-panel-center flex-row\">\n          <div className=\"cur-view-container\">\n            <Nav currentItem=\"shared-repos\" email={this.props.email} userName={this.state.userInfo.name} />\n            <div className=\"cur-view-content\">\n              <Content\n                loading={this.state.loading}\n                errorMsg={this.state.errorMsg}\n                items={this.state.repoList}\n              />\n            </div>\n          </div>\n        </div>\n      </Fragment>\n    );\n  }\n}\n\nexport default Repos;\n","import React, { Component, Fragment } from 'react';\nimport { Utils } from '../../../utils/utils';\nimport { seafileAPI } from '../../../utils/seafile-api';\nimport { gettext } from '../../../utils/constants';\nimport toaster from '../../../components/toast';\nimport EmptyTip from '../../../components/empty-tip';\nimport Loading from '../../../components/loading';\nimport OpMenu from '../../../components/dialog/op-menu';\nimport LinkDialog from '../../../components/dialog/share-admin-link';\nimport MainPanelTopbar from '../main-panel-topbar';\nimport Nav from './user-nav';\n\nclass Content extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      isItemFreezed: false\n    };\n  }\n\n  onFreezedItem = () => {\n    this.setState({isItemFreezed: true});\n  }\n\n  onUnfreezedItem = () => {\n    this.setState({isItemFreezed: false});\n  }\n\n  render() {\n    const { loading, errorMsg, items } = this.props;\n    if (loading) {\n      return <Loading />;\n    } else if (errorMsg) {\n      return <p className=\"error text-center mt-4\">{errorMsg}</p>;\n    } else {\n      const emptyTip = (\n        <EmptyTip>\n          <h2>{gettext('No shared links')}</h2>\n        </EmptyTip>\n      );\n      const table = (\n        <Fragment>\n          <table>\n            <thead>\n              <tr>\n                <th width=\"5%\">{/* icon */}</th>\n                <th width=\"30%\">{gettext('Name')}</th>\n                <th width=\"20%\">{gettext('Size')}</th>\n                <th width=\"20%\">{gettext('Type')}</th>\n                <th width=\"20%\">{gettext('Visits')}</th>\n                <th width=\"5%\">{/* Operations */}</th>\n              </tr>\n            </thead>\n            <tbody>\n              {items.map((item, index) => {\n                return (<Item\n                  key={index}\n                  item={item}\n                  isItemFreezed={this.state.isItemFreezed}\n                  onFreezedItem={this.onFreezedItem}\n                  onUnfreezedItem={this.onUnfreezedItem}\n                  deleteItem={this.props.deleteItem}\n                />);\n              })}\n            </tbody>\n          </table>\n        </Fragment>\n      );\n      return items.length ? table : emptyTip;\n    }\n  }\n}\n\nclass Item extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      isOpIconShown: false,\n      highlight: false,\n      isLinkDialogOpen: false\n    };\n  }\n\n  handleMouseEnter = () => {\n    if (!this.props.isItemFreezed) {\n      this.setState({\n        isOpIconShown: true,\n        highlight: true\n      });\n    }\n  }\n\n  handleMouseLeave = () => {\n    if (!this.props.isItemFreezed) {\n      this.setState({\n        isOpIconShown: false,\n        highlight: false\n      });\n    }\n  }\n\n  onUnfreezedItem = () => {\n    this.setState({\n      highlight: false,\n      isOpIconShow: false\n    });\n    this.props.onUnfreezedItem();\n  }\n\n  toggleLinkDialog = () => {\n    this.setState({isLinkDialogOpen: !this.state.isLinkDialogOpen});\n  }\n\n  deleteItem = () => {\n    this.props.deleteItem(this.props.item);\n  }\n\n  translateOperations = (item) => {\n    let translateResult = '';\n    switch (item) {\n      case 'View':\n        translateResult = gettext('View');\n        break;\n      case 'Delete':\n        translateResult = gettext('Delete');\n        break;\n    }\n\n    return translateResult;\n  }\n\n  onMenuItemClick = (operation) => {\n    switch(operation) {\n      case 'View':\n        this.toggleLinkDialog();\n        break;\n      case 'Delete':\n        this.deleteItem();\n        break;\n    }\n  }\n\n  getRoleText = () => {\n    let roleText;\n    const { item } = this.props;\n    switch(item.role) {\n      case 'Owner':\n        roleText = gettext('Owner');\n        break;\n      case 'Admin':\n        roleText = gettext('Admin');\n        break;\n      case 'Member':\n        roleText = gettext('Member');\n        break;\n    }\n    return roleText;\n  }\n\n  getIconUrl = () => {\n    const { item } = this.props;\n    let url;\n    if (item.type == 'upload') {\n      url = Utils.getFolderIconUrl();\n    } else { // share link\n      if (item.is_dir) {\n        url = Utils.getFolderIconUrl();\n      } else {\n        url = Utils.getFileIconUrl(item.obj_name);\n      }\n    }\n    return url;\n  }\n\n  render() {\n    const { item } = this.props;\n    const { isOpIconShown, isLinkDialogOpen } = this.state;\n\n    return (\n      <Fragment>\n        <tr className={this.state.highlight ? 'tr-highlight' : ''} onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave}>\n          <td><img src={this.getIconUrl()} alt=\"\" width=\"24\" /></td>\n          <td>{item.obj_name == '/' ? item.repo_name : item.obj_name}</td>\n          {item.type == 'upload' ?\n            <Fragment>\n              <td></td>\n              <td>{gettext('Upload')}</td>\n            </Fragment> :\n            <Fragment>\n              <td>{item.is_dir ? null : Utils.bytesToSize(item.size)}</td>\n              <td>{gettext('Download')}</td>\n            </Fragment>\n          }\n          <td>{item.view_cnt}</td>\n          <td>\n            {isOpIconShown &&\n            <OpMenu\n              operations={['View', 'Delete']}\n              translateOperations={this.translateOperations}\n              onMenuItemClick={this.onMenuItemClick}\n              onFreezedItem={this.props.onFreezedItem}\n              onUnfreezedItem={this.onUnfreezedItem}\n            />\n            }\n          </td>\n        </tr>\n        {isLinkDialogOpen &&\n          <LinkDialog\n            link={item.link}\n            toggleDialog={this.toggleLinkDialog}\n          />\n        }\n      </Fragment>\n    );\n  }\n}\n\nclass Links extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      loading: true,\n      errorMsg: '',\n      userInfo: {},\n      uploadLinkItems: [],\n      shareLinkItems: []\n    };\n  }\n\n  componentDidMount () {\n    seafileAPI.sysAdminGetUser(this.props.email).then((res) => {\n      this.setState({\n        userInfo: res.data\n      });\n    });\n\n    seafileAPI.sysAdminListShareLinksByUser(this.props.email).then(res => {\n      const items = res.data.share_link_list.map(item => {\n        item.type = 'download';\n        return item;\n      });\n      items.sort((a, b) => {\n        return a.is_dir ? -1 : 1;\n      });\n      this.setState({\n        loading: false,\n        shareLinkItems: items\n      });\n    });\n    seafileAPI.sysAdminListUploadLinksByUser(this.props.email).then(res => {\n      const items = res.data.upload_link_list.map(item => {\n        item.type = 'upload';\n        return item;\n      });\n      this.setState({\n        loading: false,\n        uploadLinkItems: items\n      });\n    }).catch((error) => {\n      this.setState({\n        loading: false,\n        errorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403\n      });\n    });\n  }\n\n  deleteItem = (item) => {\n    const type = item.type;\n    const token = item.token;\n    if (type == 'download') {\n      seafileAPI.sysAdminDeleteShareLink(token).then(res => {\n        let items = this.state.shareLinkItems.filter(item=> {\n          return item.token != token;\n        });\n        this.setState({\n          shareLinkItems: items\n        });\n        toaster.success(gettext('Successfully deleted 1 item.'));\n      }).catch((error) => {\n        let errMessage = Utils.getErrorMsg(error);\n        toaster.danger(errMessage);\n      });\n    } else {\n      seafileAPI.sysAdminDeleteUploadLink(token).then(res => {\n        let items = this.state.uploadLinkItems.filter(item=> {\n          return item.token != token;\n        });\n        this.setState({\n          uploadLinkItems: items\n        });\n        toaster.success(gettext('Successfully deleted 1 item.'));\n      }).catch((error) => {\n        let errMessage = Utils.getErrorMsg(error);\n        toaster.danger(errMessage);\n      });\n    }\n  }\n\n  render() {\n    const { shareLinkItems, uploadLinkItems } = this.state;\n    return (\n      <Fragment>\n        <MainPanelTopbar />\n        <div className=\"main-panel-center flex-row\">\n          <div className=\"cur-view-container\">\n            <Nav currentItem=\"links\" email={this.props.email} userName={this.state.userInfo.name} />\n            <div className=\"cur-view-content\">\n              <Content\n                loading={this.state.loading}\n                errorMsg={this.state.errorMsg}\n                items={[].concat(uploadLinkItems, shareLinkItems)}\n                deleteItem={this.deleteItem}\n              />\n            </div>\n          </div>\n        </div>\n      </Fragment>\n    );\n  }\n}\n\nexport default Links;\n","import React, { Component, Fragment } from 'react';\nimport { Link } from '@reach/router';\nimport moment from 'moment';\nimport { Utils } from '../../../utils/utils';\nimport { seafileAPI } from '../../../utils/seafile-api';\nimport { siteRoot, gettext } from '../../../utils/constants';\nimport toaster from '../../../components/toast';\nimport EmptyTip from '../../../components/empty-tip';\nimport Loading from '../../../components/loading';\nimport OpMenu from '../../../components/dialog/op-menu';\nimport CommonOperationConfirmationDialog from '../../../components/dialog/common-operation-confirmation-dialog';\nimport MainPanelTopbar from '../main-panel-topbar';\nimport Nav from './user-nav';\n\nclass Content extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      isItemFreezed: false\n    };\n  }\n\n  onFreezedItem = () => {\n    this.setState({isItemFreezed: true});\n  }\n\n  onUnfreezedItem = () => {\n    this.setState({isItemFreezed: false});\n  }\n\n  render() {\n    const { loading, errorMsg, items } = this.props;\n    if (loading) {\n      return <Loading />;\n    } else if (errorMsg) {\n      return <p className=\"error text-center mt-4\">{errorMsg}</p>;\n    } else {\n      const emptyTip = (\n        <EmptyTip>\n          <h2>{gettext('No groups')}</h2>\n        </EmptyTip>\n      );\n      const table = (\n        <Fragment>\n          <table>\n            <thead>\n              <tr>\n                <th width=\"35%\">{gettext('Name')}</th>\n                <th width=\"30%\">{gettext('Role')}</th>\n                <th width=\"30%\">{gettext('Created At')}</th>\n                <th width=\"5%\">{/* Operations */}</th>\n              </tr>\n            </thead>\n            <tbody>\n              {items.map((item, index) => {\n                return (<Item\n                  key={index}\n                  item={item}\n                  isItemFreezed={this.state.isItemFreezed}\n                  onFreezedItem={this.onFreezedItem}\n                  onUnfreezedItem={this.onUnfreezedItem}\n                  deleteItem={this.props.deleteItem}\n                />);\n              })}\n            </tbody>\n          </table>\n        </Fragment>\n      );\n      return items.length ? table : emptyTip;\n    }\n  }\n}\n\nclass Item extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      isOpIconShown: false,\n      highlight: false,\n      isDeleteDialogOpen: false\n    };\n  }\n\n  handleMouseEnter = () => {\n    if (!this.props.isItemFreezed) {\n      this.setState({\n        isOpIconShown: true,\n        highlight: true\n      });\n    }\n  }\n\n  handleMouseLeave = () => {\n    if (!this.props.isItemFreezed) {\n      this.setState({\n        isOpIconShown: false,\n        highlight: false\n      });\n    }\n  }\n\n  onUnfreezedItem = () => {\n    this.setState({\n      highlight: false,\n      isOpIconShow: false\n    });\n    this.props.onUnfreezedItem();\n  }\n\n  toggleDeleteDialog = () => {\n    this.setState({isDeleteDialogOpen: !this.state.isDeleteDialogOpen});\n  }\n\n  deleteItem = () => {\n    this.props.deleteItem(this.props.item.id);\n  }\n\n  translateOperations = (item) => {\n    let translateResult = '';\n    switch (item) {\n      case 'Delete':\n        translateResult = gettext('Delete');\n        break;\n    }\n\n    return translateResult;\n  }\n\n  onMenuItemClick = (operation) => {\n    switch(operation) {\n      case 'Delete':\n        this.toggleDeleteDialog();\n        break;\n    }\n  }\n\n  getRoleText = () => {\n    let roleText;\n    const { item } = this.props;\n    switch(item.role) {\n      case 'Owner':\n        roleText = gettext('Owner');\n        break;\n      case 'Admin':\n        roleText = gettext('Admin');\n        break;\n      case 'Member':\n        roleText = gettext('Member');\n        break;\n    }\n    return roleText;\n  }\n\n  render() {\n    const { item } = this.props;\n    const { isOpIconShown, isDeleteDialogOpen } = this.state;\n\n    const itemName = '<span class=\"op-target\">' + Utils.HTMLescape(item.name) + '</span>';\n    const deleteDialogMsg = gettext('Are you sure you want to delete {placeholder} ?').replace('{placeholder}', itemName);\n\n    const url = item.parent_group_id == 0 ?\n      `${siteRoot}sys/groups/${item.id}/libraries/` :\n      `${siteRoot}sys/departments/${item.id}/`;\n\n    return (\n      <Fragment>\n        <tr className={this.state.highlight ? 'tr-highlight' : ''} onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave}>\n          <td><Link to={url}>{item.name}</Link></td>\n          <td>{this.getRoleText()}</td>\n          <td>{moment(item.created_at).format('YYYY-MM-DD HH:mm')}</td>\n          <td>\n            {(isOpIconShown && item.parent_group_id == 0) &&\n            <OpMenu\n              operations={['Delete']}\n              translateOperations={this.translateOperations}\n              onMenuItemClick={this.onMenuItemClick}\n              onFreezedItem={this.props.onFreezedItem}\n              onUnfreezedItem={this.onUnfreezedItem}\n            />\n            }\n          </td>\n        </tr>\n        {isDeleteDialogOpen &&\n          <CommonOperationConfirmationDialog\n            title={gettext('Delete Group')}\n            message={deleteDialogMsg}\n            executeOperation={this.deleteItem}\n            confirmBtnText={gettext('Delete')}\n            toggleDialog={this.toggleDeleteDialog}\n          />\n        }\n      </Fragment>\n    );\n  }\n}\n\nclass Groups extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      loading: true,\n      errorMsg: '',\n      userInfo: {},\n      items: []\n    };\n  }\n\n  componentDidMount () {\n    seafileAPI.sysAdminGetUser(this.props.email).then((res) => {\n      this.setState({\n        userInfo: res.data\n      });\n    });\n    seafileAPI.sysAdminListGroupsJoinedByUser(this.props.email).then(res => {\n      this.setState({\n        loading: false,\n        items: res.data.group_list\n      });\n    }).catch((error) => {\n      this.setState({\n        loading: false,\n        errorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403\n      });\n    });\n  }\n\n  deleteItem = (groupID) => {\n    seafileAPI.sysAdminDismissGroupByID(groupID).then(res => {\n      let items = this.state.items.filter(item => {\n        return item.id != groupID;\n      });\n      this.setState({items: items});\n      toaster.success(gettext('Successfully deleted 1 item.'));\n    }).catch((error) => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  render() {\n    return (\n      <Fragment>\n        <MainPanelTopbar />\n        <div className=\"main-panel-center flex-row\">\n          <div className=\"cur-view-container\">\n            <Nav currentItem=\"groups\" email={this.props.email} userName={this.state.userInfo.name} />\n            <div className=\"cur-view-content\">\n              <Content\n                loading={this.state.loading}\n                errorMsg={this.state.errorMsg}\n                items={this.state.items}\n                deleteItem={this.deleteItem}\n              />\n            </div>\n          </div>\n        </div>\n      </Fragment>\n    );\n  }\n}\n\nexport default Groups;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Button, Modal, ModalHeader, Input, ModalBody, ModalFooter, Form, FormGroup, Label, Alert } from 'reactstrap';\nimport { gettext } from '../../../utils/constants';\nimport UserSelect from '../../user-select';\n\n\nconst propTypes = {\n  createRepo: PropTypes.func.isRequired,\n  toggleDialog: PropTypes.func.isRequired,\n};\n\nclass SysAdminCreateRepoDialog extends React.Component {\n  constructor(props) {\n    super(props);\n    this.state = {\n      repoName: '',\n      ownerEmail: '',\n      errMessage: '',\n      isSubmitBtnActive: false\n    };\n    this.newInput = React.createRef();\n  }\n\n  handleRepoNameChange = (e) => {\n    const value = e.target.value;\n    this.setState({\n      repoName: value,\n      isSubmitBtnActive: value.trim()\n    });\n  }\n\n  handleSubmit = () => {\n    const { repoName, ownerEmail } = this.state;\n    this.props.createRepo(repoName.trim(), ownerEmail);\n    this.toggle();\n  }\n\n  handleSelectChange = (option) => {\n    // option can be null\n    this.setState({\n      ownerEmail: option ? option.email : ''\n    });\n  }\n\n  handleKeyPress = (e) => {\n    if (e.key === 'Enter') {\n      this.handleSubmit();\n      e.preventDefault();\n    }\n  }\n\n  toggle = () => {\n    this.props.toggleDialog();\n  }\n\n  componentDidMount() {\n    this.newInput.focus();\n  }\n\n  render() {\n    return (\n      <Modal isOpen={true} toggle={this.toggle}>\n        <ModalHeader toggle={this.toggle}>{gettext('New Library')}</ModalHeader>\n        <ModalBody>\n          <Form>\n            <FormGroup>\n              <Label for=\"repoName\">{gettext('Name')}</Label>\n              <Input\n                id=\"repoName\"\n                onKeyPress={this.handleKeyPress}\n                innerRef={input => {this.newInput = input;}}\n                value={this.state.repoName}\n                onChange={this.handleRepoNameChange}\n              />\n            </FormGroup>\n            <FormGroup>\n              <Label for=\"userSelect\">\n                {gettext('Owner')}\n                <span className=\"small text-secondary\">{gettext('(If left blank, owner will be admin)')}</span>\n              </Label>\n              <UserSelect\n                id=\"userSelect\"\n                isMulti={false}\n                className=\"reviewer-select\"\n                placeholder={gettext('Select a user')}\n                onSelectChange={this.handleSelectChange}\n              />\n            </FormGroup>\n          </Form>\n          {this.state.errMessage && <Alert color=\"danger\">{this.state.errMessage}</Alert>}\n        </ModalBody>\n        <ModalFooter>\n          <Button color=\"secondary\" onClick={this.toggle}>{gettext('Cancel')}</Button>\n          <Button color=\"primary\" onClick={this.handleSubmit} disabled={!this.state.isSubmitBtnActive}>{gettext('Submit')}</Button>\n        </ModalFooter>\n      </Modal>\n    );\n  }\n}\n\nSysAdminCreateRepoDialog.propTypes = propTypes;\n\nexport default SysAdminCreateRepoDialog;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Link } from '@reach/router';\nimport { siteRoot, gettext } from '../../../utils/constants';\n\nconst propTypes = {\n  currentItem: PropTypes.string.isRequired\n};\n\nclass Nav extends React.Component {\n\n  constructor(props) {\n    super(props);\n    this.navItems = [\n      {name: 'all', urlPart: 'all-libraries', text: gettext('All')},\n      {name: 'system', urlPart: 'system-library', text: gettext('System')},\n      {name: 'trash', urlPart: 'trash-libraries', text: gettext('Trash')}\n    ];\n  }\n\n  render() {\n    const { currentItem } = this.props;\n    return (\n      <div className=\"cur-view-path tab-nav-container\">\n        <ul className=\"nav\">\n          {this.navItems.map((item, index) => {\n            return (\n              <li className=\"nav-item\" key={index}>\n                <Link to={`${siteRoot}sys/${item.urlPart}/`} className={`nav-link${currentItem == item.name ? ' active' : ''}`}>{item.text}</Link>\n              </li>\n            );\n          })}\n        </ul>\n      </div>\n    );\n  }\n}\n\nNav.propTypes = propTypes;\n\nexport default Nav;\n","import React, { Fragment } from 'react';\nimport PropTypes from 'prop-types';\nimport { isPro, gettext, siteRoot } from '../../../utils/constants';\nimport { Button } from 'reactstrap';\nimport { seafileAPI } from '../../../utils/seafile-api.js';\nimport { Utils } from '../../../utils/utils';\nimport toaster from '../../toast';\nimport UserSelect from '../../user-select';\nimport SharePermissionEditor from '../../select-editor/share-permission-editor';\n\nclass UserItem extends React.Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      isOperationShow: false\n    };\n  }\n\n  onMouseEnter = () => {\n    this.setState({isOperationShow: true});\n  }\n\n  onMouseLeave = () => {\n    this.setState({isOperationShow: false});\n  }\n\n  deleteShareItem = () => {\n    let item = this.props.item;\n    this.props.deleteShareItem(item.user_email);\n  }\n\n  onChangeUserPermission = (permission) => {\n    let item = this.props.item;\n    this.props.onChangeUserPermission(item, permission);\n  }\n\n  render() {\n    let item = this.props.item;\n    let currentPermission = item.is_admin ? 'admin' : item.permission;\n    return (\n      <tr onMouseEnter={this.onMouseEnter} onMouseLeave={this.onMouseLeave}>\n        <td className=\"name\">{item.user_name}</td>\n        <td>\n          <SharePermissionEditor\n            isTextMode={true}\n            isEditIconShow={this.state.isOperationShow}\n            currentPermission={currentPermission}\n            permissions={this.props.permissions}\n            onPermissionChanged={this.onChangeUserPermission}\n          />\n        </td>\n        <td>\n          <span\n            className={`sf2-icon-x3 action-icon ${this.state.isOperationShow ? '' : 'hide'}`}\n            onClick={this.deleteShareItem}\n            title={gettext('Delete')}\n          >\n          </span>\n        </td>\n      </tr>\n    );\n  }\n}\n\nclass UserList extends React.Component {\n\n  render() {\n    let items = this.props.items;\n    return (\n      <tbody>\n        {items.map((item, index) => {\n          return (\n            <UserItem\n              key={index}\n              item={item}\n              permissions={this.props.permissions}\n              deleteShareItem={this.props.deleteShareItem}\n              onChangeUserPermission={this.props.onChangeUserPermission}\n            />\n          );\n        })}\n      </tbody>\n    );\n  }\n}\n\nconst propTypes = {\n  isGroupOwnedRepo: PropTypes.bool,\n  itemPath: PropTypes.string.isRequired,\n  itemType: PropTypes.string.isRequired,\n  repoID: PropTypes.string.isRequired\n};\n\nclass SysAdminShareToUser extends React.Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      selectedOption: null,\n      errorMsg: [],\n      permission: 'rw',\n      sharedItems: []\n    };\n    this.options = [];\n    this.permissions = ['rw', 'r'];\n    if (isPro) {\n      this.permissions.push('admin', 'cloud-edit', 'preview');\n    }\n  }\n\n  handleSelectChange = (option) => {\n    this.setState({selectedOption: option});\n    this.options = [];\n  }\n\n  componentDidMount() {\n    let repoID = this.props.repoID;\n    seafileAPI.sysAdminListRepoSharedItems(repoID, 'user').then((res) => {\n      if(res.data.length !== 0) {\n        this.setState({sharedItems: res.data});\n      }\n    }).catch(error => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  setPermission = (permission) => {\n    this.setState({permission: permission});\n  }\n\n  shareToUser = () => {\n    let users = [];\n    let repoID = this.props.repoID;\n    if (this.state.selectedOption && this.state.selectedOption.length > 0 ) {\n      for (let i = 0; i < this.state.selectedOption.length; i ++) {\n        users[i] = this.state.selectedOption[i].email;\n      }\n    }\n    seafileAPI.sysAdminAddRepoSharedItem(repoID, 'user' , users, this.state.permission).then(res => {\n      let errorMsg = [];\n      if (res.data.failed.length > 0) {\n        for (let i = 0 ; i < res.data.failed.length ; i++) {\n          errorMsg[i] = res.data.failed[i];\n        }\n      }\n      let newItems = res.data.success;\n      this.setState({\n        errorMsg: errorMsg,\n        sharedItems: this.state.sharedItems.concat(newItems),\n        selectedOption: null,\n        permission: 'rw',\n      });\n      this.refs.userSelect.clearSelect();\n    }).catch(error => {\n      if (error.response) {\n        let message = gettext('Library can not be shared to owner.');\n        let errMessage = [];\n        errMessage.push(message);\n        this.setState({\n          errorMsg: errMessage,\n          selectedOption: null,\n        });\n      }\n    });\n  }\n\n  deleteShareItem = (useremail) => {\n    let repoID = this.props.repoID;\n    seafileAPI.sysAdminDeleteRepoSharedItem(repoID, 'user', useremail).then(res => {\n      this.setState({\n        sharedItems: this.state.sharedItems.filter( item => { return item.user_email !== useremail; })\n      });\n    }).catch(error => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  onChangeUserPermission = (item, permission) => {\n    let repoID = this.props.repoID;\n    let userEmail = item.user_email;\n    seafileAPI.sysAdminUpdateRepoSharedItemPermission(repoID, 'user', userEmail, permission).then(() => {\n      this.updateSharedItems(item, permission);\n    }).catch(error => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  updateSharedItems = (item, permission) => {\n    let username = item.user_name;\n    let sharedItems = this.state.sharedItems.map(sharedItem => {\n      let sharedItemUsername = sharedItem.user_name;\n      if (username === sharedItemUsername) {\n        sharedItem.permission = permission;\n        sharedItem.is_admin = permission === 'admin' ? true : false;\n      }\n      return sharedItem;\n    });\n    this.setState({sharedItems: sharedItems});\n  }\n\n  render() {\n    let { sharedItems } = this.state;\n    return (\n      <Fragment>\n        <table>\n          <thead>\n            <tr>\n              <th width=\"50%\">{gettext('User')}</th>\n              <th width=\"35%\">{gettext('Permission')}</th>\n              <th width=\"15%\"></th>\n            </tr>\n          </thead>\n          <tbody>\n            <tr>\n              <td>\n                <UserSelect\n                  ref=\"userSelect\"\n                  isMulti={true}\n                  className=\"reviewer-select\"\n                  placeholder={gettext('Search users...')}\n                  onSelectChange={this.handleSelectChange}\n                />\n              </td>\n              <td>\n                <SharePermissionEditor\n                  isTextMode={false}\n                  isEditIconShow={false}\n                  currentPermission={this.state.permission}\n                  permissions={this.permissions}\n                  onPermissionChanged={this.setPermission}\n                />\n              </td>\n              <td>\n                <Button onClick={this.shareToUser}>{gettext('Submit')}</Button>\n              </td>\n            </tr>\n            {this.state.errorMsg.length > 0 &&\n              this.state.errorMsg.map((item, index) => {\n                let errMessage = '';\n                if (item.email) {\n                  errMessage = item.email + ': ' + item.error_msg;\n                } else {\n                  errMessage = item;\n                }\n                return (\n                  <tr key={index}>\n                    <td colSpan={3}><p className=\"error\">{errMessage}</p></td>\n                  </tr>\n                );\n              })\n            }\n          </tbody>\n        </table>\n        <div className=\"share-list-container\">\n          <table className=\"table-thead-hidden\">\n            <thead>\n              <tr>\n                <th width=\"50%\">{gettext('User')}</th>\n                <th width=\"35%\">{gettext('Permission')}</th>\n                <th width=\"15%\"></th>\n              </tr>\n            </thead>\n            <UserList\n              items={sharedItems}\n              permissions={this.permissions}\n              deleteShareItem={this.deleteShareItem}\n              onChangeUserPermission={this.onChangeUserPermission}\n            />\n          </table>\n        </div>\n      </Fragment>\n    );\n  }\n}\n\nSysAdminShareToUser.propTypes = propTypes;\n\nexport default SysAdminShareToUser;\n","import React, { Fragment } from 'react';\nimport PropTypes from 'prop-types';\nimport { Button } from 'reactstrap';\nimport Select from 'react-select';\nimport makeAnimated from 'react-select/lib/animated';\nimport { isPro, gettext } from '../../../utils/constants';\nimport { seafileAPI } from '../../../utils/seafile-api.js';\nimport { Utils } from '../../../utils/utils';\nimport toaster from '../../toast';\nimport SharePermissionEditor from '../../select-editor/share-permission-editor';\n\nclass GroupItem extends React.Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      isOperationShow: false\n    };\n  }\n\n  onMouseEnter = () => {\n    this.setState({isOperationShow: true});\n  }\n\n  onMouseLeave = () => {\n    this.setState({isOperationShow: false});\n  }\n\n  deleteShareItem = () => {\n    let item = this.props.item;\n    this.props.deleteShareItem(item.group_id);\n  }\n\n  onChangeUserPermission = (permission) => {\n    let item = this.props.item;\n    this.props.onChangeUserPermission(item, permission);\n  }\n\n  render() {\n    let item = this.props.item;\n    let currentPermission = item.is_admin ? 'admin' : item.permission;\n    return (\n      <tr onMouseEnter={this.onMouseEnter} onMouseLeave={this.onMouseLeave}>\n        <td className='name'>{item.group_name}</td>\n        <td>\n          <SharePermissionEditor\n            isTextMode={true}\n            isEditIconShow={this.state.isOperationShow}\n            currentPermission={currentPermission}\n            permissions={this.props.permissions}\n            onPermissionChanged={this.onChangeUserPermission}\n          />\n        </td>\n        <td>\n          <span\n            className={`sf2-icon-x3 action-icon ${this.state.isOperationShow ? '' : 'hide'}`}\n            onClick={this.deleteShareItem}\n            title={gettext('Delete')}\n          >\n          </span>\n        </td>\n      </tr>\n    );\n  }\n}\n\nclass GroupList extends React.Component {\n\n  render() {\n    let items = this.props.items;\n    return (\n      <tbody>\n        {items.map((item, index) => {\n          return (\n            <GroupItem\n              key={index}\n              item={item}\n              permissions={this.props.permissions}\n              deleteShareItem={this.props.deleteShareItem}\n              onChangeUserPermission={this.props.onChangeUserPermission}\n            />\n          );\n        })}\n      </tbody>\n    );\n  }\n}\n\nconst propTypes = {\n  isGroupOwnedRepo: PropTypes.bool,\n  itemPath: PropTypes.string.isRequired,\n  itemType: PropTypes.string.isRequired,\n  repoID: PropTypes.string.isRequired,\n  isRepoOwner: PropTypes.bool.isRequired,\n};\n\nconst NoOptionsMessage = (props) => {\n  return (\n    <div {...props.innerProps} style={{margin: '6px 10px', textAlign: 'center', color: 'hsl(0,0%,50%)'}}>{gettext('Group not found')}</div>\n  );\n};\n\nclass SysAdminShareToGroup extends React.Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      selectedOption: null,\n      errorMsg: [],\n      permission: 'rw',\n      sharedItems: []\n    };\n    this.options = [];\n    this.permissions = ['rw', 'r'];\n    if (isPro) {\n      this.permissions.push('admin', 'cloud-edit', 'preview');\n    }\n  }\n\n  handleSelectChange = (option) => {\n    this.setState({selectedOption: option});\n  }\n\n  componentDidMount() {\n    this.loadOptions();\n    this.listSharedGroups();\n  }\n\n  loadOptions = () => {\n    seafileAPI.shareableGroups().then((res) => {\n      this.options = [];\n      for (let i = 0 ; i < res.data.length; i++) {\n        let obj = {};\n        obj.value = res.data[i].name;\n        obj.id = res.data[i].id;\n        obj.label = res.data[i].name;\n        this.options.push(obj);\n      }\n    }).catch(error => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  listSharedGroups = () => {\n    let repoID = this.props.repoID;\n    seafileAPI.sysAdminListRepoSharedItems(repoID, 'group').then((res) => {\n      if(res.data.length !== 0) {\n        this.setState({\n          sharedItems: res.data\n        });\n      }\n    }).catch(error => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  setPermission = (permission) => {\n    this.setState({permission: permission});\n  }\n\n  shareToGroup = () => {\n    let groups = [];\n    let repoID = this.props.repoID;\n    if (this.state.selectedOption && this.state.selectedOption.length > 0 ) {\n      for (let i = 0; i < this.state.selectedOption.length; i ++) {\n        groups[i] = this.state.selectedOption[i].id;\n      }\n    }\n    seafileAPI.sysAdminAddRepoSharedItem(repoID, 'group', groups, this.state.permission).then(res => {\n      let errorMsg = [];\n      if (res.data.failed.length > 0) {\n        for (let i = 0 ; i < res.data.failed.length ; i++) {\n          errorMsg[i] = res.data.failed[i];\n        }\n      }\n      let items = res.data.success;\n      this.setState({\n        errorMsg: errorMsg,\n        sharedItems: this.state.sharedItems.concat(items),\n        selectedOption: null,\n        permission: 'rw',\n      });\n    }).catch(error => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  deleteShareItem = (groupID) => {\n    let repoID = this.props.repoID;\n    seafileAPI.sysAdminDeleteRepoSharedItem(repoID, 'group', groupID).then(() => {\n      this.setState({\n        sharedItems: this.state.sharedItems.filter(item => { return item.group_id !== groupID; })\n      });\n    }).catch(error => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  onChangeUserPermission = (item, permission) => {\n    let repoID = this.props.repoID;\n    let groupID = item.group_id;\n    seafileAPI.sysAdminUpdateRepoSharedItemPermission(repoID, 'group', groupID, permission).then(() => {\n      this.updateSharedItems(item, permission);\n    }).catch(error => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  updateSharedItems = (item, permission) => {\n    let groupID = item.group_id;\n    let sharedItems = this.state.sharedItems.map(sharedItem => {\n      let sharedItemGroupID = sharedItem.group_id;\n      if (groupID === sharedItemGroupID) {\n        sharedItem.permission = permission;\n        sharedItem.is_admin = permission === 'admin' ? true : false;\n      }\n      return sharedItem;\n    });\n    this.setState({sharedItems: sharedItems});\n  }\n\n  render() {\n    return (\n      <Fragment>\n        <table>\n          <thead>\n            <tr>\n              <th width=\"50%\">{gettext('Group')}</th>\n              <th width=\"35%\">{gettext('Permission')}</th>\n              <th width=\"15%\"></th>\n            </tr>\n          </thead>\n          <tbody>\n            <tr>\n              <td>\n                <Select\n                  isMulti\n                  onChange={this.handleSelectChange}\n                  options={this.options}\n                  placeholder={gettext('Select groups...')}\n                  components={makeAnimated()}\n                  maxMenuHeight={200}\n                  inputId={'react-select-2-input'}\n                  value={this.state.selectedOption}\n                  components={{ NoOptionsMessage }}\n                />\n              </td>\n              <td>\n                <SharePermissionEditor\n                  isTextMode={false}\n                  isEditIconShow={false}\n                  currentPermission={this.state.permission}\n                  permissions={this.permissions}\n                  onPermissionChanged={this.setPermission}\n                />\n              </td>\n              <td>\n                <Button onClick={this.shareToGroup}>{gettext('Submit')}</Button>\n              </td>\n            </tr>\n            {this.state.errorMsg.length > 0 &&\n              this.state.errorMsg.map((item, index) => {\n                let errMessage = item.group_name + ': ' + item.error_msg;\n                return (\n                  <tr key={index}>\n                    <td colSpan={3}><p className=\"error\">{errMessage}</p></td>\n                  </tr>\n                );\n              })\n            }\n          </tbody>\n        </table>\n        <div className=\"share-list-container\">\n          <table className=\"table-thead-hidden\">\n            <thead>\n              <tr>\n                <th width=\"50%\">{gettext('Group')}</th>\n                <th width=\"35%\">{gettext('Permission')}</th>\n                <th width=\"15%\"></th>\n              </tr>\n            </thead>\n            <GroupList\n              items={this.state.sharedItems}\n              permissions={this.permissions}\n              deleteShareItem={this.deleteShareItem}\n              onChangeUserPermission={this.onChangeUserPermission}\n            />\n          </table>\n        </div>\n      </Fragment>\n    );\n  }\n}\n\nSysAdminShareToGroup.propTypes = propTypes;\n\nexport default SysAdminShareToGroup;\n","import React, { Fragment } from 'react';\nimport PropTypes from 'prop-types';\nimport { Modal, ModalHeader, ModalBody, TabContent, TabPane, Nav, NavItem, NavLink } from 'reactstrap';\nimport { gettext } from '../../../utils/constants';\nimport SysAdminShareToUser from './sysadmin-share-to-user';\nimport SysAdminShareToGroup from './sysadmin-share-to-group';\nimport '../../../css/share-link-dialog.css';\n\nconst propTypes = {\n  itemName: PropTypes.string.isRequired,\n  itemPath: PropTypes.string.isRequired,\n  toggleDialog: PropTypes.func.isRequired,\n  repoID: PropTypes.string.isRequired,\n  isGroupOwnedRepo: PropTypes.bool.isRequired,\n  repoEncrypted: PropTypes.bool,\n  userPerm: PropTypes.string,\n  enableDirPrivateShare: PropTypes.bool\n};\n\nclass SysAdminShareDialog extends React.Component {\n  constructor(props) {\n    super(props);\n    this.state = {\n      activeTab: this.getInitialActiveTab(),\n      isRepoOwner: false\n    };\n  }\n\n  getInitialActiveTab = () => {\n    return 'shareToUser';\n  }\n\n  toggle = (tab) => {\n    if (this.state.activeTab !== tab) {\n      this.setState({activeTab: tab});\n    }\n  }\n\n  renderDirContent = () => {\n    let activeTab = this.state.activeTab;\n    const { enableDirPrivateShare, isGroupOwnedRepo } = this.props;\n    return (\n      <Fragment>\n        <div className=\"share-dialog-side\">\n          <Nav pills>\n            {enableDirPrivateShare &&\n              <Fragment>\n                <NavItem>\n                  <NavLink className={activeTab === 'shareToUser' ? 'active' : ''} onClick={this.toggle.bind(this, 'shareToUser')}>\n                    {gettext('Share to user')}\n                  </NavLink>\n                </NavItem>\n                <NavItem>\n                  <NavLink className={activeTab === 'shareToGroup' ? 'active' : ''} onClick={this.toggle.bind(this, 'shareToGroup')}>\n                    {gettext('Share to group')}\n                  </NavLink>\n                </NavItem>\n              </Fragment>\n            }\n          </Nav>\n        </div>\n        <div className=\"share-dialog-main\">\n          <TabContent activeTab={this.state.activeTab}>\n            {enableDirPrivateShare &&\n              <Fragment>\n                <TabPane tabId=\"shareToUser\">\n                  <SysAdminShareToUser itemType={'library'} isGroupOwnedRepo={isGroupOwnedRepo} itemPath={this.props.itemPath} repoID={this.props.repoID} isRepoOwner={this.state.isRepoOwner}/>\n                </TabPane>\n                <TabPane tabId=\"shareToGroup\">\n                  <SysAdminShareToGroup itemType={'library'} isGroupOwnedRepo={isGroupOwnedRepo} itemPath={this.props.itemPath} repoID={this.props.repoID} isRepoOwner={this.state.isRepoOwner}/>\n                </TabPane>\n              </Fragment>\n            }\n          </TabContent>\n        </div>\n      </Fragment>\n    );\n  }\n\n  render() {\n    return (\n      <div>\n        <Modal isOpen={true} style={{maxWidth: '720px'}} className=\"share-dialog\" toggle={this.props.toggleDialog}>\n          <ModalHeader toggle={this.props.toggleDialog}>{gettext('Share')} <span className=\"op-target\" title={this.props.itemName}>{this.props.itemName}</span></ModalHeader>\n          <ModalBody className=\"share-dialog-content\">\n            {this.renderDirContent()}\n          </ModalBody>\n        </Modal>\n      </div>\n    );\n  }\n}\n\nSysAdminShareDialog.propTypes = propTypes;\n\nexport default SysAdminShareDialog;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Button, Modal, ModalHeader, ModalBody, ModalFooter, Form, FormGroup, Label, Input, Alert } from 'reactstrap';\nimport { gettext } from '../../../utils/constants';\nimport { seafileAPI } from '../../../utils/seafile-api.js';\nimport { Utils } from '../../../utils/utils';\nimport toaster from '../../toast';\n\nconst propTypes = {\n  itemName: PropTypes.string.isRequired,\n  toggleDialog: PropTypes.func.isRequired,\n  repoID: PropTypes.string.isRequired,\n};\n\nclass SysAdminLibHistorySettingDialog extends React.Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      keepDays: -1,\n      expireDays: 30,\n      disabled: true,\n      allHistory: true,\n      noHistory: false,\n      autoHistory: false,\n      errorInfo: ''\n    };\n  }\n\n  componentDidMount() {\n    seafileAPI.sysAdminGetRepoHistorySetting(this.props.repoID).then(res => {\n      this.setState({\n        keepDays: res.data.keep_days,\n        allHistory: res.data.keep_days < 0 ? true : false,\n        noHistory: res.data.keep_days === 0 ? true : false,\n        autoHistory: res.data.keep_days > 0 ? true : false,\n        disabled: res.data.keep_days > 0 ? false : true,\n        expireDays: res.data.keep_days > 0 ? res.data.keep_days : 30,\n      });\n    }).catch(error => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  submit = () => {\n    let days = this.state.keepDays;\n    if (this.state.autoHistory) {\n      days = this.state.expireDays;\n    }\n    let repoID = this.props.repoID;\n    let reg = /^-?\\d+$/;\n    let flag = reg.test(days);\n    if (flag) {\n      let message = gettext('Successfully set library history.');\n      seafileAPI.sysAdminUpdateRepoHistorySetting(repoID, days).then(res => {\n        toaster.success(message);\n        this.setState({keepDays: res.data.keep_days});\n        this.props.toggleDialog();\n      }).catch(error => {\n        let errMessage = Utils.getErrorMsg(error);\n        toaster.danger(errMessage);\n      });\n    } else {\n      this.setState({\n        errorInfo: gettext('Please enter a non-negative integer'),\n      });\n    }\n  }\n\n  handleKeyPress = (e) => {\n    if (e.key === 'Enter') {\n      this.submit();\n      e.preventDefault();\n    }\n  }\n\n  onChange = (e) => {\n    let num = e.target.value;\n    this.setState({\n      keepDays: num,\n      expireDays: num,\n    });\n  }\n\n  setLimitDays = (type) => {\n    if (type === 'allHistory') {\n      this.setState({\n        keepDays: -1,\n      });\n    } else if (type === 'noHistory') {\n      this.setState({\n        keepDays: 0,\n      });\n    } else {\n      this.setState({\n        disabled: false\n      });\n    }\n\n    this.setState({\n      allHistory: type === 'allHistory' ? true : false,\n      noHistory: type === 'noHistory' ? true : false,\n      autoHistory: type === 'autoHistory' ? true : false,\n    });\n  }\n\n  render() {\n    const itemName = this.props.itemName;\n    return (\n      <Modal isOpen={true}>\n        <ModalHeader toggle={this.props.toggleDialog}>\n          <span className=\"op-target\" title={itemName}>{itemName}</span>{' '}\n          {gettext('History Setting')}\n        </ModalHeader>\n        <ModalBody>\n          <Form>\n            <FormGroup check>\n              <Input type=\"radio\" name=\"radio1\" checked={this.state.allHistory} onChange={() => {this.setLimitDays('allHistory');}}/>{' '}\n              <Label>{gettext('Keep full history')}</Label>\n            </FormGroup>\n            <FormGroup check>\n              <Input type=\"radio\" name=\"radio1\" checked={this.state.noHistory} onChange={() =>{this.setLimitDays('noHistory');}}/>{' '}\n              <Label>{gettext('Don\\'t keep history')}</Label>\n            </FormGroup>\n            <FormGroup check>\n              <Input type=\"radio\" name=\"radio1\" checked={this.state.autoHistory} onChange={() =>{this.setLimitDays('autoHistory');}}/>{' '}\n              <Label>{gettext('Only keep a period of history:')}</Label>\n              <Input\n                type=\"text\"\n                className=\"expire-input\"\n                value={this.state.expireDays}\n                onChange={this.onChange}\n                disabled={this.state.disabled}\n                onKeyDown={this.handleKeyPress}\n              />{' '}\n              <Label><span>{gettext('days')}</span></Label>\n            </FormGroup>\n            {this.state.errorInfo && <Alert color=\"danger\">{this.state.errorInfo}</Alert>}\n          </Form>\n        </ModalBody>\n        <ModalFooter>\n          <Button color=\"secondary\" onClick={this.props.toggleDialog}>{gettext('Cancel')}</Button>\n          <Button color=\"primary\" onClick={this.submit}>{gettext('Submit')}</Button>\n        </ModalFooter>\n      </Modal>\n    );\n  }\n}\n\nSysAdminLibHistorySettingDialog.propTypes = propTypes;\n\nexport default SysAdminLibHistorySettingDialog;\n","import React, { Component, Fragment } from 'react';\nimport { Link } from '@reach/router';\nimport { Utils } from '../../../utils/utils';\nimport { seafileAPI } from '../../../utils/seafile-api';\nimport { gettext, siteRoot, isPro } from '../../../utils/constants';\nimport toaster from '../../../components/toast';\nimport EmptyTip from '../../../components/empty-tip';\nimport Loading from '../../../components/loading';\nimport Paginator from '../../../components/paginator';\nimport ModalPortal from '../../../components/modal-portal';\nimport OpMenu from '../../../components/dialog/op-menu';\nimport TransferDialog from '../../../components/dialog/transfer-dialog';\nimport DeleteRepoDialog from '../../../components/dialog/delete-repo-dialog';\nimport SysAdminShareDialog from '../../../components/dialog/sysadmin-dialog/sysadmin-share-dialog';\nimport SysAdminLibHistorySettingDialog from '../../../components/dialog/sysadmin-dialog/sysadmin-lib-history-setting-dialog';\nimport UserLink from '../user-link';\n\nconst { enableSysAdminViewRepo } = window.sysadmin.pageOptions;\n\nclass Content extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      isItemFreezed: false\n    };\n  }\n\n  onFreezedItem = () => {\n    this.setState({isItemFreezed: true});\n  }\n\n  onUnfreezedItem = () => {\n    this.setState({isItemFreezed: false});\n  }\n\n  getPreviousPageList = () => {\n    this.props.getListByPage(this.props.pageInfo.current_page - 1);\n  }\n\n  getNextPageList = () => {\n    this.props.getListByPage(this.props.pageInfo.current_page + 1);\n  }\n\n  sortByFileCount = (e) => {\n    e.preventDefault();\n    this.props.sortItems('file_count');\n  }\n\n  sortBySize = (e) => {\n    e.preventDefault();\n    this.props.sortItems('size');\n  }\n\n  render() {\n    // offer 'sort' only for 'all repos'\n    const { loading, errorMsg, items, pageInfo, curPerPage, sortBy } = this.props;\n    if (loading) {\n      return <Loading />;\n    } else if (errorMsg) {\n      return <p className=\"error text-center\">{errorMsg}</p>;\n    } else {\n      const emptyTip = (\n        <EmptyTip>\n          <h2>{gettext('No libraries')}</h2>\n        </EmptyTip>\n      );\n      const initialSortIcon = <span className=\"fas fa-sort\"></span>;\n      const sortIcon = <span className=\"fas fa-caret-down\"></span>;\n      const table = (\n        <Fragment>\n          <table>\n            <thead>\n              <tr>\n                <th width=\"5%\">{/*icon*/}</th>\n                <th width=\"25%\">{gettext('Name')}</th>\n                <th width=\"15%\">\n                  {sortBy != undefined ?\n                    <Fragment>\n                      <a className=\"d-inline-block table-sort-op\" href=\"#\" onClick={this.sortByFileCount}>{gettext('Files')} {sortBy == 'file_count' ? sortIcon : initialSortIcon}</a>{' / '}\n                      <a className=\"d-inline-block table-sort-op\" href=\"#\" onClick={this.sortBySize}>{gettext('Size')} {sortBy == 'size' ? sortIcon : initialSortIcon}</a>\n                    </Fragment> :\n                    gettext('Files') / gettext('Size')\n                  }\n                </th>\n                <th width=\"32%\">ID</th>\n                <th width=\"18%\">{gettext('Owner')}</th>\n                <th width=\"5%\">{/*Operations*/}</th>\n              </tr>\n            </thead>\n            <tbody>\n              {items.map((item, index) => {\n                return (<Item\n                  key={index}\n                  repo={item}\n                  isItemFreezed={this.state.isItemFreezed}\n                  onFreezedItem={this.onFreezedItem}\n                  onUnfreezedItem={this.onUnfreezedItem}\n                  onDeleteRepo={this.props.onDeleteRepo}\n                  onTransferRepo={this.props.onTransferRepo}\n                />);\n              })}\n            </tbody>\n          </table>\n          {pageInfo &&\n          <Paginator\n            gotoPreviousPage={this.getPreviousPageList}\n            gotoNextPage={this.getNextPageList}\n            currentPage={pageInfo.current_page}\n            hasNextPage={pageInfo.has_next_page}\n            curPerPage={curPerPage}\n            resetPerPage={this.props.resetPerPage}\n          />\n          }\n        </Fragment>\n      );\n\n      return items.length ? table : emptyTip;\n    }\n  }\n}\n\nclass Item extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      isOpIconShown: false,\n      highlight: false,\n      isShareDialogOpen: false,\n      isDeleteDialogOpen: false,\n      isTransferDialogOpen: false,\n      isHistorySettingDialogOpen: false,\n      isRepoDeleted: false,\n    };\n  }\n\n  onDeleteRepo = (repo) => {\n    seafileAPI.sysAdminDeleteRepo(repo.id).then((res) => {\n      this.props.onDeleteRepo(repo);\n      this.setState({\n        isDeleteDialogOpen: false,\n        isRepoDeleted: true,\n      });\n      const msg = gettext('Successfully deleted {name}.').replace('{name}', repo.name);\n      toaster.success(msg);\n    }).catch((error) => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n\n      this.setState({isRepoDeleted: false});\n    });\n  }\n\n  onTransferRepo = (owner) => {\n    seafileAPI.sysAdminTransferRepo(this.props.repo.id, owner.email).then((res) => {\n      this.props.onTransferRepo(res.data);\n      let message = gettext('Successfully transferred the library.');\n      toaster.success(message);\n    }).catch(error => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n    this.toggleTransferDialog();\n  }\n\n  handleMouseOver = () => {\n    if (!this.props.isItemFreezed) {\n      this.setState({\n        isOpIconShown: true,\n        highlight: true\n      });\n    }\n  }\n\n  handleMouseOut = () => {\n    if (!this.props.isItemFreezed) {\n      this.setState({\n        isOpIconShown: false,\n        highlight: false\n      });\n    }\n  }\n\n  onUnfreezedItem = () => {\n    this.setState({\n      highlight: false,\n      isOpIconShow: false\n    });\n    this.props.onUnfreezedItem();\n  }\n\n  onMenuItemClick = (operation) => {\n    switch(operation) {\n      case 'Share':\n        this.toggleShareDialog();\n        break;\n      case 'Delete':\n        this.toggleDeleteDialog();\n        break;\n      case 'Transfer':\n        this.toggleTransferDialog();\n        break;\n      case 'History Setting':\n        this.toggleHistorySettingDialog();\n        break;\n      default:\n        break;\n    }\n  }\n\n  toggleShareDialog = () => {\n    this.setState({isShareDialogOpen: !this.state.isShareDialogOpen});\n  }\n\n  toggleDeleteDialog = () => {\n    this.setState({isDeleteDialogOpen: !this.state.isDeleteDialogOpen});\n  }\n\n  toggleTransferDialog = () => {\n    this.setState({isTransferDialogOpen: !this.state.isTransferDialogOpen});\n  }\n\n  toggleHistorySettingDialog = () => {\n    this.setState({isHistorySettingDialogOpen: !this.state.isHistorySettingDialogOpen});\n  }\n\n  renderRepoName = () => {\n    const { repo } = this.props;\n    if (repo.name) {\n      if (isPro && enableSysAdminViewRepo && !repo.encrypted) {\n        return <Link to={`${siteRoot}sys/libraries/${repo.id}/`}>{repo.name}</Link>;\n      } else {\n        return repo.name;\n      }\n    } else {\n      return '--';\n    }\n  }\n\n  translateOperations = (item) => {\n    let translateResult = '';\n    switch(item) {\n      case 'Share':\n        translateResult = gettext('Share');\n        break;\n      case 'Delete':\n        translateResult = gettext('Delete');\n        break;\n      case 'Transfer':\n        translateResult = gettext('Transfer');\n        break;\n      case 'History Setting':\n        translateResult = gettext('History Setting');\n        break;\n      default:\n        break;\n    }\n\n    return translateResult;\n  }\n\n  getOperations = () => {\n    const { repo } = this.props;\n    let operations = ['Delete', 'Transfer'];\n    if (!repo.encrypted) {\n      operations.push('Share');\n    }\n    operations.push('History Setting');\n    return operations;\n  }\n\n  render () {\n    const { repo } = this.props;\n    const {\n      isOpIconShown,\n      isShareDialogOpen,\n      isDeleteDialogOpen,\n      isTransferDialogOpen,\n      isHistorySettingDialogOpen\n    } = this.state;\n    let iconUrl = Utils.getLibIconUrl(repo);\n    let iconTitle = Utils.getLibIconTitle(repo);\n    const index = repo.owner_email.indexOf('@seafile_group');\n    let isGroupOwnedRepo = index != -1;\n    let departmentID;\n    if (isGroupOwnedRepo) {\n      departmentID = repo.owner_email.substring(0, index);\n    }\n\n    return (\n      <Fragment>\n        <tr className={this.state.highlight ? 'tr-highlight' : ''} onMouseEnter={this.handleMouseOver} onMouseLeave={this.handleMouseOut}>\n          <td><img src={iconUrl} title={iconTitle} alt={iconTitle} width=\"24\" /></td>\n          <td>{this.renderRepoName()}</td>\n          <td>{`${repo.file_count} / ${Utils.bytesToSize(repo.size)}`}</td>\n          <td>{repo.id}</td>\n          <td>\n            {isGroupOwnedRepo ?\n              <Link to={`${siteRoot}sys/departments/${departmentID}/`}>{repo.owner_name}</Link> :\n              <UserLink email={repo.owner_email} name={repo.owner_name} />\n            }\n          </td>\n          <td>\n            {(!isGroupOwnedRepo && isOpIconShown) &&\n            <OpMenu\n              operations={this.getOperations()}\n              translateOperations={this.translateOperations}\n              onMenuItemClick={this.onMenuItemClick}\n              onFreezedItem={this.props.onFreezedItem}\n              onUnfreezedItem={this.onUnfreezedItem}\n            />\n            }\n          </td>\n        </tr>\n        {isShareDialogOpen &&\n          <ModalPortal>\n            <SysAdminShareDialog\n              itemName={repo.name}\n              itemPath={'/'}\n              repoID={repo.id}\n              isGroupOwnedRepo={isGroupOwnedRepo}\n              repoEncrypted={repo.encrypted}\n              enableDirPrivateShare={true}\n              userPerm={repo.permission}\n              toggleDialog={this.toggleShareDialog}\n            />\n          </ModalPortal>\n        }\n        {isDeleteDialogOpen &&\n          <ModalPortal>\n            <DeleteRepoDialog\n              repo={repo}\n              isRepoDeleted={this.state.isRepoDeleted}\n              onDeleteRepo={this.onDeleteRepo}\n              toggle={this.toggleDeleteDialog}\n            />\n          </ModalPortal>\n        }\n        {isTransferDialogOpen &&\n          <ModalPortal>\n            <TransferDialog\n              itemName={repo.name}\n              submit={this.onTransferRepo}\n              canTransferToDept={false}\n              toggleDialog={this.toggleTransferDialog}\n            />\n          </ModalPortal>\n        }\n        {isHistorySettingDialogOpen &&\n          <ModalPortal>\n            <SysAdminLibHistorySettingDialog\n              repoID={repo.id}\n              itemName={repo.name}\n              toggleDialog={this.toggleHistorySettingDialog}\n            />\n          </ModalPortal>\n        }\n      </Fragment>\n    );\n  }\n}\n\nexport default Content;\n","import React, { Component, Fragment } from 'react';\nimport { navigate } from '@reach/router';\nimport { Button } from 'reactstrap';\nimport { Utils } from '../../../utils/utils';\nimport { seafileAPI } from '../../../utils/seafile-api';\nimport { gettext, siteRoot } from '../../../utils/constants';\nimport toaster from '../../../components/toast';\nimport SysAdminCreateRepoDialog from '../../../components/dialog/sysadmin-dialog/sysadmin-create-repo-dialog';\nimport MainPanelTopbar from '../main-panel-topbar';\nimport Search from '../search';\nimport ReposNav from './repos-nav';\nimport Content from './repos';\n\nclass AllRepos extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      loading: true,\n      errorMsg: '',\n      repos: [],\n      pageInfo: {},\n      perPage: 25,\n      sortBy: '',\n      isCreateRepoDialogOpen: false\n    };\n  }\n\n  componentDidMount () {\n    let urlParams = (new URL(window.location)).searchParams;\n    const { currentPage = 1, perPage, sortBy } = this.state;\n    this.setState({\n      sortBy: urlParams.get('order_by') || sortBy,\n      perPage: parseInt(urlParams.get('per_page') || perPage),\n      currentPage: parseInt(urlParams.get('page') || currentPage)\n    }, () => {\n      this.getReposByPage(this.state.currentPage);\n    });\n  }\n\n  toggleCreateRepoDialog = () => {\n    this.setState({isCreateRepoDialogOpen: !this.state.isCreateRepoDialogOpen});\n  }\n\n  getReposByPage = (page) => {\n    const { perPage, sortBy } = this.state;\n    seafileAPI.sysAdminListAllRepos(page, perPage, sortBy).then((res) => {\n      this.setState({\n        loading: false,\n        repos: res.data.repos,\n        pageInfo: res.data.page_info\n      });\n    }).catch((error) => {\n      this.setState({\n        loading: false,\n        errorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403\n      });\n    });\n  }\n\n  sortItems = (sortBy) => {\n    this.setState({\n      currentPage: 1,\n      sortBy: sortBy\n    }, () => {\n      let url = new URL(location.href);\n      let searchParams = new URLSearchParams(url.search);\n      const { currentPage, sortBy } = this.state;\n      searchParams.set('page', currentPage);\n      searchParams.set('order_by', sortBy);\n      url.search = searchParams.toString();\n      navigate(url.toString());\n      this.getReposByPage(currentPage);\n    });\n  }\n\n  resetPerPage = (perPage) => {\n    this.setState({\n      perPage: perPage\n    }, () => {\n      this.getReposByPage(1);\n    });\n  }\n\n  createRepo = (repoName, Owner) => {\n    seafileAPI.sysAdminCreateRepo(repoName, Owner).then(res => {\n      this.state.repos.unshift(res.data);\n      this.setState({\n        repos: this.state.repos\n      });\n    }).catch(error => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  onDeleteRepo = (targetRepo) => {\n    let repos = this.state.repos.filter(repo => {\n      return repo.id != targetRepo.id;\n    });\n    this.setState({\n      repos: repos\n    });\n  }\n\n  onTransferRepo = (targetRepo) => {\n    let repos = this.state.repos.map((item) => {\n      return item.id == targetRepo.id ? targetRepo : item;\n    });\n    this.setState({\n      repos: repos\n    });\n  }\n\n  getSearch = () => {\n    return <Search\n      placeholder={gettext('Search libraries by name')}\n      submit={this.searchRepos}\n    />;\n  }\n\n  searchRepos = (repoName) => {\n    navigate(`${siteRoot}sys/search-libraries/?name=${encodeURIComponent(repoName)}`);\n  }\n\n  render() {\n    let { isCreateRepoDialogOpen } = this.state;\n    return (\n      <Fragment>\n        <MainPanelTopbar search={this.getSearch()}>\n          <Button className=\"btn btn-secondary operation-item\" onClick={this.toggleCreateRepoDialog}>\n            <i className=\"fas fa-plus-square text-secondary mr-1\"></i>{gettext('New Library')}\n          </Button>\n        </MainPanelTopbar>\n        <div className=\"main-panel-center flex-row\">\n          <div className=\"cur-view-container\">\n            <ReposNav currentItem=\"all\" />\n            <div className=\"cur-view-content\">\n              <Content\n                loading={this.state.loading}\n                errorMsg={this.state.errorMsg}\n                items={this.state.repos}\n                sortBy={this.state.sortBy}\n                sortItems={this.sortItems}\n                pageInfo={this.state.pageInfo}\n                curPerPage={this.state.perPage}\n                getListByPage={this.getReposByPage}\n                resetPerPage={this.resetPerPage}\n                onDeleteRepo={this.onDeleteRepo}\n                onTransferRepo={this.onTransferRepo}\n              />\n            </div>\n          </div>\n        </div>\n        {isCreateRepoDialogOpen &&\n        <SysAdminCreateRepoDialog\n          createRepo={this.createRepo}\n          toggleDialog={this.toggleCreateRepoDialog}\n        />\n        }\n      </Fragment>\n    );\n  }\n}\n\nexport default AllRepos;\n","import React, { Component, Fragment } from 'react';\nimport { Link } from '@reach/router';\nimport { Utils } from '../../../utils/utils';\nimport { seafileAPI } from '../../../utils/seafile-api';\nimport { gettext, siteRoot } from '../../../utils/constants';\nimport toaster from '../../../components/toast';\nimport Loading from '../../../components/loading';\nimport MainPanelTopbar from '../main-panel-topbar';\nimport ReposNav from './repos-nav';\n\nclass Content extends Component {\n\n  constructor(props) {\n    super(props);\n  }\n\n  render() {\n    const { loading, errorMsg, items } = this.props;\n    if (loading) {\n      return <Loading />;\n    } else if (errorMsg) {\n      return <p className=\"error text-center\">{errorMsg}</p>;\n    } else {\n      const table = (\n        <Fragment>\n          <table className=\"table-hover\">\n            <thead>\n              <tr>\n                <th width=\"33%\">{gettext('Name')}</th>\n                <th width=\"34%\">ID</th>\n                <th width=\"33%\">{gettext('Description')}</th>\n              </tr>\n            </thead>\n            <tbody>\n              {items.map((item, index) => {\n                return (<Item key={index} item={item}/>);\n              })}\n            </tbody>\n          </table>\n        </Fragment>\n      );\n      return table;\n    }\n  }\n}\n\nclass Item extends Component {\n\n  constructor(props) {\n    super(props);\n  }\n\n  render() {\n    const item = this.props.item;\n    return (\n      <tr>\n        <td><Link to={`${siteRoot}sys/libraries/${item.id}/`}>{item.name}</Link></td>\n        <td>{item.id}</td>\n        <td>{item.description}</td>\n      </tr>\n    );\n  }\n}\n\nclass SystemRepo extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      loading: true,\n      errorMsg: '',\n      items: []\n    };\n  }\n\n  componentDidMount () {\n    seafileAPI.sysAdminGetSystemRepoInfo().then((res) => {\n      let items = [];\n      items.push(res.data);\n      this.setState({\n        items: items,\n        loading: false\n      });\n    }).catch((error) => {\n      this.setState({\n        loading: false,\n        errorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403\n      });\n    });\n  }\n\n  render() {\n    return (\n      <Fragment>\n        <MainPanelTopbar/>\n        <div className=\"main-panel-center flex-row\">\n          <div className=\"cur-view-container\">\n            <ReposNav currentItem=\"system\" />\n            <div className=\"cur-view-content\">\n              <Content\n                loading={this.state.loading}\n                errorMsg={this.state.errorMsg}\n                items={this.state.items}\n              />\n            </div>\n          </div>\n        </div>\n      </Fragment>\n    );\n  }\n}\n\nexport default SystemRepo;\n","import React, { Component, Fragment } from 'react';\nimport { Button } from 'reactstrap';\nimport moment from 'moment';\nimport { Utils } from '../../../utils/utils';\nimport { seafileAPI } from '../../../utils/seafile-api';\nimport { gettext } from '../../../utils/constants';\nimport toaster from '../../../components/toast';\nimport EmptyTip from '../../../components/empty-tip';\nimport Loading from '../../../components/loading';\nimport Paginator from '../../../components/paginator';\nimport ModalPortal from '../../../components/modal-portal';\nimport OpMenu from '../../../components/dialog/op-menu';\nimport CommonOperationConfirmationDialog from '../../../components/dialog/common-operation-confirmation-dialog';\nimport MainPanelTopbar from '../main-panel-topbar';\nimport Search from '../search';\nimport UserLink from '../user-link';\nimport ReposNav from './repos-nav';\n\nconst { trashReposExpireDays } = window.sysadmin.pageOptions;\n\nclass Content extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      isItemFreezed: false\n    };\n  }\n\n  onFreezedItem = () => {\n    this.setState({isItemFreezed: true});\n  }\n\n  onUnfreezedItem = () => {\n    this.setState({isItemFreezed: false});\n  }\n\n  getPreviousPageList = () => {\n    this.props.getListByPage(this.props.pageInfo.current_page - 1);\n  }\n\n  getNextPageList = () => {\n    this.props.getListByPage(this.props.pageInfo.current_page + 1);\n  }\n\n  render() {\n    const { loading, errorMsg, items, pageInfo, curPerPage } = this.props;\n    if (loading) {\n      return <Loading />;\n    } else if (errorMsg) {\n      return <p className=\"error text-center mt-4\">{errorMsg}</p>;\n    } else {\n      const emptyTip = (\n        <EmptyTip>\n          <h2>{gettext('No deleted libraries')}</h2>\n        </EmptyTip>\n      );\n      const table = (\n        <Fragment>\n          <p className=\"mt-4 small text-secondary\">{gettext('Tip: libraries deleted {trashReposExpireDays} days ago will be cleaned automatically.').replace('{trashReposExpireDays}', trashReposExpireDays)}</p>\n          <table className=\"table-hover\">\n            <thead>\n              <tr>\n                <th width=\"5%\">{/*icon*/}</th>\n                <th width=\"43%\">{gettext('Name')}</th>\n                <th width=\"27%\">{gettext('Owner')}</th>\n                <th width=\"20%\">{gettext('Deleted Time')}</th>\n                <th width=\"5%\">{/*Operations*/}</th>\n              </tr>\n            </thead>\n            <tbody>\n              {items.map((item, index) => {\n                return (<Item\n                  key={index}\n                  repo={item}\n                  isItemFreezed={this.state.isItemFreezed}\n                  onFreezedItem={this.onFreezedItem}\n                  onUnfreezedItem={this.onUnfreezedItem}\n                  onDeleteRepo={this.props.onDeleteRepo}\n                  onRestoreRepo={this.props.onRestoreRepo}\n                />);\n              })}\n            </tbody>\n          </table>\n          {pageInfo &&\n          <Paginator\n            gotoPreviousPage={this.getPreviousPageList}\n            gotoNextPage={this.getNextPageList}\n            currentPage={pageInfo.current_page}\n            hasNextPage={pageInfo.has_next_page}\n            curPerPage={curPerPage}\n            resetPerPage={this.props.resetPerPage}\n          />\n          }\n        </Fragment>\n      );\n\n      return items.length ? table : emptyTip;\n    }\n  }\n}\n\nclass Item extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      highlight: false,\n      isOpIconShown: false,\n      isDeleteRepoDialogOpen: false,\n      isRestoreRepoDialogOpen: false\n    };\n  }\n\n  handleMouseOver = () => {\n    if (!this.props.isItemFreezed) {\n      this.setState({\n        isOpIconShown: true,\n        highlight: true\n      });\n    }\n  }\n\n  handleMouseOut = () => {\n    if (!this.props.isItemFreezed) {\n      this.setState({\n        isOpIconShown: false,\n        highlight: false\n      });\n    }\n  }\n\n  onUnfreezedItem = () => {\n    this.setState({\n      highlight: false,\n      isOpIconShow: false\n    });\n    this.props.onUnfreezedItem();\n  }\n\n  onDeleteRepo = () => {\n    const repo = this.props.repo;\n    seafileAPI.sysAdminDeleteTrashRepo(repo.id).then((res) => {\n      this.props.onDeleteRepo(repo);\n      const msg = gettext('Successfully deleted {name}.').replace('{name}', repo.name);\n      toaster.success(msg);\n    }).catch((error) => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  onRestoreRepo = () => {\n    const repo = this.props.repo;\n    seafileAPI.sysAdminRestoreTrashRepo(repo.id).then((res) => {\n      this.props.onRestoreRepo(repo);\n      let message = gettext('Successfully restored the library.');\n      toaster.success(message);\n    }).catch((error) => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  toggleDeleteRepoDialog = (e) => {\n    if (e) {\n      e.preventDefault();\n    }\n    this.setState({isDeleteRepoDialogOpen: !this.state.isDeleteRepoDialogOpen});\n  }\n\n  toggleRestoreRepoDialog = (e) => {\n    if (e) {\n      e.preventDefault();\n    }\n    this.setState({isRestoreRepoDialogOpen: !this.state.isRestoreRepoDialogOpen});\n  }\n\n  translateOperations = (item) => {\n    let translateResult = '';\n    switch(item) {\n      case 'Restore':\n        translateResult = gettext('Restore');\n        break;\n      case 'Delete':\n        translateResult = gettext('Delete');\n        break;\n      default:\n        break;\n    }\n\n    return translateResult;\n  }\n\n  onMenuItemClick = (operation) => {\n    switch(operation) {\n      case 'Restore':\n        this.toggleRestoreRepoDialog();\n        break;\n      case 'Delete':\n        this.toggleDeleteRepoDialog();\n        break;\n      default:\n        break;\n    }\n  }\n\n  render () {\n    const { repo } = this.props;\n    const { isOpIconShown, isDeleteRepoDialogOpen, isRestoreRepoDialogOpen } = this.state;\n    const iconUrl = Utils.getLibIconUrl(repo);\n    const iconTitle = Utils.getLibIconTitle(repo);\n    const repoName = '<span class=\"op-target\">' + Utils.HTMLescape(repo.name) + '</span>';\n\n    return (\n      <Fragment>\n        <tr onMouseEnter={this.handleMouseOver} onMouseLeave={this.handleMouseOut}>\n          <td><img src={iconUrl} title={iconTitle} alt={iconTitle} width=\"24\" /></td>\n          <td>{repo.name}</td>\n          <td>\n            {repo.owner.indexOf('@seafile_group') == -1 ?\n              <UserLink email={repo.owner} name={repo.owner_name} /> :\n              repo.group_name}\n          </td>\n          <td>{moment(repo.delete_time).fromNow()}</td>\n          <td>\n            {isOpIconShown && (\n              <OpMenu\n                operations={['Restore', 'Delete']}\n                translateOperations={this.translateOperations}\n                onMenuItemClick={this.onMenuItemClick}\n                onFreezedItem={this.props.onFreezedItem}\n                onUnfreezedItem={this.onUnfreezedItem}\n              />\n            )}\n          </td>\n        </tr>\n        {isDeleteRepoDialogOpen &&\n          <ModalPortal>\n            <CommonOperationConfirmationDialog\n              title={gettext('Delete Library')}\n              message={gettext('Are you sure you want to delete {placeholder} completely?').replace('{placeholder}', repoName)}\n              executeOperation={this.onDeleteRepo}\n              confirmBtnText={gettext('Delete')}\n              toggleDialog={this.toggleDeleteRepoDialog}\n            />\n          </ModalPortal>\n        }\n        {isRestoreRepoDialogOpen &&\n          <ModalPortal>\n            <CommonOperationConfirmationDialog\n              title={gettext('Restore Library')}\n              message={gettext('Are you sure you want to restore {placeholder}?').replace('{placeholder}', repoName)}\n              executeOperation={this.onRestoreRepo}\n              confirmBtnText={gettext('Restore')}\n              toggleDialog={this.toggleRestoreRepoDialog}\n            />\n          </ModalPortal>\n        }\n      </Fragment>\n    );\n  }\n}\n\nclass TrashRepos extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      loading: true,\n      errorMsg: '',\n      repos: [],\n      pageInfo: {},\n      perPage: 25,\n      isCleanTrashDialogOpen: false\n    };\n  }\n\n  componentDidMount () {\n    let urlParams = (new URL(window.location)).searchParams;\n    const { currentPage = 1, perPage } = this.state;\n    this.setState({\n      perPage: parseInt(urlParams.get('per_page') || perPage),\n      currentPage: parseInt(urlParams.get('page') || currentPage)\n    }, () => {\n      this.getReposByPage(this.state.currentPage);\n    });\n  }\n\n  toggleCleanTrashDialog = () => {\n    this.setState({isCleanTrashDialogOpen: !this.state.isCleanTrashDialogOpen});\n  }\n\n  getReposByPage = (page) => {\n    let perPage = this.state.perPage;\n    seafileAPI.sysAdminListTrashRepos(page, perPage).then((res) => {\n      this.setState({\n        repos: res.data.repos,\n        pageInfo: res.data.page_info,\n        loading: false\n      });\n    }).catch((error) => {\n      this.setState({\n        loading: false,\n        errorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403\n      });\n    });\n  }\n\n  resetPerPage = (perPage) => {\n    this.setState({\n      perPage: perPage\n    }, () => {\n      this.getReposByPage(1);\n    });\n  }\n\n  onDeleteRepo = (targetRepo) => {\n    let repos = this.state.repos.filter(repo => {\n      return repo.id != targetRepo.id;\n    });\n    this.setState({\n      repos: repos\n    });\n  }\n\n  onRestoreRepo = (targetRepo) => {\n    let repos = this.state.repos.filter(repo => {\n      return repo.id != targetRepo.id;\n    });\n    this.setState({\n      repos: repos\n    });\n  }\n\n  cleanTrash = () => {\n    seafileAPI.sysAdminCleanTrashRepos().then(res => {\n      this.setState({repos: []});\n      toaster.success(gettext('Successfully cleared trash.'));\n    }).catch(error => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  getSearch = () => {\n    return <Search\n      placeholder={gettext('Search libraries by owner')}\n      submit={this.searchRepos}\n    />;\n  }\n\n  searchRepos = (owner) => {\n    seafileAPI.sysAdminSearchTrashRepos(owner).then((res) => {\n      this.setState({\n        repos: res.data.repos,\n        pageInfo: null,\n        errorMsg: '', // necessary!\n        loading: false\n      });\n    }).catch((error) => {\n      this.setState({\n        loading: false,\n        errorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403\n      });\n    });\n  }\n\n  render() {\n    const { isCleanTrashDialogOpen } = this.state;\n\n    // enable 'search': <MainPanelTopbar search={this.getSearch()}>\n    return (\n      <Fragment>\n        {this.state.repos.length ? (\n          <MainPanelTopbar>\n            <Button className=\"operation-item\" onClick={this.toggleCleanTrashDialog}>{gettext('Clean')}</Button>\n          </MainPanelTopbar>\n        ) : <MainPanelTopbar />\n        }\n        <div className=\"main-panel-center flex-row\">\n          <div className=\"cur-view-container\">\n            <ReposNav currentItem=\"trash\" />\n            <div className=\"cur-view-content\">\n              <Content\n                loading={this.state.loading}\n                errorMsg={this.state.errorMsg}\n                items={this.state.repos}\n                pageInfo={this.state.pageInfo}\n                onDeleteRepo={this.onDeleteRepo}\n                onRestoreRepo={this.onRestoreRepo}\n                getListByPage={this.getReposByPage}\n                resetPerPage={this.resetPerPage}\n                curPerPage={this.state.perPage}\n              />\n            </div>\n          </div>\n        </div>\n        {isCleanTrashDialogOpen &&\n          <CommonOperationConfirmationDialog\n            title={gettext('Clear Trash')}\n            message={gettext('Are you sure you want to clear trash?')}\n            executeOperation={this.cleanTrash}\n            confirmBtnText={gettext('Clear')}\n            toggleDialog={this.toggleCleanTrashDialog}\n          />\n        }\n      </Fragment>\n    );\n  }\n}\n\nexport default TrashRepos;\n","import React, { Component, Fragment } from 'react';\nimport { Form, FormGroup, Input, Label, Col } from 'reactstrap';\nimport { seafileAPI } from '../../../utils/seafile-api';\nimport { gettext } from '../../../utils/constants';\nimport { Utils } from '../../../utils/utils';\nimport MainPanelTopbar from '../main-panel-topbar';\nimport Content from './repos';\n\n\nclass SearchRepos extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      name: '',\n      isSubmitBtnActive: false,\n      loading: true,\n      errorMsg: '',\n      repos: []\n    };\n  }\n\n  componentDidMount() {\n    let params = (new URL(document.location)).searchParams;\n    this.setState({\n      name: params.get('name') || ''\n    }, this.getRepos);\n  }\n\n  getRepos = () => {\n    const { name } = this.state;\n    seafileAPI.sysAdminSearchRepos(name).then((res) => {\n      this.setState({\n        loading: false,\n        repos: res.data.repo_list\n      });\n    }).catch((error) => {\n      this.setState({\n        loading: false,\n        errorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403\n      });\n    });\n  }\n\n  searchRepos = () => {\n    this.getRepos();\n  }\n\n  onDeleteRepo = (targetRepo) => {\n    let repos = this.state.repos.filter(repo => {\n      return repo.id != targetRepo.id;\n    });\n    this.setState({\n      repos: repos\n    });\n  }\n\n  onTransferRepo = (targetRepo) => {\n    let repos = this.state.repos.map((item) => {\n      return item.id == targetRepo.id ? targetRepo : item;\n    });\n    this.setState({\n      repos: repos\n    });\n  }\n\n  handleNameInputChange = (e) => {\n    this.setState({\n      name: e.target.value\n    }, this.checkSubmitBtnActive);\n  }\n\n  checkSubmitBtnActive = () => {\n    const { name } = this.state;\n    this.setState({\n      isSubmitBtnActive: name.trim()\n    });\n  }\n\n  render() {\n    const { name, isSubmitBtnActive } = this.state;\n    return (\n      <Fragment>\n        <MainPanelTopbar />\n        <div className=\"main-panel-center flex-row\">\n          <div className=\"cur-view-container\">\n            <div className=\"cur-view-path\">\n              <h3 className=\"sf-heading\">{gettext('Libraries')}</h3>\n            </div>\n            <div className=\"cur-view-content\">\n              <div className=\"mt-4 mb-6\">\n                <h4 className=\"border-bottom font-weight-normal mb-2 pb-1\">{gettext('Search Libraries')}</h4>\n                <p className=\"text-secondary small\">{gettext('Tip: you can search by keyword in name.')}</p>\n                <Form>\n                  <FormGroup row>\n                    <Label for=\"name\" sm={1}>{gettext('Name')}</Label>\n                    <Col sm={5}>\n                      <Input type=\"text\" name=\"name\" id=\"name\" value={name} onChange={this.handleNameInputChange} />\n                    </Col>\n                  </FormGroup>\n                  <FormGroup row>\n                    <Col sm={{size: 5, offset: 1}}>\n                      <button className=\"btn btn-outline-primary\" disabled={!isSubmitBtnActive} onClick={this.searchRepos}>{gettext('Submit')}</button>\n                    </Col>\n                  </FormGroup>\n                </Form>\n              </div>\n              <div className=\"mt-4 mb-6\">\n                <h4 className=\"border-bottom font-weight-normal mb-2 pb-1\">{gettext('Result')}</h4>\n                <Content\n                  loading={this.state.loading}\n                  errorMsg={this.state.errorMsg}\n                  items={this.state.repos}\n                  onDeleteRepo={this.onDeleteRepo}\n                  onTransferRepo={this.onTransferRepo}\n                />\n              </div>\n            </div>\n          </div>\n        </div>\n      </Fragment>\n    );\n  }\n}\n\nexport default SearchRepos;\n","class Dirent {\n  constructor(obj) {\n    this.name = obj.obj_name;\n    this.mtime = obj.last_update;\n    this.size = obj.file_size;\n    this.is_file = obj.is_file;\n  }\n\n  isDir() {\n    return !this.is_file;\n  }\n}\n\nexport default Dirent;\n","import React, { Fragment } from 'react';\nimport PropTypes from 'prop-types';\nimport { siteRoot, gettext } from '../../../utils/constants';\nimport { Utils } from '../../../utils/utils';\n\nconst propTypes = {\n  repoName: PropTypes.string.isRequired,\n  currentPath: PropTypes.string.isRequired,\n  onPathClick: PropTypes.func.isRequired,\n  repoID: PropTypes.string.isRequired,\n};\n\nclass DirPath extends React.Component {\n\n  onPathClick = (e) => {\n    let path = Utils.getEventData(e, 'path');\n    this.props.onPathClick(path);\n  }\n\n  turnPathToLink = (path) => {\n    path = path[path.length - 1] === '/' ? path.slice(0, path.length - 1) : path;\n    let pathList = path.split('/');\n    let nodePath = '';\n    let pathElem = pathList.map((item, index) => {\n      if (item === '') {\n        return;\n      }\n      if (index === (pathList.length - 1)) {\n        return (\n          <Fragment key={index}>\n            <span className=\"path-split\">/</span>\n            <span className=\"path-file-name\">{item}</span>\n          </Fragment>\n        );\n      } else {\n        nodePath += '/' + item;\n        return (\n          <Fragment key={index} >\n            <span className=\"path-split\">/</span>\n            <a className=\"path-link\" data-path={nodePath} onClick={this.onPathClick}>{item}</a>\n          </Fragment>\n        );\n      }\n    });\n    return pathElem;\n  }\n\n  render() {\n    let { isSystemRepo, currentPath, repoName } = this.props;\n    let pathElem = this.turnPathToLink(currentPath);\n\n    return (\n      <div className=\"path-container\">\n        {isSystemRepo ?\n          <a href={`${siteRoot}sys/system-library/`}>{gettext('System')}</a> :\n          <a href={`${siteRoot}sys/all-libraries/`}>{gettext('All')}</a>\n        }\n        <span className=\"path-split\">/</span>\n        {(currentPath === '/' || currentPath === '') ?\n          <span className=\"path-repo-name\">{repoName}</span>:\n          <a className=\"path-link\" data-path=\"/\" onClick={this.onPathClick}>{repoName}</a>\n        }\n        {pathElem}\n      </div>\n    );\n  }\n}\n\nDirPath.propTypes = propTypes;\n\nexport default DirPath;\n","import React, { Fragment } from 'react';\nimport PropTypes from 'prop-types';\nimport { Link } from '@reach/router';\nimport moment from 'moment';\nimport { gettext } from '../../../utils/constants';\nimport { Utils } from '../../../utils/utils';\nimport Loading from '../../../components/loading';\n\nclass DirentItem extends React.Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      isOpIconShown: false\n    };\n  }\n\n  handleMouseOver = () => {\n    this.setState({\n      isOpIconShown: true\n    });\n  }\n\n  handleMouseOut = () => {\n    this.setState({\n      isOpIconShown: false\n    });\n  }\n\n  openFolder = () => {\n    this.props.openFolder(this.props.dirent);\n  }\n\n  deleteDirent = (e) => {\n    e.preventDefault();\n    this.props.deleteDirent(this.props.dirent);\n  }\n\n  downloadDirent = (e) => {\n    e.preventDefault();\n    this.props.downloadDirent(this.props.dirent);\n  }\n\n  render () {\n    let { isOpIconShown, isDeleteDialogOpen } = this.state;\n    let { dirent, fromSystemRepo } = this.props;\n    let iconUrl = Utils.getDirentIcon(dirent);\n\n    return (\n      <Fragment>\n        <tr onMouseEnter={this.handleMouseOver} onMouseLeave={this.handleMouseOut}>\n          <td className=\"text-center\"><img src={iconUrl} width=\"24\" alt='' /></td>\n          <td>\n            {dirent.is_file ?\n              dirent.name :\n              <Link to=\"#\" onClick={this.openFolder}>{dirent.name}</Link>\n            }\n          </td>\n          <td>\n            {isOpIconShown && fromSystemRepo &&\n              <a href=\"#\" className=\"op-icon sf2-icon-delete\" title={gettext('Delete')} onClick={this.deleteDirent}></a>\n            }\n            {isOpIconShown && dirent.is_file &&\n            <a href=\"#\" className=\"op-icon sf2-icon-download\" title={gettext('Download')} onClick={this.downloadDirent}></a>\n            }\n          </td>\n          <td>{dirent.size}</td>\n          <td>{moment(dirent.mtime).fromNow()}</td>\n        </tr>\n      </Fragment>\n    );\n  }\n}\n\n\nconst propTypes = {\n  direntList: PropTypes.array.isRequired\n};\n\nclass DirContent extends React.Component {\n\n  constructor(props) {\n    super(props);\n  }\n\n  render() {\n    let { loading, errorMsg, direntList } = this.props;\n\n    if (loading) {\n      return <Loading />;\n    }\n\n    if (errorMsg) {\n      return <p className=\"error text-center mt-4\">{errorMsg}</p>;\n    }\n\n    return (\n      <Fragment>\n        <table className=\"table-hover\">\n          <thead>\n            <tr>\n              <th width=\"5%\">{/*icon*/}</th>\n              <th width=\"55%\">{gettext('Name')}</th>\n              <th width=\"10%\">{/*operation*/}</th>\n              <th width=\"15%\">{gettext('Size')}</th>\n              <th width=\"15%\">{gettext('Last Update')}</th>\n            </tr>\n          </thead>\n          <tbody>\n            {direntList.map((dirent, index) => {\n              return <DirentItem\n                key={index}\n                dirent={dirent}\n                openFolder={this.props.openFolder}\n                deleteDirent={this.props.deleteDirent}\n                downloadDirent={this.props.downloadDirent}\n                fromSystemRepo={this.props.fromSystemRepo}\n              />;\n            })}\n          </tbody>\n        </table>\n      </Fragment>\n    );\n  }\n}\n\nDirContent.propTypes = propTypes;\n\nexport default DirContent;\n","import React, { Component, Fragment } from 'react';\nimport { Button } from 'reactstrap';\nimport { post } from 'axios';\nimport { Utils } from '../../../utils/utils';\nimport { seafileAPI } from '../../../utils/seafile-api';\nimport { siteRoot, gettext } from '../../../utils/constants';\nimport toaster from '../../../components/toast';\nimport CreateFolderDialog from '../../../components/dialog/create-folder-dialog';\nimport Dirent from '../../../models/system-admin/dirent';\nimport MainPanelTopbar from '../main-panel-topbar';\nimport DirPathBar from './dir-path-bar';\nimport DirContent from './dir-content';\n\nclass DirView extends Component {\n\n  constructor(props) {\n    super(props);\n    this.fileInput = React.createRef();\n    this.state = {\n      loading: true,\n      errorMsg: '',\n      isSystemRepo: false,\n      repoName: '',\n      path: '',\n      direntList: [],\n      isNewFolderDialogOpen: false\n    };\n  }\n\n  componentDidMount () {\n    this.loadDirentList('/');\n  }\n\n  onPathClick = (path) => {\n    this.loadDirentList(path);\n  }\n\n  toggleNewFolderDialog = () => {\n    this.setState({isNewFolderDialogOpen: !this.state.isNewFolderDialogOpen});\n  }\n\n  createNewFolder = (path) => {\n    let folderName = Utils.getFileName(path);\n    seafileAPI.sysAdminCreateSysRepoFolder(this.props.repoID, this.state.path, folderName).then(res => {\n      let new_dirent = new Dirent(res.data);\n      let direntList = this.state.direntList;\n      direntList.unshift(new_dirent);\n      this.setState({\n        direntList: direntList\n      });\n      this.toggleNewFolderDialog();\n    }).catch((err) => {\n      let errMessage = Utils.getErrorMsg(err);\n      toaster.danger(errMessage);\n    });\n  }\n\n  openFolder = (dirent) => {\n    let direntPath = Utils.joinPath(this.state.path, dirent.name);\n    if (!dirent.is_file) {\n      this.loadDirentList(direntPath);\n    }\n  }\n\n  loadDirentList = (path) => {\n    const repoID = this.props.repoID;\n    seafileAPI.sysAdminListRepoDirents(repoID, path).then(res => {\n      const { is_system_library: isSystemRepo, repo_name: repoName, dirent_list } = res.data;\n      let direntList = [];\n      dirent_list.forEach(item => {\n        let dirent = new Dirent(item);\n        direntList.push(dirent);\n      });\n      this.setState({\n        loading: false,\n        repoName: repoName,\n        isSystemRepo: isSystemRepo,\n        direntList: direntList,\n        path: path,\n      }, () => {\n        let url = siteRoot + 'sys/libraries/' + repoID + '/' + encodeURIComponent(this.state.repoName) + Utils.encodePath(path);\n        window.history.replaceState({url: url, path: path}, path, url);\n      });\n    }).catch((error) => {\n      this.setState({\n        loading: false,\n        errorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403\n      });\n    });\n  }\n\n  deleteDirent = (dirent) => {\n    let path = Utils.joinPath(this.state.path, dirent.name);\n    seafileAPI.sysAdminDeleteRepoDirent(this.props.repoID, path).then(res => {\n      toaster.success(gettext('Successfully deleted 1 item.'));\n      let direntList = this.state.direntList.filter(item => {\n        return item.name != dirent.name;\n      });\n      this.setState({\n        direntList: direntList\n      });\n    }).catch((err) => {\n      let errMessage = Utils.getErrorMsg(err);\n      toaster.danger(errMessage);\n    });\n  }\n\n  downloadDirent = (dirent) => {\n    let path = Utils.joinPath(this.state.path, dirent.name);\n    seafileAPI.sysAdminGetRepoFileDownloadURL(this.props.repoID, path).then(res => {\n      location.href = res.data.download_url;\n    }).catch((err) => {\n      let errMessage = Utils.getErrorMsg(err);\n      toaster.danger(errMessage);\n    });\n  }\n\n  openFileInput = () => {\n    this.fileInput.current.click();\n  }\n\n  onFileInputChange = () => {\n    if (!this.fileInput.current.files.length) {\n      return;\n    }\n    const file = this.fileInput.current.files[0];\n\n    let { path } = this.state;\n    seafileAPI.sydAdminGetSysRepoItemUploadURL(path).then(res => {\n      let formData = new FormData();\n      formData.append('parent_dir', path);\n      formData.append('file', file);\n      post(res.data.upload_link, formData).then(res => {\n        const fileObj = res.data[0];\n        let newDirent = new Dirent({\n          'is_file': true,\n          'obj_name': fileObj.name,\n          'file_size': Utils.bytesToSize(fileObj.size),\n          'last_update': (new Date()).getTime()\n        });\n        let direntList = this.state.direntList;\n        const dirs = direntList.filter(item => { return !item.is_file; });\n        direntList.splice(dirs.length, 0, newDirent);\n        this.setState({\n          direntList: direntList\n        });\n      });\n    }).catch((err) => {\n      let errMessage = Utils.getErrorMsg(err);\n      toaster.danger(errMessage);\n    });\n  }\n\n  checkDuplicatedName = (newName) => {\n    let direntList = this.state.direntList;\n    let isDuplicated = direntList.some(object => {\n      return object.name === newName;\n    });\n    return isDuplicated;\n  }\n\n  render() {\n    const { loading, errorMsg,\n      repoName, direntList, isSystemRepo, path,\n      isNewFolderDialogOpen } = this.state;\n    const { repoID } = this.props;\n\n    return (\n      <Fragment>\n        {isSystemRepo ?\n          <MainPanelTopbar>\n            <Fragment>\n              <input className=\"d-none\" type=\"file\" onChange={this.onFileInputChange} ref={this.fileInput} />\n              <Button className=\"operation-item\" onClick={this.openFileInput}>{gettext('Upload')}</Button>\n              <Button className=\"operation-item\" onClick={this.toggleNewFolderDialog}>{gettext('New Folder')}</Button>\n            </Fragment>\n          </MainPanelTopbar> : <MainPanelTopbar />\n        }\n        <div className=\"main-panel-center flex-row\">\n          <div className=\"cur-view-container\">\n            <div className=\"cur-view-path align-items-center\">\n              <DirPathBar\n                isSystemRepo={isSystemRepo}\n                repoID={repoID}\n                repoName={repoName}\n                currentPath={path}\n                onPathClick={this.onPathClick}\n              />\n            </div>\n            <div className=\"cur-view-content\">\n              <DirContent\n                loading={loading}\n                errorMsg={errorMsg}\n                fromSystemRepo={isSystemRepo}\n                direntList={direntList}\n                openFolder={this.openFolder}\n                deleteDirent={this.deleteDirent}\n                downloadDirent={this.downloadDirent}\n              />\n            </div>\n          </div>\n        </div>\n        {isNewFolderDialogOpen &&\n          <CreateFolderDialog\n            parentPath={path}\n            checkDuplicatedName={this.checkDuplicatedName}\n            onAddFolder={this.createNewFolder}\n            addFolderCancel={this.toggleNewFolderDialog}\n          />\n        }\n      </Fragment>\n    );\n  }\n}\n\nexport default DirView;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Button, Modal, ModalHeader, Input, ModalBody, ModalFooter, Form, FormGroup, Label, Alert } from 'reactstrap';\nimport { gettext } from '../../../utils/constants';\nimport UserSelect from '../../user-select';\n\n\nconst propTypes = {\n  createGroup: PropTypes.func.isRequired,\n  toggleDialog: PropTypes.func.isRequired\n};\n\nclass SysAdminCreateGroupDialog extends React.Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      groupName: '',\n      ownerEmail: '',\n      errMessage: '',\n      isSubmitBtnActive: false\n    };\n    this.newInput = React.createRef();\n  }\n\n  handleRepoNameChange = (e) => {\n    if (!e.target.value.trim()) {\n      this.setState({isSubmitBtnActive: false});\n    } else {\n      this.setState({isSubmitBtnActive: true});\n    }\n\n    this.setState({groupName: e.target.value});\n  }\n\n  handleSubmit = () => {\n    let groupName = this.state.groupName.trim();\n    this.props.createGroup(groupName, this.state.ownerEmail);\n  }\n\n  handleSelectChange = (option) => {\n    // option can be null\n    this.setState({\n      ownerEmail: option ? option.email : ''\n    });\n  }\n\n  handleKeyPress = (e) => {\n    if (e.key === 'Enter') {\n      this.handleSubmit();\n      e.preventDefault();\n    }\n  }\n\n  toggle = () => {\n    this.props.toggleDialog();\n  }\n\n  componentDidMount() {\n    this.newInput.focus();\n  }\n\n  render() {\n    return (\n      <Modal isOpen={true} toggle={this.toggle}>\n        <ModalHeader toggle={this.toggle}>{gettext('New Group')}</ModalHeader>\n        <ModalBody>\n          <Form>\n            <FormGroup>\n              <Label for=\"groupName\">{gettext('Name')}</Label>\n              <Input\n                id=\"groupName\"\n                onKeyPress={this.handleKeyPress}\n                innerRef={input => {this.newInput = input;}}\n                value={this.state.groupName}\n                onChange={this.handleRepoNameChange}\n              />\n              <Label className=\"mt-2\">\n                {gettext('Owner')}\n                <span className=\"small text-secondary\">{gettext('(If left blank, owner will be admin)')}</span>\n              </Label>\n              <UserSelect\n                isMulti={false}\n                className=\"reviewer-select\"\n                placeholder={gettext('Select a user')}\n                onSelectChange={this.handleSelectChange}\n              />\n            </FormGroup>\n          </Form>\n          {this.state.errMessage && <Alert color=\"danger\">{this.state.errMessage}</Alert>}\n        </ModalBody>\n        <ModalFooter>\n          <Button color=\"secondary\" onClick={this.toggle}>{gettext('Cancel')}</Button>\n          <Button color=\"primary\" onClick={this.handleSubmit} disabled={!this.state.isSubmitBtnActive}>{gettext('Submit')}</Button>\n        </ModalFooter>\n      </Modal>\n    );\n  }\n}\n\nSysAdminCreateGroupDialog.propTypes = propTypes;\n\nexport default SysAdminCreateGroupDialog;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Button, Modal, ModalHeader, ModalBody, ModalFooter } from 'reactstrap';\nimport { Utils } from '../../../utils/utils';\nimport { gettext } from '../../../utils/constants';\nimport UserSelect from '../../user-select';\n\nconst propTypes = {\n  groupName: PropTypes.string.isRequired,\n  transferGroup: PropTypes.func.isRequired,\n  toggleDialog: PropTypes.func.isRequired\n};\n\nclass SysAdminTransferGroupDialog extends React.Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      selectedOption: null,\n      submitBtnDisabled: true\n    };\n  }\n\n  handleSelectChange = (option) => {\n    this.setState({\n      selectedOption: option,\n      submitBtnDisabled: option == null\n    });\n  }\n\n  submit = () => {\n    const receiver = this.state.selectedOption.email;\n    this.props.transferGroup(receiver);\n    this.props.toggleDialog();\n  }\n\n  render() {\n    const { submitBtnDisabled } = this.state;\n    const groupName = '<span class=\"op-target\">' + Utils.HTMLescape(this.props.groupName) +'</span>';\n    const msg = gettext('Transfer Group {placeholder} to').replace('{placeholder}', groupName);\n    return (\n      <Modal isOpen={true}>\n        <ModalHeader toggle={this.props.toggleDialog}>\n          <span dangerouslySetInnerHTML={{__html: msg}}></span>\n        </ModalHeader>\n        <ModalBody>\n          <UserSelect\n            ref=\"userSelect\"\n            isMulti={false}\n            className=\"reviewer-select\"\n            placeholder={gettext('Select a user')}\n            onSelectChange={this.handleSelectChange}\n          />\n        </ModalBody>\n        <ModalFooter>\n          <Button color=\"secondary\" onClick={this.props.toggleDialog}>{gettext('Cancel')}</Button>\n          <Button color=\"primary\" onClick={this.submit} disabled={submitBtnDisabled}>{gettext('Submit')}</Button>\n        </ModalFooter>\n      </Modal>\n    );\n  }\n}\n\nSysAdminTransferGroupDialog.propTypes = propTypes;\n\nexport default SysAdminTransferGroupDialog;\n","import React, { Component, Fragment } from 'react';\nimport { Link } from '@reach/router';\nimport moment from 'moment';\nimport { Utils } from '../../../utils/utils';\nimport { siteRoot, gettext } from '../../../utils/constants';\nimport Loading from '../../../components/loading';\nimport EmptyTip from '../../../components/empty-tip';\nimport Paginator from '../../../components/paginator';\nimport OpMenu from '../../../components/dialog/op-menu';\nimport CommonOperationConfirmationDialog from '../../../components/dialog/common-operation-confirmation-dialog';\nimport SysAdminTransferGroupDialog from '../../../components/dialog/sysadmin-dialog/sysadmin-group-transfer-dialog';\nimport UserLink from '../user-link';\n\nclass Content extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      isItemFreezed: false\n    };\n  }\n\n  onFreezedItem = () => {\n    this.setState({isItemFreezed: true});\n  }\n\n  onUnfreezedItem = () => {\n    this.setState({isItemFreezed: false});\n  }\n\n  getPreviousPage = () => {\n    this.props.getListByPage(this.props.pageInfo.current_page - 1);\n  }\n\n  getNextPage = () => {\n    this.props.getListByPage(this.props.pageInfo.current_page + 1);\n  }\n\n  render() {\n    const { loading, errorMsg, items, pageInfo, curPerPage } = this.props;\n    if (loading) {\n      return <Loading />;\n    } else if (errorMsg) {\n      return <p className=\"error text-center mt-4\">{errorMsg}</p>;\n    } else {\n      const emptyTip = (\n        <EmptyTip>\n          <h2>{gettext('No groups')}</h2>\n        </EmptyTip>\n      );\n      const table = (\n        <Fragment>\n          <table>\n            <thead>\n              <tr>\n                <th width=\"35%\">{gettext('Name')}</th>\n                <th width=\"40%\">{gettext('Owner')}</th>\n                <th width=\"20%\">{gettext('Created At')}</th>\n                <th width=\"5%\">{/* operation */}</th>\n              </tr>\n            </thead>\n            <tbody>\n              {items.map((item, index) => {\n                return (<Item\n                  key={index}\n                  item={item}\n                  isItemFreezed={this.state.isItemFreezed}\n                  onFreezedItem={this.onFreezedItem}\n                  onUnfreezedItem={this.onUnfreezedItem}\n                  deleteGroup={this.props.deleteGroup}\n                  transferGroup={this.props.transferGroup}\n                />);\n              })}\n            </tbody>\n          </table>\n          {pageInfo &&\n          <Paginator\n            gotoPreviousPage={this.getPreviousPage}\n            gotoNextPage={this.getNextPage}\n            currentPage={pageInfo.current_page}\n            hasNextPage={pageInfo.has_next_page}\n            curPerPage={curPerPage}\n            resetPerPage={this.props.resetPerPage}\n          />\n          }\n        </Fragment>\n      );\n      return items.length ? table : emptyTip;\n    }\n  }\n}\n\nclass Item extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      isOpIconShown: false,\n      highlight: false,\n      isDeleteDialogOpen: false,\n      isTransferDialogOpen: false\n    };\n  }\n\n  handleMouseEnter = () => {\n    if (!this.props.isItemFreezed) {\n      this.setState({\n        isOpIconShown: true,\n        highlight: true\n      });\n    }\n  }\n\n  handleMouseLeave = () => {\n    if (!this.props.isItemFreezed) {\n      this.setState({\n        isOpIconShown: false,\n        highlight: false\n      });\n    }\n  }\n\n  onUnfreezedItem = () => {\n    this.setState({\n      highlight: false,\n      isOpIconShow: false\n    });\n    this.props.onUnfreezedItem();\n  }\n\n  onMenuItemClick = (operation) => {\n    switch(operation) {\n      case 'Delete':\n        this.toggleDeleteDialog();\n        break;\n      case 'Transfer':\n        this.toggleTransferDialog();\n        break;\n      default:\n        break;\n    }\n  }\n\n  toggleDeleteDialog = (e) => {\n    if (e) {\n      e.preventDefault();\n    }\n    this.setState({isDeleteDialogOpen: !this.state.isDeleteDialogOpen});\n  }\n\n  toggleTransferDialog = (e) => {\n    if (e) {\n      e.preventDefault();\n    }\n    this.setState({isTransferDialogOpen: !this.state.isTransferDialogOpen});\n  }\n\n  deleteGroup = () => {\n    this.props.deleteGroup(this.props.item.id);\n  }\n\n  transferGroup = (receiver) => {\n    this.props.transferGroup(this.props.item.id, receiver);\n  }\n\n  translateOperations = (item) => {\n    let translateResult = '';\n    switch(item) {\n      case 'Delete':\n        translateResult = gettext('Delete');\n        break;\n      case 'Transfer':\n        translateResult = gettext('Transfer');\n        break;\n    }\n\n    return translateResult;\n  }\n\n  render() {\n    const { item } = this.props;\n    const { isOpIconShown, isDeleteDialogOpen, isTransferDialogOpen } = this.state;\n\n    let groupName = '<span class=\"op-target\">' + Utils.HTMLescape(item.name) + '</span>';\n    let deleteDialogMsg = gettext('Are you sure you want to delete {placeholder} ?').replace('{placeholder}', groupName);\n\n    const groupUrl = item.parent_group_id == 0 ?\n      `${siteRoot}sys/groups/${item.id}/libraries/` :\n      `${siteRoot}sys/departments/${item.id}/`;\n\n    return (\n      <Fragment>\n        <tr className={this.state.highlight ? 'tr-highlight' : ''} onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave}>\n          <td><Link to={groupUrl}>{item.name}</Link></td>\n          <td>\n            {item.owner == 'system admin' ?\n              '--' :\n              <UserLink email={item.owner} name={item.owner_name} />\n            }\n          </td>\n          <td>\n            <span title={moment(item.created_at).format('llll')}>{moment(item.created_at).fromNow()}</span>\n          </td>\n          <td>\n            {(isOpIconShown && item.owner != 'system admin') &&\n            <OpMenu\n              operations={['Delete', 'Transfer']}\n              translateOperations={this.translateOperations}\n              onMenuItemClick={this.onMenuItemClick}\n              onFreezedItem={this.props.onFreezedItem}\n              onUnfreezedItem={this.onUnfreezedItem}\n            />\n            }\n          </td>\n        </tr>\n        {isDeleteDialogOpen &&\n          <CommonOperationConfirmationDialog\n            title={gettext('Delete Group')}\n            message={deleteDialogMsg}\n            executeOperation={this.deleteGroup}\n            confirmBtnText={gettext('Delete')}\n            toggleDialog={this.toggleDeleteDialog}\n          />\n        }\n        {isTransferDialogOpen &&\n          <SysAdminTransferGroupDialog\n            groupName={item.name}\n            transferGroup={this.transferGroup}\n            toggleDialog={this.toggleTransferDialog}\n          />\n        }\n      </Fragment>\n    );\n  }\n}\n\nexport default Content;\n","import React, { Component, Fragment } from 'react';\nimport { navigate } from '@reach/router';\nimport { Button } from 'reactstrap';\nimport { Utils } from '../../../utils/utils';\nimport { seafileAPI } from '../../../utils/seafile-api';\nimport { siteRoot, gettext } from '../../../utils/constants';\nimport toaster from '../../../components/toast';\nimport SysAdminCreateGroupDialog from '../../../components/dialog/sysadmin-dialog/sysadmin-create-group-dialog';\nimport MainPanelTopbar from '../main-panel-topbar';\nimport Search from '../search';\nimport Content from './groups-content';\n\nclass Groups extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      loading: true,\n      errorMsg: '',\n      groupList: [],\n      pageInfo: {},\n      perPage: 25,\n      isCreateGroupDialogOpen: false\n    };\n  }\n\n  componentDidMount () {\n    let urlParams = (new URL(window.location)).searchParams;\n    const { currentPage = 1, perPage } = this.state;\n    this.setState({\n      perPage: parseInt(urlParams.get('per_page') || perPage),\n      currentPage: parseInt(urlParams.get('page') || currentPage)\n    }, () => {\n      this.getGroupListByPage(this.state.currentPage);\n    });\n  }\n\n  toggleCreateGroupDialog = () => {\n    this.setState({isCreateGroupDialogOpen: !this.state.isCreateGroupDialogOpen});\n  }\n\n  getGroupListByPage = (page) => {\n    seafileAPI.sysAdminListAllGroups(page, this.state.perPage).then((res) => {\n      this.setState({\n        loading: false,\n        groupList: res.data.groups,\n        pageInfo: res.data.page_info\n      });\n    }).catch((error) => {\n      this.setState({\n        loading: false,\n        errorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403\n      });\n    });\n  }\n\n  resetPerPage = (perPage) => {\n    this.setState({\n      perPage: perPage\n    }, () => {\n      this.getGroupListByPage(1);\n    });\n  }\n\n  createGroup = (groupName, OnwerEmail) => {\n    seafileAPI.sysAdminCreateNewGroup(groupName, OnwerEmail).then(res => {\n      let newGroupList = this.state.groupList;\n      newGroupList.unshift(res.data);\n      this.setState({\n        groupList: newGroupList\n      });\n      this.toggleCreateGroupDialog();\n    }).catch((error) => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  deleteGroup = (groupID) => {\n    seafileAPI.sysAdminDismissGroupByID(groupID).then(res => {\n      let newGroupList = this.state.groupList.filter(item => {\n        return item.id != groupID;\n      });\n      this.setState({\n        groupList: newGroupList\n      });\n      toaster.success(gettext('Successfully deleted 1 item.'));\n    }).catch((error) => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  transferGroup = (groupID, receiverEmail) => {\n    seafileAPI.sysAdminTransferGroup(receiverEmail, groupID).then(res => {\n      let newGroupList = this.state.groupList.map(item => {\n        if (item.id == groupID) {\n          item = res.data;\n        }\n        return item;\n      });\n      this.setState({\n        groupList: newGroupList\n      });\n      toaster.success(gettext('Successfully transferred the group.'));\n    }).catch((error) => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  getSearch = () => {\n    return <Search\n      placeholder={gettext('Search groups by name')}\n      submit={this.searchGroups}\n    />;\n  }\n\n  searchGroups = (name) => {\n    navigate(`${siteRoot}sys/search-groups/?name=${encodeURIComponent(name)}`);\n  }\n\n  render() {\n    let { isCreateGroupDialogOpen } = this.state;\n\n    return (\n      <Fragment>\n        <MainPanelTopbar search={this.getSearch()}>\n          <Fragment>\n            <Button className=\"operation-item\" onClick={this.toggleCreateGroupDialog}>{gettext('New Group')}</Button>\n            <a className=\"btn btn-secondary operation-item\" href={`${siteRoot}sys/groupadmin/export-excel/`}>{gettext('Export Excel')}</a>\n          </Fragment>\n        </MainPanelTopbar>\n        <div className=\"main-panel-center flex-row\">\n          <div className=\"cur-view-container\">\n            <div className=\"cur-view-path\">\n              <h3 className=\"sf-heading\">{gettext('Groups')}</h3>\n            </div>\n            <div className=\"cur-view-content\">\n              <Content\n                loading={this.state.loading}\n                errorMsg={this.state.errorMsg}\n                items={this.state.groupList}\n                pageInfo={this.state.pageInfo}\n                deleteGroup={this.deleteGroup}\n                transferGroup={this.transferGroup}\n                getListByPage={this.getGroupListByPage}\n                resetPerPage={this.resetPerPage}\n                curPerPage={this.state.perPage}\n              />\n            </div>\n          </div>\n        </div>\n        {isCreateGroupDialogOpen &&\n          <SysAdminCreateGroupDialog\n            createGroup={this.createGroup}\n            toggleDialog={this.toggleCreateGroupDialog}\n          />\n        }\n      </Fragment>\n    );\n  }\n}\n\nexport default Groups;\n","import React, { Component, Fragment } from 'react';\nimport { Form, FormGroup, Input, Label, Col } from 'reactstrap';\nimport { Utils } from '../../../utils/utils';\nimport { seafileAPI } from '../../../utils/seafile-api';\nimport { gettext } from '../../../utils/constants';\nimport toaster from '../../../components/toast';\nimport MainPanelTopbar from '../main-panel-topbar';\nimport Content from './groups-content';\n\nclass SearchGroups extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      name: '',\n      isSubmitBtnActive: false,\n      loading: true,\n      errorMsg: '',\n      groupList: [],\n      pageInfo: null\n    };\n  }\n\n  componentDidMount () {\n    let params = (new URL(document.location)).searchParams;\n    this.setState({\n      name: params.get('name') || ''\n    }, this.getGroups);\n  }\n\n  getGroups = () => {\n    const { name } = this.state;\n    seafileAPI.sysAdminSearchGroups(name).then((res) => {\n      this.setState({\n        loading: false,\n        groupList: res.data.group_list\n      });\n    }).catch((error) => {\n      this.setState({\n        loading: false,\n        errorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403\n      });\n    });\n  }\n\n  deleteGroup = (groupID) => {\n    seafileAPI.sysAdminDismissGroupByID(groupID).then(res => {\n      let newGroupList = this.state.groupList.filter(item => {\n        return item.id != groupID;\n      });\n      this.setState({\n        groupList: newGroupList\n      });\n      toaster.success(gettext('Successfully deleted 1 item.'));\n    }).catch((error) => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  transferGroup = (groupID, receiverEmail) => {\n    seafileAPI.sysAdminTransferGroup(receiverEmail, groupID).then(res => {\n      let newGroupList = this.state.groupList.map(item => {\n        if (item.id == groupID) {\n          item = res.data;\n        }\n        return item;\n      });\n      this.setState({\n        groupList: newGroupList\n      });\n      toaster.success(gettext('Successfully transferred the group.'));\n    }).catch((error) => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  handleNameInputChange = (e) => {\n    this.setState({\n      name: e.target.value\n    }, this.checkSubmitBtnActive);\n  }\n\n  checkSubmitBtnActive = () => {\n    const { name } = this.state;\n    this.setState({\n      isSubmitBtnActive: name.trim()\n    });\n  }\n\n  render() {\n    const { name, isSubmitBtnActive } = this.state;\n\n    return (\n      <Fragment>\n        <MainPanelTopbar />\n        <div className=\"main-panel-center flex-row\">\n          <div className=\"cur-view-container\">\n            <div className=\"cur-view-path\">\n              <h3 className=\"sf-heading\">{gettext('Groups')}</h3>\n            </div>\n            <div className=\"cur-view-content\">\n              <div className=\"mt-4 mb-6\">\n                <h4 className=\"border-bottom font-weight-normal mb-2 pb-1\">{gettext('Search Groups')}</h4>\n                <p className=\"text-secondary small\">{gettext('Tip: you can search by keyword in name.')}</p>\n                <Form>\n                  <FormGroup row>\n                    <Label for=\"name\" sm={1}>{gettext('Name')}</Label>\n                    <Col sm={5}>\n                      <Input type=\"text\" name=\"name\" id=\"name\" value={name} onChange={this.handleNameInputChange} />\n                    </Col>\n                  </FormGroup>\n                  <FormGroup row>\n                    <Col sm={{size: 5, offset: 1}}>\n                      <button className=\"btn btn-outline-primary\" disabled={!isSubmitBtnActive} onClick={this.getGroups}>{gettext('Submit')}</button>\n                    </Col>\n                  </FormGroup>\n                </Form>\n              </div>\n              <div className=\"mt-4 mb-6\">\n                <h4 className=\"border-bottom font-weight-normal mb-2 pb-1\">{gettext('Result')}</h4>\n                <Content\n                  loading={this.state.loading}\n                  errorMsg={this.state.errorMsg}\n                  items={this.state.groupList}\n                  deleteGroup={this.deleteGroup}\n                  transferGroup={this.transferGroup}\n                />\n              </div>\n            </div>\n          </div>\n        </div>\n      </Fragment>\n    );\n  }\n}\n\nexport default SearchGroups;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Link } from '@reach/router';\nimport { siteRoot, gettext } from '../../../utils/constants';\n\nconst propTypes = {\n  currentItem: PropTypes.string.isRequired,\n  groupID: PropTypes.string.isRequired\n};\n\nclass Nav extends React.Component {\n\n  constructor(props) {\n    super(props);\n    this.navItems = [\n      {name: 'repos', urlPart: 'groups/' + this.props.groupID + '/libraries', text: gettext('Libraries')},\n      {name: 'members', urlPart: 'groups/' + this.props.groupID + '/members', text: gettext('Members')}\n    ];\n  }\n\n  render() {\n    const { groupName, currentItem } = this.props;\n    return (\n      <div>\n        <div className=\"cur-view-path\">\n          <h3 className=\"sf-heading\"><Link to={`${siteRoot}sys/groups/`}>{gettext('Groups')}</Link> / {groupName}</h3>\n        </div>\n        <ul className=\"nav border-bottom mx-4\">\n          {this.navItems.map((item, index) => {\n            return (\n              <li className=\"nav-item mr-2\" key={index}>\n                <Link to={`${siteRoot}sys/${item.urlPart}/`} className={`nav-link ${currentItem == item.name ? ' active' : ''}`}>{item.text}</Link>\n              </li>\n            );\n          })}\n        </ul>\n      </div>\n    );\n  }\n}\n\nNav.propTypes = propTypes;\n\nexport default Nav;\n","import React, { Component, Fragment } from 'react';\nimport { Utils } from '../../../utils/utils';\nimport { seafileAPI } from '../../../utils/seafile-api';\nimport { siteRoot, gettext, isPro } from '../../../utils/constants';\nimport toaster from '../../../components/toast';\nimport EmptyTip from '../../../components/empty-tip';\nimport Loading from '../../../components/loading';\nimport CommonOperationConfirmationDialog from '../../../components/dialog/common-operation-confirmation-dialog';\nimport MainPanelTopbar from '../main-panel-topbar';\nimport UserLink from '../user-link';\nimport GroupNav from './group-nav';\n\nconst { enableSysAdminViewRepo } = window.sysadmin.pageOptions;\n\nclass Content extends Component {\n\n  constructor(props) {\n    super(props);\n  }\n\n  render() {\n    const { loading, errorMsg, items } = this.props;\n    if (loading) {\n      return <Loading />;\n    } else if (errorMsg) {\n      return <p className=\"error text-center mt-4\">{errorMsg}</p>;\n    } else {\n      const emptyTip = (\n        <EmptyTip>\n          <h2>{gettext('No libraries')}</h2>\n        </EmptyTip>\n      );\n      const table = (\n        <Fragment>\n          <table className=\"table-hover\">\n            <thead>\n              <tr>\n                <th width=\"5%\">{/* icon */}</th>\n                <th width=\"30%\">{gettext('Name')}</th>\n                <th width=\"30%\">{gettext('Size')}</th>\n                <th width=\"25%\">{gettext('Shared By')}</th>\n                <th width=\"10%\">{/*Operations*/}</th>\n              </tr>\n            </thead>\n            <tbody>\n              {items.map((item, index) => {\n                return (<Item\n                  key={index}\n                  item={item}\n                  unshareRepo={this.props.unshareRepo}\n                />);\n              })}\n            </tbody>\n          </table>\n        </Fragment>\n      );\n      return items.length ? table : emptyTip;\n    }\n  }\n}\n\nclass Item extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      isOpIconShown: false,\n      isUnshareRepoDialogOpen: false\n    };\n  }\n\n  handleMouseEnter = () => {\n    this.setState({isOpIconShown: true});\n  }\n\n  handleMouseLeave = () => {\n    this.setState({isOpIconShown: false});\n  }\n\n  toggleUnshareRepoDialog = (e) => {\n    if (e) {\n      e.preventDefault();\n    }\n    this.setState({isUnshareRepoDialogOpen: !this.state.isUnshareRepoDialogOpen});\n  }\n\n  unshareRepo = () => {\n    const { item } = this.props;\n    this.props.unshareRepo(item.repo_id, item.name);\n    this.toggleUnshareRepoDialog();\n  }\n\n  renderRepoName = () => {\n    const { item } = this.props;\n    const repo = item;\n    repo.id = item.repo_id;\n    if (repo.name) {\n      if (isPro && enableSysAdminViewRepo && !repo.encrypted) {\n        return <a href={`${siteRoot}sys/libraries/${repo.id}/`}>{repo.name}</a>;\n      } else {\n        return repo.name;\n      }\n    } else {\n      return '--';\n    }\n  }\n\n  render() {\n    let { isOpIconShown, isUnshareRepoDialogOpen } = this.state;\n    let { item } = this.props;\n\n    let iconUrl = Utils.getLibIconUrl(item);\n    let iconTitle = Utils.getLibIconTitle(item);\n\n    let repoName = '<span class=\"op-target\">' + Utils.HTMLescape(item.name) + '</span>';\n    let dialogMsg = gettext('Are you sure you want to unshare {placeholder} ?').replace('{placeholder}', repoName);\n\n    return (\n      <Fragment>\n        <tr onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave}>\n          <td><img src={iconUrl} title={iconTitle} alt={iconTitle} width=\"24\" /></td>\n          <td>{this.renderRepoName()}</td>\n          <td>{Utils.bytesToSize(item.size)}</td>\n          <td>\n            <UserLink email={item.shared_by} name={item.shared_by_name} />\n          </td>\n          <td>\n            <a href=\"#\" className={`action-icon sf2-icon-x3 ${isOpIconShown ? '' : 'invisible'}`} title={gettext('Unshare')} onClick={this.toggleUnshareRepoDialog}></a>\n          </td>\n        </tr>\n        {isUnshareRepoDialogOpen &&\n          <CommonOperationConfirmationDialog\n            title={gettext('Unshare Library')}\n            message={dialogMsg}\n            executeOperation={this.unshareRepo}\n            confirmBtnText={gettext('Unshare')}\n            toggleDialog={this.toggleUnshareRepoDialog}\n          />\n        }\n      </Fragment>\n    );\n  }\n}\n\nclass GroupRepos extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      loading: true,\n      errorMsg: '',\n      groupName: '',\n      repoList: []\n    };\n  }\n\n  componentDidMount () {\n    seafileAPI.sysAdminListGroupRepos(this.props.groupID).then((res) => {\n      this.setState({\n        loading: false,\n        repoList: res.data.libraries,\n        groupName: res.data.group_name\n      });\n    }).catch((error) => {\n      this.setState({\n        loading: false,\n        errorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403\n      });\n    });\n  }\n\n  unshareRepo = (repoID, repoName) => {\n    seafileAPI.sysAdminUnshareRepoFromGroup(this.props.groupID, repoID).then(res => {\n      let newRepoList = this.state.repoList.filter(item => {\n        return item.repo_id != repoID;\n      });\n      this.setState({\n        repoList: newRepoList\n      });\n      const msg = gettext('Successfully unshared library {placeholder}')\n        .replace('{placeholder}', repoName);\n      toaster.success(msg);\n    }).catch((error) => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  render() {\n    return (\n      <Fragment>\n        <MainPanelTopbar />\n        <div className=\"main-panel-center flex-row\">\n          <div className=\"cur-view-container\">\n            <GroupNav\n              groupID={this.props.groupID}\n              groupName={this.state.groupName}\n              currentItem=\"repos\"\n            />\n            <div className=\"cur-view-content\">\n              <Content\n                loading={this.state.loading}\n                errorMsg={this.state.errorMsg}\n                items={this.state.repoList}\n                unshareRepo={this.unshareRepo}\n              />\n            </div>\n          </div>\n        </div>\n      </Fragment>\n    );\n  }\n}\n\nexport default GroupRepos;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Button, Modal, ModalHeader, ModalBody, ModalFooter } from 'reactstrap';\nimport { gettext } from '../../../utils/constants';\nimport UserSelect from '../../user-select';\n\nconst propTypes = {\n  toggle: PropTypes.func.isRequired,\n  addMembers: PropTypes.func.isRequired\n};\n\nclass SysAdminGroupAddMemberDialog extends React.Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      selectedOptions: null,\n      isSubmitBtnDisabled: true\n    };\n  }\n\n  handleSelectChange = (options) => {\n    this.setState({\n      selectedOptions: options,\n      isSubmitBtnDisabled: !options.length\n    });\n  }\n\n  addMembers = () => {\n    let emails = this.state.selectedOptions.map(item => item.email);\n    this.props.addMembers(emails);\n    this.props.toggle();\n  }\n\n  render() {\n    const { isSubmitBtnDisabled } = this.state;\n    return (\n      <Modal isOpen={true}>\n        <ModalHeader toggle={this.props.toggle}>{gettext('Add Member')}</ModalHeader>\n        <ModalBody>\n          <UserSelect\n            ref=\"userSelect\"\n            isMulti={true}\n            className=\"reviewer-select\"\n            placeholder={gettext('Search users...')}\n            onSelectChange={this.handleSelectChange}\n          />\n        </ModalBody>\n        <ModalFooter>\n          <Button color=\"secondary\" onClick={this.props.toggle}>{gettext('Cancel')}</Button>\n          <Button color=\"primary\" onClick={this.addMembers} disabled={isSubmitBtnDisabled}>{gettext('Submit')}</Button>\n        </ModalFooter>\n      </Modal>\n    );\n  }\n}\n\nSysAdminGroupAddMemberDialog.propTypes = propTypes;\n\nexport default SysAdminGroupAddMemberDialog;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { gettext } from '../../utils/constants';\nimport SelectEditor from './select-editor';\n\nconst propTypes = {\n  isTextMode: PropTypes.bool.isRequired,\n  isEditIconShow: PropTypes.bool.isRequired,\n  roleOptions: PropTypes.array.isRequired,\n  currentRole: PropTypes.string.isRequired,\n  onRoleChanged: PropTypes.func.isRequired\n};\n\nclass SysAdminGroupRoleEditor extends React.Component {\n\n  translateRoles = (role) => {\n    switch (role) {\n      case 'Member':\n        return gettext('Member');\n      case 'Admin':\n        return gettext('Admin');\n      default:\n        return role;\n    }\n  }\n\n  render() {\n    return (\n      <SelectEditor\n        isTextMode={this.props.isTextMode}\n        isEditIconShow={this.props.isEditIconShow}\n        options={this.props.roleOptions}\n        currentOption={this.props.currentRole}\n        onOptionChanged={this.props.onRoleChanged}\n        translateOption={this.translateRoles}\n      />\n    );\n  }\n}\n\nSysAdminGroupRoleEditor.propTypes = propTypes;\n\nexport default SysAdminGroupRoleEditor;","import React, { Component, Fragment } from 'react';\nimport { Button } from 'reactstrap';\nimport { Utils } from '../../../utils/utils';\nimport { seafileAPI } from '../../../utils/seafile-api';\nimport { siteRoot, gettext } from '../../../utils/constants';\nimport toaster from '../../../components/toast';\nimport EmptyTip from '../../../components/empty-tip';\nimport Loading from '../../../components/loading';\nimport Paginator from '../../../components/paginator';\nimport CommonOperationConfirmationDialog from '../../../components/dialog/common-operation-confirmation-dialog';\nimport SysAdminGroupAddMemberDialog from '../../../components/dialog/sysadmin-dialog/sysadmin-group-add-member-dialog';\nimport SysAdminGroupRoleEditor from '../../../components/select-editor/sysadmin-group-role-editor';\nimport MainPanelTopbar from '../main-panel-topbar';\nimport UserLink from '../user-link';\nimport GroupNav from './group-nav';\n\nclass Content extends Component {\n\n  constructor(props) {\n    super(props);\n  }\n\n  getPreviousPageList = () => {\n    this.props.getListByPage(this.props.pageInfo.current_page - 1);\n  }\n\n  getNextPageList = () => {\n    this.props.getListByPage(this.props.pageInfo.current_page + 1);\n  }\n\n  render() {\n    const { loading, errorMsg, items, pageInfo, curPerPage } = this.props;\n    if (loading) {\n      return <Loading />;\n    } else if (errorMsg) {\n      return <p className=\"error text-center mt-4\">{errorMsg}</p>;\n    } else {\n      const emptyTip = (\n        <EmptyTip>\n          <h2>{gettext('No members')}</h2>\n        </EmptyTip>\n      );\n      const table = (\n        <Fragment>\n          <table className=\"table-hover\">\n            <thead>\n              <tr>\n                <th width=\"5%\">{/* icon */}</th>\n                <th width=\"55%\">{gettext('Name')}</th>\n                <th width=\"30%\">{gettext('Role')}</th>\n                <th width=\"10%\">{/*Operations*/}</th>\n              </tr>\n            </thead>\n            <tbody>\n              {items.map((item, index) => {\n                return (<Item\n                  key={index}\n                  item={item}\n                  removeMember={this.props.removeMember}\n                  updateMemberRole={this.props.updateMemberRole}\n                />);\n              })}\n            </tbody>\n          </table>\n          {pageInfo &&\n          <Paginator\n            gotoPreviousPage={this.getPreviousPageList}\n            gotoNextPage={this.getNextPageList}\n            currentPage={pageInfo.current_page}\n            hasNextPage={pageInfo.has_next_page}\n            curPerPage={curPerPage}\n            resetPerPage={this.props.resetPerPage}\n          />\n          }\n        </Fragment>\n      );\n      return items.length ? table : emptyTip;\n    }\n  }\n}\n\nclass Item extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      isOpIconShown: false,\n      isDeleteDialogOpen: false\n    };\n  }\n\n  handleMouseEnter = () => {\n    this.setState({isOpIconShown: true});\n  }\n\n  handleMouseLeave = () => {\n    this.setState({isOpIconShown: false});\n  }\n\n  toggleDeleteDialog = (e) => {\n    if (e) {\n      e.preventDefault();\n    }\n    this.setState({isDeleteDialogOpen: !this.state.isDeleteDialogOpen});\n  }\n\n  removeMember = () => {\n    const { item } = this.props;\n    this.props.removeMember(item.email, item.name);\n    this.toggleDeleteDialog();\n  }\n\n  updateMemberRole = (role) => {\n    this.props.updateMemberRole(this.props.item.email, role);\n  }\n\n  render() {\n    let { isOpIconShown, isDeleteDialogOpen } = this.state;\n    let { item } = this.props;\n\n    let itemName = '<span class=\"op-target\">' + Utils.HTMLescape(item.name) + '</span>';\n    let dialogMsg = gettext('Are you sure you want to remove {placeholder} ?').replace('{placeholder}', itemName);\n\n    return (\n      <Fragment>\n        <tr onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave}>\n          <td><img src={item.avatar_url} alt=\"\" className=\"rounded-circle\" width=\"24\" /></td>\n          <td><UserLink email={item.email} name={item.name} /></td>\n          <td>\n            {item.role == 'Owner' ?\n              gettext('Owner') :\n              <SysAdminGroupRoleEditor\n                isTextMode={true}\n                isEditIconShow={isOpIconShown}\n                roleOptions={['Member', 'Admin']}\n                currentRole={item.role}\n                onRoleChanged={this.updateMemberRole}\n              />\n            }\n          </td>\n          <td>\n            {item.role != 'Owner' &&\n            <a href=\"#\" className={`action-icon sf2-icon-x3 ${isOpIconShown ? '' : 'invisible'}`} title={gettext('Remove')} onClick={this.toggleDeleteDialog}></a>\n            }\n          </td>\n        </tr>\n        {isDeleteDialogOpen &&\n          <CommonOperationConfirmationDialog\n            title={gettext('Remove Member')}\n            message={dialogMsg}\n            executeOperation={this.removeMember}\n            confirmBtnText={gettext('Remove')}\n            toggleDialog={this.toggleDeleteDialog}\n          />\n        }\n      </Fragment>\n    );\n  }\n}\n\nclass GroupMembers extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      loading: true,\n      errorMsg: '',\n      groupName: '',\n      memberList: [],\n      pageInfo: {},\n      currentPage: 1,\n      perPage: 25,\n      isAddMemberDialogOpen: false\n    };\n  }\n\n  componentDidMount () {\n\n    let urlParams = (new URL(window.location)).searchParams;\n    const { currentPage, perPage } = this.state;\n    this.setState({\n      currentPage: parseInt(urlParams.get('page') || currentPage),\n      perPage: parseInt(urlParams.get('per_page') || perPage)\n    }, () => {\n      this.getListByPage(this.state.currentPage);\n    });\n  }\n\n  getListByPage = (page) => {\n    const { perPage } = this.state;\n    seafileAPI.sysAdminListGroupMembers(this.props.groupID, page, perPage).then((res) => {\n      this.setState({\n        loading: false,\n        memberList: res.data.members,\n        groupName: res.data.group_name,\n        pageInfo: res.data.page_info\n      });\n    }).catch((error) => {\n      this.setState({\n        loading: false,\n        errorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403\n      });\n    });\n  }\n\n  resetPerPage = (perPage) => {\n    this.setState({\n      perPage: perPage\n    }, () => {\n      this.getListByPage(1);\n    });\n  }\n\n  toggleAddMemgerDialog = () => {\n    this.setState({isAddMemberDialogOpen: !this.state.isAddMemberDialogOpen});\n  }\n\n  addMembers = (emails) => {\n    seafileAPI.sysAdminAddGroupMember(this.props.groupID, emails).then(res => {\n      let newMemberList = res.data.success;\n      if (newMemberList.length) {\n        this.setState({\n          memberList: newMemberList.concat(this.state.memberList)\n        });\n        newMemberList.map(item => {\n          const msg = gettext('Successfully added {email_placeholder}')\n            .replace('{email_placeholder}', item.email);\n          toaster.success(msg);\n        });\n      }\n      res.data.failed.map(item => {\n        const msg = gettext('Failed to add {email_placeholder}: {error_msg_placeholder}')\n          .replace('{email_placeholder}', item.email)\n          .replace('{error_msg_placeholder}', item.error_msg);\n        toaster.danger(msg, {duration: 3});\n      });\n    }).catch((error) => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  removeMember = (email, name) => {\n    seafileAPI.sysAdminDeleteGroupMember(this.props.groupID, email).then(res => {\n      let newRepoList = this.state.memberList.filter(item => {\n        return item.email != email;\n      });\n      this.setState({\n        memberList: newRepoList\n      });\n      toaster.success(gettext('Successfully removed {placeholder}.').replace('{placeholder}', name));\n    }).catch((error) => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  updateMemberRole = (email, role) => {\n    let isAdmin = role == 'Admin';\n    seafileAPI.sysAdminUpdateGroupMemberRole(this.props.groupID, email, isAdmin).then(res => {\n      let newRepoList = this.state.memberList.map(item => {\n        if (item.email == email) {\n          item.role = role;\n        }\n        return item;\n      });\n      this.setState({\n        memberList: newRepoList\n      });\n    }).catch((error) => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  render() {\n    let { isAddMemberDialogOpen } = this.state;\n    return (\n      <Fragment>\n        <MainPanelTopbar>\n          <Button className=\"btn btn-secondary operation-item\" onClick={this.toggleAddMemgerDialog}>{gettext('Add Member')}</Button>\n        </MainPanelTopbar>\n        <div className=\"main-panel-center flex-row\">\n          <div className=\"cur-view-container\">\n            <GroupNav\n              currentItem=\"members\"\n              groupID={this.props.groupID}\n              groupName={this.state.groupName}\n            />\n            <div className=\"cur-view-content\">\n              <Content\n                loading={this.state.loading}\n                errorMsg={this.state.errorMsg}\n                items={this.state.memberList}\n                removeMember={this.removeMember}\n                updateMemberRole={this.updateMemberRole}\n                pageInfo={this.state.pageInfo}\n                curPerPage={this.state.perPage}\n                getListByPage={this.getListByPage}\n                resetPerPage={this.resetPerPage}\n              />\n            </div>\n          </div>\n        </div>\n        {isAddMemberDialogOpen &&\n          <SysAdminGroupAddMemberDialog\n            addMembers={this.addMembers}\n            toggle={this.toggleAddMemgerDialog}\n          />\n        }\n      </Fragment>\n    );\n  }\n}\n\nexport default GroupMembers;\n","import React from 'react';\nimport '../../../css/org-department-item.css';\n\nclass Departments extends React.Component {\n\n  constructor(props) {\n    super(props);\n  }\n\n  render() {\n    return (\n      <div className=\"h-100 org-departments\">\n        {this.props.children}\n      </div>\n    );\n  }\n}\n\nexport default Departments;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Button, Modal, ModalHeader, ModalBody, ModalFooter, Input, Form, FormGroup, Label } from 'reactstrap';\nimport { gettext, orgID } from '../../../utils/constants';\nimport { seafileAPI } from '../../../utils/seafile-api';\n\nconst propTypes = {\n  groupID: PropTypes.string,\n  parentGroupID: PropTypes.string,\n  toggle: PropTypes.func.isRequired,\n  onDepartChanged: PropTypes.func.isRequired,\n};\n\nclass AddDepartDialog extends React.Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      departName: '',\n      errMessage: '',\n    };\n    this.newInput = React.createRef();\n  }\n\n  componentDidMount() {\n    this.newInput.focus();\n    this.newInput.setSelectionRange(0, 0);\n  }\n\n  handleSubmit = () => {\n    let isValid = this.validateName();\n    if (isValid) {\n      let parentGroup = -1;\n      if (this.props.parentGroupID) {\n        parentGroup = this.props.parentGroupID;\n      }\n      seafileAPI.sysAdminAddNewDepartment(parentGroup, this.state.departName.trim()).then((res) => {\n        this.props.toggle();\n        this.props.onDepartChanged();\n      }).catch(error => {\n        let errorMsg = gettext(error.response.data.error_msg);\n        this.setState({ errMessage: errorMsg });\n      });\n    }\n  }\n\n  validateName = () => {\n    let errMessage = '';\n    const name = this.state.departName.trim();\n    if (!name.length) {\n      errMessage = gettext('Name is required');\n      this.setState({ errMessage: errMessage });\n      return false;\n    }\n    return true;\n  }\n\n  handleChange = (e) => {\n    this.setState({\n      departName: e.target.value,\n    });\n  }\n\n  handleKeyPress = (e) => {\n    if (e.key === 'Enter') {\n      this.handleSubmit();\n      e.preventDefault();\n    }\n  }\n\n  render() {\n    let header = this.props.parentGroupID ? gettext('New Sub-department') : gettext('New Department');\n    return (\n      <Modal isOpen={true} toggle={this.props.toggle}>\n        <ModalHeader toggle={this.props.toggle}>{header}</ModalHeader>\n        <ModalBody>\n          <Form>\n            <FormGroup>\n              <Label for=\"departName\">{gettext('Name')}</Label>\n              <Input\n                id=\"departName\"\n                onKeyPress={this.handleKeyPress}\n                value={this.state.departName}\n                onChange={this.handleChange}\n                innerRef={input => {this.newInput = input;}}\n              />\n            </FormGroup>\n          </Form>\n          { this.state.errMessage && <p className=\"error\">{this.state.errMessage}</p> }\n        </ModalBody>\n        <ModalFooter>\n          <Button color=\"primary\" onClick={this.handleSubmit}>{gettext('Submit')}</Button>\n        </ModalFooter>\n      </Modal>\n    );\n  }\n}\n\nAddDepartDialog.propTypes = propTypes;\n\nexport default AddDepartDialog;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Button, Modal, ModalHeader, ModalBody, ModalFooter } from 'reactstrap';\nimport { gettext } from '../../../utils/constants';\nimport { seafileAPI } from '../../../utils/seafile-api';\nimport { Utils } from '../../../utils/utils';\nimport toaster from '../../../components/toast';\n\nconst propTypes = {\n  groupName: PropTypes.string,\n  groupID: PropTypes.number.isRequired,\n  toggle: PropTypes.func.isRequired,\n  onDepartChanged: PropTypes.func.isRequired\n};\n\nclass DeleteDepartDialog extends React.Component {\n\n  constructor(props) {\n    super(props);\n  }\n\n  deleteDepart = () => {\n    this.props.toggle();\n    seafileAPI.sysAdminDeleteDepartment(this.props.groupID).then((res) => {\n      this.props.onDepartChanged();\n    }).catch(error => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  render() {\n    let tipMessage = gettext('Are you sure you want to delete {placeholder} ?');\n    tipMessage = tipMessage.replace('{placeholder}', '<span class=\"op-target\">' + Utils.HTMLescape(this.props.groupName) + '</span>');\n    return (\n      <Modal isOpen={true} toggle={this.props.toggle}>\n        <ModalHeader toggle={this.props.toggle}>{gettext('Delete Department')}</ModalHeader>\n        <ModalBody>\n          <p dangerouslySetInnerHTML={{__html: tipMessage}}></p>\n        </ModalBody>\n        <ModalFooter>\n          <Button color=\"secondary\" onClick={this.props.toggle}>{gettext('Cancel')}</Button>\n          <Button color=\"primary\" onClick={this.deleteDepart}>{gettext('Delete')}</Button>\n        </ModalFooter>\n      </Modal>\n    );\n  }\n}\n\nDeleteDepartDialog.propTypes = propTypes;\n\nexport default DeleteDepartDialog;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Button, Modal, ModalHeader, ModalBody, ModalFooter, Input, InputGroupAddon, InputGroup } from 'reactstrap';\nimport { gettext } from '../../../utils/constants';\nimport { seafileAPI } from '../../../utils/seafile-api';\nimport { Utils } from '../../../utils/utils';\nimport toaster from '../../toast';\n\nconst propTypes = {\n  toggle: PropTypes.func.isRequired,\n  groupID: PropTypes.number.isRequired,\n  onDepartChanged: PropTypes.func.isRequired,\n};\n\nclass SetGroupQuotaDialog extends React.Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      quota: '',\n      errMessage: '',\n    };\n    this.newInput = React.createRef();\n  }\n\n  componentDidMount() {\n    this.newInput.focus();\n    this.newInput.setSelectionRange(0, 0);\n  }\n\n  setGroupQuota = () => {\n    const numberReg = /^[1-9]\\d*$/im;\n    let quota = this.state.quota;\n    if ((quota.length && numberReg.test(quota)) || quota == -2) {\n      this.setState({ errMessage: '' });\n      let newQuota = this.state.quota == -2 ? this.state.quota : this.state.quota * 1000000;\n      seafileAPI.sysAdminUpdateDepartmentQuota(this.props.groupID, newQuota).then((res) => {\n        this.props.toggle();\n        this.props.onDepartChanged();\n      }).catch(error => {\n        let errMessage = Utils.getErrorMsg(error);\n        toaster.danger(errMessage);\n      });\n    } else {\n      const err = gettext('Quota is invalid.');\n      this.setState({ errMessage: err });\n    }\n  }\n\n  handleChange = (e) => {\n    const quota = e.target.value.trim();\n    this.setState({ quota: quota });\n  }\n\n  handleKeyPress = (e) => {\n    if (e.key === 'Enter') {\n      this.setGroupQuota();\n      e.preventDefault();\n    }\n  }\n\n  render() {\n    return (\n      <Modal isOpen={true} toggle={this.props.toggle}>\n        <ModalHeader toggle={this.props.toggle}>{gettext('Set Quota')}</ModalHeader>\n        <ModalBody>\n          <InputGroup>\n            <Input\n              onKeyPress={this.handleKeyPress}\n              value={this.state.quota}\n              onChange={this.handleChange}\n              innerRef={input => {this.newInput = input;}}\n            />\n            <InputGroupAddon addonType=\"append\">{'MB'}</InputGroupAddon>\n          </InputGroup>\n          <p className=\"tip\">\n            <br/><span>{gettext('An integer that is greater than 0 or equal to -2.')}</span><br/>\n            <span>{gettext('Tip: -2 means no limit.')}</span>\n          </p>\n          { this.state.errMessage && <p className=\"error\">{this.state.errMessage}</p> }\n        </ModalBody>\n        <ModalFooter>\n          <Button color=\"primary\" onClick={this.setGroupQuota}>{gettext('Submit')}</Button>\n        </ModalFooter>\n      </Modal>\n    );\n  }\n}\n\nSetGroupQuotaDialog.propTypes = propTypes;\n\nexport default SetGroupQuotaDialog;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Button, Modal, ModalHeader, ModalBody, ModalFooter, Input, Form, FormGroup, Label } from 'reactstrap';\nimport { gettext } from '../../../utils/constants';\nimport { seafileAPI } from '../../../utils/seafile-api';\nimport { Utils } from '../../../utils/utils';\nimport toaster from '../../../components/toast';\n\nconst propTypes = {\n  groupID: PropTypes.oneOfType([\n    PropTypes.string,\n    PropTypes.number\n  ]).isRequired,\n  name: PropTypes.string.isRequired,\n  toggle: PropTypes.func.isRequired,\n  onDepartmentNameChanged: PropTypes.func.isRequired\n};\n\nclass RenameDepartmentDialog extends React.Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      departmentName: this.props.name,\n      errMessage: ''\n    };\n    this.newInput = React.createRef();\n  }\n\n  componentDidMount() {\n    this.newInput.select();\n    this.newInput.focus();\n  }\n\n  handleSubmit = () => {\n    let isValid = this.validateName();\n    if (isValid) {\n      seafileAPI.sysAdminRenameDepartment(this.props.groupID, this.state.departmentName.trim()).then((res) => {\n        this.props.toggle();\n        this.props.onDepartmentNameChanged(res.data);\n        toaster.success(gettext('Success'));\n      }).catch(error => {\n        let errorMsg = Utils.getErrorMsg(error);\n        this.setState({ errMessage: errorMsg });\n      });\n    }\n  }\n\n  validateName = () => {\n    let errMessage = '';\n    const name = this.state.departmentName.trim();\n    if (!name.length) {\n      errMessage = gettext('Name is required');\n      this.setState({ errMessage: errMessage });\n      return false;\n    }\n    return true;\n  }\n\n  handleChange = (e) => {\n    this.setState({\n      departmentName: e.target.value\n    });\n  }\n\n  handleKeyPress = (e) => {\n    if (e.key === 'Enter') {\n      this.handleSubmit();\n      e.preventDefault();\n    }\n  }\n\n  render() {\n    let header = gettext('Rename Department');\n    return (\n      <Modal isOpen={true} toggle={this.props.toggle}>\n        <ModalHeader toggle={this.props.toggle}>{header}</ModalHeader>\n        <ModalBody>\n          <Form>\n            <FormGroup>\n              <Label for=\"departmentName\">{gettext('Name')}</Label>\n              <Input\n                id=\"departmentName\"\n                onKeyPress={this.handleKeyPress}\n                value={this.state.departmentName}\n                onChange={this.handleChange}\n                innerRef={input => {this.newInput = input;}}\n              />\n            </FormGroup>\n          </Form>\n          {this.state.errMessage && <p className=\"error\">{this.state.errMessage}</p>}\n        </ModalBody>\n        <ModalFooter>\n          <Button color=\"primary\" onClick={this.handleSubmit}>{gettext('Submit')}</Button>\n        </ModalFooter>\n      </Modal>\n    );\n  }\n}\n\nRenameDepartmentDialog.propTypes = propTypes;\n\nexport default RenameDepartmentDialog;\n","import React, { Fragment } from 'react';\nimport PropTypes from 'prop-types';\nimport moment from 'moment';\nimport { Link } from '@reach/router';\nimport { Utils } from '../../../utils/utils.js';\nimport { siteRoot, gettext } from '../../../utils/constants';\nimport OpMenu from '../../../components/dialog/op-menu';\nimport RenameDepartmentDialog from '../../../components/dialog/sysadmin-dialog/sysadmin-rename-department-dialog';\n\nconst GroupItemPropTypes = {\n  isItemFreezed: PropTypes.bool.isRequired,\n  onFreezedItem: PropTypes.func.isRequired,\n  onUnfreezedItem: PropTypes.func.isRequired,\n  group: PropTypes.object.isRequired,\n  onDepartmentNameChanged: PropTypes.func.isRequired,\n  showSetGroupQuotaDialog: PropTypes.func.isRequired,\n  showDeleteDepartDialog: PropTypes.func.isRequired,\n};\n\nclass GroupItem extends React.Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      isOpIconShown: false,\n      highlight: false,\n      isRenameDialogOpen: false\n    };\n  }\n\n  handleMouseOver = () => {\n    if (!this.props.isItemFreezed) {\n      this.setState({\n        isOpIconShown: true,\n        highlight: true\n      });\n    }\n  }\n\n  handleMouseOut = () => {\n    if (!this.props.isItemFreezed) {\n      this.setState({\n        isOpIconShown: false,\n        highlight: false\n      });\n    }\n  }\n\n  onUnfreezedItem = () => {\n    this.setState({\n      highlight: false,\n      isOpIconShow: false\n    });\n    this.props.onUnfreezedItem();\n  }\n\n  translateOperations = (item) => {\n    let translateResult = '';\n    switch(item) {\n      case 'Rename':\n        translateResult = gettext('Rename');\n        break;\n      case 'Delete':\n        translateResult = gettext('Delete');\n        break;\n      default:\n        break;\n    }\n\n    return translateResult;\n  }\n\n  onMenuItemClick = (operation) => {\n    const { group } = this.props;\n    switch(operation) {\n      case 'Rename':\n        this.toggleRenameDialog();\n        break;\n      case 'Delete':\n        this.props.showDeleteDepartDialog(group);\n        break;\n      default:\n        break;\n    }\n  }\n\n  toggleRenameDialog = () => {\n    this.setState({\n      isRenameDialogOpen: !this.state.isRenameDialogOpen\n    });\n  }\n\n  render() {\n    const { group } = this.props;\n    const { highlight, isOpIconShown, isRenameDialogOpen } = this.state;\n    const newHref = siteRoot+ 'sys/departments/' + group.id + '/';\n    return (\n      <Fragment>\n        <tr className={this.state.highlight ? 'tr-highlight' : ''} onMouseEnter={this.handleMouseOver} onMouseLeave={this.handleMouseOut}>\n          <td><Link to={newHref}>{group.name}</Link></td>\n          <td>{moment(group.created_at).fromNow()}</td>\n          <td onClick={this.props.showSetGroupQuotaDialog.bind(this, group.id)}>\n            {Utils.bytesToSize(group.quota)}{' '}\n            <span title=\"Edit Quota\" className={`fa fa-pencil-alt attr-action-icon ${highlight ? '' : 'vh'}`}></span>\n          </td>\n          <td>\n            {isOpIconShown &&\n            <OpMenu\n              operations={['Rename', 'Delete']}\n              translateOperations={this.translateOperations}\n              onMenuItemClick={this.onMenuItemClick}\n              onFreezedItem={this.props.onFreezedItem}\n              onUnfreezedItem={this.onUnfreezedItem}\n            />\n            }\n          </td>\n        </tr>\n        {isRenameDialogOpen && (\n          <RenameDepartmentDialog\n            groupID={group.id}\n            name={group.name}\n            toggle={this.toggleRenameDialog}\n            onDepartmentNameChanged={this.props.onDepartmentNameChanged}\n          />\n        )}\n      </Fragment>\n    );\n  }\n}\n\nGroupItem.propTypes = GroupItemPropTypes;\n\nexport default GroupItem;\n","import React, { Fragment } from 'react';\nimport moment from 'moment';\nimport { seafileAPI } from '../../../utils/seafile-api';\nimport MainPanelTopbar from '../main-panel-topbar';\nimport ModalPortal from '../../../components/modal-portal';\nimport AddDepartDialog from '../../../components/dialog/sysadmin-dialog/sysadmin-add-department-dialog';\nimport DeleteDepartDialog from '../../../components/dialog/sysadmin-dialog/sysadmin-delete-department-dialog';\nimport SetGroupQuotaDialog from '../../../components/dialog/sysadmin-dialog/sysadmin-set-group-quota-dialog';\nimport { gettext, lang } from '../../../utils/constants';\nimport GroupItem from './group-item';\nimport '../../../css/org-department-item.css';\n\nmoment.locale(lang);\n\nclass DepartmentsList extends React.Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      groups: null,\n      groupID: '',\n      groupName: '',\n      showDeleteDepartDialog: false,\n      showSetGroupQuotaDialog: false,\n      isShowAddDepartDialog: false,\n      isItemFreezed: false\n    };\n  }\n\n  componentDidMount() {\n    this.listDepartGroups();\n  }\n\n  onFreezedItem = () => {\n    this.setState({isItemFreezed: true});\n  }\n\n  onUnfreezedItem = () => {\n    this.setState({isItemFreezed: false});\n  }\n\n  listDepartGroups = () => {\n    seafileAPI.sysAdminListAllDepartments().then(res => {\n      this.setState({ groups: res.data.data });\n    });\n  }\n\n  showDeleteDepartDialog = (group) => {\n    this.setState({ showDeleteDepartDialog: true, groupID: group.id, groupName: group.name });\n  }\n\n  showSetGroupQuotaDialog = (groupID) => {\n    this.setState({ showSetGroupQuotaDialog: true, groupID: groupID });\n  }\n\n  toggleAddDepartDialog = () => {\n    this.setState({ isShowAddDepartDialog: !this.state.isShowAddDepartDialog });\n  }\n\n  toggleCancel = () => {\n    this.setState({\n      showDeleteDepartDialog: false,\n      showSetGroupQuotaDialog: false,\n    });\n  }\n\n  onDepartChanged = () => {\n    this.listDepartGroups();\n  }\n\n  onDepartmentNameChanged = (dept) => {\n    this.setState({\n      groups: this.state.groups.map(item => {\n        if (item.id == dept.id) {\n          item.name = dept.name;\n        }\n        return item;\n      })\n    });\n  }\n\n  render() {\n    const groups = this.state.groups;\n    const topbarChildren = (\n      <Fragment>\n        <button className='btn btn-secondary operation-item' title={gettext('New Department')} onClick={this.toggleAddDepartDialog}>{gettext('New Department')}\n        </button>\n        {this.state.isShowAddDepartDialog && (\n          <ModalPortal>\n            <AddDepartDialog\n              onDepartChanged={this.onDepartChanged}\n              groupID={this.state.groupID}\n              toggle={this.toggleAddDepartDialog}\n            />\n          </ModalPortal>\n        )}\n      </Fragment>\n    );\n    return (\n      <Fragment>\n        <MainPanelTopbar children={topbarChildren}/>\n        <div className=\"main-panel-center flex-row h-100\">\n          <div className=\"cur-view-container o-auto\">\n            <div className=\"cur-view-path\">\n              <div className=\"fleft\">\n                <h3 className=\"sf-heading\">{gettext('Departments')}</h3>\n              </div>\n            </div>\n            <div className=\"cur-view-content\">\n              {groups && groups.length > 0 ?\n                <table>\n                  <thead>\n                    <tr>\n                      <th width=\"40%\">{gettext('Name')}</th>\n                      <th width=\"25%\">{gettext('Created At')}</th>\n                      <th width=\"20%\">{gettext('Quota')}</th>\n                      <th width=\"15%\"></th>\n                    </tr>\n                  </thead>\n                  <tbody>\n                    {groups.map((group, index) => {\n                      return(\n                        <Fragment key={group.id}>\n                          <GroupItem\n                            group={group}\n                            isItemFreezed={this.state.isItemFreezed}\n                            onFreezedItem={this.onFreezedItem}\n                            onUnfreezedItem={this.onUnfreezedItem}\n                            onDepartmentNameChanged={this.onDepartmentNameChanged}\n                            showDeleteDepartDialog={this.showDeleteDepartDialog}\n                            showSetGroupQuotaDialog={this.showSetGroupQuotaDialog}\n                          />\n                        </Fragment>\n                      );\n                    })}\n                  </tbody>\n                </table>\n                :\n                <p className=\"no-group\">{gettext('No departments')}</p>\n              }\n            </div>\n            {this.state.showDeleteDepartDialog && (\n              <ModalPortal>\n                <DeleteDepartDialog\n                  toggle={this.toggleCancel}\n                  groupID={this.state.groupID}\n                  groupName={this.state.groupName}\n                  onDepartChanged={this.onDepartChanged}\n                />\n              </ModalPortal>\n            )}\n            {this.state.showSetGroupQuotaDialog && (\n              <ModalPortal>\n                <SetGroupQuotaDialog\n                  toggle={this.toggleCancel}\n                  groupID={this.state.groupID}\n                  onDepartChanged={this.onDepartChanged}\n                />\n              </ModalPortal>\n            )}\n          </div>\n        </div>\n      </Fragment>\n    );\n  }\n}\n\nexport default DepartmentsList;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Button, Modal, ModalHeader, ModalBody, ModalFooter } from 'reactstrap';\nimport { gettext, orgID } from '../../../utils/constants';\nimport { seafileAPI } from '../../../utils/seafile-api';\nimport { Utils } from '../../../utils/utils';\nimport toaster from '../../toast';\nimport UserSelect from '../../user-select.js';\n\nconst propTypes = {\n  toggle: PropTypes.func.isRequired,\n  groupID:  PropTypes.string.isRequired,\n  onMemberChanged: PropTypes.func.isRequired\n};\n\nclass AddMemberDialog extends React.Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      selectedOption: null,\n      errMessage: '',\n    };\n  }\n\n  handleSelectChange = (option) => {\n    this.setState({ selectedOption: option });\n  }\n\n  handleSubmit = () => {\n    if (!this.state.selectedOption) return;\n    const emails = this.state.selectedOption.map(item => item.email);\n    this.refs.orgSelect.clearSelect();\n    this.setState({ errMessage: [] });\n    seafileAPI.sysAdminAddGroupMember(this.props.groupID, emails).then((res) => {\n      this.setState({ selectedOption: null });\n      if (res.data.failed.length > 0) {\n        this.setState({ errMessage: res.data.failed[0].error_msg });\n      }\n      if (res.data.success.length > 0) {\n        this.props.onMemberChanged();\n        this.props.toggle();\n      }\n    }).catch(error => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  render() {\n    return (\n      <Modal isOpen={true} toggle={this.props.toggle}>\n        <ModalHeader toggle={this.props.toggle}>{gettext('Add Member')}</ModalHeader>\n        <ModalBody>\n          <UserSelect\n            placeholder={gettext('Search users...')}\n            onSelectChange={this.handleSelectChange}\n            ref=\"orgSelect\"\n            isMulti={true}\n            className='org-add-member-select'\n          />\n          { this.state.errMessage && <p className=\"error\">{this.state.errMessage}</p> }\n        </ModalBody>\n        <ModalFooter>\n          <Button color=\"primary\" onClick={this.handleSubmit}>{gettext('Submit')}</Button>\n          <Button color=\"secondary\" onClick={this.props.toggle}>{gettext('Cancel')}</Button>\n        </ModalFooter>\n      </Modal>\n    );\n  }\n}\n\nAddMemberDialog.propTypes = propTypes;\n\nexport default AddMemberDialog;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Button, Modal, ModalHeader, ModalBody, ModalFooter } from 'reactstrap';\nimport { gettext } from '../../../utils/constants';\nimport { seafileAPI } from '../../../utils/seafile-api';\nimport { Utils } from '../../../utils/utils';\nimport toaster from '../../toast';\n\nconst propTypes = {\n  member: PropTypes.object.isRequired,\n  groupID: PropTypes.string.isRequired,\n  toggle: PropTypes.func.isRequired,\n  onMemberChanged: PropTypes.func.isRequired\n};\n\nclass DeleteMemberDialog extends React.Component {\n\n  constructor(props) {\n    super(props);\n  }\n\n  deleteMember = () => {\n    const userEmail = this.props.member.email;\n    seafileAPI.sysAdminDeleteGroupMember(this.props.groupID, userEmail).then((res) => {\n      if (res.data.success) {\n        this.props.onMemberChanged();\n        this.props.toggle();\n      }\n    }).catch(error => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  render() {\n    let tipMessage = gettext('Are you sure you want to delete {placeholder} ?');\n    tipMessage = tipMessage.replace('{placeholder}', '<span class=\"op-target\">' + Utils.HTMLescape(this.props.member.name) + '</span>');\n    return (\n      <Modal isOpen={true} toggle={this.props.toggle}>\n        <ModalHeader toggle={this.props.toggle}>{gettext('Delete Member')}</ModalHeader>\n        <ModalBody>\n          <div dangerouslySetInnerHTML={{__html: tipMessage}}></div>\n        </ModalBody>\n        <ModalFooter>\n          <Button color=\"primary\" onClick={this.deleteMember}>{gettext('Delete')}</Button>\n          <Button color=\"secondary\" onClick={this.props.toggle}>{gettext('Cancel')}</Button>\n        </ModalFooter>\n      </Modal>\n    );\n  }\n}\n\nDeleteMemberDialog.propTypes = propTypes;\n\nexport default DeleteMemberDialog;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Button, Modal, ModalHeader, ModalBody, ModalFooter, Input, Form, FormGroup, Label } from 'reactstrap';\nimport { gettext } from '../../../utils/constants';\nimport { seafileAPI } from '../../../utils/seafile-api';\nimport { Utils } from '../../../utils/utils';\n\nconst propTypes = {\n  toggle: PropTypes.func.isRequired,\n  groupID: PropTypes.string.isRequired,\n  onRepoChanged: PropTypes.func.isRequired,\n};\n\nclass AddRepoDialog extends React.Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      repoName: '',\n      errMessage: '',\n    };\n    this.newInput = React.createRef();\n  }\n\n  componentDidMount() {\n    this.newInput.focus();\n    this.newInput.setSelectionRange(0, 0);\n  }\n\n  handleSubmit = () => {\n    let isValid = this.validateName();\n    if (isValid) {\n      seafileAPI.sysAdminAddRepoInDepartment(this.props.groupID, this.state.repoName.trim()).then((res) => {\n        this.props.toggle();\n        this.props.onRepoChanged();\n      }).catch(error => {\n        let errorMsg = Utils.getErrorMsg(error);\n        this.setState({ errMessage: errorMsg });\n      });\n    }\n  }\n\n  validateName = () => {\n    let errMessage = '';\n    const name = this.state.repoName.trim();\n    if (!name.length) {\n      errMessage = gettext('Name is required');\n      this.setState({ errMessage: errMessage });\n      return false;\n    }\n    return true;\n  }\n\n  handleChange = (e) => {\n    this.setState({\n      repoName: e.target.value,\n    });\n  }\n\n  handleKeyPress = (e) => {\n    if (e.key === 'Enter') {\n      this.handleSubmit();\n      e.preventDefault();\n    }\n  }\n\n  render() {\n    return (\n      <Modal isOpen={true} toggle={this.props.toggle}>\n        <ModalHeader toggle={this.props.toggle}>{gettext('New Library')}</ModalHeader>\n        <ModalBody>\n          <Form>\n            <FormGroup>\n              <Label for=\"repoName\">{gettext('Name')}</Label>\n              <Input\n                id=\"repoName\"\n                onKeyPress={this.handleKeyPress}\n                value={this.state.repoName}\n                onChange={this.handleChange}\n                innerRef={input => {this.newInput = input;}}\n              />\n            </FormGroup>\n          </Form>\n          {this.state.errMessage && <p className=\"error\">{this.state.errMessage}</p> }\n        </ModalBody>\n        <ModalFooter>\n          <Button color=\"primary\" onClick={this.handleSubmit}>{gettext('Submit')}</Button>\n        </ModalFooter>\n      </Modal>\n    );\n  }\n}\n\nAddRepoDialog.propTypes = propTypes;\n\nexport default AddRepoDialog;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Button, Modal, ModalHeader, ModalBody, ModalFooter } from 'reactstrap';\nimport { gettext } from '../../../utils/constants';\nimport { seafileAPI } from '../../../utils/seafile-api';\nimport { Utils } from '../../../utils/utils';\nimport toaster from '../../toast';\n\nclass DeleteRepoDialog extends React.Component {\n\n  constructor(props) {\n    super(props);\n  }\n\n  deleteRepo = () => {\n    seafileAPI.sysAdminDeleteRepoInDepartment(this.props.groupID, this.props.repo.repo_id).then((res) => {\n      if (res.data.success) {\n        this.props.onRepoChanged();\n        this.props.toggle();\n      }\n    }).catch(error => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  render() {\n    let tipMessage = gettext('Are you sure you want to delete {placeholder} ?');\n    tipMessage = tipMessage.replace('{placeholder}', '<span class=\"op-target\">' + Utils.HTMLescape(this.props.repo.name) + '</span>');\n    return (\n      <Modal isOpen={true} toggle={this.props.toggle}>\n        <ModalHeader toggle={this.props.toggle}>{gettext('Delete Library')}</ModalHeader>\n        <ModalBody>\n          <div dangerouslySetInnerHTML={{__html: tipMessage}}></div>\n        </ModalBody>\n        <ModalFooter>\n          <Button color=\"primary\" onClick={this.deleteRepo}>{gettext('Delete')}</Button>\n          <Button color=\"secondary\" onClick={this.props.toggle}>{gettext('Cancel')}</Button>\n        </ModalFooter>\n      </Modal>\n    );\n  }\n}\n\nconst propTypes = {\n  repo: PropTypes.object.isRequired,\n  toggle: PropTypes.func.isRequired,\n  groupID: PropTypes.string.isRequired,\n  onRepoChanged: PropTypes.func.isRequired\n};\n\nDeleteRepoDialog.propTypes = propTypes;\n\nexport default DeleteRepoDialog;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { seafileAPI } from '../../../utils/seafile-api';\nimport { Utils } from '../../../utils/utils.js';\nimport toaster from '../../../components/toast';\nimport RoleEditor from '../../../components/select-editor/role-editor';\nimport UserLink from '../user-link';\n\nconst MemberItemPropTypes = {\n  groupID: PropTypes.string.isRequired,\n  member: PropTypes.object.isRequired,\n  isItemFreezed: PropTypes.bool.isRequired,\n  onMemberChanged: PropTypes.func.isRequired,\n  showDeleteMemberDialog: PropTypes.func.isRequired,\n  toggleItemFreezed: PropTypes.func.isRequired,\n};\n\nclass MemberItem extends React.Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      highlight: false,\n      showRoleMenu: false,\n    };\n    this.roles = ['Admin', 'Member'];\n  }\n\n  onMouseEnter = () => {\n    if (this.props.isItemFreezed) return;\n    this.setState({ highlight: true });\n  }\n\n  onMouseLeave = () => {\n    if (this.props.isItemFreezed) return;\n    this.setState({ highlight: false });\n  }\n\n  toggleMemberRoleMenu = () => {\n    this.setState({ showRoleMenu: !this.state.showRoleMenu });\n  }\n\n  onChangeUserRole = (role) => {\n    let isAdmin = role === 'Admin' ? true : false;\n    seafileAPI.sysAdminUpdateGroupMemberRole(this.props.groupID, this.props.member.email, isAdmin).then((res) => {\n      this.props.onMemberChanged();\n    }).catch(error => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n    this.setState({\n      highlight: false\n    });\n  }\n\n  render() {\n    const member = this.props.member;\n    const highlight = this.state.highlight;\n    if (member.role === 'Owner') return null;\n    return (\n      <tr className={highlight ? 'tr-highlight' : ''} onMouseEnter={this.onMouseEnter} onMouseLeave={this.onMouseLeave}>\n        <td><img src={member.avatar_url} alt=\"member-header\" width=\"24\" className=\"avatar\"/></td>\n        <td><UserLink email={member.email} name={member.name} /></td>\n        <td>\n          <RoleEditor\n            isTextMode={true}\n            isEditIconShow={highlight}\n            currentRole={member.role}\n            roles={this.roles}\n            onRoleChanged={this.onChangeUserRole}\n            toggleItemFreezed={this.props.toggleItemFreezed}\n          />\n        </td>\n        {!this.props.isItemFreezed ?\n          <td className=\"cursor-pointer text-center\" onClick={this.props.showDeleteMemberDialog.bind(this, member)}>\n            <span className={`sf2-icon-x3 action-icon ${highlight ? '' : 'vh'}`} title=\"Delete\"></span>\n          </td> : <td></td>\n        }\n      </tr>\n    );\n  }\n}\n\nMemberItem.propTypes = MemberItemPropTypes;\n\nexport default MemberItem;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Utils } from '../../../utils/utils.js';\nimport { siteRoot, gettext } from '../../../utils/constants';\n\nconst RepoItemPropTypes = {\n  repo: PropTypes.object.isRequired,\n  showDeleteRepoDialog: PropTypes.func.isRequired,\n};\n\nclass RepoItem extends React.Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      highlight: false,\n    };\n  }\n\n  onMouseEnter = () => {\n    this.setState({ highlight: true });\n  }\n\n  onMouseLeave = () => {\n    this.setState({ highlight: false });\n  }\n\n  render() {\n    const repo = this.props.repo;\n    const highlight = this.state.highlight;\n    let iconUrl = Utils.getLibIconUrl(repo);\n    return (\n      <tr className={highlight ? 'tr-highlight' : ''} onMouseEnter={this.onMouseEnter} onMouseLeave={this.onMouseLeave}>\n        <td><img src={iconUrl} width=\"24\" alt={gettext('icon')}/></td>\n        <td><a href={siteRoot + 'sys/libraries/' + repo.repo_id + '/' + repo.name + '/'}>{repo.name}</a></td>\n        <td>{Utils.bytesToSize(repo.size)}{' '}</td>\n        <td className=\"cursor-pointer text-center\" onClick={this.props.showDeleteRepoDialog.bind(this, repo)}>\n          <span className={`sf2-icon-delete action-icon ${highlight ? '' : 'vh'}`} title=\"Delete\"></span>\n        </td>\n      </tr>\n    );\n  }\n}\n\nRepoItem.propTypes = RepoItemPropTypes;\n\nexport default RepoItem;\n","import React, { Fragment } from 'react';\nimport PropTypes from 'prop-types';\nimport moment from 'moment';\nimport { Link } from '@reach/router';\nimport Paginator from '../../../components/paginator';\nimport { seafileAPI } from '../../../utils/seafile-api';\nimport { Utils } from '../../../utils/utils.js';\nimport toaster from '../../../components/toast';\nimport MainPanelTopbar from '../main-panel-topbar';\nimport ModalPortal from '../../../components/modal-portal';\nimport AddDepartDialog from '../../../components/dialog/sysadmin-dialog/sysadmin-add-department-dialog';\nimport RenameDepartmentDialog from '../../../components/dialog/sysadmin-dialog/sysadmin-rename-department-dialog';\nimport AddMemberDialog from '../../../components/dialog/sysadmin-dialog/sysadmin-add-member-dialog';\nimport DeleteMemberDialog from '../../../components/dialog/sysadmin-dialog/sysadmin-delete-member-dialog';\nimport AddRepoDialog from '../../../components/dialog/sysadmin-dialog/sysadmin-add-repo-dialog';\nimport DeleteRepoDialog from '../../../components/dialog/sysadmin-dialog/sysadmin-delete-repo-dialog';\nimport DeleteDepartDialog from '../../../components/dialog/sysadmin-dialog/sysadmin-delete-department-dialog';\nimport SetGroupQuotaDialog from '../../../components/dialog/sysadmin-dialog/sysadmin-set-group-quota-dialog';\nimport { siteRoot, gettext, lang } from '../../../utils/constants';\nimport GroupItem from './group-item';\nimport MemberItem from './member-item';\nimport RepoItem from './repo-item';\nimport '../../../css/org-department-item.css';\n\nmoment.locale(lang);\n\nconst DepartmentDetailPropTypes = {\n  groupID: PropTypes.string,\n};\n\nclass DepartmentDetail extends React.Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      groupName: '',\n      isItemFreezed: false,\n      ancestorGroups: [],\n      members: [],\n      membersErrorMsg: '',\n      membersPageInfo: {\n      },\n      membersPage: 1,\n      membersPerPage: 25,\n      deletedMember: {},\n      isShowAddMemberDialog: false,\n      showDeleteMemberDialog: false,\n      repos: [],\n      deletedRepo: {},\n      isShowRenameDepartmentDialog: false,\n      isShowAddRepoDialog: false,\n      showDeleteRepoDialog: false,\n      groups: [],\n      subGroupID: '',\n      subGroupName: '',\n      isShowAddDepartDialog: false,\n      showDeleteDepartDialog: false,\n      showSetGroupQuotaDialog: false,\n    };\n  }\n\n  componentDidMount() {\n    const groupID = this.props.groupID;\n    this.listGroupRepo(groupID);\n    this.getDepartmentInfo(groupID);\n    this.listMembers(groupID, this.state.membersPage, this.state.membersPerPage);\n  }\n\n  componentWillReceiveProps(nextProps) {\n    if (this.props.groupID !== nextProps.groupID) {\n      this.listGroupRepo(nextProps.groupID);\n      this.getDepartmentInfo(nextProps.groupID);\n      this.listMembers(nextProps.groupID, this.state.membersPage, this.state.membersPerPage);\n    }\n  }\n\n  listGroupRepo = (groupID) => {\n    seafileAPI.sysAdminListGroupRepos(groupID).then(res => {\n      this.setState({ repos: res.data.libraries });\n    }).catch(error => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  getDepartmentInfo = (groupID) => {\n    seafileAPI.sysAdminGetDepartmentInfo(groupID, true).then(res => {\n      this.setState({\n        groups: res.data.groups,\n        ancestorGroups: res.data.ancestor_groups,\n        groupName: res.data.name,\n      });\n    }).catch(error => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  listMembers = (groupID, page, perPage) => {\n    seafileAPI.sysAdminListGroupMembers(groupID, page, perPage).then((res) => {\n      this.setState({\n        members: res.data.members,\n        membersPageInfo: res.data.page_info\n      });\n    }).catch(error => {\n      let errMessage = Utils.getErrorMsg(error);\n      this.setState({membersErrorMsg: errMessage});\n    });\n  }\n\n  getPreviousPageList = () => {\n    this.listMembers(this.props.groupID, this.state.membersPageInfo.current_page - 1, this.state.membersPerPage);\n  }\n\n  getNextPageList = () => {\n    this.listMembers(this.props.groupID, this.state.membersPageInfo.current_page + 1, this.state.membersPerPage);\n  }\n\n  resetPerPage = (perPage) => {\n    this.setState({\n      membersPerPage: perPage\n    }, () => {\n      this.listMembers(this.props.groupID, 1, perPage);\n    });\n  }\n\n  listSubDepartGroups = (groupID) => {\n    seafileAPI.sysAdminGetDepartmentInfo(groupID, true).then(res => {\n      this.setState({ groups: res.data.groups });\n    }).catch(error => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  toggleCancel = () => {\n    this.setState({\n      showDeleteMemberDialog: false,\n      showDeleteRepoDialog: false,\n      showDeleteDepartDialog: false,\n      showSetGroupQuotaDialog: false,\n    });\n  }\n\n  onSubDepartChanged = () => {\n    this.listSubDepartGroups(this.props.groupID);\n  }\n\n  onDepartmentNameChanged = (dept) => {\n    this.setState({\n      groupName: dept.name\n    });\n  }\n\n  onSubDepartmentNameChanged = (dept) => {\n    this.setState({\n      groups: this.state.groups.map(item => {\n        if (item.id == dept.id) {\n          item.name = dept.name;\n        }\n        return item;\n      })\n    });\n  }\n\n  onRepoChanged = () => {\n    this.listGroupRepo(this.props.groupID);\n  }\n\n  onMemberChanged = () => {\n    this.listMembers(this.props.groupID, this.state.membersPageInfo.current_page, this.state.membersPerPage);\n  }\n\n  toggleItemFreezed = (isFreezed) => {\n    this.setState({ isItemFreezed: isFreezed });\n  }\n\n  onFreezedItem = () => {\n    this.setState({isItemFreezed: true});\n  }\n\n  onUnfreezedItem = () => {\n    this.setState({isItemFreezed: false});\n  }\n\n  showDeleteMemberDialog = (member) => {\n    this.setState({ showDeleteMemberDialog: true, deletedMember: member });\n  }\n\n  showDeleteRepoDialog = (repo) => {\n    this.setState({ showDeleteRepoDialog: true, deletedRepo: repo });\n  }\n\n  toggleRenameDepartmentDialog = () => {\n    this.setState({ isShowRenameDepartmentDialog: !this.state.isShowRenameDepartmentDialog });\n  }\n\n  toggleAddRepoDialog = () => {\n    this.setState({ isShowAddRepoDialog: !this.state.isShowAddRepoDialog });\n  }\n\n  toggleAddMemberDialog = () => {\n    this.setState({ isShowAddMemberDialog: !this.state.isShowAddMemberDialog });\n  }\n\n  toggleAddDepartDialog = () => {\n    this.setState({ isShowAddDepartDialog: !this.state.isShowAddDepartDialog});\n  }\n\n  showDeleteDepartDialog = (subGroup) => {\n    this.setState({\n      showDeleteDepartDialog: true,\n      subGroupID: subGroup.id,\n      subGroupName: subGroup.name\n    });\n  }\n\n  showSetGroupQuotaDialog = (subGroupID) => {\n    this.setState({\n      showSetGroupQuotaDialog: true,\n      subGroupID: subGroupID\n    });\n  }\n\n  render() {\n    const { members, membersErrorMsg, repos, groups, groupName } = this.state;\n    const groupID = this.props.groupID;\n    const topBtn = 'btn btn-secondary operation-item';\n    const topbarChildren = (\n      <Fragment>\n        {groupID &&\n          <Fragment>\n            <button className={topBtn} title={gettext('Rename Department')} onClick={this.toggleRenameDepartmentDialog}>{gettext('Rename Department')}</button>\n            <button className={topBtn} title={gettext('New Sub-department')} onClick={this.toggleAddDepartDialog}>{gettext('New Sub-department')}</button>\n            <button className={topBtn} title={gettext('Add Member')} onClick={this.toggleAddMemberDialog}>{gettext('Add Member')}</button>\n            <button className={topBtn} onClick={this.toggleAddRepoDialog} title={gettext('New Library')}>{gettext('New Library')}</button>\n          </Fragment>\n        }\n        {this.state.isShowRenameDepartmentDialog && (\n          <ModalPortal>\n            <RenameDepartmentDialog\n              groupID={groupID}\n              name={groupName}\n              toggle={this.toggleRenameDepartmentDialog}\n              onDepartmentNameChanged={this.onDepartmentNameChanged}\n            />\n          </ModalPortal>\n        )}\n        {this.state.isShowAddMemberDialog && (\n          <ModalPortal>\n            <AddMemberDialog\n              toggle={this.toggleAddMemberDialog}\n              onMemberChanged={this.onMemberChanged}\n              groupID={groupID}\n            />\n          </ModalPortal>\n        )}\n        {this.state.isShowAddRepoDialog && (\n          <ModalPortal>\n            <AddRepoDialog\n              toggle={this.toggleAddRepoDialog}\n              onRepoChanged={this.onRepoChanged}\n              groupID={groupID}\n            />\n          </ModalPortal>\n        )}\n        {this.state.isShowAddDepartDialog && (\n          <ModalPortal>\n            <AddDepartDialog\n              onDepartChanged={this.onSubDepartChanged}\n              parentGroupID={groupID}\n              toggle={this.toggleAddDepartDialog}\n            />\n          </ModalPortal>\n        )}\n      </Fragment>\n    );\n\n    return (\n      <Fragment>\n        <MainPanelTopbar children={topbarChildren} />\n        <div className=\"main-panel-center flex-row h-100\">\n          <div className=\"cur-view-container o-auto\">\n            <div className=\"cur-view-path\">\n              <div className=\"fleft\">\n                <h3 className=\"sf-heading\">\n                  {groupID ?\n                    <Link to={siteRoot + 'sys/departments/'}>{gettext('Departments')}</Link>\n                    : <span>{gettext('Departments')}</span>\n                  }\n                  {this.state.ancestorGroups.map(ancestor => {\n                    let newHref = siteRoot + 'sys/departments/' + ancestor.id + '/';\n                    return <span key={ancestor.id}>{' / '}<Link to={newHref}>{ancestor.name}</Link></span>;\n                  })}\n                  {groupID && <span>{' / '}{this.state.groupName}</span>}\n                </h3>\n              </div>\n            </div>\n\n            <div className=\"cur-view-subcontainer org-groups\">\n              <div className=\"cur-view-path\">\n                <div className=\"fleft\"><h3 className=\"sf-heading\">{gettext('Sub-departments')}</h3></div>\n              </div>\n              <div className=\"cur-view-content\">\n                {groups && groups.length > 0 ?\n                  <table>\n                    <thead>\n                      <tr>\n                        <th width=\"40%\">{gettext('Name')}</th>\n                        <th width=\"25%\">{gettext('Created At')}</th>\n                        <th width=\"20%\">{gettext('Quota')}</th>\n                        <th width=\"15%\"></th>\n                      </tr>\n                    </thead>\n                    <tbody>\n                      {groups.map((group, index) => {\n                        return(\n                          <Fragment key={group.id}>\n                            <GroupItem\n                              isItemFreezed={this.state.isItemFreezed}\n                              onFreezedItem={this.onFreezedItem}\n                              onUnfreezedItem={this.onUnfreezedItem}\n                              onDepartmentNameChanged={this.onSubDepartmentNameChanged}\n                              group={group}\n                              showDeleteDepartDialog={this.showDeleteDepartDialog}\n                              showSetGroupQuotaDialog={this.showSetGroupQuotaDialog}\n                            />\n                          </Fragment>\n                        );\n                      })}\n                    </tbody>\n                  </table>\n                  : <p className=\"no-group\">{gettext('No sub-departments')}</p>\n                }\n              </div>\n            </div>\n\n            <div className=\"cur-view-subcontainer org-members\">\n              <div className=\"cur-view-path\">\n                <div className=\"fleft\"><h3 className=\"sf-heading\">{gettext('Members')}</h3></div>\n              </div>\n              <div className=\"cur-view-content\">\n                {membersErrorMsg ? <p className=\"error text-center\">{membersErrorMsg}</p> :\n                  members.length == 0 ?\n                    <p className=\"no-member\">{gettext('No members')}</p> :\n                    <Fragment>\n                      <table>\n                        <thead>\n                          <tr>\n                            <th width=\"5%\"></th>\n                            <th width=\"50%\">{gettext('Name')}</th>\n                            <th width=\"15%\">{gettext('Role')}</th>\n                            <th width=\"30%\"></th>\n                          </tr>\n                        </thead>\n                        <tbody>\n                          {members.map((member, index) => {\n                            return (\n                              <Fragment key={index}>\n                                <MemberItem\n                                  member={member}\n                                  showDeleteMemberDialog={this.showDeleteMemberDialog}\n                                  isItemFreezed={this.state.isItemFreezed}\n                                  onMemberChanged={this.onMemberChanged}\n                                  toggleItemFreezed={this.toggleItemFreezed}\n                                  groupID={groupID}\n                                />\n                              </Fragment>\n                            );\n                          })}\n                        </tbody>\n                      </table>\n                      {this.state.membersPageInfo &&\n                      <Paginator\n                        gotoPreviousPage={this.getPreviousPageList}\n                        gotoNextPage={this.getNextPageList}\n                        currentPage={this.state.membersPageInfo.current_page}\n                        hasNextPage={this.state.membersPageInfo.has_next_page}\n                        curPerPage={this.state.membersPerPage}\n                        resetPerPage={this.resetPerPage}\n                      />\n                      }\n                    </Fragment>\n                }\n              </div>\n            </div>\n\n            <div className=\"cur-view-subcontainer org-libriries\">\n              <div className=\"cur-view-path\">\n                <div className=\"fleft\"><h3 className=\"sf-heading\">{gettext('Libraries')}</h3></div>\n              </div>\n              { repos.length > 0 ?\n                <div className=\"cur-view-content\">\n                  <table>\n                    <thead>\n                      <tr>\n                        <th width=\"5%\"></th>\n                        <th width=\"50%\">{gettext('Name')}</th>\n                        <th width=\"30%\">{gettext('Size')}</th>\n                        <th width=\"15%\"></th>\n                      </tr>\n                    </thead>\n                    <tbody>\n                      {repos.map((repo, index) => {\n                        return(\n                          <Fragment key={index}>\n                            <RepoItem repo={repo} showDeleteRepoDialog={this.showDeleteRepoDialog}/>\n                          </Fragment>\n                        );\n                      })}\n                    </tbody>\n                  </table>\n                </div>\n                : <p className=\"no-libraty\">{gettext('No libraries')}</p>\n              }\n            </div>\n\n          </div>\n          {this.state.showDeleteMemberDialog && (\n            <ModalPortal>\n              <DeleteMemberDialog\n                toggle={this.toggleCancel}\n                onMemberChanged={this.onMemberChanged}\n                member={this.state.deletedMember}\n                groupID={groupID}\n              />\n            </ModalPortal>\n          )}\n          {this.state.showDeleteRepoDialog && (\n            <ModalPortal>\n              <DeleteRepoDialog\n                toggle={this.toggleCancel}\n                onRepoChanged={this.onRepoChanged}\n                repo={this.state.deletedRepo}\n                groupID={groupID}\n              />\n            </ModalPortal>\n          )}\n          {this.state.showDeleteDepartDialog && (\n            <ModalPortal>\n              <DeleteDepartDialog\n                toggle={this.toggleCancel}\n                groupID={this.state.subGroupID}\n                groupName={this.state.subGroupName}\n                onDepartChanged={this.onSubDepartChanged}\n              />\n            </ModalPortal>\n          )}\n          {this.state.showSetGroupQuotaDialog && (\n            <ModalPortal>\n              <SetGroupQuotaDialog\n                toggle={this.toggleCancel}\n                groupID={this.state.subGroupID}\n                onDepartChanged={this.onSubDepartChanged}\n              />\n            </ModalPortal>\n          )}\n        </div>\n      </Fragment>\n    );\n  }\n}\n\nDepartmentDetail.propTypes = DepartmentDetailPropTypes;\n\nexport default DepartmentDetail;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Link } from '@reach/router';\nimport { siteRoot, gettext } from '../../../utils/constants';\n\nconst propTypes = {\n  currentItem: PropTypes.string.isRequired\n};\n\nclass Nav extends React.Component {\n\n  constructor(props) {\n    super(props);\n    this.navItems = [\n      {name: 'shareLinks', urlPart:'share-links', text: gettext('Share Links')},\n      {name: 'uploadLinks', urlPart:'upload-links', text: gettext('Upload Links')},\n    ];\n  }\n\n  render() {\n    const { currentItem } = this.props;\n    return (\n      <div className=\"cur-view-path tab-nav-container\">\n        <ul className=\"nav\">\n          {this.navItems.map((item, index) => {\n            return (\n              <li className=\"nav-item\" key={index}>\n                <Link to={`${siteRoot}sys/${item.urlPart}/`} className={`nav-link${currentItem == item.name ? ' active' : ''}`}>{item.text}</Link>\n              </li>\n            );\n          })}\n        </ul>\n      </div>\n    );\n  }\n}\n\nNav.propTypes = propTypes;\n\nexport default Nav;\n","import React, { Component, Fragment } from 'react';\nimport { navigate } from '@reach/router';\nimport { seafileAPI } from '../../../utils/seafile-api';\nimport { gettext, siteRoot } from '../../../utils/constants';\nimport toaster from '../../../components/toast';\nimport { Utils } from '../../../utils/utils';\nimport EmptyTip from '../../../components/empty-tip';\nimport moment from 'moment';\nimport Loading from '../../../components/loading';\nimport Paginator from '../../../components/paginator';\nimport LinksNav from './links-nav';\nimport MainPanelTopbar from '../main-panel-topbar';\nimport UserLink from '../user-link';\n\nclass Content extends Component {\n\n  constructor(props) {\n    super(props);\n  }\n\n  getPreviousPage = () => {\n    this.props.getShareLinksByPage(this.props.currentPage - 1);\n  }\n\n  getNextPage = () => {\n    this.props.getShareLinksByPage(this.props.currentPage + 1);\n  }\n\n  sortByTime = (e) => {\n    e.preventDefault();\n    this.props.sortItems('ctime');\n  }\n\n  sortByCount = (e) => {\n    e.preventDefault();\n    this.props.sortItems('view_cnt');\n  }\n\n  render() {\n    const {\n      loading, errorMsg, items,\n      perPage, currentPage, hasNextPage,\n      sortBy, sortOrder\n    } = this.props;\n    if (loading) {\n      return <Loading />;\n    } else if (errorMsg) {\n      return <p className=\"error text-center\">{errorMsg}</p>;\n    } else {\n      const emptyTip = (\n        <EmptyTip>\n          <h2>{gettext('No share links')}</h2>\n        </EmptyTip>\n      );\n\n      const initialSortIcon = <span className=\"fas fa-sort\"></span>;\n      const sortIcon = <span className={`fas ${sortOrder == 'asc' ? 'fa-caret-up' : 'fa-caret-down'}`}></span>;\n      const table = (\n        <Fragment>\n          <table className=\"table-hover\">\n            <thead>\n              <tr>\n                <th width=\"18%\">{gettext('Name')}</th>\n                <th width=\"18%\">{gettext('Token')}</th>\n                <th width=\"18%\">{gettext('Owner')}</th>\n                <th width=\"15%\">\n                  <a className=\"d-inline-block table-sort-op\" href=\"#\" onClick={this.sortByTime}>{gettext('Created At')} {sortBy == 'ctime' ? sortIcon : initialSortIcon}</a>\n                </th>\n                <th width=\"10%\">\n                  <a className=\"d-inline-block table-sort-op\" href=\"#\" onClick={this.sortByCount}>{gettext('Count')} {sortBy == 'view_cnt' ? sortIcon : initialSortIcon}</a>\n                </th>\n                <th width=\"11%\">{gettext('Expiration')}</th>\n                <th width=\"10%\">{/*Operations*/}</th>\n              </tr>\n            </thead>\n            {items &&\n              <tbody>\n                {items.map((item, index) => {\n                  return (<Item\n                    key={index}\n                    item={item}\n                    deleteShareLink={this.props.deleteShareLink}\n                  />);\n                })}\n              </tbody>\n            }\n          </table>\n          <Paginator\n            gotoPreviousPage={this.getPreviousPage}\n            gotoNextPage={this.getNextPage}\n            currentPage={currentPage}\n            hasNextPage={hasNextPage}\n            curPerPage={perPage}\n            resetPerPage={this.props.resetPerPage}\n          />\n        </Fragment>\n      );\n      return items.length ? table : emptyTip;\n    }\n  }\n}\n\nclass Item extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      isOpIconShown: false,\n    };\n  }\n\n  handleMouseOver = () => {\n    this.setState({\n      isOpIconShown: true\n    });\n  }\n\n  handleMouseOut = () => {\n    this.setState({\n      isOpIconShown: false\n    });\n  }\n\n  deleteShareLink = () => {\n    this.props.deleteShareLink(this.props.item.token);\n  }\n\n  renderExpiration = () => {\n    const item = this.props.item;\n    if (!item.expire_date) {\n      return '--';\n    }\n    const expire_date = moment(item.expire_date).format('YYYY-MM-DD');\n    const expire_time = moment(item.expire_date).format('YYYY-MM-DD HH:mm:ss');\n    return (<span className={item.is_expired ? 'error' : ''} title={expire_time}>{expire_date}</span>);\n  }\n\n  render() {\n    let { isOpIconShown } = this.state;\n    let { item } = this.props;\n    let deleteIcon = `action-icon sf2-icon-delete ${isOpIconShown ? '' : 'invisible'}`;\n    return (\n      <tr onMouseOver={this.handleMouseOver} onMouseOut={this.handleMouseOut}>\n        <td>{item.obj_name}</td>\n        <td>{item.token}</td>\n        <td><UserLink email={item.creator_email} name={item.creator_name} /></td>\n        <td>{moment(item.ctime).fromNow()}</td>\n        <td>{item.view_cnt}</td>\n        <td>{this.renderExpiration()}</td>\n        <td>\n          <a href=\"#\" className={deleteIcon} title={gettext('Remove')} onClick={this.deleteShareLink}></a>\n        </td>\n      </tr>\n    );\n  }\n}\n\nclass ShareLinks extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      loading: true,\n      errorMsg: '',\n      shareLinkList: [],\n      perPage: 25,\n      currentPage: 1,\n      hasNextPage: false,\n      sortBy: '',\n      sortOrder: 'asc'\n    };\n    this.initPage = 1;\n  }\n\n  componentDidMount () {\n    let urlParams = (new URL(window.location)).searchParams;\n    const { currentPage, perPage, sortBy, sortOrder } = this.state;\n    this.setState({\n      perPage: parseInt(urlParams.get('per_page') || perPage),\n      currentPage: parseInt(urlParams.get('page') || currentPage),\n      sortBy: urlParams.get('order_by') || sortBy,\n      sortOrder: urlParams.get('direction') || sortOrder\n    }, () => {\n      this.getShareLinksByPage(this.state.currentPage);\n    });\n  }\n\n  getShareLinksByPage = (page) => {\n    const { perPage, sortBy, sortOrder } = this.state;\n    seafileAPI.sysAdminListShareLinks(page, perPage, sortBy, sortOrder).then((res) => {\n      this.setState({\n        shareLinkList: res.data.share_link_list,\n        loading: false,\n        currentPage: page,\n        hasNextPage: Utils.hasNextPage(page, perPage, res.data.count),\n      });\n    }).catch((error) => {\n      this.setState({\n        loading: false,\n        errorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403\n      });\n    });\n  }\n\n  sortItems = (sortBy) => {\n    this.setState({\n      currentPage: 1,\n      sortBy: sortBy,\n      sortOrder: this.state.sortOrder == 'asc' ? 'desc' : 'asc'\n    }, () => {\n      let url = new URL(location.href);\n      let searchParams = new URLSearchParams(url.search);\n      const { currentPage, sortBy, sortOrder } = this.state;\n      searchParams.set('page', currentPage);\n      searchParams.set('order_by', sortBy);\n      searchParams.set('direction', sortOrder);\n      url.search = searchParams.toString();\n      navigate(url.toString());\n      this.getShareLinksByPage(currentPage);\n    });\n  }\n\n  deleteShareLink = (linkToken) => {\n    seafileAPI.sysAdminDeleteShareLink(linkToken).then(res => {\n      let newShareLinkList = this.state.shareLinkList.filter(item =>\n        item.token != linkToken\n      );\n      this.setState({shareLinkList: newShareLinkList});\n    }).catch(error => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  resetPerPage = (newPerPage) => {\n    this.setState({\n      perPage: newPerPage,\n    }, () => this.getShareLinksByPage(this.initPage));\n  }\n\n  render() {\n    let { shareLinkList, currentPage, perPage, hasNextPage } = this.state;\n    return (\n      <Fragment>\n        <MainPanelTopbar />\n        <div className=\"main-panel-center flex-row\">\n          <div className=\"cur-view-container\">\n            <LinksNav currentItem=\"shareLinks\" />\n            <div className=\"cur-view-content\">\n              <Content\n                loading={this.state.loading}\n                errorMsg={this.state.errorMsg}\n                items={shareLinkList}\n                currentPage={currentPage}\n                perPage={perPage}\n                hasNextPage={hasNextPage}\n                getShareLinksByPage={this.getShareLinksByPage}\n                resetPerPage={this.resetPerPage}\n                sortBy={this.state.sortBy}\n                sortOrder={this.state.sortOrder}\n                sortItems={this.sortItems}\n                deleteShareLink={this.deleteShareLink}\n              />\n            </div>\n          </div>\n        </div>\n      </Fragment>\n    );\n  }\n}\n\nexport default ShareLinks;\n","import React, { Component, Fragment } from 'react';\nimport { seafileAPI } from '../../../utils/seafile-api';\nimport { gettext, siteRoot } from '../../../utils/constants';\nimport toaster from '../../../components/toast';\nimport { Utils } from '../../../utils/utils';\nimport EmptyTip from '../../../components/empty-tip';\nimport moment from 'moment';\nimport Loading from '../../../components/loading';\nimport Paginator from '../../../components/paginator';\nimport LinksNav from './links-nav';\nimport MainPanelTopbar from '../main-panel-topbar';\nimport UserLink from '../user-link';\n\n\nclass Content extends Component {\n\n  constructor(props) {\n    super(props);\n  }\n\n  getPreviousPage = () => {\n    this.props.getUploadLinksByPage(this.props.currentPage - 1);\n  }\n\n  getNextPage = () => {\n    this.props.getUploadLinksByPage(this.props.currentPage + 1);\n  }\n\n  render() {\n    const { loading, errorMsg, items, perPage, currentPage, hasNextPage } = this.props;\n    if (loading) {\n      return <Loading />;\n    } else if (errorMsg) {\n      return <p className=\"error text-center\">{errorMsg}</p>;\n    } else {\n      const emptyTip = (\n        <EmptyTip>\n          <h2>{gettext('No upload links')}</h2>\n        </EmptyTip>\n      );\n      const table = (\n        <Fragment>\n          <table className=\"table-hover\">\n            <thead>\n              <tr>\n                <th width=\"18%\">{gettext('Name')}</th>\n                <th width=\"18%\">{gettext('Token')}</th>\n                <th width=\"18%\">{gettext('Owner')}</th>\n                <th width=\"15%\">{gettext('Created At')}</th>\n                <th width=\"10%\">{gettext('Count')}</th>\n                <th width=\"11%\">{gettext('Expiration')}</th>\n                <th width=\"10%\">{/*Operations*/}</th>\n              </tr>\n            </thead>\n            {items &&\n              <tbody>\n                {items.map((item, index) => {\n                  return (<Item\n                    key={index}\n                    item={item}\n                    deleteUploadLink={this.props.deleteUploadLink}\n                  />);\n                })}\n              </tbody>\n            }\n          </table>\n          <Paginator\n            gotoPreviousPage={this.getPreviousPage}\n            gotoNextPage={this.getNextPage}\n            currentPage={currentPage}\n            hasNextPage={hasNextPage}\n            curPerPage={perPage}\n            resetPerPage={this.props.resetPerPage}\n          />\n        </Fragment>\n      );\n      return items.length ? table : emptyTip;\n    }\n  }\n}\n\nclass Item extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      isOpIconShown: false,\n    };\n  }\n\n  handleMouseOver = () => {\n    this.setState({\n      isOpIconShown: true\n    });\n  }\n\n  handleMouseOut = () => {\n    this.setState({\n      isOpIconShown: false\n    });\n  }\n\n  deleteUploadLink = () => {\n    this.props.deleteUploadLink(this.props.item.token);\n  }\n\n  renderExpiration = () => {\n    let item = this.props.item;\n    if (!item.expire_date) {\n      return '--';\n    }\n    const expire_date = moment(item.expire_date).format('YYYY-MM-DD');\n    const expire_time = moment(item.expire_date).format('YYYY-MM-DD HH:mm:ss');\n    return (<span className={item.is_expired ? 'error' : ''} title={expire_time}>{expire_date}</span>);\n  }\n\n  render() {\n    let { isOpIconShown } = this.state;\n    let { item } = this.props;\n    let deleteIcon = `action-icon sf2-icon-delete ${isOpIconShown ? '' : 'invisible'}`;\n    return (\n      <Fragment>\n        <tr onMouseOver={this.handleMouseOver} onMouseOut={this.handleMouseOut}>\n          <td>{item.path}</td>\n          <td>{item.token}</td>\n          <td><UserLink email={item.creator_email} name={item.creator_name} /></td>\n          <td>{moment(item.ctime).fromNow()}</td>\n          <td>{item.view_cnt}</td>\n          <td>{this.renderExpiration()}</td>\n          <td>\n            <a href=\"#\" className={deleteIcon} title={gettext('Remove')} onClick={this.deleteUploadLink}></a>\n          </td>\n        </tr>\n      </Fragment>\n    );\n  }\n}\n\nclass UploadLinks extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      loading: true,\n      errorMsg: '',\n      uploadLinkList: [],\n      perPage: 25,\n      currentPage: 1,\n      hasNextPage: false,\n    };\n    this.initPage = 1;\n  }\n\n  componentDidMount() {\n    let urlParams = (new URL(window.location)).searchParams;\n    const { currentPage, perPage } = this.state;\n    this.setState({\n      perPage: parseInt(urlParams.get('per_page') || perPage),\n      currentPage: parseInt(urlParams.get('page') || currentPage)\n    }, () => {\n      this.getUploadLinksByPage(this.state.currentPage);\n    });\n  }\n\n  getUploadLinksByPage = (page) => {\n    let { perPage } = this.state;\n    seafileAPI.sysAdminListAllUploadLinks(page, perPage).then((res) => {\n      this.setState({\n        uploadLinkList: res.data.upload_link_list,\n        loading: false,\n        currentPage: page,\n        hasNextPage: Utils.hasNextPage(page, perPage, res.data.count),\n      });\n    }).catch((error) => {\n      this.setState({\n        loading: false,\n        errorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403\n      });\n    });\n  }\n\n  deleteUploadLink = (linkToken) => {\n    seafileAPI.sysAdminDeleteUploadLink(linkToken).then(res => {\n      let newUploadLinkList = this.state.uploadLinkList.filter(item =>\n        item.token != linkToken\n      );\n      this.setState({uploadLinkList: newUploadLinkList});\n    }).catch(error => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  resetPerPage = (newPerPage) => {\n    this.setState({\n      perPage: newPerPage,\n    }, () => this.getUploadLinksByPage(this.initPage));\n  }\n\n  render() {\n    let { uploadLinkList, currentPage, perPage, hasNextPage } = this.state;\n    return (\n      <Fragment>\n        <MainPanelTopbar />\n        <div className=\"main-panel-center flex-row\">\n          <div className=\"cur-view-container\">\n            <LinksNav currentItem=\"uploadLinks\" />\n            <div className=\"cur-view-content\">\n              <Content\n                loading={this.state.loading}\n                errorMsg={this.state.errorMsg}\n                items={uploadLinkList}\n                currentPage={currentPage}\n                perPage={perPage}\n                hasNextPage={hasNextPage}\n                getUploadLinksByPage={this.getUploadLinksByPage}\n                resetPerPage={this.resetPerPage}\n                deleteUploadLink={this.deleteUploadLink}\n              />\n            </div>\n          </div>\n        </div>\n      </Fragment>\n    );\n  }\n}\n\nexport default UploadLinks;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Alert, Modal, ModalHeader, ModalBody, ModalFooter, Button, Form, FormGroup, Label, Input } from 'reactstrap';\nimport { gettext } from '../../../utils/constants';\n\nconst propTypes = {\n  toggleDialog: PropTypes.func.isRequired,\n  addOrg: PropTypes.func.isRequired\n};\n\nclass SysAdminAddOrgDialog extends React.Component {\n  constructor(props) {\n    super(props);\n    this.state = {\n      name: '',\n      email: '',\n      password: '',\n      passwordAgain: '',\n      errorMsg: '',\n      isSubmitBtnActive: false\n    };\n  }\n\n  checkSubmitBtnActive = () => {\n    const { name, email, password, passwordAgain } = this.state;\n    let btnActive = true;\n    if (name.trim() !='' &&\n      email.trim() != '' &&\n      password.trim() != '' &&\n      passwordAgain.trim() != '') {\n      btnActive = true;\n    } else {\n      btnActive = false;\n    }\n    this.setState({\n      isSubmitBtnActive: btnActive\n    });\n  }\n\n  toggle = () => {\n    this.props.toggleDialog();\n  }\n\n  inputPassword = (e) => {\n    let passwd = e.target.value;\n    this.setState({\n      password: passwd\n    }, this.checkSubmitBtnActive);\n  }\n\n  inputPasswordAgain = (e) => {\n    let passwd = e.target.value;\n    this.setState({\n      passwordAgain: passwd\n    }, this.checkSubmitBtnActive);\n  }\n\n  inputEmail = (e) => {\n    let email = e.target.value;\n    this.setState({\n      email: email\n    }, this.checkSubmitBtnActive);\n  }\n\n  inputName = (e) => {\n    let name = e.target.value;\n    this.setState({\n      name: name\n    }, this.checkSubmitBtnActive);\n  }\n\n  handleSubmit = () => {\n    let { name, email, password, passwordAgain } = this.state;\n    if (password != passwordAgain) {\n      this.setState({errorMsg: gettext('Passwords do not match.')});\n      return;\n    }\n    const data = {\n      orgName: name.trim(),\n      ownerEmail: email.trim(),\n      password: password.trim()\n    };\n    this.props.addOrg(data);\n    this.toggle();\n  }\n\n  render() {\n    const { errorMsg, password, passwordAgain, email, name, isSubmitBtnActive } = this.state;\n    return (\n      <Modal isOpen={true} toggle={this.toggle}>\n        <ModalHeader toggle={this.toggle}>{gettext('Add Organization')}</ModalHeader>\n        <ModalBody>\n          <Form autoComplete=\"off\">\n            <FormGroup>\n              <Label>{gettext('Name')}</Label>\n              <Input value={name} onChange={this.inputName} />\n            </FormGroup>\n            <FormGroup>\n              <Label>\n                {gettext('Owner')}\n                <span className=\"small text-secondary ml-1 fas fa-question-circle\" title={gettext('Owner can use admin panel in an organization, must be a new account.')}></span>\n              </Label>\n              <Input value={email} onChange={this.inputEmail} />\n            </FormGroup>\n            <FormGroup>\n              <Label>{gettext('Password')}</Label>\n              <Input type=\"password\" value={password} onChange={this.inputPassword} />\n            </FormGroup>\n            <FormGroup>\n              <Label>{gettext('Password again')}</Label>\n              <Input type=\"password\" value={passwordAgain} onChange={this.inputPasswordAgain} />\n            </FormGroup>\n          </Form>\n          {errorMsg && <Alert color=\"danger\">{errorMsg}</Alert>}\n        </ModalBody>\n        <ModalFooter>\n          <Button color=\"secondary\" onClick={this.toggle}>{gettext('Cancel')}</Button>\n          <Button color=\"primary\" onClick={this.handleSubmit} disabled={!isSubmitBtnActive}>{gettext('Submit')}</Button>\n        </ModalFooter>\n      </Modal>\n    );\n  }\n}\n\nSysAdminAddOrgDialog.propTypes = propTypes;\n\nexport default SysAdminAddOrgDialog;\n","import React, { Component, Fragment } from 'react';\nimport { Link } from '@reach/router';\nimport moment from 'moment';\nimport { Utils } from '../../../utils/utils';\nimport { siteRoot, gettext } from '../../../utils/constants';\nimport EmptyTip from '../../../components/empty-tip';\nimport Loading from '../../../components/loading';\nimport Paginator from '../../../components/paginator';\nimport { seafileAPI } from '../../../utils/seafile-api.js';\nimport SysAdminUserRoleEditor from '../../../components/select-editor/sysadmin-user-role-editor';\nimport CommonOperationConfirmationDialog from '../../../components/dialog/common-operation-confirmation-dialog';\nimport UserLink from '../user-link';\nimport toaster from '../../../components/toast';\n\nconst { availableRoles } = window.sysadmin.pageOptions;\n\nclass Content extends Component {\n\n  constructor(props) {\n    super(props);\n  }\n\n  getPreviousPage = () => {\n    this.props.getListByPage(this.props.currentPage - 1);\n  }\n\n  getNextPage = () => {\n    this.props.getListByPage(this.props.currentPage + 1);\n  }\n\n  render() {\n    const { loading, errorMsg, items } = this.props;\n    if (loading) {\n      return <Loading />;\n    } else if (errorMsg) {\n      return <p className=\"error text-center mt-4\">{errorMsg}</p>;\n    } else {\n      const emptyTip = (\n        <EmptyTip>\n          <h2>{gettext('No organizations')}</h2>\n        </EmptyTip>\n      );\n      const table = (\n        <Fragment>\n          <table className=\"table-hover\">\n            <thead>\n              <tr>\n                <th width=\"20%\">{gettext('Name')}</th>\n                <th width=\"20%\">{gettext('Creator')}</th>\n                <th width=\"20%\">{gettext('Role')}</th>\n                <th width=\"15%\">{gettext('Space Used')}</th>\n                <th width=\"20%\">{gettext('Created At')}</th>\n                <th width=\"5%\">{/* Operations */}</th>\n              </tr>\n            </thead>\n            <tbody>\n              {items.map((item, index) => {\n                return (<Item\n                  key={index}\n                  item={item}\n                  updateRole={this.props.updateRole}\n                  deleteOrg={this.props.deleteOrg}\n                />);\n              })}\n            </tbody>\n          </table>\n          {this.props.currentPage &&\n          <Paginator\n            currentPage={this.props.currentPage}\n            hasNextPage={this.props.hasNextPage}\n            curPerPage={this.props.curPerPage}\n            resetPerPage={this.props.resetPerPage}\n            gotoPreviousPage={this.getPreviousPage}\n            gotoNextPage={this.getNextPage}\n          />\n          }\n        </Fragment>\n      );\n      return items.length ? table : emptyTip;\n    }\n  }\n}\n\nclass Item extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      isOpIconShown: false,\n      isDeleteDialogOpen: false,\n      deleteDialogMsg: '',\n    };\n  }\n\n  handleMouseEnter = () => {\n    this.setState({isOpIconShown: true});\n  }\n\n  handleMouseLeave = () => {\n    this.setState({isOpIconShown: false});\n  }\n\n  toggleDeleteDialog = (e) => {\n    if (e) {\n      e.preventDefault();\n    }\n    this.setState({isDeleteDialogOpen: !this.state.isDeleteDialogOpen}, () => {\n      if (this.state.isDeleteDialogOpen) {\n        seafileAPI.sysAdminGetOrg(this.props.item.org_id).then((res) => {\n          let orgName = '<span class=\"op-target\">' + Utils.HTMLescape(res.data.org_name) + '</span>';\n          let userCount = '<span class=\"op-target\">' + Utils.HTMLescape(res.data.users_count) + '</span>';\n          let repoCount = '<span class=\"op-target\">' + Utils.HTMLescape(res.data.repos_count) + '</span>';\n          let deleteDialogMsg = gettext('Are you sure you want to delete {placeholder} ?')\n            .replace('{placeholder}', orgName) + '<br/>' +\n            gettext('{userCount} user(s) and {repoCount} libraries of this organization will also be deleted.')\n              .replace('{userCount}', userCount)\n              .replace('{repoCount}', repoCount);\n          this.setState({deleteDialogMsg: deleteDialogMsg});\n        }).catch(error => {\n          let errorMsg = Utils.getErrorMsg(error);\n          toaster.danger(errorMsg);\n        });\n      }\n    });\n  }\n\n  updateRole = (role) => {\n    this.props.updateRole(this.props.item.org_id, role);\n  }\n\n  deleteOrg = () => {\n    toaster.notify(gettext('It may take some time, please wait.'));\n    this.props.deleteOrg(this.props.item.org_id);\n  }\n\n  render() {\n    const { item } = this.props;\n    const { isOpIconShown, isDeleteDialogOpen, deleteDialogMsg } = this.state;\n\n    return (\n      <Fragment>\n        <tr onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave}>\n          <td><Link to={`${siteRoot}sys/organizations/${item.org_id}/info/`}>{item.org_name}</Link></td>\n          <td>\n            <UserLink email={item.creator_email} name={item.creator_name} />\n          </td>\n          <td>\n            <SysAdminUserRoleEditor\n              isTextMode={true}\n              isEditIconShow={isOpIconShown}\n              currentRole={item.role}\n              roleOptions={availableRoles}\n              onRoleChanged={this.updateRole}\n            />\n          </td>\n          <td>{`${Utils.bytesToSize(item.quota_usage)} / ${item.quota > 0 ? Utils.bytesToSize(item.quota) : '--'}`}</td>\n          <td>{moment(item.ctime).format('YYYY-MM-DD HH:mm:ss')}</td>\n          <td>\n            <a href=\"#\" className={`action-icon sf2-icon-delete ${isOpIconShown ? '' : 'invisible'}`} title={gettext('Delete')} onClick={this.toggleDeleteDialog}></a>\n          </td>\n        </tr>\n        {isDeleteDialogOpen &&\n          <CommonOperationConfirmationDialog\n            title={gettext('Delete Organization')}\n            message={deleteDialogMsg}\n            executeOperation={this.deleteOrg}\n            confirmBtnText={gettext('Delete')}\n            toggleDialog={this.toggleDeleteDialog}\n          />\n        }\n      </Fragment>\n    );\n  }\n}\n\nexport default Content;\n","import React, { Component, Fragment } from 'react';\nimport { navigate } from '@reach/router';\nimport { Button } from 'reactstrap';\nimport { Utils } from '../../../utils/utils';\nimport { seafileAPI } from '../../../utils/seafile-api';\nimport { siteRoot, gettext } from '../../../utils/constants';\nimport toaster from '../../../components/toast';\nimport SysAdminAddOrgDialog from '../../../components/dialog/sysadmin-dialog/sysadmin-add-org-dialog';\nimport MainPanelTopbar from '../main-panel-topbar';\nimport Search from '../search';\nimport Content from './orgs-content';\n\n\nclass Orgs extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      loading: true,\n      errorMsg: '',\n      orgList: [],\n      currentPage: 1,\n      perPage: 25,\n      hasNextPage: false,\n      isAddOrgDialogOpen: false\n    };\n  }\n\n  componentDidMount() {\n    let urlParams = (new URL(window.location)).searchParams;\n    const { currentPage, perPage } = this.state;\n    this.setState({\n      perPage: parseInt(urlParams.get('per_page') || perPage),\n      currentPage: parseInt(urlParams.get('page') || currentPage)\n    }, () => {\n      this.getItemsByPage(this.state.currentPage);\n    });\n  }\n\n  getItemsByPage = (page) => {\n    const { perPage } = this.state;\n    seafileAPI.sysAdminListOrgs(page, perPage).then((res) => {\n      this.setState({\n        loading: false,\n        orgList: res.data.organizations,\n        currentPage: page,\n        hasNextPage: Utils.hasNextPage(page, perPage, res.data.total_count)\n      });\n    }).catch((error) => {\n      this.setState({\n        loading: false,\n        errorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403\n      });\n    });\n  }\n\n  resetPerPage = (perPage) => {\n    this.setState({\n      perPage: perPage\n    }, () => {\n      this.getItemsByPage(1);\n    });\n  }\n\n  toggleAddOrgDialog = () => {\n    this.setState({isAddOrgDialogOpen: !this.state.isAddOrgDialogOpen});\n  }\n\n  updateRole = (orgID, role) => {\n    let orgInfo = {};\n    orgInfo.role = role;\n    seafileAPI.sysAdminUpdateOrg(orgID, orgInfo).then(res => {\n      let newOrgList = this.state.orgList.map(org => {\n        if (org.org_id == orgID) {\n          org.role = role;\n        }\n        return org;\n      });\n      this.setState({orgList: newOrgList});\n      toaster.success(gettext('Edit succeeded'));\n    }).catch((error) => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  addOrg = (data) => {\n    const { orgName, ownerEmail, password } = data;\n    seafileAPI.sysAdminAddOrg(orgName, ownerEmail, password).then(res => {\n      let orgList = this.state.orgList;\n      orgList.unshift(res.data);\n      this.setState({orgList: orgList});\n    }).catch((error) => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  deleteOrg = (orgID) => {\n    seafileAPI.sysAdminDeleteOrg(orgID).then(res => {\n      let orgList = this.state.orgList.filter(org => {\n        return org.org_id != orgID;\n      });\n      this.setState({orgList: orgList});\n      toaster.success(gettext('Successfully deleted 1 item.'));\n    }).catch((error) => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  getSearch = () => {\n    return <Search\n      placeholder={gettext('Search organizations')}\n      submit={this.searchItems}\n    />;\n  }\n\n  searchItems = (keyword) => {\n    navigate(`${siteRoot}sys/search-organizations/?query=${encodeURIComponent(keyword)}`);\n  }\n\n  render() {\n    const { isAddOrgDialogOpen } = this.state;\n    return (\n      <Fragment>\n        <MainPanelTopbar search={this.getSearch()}>\n          <Button className=\"btn btn-secondary operation-item\" onClick={this.toggleAddOrgDialog}>{gettext('Add Organization')}</Button>\n        </MainPanelTopbar>\n        <div className=\"main-panel-center flex-row\">\n          <div className=\"cur-view-container\">\n            <div className=\"cur-view-path\">\n              <h3 className=\"sf-heading\">{gettext('Organizations')}</h3>\n            </div>\n            <div className=\"cur-view-content\">\n              <Content\n                loading={this.state.loading}\n                errorMsg={this.state.errorMsg}\n                items={this.state.orgList}\n                currentPage={this.state.currentPage}\n                hasNextPage={this.state.hasNextPage}\n                curPerPage={this.state.perPage}\n                resetPerPage={this.resetPerPage}\n                getListByPage={this.getItemsByPage}\n                updateRole={this.updateRole}\n                deleteOrg={this.deleteOrg}\n              />\n            </div>\n          </div>\n        </div>\n        {isAddOrgDialogOpen &&\n          <SysAdminAddOrgDialog\n            addOrg={this.addOrg}\n            toggleDialog={this.toggleAddOrgDialog}\n          />\n        }\n      </Fragment>\n    );\n  }\n}\n\nexport default Orgs;\n","import React, { Component, Fragment } from 'react';\nimport { Form, FormGroup, Input, Label, Col } from 'reactstrap';\nimport { Utils } from '../../../utils/utils';\nimport { seafileAPI } from '../../../utils/seafile-api';\nimport { gettext } from '../../../utils/constants';\nimport toaster from '../../../components/toast';\nimport MainPanelTopbar from '../main-panel-topbar';\nimport Content from './orgs-content';\n\n\nclass SearchOrgs extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      query: '',\n      isSubmitBtnActive: false,\n      loading: true,\n      errorMsg: '',\n      orgList: []\n    };\n  }\n\n  componentDidMount () {\n    let params = (new URL(document.location)).searchParams;\n    this.setState({\n      query: params.get('query') || ''\n    }, this.getItems);\n  }\n\n  getItems = () => {\n    seafileAPI.sysAdminSearchOrgs(this.state.query.trim()).then(res => {\n      this.setState({\n        loading: false,\n        orgList: res.data.organization_list\n      });\n    }).catch((error) => {\n      this.setState({\n        loading: false,\n        errorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403\n      });\n    });\n  }\n\n  updateRole = (orgID, role) => {\n    let orgInfo = {};\n    orgInfo.role = role;\n    seafileAPI.sysAdminUpdateOrg(orgID, orgInfo).then(res => {\n      let newOrgList = this.state.orgList.map(org => {\n        if (org.org_id == orgID) {\n          org.role = role;\n        }\n        return org;\n      });\n      this.setState({orgList: newOrgList});\n      toaster.success(gettext('Edit succeeded'));\n    }).catch((error) => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  deleteOrg = (orgID) => {\n    seafileAPI.sysAdminDeleteOrg(orgID).then(res => {\n      let orgList = this.state.orgList.filter(org => {\n        return org.org_id != orgID;\n      });\n      this.setState({orgList: orgList});\n      toaster.success(gettext('Successfully deleted 1 item.'));\n    }).catch((error) => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  handleInputChange = (e) => {\n    this.setState({\n      query: e.target.value\n    }, this.checkSubmitBtnActive);\n  }\n\n  checkSubmitBtnActive = () => {\n    const { query } = this.state;\n    this.setState({\n      isSubmitBtnActive: query.trim()\n    });\n  }\n\n  render() {\n    const { query, isSubmitBtnActive } = this.state;\n    return (\n      <Fragment>\n        <MainPanelTopbar />\n        <div className=\"main-panel-center flex-row\">\n          <div className=\"cur-view-container\">\n            <div className=\"cur-view-path\">\n              <h3 className=\"sf-heading\">{gettext('Organizations')}</h3>\n            </div>\n            <div className=\"cur-view-content\">\n              <div className=\"mt-4 mb-6\">\n                <h4 className=\"border-bottom font-weight-normal mb-2 pb-1\">{gettext('Search Organizations')}</h4>\n                <p className=\"text-secondary small\">{gettext('Tip: you can search by keyword in name.')}</p>\n                <Form>\n                  <FormGroup row>\n                    <Label for=\"name\" sm={1}>{gettext('Name')}</Label>\n                    <Col sm={5}>\n                      <Input type=\"text\" name=\"query\" id=\"name\" value={query} onChange={this.handleInputChange} />\n                    </Col>\n                  </FormGroup>\n                  <FormGroup row>\n                    <Col sm={{size: 5, offset: 1}}>\n                      <button className=\"btn btn-outline-primary\" disabled={!isSubmitBtnActive} onClick={this.getItems}>{gettext('Submit')}</button>\n                    </Col>\n                  </FormGroup>\n                </Form>\n              </div>\n              <div className=\"mt-4 mb-6\">\n                <h4 className=\"border-bottom font-weight-normal mb-2 pb-1\">{gettext('Result')}</h4>\n                <Content\n                  loading={this.state.loading}\n                  errorMsg={this.state.errorMsg}\n                  items={this.state.orgList}\n                  updateRole={this.updateRole}\n                  deleteOrg={this.deleteOrg}\n                />\n              </div>\n            </div>\n          </div>\n        </div>\n      </Fragment>\n    );\n  }\n}\n\nexport default SearchOrgs;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Alert, Modal, ModalHeader, ModalBody, ModalFooter, Button, Form, FormGroup, Input, InputGroup, InputGroupAddon, InputGroupText } from 'reactstrap';\nimport { gettext } from '../../../utils/constants';\nimport { Utils } from '../../../utils/utils';\n\nconst propTypes = {\n  toggle: PropTypes.func.isRequired,\n  updateName: PropTypes.func.isRequired\n};\n\nclass SysAdminSetOrgNameDialog extends React.Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      name: this.props.name,\n      isSubmitBtnActive: false\n    };\n  }\n\n  toggle = () => {\n    this.props.toggle();\n  }\n\n  handleInputChange = (e) => {\n    const value = e.target.value;\n    this.setState({\n      name: value,\n      isSubmitBtnActive: value.trim() != ''\n    });\n  }\n\n  handleKeyPress = (e) => {\n    if (e.key == 'Enter') {\n      this.handleSubmit();\n      e.preventDefault();\n    }\n  }\n\n  handleSubmit = () => {\n    this.props.updateName(this.state.name.trim());\n    this.toggle();\n  }\n\n  render() {\n    const { name, isSubmitBtnActive } = this.state;\n    return (\n      <Modal isOpen={true} toggle={this.toggle}>\n        <ModalHeader toggle={this.toggle}>{gettext('Set Name')}</ModalHeader>\n        <ModalBody>\n          <Form>\n            <FormGroup>\n              <Input\n                type=\"text\"\n                value={name}\n                onKeyPress={this.handleKeyPress}\n                onChange={this.handleInputChange}\n              />\n            </FormGroup>\n          </Form>\n        </ModalBody>\n        <ModalFooter>\n          <Button color=\"secondary\" onClick={this.toggle}>{gettext('Cancel')}</Button>\n          <Button color=\"primary\" onClick={this.handleSubmit} disabled={!isSubmitBtnActive}>{gettext('Submit')}</Button>\n        </ModalFooter>\n      </Modal>\n    );\n  }\n}\n\nSysAdminSetOrgNameDialog.propTypes = propTypes;\n\nexport default SysAdminSetOrgNameDialog;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Alert, Modal, ModalHeader, ModalBody, ModalFooter, Button, Form, FormGroup, Input, InputGroup, InputGroupAddon, InputGroupText } from 'reactstrap';\nimport { gettext } from '../../../utils/constants';\nimport { Utils } from '../../../utils/utils';\n\nconst propTypes = {\n  toggle: PropTypes.func.isRequired,\n  updateValue: PropTypes.func.isRequired\n};\n\nclass SysAdminSetOrgMaxUserNumberDialog extends React.Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      value: this.props.value,\n      isSubmitBtnActive: false\n    };\n  }\n\n  toggle = () => {\n    this.props.toggle();\n  }\n\n  handleInputChange = (e) => {\n    const value = e.target.value;\n    this.setState({\n      value: value,\n      isSubmitBtnActive: value.trim() != ''\n    });\n  }\n\n  handleKeyPress = (e) => {\n    if (e.key == 'Enter') {\n      this.handleSubmit();\n      e.preventDefault();\n    }\n  }\n\n  handleSubmit = () => {\n    this.props.updateValue(this.state.value.trim());\n    this.toggle();\n  }\n\n  render() {\n    const { value, isSubmitBtnActive } = this.state;\n    return (\n      <Modal isOpen={true} toggle={this.toggle}>\n        <ModalHeader toggle={this.toggle}>{gettext('Set max number of members')}</ModalHeader>\n        <ModalBody>\n          <Form>\n            <FormGroup>\n              <Input\n                type=\"text\"\n                className=\"form-control\"\n                value={value}\n                onKeyPress={this.handleKeyPress}\n                onChange={this.handleInputChange}\n              />\n            </FormGroup>\n          </Form>\n        </ModalBody>\n        <ModalFooter>\n          <Button color=\"secondary\" onClick={this.toggle}>{gettext('Cancel')}</Button>\n          <Button color=\"primary\" onClick={this.handleSubmit} disabled={!isSubmitBtnActive}>{gettext('Submit')}</Button>\n        </ModalFooter>\n      </Modal>\n    );\n  }\n}\n\nSysAdminSetOrgMaxUserNumberDialog.propTypes = propTypes;\n\nexport default SysAdminSetOrgMaxUserNumberDialog;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Link } from '@reach/router';\nimport { siteRoot, gettext } from '../../../utils/constants';\n\nconst propTypes = {\n  currentItem: PropTypes.string.isRequired\n};\n\nclass Nav extends React.Component {\n\n  constructor(props) {\n    super(props);\n    this.navItems = [\n      {name: 'info', urlPart: 'info', text: gettext('Info')},\n      {name: 'users', urlPart: 'users', text: gettext('Members')},\n      {name: 'groups', urlPart: 'groups', text: gettext('Groups')},\n      {name: 'repos', urlPart: 'libraries', text: gettext('Libraries')},\n      //{name: 'traffic', urlPart: 'traffic', text: gettext('traffic')},\n      //{name: 'settings', urlPart: 'settings', text: gettext('Settings')}\n    ];\n  }\n\n  render() {\n    const { currentItem, orgID, orgName } = this.props;\n    return (\n      <div>\n        <div className=\"cur-view-path\">\n          <h3 className=\"sf-heading\"><Link to={`${siteRoot}sys/organizations/`}>{gettext('Organizations')}</Link> / {orgName}</h3>\n        </div>\n        <ul className=\"nav border-bottom mx-4\">\n          {this.navItems.map((item, index) => {\n            return (\n              <li className=\"nav-item mr-2\" key={index}>\n                <Link to={`${siteRoot}sys/organizations/${orgID}/${item.urlPart}/`} className={`nav-link ${currentItem == item.name ? ' active' : ''}`}>{item.text}</Link>\n              </li>\n            );\n          })}\n        </ul>\n      </div>\n    );\n  }\n}\n\nNav.propTypes = propTypes;\n\nexport default Nav;\n","import React, { Component, Fragment } from 'react';\nimport { Utils } from '../../../utils/utils';\nimport { seafileAPI } from '../../../utils/seafile-api';\nimport { gettext } from '../../../utils/constants';\nimport toaster from '../../../components/toast';\nimport Loading from '../../../components/loading';\nimport SysAdminSetOrgQuotaDialog from '../../../components/dialog/sysadmin-dialog/set-quota';\nimport SysAdminSetOrgNameDialog from '../../../components/dialog/sysadmin-dialog/sysadmin-set-org-name-dialog';\nimport SysAdminSetOrgMaxUserNumberDialog from '../../../components/dialog/sysadmin-dialog/sysadmin-set-org-max-user-number-dialog';\nimport MainPanelTopbar from '../main-panel-topbar';\nimport OrgNav from './org-nav';\n\nclass Content extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      isSetQuotaDialogOpen: false,\n      isSetNameDialogOpen: false,\n      isSetMaxUserNumberDialogOpen: false\n    };\n  }\n\n  toggleSetQuotaDialog = () => {\n    this.setState({isSetQuotaDialogOpen: !this.state.isSetQuotaDialogOpen});\n  }\n\n  toggleSetNameDialog = () => {\n    this.setState({isSetNameDialogOpen: !this.state.isSetNameDialogOpen});\n  }\n\n  toggleSetMaxUserNumberDialog = () => {\n    this.setState({isSetMaxUserNumberDialogOpen: !this.state.isSetMaxUserNumberDialogOpen});\n  }\n\n  showEditIcon = (action) => {\n    return (\n      <span\n        title={gettext('Edit')}\n        className=\"fa fa-pencil-alt attr-action-icon\"\n        onClick={action}>\n      </span>\n    );\n  }\n\n  render() {\n    const { loading, errorMsg, orgInfo } = this.props;\n    if (loading) {\n      return <Loading />;\n    } else if (errorMsg) {\n      return <p className=\"error text-center\">{errorMsg}</p>;\n    } else {\n      const { org_name, users_count, max_user_number, groups_count, quota, quota_usage } = this.props.orgInfo;\n      const { isSetQuotaDialogOpen, isSetNameDialogOpen, isSetMaxUserNumberDialogOpen } = this.state;\n      return (\n        <Fragment>\n          <dl className=\"m-0\">\n            <dt className=\"info-item-heading\">{gettext('Name')}</dt>\n            <dd className=\"info-item-content\">\n              {org_name}\n              {this.showEditIcon(this.toggleSetNameDialog)}\n            </dd>\n\n            <dt className=\"info-item-heading\">{gettext('Number of members')}</dt>\n            <dd className=\"info-item-content\">{users_count}</dd>\n\n            {max_user_number &&\n              <Fragment>\n                <dt className=\"info-item-heading\">{gettext('Max number of members')}</dt>\n                <dd className=\"info-item-content\">\n                  {max_user_number}\n                  {this.showEditIcon(this.toggleSetMaxUserNumberDialog)}\n                </dd>\n              </Fragment>\n            }\n\n            <dt className=\"info-item-heading\">{gettext('Number of groups')}</dt>\n            <dd className=\"info-item-content\">{groups_count}</dd>\n\n            <dt className=\"info-item-heading\">{gettext('Space Used')}</dt>\n            <dd className=\"info-item-content\">\n              {`${Utils.bytesToSize(quota_usage)} / ${quota > 0 ? Utils.bytesToSize(quota) : '--'}`}\n              {this.showEditIcon(this.toggleSetQuotaDialog)}\n            </dd>\n          </dl>\n          {isSetQuotaDialogOpen &&\n          <SysAdminSetOrgQuotaDialog\n            updateQuota={this.props.updateQuota}\n            toggle={this.toggleSetQuotaDialog}\n          />\n          }\n          {isSetNameDialogOpen &&\n          <SysAdminSetOrgNameDialog\n            name={org_name}\n            updateName={this.props.updateName}\n            toggle={this.toggleSetNameDialog}\n          />\n          }\n          {isSetMaxUserNumberDialogOpen &&\n          <SysAdminSetOrgMaxUserNumberDialog\n            value={max_user_number}\n            updateValue={this.props.updateMaxUserNumber}\n            toggle={this.toggleSetMaxUserNumberDialog}\n          />\n          }\n        </Fragment>\n      );\n    }\n  }\n}\n\nclass OrgInfo extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      loading: true,\n      errorMsg: '',\n      orgInfo: {}\n    };\n  }\n\n  componentDidMount () {\n    seafileAPI.sysAdminGetOrg(this.props.orgID).then((res) => {\n      this.setState({\n        loading: false,\n        orgInfo: res.data\n      });\n    }).catch((error) => {\n      this.setState({\n        loading: false,\n        errorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403\n      });\n    });\n  }\n\n  updateQuota = (quota) => {\n    const data = {quota: quota};\n    seafileAPI.sysAdminUpdateOrg(this.props.orgID, data).then(res => {\n      const newOrgInfo = Object.assign(this.state.orgInfo, {\n        quota: res.data.quota\n      });\n      this.setState({orgInfo: newOrgInfo});\n      toaster.success(gettext('Successfully set quota.'));\n    }).catch((error) => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  updateName = (orgName) => {\n    const data = {orgName: orgName};\n    seafileAPI.sysAdminUpdateOrg(this.props.orgID, data).then(res => {\n      const newOrgInfo = Object.assign(this.state.orgInfo, {\n        org_name: res.data.org_name\n      });\n      this.setState({orgInfo: newOrgInfo});\n      toaster.success(gettext('Successfully set name.'));\n    }).catch((error) => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  updateMaxUserNumber = (newValue) => {\n    const data = {maxUserNumber: newValue};\n    seafileAPI.sysAdminUpdateOrg(this.props.orgID, data).then(res => {\n      const newOrgInfo = Object.assign(this.state.orgInfo, {\n        max_user_number: res.data.max_user_number\n      });\n      this.setState({orgInfo: newOrgInfo});\n      toaster.success(gettext('Successfully set max number of members.'));\n    }).catch((error) => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  render() {\n    const { orgInfo } = this.state;\n    return (\n      <Fragment>\n        <MainPanelTopbar />\n        <div className=\"main-panel-center flex-row\">\n          <div className=\"cur-view-container\">\n            <OrgNav currentItem=\"info\" orgID={this.props.orgID} orgName={orgInfo.org_name} />\n            <div className=\"cur-view-content\">\n              <Content\n                orgID={this.props.orgID}\n                loading={this.state.loading}\n                errorMsg={this.state.errorMsg}\n                orgInfo={this.state.orgInfo}\n                updateQuota={this.updateQuota}\n                updateName={this.updateName}\n                updateMaxUserNumber={this.updateMaxUserNumber}\n              />\n            </div>\n          </div>\n        </div>\n      </Fragment>\n    );\n  }\n}\n\nexport default OrgInfo;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { gettext } from '../../utils/constants';\nimport SelectEditor from './select-editor';\n\nconst propTypes = {\n  isTextMode: PropTypes.bool.isRequired,\n  isEditIconShow: PropTypes.bool.isRequired,\n  statusOptions: PropTypes.array.isRequired,\n  currentStatus: PropTypes.string.isRequired,\n  onStatusChanged: PropTypes.func.isRequired\n};\n\nclass SysAdminUserMembershipEditor extends React.Component {\n\n  translateStatus = (status) => {\n    switch (status) {\n      case 'is_org_staff':\n        return gettext('Admin');\n      case 'not_is_org_staff':\n        return gettext('Member');\n    }\n  }\n\n  render() {\n    return (\n      <SelectEditor\n        isTextMode={this.props.isTextMode}\n        isEditIconShow={this.props.isEditIconShow}\n        options={this.props.statusOptions}\n        currentOption={this.props.currentStatus}\n        onOptionChanged={this.props.onStatusChanged}\n        translateOption={this.translateStatus}\n      />\n    );\n  }\n}\n\nSysAdminUserMembershipEditor.propTypes = propTypes;\n\nexport default SysAdminUserMembershipEditor;\n","import React, { Component, Fragment } from 'react';\nimport { Button } from 'reactstrap';\nimport moment from 'moment';\nimport { Utils } from '../../../utils/utils';\nimport { seafileAPI } from '../../../utils/seafile-api';\nimport { siteRoot, gettext, username } from '../../../utils/constants';\nimport toaster from '../../../components/toast';\nimport EmptyTip from '../../../components/empty-tip';\nimport Loading from '../../../components/loading';\nimport SysAdminUserStatusEditor from '../../../components/select-editor/sysadmin-user-status-editor';\nimport SysAdminUserMembershipEditor from '../../../components/select-editor/sysadmin-user-membership-editor';\nimport SysAdminAddUserDialog from '../../../components/dialog/sysadmin-dialog/sysadmin-add-user-dialog';\nimport CommonOperationConfirmationDialog from '../../../components/dialog/common-operation-confirmation-dialog';\nimport OpMenu from '../../../components/dialog/op-menu';\nimport MainPanelTopbar from '../main-panel-topbar';\nimport UserLink from '../user-link';\nimport OrgNav from './org-nav';\n\nclass Content extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      isItemFreezed: false\n    };\n  }\n\n  onFreezedItem = () => {\n    this.setState({isItemFreezed: true});\n  }\n\n  onUnfreezedItem = () => {\n    this.setState({isItemFreezed: false});\n  }\n\n  render() {\n    const { loading, errorMsg, items } = this.props;\n    if (loading) {\n      return <Loading />;\n    } else if (errorMsg) {\n      return <p className=\"error text-center mt-4\">{errorMsg}</p>;\n    } else {\n      const emptyTip = (\n        <EmptyTip>\n          <h2>{gettext('No members')}</h2>\n        </EmptyTip>\n      );\n      const table = (\n        <Fragment>\n          <table>\n            <thead>\n              <tr>\n                <th width=\"25%\">{gettext('Name')}</th>\n                <th width=\"15%\">{gettext('Status')}</th>\n                <th width=\"15%\">{gettext('Membership')}</th>\n                <th width=\"15%\">{gettext('Space Used')}</th>\n                <th width=\"25%\">{gettext('Created At')}{' / '}{gettext('Last Login')}</th>\n                <th width=\"5%\">{/* Operations */}</th>\n              </tr>\n            </thead>\n            <tbody>\n              {items.map((item, index) => {\n                return (<Item\n                  key={index}\n                  item={item}\n                  isItemFreezed={this.state.isItemFreezed}\n                  onFreezedItem={this.onFreezedItem}\n                  onUnfreezedItem={this.onUnfreezedItem}\n                  updateStatus={this.props.updateStatus}\n                  updateMembership={this.props.updateMembership}\n                  deleteUser={this.props.deleteUser}\n                />);\n              })}\n            </tbody>\n          </table>\n        </Fragment>\n      );\n      return items.length ? table : emptyTip;\n    }\n  }\n}\n\nclass Item extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      isOpIconShown: false,\n      highlight: false,\n      isDeleteDialogOpen: false,\n      isResetPasswordDialogOpen: false\n    };\n  }\n\n  handleMouseEnter = () => {\n    if (!this.props.isItemFreezed) {\n      this.setState({\n        isOpIconShown: true,\n        highlight: true\n      });\n    }\n  }\n\n  handleMouseLeave = () => {\n    if (!this.props.isItemFreezed) {\n      this.setState({\n        isOpIconShown: false,\n        highlight: false\n      });\n    }\n  }\n\n  onUnfreezedItem = () => {\n    this.setState({\n      highlight: false,\n      isOpIconShow: false\n    });\n    this.props.onUnfreezedItem();\n  }\n\n  onMenuItemClick = (operation) => {\n    switch(operation) {\n      case 'Delete':\n        this.toggleDeleteDialog();\n        break;\n      case 'Reset Password':\n        this.toggleResetPasswordDialog();\n        break;\n      default:\n        break;\n    }\n  }\n\n  toggleDeleteDialog = (e) => {\n    if (e) {\n      e.preventDefault();\n    }\n    this.setState({isDeleteDialogOpen: !this.state.isDeleteDialogOpen});\n  }\n\n  toggleResetPasswordDialog = (e) => {\n    if (e) {\n      e.preventDefault();\n    }\n    this.setState({isResetPasswordDialogOpen: !this.state.isResetPasswordDialogOpen});\n  }\n\n  updateStatus= (statusValue) => {\n    this.props.updateStatus(this.props.item.email, statusValue);\n  }\n\n  updateMembership= (membershipValue) => {\n    this.props.updateMembership(this.props.item.email, membershipValue);\n  }\n\n  deleteUser = () => {\n    const { item } = this.props;\n    this.props.deleteUser(item.org_id, item.email);\n  }\n\n  resetPassword = () => {\n    seafileAPI.sysAdminResetUserPassword(this.props.item.email).then(res => {\n      toaster.success(res.data.reset_tip);\n    }).catch((error) => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  translateOperations = (item) => {\n    let translateResult = '';\n    switch(item) {\n      case 'Delete':\n        translateResult = gettext('Delete');\n        break;\n      case 'Reset Password':\n        translateResult = gettext('Reset Password');\n        break;\n    }\n\n    return translateResult;\n  }\n\n  render() {\n    const { item } = this.props;\n    const { isOpIconShown, isDeleteDialogOpen, isResetPasswordDialogOpen } = this.state;\n\n    const itemName = '<span class=\"op-target\">' + Utils.HTMLescape(item.name) + '</span>';\n    let deleteDialogMsg = gettext('Are you sure you want to delete {placeholder} ?').replace('{placeholder}', itemName);\n    let resetPasswordDialogMsg = gettext('Are you sure you want to reset the password of {placeholder} ?').replace('{placeholder}', itemName);\n\n    return (\n      <Fragment>\n        <tr className={this.state.highlight ? 'tr-highlight' : ''} onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave}>\n          <td><UserLink email={item.email} name={item.name} /></td>\n          <td>\n            <SysAdminUserStatusEditor\n              isTextMode={true}\n              isEditIconShow={isOpIconShown}\n              currentStatus={item.active ? 'active' : 'inactive'}\n              statusOptions={['active', 'inactive']}\n              onStatusChanged={this.updateStatus}\n            />\n          </td>\n          <td>\n            <SysAdminUserMembershipEditor\n              isTextMode={true}\n              isEditIconShow={isOpIconShown}\n              currentStatus={item.is_org_staff ? 'is_org_staff' : 'not_is_org_staff'}\n              statusOptions={['is_org_staff', 'not_is_org_staff']}\n              onStatusChanged={this.updateMembership}\n            />\n          </td>\n          <td>{`${Utils.bytesToSize(item.quota_usage)} / ${item.quota_total > 0 ? Utils.bytesToSize(item.quota_total) : '--'}`}</td>\n          <td>\n            {moment(item.create_time).format('YYYY-MM-DD HH:mm:ss')}{' / '}{item.last_login ? moment(item.last_login).fromNow() : '--'}\n          </td>\n          <td>\n            {(isOpIconShown && item.email != username) &&\n            <OpMenu\n              operations={['Delete', 'Reset Password']}\n              translateOperations={this.translateOperations}\n              onMenuItemClick={this.onMenuItemClick}\n              onFreezedItem={this.props.onFreezedItem}\n              onUnfreezedItem={this.onUnfreezedItem}\n            />\n            }\n          </td>\n        </tr>\n        {isDeleteDialogOpen &&\n          <CommonOperationConfirmationDialog\n            title={gettext('Delete Member')}\n            message={deleteDialogMsg}\n            executeOperation={this.deleteUser}\n            confirmBtnText={gettext('Delete')}\n            toggleDialog={this.toggleDeleteDialog}\n          />\n        }\n        {isResetPasswordDialogOpen &&\n          <CommonOperationConfirmationDialog\n            title={gettext('Reset Password')}\n            message={resetPasswordDialogMsg}\n            executeOperation={this.resetPassword}\n            confirmBtnText={gettext('Reset')}\n            toggleDialog={this.toggleResetPasswordDialog}\n          />\n        }\n      </Fragment>\n    );\n  }\n}\n\nclass OrgUsers extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      loading: true,\n      errorMsg: '',\n      orgName: '',\n      userList: [],\n      isAddUserDialogOpen: false\n    };\n  }\n\n  componentDidMount () {\n    seafileAPI.sysAdminGetOrg(this.props.orgID).then((res) => {\n      this.setState({\n        orgName: res.data.org_name\n      });\n    });\n    seafileAPI.sysAdminListOrgUsers(this.props.orgID).then((res) => {\n      this.setState({\n        loading: false,\n        userList: res.data.users\n      });\n    }).catch((error) => {\n      this.setState({\n        loading: false,\n        errorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403\n      });\n    });\n  }\n\n  toggleAddUserDialog = () => {\n    this.setState({isAddUserDialogOpen: !this.state.isAddUserDialogOpen});\n  }\n\n  addUser = (newUserInfo) => {\n    const { email, name, password } = newUserInfo;\n    seafileAPI.sysAdminAddOrgUser(this.props.orgID, email, name, password).then(res => {\n      let userList = this.state.userList;\n      userList.unshift(res.data);\n      this.setState({userList: userList});\n    }).catch((error) => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  deleteUser = (orgID, email) => {\n    seafileAPI.sysAdminDeleteOrgUser(orgID, email).then(res => {\n      let newUserList = this.state.userList.filter(item => {\n        return item.email != email;\n      });\n      this.setState({userList: newUserList});\n      toaster.success(gettext('Successfully deleted 1 item.'));\n    }).catch((error) => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  updateStatus = (email, statusValue) => {\n    const isActive = statusValue == 'active';\n    seafileAPI.sysAdminUpdateOrgUser(this.props.orgID, email, 'active', isActive).then(res => {\n      let newUserList = this.state.userList.map(item => {\n        if (item.email == email) {\n          item.active = res.data.active;\n        }\n        return item;\n      });\n      this.setState({userList: newUserList});\n    }).catch((error) => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  updateMembership = (email, membershipValue) => {\n    const isOrgStaff = membershipValue == 'is_org_staff';\n    seafileAPI.sysAdminUpdateOrgUser(this.props.orgID, email, 'is_org_staff', isOrgStaff).then(res => {\n      let newUserList = this.state.userList.map(item => {\n        if (item.email == email) {\n          item.is_org_staff = res.data.is_org_staff;\n        }\n        return item;\n      });\n      this.setState({userList: newUserList});\n    }).catch((error) => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  render() {\n    const { isAddUserDialogOpen, orgName } = this.state;\n    return (\n      <Fragment>\n        <MainPanelTopbar>\n          <Button className=\"btn btn-secondary operation-item\" onClick={this.toggleAddUserDialog}>{gettext('Add Member')}</Button>\n        </MainPanelTopbar>\n        <div className=\"main-panel-center flex-row\">\n          <div className=\"cur-view-container\">\n            <OrgNav\n              currentItem=\"users\"\n              orgID={this.props.orgID}\n              orgName={orgName}\n            />\n            <div className=\"cur-view-content\">\n              <Content\n                loading={this.state.loading}\n                errorMsg={this.state.errorMsg}\n                items={this.state.userList}\n                updateStatus={this.updateStatus}\n                updateMembership={this.updateMembership}\n                deleteUser={this.deleteUser}\n              />\n            </div>\n          </div>\n        </div>\n        {isAddUserDialogOpen &&\n          <SysAdminAddUserDialog\n            addUser={this.addUser}\n            toggleDialog={this.toggleAddUserDialog}\n          />\n        }\n      </Fragment>\n    );\n  }\n}\n\nexport default OrgUsers;\n","import React, { Component, Fragment } from 'react';\nimport moment from 'moment';\nimport { Utils } from '../../../utils/utils';\nimport { seafileAPI } from '../../../utils/seafile-api';\nimport { siteRoot, gettext } from '../../../utils/constants';\nimport toaster from '../../../components/toast';\nimport EmptyTip from '../../../components/empty-tip';\nimport Loading from '../../../components/loading';\nimport CommonOperationConfirmationDialog from '../../../components/dialog/common-operation-confirmation-dialog';\nimport MainPanelTopbar from '../main-panel-topbar';\nimport UserLink from '../user-link';\nimport OrgNav from './org-nav';\n\nclass Content extends Component {\n\n  constructor(props) {\n    super(props);\n  }\n\n  render() {\n    const { loading, errorMsg, items } = this.props;\n    if (loading) {\n      return <Loading />;\n    } else if (errorMsg) {\n      return <p className=\"error text-center mt-4\">{errorMsg}</p>;\n    } else {\n      const emptyTip = (\n        <EmptyTip>\n          <h2>{gettext('No groups')}</h2>\n        </EmptyTip>\n      );\n      const table = (\n        <Fragment>\n          <table className=\"table-hover\">\n            <thead>\n              <tr>\n                <th width=\"30%\">{gettext('Name')}</th>\n                <th width=\"30%\">{gettext('Creator')}</th>\n                <th width=\"30%\">{gettext('Created At')}</th>\n                <th width=\"10%\">{/* Operations */}</th>\n              </tr>\n            </thead>\n            <tbody>\n              {items.map((item, index) => {\n                return (<Item\n                  key={index}\n                  item={item}\n                  deleteGroup={this.props.deleteGroup}\n                />);\n              })}\n            </tbody>\n          </table>\n        </Fragment>\n      );\n      return items.length ? table : emptyTip;\n    }\n  }\n}\n\nclass Item extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      isOpIconShown: false,\n      isDeleteDialogOpen: false\n    };\n  }\n\n  handleMouseEnter = () => {\n    this.setState({isOpIconShown: true});\n  }\n\n  handleMouseLeave = () => {\n    this.setState({isOpIconShown: false});\n  }\n\n  toggleDeleteDialog = (e) => {\n    if (e) {\n      e.preventDefault();\n    }\n    this.setState({isDeleteDialogOpen: !this.state.isDeleteDialogOpen});\n  }\n\n  deleteGroup = () => {\n    this.toggleDeleteDialog();\n    this.props.deleteGroup(this.props.item.group_id);\n  }\n\n  render() {\n    const { item } = this.props;\n    const { isOpIconShown, isDeleteDialogOpen } = this.state;\n\n    const itemName = '<span class=\"op-target\">' + Utils.HTMLescape(item.group_name) + '</span>';\n    const deleteDialogMsg = gettext('Are you sure you want to delete {placeholder} ?').replace('{placeholder}', itemName);\n\n    const groupUrl = item.parent_group_id == 0 ?\n      `${siteRoot}sys/groups/${item.group_id}/libraries/` :\n      `${siteRoot}sysadmin/#address-book/groups/${item.group_id}/`;\n\n    return (\n      <Fragment>\n        <tr onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave}>\n          <td><a href={groupUrl}>{item.group_name}</a></td>\n          <td><UserLink email={item.creator_email} name={item.creator_name} /></td>\n          <td>{moment(item.created_at).format('YYYY-MM-DD HH:mm:ss')}</td>\n          <td>\n            <a href=\"#\" className={`action-icon sf2-icon-delete ${isOpIconShown ? '' : 'invisible'}`} title={gettext('Delete')} onClick={this.toggleDeleteDialog}></a>\n          </td>\n        </tr>\n        {isDeleteDialogOpen &&\n          <CommonOperationConfirmationDialog\n            title={gettext('Delete Group')}\n            message={deleteDialogMsg}\n            executeOperation={this.deleteGroup}\n            confirmBtnText={gettext('Delete')}\n            toggleDialog={this.toggleDeleteDialog}\n          />\n        }\n      </Fragment>\n    );\n  }\n}\n\nclass OrgGroups extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      loading: true,\n      errorMsg: '',\n      orgName: '',\n      groupList: []\n    };\n  }\n\n  componentDidMount () {\n    seafileAPI.sysAdminGetOrg(this.props.orgID).then((res) => {\n      this.setState({\n        orgName: res.data.org_name\n      });\n    });\n    seafileAPI.sysAdminListOrgGroups(this.props.orgID).then((res) => {\n      this.setState({\n        loading: false,\n        groupList: res.data.group_list\n      });\n    }).catch((error) => {\n      this.setState({\n        loading: false,\n        errorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403\n      });\n    });\n  }\n\n  deleteGroup = (groupID) => {\n    seafileAPI.sysAdminDismissGroupByID(groupID).then(res => {\n      let newGroupList = this.state.groupList.filter(item => {\n        return item.group_id != groupID;\n      });\n      this.setState({groupList: newGroupList});\n      toaster.success(gettext('Successfully deleted 1 item.'));\n    }).catch((error) => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  render() {\n    return (\n      <Fragment>\n        <MainPanelTopbar />\n        <div className=\"main-panel-center flex-row\">\n          <div className=\"cur-view-container\">\n            <OrgNav\n              currentItem=\"groups\"\n              orgID={this.props.orgID}\n              orgName={this.state.orgName}\n            />\n            <div className=\"cur-view-content\">\n              <Content\n                loading={this.state.loading}\n                errorMsg={this.state.errorMsg}\n                items={this.state.groupList}\n                deleteGroup={this.deleteGroup}\n              />\n            </div>\n          </div>\n        </div>\n      </Fragment>\n    );\n  }\n}\n\nexport default OrgGroups;\n","import React, { Component, Fragment } from 'react';\nimport { Utils } from '../../../utils/utils';\nimport { seafileAPI } from '../../../utils/seafile-api';\nimport { siteRoot, gettext } from '../../../utils/constants';\nimport toaster from '../../../components/toast';\nimport EmptyTip from '../../../components/empty-tip';\nimport Loading from '../../../components/loading';\nimport CommonOperationConfirmationDialog from '../../../components/dialog/common-operation-confirmation-dialog';\nimport MainPanelTopbar from '../main-panel-topbar';\nimport UserLink from '../user-link';\nimport OrgNav from './org-nav';\n\nclass Content extends Component {\n\n  constructor(props) {\n    super(props);\n  }\n\n  render() {\n    const { loading, errorMsg, items } = this.props;\n    if (loading) {\n      return <Loading />;\n    } else if (errorMsg) {\n      return <p className=\"error text-center mt-4\">{errorMsg}</p>;\n    } else {\n      const emptyTip = (\n        <EmptyTip>\n          <h2>{gettext('No libraries')}</h2>\n        </EmptyTip>\n      );\n      const table = (\n        <Fragment>\n          <table className=\"table-hover\">\n            <thead>\n              <tr>\n                <th width=\"5%\"></th>\n                <th width=\"30%\">{gettext('Name')}</th>\n                <th width=\"35%\">{gettext('ID')}</th>\n                <th width=\"20%\">{gettext('Owner')}</th>\n                <th width=\"10%\">{/* Operations */}</th>\n              </tr>\n            </thead>\n            <tbody>\n              {items.map((item, index) => {\n                return (<Item\n                  key={index}\n                  item={item}\n                  deleteRepo={this.props.deleteRepo}\n                />);\n              })}\n            </tbody>\n          </table>\n        </Fragment>\n      );\n      return items.length ? table : emptyTip;\n    }\n  }\n}\n\nclass Item extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      isOpIconShown: false,\n      isDeleteDialogOpen: false\n    };\n  }\n\n  handleMouseEnter = () => {\n    this.setState({isOpIconShown: true});\n  }\n\n  handleMouseLeave = () => {\n    this.setState({isOpIconShown: false});\n  }\n\n  toggleDeleteDialog = (e) => {\n    if (e) {\n      e.preventDefault();\n    }\n    this.setState({isDeleteDialogOpen: !this.state.isDeleteDialogOpen});\n  }\n\n  deleteRepo = () => {\n    this.props.deleteRepo(this.props.item.repo_id);\n  }\n\n  render() {\n    const { item } = this.props;\n    const { isOpIconShown, isDeleteDialogOpen } = this.state;\n\n    const iconUrl = Utils.getLibIconUrl(item);\n    const iconTitle = Utils.getLibIconTitle(item);\n\n    const itemName = '<span class=\"op-target\">' + Utils.HTMLescape(item.repo_name) + '</span>';\n    const deleteDialogMsg = gettext('Are you sure you want to delete {placeholder} ?').replace('{placeholder}', itemName);\n\n    return (\n      <Fragment>\n        <tr onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave}>\n          <td><img src={iconUrl} title={iconTitle} alt={iconTitle} width=\"24\" /></td>\n          <td>{item.repo_name}</td>\n          <td>{item.repo_id}</td>\n          <td>\n            {!item.owner_email ?\n              '--' :\n              item.owner_email.indexOf('@seafile_group') == -1 ?\n              <UserLink email={item.owner_email} name={item.owner_name} /> :\n              item.owner_name\n            }\n          </td>\n          <td>\n            <a href=\"#\" className={`action-icon sf2-icon-delete ${isOpIconShown ? '' : 'invisible'}`} title={gettext('Delete')} onClick={this.toggleDeleteDialog}></a>\n          </td>\n        </tr>\n        {isDeleteDialogOpen &&\n          <CommonOperationConfirmationDialog\n            title={gettext('Delete Library')}\n            message={deleteDialogMsg}\n            executeOperation={this.deleteRepo}\n            confirmBtnText={gettext('Delete')}\n            toggleDialog={this.toggleDeleteDialog}\n          />\n        }\n      </Fragment>\n    );\n  }\n}\n\nclass OrgRepos extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      loading: true,\n      errorMsg: '',\n      orgName: '',\n      repoList: []\n    };\n  }\n\n  componentDidMount () {\n    seafileAPI.sysAdminGetOrg(this.props.orgID).then((res) => {\n      this.setState({\n        orgName: res.data.org_name\n      });\n    });\n    seafileAPI.sysAdminListOrgRepos(this.props.orgID).then((res) => {\n      this.setState({\n        loading: false,\n        repoList: res.data.repo_list\n      });\n    }).catch((error) => {\n      this.setState({\n        loading: false,\n        errorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403\n      });\n    });\n  }\n\n  deleteRepo = (repoID) => {\n    seafileAPI.sysAdminDeleteRepo(repoID).then(res => {\n      let newRepoList = this.state.repoList.filter(item => {\n        return item.repo_id != repoID;\n      });\n      this.setState({repoList: newRepoList});\n      toaster.success(gettext('Successfully deleted 1 item.'));\n    }).catch((error) => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  render() {\n    return (\n      <Fragment>\n        <MainPanelTopbar />\n        <div className=\"main-panel-center flex-row\">\n          <div className=\"cur-view-container\">\n            <OrgNav\n              currentItem=\"repos\"\n              orgID={this.props.orgID}\n              orgName={this.state.orgName}\n            />\n            <div className=\"cur-view-content\">\n              <Content\n                loading={this.state.loading}\n                errorMsg={this.state.errorMsg}\n                items={this.state.repoList}\n                deleteRepo={this.deleteRepo}\n              />\n            </div>\n          </div>\n        </div>\n      </Fragment>\n    );\n  }\n}\n\nexport default OrgRepos;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Button, Modal, ModalHeader, ModalBody, ModalFooter, Form, FormGroup, Input } from 'reactstrap';\nimport { gettext } from '../../../utils/constants';\n\nconst propTypes = {\n  toggle: PropTypes.func.isRequired,\n  addInstitution: PropTypes.func.isRequired\n};\n\nclass SysAdminAddInstitutionDialog extends React.Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      value: '',\n      isSubmitBtnActive: false\n    };\n  }\n\n  handleChange = (e) => {\n    const value = e.target.value;\n    this.setState({\n      value: value,\n      isSubmitBtnActive: value.trim() != ''\n    });\n  }\n\n  handleSubmit = () => {\n    this.toggle();\n    this.props.addInstitution(this.state.value.trim());\n  }\n\n  toggle = () => {\n    this.props.toggle();\n  }\n\n  render() {\n    return (\n      <Modal isOpen={true} toggle={this.toggle}>\n        <ModalHeader toggle={this.toggle}>{gettext('Add institution')}</ModalHeader>\n        <ModalBody>\n          <Form>\n            <p>{gettext('Name')}</p>\n            <FormGroup>\n              <Input\n                value={this.state.value}\n                onChange={this.handleChange}\n              />\n            </FormGroup>\n          </Form>\n        </ModalBody>\n        <ModalFooter>\n          <Button color=\"primary\" onClick={this.handleSubmit} disabled={!this.state.isSubmitBtnActive}>{gettext('Submit')}</Button>\n        </ModalFooter>\n      </Modal>\n    );\n  }\n}\n\nSysAdminAddInstitutionDialog.propTypes = propTypes;\n\nexport default SysAdminAddInstitutionDialog;\n","import React, { Component, Fragment } from 'react';\nimport { Link } from '@reach/router';\nimport { Button } from 'reactstrap';\nimport moment from 'moment';\nimport { Utils } from '../../../utils/utils';\nimport { seafileAPI } from '../../../utils/seafile-api';\nimport { siteRoot, gettext } from '../../../utils/constants';\nimport toaster from '../../../components/toast';\nimport EmptyTip from '../../../components/empty-tip';\nimport Loading from '../../../components/loading';\nimport CommonOperationConfirmationDialog from '../../../components/dialog/common-operation-confirmation-dialog';\nimport MainPanelTopbar from '../main-panel-topbar';\nimport SysAdminAddInstitutionDialog from '../../../components/dialog/sysadmin-dialog/sysadmin-add-institution-dialog';\nimport Paginator from '../../../components/paginator';\n\nclass Content extends Component {\n\n  constructor(props) {\n    super(props);\n  }\n\n  getPreviousPage = () => {\n    this.props.getInstitutionsByPage(this.props.currentPage - 1);\n  }\n\n  getNextPage = () => {\n    this.props.getInstitutionsByPage(this.props.currentPage + 1);\n  }\n\n  render() {\n    const { loading, errorMsg, items, perPage, currentPage, hasNextPage } = this.props;\n    if (loading) {\n      return <Loading />;\n    } else if (errorMsg) {\n      return <p className=\"error text-center mt-4\">{errorMsg}</p>;\n    } else {\n      const emptyTip = (\n        <EmptyTip>\n          <h2>{gettext('No institutions')}</h2>\n        </EmptyTip>\n      );\n      const table = (\n        <Fragment>\n          <table className=\"table-hover\">\n            <thead>\n              <tr>\n                <th width=\"75%\">{gettext('Name')}</th>\n                <th width=\"20%\">{gettext('Created At')}</th>\n                <th width=\"5%\">{/* Operations */}</th>\n              </tr>\n            </thead>\n            <tbody>\n              {items.map((item, index) => {\n                return (<Item\n                  key={index}\n                  item={item}\n                  deleteInstitution={this.props.deleteInstitution}\n                />);\n              })}\n            </tbody>\n          </table>\n          <Paginator\n            gotoPreviousPage={this.getPreviousPage}\n            gotoNextPage={this.getNextPage}\n            currentPage={currentPage}\n            hasNextPage={hasNextPage}\n            curPerPage={perPage}\n            resetPerPage={this.props.resetPerPage}\n          />\n        </Fragment>\n      );\n      return items.length ? table : emptyTip;\n    }\n  }\n}\n\nclass Item extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      isOpIconShown: false,\n      isDeleteDialogOpen: false\n    };\n  }\n\n  handleMouseEnter = () => {\n    this.setState({isOpIconShown: true});\n  }\n\n  handleMouseLeave = () => {\n    this.setState({isOpIconShown: false});\n  }\n\n  toggleDeleteDialog = (e) => {\n    if (e) {\n      e.preventDefault();\n    }\n    this.setState({isDeleteDialogOpen: !this.state.isDeleteDialogOpen});\n  }\n\n  deleteInstitution = () => {\n    this.props.deleteInstitution(this.props.item.id);\n  }\n\n  render() {\n    const { item } = this.props;\n    const { isOpIconShown, isDeleteDialogOpen } = this.state;\n\n    const institutionName = '<span class=\"op-target\">' + Utils.HTMLescape(item.name) + '</span>';\n    const deleteDialogMsg = gettext('Are you sure you want to delete {placeholder} ?').replace('{placeholder}', institutionName);\n\n    return (\n      <Fragment>\n        <tr onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave}>\n          <td><Link to={`${siteRoot}sys/institutions/${item.id}/info/`}>{item.name}</Link></td>\n          <td>{moment(item.ctime).fromNow()}</td>\n          <td>\n            <a href=\"#\" className={`action-icon sf2-icon-delete ${isOpIconShown ? '' : 'invisible'}`} title={gettext('Delete')} onClick={this.toggleDeleteDialog}></a>\n          </td>\n        </tr>\n        {isDeleteDialogOpen &&\n          <CommonOperationConfirmationDialog\n            title={gettext('Delete Institution')}\n            message={deleteDialogMsg}\n            executeOperation={this.deleteInstitution}\n            confirmBtnText={gettext('Delete')}\n            toggleDialog={this.toggleDeleteDialog}\n          />\n        }\n      </Fragment>\n    );\n  }\n}\n\nclass Institutions extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      loading: true,\n      errorMsg: '',\n      institutionList: [],\n      perPage: 25,\n      currentPage: 1,\n      hasNextPage: false,\n      isAddInstitutionDialogOpen: false,\n    };\n    this.initPage = 1;\n  }\n\n  componentDidMount () {\n    let urlParams = (new URL(window.location)).searchParams;\n    const { currentPage, perPage } = this.state;\n    this.setState({\n      perPage: parseInt(urlParams.get('per_page') || perPage),\n      currentPage: parseInt(urlParams.get('page') || currentPage)\n    }, () => {\n      this.getInstitutionsByPage(this.state.currentPage);\n    });\n  }\n\n  getInstitutionsByPage = (page) => {\n    let { perPage } = this.state;\n    seafileAPI.sysAdminListInstitutions(page, perPage).then((res) => {\n      this.setState({\n        loading: false,\n        institutionList: res.data.institution_list,\n        currentPage: page,\n        hasNextPage: Utils.hasNextPage(page, perPage, res.data.total_count),\n      });\n    }).catch((error) => {\n      this.setState({\n        loading: false,\n        errorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403\n      });\n    });\n  }\n\n  resetPerPage = (newPerPage) => {\n    this.setState({\n      perPage: newPerPage,\n    }, () => this.getInstitutionsByPage(this.initPage));\n  }\n\n  toggleAddInstitutionDialog = () => {\n    this.setState({isAddInstitutionDialogOpen: !this.state.isAddInstitutionDialogOpen});\n  }\n\n  addInstitution = (name) => {\n    seafileAPI.sysAdminAddInstitution(name).then(res => {\n      let institutionList = this.state.institutionList;\n      institutionList.push(res.data);\n      this.setState({institutionList: institutionList});\n    }).catch((error) => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  deleteInstitution = (institutionID) => {\n    seafileAPI.sysAdminDeleteInstitution(institutionID).then(res => {\n      let institutionList = this.state.institutionList.filter(inst => {\n        return inst.id != institutionID;\n      });\n      this.setState({institutionList: institutionList});\n      toaster.success(gettext('Successfully deleted 1 item.'));\n    }).catch((error) => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  render() {\n    const { isAddInstitutionDialogOpen, hasNextPage, currentPage, perPage } = this.state;\n    return (\n      <Fragment>\n        <MainPanelTopbar>\n          <Button className=\"btn btn-secondary operation-item\" onClick={this.toggleAddInstitutionDialog}>{gettext('Add Institution')}</Button>\n        </MainPanelTopbar>\n        <div className=\"main-panel-center flex-row\">\n          <div className=\"cur-view-container\">\n            <div className=\"cur-view-path\">\n              <h3 className=\"sf-heading\">{gettext('Institutions')}</h3>\n            </div>\n            <div className=\"cur-view-content\">\n              <Content\n                loading={this.state.loading}\n                errorMsg={this.state.errorMsg}\n                items={this.state.institutionList}\n                deleteInstitution={this.deleteInstitution}\n                currentPage={currentPage}\n                perPage={perPage}\n                hasNextPage={hasNextPage}\n                getInstitutionsByPage={this.getInstitutionsByPage}\n                resetPerPage={this.resetPerPage}\n              />\n            </div>\n          </div>\n        </div>\n        {isAddInstitutionDialogOpen &&\n          <SysAdminAddInstitutionDialog\n            addInstitution={this.addInstitution}\n            toggle={this.toggleAddInstitutionDialog}\n          />\n        }\n      </Fragment>\n    );\n  }\n}\n\nexport default Institutions;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Link } from '@reach/router';\nimport { siteRoot, gettext } from '../../../utils/constants';\n\nconst propTypes = {\n  currentItem: PropTypes.string.isRequired\n};\n\nclass Nav extends React.Component {\n\n  constructor(props) {\n    super(props);\n    this.navItems = [\n      {name: 'info', urlPart: 'info', text: gettext('Info')},\n      {name: 'members', urlPart: 'members', text: gettext('Members')},\n      {name: 'admins', urlPart: 'admins', text: gettext('Admins')},\n    ];\n  }\n\n  render() {\n    const { currentItem, institutionID, institutionName } = this.props;\n    return (\n      <div>\n        <div className=\"cur-view-path\">\n          <h3 className=\"sf-heading\"><Link to={`${siteRoot}sys/institutions/`}>{gettext('Institutions')}</Link> / {institutionName}</h3>\n        </div>\n        <ul className=\"nav border-bottom mx-4\">\n          {this.navItems.map((item, index) => {\n            return (\n              <li className=\"nav-item mr-2\" key={index}>\n                <Link to={`${siteRoot}sys/institutions/${institutionID}/${item.urlPart}/`} className={`nav-link ${currentItem == item.name ? ' active' : ''}`}>{item.text}</Link>\n              </li>\n            );\n          })}\n        </ul>\n      </div>\n    );\n  }\n}\n\nNav.propTypes = propTypes;\n\nexport default Nav;\n","import React, { Component, Fragment } from 'react';\nimport { Utils } from '../../../utils/utils';\nimport { seafileAPI } from '../../../utils/seafile-api';\nimport { gettext } from '../../../utils/constants';\nimport toaster from '../../../components/toast';\nimport Loading from '../../../components/loading';\nimport SysAdminSetInstitutionQuotaDialog from '../../../components/dialog/sysadmin-dialog/set-quota';\nimport MainPanelTopbar from '../main-panel-topbar';\nimport InstitutionNav from './institution-nav';\n\nclass Content extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      isSetQuotaDialogOpen: false,\n    };\n  }\n\n  toggleSetQuotaDialog = () => {\n    this.setState({isSetQuotaDialogOpen: !this.state.isSetQuotaDialogOpen});\n  }\n\n  showEditIcon = (action) => {\n    return (\n      <span\n        title={gettext('Edit')}\n        className=\"fa fa-pencil-alt attr-action-icon\"\n        onClick={action}>\n      </span>\n    );\n  }\n\n  render() {\n    const { loading, errorMsg, institutionInfo } = this.props;\n    if (loading) {\n      return <Loading />;\n    } else if (errorMsg) {\n      return <p className=\"error text-center\">{errorMsg}</p>;\n    } else {\n      const { name, user_count, quota_total, quota_used } = institutionInfo;\n      const { isSetQuotaDialogOpen } = this.state;\n      return (\n        <Fragment>\n          <dl className=\"m-0\">\n            <dt className=\"info-item-heading\">{gettext('Name')}</dt>\n            <dd className=\"info-item-content\">\n              {name}\n            </dd>\n\n            <dt className=\"info-item-heading\">{gettext('Number of members')}</dt>\n            <dd className=\"info-item-content\">{user_count}</dd>\n\n            <dt className=\"info-item-heading\">{gettext('Space Used')}</dt>\n            <dd className=\"info-item-content\">\n              {`${Utils.bytesToSize(quota_used)} / ${quota_total > 0 ? Utils.bytesToSize(quota_total) : '--'}`}\n              {this.showEditIcon(this.toggleSetQuotaDialog)}\n            </dd>\n          </dl>\n          {isSetQuotaDialogOpen &&\n          <SysAdminSetInstitutionQuotaDialog\n            updateQuota={this.props.updateQuota}\n            toggle={this.toggleSetQuotaDialog}\n          />\n          }\n        </Fragment>\n      );\n    }\n  }\n}\n\nclass InstitutionInfo extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      loading: true,\n      errorMsg: '',\n      institutionInfo: {}\n    };\n  }\n\n  componentDidMount () {\n    seafileAPI.sysAdminGetInstitution(this.props.institutionID).then((res) => {\n      this.setState({\n        loading: false,\n        institutionInfo: res.data\n      });\n    }).catch((error) => {\n      this.setState({\n        loading: false,\n        errorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403\n      });\n    });\n  }\n\n  updateQuota = (quota) => {\n    seafileAPI.sysAdminUpdateInstitution(this.props.institutionID, quota).then(res => {\n      const newInstitutionInfo = Object.assign(this.state.institutionInfo, {\n        quota_total: res.data.quota_total,\n      });\n      this.setState({institutionInfo: newInstitutionInfo});\n      toaster.success(gettext('Successfully set quota.'));\n    }).catch((error) => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n\n  render() {\n    const { institutionInfo } = this.state;\n    return (\n      <Fragment>\n        <MainPanelTopbar />\n        <div className=\"main-panel-center flex-row\">\n          <div className=\"cur-view-container\">\n            <InstitutionNav currentItem=\"info\" institutionID={this.props.institutionID} institutionName={institutionInfo.name} />\n            <div className=\"cur-view-content\">\n              <Content\n                loading={this.state.loading}\n                errorMsg={this.state.errorMsg}\n                institutionInfo={this.state.institutionInfo}\n                updateQuota={this.updateQuota}\n              />\n            </div>\n          </div>\n        </div>\n      </Fragment>\n    );\n  }\n}\n\nexport default InstitutionInfo;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Button, Modal, ModalHeader, ModalBody, ModalFooter } from 'reactstrap';\nimport { gettext } from '../../../utils/constants';\nimport UserSelect from '../../user-select.js';\n\nconst propTypes = {\n  toggle: PropTypes.func.isRequired,\n  addUser: PropTypes.func.isRequired\n};\n\nclass AddMemberDialog extends React.Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      selectedOption: [],\n    };\n  }\n\n  handleSelectChange = (option) => {\n    this.setState({ selectedOption: option });\n  }\n\n  handleSubmit = () => {\n    if (!this.state.selectedOption) return;\n    const emails = this.state.selectedOption.map(item => item.email);\n    this.props.addUser(emails);\n  }\n\n  render() {\n    return (\n      <Modal isOpen={true} toggle={this.props.toggle}>\n        <ModalHeader toggle={this.props.toggle}>{gettext('Add Member')}</ModalHeader>\n        <ModalBody>\n          <UserSelect\n            placeholder={gettext('Search users...')}\n            onSelectChange={this.handleSelectChange}\n            isMulti={true}\n            className='org-add-member-select'\n          />\n        </ModalBody>\n        <ModalFooter>\n          <Button color=\"primary\" onClick={this.handleSubmit}>{gettext('Submit')}</Button>\n          <Button color=\"secondary\" onClick={this.props.toggle}>{gettext('Cancel')}</Button>\n        </ModalFooter>\n      </Modal>\n    );\n  }\n}\n\nAddMemberDialog.propTypes = propTypes;\n\nexport default AddMemberDialog;\n","import React, { Component, Fragment } from 'react';\nimport { Button } from 'reactstrap';\nimport moment from 'moment';\nimport { Utils } from '../../../utils/utils';\nimport { seafileAPI } from '../../../utils/seafile-api';\nimport { gettext } from '../../../utils/constants';\nimport toaster from '../../../components/toast';\nimport EmptyTip from '../../../components/empty-tip';\nimport Loading from '../../../components/loading';\nimport Paginator from '../../../components/paginator';\nimport OpMenu from '../../../components/dialog/op-menu';\nimport AddMemberDialog from '../../../components/dialog/sysadmin-dialog/sysadmin-add-institution-member-dialog';\nimport CommonOperationConfirmationDialog from '../../../components/dialog/common-operation-confirmation-dialog';\nimport UserLink from '../user-link';\nimport MainPanelTopbar from '../main-panel-topbar';\nimport InstitutionNav from './institution-nav';\n\nclass Content extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      isItemFreezed: false\n    };\n  }\n\n  onFreezedItem = () => {\n    this.setState({isItemFreezed: true});\n  }\n\n  onUnfreezedItem = () => {\n    this.setState({isItemFreezed: false});\n  }\n\n  getPreviousPage = () => {\n    this.props.getInstitutionUsersByPage(this.props.currentPage - 1);\n  }\n\n  getNextPage = () => {\n    this.props.getInstitutionUsersByPage(this.props.currentPage + 1);\n  }\n\n  render() {\n    const { loading, errorMsg, items, perPage, currentPage, hasNextPage } = this.props;\n    if (loading) {\n      return <Loading />;\n    } else if (errorMsg) {\n      return <p className=\"error text-center mt-4\">{errorMsg}</p>;\n    } else {\n      const emptyTip = (\n        <EmptyTip>\n          <h2>{gettext('No members')}</h2>\n        </EmptyTip>\n      );\n      const table = (\n        <Fragment>\n          <table>\n            <thead>\n              <tr>\n                <th width=\"25%\">{gettext('Name')}</th>\n                <th width=\"10%\">{gettext('Status')}</th>\n                <th width=\"20%\">{gettext('Space Used')}</th>\n                <th width=\"40%\">{gettext('Created At')}{' / '}{gettext('Last Login')}</th>\n                <th width=\"5%\">{/* Operations */}</th>\n              </tr>\n            </thead>\n            <tbody>\n              {items.map((item, index) => {\n                return (<Item\n                  key={index}\n                  item={item}\n                  isItemFreezed={this.state.isItemFreezed}\n                  onFreezedItem={this.onFreezedItem}\n                  onUnfreezedItem={this.onUnfreezedItem}\n                  setAdmin={this.props.setAdmin}\n                  deleteUser={this.props.deleteUser}\n                />);\n              })}\n            </tbody>\n          </table>\n          <Paginator\n            gotoPreviousPage={this.getPreviousPage}\n            gotoNextPage={this.getNextPage}\n            currentPage={currentPage}\n            hasNextPage={hasNextPage}\n            curPerPage={perPage}\n            resetPerPage={this.props.resetPerPage}\n          />\n        </Fragment>\n      );\n      return items.length ? table : emptyTip;\n    }\n  }\n}\n\nclass Item extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      isOpIconShown: false,\n      highlight: false,\n      isSetAdminDialogOpen: false,\n    };\n  }\n\n  handleMouseEnter = () => {\n    if (!this.props.isItemFreezed) {\n      this.setState({\n        isOpIconShown: true,\n        highlight: true\n      });\n    }\n  }\n\n  handleMouseLeave = () => {\n    if (!this.props.isItemFreezed) {\n      this.setState({\n        isOpIconShown: false,\n        highlight: false\n      });\n    }\n  }\n\n  onUnfreezedItem = () => {\n    this.setState({\n      highlight: false,\n      isOpIconShow: false\n    });\n    this.props.onUnfreezedItem();\n  }\n\n  toggleSetAdminDialog = (e) => {\n    if (e) {\n      e.preventDefault();\n    }\n    this.setState({isSetAdminDialogOpen: !this.state.isSetAdminDialogOpen});\n  }\n\n  setAdmin = () => {\n    this.props.setAdmin(this.props.item.email);\n  }\n\n  onMenuItemClick = (operation) => {\n    switch (operation) {\n      case 'Delete':\n        this.props.deleteUser(this.props.item.email);\n        break;\n      case 'Set Admin':\n        this.toggleSetAdminDialog();\n        break;\n    }\n  }\n\n  getOperations = () => {\n    let operations = [];\n    if (!this.props.item.is_institution_admin) {\n      operations.push('Set Admin');\n    }\n    operations.push('Delete');\n    return operations;\n  }\n\n  translateOperations = (item) => {\n    let translateResult = '';\n    switch(item) {\n      case 'Delete':\n        translateResult = gettext('Delete');\n        break;\n      case 'Set Admin':\n        translateResult = gettext('Set Admin');\n        break;\n    }\n\n    return translateResult;\n  }\n\n  render() {\n    const { item } = this.props;\n    const { isOpIconShown, isSetAdminDialogOpen } = this.state;\n\n    const itemName = '<span class=\"op-target\">' + Utils.HTMLescape(item.name) + '</span>';\n    const dialogMsg = gettext('Are you sure you want to set {placeholder} as Admin?').replace('{placeholder}', itemName);\n\n    return (\n      <Fragment>\n        <tr className={this.state.highlight ? 'tr-highlight' : ''} onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave}>\n          <td>\n            <UserLink email={item.email} name={item.name} />\n          </td>\n          <td>\n            {item.is_active ? gettext('Active') : gettext('Inactive')}\n          </td>\n          <td>{`${Utils.bytesToSize(item.quota_usage)} / ${item.quota_total > 0 ? Utils.bytesToSize(item.quota_total) : '--'}`}</td>\n          <td>\n            {moment(item.create_time).format('YYYY-MM-DD HH:mm:ss')}{' / '}{item.last_login ? moment(item.last_login).fromNow() : '--'}\n          </td>\n          <td>\n            {isOpIconShown &&\n              <OpMenu\n                operations={this.getOperations()}\n                translateOperations={this.translateOperations}\n                onMenuItemClick={this.onMenuItemClick}\n                onFreezedItem={this.props.onFreezedItem}\n                onUnfreezedItem={this.onUnfreezedItem}\n              />\n            }\n          </td>\n        </tr>\n        {isSetAdminDialogOpen &&\n          <CommonOperationConfirmationDialog\n            title={gettext('Set Admin')}\n            message={dialogMsg}\n            executeOperation={this.setAdmin}\n            toggleDialog={this.toggleSetAdminDialog}\n            confirmBtnText={gettext('Set Admin')}\n          />\n        }\n      </Fragment>\n    );\n  }\n}\n\nclass InstitutionUsers extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      loading: true,\n      errorMsg: '',\n      institutionName: '',\n      userList: [],\n      perPage: 25,\n      currentPage: 1,\n      hasNextPage: false,\n      isAddUserDialogOpen: false\n    };\n    this.initPage = 1;\n  }\n\n  componentDidMount () {\n    seafileAPI.sysAdminGetInstitution(this.props.institutionID).then((res) => {\n      this.setState({\n        institutionName: res.data.name\n      });\n    });\n\n    let urlParams = (new URL(window.location)).searchParams;\n    const { currentPage, perPage } = this.state;\n    this.setState({\n      perPage: parseInt(urlParams.get('per_page') || perPage),\n      currentPage: parseInt(urlParams.get('page') || currentPage)\n    }, () => {\n      this.getInstitutionUsersByPage(this.state.currentPage);\n    });\n  }\n\n  getInstitutionUsersByPage = (page) => {\n    let { perPage } = this.state;\n    seafileAPI.sysAdminListInstitutionUsers(this.props.institutionID, page, perPage).then((res) => {\n      this.setState({\n        loading: false,\n        userList: res.data.user_list,\n        currentPage: page,\n        hasNextPage: Utils.hasNextPage(page, perPage, res.data.total_count),\n      });\n    }).catch((error) => {\n      this.setState({\n        loading: false,\n        errorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403\n      });\n    });\n  }\n\n  setAdmin = (email) => {\n    seafileAPI.sysAdminUpdateInstitutionUser(this.props.institutionID, email, true).then(res => {\n      let userList = this.state.userList.map(user => {\n        if (user.email == email) {\n          user.is_institution_admin = true;\n        }\n        return user;\n      });\n      this.setState({userList: userList});\n      toaster.success(gettext('Success'));\n    }).catch((error) => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  toggleAddUserDialog = () => {\n    this.setState({isAddUserDialogOpen: !this.state.isAddUserDialogOpen});\n  }\n\n  resetPerPage = (newPerPage) => {\n    this.setState({\n      perPage: newPerPage,\n    }, () => this.getInstitutionUsersByPage(this.initPage));\n  }\n\n  addUser = (emails) => {\n    seafileAPI.sysAdminAddInstitutionUserBatch(this.props.institutionID, emails).then(res => {\n      this.toggleAddUserDialog();\n      let successArray = res.data.success;\n      let failedArray = res.data.failed;\n      if (successArray.length) {\n        let newUserList = this.state.userList.concat(successArray);\n        this.setState({userList: newUserList});\n      }\n      failedArray.map((item) => {\n        toaster.danger(item.error_msg);\n      });\n    }).catch((error) => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  deleteUser = (email) => {\n    seafileAPI.sysAdminDeleteInstitutionUser(this.props.institutionID, email).then(res => {\n      let newUserList = this.state.userList.filter(user => {\n        return user.email != email;\n      });\n      this.setState({userList: newUserList});\n      toaster.success('success');\n    }).catch((error) => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  render() {\n    const { isAddUserDialogOpen, institutionName, hasNextPage, currentPage, perPage } = this.state;\n    return (\n      <Fragment>\n        <MainPanelTopbar>\n          <Button className=\"btn btn-secondary operation-item\" onClick={this.toggleAddUserDialog}>{gettext('Add Member')}</Button>\n        </MainPanelTopbar>\n        <div className=\"main-panel-center flex-row\">\n          <div className=\"cur-view-container\">\n            <InstitutionNav\n              currentItem=\"members\"\n              institutionID={this.props.institutionID}\n              institutionName={institutionName}\n            />\n            <div className=\"cur-view-content\">\n              <Content\n                loading={this.state.loading}\n                errorMsg={this.state.errorMsg}\n                items={this.state.userList}\n                setAdmin={this.setAdmin}\n                deleteUser={this.deleteUser}\n                currentPage={currentPage}\n                perPage={perPage}\n                hasNextPage={hasNextPage}\n                getInstitutionUsersByPage={this.getInstitutionUsersByPage}\n                resetPerPage={this.resetPerPage}\n              />\n            </div>\n          </div>\n        </div>\n        {isAddUserDialogOpen &&\n          <AddMemberDialog\n            addUser={this.addUser}\n            toggle={this.toggleAddUserDialog}\n          />\n        }\n      </Fragment>\n    );\n  }\n}\n\nexport default InstitutionUsers;\n","import React, { Component, Fragment } from 'react';\nimport moment from 'moment';\nimport { Utils } from '../../../utils/utils';\nimport { seafileAPI } from '../../../utils/seafile-api';\nimport { gettext } from '../../../utils/constants';\nimport toaster from '../../../components/toast';\nimport EmptyTip from '../../../components/empty-tip';\nimport Loading from '../../../components/loading';\nimport OpMenu from '../../../components/dialog/op-menu';\nimport CommonOperationConfirmationDialog from '../../../components/dialog/common-operation-confirmation-dialog';\nimport UserLink from '../user-link';\nimport MainPanelTopbar from '../main-panel-topbar';\nimport InstitutionNav from './institution-nav';\n\nclass Content extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      isItemFreezed: false\n    };\n  }\n\n  onFreezedItem = () => {\n    this.setState({isItemFreezed: true});\n  }\n\n  onUnfreezedItem = () => {\n    this.setState({isItemFreezed: false});\n  }\n\n  render() {\n    const { loading, errorMsg, items } = this.props;\n    if (loading) {\n      return <Loading />;\n    } else if (errorMsg) {\n      return <p className=\"error text-center mt-4\">{errorMsg}</p>;\n    } else {\n      const emptyTip = (\n        <EmptyTip>\n          <h2>{gettext('No admins')}</h2>\n        </EmptyTip>\n      );\n      const table = (\n        <Fragment>\n          <table>\n            <thead>\n              <tr>\n                <th width=\"25%\">{gettext('Name')}</th>\n                <th width=\"10%\">{gettext('Status')}</th>\n                <th width=\"20%\">{gettext('Space Used')}</th>\n                <th width=\"40%\">{gettext('Created At')}{' / '}{gettext('Last Login')}</th>\n                <th width=\"5%\">{/* Operations */}</th>\n              </tr>\n            </thead>\n            <tbody>\n              {items.map((item, index) => {\n                return (<Item\n                  key={index}\n                  item={item}\n                  isItemFreezed={this.state.isItemFreezed}\n                  onFreezedItem={this.onFreezedItem}\n                  onUnfreezedItem={this.onUnfreezedItem}\n                  revokeAdmin={this.props.revokeAdmin}\n                  deleteUser={this.props.deleteUser}\n                />);\n              })}\n            </tbody>\n          </table>\n        </Fragment>\n      );\n      return items.length ? table : emptyTip;\n    }\n  }\n}\n\nclass Item extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      isOpIconShown: false,\n      highlight: false,\n      isRevokeAdminDialogOpen: false,\n    };\n  }\n\n  handleMouseEnter = () => {\n    if (!this.props.isItemFreezed) {\n      this.setState({\n        isOpIconShown: true,\n        highlight: true\n      });\n    }\n  }\n\n  handleMouseLeave = () => {\n    if (!this.props.isItemFreezed) {\n      this.setState({\n        isOpIconShown: false,\n        highlight: false\n      });\n    }\n  }\n\n  onUnfreezedItem = () => {\n    this.setState({\n      highlight: false,\n      isOpIconShow: false\n    });\n    this.props.onUnfreezedItem();\n  }\n\n  toggleRevokeAdminDialog = (e) => {\n    if (e) {\n      e.preventDefault();\n    }\n    this.setState({isRevokeAdminDialogOpen: !this.state.isRevokeAdminDialogOpen});\n  }\n\n  revokeAdmin = () => {\n    this.props.revokeAdmin(this.props.item);\n  }\n\n  onMenuItemClick = (operation) => {\n    switch (operation) {\n      case 'Revoke Admin':\n        this.toggleRevokeAdminDialog();\n        break;\n    }\n  }\n\n  translateOperations = (item) => {\n    let translateResult = '';\n    switch(item) {\n      case 'Revoke Admin':\n        translateResult = gettext('Revoke Admin');\n        break;\n    }\n    return translateResult;\n  }\n\n  render() {\n    const { item } = this.props;\n    const { isOpIconShown, isRevokeAdminDialogOpen } = this.state;\n\n    const itemName = '<span class=\"op-target\">' + Utils.HTMLescape(item.name) + '</span>';\n    const revokeAdminDialogMsg = gettext('Are you sure you want to revoke the admin permission of {placeholder} ?').replace('{placeholder}', itemName);\n\n    return (\n      <Fragment>\n        <tr className={this.state.highlight ? 'tr-highlight' : ''} onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave}>\n          <td>\n            <UserLink email={item.email} name={item.name} />\n          </td>\n          <td>\n            {item.is_active ? gettext('Active') : gettext('Inactive')}\n          </td>\n          <td>{`${Utils.bytesToSize(item.quota_usage)} / ${item.quota_total > 0 ? Utils.bytesToSize(item.quota_total) : '--'}`}</td>\n          <td>\n            {moment(item.create_time).format('YYYY-MM-DD HH:mm:ss')}{' / '}{item.last_login ? moment(item.last_login).fromNow() : '--'}\n          </td>\n          <td>\n            {isOpIconShown &&\n            <OpMenu\n              operations={['Revoke Admin']}\n              translateOperations={this.translateOperations}\n              onMenuItemClick={this.onMenuItemClick}\n              onFreezedItem={this.props.onFreezedItem}\n              onUnfreezedItem={this.onUnfreezedItem}\n            />\n            }\n          </td>\n        </tr>\n        {isRevokeAdminDialogOpen &&\n          <CommonOperationConfirmationDialog\n            title={gettext('Revoke Admin')}\n            message={revokeAdminDialogMsg}\n            executeOperation={this.revokeAdmin}\n            confirmBtnText={gettext('Revoke')}\n            toggleDialog={this.toggleRevokeAdminDialog}\n          />\n        }\n      </Fragment>\n    );\n  }\n}\n\nclass InstitutionAdmins extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      loading: true,\n      errorMsg: '',\n      institutionName: '',\n      userList: [],\n      isAddUserDialogOpen: false\n    };\n  }\n\n  componentDidMount () {\n    seafileAPI.sysAdminGetInstitution(this.props.institutionID).then((res) => {\n      this.setState({\n        institutionName: res.data.name\n      });\n    });\n    seafileAPI.sysAdminListInstitutionAdmins(this.props.institutionID).then((res) => {\n      this.setState({\n        loading: false,\n        userList: res.data.user_list,\n      });\n    }).catch((error) => {\n      this.setState({\n        loading: false,\n        errorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403\n      });\n    });\n  }\n\n  revokeAdmin = (item) => {\n    const email = item.email;\n    const name = item.name;\n    seafileAPI.sysAdminUpdateInstitutionUser(this.props.institutionID, email, false).then(res => {\n      let userList = this.state.userList.filter(user => {\n        return user.email != email;\n      });\n      this.setState({userList: userList});\n      toaster.success(gettext('Successfully revoked the admin permission of {placeholder}.').replace('{placeholder}', name));\n    }).catch((error) => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  deleteUser = (email) => {\n    seafileAPI.sysAdminDeleteInstitutionUser(this.props.institutionID, email).then(res => {\n      let newUserList = this.state.userList.filter(user => {\n        return user.email != email;\n      });\n      this.setState({userList: newUserList});\n      toaster.success('success');\n    }).catch((error) => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  render() {\n    const { institutionName } = this.state;\n    return (\n      <Fragment>\n        <MainPanelTopbar />\n        <div className=\"main-panel-center flex-row\">\n          <div className=\"cur-view-container\">\n            <InstitutionNav\n              currentItem=\"admins\"\n              institutionID={this.props.institutionID}\n              institutionName={institutionName}\n            />\n            <div className=\"cur-view-content\">\n              <Content\n                loading={this.state.loading}\n                errorMsg={this.state.errorMsg}\n                items={this.state.userList}\n                revokeAdmin={this.revokeAdmin}\n                deleteUser={this.deleteUser}\n              />\n            </div>\n          </div>\n        </div>\n      </Fragment>\n    );\n  }\n}\n\nexport default InstitutionAdmins;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Link } from '@reach/router';\nimport { siteRoot, gettext } from '../../../utils/constants';\n\nconst propTypes = {\n  currentItem: PropTypes.string.isRequired\n};\n\nclass Nav extends React.Component {\n\n  constructor(props) {\n    super(props);\n    this.navItems = [\n      {name: 'loginLogs', urlPart:'logs/login', text: gettext('Login')},\n      {name: 'fileAccessLogs', urlPart:'logs/file-access', text: gettext('File Access')},\n      {name: 'fileUpdateLogs', urlPart:'logs/file-update', text: gettext('File Update')},\n      {name: 'sharePermissionLogs', urlPart:'logs/share-permission', text: gettext('Permission')},\n    ];\n  }\n\n  render() {\n    const { currentItem } = this.props;\n    return (\n      <div className=\"cur-view-path tab-nav-container\">\n        <ul className=\"nav\">\n          {this.navItems.map((item, index) => {\n            return (\n              <li className=\"nav-item\" key={index}>\n                <Link to={`${siteRoot}sys/${item.urlPart}/`} className={`nav-link${currentItem == item.name ? ' active' : ''}`}>{item.text}</Link>\n              </li>\n            );\n          })}\n        </ul>\n      </div>\n    );\n  }\n}\n\nNav.propTypes = propTypes;\n\nexport default Nav;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Button, Modal, ModalHeader, ModalBody, ModalFooter, FormGroup, Label, Input, Alert } from 'reactstrap';\nimport { gettext, siteRoot } from '../../../utils/constants';\nimport moment from 'moment';\n\nclass LogsExportExcelDialog extends React.Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      loading: true,\n      startDateStr: '',\n      endDateStr: '',\n      errMsg: '',\n    };\n    this.newInput = React.createRef();\n  }\n\n  componentDidMount() {\n    this.newInput.focus();\n  }\n\n  downloadExcel = () => {\n    if (!this.isValidDateStr()) {\n      return;\n    }\n    let { startDateStr, endDateStr } = this.state;\n    let url = siteRoot;\n\n    switch (this.props.logType) {\n      case 'login':\n        url += 'sys/loginadmin/export-excel/';\n        break;\n      case 'fileAccess':\n        url += 'sys/log/fileaudit/export-excel/';\n        break;\n      case 'fileUpdate':\n        url += 'sys/log/fileupdate/export-excel/';\n        break;\n      case 'sharePermission':\n        url += 'sys/log/permaudit/export-excel/';\n        break;\n    }\n    location.href = url + '?start=' + startDateStr + '&end=' + endDateStr;\n    this.props.toggle();\n  }\n\n  isValidDateStr = () => {\n    let { startDateStr, endDateStr } = this.state;\n    if (moment(startDateStr, 'YYYY-MM-DD', true).isValid() &&\n      moment(endDateStr, 'YYYY-MM-DD', true).isValid() &&\n      moment(startDateStr).isBefore(endDateStr)\n    ) {\n      return true;\n    } else {\n      this.setState({\n        errMsg: gettext('Date Invalid.')\n      });\n      return false;\n    }\n  }\n\n  handleStartChange = (e) => {\n    const startDateStr = e.target.value.trim();\n    this.setState({\n      startDateStr: startDateStr,\n      errMsg: ''\n    });\n  }\n\n  handleEndChange = (e) => {\n    const endDateStr = e.target.value.trim();\n    this.setState({\n      endDateStr: endDateStr,\n      errMsg: '',\n    });\n  }\n\n  render() {\n    return (\n      <Modal isOpen={true} toggle={this.props.toggle}>\n        <ModalHeader toggle={this.props.toggle}>{gettext('Choose date')}</ModalHeader>\n        <ModalBody>\n          <FormGroup>\n            <Label>{gettext('Start date')}</Label>\n            <Input\n              value={this.state.startDateStr}\n              onChange={this.handleStartChange}\n              placeholder='yyyy-mm-dd'\n              innerRef={input => {this.newInput = input;}}\n            />\n          </FormGroup>\n          <FormGroup>\n            <Label>{gettext('End date')}</Label>\n            <Input\n              value={this.state.endDateStr}\n              onChange={this.handleEndChange}\n              placeholder='yyyy-mm-dd'\n            />\n          </FormGroup>\n          {this.state.errMsg &&\n            <Alert className=\"mt-2\" color=\"danger\">\n              {gettext(this.state.errMsg)}\n            </Alert>\n          }\n        </ModalBody>\n        <ModalFooter>\n          <Button color=\"secondary\" onClick={this.props.toggle}>{gettext('Cancel')}</Button>\n          <Button color=\"primary\" onClick={this.downloadExcel}>{gettext('Submit')}</Button>\n        </ModalFooter>\n      </Modal>\n    );\n  }\n}\n\nconst propTypes = {\n  toggle: PropTypes.func.isRequired,\n  logType: PropTypes.string.isRequired,\n};\n\nLogsExportExcelDialog.propTypes = propTypes;\n\nexport default LogsExportExcelDialog;\n","import React, { Component, Fragment } from 'react';\nimport { seafileAPI } from '../../../utils/seafile-api';\nimport { gettext, siteRoot } from '../../../utils/constants';\nimport { Utils } from '../../../utils/utils';\nimport { Button } from 'reactstrap';\nimport EmptyTip from '../../../components/empty-tip';\nimport moment from 'moment';\nimport Loading from '../../../components/loading';\nimport Paginator from '../../../components/paginator';\nimport LogsNav from './logs-nav';\nimport MainPanelTopbar from '../main-panel-topbar';\nimport UserLink from '../user-link';\nimport LogsExportExcelDialog from '../../../components/dialog/sysadmin-dialog/sysadmin-logs-export-excel-dialog';\nimport ModalPortal from '../../../components/modal-portal';\n\n\nclass Content extends Component {\n\n  constructor(props) {\n    super(props);\n  }\n\n  getPreviousPage = () => {\n    this.props.getLogsByPage(this.props.currentPage - 1);\n  }\n\n  getNextPage = () => {\n    this.props.getLogsByPage(this.props.currentPage + 1);\n  }\n\n  render() {\n    const { loading, errorMsg, items, perPage, currentPage, hasNextPage } = this.props;\n    if (loading) {\n      return <Loading />;\n    } else if (errorMsg) {\n      return <p className=\"error text-center\">{errorMsg}</p>;\n    } else {\n      const emptyTip = (\n        <EmptyTip>\n          <h2>{gettext('No login logs')}</h2>\n        </EmptyTip>\n      );\n      const table = (\n        <Fragment>\n          <table className=\"table-hover\">\n            <thead>\n              <tr>\n                <th width=\"25%\">{gettext('Name')}</th>\n                <th width=\"25%\">{gettext('IP')}</th>\n                <th width=\"25%\">{gettext('Status')}</th>\n                <th width=\"25%\">{gettext('Time')}</th>\n              </tr>\n            </thead>\n            {items &&\n              <tbody>\n                {items.map((item, index) => {\n                  return (<Item\n                    key={index}\n                    item={item}\n                  />);\n                })}\n              </tbody>\n            }\n          </table>\n          <Paginator\n            gotoPreviousPage={this.getPreviousPage}\n            gotoNextPage={this.getNextPage}\n            currentPage={currentPage}\n            hasNextPage={hasNextPage}\n            curPerPage={perPage}\n            resetPerPage={this.props.resetPerPage}\n          />\n        </Fragment>\n      );\n      return items.length ? table : emptyTip;\n    }\n  }\n}\n\nclass Item extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      isOpIconShown: false,\n    };\n  }\n\n  handleMouseOver = () => {\n    this.setState({\n      isOpIconShown: true\n    });\n  }\n\n  handleMouseOut = () => {\n    this.setState({\n      isOpIconShown: false\n    });\n  }\n\n  render() {\n    let { item } = this.props;\n    return (\n      <tr onMouseOver={this.handleMouseOver} onMouseOut={this.handleMouseOut}>\n        <td><UserLink email={item.email} name={item.name} /></td>\n        <td>{item.login_ip}</td>\n        <td>{item.log_success ? gettext('Success') : gettext('Failed')}</td>\n        <td>{moment(item.login_time).fromNow()}</td>\n      </tr>\n    );\n  }\n}\n\nclass LoginLogs extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      loading: true,\n      errorMsg: '',\n      logList: [],\n      perPage: 25,\n      currentPage: 1,\n      hasNextPage: false,\n      isExportExcelDialogOpen: false,\n    };\n    this.initPage = 1;\n  }\n\n  toggleExportExcelDialog = () => {\n    this.setState({isExportExcelDialogOpen: !this.state.isExportExcelDialogOpen});\n  }\n\n  componentDidMount () {\n    let urlParams = (new URL(window.location)).searchParams;\n    const { currentPage, perPage } = this.state;\n    this.setState({\n      perPage: parseInt(urlParams.get('per_page') || perPage),\n      currentPage: parseInt(urlParams.get('page') || currentPage)\n    }, () => {\n      this.getLogsByPage(this.state.currentPage);\n    });\n  }\n\n  getLogsByPage = (page) => {\n    let { perPage } = this.state;\n    seafileAPI.sysAdminListLoginLogs(page, perPage).then((res) => {\n      this.setState({\n        logList: res.data.login_log_list,\n        loading: false,\n        currentPage: page,\n        hasNextPage: Utils.hasNextPage(page, perPage, res.data.total_count),\n      });\n    }).catch((error) => {\n      this.setState({\n        loading: false,\n        errorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403\n      });\n    });\n  }\n\n  resetPerPage = (newPerPage) => {\n    this.setState({\n      perPage: newPerPage,\n    }, () => this.getLogsByPage(this.initPage));\n  }\n\n  render() {\n    let { logList, currentPage, perPage, hasNextPage, isExportExcelDialogOpen } = this.state;\n    return (\n      <Fragment>\n        <MainPanelTopbar>\n          <Button className=\"btn btn-secondary operation-item\" onClick={this.toggleExportExcelDialog}>{gettext('Export Excel')}</Button>\n        </MainPanelTopbar>\n        <div className=\"main-panel-center flex-row\">\n          <div className=\"cur-view-container\">\n            <LogsNav currentItem=\"loginLogs\" />\n            <div className=\"cur-view-content\">\n              <Content\n                loading={this.state.loading}\n                errorMsg={this.state.errorMsg}\n                items={logList}\n                currentPage={currentPage}\n                perPage={perPage}\n                hasNextPage={hasNextPage}\n                getLogsByPage={this.getLogsByPage}\n                resetPerPage={this.resetPerPage}\n              />\n            </div>\n          </div>\n        </div>\n        {isExportExcelDialogOpen &&\n        <ModalPortal>\n          <LogsExportExcelDialog\n            logType={'login'}\n            toggle={this.toggleExportExcelDialog}\n          />\n        </ModalPortal>\n        }\n      </Fragment>\n    );\n  }\n}\n\nexport default LoginLogs;\n","import React from 'react';\nimport { gettext } from '../../../utils/constants';\nimport { Dropdown, DropdownMenu, DropdownToggle, DropdownItem } from 'reactstrap';\n\nclass FilterMenu extends React.Component {\n\n  constructor(props) {\n    super(props);\n    this.state = { \n      isMenuShown: false\n    };  \n  }\n\n  toggleMenu = () => {\n    this.setState({\n      isMenuShown: !this.state.isMenuShown\n    }, () => {\n      this.props.toggleFreezeItem(this.state.isMenuShown);\n    });\n  }\n\n  onItemClick = () => {\n    this.props.filterItems();\n    this.props.toggleFreezeItem(false);\n  }\n\n  render() {\n    const { filterBy } = this.props;\n    return (\n      <Dropdown isOpen={this.state.isMenuShown} toggle={this.toggleMenu}>\n        <DropdownToggle\n          tag=\"i\"\n          className=\"sf-dropdown-toggle sf2-icon-caret-down\"\n          title={gettext('More Operations')}\n          data-toggle=\"dropdown\"\n          aria-expanded={this.state.isMenuShown}\n        />\n        <DropdownMenu>\n          <DropdownItem onClick={this.onItemClick}>{gettext('only show {placeholder}').replace('{placeholder}', filterBy)}</DropdownItem>\n        </DropdownMenu>\n      </Dropdown>\n    );\n  }\n}\n\nexport default FilterMenu;\n","import React from 'react';\nimport { Button } from 'reactstrap';\n\nclass ToggleFilter extends React.Component {\n\n  constructor(props) {\n    super(props);\n  }\n\n  render() {\n    const { filterBy } = this.props;\n    return (\n      <Button\n        color='secondary'\n        className=\"my-2 mr-2\"\n        onClick={this.props.toggleFilter}\n      >   \n        <span className=\"text-primary\">{filterBy}</span>\n        <span className=\"ml-2 close\" style={{fontSize: '1.2rem'}}>x</span>\n      </Button>\n    );\n\n  }\n\n}\n\nexport default ToggleFilter;\n","import React, { Component, Fragment } from 'react';\nimport { seafileAPI } from '../../../utils/seafile-api';\nimport { gettext } from '../../../utils/constants';\nimport { Utils } from '../../../utils/utils';\nimport EmptyTip from '../../../components/empty-tip';\nimport { Button } from 'reactstrap';\nimport { navigate } from '@reach/router';\nimport moment from 'moment';\nimport Loading from '../../../components/loading';\nimport Paginator from '../../../components/paginator';\nimport LogsExportExcelDialog from '../../../components/dialog/sysadmin-dialog/sysadmin-logs-export-excel-dialog';\nimport ModalPortal from '../../../components/modal-portal';\nimport LogsNav from './logs-nav';\nimport FilterMenu from './file-access-item-menu';\nimport ToggleFilter from './file-access-toggle-filter';\nimport MainPanelTopbar from '../main-panel-topbar';\nimport UserLink from '../user-link';\n\n\nclass Content extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      isItemFreezed: false\n    };\n  }\n\n  getPreviousPage = () => {\n    this.props.getLogsByPage(this.props.currentPage - 1);\n  }\n\n  getNextPage = () => {\n    this.props.getLogsByPage(this.props.currentPage + 1);\n  }\n\n  toggleFilterByUser = () => {\n    this.props.filterByUser(null);\n  }\n\n  toggleFilterByRepo = () => {\n    this.props.filterByRepo(null);\n  }\n\n  toggleFreezeItem = (freezed) => {\n    this.setState({\n      isItemFreezed: freezed\n    });\n  }\n\n  render() {\n    const {\n      loading, errorMsg, items, \n      userFilteredBy, repoFilteredBy,\n      perPage, currentPage, hasNextPage\n    } = this.props;\n    if (loading) {\n      return <Loading />;\n    } else if (errorMsg) {\n      return <p className=\"error text-center\">{errorMsg}</p>;\n    } else {\n      const emptyTip = (\n        <EmptyTip>\n          <h2>{gettext('No file access logs')}</h2>\n        </EmptyTip>\n      );\n      const table = (\n        <Fragment>\n          <div>\n            {userFilteredBy && (\n              <ToggleFilter\n                filterBy={items[0].name}\n                toggleFilter={this.toggleFilterByUser}\n              />\n            )}\n            {repoFilteredBy && (\n              <ToggleFilter\n                filterBy={items[0].repo_name}\n                toggleFilter={this.toggleFilterByRepo}\n              />\n            )}\n          </div>\n          <table>\n            <thead>\n              <tr>\n                <th width=\"20%\">{gettext('Name')}</th>\n                <th width=\"10%\">{gettext('Type')}</th>\n                <th width=\"20%\">{gettext('IP')}{' / '}{gettext('Device')}</th>\n                <th width=\"20%\">{gettext('Date')}</th>\n                <th width=\"15%\">{gettext('Library')}</th>\n                <th width=\"15%\">{gettext('File')}{' / '}{gettext('Folder')}</th>\n              </tr>\n            </thead>\n            {items &&\n              <tbody>\n                {items.map((item, index) => {\n                  return (<Item\n                    key={index}\n                    item={item}\n                    isFreezed={this.state.isItemFreezed}\n                    toggleFreezeItem={this.toggleFreezeItem}\n                    userFilteredBy={userFilteredBy}\n                    repoFilteredBy={repoFilteredBy}\n                    filterByUser={this.props.filterByUser}\n                    filterByRepo={this.props.filterByRepo}\n                  />);\n                })}\n              </tbody>\n            }\n          </table>\n          <Paginator\n            gotoPreviousPage={this.getPreviousPage}\n            gotoNextPage={this.getNextPage}\n            currentPage={currentPage}\n            hasNextPage={hasNextPage}\n            curPerPage={perPage}\n            resetPerPage={this.props.resetPerPage}\n          />\n        </Fragment>\n      );\n      return items.length ? table : emptyTip;\n    }\n  }\n}\n\nclass Item extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      isHighlighted: false,\n      isOpIconShown: false\n    };\n  }\n\n  handleMouseEnter = () => {\n    if (!this.props.isFreezed) {\n      this.setState({\n        isHighlighted: true,\n        isOpIconShown: true\n      });\n    }\n  }\n\n  handleMouseLeave = () => {\n    if (!this.props.isFreezed) {\n      this.setState({\n        isHighlighted: false,\n        isOpIconShown: false\n      });\n    }\n  }\n\n  filterByUser = () => {\n    const { item } = this.props;\n    this.props.filterByUser(item.email);\n  }\n\n  filterByRepo = () => {\n    const { item } = this.props;\n    this.props.filterByRepo(item.repo_id);\n  }\n\n  toggleFreezeItem = (freezed) => {\n    this.props.toggleFreezeItem(freezed);\n    if (!freezed) {\n      this.setState({\n        isHighlighted: false,\n        isOpIconShown: false\n      });\n    }\n  }\n\n  render() {\n    const { isHighlighted, isOpIconShown } = this.state;\n    const { item, userFilteredBy, repoFilteredBy } = this.props;\n    return (\n      <tr className={isHighlighted ? 'tr-highlight' : ''} onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave}>\n        <td>\n          <UserLink email={item.email} name={item.name} />\n          {isOpIconShown && !userFilteredBy && (\n            <FilterMenu\n              filterBy={item.name}\n              filterItems={this.filterByUser}\n              toggleFreezeItem={this.toggleFreezeItem}\n            />\n          )}\n        </td>\n        <td>{item.event_type}</td>\n        <td>{item.ip}{' / '}{item.device || '--'}</td>\n        <td>{moment(item.time).fromNow()}</td>\n        <td>\n          {item.repo_name ? item.repo_name : gettext('Deleted')}\n          {isOpIconShown && item.repo_name && !repoFilteredBy && (\n            <FilterMenu\n              filterBy={item.repo_name}\n              filterItems={this.filterByRepo}\n              toggleFreezeItem={this.toggleFreezeItem}\n            />\n          )}\n        </td>\n        <td>{item.file_or_dir_name}</td>\n      </tr>\n    );\n  }\n}\n\nclass FileAccessLogs extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      loading: true,\n      errorMsg: '',\n      logList: [],\n      perPage: 25,\n      currentPage: 1,\n      hasNextPage: false,\n      isExportExcelDialogOpen: false,\n    };\n    this.initPage = 1;\n  }\n\n  toggleExportExcelDialog = () => {\n    this.setState({isExportExcelDialogOpen: !this.state.isExportExcelDialogOpen});\n  }\n\n  componentDidMount () {\n    let urlParams = (new URL(window.location)).searchParams;\n    const { currentPage, perPage } = this.state;\n    this.setState({\n      perPage: parseInt(urlParams.get('per_page') || perPage),\n      currentPage: parseInt(urlParams.get('page') || currentPage),\n      userFilteredBy: urlParams.get('email'),\n      repoFilteredBy: urlParams.get('repo_id')\n    }, () => {\n      this.getLogsByPage(this.state.currentPage);\n    });\n  }\n\n  getLogsByPage = (page) => {\n    const { perPage, userFilteredBy, repoFilteredBy } = this.state;\n    seafileAPI.sysAdminListFileAccessLogs(page, perPage, userFilteredBy, repoFilteredBy).then((res) => {\n      this.setState({\n        logList: res.data.file_access_log_list,\n        loading: false,\n        currentPage: page,\n        hasNextPage: res.data.has_next_page,\n      });\n    }).catch((error) => {\n      this.setState({\n        loading: false,\n        errorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403\n      });\n    });\n  }\n\n  resetPerPage = (newPerPage) => {\n    this.setState({\n      perPage: newPerPage,\n    }, () => this.getLogsByPage(this.initPage));\n  }\n\n  updateURL = (obj) => {\n    let url = new URL(location.href);\n    let searchParams = new URLSearchParams(url.search);\n    for (let key in obj) {\n      obj[key] == null ? \n        searchParams.delete(key) :\n        searchParams.set(key, obj[key]);\n    }\n    url.search = searchParams.toString();\n    navigate(url.toString());\n  }\n\n  filterByUser = (email) => {\n    this.setState({\n      userFilteredBy: email \n    }, () => {\n      this.getLogsByPage(this.initPage);\n      this.updateURL({'email': email});\n    });\n  }\n\n  filterByRepo = (repoID) => {\n    this.setState({\n      repoFilteredBy: repoID \n    }, () => {\n      this.getLogsByPage(this.initPage);\n      this.updateURL({'repo_id': repoID});\n    });\n  } \n\n  render() {\n    const {\n      logList,\n      userFilteredBy, repoFilteredBy, \n      currentPage, perPage, hasNextPage,\n      isExportExcelDialogOpen\n    } = this.state;\n    return (\n      <Fragment>\n        <MainPanelTopbar>\n          <Button className=\"btn btn-secondary operation-item\" onClick={this.toggleExportExcelDialog}>{gettext('Export Excel')}</Button>\n        </MainPanelTopbar>\n        <div className=\"main-panel-center flex-row\">\n          <div className=\"cur-view-container\">\n            <LogsNav currentItem=\"fileAccessLogs\" />\n            <div className=\"cur-view-content\">\n              <Content\n                loading={this.state.loading}\n                errorMsg={this.state.errorMsg}\n                items={logList}\n                userFilteredBy={userFilteredBy}\n                repoFilteredBy={repoFilteredBy}\n                filterByUser={this.filterByUser}\n                filterByRepo={this.filterByRepo}\n                currentPage={currentPage}\n                perPage={perPage}\n                hasNextPage={hasNextPage}\n                getLogsByPage={this.getLogsByPage}\n                resetPerPage={this.resetPerPage}\n              />\n            </div>\n          </div>\n        </div>\n        {isExportExcelDialogOpen &&\n        <ModalPortal>\n          <LogsExportExcelDialog\n            logType={'fileAccess'}\n            toggle={this.toggleExportExcelDialog}\n          />\n        </ModalPortal>\n        }\n      </Fragment>\n    );\n  }\n}\n\nexport default FileAccessLogs;\n","import React, { Component, Fragment } from 'react';\nimport { seafileAPI } from '../../../utils/seafile-api';\nimport { gettext, siteRoot } from '../../../utils/constants';\nimport { Utils } from '../../../utils/utils';\nimport EmptyTip from '../../../components/empty-tip';\nimport moment from 'moment';\nimport Loading from '../../../components/loading';\nimport Paginator from '../../../components/paginator';\nimport LogsNav from './logs-nav';\nimport { Button } from 'reactstrap';\nimport MainPanelTopbar from '../main-panel-topbar';\nimport UserLink from '../user-link';\nimport ModalPortal from '../../../components/modal-portal';\nimport CommitDetails from '../../../components/dialog/commit-details';\nimport LogsExportExcelDialog from '../../../components/dialog/sysadmin-dialog/sysadmin-logs-export-excel-dialog';\n\nclass Content extends Component {\n\n  constructor(props) {\n    super(props);\n  }\n\n  getPreviousPage = () => {\n    this.props.getLogsByPage(this.props.currentPage - 1);\n  }\n\n  getNextPage = () => {\n    this.props.getLogsByPage(this.props.currentPage + 1);\n  }\n\n  render() {\n    const { loading, errorMsg, items, perPage, currentPage, hasNextPage } = this.props;\n    if (loading) {\n      return <Loading />;\n    } else if (errorMsg) {\n      return <p className=\"error text-center\">{errorMsg}</p>;\n    } else {\n      const emptyTip = (\n        <EmptyTip>\n          <h2>{gettext('No file update logs')}</h2>\n        </EmptyTip>\n      );\n      const table = (\n        <Fragment>\n          <table className=\"table-hover\">\n            <thead>\n              <tr>\n                <th width=\"25%\">{gettext('Name')}</th>\n                <th width=\"25%\">{gettext('Date')}</th>\n                <th width=\"25%\">{gettext('Library')}</th>\n                <th width=\"25%\">{gettext('Action')}</th>\n              </tr>\n            </thead>\n            {items &&\n              <tbody>\n                {items.map((item, index) => {\n                  return (<Item\n                    key={index}\n                    item={item}\n                  />);\n                })}\n              </tbody>\n            }\n          </table>\n          <Paginator\n            gotoPreviousPage={this.getPreviousPage}\n            gotoNextPage={this.getNextPage}\n            currentPage={currentPage}\n            hasNextPage={hasNextPage}\n            curPerPage={perPage}\n            resetPerPage={this.props.resetPerPage}\n          />\n        </Fragment>\n      );\n      return items.length ? table : emptyTip;\n    }\n  }\n}\n\nclass Item extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      isOpIconShown: false,\n      isCommitDetailsDialogOpen: false,\n    };\n  }\n\n  handleMouseOver = () => {\n    this.setState({\n      isOpIconShown: true\n    });\n  }\n\n  handleMouseOut = () => {\n    this.setState({\n      isOpIconShown: false\n    });\n  }\n\n\n  toggleCommitDetailsDialog = () => {\n    this.setState({\n      isCommitDetailsDialogOpen: !this.state.isCommitDetailsDialogOpen\n    });\n  }\n\n  showCommitDetails = (e) => {\n    e.preventDefault();\n    this.setState({\n      isCommitDetailsDialogOpen: !this.state.isCommitDetailsDialogOpen\n    });\n  }\n\n  render() {\n    let { item } = this.props;\n    return (\n      <Fragment>\n        <tr onMouseOver={this.handleMouseOver} onMouseOut={this.handleMouseOut}>\n          <td><UserLink email={item.email} name={item.name} /></td>\n          <td>{moment(item.time).fromNow()}</td>\n          <td>{item.repo_name ? item.repo_name : gettext('Deleted')}</td>\n          <td>\n            {item.file_operation}\n            {item.repo_name && !item.repo_encrypted &&\n              <a className=\"ml-1\" href=\"#\" onClick={this.showCommitDetails}>{gettext('Details')}</a>\n            }\n          </td>\n        </tr>\n        {this.state.isCommitDetailsDialogOpen &&\n          <ModalPortal>\n            <CommitDetails\n              repoID={item.repo_id}\n              commitID={item.commit_id}\n              commitTime={item.time}\n              toggleDialog={this.toggleCommitDetailsDialog}\n            />\n          </ModalPortal>\n        }\n      </Fragment>\n    );\n  }\n}\n\nclass FileUpdateLogs extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      loading: true,\n      errorMsg: '',\n      logList: [],\n      perPage: 25,\n      currentPage: 1,\n      hasNextPage: false,\n      isExportExcelDialogOpen: false,\n    };\n    this.initPage = 1;\n  }\n\n  toggleExportExcelDialog = () => {\n    this.setState({isExportExcelDialogOpen: !this.state.isExportExcelDialogOpen});\n  }\n\n  componentDidMount () {\n    let urlParams = (new URL(window.location)).searchParams;\n    const { currentPage, perPage } = this.state;\n    this.setState({\n      perPage: parseInt(urlParams.get('per_page') || perPage),\n      currentPage: parseInt(urlParams.get('page') || currentPage)\n    }, () => {\n      this.getLogsByPage(this.state.currentPage);\n    });\n  }\n\n  getLogsByPage = (page) => {\n    let { perPage } = this.state;\n    seafileAPI.sysAdminListFileUpdateLogs(page, perPage).then((res) => {\n      this.setState({\n        logList: res.data.file_update_log_list,\n        loading: false,\n        currentPage: page,\n        hasNextPage: res.data.has_next_page,\n      });\n    }).catch((error) => {\n      this.setState({\n        loading: false,\n        errorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403\n      });\n    });\n  }\n\n  resetPerPage = (newPerPage) => {\n    this.setState({\n      perPage: newPerPage,\n    }, () => this.getLogsByPage(this.initPage));\n  }\n\n  render() {\n    let { logList, currentPage, perPage, hasNextPage, isExportExcelDialogOpen } = this.state;\n    return (\n      <Fragment>\n        <MainPanelTopbar>\n          <Button className=\"btn btn-secondary operation-item\" onClick={this.toggleExportExcelDialog}>{gettext('Export Excel')}</Button>\n        </MainPanelTopbar>\n        <div className=\"main-panel-center flex-row\">\n          <div className=\"cur-view-container\">\n            <LogsNav currentItem=\"fileUpdateLogs\" />\n            <div className=\"cur-view-content\">\n              <Content\n                loading={this.state.loading}\n                errorMsg={this.state.errorMsg}\n                items={logList}\n                currentPage={currentPage}\n                perPage={perPage}\n                hasNextPage={hasNextPage}\n                getLogsByPage={this.getLogsByPage}\n                resetPerPage={this.resetPerPage}\n              />\n            </div>\n          </div>\n        </div>\n        {isExportExcelDialogOpen &&\n        <ModalPortal>\n          <LogsExportExcelDialog\n            logType={'fileUpdate'}\n            toggle={this.toggleExportExcelDialog}\n          />\n        </ModalPortal>\n        }\n      </Fragment>\n    );\n  }\n}\n\nexport default FileUpdateLogs;\n","import React, { Component, Fragment } from 'react';\nimport { Link } from '@reach/router';\nimport moment from 'moment';\nimport { Button } from 'reactstrap';\nimport { seafileAPI } from '../../../utils/seafile-api';\nimport { gettext, siteRoot } from '../../../utils/constants';\nimport { Utils } from '../../../utils/utils';\nimport LogsExportExcelDialog from '../../../components/dialog/sysadmin-dialog/sysadmin-logs-export-excel-dialog';\nimport ModalPortal from '../../../components/modal-portal';\nimport EmptyTip from '../../../components/empty-tip';\nimport Loading from '../../../components/loading';\nimport Paginator from '../../../components/paginator';\nimport MainPanelTopbar from '../main-panel-topbar';\nimport UserLink from '../user-link';\nimport LogsNav from './logs-nav';\n\nclass Content extends Component {\n\n  constructor(props) {\n    super(props);\n  }\n\n  getPreviousPage = () => {\n    this.props.getLogsByPage(this.props.currentPage - 1);\n  }\n\n  getNextPage = () => {\n    this.props.getLogsByPage(this.props.currentPage + 1);\n  }\n\n  render() {\n    const { loading, errorMsg, items, perPage, currentPage, hasNextPage } = this.props;\n    if (loading) {\n      return <Loading />;\n    } else if (errorMsg) {\n      return <p className=\"error text-center\">{errorMsg}</p>;\n    } else {\n      const emptyTip = (\n        <EmptyTip>\n          <h2>{gettext('No permission logs')}</h2>\n        </EmptyTip>\n      );\n      const table = (\n        <Fragment>\n          <table className=\"table-hover\">\n            <thead>\n              <tr>\n                <th width=\"15%\">{gettext('Share From')}</th>\n                <th width=\"15%\">{gettext('Share To')}</th>\n                <th width=\"10%\">{gettext('Actions')}</th>\n                <th width=\"13%\">{gettext('Permission')}</th>\n                <th width=\"20%\">{gettext('Library')}</th>\n                <th width=\"12%\">{gettext('Folder')}</th>\n                <th width=\"15%\">{gettext('Date')}</th>\n              </tr>\n            </thead>\n            {items &&\n              <tbody>\n                {items.map((item, index) => {\n                  return (<Item\n                    key={index}\n                    item={item}\n                  />);\n                })}\n              </tbody>\n            }\n          </table>\n          <Paginator\n            gotoPreviousPage={this.getPreviousPage}\n            gotoNextPage={this.getNextPage}\n            currentPage={currentPage}\n            hasNextPage={hasNextPage}\n            curPerPage={perPage}\n            resetPerPage={this.props.resetPerPage}\n          />\n        </Fragment>\n      );\n      return items.length ? table : emptyTip;\n    }\n  }\n}\n\nclass Item extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      isOpIconShown: false,\n    };\n  }\n\n  handleMouseOver = () => {\n    this.setState({\n      isOpIconShown: true\n    });\n  }\n\n  handleMouseOut = () => {\n    this.setState({\n      isOpIconShown: false\n    });\n  }\n\n  getActionTextByEType = (etype) => {\n    if (etype.indexOf('add') != -1) {\n      return gettext('Add');\n    } else if (etype.indexOf('modify') != -1) {\n      return gettext('Modify');\n    } else if (etype.indexOf('delete') != -1) {\n      return gettext('Delete');\n    } else {\n      return '';\n    }\n  }\n\n  getShareTo = (item) => {\n    switch(item.share_type) {\n      case 'user':\n        return <UserLink email={item.to_user_email} name={item.to_user_name} />;\n      case 'group':\n        return <Link to={`${siteRoot}sys/groups/${item.to_group_id}/libraries/`}>{item.to_group_name}</Link>;\n      case 'department':\n        return <Link to={`${siteRoot}sys/departments/${item.to_group_id}/`}>{item.to_group_name}</Link>;\n      case 'all':\n        return <Link to={`${siteRoot}org/`}>{gettext('All')}</Link>;\n      default:\n        return gettext('Deleted');\n    }\n  }\n\n  render() {\n    let { item } = this.props;\n    return (\n      <tr onMouseOver={this.handleMouseOver} onMouseOut={this.handleMouseOut}>\n        <td><UserLink email={item.from_user_email} name={item.from_user_name} /></td>\n        <td>{this.getShareTo(item)}</td>\n        <td>{this.getActionTextByEType(item.etype)}</td>\n        <td>{Utils.sharePerms(item.permission)}</td>\n        <td>{item.repo_name ? item.repo_name : gettext('Deleted')}</td>\n        <td>{item.folder}</td>\n        <td>{moment(item.date).fromNow()}</td>\n      </tr>\n    );\n  }\n}\n\nclass SharePermissionLogs extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      loading: true,\n      errorMsg: '',\n      logList: [],\n      perPage: 25,\n      currentPage: 1,\n      hasNextPage: false,\n      isExportExcelDialogOpen: false,\n    };\n    this.initPage = 1;\n  }\n\n  toggleExportExcelDialog = () => {\n    this.setState({isExportExcelDialogOpen: !this.state.isExportExcelDialogOpen});\n  }\n\n  componentDidMount () {\n    let urlParams = (new URL(window.location)).searchParams;\n    const { currentPage, perPage } = this.state;\n    this.setState({\n      perPage: parseInt(urlParams.get('per_page') || perPage),\n      currentPage: parseInt(urlParams.get('page') || currentPage)\n    }, () => {\n      this.getLogsByPage(this.state.currentPage);\n    });\n  }\n\n  getLogsByPage = (page) => {\n    let { perPage } = this.state;\n    seafileAPI.sysAdminListSharePermissionLogs(page, perPage).then((res) => {\n      this.setState({\n        logList: res.data.share_permission_log_list,\n        loading: false,\n        currentPage: page,\n        hasNextPage: res.data.has_next_page,\n      });\n    }).catch((error) => {\n      this.setState({\n        loading: false,\n        errorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403\n      });\n    });\n  }\n\n  resetPerPage = (newPerPage) => {\n    this.setState({\n      perPage: newPerPage,\n    }, () => this.getLogsByPage(this.initPage));\n  }\n\n  render() {\n    let { logList, currentPage, perPage, hasNextPage, isExportExcelDialogOpen } = this.state;\n    return (\n      <Fragment>\n        <MainPanelTopbar>\n          <Button className=\"btn btn-secondary operation-item\" onClick={this.toggleExportExcelDialog}>{gettext('Export Excel')}</Button>\n        </MainPanelTopbar>\n        <div className=\"main-panel-center flex-row\">\n          <div className=\"cur-view-container\">\n            <LogsNav currentItem=\"sharePermissionLogs\" />\n            <div className=\"cur-view-content\">\n              <Content\n                loading={this.state.loading}\n                errorMsg={this.state.errorMsg}\n                items={logList}\n                currentPage={currentPage}\n                perPage={perPage}\n                hasNextPage={hasNextPage}\n                getLogsByPage={this.getLogsByPage}\n                resetPerPage={this.resetPerPage}\n              />\n            </div>\n          </div>\n        </div>\n        {isExportExcelDialogOpen &&\n        <ModalPortal>\n          <LogsExportExcelDialog\n            logType={'sharePermission'}\n            toggle={this.toggleExportExcelDialog}\n          />\n        </ModalPortal>\n        }\n      </Fragment>\n    );\n  }\n}\n\nexport default SharePermissionLogs;\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\n\nconst propTypes = {\n  headingText: PropTypes.string.isRequired,\n  children: PropTypes.object.isRequired\n};\n\nclass Section extends Component {\n\n  constructor(props) {\n    super(props);\n  }\n\n  render() {\n    const { headingText, children} = this.props;\n    return (\n      <div className=\"mb-4\">\n        <h4 className=\"border-bottom font-weight-normal mb-2 pb-1\">{headingText}</h4>\n        {children}\n      </div>\n    );\n  }\n}\n\nSection.propTypes = propTypes;\n\nexport default Section;\n","import React, { Component, Fragment } from 'react';\nimport PropTypes from 'prop-types';\nimport { Row, Col, Label } from 'reactstrap';\n\nconst propTypes = {\n  displayName: PropTypes.string.isRequired,\n  helpTip: PropTypes.string,\n  mainContent: PropTypes.object.isRequired,\n  extraContent: PropTypes.object\n};\n\nclass SettingItemBase extends Component {\n\n  constructor(props) {\n    super(props);\n  }\n\n  render() {\n    const { helpTip, displayName, mainContent, extraContent } = this.props;\n    return (\n      <Fragment>\n        <Row className=\"my-4\">\n          <Col md=\"3\">\n            <Label className=\"web-setting-label\">{displayName}</Label>\n          </Col>\n          <Col md=\"5\">\n            {mainContent}\n            {helpTip && <p className=\"small text-secondary mt-1\">{helpTip}</p>}\n          </Col>\n          <Col md=\"4\">\n            {extraContent}\n          </Col>\n        </Row>\n      </Fragment>\n    );\n  }\n}\n\nSettingItemBase.propTypes = propTypes;\n\nexport default SettingItemBase;\n","import React, { Component, Fragment } from 'react';\nimport PropTypes from 'prop-types';\nimport { Input, Button } from 'reactstrap';\nimport { gettext } from '../../../utils/constants';\nimport SettingItemBase from './setting-item-base';\n\nconst propTypes = {\n  inputType: PropTypes.string,\n  saveSetting: PropTypes.func.isRequired,\n  keyText: PropTypes.string.isRequired,\n  value: PropTypes.oneOfType([PropTypes.string,PropTypes.number]),\n  helpTip: PropTypes.string.isRequired,\n  displayName: PropTypes.string.isRequired\n};\n\nclass WebSettingInput extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      isBtnsShown: false,\n      value: this.props.value\n    };\n  }\n\n  toggleBtns = () => {\n    this.setState({isBtnsShown: !this.state.isBtnsShown});\n  }\n\n  hideBtns = (e) => {\n    if (!this.state.isBtnsShown) {\n      return;\n    }\n    if (this.props.value != this.state.value) {\n      this.setState({value: this.props.value});\n    }\n    this.toggleBtns();\n  }\n\n  onInputChange = (e) => {\n    this.setState({ value: e.target.value });\n  }\n\n  onSubmit = (e) => {\n    const value = this.state.value.trim();\n    if (value != this.props.value) {\n      this.props.saveSetting(this.props.keyText, value);\n    }\n    this.toggleBtns();\n  }\n\n  render() {\n    const { isBtnsShown, value } = this.state;\n    const { helpTip, displayName, inputType } = this.props;\n    return (\n      <SettingItemBase\n        displayName={displayName}\n        helpTip={helpTip}\n        mainContent={\n          <Input type={inputType || 'text'} className={inputType == 'textarea' ? 'web-setting-textarea' : ''} onChange={this.onInputChange} onFocus={this.toggleBtns} onBlur={this.hideBtns} value={value} />\n        }\n        extraContent={\n          isBtnsShown ?\n            <Fragment>\n              <Button className=\"sf2-icon-tick web-setting-icon-btn web-setting-icon-btn-submit\" onMouseDown={this.onSubmit} title={gettext('Submit')}></Button>\n              <Button className=\"ml-1 sf2-icon-x2 web-setting-icon-btn web-setting-icon-btn-cancel\" title={gettext('Cancel')}></Button>\n            </Fragment> : null\n        }\n      />\n    );\n  }\n}\n\nWebSettingInput.propTypes = propTypes;\n\nexport default WebSettingInput;\n","import React, { Component, Fragment } from 'react';\nimport PropTypes from 'prop-types';\nimport { Button } from 'reactstrap';\nimport { gettext } from '../../../utils/constants';\nimport SettingItemBase from './setting-item-base';\n\nconst propTypes = {\n  postFile: PropTypes.func.isRequired,\n  keyText: PropTypes.string.isRequired,\n  filePath: PropTypes.string.isRequired,\n  helpTip: PropTypes.string.isRequired,\n  fileWidth: PropTypes.number.isRequired,\n  fileHeight: PropTypes.number.isRequired,\n  displayName: PropTypes.string.isRequired\n};\n\nclass WebSettingFile extends Component {\n\n  constructor(props) {\n    super(props);\n    this.fileInput = React.createRef();\n  }\n\n  uploadFile = () => {\n    if (!this.fileInput.current.files.length) {\n      return;\n    }\n    const file = this.fileInput.current.files[0];\n    this.props.postFile(file, this.props.keyText);\n  }\n\n  openFileInput = () => {\n    this.fileInput.current.click();\n  }\n\n  render() {\n    const { helpTip, filePath, fileWidth, fileHeight, displayName } = this.props;\n    return (\n      <SettingItemBase\n        displayName={displayName}\n        helpTip={helpTip}\n        mainContent={\n          <img src={filePath + '?t=' + new Date().getTime()} alt={displayName} width={fileWidth} height={fileHeight} className=\"mb-1\" />\n        }\n        extraContent={\n          <Fragment>\n            <Button color=\"secondary\" onClick={this.openFileInput}>{gettext('Change')}</Button>\n            <input className=\"d-none\" type=\"file\" onChange={this.uploadFile} ref={this.fileInput} />\n          </Fragment>\n        }\n      />\n    );\n  }\n}\n\nWebSettingFile.propTypes = propTypes;\n\nexport default WebSettingFile;\n","import React, { Component, Fragment } from 'react';\nimport PropTypes from 'prop-types';\nimport { Input } from 'reactstrap';\nimport SettingItemBase from './setting-item-base';\n\nconst propTypes = {\n  saveSetting: PropTypes.func.isRequired,\n  keyText: PropTypes.string.isRequired,\n  value: PropTypes.oneOfType([PropTypes.bool, PropTypes.number]),\n  helpTip: PropTypes.string.isRequired,\n  displayName: PropTypes.string.isRequired\n};\n\nclass WebSettingCheckbox extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      inputChecked: this.props.value\n    };\n  }\n\n  onInputChange = (e) => {\n    const checked = e.target.checked;\n    const valueToNum = checked ? 1 : 0;\n    this.setState({\n      inputChecked: checked\n    });\n    this.props.saveSetting(this.props.keyText, valueToNum);\n  }\n\n  render() {\n    const { inputChecked } = this.state;\n    const { helpTip, displayName } = this.props;\n    return (\n      <SettingItemBase\n        displayName={displayName}\n        mainContent={\n          <Fragment>\n            <Input className=\"ml-0\" checked={inputChecked} type='checkbox' onChange={this.onInputChange} />\n            <p className=\"ml-4\">{helpTip}</p>\n          </Fragment>\n        }\n      />\n    );\n  }\n}\n\nWebSettingCheckbox.propTypes = propTypes;\n\nexport default WebSettingCheckbox;\n","import React, { Component, Fragment } from 'react';\nimport { Utils } from '../../../utils/utils';\nimport { seafileAPI } from '../../../utils/seafile-api';\nimport { gettext, isPro, mediaUrl, logoPath, faviconPath, loginBGPath } from '../../../utils/constants';\nimport Loading from '../../../components/loading';\nimport toaster from '../../../components/toast';\nimport MainPanelTopbar from '../main-panel-topbar';\nimport Section from './section';\nimport InputItem from './input-item';\nimport FileItem from './file-item';\nimport CheckboxItem from './checkbox-item';\n\nimport '../../../css/system-admin-web-settings.css';\n\nclass WebSettings extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      loading: true,\n      errorMsg: '',\n      config_dict: null,\n      logoPath: mediaUrl + logoPath,\n      faviconPath: mediaUrl + faviconPath,\n      loginBGPath: mediaUrl + loginBGPath\n    };\n  }\n\n  componentDidMount () {\n    seafileAPI.sysAdminGetSysSettingInfo().then((res) => {\n      this.setState({\n        loading: false,\n        config_dict: res.data\n      });\n    }).catch((error) => {\n      this.setState({\n        loading: false,\n        errorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403\n      });\n    });\n  }\n\n  saveSetting = (key, value) => {\n    seafileAPI.sysAdminSetSysSettingInfo(key, value).then((res) => {\n      this.setState({\n        config_dict: res.data\n      });\n      toaster.success(gettext('Success'));\n    }).catch((error) => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  postFile = (file, fileType) => {\n    let postFile;\n    if (fileType == 'Logo') {\n      postFile = seafileAPI.sysAdminUpdateLogo(file);\n    } else if (fileType == 'Favicon') {\n      postFile = seafileAPI.sysAdminUpdateFavicon(file);\n    } else if (fileType == 'loginBGImage') {\n      postFile = seafileAPI.sysAdminUpdateLoginBG(file);\n    }\n    postFile.then((res) => {\n      if (fileType == 'Logo') {\n        this.setState({\n          logoPath: res.data.logo_path\n        });\n      } else if (fileType == 'Favicon') {\n        this.setState({\n          faviconPath: res.data.favicon_path\n        });\n      } else if (fileType == 'loginBGImage') {\n        this.setState({\n          loginBGPath: res.data.login_bg_image_path\n        });\n      }\n      toaster.success(gettext('Success'));\n    }).catch((error) => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  render() {\n    const { loading, errorMsg, config_dict, logoPath, faviconPath, loginBGPath } = this.state;\n    return (\n      <Fragment>\n        <MainPanelTopbar />\n        <div className=\"main-panel-center flex-row\">\n          <div className=\"cur-view-container\">\n            <div className=\"cur-view-path\">\n              <h3 className=\"sf-heading\">{gettext('Settings')}</h3>\n            </div>\n            <div className=\"cur-view-content container mw-100\">\n              {loading && <Loading />}\n              {errorMsg && <p className=\"error text-center mt-4\">{errorMsg}</p>}\n              {(!loading && !errorMsg) && config_dict &&\n              <Fragment>\n                <p className=\"small text-secondary my-4\">{gettext('Note: Settings via web interface are saved in database table (seahub-db/constance_config). They have a higher priority over the settings in config files.')}</p>\n\n                <Section headingText='URL'>\n                  <Fragment>\n                    <InputItem\n                      saveSetting={this.saveSetting}\n                      displayName='SERVICE_URL'\n                      keyText='SERVICE_URL'\n                      value={config_dict['SERVICE_URL']}\n                      helpTip={gettext('The URL of the server, like https://seafile.example.com or http://192.168.1.2:8000')}\n                    />\n                    <InputItem\n                      saveSetting={this.saveSetting}\n                      displayName='FILE_SERVER_ROOT'\n                      keyText='FILE_SERVER_ROOT'\n                      value={config_dict['FILE_SERVER_ROOT']}\n                      helpTip={gettext('The internal URL for downloading/uploading files. Users will not be able to download/upload files if this is not set correctly. If you config Seafile behind Nginx/Apache, it should be SERVICE_URL/seafhttp, like https://seafile.example.com/seafhttp .')}\n                    />\n                  </Fragment>\n                </Section>\n\n                <Section headingText={gettext('Branding')}>\n                  <Fragment>\n                    <InputItem\n                      saveSetting={this.saveSetting}\n                      displayName='SITE_TITLE'\n                      keyText='SITE_TITLE'\n                      value={config_dict['SITE_TITLE']}\n                      helpTip={gettext('Site title shown in a browser tab')}\n                    />\n                    <InputItem\n                      saveSetting={this.saveSetting}\n                      displayName='SITE_NAME'\n                      keyText='SITE_NAME'\n                      value={config_dict['SITE_NAME']}\n                      helpTip={gettext('Site name used in email sending')}\n                    />\n                    <FileItem\n                      postFile={this.postFile}\n                      displayName='Logo'\n                      keyText='Logo'\n                      filePath={logoPath}\n                      fileWidth={256}\n                      fileHeight={64}\n                      helpTip='logo.png, 256px * 64px'\n                    />\n                    <FileItem\n                      postFile={this.postFile}\n                      displayName='Favicon'\n                      keyText='Favicon'\n                      filePath={faviconPath}\n                      fileWidth={32}\n                      fileHeight={32}\n                      helpTip='favicon.ico, 32px * 32px'\n                    />\n                    <FileItem\n                      postFile={this.postFile}\n                      displayName={gettext('Login Background Image')}\n                      keyText='loginBGImage'\n                      filePath={loginBGPath}\n                      fileWidth={240}\n                      fileHeight={160}\n                      helpTip='login-bg.jpg, 2400px * 1600px'\n                    />\n                    <CheckboxItem\n                      saveSetting={this.saveSetting}\n                      displayName='ENABLE_BRANDING_CSS'\n                      keyText='ENABLE_BRANDING_CSS'\n                      value={config_dict['ENABLE_BRANDING_CSS']}\n                      helpTip={gettext('Use custom CSS')}\n                    />\n                    <InputItem\n                      inputType=\"textarea\"\n                      saveSetting={this.saveSetting}\n                      displayName={gettext('Custom CSS')}\n                      keyText='CUSTOM_CSS'\n                      value={config_dict['CUSTOM_CSS']}\n                      helpTip=''\n                    />\n                  </Fragment>\n                </Section>\n\n                <Section headingText={gettext('User')}>\n                  <Fragment>\n                    <CheckboxItem\n                      saveSetting={this.saveSetting}\n                      displayName={gettext('allow new registrations')}\n                      keyText='ENABLE_SIGNUP'\n                      value={config_dict['ENABLE_SIGNUP']}\n                      helpTip={gettext('Allow new user registrations. Uncheck this to prevent anyone from creating a new account.')}\n                    />\n                    <CheckboxItem\n                      saveSetting={this.saveSetting}\n                      displayName={gettext('activate after registration')}\n                      keyText='ACTIVATE_AFTER_REGISTRATION'\n                      value={config_dict['ACTIVATE_AFTER_REGISTRATION']}\n                      helpTip={gettext('Activate user immediately after registration. If unchecked, a user need to be activated by administrator or via activation email')}\n                    />\n                    <CheckboxItem\n                      saveSetting={this.saveSetting}\n                      displayName={gettext('send activation email')}\n                      keyText='REGISTRATION_SEND_MAIL'\n                      value={config_dict['REGISTRATION_SEND_MAIL']}\n                      helpTip={gettext('Send activation Email after user registration.')}\n                    />\n                    <InputItem\n                      saveSetting={this.saveSetting}\n                      displayName={gettext('keep sign in')}\n                      keyText='LOGIN_REMEMBER_DAYS'\n                      value={config_dict['LOGIN_REMEMBER_DAYS']}\n                      helpTip={gettext('Number of days that keep user sign in.')}\n                    />\n                    <InputItem\n                      saveSetting={this.saveSetting}\n                      displayName='LOGIN_ATTEMPT_LIMIT'\n                      keyText='LOGIN_ATTEMPT_LIMIT'\n                      value={config_dict['LOGIN_ATTEMPT_LIMIT']}\n                      helpTip={gettext('The maximum number of failed login attempts before showing CAPTCHA.')}\n                    />\n                    <CheckboxItem\n                      saveSetting={this.saveSetting}\n                      displayName='FREEZE_USER_ON_LOGIN_FAILED'\n                      keyText='FREEZE_USER_ON_LOGIN_FAILED'\n                      value={config_dict['FREEZE_USER_ON_LOGIN_FAILED']}\n                      helpTip={gettext('Freeze user account when failed login attempts exceed limit.')}\n                    />\n                  </Fragment>\n                </Section>\n\n                <Section headingText={gettext('Groups')}>\n                  <CheckboxItem\n                    saveSetting={this.saveSetting}\n                    displayName='ENABLE_SHARE_TO_ALL_GROUPS'\n                    keyText='ENABLE_SHARE_TO_ALL_GROUPS'\n                    value={config_dict['ENABLE_SHARE_TO_ALL_GROUPS']}\n                    helpTip={gettext('Enable users to share libraries to any groups in the system.')}\n                  />\n                </Section>\n\n                <Section headingText={gettext('Password')}>\n                  <Fragment>\n                    <CheckboxItem\n                      saveSetting={this.saveSetting}\n                      displayName='strong password'\n                      keyText='USER_STRONG_PASSWORD_REQUIRED'\n                      value={config_dict['USER_STRONG_PASSWORD_REQUIRED']}\n                      helpTip={gettext('Force user to use a strong password when sign up or change password.')}\n                    />\n                    <CheckboxItem\n                      saveSetting={this.saveSetting}\n                      displayName='force password change'\n                      keyText='FORCE_PASSWORD_CHANGE'\n                      value={config_dict['FORCE_PASSWORD_CHANGE']}\n                      helpTip={gettext('Force user to change password when account is newly added or reset by admin')}\n                    />\n                    <InputItem\n                      saveSetting={this.saveSetting}\n                      displayName={gettext('password minimum length')}\n                      keyText='USER_PASSWORD_MIN_LENGTH'\n                      value={config_dict['USER_PASSWORD_MIN_LENGTH']}\n                      helpTip={gettext('The least number of characters an account password should include.')}\n                    />\n                    <InputItem\n                      saveSetting={this.saveSetting}\n                      displayName={gettext('password strength level')}\n                      keyText='USER_PASSWORD_STRENGTH_LEVEL'\n                      value={config_dict['USER_PASSWORD_STRENGTH_LEVEL']}\n                      helpTip={gettext('The level(1-4) of an account password\\'s strength. For example, \\'3\\' means password must have at least 3 of the following: num, upper letter, lower letter and other symbols')}\n                    />\n                    <CheckboxItem\n                      saveSetting={this.saveSetting}\n                      displayName='enable two factor authentication'\n                      keyText='ENABLE_TWO_FACTOR_AUTH'\n                      value={config_dict['ENABLE_TWO_FACTOR_AUTH']}\n                      helpTip={gettext('Enable two factor authentication')}\n                    />\n                  </Fragment>\n                </Section>\n\n                <Section headingText={gettext('Library')}>\n                  <Fragment>\n                    <CheckboxItem\n                      saveSetting={this.saveSetting}\n                      displayName='library history'\n                      keyText='ENABLE_REPO_HISTORY_SETTING'\n                      value={config_dict['ENABLE_REPO_HISTORY_SETTING']}\n                      helpTip={gettext('Allow user to change library history settings')}\n                    />\n                    <CheckboxItem\n                      saveSetting={this.saveSetting}\n                      displayName='encrypted library'\n                      keyText='ENABLE_ENCRYPTED_LIBRARY'\n                      value={config_dict['ENABLE_ENCRYPTED_LIBRARY']}\n                      helpTip={gettext('Allow user to create encrypted libraries')}\n                    />\n                    <InputItem\n                      saveSetting={this.saveSetting}\n                      displayName={gettext('library password minimum length')}\n                      keyText='REPO_PASSWORD_MIN_LENGTH'\n                      value={config_dict['REPO_PASSWORD_MIN_LENGTH']}\n                      helpTip={gettext('The least number of characters an encrypted library password should include.')}\n                    />\n                    <InputItem\n                      saveSetting={this.saveSetting}\n                      displayName={gettext('download/upload link password minimum length')}\n                      keyText='SHARE_LINK_PASSWORD_MIN_LENGTH'\n                      value={config_dict['SHARE_LINK_PASSWORD_MIN_LENGTH']}\n                      helpTip={gettext('The least number of characters a download/upload link password should include.')}\n                    />\n                    <CheckboxItem\n                      saveSetting={this.saveSetting}\n                      displayName='ENABLE_USER_CREATE_ORG_REPO'\n                      keyText='ENABLE_USER_CREATE_ORG_REPO'\n                      value={config_dict['ENABLE_USER_CREATE_ORG_REPO']}\n                      helpTip={gettext('Allow user to add organization libraries. Otherwise, only system admin can add organization libraries.')}\n                    />\n                    <CheckboxItem\n                      saveSetting={this.saveSetting}\n                      displayName='ENABLE_USER_CLEAN_TRASH'\n                      keyText='ENABLE_USER_CLEAN_TRASH'\n                      value={config_dict['ENABLE_USER_CLEAN_TRASH']}\n                      helpTip={gettext('Allow user to clean library trash')}\n                    />\n                  </Fragment>\n                </Section>\n\n                <Section headingText={gettext('Online Preview')}>\n                  <InputItem\n                    inputType=\"textarea\"\n                    saveSetting={this.saveSetting}\n                    displayName={gettext('text file extensions')}\n                    keyText='TEXT_PREVIEW_EXT'\n                    value={config_dict['TEXT_PREVIEW_EXT']}\n                    helpTip={gettext('Extensions of text files that can be online previewed, each suffix is separated by a comma.')}\n                  />\n                </Section>\n\n                <Section headingText={gettext('Sync')}>\n                  <CheckboxItem\n                    saveSetting={this.saveSetting}\n                    displayName='DISABLE_SYNC_WITH_ANY_FOLDER'\n                    keyText='DISABLE_SYNC_WITH_ANY_FOLDER'\n                    value={config_dict['DISABLE_SYNC_WITH_ANY_FOLDER']}\n                    helpTip={gettext('If turn on, the desktop clients will not be able to sync a folder outside the default Seafile folder.')}\n                  />\n                </Section>\n\n                {isPro && <Section headingText={gettext('Terms')}>\n                  <CheckboxItem\n                    saveSetting={this.saveSetting}\n                    displayName='ENABLE_TERMS_AND_CONDITIONS'\n                    keyText='ENABLE_TERMS_AND_CONDITIONS'\n                    value={config_dict['ENABLE_TERMS_AND_CONDITIONS']}\n                    helpTip={gettext('Enable system admin to add Terms and Conditions, and all users will have to accept the terms.')}\n                  />\n                </Section>}\n              </Fragment>\n              }\n            </div>\n          </div>\n        </div>\n      </Fragment>\n    );\n  }\n}\n\nexport default WebSettings;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Button, Modal, ModalHeader, ModalBody, ModalFooter, Form, FormGroup, Input } from 'reactstrap';\nimport { gettext } from '../../../utils/constants';\n\nconst propTypes = {\n  toggle: PropTypes.func.isRequired,\n  addNotification: PropTypes.func.isRequired\n};\n\nclass SysAdminAddSysNotificationDialog extends React.Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      value: '',\n      isSubmitBtnActive: false\n    };\n  }\n\n  handleChange = (e) => {\n    const value = e.target.value;\n    this.setState({\n      value: value,\n      isSubmitBtnActive: value.trim() != ''\n    });\n  }\n\n  handleSubmit = () => {\n    this.toggle();\n    this.props.addNotification(this.state.value.trim());\n  }\n\n  toggle = () => {\n    this.props.toggle();\n  }\n\n  render() {\n    return (\n      <Modal isOpen={true} toggle={this.toggle}>\n        <ModalHeader toggle={this.toggle}>{gettext('Add new notification')}</ModalHeader>\n        <ModalBody>\n          <Form>\n            <FormGroup>\n              <Input\n                type=\"textarea\"\n                value={this.state.value}\n                onChange={this.handleChange}\n              />\n            </FormGroup>\n          </Form>\n        </ModalBody>\n        <ModalFooter>\n          <Button color=\"secondary\" onClick={this.toggle}>{gettext('Cancel')}</Button>\n          <Button color=\"primary\" onClick={this.handleSubmit} disabled={!this.state.isSubmitBtnActive}>{gettext('Submit')}</Button>\n        </ModalFooter>\n      </Modal>\n    );\n  }\n}\n\nSysAdminAddSysNotificationDialog.propTypes = propTypes;\n\nexport default SysAdminAddSysNotificationDialog;\n","import React, { Component, Fragment } from 'react';\nimport { Button } from 'reactstrap';\nimport { Utils } from '../../../utils/utils';\nimport { seafileAPI } from '../../../utils/seafile-api';\nimport { gettext } from '../../../utils/constants';\nimport toaster from '../../../components/toast';\nimport EmptyTip from '../../../components/empty-tip';\nimport Loading from '../../../components/loading';\nimport OpMenu from '../../../components/dialog/op-menu';\nimport CommonOperationConfirmationDialog from '../../../components/dialog/common-operation-confirmation-dialog';\nimport SysAdminAddSysNotificationDialog from '../../../components/dialog/sysadmin-dialog/sysadmin-add-sys-notification-dialog';\nimport MainPanelTopbar from '../main-panel-topbar';\n\nclass Content extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      isItemFreezed: false\n    };\n  }\n\n  onFreezedItem = () => {\n    this.setState({isItemFreezed: true});\n  }\n\n  onUnfreezedItem = () => {\n    this.setState({isItemFreezed: false});\n  }\n\n  render() {\n    const { loading, errorMsg, items } = this.props;\n    if (loading) {\n      return <Loading />;\n    } else if (errorMsg) {\n      return <p className=\"error text-center mt-4\">{errorMsg}</p>;\n    } else {\n      const emptyTip = (\n        <EmptyTip>\n          <h2>{gettext('No notifications')}</h2>\n        </EmptyTip>\n      );\n      const table = (\n        <table>\n          <thead>\n            <tr>\n              <th width=\"95%\">{gettext('Notification Detail')}</th>\n              <th width=\"5%\">{/*Operations*/}</th>\n            </tr>\n          </thead>\n          <tbody>\n            {items.map((item, index) => {\n              return (<Item\n                key={index}\n                item={item}\n                isItemFreezed={this.state.isItemFreezed}\n                onFreezedItem={this.onFreezedItem}\n                onUnfreezedItem={this.onUnfreezedItem}\n                deleteNotification={this.props.deleteNotification}\n                setToCurrent={this.props.setToCurrent}\n              />);\n            })}\n          </tbody>\n        </table>\n      );\n      return items.length ? table : emptyTip;\n    }\n  }\n}\n\nclass Item extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      isOpIconShown: false,\n      highlight: false,\n      isDeleteDialogOpen: false\n    };\n  }\n\n  handleMouseEnter = () => {\n    if (!this.props.isItemFreezed) {\n      this.setState({\n        isOpIconShown: true,\n        highlight: true\n      });\n    }\n  }\n\n  handleMouseLeave = () => {\n    if (!this.props.isItemFreezed) {\n      this.setState({\n        isOpIconShown: false,\n        highlight: false\n      });\n    }\n  }\n\n  onUnfreezedItem = () => {\n    this.setState({\n      highlight: false,\n      isOpIconShow: false\n    });\n    this.props.onUnfreezedItem();\n  }\n\n  toggleDeleteDialog = (e) => {\n    if (e) {\n      e.preventDefault();\n    }\n    this.setState({isDeleteDialogOpen: !this.state.isDeleteDialogOpen});\n  }\n\n  deleteNotification = () => {\n    this.props.deleteNotification(this.props.item.id);\n    this.toggleDeleteDialog();\n  }\n\n  setToCurrent = () => {\n    this.props.setToCurrent(this.props.item.id);\n  }\n\n  onMenuItemClick = (operation) => {\n    switch(operation) {\n      case 'Set to current':\n        this.setToCurrent();\n        break;\n      case 'Delete':\n        this.toggleDeleteDialog();\n        break;\n    }\n  }\n\n  translateOperations = (item) => {\n    let translateResult = '';\n    switch (item) {\n      case 'Set to current':\n        translateResult = gettext('Set to current');\n        break;\n      case 'Delete':\n        translateResult = gettext('Delete');\n        break;\n      default:\n        break;\n    }\n    return translateResult;\n  }\n\n  getOperations = () => {\n    const { item } = this.props;\n    let operations = [];\n    if (!item.is_current) {\n      operations.push('Set to current');\n    }\n    operations.push('Delete');\n    return operations;\n  }\n\n  render() {\n    const { item } = this.props;\n    const { isOpIconShown, isDeleteDialogOpen } = this.state;\n\n    return (\n      <Fragment>\n        <tr className={this.state.highlight ? 'tr-highlight' : ''} onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave}>\n          <td>\n            {item.msg}\n            {item.is_current &&\n              <span className=\"small text-orange\">{gettext('(current notification)')}</span>\n            }\n          </td>\n          <td>\n            {isOpIconShown &&\n            <OpMenu\n              operations={this.getOperations()}\n              translateOperations={this.translateOperations}\n              onMenuItemClick={this.onMenuItemClick}\n              onFreezedItem={this.props.onFreezedItem}\n              onUnfreezedItem={this.onUnfreezedItem}\n            />\n            }\n          </td>\n        </tr>\n        {isDeleteDialogOpen &&\n          <CommonOperationConfirmationDialog\n            title={gettext('Delete Notification')}\n            message={gettext('Are you sure you want to delete the notification ?')}\n            toggleDialog={this.toggleDeleteDialog}\n            executeOperation={this.deleteNotification}\n            confirmBtnText={gettext('Delete')}\n          />\n        }\n      </Fragment>\n    );\n  }\n}\n\nclass Notifications extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      loading: true,\n      errorMsg: '',\n      notificationList: [],\n      isAddNotificationDialogOpen: false\n    };\n  }\n\n  componentDidMount () {\n    seafileAPI.sysAdminListAllSysNotifications().then((res) => {\n      this.setState({\n        loading: false,\n        notificationList: res.data.notifications\n      });\n    }).catch((error) => {\n      this.setState({\n        loading: false,\n        errorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403\n      });\n    });\n  }\n\n  toggleAddNotificationDialog = () => {\n    this.setState({isAddNotificationDialogOpen: !this.state.isAddNotificationDialogOpen});\n  }\n\n  addNotification = (msg) => {\n    seafileAPI.sysAdminAddSysNotification(msg).then(res => {\n      let notificationList = this.state.notificationList;\n      notificationList.unshift(res.data.notification);\n      this.setState({notificationList: notificationList});\n    }).catch((error) => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  deleteNotification = (id) => {\n    seafileAPI.sysAdminDeleteSysNotification(id).then(res => {\n      let notificationList = this.state.notificationList.filter(item => {\n        return item.id != id;\n      });\n      this.setState({notificationList: notificationList});\n      toaster.success(gettext('Successfully deleted 1 item.'));\n    }).catch((error) => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  setToCurrent = (id) => {\n    seafileAPI.sysAdminSetSysNotificationToCurrent(id).then(res => {\n      let notificationList = this.state.notificationList.map(item => {\n        if (item.id == id) {\n          item.is_current = true;\n        } else {\n          item.is_current = false;\n        }\n        return item;\n      });\n      this.setState({notificationList: notificationList});\n    }).catch((error) => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  render() {\n    const { isAddNotificationDialogOpen } = this.state;\n    return (\n      <Fragment>\n        <MainPanelTopbar>\n          <Button className=\"btn btn-secondary operation-item\" onClick={this.toggleAddNotificationDialog}>{gettext('Add new notification')}</Button>\n        </MainPanelTopbar>\n        <div className=\"main-panel-center flex-row\">\n          <div className=\"cur-view-container\">\n            <div className=\"cur-view-path\">\n              <h3 className=\"sf-heading\">{gettext('All Notifications')}</h3>\n            </div>\n            <div className=\"cur-view-content\">\n              <Content\n                loading={this.state.loading}\n                errorMsg={this.state.errorMsg}\n                items={this.state.notificationList}\n                deleteNotification={this.deleteNotification}\n                setToCurrent={this.setToCurrent}\n              />\n            </div>\n          </div>\n        </div>\n        {isAddNotificationDialogOpen &&\n          <SysAdminAddSysNotificationDialog\n            addNotification={this.addNotification}\n            toggle={this.toggleAddNotificationDialog}\n          />\n        }\n      </Fragment>\n    );\n  }\n}\n\nexport default Notifications;\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport { seafileAPI } from '../../utils/seafile-api';\nimport { gettext } from '../../utils/constants';\nimport { Utils } from '../../utils/utils';\nimport Account from '../../components/common/account';\n\n\nconst tablePropTypes = {\n  loading: PropTypes.bool.isRequired,\n  errorMsg: PropTypes.string.isRequired,\n  records: PropTypes.array.isRequired,\n};\n\nclass Table extends Component {\n\n  render() {\n    let { loading, errorMsg, records } = this.props;\n\n    if (loading) {\n      return <span className=\"loading-icon loading-tip\"></span>;\n    } else if (errorMsg) {\n      return <p className=\"error text-center\">{errorMsg}</p>;\n    } else {\n      return (\n        <table width=\"100%\" className=\"table table-hover table-vcenter\">\n          <thead>\n            <tr>\n              <th width=\"16%\">{gettext('Library')}</th>\n              <th width=\"30%\">ID</th>\n              <th width=\"30%\">{gettext('Path')}</th>\n              <th width=\"12%\">{gettext('Label')}</th>\n              <th width=\"12%\">{gettext('Suggestion')}</th>\n            </tr>\n          </thead>\n          <tbody>\n            {records.map((record, index) => {\n              return (\n                <Item key={index} record={record} />\n              );\n            })}\n          </tbody>\n        </table>\n      );\n    }\n  }\n}\n\nTable.propTypes = tablePropTypes;\n\n\nconst itemPropTypes = {\n  record: PropTypes.object.isRequired,\n};\n\nclass Item extends Component {\n  constructor(props) {\n    super(props);\n    this.state = {};\n  }\n\n  render() {\n    let record = this.props.record;\n\n    return (\n      <tr>\n        <td>{record.repo_name}</td>\n        <td>{record.repo_id}</td>\n        <td>{record.path}</td>\n        <td>{record.detail.label}</td>\n        <td>{record.detail.suggestion}</td>\n      </tr>\n    );\n  }\n}\n\nItem.propTypes = itemPropTypes;\n\n\nclass FileScanRecords extends Component {\n  constructor(props) {\n    super(props);\n    this.state = {\n      loading: true,\n      errorMsg: '',\n      records: [],\n    };\n  }\n\n  componentDidMount() {\n    seafileAPI.listFileScanRecords().then((res) => {\n      this.setState({\n        loading: false,\n        records: res.data.record_list,\n      });\n    }).catch((error) => {\n      this.setState({\n        loading: false,\n        errorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403\n      });\n    });\n  }\n\n  render() {\n    return (\n      <React.Fragment>\n        <div className=\"main-panel-north border-left-show\">\n          <div className=\"cur-view-toolbar\">\n            <span className=\"sf2-icon-menu side-nav-toggle hidden-md-up d-md-none\" title=\"Side Nav Menu\"></span>\n          </div>\n          <div className=\"common-toolbar\">\n            <Account isAdminPanel={true} />\n          </div>\n        </div>\n        <div className=\"main-panel-center\">\n          <div className=\"cur-view-container\" id=\"content-scan-records\">\n            <div className=\"cur-view-path\">\n              <h3 className=\"sf-heading\">{gettext('Content Scan Records')}</h3>\n            </div>\n            <div className=\"cur-view-content\">\n              <Table\n                loading={this.state.loading}\n                errorMsg={this.state.errorMsg}\n                records={this.state.records}\n              />\n            </div>\n          </div>\n        </div>\n      </React.Fragment>\n    );\n  }\n}\n\nexport default FileScanRecords;\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport { Table } from 'reactstrap';\nimport { siteRoot } from '../../../utils/constants';\nimport Loading from '../../../components/loading';\n\nconst WorkWeixinDepartmentMembersListPropTypes = {\n  isMembersListLoading: PropTypes.bool.isRequired,\n  membersList: PropTypes.array.isRequired,\n  newUsersTempObj: PropTypes.object.isRequired,\n  checkedDepartmentId: PropTypes.number.isRequired,\n  onUserChecked: PropTypes.func.isRequired,\n  onAllUsersChecked: PropTypes.func.isRequired,\n  isCheckedAll: PropTypes.bool.isRequired,\n  canCheckUserIds: PropTypes.array.isRequired,\n};\n\nclass WorkWeixinDepartmentMembersList extends Component {\n\n  constructor(props) {\n    super(props);\n  }\n\n  render() {\n    const { newUsersTempObj, checkedDepartmentId, isMembersListLoading, canCheckUserIds } = this.props;\n    const membersList = this.props.membersList.map((member, index) => {\n      let avatar = member.avatar;\n      if (member.avatar.length > 0) {\n        avatar = member.avatar.substring(0, member.avatar.length - 1) + '100';// get smaller avatar\n      } else {\n        avatar = siteRoot + 'media/avatars/default.png';\n      }\n      return (\n        <tr key={checkedDepartmentId.toString() + member.userid}>\n          <td>\n            {!member.email &&\n              <input type=\"checkbox\" className=\"vam\" onChange={() => this.props.onUserChecked(member)}\n                checked={(member.userid in newUsersTempObj) ? 'checked' : ''}></input>}\n          </td>\n          <td><img className=\"avatar\" src={avatar} alt=\"\"></img></td>\n          <td>{member.name}</td>\n          <td>{member.mobile}</td>\n          <td>{member.contact_email}</td>\n          <td>{member.email && <i className=\"sf2-icon-tick\"></i>}</td>\n        </tr>\n      );\n    });\n\n    return (\n      <div className=\"dir-content-main\">\n        {isMembersListLoading && <Loading/>}\n        {!isMembersListLoading && this.props.membersList.length > 0 &&\n          <Table hover>\n            <thead>\n              <tr>\n                <th width=\"5%\">\n                  {canCheckUserIds.length > 0 &&\n                    <input type=\"checkbox\" className=\"vam\" checked={this.props.isCheckedAll}\n                      onChange={() => this.props.onAllUsersChecked()}></input>}\n                </th>\n                <th width=\"10%\"></th>\n                <th width=\"20%\">{'名称'}</th>\n                <th width=\"20%\">{'手机号'}</th>\n                <th width=\"30%\">{'邮箱'}</th>\n                <th width=\"15%\">{'已添加'}</th>\n              </tr>\n            </thead>\n            <tbody>{membersList}</tbody>\n          </Table>\n        }\n        {!isMembersListLoading && this.props.membersList.length === 0 &&\n          <div className=\"message empty-tip text-center\">\n            <img src={`${siteRoot}media/img/member-list-empty-2x.png`} alt=\"\"/>\n            <h4>{'成员列表为空'}</h4>\n          </div>\n        }\n      </div>\n    );\n  }\n}\n\nWorkWeixinDepartmentMembersList.propTypes = WorkWeixinDepartmentMembersListPropTypes;\n\nexport default WorkWeixinDepartmentMembersList;\n","import React, { Component, Fragment } from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { Dropdown, DropdownItem, DropdownMenu, DropdownToggle } from 'reactstrap';\nimport { gettext, isPro } from '../../../utils/constants';\n\nconst WorkWeixinDepartmentsTreeNodePropTypes = {\n  index: PropTypes.number,\n  department: PropTypes.object.isRequired,\n  isChildrenShow: PropTypes.bool.isRequired,\n  onChangeDepartment: PropTypes.func.isRequired,\n  checkedDepartmentId: PropTypes.number.isRequired,\n  importDepartmentDialogToggle: PropTypes.func.isRequired,\n};\n\nclass WorkWeixinDepartmentsTreeNode extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      isChildrenShow: false,\n      dropdownOpen: false,\n      active: false,\n    };\n  }\n\n  toggleChildren = (e) => {\n    e.preventDefault();\n    e.stopPropagation();\n    this.setState({\n      isChildrenShow: !this.state.isChildrenShow,\n    });\n  };\n\n  dropdownToggle = (e) => {\n    e.stopPropagation();\n    this.setState({ dropdownOpen: !this.state.dropdownOpen });\n  };\n\n  onMouseEnter = () => {\n    this.setState({ active: true });\n  };\n\n  onMouseLeave = () => {\n    if (this.state.dropdownOpen) return;\n    this.setState({ active: false });\n  };\n\n  importDepartmentDialogToggle = (depart) => {\n    this.setState({ active: false });\n    this.props.importDepartmentDialogToggle(depart);\n  }\n\n  componentDidMount() {\n    if (this.props.index === 0) {\n      this.setState({ isChildrenShow: true });\n      this.props.onChangeDepartment(this.props.department.id);\n    }\n  }\n\n  renderTreeNodes = (departmentsTree) => {\n    if (departmentsTree.length > 0) {\n      return departmentsTree.map((department) => {\n        return (\n          <WorkWeixinDepartmentsTreeNode\n            key={department.id}\n            department={department}\n            isChildrenShow={this.state.isChildrenShow}\n            onChangeDepartment={this.props.onChangeDepartment}\n            checkedDepartmentId={this.props.checkedDepartmentId}\n            importDepartmentDialogToggle={this.importDepartmentDialogToggle}\n          />\n        );\n      });\n    }\n  };\n\n  changeDept = (departmentID) => {\n    const { department, checkedDepartmentId } = this.props;\n    this.props.onChangeDepartment(departmentID);\n    if (checkedDepartmentId === department.id && !this.state.isChildrenShow) {\n      this.setState({ isChildrenShow: true });\n    }\n  }\n\n  render() {\n    const { isChildrenShow, department, checkedDepartmentId } = this.props;\n    let toggleClass = classNames({\n      'folder-toggle-icon fa fa-caret-down': department.children && this.state.isChildrenShow,\n      'folder-toggle-icon fa fa-caret-right': department.children && !this.state.isChildrenShow,\n    });\n    let nodeInnerClass = classNames({\n      'tree-node-inner': true,\n      'tree-node-inner-hover': this.state.active,\n      'tree-node-hight-light': checkedDepartmentId === department.id\n    });\n    return (\n      <Fragment>\n        {isChildrenShow &&\n          <div\n            className={nodeInnerClass}\n            onClick={() => this.changeDept(department.id)}\n            onMouseEnter={this.onMouseEnter}\n            onMouseLeave={this.onMouseLeave}\n          >\n            <span className=\"tree-node-icon\" onClick={(e) => this.toggleChildren(e)}>\n              <i className={toggleClass}></i>\n            </span>\n            <span className=\"tree-node-text\">{department.name}</span>\n            {isPro &&\n            <Dropdown\n              isOpen={this.state.dropdownOpen}\n              toggle={(e) => this.dropdownToggle(e)}\n              direction=\"down\"\n              style={this.state.active ? {} : { opacity: 0 }}\n            >\n              <DropdownToggle\n                tag='i'\n                className='fa fa-ellipsis-v cursor-pointer attr-action-icon'\n                title={gettext('More Operations')}\n                data-toggle=\"dropdown\"\n                aria-expanded={this.state.dropdownOpen}\n              >\n              </DropdownToggle>\n              <DropdownMenu className=\"drop-list\" right={true}>\n                <DropdownItem\n                  onClick={this.importDepartmentDialogToggle.bind(this, department)}\n                  id={department.id}\n                >{'导入部门'}</DropdownItem>\n              </DropdownMenu>\n            </Dropdown>\n            }\n          </div>\n        }\n        {this.state.isChildrenShow &&\n          <div className=\"department-children\">\n            {department.children && this.renderTreeNodes(department.children)}\n          </div>\n        }\n      </Fragment>\n    );\n  }\n}\n\nWorkWeixinDepartmentsTreeNode.propTypes = WorkWeixinDepartmentsTreeNodePropTypes;\n\nexport default WorkWeixinDepartmentsTreeNode;\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport Loading from '../../../components/loading';\nimport WorkWeixinDepartmentsTreeNode from './work-weixin-departments-tree-node';\n\nconst WorkWeixinDepartmentsTreePanelPropTypes = {\n  isTreeLoading: PropTypes.bool.isRequired,\n  departmentsTree: PropTypes.array.isRequired,\n  onChangeDepartment: PropTypes.func.isRequired,\n  checkedDepartmentId: PropTypes.number.isRequired,\n  importDepartmentDialogToggle: PropTypes.func.isRequired,\n};\n\nclass WorkWeixinDepartmentsTreePanel extends Component {\n\n  constructor(props) {\n    super(props);\n  }\n\n  render() {\n    const { departmentsTree } = this.props;\n    return (\n      <div className=\"dir-content-nav\">\n        <div className=\"tree-view tree\">\n          {this.props.isTreeLoading ?\n            <Loading/> :\n            <div className=\"tree-node\">\n              {departmentsTree.length > 0 && departmentsTree.map((department, index) => {\n                return (\n                  <WorkWeixinDepartmentsTreeNode\n                    key={department.id}\n                    index={index}\n                    department={department}\n                    isChildrenShow={true}\n                    onChangeDepartment={this.props.onChangeDepartment}\n                    checkedDepartmentId={this.props.checkedDepartmentId}\n                    importDepartmentDialogToggle={this.props.importDepartmentDialogToggle}\n                  />\n                );\n              })}\n            </div>\n          }\n        </div>\n      </div>\n    );\n  }\n}\n\nWorkWeixinDepartmentsTreePanel.propTypes = WorkWeixinDepartmentsTreePanelPropTypes;\n\nexport default WorkWeixinDepartmentsTreePanel;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Button, Modal, ModalHeader, ModalBody, ModalFooter } from 'reactstrap';\nimport Loading from '../loading';\n\nconst propTypes = {\n  importDepartmentDialogToggle: PropTypes.func.isRequired,\n  onImportDepartmentSubmit: PropTypes.func.isRequired,\n  departmentsCount: PropTypes.number.isRequired,\n  membersCount: PropTypes.number.isRequired,\n  departmentName: PropTypes.string.isRequired,\n};\n\nclass ImportWorkWeixinDepartmentDialog extends React.Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      isLoading : false,\n    };\n  }\n\n  toggle = () => {\n    this.props.importDepartmentDialogToggle(null);\n  };\n\n  handleSubmit = () => {\n    this.props.onImportDepartmentSubmit();\n    this.setState({ isLoading : true });\n  };\n\n  render() {\n    const { departmentsCount, membersCount, departmentName } = this.props;\n    return (\n      <Modal isOpen={true} toggle={this.toggle}>\n        <ModalHeader toggle={this.toggle}>\n          <span>{'导入部门 '}</span><span className=\"op-target\" title={departmentName}>{departmentName}</span>\n        </ModalHeader>\n        <ModalBody>\n          <p>{'将要导入 '}<strong>{departmentsCount}</strong>{' 个部门,其中包括 '}<strong>{membersCount}</strong>{' 个成员'}</p>\n          {this.state.isLoading && <Loading/>}\n        </ModalBody>\n        <ModalFooter>\n          <Button color=\"secondary\" onClick={this.toggle}>{'取消'}</Button>\n          <Button color=\"primary\" onClick={this.handleSubmit}>{'导入'}</Button>\n        </ModalFooter>\n      </Modal>\n    );\n  }\n}\n\nImportWorkWeixinDepartmentDialog.propTypes = propTypes;\n\nexport default ImportWorkWeixinDepartmentDialog;\n","import React, { Component, Fragment } from 'react';\nimport { Button } from 'reactstrap';\nimport _ from 'lodash';\nimport { seafileAPI } from '../../utils/seafile-api';\nimport { gettext, siteRoot, isPro } from '../../utils/constants';\nimport { Utils } from '../../utils/utils';\nimport toaster from '../../components/toast';\nimport Account from '../../components/common/account';\nimport { WorkWeixinDepartmentMembersList, WorkWeixinDepartmentsTreePanel } from './work-weixin';\nimport ImportWorkWeixinDepartmentDialog from '../../components/dialog/import-work-weixin-department-dialog';\n\nimport '../../css/work-weixin-departments.css';\n\nclass WorkWeixinDepartments extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      isTreeLoading: true,\n      isMembersListLoading: true,\n      departmentsTree: [],\n      checkedDepartmentId: 0,\n      membersTempObj: {},\n      membersList: [],\n      newUsersTempObj: {},\n      isCheckedAll: false,\n      canCheckUserIds: [],\n      isImportDepartmentDialogShow: false,\n      importDepartment: null,\n      importDepartmentChildrenCount: 0,\n      importDepartmentMembersCount: 0,\n    };\n  }\n\n  getDepartmentsTree = (list) => {\n    let childIds = [];\n    let parentIds = [];\n    for (let i = 0; i < list.length; i++) {\n      if (childIds.indexOf(list[i].id) === -1) {\n        childIds.push(list[i].id);\n      }\n      if (parentIds.indexOf(list[i].parentid) === -1) {\n        parentIds.push(list[i].parentid);\n      }\n    }\n    let intersection = parentIds.filter((v) => {\n      return childIds.indexOf(v) !== -1;\n    });\n    let rootIds = parentIds.concat(intersection).filter((v) => {\n      return parentIds.indexOf(v) === -1 || intersection.indexOf(v) === -1;\n    });\n    let cloneData = _.cloneDeep(list);\n    return cloneData.filter(father => {\n      let branchArr = cloneData.filter(child => father.id === child.parentid);\n      branchArr.length > 0 ? father.children = branchArr : '';\n      return rootIds.indexOf(father.parentid) !== -1;\n    });\n  };\n\n  getWorkWeixinDepartmentsList = (departmentID) => {\n    seafileAPI.adminListWorkWeixinDepartments(departmentID).then((res) => {\n      if (!departmentID) {\n        let departmentsTree = this.getDepartmentsTree(res.data.department);\n        this.setState({\n          isTreeLoading: false,\n          departmentsTree: departmentsTree,\n        });\n      } else {\n        this.setState({\n          importDepartmentChildrenCount: res.data.department.length,\n          importDepartmentMembersCount: this.state.membersTempObj[departmentID].length,\n        });\n      }\n    }).catch((error) => {\n      this.handleError(error);\n      this.setState({\n        isTreeLoading: false,\n        isMembersListLoading: false,\n      });\n      if (error.response && error.response.status === 403) {\n        window.location = siteRoot + 'sys/useradmin/';\n      }\n    });\n  };\n\n  getWorkWeixinDepartmentMembersList = (department_id) => {\n    this.setState({\n      isMembersListLoading: true,\n    });\n    seafileAPI.adminListWorkWeixinDepartmentMembers(department_id, {fetch_child: true}).then((res) => {\n      let membersTempObj = this.state.membersTempObj;\n      membersTempObj[department_id] = res.data.userlist;\n      let canCheckUserIds = this.getCanCheckUserIds(res.data.userlist);\n      this.setState({\n        membersTempObj: membersTempObj,\n        membersList: res.data.userlist,\n        isMembersListLoading: false,\n        canCheckUserIds: canCheckUserIds,\n      });\n    }).catch((error) => {\n      this.setState({isMembersListLoading: false});\n      this.handleError(error);\n    });\n  };\n\n  getCanCheckUserIds = (membersList) => {\n    let userIds = [];\n    membersList.forEach((member) => {\n      if (!member.email) userIds.push(member.userid);\n    });\n    return userIds;\n  };\n\n  onChangeDepartment = (department_id) => {\n    this.setState({\n      newUsersTempObj: {},\n      isCheckedAll: false,\n      checkedDepartmentId: department_id,\n    });\n    if (!(department_id in this.state.membersTempObj)) {\n      this.getWorkWeixinDepartmentMembersList(department_id);\n    } else {\n      let canCheckUserIds = this.getCanCheckUserIds(this.state.membersTempObj[department_id]);\n      this.setState({\n        membersList: this.state.membersTempObj[department_id],\n        canCheckUserIds: canCheckUserIds,\n      });\n    }\n  };\n\n  onUserChecked = (user) => {\n    if (this.state.canCheckUserIds.indexOf(user.userid) !== -1) {\n      let newUsersTempObj = this.state.newUsersTempObj;\n      if (user.userid in newUsersTempObj) {\n        delete newUsersTempObj[user.userid];\n        if (this.state.isCheckedAll) {\n          this.setState({ isCheckedAll: false });\n        }\n      } else {\n        newUsersTempObj[user.userid] = user;\n        if (Object.keys(newUsersTempObj).length === this.state.canCheckUserIds.length) {\n          this.setState({ isCheckedAll: true });\n        }\n      }\n      this.setState({ newUsersTempObj: newUsersTempObj });\n    }\n  };\n\n  onAllUsersChecked = () => {\n    this.setState({\n      isCheckedAll: !this.state.isCheckedAll,\n    }, () => {\n      if (this.state.isCheckedAll) {\n        let newUsersTempObj = {};\n        let newUsersTempList = this.state.membersList.filter(user => {\n          return this.state.canCheckUserIds.indexOf(user.userid) !== -1;\n        });\n        for (let i = 0; i < newUsersTempList.length; i++) {\n          newUsersTempObj[newUsersTempList[i].userid] = newUsersTempList[i];\n        }\n        this.setState({ newUsersTempObj: newUsersTempObj });\n      } else {\n        this.setState({ newUsersTempObj: {} });\n      }\n    });\n  };\n\n  onSubmit = () => {\n    const { newUsersTempObj } = this.state;\n    if (JSON.stringify(newUsersTempObj) === '{}') return;\n    let userList = [];\n    for (let i in newUsersTempObj) {\n      userList.push(newUsersTempObj[i]);\n    }\n    if (userList.length === 0) {\n      toaster.danger('未选择成员', {duration: 3});\n      return;\n    }\n    seafileAPI.adminAddWorkWeixinUsersBatch(userList).then((res) => {\n      this.setState({\n        newUsersTempObj: {},\n        isCheckedAll: false,\n      });\n      if (res.data.success) {\n        this.handleSubmitSuccess(res.data.success);\n      }\n      if (res.data.failed) {\n        const fails= res.data.failed;\n        for (let i = 0; i < fails.length; i++) {\n          toaster.danger(fails[i].name + ' ' + fails[i].error_msg, {duration: 3});\n        }\n      }\n    }).catch((error) => {\n      this.handleError(error);\n    });\n\n  };\n\n  handleSubmitSuccess = (success) => {\n    let { membersTempObj, membersList, canCheckUserIds } = this.state;\n    for (let i = 0; i < success.length; i++) {\n      let { userid, name, email } = success[i];\n      toaster.success(name + ' 成功导入', {duration: 1});\n      // refresh all temp\n      if (canCheckUserIds.indexOf(userid) !== -1) {\n        canCheckUserIds.splice(canCheckUserIds.indexOf(userid), 1);\n      }\n      for (let j = 0; j < membersList.length; j++) {\n        if (membersList[j].userid === userid) {\n          membersList[j].email = email;\n          break;\n        }\n      }\n      for (let departmentId in membersTempObj) {\n        for (let k = 0; k < membersTempObj[departmentId].length; k++) {\n          if (membersTempObj[departmentId][k].userid === userid) {\n            membersTempObj[departmentId][k].email = email;\n            break;\n          }\n        }\n      }\n    }\n    this.setState({\n      membersTempObj: membersTempObj,\n      membersList: membersList,\n      canCheckUserIds: canCheckUserIds,\n    });\n  }\n\n  importDepartmentDialogToggle = (importDepartment) => {\n    this.setState({\n      isImportDepartmentDialogShow: !this.state.isImportDepartmentDialogShow,\n      importDepartment: importDepartment,\n    }, () => {\n      if (importDepartment) {\n        this.getWorkWeixinDepartmentsList(importDepartment.id);\n      }\n    });\n  };\n\n  onImportDepartmentSubmit = () => {\n    let importDepartment = this.state.importDepartment;\n    if (!importDepartment) return;\n    seafileAPI.adminImportWorkWeixinDepartment(importDepartment.id).then((res) => {\n      this.setState({\n        isMembersListLoading: true,\n        checkedDepartmentId: importDepartment.id,\n        membersTempObj: {},\n        membersList: [],\n        newUsersTempObj: {},\n        isCheckedAll: false,\n        canCheckUserIds: [],\n      });\n      this.getWorkWeixinDepartmentMembersList(importDepartment.id);\n      this.importDepartmentDialogToggle(null);\n      if (res.data.success) {\n        this.handleImportDepartmentSubmitSuccess(res.data.success);\n      }\n      if (res.data.failed) {\n        this.handleImportDepartmentSubmitFailed(res.data.failed);\n      }\n    }).catch((error) => {\n      this.handleError(error);\n    });\n  };\n\n  handleImportDepartmentSubmitSuccess = (successes) => {\n    for (let i = 0, len = successes.length; i < len; i++) {\n      let success = successes[i];\n      let successMsg = success.type === 'department' ? '部门 ' + success.department_name + ' 导入成功' : success.api_user_name + ' 导入成功' ;\n      toaster.success(successMsg, { duration: 3 });\n    }\n  };\n\n  handleImportDepartmentSubmitFailed = (fails) => {\n    for (let i = 0, len = fails.length; i < len; i++) {\n      let fail = fails[i];\n      let failName = fail.type === 'department' ? fail.department_name : fail.api_user_name;\n      toaster.danger(failName + ' ' + fail.msg, { duration: 3} );\n    }\n  };\n\n  handleError = (error) => {\n    const errorMsg = Utils.getErrorMsg(error);\n    toaster.danger(errorMsg);\n  }\n\n  componentDidMount() {\n    this.getWorkWeixinDepartmentsList(null);\n  }\n\n  renderNav() {\n    const btnClass = 'btn btn-secondary operation-item ';\n    return (\n      <div className=\"main-panel-north border-left-show\">\n        <div className=\"cur-view-toolbar\">\n          <span className=\"sf2-icon-menu side-nav-toggle hidden-md-up d-md-none\" title=\"Side Nav Menu\"></span>\n          <Button className={btnClass + 'my-1 d-md-none'} onClick={this.onSubmit}>{'导入用户'}</Button>\n          <Button className={btnClass + 'hidden-md-up'} onClick={this.onSubmit}>{'导入用户'}</Button>\n        </div>\n        <div className=\"common-toolbar\">\n          <Account isAdminPanel={true}/>\n        </div>\n      </div>\n    );\n  }\n\n  render() {\n    const { isImportDepartmentDialogShow, isTreeLoading, importDepartment, importDepartmentChildrenCount, importDepartmentMembersCount } = this.state;\n    let canImportDepartment = !!(isPro && isImportDepartmentDialogShow && !isTreeLoading && importDepartment);\n    return (\n      <Fragment>\n        {this.renderNav()}\n        <div className=\"main-panel-center\">\n          <div className=\"cur-view-container\">\n            <div className=\"cur-view-path\">\n              <h3 className=\"sf-heading\">{'企业微信集成'}</h3>\n            </div>\n            <div className=\"cur-view-content d-flex flex-row\">\n              <WorkWeixinDepartmentsTreePanel\n                departmentsTree={this.state.departmentsTree}\n                isTreeLoading={this.state.isTreeLoading}\n                onChangeDepartment={this.onChangeDepartment}\n                checkedDepartmentId={this.state.checkedDepartmentId}\n                importDepartmentDialogToggle={this.importDepartmentDialogToggle}\n              />\n              <div className=\"dir-content-resize\"></div>\n              <WorkWeixinDepartmentMembersList\n                isMembersListLoading={this.state.isMembersListLoading}\n                membersList={this.state.membersList}\n                checkedDepartmentId={this.state.checkedDepartmentId}\n                newUsersTempObj={this.state.newUsersTempObj}\n                onUserChecked={this.onUserChecked}\n                onAllUsersChecked={this.onAllUsersChecked}\n                isCheckedAll={this.state.isCheckedAll}\n                canCheckUserIds={this.state.canCheckUserIds}\n              />\n            </div>\n          </div>\n        </div>\n        {canImportDepartment &&\n          <ImportWorkWeixinDepartmentDialog\n            importDepartmentDialogToggle={this.importDepartmentDialogToggle}\n            onImportDepartmentSubmit={this.onImportDepartmentSubmit}\n            departmentsCount={importDepartmentChildrenCount}\n            membersCount={importDepartmentMembersCount}\n            departmentName={importDepartment.name}\n          />\n        }\n      </Fragment>\n    );\n  }\n}\n\nexport default WorkWeixinDepartments;\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport { Table } from 'reactstrap';\nimport { siteRoot } from '../../../utils/constants';\nimport Loading from '../../../components/loading';\n\nconst DingtalkDepartmentMembersListPropTypes = {\n  isMembersListLoading: PropTypes.bool.isRequired,\n  membersList: PropTypes.array.isRequired,\n  newUsersTempObj: PropTypes.object.isRequired,\n  checkedDepartmentId: PropTypes.number.isRequired,\n  onUserChecked: PropTypes.func.isRequired,\n  onAllUsersChecked: PropTypes.func.isRequired,\n  isCheckedAll: PropTypes.bool.isRequired,\n  canCheckUserIds: PropTypes.array.isRequired,\n};\n\nclass DingtalkDepartmentMembersList extends Component {\n\n  constructor(props) {\n    super(props);\n  }\n\n  render() {\n    const { newUsersTempObj, checkedDepartmentId, isMembersListLoading, canCheckUserIds } = this.props;\n    const membersList = this.props.membersList.map((member, index) => {\n      let avatar = member.avatar;\n      if (member.avatar.length > 0) {\n        avatar = member.avatar;\n      } else {\n        avatar = siteRoot + 'media/avatars/default.png';\n      }\n      return (\n        <tr key={checkedDepartmentId.toString() + member.userid}>\n          <td>\n            {!member.email &&\n              <input type=\"checkbox\" className=\"vam\" onChange={() => this.props.onUserChecked(member)}\n                checked={(member.userid in newUsersTempObj) ? 'checked' : ''}></input>}\n          </td>\n          <td><img className=\"avatar\" src={avatar} alt=\"\"></img></td>\n          <td>{member.name}</td>\n          <td>{member.mobile}</td>\n          <td>{member.contact_email}</td>\n          <td>{member.email && <i className=\"sf2-icon-tick\"></i>}</td>\n        </tr>\n      );\n    });\n\n    return (\n      <div className=\"dir-content-main\">\n        {isMembersListLoading && <Loading/>}\n        {!isMembersListLoading && this.props.membersList.length > 0 &&\n          <Table hover>\n            <thead>\n              <tr>\n                <th width=\"5%\">\n                  {canCheckUserIds.length > 0 &&\n                    <input type=\"checkbox\" className=\"vam\" checked={this.props.isCheckedAll}\n                      onChange={() => this.props.onAllUsersChecked()}></input>}\n                </th>\n                <th width=\"10%\"></th>\n                <th width=\"20%\">{'名称'}</th>\n                <th width=\"20%\">{'手机号'}</th>\n                <th width=\"30%\">{'邮箱'}</th>\n                <th width=\"15%\">{'已添加'}</th>\n              </tr>\n            </thead>\n            <tbody>{membersList}</tbody>\n          </Table>\n        }\n        {!isMembersListLoading && this.props.membersList.length === 0 &&\n          <div className=\"message empty-tip text-center\">\n            <img src={`${siteRoot}media/img/member-list-empty-2x.png`} alt=\"\"/>\n            <h4>{'成员列表为空'}</h4>\n          </div>\n        }\n      </div>\n    );\n  }\n}\n\nDingtalkDepartmentMembersList.propTypes = DingtalkDepartmentMembersListPropTypes;\n\nexport default DingtalkDepartmentMembersList;\n","import React, { Component, Fragment } from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { Dropdown, DropdownItem, DropdownMenu, DropdownToggle } from 'reactstrap';\nimport { gettext, isPro } from '../../../utils/constants';\n\nconst DingtalkDepartmentsTreeNodePropTypes = {\n  index: PropTypes.number,\n  department: PropTypes.object.isRequired,\n  isChildrenShow: PropTypes.bool.isRequired,\n  onChangeDepartment: PropTypes.func.isRequired,\n  checkedDepartmentId: PropTypes.number.isRequired,\n  importDepartmentDialogToggle: PropTypes.func.isRequired,\n};\n\nclass DingtalkDepartmentsTreeNode extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      isChildrenShow: false,\n      dropdownOpen: false,\n      active: false,\n    };\n  }\n\n  toggleChildren = (e) => {\n    e.preventDefault();\n    e.stopPropagation();\n    this.setState({\n      isChildrenShow: !this.state.isChildrenShow,\n    });\n  };\n\n  dropdownToggle = (e) => {\n    e.stopPropagation();\n    this.setState({ dropdownOpen: !this.state.dropdownOpen });\n  };\n\n  onMouseEnter = () => {\n    this.setState({ active: true });\n  };\n\n  onMouseLeave = () => {\n    if (this.state.dropdownOpen) return;\n    this.setState({ active: false });\n  };\n\n  importDepartmentDialogToggle = (depart) => {\n    this.setState({ active: false });\n    this.props.importDepartmentDialogToggle(depart);\n  }\n\n  componentDidMount() {\n    if (this.props.index === 0) {\n      this.setState({ isChildrenShow: true });\n      this.props.onChangeDepartment(this.props.department.id);\n    }\n  }\n\n  renderTreeNodes = (departmentsTree) => {\n    if (departmentsTree.length > 0) {\n      return departmentsTree.map((department) => {\n        return (\n          <DingtalkDepartmentsTreeNode\n            key={department.id}\n            department={department}\n            isChildrenShow={this.state.isChildrenShow}\n            onChangeDepartment={this.props.onChangeDepartment}\n            checkedDepartmentId={this.props.checkedDepartmentId}\n            importDepartmentDialogToggle={this.importDepartmentDialogToggle}\n          />\n        );\n      });\n    }\n  };\n\n  changeDept = (departmentID) => {\n    const { department, checkedDepartmentId } = this.props;\n    this.props.onChangeDepartment(departmentID);\n    if (checkedDepartmentId === department.id && !this.state.isChildrenShow) {\n      this.setState({ isChildrenShow: true });\n    }\n  }\n\n  render() {\n    const { isChildrenShow, department, checkedDepartmentId } = this.props;\n    let toggleClass = classNames({\n      'folder-toggle-icon fa fa-caret-down': department.children && this.state.isChildrenShow,\n      'folder-toggle-icon fa fa-caret-right': department.children && !this.state.isChildrenShow,\n    });\n    let nodeInnerClass = classNames({\n      'tree-node-inner': true,\n      'tree-node-inner-hover': this.state.active,\n      'tree-node-hight-light': checkedDepartmentId === department.id\n    });\n    return (\n      <Fragment>\n        {isChildrenShow &&\n          <div\n            className={nodeInnerClass}\n            onClick={() => this.changeDept(department.id)}\n            onMouseEnter={this.onMouseEnter}\n            onMouseLeave={this.onMouseLeave}\n          >\n            <span className=\"tree-node-icon\" onClick={(e) => this.toggleChildren(e)}>\n              <i className={toggleClass}></i>\n            </span>\n            <span className=\"tree-node-text\">{department.name}</span>\n            {isPro &&\n            <Dropdown\n              isOpen={this.state.dropdownOpen}\n              toggle={(e) => this.dropdownToggle(e)}\n              direction=\"down\"\n              style={this.state.active ? {} : { opacity: 0 }}\n            >\n              <DropdownToggle\n                tag='i'\n                className='fa fa-ellipsis-v cursor-pointer attr-action-icon'\n                title={gettext('More Operations')}\n                data-toggle=\"dropdown\"\n                aria-expanded={this.state.dropdownOpen}\n              >\n              </DropdownToggle>\n              <DropdownMenu className=\"drop-list\" right={true}>\n                <DropdownItem\n                  onClick={this.importDepartmentDialogToggle.bind(this, department)}\n                  id={department.id}\n                >{'导入部门'}</DropdownItem>\n              </DropdownMenu>\n            </Dropdown>\n            }\n          </div>\n        }\n        {this.state.isChildrenShow &&\n          <div className=\"department-children\">\n            {department.children && this.renderTreeNodes(department.children)}\n          </div>\n        }\n      </Fragment>\n    );\n  }\n}\n\nDingtalkDepartmentsTreeNode.propTypes = DingtalkDepartmentsTreeNodePropTypes;\n\nexport default DingtalkDepartmentsTreeNode;\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport Loading from '../../../components/loading';\nimport DingtalkDepartmentsTreeNode from './dingtalk-departments-tree-node';\n\nconst DingtalkDepartmentsTreePanelPropTypes = {\n  isTreeLoading: PropTypes.bool.isRequired,\n  departmentsTree: PropTypes.array.isRequired,\n  onChangeDepartment: PropTypes.func.isRequired,\n  checkedDepartmentId: PropTypes.number.isRequired,\n  importDepartmentDialogToggle: PropTypes.func.isRequired,\n};\n\nclass DingtalkDepartmentsTreePanel extends Component {\n\n  constructor(props) {\n    super(props);\n  }\n\n  render() {\n    const { departmentsTree } = this.props;\n    return (\n      <div className=\"dir-content-nav\">\n        <div className=\"tree-view tree\">\n          {this.props.isTreeLoading ?\n            <Loading/> :\n            <div className=\"tree-node\">\n              {departmentsTree.length > 0 && departmentsTree.map((department, index) => {\n                return (\n                  <DingtalkDepartmentsTreeNode\n                    key={department.id}\n                    index={index}\n                    department={department}\n                    isChildrenShow={true}\n                    onChangeDepartment={this.props.onChangeDepartment}\n                    checkedDepartmentId={this.props.checkedDepartmentId}\n                    importDepartmentDialogToggle={this.props.importDepartmentDialogToggle}\n                  />\n                );\n              })}\n            </div>\n          }\n        </div>\n      </div>\n    );\n  }\n}\n\nDingtalkDepartmentsTreePanel.propTypes = DingtalkDepartmentsTreePanelPropTypes;\n\nexport default DingtalkDepartmentsTreePanel;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Button, Modal, ModalHeader, ModalBody, ModalFooter } from 'reactstrap';\nimport Loading from '../loading';\n\nconst propTypes = {\n  importDepartmentDialogToggle: PropTypes.func.isRequired,\n  onImportDepartmentSubmit: PropTypes.func.isRequired,\n  departmentsCount: PropTypes.number.isRequired,\n  membersCount: PropTypes.number.isRequired,\n  departmentName: PropTypes.string.isRequired,\n};\n\nclass ImportDingtalkDepartmentDialog extends React.Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      isLoading : false,\n    };\n  }\n\n  toggle = () => {\n    this.props.importDepartmentDialogToggle(null);\n  };\n\n  handleSubmit = () => {\n    this.props.onImportDepartmentSubmit();\n    this.setState({ isLoading : true });\n  };\n\n  render() {\n    const { departmentsCount, membersCount, departmentName } = this.props;\n    return (\n      <Modal isOpen={true} toggle={this.toggle}>\n        <ModalHeader toggle={this.toggle}>\n          <span>{'导入部门 '}</span><span className=\"op-target\" title={departmentName}>{departmentName}</span>\n        </ModalHeader>\n        <ModalBody>\n          <p>{'将要导入 '}<strong>{departmentsCount}</strong>{' 个部门,其中包括 '}<strong>{membersCount}</strong>{' 个成员'}</p>\n          {this.state.isLoading && <Loading/>}\n        </ModalBody>\n        <ModalFooter>\n          <Button color=\"secondary\" onClick={this.toggle}>{'取消'}</Button>\n          <Button color=\"primary\" onClick={this.handleSubmit}>{'导入'}</Button>\n        </ModalFooter>\n      </Modal>\n    );\n  }\n}\n\nImportDingtalkDepartmentDialog.propTypes = propTypes;\n\nexport default ImportDingtalkDepartmentDialog;\n","import React, { Component, Fragment } from 'react';\nimport { Button } from 'reactstrap';\nimport _ from 'lodash';\nimport { seafileAPI } from '../../utils/seafile-api';\nimport { gettext, siteRoot, isPro } from '../../utils/constants';\nimport { Utils } from '../../utils/utils';\nimport toaster from '../../components/toast';\nimport Account from '../../components/common/account';\nimport { DingtalkDepartmentMembersList, DingtalkDepartmentsTreePanel } from './dingtalk';\nimport ImportDingtalkDepartmentDialog from '../../components/dialog/import-dingtalk-department-dialog';\n\nimport '../../css/work-weixin-departments.css';\nimport '../../css/dingtalk-departments.css';\n\nclass DingtalkDepartments extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      isTreeLoading: true,\n      isMembersListLoading: true,\n      departmentsTree: [],\n      checkedDepartmentId: 0,\n      membersTempObj: {},\n      membersList: [],\n      newUsersTempObj: {},\n      isCheckedAll: false,\n      canCheckUserIds: [],\n      isImportDepartmentDialogShow: false,\n      importDepartment: null,\n      importDepartmentChildrenCount: 0,\n      importDepartmentMembersCount: 0,\n    };\n  }\n\n  getDepartmentsTree = (list) => {\n    let childIds = [];\n    let parentIds = [];\n    for (let i = 0; i < list.length; i++) {\n      if (childIds.indexOf(list[i].id) === -1) {\n        childIds.push(list[i].id);\n      }\n      if (parentIds.indexOf(list[i].parentid) === -1) {\n        parentIds.push(list[i].parentid);\n      }\n    }\n    let intersection = parentIds.filter((v) => {\n      return childIds.indexOf(v) !== -1;\n    });\n    let rootIds = parentIds.concat(intersection).filter((v) => {\n      return parentIds.indexOf(v) === -1 || intersection.indexOf(v) === -1;\n    });\n    let cloneData = _.cloneDeep(list);\n    return cloneData.filter(father => {\n      let branchArr = cloneData.filter(child => father.id === child.parentid);\n      branchArr.length > 0 ? father.children = branchArr : '';\n      return rootIds.indexOf(father.parentid) !== -1;\n    });\n  };\n\n  getDingtalkDepartmentsList = (departmentID) => {\n    seafileAPI.adminListDingtalkDepartments(departmentID).then((res) => {\n      if (!departmentID) {\n        let departmentsTree = this.getDepartmentsTree(res.data.department);\n        this.setState({\n          isTreeLoading: false,\n          departmentsTree: departmentsTree,\n        });\n      } else {\n        this.setState({\n          importDepartmentChildrenCount: res.data.department.length,\n          importDepartmentMembersCount: this.state.membersTempObj[departmentID].length,\n        });\n      }\n    }).catch((error) => {\n      this.handleError(error);\n      this.setState({\n        isTreeLoading: false,\n        isMembersListLoading: false,\n      });\n      if (error.response && error.response.status === 403) {\n        window.location = siteRoot + 'sys/useradmin/';\n      }\n    });\n  };\n\n  getDingtalkDepartmentMembersList = (department_id) => {\n    this.setState({\n      isMembersListLoading: true,\n    });\n    seafileAPI.adminListDingtalkDepartmentMembers(department_id).then((res) => {\n      let membersTempObj = this.state.membersTempObj;\n      membersTempObj[department_id] = res.data.userlist;\n      let canCheckUserIds = this.getCanCheckUserIds(res.data.userlist);\n      this.setState({\n        membersTempObj: membersTempObj,\n        membersList: res.data.userlist,\n        isMembersListLoading: false,\n        canCheckUserIds: canCheckUserIds,\n      });\n    }).catch((error) => {\n      this.setState({isMembersListLoading: false});\n      this.handleError(error);\n    });\n  }\n  getCanCheckUserIds = (membersList) => {\n    let userIds = [];\n    membersList.forEach((member) => {\n      if (!member.email) userIds.push(member.userid);\n    });\n    return userIds;\n  };\n\n  onChangeDepartment = (department_id) => {\n    this.setState({\n      newUsersTempObj: {},\n      isCheckedAll: false,\n      checkedDepartmentId: department_id,\n    });\n    if (!(department_id in this.state.membersTempObj)) {\n      this.getDingtalkDepartmentMembersList(department_id);\n    } else {\n      let canCheckUserIds = this.getCanCheckUserIds(this.state.membersTempObj[department_id]);\n      this.setState({\n        membersList: this.state.membersTempObj[department_id],\n        canCheckUserIds: canCheckUserIds,\n      });\n    }\n  };\n\n  onUserChecked = (user) => {\n    if (this.state.canCheckUserIds.indexOf(user.userid) !== -1) {\n      let newUsersTempObj = this.state.newUsersTempObj;\n      if (user.userid in newUsersTempObj) {\n        delete newUsersTempObj[user.userid];\n        if (this.state.isCheckedAll) {\n          this.setState({ isCheckedAll: false });\n        }\n      } else {\n        newUsersTempObj[user.userid] = user;\n        if (Object.keys(newUsersTempObj).length === this.state.canCheckUserIds.length) {\n          this.setState({ isCheckedAll: true });\n        }\n      }\n      this.setState({ newUsersTempObj: newUsersTempObj });\n    }\n  };\n\n  onAllUsersChecked = () => {\n    this.setState({\n      isCheckedAll: !this.state.isCheckedAll,\n    }, () => {\n      if (this.state.isCheckedAll) {\n        let newUsersTempObj = {};\n        let newUsersTempList = this.state.membersList.filter(user => {\n          return this.state.canCheckUserIds.indexOf(user.userid) !== -1;\n        });\n        for (let i = 0; i < newUsersTempList.length; i++) {\n          newUsersTempObj[newUsersTempList[i].userid] = newUsersTempList[i];\n        }\n        this.setState({ newUsersTempObj: newUsersTempObj });\n      } else {\n        this.setState({ newUsersTempObj: {} });\n      }\n    });\n  };\n\n  onSubmit = () => {\n    const { newUsersTempObj } = this.state;\n    if (JSON.stringify(newUsersTempObj) === '{}') return;\n    let userList = [];\n    for (let i in newUsersTempObj) {\n      userList.push(newUsersTempObj[i]);\n    }\n    if (userList.length === 0) {\n      toaster.danger('未选择成员', {duration: 3});\n      return;\n    }\n    seafileAPI.adminAddDingtalkUsersBatch(userList).then((res) => {\n      this.setState({\n        newUsersTempObj: {},\n        isCheckedAll: false,\n      });\n      if (res.data.success) {\n        this.handleSubmitSuccess(res.data.success);\n      }\n      if (res.data.failed) {\n        const fails= res.data.failed;\n        for (let i = 0; i < fails.length; i++) {\n          toaster.danger(fails[i].name + ' ' + fails[i].error_msg, {duration: 3});\n        }\n      }\n    }).catch((error) => {\n      this.handleError(error);\n    });\n\n  };\n\n  handleSubmitSuccess = (success) => {\n    let { membersTempObj, membersList, canCheckUserIds } = this.state;\n    for (let i = 0; i < success.length; i++) {\n      let { userid, name, email } = success[i];\n      toaster.success(name + ' 成功导入', {duration: 1});\n      // refresh all temp\n      if (canCheckUserIds.indexOf(userid) !== -1) {\n        canCheckUserIds.splice(canCheckUserIds.indexOf(userid), 1);\n      }\n      for (let j = 0; j < membersList.length; j++) {\n        if (membersList[j].userid === userid) {\n          membersList[j].email = email;\n          break;\n        }\n      }\n      for (let departmentId in membersTempObj) {\n        for (let k = 0; k < membersTempObj[departmentId].length; k++) {\n          if (membersTempObj[departmentId][k].userid === userid) {\n            membersTempObj[departmentId][k].email = email;\n            break;\n          }\n        }\n      }\n    }\n    this.setState({\n      membersTempObj: membersTempObj,\n      membersList: membersList,\n      canCheckUserIds: canCheckUserIds,\n    });\n  }\n\n  importDepartmentDialogToggle = (importDepartment) => {\n    this.setState({\n      isImportDepartmentDialogShow: !this.state.isImportDepartmentDialogShow,\n      importDepartment: importDepartment,\n    }, () => {\n      if (importDepartment) {\n        this.getDingtalkDepartmentsList(importDepartment.id);\n      }\n    });\n  };\n\n  onImportDepartmentSubmit = () => {\n    let importDepartment = this.state.importDepartment;\n    if (!importDepartment) return;\n    seafileAPI.adminImportDingtalkDepartment(importDepartment.id).then((res) => {\n      this.setState({\n        isMembersListLoading: true,\n        checkedDepartmentId: importDepartment.id,\n        membersTempObj: {},\n        membersList: [],\n        newUsersTempObj: {},\n        isCheckedAll: false,\n        canCheckUserIds: [],\n      });\n      this.getDingtalkDepartmentMembersList(importDepartment.id);\n      this.importDepartmentDialogToggle(null);\n      if (res.data.success) {\n        this.handleImportDepartmentSubmitSuccess(res.data.success);\n      }\n      if (res.data.failed) {\n        this.handleImportDepartmentSubmitFailed(res.data.failed);\n      }\n    }).catch((error) => {\n      this.handleError(error);\n    });\n  };\n\n  handleImportDepartmentSubmitSuccess = (successes) => {\n    for (let i = 0, len = successes.length; i < len; i++) {\n      let success = successes[i];\n      let successMsg = success.type === 'department' ? '部门 ' + success.department_name + ' 导入成功' : success.api_user_name + ' 导入成功' ;\n      toaster.success(successMsg, { duration: 3 });\n    }\n  };\n\n  handleImportDepartmentSubmitFailed = (fails) => {\n    for (let i = 0, len = fails.length; i < len; i++) {\n      let fail = fails[i];\n      let failName = fail.type === 'department' ? fail.department_name : fail.api_user_name;\n      toaster.danger(failName + ' ' + fail.msg, { duration: 3} );\n    }\n  };\n\n  handleError = (error) => {\n    const errorMsg = Utils.getErrorMsg(error);\n    toaster.danger(errorMsg);\n  }\n\n  componentDidMount() {\n    this.getDingtalkDepartmentsList(null);\n  }\n\n  renderNav() {\n    const btnClass = 'btn btn-secondary operation-item ';\n    return (\n      <div className=\"main-panel-north border-left-show\">\n        <div className=\"cur-view-toolbar\">\n          <span className=\"sf2-icon-menu side-nav-toggle hidden-md-up d-md-none\" title=\"Side Nav Menu\"></span>\n          <Button className={btnClass + 'my-1 d-md-none'} onClick={this.onSubmit}>{'导入用户'}</Button>\n          <Button className={btnClass + 'hidden-md-up'} onClick={this.onSubmit}>{'导入用户'}</Button>\n        </div>\n        <div className=\"common-toolbar\">\n          <Account isAdminPanel={true}/>\n        </div>\n      </div>\n    );\n  }\n\n  render() {\n    const { isImportDepartmentDialogShow, isTreeLoading, importDepartment, importDepartmentChildrenCount, importDepartmentMembersCount } = this.state;\n    let canImportDepartment = !!(isPro && isImportDepartmentDialogShow && !isTreeLoading && importDepartment);\n    return (\n      <Fragment>\n        {this.renderNav()}\n        <div className=\"main-panel-center\">\n          <div className=\"cur-view-container\">\n            <div className=\"cur-view-path\">\n              <h3 className=\"sf-heading\">{'钉钉集成'}</h3>\n            </div>\n            <div className=\"cur-view-content d-flex flex-row\">\n              <DingtalkDepartmentsTreePanel\n                departmentsTree={this.state.departmentsTree}\n                isTreeLoading={this.state.isTreeLoading}\n                onChangeDepartment={this.onChangeDepartment}\n                checkedDepartmentId={this.state.checkedDepartmentId}\n                importDepartmentDialogToggle={this.importDepartmentDialogToggle}\n              />\n              <div className=\"dir-content-resize\"></div>\n              <DingtalkDepartmentMembersList\n                isMembersListLoading={this.state.isMembersListLoading}\n                membersList={this.state.membersList}\n                checkedDepartmentId={this.state.checkedDepartmentId}\n                newUsersTempObj={this.state.newUsersTempObj}\n                onUserChecked={this.onUserChecked}\n                onAllUsersChecked={this.onAllUsersChecked}\n                isCheckedAll={this.state.isCheckedAll}\n                canCheckUserIds={this.state.canCheckUserIds}\n              />\n            </div>\n          </div>\n        </div>\n        {canImportDepartment &&\n          <ImportDingtalkDepartmentDialog\n            importDepartmentDialogToggle={this.importDepartmentDialogToggle}\n            onImportDepartmentSubmit={this.onImportDepartmentSubmit}\n            departmentsCount={importDepartmentChildrenCount}\n            membersCount={importDepartmentMembersCount}\n            departmentName={importDepartment.name}\n          />\n        }\n      </Fragment>\n    );\n  }\n}\n\nexport default DingtalkDepartments;\n","import React, { Component, Fragment } from 'react';\nimport { Button } from 'reactstrap';\nimport moment from 'moment';\nimport { Utils } from '../../../utils/utils';\nimport { seafileAPI } from '../../../utils/seafile-api';\nimport { gettext } from '../../../utils/constants';\nimport toaster from '../../../components/toast';\nimport EmptyTip from '../../../components/empty-tip';\nimport Loading from '../../../components/loading';\nimport Paginator from '../../../components/paginator';\nimport OpMenu from '../../../components/dialog/op-menu';\nimport MainPanelTopbar from '../main-panel-topbar';\nimport UserLink from '../user-link';\n\nclass Content extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      isItemFreezed: false\n    };\n  }\n\n  onFreezedItem = () => {\n    this.setState({isItemFreezed: true});\n  }\n\n  onUnfreezedItem = () => {\n    this.setState({isItemFreezed: false});\n  }\n\n  getPreviousPage = () => {\n    this.props.getItemsByPage(this.props.currentPage - 1);\n  }\n\n  getNextPage = () => {\n    this.props.getItemsByPage(this.props.currentPage + 1);\n  }\n\n  render() {\n    const { loading, errorMsg, items, pageInfo, curPerPage, hasNextPage, currentPage } = this.props;\n    if (loading) {\n      return <Loading />;\n    } else if (errorMsg) {\n      return <p className=\"error text-center mt-4\">{errorMsg}</p>;\n    } else {\n      const emptyTip = (\n        <EmptyTip>\n          <h2>{gettext('No invitations')}</h2>\n        </EmptyTip>\n      );\n\n      const table = (\n        <Fragment>\n          <table>\n            <thead>\n              <tr>\n                <th width=\"20%\">{gettext('Inviter')}</th>\n                <th width=\"20%\">{gettext('Accepter')}</th>\n                <th width=\"9%\">{gettext('Type')}</th>\n                <th width=\"14%\">{gettext('Invited at')}</th>\n                <th width=\"14%\">{gettext('Accepted at')}</th>\n                <th width=\"18%\">{gettext('Expired at')}</th>\n                <th width=\"5%\"></th>\n              </tr>\n            </thead>\n            <tbody>\n              {items.map((item, index) => {\n                return (<Item\n                  key={index}\n                  item={item}\n                  isItemFreezed={this.state.isItemFreezed}\n                  onFreezedItem={this.onFreezedItem}\n                  onUnfreezedItem={this.onUnfreezedItem}\n                  deleteItem={this.props.deleteItem}\n                />);\n              })}\n            </tbody>\n          </table>\n          <Paginator\n            gotoPreviousPage={this.getPreviousPage}\n            gotoNextPage={this.getNextPage}\n            currentPage={currentPage}\n            hasNextPage={hasNextPage}\n            curPerPage={curPerPage}\n            resetPerPage={this.props.resetPerPage}\n          />\n        </Fragment>\n      );\n\n      return items.length ? table : emptyTip;\n    }\n  }\n}\n\nclass Item extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      isOpIconShown: false,\n      highlight: false\n    };\n  }\n\n  handleMouseEnter = () => {\n    if (!this.props.isItemFreezed) {\n      this.setState({\n        isOpIconShown: true,\n        highlight: true\n      });\n    }\n  }\n\n  handleMouseLeave = () => {\n    if (!this.props.isItemFreezed) {\n      this.setState({\n        isOpIconShown: false,\n        highlight: false\n      });\n    }\n  }\n\n  onUnfreezedItem = () => {\n    this.setState({\n      highlight: false,\n      isOpIconShow: false\n    });\n    this.props.onUnfreezedItem();\n  }\n\n  deleteItem = () => {\n    this.props.deleteItem(this.props.item);\n  }\n\n  translateOperations = (item) => {\n    let translateResult = '';\n    switch (item) {\n      case 'Delete':\n        translateResult = gettext('Delete');\n        break;\n    }\n    return translateResult;\n  }\n\n  onMenuItemClick = (operation) => {\n    switch(operation) {\n      case 'Delete':\n        this.deleteItem();\n        break;\n      default:\n        break;\n    }\n  }\n\n  getInviteTypeText = () => {\n    let translateResult = '';\n    switch (this.props.item.invite_type) {\n      case 'Guest':\n        translateResult = gettext('Guest');\n        break;\n    }\n    return translateResult;\n  }\n\n  render() {\n    const { item } = this.props;\n    const {\n      isOpIconShown\n    } = this.state;\n\n    return (\n      <Fragment>\n        <tr className={this.state.highlight ? 'tr-highlight' : ''} onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave}>\n          <td>\n            <UserLink email={item.inviter_email} name={item.inviter_name} />\n          </td>\n          <td>\n            {item.accept_time ?\n              <UserLink email={item.accepter_email} name={item.accepter_name} /> :\n              item.accepter_email\n            }\n          </td>\n          <td>{this.getInviteTypeText()}</td>\n          <td>\n            <span title={moment(item.invite_time).format('llll')}>{moment(item.invite_time).fromNow()}</span>\n          </td>\n          <td>\n            {item.accept_time ?\n              <span title={moment(item.accept_time).format('llll')}>{moment(item.accept_time).fromNow()}</span> :\n              '--'\n            }\n          </td>\n          <td>\n            {item.is_expired ?\n              <span className=\"text-red\">{moment(item.expire_time).format('YYYY-MM-DD HH:mm')}</span> :\n              moment(item.expire_time).format('YYYY-MM-DD HH:mm')\n            }\n          </td>\n          <td>\n            {isOpIconShown &&\n            <OpMenu\n              operations={['Delete']}\n              translateOperations={this.translateOperations}\n              onMenuItemClick={this.onMenuItemClick}\n              onFreezedItem={this.props.onFreezedItem}\n              onUnfreezedItem={this.onUnfreezedItem}\n            />\n            }\n          </td>\n        </tr>\n      </Fragment>\n    );\n  }\n}\n\n\nclass Invitations extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      loading: true,\n      errorMsg: '',\n      items: [],\n      totalItemCount: 0,\n      hasNextPage: false,\n      currentPage: 1,\n      perPage: 25\n    };\n  }\n\n  componentDidMount () {\n    let urlParams = (new URL(window.location)).searchParams;\n    const { currentPage, perPage } = this.state;\n    this.setState({\n      perPage: parseInt(urlParams.get('per_page') || perPage),\n      currentPage: parseInt(urlParams.get('page') || currentPage)\n    }, () => {\n      this.getItemsByPage(this.state.currentPage);\n    });\n  }\n\n  getItemsByPage = (page) => {\n    let { perPage } = this.state;\n    seafileAPI.sysAdminListInvitations(page, perPage).then(res => {\n      this.setState({\n        loading: false,\n        items: res.data.invitation_list,\n        hasNextPage: Utils.hasNextPage(page, perPage, res.data.total_count),\n        currentPage: page\n      });\n    }).catch((error) => {\n      this.setState({\n        loading: false,\n        errorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403\n      });\n    });\n  }\n\n  deleteItem = (targetItem) => {\n    const token = targetItem.token;\n    seafileAPI.sysAdminDeleteInvitation(token).then(res => {\n      let items = this.state.items.filter(item => {\n        return item.token != token;\n      });\n      this.setState({items: items});\n      toaster.success(gettext('Successfully deleted 1 item.'));\n    }).catch((error) => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  deleteItemInBatch = () => {\n    seafileAPI.sysAdminDeleteExpiredInvitations().then(res => {\n      const prevItems = this.state.items;\n      const items = this.state.items.filter(item => !item.is_expired || item.accept_time);\n      if (items.length < prevItems.length) {\n        this.setState({\n          items: items\n        });\n        toaster.success(gettext('Operation succeeded.'));\n      }\n    }).catch((error) => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  resetPerPage = (perPage) => {\n    this.setState({\n      perPage: perPage\n    }, () => {\n      this.getItemsByPage(1);\n    });\n  }\n\n  render() {\n    return (\n      <Fragment>\n        <MainPanelTopbar>\n          <Button className=\"btn btn-secondary operation-item\" onClick={this.deleteItemInBatch}>{gettext('Delete Expired Invitations')}</Button>\n        </MainPanelTopbar>\n        <div className=\"main-panel-center flex-row\">\n          <div className=\"cur-view-container\">\n            <div className=\"cur-view-path\">\n              <h3 className=\"sf-heading\">{gettext('Invitations')}</h3>\n            </div>\n            <div className=\"cur-view-content\">\n              <Content\n                loading={this.state.loading}\n                errorMsg={this.state.errorMsg}\n                items={this.state.items}\n                currentPage={this.state.currentPage}\n                hasNextPage={this.state.hasNextPage}\n                curPerPage={this.state.perPage}\n                resetPerPage={this.resetPerPage}\n                getItemsByPage={this.getItemsByPage}\n                deleteItem={this.deleteItem}\n              />\n            </div>\n          </div>\n        </div>\n      </Fragment>\n    );\n  }\n}\n\nexport default Invitations;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Modal, ModalHeader, ModalBody } from 'reactstrap';\nimport { SimpleEditor } from '@seafile/seafile-editor';\nimport { gettext } from '../../utils/constants';\n\nconst propTypes = {\n  title: PropTypes.string,\n  content: PropTypes.string,\n  onCommit: PropTypes.func.isRequired,\n  onCloseEditorDialog: PropTypes.func.isRequired,\n};\n\nclass TermsEditorDialog extends React.Component {\n\n  static defaultProps = {\n    title: gettext('Terms'),\n  }\n\n  onKeyDown = (event) => {\n    event.stopPropagation();\n  }\n\n  toggle = () => {\n    if (this.isContentChanged()) {\n      let currentContent = this.getCurrentContent();\n      this.props.onCommit(currentContent);\n    }\n    this.props.onCloseEditorDialog();\n  }\n\n  isContentChanged = () => {\n    return this.simpleEditor.hasContentChange();\n  }\n\n  getCurrentContent = () => {\n    let markdownContent = this.simpleEditor.getMarkdown();\n    return markdownContent;\n  }\n\n  setSimpleEditorRef = (editor) => {\n    this.simpleEditor = editor;\n  }\n\n  render() {\n    let { content, title } = this.props;\n    return (\n      <Modal\n        isOpen={true}\n        toggle={this.toggle}\n        onKeyDown={this.onKeyDown}\n        wrapClassName={'conditions-editor-dialog-wrapper'}\n        className={'conditions-editor-dialog'}\n        contentClassName={'conditions-editor-dialog-content'}\n        size={'lg'}\n        style={{width: 770}}\n      >\n        <ModalHeader className=\"conditions-editor-dialog-title\" toggle={this.toggle}>{title}</ModalHeader>\n        <ModalBody className={'conditions-editor-dialog-main'}>\n          <SimpleEditor\n            onRef={this.setSimpleEditorRef.bind(this)}\n            value={content || ''}\n          />\n        </ModalBody>\n      </Modal>\n    );\n  }\n}\n\nTermsEditorDialog.propTypes = propTypes;\n\nexport default TermsEditorDialog;\n","import React, {Fragment} from 'react';\nimport PropTypes from 'prop-types';\nimport { Button, Modal, ModalHeader, ModalBody, ModalFooter, Input, Alert, FormGroup, Label } from 'reactstrap';\nimport { gettext } from '../../../utils/constants';\nimport TermsPreviewWidget from '../../terms-preview-widget';\nimport TermsEditorDialog from '../terms-editor-dialog';\n\nimport '../../../css/terms-conditions-editor.css';\n\nconst propTypes = {\n  isUpdate: PropTypes.bool,\n  oldTermObj: PropTypes.object,\n  addTerm: PropTypes.func,\n  updateTerm: PropTypes.func,\n  toggle: PropTypes.func.isRequired,\n};\n\nclass AddOrUpdateTermDialog extends React.Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      name: '',\n      versionNumber: '',\n      text: '',\n      isActive: true,\n      errorMsg: '',\n      isConditionsEditorDialogShow: false,\n    };\n  }\n\n  componentDidMount() {\n    let oldTermObj = this.props.oldTermObj;\n    if (oldTermObj) {\n      this.setState({\n        name: oldTermObj.name,\n        versionNumber: oldTermObj.version_number,\n        text: oldTermObj.text,\n        isActive: !(oldTermObj.activate_time === ''),\n      });\n    }\n  }\n\n  handleNameChange = (e) => {\n    this.setState({name: e.target.value.trim()});\n  }\n\n  handleVersionNumberChange = (e) => {\n    this.setState({versionNumber: e.target.value.trim()});\n  }\n\n  handleTextChange = (e) => {\n    this.setState({text: e.target.value.trim()});\n  }\n\n  setActive = () => {\n    this.setState({isActive: true});\n  }\n\n  setInActive = () => {\n    this.setState({isActive: false});\n  }\n\n  addTerm = () => {\n    let { name, versionNumber, text, isActive } = this.state;\n    if (name === '') {\n      this.setState({errMsg: gettext('Name is required.')});\n      return;\n    }\n    if (versionNumber === '') {\n      this.setState({errMsg: gettext('Version Number is required.')});\n      return;\n    }\n    if (isNaN(versionNumber)) {\n      this.setState({errMsg: gettext('Version Number must be a number.')});\n      return;\n    }\n    if (text === '') {\n      this.setState({errMsg: gettext('Text is required.')});\n      return;\n    }\n    if (this.props.isUpdate) {\n      this.props.updateTerm(name, versionNumber, text, isActive);\n    } else {\n      this.props.addTerm(name, versionNumber, text, isActive);\n    }\n  }\n\n  onContentClick = () => {\n    this.setState({isConditionsEditorDialogShow: !this.state.isConditionsEditorDialogShow});\n  }\n\n  onCloseEditorDialog = () => {\n    this.setState({isConditionsEditorDialogShow: false});\n  }\n\n  onUpdateContent = (content) => {\n    this.setState({ text: content });\n  }\n\n  render() {\n    let title = this.props.isUpdate ? gettext('Update Terms and Conditions') : gettext('Add Terms and Conditions');\n    return (\n      <Fragment>\n        <Modal isOpen={true} toggle={this.props.toggle}>\n          <ModalHeader toggle={this.props.toggle}>{title}</ModalHeader>\n          <ModalBody>\n            <FormGroup>\n              <Label for=\"name\">{gettext('Name')}</Label>\n              <Input id=\"name\" value={this.state.name} onChange={this.handleNameChange}/>\n            </FormGroup>\n            <FormGroup>\n              <Label>{gettext('Version Number')}</Label>\n              <Input value={this.state.versionNumber} onChange={this.handleVersionNumberChange}/>\n            </FormGroup>\n            <FormGroup className=\"form-content\">\n              <Label>{gettext('Text')}</Label>\n              <TermsPreviewWidget content={this.state.text} onContentClick={this.onContentClick}/>\n            </FormGroup>\n            <FormGroup tag=\"fieldset\">\n              <Label>{gettext('Activated')}</Label>\n              <FormGroup check>\n                <Label check>\n                  <Input type=\"radio\" checked={this.state.isActive} onChange={this.setActive} />\n                  {' '}{gettext('On')}\n                </Label>\n              </FormGroup>\n              <FormGroup check>\n                <Label check>\n                  <Input type=\"radio\" checked={!this.state.isActive} onChange={this.setInActive} />\n                  {' '}{gettext('Off')}\n                </Label>\n              </FormGroup>\n            </FormGroup>\n            {this.state.errMsg && <Alert color=\"danger\">{this.state.errMsg}</Alert>}\n          </ModalBody>\n          <ModalFooter>\n            <Button color=\"primary\" onClick={this.addTerm}>{gettext('Submit')}</Button>\n          </ModalFooter>\n        </Modal>\n        {this.state.isConditionsEditorDialogShow && (\n          <TermsEditorDialog\n            content={this.state.text}\n            onCommit={this.onUpdateContent}\n            onCloseEditorDialog={this.onCloseEditorDialog}\n          />\n        )}\n      </Fragment>\n    );\n  }\n}\n\nAddOrUpdateTermDialog.propTypes = propTypes;\n\nexport default AddOrUpdateTermDialog;\n","const hrefReg = /\\[.+\\]\\(\\S+\\)|<img src=(\\S+).+\\/>|!\\[\\]\\(\\S+\\)|<\\S+>/g,\n  imageReg1 = /^<img src=\"(\\S+)\" .+\\/>/,\n  imageReg2 = /^!\\[\\]\\((\\S+)\\)/,\n  linkReg1 = /^\\[.+\\]\\(\\S+\\)/,\n  linkReg2 = /^<\\S+>$/;\n\nconst getLinks = (hrefs) => {\n  const hrefObj = {\n    links: [],\n    images: []\n  };\n  hrefs.forEach((href) => {\n    if (href.search(linkReg1) >= 0 || href.search(linkReg2) >= 0) {\n      hrefObj.links.push(href);\n    } else {\n      let imageSrcs = href.match(imageReg1);\n      let imageSrcs1 = href.match(imageReg2);\n      if (imageSrcs) {\n        hrefObj.images.push(imageSrcs[1]);\n      } else if (imageSrcs1) {\n        hrefObj.images.push(imageSrcs1[1]);\n      }\n    }\n  });\n  return hrefObj;\n};\n\n\nconst getPreviewContent = (markdownContent) => {\n  let previewText = '';\n  let newMarkdownContent = markdownContent.replace(hrefReg, '');\n  for (let index = 0; index < newMarkdownContent.length; index++) {\n    if (newMarkdownContent[index] === '#') {\n      continue;\n    } else if (newMarkdownContent[index] === '\\n') {\n      previewText += ' ';\n    } else {\n      previewText += newMarkdownContent[index];\n    }\n    if (previewText.length === 30) {\n      break;\n    }\n  }\n\n  const hrefs = markdownContent.match(hrefReg);\n  if (hrefs) {\n    const { images, links } = getLinks(hrefs);\n    return { previewText, images, links };\n  }\n  return { previewText, images: [], links: [] };\n};\n\n\nexport default getPreviewContent;","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Modal, ModalHeader, ModalBody } from 'reactstrap';\nimport TermsPreviewWidget from '../terms-preview-widget';\nimport { gettext } from '../../utils/constants';\n\nconst propTypes = {\n  title: PropTypes.string,\n  content: PropTypes.string,\n  onClosePreviewDialog: PropTypes.func.isRequired,\n};\n\nclass TermsPreviewDialog extends React.Component {\n\n  static defaultProps = {\n    title: gettext('Terms'),\n  }\n\n\n  toggle = () => {\n    this.props.onClosePreviewDialog();\n  }\n\n  render() {\n    let { title, content } = this.props;\n    return (\n      <Modal\n        isOpen={true}\n        size={'lg'}\n        style={{width: 600}}\n        wrapClassName={'conditions-perview-wrapper'}\n        toggle={this.toggle}\n      >\n        <ModalHeader toggle={this.toggle}>{title}</ModalHeader>\n        <ModalBody>\n          <TermsPreviewWidget content={content} />\n        </ModalBody>\n      </Modal>\n    );\n  }\n}\n\nTermsPreviewDialog.propTypes = propTypes;\n\nexport default TermsPreviewDialog;\n","import React, { Component, Fragment } from 'react';\nimport PropTypes from 'prop-types';\nimport moment from 'moment';\nimport { processor } from '@seafile/seafile-editor/dist/utils/seafile-markdown2html';\nimport { gettext } from '../../../utils/constants';\nimport { Utils } from '../../../utils/utils';\nimport getPreviewContent from '../../../utils/markdown-utils';\nimport AddOrUpdateTermDialog from '../../../components/dialog/sysadmin-dialog/sysadmin-add-or-update-term-dialog';\nimport CommonOperationConfirmationDialog from '../../../components/dialog/common-operation-confirmation-dialog';\nimport TermsPerviewDialog from '../../../components/dialog/terms-preview-dialog';\nimport ModalPortal from '../../../components/modal-portal';\nimport OpMenu from '../../../components/dialog/op-menu';\n\nconst propsTypes = {\n  item: PropTypes.object.isRequired,\n  isItemFreezed: PropTypes.bool.isRequired,\n  onFreezedItem: PropTypes.func.isRequired,\n  onUnfreezedItem: PropTypes.func.isRequired,\n  deleteTerm: PropTypes.func.isRequired,\n  updateTerm: PropTypes.func.isRequired,\n};\n\nclass Item extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      itemContent: '...',\n      isOpIconShown: false,\n      isUpdateDialogOpen: false,\n      isDeleteDialogOpen: false,\n      isTermsPerviewDialogOpen: false,\n    };\n  }\n\n  componentDidMount() {\n    let mdFile = this.props.item.text;\n    processor.process(mdFile).then((result) => {\n      let innerHtml = String(result);\n      this.setState({itemContent: innerHtml});\n    });\n  }\n\n  componentWillReceiveProps(nextProps) {\n    if (nextProps.item.text !== this.props.item.text) {\n      let mdFile = nextProps.item.text;\n      processor.process(mdFile).then((result) => {\n        let innerHtml = String(result);\n        this.setState({itemContent: innerHtml});\n      });\n    }\n  }\n\n  handleMouseEnter = () => {\n    if (!this.props.isItemFreezed) {\n      this.setState({\n        isOpIconShown: true,\n        highlight: true\n      });\n    }\n  }\n\n  handleMouseLeave = () => {\n    if (!this.props.isItemFreezed) {\n      this.setState({\n        isOpIconShown: false,\n        highlight: false\n      });\n    }\n  }\n\n  toggleUpdateDialog = (e) => {\n    this.setState({isUpdateDialogOpen: !this.state.isUpdateDialogOpen});\n  }\n\n  toggleDeleteDialog = (e) => {\n    this.setState({isDeleteDialogOpen: !this.state.isDeleteDialogOpen});\n  }\n\n  toggleTermsContentDialog = (e) => {\n    this.setState({isTermsPerviewDialogOpen: !this.state.isTermsPerviewDialogOpen});\n  }\n\n  onMenuItemClick = (operation) => {\n    switch(operation) {\n      case 'Update':\n        this.toggleUpdateDialog();\n        break;\n      case 'Delete':\n        this.toggleDeleteDialog();\n        break;\n    }\n  }\n\n  onUnfreezedItem = () => {\n    this.setState({\n      highlight: false,\n      isOpIconShow: false\n    });\n    this.props.onUnfreezedItem();\n  }\n\n  deleteTerm = () => {\n    this.props.deleteTerm(this.props.item.id);\n    this.toggleDeleteDialog();\n  }\n\n  updateTerm = (name, versionNumber, text, isActive) => {\n    this.props.updateTerm(this.props.item.id, name, versionNumber, text, isActive);\n    this.toggleUpdateDialog();\n  }\n\n  translateOperations = (item) => {\n    let translateResult = '';\n    switch(item) {\n      case 'Update':\n        translateResult = gettext('Update');\n        break;\n      case 'Delete':\n        translateResult = gettext('Delete');\n        break;\n      default:\n        break;\n    }\n\n    return translateResult;\n  }\n\n  render() {\n    let { item } = this.props;\n    let { isDeleteDialogOpen, isUpdateDialogOpen, isTermsPerviewDialogOpen } = this.state;\n    let previewContent = getPreviewContent(item.text);\n    let itemName = '<span class=\"op-target\">' + Utils.HTMLescape(item.name) + '</span>';\n    let deleteDialogMsg = gettext('Are you sure you want to delete {placeholder} ?').replace('{placeholder}', itemName);\n    return (\n      <Fragment>\n        <tr onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave}>\n          <td>{item.name}</td>\n          <td>{item.version_number}</td>\n          <td className=\"ellipsis\">\n            <a href='#' onClick={this.toggleTermsContentDialog}>{previewContent.previewText}</a>\n          </td>\n          <td>{moment(item.ctime).fromNow()}</td>\n          <td>{item.activate_time ? moment(item.activate_time).fromNow() : '--'}</td>\n          <td>\n            {this.state.isOpIconShown &&\n              <OpMenu\n                operations={['Update', 'Delete']}\n                translateOperations={this.translateOperations}\n                onMenuItemClick={this.onMenuItemClick}\n                onFreezedItem={this.props.onFreezedItem}\n                onUnfreezedItem={this.onUnfreezedItem}\n              />\n            }\n          </td>\n        </tr>\n        {isDeleteDialogOpen &&\n          <ModalPortal>\n            <CommonOperationConfirmationDialog\n              title={gettext('Delete T&C')}\n              message={deleteDialogMsg}\n              toggleDialog={this.toggleDeleteDialog}\n              executeOperation={this.deleteTerm}\n              confirmBtnText={gettext('Delete')}\n            />\n          </ModalPortal>\n        }\n        {isUpdateDialogOpen &&\n          <ModalPortal>\n            <AddOrUpdateTermDialog\n              updateTerm={this.updateTerm}\n              toggle={this.toggleUpdateDialog}\n              isUpdate={true}\n              oldTermObj={item}\n            />\n          </ModalPortal>\n        }\n        {isTermsPerviewDialogOpen &&\n          <ModalPortal>\n            <TermsPerviewDialog\n              content={item.text}\n              onClosePreviewDialog={this.toggleTermsContentDialog}\n            />\n          </ModalPortal>\n        }\n      </Fragment>\n    );\n  }\n}\n\nItem.propTypes = propsTypes;\n\nexport default Item;\n","import React, { Component, Fragment } from 'react';\nimport PropTypes from 'prop-types';\nimport { gettext } from '../../../utils/constants';\nimport EmptyTip from '../../../components/empty-tip';\nimport Loading from '../../../components/loading';\nimport Item from './item';\n\nconst propTypes = {\n  loading: PropTypes.bool.isRequired,\n  items: PropTypes.array.isRequired,\n  errorMsg: PropTypes.string,\n  deleteTerm: PropTypes.func.isRequired,\n  updateTerm: PropTypes.func.isRequired,\n};\n\nclass Content extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      isItemFreezed: false\n    };\n  }\n\n  onFreezedItem = () => {\n    this.setState({isItemFreezed: true});\n  }\n\n  onUnfreezedItem = () => {\n    this.setState({isItemFreezed: false});\n  }\n\n  render() {\n    const { loading, errorMsg, items } = this.props;\n    if (loading) {\n      return <Loading />;\n    } else if (errorMsg) {\n      return <p className=\"error text-center\">{errorMsg}</p>;\n    } else {\n      const emptyTip = (\n        <EmptyTip>\n          <h2>{gettext('No terms and conditions')}</h2>\n        </EmptyTip>\n      );\n      const table = (\n        <Fragment>\n          <table className=\"table-hover\">\n            <thead>\n              <tr>\n                <th width=\"20%\">{gettext('Name')}</th>\n                <th width=\"10%\">{gettext('Version')}</th>\n                <th width=\"25%\">{gettext('Text')}</th>\n                <th width=\"20%\">{gettext('Created')}</th>\n                <th width=\"20%\">{gettext('Activated')}</th>\n                <th width=\"5%\">{/* operation */}</th>\n              </tr>\n            </thead>\n            {items &&\n              <tbody>\n                {items.map((item, index) => {\n                  return (<Item\n                    key={index}\n                    item={item}\n                    isItemFreezed={this.state.isItemFreezed}\n                    onFreezedItem={this.onFreezedItem}\n                    onUnfreezedItem={this.onUnfreezedItem}\n                    deleteTerm={this.props.deleteTerm}\n                    updateTerm={this.props.updateTerm}\n                  />);\n                })}\n              </tbody>\n            }\n          </table>\n        </Fragment>\n      );\n      return items.length ? table : emptyTip;\n    }\n  }\n}\n\nContent.propTypes = propTypes;\n\nexport default Content;\n\n","import React, { Component, Fragment } from 'react';\nimport { Button } from 'reactstrap';\nimport { Utils } from '../../../utils/utils';\nimport { seafileAPI } from '../../../utils/seafile-api';\nimport { gettext } from '../../../utils/constants';\nimport AddOrUpdateTermDialog from '../../../components/dialog/sysadmin-dialog/sysadmin-add-or-update-term-dialog';\nimport ModalPortal from '../../../components/modal-portal';\nimport toaster from '../../../components/toast';\nimport MainPanelTopbar from '../main-panel-topbar';\nimport Content from './content';\n\nclass TermsAndConditions extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      loading: true,\n      errorMsg: '',\n      termList: [],\n      isAddTermDialogOpen: false,\n    };\n  }\n\n  toggleAddTermDialog = () => {\n    this.setState({isAddTermDialogOpen: !this.state.isAddTermDialogOpen});\n  }\n\n  componentDidMount () {\n    seafileAPI.sysAdminListTermsAndConditions().then((res) => {\n      this.setState({\n        termList: res.data.term_and_condition_list,\n        loading: false,\n      });\n    }).catch((error) => {\n      this.setState({\n        loading: false,\n        errorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403\n      });\n    });\n  }\n\n  addTerm = (name, versionNumber, text, isActive) => {\n    seafileAPI.sysAdminAddTermAndCondition(name, versionNumber, text, isActive).then(res => {\n      // After adding the terms, you need to refresh the page.\n      location.reload();\n    }).catch((error) => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  updateTerm = (termID, name, versionNumber, text, isActive) => {\n    seafileAPI.sysAdminUpdateTermAndCondition(termID, name, versionNumber, text, isActive).then(res => {\n      let termList = this.state.termList.map(item => {\n        if (item.id == termID) {\n          return res.data;\n        } else {\n          return item;\n        }\n      });\n      this.setState({termList: termList});\n      toaster.success(gettext('Update succeeded.'));\n    }).catch((error) => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  deleteTerm = (termID) => {\n    seafileAPI.sysAdminDeleteTermAndCondition(termID).then(res => {\n      let termList = this.state.termList.filter(item => item.id != termID);\n      this.setState({termList: termList});\n      toaster.success(gettext('Successfully deleted 1 item.'));\n    }).catch((error) => {\n      let errMessage = Utils.getErrorMsg(error);\n      toaster.danger(errMessage);\n    });\n  }\n\n  render() {\n    let { termList, isAddTermDialogOpen } = this.state;\n    return (\n      <Fragment>\n        <MainPanelTopbar>\n          <Button className=\"btn btn-secondary operation-item\" onClick={this.toggleAddTermDialog}>{gettext('Add')}</Button>\n        </MainPanelTopbar>\n        <div className=\"main-panel-center flex-row\">\n          <div className=\"cur-view-container\">\n            <div className=\"cur-view-path\">\n              <h3 className=\"sf-heading\">{gettext('Terms and Conditions')}</h3>\n            </div>\n            <div className=\"cur-view-content\">\n              <Content\n                loading={this.state.loading}\n                errorMsg={this.state.errorMsg}\n                items={termList}\n                deleteTerm={this.deleteTerm}\n                updateTerm={this.updateTerm}\n              />\n            </div>\n          </div>\n        </div>\n        {isAddTermDialogOpen &&\n        <ModalPortal>\n          <AddOrUpdateTermDialog\n            isUpdate={false}\n            addTerm={this.addTerm}\n            toggle={this.toggleAddTermDialog}\n          />\n        </ModalPortal>\n        }\n      </Fragment>\n    );\n  }\n}\n\nexport default TermsAndConditions;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Link } from '@reach/router';\nimport { siteRoot, gettext } from '../../../utils/constants';\n\nconst propTypes = {\n  currentItem: PropTypes.string.isRequired\n};\n\nclass Nav extends React.Component {\n\n  constructor(props) {\n    super(props);\n    this.navItems = [\n      {name: 'all', urlPart: 'all', text: gettext('All')},\n      {name: 'unhandled', urlPart: 'unhandled', text: gettext('Unhandled')}\n    ];\n  }\n\n  render() {\n    const { currentItem } = this.props;\n    return (\n      <div className=\"cur-view-path tab-nav-container\">\n        <ul className=\"nav\">\n          {this.navItems.map((item, index) => {\n            return (\n              <li className=\"nav-item\" key={index}>\n                <Link to={`${siteRoot}sys/virus-files/${item.urlPart}/`} className={`nav-link${currentItem == item.name ? ' active' : ''}`}>{item.text}</Link>\n              </li>\n            );\n          })}\n        </ul>\n      </div>\n    );\n  }\n}\n\nNav.propTypes = propTypes;\n\nexport default Nav;\n","import React, { Component, Fragment } from 'react';\nimport PropTypes from 'prop-types';\nimport { seafileAPI } from '../../../utils/seafile-api';\nimport { gettext } from '../../../utils/constants';\nimport { Utils } from '../../../utils/utils';\nimport toaster from '../../../components/toast';\nimport OpMenu from '../../../components/dialog/op-menu';\nimport Loading from '../../../components/loading';\nimport Paginator from '../../../components/paginator';\nimport MainPanelTopbar from '../main-panel-topbar';\nimport Nav from './nav';\n\nconst virusFileItemPropTypes = {\n  virusFile: PropTypes.object.isRequired,\n  isItemFreezed: PropTypes.bool.isRequired,\n  onFreezedItem: PropTypes.func.isRequired,\n  onUnfreezedItem: PropTypes.func.isRequired\n};\n\nclass VirusFileItem extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      highlight: false,\n      isOpIconShown: false\n    };\n  }\n\n  handleMouseEnter = () => {\n    if (!this.props.isItemFreezed) {\n      this.setState({\n        isOpIconShown: true,\n        highlight: true\n      });\n    }\n  }\n\n  handleMouseLeave = () => {\n    if (!this.props.isItemFreezed) {\n      this.setState({\n        isOpIconShown: false,\n        highlight: false\n      });\n    }\n  }\n\n  onUnfreezedItem = () => {\n    this.setState({\n      highlight: false,\n      isOpIconShow: false\n    });\n    this.props.onUnfreezedItem();\n  }\n\n  onMenuItemClick = (operation) => {\n    this.props.handleFile(this.props.virusFile.virus_id, operation);\n  }\n\n  translateOperations = (item) => {\n    let translateResult = '';\n    switch(item) {\n      case 'delete':\n        translateResult = gettext('Delete');\n        break;\n      case 'ignore':\n        translateResult = gettext('Ignore');\n        break;\n      case 'do-not-ignore':\n        translateResult = gettext('Don\\'t ignore');\n        break;\n    }\n    return translateResult;\n  }\n\n  render() {\n    const virusFile = this.props.virusFile;\n    let fileStatus = '',\n      fileOpList = [];\n    if (virusFile.has_deleted) {\n      fileStatus = <span className=\"text-green\">{gettext('Deleted')}</span>;\n    } else if (virusFile.has_ignored) {\n      fileStatus = <span className=\"text-orange\">{gettext('Ignored')}</span>;\n      fileOpList = ['do-not-ignore'];\n    } else {\n      fileStatus = <span className=\"text-red\">{gettext('Unhandled')}</span>;\n      fileOpList = ['delete', 'ignore'];\n    }\n\n    return (\n      <tr className={this.state.highlight ? 'tr-highlight' : ''} onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave}>\n        <td>{virusFile.repo_name}</td>\n        <td>{virusFile.repo_owner}</td>\n        <td>{virusFile.file_path}</td>\n        <td>{fileStatus}</td>\n        <td>\n          {fileOpList.length > 0 && this.state.isOpIconShown &&\n            <OpMenu\n              operations={fileOpList}\n              translateOperations={this.translateOperations}\n              onMenuItemClick={this.onMenuItemClick}\n              onFreezedItem={this.props.onFreezedItem}\n              onUnfreezedItem={this.onUnfreezedItem}\n            />\n          }\n        </td>\n      </tr>\n    );\n  }\n}\n\nVirusFileItem.propTypes = virusFileItemPropTypes;\n\n\nconst virusFileListPropTypes = {\n  loading: PropTypes.bool.isRequired,\n  errorMsg: PropTypes.string.isRequired,\n  virusFiles: PropTypes.array.isRequired\n};\n\nclass Content extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      isItemFreezed: false\n    };\n  }\n\n  onFreezedItem = () => {\n    this.setState({isItemFreezed: true});\n  }\n\n  onUnfreezedItem = () => {\n    this.setState({isItemFreezed: false});\n  }\n\n  getPreviousPage = () => {\n    this.props.getListByPage(this.props.currentPage - 1);\n  }\n\n  getNextPage = () => {\n    this.props.getListByPage(this.props.currentPage + 1);\n  }\n\n  render() {\n    const {\n      loading, errorMsg, virusFiles,\n      curPerPage, hasNextPage, currentPage\n    } = this.props;\n\n    if (loading) {\n      return <Loading />;\n    } else if (errorMsg) {\n      return <p className=\"error text-center mt-4\">{errorMsg}</p>;\n    } else {\n      return (\n        <Fragment>\n          <table>\n            <thead>\n              <tr>\n                <th width=\"27%\">{gettext('Library')}</th>\n                <th width=\"25%\">{gettext('Owner')}</th>\n                <th width=\"28%\">{gettext('Virus File')}</th>\n                <th width=\"15%\">{gettext('Status')}</th>\n                <th width=\"5%\">{/* Operations */}</th>\n              </tr>\n            </thead>\n            <tbody>\n              {virusFiles.map((virusFile, index) => {\n                return (\n                  <VirusFileItem\n                    key={index}\n                    virusFile={virusFile}\n                    isItemFreezed={this.state.isItemFreezed}\n                    onFreezedItem={this.onFreezedItem}\n                    onUnfreezedItem={this.onUnfreezedItem}\n                    handleFile={this.props.handleFile}\n                  />\n                );\n              })}\n            </tbody>\n          </table>\n          {virusFiles.length > 0 &&\n          <Paginator\n            gotoPreviousPage={this.getPreviousPage}\n            gotoNextPage={this.getNextPage}\n            currentPage={currentPage}\n            hasNextPage={hasNextPage}\n            curPerPage={curPerPage}\n            resetPerPage={this.props.resetPerPage}\n          />\n          }\n        </Fragment>\n      );\n    }\n  }\n}\n\nContent.propTypes = virusFileListPropTypes;\n\n\nclass AllVirusFiles extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      loading: true,\n      errorMsg: '',\n      virusFiles: [],\n      currentPage: 1,\n      perPage: 25,\n      hasNextPage: false\n    };\n  }\n\n  componentDidMount() {\n    let urlParams = (new URL(window.location)).searchParams;\n    const {\n      currentPage, perPage\n    } = this.state;\n    this.setState({\n      perPage: parseInt(urlParams.get('per_page') || perPage),\n      currentPage: parseInt(urlParams.get('page') || currentPage)\n    }, () => {\n      this.getListByPage(this.state.currentPage);\n    });\n  }\n\n  getListByPage = (page) => {\n    const { perPage } = this.state;\n    seafileAPI.listVirusFiles(page, perPage).then((res) => {\n      const data = res.data;\n      this.setState({\n        loading: false,\n        virusFiles: data.virus_file_list,\n        hasNextPage: data.has_next_page\n      });\n    }).catch((error) => {\n      this.setState({\n        loading: false,\n        errorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403\n      });\n    });\n  }\n\n  resetPerPage = (perPage) => {\n    this.setState({\n      perPage: perPage\n    }, () => {\n      this.getListByPage(1);\n    });\n  }\n\n  handleFile = (virusID, op) => {\n    let request;\n    switch(op) {\n      case 'delete':\n        request = seafileAPI.deleteVirusFile(virusID);\n        break;\n      case 'ignore':\n        request = seafileAPI.toggleIgnoreVirusFile(virusID, true);\n        break;\n      case 'do-not-ignore':\n        request = seafileAPI.toggleIgnoreVirusFile(virusID, false);\n        break;\n    }\n    request.then((res) => {\n      this.setState({\n        virusFiles: this.state.virusFiles.map((item) => {\n          if (item.virus_id == virusID) {\n            if (op == 'delete') {\n              item.has_deleted = true;\n            } else {\n              item = res.data.virus_file;\n            }\n          }\n          return item;\n        })\n      });\n    }).catch((error) => {\n      toaster.danger(Utils.getErrorMsg(error));\n    });\n  }\n\n  render() {\n    return (\n      <Fragment>\n        <MainPanelTopbar />\n        <div className=\"main-panel-center\">\n          <div className=\"cur-view-container\">\n            <Nav currentItem=\"all\" />\n            <div className=\"cur-view-content\">\n              <Content\n                loading={this.state.loading}\n                errorMsg={this.state.errorMsg}\n                virusFiles={this.state.virusFiles}\n                currentPage={this.state.currentPage}\n                hasNextPage={this.state.hasNextPage}\n                curPerPage={this.state.perPage}\n                resetPerPage={this.resetPerPage}\n                getListByPage={this.getListByPage}\n                handleFile={this.handleFile}\n              />\n            </div>\n          </div>\n        </div>\n      </Fragment>\n    );\n  }\n}\n\nexport default AllVirusFiles;\n","import React, { Component, Fragment } from 'react';\nimport PropTypes from 'prop-types';\nimport { Button } from 'reactstrap';\nimport { seafileAPI } from '../../../utils/seafile-api';\nimport { gettext } from '../../../utils/constants';\nimport { Utils } from '../../../utils/utils';\nimport toaster from '../../../components/toast';\nimport OpMenu from '../../../components/dialog/op-menu';\nimport Loading from '../../../components/loading';\nimport Paginator from '../../../components/paginator';\nimport MainPanelTopbar from '../main-panel-topbar';\nimport Nav from './nav';\n\nconst virusFileItemPropTypes = {\n  virusFile: PropTypes.object.isRequired,\n  isItemFreezed: PropTypes.bool.isRequired,\n  onFreezedItem: PropTypes.func.isRequired,\n  onUnfreezedItem: PropTypes.func.isRequired\n};\n\nclass VirusFileItem extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      highlight: false,\n      isOpIconShown: false\n    };\n  }\n\n  handleMouseEnter = () => {\n    if (!this.props.isItemFreezed) {\n      this.setState({\n        isOpIconShown: true,\n        highlight: true\n      });\n    }\n  }\n\n  handleMouseLeave = () => {\n    if (!this.props.isItemFreezed) {\n      this.setState({\n        isOpIconShown: false,\n        highlight: false\n      });\n    }\n  }\n\n  onUnfreezedItem = () => {\n    this.setState({\n      highlight: false,\n      isOpIconShow: false\n    });\n    this.props.onUnfreezedItem();\n  }\n\n  onMenuItemClick = (operation) => {\n    this.props.handleFile(this.props.virusFile.virus_id, operation);\n  }\n\n  translateOperations = (item) => {\n    let translateResult = '';\n    switch(item) {\n      case 'delete':\n        translateResult = gettext('Delete');\n        break;\n      case 'ignore':\n        translateResult = gettext('Ignore');\n        break;\n      case 'do-not-ignore':\n        translateResult = gettext('Don\\'t ignore');\n        break;\n    }\n    return translateResult;\n  }\n\n  toggleItemSelected = (e) => {\n    this.props.toggleItemSelected(this.props.virusFile, e.target.checked);\n  }\n\n  render() {\n    const virusFile = this.props.virusFile;\n    let fileStatus = '',\n      fileOpList = [];\n    if (virusFile.has_deleted) {\n      fileStatus = <span className=\"text-green\">{gettext('Deleted')}</span>;\n    } else if (virusFile.has_ignored) {\n      fileStatus = <span className=\"text-orange\">{gettext('Ignored')}</span>;\n      fileOpList = ['do-not-ignore'];\n    } else {\n      fileStatus = <span className=\"text-red\">{gettext('Unhandled')}</span>;\n      fileOpList = ['delete', 'ignore'];\n    }\n\n    return (\n      <tr className={this.state.highlight ? 'tr-highlight' : ''} onMouseEnter={this.handleMouseEnter} onMouseLeave={this.handleMouseLeave}>\n        <td className=\"text-center\">\n          <input type=\"checkbox\" checked={virusFile.isSelected} onChange={this.toggleItemSelected} />\n        </td>\n        <td>{virusFile.repo_name}</td>\n        <td>{virusFile.repo_owner}</td>\n        <td>{virusFile.file_path}</td>\n        <td>{fileStatus}</td>\n        <td>\n          {fileOpList.length > 0 && this.state.isOpIconShown &&\n            <OpMenu\n              operations={fileOpList}\n              translateOperations={this.translateOperations}\n              onMenuItemClick={this.onMenuItemClick}\n              onFreezedItem={this.props.onFreezedItem}\n              onUnfreezedItem={this.onUnfreezedItem}\n            />\n          }\n        </td>\n      </tr>\n    );\n  }\n}\n\nVirusFileItem.propTypes = virusFileItemPropTypes;\n\n\nconst virusFileListPropTypes = {\n  loading: PropTypes.bool.isRequired,\n  errorMsg: PropTypes.string.isRequired,\n  virusFiles: PropTypes.array.isRequired\n};\n\nclass Content extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      isItemFreezed: false\n    };\n  }\n\n  onFreezedItem = () => {\n    this.setState({isItemFreezed: true});\n  }\n\n  onUnfreezedItem = () => {\n    this.setState({isItemFreezed: false});\n  }\n\n  getPreviousPage = () => {\n    this.props.getListByPage(this.props.currentPage - 1);\n  }\n\n  getNextPage = () => {\n    this.props.getListByPage(this.props.currentPage + 1);\n  }\n\n  render() {\n    const {\n      loading, errorMsg, virusFiles,\n      curPerPage, hasNextPage, currentPage,\n      isAllItemsSelected\n    } = this.props;\n\n    if (loading) {\n      return <Loading />;\n    } else if (errorMsg) {\n      return <p className=\"error text-center mt-4\">{errorMsg}</p>;\n    } else {\n      return (\n        <Fragment>\n          <table>\n            <thead>\n              <tr>\n                <th width=\"3%\" className=\"text-center\">\n                  <input type=\"checkbox\" checked={isAllItemsSelected} onChange={this.props.toggleAllSelected} />\n                </th>\n                <th width=\"24%\">{gettext('Library')}</th>\n                <th width=\"25%\">{gettext('Owner')}</th>\n                <th width=\"28%\">{gettext('Virus File')}</th>\n                <th width=\"15%\">{gettext('Status')}</th>\n                <th width=\"5%\">{/* Operations */}</th>\n              </tr>\n            </thead>\n            <tbody>\n              {virusFiles.map((virusFile, index) => {\n                return (\n                  <VirusFileItem\n                    key={index}\n                    virusFile={virusFile}\n                    isItemFreezed={this.state.isItemFreezed}\n                    onFreezedItem={this.onFreezedItem}\n                    onUnfreezedItem={this.onUnfreezedItem}\n                    handleFile={this.props.handleFile}\n                    toggleItemSelected={this.props.toggleItemSelected}\n                  />\n                );\n              })}\n            </tbody>\n          </table>\n          {virusFiles.length > 0 &&\n          <Paginator\n            gotoPreviousPage={this.getPreviousPage}\n            gotoNextPage={this.getNextPage}\n            currentPage={currentPage}\n            hasNextPage={hasNextPage}\n            curPerPage={curPerPage}\n            resetPerPage={this.props.resetPerPage}\n          />\n          }\n        </Fragment>\n      );\n    }\n  }\n}\n\nContent.propTypes = virusFileListPropTypes;\n\n\nclass UnhandledVirusFiles extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      loading: true,\n      errorMsg: '',\n      virusFiles: [],\n\n      isAllItemsSelected: false,\n      selectedItems: [],\n\n      currentPage: 1,\n      perPage: 25,\n      hasNextPage: false\n    };\n  }\n\n  componentDidMount() {\n    let urlParams = (new URL(window.location)).searchParams;\n    const {\n      currentPage, perPage\n    } = this.state;\n    this.setState({\n      perPage: parseInt(urlParams.get('per_page') || perPage),\n      currentPage: parseInt(urlParams.get('page') || currentPage)\n    }, () => {\n      this.getListByPage(this.state.currentPage);\n    });\n  }\n\n  getListByPage = (page) => {\n    const { perPage } = this.state;\n    const hasHandled = false;\n    seafileAPI.listVirusFiles(page, perPage, hasHandled).then((res) => {\n      const data = res.data;\n      const items = data.virus_file_list.map(item => {\n        item.isSelected = false;\n        return item;\n      });\n      this.setState({\n        loading: false,\n        virusFiles: items,\n        hasNextPage: data.has_next_page\n      });\n    }).catch((error) => {\n      this.setState({\n        loading: false,\n        errorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403\n      });\n    });\n  }\n\n  resetPerPage = (perPage) => {\n    this.setState({\n      perPage: perPage\n    }, () => {\n      this.getListByPage(1);\n    });\n  }\n\n  handleFile = (virusID, op) => {\n    let request;\n    switch(op) {\n      case 'delete':\n        request = seafileAPI.deleteVirusFile(virusID);\n        break;\n      case 'ignore':\n        request = seafileAPI.toggleIgnoreVirusFile(virusID, true);\n        break;\n      case 'do-not-ignore':\n        request = seafileAPI.toggleIgnoreVirusFile(virusID, false);\n        break;\n    }\n    request.then((res) => {\n      this.setState({\n        virusFiles: this.state.virusFiles.map((item) => {\n          if (item.virus_id == virusID) {\n            if (op == 'delete') {\n              item.has_deleted = true;\n            } else {\n              item = res.data.virus_file;\n            }\n          }\n          return item;\n        })\n      });\n    }).catch((error) => {\n      toaster.danger(Utils.getErrorMsg(error));\n    });\n  }\n\n  toggleAllSelected = () => {\n    this.setState((prevState) => ({\n      isAllItemsSelected: !prevState.isAllItemsSelected,\n      virusFiles: this.state.virusFiles.map((item) => {\n        item.isSelected = !prevState.isAllItemsSelected;\n        return item;\n      })\n    }));\n  }\n\n  toggleItemSelected = (targetItem, isSelected) => {\n    this.setState({\n      virusFiles: this.state.virusFiles.map((item) => {\n        if (item === targetItem) {\n          item.isSelected = isSelected;\n        }\n        return item;\n      })\n    }, () => {\n      this.setState({\n        isAllItemsSelected: !this.state.virusFiles.some(item => !item.isSelected)\n      });\n    });\n  }\n\n  handleSelectedItems = (op) => {\n    // op: 'delete-virus', 'ignore-virus'\n    const virusIDs = this.state.virusFiles\n      .filter(item => {\n        if (op == 'delete-virus') {\n          return item.isSelected && !item.has_deleted;\n        } else {\n          return item.isSelected && !item.has_ignored;\n        }\n      })\n      .map(item => item.virus_id);\n    seafileAPI.batchProcessVirusFiles(virusIDs, op).then((res) => {\n      let fileList = this.state.virusFiles;\n      res.data.success.forEach(item => {\n        let file = fileList.find(file => file.virus_id == item.virus_id);\n        if (op == 'delete-virus') {\n          file.has_deleted = true;\n        } else {\n          file.has_ignored = true;\n        }\n      });\n      this.setState({\n        virusFiles: fileList\n      });\n\n      res.data.failed.forEach(item => {\n        const file = fileList.find(file => file.virus_id == item.virus_id);\n        let errMsg = op == 'delete-virus' ?\n          gettext('Failed to delete %(virus_file) from library %(library): %(error_msg)') :\n          gettext('Failed to ignore %(virus_file) from library %(library): %(error_msg)');\n        errMsg = errMsg.replace('%(virus_file)', file.file_path)\n          .replace('%(library)', file.repo_name)\n          .replace('%(error_msg)', item.error_msg);\n        toaster.danger(errMsg);\n      });\n    }).catch((error) => {\n      toaster.danger(Utils.getErrorMsg(error));\n    });\n  }\n\n  deleteSelectedItems = () => {\n    const op = 'delete-virus';\n    this.handleSelectedItems(op);\n  }\n\n  ignoreSelectedItems = () => {\n    const op = 'ignore-virus';\n    this.handleSelectedItems(op);\n  }\n\n  render() {\n    return (\n      <Fragment>\n        {this.state.virusFiles.some(item => item.isSelected) ? (\n          <MainPanelTopbar>\n            <Fragment>\n              <Button onClick={this.deleteSelectedItems} className=\"operation-item\">{gettext('Delete')}</Button>\n              <Button onClick={this.ignoreSelectedItems} className=\"operation-item\">{gettext('Ignore')}</Button>\n            </Fragment>\n          </MainPanelTopbar>\n        ) : <MainPanelTopbar />\n        }\n        <div className=\"main-panel-center\">\n          <div className=\"cur-view-container\">\n            <Nav currentItem=\"unhandled\" />\n            <div className=\"cur-view-content\">\n              <Content\n                loading={this.state.loading}\n                errorMsg={this.state.errorMsg}\n                virusFiles={this.state.virusFiles}\n                currentPage={this.state.currentPage}\n                hasNextPage={this.state.hasNextPage}\n                curPerPage={this.state.perPage}\n                resetPerPage={this.resetPerPage}\n                getListByPage={this.getListByPage}\n                handleFile={this.handleFile}\n                isAllItemsSelected={this.state.isAllItemsSelected}\n                toggleAllSelected={this.toggleAllSelected}\n                toggleItemSelected={this.toggleItemSelected}\n              />\n            </div>\n          </div>\n        </div>\n      </Fragment>\n    );\n  }\n}\n\nexport default UnhandledVirusFiles;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Link } from '@reach/router';\nimport { siteRoot, gettext } from '../../../utils/constants';\n\nconst propTypes = {\n  currentItem: PropTypes.string.isRequired\n};\n\nclass LogsNav extends React.Component {\n\n  constructor(props) {\n    super(props);\n    this.navItems = [\n      {name: 'adminOperationLogs', urlPart:'admin-logs/operation', text: gettext('Admin Operation Logs')},\n      {name: 'adminLoginLogs', urlPart:'admin-logs/login', text: gettext('Admin Login Logs')},\n    ];\n  }\n\n  render() {\n    const { currentItem } = this.props;\n    return (\n      <div className=\"cur-view-path tab-nav-container\">\n        <ul className=\"nav\">\n          {this.navItems.map((item, index) => {\n            return (\n              <li className=\"nav-item\" key={index}>\n                <Link to={`${siteRoot}sys/${item.urlPart}/`} className={`nav-link${currentItem == item.name ? ' active' : ''}`}>{item.text}</Link>\n              </li>\n            );\n          })}\n        </ul>\n      </div>\n    );\n  }\n}\n\nLogsNav.propTypes = propTypes;\n\nexport default LogsNav;\n","import React, { Component, Fragment } from 'react';\nimport { seafileAPI } from '../../../utils/seafile-api';\nimport { gettext, siteRoot, enableSysAdminViewRepo, isPro } from '../../../utils/constants';\nimport { Utils } from '../../../utils/utils';\nimport EmptyTip from '../../../components/empty-tip';\nimport moment from 'moment';\nimport Loading from '../../../components/loading';\nimport Paginator from '../../../components/paginator';\nimport LogsNav from './logs-nav';\nimport MainPanelTopbar from '../main-panel-topbar';\nimport UserLink from '../user-link';\n\nclass Content extends Component {\n\n  constructor(props) {\n    super(props);\n  }\n\n  getPreviousPage = () => {\n    this.props.getLogsByPage(this.props.currentPage - 1);\n  }\n\n  getNextPage = () => {\n    this.props.getLogsByPage(this.props.currentPage + 1);\n  }\n\n  render() {\n    const { loading, errorMsg, items, perPage, currentPage, hasNextPage } = this.props;\n    if (loading) {\n      return <Loading />;\n    } else if (errorMsg) {\n      return <p className=\"error text-center\">{errorMsg}</p>;\n    } else {\n      const emptyTip = (\n        <EmptyTip>\n          <h2>{gettext('No Admin operation logs')}</h2>\n        </EmptyTip>\n      );\n      const table = (\n        <Fragment>\n          <table className=\"table-hover\">\n            <thead>\n              <tr>\n                <th width=\"20%\">{gettext('Name')}</th>\n                <th width=\"15%\">{gettext('Operation')}</th>\n                <th width=\"50%\">{gettext('Detail')}</th>\n                <th width=\"15%\">{gettext('Time')}</th>\n              </tr>\n            </thead>\n            {items &&\n              <tbody>\n                {items.map((item, index) => {\n                  return (<Item\n                    key={index}\n                    item={item}\n                  />);\n                })}\n              </tbody>\n            }\n          </table>\n          <Paginator\n            gotoPreviousPage={this.getPreviousPage}\n            gotoNextPage={this.getNextPage}\n            currentPage={currentPage}\n            hasNextPage={hasNextPage}\n            curPerPage={perPage}\n            resetPerPage={this.props.resetPerPage}\n          />\n        </Fragment>\n      );\n      return items.length ? table : emptyTip;\n    }\n  }\n}\n\nclass Item extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      isOpIconShown: false,\n    };\n  }\n\n  getOperationText = (operationType) => {\n    switch (operationType) {\n      case 'repo_create': return gettext('Create Library');\n      case 'repo_delete': return gettext('Delete Library');\n      case 'repo_transfer': return gettext('Transfer Library');\n      case 'group_create': return gettext('Create Group');\n      case 'group_transfer': return gettext('Transfer Group');\n      case 'group_delete': return gettext('Delete Group');\n      case 'user_add': return gettext('Add User');\n      case 'user_delete': return gettext('Delete User');\n      default: return '';\n    }\n  }\n\n  getOperationDetail = (item) => {\n    let detail = item.detail;\n\n    let ownerPageUrl = '';\n    if (detail.owner) {\n      ownerPageUrl = siteRoot + 'sys/users/' + encodeURIComponent(detail.owner) + '/';\n    }\n    let userPageUrl = '';\n    if (detail.email) {\n      userPageUrl = siteRoot + 'sys/users/' + encodeURIComponent(detail.email) + '/';\n    }\n    let detailText = '';\n    let repoPageUrl = '';\n    let groupPageUrl = '';\n    if (item.operation == 'repo_create' || item.operation == 'repo_delete' || item.operation == 'repo_transfer') {\n      repoPageUrl = siteRoot + 'sys/libraries/' + detail.id + '/' + encodeURIComponent(detail.name) + '/';\n    }\n    if (item.operation == 'group_create' || item.operation == 'group_delete' || item.operation == 'group_transfer') {\n      groupPageUrl = siteRoot + 'sys/groups/' + detail.id + '/libraries/';\n    }\n\n    switch (item.operation) {\n      case 'repo_create':\n        detailText = gettext('Created library {library_name} with {owner} as its owner')\n          .replace('{owner}', '<a href=\"' + ownerPageUrl + '\">' + detail.owner + '</a>');\n        if (isPro && enableSysAdminViewRepo) {\n          detailText = detailText.replace('{library_name}', '<a href=\"' + repoPageUrl + '\">' + detail.name + '</a>');\n        } else {\n          detailText = detailText.replace('{library_name}', '<span class=\"font-weight-bold\">' + detail.name + '</span>');\n        }\n        return detailText;\n\n      case 'repo_delete':\n        detailText = gettext('Deleted library {library_name}')\n          .replace('{library_name}', '<span class=\"font-weight-bold\">' + detail.name + '</span>');\n        return detailText;\n\n      case 'repo_transfer':\n        detailText = gettext('Transferred library {library_name} from {user_from} to {user_to}')\n          .replace('{user_from}', '<span class=\"font-weight-bold\">' + detail.from + '</span>')\n          .replace('{user_to}', '<span class=\"font-weight-bold\">' + detail.to+ '</span>');\n        if (isPro && enableSysAdminViewRepo) {\n          detailText = detailText.replace('{library_name}', '<a href=\"' + repoPageUrl + '\">' + detail.name + '</a>');\n        } else {\n          detailText = detailText.replace('{library_name}', '<span class=\"font-weight-bold\">' + detail.name + '</span>');\n        }\n        return detailText;\n\n      case 'group_create':\n        detailText = gettext('Created group {group_name}')\n          .replace('{group_name}', '<a href=\"' + groupPageUrl + '\">' + detail.name+ '</a>');\n        return detailText;\n\n      case 'group_transfer':\n        detailText = gettext('Transferred group {group_name} from {user_from} to {user_to}')\n          .replace('{user_from}', '<span class=\"font-weight-bold\">' + detail.from + '</span>')\n          .replace('{user_to}', '<span class=\"font-weight-bold\">' + detail.to+ '</span>')\n          .replace('{group_name}', '<a href=\"' + groupPageUrl + '\">' + detail.name+ '</a>');\n        return detailText;\n\n      case 'group_delete':\n        detailText = gettext('Deleted group {group_name}')\n          .replace('{group_name}', '<span class=\"font-weight-bold\">' + detail.name + '</span>');\n        return detailText;\n\n      case 'user_add':\n        detailText = gettext('Added user {user}')\n          .replace('{user}', '<a href=\"' + userPageUrl + '\">' + detail.email+ '</a>');\n        return detailText;\n\n      case 'user_delete':\n        detailText = gettext('Deleted user {user}')\n          .replace('{user}', '<span class=\"font-weight-bold\">' + detail.email+ '</span>');\n        return detailText;\n\n      default: return '';\n    }\n  }\n\n  render() {\n    let { item } = this.props;\n    return (\n      <tr onMouseOver={this.handleMouseOver} onMouseOut={this.handleMouseOut}>\n        <td><UserLink email={item.email} name={item.name} /></td>\n        <td>{this.getOperationText(item.operation)}</td>\n        <td>\n          <span dangerouslySetInnerHTML={{__html: this.getOperationDetail(item)}}></span>\n        </td>\n        <td>{moment(item.datetime).fromNow()}</td>\n      </tr>\n    );\n  }\n}\n\nclass AdminOperationLogs extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      loading: true,\n      errorMsg: '',\n      logList: [],\n      perPage: 25,\n      currentPage: 1,\n      hasNextPage: false,\n    };\n    this.initPage = 1;\n  }\n\n  componentDidMount () {\n    let urlParams = (new URL(window.location)).searchParams;\n    const { currentPage, perPage } = this.state;\n    this.setState({\n      perPage: parseInt(urlParams.get('per_page') || perPage),\n      currentPage: parseInt(urlParams.get('page') || currentPage)\n    }, () => {\n      this.getLogsByPage(this.state.currentPage);\n    });\n  }\n\n  getLogsByPage = (page) => {\n    let { perPage } = this.state;\n    seafileAPI.sysAdminListAdminLogs(page, perPage).then((res) => {\n      this.setState({\n        logList: res.data.data,\n        loading: false,\n        currentPage: page,\n        hasNextPage: Utils.hasNextPage(page, perPage, res.data.total_count),\n      });\n    }).catch((error) => {\n      this.setState({\n        loading: false,\n        errorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403\n      });\n    });\n  }\n\n  resetPerPage = (newPerPage) => {\n    this.setState({\n      perPage: newPerPage,\n    }, () => this.getLogsByPage(this.initPage));\n  }\n\n  render() {\n    let { logList, currentPage, perPage, hasNextPage } = this.state;\n    return (\n      <Fragment>\n        <MainPanelTopbar />\n        <div className=\"main-panel-center flex-row\">\n          <div className=\"cur-view-container\">\n            <LogsNav currentItem=\"adminOperationLogs\" />\n            <div className=\"cur-view-content\">\n              <Content\n                loading={this.state.loading}\n                errorMsg={this.state.errorMsg}\n                items={logList}\n                currentPage={currentPage}\n                perPage={perPage}\n                hasNextPage={hasNextPage}\n                getLogsByPage={this.getLogsByPage}\n                resetPerPage={this.resetPerPage}\n              />\n            </div>\n          </div>\n        </div>\n      </Fragment>\n    );\n  }\n}\n\nexport default AdminOperationLogs;\n","import React, { Component, Fragment } from 'react';\nimport { seafileAPI } from '../../../utils/seafile-api';\nimport { gettext, siteRoot } from '../../../utils/constants';\nimport { Utils } from '../../../utils/utils';\nimport EmptyTip from '../../../components/empty-tip';\nimport moment from 'moment';\nimport Loading from '../../../components/loading';\nimport Paginator from '../../../components/paginator';\nimport LogsNav from './logs-nav';\nimport MainPanelTopbar from '../main-panel-topbar';\nimport UserLink from '../user-link';\n\n\nclass Content extends Component {\n\n  constructor(props) {\n    super(props);\n  }\n\n  getPreviousPage = () => {\n    this.props.getLogsByPage(this.props.currentPage - 1);\n  }\n\n  getNextPage = () => {\n    this.props.getLogsByPage(this.props.currentPage + 1);\n  }\n\n  render() {\n    const { loading, errorMsg, items, perPage, currentPage, hasNextPage } = this.props;\n    if (loading) {\n      return <Loading />;\n    } else if (errorMsg) {\n      return <p className=\"error text-center\">{errorMsg}</p>;\n    } else {\n      const emptyTip = (\n        <EmptyTip>\n          <h2>{gettext('No Admin login logs')}</h2>\n        </EmptyTip>\n      );\n      const table = (\n        <Fragment>\n          <table className=\"table-hover\">\n            <thead>\n              <tr>\n                <th width=\"25%\">{gettext('Name')}</th>\n                <th width=\"25%\">{gettext('IP')}</th>\n                <th width=\"25%\">{gettext('Status')}</th>\n                <th width=\"25%\">{gettext('Time')}</th>\n              </tr>\n            </thead>\n            {items &&\n              <tbody>\n                {items.map((item, index) => {\n                  return (<Item\n                    key={index}\n                    item={item}\n                  />);\n                })}\n              </tbody>\n            }\n          </table>\n          <Paginator\n            gotoPreviousPage={this.getPreviousPage}\n            gotoNextPage={this.getNextPage}\n            currentPage={currentPage}\n            hasNextPage={hasNextPage}\n            curPerPage={perPage}\n            resetPerPage={this.props.resetPerPage}\n          />\n        </Fragment>\n      );\n      return items.length ? table : emptyTip;\n    }\n  }\n}\n\nclass Item extends Component {\n\n  constructor(props) {\n    super(props);\n  }\n\n  render() {\n    let { item } = this.props;\n    return (\n      <tr onMouseOver={this.handleMouseOver} onMouseOut={this.handleMouseOut}>\n        <td><UserLink email={item.email} name={item.name} /></td>\n        <td>{item.login_ip}</td>\n        <td>{item.login_success ? gettext('Success') : gettext('Failed')}</td>\n        <td>{moment(item.login_time).fromNow()}</td>\n      </tr>\n    );\n  }\n}\n\nclass AdminLoginLogs extends Component {\n\n  constructor(props) {\n    super(props);\n    this.state = {\n      loading: true,\n      errorMsg: '',\n      logList: [],\n      perPage: 25,\n      currentPage: 1,\n      hasNextPage: false,\n    };\n    this.initPage = 1;\n  }\n\n  componentDidMount () {\n    let urlParams = (new URL(window.location)).searchParams;\n    const { currentPage, perPage } = this.state;\n    this.setState({\n      perPage: parseInt(urlParams.get('per_page') || perPage),\n      currentPage: parseInt(urlParams.get('page') || currentPage)\n    }, () => {\n      this.getLogsByPage(this.state.currentPage);\n    });\n  }\n\n  getLogsByPage = (page) => {\n    let { perPage } = this.state;\n    seafileAPI.sysAdminListAdminLoginLogs(page, perPage).then((res) => {\n      this.setState({\n        logList: res.data.data,\n        loading: false,\n        currentPage: page,\n        hasNextPage: Utils.hasNextPage(page, perPage, res.data.total_count),\n      });\n    }).catch((error) => {\n      this.setState({\n        loading: false,\n        errorMsg: Utils.getErrorMsg(error, true) // true: show login tip if 403\n      });\n    });\n  }\n\n  resetPerPage = (newPerPage) => {\n    this.setState({\n      perPage: newPerPage,\n    }, () => this.getLogsByPage(this.initPage));\n  }\n\n  render() {\n    let { logList, currentPage, perPage, hasNextPage } = this.state;\n    return (\n      <Fragment>\n        <MainPanelTopbar />\n        <div className=\"main-panel-center flex-row\">\n          <div className=\"cur-view-container\">\n            <LogsNav currentItem=\"adminLoginLogs\" />\n            <div className=\"cur-view-content\">\n              <Content\n                loading={this.state.loading}\n                errorMsg={this.state.errorMsg}\n                items={logList}\n                currentPage={currentPage}\n                perPage={perPage}\n                hasNextPage={hasNextPage}\n                getLogsByPage={this.getLogsByPage}\n                resetPerPage={this.resetPerPage}\n              />\n            </div>\n          </div>\n        </div>\n      </Fragment>\n    );\n  }\n}\n\nexport default AdminLoginLogs;\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport { Router } from '@reach/router';\nimport { siteRoot } from '../../utils/constants';\nimport SidePanel from './side-panel';\nimport MainPanel from './main-panel';\n\nimport Info from './info';\n\nimport StatisticFile from './statistic/statistic-file';\nimport StatisticStorage from './statistic/statistic-storage';\nimport StatisticTraffic from './statistic/statistic-traffic';\nimport StatisticUsers from './statistic/statistic-users';\nimport StatisticReport from './statistic/statistic-reports';\n\nimport DesktopDevices from './devices/desktop-devices';\nimport MobileDevices from './devices/mobile-devices';\nimport DeviceErrors from './devices/devices-errors';\nimport AbuseReports from './abuse-reports';\n\nimport Users from './users/users';\nimport AdminUsers from './users/admin-users';\nimport LDAPImportedUsers from './users/ldap-imported-users';\nimport LDAPUsers from './users/ldap-users';\nimport SearchUsers from './users/search-users';\nimport User from './users/user-info';\nimport UserOwnedRepos from './users/user-repos';\nimport UserSharedRepos from './users/user-shared-repos';\nimport UserLinks from './users/user-links';\nimport UserGroups from './users/user-groups';\n\nimport AllRepos from './repos/all-repos';\nimport SystemRepo from './repos/system-repo';\nimport TrashRepos from './repos/trash-repos';\nimport SearchRepos from './repos/search-repos';\nimport DirView from './repos/dir-view';\n\nimport Groups from './groups/groups';\nimport SearchGroups from './groups/search-groups';\nimport GroupRepos from './groups/group-repos';\nimport GroupMembers from './groups/group-members';\n\nimport Departments from './departments/departments';\nimport DepartmentsList from './departments/departments-list';\nimport DepartmentDetail from './departments/department-detail';\n\nimport ShareLinks from './links/share-links';\nimport UploadLinks from './links/upload-links';\n\nimport Orgs from './orgs/orgs';\nimport SearchOrgs from './orgs/search-orgs';\nimport OrgInfo from './orgs/org-info';\nimport OrgUsers from './orgs/org-users';\nimport OrgGroups from './orgs/org-groups';\nimport OrgRepos from './orgs/org-repos';\n\nimport Institutions from './institutions/institutions';\nimport InstitutionInfo from './institutions/institution-info';\nimport InstitutionUsers from './institutions/institution-users';\nimport InstitutionAdmins from './institutions/institution-admins';\n\nimport LoginLogs from './logs-page/login-logs';\nimport FileAccessLogs from './logs-page/file-access-logs';\nimport FileUpdateLogs from './logs-page/file-update-logs';\nimport SharePermissionLogs from './logs-page/share-permission-logs';\n\nimport WebSettings from './web-settings/web-settings';\nimport Notifications from './notifications/notifications';\nimport FileScanRecords from './file-scan-records';\nimport WorkWeixinDepartments from './work-weixin-departments';\nimport DingtalkDepartments from './dingtalk-departments';\nimport Invitations from './invitations/invitations';\nimport TermsAndConditions from './terms-and-conditions/terms-and-conditions';\n\nimport AllVirusFiles from './virus-scan/all-virus-files';\nimport UnhandledVirusFiles from './virus-scan/unhandled-virus-files';\n\nimport AdminOperationLogs from './admin-logs/operation-logs';\nimport AdminLoginLogs from './admin-logs/login-logs';\n\nimport '../../css/layout.css';\nimport '../../css/toolbar.css';\n\nclass SysAdmin extends React.Component {\n  constructor(props) {\n    super(props);\n    this.state = {\n      isSidePanelClosed: false,\n      currentTab: 'file-scan'\n    };\n  }\n\n  componentDidMount() {\n    let href = window.location.href.split('/');\n    let currentTab = href[href.length - 2];\n\n    const pageList = [\n      {\n        tab: 'devices',\n        urlPartList: ['desktop-devices', 'mobile-devices', 'device-errors']\n      },\n      {\n        tab: 'libraries',\n        urlPartList: ['all-libraries', 'search-libraries', 'system-library', 'trash-libraries', 'libraries/']\n      },\n      {\n        tab: 'statistic',\n        urlPartList: ['statistics/file', 'statistics/storage', 'statistics/user', 'statistics/traffic', 'statistics/reports']\n      },\n      {\n        tab: 'users',\n        urlPartList: ['users/', 'search-users/']\n      },\n      {\n        tab: 'groups',\n        urlPartList: ['groups/', 'search-groups/']\n      },\n      {\n        tab: 'organizations',\n        urlPartList: ['organizations/', 'search-organizations/']\n      },\n      {\n        tab: 'links',\n        urlPartList: ['share-links/', 'upload-links/']\n      },\n      {\n        tab: 'institutions',\n        urlPartList: ['institutions/']\n      },\n      {\n        tab: 'termsandconditions',\n        urlPartList: ['terms-and-conditions/']\n      },\n      {\n        tab: 'departments',\n        urlPartList: ['departments/']\n      },\n      {\n        tab: 'logs',\n        urlPartList: ['logs/']\n      },\n      {\n        tab: 'virus-files',\n        urlPartList: ['virus-files/']\n      },\n      {\n        tab: 'adminLogs',\n        urlPartList: ['admin-logs/']\n      }\n    ];\n    const tmpTab = this.getCurrentTabForPageList(pageList);\n    currentTab = tmpTab ? tmpTab : currentTab;\n\n    this.setState({currentTab: currentTab});\n  }\n\n  getCurrentTabForPageList = (pageList) => {\n    let urlPartList, tab;\n    const urlBase = `${siteRoot}sys/`;\n    for (let i = 0, len = pageList.length; i < len; i++) {\n      urlPartList = pageList[i].urlPartList;\n      tab = pageList[i].tab;\n      for (let j = 0, jlen = urlPartList.length; j < jlen; j++) {\n        if (location.href.indexOf(`${urlBase}${urlPartList[j]}`) != -1) {\n          return tab;\n        }\n      }\n    }\n  }\n\n  onCloseSidePanel = () => {\n    this.setState({isSidePanelClosed: !this.state.isSidePanelClosed});\n  }\n\n  tabItemClick = (param) => {\n    this.setState({currentTab: param});\n  }\n\n  render() {\n    let { currentTab, isSidePanelClosed } = this.state;\n\n    return (\n      <div id=\"main\">\n        <SidePanel\n          isSidePanelClosed={isSidePanelClosed}\n          onCloseSidePanel={this.onCloseSidePanel}\n          currentTab={currentTab}\n          tabItemClick={this.tabItemClick}\n        />\n        <MainPanel>\n          <Router className=\"reach-router\">\n            <Info path={siteRoot + 'sys/info'} />\n            <StatisticFile path={siteRoot + 'sys/statistics/file'} />\n            <StatisticStorage path={siteRoot + 'sys/statistics/storage'} />\n            <StatisticUsers path={siteRoot + 'sys/statistics/user'} />\n            <StatisticTraffic path={siteRoot + 'sys/statistics/traffic'} />\n            <StatisticReport path={siteRoot + 'sys/statistics/reports'} />\n            <DesktopDevices path={siteRoot + 'sys/desktop-devices'} />\n            <MobileDevices path={siteRoot + 'sys/mobile-devices'} />\n            <DeviceErrors path={siteRoot + 'sys/device-errors'} />\n            <AllRepos path={siteRoot + 'sys/all-libraries'} />\n            <SystemRepo path={siteRoot + 'sys/system-library'} />\n            <TrashRepos path={siteRoot + 'sys/trash-libraries'} />\n            <SearchRepos path={siteRoot + 'sys/search-libraries'} />\n            <DirView path={siteRoot + 'sys/libraries/:repoID/*'} />\n            <WebSettings path={siteRoot + 'sys/web-settings'} />\n            <Notifications path={siteRoot + 'sys/notifications'} />\n            <Groups path={siteRoot + 'sys/groups'} />\n            <SearchGroups path={siteRoot + 'sys/search-groups'} />\n            <GroupRepos path={siteRoot + 'sys/groups/:groupID/libraries'} />\n            <GroupMembers path={siteRoot + 'sys/groups/:groupID/members'} />\n            <Departments path={siteRoot + 'sys/departments'}>\n              <DepartmentsList path='/'/>\n              <DepartmentDetail path='/:groupID'/>\n            </Departments>\n            <ShareLinks path={siteRoot + 'sys/share-links'} />\n            <UploadLinks path={siteRoot + 'sys/upload-links'} />\n            <Orgs path={siteRoot + 'sys/organizations'} />\n            <SearchOrgs path={siteRoot + 'sys/search-organizations'} />\n            <OrgInfo path={siteRoot + 'sys/organizations/:orgID/info'} />\n            <OrgUsers path={siteRoot + 'sys/organizations/:orgID/users'} />\n            <OrgGroups path={siteRoot + 'sys/organizations/:orgID/groups'} />\n            <OrgRepos path={siteRoot + 'sys/organizations/:orgID/libraries'} />\n            <Institutions path={siteRoot + 'sys/institutions'} />\n            <InstitutionInfo path={siteRoot + 'sys/institutions/:institutionID/info'} />\n            <InstitutionUsers path={siteRoot + 'sys/institutions/:institutionID/members'} />\n            <InstitutionAdmins path={siteRoot + 'sys/institutions/:institutionID/admins'} />\n            <LoginLogs path={siteRoot + 'sys/logs/login'} />\n            <FileAccessLogs path={siteRoot + 'sys/logs/file-access'} />\n            <FileUpdateLogs path={siteRoot + 'sys/logs/file-update'} />\n            <SharePermissionLogs path={siteRoot + 'sys/logs/share-permission'} />\n            <AdminOperationLogs path={siteRoot + 'sys/admin-logs/operation'} />\n            <AdminLoginLogs path={siteRoot + 'sys/admin-logs/login'} />\n\n            <Users path={siteRoot + 'sys/users'} />\n            <AdminUsers path={siteRoot + 'sys/users/admins'} />\n            <LDAPImportedUsers path={siteRoot + 'sys/users/ldap-imported'} />\n            <LDAPUsers path={siteRoot + 'sys/users/ldap'} />\n            <SearchUsers path={siteRoot + 'sys/search-users'} />\n            <User path={siteRoot + 'sys/users/:email'} />\n            <UserOwnedRepos path={siteRoot + 'sys/users/:email/owned-libraries'} />\n            <UserSharedRepos path={siteRoot + 'sys/users/:email/shared-libraries'} />\n            <UserLinks path={siteRoot + 'sys/users/:email/shared-links'} />\n            <UserGroups path={siteRoot + 'sys/users/:email/groups'} />\n\n            <Invitations path={siteRoot + 'sys/invitations'} />\n            <TermsAndConditions path={siteRoot + 'sys/terms-and-conditions/'} />\n\n            <AllVirusFiles path={siteRoot + 'sys/virus-files/all'} />\n            <UnhandledVirusFiles path={siteRoot + 'sys/virus-files/unhandled'} />\n\n            <FileScanRecords\n              path={siteRoot + 'sys/file-scan-records'}\n              currentTab={currentTab}\n              tabItemClick={this.tabItemClick}\n            />\n\n            <WorkWeixinDepartments\n              path={siteRoot + 'sys/work-weixin'}\n              currentTab={currentTab}\n              tabItemClick={this.tabItemClick}\n            />\n            <DingtalkDepartments\n              path={siteRoot + 'sys/dingtalk'}\n              currentTab={currentTab}\n              tabItemClick={this.tabItemClick}\n            />\n            <AbuseReports path={siteRoot + 'sys/abuse-reports'} />\n          </Router>\n        </MainPanel>\n      </div>\n    );\n  }\n}\n\nReactDOM.render(\n  <SysAdmin />,\n  document.getElementById('wrapper')\n);\n","var baseIsNative = require('./_baseIsNative'),\n    getValue = require('./_getValue');\n\n/**\n * Gets the native function at `key` of `object`.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {string} key The key of the method to get.\n * @returns {*} Returns the function if it's native, else `undefined`.\n */\nfunction getNative(object, key) {\n  var value = getValue(object, key);\n  return baseIsNative(value) ? value : undefined;\n}\n\nmodule.exports = getNative;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Modal, ModalHeader, ModalBody, ModalFooter, Button } from 'reactstrap';\nimport copy from '../copy-to-clipboard';\nimport { gettext } from '../../utils/constants';\nimport toaster from '../../components/toast';\n\nconst propTypes = {\n  link: PropTypes.string.isRequired,\n  toggleDialog: PropTypes.func.isRequired\n};\n\nclass ShareAdminLink extends React.Component {\n\n  constructor(props) {\n    super(props);\n  }\n\n copyToClipboard = () => {\n   copy(this.props.link);\n   this.props.toggleDialog();\n   toaster.success(gettext('The link is copied to the clipboard.')), {duration: 2};\n }\n\n render() {\n   const { link, toggleDialog } = this.props;\n   return (\n     <Modal isOpen={true} toggle={toggleDialog}>\n       <ModalHeader toggle={toggleDialog}>{gettext('Link')}</ModalHeader>\n       <ModalBody>\n         <a href={link}>{link}</a>\n       </ModalBody>\n       <ModalFooter>\n         <Button color=\"primary\" onClick={this.copyToClipboard}>{gettext('Copy')}</Button>\n         <Button color=\"secondary\" onClick={toggleDialog}>{gettext('Close')}</Button>\n       </ModalFooter>\n     </Modal>\n   );\n }\n}\n\nShareAdminLink.propTypes = propTypes;\n\nexport default ShareAdminLink;\n","import isFunction from 'lodash.isfunction';\n\n// https://github.com/twbs/bootstrap/blob/v4.0.0-alpha.4/js/src/modal.js#L436-L443\nexport function getScrollbarWidth() {\n  let scrollDiv = document.createElement('div');\n  // .modal-scrollbar-measure styles // https://github.com/twbs/bootstrap/blob/v4.0.0-alpha.4/scss/_modal.scss#L106-L113\n  scrollDiv.style.position = 'absolute';\n  scrollDiv.style.top = '-9999px';\n  scrollDiv.style.width = '50px';\n  scrollDiv.style.height = '50px';\n  scrollDiv.style.overflow = 'scroll';\n  document.body.appendChild(scrollDiv);\n  const scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth;\n  document.body.removeChild(scrollDiv);\n  return scrollbarWidth;\n}\n\nexport function setScrollbarWidth(padding) {\n  document.body.style.paddingRight = padding > 0 ? `${padding}px` : null;\n}\n\nexport function isBodyOverflowing() {\n  return document.body.clientWidth < window.innerWidth;\n}\n\nexport function getOriginalBodyPadding() {\n  const style = window.getComputedStyle(document.body, null);\n\n  return parseInt(\n    (style && style.getPropertyValue('padding-right')) || 0,\n    10\n  );\n}\n\nexport function conditionallyUpdateScrollbar() {\n  const scrollbarWidth = getScrollbarWidth();\n  // https://github.com/twbs/bootstrap/blob/v4.0.0-alpha.6/js/src/modal.js#L433\n  const fixedContent = document.querySelectorAll('.fixed-top, .fixed-bottom, .is-fixed, .sticky-top')[0];\n  const bodyPadding = fixedContent ? parseInt(\n    fixedContent.style.paddingRight || 0,\n    10\n  ) : 0;\n\n  if (isBodyOverflowing()) {\n    setScrollbarWidth(bodyPadding + scrollbarWidth);\n  }\n}\n\nlet globalCssModule;\n\nexport function setGlobalCssModule(cssModule) {\n  globalCssModule = cssModule;\n}\n\nexport function mapToCssModules(className = '', cssModule = globalCssModule) {\n  if (!cssModule) return className;\n  return className.split(' ').map(c => cssModule[c] || c).join(' ');\n}\n\n/**\n * Returns a new object with the key/value pairs from `obj` that are not in the array `omitKeys`.\n */\nexport function omit(obj, omitKeys) {\n  const result = {};\n  Object.keys(obj).forEach((key) => {\n    if (omitKeys.indexOf(key) === -1) {\n      result[key] = obj[key];\n    }\n  });\n  return result;\n}\n\n/**\n * Returns a filtered copy of an object with only the specified keys.\n */\nexport function pick(obj, keys) {\n  const pickKeys = Array.isArray(keys) ? keys : [keys];\n  let length = pickKeys.length;\n  let key;\n  const result = {};\n\n  while (length > 0) {\n    length -= 1;\n    key = pickKeys[length];\n    result[key] = obj[key];\n  }\n  return result;\n}\n\nlet warned = {};\n\nexport function warnOnce(message) {\n  if (!warned[message]) {\n    /* istanbul ignore else */\n    if (typeof console !== 'undefined') {\n      console.error(message); // eslint-disable-line no-console\n    }\n    warned[message] = true;\n  }\n}\n\nexport function deprecated(propType, explanation) {\n  return function validate(props, propName, componentName, ...rest) {\n    if (props[propName] !== null && typeof props[propName] !== 'undefined') {\n      warnOnce(`\"${propName}\" property of \"${componentName}\" has been deprecated.\\n${explanation}`);\n    }\n\n    return propType(props, propName, componentName, ...rest);\n  };\n}\n\nexport function DOMElement(props, propName, componentName) {\n  if (!(props[propName] instanceof Element)) {\n    return new Error(\n      'Invalid prop `' + propName + '` supplied to `' + componentName +\n      '`. Expected prop to be an instance of Element. Validation failed.'\n    );\n  }\n}\n\nexport function getTarget(target) {\n  if (isFunction(target)) {\n    return target();\n  }\n\n  if (typeof target === 'string' && document) {\n    let selection = document.querySelector(target);\n    if (selection === null) {\n      selection = document.querySelector(`#${target}`);\n    }\n    if (selection === null) {\n      throw new Error(`The target '${target}' could not be identified in the dom, tip: check spelling`);\n    }\n    return selection;\n  }\n\n  return target;\n}\n\n\n/* eslint key-spacing: [\"error\", { afterColon: true, align: \"value\" }] */\n// These are all setup to match what is in the bootstrap _variables.scss\n// https://github.com/twbs/bootstrap/blob/v4-dev/scss/_variables.scss\nexport const TransitionTimeouts = {\n  Fade:     150, // $transition-fade\n  Collapse: 350, // $transition-collapse\n  Modal:    300, // $modal-transition\n  Carousel: 600, // $carousel-transition\n};\n\n// Duplicated Transition.propType keys to ensure that Reactstrap builds\n// for distribution properly exclude these keys for nested child HTML attributes\n// since `react-transition-group` removes propTypes in production builds.\nexport const TransitionPropTypeKeys = [\n  'in',\n  'mountOnEnter',\n  'unmountOnExit',\n  'appear',\n  'enter',\n  'exit',\n  'timeout',\n  'onEnter',\n  'onEntering',\n  'onEntered',\n  'onExit',\n  'onExiting',\n  'onExited',\n];\n\nexport const TransitionStatuses = {\n  ENTERING: 'entering',\n  ENTERED:  'entered',\n  EXITING:  'exiting',\n  EXITED:   'exited',\n};\n\nexport const keyCodes = {\n  esc:   27,\n  space: 32,\n  tab:   9,\n  up:    38,\n  down:  40,\n};\n\nexport const PopperPlacements = [\n  'auto-start',\n  'auto',\n  'auto-end',\n  'top-start',\n  'top',\n  'top-end',\n  'right-start',\n  'right',\n  'right-end',\n  'bottom-end',\n  'bottom',\n  'bottom-start',\n  'left-end',\n  'left',\n  'left-start',\n];\n\nexport const canUseDOM = !!(\n  typeof window !== 'undefined' &&\n  window.document &&\n  window.document.createElement\n);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { mapToCssModules } from './utils';\n\nconst propTypes = {\n  tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),\n  fluid: PropTypes.bool,\n  className: PropTypes.string,\n  cssModule: PropTypes.object,\n};\n\nconst defaultProps = {\n  tag: 'div',\n};\n\nconst Container = (props) => {\n  const {\n    className,\n    cssModule,\n    fluid,\n    tag: Tag,\n    ...attributes\n  } = props;\n\n  const classes = mapToCssModules(classNames(\n    className,\n    fluid ? 'container-fluid' : 'container'\n  ), cssModule);\n\n  return (\n    <Tag {...attributes} className={classes} />\n  );\n};\n\nContainer.propTypes = propTypes;\nContainer.defaultProps = defaultProps;\n\nexport default Container;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { mapToCssModules } from './utils';\n\nconst propTypes = {\n  tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),\n  noGutters: PropTypes.bool,\n  className: PropTypes.string,\n  cssModule: PropTypes.object,\n};\n\nconst defaultProps = {\n  tag: 'div'\n};\n\nconst Row = (props) => {\n  const {\n    className,\n    cssModule,\n    noGutters,\n    tag: Tag,\n    ...attributes\n  } = props;\n\n  const classes = mapToCssModules(classNames(\n    className,\n    noGutters ? 'no-gutters' : null,\n    'row'\n  ), cssModule);\n\n  return (\n    <Tag {...attributes} className={classes} />\n  );\n};\n\nRow.propTypes = propTypes;\nRow.defaultProps = defaultProps;\n\nexport default Row;\n","import isobject from 'lodash.isobject';\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { mapToCssModules, deprecated } from './utils';\n\nconst colWidths = ['xs', 'sm', 'md', 'lg', 'xl'];\nconst stringOrNumberProp = PropTypes.oneOfType([PropTypes.number, PropTypes.string]);\n\nconst columnProps = PropTypes.oneOfType([\n  PropTypes.bool,\n  PropTypes.number,\n  PropTypes.string,\n  PropTypes.shape({\n    size: PropTypes.oneOfType([PropTypes.bool, PropTypes.number, PropTypes.string]),\n    push: deprecated(stringOrNumberProp, 'Please use the prop \"order\"'),\n    pull: deprecated(stringOrNumberProp, 'Please use the prop \"order\"'),\n    order: stringOrNumberProp,\n    offset: stringOrNumberProp\n  })\n]);\n\nconst propTypes = {\n  tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),\n  xs: columnProps,\n  sm: columnProps,\n  md: columnProps,\n  lg: columnProps,\n  xl: columnProps,\n  className: PropTypes.string,\n  cssModule: PropTypes.object,\n  widths: PropTypes.array,\n};\n\nconst defaultProps = {\n  tag: 'div',\n  widths: colWidths,\n};\n\nconst getColumnSizeClass = (isXs, colWidth, colSize) => {\n  if (colSize === true || colSize === '') {\n    return isXs ? 'col' : `col-${colWidth}`;\n  } else if (colSize === 'auto') {\n    return isXs ? 'col-auto' : `col-${colWidth}-auto`;\n  }\n\n  return isXs ? `col-${colSize}` : `col-${colWidth}-${colSize}`;\n};\n\nconst Col = (props) => {\n  const {\n    className,\n    cssModule,\n    widths,\n    tag: Tag,\n    ...attributes\n  } = props;\n  const colClasses = [];\n\n  widths.forEach((colWidth, i) => {\n    let columnProp = props[colWidth];\n\n    delete attributes[colWidth];\n\n    if (!columnProp && columnProp !== '') {\n      return;\n    }\n\n    const isXs = !i;\n\n    if (isobject(columnProp)) {\n      const colSizeInterfix = isXs ? '-' : `-${colWidth}-`;\n      const colClass = getColumnSizeClass(isXs, colWidth, columnProp.size);\n\n      colClasses.push(mapToCssModules(classNames({\n        [colClass]: columnProp.size || columnProp.size === '',\n        [`order${colSizeInterfix}${columnProp.order}`]: columnProp.order || columnProp.order === 0,\n        [`offset${colSizeInterfix}${columnProp.offset}`]: columnProp.offset || columnProp.offset === 0\n      }), cssModule));\n    } else {\n      const colClass = getColumnSizeClass(isXs, colWidth, columnProp);\n      colClasses.push(colClass);\n    }\n  });\n\n  if (!colClasses.length) {\n    colClasses.push('col');\n  }\n\n  const classes = mapToCssModules(classNames(\n    className,\n    colClasses\n  ), cssModule);\n\n  return (\n    <Tag {...attributes} className={classes} />\n  );\n};\n\nCol.propTypes = propTypes;\nCol.defaultProps = defaultProps;\n\nexport default Col;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { mapToCssModules, deprecated } from './utils';\n\nconst propTypes = {\n  light: PropTypes.bool,\n  dark: PropTypes.bool,\n  inverse: deprecated(PropTypes.bool, 'Please use the prop \"dark\"'),\n  full: PropTypes.bool,\n  fixed: PropTypes.string,\n  sticky: PropTypes.string,\n  color: PropTypes.string,\n  role: PropTypes.string,\n  tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),\n  className: PropTypes.string,\n  cssModule: PropTypes.object,\n  toggleable: deprecated(PropTypes.oneOfType([PropTypes.bool, PropTypes.string]), 'Please use the prop \"expand\"'),\n  expand: PropTypes.oneOfType([PropTypes.bool, PropTypes.string]),\n};\n\nconst defaultProps = {\n  tag: 'nav',\n  expand: false,\n};\n\nconst getExpandClass = (expand) => {\n  if (expand === false) {\n    return false;\n  } else if (expand === true || expand === 'xs') {\n    return 'navbar-expand';\n  }\n\n  return `navbar-expand-${expand}`;\n};\n\n// To better maintain backwards compatibility while toggleable is deprecated.\n// We must map breakpoints to the next breakpoint so that toggleable and expand do the same things at the same breakpoint.\nconst toggleableToExpand = {\n  xs: 'sm',\n  sm: 'md',\n  md: 'lg',\n  lg: 'xl',\n};\n\nconst getToggleableClass = (toggleable) => {\n  if (toggleable === undefined || toggleable === 'xl') {\n    return false;\n  } else if (toggleable === false) {\n    return 'navbar-expand';\n  }\n\n  return `navbar-expand-${toggleable === true ? 'sm' : (toggleableToExpand[toggleable] || toggleable)}`;\n};\n\nconst Navbar = (props) => {\n  const {\n    toggleable,\n    expand,\n    className,\n    cssModule,\n    light,\n    dark,\n    inverse,\n    fixed,\n    sticky,\n    color,\n    tag: Tag,\n    ...attributes\n  } = props;\n\n  const classes = mapToCssModules(classNames(\n    className,\n    'navbar',\n    getExpandClass(expand) || getToggleableClass(toggleable),\n    {\n      'navbar-light': light,\n      'navbar-dark': inverse || dark,\n      [`bg-${color}`]: color,\n      [`fixed-${fixed}`]: fixed,\n      [`sticky-${sticky}`]: sticky,\n    }\n  ), cssModule);\n\n  return (\n    <Tag {...attributes} className={classes} />\n  );\n};\n\nNavbar.propTypes = propTypes;\nNavbar.defaultProps = defaultProps;\n\nexport default Navbar;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { mapToCssModules } from './utils';\n\nconst propTypes = {\n  tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),\n  className: PropTypes.string,\n  cssModule: PropTypes.object,\n};\n\nconst defaultProps = {\n  tag: 'a'\n};\n\nconst NavbarBrand = (props) => {\n  const {\n    className,\n    cssModule,\n    tag: Tag,\n    ...attributes\n  } = props;\n\n  const classes = mapToCssModules(classNames(\n    className,\n    'navbar-brand'\n  ), cssModule);\n\n  return (\n    <Tag {...attributes} className={classes} />\n  );\n};\n\nNavbarBrand.propTypes = propTypes;\nNavbarBrand.defaultProps = defaultProps;\n\nexport default NavbarBrand;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { mapToCssModules } from './utils';\n\nconst propTypes = {\n  tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),\n  type: PropTypes.string,\n  className: PropTypes.string,\n  cssModule: PropTypes.object,\n  children: PropTypes.node,\n};\n\nconst defaultProps = {\n  tag: 'button',\n  type: 'button'\n};\n\nconst NavbarToggler = (props) => {\n  const {\n    className,\n    cssModule,\n    children,\n    tag: Tag,\n    ...attributes\n  } = props;\n\n  const classes = mapToCssModules(classNames(\n    className,\n    'navbar-toggler'\n  ), cssModule);\n\n  return (\n    <Tag {...attributes} className={classes}>\n      {children || <span className={mapToCssModules('navbar-toggler-icon', cssModule)} />}\n    </Tag>\n  );\n};\n\nNavbarToggler.propTypes = propTypes;\nNavbarToggler.defaultProps = defaultProps;\n\nexport default NavbarToggler;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { mapToCssModules } from './utils';\n\nconst propTypes = {\n  tabs: PropTypes.bool,\n  pills: PropTypes.bool,\n  vertical: PropTypes.oneOfType([PropTypes.bool, PropTypes.string]),\n  horizontal: PropTypes.string,\n  justified: PropTypes.bool,\n  fill: PropTypes.bool,\n  navbar: PropTypes.bool,\n  card: PropTypes.bool,\n  tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),\n  className: PropTypes.string,\n  cssModule: PropTypes.object,\n};\n\nconst defaultProps = {\n  tag: 'ul',\n  vertical: false,\n};\n\nconst getVerticalClass = (vertical) => {\n  if (vertical === false) {\n    return false;\n  } else if (vertical === true || vertical === 'xs') {\n    return 'flex-column';\n  }\n\n  return `flex-${vertical}-column`;\n};\n\nconst Nav = (props) => {\n  const {\n    className,\n    cssModule,\n    tabs,\n    pills,\n    vertical,\n    horizontal,\n    justified,\n    fill,\n    navbar,\n    card,\n    tag: Tag,\n    ...attributes\n  } = props;\n\n  const classes = mapToCssModules(classNames(\n    className,\n    navbar ? 'navbar-nav' : 'nav',\n    horizontal ? `justify-content-${horizontal}` : false,\n    getVerticalClass(vertical),\n    {\n      'nav-tabs': tabs,\n      'card-header-tabs': card && tabs,\n      'nav-pills': pills,\n      'card-header-pills': card && pills,\n      'nav-justified': justified,\n      'nav-fill': fill,\n    }\n  ), cssModule);\n\n  return (\n    <Tag {...attributes} className={classes} />\n  );\n};\n\nNav.propTypes = propTypes;\nNav.defaultProps = defaultProps;\n\nexport default Nav;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { mapToCssModules } from './utils';\n\nconst propTypes = {\n  tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),\n  active: PropTypes.bool,\n  className: PropTypes.string,\n  cssModule: PropTypes.object,\n};\n\nconst defaultProps = {\n  tag: 'li'\n};\n\nconst NavItem = (props) => {\n  const {\n    className,\n    cssModule,\n    active,\n    tag: Tag,\n    ...attributes\n  } = props;\n\n  const classes = mapToCssModules(classNames(\n    className,\n    'nav-item',\n    active ? 'active' : false\n  ), cssModule);\n\n  return (\n    <Tag {...attributes} className={classes} />\n  );\n};\n\nNavItem.propTypes = propTypes;\nNavItem.defaultProps = defaultProps;\n\nexport default NavItem;\n","/* eslint react/no-find-dom-node: 0 */\n// https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/no-find-dom-node.md\n\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport ReactDOM from 'react-dom';\nimport { Manager } from 'react-popper';\nimport classNames from 'classnames';\nimport { mapToCssModules, omit, keyCodes, deprecated } from './utils';\n\nconst propTypes = {\n  disabled: PropTypes.bool,\n  dropup: deprecated(PropTypes.bool, 'Please use the prop \"direction\" with the value \"up\".'),\n  direction: PropTypes.oneOf(['up', 'down', 'left', 'right']),\n  group: PropTypes.bool,\n  isOpen: PropTypes.bool,\n  nav: PropTypes.bool,\n  active: PropTypes.bool,\n  addonType: PropTypes.oneOfType([PropTypes.bool, PropTypes.oneOf(['prepend', 'append'])]),\n  size: PropTypes.string,\n  tag: PropTypes.string,\n  toggle: PropTypes.func,\n  children: PropTypes.node,\n  className: PropTypes.string,\n  cssModule: PropTypes.object,\n  inNavbar: PropTypes.bool,\n};\n\nconst defaultProps = {\n  isOpen: false,\n  direction: 'down',\n  nav: false,\n  active: false,\n  addonType: false,\n  inNavbar: false,\n};\n\nconst childContextTypes = {\n  toggle: PropTypes.func.isRequired,\n  isOpen: PropTypes.bool.isRequired,\n  direction: PropTypes.oneOf(['up', 'down', 'left', 'right']).isRequired,\n  inNavbar: PropTypes.bool.isRequired,\n};\n\nclass Dropdown extends React.Component {\n  constructor(props) {\n    super(props);\n\n    this.addEvents = this.addEvents.bind(this);\n    this.handleDocumentClick = this.handleDocumentClick.bind(this);\n    this.handleKeyDown = this.handleKeyDown.bind(this);\n    this.removeEvents = this.removeEvents.bind(this);\n    this.toggle = this.toggle.bind(this);\n  }\n\n  getChildContext() {\n    return {\n      toggle: this.props.toggle,\n      isOpen: this.props.isOpen,\n      direction: (this.props.direction === 'down' && this.props.dropup) ? 'up' : this.props.direction,\n      inNavbar: this.props.inNavbar,\n    };\n  }\n\n  componentDidMount() {\n    this.handleProps();\n  }\n\n  componentDidUpdate(prevProps) {\n    if (this.props.isOpen !== prevProps.isOpen) {\n      this.handleProps();\n    }\n  }\n\n  componentWillUnmount() {\n    this.removeEvents();\n  }\n\n  getContainer() {\n    return ReactDOM.findDOMNode(this);\n  }\n\n  addEvents() {\n    ['click', 'touchstart', 'keyup'].forEach(event =>\n      document.addEventListener(event, this.handleDocumentClick, true)\n    );\n  }\n\n  removeEvents() {\n    ['click', 'touchstart', 'keyup'].forEach(event =>\n      document.removeEventListener(event, this.handleDocumentClick, true)\n    );\n  }\n\n  handleDocumentClick(e) {\n    if (e && (e.which === 3 || (e.type === 'keyup' && e.which !== keyCodes.tab))) return;\n    const container = this.getContainer();\n\n    if (container.contains(e.target) && container !== e.target && (e.type !== 'keyup' || e.which === keyCodes.tab)) {\n      return;\n    }\n\n    this.toggle(e);\n  }\n\n  handleKeyDown(e) {\n    if ([keyCodes.esc, keyCodes.up, keyCodes.down, keyCodes.space].indexOf(e.which) === -1 ||\n      (/button/i.test(e.target.tagName) && e.which === keyCodes.space) ||\n      /input|textarea/i.test(e.target.tagName)) {\n      return;\n    }\n\n    e.preventDefault();\n    if (this.props.disabled) return;\n\n    const container = this.getContainer();\n\n    if (e.which === keyCodes.space && this.props.isOpen && container !== e.target) {\n      e.target.click();\n    }\n\n    if (e.which === keyCodes.esc || !this.props.isOpen) {\n      this.toggle(e);\n      container.querySelector('[aria-expanded]').focus();\n      return;\n    }\n\n    const menuClass = mapToCssModules('dropdown-menu', this.props.cssModule);\n    const itemClass = mapToCssModules('dropdown-item', this.props.cssModule);\n    const disabledClass = mapToCssModules('disabled', this.props.cssModule);\n\n    const items = container.querySelectorAll(`.${menuClass} .${itemClass}:not(.${disabledClass})`);\n\n    if (!items.length) return;\n\n    let index = -1;\n    for (let i = 0; i < items.length; i += 1) {\n      if (items[i] === e.target) {\n        index = i;\n        break;\n      }\n    }\n\n    if (e.which === keyCodes.up && index > 0) {\n      index -= 1;\n    }\n\n    if (e.which === keyCodes.down && index < items.length - 1) {\n      index += 1;\n    }\n\n    if (index < 0) {\n      index = 0;\n    }\n\n    items[index].focus();\n  }\n\n  handleProps() {\n    if (this.props.isOpen) {\n      this.addEvents();\n    } else {\n      this.removeEvents();\n    }\n  }\n\n  toggle(e) {\n    if (this.props.disabled) {\n      return e && e.preventDefault();\n    }\n\n    return this.props.toggle(e);\n  }\n\n  render() {\n    const {\n      className,\n      cssModule,\n      dropup,\n      isOpen,\n      group,\n      size,\n      nav,\n      active,\n      addonType,\n      ...attrs\n    } = omit(this.props, ['toggle', 'disabled', 'inNavbar', 'direction']);\n\n    const direction = (this.props.direction === 'down' && dropup) ? 'up' : this.props.direction;\n\n    attrs.tag = attrs.tag || (nav ? 'li' : 'div');\n\n    const classes = mapToCssModules(classNames(\n      className,\n      direction !== 'down' && `drop${direction}`,\n      nav && active ? 'active' : false,\n      {\n        [`input-group-${addonType}`]: addonType,\n        'btn-group': group,\n        [`btn-group-${size}`]: !!size,\n        dropdown: !group && !addonType,\n        show: isOpen,\n        'nav-item': nav\n      }\n    ), cssModule);\n    return <Manager {...attrs} className={classes} onKeyDown={this.handleKeyDown} />;\n  }\n}\n\nDropdown.propTypes = propTypes;\nDropdown.defaultProps = defaultProps;\nDropdown.childContextTypes = childContextTypes;\n\nexport default Dropdown;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { mapToCssModules } from './utils';\n\nconst propTypes = {\n  tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),\n  innerRef: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),\n  disabled: PropTypes.bool,\n  active: PropTypes.bool,\n  className: PropTypes.string,\n  cssModule: PropTypes.object,\n  onClick: PropTypes.func,\n  href: PropTypes.any,\n};\n\nconst defaultProps = {\n  tag: 'a',\n};\n\nclass NavLink extends React.Component {\n  constructor(props) {\n    super(props);\n\n    this.onClick = this.onClick.bind(this);\n  }\n\n  onClick(e) {\n    if (this.props.disabled) {\n      e.preventDefault();\n      return;\n    }\n\n    if (this.props.href === '#') {\n      e.preventDefault();\n    }\n\n    if (this.props.onClick) {\n      this.props.onClick(e);\n    }\n  }\n\n  render() {\n    let {\n      className,\n      cssModule,\n      active,\n      tag: Tag,\n      innerRef,\n      ...attributes\n    } = this.props;\n\n    const classes = mapToCssModules(classNames(\n      className,\n      'nav-link',\n      {\n        disabled: attributes.disabled,\n        active: active\n      }\n    ), cssModule);\n\n    return (\n      <Tag {...attributes} ref={innerRef} onClick={this.onClick} className={classes} />\n    );\n  }\n}\n\nNavLink.propTypes = propTypes;\nNavLink.defaultProps = defaultProps;\n\nexport default NavLink;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { mapToCssModules } from './utils';\n\nconst propTypes = {\n  tag: PropTypes.string,\n  className: PropTypes.string,\n  cssModule: PropTypes.object,\n};\n\nconst defaultProps = {\n  tag: 'ol'\n};\n\nconst Breadcrumb = (props) => {\n  const {\n    className,\n    cssModule,\n    tag: Tag,\n    ...attributes\n  } = props;\n  const classes = mapToCssModules(classNames(\n    className,\n    'breadcrumb'\n  ), cssModule);\n\n  return (\n    <Tag {...attributes} className={classes} />\n  );\n};\n\nBreadcrumb.propTypes = propTypes;\nBreadcrumb.defaultProps = defaultProps;\n\nexport default Breadcrumb;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { mapToCssModules } from './utils';\n\nconst propTypes = {\n  tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),\n  active: PropTypes.bool,\n  className: PropTypes.string,\n  cssModule: PropTypes.object,\n};\n\nconst defaultProps = {\n  tag: 'li'\n};\n\nconst BreadcrumbItem = (props) => {\n  const {\n    className,\n    cssModule,\n    active,\n    tag: Tag,\n    ...attributes\n  } = props;\n  const classes = mapToCssModules(classNames(\n    className,\n    active ? 'active' : false,\n    'breadcrumb-item'\n  ), cssModule);\n\n  return (\n    <Tag {...attributes} className={classes} />\n  );\n};\n\nBreadcrumbItem.propTypes = propTypes;\nBreadcrumbItem.defaultProps = defaultProps;\n\nexport default BreadcrumbItem;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { mapToCssModules } from './utils';\n\nconst propTypes = {\n  active: PropTypes.bool,\n  block: PropTypes.bool,\n  color: PropTypes.string,\n  disabled: PropTypes.bool,\n  outline: PropTypes.bool,\n  tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),\n  innerRef: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),\n  onClick: PropTypes.func,\n  size: PropTypes.string,\n  children: PropTypes.node,\n  className: PropTypes.string,\n  cssModule: PropTypes.object,\n};\n\nconst defaultProps = {\n  color: 'secondary',\n  tag: 'button',\n};\n\nclass Button extends React.Component {\n  constructor(props) {\n    super(props);\n\n    this.onClick = this.onClick.bind(this);\n  }\n\n  onClick(e) {\n    if (this.props.disabled) {\n      e.preventDefault();\n      return;\n    }\n\n    if (this.props.onClick) {\n      this.props.onClick(e);\n    }\n  }\n\n  render() {\n    let {\n      active,\n      block,\n      className,\n      cssModule,\n      color,\n      outline,\n      size,\n      tag: Tag,\n      innerRef,\n      ...attributes\n    } = this.props;\n\n    const classes = mapToCssModules(classNames(\n      className,\n      'btn',\n      `btn${outline ? '-outline' : ''}-${color}`,\n      size ? `btn-${size}` : false,\n      block ? 'btn-block' : false,\n      { active, disabled: this.props.disabled }\n    ), cssModule);\n\n    if (attributes.href && Tag === 'button') {\n      Tag = 'a';\n    }\n\n    return (\n      <Tag\n        type={(Tag === 'button' && attributes.onClick) ? 'button' : undefined}\n        {...attributes}\n        className={classes}\n        ref={innerRef}\n        onClick={this.onClick}\n      />\n    );\n  }\n}\n\nButton.propTypes = propTypes;\nButton.defaultProps = defaultProps;\n\nexport default Button;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport Dropdown from './Dropdown';\n\nconst propTypes = {\n  children: PropTypes.node,\n};\n\nconst ButtonDropdown = (props) => {\n  return (\n    <Dropdown group {...props} />\n  );\n};\n\nButtonDropdown.propTypes = propTypes;\n\nexport default ButtonDropdown;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { mapToCssModules } from './utils';\n\nconst propTypes = {\n  tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),\n  'aria-label': PropTypes.string,\n  className: PropTypes.string,\n  cssModule: PropTypes.object,\n  role: PropTypes.string,\n  size: PropTypes.string,\n  vertical: PropTypes.bool,\n};\n\nconst defaultProps = {\n  tag: 'div',\n  role: 'group',\n};\n\nconst ButtonGroup = (props) => {\n  const {\n    className,\n    cssModule,\n    size,\n    vertical,\n    tag: Tag,\n    ...attributes\n  } = props;\n\n  const classes = mapToCssModules(classNames(\n    className,\n    size ? 'btn-group-' + size : false,\n    vertical ? 'btn-group-vertical' : 'btn-group'\n  ), cssModule);\n\n  return (\n    <Tag {...attributes} className={classes} />\n  );\n};\n\nButtonGroup.propTypes = propTypes;\nButtonGroup.defaultProps = defaultProps;\n\nexport default ButtonGroup;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { mapToCssModules } from './utils';\n\nconst propTypes = {\n  tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),\n  'aria-label': PropTypes.string,\n  className: PropTypes.string,\n  cssModule: PropTypes.object,\n  role: PropTypes.string,\n};\n\nconst defaultProps = {\n  tag: 'div',\n  role: 'toolbar',\n};\n\nconst ButtonToolbar = (props) => {\n  const {\n    className,\n    cssModule,\n    tag: Tag,\n    ...attributes\n  } = props;\n\n  const classes = mapToCssModules(classNames(\n    className,\n    'btn-toolbar'\n  ), cssModule);\n\n  return (\n    <Tag {...attributes} className={classes} />\n  );\n};\n\nButtonToolbar.propTypes = propTypes;\nButtonToolbar.defaultProps = defaultProps;\n\nexport default ButtonToolbar;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { mapToCssModules, omit } from './utils';\n\nconst propTypes = {\n  children: PropTypes.node,\n  active: PropTypes.bool,\n  disabled: PropTypes.bool,\n  divider: PropTypes.bool,\n  tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),\n  header: PropTypes.bool,\n  onClick: PropTypes.func,\n  className: PropTypes.string,\n  cssModule: PropTypes.object,\n  toggle: PropTypes.bool\n};\n\nconst contextTypes = {\n  toggle: PropTypes.func\n};\n\nconst defaultProps = {\n  tag: 'button',\n  toggle: true\n};\n\nclass DropdownItem extends React.Component {\n  constructor(props) {\n    super(props);\n\n    this.onClick = this.onClick.bind(this);\n    this.getTabIndex = this.getTabIndex.bind(this);\n  }\n\n  onClick(e) {\n    if (this.props.disabled || this.props.header || this.props.divider) {\n      e.preventDefault();\n      return;\n    }\n\n    if (this.props.onClick) {\n      this.props.onClick(e);\n    }\n\n    if (this.props.toggle) {\n      this.context.toggle(e);\n    }\n  }\n\n  getTabIndex() {\n    if (this.props.disabled || this.props.header || this.props.divider) {\n      return '-1';\n    }\n\n    return '0';\n  }\n\n  render() {\n    const tabIndex = this.getTabIndex();\n    let {\n      className,\n      cssModule,\n      divider,\n      tag: Tag,\n      header,\n      active,\n      ...props } = omit(this.props, ['toggle']);\n\n    const classes = mapToCssModules(classNames(\n      className,\n      {\n        disabled: props.disabled,\n        'dropdown-item': !divider && !header,\n        active: active,\n        'dropdown-header': header,\n        'dropdown-divider': divider\n      }\n    ), cssModule);\n\n    if (Tag === 'button') {\n      if (header) {\n        Tag = 'h6';\n      } else if (divider) {\n        Tag = 'div';\n      } else if (props.href) {\n        Tag = 'a';\n      }\n    }\n\n    return (\n      <Tag\n        type={(Tag === 'button' && (props.onClick || this.props.toggle)) ? 'button' : undefined}\n        {...props}\n        tabIndex={tabIndex}\n        className={classes}\n        onClick={this.onClick}\n      />\n    );\n  }\n}\n\nDropdownItem.propTypes = propTypes;\nDropdownItem.defaultProps = defaultProps;\nDropdownItem.contextTypes = contextTypes;\n\nexport default DropdownItem;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { Popper } from 'react-popper';\nimport { mapToCssModules } from './utils';\n\nconst propTypes = {\n  tag: PropTypes.string,\n  children: PropTypes.node.isRequired,\n  right: PropTypes.bool,\n  flip: PropTypes.bool,\n  className: PropTypes.string,\n  cssModule: PropTypes.object,\n};\n\nconst defaultProps = {\n  tag: 'div',\n  flip: true,\n};\n\nconst contextTypes = {\n  isOpen: PropTypes.bool.isRequired,\n  direction: PropTypes.oneOf(['up', 'down', 'left', 'right']).isRequired,\n  inNavbar: PropTypes.bool.isRequired,\n};\n\nconst noFlipModifier = { flip: { enabled: false } };\n\nconst directionPositionMap = {\n  up: 'top',\n  left: 'left',\n  right: 'right',\n  down: 'bottom',\n};\n\nconst DropdownMenu = (props, context) => {\n  const { className, cssModule, right, tag, flip, ...attrs } = props;\n  const classes = mapToCssModules(classNames(\n    className,\n    'dropdown-menu',\n    {\n      'dropdown-menu-right': right,\n      show: context.isOpen,\n    }\n  ), cssModule);\n\n  let Tag = tag;\n\n  if (context.isOpen && !context.inNavbar) {\n    Tag = Popper;\n\n    const position1 = directionPositionMap[context.direction] || 'bottom';\n    const position2 = right ? 'end' : 'start';\n    attrs.placement = `${position1}-${position2}`;\n    attrs.component = tag;\n    attrs.modifiers = !flip ? noFlipModifier : undefined;\n  }\n\n  return (\n    <Tag\n      tabIndex=\"-1\"\n      role=\"menu\"\n      {...attrs}\n      aria-hidden={!context.isOpen}\n      className={classes}\n    />\n  );\n};\n\nDropdownMenu.propTypes = propTypes;\nDropdownMenu.defaultProps = defaultProps;\nDropdownMenu.contextTypes = contextTypes;\n\nexport default DropdownMenu;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { Target } from 'react-popper';\nimport { mapToCssModules } from './utils';\nimport Button from './Button';\n\nconst propTypes = {\n  caret: PropTypes.bool,\n  color: PropTypes.string,\n  children: PropTypes.node,\n  className: PropTypes.string,\n  cssModule: PropTypes.object,\n  disabled: PropTypes.bool,\n  onClick: PropTypes.func,\n  'aria-haspopup': PropTypes.bool,\n  split: PropTypes.bool,\n  tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),\n  nav: PropTypes.bool,\n};\n\nconst defaultProps = {\n  'aria-haspopup': true,\n  color: 'secondary',\n};\n\nconst contextTypes = {\n  isOpen: PropTypes.bool.isRequired,\n  toggle: PropTypes.func.isRequired,\n  inNavbar: PropTypes.bool.isRequired,\n};\n\nclass DropdownToggle extends React.Component {\n  constructor(props) {\n    super(props);\n\n    this.onClick = this.onClick.bind(this);\n  }\n\n  onClick(e) {\n    if (this.props.disabled) {\n      e.preventDefault();\n      return;\n    }\n\n    if (this.props.nav && !this.props.tag) {\n      e.preventDefault();\n    }\n\n    if (this.props.onClick) {\n      this.props.onClick(e);\n    }\n\n    this.context.toggle(e);\n  }\n\n  render() {\n    const { className, color, cssModule, caret, split, nav, tag, ...props } = this.props;\n    const ariaLabel = props['aria-label'] || 'Toggle Dropdown';\n    const classes = mapToCssModules(classNames(\n      className,\n      {\n        'dropdown-toggle': caret || split,\n        'dropdown-toggle-split': split,\n        'nav-link': nav\n      }\n    ), cssModule);\n    const children = props.children || <span className=\"sr-only\">{ariaLabel}</span>;\n\n    let Tag;\n\n    if (nav && !tag) {\n      Tag = 'a';\n      props.href = '#';\n    } else if (!tag) {\n      Tag = Button;\n      props.color = color;\n      props.cssModule = cssModule;\n    } else {\n      Tag = tag;\n    }\n\n    if (this.context.inNavbar) {\n      return (\n        <Tag\n          {...props}\n          className={classes}\n          onClick={this.onClick}\n          aria-expanded={this.context.isOpen}\n          children={children}\n        />\n      );\n    }\n\n    return (\n      <Target\n        {...props}\n        className={classes}\n        component={Tag}\n        onClick={this.onClick}\n        aria-expanded={this.context.isOpen}\n        children={children}\n      />\n    );\n  }\n}\n\nDropdownToggle.propTypes = propTypes;\nDropdownToggle.defaultProps = defaultProps;\nDropdownToggle.contextTypes = contextTypes;\n\nexport default DropdownToggle;\n","'use strict';\n\nexports.__esModule = true;\nexports.classNamesShape = exports.timeoutsShape = undefined;\nexports.transitionTimeout = transitionTimeout;\n\nvar _propTypes = require('prop-types');\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction transitionTimeout(transitionType) {\n  var timeoutPropName = 'transition' + transitionType + 'Timeout';\n  var enabledPropName = 'transition' + transitionType;\n\n  return function (props) {\n    // If the transition is enabled\n    if (props[enabledPropName]) {\n      // If no timeout duration is provided\n      if (props[timeoutPropName] == null) {\n        return new Error(timeoutPropName + ' wasn\\'t supplied to CSSTransitionGroup: ' + 'this can cause unreliable animations and won\\'t be supported in ' + 'a future version of React. See ' + 'https://fb.me/react-animation-transition-group-timeout for more ' + 'information.');\n\n        // If the duration isn't a number\n      } else if (typeof props[timeoutPropName] !== 'number') {\n        return new Error(timeoutPropName + ' must be a number (in milliseconds)');\n      }\n    }\n\n    return null;\n  };\n}\n\nvar timeoutsShape = exports.timeoutsShape = _propTypes2.default.oneOfType([_propTypes2.default.number, _propTypes2.default.shape({\n  enter: _propTypes2.default.number,\n  exit: _propTypes2.default.number\n}).isRequired]);\n\nvar classNamesShape = exports.classNamesShape = _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.shape({\n  enter: _propTypes2.default.string,\n  exit: _propTypes2.default.string,\n  active: _propTypes2.default.string\n}), _propTypes2.default.shape({\n  enter: _propTypes2.default.string,\n  enterActive: _propTypes2.default.string,\n  exit: _propTypes2.default.string,\n  exitActive: _propTypes2.default.string\n})]);","'use strict';\n\nexports.__esModule = true;\nexports.EXITING = exports.ENTERED = exports.ENTERING = exports.EXITED = exports.UNMOUNTED = undefined;\n\nvar _propTypes = require('prop-types');\n\nvar PropTypes = _interopRequireWildcard(_propTypes);\n\nvar _react = require('react');\n\nvar _react2 = _interopRequireDefault(_react);\n\nvar _reactDom = require('react-dom');\n\nvar _reactDom2 = _interopRequireDefault(_reactDom);\n\nvar _PropTypes = require('./utils/PropTypes');\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }\n\nfunction _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar UNMOUNTED = exports.UNMOUNTED = 'unmounted';\nvar EXITED = exports.EXITED = 'exited';\nvar ENTERING = exports.ENTERING = 'entering';\nvar ENTERED = exports.ENTERED = 'entered';\nvar EXITING = exports.EXITING = 'exiting';\n\n/**\n * The Transition component lets you describe a transition from one component\n * state to another _over time_ with a simple declarative API. Most commonly\n * it's used to animate the mounting and unmounting of a component, but can also\n * be used to describe in-place transition states as well.\n *\n * By default the `Transition` component does not alter the behavior of the\n * component it renders, it only tracks \"enter\" and \"exit\" states for the components.\n * It's up to you to give meaning and effect to those states. For example we can\n * add styles to a component when it enters or exits:\n *\n * ```jsx\n * import Transition from 'react-transition-group/Transition';\n *\n * const duration = 300;\n *\n * const defaultStyle = {\n *   transition: `opacity ${duration}ms ease-in-out`,\n *   opacity: 0,\n * }\n *\n * const transitionStyles = {\n *   entering: { opacity: 0 },\n *   entered:  { opacity: 1 },\n * };\n *\n * const Fade = ({ in: inProp }) => (\n *   <Transition in={inProp} timeout={duration}>\n *     {(state) => (\n *       <div style={{\n *         ...defaultStyle,\n *         ...transitionStyles[state]\n *       }}>\n *         I'm A fade Transition!\n *       </div>\n *     )}\n *   </Transition>\n * );\n * ```\n *\n * As noted the `Transition` component doesn't _do_ anything by itself to its child component.\n * What it does do is track transition states over time so you can update the\n * component (such as by adding styles or classes) when it changes states.\n *\n * There are 4 main states a Transition can be in:\n *  - `ENTERING`\n *  - `ENTERED`\n *  - `EXITING`\n *  - `EXITED`\n *\n * Transition state is toggled via the `in` prop. When `true` the component begins the\n * \"Enter\" stage. During this stage, the component will shift from its current transition state,\n * to `'entering'` for the duration of the transition and then to the `'entered'` stage once\n * it's complete. Let's take the following example:\n *\n * ```jsx\n * state= { in: false };\n *\n * toggleEnterState = () => {\n *   this.setState({ in: true });\n * }\n *\n * render() {\n *   return (\n *     <div>\n *       <Transition in={this.state.in} timeout={500} />\n *       <button onClick={this.toggleEnterState}>Click to Enter</button>\n *     </div>\n *   );\n * }\n * ```\n *\n * When the button is clicked the component will shift to the `'entering'` state and\n * stay there for 500ms (the value of `timeout`) when finally switches to `'entered'`.\n *\n * When `in` is `false` the same thing happens except the state moves from `'exiting'` to `'exited'`.\n */\n\nvar Transition = function (_React$Component) {\n  _inherits(Transition, _React$Component);\n\n  function Transition(props, context) {\n    _classCallCheck(this, Transition);\n\n    var _this = _possibleConstructorReturn(this, _React$Component.call(this, props, context));\n\n    var parentGroup = context.transitionGroup;\n    // In the context of a TransitionGroup all enters are really appears\n    var appear = parentGroup && !parentGroup.isMounting ? props.enter : props.appear;\n\n    var initialStatus = void 0;\n    _this.nextStatus = null;\n\n    if (props.in) {\n      if (appear) {\n        initialStatus = EXITED;\n        _this.nextStatus = ENTERING;\n      } else {\n        initialStatus = ENTERED;\n      }\n    } else {\n      if (props.unmountOnExit || props.mountOnEnter) {\n        initialStatus = UNMOUNTED;\n      } else {\n        initialStatus = EXITED;\n      }\n    }\n\n    _this.state = { status: initialStatus };\n\n    _this.nextCallback = null;\n    return _this;\n  }\n\n  Transition.prototype.getChildContext = function getChildContext() {\n    return { transitionGroup: null }; // allows for nested Transitions\n  };\n\n  Transition.prototype.componentDidMount = function componentDidMount() {\n    this.updateStatus(true);\n  };\n\n  Transition.prototype.componentWillReceiveProps = function componentWillReceiveProps(nextProps) {\n    var _ref = this.pendingState || this.state,\n        status = _ref.status;\n\n    if (nextProps.in) {\n      if (status === UNMOUNTED) {\n        this.setState({ status: EXITED });\n      }\n      if (status !== ENTERING && status !== ENTERED) {\n        this.nextStatus = ENTERING;\n      }\n    } else {\n      if (status === ENTERING || status === ENTERED) {\n        this.nextStatus = EXITING;\n      }\n    }\n  };\n\n  Transition.prototype.componentDidUpdate = function componentDidUpdate() {\n    this.updateStatus();\n  };\n\n  Transition.prototype.componentWillUnmount = function componentWillUnmount() {\n    this.cancelNextCallback();\n  };\n\n  Transition.prototype.getTimeouts = function getTimeouts() {\n    var timeout = this.props.timeout;\n\n    var exit = void 0,\n        enter = void 0,\n        appear = void 0;\n\n    exit = enter = appear = timeout;\n\n    if (timeout != null && typeof timeout !== 'number') {\n      exit = timeout.exit;\n      enter = timeout.enter;\n      appear = timeout.appear;\n    }\n    return { exit: exit, enter: enter, appear: appear };\n  };\n\n  Transition.prototype.updateStatus = function updateStatus() {\n    var mounting = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n    var nextStatus = this.nextStatus;\n\n    if (nextStatus !== null) {\n      this.nextStatus = null;\n      // nextStatus will always be ENTERING or EXITING.\n      this.cancelNextCallback();\n      var node = _reactDom2.default.findDOMNode(this);\n\n      if (nextStatus === ENTERING) {\n        this.performEnter(node, mounting);\n      } else {\n        this.performExit(node);\n      }\n    } else if (this.props.unmountOnExit && this.state.status === EXITED) {\n      this.setState({ status: UNMOUNTED });\n    }\n  };\n\n  Transition.prototype.performEnter = function performEnter(node, mounting) {\n    var _this2 = this;\n\n    var enter = this.props.enter;\n\n    var appearing = this.context.transitionGroup ? this.context.transitionGroup.isMounting : mounting;\n\n    var timeouts = this.getTimeouts();\n\n    // no enter animation skip right to ENTERED\n    // if we are mounting and running this it means appear _must_ be set\n    if (!mounting && !enter) {\n      this.safeSetState({ status: ENTERED }, function () {\n        _this2.props.onEntered(node);\n      });\n      return;\n    }\n\n    this.props.onEnter(node, appearing);\n\n    this.safeSetState({ status: ENTERING }, function () {\n      _this2.props.onEntering(node, appearing);\n\n      // FIXME: appear timeout?\n      _this2.onTransitionEnd(node, timeouts.enter, function () {\n        _this2.safeSetState({ status: ENTERED }, function () {\n          _this2.props.onEntered(node, appearing);\n        });\n      });\n    });\n  };\n\n  Transition.prototype.performExit = function performExit(node) {\n    var _this3 = this;\n\n    var exit = this.props.exit;\n\n    var timeouts = this.getTimeouts();\n\n    // no exit animation skip right to EXITED\n    if (!exit) {\n      this.safeSetState({ status: EXITED }, function () {\n        _this3.props.onExited(node);\n      });\n      return;\n    }\n    this.props.onExit(node);\n\n    this.safeSetState({ status: EXITING }, function () {\n      _this3.props.onExiting(node);\n\n      _this3.onTransitionEnd(node, timeouts.exit, function () {\n        _this3.safeSetState({ status: EXITED }, function () {\n          _this3.props.onExited(node);\n        });\n      });\n    });\n  };\n\n  Transition.prototype.cancelNextCallback = function cancelNextCallback() {\n    if (this.nextCallback !== null) {\n      this.nextCallback.cancel();\n      this.nextCallback = null;\n    }\n  };\n\n  Transition.prototype.safeSetState = function safeSetState(nextState, callback) {\n    var _this4 = this;\n\n    // We need to track pending updates for instances where a cWRP fires quickly\n    // after cDM and before the state flushes, which would double trigger a\n    // transition\n    this.pendingState = nextState;\n\n    // This shouldn't be necessary, but there are weird race conditions with\n    // setState callbacks and unmounting in testing, so always make sure that\n    // we can cancel any pending setState callbacks after we unmount.\n    callback = this.setNextCallback(callback);\n    this.setState(nextState, function () {\n      _this4.pendingState = null;\n      callback();\n    });\n  };\n\n  Transition.prototype.setNextCallback = function setNextCallback(callback) {\n    var _this5 = this;\n\n    var active = true;\n\n    this.nextCallback = function (event) {\n      if (active) {\n        active = false;\n        _this5.nextCallback = null;\n\n        callback(event);\n      }\n    };\n\n    this.nextCallback.cancel = function () {\n      active = false;\n    };\n\n    return this.nextCallback;\n  };\n\n  Transition.prototype.onTransitionEnd = function onTransitionEnd(node, timeout, handler) {\n    this.setNextCallback(handler);\n\n    if (node) {\n      if (this.props.addEndListener) {\n        this.props.addEndListener(node, this.nextCallback);\n      }\n      if (timeout != null) {\n        setTimeout(this.nextCallback, timeout);\n      }\n    } else {\n      setTimeout(this.nextCallback, 0);\n    }\n  };\n\n  Transition.prototype.render = function render() {\n    var status = this.state.status;\n    if (status === UNMOUNTED) {\n      return null;\n    }\n\n    var _props = this.props,\n        children = _props.children,\n        childProps = _objectWithoutProperties(_props, ['children']);\n    // filter props for Transtition\n\n\n    delete childProps.in;\n    delete childProps.mountOnEnter;\n    delete childProps.unmountOnExit;\n    delete childProps.appear;\n    delete childProps.enter;\n    delete childProps.exit;\n    delete childProps.timeout;\n    delete childProps.addEndListener;\n    delete childProps.onEnter;\n    delete childProps.onEntering;\n    delete childProps.onEntered;\n    delete childProps.onExit;\n    delete childProps.onExiting;\n    delete childProps.onExited;\n\n    if (typeof children === 'function') {\n      return children(status, childProps);\n    }\n\n    var child = _react2.default.Children.only(children);\n    return _react2.default.cloneElement(child, childProps);\n  };\n\n  return Transition;\n}(_react2.default.Component);\n\nTransition.contextTypes = {\n  transitionGroup: PropTypes.object\n};\nTransition.childContextTypes = {\n  transitionGroup: function transitionGroup() {}\n};\n\n\nTransition.propTypes = process.env.NODE_ENV !== \"production\" ? {\n  /**\n   * A `function` child can be used instead of a React element.\n   * This function is called with the current transition status\n   * ('entering', 'entered', 'exiting', 'exited', 'unmounted'), which can used\n   * to apply context specific props to a component.\n   *\n   * ```jsx\n   * <Transition timeout={150}>\n   *   {(status) => (\n   *     <MyComponent className={`fade fade-${status}`} />\n   *   )}\n   * </Transition>\n   * ```\n   */\n  children: PropTypes.oneOfType([PropTypes.func.isRequired, PropTypes.element.isRequired]).isRequired,\n\n  /**\n   * Show the component; triggers the enter or exit states\n   */\n  in: PropTypes.bool,\n\n  /**\n   * By default the child component is mounted immediately along with\n   * the parent `Transition` component. If you want to \"lazy mount\" the component on the\n   * first `in={true}` you can set `mountOnEnter`. After the first enter transition the component will stay\n   * mounted, even on \"exited\", unless you also specify `unmountOnExit`.\n   */\n  mountOnEnter: PropTypes.bool,\n\n  /**\n   * By default the child component stays mounted after it reaches the `'exited'` state.\n   * Set `unmountOnExit` if you'd prefer to unmount the component after it finishes exiting.\n   */\n  unmountOnExit: PropTypes.bool,\n\n  /**\n   * Normally a component is not transitioned if it is shown when the `<Transition>` component mounts.\n   * If you want to transition on the first mount set `appear` to `true`, and the\n   * component will transition in as soon as the `<Transition>` mounts.\n   *\n   * > Note: there are no specific \"appear\" states. `appear` only adds an additional `enter` transition.\n   */\n  appear: PropTypes.bool,\n\n  /**\n   * Enable or disable enter transitions.\n   */\n  enter: PropTypes.bool,\n\n  /**\n   * Enable or disable exit transitions.\n   */\n  exit: PropTypes.bool,\n\n  /**\n   * The duration of the transition, in milliseconds.\n   * Required unless `addEventListener` is provided\n   *\n   * You may specify a single timeout for all transitions like: `timeout={500}`,\n   * or individually like:\n   *\n   * ```jsx\n   * timeout={{\n   *  enter: 300,\n   *  exit: 500,\n   * }}\n   * ```\n   *\n   * @type {number | { enter?: number, exit?: number }}\n   */\n  timeout: function timeout(props) {\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 pt = _PropTypes.timeoutsShape;\n    if (!props.addEndListener) pt = pt.isRequired;\n    return pt.apply(undefined, [props].concat(args));\n  },\n\n  /**\n   * Add a custom transition end trigger. Called with the transitioning\n   * DOM node and a `done` callback. Allows for more fine grained transition end\n   * logic. **Note:** Timeouts are still used as a fallback if provided.\n   *\n   * ```jsx\n   * addEndListener={(node, done) => {\n   *   // use the css transitionend event to mark the finish of a transition\n   *   node.addEventListener('transitionend', done, false);\n   * }}\n   * ```\n   */\n  addEndListener: PropTypes.func,\n\n  /**\n   * Callback fired before the \"entering\" status is applied. An extra parameter\n   * `isAppearing` is supplied to indicate if the enter stage is occurring on the initial mount\n   *\n   * @type Function(node: HtmlElement, isAppearing: bool) -> void\n   */\n  onEnter: PropTypes.func,\n\n  /**\n   * Callback fired after the \"entering\" status is applied. An extra parameter\n   * `isAppearing` is supplied to indicate if the enter stage is occurring on the initial mount\n   *\n   * @type Function(node: HtmlElement, isAppearing: bool)\n   */\n  onEntering: PropTypes.func,\n\n  /**\n   * Callback fired after the \"entered\" status is applied. An extra parameter\n   * `isAppearing` is supplied to indicate if the enter stage is occurring on the initial mount\n   *\n   * @type Function(node: HtmlElement, isAppearing: bool) -> void\n   */\n  onEntered: PropTypes.func,\n\n  /**\n   * Callback fired before the \"exiting\" status is applied.\n   *\n   * @type Function(node: HtmlElement) -> void\n   */\n  onExit: PropTypes.func,\n\n  /**\n   * Callback fired after the \"exiting\" status is applied.\n   *\n   * @type Function(node: HtmlElement) -> void\n   */\n  onExiting: PropTypes.func,\n\n  /**\n   * Callback fired after the \"exited\" status is applied.\n   *\n   * @type Function(node: HtmlElement) -> void\n   */\n  onExited: PropTypes.func\n} : {};\n\n// Name the function so it is clearer in the documentation\nfunction noop() {}\n\nTransition.defaultProps = {\n  in: false,\n  mountOnEnter: false,\n  unmountOnExit: false,\n  appear: false,\n  enter: true,\n  exit: true,\n\n  onEnter: noop,\n  onEntering: noop,\n  onEntered: noop,\n\n  onExit: noop,\n  onExiting: noop,\n  onExited: noop\n};\n\nTransition.UNMOUNTED = 0;\nTransition.EXITED = 1;\nTransition.ENTERING = 2;\nTransition.ENTERED = 3;\nTransition.EXITING = 4;\n\nexports.default = Transition;","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport Transition from 'react-transition-group/Transition';\nimport { mapToCssModules, omit, pick, TransitionPropTypeKeys, TransitionTimeouts } from './utils';\n\nconst propTypes = {\n  ...Transition.propTypes,\n  children: PropTypes.oneOfType([\n    PropTypes.arrayOf(PropTypes.node),\n    PropTypes.node\n  ]),\n  tag: PropTypes.oneOfType([PropTypes.string, PropTypes.func]),\n  baseClass: PropTypes.string,\n  baseClassActive: PropTypes.string,\n  className: PropTypes.string,\n  cssModule: PropTypes.object,\n};\n\nconst defaultProps = {\n  ...Transition.defaultProps,\n  tag: 'div',\n  baseClass: 'fade',\n  baseClassActive: 'show',\n  timeout: TransitionTimeouts.Fade,\n  appear: true,\n  enter: true,\n  exit: true,\n  in: true,\n};\n\nfunction Fade(props) {\n  const {\n    tag: Tag,\n    baseClass,\n    baseClassActive,\n    className,\n    cssModule,\n    children,\n    ...otherProps\n  } = props;\n\n  // In NODE_ENV=production the Transition.propTypes are wrapped which results in an\n  // empty object \"{}\". This is the result of the `react-transition-group` babel\n  // configuration settings. Therefore, to ensure that production builds work without\n  // error, we can either explicitly define keys or use the Transition.defaultProps.\n  // Using the Transition.defaultProps excludes any required props. Thus, the best\n  // solution is to explicitly define required props in our utilities and reference these.\n  // This also gives us more flexibility in the future to remove the prop-types\n  // dependency in distribution builds (Similar to how `react-transition-group` does).\n  // Note: Without omitting the `react-transition-group` props, the resulting child\n  // Tag component would inherit the Transition properties as attributes for the HTML\n  // element which results in errors/warnings for non-valid attributes.\n  const transitionProps = pick(otherProps, TransitionPropTypeKeys);\n  const childProps = omit(otherProps, TransitionPropTypeKeys);\n\n  return (\n    <Transition {...transitionProps}>\n      {(status) => {\n        const isActive = status === 'entered';\n        const classes = mapToCssModules(classNames(\n          className,\n          baseClass,\n          isActive && baseClassActive\n        ), cssModule);\n        return (\n          <Tag className={classes} {...childProps}>\n            {children}\n          </Tag>\n        );\n      }}\n    </Transition>\n  );\n}\n\nFade.propTypes = propTypes;\nFade.defaultProps = defaultProps;\n\nexport default Fade;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { mapToCssModules } from './utils';\n\nconst propTypes = {\n  color: PropTypes.string,\n  pill: PropTypes.bool,\n  tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),\n  children: PropTypes.node,\n  className: PropTypes.string,\n  cssModule: PropTypes.object,\n};\n\nconst defaultProps = {\n  color: 'secondary',\n  pill: false,\n  tag: 'span'\n};\n\nconst Badge = (props) => {\n  let {\n    className,\n    cssModule,\n    color,\n    pill,\n    tag: Tag,\n    ...attributes\n  } = props;\n\n  const classes = mapToCssModules(classNames(\n    className,\n    'badge',\n    'badge-' + color,\n    pill ? 'badge-pill' : false\n  ), cssModule);\n\n  if (attributes.href && Tag === 'span') {\n    Tag = 'a';\n  }\n\n  return (\n    <Tag {...attributes} className={classes} />\n  );\n};\n\nBadge.propTypes = propTypes;\nBadge.defaultProps = defaultProps;\n\nexport default Badge;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { mapToCssModules, deprecated } from './utils';\n\nconst propTypes = {\n  tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),\n  inverse: PropTypes.bool,\n  color: PropTypes.string,\n  block: deprecated(PropTypes.bool, 'Please use the props \"body\"'),\n  body: PropTypes.bool,\n  outline: PropTypes.bool,\n  className: PropTypes.string,\n  cssModule: PropTypes.object,\n};\n\nconst defaultProps = {\n  tag: 'div'\n};\n\nconst Card = (props) => {\n  const {\n    className,\n    cssModule,\n    color,\n    block,\n    body,\n    inverse,\n    outline,\n    tag: Tag,\n    ...attributes\n  } = props;\n  const classes = mapToCssModules(classNames(\n    className,\n    'card',\n    inverse ? 'text-white' : false,\n    block || body ? 'card-body' : false,\n    color ? `${outline ? 'border' : 'bg'}-${color}` : false\n  ), cssModule);\n\n  return (\n    <Tag {...attributes} className={classes} />\n  );\n};\n\nCard.propTypes = propTypes;\nCard.defaultProps = defaultProps;\n\nexport default Card;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { mapToCssModules } from './utils';\n\nconst propTypes = {\n  tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),\n  className: PropTypes.string,\n  cssModule: PropTypes.object,\n};\n\nconst defaultProps = {\n  tag: 'div'\n};\n\nconst CardGroup = (props) => {\n  const {\n    className,\n    cssModule,\n    tag: Tag,\n    ...attributes\n  } = props;\n  const classes = mapToCssModules(classNames(\n    className,\n    'card-group'\n  ), cssModule);\n\n  return (\n    <Tag {...attributes} className={classes} />\n  );\n};\n\nCardGroup.propTypes = propTypes;\nCardGroup.defaultProps = defaultProps;\n\nexport default CardGroup;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { mapToCssModules } from './utils';\n\nconst propTypes = {\n  tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),\n  className: PropTypes.string,\n  cssModule: PropTypes.object,\n};\n\nconst defaultProps = {\n  tag: 'div',\n};\n\nconst CardDeck = (props) => {\n  const {\n    className,\n    cssModule,\n    tag: Tag,\n    ...attributes\n  } = props;\n  const classes = mapToCssModules(classNames(\n    className,\n    'card-deck'\n  ), cssModule);\n\n  return (\n    <Tag {...attributes} className={classes} />\n  );\n};\n\nCardDeck.propTypes = propTypes;\nCardDeck.defaultProps = defaultProps;\n\nexport default CardDeck;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { mapToCssModules } from './utils';\n\nconst propTypes = {\n  tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),\n  className: PropTypes.string,\n  cssModule: PropTypes.object,\n};\n\nconst defaultProps = {\n  tag: 'div'\n};\n\nconst CardColumns = (props) => {\n  const {\n    className,\n    cssModule,\n    tag: Tag,\n    ...attributes\n  } = props;\n  const classes = mapToCssModules(classNames(\n    className,\n    'card-columns'\n  ), cssModule);\n\n  return (\n    <Tag {...attributes} className={classes} />\n  );\n};\n\nCardColumns.propTypes = propTypes;\nCardColumns.defaultProps = defaultProps;\n\nexport default CardColumns;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { mapToCssModules } from './utils';\n\nconst propTypes = {\n  tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),\n  className: PropTypes.string,\n  cssModule: PropTypes.object,\n};\n\nconst defaultProps = {\n  tag: 'div'\n};\n\nconst CardBody = (props) => {\n  const {\n    className,\n    cssModule,\n    tag: Tag,\n    ...attributes\n  } = props;\n  const classes = mapToCssModules(classNames(\n    className,\n    'card-body'\n  ), cssModule);\n\n  return (\n    <Tag {...attributes} className={classes} />\n  );\n};\n\nCardBody.propTypes = propTypes;\nCardBody.defaultProps = defaultProps;\n\nexport default CardBody;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { mapToCssModules } from './utils';\n\nconst propTypes = {\n  tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),\n  innerRef: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),\n  className: PropTypes.string,\n  cssModule: PropTypes.object,\n};\n\nconst defaultProps = {\n  tag: 'a'\n};\n\nconst CardLink = (props) => {\n  const {\n    className,\n    cssModule,\n    tag: Tag,\n    innerRef,\n    ...attributes\n  } = props;\n  const classes = mapToCssModules(classNames(\n    className,\n    'card-link'\n  ), cssModule);\n\n  return (\n    <Tag {...attributes} ref={innerRef} className={classes} />\n  );\n};\n\nCardLink.propTypes = propTypes;\nCardLink.defaultProps = defaultProps;\n\nexport default CardLink;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { mapToCssModules } from './utils';\n\nconst propTypes = {\n  tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),\n  className: PropTypes.string,\n  cssModule: PropTypes.object,\n};\n\nconst defaultProps = {\n  tag: 'div'\n};\n\nconst CardFooter = (props) => {\n  const {\n    className,\n    cssModule,\n    tag: Tag,\n    ...attributes\n  } = props;\n  const classes = mapToCssModules(classNames(\n    className,\n    'card-footer'\n  ), cssModule);\n\n  return (\n    <Tag {...attributes} className={classes} />\n  );\n};\n\nCardFooter.propTypes = propTypes;\nCardFooter.defaultProps = defaultProps;\n\nexport default CardFooter;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { mapToCssModules } from './utils';\n\nconst propTypes = {\n  tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),\n  className: PropTypes.string,\n  cssModule: PropTypes.object,\n};\n\nconst defaultProps = {\n  tag: 'div'\n};\n\nconst CardHeader = (props) => {\n  const {\n    className,\n    cssModule,\n    tag: Tag,\n    ...attributes\n  } = props;\n  const classes = mapToCssModules(classNames(\n    className,\n    'card-header'\n  ), cssModule);\n\n  return (\n    <Tag {...attributes} className={classes} />\n  );\n};\n\nCardHeader.propTypes = propTypes;\nCardHeader.defaultProps = defaultProps;\n\nexport default CardHeader;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { mapToCssModules } from './utils';\n\nconst propTypes = {\n  tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),\n  top: PropTypes.bool,\n  bottom: PropTypes.bool,\n  className: PropTypes.string,\n  cssModule: PropTypes.object,\n};\n\nconst defaultProps = {\n  tag: 'img'\n};\n\nconst CardImg = (props) => {\n  const {\n    className,\n    cssModule,\n    top,\n    bottom,\n    tag: Tag,\n    ...attributes\n  } = props;\n\n  let cardImgClassName = 'card-img';\n  if (top) {\n    cardImgClassName = 'card-img-top';\n  }\n  if (bottom) {\n    cardImgClassName = 'card-img-bottom';\n  }\n\n  const classes = mapToCssModules(classNames(\n    className,\n    cardImgClassName\n  ), cssModule);\n\n  return (\n    <Tag {...attributes} className={classes} />\n  );\n};\n\nCardImg.propTypes = propTypes;\nCardImg.defaultProps = defaultProps;\n\nexport default CardImg;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { mapToCssModules } from './utils';\n\nconst propTypes = {\n  tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),\n  className: PropTypes.string,\n  cssModule: PropTypes.object,\n};\n\nconst defaultProps = {\n  tag: 'div'\n};\n\nconst CardImgOverlay = (props) => {\n  const {\n    className,\n    cssModule,\n    tag: Tag,\n    ...attributes\n  } = props;\n  const classes = mapToCssModules(classNames(\n    className,\n    'card-img-overlay'\n  ), cssModule);\n\n  return (\n    <Tag {...attributes} className={classes} />\n  );\n};\n\nCardImgOverlay.propTypes = propTypes;\nCardImgOverlay.defaultProps = defaultProps;\n\nexport default CardImgOverlay;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport Transition from 'react-transition-group/Transition';\nimport { mapToCssModules, TransitionTimeouts, TransitionStatuses } from './utils';\n\nclass CarouselItem extends React.Component {\n  constructor(props) {\n    super(props);\n\n    this.state = {\n      startAnimation: false,\n    };\n\n    this.onEnter = this.onEnter.bind(this);\n    this.onEntering = this.onEntering.bind(this);\n    this.onExit = this.onExit.bind(this);\n    this.onExiting = this.onExiting.bind(this);\n    this.onExited = this.onExited.bind(this);\n  }\n\n  onEnter(node, isAppearing) {\n    this.setState({ startAnimation: false });\n    this.props.onEnter(node, isAppearing);\n  }\n\n  onEntering(node, isAppearing) {\n    // getting this variable triggers a reflow\n    const offsetHeight = node.offsetHeight;\n    this.setState({ startAnimation: true });\n    this.props.onEntering(node, isAppearing);\n    return offsetHeight;\n  }\n\n  onExit(node) {\n    this.setState({ startAnimation: false });\n    this.props.onExit(node);\n  }\n\n  onExiting(node) {\n    this.setState({ startAnimation: true });\n    node.dispatchEvent(new CustomEvent('slide.bs.carousel'));\n    this.props.onExiting(node);\n  }\n\n  onExited(node) {\n    node.dispatchEvent(new CustomEvent('slid.bs.carousel'));\n    this.props.onExited(node);\n  }\n\n  render() {\n    const { in: isIn, children, cssModule, slide, tag: Tag, className, ...transitionProps } = this.props;\n\n    return (\n      <Transition\n        {...transitionProps}\n        enter={slide}\n        exit={slide}\n        in={isIn}\n        onEnter={this.onEnter}\n        onEntering={this.onEntering}\n        onExit={this.onExit}\n        onExiting={this.onExiting}\n        onExited={this.onExited}\n      >\n        {(status) => {\n          const { direction } = this.context;\n          const isActive = (status === TransitionStatuses.ENTERED) || (status === TransitionStatuses.EXITING);\n          const directionClassName = (status === TransitionStatuses.ENTERING || status === TransitionStatuses.EXITING) &&\n            this.state.startAnimation &&\n            (direction === 'right' ? 'carousel-item-left' : 'carousel-item-right');\n          const orderClassName = (status === TransitionStatuses.ENTERING) &&\n            (direction === 'right' ? 'carousel-item-next' : 'carousel-item-prev');\n          const itemClasses = mapToCssModules(classNames(\n            className,\n            'carousel-item',\n            isActive && 'active',\n            directionClassName,\n            orderClassName,\n          ), cssModule);\n\n          return (\n            <Tag className={itemClasses}>\n              {children}\n            </Tag>\n          );\n        }}\n      </Transition>\n    );\n  }\n}\n\nCarouselItem.propTypes = {\n  ...Transition.propTypes,\n  tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),\n  in: PropTypes.bool,\n  cssModule: PropTypes.object,\n  children: PropTypes.node,\n  slide: PropTypes.bool,\n  className: PropTypes.string,\n};\n\nCarouselItem.defaultProps = {\n  ...Transition.defaultProps,\n  tag: 'div',\n  timeout: TransitionTimeouts.Carousel,\n  slide: true,\n};\n\nCarouselItem.contextTypes = {\n  direction: PropTypes.string\n};\n\nexport default CarouselItem;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport CarouselItem from './CarouselItem';\nimport { mapToCssModules } from './utils';\n\nclass Carousel extends React.Component {\n  constructor(props) {\n    super(props);\n    this.handleKeyPress = this.handleKeyPress.bind(this);\n    this.renderItems = this.renderItems.bind(this);\n    this.hoverStart = this.hoverStart.bind(this);\n    this.hoverEnd = this.hoverEnd.bind(this);\n    this.state = {\n      direction: 'right',\n      indicatorClicked: false,\n    };\n  }\n\n  getChildContext() {\n    return { direction: this.state.direction };\n  }\n\n  componentDidMount() {\n    // Set up the cycle\n    if (this.props.ride === 'carousel') {\n      this.setInterval();\n    }\n\n    // TODO: move this to the specific carousel like bootstrap. Currently it will trigger ALL carousels on the page.\n    document.addEventListener('keyup', this.handleKeyPress);\n  }\n\n  componentWillReceiveProps(nextProps) {\n    this.setInterval(nextProps);\n    // Calculate the direction to turn\n    if (this.props.activeIndex + 1 === nextProps.activeIndex) {\n      this.setState({ direction: 'right' });\n    } else if (this.props.activeIndex - 1 === nextProps.activeIndex) {\n      this.setState({ direction: 'left' });\n    } else if (this.props.activeIndex > nextProps.activeIndex) {\n      this.setState({ direction: this.state.indicatorClicked ? 'left' : 'right' });\n    } else if (this.props.activeIndex !== nextProps.activeIndex) {\n      this.setState({ direction: this.state.indicatorClicked ? 'right' : 'left' });\n    }\n    this.setState({ indicatorClicked: false });\n  }\n\n  componentWillUnmount() {\n    this.clearInterval();\n    document.removeEventListener('keyup', this.handleKeyPress);\n  }\n\n  setInterval(props = this.props) {\n    // make sure not to have multiple intervals going...\n    this.clearInterval();\n    if (props.interval) {\n      this.cycleInterval = setInterval(() => {\n        props.next();\n      }, parseInt(props.interval, 10));\n    }\n  }\n\n  clearInterval() {\n    clearInterval(this.cycleInterval);\n  }\n\n  hoverStart(...args) {\n    if (this.props.pause === 'hover') {\n      this.clearInterval();\n    }\n    if (this.props.mouseEnter) {\n      this.props.mouseEnter(...args);\n    }\n  }\n\n  hoverEnd(...args) {\n    if (this.props.pause === 'hover') {\n      this.setInterval();\n    }\n    if (this.props.mouseLeave) {\n      this.props.mouseLeave(...args);\n    }\n  }\n\n  handleKeyPress(evt) {\n    if (this.props.keyboard) {\n      if (evt.keyCode === 37) {\n        this.props.previous();\n      } else if (evt.keyCode === 39) {\n        this.props.next();\n      }\n    }\n  }\n\n  renderItems(carouselItems, className) {\n    const { slide } = this.props;\n    return (\n      <div role=\"listbox\" className={className}>\n        {carouselItems.map((item, index) => {\n          const isIn = (index === this.props.activeIndex);\n          return React.cloneElement(item, {\n            in: isIn,\n            slide: slide,\n          });\n        })}\n      </div>\n    );\n  }\n\n  render() {\n    const { children, cssModule, slide, className } = this.props;\n    const outerClasses = mapToCssModules(classNames(\n      className,\n      'carousel',\n      slide && 'slide'\n    ), cssModule);\n\n    const innerClasses = mapToCssModules(classNames(\n      'carousel-inner'\n    ), cssModule);\n\n\n    const slidesOnly = children.every(child => child.type === CarouselItem);\n\n    // Rendering only slides\n    if (slidesOnly) {\n      return (\n        <div className={outerClasses} onMouseEnter={this.hoverStart} onMouseLeave={this.hoverEnd}>\n          {this.renderItems(children, innerClasses)}\n        </div>\n      );\n    }\n\n    // Rendering slides and controls\n    if (children[0] instanceof Array) {\n      const carouselItems = children[0];\n      const controlLeft = children[1];\n      const controlRight = children[2];\n\n      return (\n        <div className={outerClasses} onMouseEnter={this.hoverStart} onMouseLeave={this.hoverEnd}>\n          {this.renderItems(carouselItems, innerClasses)}\n          {controlLeft}\n          {controlRight}\n        </div>\n      );\n    }\n\n    // Rendering indicators, slides and controls\n    const indicators = children[0];\n    const wrappedOnClick = (e) => {\n      if (typeof indicators.props.onClickHandler === 'function') {\n        this.setState({ indicatorClicked: true }, () => indicators.props.onClickHandler(e));\n      }\n    };\n    const wrappedIndicators = React.cloneElement(indicators, { onClickHandler: wrappedOnClick });\n    const carouselItems = children[1];\n    const controlLeft = children[2];\n    const controlRight = children[3];\n\n    return (\n      <div className={outerClasses} onMouseEnter={this.hoverStart} onMouseLeave={this.hoverEnd}>\n        {wrappedIndicators}\n        {this.renderItems(carouselItems, innerClasses)}\n        {controlLeft}\n        {controlRight}\n      </div>\n    );\n  }\n}\n\nCarousel.propTypes = {\n  // the current active slide of the carousel\n  activeIndex: PropTypes.number,\n  // a function which should advance the carousel to the next slide (via activeIndex)\n  next: PropTypes.func.isRequired,\n  // a function which should advance the carousel to the previous slide (via activeIndex)\n  previous: PropTypes.func.isRequired,\n  // controls if the left and right arrow keys should control the carousel\n  keyboard: PropTypes.bool,\n  /* If set to \"hover\", pauses the cycling of the carousel on mouseenter and resumes the cycling of the carousel on\n   * mouseleave. If set to false, hovering over the carousel won't pause it. (default: \"hover\")\n   */\n  pause: PropTypes.oneOf(['hover', false]),\n  // Autoplays the carousel after the user manually cycles the first item. If \"carousel\", autoplays the carousel on load.\n  // This is how bootstrap defines it... I would prefer a bool named autoplay or something...\n  ride: PropTypes.oneOf(['carousel']),\n  // the interval at which the carousel automatically cycles (default: 5000)\n  // eslint-disable-next-line react/no-unused-prop-types\n  interval: PropTypes.oneOfType([\n    PropTypes.number,\n    PropTypes.string,\n    PropTypes.bool,\n  ]),\n  children: PropTypes.array,\n  // called when the mouse enters the Carousel\n  mouseEnter: PropTypes.func,\n  // called when the mouse exits the Carousel\n  mouseLeave: PropTypes.func,\n  // controls whether the slide animation on the Carousel works or not\n  slide: PropTypes.bool,\n  cssModule: PropTypes.object,\n  className: PropTypes.string,\n};\n\nCarousel.defaultProps = {\n  interval: 5000,\n  pause: 'hover',\n  keyboard: true,\n  slide: true,\n};\n\nCarousel.childContextTypes = {\n  direction: PropTypes.string\n};\n\nexport default Carousel;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { mapToCssModules } from './utils';\n\nconst CarouselControl = (props) => {\n  const { direction, onClickHandler, cssModule, directionText, className } = props;\n\n  const anchorClasses = mapToCssModules(classNames(\n    className,\n    `carousel-control-${direction}`\n  ), cssModule);\n\n  const iconClasses = mapToCssModules(classNames(\n    `carousel-control-${direction}-icon`\n  ), cssModule);\n\n  const screenReaderClasses = mapToCssModules(classNames(\n    'sr-only'\n  ), cssModule);\n\n\n  return (\n    <a\n      className={anchorClasses}\n      role=\"button\"\n      tabIndex=\"0\"\n      onClick={(e) => {\n        e.preventDefault();\n        onClickHandler();\n      }}\n    >\n      <span className={iconClasses} aria-hidden=\"true\" />\n      <span className={screenReaderClasses}>{directionText || direction}</span>\n    </a>\n  );\n};\n\nCarouselControl.propTypes = {\n  direction: PropTypes.oneOf(['prev', 'next']).isRequired,\n  onClickHandler: PropTypes.func.isRequired,\n  cssModule: PropTypes.object,\n  directionText: PropTypes.string,\n  className: PropTypes.string,\n};\n\nexport default CarouselControl;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { mapToCssModules } from './utils';\n\nconst CarouselIndicators = (props) => {\n  const { items, activeIndex, cssModule, onClickHandler, className } = props;\n\n  const listClasses = mapToCssModules(classNames(className, 'carousel-indicators'), cssModule);\n  const indicators = items.map((item, idx) => {\n    const indicatorClasses = mapToCssModules(classNames(\n      { active: activeIndex === idx }\n    ), cssModule);\n    return (\n      <li\n        key={`${item.key || item.src}${item.caption}${item.altText}`}\n        onClick={(e) => {\n          e.preventDefault();\n          onClickHandler(idx);\n        }}\n        className={indicatorClasses}\n      />);\n  });\n\n  return (\n    <ol className={listClasses}>\n      {indicators}\n    </ol>\n  );\n};\n\nCarouselIndicators.propTypes = {\n  items: PropTypes.array.isRequired,\n  activeIndex: PropTypes.number.isRequired,\n  cssModule: PropTypes.object,\n  onClickHandler: PropTypes.func.isRequired,\n  className: PropTypes.string,\n};\n\nexport default CarouselIndicators;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { mapToCssModules } from './utils';\n\nconst CarouselCaption = (props) => {\n  const { captionHeader, captionText, cssModule, className } = props;\n  const classes = mapToCssModules(classNames(\n    className,\n    'carousel-caption',\n    'd-none',\n    'd-md-block'\n  ), cssModule);\n\n  return (\n    <div className={classes}>\n      <h3>{captionHeader}</h3>\n      <p>{captionText}</p>\n    </div>\n  );\n};\n\nCarouselCaption.propTypes = {\n  captionHeader: PropTypes.string,\n  captionText: PropTypes.string.isRequired,\n  cssModule: PropTypes.object,\n  className: PropTypes.string,\n};\n\nexport default CarouselCaption;\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport Carousel from './Carousel';\nimport CarouselItem from './CarouselItem';\nimport CarouselControl from './CarouselControl';\nimport CarouselIndicators from './CarouselIndicators';\nimport CarouselCaption from './CarouselCaption';\n\nconst propTypes = {\n  items: PropTypes.array.isRequired,\n  indicators: PropTypes.bool,\n  controls: PropTypes.bool,\n  autoPlay: PropTypes.bool,\n  activeIndex: PropTypes.number,\n  next: PropTypes.func,\n  previous: PropTypes.func,\n  goToIndex: PropTypes.func,\n};\n\nclass UncontrolledCarousel extends Component {\n  constructor(props) {\n    super(props);\n    this.animating = false;\n    this.state = { activeIndex: 0 };\n    this.next = this.next.bind(this);\n    this.previous = this.previous.bind(this);\n    this.goToIndex = this.goToIndex.bind(this);\n    this.onExiting = this.onExiting.bind(this);\n    this.onExited = this.onExited.bind(this);\n  }\n\n  onExiting() {\n    this.animating = true;\n  }\n\n  onExited() {\n    this.animating = false;\n  }\n\n  next() {\n    if (this.animating) return;\n    const nextIndex = this.state.activeIndex === this.props.items.length - 1 ? 0 : this.state.activeIndex + 1;\n    this.setState({ activeIndex: nextIndex });\n  }\n\n  previous() {\n    if (this.animating) return;\n    const nextIndex = this.state.activeIndex === 0 ? this.props.items.length - 1 : this.state.activeIndex - 1;\n    this.setState({ activeIndex: nextIndex });\n  }\n\n  goToIndex(newIndex) {\n    if (this.animating) return;\n    this.setState({ activeIndex: newIndex });\n  }\n\n  render() {\n    const { autoPlay, indicators, controls, items, goToIndex, ...props } = this.props;\n    const { activeIndex } = this.state;\n\n    const slides = items.map((item) => {\n      return (\n        <CarouselItem\n          onExiting={this.onExiting}\n          onExited={this.onExited}\n          key={item.src}\n        >\n          <img src={item.src} alt={item.altText} />\n          <CarouselCaption captionText={item.caption} captionHeader={item.caption} />\n        </CarouselItem>\n      );\n    });\n\n    return (\n      <Carousel\n        activeIndex={activeIndex}\n        next={this.next}\n        previous={this.previous}\n        ride={autoPlay ? 'carousel' : undefined}\n        {...props}\n      >\n        {indicators && <CarouselIndicators\n          items={items}\n          activeIndex={props.activeIndex || activeIndex}\n          onClickHandler={goToIndex || this.goToIndex}\n        />}\n        {slides}\n        {controls && <CarouselControl\n          direction=\"prev\"\n          directionText=\"Previous\"\n          onClickHandler={props.previous || this.previous}\n        />}\n        {controls && <CarouselControl\n          direction=\"next\"\n          directionText=\"Next\"\n          onClickHandler={props.next || this.next}\n        />}\n      </Carousel>\n    );\n  }\n}\n\nUncontrolledCarousel.propTypes = propTypes;\nUncontrolledCarousel.defaultProps = {\n  controls: true,\n  indicators: true,\n  autoPlay: true,\n};\n\nexport default UncontrolledCarousel;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { mapToCssModules } from './utils';\n\nconst propTypes = {\n  tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),\n  className: PropTypes.string,\n  cssModule: PropTypes.object,\n};\n\nconst defaultProps = {\n  tag: 'h6'\n};\n\nconst CardSubtitle = (props) => {\n  const {\n    className,\n    cssModule,\n    tag: Tag,\n    ...attributes\n  } = props;\n  const classes = mapToCssModules(classNames(\n    className,\n    'card-subtitle'\n  ), cssModule);\n\n  return (\n    <Tag {...attributes} className={classes} />\n  );\n};\n\nCardSubtitle.propTypes = propTypes;\nCardSubtitle.defaultProps = defaultProps;\n\nexport default CardSubtitle;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { mapToCssModules } from './utils';\n\nconst propTypes = {\n  tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),\n  className: PropTypes.string,\n  cssModule: PropTypes.object,\n};\n\nconst defaultProps = {\n  tag: 'p'\n};\n\nconst CardText = (props) => {\n  const {\n    className,\n    cssModule,\n    tag: Tag,\n    ...attributes\n  } = props;\n  const classes = mapToCssModules(classNames(\n    className,\n    'card-text'\n  ), cssModule);\n\n  return (\n    <Tag {...attributes} className={classes} />\n  );\n};\n\nCardText.propTypes = propTypes;\nCardText.defaultProps = defaultProps;\n\nexport default CardText;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { mapToCssModules } from './utils';\n\nconst propTypes = {\n  tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),\n  className: PropTypes.string,\n  cssModule: PropTypes.object,\n};\n\nconst defaultProps = {\n  tag: 'h5'\n};\n\nconst CardTitle = (props) => {\n  const {\n    className,\n    cssModule,\n    tag: Tag,\n    ...attributes\n  } = props;\n  const classes = mapToCssModules(classNames(\n    className,\n    'card-title'\n  ), cssModule);\n\n  return (\n    <Tag {...attributes} className={classes} />\n  );\n};\n\nCardTitle.propTypes = propTypes;\nCardTitle.defaultProps = defaultProps;\n\nexport default CardTitle;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport ReactDOM from 'react-dom';\nimport classNames from 'classnames';\nimport { Arrow, Popper as ReactPopper } from 'react-popper';\nimport { getTarget, DOMElement, mapToCssModules } from './utils';\n\nconst propTypes = {\n  children: PropTypes.node.isRequired,\n  className: PropTypes.string,\n  placement: PropTypes.string,\n  placementPrefix: PropTypes.string,\n  hideArrow: PropTypes.bool,\n  tag: PropTypes.string,\n  isOpen: PropTypes.bool.isRequired,\n  cssModule: PropTypes.object,\n  offset: PropTypes.oneOfType([PropTypes.string, PropTypes.number]),\n  fallbackPlacement: PropTypes.oneOfType([PropTypes.string, PropTypes.array]),\n  flip: PropTypes.bool,\n  container: PropTypes.oneOfType([PropTypes.string, PropTypes.func, DOMElement]),\n  target: PropTypes.oneOfType([PropTypes.string, PropTypes.func, DOMElement]).isRequired,\n  modifiers: PropTypes.object,\n};\n\nconst defaultProps = {\n  placement: 'auto',\n  hideArrow: false,\n  isOpen: false,\n  offset: 0,\n  fallbackPlacement: 'flip',\n  flip: true,\n  container: 'body',\n  modifiers: {},\n};\n\nconst childContextTypes = {\n  popperManager: PropTypes.object.isRequired,\n};\n\nclass PopperContent extends React.Component {\n  constructor(props) {\n    super(props);\n\n    this.handlePlacementChange = this.handlePlacementChange.bind(this);\n    this.setTargetNode = this.setTargetNode.bind(this);\n    this.getTargetNode = this.getTargetNode.bind(this);\n    this.state = {};\n  }\n\n  getChildContext() {\n    return {\n      popperManager: {\n        setTargetNode: this.setTargetNode,\n        getTargetNode: this.getTargetNode,\n      },\n    };\n  }\n\n  componentDidMount() {\n    this.handleProps();\n  }\n\n  componentDidUpdate(prevProps) {\n    if (this.props.isOpen !== prevProps.isOpen) {\n      this.handleProps();\n    } else if (this._element) {\n      // rerender\n      this.renderIntoSubtree();\n    }\n  }\n\n  componentWillUnmount() {\n    this.hide();\n  }\n\n  setTargetNode(node) {\n    this.targetNode = node;\n  }\n\n  getTargetNode() {\n    return this.targetNode;\n  }\n\n  getContainerNode() {\n    return getTarget(this.props.container);\n  }\n\n  handlePlacementChange(data) {\n    if (this.state.placement !== data.placement) {\n      this.setState({ placement: data.placement });\n    }\n    return data;\n  }\n\n  handleProps() {\n    if (this.props.container !== 'inline') {\n      if (this.props.isOpen) {\n        this.show();\n      } else {\n        this.hide();\n      }\n    }\n  }\n\n  hide() {\n    if (this._element) {\n      this.getContainerNode().removeChild(this._element);\n      ReactDOM.unmountComponentAtNode(this._element);\n      this._element = null;\n    }\n  }\n\n  show() {\n    this._element = document.createElement('div');\n    this.getContainerNode().appendChild(this._element);\n    this.renderIntoSubtree();\n    if (this._element.childNodes && this._element.childNodes[0] && this._element.childNodes[0].focus) {\n      this._element.childNodes[0].focus();\n    }\n  }\n\n  renderIntoSubtree() {\n    ReactDOM.unstable_renderSubtreeIntoContainer(\n      this,\n      this.renderChildren(),\n      this._element\n    );\n  }\n\n  renderChildren() {\n    const {\n      cssModule,\n      children,\n      isOpen,\n      flip,\n      target,\n      offset,\n      fallbackPlacement,\n      placementPrefix,\n      hideArrow,\n      className,\n      tag,\n      container,\n      modifiers,\n      ...attrs\n    } = this.props;\n    const arrowClassName = mapToCssModules('arrow', cssModule);\n    const placement = (this.state.placement || attrs.placement).split('-')[0];\n    const popperClassName = mapToCssModules(classNames(\n      className,\n      placementPrefix ? `${placementPrefix}-${placement}` : placement\n    ), this.props.cssModule);\n\n    const extendedModifiers = {\n      offset: { offset },\n      flip: { enabled: flip, behavior: fallbackPlacement },\n      update: {\n        enabled: true,\n        order: 950,\n        fn: this.handlePlacementChange,\n      },\n      ...modifiers,\n    };\n\n    return (\n      <ReactPopper modifiers={extendedModifiers} {...attrs} component={tag} className={popperClassName}>\n        {children}\n        {!hideArrow && <Arrow className={arrowClassName} />}\n      </ReactPopper>\n    );\n  }\n\n  render() {\n    this.setTargetNode(getTarget(this.props.target));\n\n    if (this.props.container === 'inline') {\n      return this.props.isOpen ? this.renderChildren() : null;\n    }\n\n    return null;\n  }\n}\n\nPopperContent.propTypes = propTypes;\nPopperContent.defaultProps = defaultProps;\nPopperContent.childContextTypes = childContextTypes;\n\nexport default PopperContent;\n","import PropTypes from 'prop-types';\nimport { getTarget, DOMElement } from './utils';\n\nconst PopperTargetHelper = (props, context) => {\n  context.popperManager.setTargetNode(getTarget(props.target));\n  return null;\n};\n\nPopperTargetHelper.contextTypes = {\n  popperManager: PropTypes.object.isRequired,\n};\n\nPopperTargetHelper.propTypes = {\n  target: PropTypes.oneOfType([PropTypes.string, PropTypes.func, DOMElement]).isRequired,\n};\n\nexport default PopperTargetHelper;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport PopperContent from './PopperContent';\nimport { getTarget, DOMElement, mapToCssModules, omit, PopperPlacements } from './utils';\n\nconst propTypes = {\n  placement: PropTypes.oneOf(PopperPlacements),\n  target: PropTypes.oneOfType([\n    PropTypes.string,\n    PropTypes.func,\n    DOMElement,\n  ]).isRequired,\n  container: PropTypes.oneOfType([\n    PropTypes.string,\n    PropTypes.func,\n    DOMElement,\n  ]),\n  isOpen: PropTypes.bool,\n  disabled: PropTypes.bool,\n  hideArrow: PropTypes.bool,\n  className: PropTypes.string,\n  innerClassName: PropTypes.string,\n  placementPrefix: PropTypes.string,\n  cssModule: PropTypes.object,\n  toggle: PropTypes.func,\n  delay: PropTypes.oneOfType([\n    PropTypes.shape({ show: PropTypes.number, hide: PropTypes.number }),\n    PropTypes.number,\n  ]),\n  modifiers: PropTypes.object,\n};\n\nconst DEFAULT_DELAYS = {\n  show: 0,\n  hide: 0,\n};\n\nconst defaultProps = {\n  isOpen: false,\n  hideArrow: false,\n  placement: 'right',\n  placementPrefix: 'bs-popover',\n  delay: DEFAULT_DELAYS,\n  toggle: () => {},\n};\n\nclass Popover extends React.Component {\n  constructor(props) {\n    super(props);\n\n    this.addTargetEvents = this.addTargetEvents.bind(this);\n    this.handleDocumentClick = this.handleDocumentClick.bind(this);\n    this.removeTargetEvents = this.removeTargetEvents.bind(this);\n    this.getRef = this.getRef.bind(this);\n    this.toggle = this.toggle.bind(this);\n    this.show = this.show.bind(this);\n    this.hide = this.hide.bind(this);\n  }\n\n  componentDidMount() {\n    this._target = getTarget(this.props.target);\n    this.handleProps();\n  }\n\n  componentDidUpdate() {\n    this.handleProps();\n  }\n\n  componentWillUnmount() {\n    this.clearShowTimeout();\n    this.clearHideTimeout();\n    this.removeTargetEvents();\n  }\n\n  getRef(ref) {\n    this._popover = ref;\n  }\n\n  getDelay(key) {\n    const { delay } = this.props;\n    if (typeof delay === 'object') {\n      return isNaN(delay[key]) ? DEFAULT_DELAYS[key] : delay[key];\n    }\n    return delay;\n  }\n\n  handleProps() {\n    if (this.props.isOpen) {\n      this.show();\n    } else {\n      this.hide();\n    }\n  }\n\n  show() {\n    this.clearHideTimeout();\n    this.addTargetEvents();\n    if (!this.props.isOpen) {\n      this.clearShowTimeout();\n      this._showTimeout = setTimeout(this.toggle, this.getDelay('show'));\n    }\n  }\n\n  hide() {\n    this.clearShowTimeout();\n    this.removeTargetEvents();\n    if (this.props.isOpen) {\n      this.clearHideTimeout();\n      this._hideTimeout = setTimeout(this.toggle, this.getDelay('hide'));\n    }\n  }\n\n  clearShowTimeout() {\n    clearTimeout(this._showTimeout);\n    this._showTimeout = undefined;\n  }\n\n  clearHideTimeout() {\n    clearTimeout(this._hideTimeout);\n    this._hideTimeout = undefined;\n  }\n\n  handleDocumentClick(e) {\n    if (e.target !== this._target && !this._target.contains(e.target) && e.target !== this._popover && !(this._popover && this._popover.contains(e.target))) {\n      if (this._hideTimeout) {\n        this.clearHideTimeout();\n      }\n\n      if (this.props.isOpen) {\n        this.toggle(e);\n      }\n    }\n  }\n\n  addTargetEvents() {\n    ['click', 'touchstart'].forEach(event =>\n      document.addEventListener(event, this.handleDocumentClick, true)\n    );\n  }\n\n  removeTargetEvents() {\n    ['click', 'touchstart'].forEach(event =>\n      document.removeEventListener(event, this.handleDocumentClick, true)\n    );\n  }\n\n  toggle(e) {\n    if (this.props.disabled) {\n      return e && e.preventDefault();\n    }\n\n    return this.props.toggle(e);\n  }\n\n  render() {\n    if (!this.props.isOpen) {\n      return null;\n    }\n\n    const attributes = omit(this.props, Object.keys(propTypes));\n    const classes = mapToCssModules(classNames(\n      'popover-inner',\n      this.props.innerClassName\n    ), this.props.cssModule);\n\n    const popperClasses = mapToCssModules(classNames(\n      'popover',\n      'show',\n      this.props.className\n    ), this.props.cssModule);\n\n    return (\n      <PopperContent\n        className={popperClasses}\n        target={this.props.target}\n        isOpen={this.props.isOpen}\n        hideArrow={this.props.hideArrow}\n        placement={this.props.placement}\n        placementPrefix={this.props.placementPrefix}\n        container={this.props.container}\n        modifiers={this.props.modifiers}\n      >\n        <div {...attributes} className={classes} ref={this.getRef} />\n      </PopperContent>\n    );\n  }\n}\n\nPopover.propTypes = propTypes;\nPopover.defaultProps = defaultProps;\n\nexport default Popover;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { mapToCssModules } from './utils';\n\nconst propTypes = {\n  tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),\n  className: PropTypes.string,\n  cssModule: PropTypes.object,\n};\n\nconst defaultProps = {\n  tag: 'h3'\n};\n\nconst PopoverHeader = (props) => {\n  const {\n    className,\n    cssModule,\n    tag: Tag,\n    ...attributes\n  } = props;\n\n  const classes = mapToCssModules(classNames(\n    className,\n    'popover-header'\n  ), cssModule);\n\n  return (\n    <Tag {...attributes} className={classes} />\n  );\n};\n\nPopoverHeader.propTypes = propTypes;\nPopoverHeader.defaultProps = defaultProps;\n\nexport default PopoverHeader;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { mapToCssModules } from './utils';\n\nconst propTypes = {\n  tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),\n  className: PropTypes.string,\n  cssModule: PropTypes.object,\n};\n\nconst defaultProps = {\n  tag: 'div'\n};\n\nconst PopoverBody = (props) => {\n  const {\n    className,\n    cssModule,\n    tag: Tag,\n    ...attributes\n  } = props;\n\n  const classes = mapToCssModules(classNames(\n    className,\n    'popover-body'\n  ), cssModule);\n\n  return (\n    <Tag {...attributes} className={classes} />\n  );\n};\n\nPopoverBody.propTypes = propTypes;\nPopoverBody.defaultProps = defaultProps;\n\nexport default PopoverBody;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport toNumber from 'lodash.tonumber';\nimport { mapToCssModules } from './utils';\n\nconst propTypes = {\n  children: PropTypes.node,\n  bar: PropTypes.bool,\n  multi: PropTypes.bool,\n  tag: PropTypes.string,\n  value: PropTypes.oneOfType([\n    PropTypes.string,\n    PropTypes.number,\n  ]),\n  max: PropTypes.oneOfType([\n    PropTypes.string,\n    PropTypes.number,\n  ]),\n  animated: PropTypes.bool,\n  striped: PropTypes.bool,\n  color: PropTypes.string,\n  className: PropTypes.string,\n  barClassName: PropTypes.string,\n  cssModule: PropTypes.object,\n};\n\nconst defaultProps = {\n  tag: 'div',\n  value: 0,\n  max: 100,\n};\n\nconst Progress = (props) => {\n  const {\n    children,\n    className,\n    barClassName,\n    cssModule,\n    value,\n    max,\n    animated,\n    striped,\n    color,\n    bar,\n    multi,\n    tag: Tag,\n    ...attributes\n  } = props;\n\n  const percent = ((toNumber(value) / toNumber(max)) * 100);\n\n  const progressClasses = mapToCssModules(classNames(\n    className,\n    'progress'\n  ), cssModule);\n\n  const progressBarClasses = mapToCssModules(classNames(\n    'progress-bar',\n    bar ? className || barClassName : barClassName,\n    animated ? 'progress-bar-animated' : null,\n    color ? `bg-${color}` : null,\n    striped || animated ? 'progress-bar-striped' : null\n  ), cssModule);\n\n  const ProgressBar = multi ? children : (\n    <div\n      className={progressBarClasses}\n      style={{ width: `${percent}%` }}\n      role=\"progressbar\"\n      aria-valuenow={value}\n      aria-valuemin=\"0\"\n      aria-valuemax={max}\n      children={children}\n    />\n  );\n\n  if (bar) {\n    return ProgressBar;\n  }\n\n  return (\n    <Tag {...attributes} className={progressClasses} children={ProgressBar} />\n  );\n};\n\nProgress.propTypes = propTypes;\nProgress.defaultProps = defaultProps;\n\nexport default Progress;\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport PropTypes from 'prop-types';\nimport { canUseDOM } from './utils';\n\nconst propTypes = {\n  children: PropTypes.node.isRequired,\n  node: PropTypes.any\n};\n\nclass Portal extends React.Component {\n  componentWillUnmount() {\n    if (this.defaultNode) {\n      document.body.removeChild(this.defaultNode);\n    }\n    this.defaultNode = null;\n  }\n\n  render() {\n    if (!canUseDOM) {\n      return null;\n    }\n\n    if (!this.props.node && !this.defaultNode) {\n      this.defaultNode = document.createElement('div');\n      document.body.appendChild(this.defaultNode);\n    }\n\n    return ReactDOM.createPortal(\n      this.props.children,\n      this.props.node || this.defaultNode\n    );\n  }\n}\n\nPortal.propTypes = propTypes;\n\nexport default Portal;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport Portal from './Portal';\nimport Fade from './Fade';\nimport {\n  getOriginalBodyPadding,\n  conditionallyUpdateScrollbar,\n  setScrollbarWidth,\n  mapToCssModules,\n  omit,\n  TransitionTimeouts\n} from './utils';\n\nfunction noop() { }\n\nconst FadePropTypes = PropTypes.shape(Fade.propTypes);\n\nconst propTypes = {\n  isOpen: PropTypes.bool,\n  autoFocus: PropTypes.bool,\n  centered: PropTypes.bool,\n  size: PropTypes.string,\n  toggle: PropTypes.func,\n  keyboard: PropTypes.bool,\n  role: PropTypes.string,\n  labelledBy: PropTypes.string,\n  backdrop: PropTypes.oneOfType([\n    PropTypes.bool,\n    PropTypes.oneOf(['static'])\n  ]),\n  onEnter: PropTypes.func,\n  onExit: PropTypes.func,\n  onOpened: PropTypes.func,\n  onClosed: PropTypes.func,\n  children: PropTypes.node,\n  className: PropTypes.string,\n  wrapClassName: PropTypes.string,\n  modalClassName: PropTypes.string,\n  backdropClassName: PropTypes.string,\n  contentClassName: PropTypes.string,\n  external: PropTypes.node,\n  fade: PropTypes.bool,\n  cssModule: PropTypes.object,\n  zIndex: PropTypes.oneOfType([\n    PropTypes.number,\n    PropTypes.string,\n  ]),\n  backdropTransition: FadePropTypes,\n  modalTransition: FadePropTypes,\n};\n\nconst propsToOmit = Object.keys(propTypes);\n\nconst defaultProps = {\n  isOpen: false,\n  autoFocus: true,\n  centered: false,\n  role: 'dialog',\n  backdrop: true,\n  keyboard: true,\n  zIndex: 1050,\n  fade: true,\n  onOpened: noop,\n  onClosed: noop,\n  modalTransition: {\n    timeout: TransitionTimeouts.Modal,\n  },\n  backdropTransition: {\n    mountOnEnter: true,\n    timeout: TransitionTimeouts.Fade, // uses standard fade transition\n  },\n};\n\nclass Modal extends React.Component {\n  constructor(props) {\n    super(props);\n\n    this._element = null;\n    this._originalBodyPadding = null;\n    this.handleBackdropClick = this.handleBackdropClick.bind(this);\n    this.handleEscape = this.handleEscape.bind(this);\n    this.onOpened = this.onOpened.bind(this);\n    this.onClosed = this.onClosed.bind(this);\n\n    this.state = {\n      isOpen: props.isOpen,\n    };\n\n    if (props.isOpen) {\n      this.init();\n    }\n  }\n\n  componentDidMount() {\n    if (this.props.onEnter) {\n      this.props.onEnter();\n    }\n\n    if (this.state.isOpen && this.props.autoFocus) {\n      this.setFocus();\n    }\n\n    this._isMounted = true;\n  }\n\n  componentWillReceiveProps(nextProps) {\n    if (nextProps.isOpen && !this.props.isOpen) {\n      this.setState({ isOpen: nextProps.isOpen });\n    }\n  }\n\n  componentWillUpdate(nextProps, nextState) {\n    if (nextState.isOpen && !this.state.isOpen) {\n      this.init();\n    }\n  }\n\n  componentDidUpdate(prevProps, prevState) {\n    if (this.props.autoFocus && this.state.isOpen && !prevState.isOpen) {\n      this.setFocus();\n    }\n  }\n\n  componentWillUnmount() {\n    if (this.props.onExit) {\n      this.props.onExit();\n    }\n\n    if (this.state.isOpen) {\n      this.destroy();\n    }\n\n    this._isMounted = false;\n  }\n\n  onOpened(node, isAppearing) {\n    this.props.onOpened();\n    (this.props.modalTransition.onEntered || noop)(node, isAppearing);\n  }\n\n  onClosed(node) {\n    // so all methods get called before it is unmounted\n    this.props.onClosed();\n    (this.props.modalTransition.onExited || noop)(node);\n    this.destroy();\n\n    if (this._isMounted) {\n      this.setState({ isOpen: false });\n    }\n  }\n\n  setFocus() {\n    if (this._dialog && this._dialog.parentNode && typeof this._dialog.parentNode.focus === 'function') {\n      this._dialog.parentNode.focus();\n    }\n  }\n\n  handleBackdropClick(e) {\n    e.stopPropagation();\n    if (!this.props.isOpen || this.props.backdrop !== true) return;\n\n    const container = this._dialog;\n\n    if (e.target && !container.contains(e.target) && this.props.toggle) {\n      this.props.toggle(e);\n    }\n  }\n\n  handleEscape(e) {\n    if (this.props.isOpen && this.props.keyboard && e.keyCode === 27 && this.props.toggle) {\n      this.props.toggle(e);\n    }\n  }\n\n  init() {\n    this._element = document.createElement('div');\n    this._element.setAttribute('tabindex', '-1');\n    this._element.style.position = 'relative';\n    this._element.style.zIndex = this.props.zIndex;\n    this._originalBodyPadding = getOriginalBodyPadding();\n\n    conditionallyUpdateScrollbar();\n\n    document.body.appendChild(this._element);\n\n    if (!this.bodyClassAdded) {\n      document.body.className = classNames(\n        document.body.className,\n        mapToCssModules('modal-open', this.props.cssModule)\n      );\n      this.bodyClassAdded = true;\n    }\n  }\n\n  destroy() {\n    if (this._element) {\n      document.body.removeChild(this._element);\n      this._element = null;\n    }\n\n    if (this.bodyClassAdded) {\n      const modalOpenClassName = mapToCssModules('modal-open', this.props.cssModule);\n      // Use regex to prevent matching `modal-open` as part of a different class, e.g. `my-modal-opened`\n      const modalOpenClassNameRegex = new RegExp(`(^| )${modalOpenClassName}( |$)`);\n      document.body.className = document.body.className.replace(modalOpenClassNameRegex, ' ').trim();\n      this.bodyClassAdded = false;\n    }\n\n    setScrollbarWidth(this._originalBodyPadding);\n  }\n\n  renderModalDialog() {\n    const attributes = omit(this.props, propsToOmit);\n    const dialogBaseClass = 'modal-dialog';\n\n    return (\n      <div\n        {...attributes}\n        className={mapToCssModules(classNames(dialogBaseClass, this.props.className, {\n          [`modal-${this.props.size}`]: this.props.size,\n          [`${dialogBaseClass}-centered`]: this.props.centered,\n        }), this.props.cssModule)}\n        role=\"document\"\n        ref={(c) => {\n          this._dialog = c;\n        }}\n      >\n        <div\n          className={mapToCssModules(\n            classNames('modal-content', this.props.contentClassName),\n            this.props.cssModule\n          )}\n        >\n          {this.props.children}\n        </div>\n      </div>\n    );\n  }\n\n  render() {\n    if (this.state.isOpen) {\n      const {\n        wrapClassName,\n        modalClassName,\n        backdropClassName,\n        cssModule,\n        isOpen,\n        backdrop,\n        role,\n        labelledBy,\n        external,\n      } = this.props;\n\n      const modalAttributes = {\n        onClick: this.handleBackdropClick,\n        onKeyUp: this.handleEscape,\n        style: { display: 'block' },\n        'aria-labelledby': labelledBy,\n        role,\n        tabIndex: '-1'\n      };\n\n      const hasTransition = this.props.fade;\n      const modalTransition = {\n        ...Fade.defaultProps,\n        ...this.props.modalTransition,\n        baseClass: hasTransition ? this.props.modalTransition.baseClass : '',\n        timeout: hasTransition ? this.props.modalTransition.timeout : 0,\n      };\n      const backdropTransition = {\n        ...Fade.defaultProps,\n        ...this.props.backdropTransition,\n        baseClass: hasTransition ? this.props.backdropTransition.baseClass : '',\n        timeout: hasTransition ? this.props.backdropTransition.timeout : 0,\n      };\n\n      return (\n        <Portal node={this._element}>\n          <div className={mapToCssModules(wrapClassName)}>\n            <Fade\n              {...modalAttributes}\n              {...modalTransition}\n              in={isOpen}\n              onEntered={this.onOpened}\n              onExited={this.onClosed}\n              cssModule={cssModule}\n              className={mapToCssModules(classNames('modal', modalClassName), cssModule)}\n            >\n              {external}\n              {this.renderModalDialog()}\n            </Fade>\n            <Fade\n              {...backdropTransition}\n              in={isOpen && !!backdrop}\n              cssModule={cssModule}\n              className={mapToCssModules(classNames('modal-backdrop', backdropClassName), cssModule)}\n            />\n          </div>\n        </Portal>\n      );\n    }\n\n    return null;\n  }\n}\n\nModal.propTypes = propTypes;\nModal.defaultProps = defaultProps;\n\nexport default Modal;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { mapToCssModules } from './utils';\n\nconst propTypes = {\n  tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),\n  wrapTag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),\n  toggle: PropTypes.func,\n  className: PropTypes.string,\n  cssModule: PropTypes.object,\n  children: PropTypes.node,\n  closeAriaLabel: PropTypes.string,\n};\n\nconst defaultProps = {\n  tag: 'h5',\n  wrapTag: 'div',\n  closeAriaLabel: 'Close',\n};\n\nconst ModalHeader = (props) => {\n  let closeButton;\n  const {\n    className,\n    cssModule,\n    children,\n    toggle,\n    tag: Tag,\n    wrapTag: WrapTag,\n    closeAriaLabel,\n    ...attributes } = props;\n\n  const classes = mapToCssModules(classNames(\n    className,\n    'modal-header'\n  ), cssModule);\n\n  if (toggle) {\n    closeButton = (\n      <button type=\"button\" onClick={toggle} className={mapToCssModules('close', cssModule)} aria-label={closeAriaLabel}>\n        <span aria-hidden=\"true\">{String.fromCharCode(215)}</span>\n      </button>\n    );\n  }\n\n  return (\n    <WrapTag {...attributes} className={classes}>\n      <Tag className={mapToCssModules('modal-title', cssModule)}>\n        {children}\n      </Tag>\n      {closeButton}\n    </WrapTag>\n  );\n};\n\nModalHeader.propTypes = propTypes;\nModalHeader.defaultProps = defaultProps;\n\nexport default ModalHeader;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { mapToCssModules } from './utils';\n\nconst propTypes = {\n  tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),\n  className: PropTypes.string,\n  cssModule: PropTypes.object,\n};\n\nconst defaultProps = {\n  tag: 'div',\n};\n\nconst ModalBody = (props) => {\n  const {\n    className,\n    cssModule,\n    tag: Tag,\n    ...attributes } = props;\n  const classes = mapToCssModules(classNames(\n    className,\n    'modal-body'\n  ), cssModule);\n\n  return (\n    <Tag {...attributes} className={classes} />\n  );\n};\n\nModalBody.propTypes = propTypes;\nModalBody.defaultProps = defaultProps;\n\nexport default ModalBody;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { mapToCssModules } from './utils';\n\nconst propTypes = {\n  tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),\n  className: PropTypes.string,\n  cssModule: PropTypes.object,\n};\n\nconst defaultProps = {\n  tag: 'div',\n};\n\nconst ModalFooter = (props) => {\n  const {\n    className,\n    cssModule,\n    tag: Tag,\n    ...attributes } = props;\n  const classes = mapToCssModules(classNames(\n    className,\n    'modal-footer'\n  ), cssModule);\n\n  return (\n    <Tag {...attributes} className={classes} />\n  );\n};\n\nModalFooter.propTypes = propTypes;\nModalFooter.defaultProps = defaultProps;\n\nexport default ModalFooter;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport PopperContent from './PopperContent';\nimport { getTarget, DOMElement, mapToCssModules, omit, PopperPlacements } from './utils';\n\nconst propTypes = {\n  placement: PropTypes.oneOf(PopperPlacements),\n  target: PropTypes.oneOfType([\n    PropTypes.string,\n    PropTypes.func,\n    DOMElement,\n  ]).isRequired,\n  container: PropTypes.oneOfType([\n    PropTypes.string,\n    PropTypes.func,\n    DOMElement,\n  ]),\n  isOpen: PropTypes.bool,\n  disabled: PropTypes.bool,\n  hideArrow: PropTypes.bool,\n  className: PropTypes.string,\n  innerClassName: PropTypes.string,\n  cssModule: PropTypes.object,\n  toggle: PropTypes.func,\n  autohide: PropTypes.bool,\n  placementPrefix: PropTypes.string,\n  delay: PropTypes.oneOfType([\n    PropTypes.shape({ show: PropTypes.number, hide: PropTypes.number }),\n    PropTypes.number,\n  ]),\n  modifiers: PropTypes.object,\n};\n\nconst DEFAULT_DELAYS = {\n  show: 0,\n  hide: 250\n};\n\nconst defaultProps = {\n  isOpen: false,\n  hideArrow: false,\n  placement: 'top',\n  placementPrefix: 'bs-tooltip',\n  delay: DEFAULT_DELAYS,\n  autohide: true,\n  toggle: function () {}\n};\n\nclass Tooltip extends React.Component {\n  constructor(props) {\n    super(props);\n\n    this.addTargetEvents = this.addTargetEvents.bind(this);\n    this.handleDocumentClick = this.handleDocumentClick.bind(this);\n    this.removeTargetEvents = this.removeTargetEvents.bind(this);\n    this.toggle = this.toggle.bind(this);\n    this.onMouseOverTooltip = this.onMouseOverTooltip.bind(this);\n    this.onMouseLeaveTooltip = this.onMouseLeaveTooltip.bind(this);\n    this.onMouseOverTooltipContent = this.onMouseOverTooltipContent.bind(this);\n    this.onMouseLeaveTooltipContent = this.onMouseLeaveTooltipContent.bind(this);\n    this.show = this.show.bind(this);\n    this.hide = this.hide.bind(this);\n  }\n\n  componentDidMount() {\n    this._target = getTarget(this.props.target);\n    this.addTargetEvents();\n  }\n\n  componentWillUnmount() {\n    this.removeTargetEvents();\n  }\n\n  onMouseOverTooltip() {\n    if (this._hideTimeout) {\n      this.clearHideTimeout();\n    }\n    this._showTimeout = setTimeout(this.show, this.getDelay('show'));\n  }\n\n  onMouseLeaveTooltip() {\n    if (this._showTimeout) {\n      this.clearShowTimeout();\n    }\n    this._hideTimeout = setTimeout(this.hide, this.getDelay('hide'));\n  }\n\n  onMouseOverTooltipContent() {\n    if (this.props.autohide) {\n      return;\n    }\n    if (this._hideTimeout) {\n      this.clearHideTimeout();\n    }\n  }\n\n  onMouseLeaveTooltipContent() {\n    if (this.props.autohide) {\n      return;\n    }\n    if (this._showTimeout) {\n      this.clearShowTimeout();\n    }\n    this._hideTimeout = setTimeout(this.hide, this.getDelay('hide'));\n  }\n\n  getDelay(key) {\n    const { delay } = this.props;\n    if (typeof delay === 'object') {\n      return isNaN(delay[key]) ? DEFAULT_DELAYS[key] : delay[key];\n    }\n    return delay;\n  }\n\n  show() {\n    if (!this.props.isOpen) {\n      this.clearShowTimeout();\n      this.toggle();\n    }\n  }\n\n  hide() {\n    if (this.props.isOpen) {\n      this.clearHideTimeout();\n      this.toggle();\n    }\n  }\n\n  clearShowTimeout() {\n    clearTimeout(this._showTimeout);\n    this._showTimeout = undefined;\n  }\n\n  clearHideTimeout() {\n    clearTimeout(this._hideTimeout);\n    this._hideTimeout = undefined;\n  }\n\n  handleDocumentClick(e) {\n    if (e.target === this._target || this._target.contains(e.target)) {\n      if (this._hideTimeout) {\n        this.clearHideTimeout();\n      }\n\n      if (!this.props.isOpen) {\n        this.toggle();\n      }\n    }\n  }\n\n  addTargetEvents() {\n    this._target.addEventListener('mouseover', this.onMouseOverTooltip, true);\n    this._target.addEventListener('mouseout', this.onMouseLeaveTooltip, true);\n    ['click', 'touchstart'].forEach(event =>\n      document.addEventListener(event, this.handleDocumentClick, true)\n    );\n  }\n\n  removeTargetEvents() {\n    this._target.removeEventListener('mouseover', this.onMouseOverTooltip, true);\n    this._target.removeEventListener('mouseout', this.onMouseLeaveTooltip, true);\n    ['click', 'touchstart'].forEach(event =>\n      document.removeEventListener(event, this.handleDocumentClick, true)\n    );\n  }\n\n  toggle(e) {\n    if (this.props.disabled) {\n      return e && e.preventDefault();\n    }\n\n    return this.props.toggle();\n  }\n\n  render() {\n    if (!this.props.isOpen) {\n      return null;\n    }\n\n    const attributes = omit(this.props, Object.keys(propTypes));\n    const classes = mapToCssModules(classNames(\n      'tooltip-inner',\n      this.props.innerClassName\n    ), this.props.cssModule);\n\n    const popperClasses = mapToCssModules(classNames(\n      'tooltip',\n      'show',\n      this.props.className\n    ), this.props.cssModule);\n\n    return (\n      <PopperContent\n        className={popperClasses}\n        target={this.props.target}\n        isOpen={this.props.isOpen}\n        hideArrow={this.props.hideArrow}\n        placement={this.props.placement}\n        placementPrefix={this.props.placementPrefix}\n        container={this.props.container}\n        modifiers={this.props.modifiers}\n      >\n        <div\n          {...attributes}\n          className={classes}\n          onMouseOver={this.onMouseOverTooltipContent}\n          onMouseLeave={this.onMouseLeaveTooltipContent}\n        />\n      </PopperContent>\n    );\n  }\n}\n\nTooltip.propTypes = propTypes;\nTooltip.defaultProps = defaultProps;\n\nexport default Tooltip;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { mapToCssModules, deprecated } from './utils';\n\nconst propTypes = {\n  className: PropTypes.string,\n  cssModule: PropTypes.object,\n  size: PropTypes.string,\n  bordered: PropTypes.bool,\n  striped: PropTypes.bool,\n  inverse: deprecated(PropTypes.bool, 'Please use the prop \"dark\"'),\n  dark: PropTypes.bool,\n  hover: PropTypes.bool,\n  responsive: PropTypes.oneOfType([PropTypes.bool, PropTypes.string]),\n  tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),\n  responsiveTag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),\n};\n\nconst defaultProps = {\n  tag: 'table',\n  responsiveTag: 'div',\n};\n\nconst Table = (props) => {\n  const {\n    className,\n    cssModule,\n    size,\n    bordered,\n    striped,\n    inverse,\n    dark,\n    hover,\n    responsive,\n    tag: Tag,\n    responsiveTag: ResponsiveTag,\n    ...attributes\n  } = props;\n\n  const classes = mapToCssModules(classNames(\n    className,\n    'table',\n    size ? 'table-' + size : false,\n    bordered ? 'table-bordered' : false,\n    striped ? 'table-striped' : false,\n    (dark || inverse) ? 'table-dark' : false,\n    hover ? 'table-hover' : false,\n  ), cssModule);\n\n  const table = <Tag {...attributes} className={classes} />;\n\n  if (responsive) {\n    const responsiveClassName = responsive === true ? 'table-responsive' : `table-responsive-${responsive}`;\n\n    return (\n      <ResponsiveTag className={responsiveClassName}>{table}</ResponsiveTag>\n    );\n  }\n\n  return table;\n};\n\nTable.propTypes = propTypes;\nTable.defaultProps = defaultProps;\n\nexport default Table;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { mapToCssModules } from './utils';\n\nconst propTypes = {\n  tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),\n  flush: PropTypes.bool,\n  className: PropTypes.string,\n  cssModule: PropTypes.object,\n};\n\nconst defaultProps = {\n  tag: 'ul'\n};\n\nconst ListGroup = (props) => {\n  const {\n    className,\n    cssModule,\n    tag: Tag,\n    flush,\n    ...attributes\n  } = props;\n  const classes = mapToCssModules(classNames(\n    className,\n    'list-group',\n    flush ? 'list-group-flush' : false\n  ), cssModule);\n\n  return (\n    <Tag {...attributes} className={classes} />\n  );\n};\n\nListGroup.propTypes = propTypes;\nListGroup.defaultProps = defaultProps;\n\nexport default ListGroup;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { mapToCssModules } from './utils';\n\nconst propTypes = {\n  children: PropTypes.node,\n  inline: PropTypes.bool,\n  tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),\n  innerRef: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),\n  className: PropTypes.string,\n  cssModule: PropTypes.object,\n};\n\nconst defaultProps = {\n  tag: 'form',\n};\n\nconst Form = (props) => {\n  const {\n    className,\n    cssModule,\n    inline,\n    tag: Tag,\n    innerRef,\n    ...attributes\n  } = props;\n\n  const classes = mapToCssModules(classNames(\n    className,\n    inline ? 'form-inline' : false\n  ), cssModule);\n\n  return (\n    <Tag {...attributes} ref={innerRef} className={classes} />\n  );\n};\n\nForm.propTypes = propTypes;\nForm.defaultProps = defaultProps;\n\nexport default Form;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { mapToCssModules } from './utils';\n\nconst propTypes = {\n  children: PropTypes.node,\n  tag: PropTypes.string,\n  className: PropTypes.string,\n  cssModule: PropTypes.object,\n  valid: PropTypes.bool\n};\n\nconst defaultProps = {\n  tag: 'div',\n  valid: undefined\n};\n\nconst FormFeedback = (props) => {\n  const {\n    className,\n    cssModule,\n    valid,\n    tag: Tag,\n    ...attributes\n  } = props;\n\n  const classes = mapToCssModules(classNames(\n    className,\n    valid ? 'valid-feedback' : 'invalid-feedback'\n  ), cssModule);\n\n  return (\n    <Tag {...attributes} className={classes} />\n  );\n};\n\nFormFeedback.propTypes = propTypes;\nFormFeedback.defaultProps = defaultProps;\n\nexport default FormFeedback;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { mapToCssModules } from './utils';\n\nconst propTypes = {\n  children: PropTypes.node,\n  row: PropTypes.bool,\n  check: PropTypes.bool,\n  inline: PropTypes.bool,\n  disabled: PropTypes.bool,\n  tag: PropTypes.string,\n  className: PropTypes.string,\n  cssModule: PropTypes.object,\n};\n\nconst defaultProps = {\n  tag: 'div',\n};\n\nconst FormGroup = (props) => {\n  const {\n    className,\n    cssModule,\n    row,\n    disabled,\n    check,\n    inline,\n    tag: Tag,\n    ...attributes\n  } = props;\n\n  const classes = mapToCssModules(classNames(\n    className,\n    row ? 'row' : false,\n    check ? 'form-check' : 'form-group',\n    check && inline ? 'form-check-inline' : false,\n    check && disabled ? 'disabled' : false\n  ), cssModule);\n\n  return (\n    <Tag {...attributes} className={classes} />\n  );\n};\n\nFormGroup.propTypes = propTypes;\nFormGroup.defaultProps = defaultProps;\n\nexport default FormGroup;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { mapToCssModules } from './utils';\n\nconst propTypes = {\n  children: PropTypes.node,\n  inline: PropTypes.bool,\n  tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),\n  color: PropTypes.string,\n  className: PropTypes.string,\n  cssModule: PropTypes.object,\n};\n\nconst defaultProps = {\n  tag: 'small',\n  color: 'muted',\n};\n\nconst FormText = (props) => {\n  const {\n    className,\n    cssModule,\n    inline,\n    color,\n    tag: Tag,\n    ...attributes\n  } = props;\n\n  const classes = mapToCssModules(classNames(\n    className,\n    !inline ? 'form-text' : false,\n    color ? `text-${color}` : false\n  ), cssModule);\n\n  return (\n    <Tag {...attributes} className={classes} />\n  );\n};\n\nFormText.propTypes = propTypes;\nFormText.defaultProps = defaultProps;\n\nexport default FormText;\n","/* eslint react/prefer-stateless-function: 0 */\n\nimport React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { mapToCssModules, deprecated, warnOnce } from './utils';\n\nconst propTypes = {\n  children: PropTypes.node,\n  type: PropTypes.string,\n  size: PropTypes.string,\n  bsSize: PropTypes.string,\n  state: deprecated(PropTypes.string, 'Please use the props \"valid\" and \"invalid\" to indicate the state.'),\n  valid: PropTypes.bool,\n  invalid: PropTypes.bool,\n  tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),\n  innerRef: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),\n  static: deprecated(PropTypes.bool, 'Please use the prop \"plaintext\"'),\n  plaintext: PropTypes.bool,\n  addon: PropTypes.bool,\n  className: PropTypes.string,\n  cssModule: PropTypes.object,\n};\n\nconst defaultProps = {\n  type: 'text',\n};\n\nclass Input extends React.Component {\n  render() {\n    let {\n      className,\n      cssModule,\n      type,\n      bsSize,\n      state,\n      valid,\n      invalid,\n      tag,\n      addon,\n      static: staticInput,\n      plaintext,\n      innerRef,\n      ...attributes\n    } = this.props;\n\n    const checkInput = ['radio', 'checkbox'].indexOf(type) > -1;\n    const isNotaNumber = new RegExp('\\\\D', 'g');\n\n    const fileInput = type === 'file';\n    const textareaInput = type === 'textarea';\n    const selectInput = type === 'select';\n    let Tag = tag || ((selectInput || textareaInput) ? type : 'input');\n\n    let formControlClass = 'form-control';\n\n    if (plaintext || staticInput) {\n      formControlClass = `${formControlClass}-plaintext`;\n      Tag = tag || 'p';\n    } else if (fileInput) {\n      formControlClass = `${formControlClass}-file`;\n    } else if (checkInput) {\n      if (addon) {\n        formControlClass = null;\n      } else {\n        formControlClass = 'form-check-input';\n      }\n    }\n\n    if (state && typeof valid === 'undefined' && typeof invalid === 'undefined') {\n      if (state === 'danger') {\n        invalid = true;\n      } else if (state === 'success') {\n        valid = true;\n      }\n    }\n\n    if (attributes.size && isNotaNumber.test(attributes.size)) {\n      warnOnce('Please use the prop \"bsSize\" instead of the \"size\" to bootstrap\\'s input sizing.');\n      bsSize = attributes.size;\n      delete attributes.size;\n    }\n\n    const classes = mapToCssModules(classNames(\n      className,\n      invalid && 'is-invalid',\n      valid && 'is-valid',\n      bsSize ? `form-control-${bsSize}` : false,\n      formControlClass\n    ), cssModule);\n\n    if (Tag === 'input' || typeof tag !== 'string') {\n      attributes.type = type;\n    }\n\n    return (\n      <Tag {...attributes} ref={innerRef} className={classes} />\n    );\n  }\n}\n\nInput.propTypes = propTypes;\nInput.defaultProps = defaultProps;\n\nexport default Input;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { mapToCssModules } from './utils';\n\nconst propTypes = {\n  tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),\n  size: PropTypes.string,\n  className: PropTypes.string,\n  cssModule: PropTypes.object,\n};\n\nconst defaultProps = {\n  tag: 'div'\n};\n\nconst InputGroup = (props) => {\n  const {\n    className,\n    cssModule,\n    tag: Tag,\n    size,\n    ...attributes\n  } = props;\n  const classes = mapToCssModules(classNames(\n    className,\n    'input-group',\n    size ? `input-group-${size}` : null\n  ), cssModule);\n\n  return (\n    <Tag {...attributes} className={classes} />\n  );\n};\n\nInputGroup.propTypes = propTypes;\nInputGroup.defaultProps = defaultProps;\n\nexport default InputGroup;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { mapToCssModules } from './utils';\n\nconst propTypes = {\n  tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),\n  className: PropTypes.string,\n  cssModule: PropTypes.object,\n};\n\nconst defaultProps = {\n  tag: 'span'\n};\n\nconst InputGroupText = (props) => {\n  const {\n    className,\n    cssModule,\n    tag: Tag,\n    ...attributes\n  } = props;\n\n  const classes = mapToCssModules(classNames(\n    className,\n    'input-group-text'\n  ), cssModule);\n\n  return (\n    <Tag {...attributes} className={classes} />\n  );\n};\n\nInputGroupText.propTypes = propTypes;\nInputGroupText.defaultProps = defaultProps;\n\nexport default InputGroupText;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { mapToCssModules } from './utils';\nimport InputGroupText from './InputGroupText';\n\nconst propTypes = {\n  tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),\n  addonType: PropTypes.oneOf(['prepend', 'append']).isRequired,\n  children: PropTypes.node,\n  className: PropTypes.string,\n  cssModule: PropTypes.object,\n};\n\nconst defaultProps = {\n  tag: 'div'\n};\n\nconst InputGroupAddon = (props) => {\n  const {\n    className,\n    cssModule,\n    tag: Tag,\n    addonType,\n    children,\n    ...attributes\n  } = props;\n\n  const classes = mapToCssModules(classNames(\n    className,\n    'input-group-' + addonType\n  ), cssModule);\n\n  // Convenience to assist with transition\n  if (typeof children === 'string') {\n    return (\n      <Tag {...attributes} className={classes}>\n        <InputGroupText children={children} />\n      </Tag>\n    );\n  }\n\n  return (\n    <Tag {...attributes} className={classes} children={children} />\n  );\n};\n\nInputGroupAddon.propTypes = propTypes;\nInputGroupAddon.defaultProps = defaultProps;\n\nexport default InputGroupAddon;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport Button from './Button';\nimport InputGroupAddon from './InputGroupAddon';\nimport { warnOnce } from './utils';\n\nconst propTypes = {\n  tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),\n  addonType: PropTypes.oneOf(['prepend', 'append']).isRequired,\n  children: PropTypes.node,\n  groupClassName: PropTypes.string,\n  groupAttributes: PropTypes.object,\n  className: PropTypes.string,\n  cssModule: PropTypes.object,\n};\n\nconst InputGroupButton = (props) => {\n  warnOnce('The \"InputGroupButton\" component has been deprecated.\\nPlease use component \"InputGroupAddon\".');\n\n  let {\n    children,\n    groupClassName,\n    groupAttributes,\n    ...propsWithoutGroup\n  } = props;\n\n  if (typeof children === 'string') {\n    let {\n      cssModule,\n      tag,\n      addonType,\n      ...attributes\n    } = propsWithoutGroup;\n\n    const allGroupAttributes = {\n      ...groupAttributes,\n      cssModule,\n      tag,\n      addonType\n    };\n\n    return (\n      <InputGroupAddon {...allGroupAttributes} className={groupClassName}>\n        <Button {...attributes} children={children} />\n      </InputGroupAddon>\n    );\n  }\n\n  return (\n    <InputGroupAddon {...props} children={children} />\n  );\n};\n\nInputGroupButton.propTypes = propTypes;\n\nexport default InputGroupButton;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport Dropdown from './Dropdown';\n\nconst propTypes = {\n  addonType: PropTypes.oneOf(['prepend', 'append']).isRequired,\n  children: PropTypes.node,\n};\n\nconst InputGroupButtonDropdown = (props) => {\n  return (\n    <Dropdown {...props} />\n  );\n};\n\nInputGroupButtonDropdown.propTypes = propTypes;\n\nexport default InputGroupButtonDropdown;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport isobject from 'lodash.isobject';\nimport { mapToCssModules, deprecated } from './utils';\n\nconst colWidths = ['xs', 'sm', 'md', 'lg', 'xl'];\n\nconst stringOrNumberProp = PropTypes.oneOfType([PropTypes.number, PropTypes.string]);\n\nconst columnProps = PropTypes.oneOfType([\n  PropTypes.string,\n  PropTypes.number,\n  PropTypes.shape({\n    size: stringOrNumberProp,\n    push: deprecated(stringOrNumberProp, 'Please use the prop \"order\"'),\n    pull: deprecated(stringOrNumberProp, 'Please use the prop \"order\"'),\n    order: stringOrNumberProp,\n    offset: stringOrNumberProp,\n  }),\n]);\n\nconst propTypes = {\n  children: PropTypes.node,\n  hidden: PropTypes.bool,\n  check: PropTypes.bool,\n  size: PropTypes.string,\n  for: PropTypes.string,\n  tag: PropTypes.string,\n  className: PropTypes.string,\n  cssModule: PropTypes.object,\n  xs: columnProps,\n  sm: columnProps,\n  md: columnProps,\n  lg: columnProps,\n  xl: columnProps,\n  widths: PropTypes.array,\n};\n\nconst defaultProps = {\n  tag: 'label',\n  widths: colWidths,\n};\n\nconst getColumnSizeClass = (isXs, colWidth, colSize) => {\n  if (colSize === true || colSize === '') {\n    return isXs ? 'col' : `col-${colWidth}`;\n  } else if (colSize === 'auto') {\n    return isXs ? 'col-auto' : `col-${colWidth}-auto`;\n  }\n\n  return isXs ? `col-${colSize}` : `col-${colWidth}-${colSize}`;\n};\n\nconst Label = (props) => {\n  const {\n    className,\n    cssModule,\n    hidden,\n    widths,\n    tag: Tag,\n    check,\n    size,\n    for: htmlFor,\n    ...attributes\n  } = props;\n\n  const colClasses = [];\n\n  widths.forEach((colWidth, i) => {\n    let columnProp = props[colWidth];\n\n    delete attributes[colWidth];\n\n    if (!columnProp && columnProp !== '') {\n      return;\n    }\n\n    const isXs = !i;\n    let colClass;\n\n    if (isobject(columnProp)) {\n      const colSizeInterfix = isXs ? '-' : `-${colWidth}-`;\n      colClass = getColumnSizeClass(isXs, colWidth, columnProp.size);\n\n      colClasses.push(mapToCssModules(classNames({\n        [colClass]: columnProp.size || columnProp.size === '',\n        [`order${colSizeInterfix}${columnProp.order}`]: columnProp.order || columnProp.order === 0,\n        [`offset${colSizeInterfix}${columnProp.offset}`]: columnProp.offset || columnProp.offset === 0\n      })), cssModule);\n    } else {\n      colClass = getColumnSizeClass(isXs, colWidth, columnProp);\n      colClasses.push(colClass);\n    }\n  });\n\n  const classes = mapToCssModules(classNames(\n    className,\n    hidden ? 'sr-only' : false,\n    check ? 'form-check-label' : false,\n    size ? `col-form-label-${size}` : false,\n    colClasses,\n    colClasses.length ? 'col-form-label' : false\n  ), cssModule);\n\n  return (\n    <Tag htmlFor={htmlFor} {...attributes} className={classes} />\n  );\n};\n\nLabel.propTypes = propTypes;\nLabel.defaultProps = defaultProps;\n\nexport default Label;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { mapToCssModules } from './utils';\n\nconst propTypes = {\n  body: PropTypes.bool,\n  bottom: PropTypes.bool,\n  children: PropTypes.node,\n  className: PropTypes.string,\n  cssModule: PropTypes.object,\n  heading: PropTypes.bool,\n  left: PropTypes.bool,\n  list: PropTypes.bool,\n  middle: PropTypes.bool,\n  object: PropTypes.bool,\n  right: PropTypes.bool,\n  tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),\n  top: PropTypes.bool,\n};\n\nconst Media = (props) => {\n  const {\n    body,\n    bottom,\n    className,\n    cssModule,\n    heading,\n    left,\n    list,\n    middle,\n    object,\n    right,\n    tag,\n    top,\n    ...attributes\n  } = props;\n\n  let defaultTag;\n  if (heading) {\n    defaultTag = 'h4';\n  } else if (left || right) {\n    defaultTag = 'a';\n  } else if (object) {\n    defaultTag = 'img';\n  } else if (list) {\n    defaultTag = 'ul';\n  } else {\n    defaultTag = 'div';\n  }\n  const Tag = tag || defaultTag;\n\n  const classes = mapToCssModules(classNames(\n    className,\n    {\n      'media-body': body,\n      'media-heading': heading,\n      'media-left': left,\n      'media-right': right,\n      'media-top': top,\n      'media-bottom': bottom,\n      'media-middle': middle,\n      'media-object': object,\n      'media-list': list,\n      media: !body && !heading && !left && !right && !top && !bottom && !middle && !object && !list,\n    }\n  ), cssModule);\n\n  return (\n    <Tag {...attributes} className={classes} />\n  );\n};\n\nMedia.propTypes = propTypes;\n\nexport default Media;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { mapToCssModules } from './utils';\n\nconst propTypes = {\n  children: PropTypes.node,\n  className: PropTypes.string,\n  cssModule: PropTypes.object,\n  size: PropTypes.string,\n  tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),\n};\n\nconst defaultProps = {\n  tag: 'ul',\n};\n\nconst Pagination = (props) => {\n  const {\n    className,\n    cssModule,\n    size,\n    tag: Tag,\n    ...attributes\n  } = props;\n\n  const classes = mapToCssModules(classNames(\n    className,\n    'pagination',\n    {\n      [`pagination-${size}`]: !!size,\n    }\n  ), cssModule);\n\n  return (\n    <Tag {...attributes} className={classes} />\n  );\n};\n\nPagination.propTypes = propTypes;\nPagination.defaultProps = defaultProps;\n\nexport default Pagination;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { mapToCssModules } from './utils';\n\nconst propTypes = {\n  active: PropTypes.bool,\n  children: PropTypes.node,\n  className: PropTypes.string,\n  cssModule: PropTypes.object,\n  disabled: PropTypes.bool,\n  tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),\n};\n\nconst defaultProps = {\n  tag: 'li',\n};\n\nconst PaginationItem = (props) => {\n  const {\n    active,\n    className,\n    cssModule,\n    disabled,\n    tag: Tag,\n    ...attributes\n  } = props;\n\n  const classes = mapToCssModules(classNames(\n    className,\n    'page-item',\n    {\n      active,\n      disabled,\n    }\n  ), cssModule);\n\n  return (\n    <Tag {...attributes} className={classes} />\n  );\n};\n\nPaginationItem.propTypes = propTypes;\nPaginationItem.defaultProps = defaultProps;\n\nexport default PaginationItem;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { mapToCssModules } from './utils';\n\nconst propTypes = {\n  'aria-label': PropTypes.string,\n  children: PropTypes.node,\n  className: PropTypes.string,\n  cssModule: PropTypes.object,\n  next: PropTypes.bool,\n  previous: PropTypes.bool,\n  tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),\n};\n\nconst defaultProps = {\n  tag: 'a',\n};\n\nconst PaginationLink = (props) => {\n  const {\n    className,\n    cssModule,\n    next,\n    previous,\n    tag: Tag,\n    ...attributes\n  } = props;\n\n  const classes = mapToCssModules(classNames(\n    className,\n    'page-link'\n  ), cssModule);\n\n  let defaultAriaLabel;\n  if (previous) {\n    defaultAriaLabel = 'Previous';\n  } else if (next) {\n    defaultAriaLabel = 'Next';\n  }\n  const ariaLabel = props['aria-label'] || defaultAriaLabel;\n\n  let defaultCaret;\n  if (previous) {\n    defaultCaret = '\\u00ab';\n  } else if (next) {\n    defaultCaret = '\\u00bb';\n  }\n\n  let children = props.children;\n  if (children && Array.isArray(children) && children.length === 0) {\n    children = null;\n  }\n\n  if (previous || next) {\n    children = [\n      <span\n        aria-hidden=\"true\"\n        key=\"caret\"\n      >\n        {children || defaultCaret}\n      </span>,\n      <span\n        className=\"sr-only\"\n        key=\"sr\"\n      >\n        {ariaLabel}\n      </span>,\n    ];\n  }\n\n  return (\n    <Tag\n      {...attributes}\n      className={classes}\n      aria-label={ariaLabel}\n    >\n      {children}\n    </Tag>\n  );\n};\n\nPaginationLink.propTypes = propTypes;\nPaginationLink.defaultProps = defaultProps;\n\nexport default PaginationLink;\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { mapToCssModules, omit } from './utils';\n\nconst propTypes = {\n  tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),\n  activeTab: PropTypes.any,\n  className: PropTypes.string,\n  cssModule: PropTypes.object,\n};\n\nconst defaultProps = {\n  tag: 'div',\n};\n\nconst childContextTypes = {\n  activeTabId: PropTypes.any\n};\n\nexport default class TabContent extends Component {\n  constructor(props) {\n    super(props);\n    this.state = {\n      activeTab: this.props.activeTab\n    };\n  }\n  getChildContext() {\n    return {\n      activeTabId: this.state.activeTab\n    };\n  }\n  componentWillReceiveProps(nextProps) {\n    if (this.state.activeTab !== nextProps.activeTab) {\n      this.setState({\n        activeTab: nextProps.activeTab\n      });\n    }\n  }\n  render() {\n    const {\n      className,\n      cssModule,\n      tag: Tag,\n    } = this.props;\n\n    const attributes = omit(this.props, Object.keys(propTypes));\n\n    const classes = mapToCssModules(classNames('tab-content', className), cssModule);\n\n    return (\n      <Tag {...attributes} className={classes} />\n    );\n  }\n}\nTabContent.propTypes = propTypes;\nTabContent.defaultProps = defaultProps;\nTabContent.childContextTypes = childContextTypes;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { mapToCssModules } from './utils';\n\nconst propTypes = {\n  tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),\n  className: PropTypes.string,\n  cssModule: PropTypes.object,\n  tabId: PropTypes.any,\n};\n\nconst defaultProps = {\n  tag: 'div',\n};\n\nconst contextTypes = {\n  activeTabId: PropTypes.any\n};\n\nexport default function TabPane(props, context) {\n  const {\n    className,\n    cssModule,\n    tabId,\n    tag: Tag,\n    ...attributes\n  } = props;\n  const classes = mapToCssModules(classNames('tab-pane', className, { active: tabId === context.activeTabId }), cssModule);\n  return (\n    <Tag {...attributes} className={classes} />\n  );\n}\nTabPane.propTypes = propTypes;\nTabPane.defaultProps = defaultProps;\nTabPane.contextTypes = contextTypes;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { mapToCssModules } from './utils';\n\nconst propTypes = {\n  tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),\n  fluid: PropTypes.bool,\n  className: PropTypes.string,\n  cssModule: PropTypes.object,\n};\n\nconst defaultProps = {\n  tag: 'div'\n};\n\nconst Jumbotron = (props) => {\n  const {\n    className,\n    cssModule,\n    tag: Tag,\n    fluid,\n    ...attributes\n  } = props;\n\n  const classes = mapToCssModules(classNames(\n    className,\n    'jumbotron',\n    fluid ? 'jumbotron-fluid' : false\n  ), cssModule);\n\n  return (\n    <Tag {...attributes} className={classes} />\n  );\n};\n\nJumbotron.propTypes = propTypes;\nJumbotron.defaultProps = defaultProps;\n\nexport default Jumbotron;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { mapToCssModules } from './utils';\nimport Fade from './Fade';\n\nconst propTypes = {\n  children: PropTypes.node,\n  className: PropTypes.string,\n  closeClassName: PropTypes.string,\n  closeAriaLabel: PropTypes.string,\n  cssModule: PropTypes.object,\n  color: PropTypes.string,\n  isOpen: PropTypes.bool,\n  toggle: PropTypes.func,\n  tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),\n  transition: PropTypes.shape(Fade.propTypes),\n};\n\nconst defaultProps = {\n  color: 'success',\n  isOpen: true,\n  tag: 'div',\n  closeAriaLabel: 'Close',\n  transition: {\n    ...Fade.defaultProps,\n    unmountOnExit: true,\n  },\n};\n\nfunction Alert(props) {\n  const {\n    className,\n    closeClassName,\n    closeAriaLabel,\n    cssModule,\n    tag: Tag,\n    color,\n    isOpen,\n    toggle,\n    children,\n    transition,\n    ...attributes\n  } = props;\n\n  const classes = mapToCssModules(classNames(\n    className,\n    'alert',\n    `alert-${color}`,\n    { 'alert-dismissible': toggle }\n  ), cssModule);\n\n  const closeClasses = mapToCssModules(classNames('close', closeClassName), cssModule);\n\n  return (\n    <Fade {...attributes} {...transition} tag={Tag} className={classes} in={isOpen} role=\"alert\">\n      {toggle ?\n        <button type=\"button\" className={closeClasses} aria-label={closeAriaLabel} onClick={toggle}>\n          <span aria-hidden=\"true\">&times;</span>\n        </button>\n        : null}\n      {children}\n    </Fade>\n  );\n}\n\nAlert.propTypes = propTypes;\nAlert.defaultProps = defaultProps;\n\nexport default Alert;\n","import React, { Component } from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport Transition from 'react-transition-group/Transition';\nimport { mapToCssModules, omit, pick, TransitionTimeouts, TransitionPropTypeKeys, TransitionStatuses } from './utils';\n\nconst propTypes = {\n  ...Transition.propTypes,\n  isOpen: PropTypes.bool,\n  children: PropTypes.oneOfType([\n    PropTypes.arrayOf(PropTypes.node),\n    PropTypes.node\n  ]),\n  tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),\n  className: PropTypes.node,\n  navbar: PropTypes.bool,\n  cssModule: PropTypes.object,\n};\n\nconst defaultProps = {\n  ...Transition.defaultProps,\n  isOpen: false,\n  appear: false,\n  enter: true,\n  exit: true,\n  tag: 'div',\n  timeout: TransitionTimeouts.Collapse,\n};\n\nconst transitionStatusToClassHash = {\n  [TransitionStatuses.ENTERING]: 'collapsing',\n  [TransitionStatuses.ENTERED]: 'collapse show',\n  [TransitionStatuses.EXITING]: 'collapsing',\n  [TransitionStatuses.EXITED]: 'collapse',\n};\n\nfunction getTransitionClass(status) {\n  return transitionStatusToClassHash[status] || 'collapse';\n}\n\nfunction getHeight(node) {\n  return node.scrollHeight;\n}\n\nclass Collapse extends Component {\n  constructor(props) {\n    super(props);\n\n    this.state = {\n      height: null\n    };\n\n    ['onEntering', 'onEntered', 'onExit', 'onExiting', 'onExited'].forEach((name) => {\n      this[name] = this[name].bind(this);\n    });\n  }\n\n  onEntering(node, isAppearing) {\n    this.setState({ height: getHeight(node) });\n    this.props.onEntering(node, isAppearing);\n  }\n\n  onEntered(node, isAppearing) {\n    this.setState({ height: null });\n    this.props.onEntered(node, isAppearing);\n  }\n\n  onExit(node) {\n    this.setState({ height: getHeight(node) });\n    this.props.onExit(node);\n  }\n\n  onExiting(node) {\n    // getting this variable triggers a reflow\n    const _unused = node.offsetHeight; // eslint-disable-line no-unused-vars\n    this.setState({ height: 0 });\n    this.props.onExiting(node);\n  }\n\n  onExited(node) {\n    this.setState({ height: null });\n    this.props.onExited(node);\n  }\n\n  render() {\n    const {\n      tag: Tag,\n      isOpen,\n      className,\n      navbar,\n      cssModule,\n      children,\n      ...otherProps\n    } = this.props;\n\n    const { height } = this.state;\n\n    // In NODE_ENV=production the Transition.propTypes are wrapped which results in an\n    // empty object \"{}\". This is the result of the `react-transition-group` babel\n    // configuration settings. Therefore, to ensure that production builds work without\n    // error, we can either explicitly define keys or use the Transition.defaultProps.\n    // Using the Transition.defaultProps excludes any required props. Thus, the best\n    // solution is to explicitly define required props in our utilities and reference these.\n    // This also gives us more flexibility in the future to remove the prop-types\n    // dependency in distribution builds (Similar to how `react-transition-group` does).\n    // Note: Without omitting the `react-transition-group` props, the resulting child\n    // Tag component would inherit the Transition properties as attributes for the HTML\n    // element which results in errors/warnings for non-valid attributes.\n    const transitionProps = pick(otherProps, TransitionPropTypeKeys);\n    const childProps = omit(otherProps, TransitionPropTypeKeys);\n\n    return (\n      <Transition\n        {...transitionProps}\n        in={isOpen}\n        onEntering={this.onEntering}\n        onEntered={this.onEntered}\n        onExit={this.onExit}\n        onExiting={this.onExiting}\n        onExited={this.onExited}\n      >\n        {(status) => {\n          let collapseClass = getTransitionClass(status);\n          const classes = mapToCssModules(classNames(\n            className,\n            collapseClass,\n            navbar && 'navbar-collapse'\n          ), cssModule);\n          const style = height === null ? null : { height };\n          return (\n            <Tag\n              {...childProps}\n              style={{ ...childProps.style, ...style }}\n              className={classes}\n            >\n              {children}\n            </Tag>\n          );\n        }}\n      </Transition>\n    );\n  }\n}\n\nCollapse.propTypes = propTypes;\nCollapse.defaultProps = defaultProps;\nexport default Collapse;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { mapToCssModules } from './utils';\n\nconst propTypes = {\n  tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),\n  active: PropTypes.bool,\n  disabled: PropTypes.bool,\n  color: PropTypes.string,\n  action: PropTypes.bool,\n  className: PropTypes.any,\n  cssModule: PropTypes.object,\n};\n\nconst defaultProps = {\n  tag: 'li'\n};\n\nconst handleDisabledOnClick = (e) => {\n  e.preventDefault();\n};\n\nconst ListGroupItem = (props) => {\n  const {\n    className,\n    cssModule,\n    tag: Tag,\n    active,\n    disabled,\n    action,\n    color,\n    ...attributes\n  } = props;\n  const classes = mapToCssModules(classNames(\n    className,\n    active ? 'active' : false,\n    disabled ? 'disabled' : false,\n    action ? 'list-group-item-action' : false,\n    color ? `list-group-item-${color}` : false,\n    'list-group-item'\n  ), cssModule);\n\n  // Prevent click event when disabled.\n  if (disabled) {\n    attributes.onClick = handleDisabledOnClick;\n  }\n  return (\n    <Tag {...attributes} className={classes} />\n  );\n};\n\nListGroupItem.propTypes = propTypes;\nListGroupItem.defaultProps = defaultProps;\n\nexport default ListGroupItem;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { mapToCssModules } from './utils';\n\nconst propTypes = {\n  tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),\n  className: PropTypes.any,\n  cssModule: PropTypes.object,\n};\n\nconst defaultProps = {\n  tag: 'h5'\n};\n\nconst ListGroupItemHeading = (props) => {\n  const {\n    className,\n    cssModule,\n    tag: Tag,\n    ...attributes\n  } = props;\n  const classes = mapToCssModules(classNames(\n    className,\n    'list-group-item-heading'\n  ), cssModule);\n\n  return (\n    <Tag {...attributes} className={classes} />\n  );\n};\n\nListGroupItemHeading.propTypes = propTypes;\nListGroupItemHeading.defaultProps = defaultProps;\n\nexport default ListGroupItemHeading;\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport { mapToCssModules } from './utils';\n\nconst propTypes = {\n  tag: PropTypes.oneOfType([PropTypes.func, PropTypes.string]),\n  className: PropTypes.any,\n  cssModule: PropTypes.object,\n};\n\nconst defaultProps = {\n  tag: 'p'\n};\n\nconst ListGroupItemText = (props) => {\n  const {\n    className,\n    cssModule,\n    tag: Tag,\n    ...attributes\n  } = props;\n  const classes = mapToCssModules(classNames(\n    className,\n    'list-group-item-text'\n  ), cssModule);\n\n  return (\n    <Tag {...attributes} className={classes} />\n  );\n};\n\nListGroupItemText.propTypes = propTypes;\nListGroupItemText.defaultProps = defaultProps;\n\nexport default ListGroupItemText;\n","import React, { Component } from 'react';\nimport Alert from './Alert';\n\nexport default class UncontrolledAlert extends Component {\n  constructor(props) {\n    super(props);\n\n    this.state = { isOpen: true };\n    this.toggle = this.toggle.bind(this);\n  }\n\n  toggle() {\n    this.setState({ isOpen: !this.state.isOpen });\n  }\n\n  render() {\n    return <Alert isOpen={this.state.isOpen} toggle={this.toggle} {...this.props} />;\n  }\n}\n","import React, { Component } from 'react';\nimport ButtonDropdown from './ButtonDropdown';\n\nexport default class UncontrolledButtonDropdown extends Component {\n  constructor(props) {\n    super(props);\n\n    this.state = { isOpen: false };\n    this.toggle = this.toggle.bind(this);\n  }\n\n  toggle() {\n    this.setState({ isOpen: !this.state.isOpen });\n  }\n\n  render() {\n    return <ButtonDropdown isOpen={this.state.isOpen} toggle={this.toggle} {...this.props} />;\n  }\n}\n","import React, { Component } from 'react';\nimport Dropdown from './Dropdown';\n\nexport default class UncontrolledDropdown extends Component {\n  constructor(props) {\n    super(props);\n\n    this.state = { isOpen: false };\n    this.toggle = this.toggle.bind(this);\n  }\n\n  toggle() {\n    this.setState({ isOpen: !this.state.isOpen });\n  }\n\n  render() {\n    return <Dropdown isOpen={this.state.isOpen} toggle={this.toggle} {...this.props} />;\n  }\n}\n","import React, { Component } from 'react';\nimport Tooltip from './Tooltip';\n\nexport default class UncontrolledTooltip extends Component {\n  constructor(props) {\n    super(props);\n\n    this.state = { isOpen: false };\n    this.toggle = this.toggle.bind(this);\n  }\n\n  toggle() {\n    this.setState({ isOpen: !this.state.isOpen });\n  }\n\n  render() {\n    return <Tooltip isOpen={this.state.isOpen} toggle={this.toggle} {...this.props} />;\n  }\n}\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { mediaUrl } from '../utils/constants';\n\nconst propTypes = {\n  forDialog: PropTypes.bool\n};\n\nclass EmptyTip extends React.Component {\n\n  render() {\n    return (\n      <div className={this.props.forDialog ? 'text-center mt-8' : 'empty-tip'}>\n        <img src={`${mediaUrl}img/no-items-tip.png`} alt=\"\" width=\"100\" height=\"100\" className=\"no-items-img-tip\" />\n        {this.props.children}\n      </div>\n    );\n  }\n}\n\nEmptyTip.propTypes = propTypes;\n\nexport default EmptyTip;\n","var Symbol = require('./_Symbol'),\n    getRawTag = require('./_getRawTag'),\n    objectToString = require('./_objectToString');\n\n/** `Object#toString` result references. */\nvar nullTag = '[object Null]',\n    undefinedTag = '[object Undefined]';\n\n/** Built-in value references. */\nvar symToStringTag = Symbol ? Symbol.toStringTag : undefined;\n\n/**\n * The base implementation of `getTag` without fallbacks for buggy environments.\n *\n * @private\n * @param {*} value The value to query.\n * @returns {string} Returns the `toStringTag`.\n */\nfunction baseGetTag(value) {\n  if (value == null) {\n    return value === undefined ? undefinedTag : nullTag;\n  }\n  return (symToStringTag && symToStringTag in Object(value))\n    ? getRawTag(value)\n    : objectToString(value);\n}\n\nmodule.exports = baseGetTag;\n","/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n  return value != null && typeof value == 'object';\n}\n\nmodule.exports = isObjectLike;\n","\n/**\n * Expose `isUrl`.\n */\n\nmodule.exports = isUrl;\n\n/**\n * RegExps.\n * A URL must match #1 and then at least one of #2/#3.\n * Use two levels of REs to avoid REDOS.\n */\n\nvar protocolAndDomainRE = /^(?:\\w+:)?\\/\\/(\\S+)$/;\n\nvar localhostDomainRE = /^localhost[\\:?\\d]*(?:[^\\:?\\d]\\S*)?$/\nvar nonLocalhostDomainRE = /^[^\\s\\.]+\\.\\S{2,}$/;\n\n/**\n * Loosely validate a URL `string`.\n *\n * @param {String} string\n * @return {Boolean}\n */\n\nfunction isUrl(string){\n  if (typeof string !== 'string') {\n    return false;\n  }\n\n  var match = string.match(protocolAndDomainRE);\n  if (!match) {\n    return false;\n  }\n\n  var everythingAfterProtocol = match[1];\n  if (!everythingAfterProtocol) {\n    return false;\n  }\n\n  if (localhostDomainRE.test(everythingAfterProtocol) ||\n      nonLocalhostDomainRE.test(everythingAfterProtocol)) {\n    return true;\n  }\n\n  return false;\n}\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { Modal, ModalHeader, ModalBody } from 'reactstrap';\nimport moment from 'moment';\nimport { gettext, fileServerRoot } from '../../utils/constants';\nimport { seafileAPI } from '../../utils/seafile-api';\nimport { Utils } from '../../utils/utils';\nimport Loading from '../loading';\n\nimport '../../css/commit-details.css';\n\nconst propTypes = {\n  repoID: PropTypes.string.isRequired,\n  commitID: PropTypes.string.isRequired,\n  commitTime: PropTypes.string.isRequired,\n  toggleDialog: PropTypes.func.isRequired\n};\n\nclass CommitDetails extends React.Component {\n  constructor(props) {\n    super(props);\n    this.state = {\n      isLoading: true,\n      errorMsg: '',\n    };\n  }\n\n  componentDidMount() {\n    const {repoID, commitID} = this.props;\n    seafileAPI.getCommitDetails(repoID, commitID).then((res) => {\n      this.setState({\n        isLoading: false,\n        errorMsg: '',\n        commitDetails: res.data\n      });\n    }).catch((error) => {\n      let errorMsg = Utils.getErrorMsg(error);\n      this.setState({\n        isLoading: false,\n        errorMsg: errorMsg\n      });\n    });\n  }\n\n  render() {\n    const { toggleDialog, commitTime} = this.props;\n    return (\n      <Modal isOpen={true} centered={true} toggle={toggleDialog}>\n        <ModalHeader toggle={toggleDialog}>{gettext('Modification Details')}</ModalHeader>\n        <ModalBody>\n          <p className=\"small\">{moment(this.props.commitTime).format('YYYY-MM-DD HH:mm:ss')}</p>\n          <Content data={this.state} />\n        </ModalBody>\n      </Modal>\n    );\n  }\n}\n\nclass Content extends React.Component {\n\n  renderDetails = (data) => {\n    const detailsData = [\n      {type: 'new', title: gettext('New files')},\n      {type: 'removed', title: gettext('Deleted files')},\n      {type: 'renamed', title: gettext('Renamed or Moved files')},\n      {type: 'modified', title: gettext('Modified files')},\n      {type: 'newdir', title: gettext('New directories')},\n      {type: 'deldir', title: gettext('Deleted directories')}\n    ];\n\n    let showDesc = true;\n    for (let i = 0, len = detailsData.length; i < len; i++) {\n      if (data[detailsData[i].type].length) {\n        showDesc = false;\n        break;\n      }\n    }\n    if (showDesc) {\n      return <p>{data.cmt_desc}</p>;\n    }\n\n    return (\n      <React.Fragment>\n        {detailsData.map((item, index) => {\n          if (!data[item.type].length) {\n            return;\n          }\n          return (\n            <React.Fragment key={index}>\n              <h6>{item.title}</h6>\n              <ul>\n                {\n                  data[item.type].map((item, index) => {\n                    return <li key={index} dangerouslySetInnerHTML={{__html: item}} className=\"commit-detail-item\"></li>;\n                  })\n                }\n              </ul>\n            </React.Fragment>\n          );\n        })}\n      </React.Fragment>\n    );\n  }\n\n  render() {\n    const {isLoading, errorMsg, commitDetails} = this.props.data;\n\n    if (isLoading) {\n      return <Loading />;\n    }\n\n    if (errorMsg) {\n      return <p className=\"error mt-4 text-center\">{errorMsg}</p>;\n    }\n\n    return this.renderDetails(commitDetails);\n  }\n}\n\nCommitDetails.propTypes = propTypes;\n\nexport default CommitDetails;\n","import _classCallCheck from \"@babel/runtime/helpers/esm/classCallCheck\";\nimport _createClass from \"@babel/runtime/helpers/esm/createClass\";\nimport _inherits from \"@babel/runtime/helpers/esm/inherits\";\nimport _createSuper from \"@babel/runtime/helpers/esm/createSuper\";\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport { withTranslation } from 'react-i18next';\n\nvar HeaderList = /*#__PURE__*/function (_React$PureComponent) {\n  _inherits(HeaderList, _React$PureComponent);\n\n  var _super = _createSuper(HeaderList);\n\n  function HeaderList(props) {\n    var _this;\n\n    _classCallCheck(this, HeaderList);\n\n    _this = _super.call(this, props);\n\n    _this.handleClick = function (event) {\n      if (_this.props.disabled) return;\n\n      var container = _this.getContainer();\n\n      if (container.contains(event.target)) {\n        _this.toggle();\n      } else {\n        if (_this.state.dropdownOpen) {\n          _this.setState({\n            dropdownOpen: !_this.state.dropdownOpen\n          });\n        }\n      }\n    };\n\n    _this.toggle = function () {\n      _this.setState({\n        dropdownOpen: !_this.state.dropdownOpen\n      });\n    };\n\n    _this.state = {\n      dropdownOpen: false\n    };\n    return _this;\n  }\n\n  _createClass(HeaderList, [{\n    key: \"getContainer\",\n    value: function getContainer() {\n      return ReactDOM.findDOMNode(this);\n    }\n  }, {\n    key: \"componentDidMount\",\n    value: function componentDidMount() {\n      document.addEventListener('click', this.handleClick);\n    }\n  }, {\n    key: \"componentWillUnmount\",\n    value: function componentWillUnmount() {\n      document.removeEventListener('click', this.handleClick);\n    }\n  }, {\n    key: \"render\",\n    value: function render() {\n      var _this2 = this;\n\n      /*\n      *  here need to use click event in DropdownItem instead of onMouseDown, reactStrap listen click, keyUp, to trigger toggle function,\n      *  if we listen mouseDown event the tool bar will render,the position of the component will change\n      *  and then the click event of this component will not be triggered\n      * */\n      return /*#__PURE__*/React.createElement(\"div\", {\n        className: 'header-list'\n      }, /*#__PURE__*/React.createElement(\"div\", {\n        className: 'list-body ' + (this.props.disabled ? '' : 'header-list-body-hover') + (this.state.dropdownOpen ? ' header-list-body-highlight' : '')\n      }, /*#__PURE__*/React.createElement(\"div\", {\n        className: 'list-title'\n      }, this.props.t(this.props.headerType)), /*#__PURE__*/React.createElement(\"div\", {\n        className: 'list-caret'\n      }, /*#__PURE__*/React.createElement(\"i\", {\n        className: this.state.dropdownOpen ? 'iconfont icon-caret-up' : 'iconfont icon-drop-down'\n      }))), this.state.dropdownOpen && /*#__PURE__*/React.createElement(\"div\", {\n        className: 'list-dropdown'\n      }, /*#__PURE__*/React.createElement(\"div\", {\n        className: 'list-dropdown-item',\n        onClick: function onClick(event) {\n          _this2.props.onClickHeader(event, 'paragraph');\n        }\n      }, this.props.t('paragraph')), /*#__PURE__*/React.createElement(\"div\", {\n        className: 'list-dropdown-item',\n        onClick: function onClick(event) {\n          _this2.props.onClickHeader(event, 'header_one');\n        }\n      }, this.props.t('header_one')), /*#__PURE__*/React.createElement(\"div\", {\n        className: 'list-dropdown-item',\n        onClick: function onClick(event) {\n          _this2.props.onClickHeader(event, 'header_two');\n        }\n      }, this.props.t('header_two')), /*#__PURE__*/React.createElement(\"div\", {\n        className: 'list-dropdown-item',\n        onClick: function onClick(event) {\n          _this2.props.onClickHeader(event, 'header_three');\n        }\n      }, this.props.t('header_three')), /*#__PURE__*/React.createElement(\"div\", {\n        className: 'list-dropdown-item',\n        onClick: function onClick(event) {\n          _this2.props.onClickHeader(event, 'header_four');\n        }\n      }, this.props.t('header_four')), /*#__PURE__*/React.createElement(\"div\", {\n        className: 'list-dropdown-item',\n        onClick: function onClick(event) {\n          _this2.props.onClickHeader(event, 'header_five');\n        }\n      }, this.props.t('header_five')), /*#__PURE__*/React.createElement(\"div\", {\n        className: 'list-dropdown-item',\n        onClick: function onClick(event) {\n          _this2.props.onClickHeader(event, 'header_six');\n        }\n      }, this.props.t('header_six'))));\n    }\n  }]);\n\n  return HeaderList;\n}(React.PureComponent);\n\nexport default withTranslation('seafile-editor')(HeaderList);","import _classCallCheck from \"@babel/runtime/helpers/esm/classCallCheck\";\nimport _createClass from \"@babel/runtime/helpers/esm/createClass\";\nimport _inherits from \"@babel/runtime/helpers/esm/inherits\";\nimport _createSuper from \"@babel/runtime/helpers/esm/createSuper\";\nimport React from 'react';\n\nvar ButtonGroup = /*#__PURE__*/function (_React$PureComponent) {\n  _inherits(ButtonGroup, _React$PureComponent);\n\n  var _super = _createSuper(ButtonGroup);\n\n  function ButtonGroup() {\n    _classCallCheck(this, ButtonGroup);\n\n    return _super.apply(this, arguments);\n  }\n\n  _createClass(ButtonGroup, [{\n    key: \"render\",\n    value: function render() {\n      return /*#__PURE__*/React.createElement(\"div\", {\n        className: 'btn-group ' + this.props.className,\n        role: 'group'\n      }, this.props.children);\n    }\n  }]);\n\n  return ButtonGroup;\n}(React.PureComponent);\n\nexport default ButtonGroup;","import _classCallCheck from \"@babel/runtime/helpers/esm/classCallCheck\";\nimport _createClass from \"@babel/runtime/helpers/esm/createClass\";\nimport _assertThisInitialized from \"@babel/runtime/helpers/esm/assertThisInitialized\";\nimport _inherits from \"@babel/runtime/helpers/esm/inherits\";\nimport _createSuper from \"@babel/runtime/helpers/esm/createSuper\";\nimport React from 'react';\nimport { Tooltip } from 'reactstrap';\nimport { withTranslation } from 'react-i18next';\n\nvar IconButton = /*#__PURE__*/function (_React$Component) {\n  _inherits(IconButton, _React$Component);\n\n  var _super = _createSuper(IconButton);\n\n  function IconButton(props) {\n    var _this;\n\n    _classCallCheck(this, IconButton);\n\n    _this = _super.call(this, props);\n\n    _this.toggle = function () {\n      if (_this.props.disabled || _this.state.isFreezed && !_this.state.tooltipOpen) return;\n\n      _this.setState({\n        tooltipOpen: !_this.state.tooltipOpen,\n        isFreezed: true\n      });\n\n      var that = _assertThisInitialized(_this);\n\n      setTimeout(function () {\n        that.setState({\n          isFreezed: false\n        });\n      }, 100);\n    };\n\n    _this.getClassName = function () {\n      var className = _this.props.isRichEditor ? 'rich-icon-btn ' + (_this.props.disabled ? 'rich-icon-btn-disabled' : 'rich-icon-btn-hover') : 'btn btn-icon btn-secondary btn-active';\n      className = className + ' ' + (_this.props.className || '');\n      return className;\n    };\n\n    _this.state = {\n      tooltipOpen: false,\n      isFreezed: false\n    };\n    return _this;\n  }\n\n  _createClass(IconButton, [{\n    key: \"shouldComponentUpdate\",\n    value: function shouldComponentUpdate(nextProps, nextState) {\n      if (this.props.disabled !== nextProps.disabled) {\n        this.setState({\n          tooltipOpen: false\n        });\n        return true;\n      } // only render iconButton when the button is active or show show tooltip\n\n\n      if (nextState.tooltipOpen === this.state.tooltipOpen && nextProps.isActive === this.props.isActive) {\n        return false;\n      }\n\n      return true;\n    }\n  }, {\n    key: \"render\",\n    value: function render() {\n      var className = this.getClassName();\n      return /*#__PURE__*/React.createElement(\"button\", {\n        id: this.props.id,\n        type: 'button',\n        onClick: this.props.disabled ? null : this.props.onClick,\n        onMouseDown: this.props.disabled ? null : this.props.onMouseDown,\n        className: className,\n        \"data-active\": this.props.isActive || false,\n        disabled: this.props.disabled\n      }, /*#__PURE__*/React.createElement(\"i\", {\n        className: this.props.icon\n      }), /*#__PURE__*/React.createElement(Tooltip, {\n        toggle: this.toggle,\n        delay: {\n          show: 0,\n          hide: 0\n        },\n        target: this.props.id,\n        placement: \"bottom\",\n        isOpen: this.state.tooltipOpen\n      }, this.props.text));\n    }\n  }]);\n\n  return IconButton;\n}(React.Component);\n\nexport default withTranslation('seafile-editor')(IconButton);","import _classCallCheck from \"@babel/runtime/helpers/esm/classCallCheck\";\nimport _createClass from \"@babel/runtime/helpers/esm/createClass\";\nimport _inherits from \"@babel/runtime/helpers/esm/inherits\";\nimport _createSuper from \"@babel/runtime/helpers/esm/createSuper\";\nimport React, { Fragment } from 'react';\nimport { Button, Modal, ModalHeader, ModalBody, ModalFooter } from 'reactstrap';\nimport { withTranslation } from 'react-i18next';\nimport { EditorUtils } from '../editor/editor-utils/common-editor-utils';\n\nvar AddLinkDialog = /*#__PURE__*/function (_React$PureComponent) {\n  _inherits(AddLinkDialog, _React$PureComponent);\n\n  var _super = _createSuper(AddLinkDialog);\n\n  function AddLinkDialog(props) {\n    var _this;\n\n    _classCallCheck(this, AddLinkDialog);\n\n    _this = _super.call(this, props);\n\n    _this.setInitialValue = function () {\n      var text = _this.editorUtils.getSelectedText();\n\n      if (_this.isLinkActive) {\n        var linkNode = _this.editorUtils.getCurrentLinkNode();\n\n        _this.setState({\n          title: _this.editorUtils.getLinkText(linkNode),\n          url: linkNode.data.href\n        });\n      } else {\n        _this.setState({\n          title: text,\n          url: ''\n        });\n      }\n    };\n\n    _this.handleUrlChange = function (event) {\n      _this.setState({\n        url: event.target.value\n      });\n    };\n\n    _this.handleTitleChange = function (event) {\n      _this.setState({\n        title: event.target.value\n      });\n    };\n\n    _this.handleSubmit = function (event) {\n      event.preventDefault();\n      if (_this.state.title.length === 0 || _this.state.url.length === 0) return;\n\n      if (!_this.isLinkActive) {\n        _this.editorUtils.insertLink({\n          text: _this.state.title,\n          url: _this.state.url,\n          selection: _this.editorSelection\n        });\n      } else {\n        _this.editorUtils.setLink({\n          text: _this.state.title,\n          url: _this.state.url,\n          selection: _this.editorSelection\n        });\n      }\n\n      _this.props.toggleLinkDialog();\n    };\n\n    _this.editorUtils = new EditorUtils(window.editor);\n    _this.isLinkActive = _this.editorUtils.isLinkActive();\n    _this.editorSelection = null;\n    _this.state = {\n      url: '',\n      title: ''\n    };\n    return _this;\n  }\n\n  _createClass(AddLinkDialog, [{\n    key: \"componentDidMount\",\n    value: function componentDidMount() {\n      this.editorSelection = window.editor.selection;\n    }\n  }, {\n    key: \"componentWillMount\",\n    value: function componentWillMount() {\n      this.setInitialValue();\n    }\n  }, {\n    key: \"render\",\n    value: function render() {\n      return /*#__PURE__*/React.createElement(Modal, {\n        isOpen: true,\n        autoFocus: false,\n        toggle: this.props.toggleLinkDialog,\n        className: this.props.className\n      }, /*#__PURE__*/React.createElement(ModalHeader, {\n        toggle: this.props.toggleLinkDialog\n      }, this.props.t('insert_link')), /*#__PURE__*/React.createElement(ModalBody, null, /*#__PURE__*/React.createElement(Fragment, null, /*#__PURE__*/React.createElement(\"div\", {\n        className: \"form-group\"\n      }, /*#__PURE__*/React.createElement(\"label\", {\n        className: \"form-check-label\",\n        htmlFor: \"addLink\"\n      }, this.props.t('link_address')), /*#__PURE__*/React.createElement(\"input\", {\n        autoFocus: true,\n        type: \"url\",\n        className: \"form-control\",\n        id: \"addLink\",\n        value: this.state.url,\n        onChange: this.handleUrlChange\n      })), /*#__PURE__*/React.createElement(\"div\", {\n        className: \"form-group\"\n      }, /*#__PURE__*/React.createElement(\"label\", {\n        className: \"form-check-label\",\n        htmlFor: \"addTitle\"\n      }, this.props.t('link_title')), /*#__PURE__*/React.createElement(\"input\", {\n        type: \"text\",\n        className: \"form-control\",\n        id: \"addTitle\",\n        value: this.state.title,\n        onChange: this.handleTitleChange\n      })))), /*#__PURE__*/React.createElement(ModalFooter, null, /*#__PURE__*/React.createElement(Button, {\n        color: \"secondary\",\n        onClick: this.props.toggleLinkDialog\n      }, this.props.t('cancel')), /*#__PURE__*/React.createElement(Button, {\n        color: \"primary\",\n        disabled: false,\n        onClick: this.handleSubmit\n      }, this.props.t('add_link'))));\n    }\n  }]);\n\n  return AddLinkDialog;\n}(React.PureComponent);\n\nexport default withTranslation('seafile-editor')(AddLinkDialog);","import _classCallCheck from \"@babel/runtime/helpers/esm/classCallCheck\";\nimport _createClass from \"@babel/runtime/helpers/esm/createClass\";\nimport _inherits from \"@babel/runtime/helpers/esm/inherits\";\nimport _createSuper from \"@babel/runtime/helpers/esm/createSuper\";\nimport React from 'react';\nimport { Button, Modal, ModalHeader, ModalBody, ModalFooter, Form, FormGroup, Label, Input } from 'reactstrap';\nimport { withTranslation } from 'react-i18next';\n\nvar AddImageDialog = /*#__PURE__*/function (_React$PureComponent) {\n  _inherits(AddImageDialog, _React$PureComponent);\n\n  var _super = _createSuper(AddImageDialog);\n\n  function AddImageDialog(props) {\n    var _this;\n\n    _classCallCheck(this, AddImageDialog);\n\n    _this = _super.call(this, props);\n\n    _this.handleUrlChange = function (event) {\n      _this.setState({\n        url: event.target.value\n      });\n    };\n\n    _this.handleSubmit = function (event) {\n      _this.props.insertImage({\n        url: _this.state.url,\n        selection: _this.editorSelection\n      });\n\n      _this.props.onToggleImageDialog();\n    };\n\n    _this.state = {\n      url: ''\n    };\n    _this.editorSelection = null;\n    return _this;\n  }\n\n  _createClass(AddImageDialog, [{\n    key: \"componentDidMount\",\n    value: function componentDidMount() {\n      this.editorSelection = window.editor.selection;\n    }\n  }, {\n    key: \"render\",\n    value: function render() {\n      return /*#__PURE__*/React.createElement(Modal, {\n        isOpen: true,\n        toggle: this.props.onToggleImageDialog,\n        className: this.props.className\n      }, /*#__PURE__*/React.createElement(ModalHeader, {\n        toggle: this.props.onToggleImageDialog\n      }, this.props.t('insert_image')), /*#__PURE__*/React.createElement(ModalBody, null, /*#__PURE__*/React.createElement(Form, null, /*#__PURE__*/React.createElement(FormGroup, null, /*#__PURE__*/React.createElement(Label, {\n        for: \"columnName\"\n      }, this.props.t('image_address')), /*#__PURE__*/React.createElement(Input, {\n        id: \"columnName\",\n        value: this.state.value,\n        onChange: this.handleUrlChange,\n        autoFocus: true\n      })))), /*#__PURE__*/React.createElement(ModalFooter, null, /*#__PURE__*/React.createElement(Button, {\n        color: \"secondary\",\n        onClick: this.props.onToggleImageDialog\n      }, this.props.t('cancel')), /*#__PURE__*/React.createElement(Button, {\n        color: \"primary\",\n        disabled: this.state.url.length === 0,\n        onClick: this.handleSubmit\n      }, this.props.t('submit')), ' '));\n    }\n  }]);\n\n  return AddImageDialog;\n}(React.PureComponent);\n\nexport default withTranslation('seafile-editor')(AddImageDialog);","import _classCallCheck from \"@babel/runtime/helpers/esm/classCallCheck\";\nimport _createClass from \"@babel/runtime/helpers/esm/createClass\";\nimport _inherits from \"@babel/runtime/helpers/esm/inherits\";\nimport _createSuper from \"@babel/runtime/helpers/esm/createSuper\";\nimport React, { Fragment } from 'react';\nimport { Button, Modal, ModalHeader, ModalBody, ModalFooter, Input } from 'reactstrap';\nimport { withTranslation } from 'react-i18next';\nimport { Editor } from 'slate';\nimport { EditorUtils } from '../editor/editor-utils/common-editor-utils';\n\nvar AddFormulaDialog = /*#__PURE__*/function (_React$PureComponent) {\n  _inherits(AddFormulaDialog, _React$PureComponent);\n\n  var _super = _createSuper(AddFormulaDialog);\n\n  function AddFormulaDialog(props) {\n    var _this;\n\n    _classCallCheck(this, AddFormulaDialog);\n\n    _this = _super.call(this, props);\n\n    _this.setInitialValue = function () {\n      var nodes = Editor.match(window.editor, window.editor.selection, {\n        type: 'formula'\n      });\n\n      if (nodes) {\n        var data = nodes[0].data;\n\n        _this.setState({\n          formula: data.formula\n        });\n\n        _this.formulaNode = nodes;\n      }\n    };\n\n    _this.handleFormulaChange = function (event) {\n      _this.renderFormula(event.target.value);\n\n      _this.setState({\n        formula: event.target.value\n      });\n    };\n\n    _this.renderFormula = function (formula) {\n      _this.formulaPreviewer.innerHTML = '';\n      var dom = window.MathJax.tex2svg(formula);\n\n      _this.formulaPreviewer.appendChild(dom);\n    };\n\n    _this.handleSubmit = function (event) {\n      event.preventDefault();\n      var formula = _this.state.formula;\n\n      if (_this.formulaNode) {\n        _this.editorUtils.setFormula({\n          formula: formula,\n          at: _this.formulaNode[1]\n        });\n      } else {\n        _this.editorUtils.onAddFormula({\n          formula: formula,\n          at: _this.editorSelection\n        });\n      }\n\n      _this.props.toggleFormulaDialog();\n    };\n\n    _this.editorUtils = new EditorUtils(window.editor);\n    _this.state = {\n      formula: ''\n    };\n    _this.formulaNode = null;\n    _this.editorSelection = null;\n    return _this;\n  }\n\n  _createClass(AddFormulaDialog, [{\n    key: \"componentDidMount\",\n    value: function componentDidMount() {\n      this.editorSelection = window.editor.selection;\n\n      if (this.formulaNode) {\n        this.renderFormula(this.state.formula);\n      }\n    }\n  }, {\n    key: \"componentWillMount\",\n    value: function componentWillMount() {\n      this.setInitialValue();\n    }\n  }, {\n    key: \"render\",\n    value: function render() {\n      var _this2 = this;\n\n      return /*#__PURE__*/React.createElement(Modal, {\n        isOpen: true,\n        toggle: this.props.toggleFormulaDialog,\n        className: this.props.className\n      }, /*#__PURE__*/React.createElement(ModalHeader, {\n        toggle: this.props.toggleFormulaDialog\n      }, this.props.t('insert_formula')), /*#__PURE__*/React.createElement(ModalBody, null, /*#__PURE__*/React.createElement(Fragment, null, /*#__PURE__*/React.createElement(\"div\", {\n        className: \"form-group\"\n      }, /*#__PURE__*/React.createElement(\"label\", {\n        className: \"form-check-label\"\n      }, this.props.t('formula')), /*#__PURE__*/React.createElement(Input, {\n        type: \"textarea\",\n        className: \"form-control\",\n        value: this.state.formula,\n        onChange: this.handleFormulaChange\n      })), /*#__PURE__*/React.createElement(\"div\", {\n        ref: function ref(_ref) {\n          return _this2.formulaPreviewer = _ref;\n        },\n        className: \"formula-preview\"\n      }))), /*#__PURE__*/React.createElement(ModalFooter, null, /*#__PURE__*/React.createElement(Button, {\n        color: \"secondary\",\n        onClick: this.props.toggleFormulaDialog\n      }, this.props.t('cancel')), /*#__PURE__*/React.createElement(Button, {\n        color: \"primary\",\n        disabled: false,\n        onClick: this.handleSubmit\n      }, this.props.t('insert_formula'))));\n    }\n  }]);\n\n  return AddFormulaDialog;\n}(React.PureComponent);\n\nexport default withTranslation('seafile-editor')(AddFormulaDialog);","import _classCallCheck from \"@babel/runtime/helpers/esm/classCallCheck\";\nimport _createClass from \"@babel/runtime/helpers/esm/createClass\";\nimport _inherits from \"@babel/runtime/helpers/esm/inherits\";\nimport _createSuper from \"@babel/runtime/helpers/esm/createSuper\";\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport IconButton from './icon-button';\nimport ButtonGroup from './button-group';\nimport { withTranslation } from 'react-i18next';\n\nvar TableToolBar = /*#__PURE__*/function (_React$PureComponent) {\n  _inherits(TableToolBar, _React$PureComponent);\n\n  var _super = _createSuper(TableToolBar);\n\n  function TableToolBar() {\n    _classCallCheck(this, TableToolBar);\n\n    return _super.apply(this, arguments);\n  }\n\n  _createClass(TableToolBar, [{\n    key: \"render\",\n    value: function render() {\n      var _this = this;\n\n      return /*#__PURE__*/React.createElement(ButtonGroup, {\n        className: 'editor-btn-group'\n      }, /*#__PURE__*/React.createElement(DropList, {\n        icon: 'iconfont icon-left-alignment',\n        items: [{\n          handle: function handle(e) {\n            _this.props.onSetAlign(e, 'left');\n          },\n          icon: 'iconfont icon-left-alignment',\n          text: this.props.t('left')\n        }, {\n          handle: function handle(e) {\n            _this.props.onSetAlign(e, 'center');\n          },\n          icon: 'iconfont icon-center-horizontally',\n          text: this.props.t('center')\n        }, {\n          handle: function handle(e) {\n            _this.props.onSetAlign(e, 'right');\n          },\n          icon: 'icon icon-align-right',\n          text: this.props.t('right')\n        }]\n      }), /*#__PURE__*/React.createElement(DropList, {\n        icon: 'iconfont icon-column',\n        items: [{\n          handle: this.props.onInsertColumn,\n          text: this.props.t('Insert_Column')\n        }, {\n          handle: this.props.onRemoveColumn,\n          text: this.props.t('Remove_Column')\n        }]\n      }), /*#__PURE__*/React.createElement(DropList, {\n        icon: 'iconfont icon-row',\n        items: [{\n          handle: this.props.onInsertRow,\n          text: this.props.t('Insert_Row')\n        }, {\n          handle: this.props.onRemoveRow,\n          text: this.props.t('Remove_Row')\n        }]\n      }), /*#__PURE__*/React.createElement(IconButton, {\n        disabled: false,\n        isRichEditor: true,\n        text: this.props.t('remove_table'),\n        id: 'removeTable',\n        icon: 'iconfont icon-delete-table',\n        onMouseDown: this.props.onRemoveTable\n      }));\n    }\n  }]);\n\n  return TableToolBar;\n}(React.PureComponent);\n\nvar DropList = /*#__PURE__*/function (_React$PureComponent2) {\n  _inherits(DropList, _React$PureComponent2);\n\n  var _super2 = _createSuper(DropList);\n\n  function DropList(props) {\n    var _this2;\n\n    _classCallCheck(this, DropList);\n\n    _this2 = _super2.call(this, props);\n\n    _this2.handleClick = function (event) {\n      if (_this2.props.disabled) return;\n\n      var container = _this2.getContainer();\n\n      if (container.contains(event.target)) {\n        _this2.toggle();\n      } else {\n        if (_this2.state.dropdownOpen) {\n          _this2.setState({\n            dropdownOpen: !_this2.state.dropdownOpen\n          });\n        }\n      }\n    };\n\n    _this2.toggle = function () {\n      _this2.setState({\n        dropdownOpen: !_this2.state.dropdownOpen\n      });\n    };\n\n    _this2.state = {\n      dropdownOpen: false\n    };\n    return _this2;\n  }\n\n  _createClass(DropList, [{\n    key: \"getContainer\",\n    value: function getContainer() {\n      return ReactDOM.findDOMNode(this);\n    }\n  }, {\n    key: \"componentDidMount\",\n    value: function componentDidMount() {\n      document.addEventListener('click', this.handleClick);\n    }\n  }, {\n    key: \"componentWillUnmount\",\n    value: function componentWillUnmount() {\n      document.removeEventListener('click', this.handleClick);\n    }\n  }, {\n    key: \"render\",\n    value: function render() {\n      var items = [];\n      this.props.items.forEach(function (item, index) {\n        items.push( /*#__PURE__*/React.createElement(\"button\", {\n          key: 'dropdown-item' + index,\n          onMouseDown: item.handle,\n          className: 'dropdown-item'\n        }, item.icon ? /*#__PURE__*/React.createElement(\"i\", {\n          className: item.icon,\n          style: {\n            marginRight: '6px'\n          }\n        }) : null, item.text));\n      });\n      return /*#__PURE__*/React.createElement(\"div\", {\n        className: 'custom-dropdown-list'\n      }, /*#__PURE__*/React.createElement(\"div\", {\n        id: 'list_toggle',\n        className: 'dropdown-list-toggle'\n      }, /*#__PURE__*/React.createElement(\"i\", {\n        className: this.props.icon,\n        style: {\n          marginRight: '3px'\n        }\n      }), /*#__PURE__*/React.createElement(\"i\", {\n        className: this.state.dropdownOpen ? 'iconfont icon-caret-up' : 'iconfont icon-drop-down'\n      })), this.state.dropdownOpen && /*#__PURE__*/React.createElement(\"div\", {\n        role: 'menu',\n        className: 'custom-dropdown-menu dropdown-menu'\n      }, items));\n    }\n  }]);\n\n  return DropList;\n}(React.PureComponent);\n\nexport default withTranslation('seafile-editor')(TableToolBar);","import _classCallCheck from \"@babel/runtime/helpers/esm/classCallCheck\";\nimport _createClass from \"@babel/runtime/helpers/esm/createClass\";\nimport _inherits from \"@babel/runtime/helpers/esm/inherits\";\nimport _createSuper from \"@babel/runtime/helpers/esm/createSuper\";\nimport React from 'react';\nimport { Dropdown, DropdownToggle, DropdownMenu, DropdownItem, Tooltip, Label, Input } from 'reactstrap';\nimport { withTranslation } from 'react-i18next';\n\nvar UploadImg = /*#__PURE__*/function (_React$Component) {\n  _inherits(UploadImg, _React$Component);\n\n  var _super = _createSuper(UploadImg);\n\n  function UploadImg() {\n    var _this;\n\n    _classCallCheck(this, UploadImg);\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 = _super.call.apply(_super, [this].concat(args));\n    _this.state = {\n      dropdownOpen: false,\n      tooltipOpen: false\n    };\n\n    _this.imgtoggle = function () {\n      _this.setState({\n        dropdownOpen: !_this.state.dropdownOpen\n      });\n    };\n\n    _this.toggle = function () {\n      if (_this.props.disabled) {\n        _this.setState({\n          tooltipOpen: false\n        });\n\n        return;\n      }\n\n      _this.setState({\n        tooltipOpen: !_this.state.tooltipOpen\n      });\n    };\n\n    _this.uploadLocalImage = function (event) {\n      if (window.editor.editorApi.uploadLocalImage) {\n        window.editor.editorApi.uploadLocalImage(event.target.files[0]).then(function (res) {\n          _this.props.onInsertImage({\n            url: res\n          });\n        });\n      }\n    };\n\n    _this.handleFileChange = function (event) {\n      _this.uploadLocalImage(event);\n\n      _this.setState({\n        dropdownOpen: false\n      });\n    };\n\n    _this.onInputFile = function (event) {\n      event.target.value = null;\n      event.nativeEvent.stopImmediatePropagation();\n      event.stopPropagation();\n    };\n\n    return _this;\n  }\n\n  _createClass(UploadImg, [{\n    key: \"render\",\n    value: function render() {\n      var t = this.props.t;\n      return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Dropdown, {\n        isOpen: this.state.dropdownOpen,\n        toggle: this.imgtoggle,\n        className: this.props.disabled ? 'upload-localimg upload-localimg-disabled' : 'upload-localimg upload-localimg-hover'\n      }, /*#__PURE__*/React.createElement(DropdownToggle, {\n        id: this.props.id,\n        disabled: this.props.disabled\n      }, /*#__PURE__*/React.createElement(\"i\", {\n        className: \"iconfont icon-image\"\n      }), /*#__PURE__*/React.createElement(Tooltip, {\n        toggle: this.toggle,\n        delay: {\n          show: 0,\n          hide: 0\n        },\n        target: this.props.id,\n        placement: \"bottom\",\n        isOpen: this.state.tooltipOpen\n      }, t('insert_image'))), /*#__PURE__*/React.createElement(DropdownMenu, null, /*#__PURE__*/React.createElement(DropdownItem, {\n        onClick: this.props.onToggleImageDialog\n      }, t('insert_network_image')), !this.props.isSimpleEditor && /*#__PURE__*/React.createElement(DropdownItem, {\n        onMouseDown: this.props.insertRepoFile\n      }, t('Insert_library_image')), /*#__PURE__*/React.createElement(DropdownItem, {\n        className: \"image-uploader-btn\"\n      }, /*#__PURE__*/React.createElement(Label, {\n        className: \"image-uploader-label\",\n        for: \"image-uploader\",\n        onClick: this.onInputFile\n      }, t('upload_local_image')), /*#__PURE__*/React.createElement(Input, {\n        type: \"file\",\n        accept: \"image/*\",\n        onChange: this.handleFileChange,\n        onClick: this.onInputFile,\n        className: \"image-uploader\",\n        id: \"image-uploader\"\n      })))));\n    }\n  }]);\n\n  return UploadImg;\n}(React.Component);\n\nexport default withTranslation('seafile-editor')(UploadImg);","import _classCallCheck from \"@babel/runtime/helpers/esm/classCallCheck\";\nimport _createClass from \"@babel/runtime/helpers/esm/createClass\";\nimport _inherits from \"@babel/runtime/helpers/esm/inherits\";\nimport _createSuper from \"@babel/runtime/helpers/esm/createSuper\";\nimport React from 'react';\nimport HeaderList from '../components/topbar-component/header-list';\nimport ButtonGroup from '../components/topbar-component/button-group';\nimport IconButton from '../components/topbar-component/icon-button';\nimport { withTranslation } from 'react-i18next';\nimport AddLinkDialog from './add-link-dialog';\nimport AddImageDialog from './add-image-dialog';\nimport AddFormulaDialog from './add-formula-dialog';\nimport TableToolBar from './topbar-component/table-toolbar';\nimport { EditorUtils } from '../editor/editor-utils/common-editor-utils';\nimport UploadImg from './topbar-component/upload-img'; // import InsertFile from './topbarcomponent/insertFile';\n\nvar ToolBar = /*#__PURE__*/function (_React$Component) {\n  _inherits(ToolBar, _React$Component);\n\n  var _super = _createSuper(ToolBar);\n\n  function ToolBar(props) {\n    var _this;\n\n    _classCallCheck(this, ToolBar);\n\n    _this = _super.call(this, props);\n\n    _this.onToggleLink = function (event) {\n      event.preventDefault();\n\n      var isLinkActive = _this.editorUtils.isLinkActive();\n\n      if (!isLinkActive) {\n        _this.props.onToggleLinkDialog();\n\n        return;\n      } else {\n        _this.editorUtils.unwrapLink();\n      }\n    };\n\n    _this.editor = window.editor;\n    _this.editorUtils = new EditorUtils(_this.editor);\n    return _this;\n  }\n\n  _createClass(ToolBar, [{\n    key: \"render\",\n    value: function render() {\n      var _this2 = this;\n\n      var t = this.props.t;\n      var toolbarStatus = this.props.toolbarStatus;\n      var readOnly = this.props.readOnly;\n      var isTableActive = toolbarStatus.isTableActive,\n          isHeadActive = toolbarStatus.isHeadActive,\n          isCodeActive = toolbarStatus.isCodeActive,\n          isBoldActive = toolbarStatus.isBoldActive,\n          isItalicActive = toolbarStatus.isItalicActive,\n          isInlineCodeActive = toolbarStatus.isInlineCodeActive,\n          isLinkActive = toolbarStatus.isLinkActive,\n          isBlockquoteActive = toolbarStatus.isBlockquoteActive,\n          isOrderedListActive = toolbarStatus.isOrderedListActive,\n          isUnorderedListActive = toolbarStatus.isUnorderedListActive,\n          isCheckListActive = toolbarStatus.isCheckListActive,\n          isFormulaActive = toolbarStatus.isFormulaActive;\n      var isListActive = isOrderedListActive || isUnorderedListActive || isCheckListActive;\n      return /*#__PURE__*/React.createElement(\"div\", {\n        className: 'sf-editor-rich-menu ' + (this.props.isSimpleEditor ? '' : 'rich-menu')\n      }, /*#__PURE__*/React.createElement(\"div\", {\n        className: 'button-container'\n      }, !readOnly && /*#__PURE__*/React.createElement(\"div\", {\n        className: 'header-list-container'\n      }, /*#__PURE__*/React.createElement(HeaderList, {\n        disabled: isFormulaActive || isCodeActive || isTableActive,\n        headerType: toolbarStatus.headerType,\n        onClickHeader: this.editorUtils.onClickHeader\n      })), /*#__PURE__*/React.createElement(ButtonGroup, {\n        className: 'editor-btn-group'\n      }, /*#__PURE__*/React.createElement(IconButton, {\n        disabled: isFormulaActive || isCodeActive || isHeadActive,\n        isRichEditor: true,\n        text: t('bold'),\n        id: 'BOLDButton',\n        icon: 'iconfont icon-bold',\n        isActive: isBoldActive,\n        onMouseDown: function onMouseDown(event) {\n          return _this2.editorUtils.onClickMark(event, 'BOLD');\n        }\n      }), /*#__PURE__*/React.createElement(IconButton, {\n        disabled: isFormulaActive || isCodeActive || isHeadActive,\n        isRichEditor: true,\n        text: t('italic'),\n        id: 'ITALICButton',\n        icon: 'iconfont icon-italic',\n        isActive: isItalicActive,\n        onMouseDown: function onMouseDown(event) {\n          return _this2.editorUtils.onClickMark(event, 'ITALIC');\n        }\n      }), /*#__PURE__*/React.createElement(IconButton, {\n        disabled: isFormulaActive || isCodeActive || isHeadActive,\n        isRichEditor: true,\n        text: t('code'),\n        id: 'CODEButton',\n        icon: 'iconfont icon-code',\n        isActive: isInlineCodeActive,\n        onMouseDown: function onMouseDown(event) {\n          return _this2.editorUtils.onClickMark(event, 'CODE');\n        }\n      }), /*#__PURE__*/React.createElement(IconButton, {\n        disabled: isFormulaActive || isCodeActive || isHeadActive,\n        isRichEditor: true,\n        text: t('insert_link'),\n        id: 'linkButton',\n        icon: 'iconfont icon-link',\n        isActive: isLinkActive,\n        onMouseDown: this.onToggleLink\n      })), /*#__PURE__*/React.createElement(ButtonGroup, {\n        className: 'editor-btn-group'\n      }, /*#__PURE__*/React.createElement(IconButton, {\n        disabled: isFormulaActive || isTableActive || isCodeActive || isHeadActive,\n        isRichEditor: true,\n        text: t('quote'),\n        id: 'block-quoteButton',\n        icon: 'iconfont icon-quote-left',\n        isActive: isBlockquoteActive,\n        onMouseDown: function onMouseDown(event) {\n          return _this2.editorUtils.onClickBlock(event, 'blockquote');\n        }\n      }), /*#__PURE__*/React.createElement(IconButton, {\n        disabled: isFormulaActive || isTableActive || isCodeActive || isHeadActive,\n        isRichEditor: true,\n        text: t('ordered_list'),\n        id: 'ordered_listButton',\n        icon: 'iconfont icon-list-ol',\n        isActive: isOrderedListActive,\n        onMouseDown: function onMouseDown(event) {\n          return _this2.editorUtils.onClickBlock(event, 'ordered_list');\n        }\n      }), /*#__PURE__*/React.createElement(IconButton, {\n        disabled: isFormulaActive || isTableActive || isCodeActive || isHeadActive,\n        isRichEditor: true,\n        text: t('unordered_list'),\n        id: 'unordered_listButton',\n        icon: 'iconfont icon-list-ul',\n        isActive: isUnorderedListActive,\n        onMouseDown: function onMouseDown(event) {\n          return _this2.editorUtils.onClickBlock(event, 'unordered_list');\n        }\n      }), /*#__PURE__*/React.createElement(IconButton, {\n        disabled: isFormulaActive || isTableActive || isCodeActive || isHeadActive,\n        isRichEditor: true,\n        text: t('check_list_item'),\n        id: 'checkListItemButton',\n        icon: 'iconfont icon-check-square',\n        isActive: isCheckListActive,\n        onMouseDown: this.editorUtils.onToggleCheckItem\n      })), /*#__PURE__*/React.createElement(ButtonGroup, {\n        className: 'editor-btn-group'\n      }, /*#__PURE__*/React.createElement(IconButton, {\n        disabled: isFormulaActive || isTableActive || isHeadActive,\n        isRichEditor: true,\n        text: t('code_block'),\n        id: 'codeButton',\n        icon: 'iconfont icon-code-block',\n        onMouseDown: function onMouseDown(event) {\n          return _this2.editorUtils.onClickBlock(event, 'code_block');\n        },\n        isActive: isCodeActive && !readOnly\n      }), /*#__PURE__*/React.createElement(IconButton, {\n        disabled: isFormulaActive || isCodeActive || isTableActive || isHeadActive,\n        isRichEditor: true,\n        text: t('insert_table'),\n        id: 'tableButton',\n        icon: 'iconfont icon-table',\n        onMouseDown: this.editorUtils.onAddTable\n      }), window.canInsertFormula && /*#__PURE__*/React.createElement(IconButton, {\n        disabled: isFormulaActive || isCodeActive || isTableActive || isHeadActive || isListActive,\n        isRichEditor: true,\n        text: t('insert_formula'),\n        id: 'formulaButton',\n        icon: 'iconfont icon-formula',\n        onMouseDown: this.props.onToggleFormulaDialog\n      }), /*#__PURE__*/React.createElement(UploadImg, {\n        disabled: isFormulaActive || isCodeActive || isHeadActive,\n        text: 'insert_image',\n        id: 'insertImageButton',\n        insertRepoFile: this.props.insertRepoFile,\n        isSimpleEditor: this.props.isSimpleEditor,\n        onInsertImage: this.editorUtils.insertImage,\n        toolbarStatus: this.props.toolbarStatus,\n        onToggleImageDialog: this.props.onToggleImageDialog\n      })), isTableActive && !readOnly && /*#__PURE__*/React.createElement(TableToolBar, {\n        onRemoveTable: this.editorUtils.onRemoveTable,\n        onInsertColumn: this.editorUtils.onInsertColumn,\n        onRemoveColumn: this.editorUtils.onRemoveColumn,\n        onInsertRow: this.editorUtils.onInsertRow,\n        onRemoveRow: this.editorUtils.onRemoveRow,\n        onSetAlign: this.editorUtils.onSetAlign\n      })), this.props.hasSidePanel && /*#__PURE__*/React.createElement(\"div\", {\n        className: \"button-container\"\n      }, !this.props.isShowSidePanel && /*#__PURE__*/React.createElement(ButtonGroup, {\n        className: \"editor-btn-group position-absolute dropdown-menu-right\"\n      }, /*#__PURE__*/React.createElement(IconButton, {\n        isRichEditor: true,\n        text: t('Show_side_panel'),\n        id: \"showSidepanel\",\n        icon: \"iconfont icon-angle-double-left\",\n        isActive: false,\n        onMouseDown: this.props.toggleSidePanel\n      })), this.props.isShowSidePanel && /*#__PURE__*/React.createElement(ButtonGroup, {\n        className: \"editor-btn-group position-absolute dropdown-menu-right\"\n      }, /*#__PURE__*/React.createElement(IconButton, {\n        isRichEditor: true,\n        text: t('Hide_side_panel'),\n        id: \"hideSidepanel\",\n        icon: \"iconfont icon-angle-double-right\",\n        isActive: false,\n        onMouseDown: this.props.toggleSidePanel\n      }))), this.props.isShowLinkDialog && /*#__PURE__*/React.createElement(AddLinkDialog, {\n        toggleLinkDialog: this.props.onToggleLinkDialog\n      }), this.props.isShowFormulaDialog && /*#__PURE__*/React.createElement(AddFormulaDialog, {\n        toggleFormulaDialog: this.props.onToggleFormulaDialog\n      }), this.props.isShowImageDialog && /*#__PURE__*/React.createElement(AddImageDialog, {\n        onToggleImageDialog: this.props.onToggleImageDialog,\n        insertImage: this.editorUtils.insertImage\n      }));\n    }\n  }]);\n\n  return ToolBar;\n}(React.Component);\n\nexport default withTranslation('seafile-editor')(ToolBar);","import isPlainObject from 'is-plain-object'\nimport { Operation } from 'slate'\n\n/**\n * `History` objects hold all of the operations that are applied to a value, so\n * they can be undone or redone as necessary.\n */\n\nexport interface History {\n  redos: Operation[][]\n  undos: Operation[][]\n}\n\nexport const History = {\n  /**\n   * Check if a value is a `History` object.\n   */\n\n  isHistory(value: any): value is History {\n    return (\n      isPlainObject(value) &&\n      Array.isArray(value.redos) &&\n      Array.isArray(value.undos) &&\n      (value.redos.length === 0 || Operation.isOperationList(value.redos[0])) &&\n      (value.undos.length === 0 || Operation.isOperationList(value.undos[0]))\n    )\n  },\n}\n","import { Command } from 'slate'\n\nexport interface RedoCommand {\n  type: 'redo'\n}\n\nexport interface UndoCommand {\n  type: 'undo'\n}\n\nexport type HistoryCommand = RedoCommand | UndoCommand\n\nexport const HistoryCommand = {\n  /**\n   * Check if a value is a `HistoryCommand` object.\n   */\n\n  isHistoryCommand(value: any): value is HistoryCommand {\n    if (Command.isCommand(value)) {\n      switch (value.type) {\n        case 'redo':\n        case 'undo':\n          return true\n      }\n    }\n\n    return false\n  },\n}\n","import { Editor } from 'slate'\nimport { History } from './history'\n\n/**\n * Weakmaps for attaching state to the editor.\n */\n\nexport const HISTORY = new WeakMap<Editor, History>()\nexport const SAVING = new WeakMap<Editor, boolean | undefined>()\nexport const MERGING = new WeakMap<Editor, boolean | undefined>()\n\n/**\n * `HistoryEditor` contains helpers for history-enabled editors.\n */\n\nexport interface HistoryEditor extends Editor {\n  history: History\n}\n\nexport const HistoryEditor = {\n  /**\n   * Check if a value is a `HistoryEditor` object.\n   */\n\n  isHistoryEditor(value: any): value is HistoryEditor {\n    return Editor.isEditor(value) && History.isHistory(value.history)\n  },\n\n  /**\n   * Get the merge flag's current value.\n   */\n\n  isMerging(editor: Editor): boolean | undefined {\n    return MERGING.get(editor)\n  },\n\n  /**\n   * Get the saving flag's current value.\n   */\n\n  isSaving(editor: Editor): boolean | undefined {\n    return SAVING.get(editor)\n  },\n\n  /**\n   * Apply a series of changes inside a synchronous `fn`, without merging any of\n   * the new operations into previous save point in the history.\n   */\n\n  withoutMerging(editor: Editor, fn: () => void): void {\n    const prev = HistoryEditor.isMerging(editor)\n    MERGING.set(editor, false)\n    fn()\n    MERGING.set(editor, prev)\n  },\n\n  /**\n   * Apply a series of changes inside a synchronous `fn`, without saving any of\n   * their operations into the history.\n   */\n\n  withoutSaving(editor: Editor, fn: () => void): void {\n    const prev = HistoryEditor.isSaving(editor)\n    SAVING.set(editor, false)\n    fn()\n    SAVING.set(editor, prev)\n  },\n}\n","import { Editor, Command, Operation, Path } from 'slate'\n\nimport { HistoryCommand } from './history-command'\nimport { HistoryEditor } from './history-editor'\n\n/**\n * The `withHistory` plugin keeps track of the operation history of a Slate\n * editor as operations are applied to it, using undo and redo stacks.\n */\n\nexport const withHistory = (editor: Editor): HistoryEditor => {\n  const { apply, exec } = editor\n  editor.history = { undos: [], redos: [] }\n\n  editor.exec = (command: Command) => {\n    if (\n      HistoryEditor.isHistoryEditor(editor) &&\n      HistoryCommand.isHistoryCommand(command)\n    ) {\n      const { history } = editor\n      const { undos, redos } = history\n\n      if (command.type === 'redo' && redos.length > 0) {\n        const batch = redos[redos.length - 1]\n\n        HistoryEditor.withoutSaving(editor, () => {\n          Editor.withoutNormalizing(editor, () => {\n            for (const op of batch) {\n              editor.apply(op)\n            }\n          })\n        })\n\n        history.redos.pop()\n        history.undos.push(batch)\n        return\n      }\n\n      if (command.type === 'undo' && undos.length > 0) {\n        const batch = undos[undos.length - 1]\n\n        HistoryEditor.withoutSaving(editor, () => {\n          Editor.withoutNormalizing(editor, () => {\n            const inverseOps = batch.map(Operation.inverse).reverse()\n\n            for (const op of inverseOps) {\n              // If the final operation is deselecting the editor, skip it. This is\n              if (\n                op === inverseOps[inverseOps.length - 1] &&\n                op.type === 'set_selection' &&\n                op.newProperties == null\n              ) {\n                continue\n              } else {\n                editor.apply(op)\n              }\n            }\n          })\n        })\n\n        history.redos.push(batch)\n        history.undos.pop()\n        return\n      }\n    }\n\n    exec(command)\n  }\n\n  editor.apply = (op: Operation) => {\n    if (HistoryEditor.isHistoryEditor(editor)) {\n      const { operations, history } = editor\n      const { undos } = history\n      const lastBatch = undos[undos.length - 1]\n      const lastOp = lastBatch && lastBatch[lastBatch.length - 1]\n      const overwrite = shouldOverwrite(op, lastOp)\n      let save = HistoryEditor.isSaving(editor)\n      let merge = HistoryEditor.isMerging(editor)\n\n      if (save == null) {\n        save = shouldSave(op, lastOp)\n      }\n\n      if (save) {\n        if (merge == null) {\n          if (lastBatch == null) {\n            merge = false\n          } else if (operations.length !== 0) {\n            merge = true\n          } else {\n            merge = shouldMerge(op, lastOp) || overwrite\n          }\n        }\n\n        if (lastBatch && merge) {\n          if (overwrite) {\n            lastBatch.pop()\n          }\n\n          lastBatch.push(op)\n        } else {\n          const batch = [op]\n          undos.push(batch)\n        }\n\n        while (undos.length > 100) {\n          undos.shift()\n        }\n\n        if (shouldClear(op)) {\n          history.redos = []\n        }\n      }\n    }\n\n    apply(op)\n  }\n\n  return editor as HistoryEditor\n}\n\n/**\n * Check whether to merge an operation into the previous operation.\n */\n\nconst shouldMerge = (op: Operation, prev: Operation | undefined): boolean => {\n  if (op.type === 'set_selection') {\n    return true\n  }\n\n  if (\n    prev &&\n    op.type === 'insert_text' &&\n    prev.type === 'insert_text' &&\n    op.offset === prev.offset + prev.text.length &&\n    Path.equals(op.path, prev.path)\n  ) {\n    return true\n  }\n\n  if (\n    prev &&\n    op.type === 'remove_text' &&\n    prev.type === 'remove_text' &&\n    op.offset + op.text.length === prev.offset &&\n    Path.equals(op.path, prev.path)\n  ) {\n    return true\n  }\n\n  return false\n}\n\n/**\n * Check whether an operation needs to be saved to the history.\n */\n\nconst shouldSave = (op: Operation, prev: Operation | undefined): boolean => {\n  if (op.type === 'set_selection' && op.newProperties == null) {\n    return false\n  }\n\n  return true\n}\n\n/**\n * Check whether an operation should overwrite the previous one.\n */\n\nconst shouldOverwrite = (\n  op: Operation,\n  prev: Operation | undefined\n): boolean => {\n  if (prev && op.type === 'set_selection' && prev.type === 'set_selection') {\n    return true\n  }\n\n  return false\n}\n\n/**\n * Check whether an operation should clear the redos stack.\n */\n\nconst shouldClear = (op: Operation): boolean => {\n  if (op.type === 'set_selection') {\n    return false\n  }\n\n  return true\n}\n","import { Range } from 'slate';\n\nvar isRangeCollapsed = function isRangeCollapsed(range) {\n  if (range) {\n    return Range.isCollapsed(range);\n  }\n};\n\nexport { isRangeCollapsed };","import _classCallCheck from \"@babel/runtime/helpers/esm/classCallCheck\";\nimport _createClass from \"@babel/runtime/helpers/esm/createClass\";\nimport _inherits from \"@babel/runtime/helpers/esm/inherits\";\nimport _createSuper from \"@babel/runtime/helpers/esm/createSuper\";\nimport React from 'react';\nimport { Button } from 'reactstrap';\nimport { withTranslation } from 'react-i18next';\n\nvar TextLinkHoverMenu = /*#__PURE__*/function (_React$Component) {\n  _inherits(TextLinkHoverMenu, _React$Component);\n\n  var _super = _createSuper(TextLinkHoverMenu);\n\n  function TextLinkHoverMenu(props) {\n    var _this;\n\n    _classCallCheck(this, TextLinkHoverMenu);\n\n    _this = _super.call(this, props);\n\n    _this.saveRef = function (ref) {\n      _this.refDom = ref;\n    };\n\n    _this.getLinkUrl = function () {\n      var linkNode = _this.props.editorUtils.getCurrentLinkNode();\n\n      if (linkNode) {\n        _this.linkUrl = linkNode.data.href;\n      }\n    };\n\n    _this.setMenuPosition = function () {\n      if (window.getSelection().anchorOffset !== 0 && window.getSelection().focusOffset !== 0) {\n        var native = window.getSelection();\n        var range = native.getRangeAt(0);\n        var rect = range.getBoundingClientRect();\n\n        if (navigator.userAgent.indexOf('Chrome') < 0 && navigator.userAgent.indexOf('Safari') > 0) {\n          if (range.collapsed && rect.top === 0 && rect.height === 0) {\n            if (range.startOffset === 0) {\n              range.setEnd(range.endContainer, 1);\n            } else {\n              range.setStart(range.startContainer, range.startOffset - 1);\n            }\n\n            rect = range.getBoundingClientRect();\n\n            if (rect.top === 0 && rect.height === 0) {\n              if (range.getClientRects().length) {\n                rect = range.getClientRects()[0];\n              }\n            }\n          }\n        }\n\n        var style = _this.refDom.style;\n        style.zIndex = '1050';\n        style.top = \"\".concat(rect.top - 45, \"px\");\n        var left = parseInt(rect.x - 125);\n\n        if (left < 0) {\n          style.left = '0px';\n        } else if (left + 250 > document.body.clientWidth) {\n          style.left = \"\".concat(document.body.clientWidth - 250, \"px\");\n        } else {\n          style.left = \"\".concat(rect.x - 125, \"px\");\n        }\n      }\n    };\n\n    _this.componentDidMount = function () {\n      requestAnimationFrame(function () {\n        _this.setMenuPosition();\n      });\n    };\n\n    _this.componentWillUnmount = function () {\n      _this.refDom = null;\n    };\n\n    _this.componentWillMount = function () {\n      _this.getLinkUrl();\n    };\n\n    _this.linkUrl = '';\n    return _this;\n  }\n\n  _createClass(TextLinkHoverMenu, [{\n    key: \"componentDidUpdate\",\n    value: function componentDidUpdate() {\n      this.setMenuPosition();\n    }\n  }, {\n    key: \"componentWillReceiveProps\",\n    value: function componentWillReceiveProps() {\n      this.getLinkUrl();\n    }\n  }, {\n    key: \"render\",\n    value: function render() {\n      var _this2 = this;\n\n      return /*#__PURE__*/React.createElement(\"div\", {\n        className: \"seafile-ed-hovermenu\",\n        ref: function ref(_ref) {\n          return _this2.refDom = _ref;\n        }\n      }, /*#__PURE__*/React.createElement(\"a\", {\n        href: this.linkUrl,\n        target: \"blank\",\n        className: \"seafile-ed-hovermenu-link\"\n      }, this.linkUrl), /*#__PURE__*/React.createElement(Button, {\n        color: \"\",\n        className: \"seafile-ed-hovermenu-btn\",\n        onClick: this.props.editorUtils.unwrapLink\n      }, /*#__PURE__*/React.createElement(\"i\", {\n        className: \"iconfont icon-delete\"\n      })), /*#__PURE__*/React.createElement(Button, {\n        color: \"\",\n        onClick: this.props.onToggleLinkDialog,\n        className: \"seafile-ed-hovermenu-btn\"\n      }, /*#__PURE__*/React.createElement(\"i\", {\n        className: \"iconfont icon-edit\"\n      })), /*#__PURE__*/React.createElement(\"span\", {\n        className: \"seafile-ed-hovermenu-triangle\"\n      }));\n    }\n  }]);\n\n  return TextLinkHoverMenu;\n}(React.Component);\n\nexport default withTranslation('seafile-editor')(TextLinkHoverMenu);","import _classCallCheck from \"@babel/runtime/helpers/esm/classCallCheck\";\nimport _createClass from \"@babel/runtime/helpers/esm/createClass\";\nimport _inherits from \"@babel/runtime/helpers/esm/inherits\";\nimport _createSuper from \"@babel/runtime/helpers/esm/createSuper\";\nimport React from 'react';\nimport { withTranslation } from 'react-i18next';\n\nvar ContextMenu = /*#__PURE__*/function (_React$Component) {\n  _inherits(ContextMenu, _React$Component);\n\n  var _super = _createSuper(ContextMenu);\n\n  function ContextMenu(props) {\n    var _this;\n\n    _classCallCheck(this, ContextMenu);\n\n    _this = _super.call(this, props);\n\n    _this.setMenuPosition = function () {\n      var menuHeight = _this.menu.offsetHeight; // get height of context menu when the menu is drawing completed in this page\n\n      if (menuHeight === 0) {\n        requestAnimationFrame(_this.setMenuPosition);\n      }\n\n      var top = 0;\n\n      if (_this.position.top + menuHeight > document.body.clientHeight) {\n        top = document.body.clientHeight - menuHeight - 5;\n      } else {\n        top = _this.position.top;\n      }\n\n      var left = _this.position.left + 3;\n\n      _this.setState({\n        contextStyle: {\n          top: top,\n          left: left,\n          zIndex: '1051',\n          display: 'block'\n        }\n      });\n    };\n\n    _this.tableUtils = props.tableUtils;\n    _this.state = {\n      contextStyle: {}\n    };\n    return _this;\n  }\n\n  _createClass(ContextMenu, [{\n    key: \"componentDidMount\",\n    value: function componentDidMount() {\n      this.position = this.props.contextMenuPosition;\n      this.setMenuPosition();\n    }\n  }, {\n    key: \"componentWillUnmount\",\n    value: function componentWillUnmount() {\n      this.menu = null;\n    }\n  }, {\n    key: \"render\",\n    value: function render() {\n      var _this2 = this;\n\n      return /*#__PURE__*/React.createElement(\"div\", {\n        role: 'menu',\n        style: this.state.contextStyle,\n        ref: function ref(_ref) {\n          return _this2.menu = _ref;\n        },\n        className: 'seafile-contextmenu dropdown-menu'\n      }, /*#__PURE__*/React.createElement(\"button\", {\n        onMouseDown: function onMouseDown(event) {\n          return _this2.tableUtils.insertRow('before');\n        },\n        className: 'seafile-contextmenu-item dropdown-item'\n      }, this.props.t('Insert_Row_Before')), /*#__PURE__*/React.createElement(\"button\", {\n        onMouseDown: function onMouseDown(event) {\n          return _this2.tableUtils.insertRow('after');\n        },\n        className: 'seafile-contextmenu-item dropdown-item'\n      }, this.props.t('Insert_Row_After')), /*#__PURE__*/React.createElement(\"button\", {\n        onMouseDown: function onMouseDown(event) {\n          return _this2.tableUtils.insertColumn('before');\n        },\n        className: 'seafile-contextmenu-item dropdown-item'\n      }, this.props.t('Insert_Column_Before')), /*#__PURE__*/React.createElement(\"button\", {\n        onMouseDown: function onMouseDown(event) {\n          return _this2.tableUtils.insertColumn('after');\n        },\n        className: 'seafile-contextmenu-item dropdown-item'\n      }, this.props.t('Insert_Column_After')), /*#__PURE__*/React.createElement(\"div\", {\n        className: 'seafile-divider dropdown-divider'\n      }), /*#__PURE__*/React.createElement(\"button\", {\n        onMouseDown: this.tableUtils.removeRow,\n        className: 'seafile-contextmenu-item dropdown-item'\n      }, this.props.t('Remove_Row')), /*#__PURE__*/React.createElement(\"button\", {\n        onMouseDown: this.tableUtils.removeColumn,\n        className: 'seafile-contextmenu-item dropdown-item'\n      }, this.props.t('Remove_Column')));\n    }\n  }]);\n\n  return ContextMenu;\n}(React.Component);\n\nexport default withTranslation('seafile-editor')(ContextMenu);","import _classCallCheck from \"@babel/runtime/helpers/esm/classCallCheck\";\n\nvar Link = function Link(options) {\n  _classCallCheck(this, Link);\n\n  this.type = options.type || 'link';\n  this.children = options.children || [{\n    text: ''\n  }];\n  this.data = options.data || {\n    href: ''\n  };\n};\n\nvar generateLinkElement = function generateLinkElement(options) {\n  return Object.assign({}, new Link(options));\n};\n\nexport default generateLinkElement;","import _classCallCheck from \"@babel/runtime/helpers/esm/classCallCheck\";\n\nvar Image = function Image(options) {\n  _classCallCheck(this, Image);\n\n  this.type = options.type || 'image';\n  this.data = options.data || {\n    src: ''\n  };\n  this.children = options.children || [{\n    text: ''\n  }];\n};\n\nvar generateImage = function generateImage(options) {\n  return Object.assign({}, new Image(options));\n};\n\nexport default generateImage;","import _toConsumableArray from \"@babel/runtime/helpers/esm/toConsumableArray\";\nimport _createForOfIteratorHelper from \"@babel/runtime/helpers/esm/createForOfIteratorHelper\";\nimport _slicedToArray from \"@babel/runtime/helpers/esm/slicedToArray\";\nimport { Editor } from 'slate';\nimport ListUtils from '../editor-utils/block-element-utils/list-utils';\nimport CodeUtils from '../editor-utils/block-element-utils/code-utils';\nimport { isRangeCollapsed } from '../editor-utils/range-utils';\nimport TableUtils from '../editor-utils/block-element-utils/table-utils';\nimport getEventTransfer from '../custom/get-event-transfer';\nimport BlockquoteUtils from '../editor-utils/block-element-utils/blockquote-utils';\nimport FormulaUtils from '../editor-utils/block-element-utils/formula-utils';\nimport { htmlDeserializer } from '../../utils/deserialize-html';\nimport generateLinkElement from '../element-model/link';\nimport generateImageElement from '../element-model/image';\nimport isUrl from 'is-url';\nimport { SfEditor } from '../custom/custom';\n\nvar withBlock = function withBlock(editor) {\n  var exec = editor.exec;\n  var listUtils = new ListUtils(editor);\n  var codeUtils = new CodeUtils(editor);\n  var tableUtils = new TableUtils(editor);\n  var blockquoteUtils = new BlockquoteUtils(editor);\n  var formulaUtils = new FormulaUtils(editor);\n\n  editor.exec = function (command) {\n    var data = command.data;\n    var selection = editor.selection;\n\n    switch (command.type) {\n      case 'set_header':\n        Editor.setNodes(editor, {\n          type: command.headerType\n        });\n        break;\n\n      case 'insert_data':\n        var _getEventTransfer = getEventTransfer(data),\n            fragment = _getEventTransfer.fragment,\n            type = _getEventTransfer.type,\n            html = _getEventTransfer.html,\n            text = _getEventTransfer.text;\n\n        if (type === 'file') {\n          exec(command);\n          return;\n        } // insert a link if text content is a url\n\n\n        if (isUrl(text) && !codeUtils.isInCodeBlock()) {\n          if (text.endsWith('png') || text.endsWith('PNG') || text.endsWith('jpg') || text.endsWith('JPG') || text.endsWith('gif') || text.endsWith('GIF')) {\n            var img = generateImageElement({\n              data: {\n                src: text\n              }\n            });\n            Editor.insertNodes(editor, img);\n            return;\n          }\n\n          if (window.editor.editorApi.isInternalFileLink(text)) {\n            var index = text.lastIndexOf('/');\n\n            if (index > 0) {\n              var name = text.substring(index + 1);\n              var fileName = decodeURIComponent(name);\n              SfEditor.insertNodes(editor, [generateLinkElement({\n                data: {\n                  href: text\n                },\n                children: [{\n                  text: fileName\n                }]\n              }), {\n                text: ' '\n              }]);\n              return;\n            }\n          }\n\n          if (window.editor.editorApi.isInternalDirLink(text)) {\n            var _index = text.lastIndexOf('/');\n\n            if (_index > 0) {\n              var name = text.substring(_index + 1);\n              var dirName = decodeURIComponent(name);\n              SfEditor.insertNodes(editor, [generateLinkElement({\n                data: {\n                  href: text\n                },\n                children: [{\n                  text: dirName\n                }]\n              }), {\n                text: ' '\n              }]);\n              return;\n            }\n          }\n\n          SfEditor.insertNodes(editor, [generateLinkElement({\n            data: {\n              href: text\n            },\n            children: [{\n              text: text\n            }]\n          }), {\n            text: ' '\n          }]);\n          return;\n        }\n\n        try {\n          if (tableUtils.isInTable()) {\n            tableUtils.pasteContentInTable(command);\n            return;\n          }\n\n          if (listUtils.isInlist()) {\n            listUtils.pasteContentInList(command);\n            return;\n          }\n\n          if (codeUtils.isInCodeBlock()) {\n            codeUtils.pasteContentInCodeBlock(command);\n            return;\n          }\n\n          if (blockquoteUtils.isInBlockquote()) {\n            blockquoteUtils.pasteContentInBlockquote(command);\n            return;\n          }\n        } catch (error) {\n          Editor.insertText(editor, text);\n        }\n\n        if (type === 'fragment') {\n          var _Editor$match = Editor.match(editor, editor.selection, 'block'),\n              _Editor$match2 = _slicedToArray(_Editor$match, 2),\n              currentBlock = _Editor$match2[0],\n              path = _Editor$match2[1];\n\n          var firstFragmentNode = fragment[0]; // if first fragment node is paragraph insert the content of it into previous sibling\n          // and insert other node\n\n          if (firstFragmentNode.type === 'paragraph') {\n            Editor.insertFragment(editor, fragment);\n            return;\n          } // if current node is an empty paragraph, insert the fragment and\n          // delete the empty paragraph\n\n\n          if (SfEditor.isEmptyParagraph(currentBlock)) {\n            Editor.insertNodes(editor, fragment);\n            Editor.delete(editor, {\n              at: path\n            });\n            return;\n          } // insert the fragment below the current selection node\n\n\n          Editor.insertNodes(editor, fragment);\n          return;\n        }\n\n        if (type === 'html') {\n          try {\n            var _fragment = htmlDeserializer(html);\n\n            Editor.insertFragment(editor, _fragment);\n          } catch (error) {\n            var newText = text.replace(/\\n|\\r\\n/g, ' ');\n            Editor.insertText(editor, newText);\n          }\n\n          return;\n        } // remove text line break and insert text\n\n\n        if (type === 'text') {\n          var textArray = text.split(/\\r\\n|\\n/g);\n          textArray.forEach(function (text, index) {\n            if (index === 0) {\n              Editor.insertText(editor, text);\n            } else {\n              Editor.insertNodes(editor, {\n                type: 'paragraph',\n                children: [{\n                  text: text\n                }]\n              });\n            }\n          });\n          return;\n        }\n\n        exec(command);\n        break;\n\n      case 'set_blockquote':\n        if (!selection) {\n          return;\n        }\n\n        blockquoteUtils.wrapBlockquote();\n        break;\n\n      case 'unwrap_blockquote':\n        blockquoteUtils.unwrapBlockquote();\n        break;\n\n      case 'set_ordered_list':\n        if (!selection) {\n          return;\n        }\n\n        listUtils.wrapList('ordered_list');\n        break;\n\n      case 'set_unordered_list':\n        if (!selection) {\n          return;\n        }\n\n        listUtils.wrapList('unordered_list');\n        break;\n\n      case 'unwrap_unordered_list':\n      case 'unwrap_ordered_list':\n        listUtils.unwrapList();\n        break;\n\n      case 'wrap_check_list_item':\n        var listItem = listUtils.getCurrentListItem();\n\n        if (listItem.length === 0) {\n          // not in list, add list\n          listUtils.wrapList('unordered_list');\n          Editor.setNodes(editor, {\n            data: {\n              checked: false\n            }\n          }, {\n            match: {\n              type: 'list_item'\n            }\n          });\n        } else {\n          var listItems = Editor.nodes(editor, {\n            at: editor.selection,\n            match: {\n              type: 'list_item'\n            }\n          });\n          var nearestItem;\n\n          var _iterator = _createForOfIteratorHelper(listItems),\n              _step;\n\n          try {\n            for (_iterator.s(); !(_step = _iterator.n()).done;) {\n              var _listItem = _step.value;\n              nearestItem = _listItem;\n            }\n          } catch (err) {\n            _iterator.e(err);\n          } finally {\n            _iterator.f();\n          }\n\n          Editor.setNodes(editor, {\n            data: {\n              checked: false\n            }\n          }, {\n            at: nearestItem[1]\n          });\n        }\n\n        break;\n\n      case 'unwrap_check_list_item':\n        var item = listUtils.getCurrentListItem();\n        Editor.setNodes(editor, {\n          data: {}\n        }, {\n          at: item[0][1]\n        });\n        break;\n\n      case 'set_code_block':\n        codeUtils.wrapCodeBlock();\n        break;\n\n      case 'unwrap_code_block':\n        codeUtils.unwrapCodeBlock();\n        break;\n\n      case 'exit_code_block':\n        Editor.splitNodes(editor, {\n          match: 'block',\n          always: true\n        });\n        codeUtils.unwrapCodeBlock(true);\n        break;\n\n      case 'increase_code_block_indent':\n        if (isRangeCollapsed(editor.selection)) {\n          var block = Editor.match(editor, editor.selection, 'block');\n          Editor.insertText(editor, '\\t', {\n            at: {\n              anchor: {\n                path: [].concat(_toConsumableArray(block[1]), [0]),\n                offset: 0\n              },\n              focus: {\n                path: [].concat(_toConsumableArray(block[1]), [0]),\n                offset: 0\n              }\n            }\n          });\n        }\n\n        break;\n\n      case 'insert_table':\n        tableUtils.insertTable();\n        break;\n\n      case 'remove_table':\n        tableUtils.removeTable();\n        break;\n\n      case 'insert_row':\n        tableUtils.insertRow();\n        break;\n\n      case 'insert_column':\n        tableUtils.insertColumn();\n        break;\n\n      case 'remove_row':\n        tableUtils.removeRow();\n        break;\n\n      case 'remove_column':\n        tableUtils.removeColumn();\n        break;\n\n      case 'set_table_cell_align':\n        tableUtils.setAlign(command.align);\n        break;\n\n      case 'exit_table':\n        tableUtils.exitTable();\n        break;\n\n      case 'insert_formula':\n        formulaUtils.insertFormula(command.data);\n        break;\n\n      case 'set_formula':\n        formulaUtils.setFormula(command.data);\n        break;\n\n      default:\n        exec(command);\n        break;\n    }\n  };\n\n  return editor;\n};\n\nexport default withBlock;","import _toConsumableArray from \"@babel/runtime/helpers/esm/toConsumableArray\";\nimport { Editor, Range } from 'slate';\nimport generateLinkElement from '../element-model/link';\nimport generateImageElement from '../element-model/image';\n\nvar withInline = function withInline(editor) {\n  var exec = editor.exec,\n      isInline = editor.isInline;\n\n  editor.isInline = function (element) {\n    return element.type === 'link' || element.type === 'image' ? true : isInline(element);\n  };\n\n  editor.exec = function (command) {\n    var data = command.data;\n    var selection = editor.selection;\n\n    switch (command.type) {\n      case 'insert_link_at_selection':\n        selection = command.elementData.selection;\n        var isCollapsed = selection && Range.isCollapsed(selection);\n        var link = generateLinkElement({\n          type: 'link',\n          children: [{\n            text: command.elementData.text\n          }],\n          data: {\n            href: command.elementData.url\n          }\n        });\n\n        if (isCollapsed) {\n          Editor.insertNodes(editor, link, {\n            at: selection\n          });\n        } else {\n          Editor.wrapNodes(editor, link, {\n            split: true,\n            at: selection\n          });\n          Editor.select(editor, selection);\n          Editor.collapse(editor, {\n            edge: 'end'\n          });\n        }\n\n        break;\n\n      case 'unwrap_link':\n        Editor.unwrapNodes(editor, {\n          match: {\n            type: 'link'\n          }\n        });\n        break;\n\n      case 'set_link':\n        selection = command.elementData.selection;\n        Editor.removeNodes(editor, {\n          match: {\n            type: 'link'\n          },\n          at: selection\n        });\n        var newNodeLink = generateLinkElement({\n          type: 'link',\n          data: {\n            href: command.elementData.url\n          },\n          children: [{\n            text: command.elementData.text\n          }]\n        }); // Insert a new link at previous link path\n\n        var linkPath = _toConsumableArray(selection.anchor.path);\n\n        linkPath.pop();\n        Editor.insertNodes(editor, newNodeLink, {\n          at: linkPath\n        });\n        break;\n\n      case 'insert_image_at_selection':\n        var img = generateImageElement({\n          data: command.data\n        });\n        Editor.insertNodes(editor, img, {\n          at: command.at\n        });\n        break;\n\n      case 'set_image':\n        Editor.setNodes(editor, {\n          data: data\n        }, {\n          match: {\n            type: 'image'\n          },\n          at: editor.selection,\n          voids: true\n        });\n        break;\n\n      case 'insert_data':\n        if (data.types.includes('Files') && data.files[0].type.includes('image') && window.editor.editorApi.uploadLocalImage) {\n          window.editor.editorApi.uploadLocalImage(command.data.files[0]).then(function (res) {\n            var img = generateImageElement({\n              data: {\n                src: res\n              }\n            });\n            Editor.insertNodes(editor, img);\n          });\n          return;\n        }\n\n        exec(command);\n        break;\n\n      default:\n        exec(command);\n        break;\n    }\n  };\n\n  return editor;\n};\n\nexport default withInline;","var withVoid = function withVoid(editor) {\n  var isVoid = editor.isVoid;\n  var VOID_ELEMENTS = ['image', 'formula'];\n\n  editor.isVoid = function (element) {\n    return VOID_ELEMENTS.includes(element.type) ? true : isVoid(element);\n  };\n\n  return editor;\n};\n\nexport default withVoid;","import _objectSpread from \"@babel/runtime/helpers/esm/objectSpread2\";\nimport _slicedToArray from \"@babel/runtime/helpers/esm/slicedToArray\";\nimport _classCallCheck from \"@babel/runtime/helpers/esm/classCallCheck\";\nimport { Editor, Path } from 'slate';\nvar BOLDITALICREG = /\\*\\*\\*(\\S+)\\*\\*\\*|\\_\\_\\_(\\S+)\\_\\_\\_|\\*\\_\\_(\\S+)\\_\\_\\*|\\_\\*\\*(\\S+)\\*\\*\\_|\\_\\_\\*(\\S+)\\*\\_\\_|\\*\\*\\_(\\S+)_\\*\\*/;\nvar BOLDREG = /\\*\\*(\\S+)\\*\\*|\\_\\_(\\S+)\\_\\_/;\nvar ITALICREG = /\\*(\\S+)\\*|_(\\S+)_/;\nvar CODEREG = /\\`(\\S+)\\`/;\n\nvar TextUtils = function TextUtils(_editor) {\n  var _this = this;\n\n  _classCallCheck(this, TextUtils);\n\n  this.getTextInfoBeforeSelection = function () {\n    var editor = _this.editor;\n    var selection = _this.editor.selection;\n    var anchor = selection.anchor;\n\n    var _Editor$nodes = Editor.nodes(editor, {\n      match: 'block'\n    }),\n        _Editor$nodes2 = _slicedToArray(_Editor$nodes, 1),\n        block = _Editor$nodes2[0];\n\n    var path = block ? block[1] : [];\n    var start = Editor.start(editor, path);\n    var range = {\n      anchor: anchor,\n      focus: start\n    };\n    var beforeText = Editor.text(editor, range);\n    return {\n      range: range,\n      beforeText: beforeText,\n      block: block\n    };\n  };\n\n  this.setTextMarkByShortCut = function (exec, command) {\n    var editor = _this.editor;\n    var selection = editor.selection;\n\n    var _Editor$node = Editor.node(editor, selection),\n        _Editor$node2 = _slicedToArray(_Editor$node, 2),\n        textNode = _Editor$node2[0],\n        textPath = _Editor$node2[1];\n\n    var text = textNode.text;\n    var offset = selection.anchor.offset;\n    var lastChart = text[offset - 1];\n    var marks, markText, startOffset;\n    var matched;\n\n    if (lastChart === '_' || lastChart === '`' || lastChart === '*') {\n      if (matched = text.match(BOLDITALICREG)) {\n        startOffset = matched.index;\n        marks = {\n          BOLD: true,\n          ITALIC: true\n        };\n      } else if (matched = text.match(BOLDREG)) {\n        startOffset = matched.index;\n        marks = {\n          BOLD: true\n        };\n      } else if (matched = text.match(ITALICREG)) {\n        startOffset = matched.index;\n        marks = {\n          ITALIC: true\n        };\n      } else if (matched = text.match(CODEREG)) {\n        startOffset = matched.index;\n        marks = {\n          CODE: true\n        };\n      }\n\n      if (matched) {\n        for (var index = 1; index < matched.length; index++) {\n          if (matched[index]) {\n            markText = matched[index];\n            break;\n          }\n        }\n\n        marks = Object.assign({\n          BOLD: false,\n          ITALIC: false,\n          CODE: false\n        }, marks);\n        Editor.select(editor, {\n          anchor: {\n            path: textPath,\n            offset: startOffset\n          },\n          focus: {\n            path: textPath,\n            offset: offset\n          }\n        });\n        Editor.delete(editor, editor.selection); // insert a space before mark\n\n        Editor.insertText(editor, ' ');\n        Editor.insertNodes(editor, [_objectSpread({\n          text: markText\n        }, marks), {\n          text: ' '\n        }]);\n        var selectedPath = Path.next(Path.next(textPath)); // select the next empty text node to escape the mark\n\n        Editor.select(editor, selectedPath);\n        Editor.collapse(editor, {\n          edge: 'end'\n        });\n        return;\n      }\n    }\n\n    exec(command);\n  };\n\n  this.editor = _editor;\n} // Get text related variables before current selection\n// block: Parent of current text node\n// range: From start of block to current selection\n// beforeText: The text of block from start to selection\n;\n\nexport default TextUtils;","import _toConsumableArray from \"@babel/runtime/helpers/esm/toConsumableArray\";\nimport _slicedToArray from \"@babel/runtime/helpers/esm/slicedToArray\";\nimport { Editor, Node, Range, Path } from 'slate';\nimport ListUtils from '../editor-utils/block-element-utils/list-utils';\nimport { isRangeCollapsed } from '../editor-utils/range-utils';\nimport { SfEditor } from '../custom/custom';\nimport CodeUtils from '../editor-utils/block-element-utils/code-utils';\nimport TextUtils from '../editor-utils/text-utils';\nimport TableUtils from '../editor-utils/block-element-utils/table-utils';\nimport BlockquoteUtils from '../editor-utils/block-element-utils/blockquote-utils';\nvar SHORTCUTS = {\n  '1.': 'ordered_list',\n  '*': 'unordered_list',\n  '-': 'unordered_list',\n  '>': 'blockquote',\n  '#': 'header_one',\n  '##': 'header_two',\n  '###': 'header_three',\n  '####': 'header_four',\n  '#####': 'header_five',\n  '######': 'header_six',\n  '   ': 'code_block'\n};\n\nvar withMarkdownShortcut = function withMarkdownShortcut(editor) {\n  var exec = editor.exec;\n  var listUtils = new ListUtils(editor);\n  var codeUtils = new CodeUtils(editor);\n  var tableUtils = new TableUtils(editor);\n  var textUtils = new TextUtils(editor);\n  var blockquoteUtils = new BlockquoteUtils(editor);\n\n  editor.exec = function (command) {\n    var selection = editor.selection;\n\n    switch (command.type) {\n      case 'split_list_item':\n        Editor.splitNodes(editor, {\n          match: 'block',\n          always: true\n        });\n        break;\n\n      case 'insert_break':\n        if (!Range.isCollapsed(editor.selection)) {\n          var _node = Editor.node(editor, [editor.selection.anchor.path[0]]);\n\n          if (_node && _node[0].type.includes('header')) {\n            exec(command);\n            Editor.setNodes(editor, {\n              type: 'paragraph'\n            });\n            return;\n          } // if the expand selection is in table delete the selected and insert a new row when press enter\n\n\n          if (tableUtils.isInTable()) {\n            Editor.collapse(editor, {\n              edge: 'end'\n            });\n            tableUtils.insertRow();\n            return;\n          }\n\n          exec(command);\n          return;\n        }\n\n        var _Editor$nodes = Editor.nodes(editor, {\n          match: {\n            type: 'link'\n          }\n        }),\n            _Editor$nodes2 = _slicedToArray(_Editor$nodes, 1),\n            link = _Editor$nodes2[0]; // when selection is at the end of link, select the text node after the link\n        // to prevent split a empty link node\n\n\n        if (link) {\n          var linkPath = link[1];\n\n          if (Editor.isEnd(editor, editor.selection.anchor, linkPath)) {\n            var nextPath = Path.next(linkPath);\n            var point = {\n              path: nextPath,\n              offset: 0\n            };\n            Editor.select(editor, point);\n          }\n        } // When a picture is selected, a blank line is inserted when press Enter\n\n\n        var _Editor$nodes3 = Editor.nodes(editor, {\n          match: {\n            type: 'image'\n          }\n        }),\n            _Editor$nodes4 = _slicedToArray(_Editor$nodes3, 1),\n            image = _Editor$nodes4[0];\n\n        if (image) {\n          var imagePath = image[1].slice();\n          var imageIndex = imagePath.pop(); // insert new table row when selection is in table\n\n          Editor.insertNodes(editor, {\n            text: ''\n          }, {\n            at: [].concat(_toConsumableArray(imagePath), [imageIndex + 1])\n          });\n\n          if (tableUtils.isInTable()) {\n            tableUtils.insertRow();\n            return;\n          }\n\n          exec(command);\n          return;\n        } // unwrap blockquote when press enter at an empty blockquote line;\n\n\n        if (blockquoteUtils.isInBlockquote()) {\n          var _Editor$nodes5 = Editor.nodes(editor, {\n            match: 'block'\n          }),\n              _Editor$nodes6 = _slicedToArray(_Editor$nodes5, 1),\n              block = _Editor$nodes6[0];\n\n          if (Node.text(block[0]).length === 0) {\n            Editor.unwrapNodes(editor, {\n              match: {\n                type: 'blockquote'\n              },\n              split: true\n            });\n            return;\n          }\n        } // if press enter in a list unwrap the list or insert a new list item\n\n\n        if (listUtils.isInlist()) {\n          var _node2 = SfEditor.getNodesByTypeAtRange(editor, 'list_item'); // unwrap list if the list item text is none\n\n\n          if (Node.text(_node2[0]).length === 0) {\n            listUtils.unwrapList();\n            return;\n          } // insert a new list item\n\n\n          if (isRangeCollapsed(editor.selection)) {\n            SfEditor.splitNodesAtPoint(editor, {\n              at: editor.selection.anchor,\n              match: {\n                type: 'list_item'\n              },\n              always: true\n            });\n            return;\n          }\n        }\n\n        if (codeUtils.isInCodeBlock()) {\n          codeUtils.splitCodeLine();\n          return;\n        }\n\n        if (tableUtils.isInTable()) {\n          tableUtils.insertRow();\n          return;\n        }\n\n        var node = Editor.node(editor, [editor.selection.anchor.path[0]]);\n\n        if (node && node[0].type.includes('header')) {\n          var header = node[0]; // get the offset of the selection\n\n          var offset = editor.selection.anchor.offset; // split the header\n\n          exec(command); // if the selection is at the end of the header\n          // set the splited header sibling to paragraph \n\n          if (offset === Node.text(header).length) {\n            Editor.setNodes(editor, {\n              type: 'paragraph'\n            });\n          }\n\n          return;\n        }\n\n        exec(command);\n        break;\n\n      case 'insert_text':\n        // set element by markdown shortcut;\n        if (command.text === ' ' && isRangeCollapsed(selection)) {\n          // if current selection is in table or code block exec default command\n          if (tableUtils.isInTable() || codeUtils.isInCodeBlock()) {\n            exec(command);\n            return;\n          }\n\n          var _textUtils$getTextInf = textUtils.getTextInfoBeforeSelection(),\n              beforeText = _textUtils$getTextInf.beforeText,\n              range = _textUtils$getTextInf.range,\n              _block = _textUtils$getTextInf.block;\n\n          var path = _block[1];\n          var type = SHORTCUTS[beforeText]; // set block element by shortcut\n\n          if (type) {\n            Editor.select(editor, range);\n            Editor.delete(editor);\n\n            if (type === 'blockquote') {\n              if (!blockquoteUtils.isInBlockquote()) {\n                editor.exec({\n                  type: 'set_blockquote'\n                });\n              }\n            }\n\n            if (type.includes('header')) {\n              // set the outest  paragraph into header \n              if (_block[0].type === 'paragraph' && path.length === 1) {\n                editor.exec({\n                  type: 'set_header',\n                  headerType: type\n                });\n              }\n            }\n\n            if (type === 'ordered_list') {\n              editor.exec({\n                type: 'set_ordered_list'\n              });\n            }\n\n            if (type === 'unordered_list') {\n              editor.exec({\n                type: 'set_unordered_list'\n              });\n            }\n\n            if (type === 'code_block') {\n              if (!codeUtils.isInCodeBlock()) {\n                editor.exec({\n                  type: 'set_code_block'\n                });\n                return;\n              }\n            }\n\n            return;\n          } else {\n            // set text mark by shortcut\n            textUtils.setTextMarkByShortCut(exec, command);\n            return;\n          }\n        }\n\n        if (command.text === '`' && isRangeCollapsed(editor.selection)) {\n          var _textUtils$getTextInf2 = textUtils.getTextInfoBeforeSelection(),\n              _beforeText = _textUtils$getTextInf2.beforeText,\n              _range = _textUtils$getTextInf2.range;\n\n          if (_beforeText === '``' && !codeUtils.isInCodeBlock()) {\n            Editor.select(editor, _range);\n            Editor.delete(editor);\n            editor.exec({\n              type: 'set_code_block'\n            });\n            return;\n          }\n        }\n\n        exec(command);\n        break;\n\n      case 'increase_list_item_depth':\n        listUtils.increaseListDepth();\n        break;\n\n      case 'delete_backward':\n        var anchor = selection.anchor;\n\n        if (anchor.offset === 0 && isRangeCollapsed(selection)) {\n          var _Editor$nodes7 = Editor.nodes(editor, {\n            match: 'block'\n          }),\n              _Editor$nodes8 = _slicedToArray(_Editor$nodes7, 1),\n              match = _Editor$nodes8[0];\n\n          var _block2 = match[0]; // if the header content is none set the header to paragraph when delete\n\n          if (_block2.type.includes('header') && Node.text(_block2).length === 0) {\n            editor.exec({\n              type: 'set_header',\n              headerType: 'paragraph'\n            });\n            return;\n          }\n          /**\n           * If the anchor offset is 0 but not focus the head of the block node such as\n           * an image is selected, the editor shoud delete the image first instead of\n           * execute the delete operation of list or code_block or table\n           */\n\n\n          if (_block2.children.length > 1) {\n            var blockDepth = match[1].length - 1;\n            var inlineIndex = anchor.path[blockDepth + 1]; // If the inline node is the first child of the block, execute default command\n\n            if (inlineIndex !== 0) {\n              exec(command);\n              return;\n            }\n          }\n\n          if (blockquoteUtils.isInBlockquote()) {\n            editor.exec({\n              type: 'unwrap_blockquote'\n            });\n            return;\n          }\n\n          if (listUtils.isInlist()) {\n            var _Editor$nodes9 = Editor.nodes(editor, {\n              match: [{\n                type: 'ordered_list'\n              }, {\n                type: 'unordered_list'\n              }]\n            }),\n                _Editor$nodes10 = _slicedToArray(_Editor$nodes9, 1),\n                _node3 = _Editor$nodes10[0];\n\n            var listNode = _node3[0];\n\n            if (listNode.children.length === 1 && Node.text(listNode).length === 0) {\n              listUtils.unwrapList();\n              return;\n            } // Unwrap the list item when the selection is at the first list item of the first node of document\n\n\n            if (anchor.path[0] === 0 && anchor.path[1] === 0) {\n              listUtils.unwrapList();\n              return;\n            }\n          }\n\n          if (codeUtils.isInCodeBlock()) {\n            var _node4 = Editor.match(editor, editor.selection, {\n              type: 'code_block'\n            });\n\n            var codeBlock = _node4[0];\n            var children = codeBlock.children;\n            var text = Node.text(codeBlock);\n\n            if (text.length === 0 && children.length === 1) {\n              editor.exec({\n                type: 'unwrap_code_block'\n              });\n              return;\n            }\n          }\n\n          if (tableUtils.isInTable()) {\n            var _block3 = Editor.match(editor, editor.selection, 'block');\n\n            var blockPath = _block3[1];\n            var blockNode = _block3[0];\n            var start = Editor.start(editor, blockPath);\n            var _offset = start.offset;\n\n            if (_offset === 0 && blockNode.children.length === 1) {\n              return;\n            }\n          }\n        }\n\n        exec(command);\n        break;\n\n      default:\n        exec(command);\n    }\n  };\n\n  return editor;\n};\n\nexport default withMarkdownShortcut;","import _toConsumableArray from \"@babel/runtime/helpers/esm/toConsumableArray\";\nimport _slicedToArray from \"@babel/runtime/helpers/esm/slicedToArray\";\nimport { SfEditor } from '../custom/custom';\nimport { Node, Text, Path } from 'slate';\n\nvar normalizeNode = function normalizeNode(editor) {\n  var normalizeNode = editor.normalizeNode;\n\n  editor.normalizeNode = function (_ref) {\n    var _ref2 = _slicedToArray(_ref, 2),\n        node = _ref2[0],\n        path = _ref2[1];\n\n    // if current node is a list node\n    var type = node.type; // wrap the outest list item into unoreded list\n\n    if (path.length === 1 && type === 'list_item') {\n      SfEditor.wrapNodes(editor, {\n        type: 'unordered_list',\n        children: [node]\n      }, {\n        at: path\n      });\n    }\n\n    if (type === 'ordered_list' || type === 'unordered_list') {\n      var currentNodeIndex = path.slice(-1)[0];\n      var previousSibling;\n\n      if (currentNodeIndex !== 0) {\n        previousSibling = Node.get(editor, Path.previous(path));\n      }\n\n      if (previousSibling && previousSibling.type === type) {\n        // merge previous same type list node\n        SfEditor.mergeNodes(editor, {\n          at: path\n        });\n      }\n\n      var parentNode = Node.parent(editor, path);\n      var nextIndex = currentNodeIndex + 1;\n      var nextSiblings = parentNode.children[nextIndex];\n\n      if (nextSiblings && nextSiblings.type === type) {\n        // merge next same type list node\n        SfEditor.mergeNodes(editor, {\n          at: Path.next(path)\n        });\n      }\n    } // trailing a paragrph at the end of the document\n\n\n    if (path.length === 1 && path[0] === editor.children.length - 1) {\n      if (node.type !== 'paragraph' || !SfEditor.isEmptyParagraph(node)) {\n        SfEditor.insertNodes(editor, {\n          type: 'paragraph',\n          children: [{\n            text: ''\n          }]\n        }, {\n          at: [path[0] + 1]\n        });\n      }\n    }\n\n    if (type === 'blockquote') {\n      node.children.forEach(function (child, index) {\n        var childPath = [].concat(_toConsumableArray(path), [index]);\n\n        if (child.type === 'blockquote') {\n          SfEditor.unwrapNodes(editor, {\n            at: childPath\n          });\n        }\n      });\n    } // remove empty link\n\n\n    if (type === 'link') {\n      if (Node.text(node) === '' && node.children.length > 0) {\n        SfEditor.removeNodes(editor, {\n          at: path\n        });\n      }\n    } // remove mark when the text node is empty\n\n\n    if (Text.isText(node) && node.text.length === 0) {\n      if (Object.keys(node).length > 1) {\n        SfEditor.setNodes(editor, {\n          CODE: false,\n          BOLD: false,\n          ITALIC: false\n        }, {\n          at: path\n        });\n      }\n    }\n\n    return normalizeNode([node, path]);\n  };\n\n  return editor;\n};\n\nexport default normalizeNode;","import { Node } from 'slate';\nvar TRANSFER_TYPES = {\n  fragment: 'application/x-slate-fragment',\n  html: 'text/html',\n  text: 'text/plain'\n}; // tranfrom slate fragment and write to clipboard\n\nfunction setEventTransfer(event, type, content) {\n  var mime = TRANSFER_TYPES[type];\n  var transfer = event.dataTransfer || event.clipboardData;\n\n  if (type === 'fragment') {\n    // use the same encoding as slate\n    var encodedContent = window.btoa(encodeURIComponent(JSON.stringify(content)));\n    transfer.setData(mime, encodedContent);\n    var texts = '';\n    var textItem = '';\n    content.forEach(function (element) {\n      textItem = Node.text(element).replace(/\\ufeff/, '');\n      texts += textItem + '\\r\\n';\n    });\n    transfer.setData('text', texts);\n  } else if (type === 'html') {\n    transfer.setData(mime, content);\n    transfer.setData('text', transfer.getData('text'));\n  } else {\n    transfer.setData('text', content);\n  }\n}\n\nexport default setEventTransfer;","import _slicedToArray from \"@babel/runtime/helpers/esm/slicedToArray\";\nimport _classCallCheck from \"@babel/runtime/helpers/esm/classCallCheck\";\nimport isHotKey from 'is-hotkey';\nimport { Range, Editor, Path, Node } from 'slate';\nimport ListUtils from './editor-utils/block-element-utils/list-utils';\nimport CodeUtils from './editor-utils/block-element-utils/code-utils';\nimport TableUtils from './editor-utils/block-element-utils/table-utils';\nimport setEventTransfer from './custom/set-event-transfer';\nimport { SfEditor } from '../editor/custom/custom';\n\nvar Plugin = function Plugin(_editor) {\n  var _this = this;\n\n  _classCallCheck(this, Plugin);\n\n  this.onKeyDown = function (event) {\n    if (event.nativeEvent.keyCode === 13) {\n      event.preventDefault();\n\n      if (isHotKey('shift+enter', event)) {\n        if (_this.listUtils.isInlist()) {\n          _this.editor.exec({\n            type: 'split_list_item'\n          });\n        }\n      } else if (isHotKey('mod+enter', event)) {\n        if (_this.codeUtils.isInCodeBlock()) {\n          _this.editor.exec({\n            type: 'exit_code_block'\n          });\n        }\n\n        if (_this.tableUtils.isInTable()) {\n          _this.editor.exec({\n            type: 'exit_table'\n          });\n        }\n      } else {\n        _this.editor.exec({\n          type: 'insert_break'\n        });\n      }\n    }\n\n    if (isHotKey('shift+tab', event)) {\n      event.preventDefault();\n\n      if (_this.listUtils.isInlist()) {\n        var _Editor$nodes = Editor.nodes(_this.editor, {\n          match: [{\n            type: 'unordered_list'\n          }, {\n            type: 'ordered_list'\n          }],\n          at: _this.editor.selection,\n          mode: 'highest'\n        }),\n            _Editor$nodes2 = _slicedToArray(_Editor$nodes, 1),\n            listNode = _Editor$nodes2[0];\n\n        if (!listNode) return;\n        var type = listNode[0].type;\n\n        _this.editor.exec({\n          type: \"unwrap_\".concat(type)\n        });\n      }\n    }\n\n    if (isHotKey('mod+s', event)) {\n      event.preventDefault();\n      _this.editor.onSave && _this.editor.onSave();\n    }\n\n    if (isHotKey('tab', event) && Range.isCollapsed(_this.editor.selection)) {\n      event.preventDefault();\n\n      if (_this.codeUtils.isInCodeBlock()) {\n        _this.editor.exec({\n          type: 'increase_code_block_indent'\n        });\n      }\n\n      if (_this.listUtils.isInlist()) {\n        _this.editor.exec({\n          type: 'increase_list_item_depth'\n        });\n      }\n    }\n\n    if (isHotKey('mod+b', event)) {\n      event.preventDefault();\n\n      if (!_this.codeUtils.isInCodeBlock()) {\n        _this.editor.exec({\n          type: 'format_text',\n          properties: {\n            BOLD: true\n          }\n        });\n      }\n    }\n\n    if (isHotKey('mod+i', event)) {\n      event.preventDefault();\n\n      if (!_this.codeUtils.isInCodeBlock()) {\n        _this.editor.exec({\n          type: 'format_text',\n          properties: {\n            ITALIC: true\n          }\n        });\n      }\n    }\n\n    if (isHotKey('mod+/', event)) {\n      event.preventDefault();\n\n      if (!_this.codeUtils.isInCodeBlock()) {\n        _this.editor.exec({\n          type: 'format_text',\n          properties: {\n            CODE: true\n          }\n        });\n      }\n    }\n\n    if (isHotKey('mod+4', {\n      byKey: true\n    })(event)) {\n      event.preventDefault();\n      window.richMarkdownEditor.onToggleFormulaDialog();\n      return;\n    } // compate chrome: in chrome press backspace would not exec delete_backward command\n\n\n    if (isHotKey('backspace', event)) {\n      var voidNode = SfEditor.match(_this.editor, _this.editor.selection, 'void');\n\n      if (voidNode && (voidNode[0].type === 'image' || voidNode[0].type === 'formula')) {\n        event.preventDefault();\n\n        _this.editor.exec({\n          type: 'delete_backward',\n          unit: 'character'\n        });\n\n        return;\n      }\n    }\n\n    if (isHotKey('mod+a', event)) {\n      if (_this.codeUtils.isInCodeBlock()) {\n        var anchorPoint = _this.editor.selection.anchor;\n        var focusPoint = _this.editor.selection.focus;\n        var anchorCodeBlock = Editor.match(_this.editor, anchorPoint, {\n          type: 'code_block'\n        });\n        var focusCodeBlock = Editor.match(_this.editor, focusPoint, {\n          type: 'code_block'\n        });\n\n        if (anchorCodeBlock && focusCodeBlock && Path.equals(focusCodeBlock[1], anchorCodeBlock[1])) {\n          event.preventDefault();\n          Editor.select(_this.editor, focusCodeBlock[1]);\n          return;\n        }\n      }\n    }\n  };\n\n  this.onCut = function (event, editor) {\n    var image = SfEditor.match(_this.editor, _this.editor.selection, {\n      type: 'image'\n    });\n\n    if (image) {\n      // write the image element to clipboard\n      setEventTransfer(event, 'fragment', [{\n        type: 'paragraph',\n        children: [image[0]]\n      }]); // remove the image element when cut an image due to slate did not has the action when cut a image\n\n      _this.editor.exec({\n        type: 'delete_backward',\n        unit: 'character'\n      });\n\n      return;\n    }\n  };\n\n  this.onCopy = function (event, editor) {\n    if (_this.tableUtils.isInTable()) {\n      event.preventDefault();\n\n      var table = _this.tableUtils.getSelectedTableCells();\n\n      if (!table) {\n        setEventTransfer(event, 'text', SfEditor.text(editor, editor.selection));\n        return;\n      }\n\n      setEventTransfer(event, 'fragment', table);\n      return;\n    }\n\n    if (_this.codeUtils.isInCodeBlock() && !Range.isCollapsed(editor.selection)) {\n      var anchorPoint = editor.selection.anchor;\n      var focusPoint = editor.selection.focus;\n      var anchorCodeBlock = Editor.match(_this.editor, anchorPoint, {\n        type: 'code_block'\n      });\n      var focusCodeBlock = Editor.match(_this.editor, focusPoint, {\n        type: 'code_block'\n      });\n      /* \n        If the selection is within the range of the selected code block \n        copy the selected code line as paragraph\n      */\n\n      if (anchorCodeBlock && focusCodeBlock && Path.equals(focusCodeBlock[1], anchorCodeBlock[1])) {\n        event.preventDefault();\n        var fragment = Node.fragment(editor, editor.selection);\n        fragment = fragment[0].children.map(function (codeLine) {\n          var text = Node.text(codeLine);\n          return {\n            type: 'paragraph',\n            children: [{\n              text: text\n            }]\n          };\n        });\n        setEventTransfer(event, 'fragment', fragment);\n        return;\n      }\n    }\n  };\n\n  this.editor = _editor;\n  this.listUtils = new ListUtils(_editor);\n  this.codeUtils = new CodeUtils(_editor);\n  this.tableUtils = new TableUtils(_editor);\n  this.onSave = _editor.onSave;\n};\n\nexport default Plugin;","import _classCallCheck from \"@babel/runtime/helpers/esm/classCallCheck\";\nimport _createClass from \"@babel/runtime/helpers/esm/createClass\";\nimport _inherits from \"@babel/runtime/helpers/esm/inherits\";\nimport _createSuper from \"@babel/runtime/helpers/esm/createSuper\";\nimport React, { Fragment } from 'react';\nimport { Modal, ModalHeader, ModalBody } from 'reactstrap';\nimport { withTranslation } from 'react-i18next';\nimport '../css/keyboard-shortcuts.css';\nvar isMac = window.navigator.platform.indexOf('Win') < 0 ? true : false;\nvar controlKey = isMac ? '⌘' : 'CTRL';\n\nvar KeyboardShortcuts = /*#__PURE__*/function (_React$PureComponent) {\n  _inherits(KeyboardShortcuts, _React$PureComponent);\n\n  var _super = _createSuper(KeyboardShortcuts);\n\n  function KeyboardShortcuts(props) {\n    var _this;\n\n    _classCallCheck(this, KeyboardShortcuts);\n\n    _this = _super.call(this, props);\n\n    _this.renderShortcut = function (keys) {\n      return /*#__PURE__*/React.createElement(Fragment, null, /*#__PURE__*/React.createElement(\"span\", {\n        className: \"keyboard-shortcut\"\n      }, keys.map(function (key, index) {\n        return /*#__PURE__*/React.createElement(\"kbd\", {\n          key: index\n        }, key);\n      })), /*#__PURE__*/React.createElement(\"br\", null));\n    };\n\n    _this.renderContainer = function (keys, description) {\n      return /*#__PURE__*/React.createElement(\"div\", {\n        className: \"keyboard-shortcut-container\"\n      }, /*#__PURE__*/React.createElement(\"div\", {\n        className: \"col-4\"\n      }, _this.renderShortcut(keys)), /*#__PURE__*/React.createElement(\"div\", {\n        className: \"col-8\"\n      }, description));\n    };\n\n    _this.shortcutData = [{\n      'Make_list': [['*', 'space'], ['-', 'space']],\n      'Make_ordered_list': [['1.', 'space']],\n      'Insert_new_item': [['Enter']],\n      'Insert_child_in_item': [['Shift', 'Enter']],\n      'Increase_depth': [['Tab']]\n    }, {\n      'Heading_1': [['#', 'space']],\n      'Heading_2': [['##', 'space']],\n      'Heading_3': [['###', 'space']],\n      'Heading_4': [['####', 'space']],\n      'Heading_5': [['#####', 'space']],\n      'Heading_6': [['######', 'space']]\n    }, {\n      'Make_code_block': [['```'], ['space*4']],\n      'Insert_new_line': [['Enter']],\n      'Escape_code_block': [[controlKey, 'Enter']],\n      'Insert_indent': [['Tab']]\n    }, {\n      'Make_Block_quote': [['>', 'space']],\n      'Escape_Block_quote': [['Enter']]\n    }, {\n      'Insert_Table_Row': [['Enter']],\n      'Escape_table': [[controlKey, 'Enter']]\n    }, {\n      'Bold': [['**bold**', 'space'], ['__bold__', 'space']],\n      'Italic': [['*italic*', 'space'], ['_italic_', 'space']],\n      'Italic_Bold': [['***italic***', 'space'], ['___italic___', 'space']],\n      'Inline_code': [['`code`', 'space']]\n    }, {\n      'Paste_screen_shot': [[controlKey, 'v']],\n      'Drag_image_from_anywhere_to_upload_it': []\n    }];\n    return _this;\n  }\n\n  _createClass(KeyboardShortcuts, [{\n    key: \"render\",\n    value: function render() {\n      var _this$props = this.props,\n          t = _this$props.t,\n          toggleShortcutDialog = _this$props.toggleShortcutDialog,\n          userHelp = _this$props.userHelp;\n      var userHelpData = userHelp.userHelpData;\n      return /*#__PURE__*/React.createElement(Modal, {\n        isOpen: true,\n        toggle: toggleShortcutDialog,\n        className: \"keyboard-shortcut-dialog\"\n      }, /*#__PURE__*/React.createElement(ModalHeader, {\n        toggle: toggleShortcutDialog\n      }, /*#__PURE__*/React.createElement(\"span\", {\n        className: \"mr-2\"\n      }, t(userHelp.title))), /*#__PURE__*/React.createElement(ModalBody, null, /*#__PURE__*/React.createElement(\"div\", null, /*#__PURE__*/React.createElement(\"div\", {\n        className: \"pb-2\"\n      }, /*#__PURE__*/React.createElement(\"div\", {\n        className: \"keyboard-shortcut-title pb-1\"\n      }, t(userHelpData[1]['shortcutType'])), this.renderContainer(this.shortcutData[1]['Heading_1'][0], t(userHelpData[1].shortcutData['Heading_1'])), this.renderContainer(this.shortcutData[1]['Heading_2'][0], t(userHelpData[1].shortcutData['Heading_2'])), this.renderContainer(this.shortcutData[1]['Heading_3'][0], t(userHelpData[1].shortcutData['Heading_3'])), this.renderContainer(this.shortcutData[1]['Heading_4'][0], t(userHelpData[1].shortcutData['Heading_4'])), this.renderContainer(this.shortcutData[1]['Heading_5'][0], t(userHelpData[1].shortcutData['Heading_5'])), this.renderContainer(this.shortcutData[1]['Heading_6'][0], t(userHelpData[1].shortcutData['Heading_6']))), /*#__PURE__*/React.createElement(\"div\", {\n        className: \"pb-2\"\n      }, /*#__PURE__*/React.createElement(\"div\", {\n        className: \"keyboard-shortcut-title pb-1\"\n      }, t(userHelpData[0]['shortcutType'])), /*#__PURE__*/React.createElement(\"div\", {\n        className: \"keyboard-shortcut-container\"\n      }, /*#__PURE__*/React.createElement(\"div\", {\n        className: \"col-4\"\n      }, this.renderShortcut(this.shortcutData[0]['Make_list'][0]), this.renderShortcut(this.shortcutData[0]['Make_list'][1])), /*#__PURE__*/React.createElement(\"div\", {\n        className: \"col-8\"\n      }, t(userHelpData[0].shortcutData['Make_list']))), /*#__PURE__*/React.createElement(\"div\", {\n        className: \"keyboard-shortcut-container\"\n      }, /*#__PURE__*/React.createElement(\"div\", {\n        className: \"col-4\"\n      }, this.renderShortcut(this.shortcutData[0]['Make_ordered_list'][0])), /*#__PURE__*/React.createElement(\"div\", {\n        className: \"col-8\"\n      }, t(userHelpData[0].shortcutData['Make_ordered_list']))), this.renderContainer(this.shortcutData[0]['Increase_depth'][0], t(userHelpData[0].shortcutData['Increase_depth'])), this.renderContainer(this.shortcutData[0]['Insert_child_in_item'][0], t(userHelpData[0].shortcutData['Insert_child_in_item'])), this.renderContainer(this.shortcutData[0]['Insert_new_item'][0], t(userHelpData[0].shortcutData['Insert_new_item']))), /*#__PURE__*/React.createElement(\"div\", {\n        className: \"pb-2\"\n      }, /*#__PURE__*/React.createElement(\"div\", {\n        className: \"keyboard-shortcut-title pb-1\"\n      }, t(userHelpData[6]['shortcutType'])), /*#__PURE__*/React.createElement(\"div\", {\n        className: \"keyboard-shortcut-container\"\n      }, /*#__PURE__*/React.createElement(\"div\", {\n        className: \"col-4\"\n      }, this.renderShortcut(this.shortcutData[5]['Bold'][0]), this.renderShortcut(this.shortcutData[5]['Bold'][1])), /*#__PURE__*/React.createElement(\"div\", {\n        className: \"col-8\"\n      }, t(userHelpData[5].shortcutData['Bold']))), /*#__PURE__*/React.createElement(\"div\", {\n        className: \"keyboard-shortcut-container\"\n      }, /*#__PURE__*/React.createElement(\"div\", {\n        className: \"col-4\"\n      }, this.renderShortcut(this.shortcutData[5]['Italic'][0]), this.renderShortcut(this.shortcutData[5]['Italic'][1])), /*#__PURE__*/React.createElement(\"div\", {\n        className: \"col-8\"\n      }, t(userHelpData[5].shortcutData['Italic']))), /*#__PURE__*/React.createElement(\"div\", {\n        className: \"keyboard-shortcut-container\"\n      }, /*#__PURE__*/React.createElement(\"div\", {\n        className: \"col-4\"\n      }, this.renderShortcut(this.shortcutData[5]['Italic_Bold'][0]), this.renderShortcut(this.shortcutData[5]['Italic_Bold'][1])), /*#__PURE__*/React.createElement(\"div\", {\n        className: \"col-8\"\n      }, t(userHelpData[5].shortcutData['Italic_Bold']))), this.renderContainer(this.shortcutData[5]['Inline_code'][0], t(userHelpData[5].shortcutData['Inline_code']))), /*#__PURE__*/React.createElement(\"div\", {\n        className: \"pb-2\"\n      }, /*#__PURE__*/React.createElement(\"div\", {\n        className: \"keyboard-shortcut-title pb-1\"\n      }, t(userHelpData[2]['shortcutType'])), /*#__PURE__*/React.createElement(\"div\", {\n        className: \"keyboard-shortcut-container\"\n      }, /*#__PURE__*/React.createElement(\"div\", {\n        className: \"col-4\"\n      }, this.renderShortcut(this.shortcutData[2]['Make_code_block'][0]), this.renderShortcut(this.shortcutData[2]['Make_code_block'][1])), /*#__PURE__*/React.createElement(\"div\", {\n        className: \"col-8\"\n      }, t(userHelpData[2].shortcutData['Make_code_block']))), this.renderContainer(this.shortcutData[2]['Insert_indent'][0], t(userHelpData[2].shortcutData['Insert_indent'])), this.renderContainer(this.shortcutData[2]['Insert_new_line'][0], t(userHelpData[2].shortcutData['Insert_new_line'])), this.renderContainer(this.shortcutData[2]['Escape_code_block'][0], t(userHelpData[2].shortcutData['Escape_code_block']))), /*#__PURE__*/React.createElement(\"div\", {\n        className: \"pb-2\"\n      }, /*#__PURE__*/React.createElement(\"div\", {\n        className: \"keyboard-shortcut-title pb-1\"\n      }, t(userHelpData[3]['shortcutType'])), this.renderContainer(this.shortcutData[3]['Make_Block_quote'][0], t(userHelpData[3].shortcutData['Make_Block_quote'])), this.renderContainer(this.shortcutData[3]['Escape_Block_quote'][0], t(userHelpData[3].shortcutData['Escape_Block_quote']))), /*#__PURE__*/React.createElement(\"div\", {\n        className: \"pb-2\"\n      }, /*#__PURE__*/React.createElement(\"div\", {\n        className: \"keyboard-shortcut-title pb-1\"\n      }, t(userHelpData[4]['shortcutType'])), this.renderContainer(this.shortcutData[4]['Insert_Table_Row'][0], t(userHelpData[4].shortcutData['Insert_Table_Row'])), this.renderContainer(this.shortcutData[4]['Escape_table'][0], t(userHelpData[4].shortcutData['Escape_table']))), /*#__PURE__*/React.createElement(\"div\", {\n        className: \"pb-2\"\n      }, /*#__PURE__*/React.createElement(\"div\", {\n        className: \"keyboard-shortcut-title pb-1\"\n      }, t(userHelpData[7]['shortcutType'])), this.renderContainer(this.shortcutData[6]['Paste_screen_shot'][0], t(userHelpData[7].shortcutData['Paste_screen_shot']))))));\n    }\n  }]);\n\n  return KeyboardShortcuts;\n}(React.PureComponent);\n\nexport default withTranslation('dtable')(KeyboardShortcuts);","import _classCallCheck from \"@babel/runtime/helpers/esm/classCallCheck\";\nimport _createClass from \"@babel/runtime/helpers/esm/createClass\";\nimport _inherits from \"@babel/runtime/helpers/esm/inherits\";\nimport _createSuper from \"@babel/runtime/helpers/esm/createSuper\";\nimport React from 'react';\nimport ToolBar from '../components/toolbar';\nimport { withTranslation } from 'react-i18next';\nimport { renderNode, renderLeaf, EditorUtils, decorationNode } from './editor-utils/common-editor-utils';\nimport { createEditor, Node, Editor } from 'slate';\nimport { withHistory } from 'slate-history';\nimport { deserialize, serialize } from '../utils/slate2markdown/index';\nimport { Editable, withReact, Slate } from '@seafile/slate-react';\nimport { isRangeCollapsed } from './editor-utils/range-utils';\nimport ModalPortal from '../components/modal-portal';\nimport TextLinkHoverMenu from './editor-component/textlink-hovermenu';\nimport ContextMenu from '../components/context-menu';\nimport withBlock from './controller/block-element-controller';\nimport withInline from './controller/inline-element-controller';\nimport withVoid from './controller/void-element-controller';\nimport withMarkdownShortcut from './controller/shortcut-controller';\nimport normalizeNode from './controller/normalize-controller';\nimport Plugin from './editor-plugin';\nimport TableUtils from '../editor/editor-utils/block-element-utils/table-utils';\nimport IconButton from '../components/topbar-component/icon-button';\nimport KeyboardShortcuts from '../components/shortcut-dialog';\nimport './code-highlight-package';\nimport '../css/layout.css';\nimport '../css/richeditor/rich-editor-main.css';\nimport '../css/richeditor/navbar-imgbutton.css';\nimport '../css/richeditor/textlink-hovermenu.css';\nimport '../css/richeditor/image.css';\nimport '../css/richeditor/link.css';\nimport '../css/topbar.css';\n\nvar SimpleEditor = /*#__PURE__*/function (_React$Component) {\n  _inherits(SimpleEditor, _React$Component);\n\n  var _super = _createSuper(SimpleEditor);\n\n  function SimpleEditor(props) {\n    var _this;\n\n    _classCallCheck(this, SimpleEditor);\n\n    _this = _super.call(this, props);\n\n    _this.onChange = function (value) {\n      _this.setState({\n        value: value\n      }); // hide context menu when content change\n\n\n      if (_this.state.isShowContextMenu === true) {\n        _this.setState({\n          isShowContextMenu: false\n        });\n\n        _this.contextMenuPosition = {};\n      }\n\n      var operations = _this.editor.operations;\n      var hasChange = operations.some(function (o) {\n        return o.type !== 'set_selection' && o.type !== 'set_value';\n      });\n      if (hasChange) _this.contentChanged = true;\n    };\n\n    _this.foucsEditor = function () {\n      _this.editorRef.firstChild.focus();\n    };\n\n    _this.focusText = function () {\n      // In dtable long text editor, press the key to open the editor.\n      // Then the cursor should move to the end of this character.\n      var _this$props = _this.props,\n          focusEnd = _this$props.focusEnd,\n          value = _this$props.value;\n\n      if (focusEnd === true && value.length === 1) {\n        setTimeout(function () {\n          Editor.select(_this.editor, {\n            path: [0, 0],\n            offset: 1\n          });\n        }, 1);\n      }\n    };\n\n    _this.hasContentChange = function () {\n      return _this.contentChanged;\n    };\n\n    _this.onToggleLinkDialog = function () {\n      _this.setState({\n        isShowLinkDialog: !_this.state.isShowLinkDialog\n      });\n    };\n\n    _this.onToggleImageDialog = function () {\n      _this.setState({\n        isShowImageDialog: !_this.state.isShowImageDialog\n      });\n    };\n\n    _this.onContextMenu = function (event) {\n      if (_this.tableUtils.isInTable()) {\n        event.preventDefault();\n        _this.contextMenuPosition = {\n          left: event.clientX,\n          top: event.clientY\n        };\n\n        _this.setState({\n          isShowContextMenu: !_this.state.isShowContextMenu\n        });\n      }\n    };\n\n    _this.toggleShortcutDialog = function () {\n      _this.setState({\n        isShowShortcutDialog: !_this.state.isShowShortcutDialog\n      });\n    };\n\n    _this.editor = normalizeNode(withMarkdownShortcut(withVoid(withBlock(withInline(withHistory(withReact(createEditor())))))));\n    _this.editor.editorApi = props.editorApi;\n    window.editor = _this.editor;\n    _this.editorUtils = new EditorUtils(_this.editor);\n    _this.tableUtils = new TableUtils(_this.editor);\n    _this.plugin = new Plugin(_this.editor);\n    _this.editorRef = null;\n    _this.contextMenuPosition = {};\n    _this.state = {\n      value: deserialize(props.value),\n      isShowLinkDialog: false,\n      isShowImageDialog: false,\n      isShowBigImage: false,\n      isShowContextMenu: false,\n      isShowShortcutDialog: false\n    };\n    return _this;\n  }\n\n  _createClass(SimpleEditor, [{\n    key: \"componentDidMount\",\n    value: function componentDidMount() {\n      this.props.onRef(this);\n      this.focusText();\n    }\n  }, {\n    key: \"getMarkdown\",\n    value: function getMarkdown() {\n      this.contentChanged = false;\n      return serialize(this.state.value);\n    }\n  }, {\n    key: \"getValue\",\n    value: function getValue() {\n      return this.state.value;\n    }\n  }, {\n    key: \"render\",\n    value: function render() {\n      var _this2 = this;\n\n      var _this$state = this.state,\n          value = _this$state.value,\n          isShowLinkDialog = _this$state.isShowLinkDialog,\n          isShowImageDialog = _this$state.isShowImageDialog;\n      var editor = this.editor,\n          foucsEditor = this.foucsEditor;\n      var toolbarStatus = this.editorUtils.getToolbarStatus();\n      var _this$props2 = this.props,\n          readOnly = _this$props2.readOnly,\n          t = _this$props2.t;\n      var selectionCollapsed = isRangeCollapsed(editor.selection);\n      return /*#__PURE__*/React.createElement(\"div\", {\n        className: \"seafile-editor-module seafile-simple-editor\"\n      }, /*#__PURE__*/React.createElement(Slate, {\n        editor: this.editor,\n        value: value,\n        onChange: this.onChange\n      }, /*#__PURE__*/React.createElement(\"div\", {\n        className: \"seafile-rich-editor-topbar\"\n      }, /*#__PURE__*/React.createElement(ToolBar, {\n        onToggleLinkDialog: this.onToggleLinkDialog,\n        onToggleImageDialog: this.onToggleImageDialog,\n        toolbarStatus: toolbarStatus,\n        isSimpleEditor: true,\n        isShowLinkDialog: isShowLinkDialog,\n        isShowImageDialog: isShowImageDialog\n      }), /*#__PURE__*/React.createElement(\"div\", {\n        className: 'btn-group editor-btn-group'\n      }, /*#__PURE__*/React.createElement(IconButton, {\n        isRichEditor: true,\n        text: t('Shortcut_help'),\n        id: 'helpIcon',\n        className: 'use-help-icon',\n        icon: 'iconfont icon-use-help',\n        onMouseDown: function onMouseDown(event) {\n          return _this2.toggleShortcutDialog();\n        }\n      }))), /*#__PURE__*/React.createElement(\"div\", {\n        className: \"editor-container\"\n      }, /*#__PURE__*/React.createElement(\"div\", {\n        ref: function ref(_ref) {\n          return _this2.editorRef = _ref;\n        },\n        onClick: value.length === 1 && value[0].type === 'paragraph' && Node.text(value[0].children[0]).length === 0 ? foucsEditor : null,\n        className: \"editor article\"\n      }, /*#__PURE__*/React.createElement(Editable, {\n        renderElement: function renderElement(props) {\n          return renderNode(props, editor, readOnly);\n        },\n        className: 'editor-component',\n        renderLeaf: renderLeaf,\n        onContextMenu: this.onContextMenu,\n        onCopy: function onCopy(event) {\n          _this2.plugin.onCopy(event, editor);\n        },\n        onCut: function onCut(event) {\n          return _this2.plugin.onCut(event);\n        },\n        autoFocus: true,\n        onKeyDown: this.plugin.onKeyDown,\n        decorate: decorationNode\n      })), toolbarStatus.isLinkActive && selectionCollapsed ? /*#__PURE__*/React.createElement(ModalPortal, null, /*#__PURE__*/React.createElement(TextLinkHoverMenu, {\n        onToggleLinkDialog: this.onToggleLinkDialog,\n        editorUtils: this.editorUtils\n      })) : null, this.state.isShowContextMenu && /*#__PURE__*/React.createElement(ModalPortal, null, /*#__PURE__*/React.createElement(ContextMenu, {\n        tableUtils: this.tableUtils,\n        contextMenuPosition: this.contextMenuPosition\n      })), this.state.isShowShortcutDialog && /*#__PURE__*/React.createElement(KeyboardShortcuts, {\n        userHelp: t('userHelp', {\n          returnObjects: true\n        }),\n        toggleShortcutDialog: this.toggleShortcutDialog\n      }))));\n    }\n  }]);\n\n  return SimpleEditor;\n}(React.Component);\n\nexport default withTranslation('seafile-editor')(SimpleEditor);","import _classCallCheck from \"@babel/runtime/helpers/esm/classCallCheck\";\nimport _createClass from \"@babel/runtime/helpers/esm/createClass\";\nimport _inherits from \"@babel/runtime/helpers/esm/inherits\";\nimport _createSuper from \"@babel/runtime/helpers/esm/createSuper\";\nimport React from 'react';\n\nvar ShortCut = /*#__PURE__*/function (_React$Component) {\n  _inherits(ShortCut, _React$Component);\n\n  var _super = _createSuper(ShortCut);\n\n  function ShortCut(props) {\n    var _this;\n\n    _classCallCheck(this, ShortCut);\n\n    _this = _super.call(this, props); // get platform of browser\n\n    _this.platfrom = navigator.platform.indexOf('Win') < 0 ? 'Mac' : 'Win';\n    return _this;\n  }\n\n  _createClass(ShortCut, [{\n    key: \"render\",\n    value: function render() {\n      return /*#__PURE__*/React.createElement(\"li\", {\n        className: 'help-shortcut'\n      }, /*#__PURE__*/React.createElement(\"div\", {\n        className: 'help-shortcut-left'\n      }, this.props.shortcutName), /*#__PURE__*/React.createElement(\"div\", {\n        className: 'help-shortcut-right'\n      }, /*#__PURE__*/React.createElement(ShortCutRight, {\n        platfrom: this.platform,\n        shortcuts: this.props.shortcuts\n      })));\n    }\n  }]);\n\n  return ShortCut;\n}(React.Component);\n\nvar ShortCutRight = /*#__PURE__*/function (_React$PureComponent) {\n  _inherits(ShortCutRight, _React$PureComponent);\n\n  var _super2 = _createSuper(ShortCutRight);\n\n  function ShortCutRight() {\n    _classCallCheck(this, ShortCutRight);\n\n    return _super2.apply(this, arguments);\n  }\n\n  _createClass(ShortCutRight, [{\n    key: \"render\",\n    value: function render() {\n      var _this2 = this;\n\n      return /*#__PURE__*/React.createElement(React.Fragment, null, this.props.shortcuts.map(function (shortcut) {\n        var shortcutFirKey = shortcut[0];\n        var shortcutSecnKey = shortcut[1];\n\n        if (typeof shortcut[0] === 'object') {\n          if (_this2.platfrom === 'Win') {\n            shortcutFirKey = shortcut[0][0];\n          } else {\n            shortcutFirKey = shortcut[0][1];\n          }\n        }\n\n        return /*#__PURE__*/React.createElement(\"div\", {\n          className: 'help-shortcut-right-container',\n          key: 'help' + shortcut[0]\n        }, shortcutFirKey ? /*#__PURE__*/React.createElement(\"div\", {\n          className: 'key shortcut-first'\n        }, shortcutFirKey) : null, shortcutSecnKey ? /*#__PURE__*/React.createElement(\"div\", {\n          className: 'key shortcut-second'\n        }, shortcutSecnKey) : null);\n      }));\n    }\n  }]);\n\n  return ShortCutRight;\n}(React.PureComponent);\n\nvar HelpShortcutList = /*#__PURE__*/function (_React$PureComponent2) {\n  _inherits(HelpShortcutList, _React$PureComponent2);\n\n  var _super3 = _createSuper(HelpShortcutList);\n\n  function HelpShortcutList(props) {\n    var _this3;\n\n    _classCallCheck(this, HelpShortcutList);\n\n    _this3 = _super3.call(this, props);\n    _this3.shortcutData = [{\n      'Make_list': [['*/-', 'space']],\n      'Make_ordered_list': [['1.', 'space']],\n      'Insert_new_item': [['Enter']],\n      'Insert_child_in_item': [['Shift', 'Enter']],\n      'Increase_depth': [['Tab']]\n    }, {\n      'Heading_1': [['#', 'space']],\n      'Heading_2': [['##', 'space']],\n      'Heading_3': [['###', 'space']],\n      'Heading_4': [['####', 'space']],\n      'Heading_5': [['#####', 'space']],\n      'Heading_6': [['######', 'space']]\n    }, {\n      'Make_code_block': [['```']],\n      'Insert_new_line': [['Enter']],\n      'Escape_code_block': [[['Ctrl', 'Cmd'], 'Enter']],\n      'Insert_indent': [['Tab']]\n    }, {\n      'Make_Block_quote': [['>', 'space']],\n      'Escape_Block_quote': [['Enter']]\n    }, {\n      'Insert_Table_Row': [['Enter']],\n      'Escape_table': [[['Ctrl', 'Cmd'], 'Enter']]\n    }, {\n      'Insert_Formula': [[['Ctrl', 'Cmd'], '$']]\n    }, {\n      'Bold': [['**bold** / __bold__', 'space']],\n      'Italic': [['*italic* / _italic_', 'space']],\n      'Italic_Bold': [['***italic*** / ___italic___', 'space']],\n      'Inline_code': [['`code`', 'space']]\n    }, {\n      'Save_file': [[['Ctrl', 'Cmd'], 's']]\n    }, {\n      'Paste_screen_shot': [[['Ctrl', 'Cmd'], 'v']],\n      'Drag_image_from_anywhere_to_upload_it': []\n    }];\n    return _this3;\n  }\n\n  _createClass(HelpShortcutList, [{\n    key: \"render\",\n    value: function render() {\n      var title = this.props.data.shortcutType;\n      var dataList = this.props.data.shortcutData;\n      var liArr = [];\n\n      for (var prop in dataList) {\n        var shortcutKeyArr = this.shortcutData[this.props.index][prop];\n        liArr.push( /*#__PURE__*/React.createElement(ShortCut, {\n          key: 'help ' + prop,\n          shortcutName: dataList[prop],\n          shortcuts: shortcutKeyArr\n        }));\n      }\n\n      return /*#__PURE__*/React.createElement(\"div\", {\n        className: 'help-content-container'\n      }, /*#__PURE__*/React.createElement(\"h5\", {\n        className: 'help-shortcut-type'\n      }, title), /*#__PURE__*/React.createElement(\"ul\", {\n        className: 'help-shortcut-list'\n      }, liArr));\n    }\n  }]);\n\n  return HelpShortcutList;\n}(React.PureComponent);\n\nvar UserHelpDialog = /*#__PURE__*/function (_React$PureComponent3) {\n  _inherits(UserHelpDialog, _React$PureComponent3);\n\n  var _super4 = _createSuper(UserHelpDialog);\n\n  function UserHelpDialog() {\n    _classCallCheck(this, UserHelpDialog);\n\n    return _super4.apply(this, arguments);\n  }\n\n  _createClass(UserHelpDialog, [{\n    key: \"render\",\n    value: function render() {\n      return /*#__PURE__*/React.createElement(\"div\", {\n        className: 'seafile-editor-help align-self-end'\n      }, /*#__PURE__*/React.createElement(\"div\", {\n        className: 'help-header d-flex'\n      }, /*#__PURE__*/React.createElement(\"div\", {\n        className: 'help-title'\n      }, this.props.userHelp.title), /*#__PURE__*/React.createElement(\"div\", {\n        className: 'help-close',\n        onClick: this.props.hideHelpDialog\n      }, /*#__PURE__*/React.createElement(\"i\", {\n        className: 'iconfont icon-times-circle'\n      }))), /*#__PURE__*/React.createElement(\"div\", {\n        className: 'help-content'\n      }, this.props.userHelp.userHelpData.map(function (item, index) {\n        return /*#__PURE__*/React.createElement(HelpShortcutList, {\n          key: 'help-list' + index,\n          index: index,\n          data: item\n        });\n      })));\n    }\n  }]);\n\n  return UserHelpDialog;\n}(React.PureComponent);\n\nexport default UserHelpDialog;","import _classCallCheck from \"@babel/runtime/helpers/esm/classCallCheck\";\nimport _createClass from \"@babel/runtime/helpers/esm/createClass\";\nimport _inherits from \"@babel/runtime/helpers/esm/inherits\";\nimport _createSuper from \"@babel/runtime/helpers/esm/createSuper\";\nimport React from 'react';\nimport { Button } from 'reactstrap';\nimport { processor } from '../utils/seafile-markdown2html';\n\nvar CommentDialog = /*#__PURE__*/function (_React$Component) {\n  _inherits(CommentDialog, _React$Component);\n\n  var _super = _createSuper(CommentDialog);\n\n  function CommentDialog(props) {\n    var _this;\n\n    _classCallCheck(this, CommentDialog);\n\n    _this = _super.call(this, props);\n\n    _this.handleCommentChange = function (event) {\n      var comment = event.target.value;\n\n      _this.setState({\n        comment: comment\n      });\n    };\n\n    _this.submitComment = function () {\n      var comment = _this.state.comment.trim();\n\n      if (comment.length > 0 && _this.props.quote.length > 0) {\n        var detail = {\n          quote: _this.props.quote,\n          position: _this.props.commentPosition\n        };\n        var detailJSON = JSON.stringify(detail);\n\n        _this.props.editorApi.postComment(comment, detailJSON).then(function (res) {\n          _this.props.onCommentAdded();\n        });\n      }\n    };\n\n    _this.setQuoteText = function (mdQuote) {\n      processor.process(mdQuote).then(function (result) {\n        var quote = String(result);\n\n        _this.setState({\n          quote: quote\n        });\n      });\n    };\n\n    _this.state = {\n      comment: '',\n      quote: ''\n    };\n    return _this;\n  }\n\n  _createClass(CommentDialog, [{\n    key: \"componentDidMount\",\n    value: function componentDidMount() {\n      this.setQuoteText(this.props.quote);\n    }\n  }, {\n    key: \"componentWillReceiveProps\",\n    value: function componentWillReceiveProps(nextProps) {\n      if (this.props.quote !== nextProps.quote) {\n        this.setQuoteText(nextProps.quote);\n      }\n    }\n  }, {\n    key: \"render\",\n    value: function render() {\n      return /*#__PURE__*/React.createElement(\"div\", {\n        className: \"comment-dialog\"\n      }, /*#__PURE__*/React.createElement(\"div\", null, this.props.editorApi.name), /*#__PURE__*/React.createElement(\"blockquote\", {\n        className: \"comment-dialog-quote\"\n      }, /*#__PURE__*/React.createElement(\"div\", {\n        dangerouslySetInnerHTML: {\n          __html: this.state.quote\n        }\n      })), /*#__PURE__*/React.createElement(\"textarea\", {\n        value: this.state.comment,\n        onChange: this.handleCommentChange\n      }), /*#__PURE__*/React.createElement(\"div\", {\n        className: \"button-group\"\n      }, /*#__PURE__*/React.createElement(Button, {\n        size: \"sm\",\n        color: \"primary\",\n        onClick: this.submitComment\n      }, this.props.t('submit')), /*#__PURE__*/React.createElement(Button, {\n        size: \"sm\",\n        color: \"secondary\",\n        onClick: this.props.toggleCommentDialog\n      }, this.props.t('cancel'))), /*#__PURE__*/React.createElement(\"span\", {\n        className: \"comment-dialog-triangle\"\n      }));\n    }\n  }]);\n\n  return CommentDialog;\n}(React.Component);\n\nexport default CommentDialog;","import _classCallCheck from \"@babel/runtime/helpers/esm/classCallCheck\";\nimport _createClass from \"@babel/runtime/helpers/esm/createClass\";\nimport _inherits from \"@babel/runtime/helpers/esm/inherits\";\nimport _createSuper from \"@babel/runtime/helpers/esm/createSuper\";\nimport React from 'react';\nimport { Tooltip } from 'reactstrap';\nimport '../css/richeditor/participants-list.css';\n\nvar ParticipantsList = /*#__PURE__*/function (_React$Component) {\n  _inherits(ParticipantsList, _React$Component);\n\n  var _super = _createSuper(ParticipantsList);\n\n  function ParticipantsList(props) {\n    var _this;\n\n    _classCallCheck(this, ParticipantsList);\n\n    _this = _super.call(this, props);\n\n    _this.handleClick = function () {\n      _this.props.openDialogs && _this.props.openDialogs('add-participant');\n    };\n\n    _this.tooltipToggle = function () {\n      _this.setState({\n        tooltipOpen: !_this.state.tooltipOpen\n      });\n    };\n\n    _this.state = {\n      tooltipOpen: false\n    };\n    return _this;\n  }\n\n  _createClass(ParticipantsList, [{\n    key: \"render\",\n    value: function render() {\n      var participants = this.props.participants;\n      return /*#__PURE__*/React.createElement(\"div\", {\n        className: \"participants mb-2 position-relative\"\n      }, participants.map(function (item, index) {\n        return /*#__PURE__*/React.createElement(Participant, {\n          item: item,\n          index: index,\n          key: index\n        });\n      }), /*#__PURE__*/React.createElement(\"span\", {\n        className: \"add-participants\",\n        onClick: this.handleClick,\n        id: \"add-participant-icon\"\n      }, /*#__PURE__*/React.createElement(\"i\", {\n        className: \"iconfont icon-plus-circle\"\n      })), /*#__PURE__*/React.createElement(Tooltip, {\n        toggle: this.tooltipToggle,\n        delay: {\n          show: 0,\n          hide: 0\n        },\n        target: \"add-participant-icon\",\n        placement: \"bottom\",\n        isOpen: this.state.tooltipOpen\n      }, this.props.t('Add_participants')));\n    }\n  }]);\n\n  return ParticipantsList;\n}(React.Component);\n\nvar Participant = /*#__PURE__*/function (_React$Component2) {\n  _inherits(Participant, _React$Component2);\n\n  var _super2 = _createSuper(Participant);\n\n  function Participant(props) {\n    var _this2;\n\n    _classCallCheck(this, Participant);\n\n    _this2 = _super2.call(this, props);\n\n    _this2.toggleAvatarTooltip = function () {\n      _this2.setState({\n        showAvatarTooltip: !_this2.state.showAvatarTooltip\n      });\n    };\n\n    _this2.state = {\n      showAvatarTooltip: false\n    };\n    return _this2;\n  }\n\n  _createClass(Participant, [{\n    key: \"render\",\n    value: function render() {\n      var _this$props = this.props,\n          item = _this$props.item,\n          index = _this$props.index;\n      var target = 'participant-avatar-' + index;\n      return /*#__PURE__*/React.createElement(\"span\", {\n        className: \"participant-avatar\"\n      }, /*#__PURE__*/React.createElement(\"img\", {\n        src: item.avatar_url,\n        className: \"avatar\",\n        id: target,\n        alt: \"avatar\",\n        key: index\n      }), /*#__PURE__*/React.createElement(Tooltip, {\n        toggle: this.toggleAvatarTooltip,\n        delay: {\n          show: 0,\n          hide: 0\n        },\n        target: target,\n        placement: \"bottom\",\n        isOpen: this.state.showAvatarTooltip\n      }, item.name));\n    }\n  }]);\n\n  return Participant;\n}(React.Component);\n\nexport default ParticipantsList;","var defaultStyle = {\n  control: {\n    backgroundColor: '#fff',\n    fontSize: 14,\n    fontWeight: 'normal'\n  },\n  highlighter: {\n    overflow: 'hidden'\n  },\n  input: {\n    margin: 0\n  },\n  '&singleLine': {\n    control: {\n      display: 'inline-block',\n      width: 130\n    },\n    highlighter: {\n      padding: 1,\n      border: '2px inset transparent'\n    },\n    input: {\n      padding: 1,\n      border: '2px inset'\n    }\n  },\n  '&multiLine': {\n    control: {},\n    highlighter: {\n      padding: 9\n    },\n    input: {\n      padding: '8px 6px',\n      minHeight: 90,\n      height: 90,\n      border: '1px solid #e6e6dd',\n      borderRadius: '5px',\n      overfflowY: 'auto',\n      '&focused': {\n        backgroundColor: '#cee4e5',\n        outlineOffset: '-2px',\n        outlineColor: '-webkit-focus-ring-color',\n        outlineStyle: 'auto',\n        outlineWidth: '5px'\n      }\n    }\n  },\n  suggestions: {\n    list: {\n      backgroundColor: 'white',\n      border: '1px solid rgba(0,0,0,0.15)',\n      fontSize: 14,\n      maxHeight: 200,\n      overflow: 'auto',\n      position: 'absolute',\n      bottom: 14,\n      width: '150px'\n    },\n    item: {\n      width: 'auto',\n      padding: '5px 15px',\n      overflowX: 'auto',\n      borderBottom: '1px solid rgba(0,0,0,0.15)',\n      '&focused': {\n        backgroundColor: '#f19654',\n        color: '#fff',\n        fontWeight: '400'\n      }\n    }\n  }\n};\nexport { defaultStyle };","import _classCallCheck from \"@babel/runtime/helpers/esm/classCallCheck\";\nimport _createClass from \"@babel/runtime/helpers/esm/createClass\";\nimport _assertThisInitialized from \"@babel/runtime/helpers/esm/assertThisInitialized\";\nimport _inherits from \"@babel/runtime/helpers/esm/inherits\";\nimport _createSuper from \"@babel/runtime/helpers/esm/createSuper\";\nimport React from 'react';\nimport moment from 'moment';\nimport { processor } from '../utils/seafile-markdown2html';\nimport { Button, Dropdown, DropdownToggle, DropdownMenu, DropdownItem } from 'reactstrap';\nimport ParticipantsList from './participants-list';\nimport toaster from '../components/toast';\nimport { MentionsInput, Mention } from 'react-mentions';\nimport { defaultStyle } from '../css/react-mentions-default-style';\nimport '../css/richeditor/comments-list.css';\n\nvar CommentPanel = /*#__PURE__*/function (_React$Component) {\n  _inherits(CommentPanel, _React$Component);\n\n  var _super = _createSuper(CommentPanel);\n\n  function CommentPanel(props) {\n    var _this;\n\n    _classCallCheck(this, CommentPanel);\n\n    _this = _super.call(this, props);\n\n    _this.toggleResolvedComment = function () {\n      _this.setState({\n        showResolvedComment: !_this.state.showResolvedComment\n      });\n    };\n\n    _this.listComments = function (isScroll) {\n      _this.props.editorApi.listComments().then(function (res) {\n        _this.setState({\n          commentsList: res.data.comments\n        });\n\n        if (isScroll) {\n          var that = _assertThisInitialized(_this);\n\n          setTimeout(function () {\n            that.refs.commentsList.scrollTo(0, 10000);\n          }, 100);\n        }\n      });\n    };\n\n    _this.handleCommentChange = function (event) {\n      _this.setState({\n        comment: event.target.value\n      });\n    };\n\n    _this.resolveComment = function (event) {\n      _this.props.editorApi.updateComment(event.target.id, 'true').then(function () {\n        _this.listComments();\n      });\n    };\n\n    _this.deleteComment = function (event) {\n      _this.props.editorApi.deleteComment(event.target.id).then(function () {\n        _this.listComments();\n      });\n    };\n\n    _this.editComment = function (commentID, newComment) {\n      _this.props.editorApi.updateComment(commentID, null, null, newComment).then(function (res) {\n        _this.listComments();\n      });\n    };\n\n    _this.listRepoRelatedUsers = function () {\n      if (!window.showParticipants) return;\n\n      _this.props.editorApi.listRepoRelatedUsers().then(function (res) {\n        var users = res.data.user_list.map(function (item) {\n          return {\n            id: item.email,\n            display: item.name\n          };\n        });\n\n        _this.setState({\n          relatedUsers: users\n        });\n      });\n    };\n\n    _this.addComment = function () {\n      if (!_this.state.comment.trim()) return;\n\n      _this.props.editorApi.postComment(_this.state.comment.trim()).then(function () {\n        _this.listComments(true);\n      }).catch(function (err) {\n        if (err.response.data) {\n          toaster.danger(err.response.data['error_msg'], {\n            duration: 3\n          });\n        }\n      });\n\n      _this.setState({\n        comment: ''\n      });\n    };\n\n    _this.onSubmit = function () {\n      if (window.showParticipants) {\n        _this.addParticipant(_this.props.editorApi.userName);\n      }\n\n      if (_this.toBeAddedParticipant.length === 0 || !window.showParticipants) {\n        _this.addComment();\n      } else {\n        _this.props.editorApi.addFileParticipants(_this.toBeAddedParticipant).then(function (res) {\n          _this.toBeAddedParticipant = [];\n\n          _this.addComment();\n\n          _this.props.onParticipantsChange();\n        }).catch(function (err) {\n          if (err.response.data) {\n            toaster.danger(err.response.data['error_msg'], {\n              duration: 3\n            });\n          }\n        });\n      }\n    };\n\n    _this.checkParticipant = function (email) {\n      return _this.props.participants.map(function (participant) {\n        return participant.email;\n      }).includes(email);\n    };\n\n    _this.addParticipant = function (email) {\n      if (_this.checkParticipant(email)) return;\n\n      _this.toBeAddedParticipant.push(email);\n    };\n\n    _this.renderUserSuggestion = function (entry, search, highlightedDisplay, index, focused) {\n      return /*#__PURE__*/React.createElement(\"div\", {\n        className: \"user \".concat(focused ? 'focused' : '')\n      }, highlightedDisplay);\n    };\n\n    _this.state = {\n      commentsList: [],\n      showResolvedComment: true,\n      comment: '',\n      relatedUsers: null\n    };\n    _this.toBeAddedParticipant = [];\n    return _this;\n  }\n\n  _createClass(CommentPanel, [{\n    key: \"componentDidMount\",\n    value: function componentDidMount() {\n      this.listComments();\n      this.listRepoRelatedUsers();\n    }\n  }, {\n    key: \"componentWillReceiveProps\",\n    value: function componentWillReceiveProps(nextProps) {\n      if (this.props.relistComment !== nextProps.relistComment) this.listComments(true);\n    }\n  }, {\n    key: \"render\",\n    value: function render() {\n      var _this2 = this;\n\n      var t = this.props.t;\n      var participants = this.props.participants;\n      return /*#__PURE__*/React.createElement(\"div\", {\n        className: \"seafile-comment\"\n      }, /*#__PURE__*/React.createElement(\"div\", {\n        className: \"seafile-comment-toggle-resolved\"\n      }, /*#__PURE__*/React.createElement(\"div\", {\n        className: 'seafile-comment-title-text'\n      }, t('Show_resolved_comments')), /*#__PURE__*/React.createElement(\"div\", {\n        className: 'seafile-comment-title-toggle d-flex'\n      }, /*#__PURE__*/React.createElement(\"label\", {\n        className: \"custom-switch\",\n        id: \"toggle-resolved-comments\"\n      }, /*#__PURE__*/React.createElement(\"input\", {\n        type: \"checkbox\",\n        name: \"option\",\n        className: \"custom-switch-input\",\n        onChange: this.toggleResolvedComment,\n        checked: this.state.showResolvedComment && 'checked'\n      }), /*#__PURE__*/React.createElement(\"span\", {\n        className: \"custom-switch-indicator\"\n      })))), /*#__PURE__*/React.createElement(\"ul\", {\n        className: window.showParticipants ? 'seafile-comment-list show-participants' : 'seafile-comment-list',\n        ref: \"commentsList\"\n      }, this.state.commentsList.length > 0 && this.state.commentsList.map(function (item) {\n        var index = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n        var arr = arguments.length > 2 ? arguments[2] : undefined;\n        var oldTime = new Date(item.created_at).getTime();\n        var time = moment(oldTime).format('YYYY-MM-DD HH:mm');\n        return /*#__PURE__*/React.createElement(React.Fragment, {\n          key: item.id\n        }, /*#__PURE__*/React.createElement(CommentItem, {\n          item: item,\n          time: time,\n          t: _this2.props.t,\n          deleteComment: _this2.deleteComment,\n          resolveComment: _this2.resolveComment,\n          editComment: _this2.editComment,\n          showResolvedComment: _this2.state.showResolvedComment,\n          editorApi: _this2.props.editorApi,\n          scrollToQuote: _this2.props.scrollToQuote\n        }));\n      }), this.state.commentsList.length === 0 && /*#__PURE__*/React.createElement(\"li\", {\n        className: \"comment-vacant\"\n      }, t('no_comment_yet'))), /*#__PURE__*/React.createElement(\"div\", {\n        className: \"seafile-comment-footer\"\n      }, participants && window.showParticipants && /*#__PURE__*/React.createElement(ParticipantsList, {\n        openDialogs: this.props.openDialogs,\n        participants: participants,\n        t: this.props.t\n      }), window.showParticipants ? /*#__PURE__*/React.createElement(MentionsInput, {\n        value: this.state.comment,\n        onChange: this.handleCommentChange,\n        placeholder: t('add_a_comment'),\n        style: defaultStyle\n      }, /*#__PURE__*/React.createElement(Mention, {\n        trigger: \"@\",\n        displayTransform: function displayTransform(username, display) {\n          return \"@\".concat(display);\n        },\n        data: this.state.relatedUsers,\n        renderSuggestion: this.renderUserSuggestion,\n        onAdd: function onAdd(id, display) {\n          _this2.addParticipant(id);\n        },\n        appendSpaceOnAdd: true\n      })) : /*#__PURE__*/React.createElement(\"textarea\", {\n        className: \"add-comment-input\",\n        onChange: this.handleCommentChange,\n        value: this.state.comment,\n        placeholder: t('add_a_comment'),\n        clos: \"100\",\n        rows: \"3\",\n        warp: \"virtual\"\n      }), /*#__PURE__*/React.createElement(Button, {\n        className: \"submit-comment\",\n        color: \"primary\",\n        size: \"sm\",\n        onClick: this.onSubmit\n      }, t('submit'))));\n    }\n  }]);\n\n  return CommentPanel;\n}(React.Component);\n\nvar CommentItem = /*#__PURE__*/function (_React$Component2) {\n  _inherits(CommentItem, _React$Component2);\n\n  var _super2 = _createSuper(CommentItem);\n\n  function CommentItem(props) {\n    var _this3;\n\n    _classCallCheck(this, CommentItem);\n\n    _this3 = _super2.call(this, props);\n\n    _this3.toggleDropDownMenu = function () {\n      _this3.setState({\n        dropdownOpen: !_this3.state.dropdownOpen\n      });\n    };\n\n    _this3.convertComment = function (item) {\n      processor.process(item.comment).then(function (result) {\n        var html = String(result);\n\n        _this3.setState({\n          html: html\n        });\n      });\n\n      if (item.detail) {\n        var detail = JSON.parse(item.detail);\n        processor.process(detail.quote).then(function (result) {\n          var quote = String(result);\n\n          _this3.setState({\n            quote: quote,\n            position: detail.position\n          });\n        });\n      }\n    };\n\n    _this3.toggleEditComment = function () {\n      _this3.setState({\n        editable: !_this3.state.editable\n      });\n    };\n\n    _this3.updateComment = function (event) {\n      var newComment = _this3.state.newComment;\n\n      if (_this3.props.item.comment !== newComment) {\n        _this3.props.editComment(event.target.id, newComment);\n      }\n\n      _this3.toggleEditComment();\n    };\n\n    _this3.handleCommentChange = function (event) {\n      _this3.setState({\n        newComment: event.target.value\n      });\n    };\n\n    _this3.state = {\n      dropdownOpen: false,\n      html: '',\n      newComment: _this3.props.item.comment,\n      editable: false,\n      quote: '',\n      position: null\n    };\n    return _this3;\n  }\n\n  _createClass(CommentItem, [{\n    key: \"componentWillMount\",\n    value: function componentWillMount() {\n      this.convertComment(this.props.item);\n    }\n  }, {\n    key: \"componentWillReceiveProps\",\n    value: function componentWillReceiveProps(nextProps) {\n      this.convertComment(nextProps.item);\n    }\n  }, {\n    key: \"render\",\n    value: function render() {\n      var _this$props = this.props,\n          item = _this$props.item,\n          t = _this$props.t,\n          editorApi = _this$props.editorApi;\n\n      if (item.resolved && !this.props.showResolvedComment) {\n        return null;\n      }\n\n      if (this.state.editable) {\n        return /*#__PURE__*/React.createElement(\"li\", {\n          className: \"seafile-comment-item\",\n          id: item.id\n        }, /*#__PURE__*/React.createElement(\"div\", {\n          className: \"seafile-comment-info\"\n        }, /*#__PURE__*/React.createElement(\"img\", {\n          className: \"avatar\",\n          src: item.avatar_url,\n          alt: \"\"\n        }), /*#__PURE__*/React.createElement(\"div\", {\n          className: \"reviewer-info\"\n        }, /*#__PURE__*/React.createElement(\"div\", {\n          className: \"reviewer-name ellipsis\"\n        }, item.user_name), /*#__PURE__*/React.createElement(\"div\", {\n          className: \"review-time\"\n        }, this.props.time))), /*#__PURE__*/React.createElement(\"div\", {\n          className: \"seafile-edit-comment\"\n        }, /*#__PURE__*/React.createElement(\"textarea\", {\n          className: \"edit-comment-input\",\n          value: this.state.newComment,\n          onChange: this.handleCommentChange,\n          clos: \"100\",\n          rows: \"3\",\n          warp: \"virtual\"\n        }), /*#__PURE__*/React.createElement(Button, {\n          className: \"comment-btn\",\n          color: \"primary\",\n          size: \"sm\",\n          onClick: this.updateComment,\n          id: item.id\n        }, t('Update')), ' ', /*#__PURE__*/React.createElement(Button, {\n          className: \"comment-btn\",\n          color: \"secondary\",\n          size: \"sm\",\n          onClick: this.toggleEditComment\n        }, t('cancel'))));\n      }\n\n      return /*#__PURE__*/React.createElement(\"li\", {\n        className: item.resolved ? 'seafile-comment-item seafile-comment-item-resolved' : 'seafile-comment-item',\n        id: item.id\n      }, /*#__PURE__*/React.createElement(\"div\", {\n        className: \"seafile-comment-info\"\n      }, /*#__PURE__*/React.createElement(\"img\", {\n        className: \"avatar\",\n        src: item.avatar_url,\n        alt: \"\"\n      }), /*#__PURE__*/React.createElement(\"div\", {\n        className: \"reviewer-info\"\n      }, /*#__PURE__*/React.createElement(\"div\", {\n        className: \"reviewer-name ellipsis\"\n      }, item.user_name), /*#__PURE__*/React.createElement(\"div\", {\n        className: \"review-time\"\n      }, this.props.time)), /*#__PURE__*/React.createElement(Dropdown, {\n        isOpen: this.state.dropdownOpen,\n        size: \"sm\",\n        className: \"seafile-comment-dropdown\",\n        toggle: this.toggleDropDownMenu\n      }, /*#__PURE__*/React.createElement(DropdownToggle, {\n        className: \"seafile-comment-dropdown-btn\"\n      }, /*#__PURE__*/React.createElement(\"i\", {\n        className: \"iconfont icon-ellipsis-v\"\n      })), /*#__PURE__*/React.createElement(DropdownMenu, null, item.user_email === editorApi.userName && /*#__PURE__*/React.createElement(DropdownItem, {\n        onClick: this.props.deleteComment,\n        className: \"delete-comment\",\n        id: item.id\n      }, t('delete')), item.user_email === editorApi.userName && /*#__PURE__*/React.createElement(DropdownItem, {\n        onClick: this.toggleEditComment,\n        className: \"edit-comment\",\n        id: item.id\n      }, t('edit')), !item.resolved && /*#__PURE__*/React.createElement(DropdownItem, {\n        onClick: this.props.resolveComment,\n        className: \"seafile-comment-resolved\",\n        id: item.id\n      }, t('Mark_as_Resolved'))))), item.detail && /*#__PURE__*/React.createElement(\"blockquote\", {\n        className: \"seafile-comment-content\"\n      }, /*#__PURE__*/React.createElement(\"div\", {\n        onClick: this.props.scrollToQuote.bind(this, this.state.position),\n        dangerouslySetInnerHTML: {\n          __html: this.state.quote\n        }\n      })), /*#__PURE__*/React.createElement(\"div\", {\n        className: \"seafile-comment-content\",\n        dangerouslySetInnerHTML: {\n          __html: this.state.html\n        }\n      }));\n    }\n  }]);\n\n  return CommentItem;\n}(React.Component);\n\nexport default CommentPanel;","import _classCallCheck from \"@babel/runtime/helpers/esm/classCallCheck\";\nimport _createClass from \"@babel/runtime/helpers/esm/createClass\";\nimport _inherits from \"@babel/runtime/helpers/esm/inherits\";\nimport _createSuper from \"@babel/runtime/helpers/esm/createSuper\";\nimport React from 'react';\nimport moment from 'moment';\nimport ParticipantsList from './participants-list';\nimport '../css/richeditor/detail-list-view.css';\n\nvar DetailListView = /*#__PURE__*/function (_React$Component) {\n  _inherits(DetailListView, _React$Component);\n\n  var _super = _createSuper(DetailListView);\n\n  function DetailListView() {\n    var _this;\n\n    _classCallCheck(this, DetailListView);\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 = _super.call.apply(_super, [this].concat(args));\n\n    _this.onEditFileTagToggle = function () {\n      _this.props.openDialogs && _this.props.openDialogs('file_tags');\n    };\n\n    _this.onListRelatedFileToggle = function () {\n      _this.props.openDialogs && _this.props.openDialogs('related_files');\n    };\n\n    _this.bytesToSize = function (bytes) {\n      if (bytes < 0) return '--';\n      var sizes = ['bytes', 'KB', 'MB', 'GB', 'TB', 'PB'];\n\n      if (bytes === 0) {\n        return bytes + ' ' + sizes[0];\n      }\n\n      var i = parseInt(Math.floor(Math.log(bytes) / Math.log(1000)), 10);\n\n      if (i === 0) {\n        return bytes + ' ' + sizes[i];\n      } else {\n        return (bytes / Math.pow(1000, i)).toFixed(1) + ' ' + sizes[i];\n      }\n    };\n\n    return _this;\n  }\n\n  _createClass(DetailListView, [{\n    key: \"render\",\n    value: function render() {\n      var _this$props = this.props,\n          fileTagList = _this$props.fileTagList,\n          relatedFiles = _this$props.relatedFiles,\n          fileInfo = _this$props.fileInfo;\n      var _this$props$editorApi = this.props.editorApi,\n          filePath = _this$props$editorApi.filePath,\n          serviceUrl = _this$props$editorApi.serviceUrl;\n      return /*#__PURE__*/React.createElement(\"div\", {\n        className: \"dirent-table-container\"\n      }, /*#__PURE__*/React.createElement(\"table\", {\n        className: \"table-thead-hidden\"\n      }, /*#__PURE__*/React.createElement(\"thead\", null, /*#__PURE__*/React.createElement(\"tr\", null, /*#__PURE__*/React.createElement(\"th\", {\n        width: \"40%\"\n      }), /*#__PURE__*/React.createElement(\"th\", {\n        width: \"60%\"\n      }))), /*#__PURE__*/React.createElement(\"tbody\", null, /*#__PURE__*/React.createElement(\"tr\", null, /*#__PURE__*/React.createElement(\"th\", null, this.props.t('Size')), /*#__PURE__*/React.createElement(\"td\", null, this.bytesToSize(fileInfo.size))), /*#__PURE__*/React.createElement(\"tr\", null, /*#__PURE__*/React.createElement(\"th\", null, this.props.t('Location')), /*#__PURE__*/React.createElement(\"td\", null, filePath)), /*#__PURE__*/React.createElement(\"tr\", null, /*#__PURE__*/React.createElement(\"th\", null, this.props.t('Last_Update')), /*#__PURE__*/React.createElement(\"td\", null, moment(fileInfo.last_modified).fromNow())), /*#__PURE__*/React.createElement(\"tr\", {\n        className: \"file-tag-container\"\n      }, /*#__PURE__*/React.createElement(\"th\", null, this.props.t('Tags')), /*#__PURE__*/React.createElement(\"td\", null, fileTagList.length > 0 && /*#__PURE__*/React.createElement(\"ul\", {\n        className: \"file-tag-list\"\n      }, fileTagList.map(function (fileTag) {\n        return /*#__PURE__*/React.createElement(\"li\", {\n          key: fileTag.id,\n          className: \"file-tag-item\"\n        }, /*#__PURE__*/React.createElement(\"span\", {\n          className: \"file-tag\",\n          style: {\n            backgroundColor: fileTag.tag_color\n          }\n        }), /*#__PURE__*/React.createElement(\"span\", {\n          className: \"tag-name\",\n          title: fileTag.tag_name\n        }, fileTag.tag_name));\n      })), /*#__PURE__*/React.createElement(\"i\", {\n        className: \"iconfont icon-pencil attr-action-icon\",\n        onClick: this.onEditFileTagToggle\n      }))), /*#__PURE__*/React.createElement(\"tr\", {\n        className: \"file-related-files\"\n      }, /*#__PURE__*/React.createElement(\"th\", null, this.props.t('Related_Files')), /*#__PURE__*/React.createElement(\"td\", null, relatedFiles.length > 0 && /*#__PURE__*/React.createElement(\"ul\", null, relatedFiles.map(function (relatedFile, index) {\n        var href = serviceUrl + '/lib/' + relatedFile.repo_id + '/file' + encodeURIComponent(relatedFile.path);\n        return /*#__PURE__*/React.createElement(\"li\", {\n          key: index\n        }, /*#__PURE__*/React.createElement(\"a\", {\n          href: href,\n          rel: \"noopener noreferrer\",\n          target: \"_blank\"\n        }, relatedFile.name));\n      })), /*#__PURE__*/React.createElement(\"i\", {\n        className: \"iconfont icon-pencil attr-action-icon\",\n        onClick: this.onListRelatedFileToggle\n      }))), this.props.participants && window.showParticipants && /*#__PURE__*/React.createElement(\"tr\", {\n        className: \"file-participants\"\n      }, /*#__PURE__*/React.createElement(\"th\", null, this.props.t('Participants')), /*#__PURE__*/React.createElement(\"td\", null, /*#__PURE__*/React.createElement(ParticipantsList, {\n        openDialogs: this.props.openDialogs,\n        participants: this.props.participants,\n        t: this.props.t\n      }))))));\n    }\n  }]);\n\n  return DetailListView;\n}(React.Component);\n\nexport default DetailListView;","import _classCallCheck from \"@babel/runtime/helpers/esm/classCallCheck\";\nimport _createClass from \"@babel/runtime/helpers/esm/createClass\";\nimport _inherits from \"@babel/runtime/helpers/esm/inherits\";\nimport _createSuper from \"@babel/runtime/helpers/esm/createSuper\";\n\n/* eslint-disable jsx-a11y/anchor-is-valid */\nimport React from 'react';\nimport OutlineView from './outline';\nimport CommentPanel from './comment-panel';\nimport DetailListView from './detail-list-view';\n\nvar SidePanel = /*#__PURE__*/function (_React$PureComponent) {\n  _inherits(SidePanel, _React$PureComponent);\n\n  var _super = _createSuper(SidePanel);\n\n  function SidePanel() {\n    var _this;\n\n    _classCallCheck(this, SidePanel);\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 = _super.call.apply(_super, [this].concat(args));\n    _this.state = {\n      navItem: 'outline'\n    };\n\n    _this.onOutlineClick = function (event) {\n      event.preventDefault();\n\n      _this.props.toggleCommentBtn(false);\n\n      _this.setState({\n        navItem: 'outline'\n      });\n    };\n\n    _this.onMarkdownHintClick = function (event) {\n      event.preventDefault();\n\n      _this.props.toggleCommentBtn(false);\n\n      _this.setState({\n        navItem: 'markdownHint'\n      });\n    };\n\n    _this.onDetailClick = function (event) {\n      event.preventDefault();\n\n      _this.props.toggleCommentBtn(false);\n\n      _this.setState({\n        navItem: 'detail'\n      });\n    };\n\n    _this.onCommentsPanelClick = function (event) {\n      event.preventDefault();\n\n      _this.props.toggleCommentBtn(true);\n\n      _this.setState({\n        navItem: 'commentsPanel'\n      });\n    };\n\n    _this.openMarkdownHint = function () {\n      _this.setState({\n        navItem: 'markdownHint'\n      });\n    };\n\n    return _this;\n  }\n\n  _createClass(SidePanel, [{\n    key: \"componentDidMount\",\n    value: function componentDidMount() {\n      window.openMarkdownHint = this.openMarkdownHint;\n    }\n  }, {\n    key: \"componentWillReceiveProps\",\n    value: function componentWillReceiveProps(nextProps) {\n      if (nextProps.issues !== this.props.issues) {\n        if (nextProps.issues.issue_list.length > 0) {\n          this.setState({\n            navItem: 'markdownHint'\n          });\n        }\n      }\n    }\n  }, {\n    key: \"componentWillUnmount\",\n    value: function componentWillUnmount() {\n      window.openMarkdownHint = null;\n    }\n  }, {\n    key: \"render\",\n    value: function render() {\n      var outlineActive = ''; // var markdownHint = '';\n\n      var commentsPanel = '';\n      var detailList = '';\n\n      if (this.state.navItem === 'outline') {\n        outlineActive = 'active';\n      } else if (this.state.navItem === 'commentsPanel') {\n        commentsPanel = 'active';\n      } else if (this.state.navItem === 'detail') {\n        detailList = 'active';\n      } else {// markdownHint = 'active';\n      }\n\n      return /*#__PURE__*/React.createElement(\"div\", {\n        className: \"side-panel\"\n      }, /*#__PURE__*/React.createElement(\"ul\", {\n        className: \"nav justify-content-center\"\n      }, /*#__PURE__*/React.createElement(\"li\", {\n        className: \"nav-item\"\n      }, /*#__PURE__*/React.createElement(\"a\", {\n        className: 'nav-link ' + outlineActive,\n        href: \"\",\n        onClick: this.onOutlineClick\n      }, /*#__PURE__*/React.createElement(\"i\", {\n        className: \"iconfont icon-list-ul\"\n      }))), /*#__PURE__*/React.createElement(\"li\", {\n        className: \"nav-item\"\n      }, /*#__PURE__*/React.createElement(\"a\", {\n        className: 'nav-link ' + detailList,\n        href: \"\",\n        onClick: this.onDetailClick\n      }, /*#__PURE__*/React.createElement(\"i\", {\n        className: 'iconfont icon-info-circle'\n      }))), /*#__PURE__*/React.createElement(\"li\", {\n        className: \"nav-item\"\n      }, /*#__PURE__*/React.createElement(\"a\", {\n        className: 'nav-link ' + commentsPanel,\n        href: \"\",\n        onClick: this.onCommentsPanelClick\n      }, /*#__PURE__*/React.createElement(\"i\", {\n        className: 'iconfont icon-comment'\n      })))), /*#__PURE__*/React.createElement(\"div\", {\n        className: \"side-panel-content\"\n      }, this.state.navItem === 'outline' && /*#__PURE__*/React.createElement(OutlineView, {\n        editor: this.props.editor,\n        document: this.props.document,\n        t: this.props.t\n      }), this.state.navItem === 'commentsPanel' && /*#__PURE__*/React.createElement(CommentPanel, {\n        editorApi: this.props.editorApi,\n        t: this.props.t,\n        scrollToQuote: this.props.scrollToQuote,\n        relistComment: this.props.relistComment,\n        openDialogs: this.props.openDialogs,\n        participants: this.props.participants,\n        onParticipantsChange: this.props.onParticipantsChange\n      }), this.state.navItem === 'detail' && /*#__PURE__*/React.createElement(DetailListView, {\n        t: this.props.t,\n        relatedFiles: this.props.relatedFiles,\n        fileTagList: this.props.fileTagList,\n        editorApi: this.props.editorApi,\n        openDialogs: this.props.openDialogs,\n        fileInfo: this.props.fileInfo,\n        participants: this.props.participants\n      })));\n    }\n  }]);\n\n  return SidePanel;\n}(React.PureComponent);\n\nexport default SidePanel;","import _slicedToArray from \"@babel/runtime/helpers/esm/slicedToArray\";\nimport _classCallCheck from \"@babel/runtime/helpers/esm/classCallCheck\";\nimport _createClass from \"@babel/runtime/helpers/esm/createClass\";\nimport _inherits from \"@babel/runtime/helpers/esm/inherits\";\nimport _createSuper from \"@babel/runtime/helpers/esm/createSuper\";\nimport React from 'react';\nimport ToolBar from '../components/toolbar';\nimport { withTranslation } from 'react-i18next';\nimport { renderNode, renderLeaf, EditorUtils, decorationNode } from './editor-utils/common-editor-utils';\nimport { createEditor, Node, Editor, Range } from 'slate';\nimport { withHistory } from 'slate-history';\nimport { serialize } from '../utils/slate2markdown/index';\nimport { Editable, withReact, Slate, ReactEditor } from '@seafile/slate-react';\nimport { isRangeCollapsed } from './editor-utils/range-utils';\nimport ModalPortal from '../components/modal-portal';\nimport TextLinkHoverMenu from './editor-component/textlink-hovermenu';\nimport ContextMenu from '../components/context-menu';\nimport withBlock from './controller/block-element-controller';\nimport withInline from './controller/inline-element-controller';\nimport withVoid from './controller/void-element-controller';\nimport withMarkdownShortcut from './controller/shortcut-controller';\nimport normalizeNode from './controller/normalize-controller';\nimport Plugin from './editor-plugin';\nimport TableUtils from '../editor/editor-utils/block-element-utils/table-utils';\nimport UserHelpDialog from '../components/user-help';\nimport CommentDialog from '../components/comment-dialog';\nimport SidePanel from '../components/side-panel';\nimport toaster from '../components/toast';\nimport '../css/richeditor/right-panel.css';\nimport '../css/richeditor/side-panel.css';\nimport '../css/richeditor/navbar-imgbutton.css';\nimport '../css/richeditor/textlink-hovermenu.css';\nimport '../css/richeditor/comments-list.css';\nimport '../css/richeditor/image.css';\nimport '../css/richeditor/link.css';\nimport '../css/richeditor/tree-view.css';\n\nvar SimpleEditor = /*#__PURE__*/function (_React$Component) {\n  _inherits(SimpleEditor, _React$Component);\n\n  var _super = _createSuper(SimpleEditor);\n\n  function SimpleEditor(props) {\n    var _this;\n\n    _classCallCheck(this, SimpleEditor);\n\n    _this = _super.call(this, props);\n\n    _this.getDomNodeByPath = function (path) {\n      var node,\n          parent = document.querySelector('.editor-component');\n\n      while (typeof path[0] === 'number' && parent) {\n        node = parent.children[path[0]];\n        path.shift();\n        parent = node;\n      }\n\n      return node;\n    };\n\n    _this.setBtnPosition = function () {\n      if (!_this.state.showCommentBtn) {\n        return;\n      }\n\n      if (_this.timmer) return;\n      _this.timmer = setTimeout(function () {\n        var selection = _this.editor.selection;\n\n        if (!selection || Range.isCollapsed(selection)) {\n          var _style = _this.refs.commentbtn.style;\n          _style.top = '-1000px';\n          clearTimeout(_this.timmer);\n          _this.timmer = null;\n          return;\n        }\n\n        var focusNodePath = selection.anchor.path.slice();\n        focusNodePath.pop();\n\n        var focusNode = _this.getDomNodeByPath(focusNodePath);\n\n        var style = _this.refs.commentbtn.style;\n        style.right = '40px';\n\n        if (focusNode) {\n          style.top = \"\".concat(focusNode.offsetTop, \"px\");\n        } else {\n          style.top = '-1000px';\n        }\n\n        clearTimeout(_this.timmer);\n        _this.timmer = null;\n      }, 40);\n    };\n\n    _this.initialSidePanel = function () {\n      var mainPanelWidth = _this.getCookie('md-editor-main-panel-width');\n\n      if (mainPanelWidth) _this.setState({\n        mainPanelWidth: mainPanelWidth * 1\n      });\n\n      var isShowSidePanel = _this.getCookie('md-editor-show-side-panel');\n\n      if (isShowSidePanel === 'true') {\n        _this.setState({\n          isShowSidePanel: true\n        });\n      } else if (isShowSidePanel === 'false') {\n        _this.setState({\n          isShowSidePanel: false\n        });\n      }\n    };\n\n    _this.scrollToNode = function (node) {\n      var editor = document.querySelector('.editor-component');\n      var element = editor.childNodes[node.path[0]];\n\n      _this.refs.editorContainer.scrollTo(0, element.offsetTop);\n\n      window.location.hash = encodeURI(node.children[0].text);\n      Editor.select(_this.editor, node.path);\n    };\n\n    _this.showHelpDialog = function () {\n      _this.setState({\n        isShowSidePanel: false,\n        isShowHelpDialog: true\n      });\n    };\n\n    _this.hideHelpDialog = function () {\n      _this.setState({\n        isShowHelpDialog: false\n      });\n    };\n\n    _this.insertRepoImage = function (event) {\n      event.preventDefault();\n      if (_this.props.readOnly) return;\n      _this.props.openDialogs && _this.props.openDialogs('insert_repo_image');\n    };\n\n    _this.onResizeMouseUp = function (event) {\n      if (_this.state.resizeFlag) {\n        _this.setState({\n          resizeFlag: false\n        });\n      }\n\n      _this.setCookie('md-editor-main-panel-width', _this.state.mainPanelWidth);\n    };\n\n    _this.onResizeMouseDown = function (event) {\n      _this.setState({\n        resizeFlag: true\n      });\n    };\n\n    _this.onResizeMouseMove = function (event) {\n      var mainPanelWidth = _this.state.mainPanelWidth + event.nativeEvent.movementX / event.view.innerWidth * 100;\n\n      if (mainPanelWidth >= 82 || mainPanelWidth <= 30) {\n        _this.setState({\n          resizeFlag: false\n        });\n\n        return;\n      }\n\n      _this.setState({\n        mainPanelWidth: mainPanelWidth\n      });\n    };\n\n    _this.toggleSidePanel = function () {\n      if (_this.state.isShowSidePanel) {\n        _this.setState({\n          isShowSidePanel: false\n        });\n\n        _this.setCookie('md-editor-show-side-panel', 'false');\n      } else {\n        _this.setState({\n          isShowSidePanel: true\n        });\n\n        _this.setCookie('md-editor-show-side-panel', 'true');\n      }\n\n      _this.setState({\n        isShowHelpDialog: false\n      });\n    };\n\n    _this.handleCommentOpen = function () {\n      _this.setState({\n        mainPanelWidth: 70,\n        isShowHelpDialog: false\n      });\n    };\n\n    _this.setCookie = function (key, value) {\n      document.cookie = key + '=' + value + '; ';\n    };\n\n    _this.onSave = function (event) {\n      _this.props.onSave();\n    };\n\n    _this.insertRepoFile = function () {\n      if (_this.props.readOnly) return;\n      _this.editorSelection = window.editor.selection;\n      _this.props.openDialogs && _this.props.openDialogs('insert_file');\n    };\n\n    _this.onCommentAdded = function () {\n      _this.toggleCommentDialog();\n\n      _this.setState({\n        relistComment: _this.state.relistComment + 1\n      });\n    };\n\n    _this.toggleCommentBtn = function (value) {\n      _this.setState({\n        showCommentBtn: value\n      });\n    };\n\n    _this.addComment = function (e) {\n      e.stopPropagation();\n\n      _this.getQuote();\n\n      _this.toggleCommentDialog();\n    };\n\n    _this.toggleCommentDialog = function () {\n      _this.setState({\n        showCommentDialog: !_this.state.showCommentDialog\n      });\n    };\n\n    _this.getQuote = function () {\n      _this.quote = serialize(Editor.fragment(_this.editor, _this.editor.selection));\n\n      _this.setState({\n        commentPosition: _this.editor.selection.anchor.path\n      });\n    };\n\n    _this.onChange = function (value) {\n      _this.setState({\n        value: value\n      }); // hide context menu when content change\n\n\n      if (_this.state.isShowContextMenu === true) {\n        _this.setState({\n          isShowContextMenu: false\n        });\n\n        _this.contextMenuPosition = {};\n      }\n\n      _this.props.onChange(value, _this.editor.operations);\n    };\n\n    _this.foucsEditor = function () {\n      _this.editorRef.firstChild.focus();\n    };\n\n    _this.onToggleLinkDialog = function () {\n      _this.setState({\n        isShowLinkDialog: !_this.state.isShowLinkDialog\n      });\n    };\n\n    _this.onToggleFormulaDialog = function () {\n      _this.setState({\n        isShowFormulaDialog: !_this.state.isShowFormulaDialog\n      });\n    };\n\n    _this.onToggleImageDialog = function () {\n      _this.setState({\n        isShowImageDialog: !_this.state.isShowImageDialog\n      });\n    };\n\n    _this.getCookie = function (key) {\n      var name = key + '=';\n      var ca = document.cookie.split(';');\n\n      for (var i = 0; i < ca.length; i++) {\n        var c = ca[i].trim();\n\n        if (c.indexOf(name) === 0) {\n          return c.substring(name.length, c.length);\n        }\n      }\n\n      return '';\n    };\n\n    _this.addComment = function (e) {\n      e.stopPropagation();\n\n      _this.getQuote();\n\n      _this.toggleCommentDialog();\n    };\n\n    _this.scrollToQuote = function (path) {\n      if (!path) return;\n      var editor = _this.editor;\n      var node = editor.children[path[0]];\n      var element = ReactEditor.toDOMNode(editor, node);\n\n      _this.refs.editorContainer.scrollTo(0, element.offsetTop);\n\n      Editor.select(_this.editor, path);\n    };\n\n    _this.onContextMenu = function (event) {\n      if (_this.tableUtils.isInTable()) {\n        event.preventDefault();\n        _this.contextMenuPosition = {\n          left: event.clientX,\n          top: event.clientY\n        };\n\n        _this.setState({\n          isShowContextMenu: !_this.state.isShowContextMenu\n        });\n      }\n    };\n\n    _this.addLink = function (fileName, url, isImage) {\n      if (isImage) {\n        _this.editorUtils.insertImage({\n          url: url,\n          selection: _this.editorSelection\n        });\n\n        return;\n      }\n\n      _this.editorUtils.insertLink({\n        text: fileName,\n        url: url,\n        selection: _this.editorSelection\n      });\n    };\n\n    _this.editor = normalizeNode(withMarkdownShortcut(withVoid(withBlock(withInline(withHistory(withReact(createEditor())))))));\n    _this.editor.editorApi = props.editorApi;\n    _this.editor.onSave = props.onSave;\n    window.editor = _this.editor;\n    _this.editorUtils = new EditorUtils(_this.editor);\n    _this.tableUtils = new TableUtils(_this.editor);\n    _this.plugin = new Plugin(_this.editor);\n    _this.editorRef = null;\n    _this.timmer = null;\n    _this.contextMenuPosition = {};\n    _this.state = {\n      value: props.value,\n      leftNavMode: 'files',\n      mainPanelWidth: 80,\n      resizeFlag: false,\n      isShowHelpDialog: false,\n      isShowSidePanel: false,\n      isShowLinkDialog: false,\n      isShowImageDialog: false,\n      isShowFormulaDialog: false,\n      isShowContextMenu: false,\n      showCommentBtn: false,\n      showCommentDialog: false,\n      commentPosition: null,\n      relistComment: 0\n    };\n    return _this;\n  }\n\n  _createClass(SimpleEditor, [{\n    key: \"componentDidCatch\",\n    value: function componentDidCatch(error) {\n      this.props.resetRichValue();\n      console.log(error);\n    }\n  }, {\n    key: \"componentDidMount\",\n    value: function componentDidMount() {\n      window.richMarkdownEditor = this; // notify current user if others are also editing this file\n\n      var editingUsers = this.props.collabUsers.filter(function (ele) {\n        return ele.is_editing === true && ele.myself === undefined;\n      });\n\n      if (editingUsers.length > 0) {\n        toaster.danger('Another user is editing this file!', {\n          duration: 3\n        });\n      }\n\n      var userAgent = navigator.userAgent.toLowerCase();\n\n      if (userAgent.indexOf('chrome') === -1) {\n        toaster.warning(this.props.t('Editing_files_in_this_browser_can_lead_to_slight_display_problems'), {\n          duration: 4\n        });\n      } // get first text node of the document and focus at the start of the text node\n\n\n      var _Array$from$ = _slicedToArray(Array.from(Node.texts(this.editor.children[0]))[0], 2),\n          textPath = _Array$from$[1];\n\n      textPath.unshift(0);\n      Editor.select(this.editor, {\n        path: textPath,\n        offset: 0\n      });\n    }\n  }, {\n    key: \"componentWillReceiveProps\",\n    value: function componentWillReceiveProps(nextProps) {\n      if (this.props.issues !== nextProps.issues && nextProps.issues.issue_list.length > 0 && !this.state.isShowSidePanel) {\n        this.setState({\n          isShowSidePanel: true\n        }, function () {\n          window.openMarkdownHint && window.openMarkdownHint();\n        });\n      }\n    }\n  }, {\n    key: \"render\",\n    value: function render() {\n      var _this2 = this;\n\n      var _this$state = this.state,\n          value = _this$state.value,\n          isShowLinkDialog = _this$state.isShowLinkDialog,\n          isShowImageDialog = _this$state.isShowImageDialog,\n          isShowFormulaDialog = _this$state.isShowFormulaDialog;\n      var _this$props = this.props,\n          t = _this$props.t,\n          mode = _this$props.mode,\n          editorApi = _this$props.editorApi;\n      var _this$state2 = this.state,\n          mainPanelWidth = _this$state2.mainPanelWidth,\n          isShowHelpDialog = _this$state2.isShowHelpDialog,\n          isShowSidePanel = _this$state2.isShowSidePanel;\n      var onResizeMove = this.state.resizeFlag ? this.onResizeMouseMove : null;\n      var mainPanelClass = \"seafile-editor-main-panel d-flex align-self-end \".concat(!isShowSidePanel && !isShowHelpDialog ? 'seafile-editor-all-panel' : '');\n      var mainPanelStyle = {\n        width: isShowSidePanel ? mainPanelWidth + '%' : '100%'\n      };\n      var editor = this.editor,\n          foucsEditor = this.foucsEditor;\n      var toolbarStatus = this.editorUtils.getToolbarStatus();\n      var readOnly = this.props.readOnly;\n      var selectionCollapsed = isRangeCollapsed(editor.selection);\n      return /*#__PURE__*/React.createElement(\"div\", {\n        className: \"seafile-editor-module seafile-editor\"\n      }, /*#__PURE__*/React.createElement(Slate, {\n        editor: this.editor,\n        value: value,\n        onChange: this.onChange\n      }, /*#__PURE__*/React.createElement(\"div\", {\n        className: \"seafile-rich-editor-topbar\"\n      }, /*#__PURE__*/React.createElement(ToolBar, {\n        onToggleLinkDialog: this.onToggleLinkDialog,\n        onToggleImageDialog: this.onToggleImageDialog,\n        onToggleFormulaDialog: this.onToggleFormulaDialog,\n        toolbarStatus: toolbarStatus,\n        toggleSidePanel: this.toggleSidePanel,\n        insertRepoFile: this.insertRepoFile,\n        isShowLinkDialog: isShowLinkDialog,\n        isShowImageDialog: isShowImageDialog,\n        isShowSidePanel: isShowSidePanel,\n        hasSidePanel: true,\n        mode: mode,\n        readOnly: readOnly,\n        isShowFormulaDialog: isShowFormulaDialog\n      })), /*#__PURE__*/React.createElement(\"div\", {\n        className: \"seafile-editor-main d-flex\",\n        onMouseMove: onResizeMove,\n        onMouseUp: this.onResizeMouseUp\n      }, /*#__PURE__*/React.createElement(\"div\", {\n        className: mainPanelClass,\n        style: mainPanelStyle\n      }, /*#__PURE__*/React.createElement(\"div\", {\n        className: \"editor-container align-self-start\",\n        ref: \"editorContainer\"\n      }, /*#__PURE__*/React.createElement(\"div\", {\n        ref: function ref(_ref) {\n          return _this2.editorRef = _ref;\n        },\n        onClick: value.length === 2 && value[0].type === 'paragraph' && Node.text(value[0].children[0]).length === 0 ? foucsEditor : null,\n        className: \"editor article\"\n      }, /*#__PURE__*/React.createElement(Editable, {\n        renderElement: function renderElement(props) {\n          return renderNode(props, editor, readOnly);\n        },\n        className: 'editor-component',\n        renderLeaf: renderLeaf,\n        onContextMenu: this.onContextMenu,\n        onCopy: function onCopy(event) {\n          _this2.plugin.onCopy(event, editor);\n        },\n        onCut: function onCut(event) {\n          return _this2.plugin.onCut(event);\n        },\n        autoFocus: true,\n        onKeyDown: this.plugin.onKeyDown,\n        decorate: decorationNode,\n        onSelect: this.setBtnPosition\n      }), this.state.showCommentBtn && /*#__PURE__*/React.createElement(\"i\", {\n        className: \"iconfont icon-plus-square seafile-viewer-comment-btn\",\n        ref: \"commentbtn\",\n        onMouseDown: this.addComment\n      })), toolbarStatus.isLinkActive && selectionCollapsed ? /*#__PURE__*/React.createElement(ModalPortal, null, /*#__PURE__*/React.createElement(TextLinkHoverMenu, {\n        onToggleLinkDialog: this.onToggleLinkDialog,\n        editorUtils: this.editorUtils\n      })) : null, this.state.isShowContextMenu && /*#__PURE__*/React.createElement(ModalPortal, null, /*#__PURE__*/React.createElement(ContextMenu, {\n        tableUtils: this.tableUtils,\n        contextMenuPosition: this.contextMenuPosition\n      })))), !isShowHelpDialog && isShowSidePanel && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(\"div\", {\n        className: \"seafile-editor-resize\",\n        style: {\n          right: 100 - mainPanelWidth + '%'\n        },\n        onMouseDown: this.onResizeMouseDown\n      }), /*#__PURE__*/React.createElement(\"div\", {\n        className: \"seafile-editor-side-panel align-self-start\",\n        style: {\n          width: 100 - mainPanelWidth + '%'\n        }\n      }, /*#__PURE__*/React.createElement(SidePanel, {\n        editor: this,\n        document: value,\n        issues: this.props.issues,\n        scrollToNode: this.scrollToNode,\n        scrollToQuote: this.scrollToQuote,\n        t: this.props.t,\n        editorApi: editorApi,\n        toggleCommentBtn: this.toggleCommentBtn,\n        relistComment: this.state.relistComment,\n        relatedFiles: this.props.relatedFiles,\n        fileTagList: this.props.fileTagList,\n        openDialogs: this.props.openDialogs,\n        fileInfo: this.props.fileInfo,\n        participants: this.props.participants,\n        onParticipantsChange: this.props.onParticipantsChange\n      }))), isShowHelpDialog && /*#__PURE__*/React.createElement(UserHelpDialog, {\n        userHelp: t('userHelp', {\n          returnObjects: true\n        }),\n        hideHelpDialog: this.hideHelpDialog\n      }), this.state.showCommentDialog && /*#__PURE__*/React.createElement(CommentDialog, {\n        editorApi: editorApi,\n        t: t,\n        quote: this.quote,\n        scrollToQuote: this.scrollToQuote,\n        commentPosition: this.state.commentPosition,\n        onCommentAdded: this.onCommentAdded,\n        toggleCommentDialog: this.toggleCommentDialog\n      }))));\n    }\n  }]);\n\n  return SimpleEditor;\n}(React.Component);\n\nexport default withTranslation('seafile-editor')(SimpleEditor);","import _classCallCheck from \"@babel/runtime/helpers/esm/classCallCheck\";\nimport _createClass from \"@babel/runtime/helpers/esm/createClass\";\nimport _inherits from \"@babel/runtime/helpers/esm/inherits\";\nimport _createSuper from \"@babel/runtime/helpers/esm/createSuper\";\nimport React from 'react';\nimport { processor } from '../utils/seafile-markdown2html';\nimport toaster from '../components/toast';\nimport isHotkey from 'is-hotkey';\nimport { withTranslation } from 'react-i18next';\nimport Prism from 'prismjs';\n\nvar className = require('classnames');\n\nvar lodash = require('lodash');\n\nrequire('codemirror/lib/codemirror.css');\n\nrequire('codemirror/mode/markdown/markdown');\n\nrequire('../css/plaineditor/markdown-editor.css');\n\nrequire('prismjs/themes/prism.css');\n\nvar CodeMirror = /*#__PURE__*/function (_React$Component) {\n  _inherits(CodeMirror, _React$Component);\n\n  var _super = _createSuper(CodeMirror);\n\n  function CodeMirror() {\n    var _this;\n\n    _classCallCheck(this, CodeMirror);\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 = _super.call.apply(_super, [this].concat(args));\n    _this.state = {\n      isFocused: false\n    };\n\n    _this.focus = function () {\n      if (_this.codeMirror) {\n        _this.codeMirror.focus();\n      }\n    };\n\n    _this.focusChanged = function (focused) {\n      _this.setState({\n        isFocused: focused\n      });\n\n      _this.props.onFocusChange && _this.props.onFocusChange(focused);\n    };\n\n    _this.cursorActivity = function (cm) {\n      _this.props.onCursorActivity && _this.props.onCursorActivity(cm);\n    };\n\n    _this.scrollChanged = function (cm) {\n      _this.props.onScroll && _this.props.onScroll(cm.getScrollInfo());\n    };\n\n    _this.codemirrorValueChanged = function (doc, change) {\n      if (_this.props.onChange && change.origin !== 'setValue') {\n        _this.props.onChange(doc.getValue(), change);\n      }\n    };\n\n    return _this;\n  }\n\n  _createClass(CodeMirror, [{\n    key: \"getCodeMirrorInstance\",\n    value: function getCodeMirrorInstance() {\n      return this.props.codeMirrorInstance || require('codemirror');\n    }\n  }, {\n    key: \"componentWillMount\",\n    value: function componentWillMount() {\n      if (this.props.path) {\n        console.error('Warning: react-codemirror: the `path` prop has been changed to `name`');\n      }\n    }\n  }, {\n    key: \"componentDidMount\",\n    value: function componentDidMount() {\n      var codeMirrorInstance = this.getCodeMirrorInstance();\n      this.codeMirror = codeMirrorInstance.fromTextArea(this.textareaNode, this.props.options);\n      this.codeMirror.on('change', this.codemirrorValueChanged);\n      this.codeMirror.on('cursorActivity', this.cursorActivity);\n      this.codeMirror.on('focus', this.focusChanged.bind(this, true));\n      this.codeMirror.on('blur', this.focusChanged.bind(this, false));\n      this.codeMirror.on('scroll', this.scrollChanged);\n    }\n  }, {\n    key: \"componentWillUnmount\",\n    value: function componentWillUnmount() {\n      // is there a lighter-weight way to remove the cm instance?\n      if (this.codeMirror) {\n        this.codeMirror.toTextArea();\n      }\n    }\n  }, {\n    key: \"componentWillReceiveProps\",\n    value: function componentWillReceiveProps(nextProps) {\n      if (this.codeMirror && nextProps.initialValue !== undefined && nextProps.initialValue !== this.props.initialValue) {\n        if (this.props.preserveScrollPosition) {\n          var prevScrollPosition = this.codeMirror.getScrollInfo();\n          this.codeMirror.setValue(nextProps.initialValue);\n          this.codeMirror.scrollTo(prevScrollPosition.left, prevScrollPosition.top);\n        } else {\n          this.codeMirror.setValue(nextProps.initialValue);\n        }\n      }\n    }\n  }, {\n    key: \"render\",\n    value: function render() {\n      var _this2 = this;\n\n      var editorClassName = className('ReactCodeMirror', this.state.isFocused ? 'ReactCodeMirror--focused' : null, this.props.className);\n      return /*#__PURE__*/React.createElement(\"div\", {\n        className: editorClassName\n      }, /*#__PURE__*/React.createElement(\"textarea\", {\n        ref: function ref(_ref) {\n          return _this2.textareaNode = _ref;\n        },\n        name: this.props.name || this.props.path,\n        defaultValue: this.props.initialValue,\n        autoComplete: \"off\",\n        autoFocus: this.props.autoFocus\n      }));\n    }\n  }]);\n\n  return CodeMirror;\n}(React.Component);\n/*\n\nWhen loading a new file:\n\n             markdownContent                    initialValue\n  index.js  -----------------> PlainMarkdownEditor --------> CodeMirror --> Real CodeMirror\n\nWhen user type in CodeMirror\n\n                    value             value\n   Real CodeMirror ------> CodeMirror ------> PlainMarkdownEditor\n\nOn Save:\n\n                 value\n  MarkdownEditor -----> index.js\n\n*/\n\n\nvar PlainMarkdownEditor = /*#__PURE__*/function (_React$Component2) {\n  _inherits(PlainMarkdownEditor, _React$Component2);\n\n  var _super2 = _createSuper(PlainMarkdownEditor);\n\n  function PlainMarkdownEditor(props) {\n    var _this3;\n\n    _classCallCheck(this, PlainMarkdownEditor);\n\n    _this3 = _super2.call(this, props);\n    _this3.state = {\n      html: '',\n      leftIsBindScroll: false,\n      rightIsBindScroll: false\n    };\n    _this3.scrollData = {\n      scrollPercentage: 0,\n      leftPanel: null,\n      rightPanel: null\n    };\n\n    _this3.updateCode = function (newCode) {\n      _this3.props.onChange(newCode);\n    };\n\n    _this3.onLeftScroll = function (e) {\n      var srcElement = _this3.scrollData.leftPanel;\n      _this3.scrollData.scrollPercentage = srcElement.scrollTop / srcElement.scrollHeight;\n      _this3.scrollData.rightPanel.scrollTop = _this3.scrollData.scrollPercentage * _this3.scrollData.rightPanel.scrollHeight;\n    };\n\n    _this3.onRightScroll = function (e) {\n      var srcElement = _this3.scrollData.rightPanel;\n      _this3.scrollData.scrollPercentage = srcElement.scrollTop / srcElement.scrollHeight;\n      _this3.scrollData.leftPanel.scrollTop = _this3.scrollData.scrollPercentage * _this3.scrollData.leftPanel.scrollHeight;\n    };\n\n    _this3.onEnterLeftPanel = function () {\n      _this3.setState({\n        leftIsBindScroll: true\n      });\n    };\n\n    _this3.onLeaveLeftPanel = function () {\n      _this3.setState({\n        leftIsBindScroll: false\n      });\n    };\n\n    _this3.onEnterRightPanel = function () {\n      _this3.setState({\n        rightIsBindScroll: true\n      });\n    };\n\n    _this3.onLeaveRightPanel = function () {\n      _this3.setState({\n        rightIsBindScroll: false\n      });\n    };\n\n    _this3.onHotKey = function (event) {\n      if (isHotkey('mod+s', event)) {\n        event.preventDefault();\n\n        _this3.props.onSave(event);\n\n        return true;\n      }\n    };\n\n    _this3.options = {\n      lineNumbers: true,\n      mode: 'markdown',\n      lineWrapping: true,\n      scrollbarStyle: null\n    };\n    _this3.setContent = lodash.throttle(_this3.setContent, 1000);\n    return _this3;\n  }\n\n  _createClass(PlainMarkdownEditor, [{\n    key: \"setContent\",\n    value: function setContent(markdownContent) {\n      var _this4 = this;\n\n      processor.process(markdownContent, function (error, vfile) {\n        var html = String(vfile);\n\n        _this4.setState({\n          html: html\n        });\n      });\n    }\n  }, {\n    key: \"componentDidMount\",\n    value: function componentDidMount() {\n      // get relevant dom when component mounted instead of get them when scrolling to improve performance\n      this.scrollData.leftPanel = document.querySelector('.plain-editor-left-panel');\n      this.scrollData.rightPanel = document.querySelector('.plain-editor-right-panel');\n      this.setContent(this.props.currentContent); // notify current user if others are also editing this file\n\n      var editingUsers = this.props.collabUsers.filter(function (ele) {\n        return ele.is_editing === true && ele.myself === undefined;\n      });\n\n      if (editingUsers.length > 0) {\n        toaster.danger('Another user is editing this file!', {\n          duration: 3\n        });\n      }\n    }\n  }, {\n    key: \"componentWillReceiveProps\",\n    value: function componentWillReceiveProps(nextProps) {\n      this.setContent(nextProps.currentContent);\n    }\n  }, {\n    key: \"componentDidUpdate\",\n    value: function componentDidUpdate() {\n      Prism.highlightAll(); // render math formula\n\n      window.MathJax.typesetPromise(document.querySelectorAll('.math-display'));\n    }\n  }, {\n    key: \"render\",\n    value: function render() {\n      return /*#__PURE__*/React.createElement(\"div\", {\n        className: \"seafile-editor-module seafile-editor\"\n      }, /*#__PURE__*/React.createElement(\"div\", {\n        className: \"seafile-editor-main plain-editor-main d-flex\"\n      }, /*#__PURE__*/React.createElement(\"div\", {\n        className: \"plain-editor-left-panel\",\n        onKeyDown: this.onHotKey,\n        onMouseLeave: this.onLeaveLeftPanel,\n        onMouseEnter: this.onEnterLeftPanel,\n        onScroll: this.state.leftIsBindScroll ? this.onLeftScroll : null\n      }, /*#__PURE__*/React.createElement(CodeMirror, {\n        initialValue: this.props.initialValue,\n        onChange: this.updateCode,\n        options: this.options\n      })), /*#__PURE__*/React.createElement(\"div\", {\n        className: \"plain-editor-right-panel\",\n        onMouseEnter: this.onEnterRightPanel,\n        onMouseLeave: this.onLeaveRightPanel,\n        onScroll: this.state.rightIsBindScroll ? this.onRightScroll : null\n      }, /*#__PURE__*/React.createElement(\"div\", {\n        className: \"preview\"\n      }, /*#__PURE__*/React.createElement(\"div\", {\n        className: \"rendered-markdown article\",\n        dangerouslySetInnerHTML: {\n          __html: this.state.html\n        }\n      })))));\n    }\n  }]);\n\n  return PlainMarkdownEditor;\n}(React.Component);\n\nPlainMarkdownEditor.defaultProps = {\n  collabUsers: []\n};\nexport default withTranslation('seafile-editor')(PlainMarkdownEditor);","import _classCallCheck from \"@babel/runtime/helpers/esm/classCallCheck\";\nimport _createClass from \"@babel/runtime/helpers/esm/createClass\";\nimport _assertThisInitialized from \"@babel/runtime/helpers/esm/assertThisInitialized\";\nimport _inherits from \"@babel/runtime/helpers/esm/inherits\";\nimport _createSuper from \"@babel/runtime/helpers/esm/createSuper\";\nimport React from 'react';\nimport toaster from '../components/toast';\nimport { withTranslation } from 'react-i18next';\nimport { Text } from 'slate';\nimport '../css/layout.css';\nimport '../css/topbar.css';\nimport RichMarkdownEditor from './rich-markdown-editor';\nimport PlainMarkdownEditor from './plain-markdown-editor';\nimport { serialize, deserialize } from '../utils/slate2markdown';\n\nvar SeafileEditor = /*#__PURE__*/function (_React$Component) {\n  _inherits(SeafileEditor, _React$Component);\n\n  var _super = _createSuper(SeafileEditor);\n\n  function SeafileEditor(props) {\n    var _this;\n\n    _classCallCheck(this, SeafileEditor);\n\n    _this = _super.call(this, props);\n\n    _this.switchToPlainTextEditor = function () {\n      // TODO: performance, change to do serialize in async way\n      if (_this.props.editorMode === 'rich') {\n        var value = _this.state.richValue;\n        var str = serialize(value);\n\n        _this.props.setEditorMode('plain');\n\n        _this.setState({\n          initialPlainValue: str,\n          currentContent: str\n        });\n      }\n\n      if (_this.props.collabServer) {\n        _this.props.emitSwitchEditor(false);\n      }\n    };\n\n    _this.switchToRichTextEditor = function () {\n      // TODO: performance, change to do deserialize in async way\n      _this.setState({\n        richValue: deserialize(_this.state.currentContent)\n      });\n\n      _this.props.setEditorMode('rich');\n\n      if (_this.props.collabServer) {\n        _this.props.emitSwitchEditor(false);\n      }\n    };\n\n    _this.onUnload = function (event) {\n      if (!_this.props.contentChanged) return;\n      var confirmationMessage = 'Leave this page? The system may not save your changes.';\n\n      _this.props.clearTimer();\n\n      _this.props.deleteDraft && _this.props.deleteDraft();\n      event.returnValue = confirmationMessage;\n      return confirmationMessage;\n    };\n\n    _this.onChange = function (value, operations) {\n      if (_this.props.editorMode === 'rich') {\n        _this.setState({\n          richValue: value\n        });\n\n        _this.props.setDraftValue('rich', _this.state.richValue);\n\n        var ops = operations.filter(function (o) {\n          return o.type !== 'set_selection' && o.type !== 'set_value';\n        });\n\n        if (ops.length !== 0) {\n          _this.props.onContentChanged(true);\n\n          if (_this.autoSave) _this.props.autoSaveDraft();\n        }\n      } else {\n        _this.setState({\n          currentContent: value\n        });\n\n        _this.props.onContentChanged(true);\n\n        _this.props.setDraftValue('rich', _this.state.richValue);\n\n        _this.props.autoSaveDraft();\n      }\n    };\n\n    _this.saveContent = function (str) {\n      _this.props.editorApi.saveContent(str).then(function () {\n        _this.props.onSaving(false);\n\n        _this.props.onContentChanged(false); // remove markdown lint temporarily\n        // if (this.props.markdownLint) {\n        //   const slateValue = this.state.richValue;\n        //   this.props.editorApi.markdownLint(JSON.stringify(slateValue)).then((res) => {\n        //     this.setState({\n        //       issues: res.data\n        //     });\n        //   });\n        // }\n\n\n        _this.lastModifyTime = new Date();\n        toaster.success(_this.props.t('file_saved'), {\n          duration: 2\n        });\n\n        _this.props.editorApi.getFileInfo().then(function (res) {\n          _this.props.setFileInfoMtime(res.data);\n        });\n\n        _this.addParticipants();\n      }, function () {\n        _this.props.onSaving(false);\n\n        toaster.danger(_this.props.t('file_failed_to_save'), {\n          duration: 2\n        });\n      });\n\n      _this.props.onSaving(true);\n    };\n\n    _this.addParticipants = function () {\n      if (_this.isParticipant || !window.showParticipants) return;\n      var _this$props$editorApi = _this.props.editorApi,\n          userName = _this$props$editorApi.userName,\n          addFileParticipants = _this$props$editorApi.addFileParticipants;\n      var participants = _this.props.participants;\n\n      if (participants && participants.length !== 0) {\n        _this.isParticipant = participants.every(function (participant) {\n          return participant.email === userName;\n        });\n        if (_this.isParticipant) return;\n      }\n\n      var emails = [userName];\n      addFileParticipants(emails).then(function (res) {\n        _this.isParticipant = true;\n\n        _this.props.onParticipantsChange();\n      });\n    };\n\n    _this.onRichEditorSave = function () {\n      if (_this.props.isSaving) return;\n      var value = _this.state.richValue;\n      var str = serialize(value);\n\n      _this.saveContent(str);\n\n      _this.props.clearTimer();\n\n      _this.props.deleteDraft && _this.props.deleteDraft();\n    };\n\n    _this.resetRichValue = function () {\n      var value = _this.state.richValue;\n\n      _this.setState({\n        richValue: value\n      });\n    };\n\n    _this.onPlainEditorSave = function () {\n      if (_this.props.isSaving) return;\n      var str = _this.state.currentContent;\n\n      _this.saveContent(str);\n\n      _this.props.clearTimer();\n\n      _this.props.deleteDraft && _this.props.deleteDraft();\n    };\n\n    _this.resetContentChanged = function () {\n      if (_this.props.contentChanged) {\n        _this.props.onContentChanged(false);\n      }\n\n      _this.autoSave = true;\n    };\n\n    var markdownContent = _this.props.markdownContent;\n    var isEditMode = _this.props.mode === 'editor';\n    var isDraft = _this.props.isDraft;\n    _this.lastModifyTime = null;\n    _this.autoSave = false;\n    _this.isParticipant = false;\n    window.seafileEditor = _assertThisInitialized(_this);\n    _this.state = {\n      isTreeDataLoaded: false,\n      initialPlainValue: '',\n      // for plain editor\n      currentContent: markdownContent,\n      // for plain editor and viewer\n      richValue: isEditMode || isDraft ? deserialize(markdownContent) : deserialize(''),\n      // for rich editor\n      issues: {\n        issue_list: []\n      }\n    };\n    return _this;\n  } // componentWillReceiveProps(nextProps) {\n  //   if (this.props.markdownContent !== nextProps.markdownContent) {\n  //     this.setState({ richValue: deserialize(nextProps.markdownContent) });\n  //   }\n  // }\n  // from rich editor to plain editor\n\n\n  _createClass(SeafileEditor, [{\n    key: \"componentDidMount\",\n    value: function componentDidMount() {\n      // window.seafileEditor = this;\n      window.addEventListener('beforeunload', this.onUnload);\n    }\n  }, {\n    key: \"componentWillMount\",\n    value:\n    /*\n    *  when seafileEditor first mounted check the content\n    *  if the content is empty add h1 to document\n    * */\n    function componentWillMount() {\n      if (this.props.editorMode === 'rich') {\n        var document = this.state.richValue;\n        var firstNode = document[0];\n        /**\n         *  if the markdown content is empty, the rich value contains\n         *  only a paragraph which contains a empty text node \n         * \n        */\n\n        if (document.length === 1 && firstNode.type === 'paragraph' && firstNode.children.length === 1 && Text.isText(firstNode.children[0]) && firstNode.children[0].text.length === 0) {\n          var headerContent = this.props.fileInfo.name.slice(0, this.props.fileInfo.name.lastIndexOf('.'));\n          var header = {\n            type: 'header_one',\n            children: [{\n              text: headerContent,\n              marks: []\n            }]\n          };\n          document.push(header);\n          document.shift();\n          this.setState({\n            richValue: document\n          });\n        }\n      }\n    }\n  }, {\n    key: \"render\",\n    value: function render() {\n      var dom = '';\n\n      if (this.props.editorMode === 'rich') {\n        dom = /*#__PURE__*/React.createElement(RichMarkdownEditor, {\n          editorApi: this.props.editorApi,\n          onChange: this.onChange,\n          onSave: this.onRichEditorSave,\n          value: this.state.richValue,\n          resetRichValue: this.resetRichValue,\n          contentChanged: this.props.contentChanged,\n          saving: this.props.saving,\n          switchToMarkDownViewer: this.switchToMarkDownViewer,\n          switchToPlainTextEditor: this.switchToPlainTextEditor,\n          fileInfo: this.props.fileInfo,\n          toggleStar: this.props.toggleStar,\n          issues: this.state.issues,\n          resetContentChanged: this.resetContentChanged,\n          collabUsers: this.props.collabUsers,\n          mode: this.props.editorMode,\n          draftID: this.props.draftID,\n          isDraft: this.props.isDraft,\n          openDialogs: this.props.openDialogs,\n          readOnly: this.props.readOnly,\n          relatedFiles: this.props.relatedFiles,\n          fileTagList: this.props.fileTagList,\n          participants: this.props.participants,\n          onParticipantsChange: this.props.onParticipantsChange\n        });\n      } else if (this.props.editorMode === 'plain') {\n        dom = /*#__PURE__*/React.createElement(PlainMarkdownEditor, {\n          editorApi: this.props.editorApi,\n          initialValue: this.state.initialPlainValue,\n          currentContent: this.state.currentContent,\n          contentChanged: this.props.contentChanged,\n          switchToRichTextEditor: this.switchToRichTextEditor,\n          switchToMarkDownViewer: this.switchToMarkDownViewer,\n          onSave: this.onPlainEditorSave,\n          onChange: this.onChange,\n          fileInfo: this.props.fileInfo,\n          toggleStar: this.props.toggleStar,\n          collabUsers: this.props.collabUsers,\n          mode: this.props.editorMode,\n          draftID: this.props.draftID,\n          isDraft: this.props.isDraft\n        });\n      }\n\n      return dom;\n    }\n  }]);\n\n  return SeafileEditor;\n}(React.Component);\n\nSeafileEditor.defaultProps = {\n  userInfo: null\n};\nexport default withTranslation('seafile-editor')(SeafileEditor);","import _classCallCheck from \"@babel/runtime/helpers/esm/classCallCheck\";\nimport _createClass from \"@babel/runtime/helpers/esm/createClass\";\nimport _inherits from \"@babel/runtime/helpers/esm/inherits\";\nimport _createSuper from \"@babel/runtime/helpers/esm/createSuper\";\nimport React from 'react';\nimport SimpleEditor from './simple-editor';\nimport SeafileEditor from './seafile-editor';\nimport LoadScript from './load-script';\n\nvar SimpleEditorWithErrorBoundary = /*#__PURE__*/function (_React$Component) {\n  _inherits(SimpleEditorWithErrorBoundary, _React$Component);\n\n  var _super = _createSuper(SimpleEditorWithErrorBoundary);\n\n  function SimpleEditorWithErrorBoundary() {\n    _classCallCheck(this, SimpleEditorWithErrorBoundary);\n\n    return _super.apply(this, arguments);\n  }\n\n  _createClass(SimpleEditorWithErrorBoundary, [{\n    key: \"componentDidCatch\",\n    value: function componentDidCatch(error) {\n      console.error(error);\n      this.forceUpdate();\n    }\n  }, {\n    key: \"render\",\n    value: function render() {\n      return /*#__PURE__*/React.createElement(SimpleEditor, this.props);\n    }\n  }]);\n\n  return SimpleEditorWithErrorBoundary;\n}(React.Component);\n\nvar SeafileEditorWithErrorBundary = /*#__PURE__*/function (_React$Component2) {\n  _inherits(SeafileEditorWithErrorBundary, _React$Component2);\n\n  var _super2 = _createSuper(SeafileEditorWithErrorBundary);\n\n  function SeafileEditorWithErrorBundary() {\n    _classCallCheck(this, SeafileEditorWithErrorBundary);\n\n    return _super2.apply(this, arguments);\n  }\n\n  _createClass(SeafileEditorWithErrorBundary, [{\n    key: \"componentDidCatch\",\n    value: function componentDidCatch(error) {\n      console.error(error);\n      this.forceUpdate();\n    }\n  }, {\n    key: \"render\",\n    value: function render() {\n      return /*#__PURE__*/React.createElement(LoadScript, {\n        scriptSource: this.props.scriptSource\n      }, /*#__PURE__*/React.createElement(SeafileEditor, this.props));\n    }\n  }]);\n\n  return SeafileEditorWithErrorBundary;\n}(React.Component);\n\nexport { SimpleEditorWithErrorBoundary as SimpleEditor, SeafileEditorWithErrorBundary as SeafileEditor };","var listCacheClear = require('./_listCacheClear'),\n    listCacheDelete = require('./_listCacheDelete'),\n    listCacheGet = require('./_listCacheGet'),\n    listCacheHas = require('./_listCacheHas'),\n    listCacheSet = require('./_listCacheSet');\n\n/**\n * Creates an list cache object.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction ListCache(entries) {\n  var index = -1,\n      length = entries == null ? 0 : entries.length;\n\n  this.clear();\n  while (++index < length) {\n    var entry = entries[index];\n    this.set(entry[0], entry[1]);\n  }\n}\n\n// Add methods to `ListCache`.\nListCache.prototype.clear = listCacheClear;\nListCache.prototype['delete'] = listCacheDelete;\nListCache.prototype.get = listCacheGet;\nListCache.prototype.has = listCacheHas;\nListCache.prototype.set = listCacheSet;\n\nmodule.exports = ListCache;\n","var eq = require('./eq');\n\n/**\n * Gets the index at which the `key` is found in `array` of key-value pairs.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {*} key The key to search for.\n * @returns {number} Returns the index of the matched value, else `-1`.\n */\nfunction assocIndexOf(array, key) {\n  var length = array.length;\n  while (length--) {\n    if (eq(array[length][0], key)) {\n      return length;\n    }\n  }\n  return -1;\n}\n\nmodule.exports = assocIndexOf;\n","var root = require('./_root');\n\n/** Built-in value references. */\nvar Symbol = root.Symbol;\n\nmodule.exports = Symbol;\n","var getNative = require('./_getNative');\n\n/* Built-in method references that are verified to be native. */\nvar nativeCreate = getNative(Object, 'create');\n\nmodule.exports = nativeCreate;\n","var isKeyable = require('./_isKeyable');\n\n/**\n * Gets the data for `map`.\n *\n * @private\n * @param {Object} map The map to query.\n * @param {string} key The reference key.\n * @returns {*} Returns the map data.\n */\nfunction getMapData(map, key) {\n  var data = map.__data__;\n  return isKeyable(key)\n    ? data[typeof key == 'string' ? 'string' : 'hash']\n    : data.map;\n}\n\nmodule.exports = getMapData;\n","var isSymbol = require('./isSymbol');\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0;\n\n/**\n * Converts `value` to a string key if it's not a string or symbol.\n *\n * @private\n * @param {*} value The value to inspect.\n * @returns {string|symbol} Returns the key.\n */\nfunction toKey(value) {\n  if (typeof value == 'string' || isSymbol(value)) {\n    return value;\n  }\n  var result = (value + '');\n  return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;\n}\n\nmodule.exports = toKey;\n","'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\nvar _react = require('react');\n\nvar _propTypes = require('prop-types');\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar Manager = function (_Component) {\n  _inherits(Manager, _Component);\n\n  function Manager() {\n    var _ref;\n\n    var _temp, _this, _ret;\n\n    _classCallCheck(this, Manager);\n\n    for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref = Manager.__proto__ || Object.getPrototypeOf(Manager)).call.apply(_ref, [this].concat(args))), _this), _this._setTargetNode = function (node) {\n      _this._targetNode = node;\n    }, _this._getTargetNode = function () {\n      return _this._targetNode;\n    }, _temp), _possibleConstructorReturn(_this, _ret);\n  }\n\n  _createClass(Manager, [{\n    key: 'getChildContext',\n    value: function getChildContext() {\n      return {\n        popperManager: {\n          setTargetNode: this._setTargetNode,\n          getTargetNode: this._getTargetNode\n        }\n      };\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      var _props = this.props,\n          tag = _props.tag,\n          children = _props.children,\n          restProps = _objectWithoutProperties(_props, ['tag', 'children']);\n\n      if (tag !== false) {\n        return (0, _react.createElement)(tag, restProps, children);\n      } else {\n        return children;\n      }\n    }\n  }]);\n\n  return Manager;\n}(_react.Component);\n\nManager.childContextTypes = {\n  popperManager: _propTypes2.default.object.isRequired\n};\nManager.propTypes = {\n  tag: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.bool]),\n  children: _propTypes2.default.oneOfType([_propTypes2.default.node, _propTypes2.default.func])\n};\nManager.defaultProps = {\n  tag: 'div'\n};\nexports.default = Manager;","'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 _react = require('react');\n\nvar _propTypes = require('prop-types');\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }\n\nvar Target = function Target(props, context) {\n  var _props$component = props.component,\n      component = _props$component === undefined ? 'div' : _props$component,\n      innerRef = props.innerRef,\n      children = props.children,\n      restProps = _objectWithoutProperties(props, ['component', 'innerRef', 'children']);\n\n  var popperManager = context.popperManager;\n\n  var targetRef = function targetRef(node) {\n    popperManager.setTargetNode(node);\n    if (typeof innerRef === 'function') {\n      innerRef(node);\n    }\n  };\n\n  if (typeof children === 'function') {\n    var targetProps = { ref: targetRef };\n    return children({ targetProps: targetProps, restProps: restProps });\n  }\n\n  var componentProps = _extends({}, restProps);\n\n  if (typeof component === 'string') {\n    componentProps.ref = targetRef;\n  } else {\n    componentProps.innerRef = targetRef;\n  }\n\n  return (0, _react.createElement)(component, componentProps, children);\n};\n\nTarget.contextTypes = {\n  popperManager: _propTypes2.default.object.isRequired\n};\n\nTarget.propTypes = {\n  component: _propTypes2.default.oneOfType([_propTypes2.default.node, _propTypes2.default.func]),\n  innerRef: _propTypes2.default.func,\n  children: _propTypes2.default.oneOfType([_propTypes2.default.node, _propTypes2.default.func])\n};\n\nexports.default = Target;","'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 = require('react');\n\nvar _propTypes = require('prop-types');\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nvar _popper = require('popper.js');\n\nvar _popper2 = _interopRequireDefault(_popper);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar Popper = function (_Component) {\n  _inherits(Popper, _Component);\n\n  function Popper() {\n    var _ref;\n\n    var _temp, _this, _ret;\n\n    _classCallCheck(this, Popper);\n\n    for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n      args[_key] = arguments[_key];\n    }\n\n    return _ret = (_temp = (_this = _possibleConstructorReturn(this, (_ref = Popper.__proto__ || Object.getPrototypeOf(Popper)).call.apply(_ref, [this].concat(args))), _this), _this.state = {}, _this._setArrowNode = function (node) {\n      _this._arrowNode = node;\n    }, _this._getTargetNode = function () {\n      return _this.context.popperManager.getTargetNode();\n    }, _this._getOffsets = function (data) {\n      return Object.keys(data.offsets).map(function (key) {\n        return data.offsets[key];\n      });\n    }, _this._isDataDirty = function (data) {\n      if (_this.state.data) {\n        return JSON.stringify(_this._getOffsets(_this.state.data)) !== JSON.stringify(_this._getOffsets(data));\n      } else {\n        return true;\n      }\n    }, _this._updateStateModifier = {\n      enabled: true,\n      order: 900,\n      fn: function fn(data) {\n        if (_this._isDataDirty(data)) {\n          _this.setState({ data: data });\n        }\n        return data;\n      }\n    }, _this._getPopperStyle = function () {\n      var data = _this.state.data;\n\n\n      if (!_this._popper || !data) {\n        return {\n          position: 'absolute',\n          pointerEvents: 'none',\n          opacity: 0\n        };\n      }\n\n      return _extends({\n        position: data.offsets.popper.position\n      }, data.styles);\n    }, _this._getPopperPlacement = function () {\n      return _this.state.data ? _this.state.data.placement : undefined;\n    }, _this._getPopperHide = function () {\n      return !!_this.state.data && _this.state.data.hide ? '' : undefined;\n    }, _this._getArrowStyle = function () {\n      if (!_this.state.data || !_this.state.data.offsets.arrow) {\n        return {};\n      } else {\n        var _this$state$data$offs = _this.state.data.offsets.arrow,\n            top = _this$state$data$offs.top,\n            left = _this$state$data$offs.left;\n\n        return { top: top, left: left };\n      }\n    }, _this._handlePopperRef = function (node) {\n      _this._popperNode = node;\n      if (node) {\n        _this._createPopper();\n      } else {\n        _this._destroyPopper();\n      }\n      if (_this.props.innerRef) {\n        _this.props.innerRef(node);\n      }\n    }, _this._scheduleUpdate = function () {\n      _this._popper && _this._popper.scheduleUpdate();\n    }, _temp), _possibleConstructorReturn(_this, _ret);\n  }\n\n  _createClass(Popper, [{\n    key: 'getChildContext',\n    value: function getChildContext() {\n      return {\n        popper: {\n          setArrowNode: this._setArrowNode,\n          getArrowStyle: this._getArrowStyle\n        }\n      };\n    }\n  }, {\n    key: 'componentDidUpdate',\n    value: function componentDidUpdate(lastProps) {\n      if (lastProps.placement !== this.props.placement || lastProps.eventsEnabled !== this.props.eventsEnabled) {\n        this._destroyPopper();\n        this._createPopper();\n      }\n      if (lastProps.children !== this.props.children) {\n        this._scheduleUpdate();\n      }\n    }\n  }, {\n    key: 'componentWillUnmount',\n    value: function componentWillUnmount() {\n      this._destroyPopper();\n    }\n  }, {\n    key: '_createPopper',\n    value: function _createPopper() {\n      var _this2 = this;\n\n      var _props = this.props,\n          placement = _props.placement,\n          eventsEnabled = _props.eventsEnabled;\n\n      var modifiers = _extends({}, this.props.modifiers, {\n        applyStyle: { enabled: false },\n        updateState: this._updateStateModifier\n      });\n      if (this._arrowNode) {\n        modifiers.arrow = {\n          element: this._arrowNode\n        };\n      }\n      this._popper = new _popper2.default(this._getTargetNode(), this._popperNode, {\n        placement: placement,\n        eventsEnabled: eventsEnabled,\n        modifiers: modifiers\n      });\n\n      // TODO: look into setTimeout scheduleUpdate call, without it, the popper will not position properly on creation\n      setTimeout(function () {\n        return _this2._scheduleUpdate();\n      });\n    }\n  }, {\n    key: '_destroyPopper',\n    value: function _destroyPopper() {\n      if (this._popper) {\n        this._popper.destroy();\n      }\n    }\n  }, {\n    key: 'render',\n    value: function render() {\n      var _props2 = this.props,\n          component = _props2.component,\n          innerRef = _props2.innerRef,\n          placement = _props2.placement,\n          eventsEnabled = _props2.eventsEnabled,\n          modifiers = _props2.modifiers,\n          children = _props2.children,\n          restProps = _objectWithoutProperties(_props2, ['component', 'innerRef', 'placement', 'eventsEnabled', 'modifiers', 'children']);\n\n      var popperStyle = this._getPopperStyle();\n      var popperPlacement = this._getPopperPlacement();\n      var popperHide = this._getPopperHide();\n\n      if (typeof children === 'function') {\n        var popperProps = {\n          ref: this._handlePopperRef,\n          style: popperStyle,\n          'data-placement': popperPlacement,\n          'data-x-out-of-boundaries': popperHide\n        };\n        return children({\n          popperProps: popperProps,\n          restProps: restProps,\n          scheduleUpdate: this._scheduleUpdate\n        });\n      }\n\n      var componentProps = _extends({}, restProps, {\n        style: _extends({}, restProps.style, popperStyle),\n        'data-placement': popperPlacement,\n        'data-x-out-of-boundaries': popperHide\n      });\n\n      if (typeof component === 'string') {\n        componentProps.ref = this._handlePopperRef;\n      } else {\n        componentProps.innerRef = this._handlePopperRef;\n      }\n\n      return (0, _react.createElement)(component, componentProps, children);\n    }\n  }]);\n\n  return Popper;\n}(_react.Component);\n\nPopper.contextTypes = {\n  popperManager: _propTypes2.default.object.isRequired\n};\nPopper.childContextTypes = {\n  popper: _propTypes2.default.object.isRequired\n};\nPopper.propTypes = {\n  component: _propTypes2.default.oneOfType([_propTypes2.default.node, _propTypes2.default.func]),\n  innerRef: _propTypes2.default.func,\n  placement: _propTypes2.default.oneOf(_popper2.default.placements),\n  eventsEnabled: _propTypes2.default.bool,\n  modifiers: _propTypes2.default.object,\n  children: _propTypes2.default.oneOfType([_propTypes2.default.node, _propTypes2.default.func])\n};\nPopper.defaultProps = {\n  component: 'div',\n  placement: 'bottom',\n  eventsEnabled: true,\n  modifiers: {}\n};\nexports.default = Popper;","'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 _react = require('react');\n\nvar _propTypes = require('prop-types');\n\nvar _propTypes2 = _interopRequireDefault(_propTypes);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }\n\nvar Arrow = function Arrow(props, context) {\n  var _props$component = props.component,\n      component = _props$component === undefined ? 'span' : _props$component,\n      innerRef = props.innerRef,\n      children = props.children,\n      restProps = _objectWithoutProperties(props, ['component', 'innerRef', 'children']);\n\n  var popper = context.popper;\n\n  var arrowRef = function arrowRef(node) {\n    popper.setArrowNode(node);\n    if (typeof innerRef === 'function') {\n      innerRef(node);\n    }\n  };\n  var arrowStyle = popper.getArrowStyle();\n\n  if (typeof children === 'function') {\n    var arrowProps = {\n      ref: arrowRef,\n      style: arrowStyle\n    };\n    return children({ arrowProps: arrowProps, restProps: restProps });\n  }\n\n  var componentProps = _extends({}, restProps, {\n    style: _extends({}, arrowStyle, restProps.style)\n  });\n\n  if (typeof component === 'string') {\n    componentProps.ref = arrowRef;\n  } else {\n    componentProps.innerRef = arrowRef;\n  }\n\n  return (0, _react.createElement)(component, componentProps, children);\n};\n\nArrow.contextTypes = {\n  popper: _propTypes2.default.object.isRequired\n};\n\nArrow.propTypes = {\n  component: _propTypes2.default.oneOfType([_propTypes2.default.node, _propTypes2.default.func]),\n  innerRef: _propTypes2.default.func,\n  children: _propTypes2.default.oneOfType([_propTypes2.default.node, _propTypes2.default.func])\n};\n\nexports.default = Arrow;","// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../../lib/codemirror\"), require(\"../xml/xml\"), require(\"../meta\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../../lib/codemirror\", \"../xml/xml\", \"../meta\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n\"use strict\";\n\nCodeMirror.defineMode(\"markdown\", function(cmCfg, modeCfg) {\n\n  var htmlMode = CodeMirror.getMode(cmCfg, \"text/html\");\n  var htmlModeMissing = htmlMode.name == \"null\"\n\n  function getMode(name) {\n    if (CodeMirror.findModeByName) {\n      var found = CodeMirror.findModeByName(name);\n      if (found) name = found.mime || found.mimes[0];\n    }\n    var mode = CodeMirror.getMode(cmCfg, name);\n    return mode.name == \"null\" ? null : mode;\n  }\n\n  // Should characters that affect highlighting be highlighted separate?\n  // Does not include characters that will be output (such as `1.` and `-` for lists)\n  if (modeCfg.highlightFormatting === undefined)\n    modeCfg.highlightFormatting = false;\n\n  // Maximum number of nested blockquotes. Set to 0 for infinite nesting.\n  // Excess `>` will emit `error` token.\n  if (modeCfg.maxBlockquoteDepth === undefined)\n    modeCfg.maxBlockquoteDepth = 0;\n\n  // Turn on task lists? (\"- [ ] \" and \"- [x] \")\n  if (modeCfg.taskLists === undefined) modeCfg.taskLists = false;\n\n  // Turn on strikethrough syntax\n  if (modeCfg.strikethrough === undefined)\n    modeCfg.strikethrough = false;\n\n  if (modeCfg.emoji === undefined)\n    modeCfg.emoji = false;\n\n  if (modeCfg.fencedCodeBlockHighlighting === undefined)\n    modeCfg.fencedCodeBlockHighlighting = true;\n\n  if (modeCfg.fencedCodeBlockDefaultMode === undefined)\n    modeCfg.fencedCodeBlockDefaultMode = 'text/plain';\n\n  if (modeCfg.xml === undefined)\n    modeCfg.xml = true;\n\n  // Allow token types to be overridden by user-provided token types.\n  if (modeCfg.tokenTypeOverrides === undefined)\n    modeCfg.tokenTypeOverrides = {};\n\n  var tokenTypes = {\n    header: \"header\",\n    code: \"comment\",\n    quote: \"quote\",\n    list1: \"variable-2\",\n    list2: \"variable-3\",\n    list3: \"keyword\",\n    hr: \"hr\",\n    image: \"image\",\n    imageAltText: \"image-alt-text\",\n    imageMarker: \"image-marker\",\n    formatting: \"formatting\",\n    linkInline: \"link\",\n    linkEmail: \"link\",\n    linkText: \"link\",\n    linkHref: \"string\",\n    em: \"em\",\n    strong: \"strong\",\n    strikethrough: \"strikethrough\",\n    emoji: \"builtin\"\n  };\n\n  for (var tokenType in tokenTypes) {\n    if (tokenTypes.hasOwnProperty(tokenType) && modeCfg.tokenTypeOverrides[tokenType]) {\n      tokenTypes[tokenType] = modeCfg.tokenTypeOverrides[tokenType];\n    }\n  }\n\n  var hrRE = /^([*\\-_])(?:\\s*\\1){2,}\\s*$/\n  ,   listRE = /^(?:[*\\-+]|^[0-9]+([.)]))\\s+/\n  ,   taskListRE = /^\\[(x| )\\](?=\\s)/i // Must follow listRE\n  ,   atxHeaderRE = modeCfg.allowAtxHeaderWithoutSpace ? /^(#+)/ : /^(#+)(?: |$)/\n  ,   setextHeaderRE = /^ {0,3}(?:\\={1,}|-{2,})\\s*$/\n  ,   textRE = /^[^#!\\[\\]*_\\\\<>` \"'(~:]+/\n  ,   fencedCodeRE = /^(~~~+|```+)[ \\t]*([\\w\\/+#-]*)[^\\n`]*$/\n  ,   linkDefRE = /^\\s*\\[[^\\]]+?\\]:.*$/ // naive link-definition\n  ,   punctuation = /[!\"#$%&'()*+,\\-.\\/:;<=>?@\\[\\\\\\]^_`{|}~\\xA1\\xA7\\xAB\\xB6\\xB7\\xBB\\xBF\\u037E\\u0387\\u055A-\\u055F\\u0589\\u058A\\u05BE\\u05C0\\u05C3\\u05C6\\u05F3\\u05F4\\u0609\\u060A\\u060C\\u060D\\u061B\\u061E\\u061F\\u066A-\\u066D\\u06D4\\u0700-\\u070D\\u07F7-\\u07F9\\u0830-\\u083E\\u085E\\u0964\\u0965\\u0970\\u0AF0\\u0DF4\\u0E4F\\u0E5A\\u0E5B\\u0F04-\\u0F12\\u0F14\\u0F3A-\\u0F3D\\u0F85\\u0FD0-\\u0FD4\\u0FD9\\u0FDA\\u104A-\\u104F\\u10FB\\u1360-\\u1368\\u1400\\u166D\\u166E\\u169B\\u169C\\u16EB-\\u16ED\\u1735\\u1736\\u17D4-\\u17D6\\u17D8-\\u17DA\\u1800-\\u180A\\u1944\\u1945\\u1A1E\\u1A1F\\u1AA0-\\u1AA6\\u1AA8-\\u1AAD\\u1B5A-\\u1B60\\u1BFC-\\u1BFF\\u1C3B-\\u1C3F\\u1C7E\\u1C7F\\u1CC0-\\u1CC7\\u1CD3\\u2010-\\u2027\\u2030-\\u2043\\u2045-\\u2051\\u2053-\\u205E\\u207D\\u207E\\u208D\\u208E\\u2308-\\u230B\\u2329\\u232A\\u2768-\\u2775\\u27C5\\u27C6\\u27E6-\\u27EF\\u2983-\\u2998\\u29D8-\\u29DB\\u29FC\\u29FD\\u2CF9-\\u2CFC\\u2CFE\\u2CFF\\u2D70\\u2E00-\\u2E2E\\u2E30-\\u2E42\\u3001-\\u3003\\u3008-\\u3011\\u3014-\\u301F\\u3030\\u303D\\u30A0\\u30FB\\uA4FE\\uA4FF\\uA60D-\\uA60F\\uA673\\uA67E\\uA6F2-\\uA6F7\\uA874-\\uA877\\uA8CE\\uA8CF\\uA8F8-\\uA8FA\\uA8FC\\uA92E\\uA92F\\uA95F\\uA9C1-\\uA9CD\\uA9DE\\uA9DF\\uAA5C-\\uAA5F\\uAADE\\uAADF\\uAAF0\\uAAF1\\uABEB\\uFD3E\\uFD3F\\uFE10-\\uFE19\\uFE30-\\uFE52\\uFE54-\\uFE61\\uFE63\\uFE68\\uFE6A\\uFE6B\\uFF01-\\uFF03\\uFF05-\\uFF0A\\uFF0C-\\uFF0F\\uFF1A\\uFF1B\\uFF1F\\uFF20\\uFF3B-\\uFF3D\\uFF3F\\uFF5B\\uFF5D\\uFF5F-\\uFF65]|\\uD800[\\uDD00-\\uDD02\\uDF9F\\uDFD0]|\\uD801\\uDD6F|\\uD802[\\uDC57\\uDD1F\\uDD3F\\uDE50-\\uDE58\\uDE7F\\uDEF0-\\uDEF6\\uDF39-\\uDF3F\\uDF99-\\uDF9C]|\\uD804[\\uDC47-\\uDC4D\\uDCBB\\uDCBC\\uDCBE-\\uDCC1\\uDD40-\\uDD43\\uDD74\\uDD75\\uDDC5-\\uDDC9\\uDDCD\\uDDDB\\uDDDD-\\uDDDF\\uDE38-\\uDE3D\\uDEA9]|\\uD805[\\uDCC6\\uDDC1-\\uDDD7\\uDE41-\\uDE43\\uDF3C-\\uDF3E]|\\uD809[\\uDC70-\\uDC74]|\\uD81A[\\uDE6E\\uDE6F\\uDEF5\\uDF37-\\uDF3B\\uDF44]|\\uD82F\\uDC9F|\\uD836[\\uDE87-\\uDE8B]/\n  ,   expandedTab = \"    \" // CommonMark specifies tab as 4 spaces\n\n  function switchInline(stream, state, f) {\n    state.f = state.inline = f;\n    return f(stream, state);\n  }\n\n  function switchBlock(stream, state, f) {\n    state.f = state.block = f;\n    return f(stream, state);\n  }\n\n  function lineIsEmpty(line) {\n    return !line || !/\\S/.test(line.string)\n  }\n\n  // Blocks\n\n  function blankLine(state) {\n    // Reset linkTitle state\n    state.linkTitle = false;\n    state.linkHref = false;\n    state.linkText = false;\n    // Reset EM state\n    state.em = false;\n    // Reset STRONG state\n    state.strong = false;\n    // Reset strikethrough state\n    state.strikethrough = false;\n    // Reset state.quote\n    state.quote = 0;\n    // Reset state.indentedCode\n    state.indentedCode = false;\n    if (state.f == htmlBlock) {\n      var exit = htmlModeMissing\n      if (!exit) {\n        var inner = CodeMirror.innerMode(htmlMode, state.htmlState)\n        exit = inner.mode.name == \"xml\" && inner.state.tagStart === null &&\n          (!inner.state.context && inner.state.tokenize.isInText)\n      }\n      if (exit) {\n        state.f = inlineNormal;\n        state.block = blockNormal;\n        state.htmlState = null;\n      }\n    }\n    // Reset state.trailingSpace\n    state.trailingSpace = 0;\n    state.trailingSpaceNewLine = false;\n    // Mark this line as blank\n    state.prevLine = state.thisLine\n    state.thisLine = {stream: null}\n    return null;\n  }\n\n  function blockNormal(stream, state) {\n    var firstTokenOnLine = stream.column() === state.indentation;\n    var prevLineLineIsEmpty = lineIsEmpty(state.prevLine.stream);\n    var prevLineIsIndentedCode = state.indentedCode;\n    var prevLineIsHr = state.prevLine.hr;\n    var prevLineIsList = state.list !== false;\n    var maxNonCodeIndentation = (state.listStack[state.listStack.length - 1] || 0) + 3;\n\n    state.indentedCode = false;\n\n    var lineIndentation = state.indentation;\n    // compute once per line (on first token)\n    if (state.indentationDiff === null) {\n      state.indentationDiff = state.indentation;\n      if (prevLineIsList) {\n        state.list = null;\n        // While this list item's marker's indentation is less than the deepest\n        //  list item's content's indentation,pop the deepest list item\n        //  indentation off the stack, and update block indentation state\n        while (lineIndentation < state.listStack[state.listStack.length - 1]) {\n          state.listStack.pop();\n          if (state.listStack.length) {\n            state.indentation = state.listStack[state.listStack.length - 1];\n          // less than the first list's indent -> the line is no longer a list\n          } else {\n            state.list = false;\n          }\n        }\n        if (state.list !== false) {\n          state.indentationDiff = lineIndentation - state.listStack[state.listStack.length - 1]\n        }\n      }\n    }\n\n    // not comprehensive (currently only for setext detection purposes)\n    var allowsInlineContinuation = (\n        !prevLineLineIsEmpty && !prevLineIsHr && !state.prevLine.header &&\n        (!prevLineIsList || !prevLineIsIndentedCode) &&\n        !state.prevLine.fencedCodeEnd\n    );\n\n    var isHr = (state.list === false || prevLineIsHr || prevLineLineIsEmpty) &&\n      state.indentation <= maxNonCodeIndentation && stream.match(hrRE);\n\n    var match = null;\n    if (state.indentationDiff >= 4 && (prevLineIsIndentedCode || state.prevLine.fencedCodeEnd ||\n         state.prevLine.header || prevLineLineIsEmpty)) {\n      stream.skipToEnd();\n      state.indentedCode = true;\n      return tokenTypes.code;\n    } else if (stream.eatSpace()) {\n      return null;\n    } else if (firstTokenOnLine && state.indentation <= maxNonCodeIndentation && (match = stream.match(atxHeaderRE)) && match[1].length <= 6) {\n      state.quote = 0;\n      state.header = match[1].length;\n      state.thisLine.header = true;\n      if (modeCfg.highlightFormatting) state.formatting = \"header\";\n      state.f = state.inline;\n      return getType(state);\n    } else if (state.indentation <= maxNonCodeIndentation && stream.eat('>')) {\n      state.quote = firstTokenOnLine ? 1 : state.quote + 1;\n      if (modeCfg.highlightFormatting) state.formatting = \"quote\";\n      stream.eatSpace();\n      return getType(state);\n    } else if (!isHr && !state.setext && firstTokenOnLine && state.indentation <= maxNonCodeIndentation && (match = stream.match(listRE))) {\n      var listType = match[1] ? \"ol\" : \"ul\";\n\n      state.indentation = lineIndentation + stream.current().length;\n      state.list = true;\n      state.quote = 0;\n\n      // Add this list item's content's indentation to the stack\n      state.listStack.push(state.indentation);\n      // Reset inline styles which shouldn't propagate across list items\n      state.em = false;\n      state.strong = false;\n      state.code = false;\n      state.strikethrough = false;\n\n      if (modeCfg.taskLists && stream.match(taskListRE, false)) {\n        state.taskList = true;\n      }\n      state.f = state.inline;\n      if (modeCfg.highlightFormatting) state.formatting = [\"list\", \"list-\" + listType];\n      return getType(state);\n    } else if (firstTokenOnLine && state.indentation <= maxNonCodeIndentation && (match = stream.match(fencedCodeRE, true))) {\n      state.quote = 0;\n      state.fencedEndRE = new RegExp(match[1] + \"+ *$\");\n      // try switching mode\n      state.localMode = modeCfg.fencedCodeBlockHighlighting && getMode(match[2] || modeCfg.fencedCodeBlockDefaultMode );\n      if (state.localMode) state.localState = CodeMirror.startState(state.localMode);\n      state.f = state.block = local;\n      if (modeCfg.highlightFormatting) state.formatting = \"code-block\";\n      state.code = -1\n      return getType(state);\n    // SETEXT has lowest block-scope precedence after HR, so check it after\n    //  the others (code, blockquote, list...)\n    } else if (\n      // if setext set, indicates line after ---/===\n      state.setext || (\n        // line before ---/===\n        (!allowsInlineContinuation || !prevLineIsList) && !state.quote && state.list === false &&\n        !state.code && !isHr && !linkDefRE.test(stream.string) &&\n        (match = stream.lookAhead(1)) && (match = match.match(setextHeaderRE))\n      )\n    ) {\n      if ( !state.setext ) {\n        state.header = match[0].charAt(0) == '=' ? 1 : 2;\n        state.setext = state.header;\n      } else {\n        state.header = state.setext;\n        // has no effect on type so we can reset it now\n        state.setext = 0;\n        stream.skipToEnd();\n        if (modeCfg.highlightFormatting) state.formatting = \"header\";\n      }\n      state.thisLine.header = true;\n      state.f = state.inline;\n      return getType(state);\n    } else if (isHr) {\n      stream.skipToEnd();\n      state.hr = true;\n      state.thisLine.hr = true;\n      return tokenTypes.hr;\n    } else if (stream.peek() === '[') {\n      return switchInline(stream, state, footnoteLink);\n    }\n\n    return switchInline(stream, state, state.inline);\n  }\n\n  function htmlBlock(stream, state) {\n    var style = htmlMode.token(stream, state.htmlState);\n    if (!htmlModeMissing) {\n      var inner = CodeMirror.innerMode(htmlMode, state.htmlState)\n      if ((inner.mode.name == \"xml\" && inner.state.tagStart === null &&\n           (!inner.state.context && inner.state.tokenize.isInText)) ||\n          (state.md_inside && stream.current().indexOf(\">\") > -1)) {\n        state.f = inlineNormal;\n        state.block = blockNormal;\n        state.htmlState = null;\n      }\n    }\n    return style;\n  }\n\n  function local(stream, state) {\n    var currListInd = state.listStack[state.listStack.length - 1] || 0;\n    var hasExitedList = state.indentation < currListInd;\n    var maxFencedEndInd = currListInd + 3;\n    if (state.fencedEndRE && state.indentation <= maxFencedEndInd && (hasExitedList || stream.match(state.fencedEndRE))) {\n      if (modeCfg.highlightFormatting) state.formatting = \"code-block\";\n      var returnType;\n      if (!hasExitedList) returnType = getType(state)\n      state.localMode = state.localState = null;\n      state.block = blockNormal;\n      state.f = inlineNormal;\n      state.fencedEndRE = null;\n      state.code = 0\n      state.thisLine.fencedCodeEnd = true;\n      if (hasExitedList) return switchBlock(stream, state, state.block);\n      return returnType;\n    } else if (state.localMode) {\n      return state.localMode.token(stream, state.localState);\n    } else {\n      stream.skipToEnd();\n      return tokenTypes.code;\n    }\n  }\n\n  // Inline\n  function getType(state) {\n    var styles = [];\n\n    if (state.formatting) {\n      styles.push(tokenTypes.formatting);\n\n      if (typeof state.formatting === \"string\") state.formatting = [state.formatting];\n\n      for (var i = 0; i < state.formatting.length; i++) {\n        styles.push(tokenTypes.formatting + \"-\" + state.formatting[i]);\n\n        if (state.formatting[i] === \"header\") {\n          styles.push(tokenTypes.formatting + \"-\" + state.formatting[i] + \"-\" + state.header);\n        }\n\n        // Add `formatting-quote` and `formatting-quote-#` for blockquotes\n        // Add `error` instead if the maximum blockquote nesting depth is passed\n        if (state.formatting[i] === \"quote\") {\n          if (!modeCfg.maxBlockquoteDepth || modeCfg.maxBlockquoteDepth >= state.quote) {\n            styles.push(tokenTypes.formatting + \"-\" + state.formatting[i] + \"-\" + state.quote);\n          } else {\n            styles.push(\"error\");\n          }\n        }\n      }\n    }\n\n    if (state.taskOpen) {\n      styles.push(\"meta\");\n      return styles.length ? styles.join(' ') : null;\n    }\n    if (state.taskClosed) {\n      styles.push(\"property\");\n      return styles.length ? styles.join(' ') : null;\n    }\n\n    if (state.linkHref) {\n      styles.push(tokenTypes.linkHref, \"url\");\n    } else { // Only apply inline styles to non-url text\n      if (state.strong) { styles.push(tokenTypes.strong); }\n      if (state.em) { styles.push(tokenTypes.em); }\n      if (state.strikethrough) { styles.push(tokenTypes.strikethrough); }\n      if (state.emoji) { styles.push(tokenTypes.emoji); }\n      if (state.linkText) { styles.push(tokenTypes.linkText); }\n      if (state.code) { styles.push(tokenTypes.code); }\n      if (state.image) { styles.push(tokenTypes.image); }\n      if (state.imageAltText) { styles.push(tokenTypes.imageAltText, \"link\"); }\n      if (state.imageMarker) { styles.push(tokenTypes.imageMarker); }\n    }\n\n    if (state.header) { styles.push(tokenTypes.header, tokenTypes.header + \"-\" + state.header); }\n\n    if (state.quote) {\n      styles.push(tokenTypes.quote);\n\n      // Add `quote-#` where the maximum for `#` is modeCfg.maxBlockquoteDepth\n      if (!modeCfg.maxBlockquoteDepth || modeCfg.maxBlockquoteDepth >= state.quote) {\n        styles.push(tokenTypes.quote + \"-\" + state.quote);\n      } else {\n        styles.push(tokenTypes.quote + \"-\" + modeCfg.maxBlockquoteDepth);\n      }\n    }\n\n    if (state.list !== false) {\n      var listMod = (state.listStack.length - 1) % 3;\n      if (!listMod) {\n        styles.push(tokenTypes.list1);\n      } else if (listMod === 1) {\n        styles.push(tokenTypes.list2);\n      } else {\n        styles.push(tokenTypes.list3);\n      }\n    }\n\n    if (state.trailingSpaceNewLine) {\n      styles.push(\"trailing-space-new-line\");\n    } else if (state.trailingSpace) {\n      styles.push(\"trailing-space-\" + (state.trailingSpace % 2 ? \"a\" : \"b\"));\n    }\n\n    return styles.length ? styles.join(' ') : null;\n  }\n\n  function handleText(stream, state) {\n    if (stream.match(textRE, true)) {\n      return getType(state);\n    }\n    return undefined;\n  }\n\n  function inlineNormal(stream, state) {\n    var style = state.text(stream, state);\n    if (typeof style !== 'undefined')\n      return style;\n\n    if (state.list) { // List marker (*, +, -, 1., etc)\n      state.list = null;\n      return getType(state);\n    }\n\n    if (state.taskList) {\n      var taskOpen = stream.match(taskListRE, true)[1] === \" \";\n      if (taskOpen) state.taskOpen = true;\n      else state.taskClosed = true;\n      if (modeCfg.highlightFormatting) state.formatting = \"task\";\n      state.taskList = false;\n      return getType(state);\n    }\n\n    state.taskOpen = false;\n    state.taskClosed = false;\n\n    if (state.header && stream.match(/^#+$/, true)) {\n      if (modeCfg.highlightFormatting) state.formatting = \"header\";\n      return getType(state);\n    }\n\n    var ch = stream.next();\n\n    // Matches link titles present on next line\n    if (state.linkTitle) {\n      state.linkTitle = false;\n      var matchCh = ch;\n      if (ch === '(') {\n        matchCh = ')';\n      }\n      matchCh = (matchCh+'').replace(/([.?*+^\\[\\]\\\\(){}|-])/g, \"\\\\$1\");\n      var regex = '^\\\\s*(?:[^' + matchCh + '\\\\\\\\]+|\\\\\\\\\\\\\\\\|\\\\\\\\.)' + matchCh;\n      if (stream.match(new RegExp(regex), true)) {\n        return tokenTypes.linkHref;\n      }\n    }\n\n    // If this block is changed, it may need to be updated in GFM mode\n    if (ch === '`') {\n      var previousFormatting = state.formatting;\n      if (modeCfg.highlightFormatting) state.formatting = \"code\";\n      stream.eatWhile('`');\n      var count = stream.current().length\n      if (state.code == 0 && (!state.quote || count == 1)) {\n        state.code = count\n        return getType(state)\n      } else if (count == state.code) { // Must be exact\n        var t = getType(state)\n        state.code = 0\n        return t\n      } else {\n        state.formatting = previousFormatting\n        return getType(state)\n      }\n    } else if (state.code) {\n      return getType(state);\n    }\n\n    if (ch === '\\\\') {\n      stream.next();\n      if (modeCfg.highlightFormatting) {\n        var type = getType(state);\n        var formattingEscape = tokenTypes.formatting + \"-escape\";\n        return type ? type + \" \" + formattingEscape : formattingEscape;\n      }\n    }\n\n    if (ch === '!' && stream.match(/\\[[^\\]]*\\] ?(?:\\(|\\[)/, false)) {\n      state.imageMarker = true;\n      state.image = true;\n      if (modeCfg.highlightFormatting) state.formatting = \"image\";\n      return getType(state);\n    }\n\n    if (ch === '[' && state.imageMarker && stream.match(/[^\\]]*\\](\\(.*?\\)| ?\\[.*?\\])/, false)) {\n      state.imageMarker = false;\n      state.imageAltText = true\n      if (modeCfg.highlightFormatting) state.formatting = \"image\";\n      return getType(state);\n    }\n\n    if (ch === ']' && state.imageAltText) {\n      if (modeCfg.highlightFormatting) state.formatting = \"image\";\n      var type = getType(state);\n      state.imageAltText = false;\n      state.image = false;\n      state.inline = state.f = linkHref;\n      return type;\n    }\n\n    if (ch === '[' && !state.image) {\n      if (state.linkText && stream.match(/^.*?\\]/)) return getType(state)\n      state.linkText = true;\n      if (modeCfg.highlightFormatting) state.formatting = \"link\";\n      return getType(state);\n    }\n\n    if (ch === ']' && state.linkText) {\n      if (modeCfg.highlightFormatting) state.formatting = \"link\";\n      var type = getType(state);\n      state.linkText = false;\n      state.inline = state.f = stream.match(/\\(.*?\\)| ?\\[.*?\\]/, false) ? linkHref : inlineNormal\n      return type;\n    }\n\n    if (ch === '<' && stream.match(/^(https?|ftps?):\\/\\/(?:[^\\\\>]|\\\\.)+>/, false)) {\n      state.f = state.inline = linkInline;\n      if (modeCfg.highlightFormatting) state.formatting = \"link\";\n      var type = getType(state);\n      if (type){\n        type += \" \";\n      } else {\n        type = \"\";\n      }\n      return type + tokenTypes.linkInline;\n    }\n\n    if (ch === '<' && stream.match(/^[^> \\\\]+@(?:[^\\\\>]|\\\\.)+>/, false)) {\n      state.f = state.inline = linkInline;\n      if (modeCfg.highlightFormatting) state.formatting = \"link\";\n      var type = getType(state);\n      if (type){\n        type += \" \";\n      } else {\n        type = \"\";\n      }\n      return type + tokenTypes.linkEmail;\n    }\n\n    if (modeCfg.xml && ch === '<' && stream.match(/^(!--|\\?|!\\[CDATA\\[|[a-z][a-z0-9-]*(?:\\s+[a-z_:.\\-]+(?:\\s*=\\s*[^>]+)?)*\\s*(?:>|$))/i, false)) {\n      var end = stream.string.indexOf(\">\", stream.pos);\n      if (end != -1) {\n        var atts = stream.string.substring(stream.start, end);\n        if (/markdown\\s*=\\s*('|\"){0,1}1('|\"){0,1}/.test(atts)) state.md_inside = true;\n      }\n      stream.backUp(1);\n      state.htmlState = CodeMirror.startState(htmlMode);\n      return switchBlock(stream, state, htmlBlock);\n    }\n\n    if (modeCfg.xml && ch === '<' && stream.match(/^\\/\\w*?>/)) {\n      state.md_inside = false;\n      return \"tag\";\n    } else if (ch === \"*\" || ch === \"_\") {\n      var len = 1, before = stream.pos == 1 ? \" \" : stream.string.charAt(stream.pos - 2)\n      while (len < 3 && stream.eat(ch)) len++\n      var after = stream.peek() || \" \"\n      // See http://spec.commonmark.org/0.27/#emphasis-and-strong-emphasis\n      var leftFlanking = !/\\s/.test(after) && (!punctuation.test(after) || /\\s/.test(before) || punctuation.test(before))\n      var rightFlanking = !/\\s/.test(before) && (!punctuation.test(before) || /\\s/.test(after) || punctuation.test(after))\n      var setEm = null, setStrong = null\n      if (len % 2) { // Em\n        if (!state.em && leftFlanking && (ch === \"*\" || !rightFlanking || punctuation.test(before)))\n          setEm = true\n        else if (state.em == ch && rightFlanking && (ch === \"*\" || !leftFlanking || punctuation.test(after)))\n          setEm = false\n      }\n      if (len > 1) { // Strong\n        if (!state.strong && leftFlanking && (ch === \"*\" || !rightFlanking || punctuation.test(before)))\n          setStrong = true\n        else if (state.strong == ch && rightFlanking && (ch === \"*\" || !leftFlanking || punctuation.test(after)))\n          setStrong = false\n      }\n      if (setStrong != null || setEm != null) {\n        if (modeCfg.highlightFormatting) state.formatting = setEm == null ? \"strong\" : setStrong == null ? \"em\" : \"strong em\"\n        if (setEm === true) state.em = ch\n        if (setStrong === true) state.strong = ch\n        var t = getType(state)\n        if (setEm === false) state.em = false\n        if (setStrong === false) state.strong = false\n        return t\n      }\n    } else if (ch === ' ') {\n      if (stream.eat('*') || stream.eat('_')) { // Probably surrounded by spaces\n        if (stream.peek() === ' ') { // Surrounded by spaces, ignore\n          return getType(state);\n        } else { // Not surrounded by spaces, back up pointer\n          stream.backUp(1);\n        }\n      }\n    }\n\n    if (modeCfg.strikethrough) {\n      if (ch === '~' && stream.eatWhile(ch)) {\n        if (state.strikethrough) {// Remove strikethrough\n          if (modeCfg.highlightFormatting) state.formatting = \"strikethrough\";\n          var t = getType(state);\n          state.strikethrough = false;\n          return t;\n        } else if (stream.match(/^[^\\s]/, false)) {// Add strikethrough\n          state.strikethrough = true;\n          if (modeCfg.highlightFormatting) state.formatting = \"strikethrough\";\n          return getType(state);\n        }\n      } else if (ch === ' ') {\n        if (stream.match('~~', true)) { // Probably surrounded by space\n          if (stream.peek() === ' ') { // Surrounded by spaces, ignore\n            return getType(state);\n          } else { // Not surrounded by spaces, back up pointer\n            stream.backUp(2);\n          }\n        }\n      }\n    }\n\n    if (modeCfg.emoji && ch === \":\" && stream.match(/^(?:[a-z_\\d+][a-z_\\d+-]*|\\-[a-z_\\d+][a-z_\\d+-]*):/)) {\n      state.emoji = true;\n      if (modeCfg.highlightFormatting) state.formatting = \"emoji\";\n      var retType = getType(state);\n      state.emoji = false;\n      return retType;\n    }\n\n    if (ch === ' ') {\n      if (stream.match(/^ +$/, false)) {\n        state.trailingSpace++;\n      } else if (state.trailingSpace) {\n        state.trailingSpaceNewLine = true;\n      }\n    }\n\n    return getType(state);\n  }\n\n  function linkInline(stream, state) {\n    var ch = stream.next();\n\n    if (ch === \">\") {\n      state.f = state.inline = inlineNormal;\n      if (modeCfg.highlightFormatting) state.formatting = \"link\";\n      var type = getType(state);\n      if (type){\n        type += \" \";\n      } else {\n        type = \"\";\n      }\n      return type + tokenTypes.linkInline;\n    }\n\n    stream.match(/^[^>]+/, true);\n\n    return tokenTypes.linkInline;\n  }\n\n  function linkHref(stream, state) {\n    // Check if space, and return NULL if so (to avoid marking the space)\n    if(stream.eatSpace()){\n      return null;\n    }\n    var ch = stream.next();\n    if (ch === '(' || ch === '[') {\n      state.f = state.inline = getLinkHrefInside(ch === \"(\" ? \")\" : \"]\");\n      if (modeCfg.highlightFormatting) state.formatting = \"link-string\";\n      state.linkHref = true;\n      return getType(state);\n    }\n    return 'error';\n  }\n\n  var linkRE = {\n    \")\": /^(?:[^\\\\\\(\\)]|\\\\.|\\((?:[^\\\\\\(\\)]|\\\\.)*\\))*?(?=\\))/,\n    \"]\": /^(?:[^\\\\\\[\\]]|\\\\.|\\[(?:[^\\\\\\[\\]]|\\\\.)*\\])*?(?=\\])/\n  }\n\n  function getLinkHrefInside(endChar) {\n    return function(stream, state) {\n      var ch = stream.next();\n\n      if (ch === endChar) {\n        state.f = state.inline = inlineNormal;\n        if (modeCfg.highlightFormatting) state.formatting = \"link-string\";\n        var returnState = getType(state);\n        state.linkHref = false;\n        return returnState;\n      }\n\n      stream.match(linkRE[endChar])\n      state.linkHref = true;\n      return getType(state);\n    };\n  }\n\n  function footnoteLink(stream, state) {\n    if (stream.match(/^([^\\]\\\\]|\\\\.)*\\]:/, false)) {\n      state.f = footnoteLinkInside;\n      stream.next(); // Consume [\n      if (modeCfg.highlightFormatting) state.formatting = \"link\";\n      state.linkText = true;\n      return getType(state);\n    }\n    return switchInline(stream, state, inlineNormal);\n  }\n\n  function footnoteLinkInside(stream, state) {\n    if (stream.match(']:', true)) {\n      state.f = state.inline = footnoteUrl;\n      if (modeCfg.highlightFormatting) state.formatting = \"link\";\n      var returnType = getType(state);\n      state.linkText = false;\n      return returnType;\n    }\n\n    stream.match(/^([^\\]\\\\]|\\\\.)+/, true);\n\n    return tokenTypes.linkText;\n  }\n\n  function footnoteUrl(stream, state) {\n    // Check if space, and return NULL if so (to avoid marking the space)\n    if(stream.eatSpace()){\n      return null;\n    }\n    // Match URL\n    stream.match(/^[^\\s]+/, true);\n    // Check for link title\n    if (stream.peek() === undefined) { // End of line, set flag to check next line\n      state.linkTitle = true;\n    } else { // More content on line, check if link title\n      stream.match(/^(?:\\s+(?:\"(?:[^\"\\\\]|\\\\.)+\"|'(?:[^'\\\\]|\\\\.)+'|\\((?:[^)\\\\]|\\\\.)+\\)))?/, true);\n    }\n    state.f = state.inline = inlineNormal;\n    return tokenTypes.linkHref + \" url\";\n  }\n\n  var mode = {\n    startState: function() {\n      return {\n        f: blockNormal,\n\n        prevLine: {stream: null},\n        thisLine: {stream: null},\n\n        block: blockNormal,\n        htmlState: null,\n        indentation: 0,\n\n        inline: inlineNormal,\n        text: handleText,\n\n        formatting: false,\n        linkText: false,\n        linkHref: false,\n        linkTitle: false,\n        code: 0,\n        em: false,\n        strong: false,\n        header: 0,\n        setext: 0,\n        hr: false,\n        taskList: false,\n        list: false,\n        listStack: [],\n        quote: 0,\n        trailingSpace: 0,\n        trailingSpaceNewLine: false,\n        strikethrough: false,\n        emoji: false,\n        fencedEndRE: null\n      };\n    },\n\n    copyState: function(s) {\n      return {\n        f: s.f,\n\n        prevLine: s.prevLine,\n        thisLine: s.thisLine,\n\n        block: s.block,\n        htmlState: s.htmlState && CodeMirror.copyState(htmlMode, s.htmlState),\n        indentation: s.indentation,\n\n        localMode: s.localMode,\n        localState: s.localMode ? CodeMirror.copyState(s.localMode, s.localState) : null,\n\n        inline: s.inline,\n        text: s.text,\n        formatting: false,\n        linkText: s.linkText,\n        linkTitle: s.linkTitle,\n        linkHref: s.linkHref,\n        code: s.code,\n        em: s.em,\n        strong: s.strong,\n        strikethrough: s.strikethrough,\n        emoji: s.emoji,\n        header: s.header,\n        setext: s.setext,\n        hr: s.hr,\n        taskList: s.taskList,\n        list: s.list,\n        listStack: s.listStack.slice(0),\n        quote: s.quote,\n        indentedCode: s.indentedCode,\n        trailingSpace: s.trailingSpace,\n        trailingSpaceNewLine: s.trailingSpaceNewLine,\n        md_inside: s.md_inside,\n        fencedEndRE: s.fencedEndRE\n      };\n    },\n\n    token: function(stream, state) {\n\n      // Reset state.formatting\n      state.formatting = false;\n\n      if (stream != state.thisLine.stream) {\n        state.header = 0;\n        state.hr = false;\n\n        if (stream.match(/^\\s*$/, true)) {\n          blankLine(state);\n          return null;\n        }\n\n        state.prevLine = state.thisLine\n        state.thisLine = {stream: stream}\n\n        // Reset state.taskList\n        state.taskList = false;\n\n        // Reset state.trailingSpace\n        state.trailingSpace = 0;\n        state.trailingSpaceNewLine = false;\n\n        if (!state.localState) {\n          state.f = state.block;\n          if (state.f != htmlBlock) {\n            var indentation = stream.match(/^\\s*/, true)[0].replace(/\\t/g, expandedTab).length;\n            state.indentation = indentation;\n            state.indentationDiff = null;\n            if (indentation > 0) return null;\n          }\n        }\n      }\n      return state.f(stream, state);\n    },\n\n    innerMode: function(state) {\n      if (state.block == htmlBlock) return {state: state.htmlState, mode: htmlMode};\n      if (state.localState) return {state: state.localState, mode: state.localMode};\n      return {state: state, mode: mode};\n    },\n\n    indent: function(state, textAfter, line) {\n      if (state.block == htmlBlock && htmlMode.indent) return htmlMode.indent(state.htmlState, textAfter, line)\n      if (state.localState && state.localMode.indent) return state.localMode.indent(state.localState, textAfter, line)\n      return CodeMirror.Pass\n    },\n\n    blankLine: blankLine,\n\n    getType: getType,\n\n    blockCommentStart: \"<!--\",\n    blockCommentEnd: \"-->\",\n    closeBrackets: \"()[]{}''\\\"\\\"``\",\n    fold: \"markdown\"\n  };\n  return mode;\n}, \"xml\");\n\nCodeMirror.defineMIME(\"text/markdown\", \"markdown\");\n\nCodeMirror.defineMIME(\"text/x-markdown\", \"markdown\");\n\n});\n","// CodeMirror, copyright (c) by Marijn Haverbeke and others\n// Distributed under an MIT license: https://codemirror.net/LICENSE\n\n(function(mod) {\n  if (typeof exports == \"object\" && typeof module == \"object\") // CommonJS\n    mod(require(\"../lib/codemirror\"));\n  else if (typeof define == \"function\" && define.amd) // AMD\n    define([\"../lib/codemirror\"], mod);\n  else // Plain browser env\n    mod(CodeMirror);\n})(function(CodeMirror) {\n  \"use strict\";\n\n  CodeMirror.modeInfo = [\n    {name: \"APL\", mime: \"text/apl\", mode: \"apl\", ext: [\"dyalog\", \"apl\"]},\n    {name: \"PGP\", mimes: [\"application/pgp\", \"application/pgp-encrypted\", \"application/pgp-keys\", \"application/pgp-signature\"], mode: \"asciiarmor\", ext: [\"asc\", \"pgp\", \"sig\"]},\n    {name: \"ASN.1\", mime: \"text/x-ttcn-asn\", mode: \"asn.1\", ext: [\"asn\", \"asn1\"]},\n    {name: \"Asterisk\", mime: \"text/x-asterisk\", mode: \"asterisk\", file: /^extensions\\.conf$/i},\n    {name: \"Brainfuck\", mime: \"text/x-brainfuck\", mode: \"brainfuck\", ext: [\"b\", \"bf\"]},\n    {name: \"C\", mime: \"text/x-csrc\", mode: \"clike\", ext: [\"c\", \"h\", \"ino\"]},\n    {name: \"C++\", mime: \"text/x-c++src\", mode: \"clike\", ext: [\"cpp\", \"c++\", \"cc\", \"cxx\", \"hpp\", \"h++\", \"hh\", \"hxx\"], alias: [\"cpp\"]},\n    {name: \"Cobol\", mime: \"text/x-cobol\", mode: \"cobol\", ext: [\"cob\", \"cpy\"]},\n    {name: \"C#\", mime: \"text/x-csharp\", mode: \"clike\", ext: [\"cs\"], alias: [\"csharp\", \"cs\"]},\n    {name: \"Clojure\", mime: \"text/x-clojure\", mode: \"clojure\", ext: [\"clj\", \"cljc\", \"cljx\"]},\n    {name: \"ClojureScript\", mime: \"text/x-clojurescript\", mode: \"clojure\", ext: [\"cljs\"]},\n    {name: \"Closure Stylesheets (GSS)\", mime: \"text/x-gss\", mode: \"css\", ext: [\"gss\"]},\n    {name: \"CMake\", mime: \"text/x-cmake\", mode: \"cmake\", ext: [\"cmake\", \"cmake.in\"], file: /^CMakeLists\\.txt$/},\n    {name: \"CoffeeScript\", mimes: [\"application/vnd.coffeescript\", \"text/coffeescript\", \"text/x-coffeescript\"], mode: \"coffeescript\", ext: [\"coffee\"], alias: [\"coffee\", \"coffee-script\"]},\n    {name: \"Common Lisp\", mime: \"text/x-common-lisp\", mode: \"commonlisp\", ext: [\"cl\", \"lisp\", \"el\"], alias: [\"lisp\"]},\n    {name: \"Cypher\", mime: \"application/x-cypher-query\", mode: \"cypher\", ext: [\"cyp\", \"cypher\"]},\n    {name: \"Cython\", mime: \"text/x-cython\", mode: \"python\", ext: [\"pyx\", \"pxd\", \"pxi\"]},\n    {name: \"Crystal\", mime: \"text/x-crystal\", mode: \"crystal\", ext: [\"cr\"]},\n    {name: \"CSS\", mime: \"text/css\", mode: \"css\", ext: [\"css\"]},\n    {name: \"CQL\", mime: \"text/x-cassandra\", mode: \"sql\", ext: [\"cql\"]},\n    {name: \"D\", mime: \"text/x-d\", mode: \"d\", ext: [\"d\"]},\n    {name: \"Dart\", mimes: [\"application/dart\", \"text/x-dart\"], mode: \"dart\", ext: [\"dart\"]},\n    {name: \"diff\", mime: \"text/x-diff\", mode: \"diff\", ext: [\"diff\", \"patch\"]},\n    {name: \"Django\", mime: \"text/x-django\", mode: \"django\"},\n    {name: \"Dockerfile\", mime: \"text/x-dockerfile\", mode: \"dockerfile\", file: /^Dockerfile$/},\n    {name: \"DTD\", mime: \"application/xml-dtd\", mode: \"dtd\", ext: [\"dtd\"]},\n    {name: \"Dylan\", mime: \"text/x-dylan\", mode: \"dylan\", ext: [\"dylan\", \"dyl\", \"intr\"]},\n    {name: \"EBNF\", mime: \"text/x-ebnf\", mode: \"ebnf\"},\n    {name: \"ECL\", mime: \"text/x-ecl\", mode: \"ecl\", ext: [\"ecl\"]},\n    {name: \"edn\", mime: \"application/edn\", mode: \"clojure\", ext: [\"edn\"]},\n    {name: \"Eiffel\", mime: \"text/x-eiffel\", mode: \"eiffel\", ext: [\"e\"]},\n    {name: \"Elm\", mime: \"text/x-elm\", mode: \"elm\", ext: [\"elm\"]},\n    {name: \"Embedded JavaScript\", mime: \"application/x-ejs\", mode: \"htmlembedded\", ext: [\"ejs\"]},\n    {name: \"Embedded Ruby\", mime: \"application/x-erb\", mode: \"htmlembedded\", ext: [\"erb\"]},\n    {name: \"Erlang\", mime: \"text/x-erlang\", mode: \"erlang\", ext: [\"erl\"]},\n    {name: \"Esper\", mime: \"text/x-esper\", mode: \"sql\"},\n    {name: \"Factor\", mime: \"text/x-factor\", mode: \"factor\", ext: [\"factor\"]},\n    {name: \"FCL\", mime: \"text/x-fcl\", mode: \"fcl\"},\n    {name: \"Forth\", mime: \"text/x-forth\", mode: \"forth\", ext: [\"forth\", \"fth\", \"4th\"]},\n    {name: \"Fortran\", mime: \"text/x-fortran\", mode: \"fortran\", ext: [\"f\", \"for\", \"f77\", \"f90\", \"f95\"]},\n    {name: \"F#\", mime: \"text/x-fsharp\", mode: \"mllike\", ext: [\"fs\"], alias: [\"fsharp\"]},\n    {name: \"Gas\", mime: \"text/x-gas\", mode: \"gas\", ext: [\"s\"]},\n    {name: \"Gherkin\", mime: \"text/x-feature\", mode: \"gherkin\", ext: [\"feature\"]},\n    {name: \"GitHub Flavored Markdown\", mime: \"text/x-gfm\", mode: \"gfm\", file: /^(readme|contributing|history)\\.md$/i},\n    {name: \"Go\", mime: \"text/x-go\", mode: \"go\", ext: [\"go\"]},\n    {name: \"Groovy\", mime: \"text/x-groovy\", mode: \"groovy\", ext: [\"groovy\", \"gradle\"], file: /^Jenkinsfile$/},\n    {name: \"HAML\", mime: \"text/x-haml\", mode: \"haml\", ext: [\"haml\"]},\n    {name: \"Haskell\", mime: \"text/x-haskell\", mode: \"haskell\", ext: [\"hs\"]},\n    {name: \"Haskell (Literate)\", mime: \"text/x-literate-haskell\", mode: \"haskell-literate\", ext: [\"lhs\"]},\n    {name: \"Haxe\", mime: \"text/x-haxe\", mode: \"haxe\", ext: [\"hx\"]},\n    {name: \"HXML\", mime: \"text/x-hxml\", mode: \"haxe\", ext: [\"hxml\"]},\n    {name: \"ASP.NET\", mime: \"application/x-aspx\", mode: \"htmlembedded\", ext: [\"aspx\"], alias: [\"asp\", \"aspx\"]},\n    {name: \"HTML\", mime: \"text/html\", mode: \"htmlmixed\", ext: [\"html\", \"htm\", \"handlebars\", \"hbs\"], alias: [\"xhtml\"]},\n    {name: \"HTTP\", mime: \"message/http\", mode: \"http\"},\n    {name: \"IDL\", mime: \"text/x-idl\", mode: \"idl\", ext: [\"pro\"]},\n    {name: \"Pug\", mime: \"text/x-pug\", mode: \"pug\", ext: [\"jade\", \"pug\"], alias: [\"jade\"]},\n    {name: \"Java\", mime: \"text/x-java\", mode: \"clike\", ext: [\"java\"]},\n    {name: \"Java Server Pages\", mime: \"application/x-jsp\", mode: \"htmlembedded\", ext: [\"jsp\"], alias: [\"jsp\"]},\n    {name: \"JavaScript\", mimes: [\"text/javascript\", \"text/ecmascript\", \"application/javascript\", \"application/x-javascript\", \"application/ecmascript\"],\n     mode: \"javascript\", ext: [\"js\"], alias: [\"ecmascript\", \"js\", \"node\"]},\n    {name: \"JSON\", mimes: [\"application/json\", \"application/x-json\"], mode: \"javascript\", ext: [\"json\", \"map\"], alias: [\"json5\"]},\n    {name: \"JSON-LD\", mime: \"application/ld+json\", mode: \"javascript\", ext: [\"jsonld\"], alias: [\"jsonld\"]},\n    {name: \"JSX\", mime: \"text/jsx\", mode: \"jsx\", ext: [\"jsx\"]},\n    {name: \"Jinja2\", mime: \"text/jinja2\", mode: \"jinja2\", ext: [\"j2\", \"jinja\", \"jinja2\"]},\n    {name: \"Julia\", mime: \"text/x-julia\", mode: \"julia\", ext: [\"jl\"]},\n    {name: \"Kotlin\", mime: \"text/x-kotlin\", mode: \"clike\", ext: [\"kt\"]},\n    {name: \"LESS\", mime: \"text/x-less\", mode: \"css\", ext: [\"less\"]},\n    {name: \"LiveScript\", mime: \"text/x-livescript\", mode: \"livescript\", ext: [\"ls\"], alias: [\"ls\"]},\n    {name: \"Lua\", mime: \"text/x-lua\", mode: \"lua\", ext: [\"lua\"]},\n    {name: \"Markdown\", mime: \"text/x-markdown\", mode: \"markdown\", ext: [\"markdown\", \"md\", \"mkd\"]},\n    {name: \"mIRC\", mime: \"text/mirc\", mode: \"mirc\"},\n    {name: \"MariaDB SQL\", mime: \"text/x-mariadb\", mode: \"sql\"},\n    {name: \"Mathematica\", mime: \"text/x-mathematica\", mode: \"mathematica\", ext: [\"m\", \"nb\", \"wl\", \"wls\"]},\n    {name: \"Modelica\", mime: \"text/x-modelica\", mode: \"modelica\", ext: [\"mo\"]},\n    {name: \"MUMPS\", mime: \"text/x-mumps\", mode: \"mumps\", ext: [\"mps\"]},\n    {name: \"MS SQL\", mime: \"text/x-mssql\", mode: \"sql\"},\n    {name: \"mbox\", mime: \"application/mbox\", mode: \"mbox\", ext: [\"mbox\"]},\n    {name: \"MySQL\", mime: \"text/x-mysql\", mode: \"sql\"},\n    {name: \"Nginx\", mime: \"text/x-nginx-conf\", mode: \"nginx\", file: /nginx.*\\.conf$/i},\n    {name: \"NSIS\", mime: \"text/x-nsis\", mode: \"nsis\", ext: [\"nsh\", \"nsi\"]},\n    {name: \"NTriples\", mimes: [\"application/n-triples\", \"application/n-quads\", \"text/n-triples\"],\n     mode: \"ntriples\", ext: [\"nt\", \"nq\"]},\n    {name: \"Objective-C\", mime: \"text/x-objectivec\", mode: \"clike\", ext: [\"m\"], alias: [\"objective-c\", \"objc\"]},\n    {name: \"Objective-C++\", mime: \"text/x-objectivec++\", mode: \"clike\", ext: [\"mm\"], alias: [\"objective-c++\", \"objc++\"]},\n    {name: \"OCaml\", mime: \"text/x-ocaml\", mode: \"mllike\", ext: [\"ml\", \"mli\", \"mll\", \"mly\"]},\n    {name: \"Octave\", mime: \"text/x-octave\", mode: \"octave\", ext: [\"m\"]},\n    {name: \"Oz\", mime: \"text/x-oz\", mode: \"oz\", ext: [\"oz\"]},\n    {name: \"Pascal\", mime: \"text/x-pascal\", mode: \"pascal\", ext: [\"p\", \"pas\"]},\n    {name: \"PEG.js\", mime: \"null\", mode: \"pegjs\", ext: [\"jsonld\"]},\n    {name: \"Perl\", mime: \"text/x-perl\", mode: \"perl\", ext: [\"pl\", \"pm\"]},\n    {name: \"PHP\", mimes: [\"text/x-php\", \"application/x-httpd-php\", \"application/x-httpd-php-open\"], mode: \"php\", ext: [\"php\", \"php3\", \"php4\", \"php5\", \"php7\", \"phtml\"]},\n    {name: \"Pig\", mime: \"text/x-pig\", mode: \"pig\", ext: [\"pig\"]},\n    {name: \"Plain Text\", mime: \"text/plain\", mode: \"null\", ext: [\"txt\", \"text\", \"conf\", \"def\", \"list\", \"log\"]},\n    {name: \"PLSQL\", mime: \"text/x-plsql\", mode: \"sql\", ext: [\"pls\"]},\n    {name: \"PostgreSQL\", mime: \"text/x-pgsql\", mode: \"sql\"},\n    {name: \"PowerShell\", mime: \"application/x-powershell\", mode: \"powershell\", ext: [\"ps1\", \"psd1\", \"psm1\"]},\n    {name: \"Properties files\", mime: \"text/x-properties\", mode: \"properties\", ext: [\"properties\", \"ini\", \"in\"], alias: [\"ini\", \"properties\"]},\n    {name: \"ProtoBuf\", mime: \"text/x-protobuf\", mode: \"protobuf\", ext: [\"proto\"]},\n    {name: \"Python\", mime: \"text/x-python\", mode: \"python\", ext: [\"BUILD\", \"bzl\", \"py\", \"pyw\"], file: /^(BUCK|BUILD)$/},\n    {name: \"Puppet\", mime: \"text/x-puppet\", mode: \"puppet\", ext: [\"pp\"]},\n    {name: \"Q\", mime: \"text/x-q\", mode: \"q\", ext: [\"q\"]},\n    {name: \"R\", mime: \"text/x-rsrc\", mode: \"r\", ext: [\"r\", \"R\"], alias: [\"rscript\"]},\n    {name: \"reStructuredText\", mime: \"text/x-rst\", mode: \"rst\", ext: [\"rst\"], alias: [\"rst\"]},\n    {name: \"RPM Changes\", mime: \"text/x-rpm-changes\", mode: \"rpm\"},\n    {name: \"RPM Spec\", mime: \"text/x-rpm-spec\", mode: \"rpm\", ext: [\"spec\"]},\n    {name: \"Ruby\", mime: \"text/x-ruby\", mode: \"ruby\", ext: [\"rb\"], alias: [\"jruby\", \"macruby\", \"rake\", \"rb\", \"rbx\"]},\n    {name: \"Rust\", mime: \"text/x-rustsrc\", mode: \"rust\", ext: [\"rs\"]},\n    {name: \"SAS\", mime: \"text/x-sas\", mode: \"sas\", ext: [\"sas\"]},\n    {name: \"Sass\", mime: \"text/x-sass\", mode: \"sass\", ext: [\"sass\"]},\n    {name: \"Scala\", mime: \"text/x-scala\", mode: \"clike\", ext: [\"scala\"]},\n    {name: \"Scheme\", mime: \"text/x-scheme\", mode: \"scheme\", ext: [\"scm\", \"ss\"]},\n    {name: \"SCSS\", mime: \"text/x-scss\", mode: \"css\", ext: [\"scss\"]},\n    {name: \"Shell\", mimes: [\"text/x-sh\", \"application/x-sh\"], mode: \"shell\", ext: [\"sh\", \"ksh\", \"bash\"], alias: [\"bash\", \"sh\", \"zsh\"], file: /^PKGBUILD$/},\n    {name: \"Sieve\", mime: \"application/sieve\", mode: \"sieve\", ext: [\"siv\", \"sieve\"]},\n    {name: \"Slim\", mimes: [\"text/x-slim\", \"application/x-slim\"], mode: \"slim\", ext: [\"slim\"]},\n    {name: \"Smalltalk\", mime: \"text/x-stsrc\", mode: \"smalltalk\", ext: [\"st\"]},\n    {name: \"Smarty\", mime: \"text/x-smarty\", mode: \"smarty\", ext: [\"tpl\"]},\n    {name: \"Solr\", mime: \"text/x-solr\", mode: \"solr\"},\n    {name: \"SML\", mime: \"text/x-sml\", mode: \"mllike\", ext: [\"sml\", \"sig\", \"fun\", \"smackspec\"]},\n    {name: \"Soy\", mime: \"text/x-soy\", mode: \"soy\", ext: [\"soy\"], alias: [\"closure template\"]},\n    {name: \"SPARQL\", mime: \"application/sparql-query\", mode: \"sparql\", ext: [\"rq\", \"sparql\"], alias: [\"sparul\"]},\n    {name: \"Spreadsheet\", mime: \"text/x-spreadsheet\", mode: \"spreadsheet\", alias: [\"excel\", \"formula\"]},\n    {name: \"SQL\", mime: \"text/x-sql\", mode: \"sql\", ext: [\"sql\"]},\n    {name: \"SQLite\", mime: \"text/x-sqlite\", mode: \"sql\"},\n    {name: \"Squirrel\", mime: \"text/x-squirrel\", mode: \"clike\", ext: [\"nut\"]},\n    {name: \"Stylus\", mime: \"text/x-styl\", mode: \"stylus\", ext: [\"styl\"]},\n    {name: \"Swift\", mime: \"text/x-swift\", mode: \"swift\", ext: [\"swift\"]},\n    {name: \"sTeX\", mime: \"text/x-stex\", mode: \"stex\"},\n    {name: \"LaTeX\", mime: \"text/x-latex\", mode: \"stex\", ext: [\"text\", \"ltx\", \"tex\"], alias: [\"tex\"]},\n    {name: \"SystemVerilog\", mime: \"text/x-systemverilog\", mode: \"verilog\", ext: [\"v\", \"sv\", \"svh\"]},\n    {name: \"Tcl\", mime: \"text/x-tcl\", mode: \"tcl\", ext: [\"tcl\"]},\n    {name: \"Textile\", mime: \"text/x-textile\", mode: \"textile\", ext: [\"textile\"]},\n    {name: \"TiddlyWiki\", mime: \"text/x-tiddlywiki\", mode: \"tiddlywiki\"},\n    {name: \"Tiki wiki\", mime: \"text/tiki\", mode: \"tiki\"},\n    {name: \"TOML\", mime: \"text/x-toml\", mode: \"toml\", ext: [\"toml\"]},\n    {name: \"Tornado\", mime: \"text/x-tornado\", mode: \"tornado\"},\n    {name: \"troff\", mime: \"text/troff\", mode: \"troff\", ext: [\"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\"]},\n    {name: \"TTCN\", mime: \"text/x-ttcn\", mode: \"ttcn\", ext: [\"ttcn\", \"ttcn3\", \"ttcnpp\"]},\n    {name: \"TTCN_CFG\", mime: \"text/x-ttcn-cfg\", mode: \"ttcn-cfg\", ext: [\"cfg\"]},\n    {name: \"Turtle\", mime: \"text/turtle\", mode: \"turtle\", ext: [\"ttl\"]},\n    {name: \"TypeScript\", mime: \"application/typescript\", mode: \"javascript\", ext: [\"ts\"], alias: [\"ts\"]},\n    {name: \"TypeScript-JSX\", mime: \"text/typescript-jsx\", mode: \"jsx\", ext: [\"tsx\"], alias: [\"tsx\"]},\n    {name: \"Twig\", mime: \"text/x-twig\", mode: \"twig\"},\n    {name: \"Web IDL\", mime: \"text/x-webidl\", mode: \"webidl\", ext: [\"webidl\"]},\n    {name: \"VB.NET\", mime: \"text/x-vb\", mode: \"vb\", ext: [\"vb\"]},\n    {name: \"VBScript\", mime: \"text/vbscript\", mode: \"vbscript\", ext: [\"vbs\"]},\n    {name: \"Velocity\", mime: \"text/velocity\", mode: \"velocity\", ext: [\"vtl\"]},\n    {name: \"Verilog\", mime: \"text/x-verilog\", mode: \"verilog\", ext: [\"v\"]},\n    {name: \"VHDL\", mime: \"text/x-vhdl\", mode: \"vhdl\", ext: [\"vhd\", \"vhdl\"]},\n    {name: \"Vue.js Component\", mimes: [\"script/x-vue\", \"text/x-vue\"], mode: \"vue\", ext: [\"vue\"]},\n    {name: \"XML\", mimes: [\"application/xml\", \"text/xml\"], mode: \"xml\", ext: [\"xml\", \"xsl\", \"xsd\", \"svg\"], alias: [\"rss\", \"wsdl\", \"xsd\"]},\n    {name: \"XQuery\", mime: \"application/xquery\", mode: \"xquery\", ext: [\"xy\", \"xquery\"]},\n    {name: \"Yacas\", mime: \"text/x-yacas\", mode: \"yacas\", ext: [\"ys\"]},\n    {name: \"YAML\", mimes: [\"text/x-yaml\", \"text/yaml\"], mode: \"yaml\", ext: [\"yaml\", \"yml\"], alias: [\"yml\"]},\n    {name: \"Z80\", mime: \"text/x-z80\", mode: \"z80\", ext: [\"z80\"]},\n    {name: \"mscgen\", mime: \"text/x-mscgen\", mode: \"mscgen\", ext: [\"mscgen\", \"mscin\", \"msc\"]},\n    {name: \"xu\", mime: \"text/x-xu\", mode: \"mscgen\", ext: [\"xu\"]},\n    {name: \"msgenny\", mime: \"text/x-msgenny\", mode: \"mscgen\", ext: [\"msgenny\"]},\n    {name: \"WebAssembly\", mime: \"text/webassembly\", mode: \"wast\", ext: [\"wat\", \"wast\"]},\n  ];\n  // Ensure all modes have a mime property for backwards compatibility\n  for (var i = 0; i < CodeMirror.modeInfo.length; i++) {\n    var info = CodeMirror.modeInfo[i];\n    if (info.mimes) info.mime = info.mimes[0];\n  }\n\n  CodeMirror.findModeByMIME = function(mime) {\n    mime = mime.toLowerCase();\n    for (var i = 0; i < CodeMirror.modeInfo.length; i++) {\n      var info = CodeMirror.modeInfo[i];\n      if (info.mime == mime) return info;\n      if (info.mimes) for (var j = 0; j < info.mimes.length; j++)\n        if (info.mimes[j] == mime) return info;\n    }\n    if (/\\+xml$/.test(mime)) return CodeMirror.findModeByMIME(\"application/xml\")\n    if (/\\+json$/.test(mime)) return CodeMirror.findModeByMIME(\"application/json\")\n  };\n\n  CodeMirror.findModeByExtension = function(ext) {\n    ext = ext.toLowerCase();\n    for (var i = 0; i < CodeMirror.modeInfo.length; i++) {\n      var info = CodeMirror.modeInfo[i];\n      if (info.ext) for (var j = 0; j < info.ext.length; j++)\n        if (info.ext[j] == ext) return info;\n    }\n  };\n\n  CodeMirror.findModeByFileName = function(filename) {\n    for (var i = 0; i < CodeMirror.modeInfo.length; i++) {\n      var info = CodeMirror.modeInfo[i];\n      if (info.file && info.file.test(filename)) return info;\n    }\n    var dot = filename.lastIndexOf(\".\");\n    var ext = dot > -1 && filename.substring(dot + 1, filename.length);\n    if (ext) return CodeMirror.findModeByExtension(ext);\n  };\n\n  CodeMirror.findModeByName = function(name) {\n    name = name.toLowerCase();\n    for (var i = 0; i < CodeMirror.modeInfo.length; i++) {\n      var info = CodeMirror.modeInfo[i];\n      if (info.name.toLowerCase() == name) return info;\n      if (info.alias) for (var j = 0; j < info.alias.length; j++)\n        if (info.alias[j].toLowerCase() == name) return info;\n    }\n  };\n});\n","var baseIsEqualDeep = require('./_baseIsEqualDeep'),\n    isObjectLike = require('./isObjectLike');\n\n/**\n * The base implementation of `_.isEqual` which supports partial comparisons\n * and tracks traversed objects.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @param {boolean} bitmask The bitmask flags.\n *  1 - Unordered comparison\n *  2 - Partial comparison\n * @param {Function} [customizer] The function to customize comparisons.\n * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n */\nfunction baseIsEqual(value, other, bitmask, customizer, stack) {\n  if (value === other) {\n    return true;\n  }\n  if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n    return value !== value && other !== other;\n  }\n  return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);\n}\n\nmodule.exports = baseIsEqual;\n","var getNative = require('./_getNative'),\n    root = require('./_root');\n\n/* Built-in method references that are verified to be native. */\nvar Map = getNative(root, 'Map');\n\nmodule.exports = Map;\n","/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n  var type = typeof value;\n  return value != null && (type == 'object' || type == 'function');\n}\n\nmodule.exports = isObject;\n","var mapCacheClear = require('./_mapCacheClear'),\n    mapCacheDelete = require('./_mapCacheDelete'),\n    mapCacheGet = require('./_mapCacheGet'),\n    mapCacheHas = require('./_mapCacheHas'),\n    mapCacheSet = require('./_mapCacheSet');\n\n/**\n * Creates a map cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction MapCache(entries) {\n  var index = -1,\n      length = entries == null ? 0 : entries.length;\n\n  this.clear();\n  while (++index < length) {\n    var entry = entries[index];\n    this.set(entry[0], entry[1]);\n  }\n}\n\n// Add methods to `MapCache`.\nMapCache.prototype.clear = mapCacheClear;\nMapCache.prototype['delete'] = mapCacheDelete;\nMapCache.prototype.get = mapCacheGet;\nMapCache.prototype.has = mapCacheHas;\nMapCache.prototype.set = mapCacheSet;\n\nmodule.exports = MapCache;\n","var arrayLikeKeys = require('./_arrayLikeKeys'),\n    baseKeys = require('./_baseKeys'),\n    isArrayLike = require('./isArrayLike');\n\n/**\n * Creates an array of the own enumerable property names of `object`.\n *\n * **Note:** Non-object values are coerced to objects. See the\n * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n * for more details.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @returns {Array} Returns the array of property names.\n * @example\n *\n * function Foo() {\n *   this.a = 1;\n *   this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.keys(new Foo);\n * // => ['a', 'b'] (iteration order is not guaranteed)\n *\n * _.keys('hi');\n * // => ['0', '1']\n */\nfunction keys(object) {\n  return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);\n}\n\nmodule.exports = keys;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/**\n * Checks if `value` is a valid array-like length.\n *\n * **Note:** This method is loosely based on\n * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n * @example\n *\n * _.isLength(3);\n * // => true\n *\n * _.isLength(Number.MIN_VALUE);\n * // => false\n *\n * _.isLength(Infinity);\n * // => false\n *\n * _.isLength('3');\n * // => false\n */\nfunction isLength(value) {\n  return typeof value == 'number' &&\n    value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;\n}\n\nmodule.exports = isLength;\n","var isArray = require('./isArray'),\n    isSymbol = require('./isSymbol');\n\n/** Used to match property names within property paths. */\nvar reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n    reIsPlainProp = /^\\w*$/;\n\n/**\n * Checks if `value` is a property name and not a property path.\n *\n * @private\n * @param {*} value The value to check.\n * @param {Object} [object] The object to query keys on.\n * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n */\nfunction isKey(value, object) {\n  if (isArray(value)) {\n    return false;\n  }\n  var type = typeof value;\n  if (type == 'number' || type == 'symbol' || type == 'boolean' ||\n      value == null || isSymbol(value)) {\n    return true;\n  }\n  return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||\n    (object != null && value in Object(object));\n}\n\nmodule.exports = isKey;\n","var baseGetTag = require('./_baseGetTag'),\n    isObjectLike = require('./isObjectLike');\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n  return typeof value == 'symbol' ||\n    (isObjectLike(value) && baseGetTag(value) == symbolTag);\n}\n\nmodule.exports = isSymbol;\n","import _classCallCheck from \"@babel/runtime/helpers/esm/classCallCheck\";\nimport _createClass from \"@babel/runtime/helpers/esm/createClass\";\nimport _inherits from \"@babel/runtime/helpers/esm/inherits\";\nimport _createSuper from \"@babel/runtime/helpers/esm/createSuper\";\nimport React from 'react';\nimport { css } from 'glamor';\n\nvar Alert = /*#__PURE__*/function (_React$PureComponent) {\n  _inherits(Alert, _React$PureComponent);\n\n  var _super = _createSuper(Alert);\n\n  function Alert(props) {\n    var _this;\n\n    _classCallCheck(this, Alert);\n\n    _this = _super.call(this, props);\n    _this.containerStyle = css({\n      borderRadius: '3px',\n      backgroundColor: '#fff',\n      padding: '10px 16px',\n      display: 'flex',\n      boxSizing: 'border-box',\n      boxShadow: 'rgba(67, 90, 111, 0.3) 0px 0px 1px, rgba(67, 90, 111, 0.47) 0px 8px 10px -4px',\n      justifyContent: 'space-between',\n      flexDirection: 'row'\n    });\n    _this.containerBorderSuccess = css({\n      borderLeft: '3px solid rgb(71, 184, 129)'\n    });\n    _this.containerBorderWarn = css({\n      borderLeft: '3px solid rgb(217, 130, 43)'\n    });\n    _this.containerBorderDanger = css({\n      borderLeft: '3px solid rgb(236, 76, 71)'\n    });\n    _this.containerBorderNotify = css({\n      borderLeft: '3px solid rgb(16, 112, 202)'\n    });\n    _this.toastTextTitle = css({\n      fontWeight: '600',\n      fontSize: '14px',\n      color: '#435a6f',\n      margin: '0'\n    });\n    _this.toastTextChild = css({\n      fontSize: '14px',\n      color: '#999',\n      margin: '0'\n    });\n    _this.toastClose = css({\n      marginLeft: '15px',\n      height: '24px',\n      width: '24px',\n      lineHeight: '22px',\n      fontWeight: '700',\n      textAlign: 'center',\n      fontSize: '20px',\n      color: '#000',\n      cursor: 'pointer',\n      opacity: '0.5',\n      ':hover': {\n        opacity: 1\n      }\n    });\n    _this.toastIcon = css({\n      marginRight: '10px',\n      width: '14px',\n      height: '20px',\n      lineHeight: '20px'\n    });\n    return _this;\n  }\n\n  _createClass(Alert, [{\n    key: \"getContainerStyle\",\n    value: function getContainerStyle(intent) {\n      switch (intent) {\n        case 'success':\n          return {\n            borderStyle: this.containerBorderSuccess,\n            iconColor: css({\n              color: 'rgb(71, 184, 129)'\n            }),\n            iconClass: 'iconfont icon-check-circle'\n          };\n\n        case 'warning':\n          return {\n            borderStyle: this.containerBorderWarn,\n            iconColor: css({\n              color: 'rgb(217, 130, 43)'\n            }),\n            iconClass: 'iconfont icon-exclamation-triangle'\n          };\n\n        case 'none':\n          return {\n            borderStyle: this.containerBorderNotify,\n            iconColor: css({\n              color: 'rgb(16, 112, 202)'\n            }),\n            iconClass: 'iconfont icon-exclamation-circle'\n          };\n\n        case 'danger':\n          return {\n            borderStyle: this.containerBorderDanger,\n            iconColor: css({\n              color: 'rgb(236, 76, 71)'\n            }),\n            iconClass: 'iconfont icon-exclamation-circle'\n          };\n\n        default:\n          return {\n            borderStyle: this.containerBorderNotify,\n            iconColor: css({\n              color: 'rgb(16, 112, 202)'\n            }),\n            iconClass: 'iconfont icon-exclamation-circle'\n          };\n      }\n    }\n  }, {\n    key: \"render\",\n    value: function render() {\n      var toastStyle = this.getContainerStyle(this.props.intent);\n      return /*#__PURE__*/React.createElement(\"div\", css(toastStyle.borderStyle, this.containerStyle), /*#__PURE__*/React.createElement(\"div\", {\n        className: this.toastIcon\n      }, /*#__PURE__*/React.createElement(\"i\", Object.assign({\n        className: toastStyle.iconClass\n      }, toastStyle.iconColor))), /*#__PURE__*/React.createElement(\"div\", {\n        className: this.toastTextContainer\n      }, /*#__PURE__*/React.createElement(\"p\", {\n        className: this.toastTextTitle\n      }, this.props.title), this.props.children ? /*#__PURE__*/React.createElement(\"p\", {\n        className: this.toastTextChild\n      }, this.props.children) : null), /*#__PURE__*/React.createElement(\"div\", {\n        onClick: this.props.onRemove,\n        className: this.toastClose\n      }, /*#__PURE__*/React.createElement(\"span\", null, \"\\xD7\")));\n    }\n  }]);\n\n  return Alert;\n}(React.PureComponent);\n\nexport default Alert;","import _classCallCheck from \"@babel/runtime/helpers/esm/classCallCheck\";\nimport _createClass from \"@babel/runtime/helpers/esm/createClass\";\nimport _inherits from \"@babel/runtime/helpers/esm/inherits\";\nimport _createSuper from \"@babel/runtime/helpers/esm/createSuper\";\nimport React from 'react';\nimport { css } from 'glamor';\nimport Transition from 'react-transition-group/Transition';\nimport Alert from './alert';\nvar animationEasing = {\n  deceleration: 'cubic-bezier(0.0, 0.0, 0.2, 1)',\n  acceleration: 'cubic-bezier(0.4, 0.0, 1, 1)',\n  spring: 'cubic-bezier(0.175, 0.885, 0.320, 1.175)'\n};\nvar ANIMATION_DURATION = 240;\nvar openAnimation = css.keyframes('openAnimation', {\n  from: {\n    opacity: 0,\n    transform: 'translateY(-120%)'\n  },\n  to: {\n    transform: 'translateY(0)'\n  }\n});\nvar closeAnimation = css.keyframes('closeAnimation', {\n  from: {\n    transform: 'scale(1)',\n    opacity: 1\n  },\n  to: {\n    transform: 'scale(0.9)',\n    opacity: 0\n  }\n});\nvar animationStyles = css({\n  display: 'flex',\n  flexDirection: 'column',\n  alignItems: 'center',\n  height: 0,\n  transition: \"all \".concat(ANIMATION_DURATION, \"ms \").concat(animationEasing.deceleration),\n  '&[data-state=\"entering\"], &[data-state=\"entered\"]': {\n    animation: \"\".concat(openAnimation, \" \").concat(ANIMATION_DURATION, \"ms \").concat(animationEasing.spring, \" both\")\n  },\n  '&[data-state=\"exiting\"]': {\n    animation: \"\".concat(closeAnimation, \" 120ms \").concat(animationEasing.acceleration, \" both\")\n  }\n});\n\nvar Toast = /*#__PURE__*/function (_React$PureComponent) {\n  _inherits(Toast, _React$PureComponent);\n\n  var _super = _createSuper(Toast);\n\n  function Toast() {\n    var _this;\n\n    _classCallCheck(this, Toast);\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 = _super.call.apply(_super, [this].concat(args));\n    _this.state = {\n      isShown: true,\n      height: 0\n    };\n\n    _this.close = function () {\n      _this.clearCloseTimer();\n\n      _this.setState({\n        isShown: false\n      });\n    };\n\n    _this.startCloseTimer = function () {\n      if (_this.props.duration) {\n        _this.closeTimer = setTimeout(function () {\n          _this.close();\n        }, _this.props.duration * 1000);\n      }\n    };\n\n    _this.clearCloseTimer = function () {\n      if (_this.closeTimer) {\n        clearTimeout(_this.closeTimer);\n        _this.closeTimer = null;\n      }\n    };\n\n    _this.handleMouseEnter = function () {\n      _this.clearCloseTimer();\n    };\n\n    _this.handleMouseLeave = function () {\n      _this.startCloseTimer();\n    };\n\n    _this.onRef = function (ref) {\n      if (ref === null) return;\n\n      var _ref$getBoundingClien = ref.getBoundingClientRect(),\n          height = _ref$getBoundingClien.height;\n\n      _this.setState({\n        height: height\n      });\n    };\n\n    return _this;\n  }\n\n  _createClass(Toast, [{\n    key: \"componentDidUpdate\",\n    value: function componentDidUpdate(prevProps) {\n      if (prevProps.isShown !== this.props.isShown) {\n        // eslint-disable-next-line react/no-did-update-set-state\n        this.setState({\n          isShown: this.props.isShown\n        });\n      }\n    }\n  }, {\n    key: \"componentDidMount\",\n    value: function componentDidMount() {\n      this.startCloseTimer();\n    }\n  }, {\n    key: \"componentWillUnmount\",\n    value: function componentWillUnmount() {\n      this.clearCloseTimer();\n    }\n  }, {\n    key: \"render\",\n    value: function render() {\n      var _this2 = this;\n\n      return /*#__PURE__*/React.createElement(Transition, {\n        appear: true,\n        unmountOnExit: true,\n        timeout: ANIMATION_DURATION,\n        in: this.state.isShown,\n        onExited: this.props.onRemove\n      }, function (state) {\n        return /*#__PURE__*/React.createElement(\"div\", {\n          \"data-state\": state,\n          className: animationStyles,\n          onMouseEnter: _this2.handleMouseEnter,\n          onMouseLeave: _this2.handleMouseLeave,\n          style: {\n            height: _this2.state.height,\n            zIndex: _this2.props.zIndex,\n            marginBottom: _this2.state.isShown ? 0 : -_this2.state.height\n          }\n        }, /*#__PURE__*/React.createElement(\"div\", {\n          ref: _this2.onRef,\n          style: {\n            padding: 8\n          }\n        }, /*#__PURE__*/React.createElement(Alert, {\n          intent: _this2.props.intent,\n          title: _this2.props.title,\n          children: _this2.props.children,\n          isRemoveable: _this2.props.hasCloseButton,\n          onRemove: function onRemove() {\n            return _this2.close();\n          }\n        })));\n      });\n    }\n  }]);\n\n  return Toast;\n}(React.PureComponent);\n\nToast.defaultProps = {\n  intent: 'none'\n};\nexport { Toast as default };","import _objectWithoutProperties from \"@babel/runtime/helpers/esm/objectWithoutProperties\";\nimport _objectSpread from \"@babel/runtime/helpers/esm/objectSpread2\";\nimport _toConsumableArray from \"@babel/runtime/helpers/esm/toConsumableArray\";\nimport _createForOfIteratorHelper from \"@babel/runtime/helpers/esm/createForOfIteratorHelper\";\nimport _classCallCheck from \"@babel/runtime/helpers/esm/classCallCheck\";\nimport _createClass from \"@babel/runtime/helpers/esm/createClass\";\nimport _inherits from \"@babel/runtime/helpers/esm/inherits\";\nimport _createSuper from \"@babel/runtime/helpers/esm/createSuper\";\nimport React from 'react';\nimport { css } from 'glamor';\nimport Toast from './toast';\nvar wrapperClass = css({\n  maxWidth: 560,\n  margin: '0 auto',\n  top: 0,\n  left: 0,\n  right: 0,\n  position: 'fixed',\n  zIndex: 30\n});\n\nvar hasCustomId = function hasCustomId(settings) {\n  return Object.hasOwnProperty.call(settings, 'id');\n};\n\nvar ToastManager = /*#__PURE__*/function (_React$PureComponent) {\n  _inherits(ToastManager, _React$PureComponent);\n\n  var _super = _createSuper(ToastManager);\n\n  function ToastManager(props, context) {\n    var _this;\n\n    _classCallCheck(this, ToastManager);\n\n    _this = _super.call(this, props, context);\n\n    _this.getToasts = function () {\n      return _this.state.toasts;\n    };\n\n    _this.closeAll = function () {\n      _this.getToasts().forEach(function (toast) {\n        return toast.close();\n      });\n    };\n\n    _this.notify = function (title, settings) {\n      // If there's a custom toast ID passed, close existing toasts with the same custom ID\n      if (hasCustomId(settings)) {\n        var _iterator = _createForOfIteratorHelper(_this.state.toasts),\n            _step;\n\n        try {\n          for (_iterator.s(); !(_step = _iterator.n()).done;) {\n            var toast = _step.value;\n\n            // Since unique ID is still appended to a custom ID, skip the unique ID and check only prefix\n            if (String(toast.id).startsWith(settings.id)) {\n              _this.closeToast(toast.id);\n            }\n          }\n        } catch (err) {\n          _iterator.e(err);\n        } finally {\n          _iterator.f();\n        }\n      }\n\n      var instance = _this.createToastInstance(title, settings);\n\n      _this.setState(function (previousState) {\n        return {\n          toasts: [instance].concat(_toConsumableArray(previousState.toasts))\n        };\n      });\n\n      return instance;\n    };\n\n    _this.createToastInstance = function (title, settings) {\n      var uniqueId = ++ToastManager.idCounter;\n      var id = hasCustomId(settings) ? \"\".concat(settings.id, \"-\").concat(uniqueId) : uniqueId;\n      return {\n        id: id,\n        title: title,\n        description: settings.description,\n        hasCloseButton: settings.hasCloseButton || true,\n        duration: settings.duration || 2,\n        close: function close() {\n          return _this.closeToast(id);\n        },\n        intent: settings.intent\n      };\n    };\n\n    _this.closeToast = function (id) {\n      _this.setState(function (previousState) {\n        return {\n          toasts: previousState.toasts.map(function (toast) {\n            if (toast.id === id) {\n              return _objectSpread(_objectSpread({}, toast), {}, {\n                isShown: false\n              });\n            }\n\n            return toast;\n          })\n        };\n      });\n    };\n\n    _this.removeToast = function (id) {\n      _this.setState(function (previousState) {\n        return {\n          toasts: previousState.toasts.filter(function (toast) {\n            return toast.id !== id;\n          })\n        };\n      });\n    };\n\n    props.bindNotify(_this.notify);\n    props.bindGetToasts(_this.getToasts);\n    props.bindCloseAll(_this.closeAll);\n    _this.state = {\n      toasts: []\n    };\n    return _this;\n  }\n\n  _createClass(ToastManager, [{\n    key: \"render\",\n    value: function render() {\n      var _this2 = this;\n\n      return /*#__PURE__*/React.createElement(\"span\", {\n        className: wrapperClass\n      }, this.state.toasts.map(function (_ref) {\n        var id = _ref.id,\n            description = _ref.description,\n            props = _objectWithoutProperties(_ref, [\"id\", \"description\"]);\n\n        return /*#__PURE__*/React.createElement(Toast, Object.assign({\n          key: id,\n          onRemove: function onRemove() {\n            return _this2.removeToast(id);\n          }\n        }, props), description);\n      }));\n    }\n  }]);\n\n  return ToastManager;\n}(React.PureComponent);\n\nToastManager.idCounter = 0;\nexport { ToastManager as default };","import _objectSpread from \"@babel/runtime/helpers/esm/objectSpread2\";\nimport _classCallCheck from \"@babel/runtime/helpers/esm/classCallCheck\";\nimport React from 'react';\nimport ReactDOM from 'react-dom';\nimport ToastManager from './toastManager';\nvar isBrowser = typeof window !== 'undefined' && typeof window.document !== 'undefined';\n/**\n * The Toaster manages the interactionsb between\n * the ToasterManger and the toast API.\n */\n\nvar Toaster = function Toaster() {\n  var _this = this;\n\n  _classCallCheck(this, Toaster);\n\n  this._bindNotify = function (handler) {\n    _this.notifyHandler = handler;\n  };\n\n  this._bindGetToasts = function (handler) {\n    _this.getToastsHandler = handler;\n  };\n\n  this._bindCloseAll = function (handler) {\n    _this.closeAllHandler = handler;\n  };\n\n  this.getToasts = function () {\n    return _this.getToastsHandler();\n  };\n\n  this.closeAll = function () {\n    return _this.closeAllHandler();\n  };\n\n  this.notify = function (title) {\n    var settings = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    return _this.notifyHandler(title, _objectSpread(_objectSpread({}, settings), {}, {\n      intent: 'none'\n    }));\n  };\n\n  this.success = function (title) {\n    var settings = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    return _this.notifyHandler(title, _objectSpread(_objectSpread({}, settings), {}, {\n      intent: 'success'\n    }));\n  };\n\n  this.warning = function (title) {\n    var settings = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    return _this.notifyHandler(title, _objectSpread(_objectSpread({}, settings), {}, {\n      intent: 'warning'\n    }));\n  };\n\n  this.danger = function (title) {\n    var settings = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n    return _this.notifyHandler(title, _objectSpread(_objectSpread({}, settings), {}, {\n      intent: 'danger'\n    }));\n  };\n\n  if (!isBrowser) return;\n  var container = document.createElement('div');\n  container.setAttribute('data-evergreen-toaster-container', '');\n  document.body.appendChild(container);\n  ReactDOM.render( /*#__PURE__*/React.createElement(ToastManager, {\n    bindNotify: this._bindNotify,\n    bindGetToasts: this._bindGetToasts,\n    bindCloseAll: this._bindCloseAll\n  }), container);\n};\n\nexport { Toaster as default };","import Toaster from './toaster';\nvar toaster = new Toaster();\nexport default toaster;","var ListCache = require('./_ListCache'),\n    stackClear = require('./_stackClear'),\n    stackDelete = require('./_stackDelete'),\n    stackGet = require('./_stackGet'),\n    stackHas = require('./_stackHas'),\n    stackSet = require('./_stackSet');\n\n/**\n * Creates a stack cache object to store key-value pairs.\n *\n * @private\n * @constructor\n * @param {Array} [entries] The key-value pairs to cache.\n */\nfunction Stack(entries) {\n  var data = this.__data__ = new ListCache(entries);\n  this.size = data.size;\n}\n\n// Add methods to `Stack`.\nStack.prototype.clear = stackClear;\nStack.prototype['delete'] = stackDelete;\nStack.prototype.get = stackGet;\nStack.prototype.has = stackHas;\nStack.prototype.set = stackSet;\n\nmodule.exports = Stack;\n","/**\n * Performs a\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * comparison between two values to determine if they are equivalent.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n * @example\n *\n * var object = { 'a': 1 };\n * var other = { 'a': 1 };\n *\n * _.eq(object, object);\n * // => true\n *\n * _.eq(object, other);\n * // => false\n *\n * _.eq('a', 'a');\n * // => true\n *\n * _.eq('a', Object('a'));\n * // => false\n *\n * _.eq(NaN, NaN);\n * // => true\n */\nfunction eq(value, other) {\n  return value === other || (value !== value && other !== other);\n}\n\nmodule.exports = eq;\n","var baseGetTag = require('./_baseGetTag'),\n    isObject = require('./isObject');\n\n/** `Object#toString` result references. */\nvar asyncTag = '[object AsyncFunction]',\n    funcTag = '[object Function]',\n    genTag = '[object GeneratorFunction]',\n    proxyTag = '[object Proxy]';\n\n/**\n * Checks if `value` is classified as a `Function` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n * @example\n *\n * _.isFunction(_);\n * // => true\n *\n * _.isFunction(/abc/);\n * // => false\n */\nfunction isFunction(value) {\n  if (!isObject(value)) {\n    return false;\n  }\n  // The use of `Object#toString` avoids issues with the `typeof` operator\n  // in Safari 9 which returns 'object' for typed arrays and other constructors.\n  var tag = baseGetTag(value);\n  return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;\n}\n\nmodule.exports = isFunction;\n","/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\nmodule.exports = freeGlobal;\n","/** Used for built-in method references. */\nvar funcProto = Function.prototype;\n\n/** Used to resolve the decompiled source of functions. */\nvar funcToString = funcProto.toString;\n\n/**\n * Converts `func` to its source code.\n *\n * @private\n * @param {Function} func The function to convert.\n * @returns {string} Returns the source code.\n */\nfunction toSource(func) {\n  if (func != null) {\n    try {\n      return funcToString.call(func);\n    } catch (e) {}\n    try {\n      return (func + '');\n    } catch (e) {}\n  }\n  return '';\n}\n\nmodule.exports = toSource;\n","var SetCache = require('./_SetCache'),\n    arraySome = require('./_arraySome'),\n    cacheHas = require('./_cacheHas');\n\n/** Used to compose bitmasks for value comparisons. */\nvar COMPARE_PARTIAL_FLAG = 1,\n    COMPARE_UNORDERED_FLAG = 2;\n\n/**\n * A specialized version of `baseIsEqualDeep` for arrays with support for\n * partial deep comparisons.\n *\n * @private\n * @param {Array} array The array to compare.\n * @param {Array} other The other array to compare.\n * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n * @param {Function} customizer The function to customize comparisons.\n * @param {Function} equalFunc The function to determine equivalents of values.\n * @param {Object} stack Tracks traversed `array` and `other` objects.\n * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n */\nfunction equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n  var isPartial = bitmask & COMPARE_PARTIAL_FLAG,\n      arrLength = array.length,\n      othLength = other.length;\n\n  if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n    return false;\n  }\n  // Check that cyclic values are equal.\n  var arrStacked = stack.get(array);\n  var othStacked = stack.get(other);\n  if (arrStacked && othStacked) {\n    return arrStacked == other && othStacked == array;\n  }\n  var index = -1,\n      result = true,\n      seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;\n\n  stack.set(array, other);\n  stack.set(other, array);\n\n  // Ignore non-index properties.\n  while (++index < arrLength) {\n    var arrValue = array[index],\n        othValue = other[index];\n\n    if (customizer) {\n      var compared = isPartial\n        ? customizer(othValue, arrValue, index, other, array, stack)\n        : customizer(arrValue, othValue, index, array, other, stack);\n    }\n    if (compared !== undefined) {\n      if (compared) {\n        continue;\n      }\n      result = false;\n      break;\n    }\n    // Recursively compare arrays (susceptible to call stack limits).\n    if (seen) {\n      if (!arraySome(other, function(othValue, othIndex) {\n            if (!cacheHas(seen, othIndex) &&\n                (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n              return seen.push(othIndex);\n            }\n          })) {\n        result = false;\n        break;\n      }\n    } else if (!(\n          arrValue === othValue ||\n            equalFunc(arrValue, othValue, bitmask, customizer, stack)\n        )) {\n      result = false;\n      break;\n    }\n  }\n  stack['delete'](array);\n  stack['delete'](other);\n  return result;\n}\n\nmodule.exports = equalArrays;\n","var baseIsArguments = require('./_baseIsArguments'),\n    isObjectLike = require('./isObjectLike');\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/** Built-in value references. */\nvar propertyIsEnumerable = objectProto.propertyIsEnumerable;\n\n/**\n * Checks if `value` is likely an `arguments` object.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n *  else `false`.\n * @example\n *\n * _.isArguments(function() { return arguments; }());\n * // => true\n *\n * _.isArguments([1, 2, 3]);\n * // => false\n */\nvar isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {\n  return isObjectLike(value) && hasOwnProperty.call(value, 'callee') &&\n    !propertyIsEnumerable.call(value, 'callee');\n};\n\nmodule.exports = isArguments;\n","var root = require('./_root'),\n    stubFalse = require('./stubFalse');\n\n/** Detect free variable `exports`. */\nvar freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;\n\n/** Detect free variable `module`. */\nvar freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;\n\n/** Detect the popular CommonJS extension `module.exports`. */\nvar moduleExports = freeModule && freeModule.exports === freeExports;\n\n/** Built-in value references. */\nvar Buffer = moduleExports ? root.Buffer : undefined;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;\n\n/**\n * Checks if `value` is a buffer.\n *\n * @static\n * @memberOf _\n * @since 4.3.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n * @example\n *\n * _.isBuffer(new Buffer(2));\n * // => true\n *\n * _.isBuffer(new Uint8Array(2));\n * // => false\n */\nvar isBuffer = nativeIsBuffer || stubFalse;\n\nmodule.exports = isBuffer;\n","/** Used as references for various `Number` constants. */\nvar MAX_SAFE_INTEGER = 9007199254740991;\n\n/** Used to detect unsigned integer values. */\nvar reIsUint = /^(?:0|[1-9]\\d*)$/;\n\n/**\n * Checks if `value` is a valid array-like index.\n *\n * @private\n * @param {*} value The value to check.\n * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n */\nfunction isIndex(value, length) {\n  var type = typeof value;\n  length = length == null ? MAX_SAFE_INTEGER : length;\n\n  return !!length &&\n    (type == 'number' ||\n      (type != 'symbol' && reIsUint.test(value))) &&\n        (value > -1 && value % 1 == 0 && value < length);\n}\n\nmodule.exports = isIndex;\n","var baseIsTypedArray = require('./_baseIsTypedArray'),\n    baseUnary = require('./_baseUnary'),\n    nodeUtil = require('./_nodeUtil');\n\n/* Node.js helper references. */\nvar nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;\n\n/**\n * Checks if `value` is classified as a typed array.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n * @example\n *\n * _.isTypedArray(new Uint8Array);\n * // => true\n *\n * _.isTypedArray([]);\n * // => false\n */\nvar isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;\n\nmodule.exports = isTypedArray;\n","var isFunction = require('./isFunction'),\n    isLength = require('./isLength');\n\n/**\n * Checks if `value` is array-like. A value is considered array-like if it's\n * not a function and has a `value.length` that's an integer greater than or\n * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n * @example\n *\n * _.isArrayLike([1, 2, 3]);\n * // => true\n *\n * _.isArrayLike(document.body.children);\n * // => true\n *\n * _.isArrayLike('abc');\n * // => true\n *\n * _.isArrayLike(_.noop);\n * // => false\n */\nfunction isArrayLike(value) {\n  return value != null && isLength(value.length) && !isFunction(value);\n}\n\nmodule.exports = isArrayLike;\n","var isObject = require('./isObject');\n\n/**\n * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` if suitable for strict\n *  equality comparisons, else `false`.\n */\nfunction isStrictComparable(value) {\n  return value === value && !isObject(value);\n}\n\nmodule.exports = isStrictComparable;\n","/**\n * A specialized version of `matchesProperty` for source values suitable\n * for strict equality comparisons, i.e. `===`.\n *\n * @private\n * @param {string} key The key of the property to get.\n * @param {*} srcValue The value to match.\n * @returns {Function} Returns the new spec function.\n */\nfunction matchesStrictComparable(key, srcValue) {\n  return function(object) {\n    if (object == null) {\n      return false;\n    }\n    return object[key] === srcValue &&\n      (srcValue !== undefined || (key in Object(object)));\n  };\n}\n\nmodule.exports = matchesStrictComparable;\n","var castPath = require('./_castPath'),\n    toKey = require('./_toKey');\n\n/**\n * The base implementation of `_.get` without support for default values.\n *\n * @private\n * @param {Object} object The object to query.\n * @param {Array|string} path The path of the property to get.\n * @returns {*} Returns the resolved value.\n */\nfunction baseGet(object, path) {\n  path = castPath(path, object);\n\n  var index = 0,\n      length = path.length;\n\n  while (object != null && index < length) {\n    object = object[toKey(path[index++])];\n  }\n  return (index && index == length) ? object : undefined;\n}\n\nmodule.exports = baseGet;\n","var isArray = require('./isArray'),\n    isKey = require('./_isKey'),\n    stringToPath = require('./_stringToPath'),\n    toString = require('./toString');\n\n/**\n * Casts `value` to a path array if it's not one.\n *\n * @private\n * @param {*} value The value to inspect.\n * @param {Object} [object] The object to query keys on.\n * @returns {Array} Returns the cast property path array.\n */\nfunction castPath(value, object) {\n  if (isArray(value)) {\n    return value;\n  }\n  return isKey(value, object) ? [value] : stringToPath(toString(value));\n}\n\nmodule.exports = castPath;\n","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"Chart\", {\n  enumerable: true,\n  get: function get() {\n    return _chart[\"default\"];\n  }\n});\nexports.defaults = exports.Scatter = exports.Bubble = exports.Polar = exports.Radar = exports.HorizontalBar = exports.Bar = exports.Line = exports.Pie = exports.Doughnut = exports[\"default\"] = void 0;\n\nvar _react = _interopRequireDefault(require(\"react\"));\n\nvar _propTypes = _interopRequireDefault(require(\"prop-types\"));\n\nvar _chart = _interopRequireDefault(require(\"chart.js\"));\n\nvar _isEqual = _interopRequireDefault(require(\"lodash/isEqual\"));\n\nvar _keyBy = _interopRequireDefault(require(\"lodash/keyBy\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _extends() { _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; }; return _extends.apply(this, arguments); }\n\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\nfunction ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }\n\nfunction _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _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); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\nfunction _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }\n\nvar NODE_ENV = typeof process !== 'undefined' && process.env && process.env.NODE_ENV;\n\nvar ChartComponent = /*#__PURE__*/function (_React$Component) {\n  _inherits(ChartComponent, _React$Component);\n\n  var _super = _createSuper(ChartComponent);\n\n  function ChartComponent() {\n    var _this;\n\n    _classCallCheck(this, ChartComponent);\n\n    _this = _super.call(this);\n\n    _defineProperty(_assertThisInitialized(_this), \"handleOnClick\", function (event) {\n      var instance = _this.chartInstance;\n      var _this$props = _this.props,\n          getDatasetAtEvent = _this$props.getDatasetAtEvent,\n          getElementAtEvent = _this$props.getElementAtEvent,\n          getElementsAtEvent = _this$props.getElementsAtEvent,\n          onElementsClick = _this$props.onElementsClick;\n      getDatasetAtEvent && getDatasetAtEvent(instance.getDatasetAtEvent(event), event);\n      getElementAtEvent && getElementAtEvent(instance.getElementAtEvent(event), event);\n      getElementsAtEvent && getElementsAtEvent(instance.getElementsAtEvent(event), event);\n      onElementsClick && onElementsClick(instance.getElementsAtEvent(event), event); // Backward compatibility\n    });\n\n    _defineProperty(_assertThisInitialized(_this), \"ref\", function (element) {\n      _this.element = element;\n    });\n\n    _this.chartInstance = undefined;\n    return _this;\n  }\n\n  _createClass(ChartComponent, [{\n    key: \"componentDidMount\",\n    value: function componentDidMount() {\n      this.renderChart();\n    }\n  }, {\n    key: \"componentDidUpdate\",\n    value: function componentDidUpdate() {\n      if (this.props.redraw) {\n        this.destroyChart();\n        this.renderChart();\n        return;\n      }\n\n      this.updateChart();\n    }\n  }, {\n    key: \"shouldComponentUpdate\",\n    value: function shouldComponentUpdate(nextProps) {\n      var _this$props2 = this.props,\n          redraw = _this$props2.redraw,\n          type = _this$props2.type,\n          options = _this$props2.options,\n          plugins = _this$props2.plugins,\n          legend = _this$props2.legend,\n          height = _this$props2.height,\n          width = _this$props2.width;\n\n      if (nextProps.redraw === true) {\n        return true;\n      }\n\n      if (height !== nextProps.height || width !== nextProps.width) {\n        return true;\n      }\n\n      if (type !== nextProps.type) {\n        return true;\n      }\n\n      if (!(0, _isEqual[\"default\"])(legend, nextProps.legend)) {\n        return true;\n      }\n\n      if (!(0, _isEqual[\"default\"])(options, nextProps.options)) {\n        return true;\n      }\n\n      var nextData = this.transformDataProp(nextProps);\n\n      if (!(0, _isEqual[\"default\"])(this.shadowDataProp, nextData)) {\n        return true;\n      }\n\n      return !(0, _isEqual[\"default\"])(plugins, nextProps.plugins);\n    }\n  }, {\n    key: \"componentWillUnmount\",\n    value: function componentWillUnmount() {\n      this.destroyChart();\n    }\n  }, {\n    key: \"transformDataProp\",\n    value: function transformDataProp(props) {\n      var data = props.data;\n\n      if (typeof data == 'function') {\n        var node = this.element;\n        return data(node);\n      } else {\n        return data;\n      }\n    } // Chart.js directly mutates the data.dataset objects by adding _meta proprerty\n    // this makes impossible to compare the current and next data changes\n    // therefore we memoize the data prop while sending a fake to Chart.js for mutation.\n    // see https://github.com/chartjs/Chart.js/blob/master/src/core/core.controller.js#L615-L617\n\n  }, {\n    key: \"memoizeDataProps\",\n    value: function memoizeDataProps() {\n      if (!this.props.data) {\n        return;\n      }\n\n      var data = this.transformDataProp(this.props);\n      this.shadowDataProp = _objectSpread(_objectSpread({}, data), {}, {\n        datasets: data.datasets && data.datasets.map(function (set) {\n          return _objectSpread({}, set);\n        })\n      });\n      this.saveCurrentDatasets(); // to remove the dataset metadata from this chart when the chart is destroyed\n\n      return data;\n    }\n  }, {\n    key: \"checkDatasets\",\n    value: function checkDatasets(datasets) {\n      var isDev = NODE_ENV !== 'production' && NODE_ENV !== 'prod';\n      var usingCustomKeyProvider = this.props.datasetKeyProvider !== ChartComponent.getLabelAsKey;\n      var multipleDatasets = datasets.length > 1;\n\n      if (isDev && multipleDatasets && !usingCustomKeyProvider) {\n        var shouldWarn = false;\n        datasets.forEach(function (dataset) {\n          if (!dataset.label) {\n            shouldWarn = true;\n          }\n        });\n\n        if (shouldWarn) {\n          console.error('[react-chartjs-2] Warning: Each dataset needs a unique key. By default, the \"label\" property on each dataset is used. Alternatively, you may provide a \"datasetKeyProvider\" as a prop that returns a unique key.');\n        }\n      }\n    }\n  }, {\n    key: \"getCurrentDatasets\",\n    value: function getCurrentDatasets() {\n      return this.chartInstance && this.chartInstance.config.data && this.chartInstance.config.data.datasets || [];\n    }\n  }, {\n    key: \"saveCurrentDatasets\",\n    value: function saveCurrentDatasets() {\n      var _this2 = this;\n\n      this.datasets = this.datasets || {};\n      var currentDatasets = this.getCurrentDatasets();\n      currentDatasets.forEach(function (d) {\n        _this2.datasets[_this2.props.datasetKeyProvider(d)] = d;\n      });\n    }\n  }, {\n    key: \"updateChart\",\n    value: function updateChart() {\n      var _this3 = this;\n\n      var options = this.props.options;\n      var data = this.memoizeDataProps(this.props);\n      if (!this.chartInstance) return;\n\n      if (options) {\n        this.chartInstance.options = _chart[\"default\"].helpers.configMerge(this.chartInstance.options, options);\n      } // Pipe datasets to chart instance datasets enabling\n      // seamless transitions\n\n\n      var currentDatasets = this.getCurrentDatasets();\n      var nextDatasets = data.datasets || [];\n      this.checkDatasets(currentDatasets);\n      var currentDatasetsIndexed = (0, _keyBy[\"default\"])(currentDatasets, this.props.datasetKeyProvider); // We can safely replace the dataset array, as long as we retain the _meta property\n      // on each dataset.\n\n      this.chartInstance.config.data.datasets = nextDatasets.map(function (next) {\n        var current = currentDatasetsIndexed[_this3.props.datasetKeyProvider(next)];\n\n        if (current && current.type === next.type && next.data) {\n          // Be robust to no data. Relevant for other update mechanisms as in chartjs-plugin-streaming.\n          // The data array must be edited in place. As chart.js adds listeners to it.\n          current.data.splice(next.data.length);\n          next.data.forEach(function (point, pid) {\n            current.data[pid] = next.data[pid];\n          });\n\n          var _data = next.data,\n              otherProps = _objectWithoutProperties(next, [\"data\"]); // Merge properties. Notice a weakness here. If a property is removed\n          // from next, it will be retained by current and never disappears.\n          // Workaround is to set value to null or undefined in next.\n\n\n          return _objectSpread(_objectSpread({}, current), otherProps);\n        } else {\n          return next;\n        }\n      });\n\n      var datasets = data.datasets,\n          rest = _objectWithoutProperties(data, [\"datasets\"]);\n\n      this.chartInstance.config.data = _objectSpread(_objectSpread({}, this.chartInstance.config.data), rest);\n      this.chartInstance.update();\n    }\n  }, {\n    key: \"renderChart\",\n    value: function renderChart() {\n      var _this$props3 = this.props,\n          options = _this$props3.options,\n          legend = _this$props3.legend,\n          type = _this$props3.type,\n          plugins = _this$props3.plugins;\n      var node = this.element;\n      var data = this.memoizeDataProps();\n\n      if (typeof legend !== 'undefined' && !(0, _isEqual[\"default\"])(ChartComponent.defaultProps.legend, legend)) {\n        options.legend = legend;\n      }\n\n      this.chartInstance = new _chart[\"default\"](node, {\n        type: type,\n        data: data,\n        options: options,\n        plugins: plugins\n      });\n    }\n  }, {\n    key: \"destroyChart\",\n    value: function destroyChart() {\n      if (!this.chartInstance) {\n        return;\n      } // Put all of the datasets that have existed in the chart back on the chart\n      // so that the metadata associated with this chart get destroyed.\n      // This allows the datasets to be used in another chart. This can happen,\n      // for example, in a tabbed UI where the chart gets created each time the\n      // tab gets switched to the chart and uses the same data).\n\n\n      this.saveCurrentDatasets();\n      var datasets = Object.values(this.datasets);\n      this.chartInstance.config.data.datasets = datasets;\n      this.chartInstance.destroy();\n    }\n  }, {\n    key: \"render\",\n    value: function render() {\n      var _this$props4 = this.props,\n          height = _this$props4.height,\n          width = _this$props4.width,\n          id = _this$props4.id;\n      return /*#__PURE__*/_react[\"default\"].createElement(\"canvas\", {\n        ref: this.ref,\n        height: height,\n        width: width,\n        id: id,\n        onClick: this.handleOnClick\n      });\n    }\n  }]);\n\n  return ChartComponent;\n}(_react[\"default\"].Component);\n\n_defineProperty(ChartComponent, \"getLabelAsKey\", function (d) {\n  return d.label;\n});\n\n_defineProperty(ChartComponent, \"propTypes\", {\n  data: _propTypes[\"default\"].oneOfType([_propTypes[\"default\"].object, _propTypes[\"default\"].func]).isRequired,\n  getDatasetAtEvent: _propTypes[\"default\"].func,\n  getElementAtEvent: _propTypes[\"default\"].func,\n  getElementsAtEvent: _propTypes[\"default\"].func,\n  height: _propTypes[\"default\"].number,\n  legend: _propTypes[\"default\"].object,\n  onElementsClick: _propTypes[\"default\"].func,\n  options: _propTypes[\"default\"].object,\n  plugins: _propTypes[\"default\"].arrayOf(_propTypes[\"default\"].object),\n  redraw: _propTypes[\"default\"].bool,\n  type: function type(props, propName, componentName) {\n    if (!_chart[\"default\"].controllers[props[propName]]) {\n      return new Error('Invalid chart type `' + props[propName] + '` supplied to' + ' `' + componentName + '`.');\n    }\n  },\n  width: _propTypes[\"default\"].number,\n  datasetKeyProvider: _propTypes[\"default\"].func\n});\n\n_defineProperty(ChartComponent, \"defaultProps\", {\n  legend: {\n    display: true,\n    position: 'bottom'\n  },\n  type: 'doughnut',\n  height: 150,\n  width: 300,\n  redraw: false,\n  options: {},\n  datasetKeyProvider: ChartComponent.getLabelAsKey\n});\n\nvar _default = ChartComponent;\nexports[\"default\"] = _default;\n\nvar Doughnut = /*#__PURE__*/function (_React$Component2) {\n  _inherits(Doughnut, _React$Component2);\n\n  var _super2 = _createSuper(Doughnut);\n\n  function Doughnut() {\n    _classCallCheck(this, Doughnut);\n\n    return _super2.apply(this, arguments);\n  }\n\n  _createClass(Doughnut, [{\n    key: \"render\",\n    value: function render() {\n      var _this4 = this;\n\n      return /*#__PURE__*/_react[\"default\"].createElement(ChartComponent, _extends({}, this.props, {\n        ref: function ref(_ref) {\n          return _this4.chartInstance = _ref && _ref.chartInstance;\n        },\n        type: \"doughnut\"\n      }));\n    }\n  }]);\n\n  return Doughnut;\n}(_react[\"default\"].Component);\n\nexports.Doughnut = Doughnut;\n\nvar Pie = /*#__PURE__*/function (_React$Component3) {\n  _inherits(Pie, _React$Component3);\n\n  var _super3 = _createSuper(Pie);\n\n  function Pie() {\n    _classCallCheck(this, Pie);\n\n    return _super3.apply(this, arguments);\n  }\n\n  _createClass(Pie, [{\n    key: \"render\",\n    value: function render() {\n      var _this5 = this;\n\n      return /*#__PURE__*/_react[\"default\"].createElement(ChartComponent, _extends({}, this.props, {\n        ref: function ref(_ref2) {\n          return _this5.chartInstance = _ref2 && _ref2.chartInstance;\n        },\n        type: \"pie\"\n      }));\n    }\n  }]);\n\n  return Pie;\n}(_react[\"default\"].Component);\n\nexports.Pie = Pie;\n\nvar Line = /*#__PURE__*/function (_React$Component4) {\n  _inherits(Line, _React$Component4);\n\n  var _super4 = _createSuper(Line);\n\n  function Line() {\n    _classCallCheck(this, Line);\n\n    return _super4.apply(this, arguments);\n  }\n\n  _createClass(Line, [{\n    key: \"render\",\n    value: function render() {\n      var _this6 = this;\n\n      return /*#__PURE__*/_react[\"default\"].createElement(ChartComponent, _extends({}, this.props, {\n        ref: function ref(_ref3) {\n          return _this6.chartInstance = _ref3 && _ref3.chartInstance;\n        },\n        type: \"line\"\n      }));\n    }\n  }]);\n\n  return Line;\n}(_react[\"default\"].Component);\n\nexports.Line = Line;\n\nvar Bar = /*#__PURE__*/function (_React$Component5) {\n  _inherits(Bar, _React$Component5);\n\n  var _super5 = _createSuper(Bar);\n\n  function Bar() {\n    _classCallCheck(this, Bar);\n\n    return _super5.apply(this, arguments);\n  }\n\n  _createClass(Bar, [{\n    key: \"render\",\n    value: function render() {\n      var _this7 = this;\n\n      return /*#__PURE__*/_react[\"default\"].createElement(ChartComponent, _extends({}, this.props, {\n        ref: function ref(_ref4) {\n          return _this7.chartInstance = _ref4 && _ref4.chartInstance;\n        },\n        type: \"bar\"\n      }));\n    }\n  }]);\n\n  return Bar;\n}(_react[\"default\"].Component);\n\nexports.Bar = Bar;\n\nvar HorizontalBar = /*#__PURE__*/function (_React$Component6) {\n  _inherits(HorizontalBar, _React$Component6);\n\n  var _super6 = _createSuper(HorizontalBar);\n\n  function HorizontalBar() {\n    _classCallCheck(this, HorizontalBar);\n\n    return _super6.apply(this, arguments);\n  }\n\n  _createClass(HorizontalBar, [{\n    key: \"render\",\n    value: function render() {\n      var _this8 = this;\n\n      return /*#__PURE__*/_react[\"default\"].createElement(ChartComponent, _extends({}, this.props, {\n        ref: function ref(_ref5) {\n          return _this8.chartInstance = _ref5 && _ref5.chartInstance;\n        },\n        type: \"horizontalBar\"\n      }));\n    }\n  }]);\n\n  return HorizontalBar;\n}(_react[\"default\"].Component);\n\nexports.HorizontalBar = HorizontalBar;\n\nvar Radar = /*#__PURE__*/function (_React$Component7) {\n  _inherits(Radar, _React$Component7);\n\n  var _super7 = _createSuper(Radar);\n\n  function Radar() {\n    _classCallCheck(this, Radar);\n\n    return _super7.apply(this, arguments);\n  }\n\n  _createClass(Radar, [{\n    key: \"render\",\n    value: function render() {\n      var _this9 = this;\n\n      return /*#__PURE__*/_react[\"default\"].createElement(ChartComponent, _extends({}, this.props, {\n        ref: function ref(_ref6) {\n          return _this9.chartInstance = _ref6 && _ref6.chartInstance;\n        },\n        type: \"radar\"\n      }));\n    }\n  }]);\n\n  return Radar;\n}(_react[\"default\"].Component);\n\nexports.Radar = Radar;\n\nvar Polar = /*#__PURE__*/function (_React$Component8) {\n  _inherits(Polar, _React$Component8);\n\n  var _super8 = _createSuper(Polar);\n\n  function Polar() {\n    _classCallCheck(this, Polar);\n\n    return _super8.apply(this, arguments);\n  }\n\n  _createClass(Polar, [{\n    key: \"render\",\n    value: function render() {\n      var _this10 = this;\n\n      return /*#__PURE__*/_react[\"default\"].createElement(ChartComponent, _extends({}, this.props, {\n        ref: function ref(_ref7) {\n          return _this10.chartInstance = _ref7 && _ref7.chartInstance;\n        },\n        type: \"polarArea\"\n      }));\n    }\n  }]);\n\n  return Polar;\n}(_react[\"default\"].Component);\n\nexports.Polar = Polar;\n\nvar Bubble = /*#__PURE__*/function (_React$Component9) {\n  _inherits(Bubble, _React$Component9);\n\n  var _super9 = _createSuper(Bubble);\n\n  function Bubble() {\n    _classCallCheck(this, Bubble);\n\n    return _super9.apply(this, arguments);\n  }\n\n  _createClass(Bubble, [{\n    key: \"render\",\n    value: function render() {\n      var _this11 = this;\n\n      return /*#__PURE__*/_react[\"default\"].createElement(ChartComponent, _extends({}, this.props, {\n        ref: function ref(_ref8) {\n          return _this11.chartInstance = _ref8 && _ref8.chartInstance;\n        },\n        type: \"bubble\"\n      }));\n    }\n  }]);\n\n  return Bubble;\n}(_react[\"default\"].Component);\n\nexports.Bubble = Bubble;\n\nvar Scatter = /*#__PURE__*/function (_React$Component10) {\n  _inherits(Scatter, _React$Component10);\n\n  var _super10 = _createSuper(Scatter);\n\n  function Scatter() {\n    _classCallCheck(this, Scatter);\n\n    return _super10.apply(this, arguments);\n  }\n\n  _createClass(Scatter, [{\n    key: \"render\",\n    value: function render() {\n      var _this12 = this;\n\n      return /*#__PURE__*/_react[\"default\"].createElement(ChartComponent, _extends({}, this.props, {\n        ref: function ref(_ref9) {\n          return _this12.chartInstance = _ref9 && _ref9.chartInstance;\n        },\n        type: \"scatter\"\n      }));\n    }\n  }]);\n\n  return Scatter;\n}(_react[\"default\"].Component);\n\nexports.Scatter = Scatter;\nvar defaults = _chart[\"default\"].defaults;\nexports.defaults = defaults;"],"sourceRoot":""}